From c72a72653cf9452abf96b96d7b98b0ff865386e9 Mon Sep 17 00:00:00 2001 From: kh1 Date: Mon, 11 Jan 2010 13:54:00 +0100 Subject: [PATCH] Add Botan, a C++ crypto library. Current Stable Release 1.8.8 --- src/libs/3rdparty/botan/checks/algos.cpp | 105 + src/libs/3rdparty/botan/checks/bench.cpp | 198 + src/libs/3rdparty/botan/checks/bench.h | 37 + src/libs/3rdparty/botan/checks/bigint.cpp | 353 + src/libs/3rdparty/botan/checks/block.cpp | 98 + src/libs/3rdparty/botan/checks/check.cpp | 240 + src/libs/3rdparty/botan/checks/clock.cpp | 82 + src/libs/3rdparty/botan/checks/common.h | 100 + src/libs/3rdparty/botan/checks/cvc_tests.cpp | 600 + src/libs/3rdparty/botan/checks/dolook.cpp | 130 + src/libs/3rdparty/botan/checks/dolook2.cpp | 212 + src/libs/3rdparty/botan/checks/ec_tests.cpp | 1223 + .../ecc_testdata/CSCA.CSCA.csca-germany.1.crt | Bin 0 -> 862 bytes .../ecc_testdata/CSCA.CSCA.csca-germany.1.pem | 20 + .../DE1_flen_chars_cvcRequest_ECDSA.der | Bin 0 -> 158 bytes .../botan/checks/ecc_testdata/Lidia.cer | Bin 0 -> 985 bytes .../botan/checks/ecc_testdata/Lidia.pem | 23 + .../3rdparty/botan/checks/ecc_testdata/ado | Bin 0 -> 353 bytes .../botan/checks/ecc_testdata/ado.cvcreq | Bin 0 -> 238 bytes .../checks/ecc_testdata/cvc_chain_cvca.cer | Bin 0 -> 392 bytes .../ecc_testdata/cvc_chain_dvca_ado2.cer | Bin 0 -> 238 bytes .../ecc_testdata/cvc_chain_dvca_cert1.cer | Bin 0 -> 212 bytes .../ecc_testdata/cvc_chain_dvca_req.cer | Bin 0 -> 158 bytes .../ecc_testdata/cvc_chain_dvca_req2.cer | Bin 0 -> 158 bytes .../ecc_testdata/cvc_chain_dvca_req2b.cer | Bin 0 -> 158 bytes .../checks/ecc_testdata/cvc_chain_is_cert.cer | Bin 0 -> 210 bytes .../checks/ecc_testdata/cvc_chain_is_req.cer | Bin 0 -> 151 bytes .../checks/ecc_testdata/cvc_chain_link12.cer | Bin 0 -> 392 bytes .../botan/checks/ecc_testdata/cvca01.cv.crt | Bin 0 -> 402 bytes .../ecc_testdata/cvca_illegal_chars.cv.crt | Bin 0 -> 402 bytes .../ecc_testdata/cvca_illegal_chars2.cv.crt | Bin 0 -> 402 bytes .../checks/ecc_testdata/ec_for_flex_mes.sig | 1 + .../ec_oid_not_in_reg_private_2.pkcs8.pem | 7 + .../botan/checks/ecc_testdata/flex_cert.crt | Bin 0 -> 412 bytes .../botan/checks/ecc_testdata/flex_mes | 1 + .../botan/checks/ecc_testdata/flex_mes.sig | Bin 0 -> 64 bytes .../checks/ecc_testdata/insito_expl_ec.pem | 19 + .../checks/ecc_testdata/insito_oid_ec.pem | 13 + .../checks/ecc_testdata/link_SHA1.166.crt | Bin 0 -> 858 bytes .../botan/checks/ecc_testdata/link_SHA256.cer | Bin 0 -> 1790 bytes .../botan/checks/ecc_testdata/my_cv_cert.ber | Bin 0 -> 286 bytes .../botan/checks/ecc_testdata/my_cv_cert2.ber | Bin 0 -> 286 bytes .../botan/checks/ecc_testdata/my_cv_req.ber | Bin 0 -> 238 bytes .../ecc_testdata/nodompar_private.pkcs8.pem | 12 + .../botan/checks/ecc_testdata/private.pem | 11 + .../checks/ecc_testdata/root1_SHA256.cer | Bin 0 -> 1790 bytes .../checks/ecc_testdata/root2_SHA256.cer | Bin 0 -> 1790 bytes .../checks/ecc_testdata/root_SHA1.163.crt | Bin 0 -> 860 bytes .../ecc_testdata/withdompar_private.pkcs8.pem | 5 + .../ecc_testdata/x509_req_test_expl.pem | 19 + .../checks/ecc_testdata/x509_req_test_oid.pem | 12 + .../x509_test_privkey_expl_pw123456.pem | 13 + .../x509_test_privkey_oid_pw123456.pem | 13 + src/libs/3rdparty/botan/checks/ecdsa.cpp | 556 + src/libs/3rdparty/botan/checks/eckaeg.cpp | 286 + src/libs/3rdparty/botan/checks/fail.dat | 100 + src/libs/3rdparty/botan/checks/getopt.cpp | 85 + src/libs/3rdparty/botan/checks/getopt.h | 45 + src/libs/3rdparty/botan/checks/gfpmath.cpp | 818 + src/libs/3rdparty/botan/checks/misc.cpp | 77 + src/libs/3rdparty/botan/checks/mp_valid.dat | 2983 + .../botan/checks/nist_tests/failure.txt | 12 + .../botan/checks/nist_tests/readme.txt | 26 + .../checks/nist_tests/tests/test01/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test01/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test01/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test02/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test02/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test02/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test02/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test02/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test03/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test03/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test03/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test03/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test03/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test04/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test04/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test04/int1.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test04/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test04/int2.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test04/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test04/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test05/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test05/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test05/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test05/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test05/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test06/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test06/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test06/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test06/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test06/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test07/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test07/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test07/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test07/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test07/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test08/end.crt | Bin 0 -> 652 bytes .../checks/nist_tests/tests/test08/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test08/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test08/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test08/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test09/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test09/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test09/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test09/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test09/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test10/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test10/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test10/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test10/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test10/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test11/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test11/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test11/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test11/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test11/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test12/end.crt | Bin 0 -> 652 bytes .../checks/nist_tests/tests/test12/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test12/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test12/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test12/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test13/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test13/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test13/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test13/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test13/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test14/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test14/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test14/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test14/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test14/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test15/end.crt | Bin 0 -> 654 bytes .../checks/nist_tests/tests/test15/int.crl | Bin 0 -> 341 bytes .../checks/nist_tests/tests/test15/int.crt | Bin 0 -> 671 bytes .../checks/nist_tests/tests/test15/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test15/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test16/end.crt | Bin 0 -> 657 bytes .../checks/nist_tests/tests/test16/int.crl | Bin 0 -> 337 bytes .../checks/nist_tests/tests/test16/int.crt | Bin 0 -> 667 bytes .../checks/nist_tests/tests/test16/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test16/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test17/end.crt | Bin 0 -> 652 bytes .../checks/nist_tests/tests/test17/int.crl | Bin 0 -> 337 bytes .../checks/nist_tests/tests/test17/int.crt | Bin 0 -> 667 bytes .../checks/nist_tests/tests/test17/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test17/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test18/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test18/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test18/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test18/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test18/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test19/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test19/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test19/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test19/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test20/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test20/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test20/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test20/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test20/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test21/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test21/int.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test21/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test21/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test21/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test22/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test22/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test22/int.crt | Bin 0 -> 648 bytes .../checks/nist_tests/tests/test22/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test22/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test23/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test23/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test23/int.crt | Bin 0 -> 662 bytes .../checks/nist_tests/tests/test23/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test23/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test24/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test24/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test24/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test24/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test24/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test25/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test25/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test25/int.crt | Bin 0 -> 659 bytes .../checks/nist_tests/tests/test25/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test25/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test26/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test26/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test26/int.crt | Bin 0 -> 662 bytes .../checks/nist_tests/tests/test26/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test26/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test27/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test27/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test27/int.crt | Bin 0 -> 659 bytes .../checks/nist_tests/tests/test27/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test27/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test28/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test28/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test28/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test28/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test28/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test29/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test29/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test29/int.crt | Bin 0 -> 662 bytes .../checks/nist_tests/tests/test29/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test29/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test30/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test30/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test30/int.crt | Bin 0 -> 662 bytes .../checks/nist_tests/tests/test30/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test30/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test31/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test31/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test31/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test31/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test31/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test32/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test32/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test32/int.crt | Bin 0 -> 662 bytes .../checks/nist_tests/tests/test32/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test32/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test33/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test33/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test33/int.crt | Bin 0 -> 662 bytes .../checks/nist_tests/tests/test33/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test33/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test34/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test34/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test34/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test34/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test34/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test35/end.crt | Bin 0 -> 626 bytes .../checks/nist_tests/tests/test35/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test35/int.crt | Bin 0 -> 641 bytes .../checks/nist_tests/tests/test35/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test35/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test36/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test36/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test36/int1.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test36/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test36/int2.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test36/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test36/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test37/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test37/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test37/int1.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test37/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test37/int2.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test37/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test37/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test38/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test38/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test38/int1.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test38/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test38/int2.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test38/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test38/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test39/end.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test39/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test39/int1.crt | Bin 0 -> 706 bytes .../checks/nist_tests/tests/test39/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test39/int2.crt | Bin 0 -> 691 bytes .../checks/nist_tests/tests/test39/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test39/int3.crt | Bin 0 -> 678 bytes .../checks/nist_tests/tests/test39/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test39/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test40/end.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test40/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test40/int1.crt | Bin 0 -> 691 bytes .../checks/nist_tests/tests/test40/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test40/int2.crt | Bin 0 -> 678 bytes .../checks/nist_tests/tests/test40/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test40/int3.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test40/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test40/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test41/end.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test41/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test41/int1.crt | Bin 0 -> 678 bytes .../checks/nist_tests/tests/test41/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test41/int2.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test41/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test41/int3.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test41/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test41/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test42/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test42/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test42/int1.crt | Bin 0 -> 691 bytes .../checks/nist_tests/tests/test42/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test42/int2.crt | Bin 0 -> 678 bytes .../checks/nist_tests/tests/test42/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test42/int3.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test42/int4.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test42/int4.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test42/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test42/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test43/end.crt | Bin 0 -> 626 bytes .../checks/nist_tests/tests/test43/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test43/int1.crt | Bin 0 -> 679 bytes .../checks/nist_tests/tests/test43/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test43/int2.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test43/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test43/int3.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test43/int4.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test43/int4.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test43/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test43/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test44/end.crt | Bin 0 -> 626 bytes .../checks/nist_tests/tests/test44/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test44/int1.crt | Bin 0 -> 679 bytes .../checks/nist_tests/tests/test44/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test44/int2.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test44/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test44/int3.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test44/int4.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test44/int4.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test44/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test44/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test45/end.crt | Bin 0 -> 626 bytes .../checks/nist_tests/tests/test45/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test45/int1.crt | Bin 0 -> 679 bytes .../checks/nist_tests/tests/test45/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test45/int2.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test45/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test45/int3.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test45/int4.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test45/int4.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test45/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test45/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test46/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test46/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test46/int1.crt | Bin 0 -> 679 bytes .../checks/nist_tests/tests/test46/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test46/int2.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test46/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test46/int3.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test46/int4.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test46/int4.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test46/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test46/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test47/end.crt | Bin 0 -> 626 bytes .../checks/nist_tests/tests/test47/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test47/int1.crt | Bin 0 -> 679 bytes .../checks/nist_tests/tests/test47/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test47/int2.crt | Bin 0 -> 679 bytes .../checks/nist_tests/tests/test47/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test47/int3.crt | Bin 0 -> 679 bytes .../checks/nist_tests/tests/test47/int4.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test47/int4.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test47/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test47/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test48/end.crt | Bin 0 -> 650 bytes .../checks/nist_tests/tests/test48/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test48/int.crt | Bin 0 -> 665 bytes .../checks/nist_tests/tests/test48/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test48/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test49/end.crt | Bin 0 -> 663 bytes .../checks/nist_tests/tests/test49/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test49/int.crt | Bin 0 -> 678 bytes .../checks/nist_tests/tests/test49/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test49/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test50/end.crt | Bin 0 -> 645 bytes .../checks/nist_tests/tests/test50/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test50/int.crt | Bin 0 -> 660 bytes .../checks/nist_tests/tests/test50/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test50/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test51/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test51/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test51/int.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test51/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test51/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test52/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test52/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test52/int.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test52/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test52/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test53/end.crt | Bin 0 -> 677 bytes .../checks/nist_tests/tests/test53/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test53/int.crt | Bin 0 -> 692 bytes .../checks/nist_tests/tests/test53/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test53/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test54/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test54/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test54/int1.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test54/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test54/int2.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test54/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test54/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test55/end.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test55/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test55/int1.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test55/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test55/int2.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test55/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test55/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test56/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test56/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test56/int.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test56/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test56/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test57/end.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test57/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test57/int.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test57/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test57/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test58/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test58/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test58/int1.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test58/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test58/int2.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test58/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test58/int3.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test58/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test58/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test59/end.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test59/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test59/int1.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test59/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test59/int2.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test59/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test59/int3.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test59/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test59/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test60/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test60/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test60/int1.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test60/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test60/int2.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test60/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test60/int3.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test60/int4.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test60/int4.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test60/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test60/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test61/end.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test61/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test61/int1.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test61/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test61/int2.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test61/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test61/int3.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test61/int4.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test61/int4.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test61/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test61/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test62/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test62/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test62/int1.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test62/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test62/int2.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test62/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test62/int3.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test62/int4.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test62/int4.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test62/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test62/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test63/end.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test63/int1.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test63/int1.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test63/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test63/int2.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test63/int3.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test63/int3.crt | Bin 0 -> 669 bytes .../checks/nist_tests/tests/test63/int4.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test63/int4.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test63/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test63/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test64/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test64/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test64/int.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test64/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test64/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test65/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test65/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test65/int1.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test65/int2.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test65/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test65/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test66/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test66/int.crl | Bin 0 -> 372 bytes .../checks/nist_tests/tests/test66/int.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test66/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test66/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test67/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test67/int.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test67/int1.crl | Bin 0 -> 372 bytes .../checks/nist_tests/tests/test67/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test67/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test67/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test68/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test68/int1.crl | Bin 0 -> 393 bytes .../checks/nist_tests/tests/test68/int1.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test68/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test68/int2.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test68/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test68/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test69/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test69/int.crl | Bin 0 -> 393 bytes .../checks/nist_tests/tests/test69/int.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test69/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test69/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test70/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test70/int1.crl | Bin 0 -> 393 bytes .../checks/nist_tests/tests/test70/int1.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test70/int2.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test70/int2.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test70/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test70/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test71/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test71/int.crl | Bin 0 -> 393 bytes .../checks/nist_tests/tests/test71/int.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test71/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test71/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test72/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test72/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test72/int.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test72/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test72/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test73/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test73/int.crl | Bin 0 -> 335 bytes .../checks/nist_tests/tests/test73/int.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test73/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test73/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test74/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test74/int.crl | Bin 0 -> 337 bytes .../checks/nist_tests/tests/test74/int.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test74/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test74/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test75/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test75/int.crl | Bin 0 -> 350 bytes .../checks/nist_tests/tests/test75/int.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test75/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test75/root.crt | Bin 0 -> 624 bytes .../checks/nist_tests/tests/test76/end.crt | Bin 0 -> 651 bytes .../checks/nist_tests/tests/test76/int.crl | Bin 0 -> 352 bytes .../checks/nist_tests/tests/test76/int.crt | Bin 0 -> 666 bytes .../checks/nist_tests/tests/test76/root.crl | Bin 0 -> 371 bytes .../checks/nist_tests/tests/test76/root.crt | Bin 0 -> 624 bytes .../botan/checks/nist_tests/x509test.cpp | 411 + src/libs/3rdparty/botan/checks/pk.cpp | 775 + src/libs/3rdparty/botan/checks/pk_bench.cpp | 682 + src/libs/3rdparty/botan/checks/pk_valid.dat | 4808 ++ src/libs/3rdparty/botan/checks/timer.cpp | 51 + src/libs/3rdparty/botan/checks/timer.h | 50 + src/libs/3rdparty/botan/checks/validate.cpp | 310 + src/libs/3rdparty/botan/checks/validate.dat | 45951 ++++++++++++++++ src/libs/3rdparty/botan/checks/validate.h | 34 + src/libs/3rdparty/botan/checks/x509.cpp | 224 + src/libs/3rdparty/botan/configure.pl | 2340 + src/libs/3rdparty/botan/configure.py | 1122 + src/libs/3rdparty/botan/doc/api.pdf | Bin 0 -> 254607 bytes src/libs/3rdparty/botan/doc/api.tex | 3103 ++ src/libs/3rdparty/botan/doc/architecture.pdf | Bin 0 -> 463402 bytes src/libs/3rdparty/botan/doc/building.pdf | Bin 0 -> 84582 bytes src/libs/3rdparty/botan/doc/building.tex | 398 + src/libs/3rdparty/botan/doc/credits.txt | 78 + .../3rdparty/botan/doc/examples/GNUmakefile | 21 + src/libs/3rdparty/botan/doc/examples/asn1.cpp | 312 + src/libs/3rdparty/botan/doc/examples/base.cpp | 44 + .../3rdparty/botan/doc/examples/base64.cpp | 82 + .../3rdparty/botan/doc/examples/bench.cpp | 98 + .../3rdparty/botan/doc/examples/benchmark.cpp | 41 + src/libs/3rdparty/botan/doc/examples/bzip.cpp | 108 + src/libs/3rdparty/botan/doc/examples/ca.cpp | 74 + .../3rdparty/botan/doc/examples/checksum.cpp | 31 + .../3rdparty/botan/doc/examples/cms_dec.cpp | 116 + .../3rdparty/botan/doc/examples/cms_enc.cpp | 53 + .../3rdparty/botan/doc/examples/cryptobox.cpp | 50 + .../3rdparty/botan/doc/examples/decrypt.cpp | 158 + src/libs/3rdparty/botan/doc/examples/dh.cpp | 59 + .../3rdparty/botan/doc/examples/dsa_kgen.cpp | 66 + .../3rdparty/botan/doc/examples/dsa_sign.cpp | 83 + .../3rdparty/botan/doc/examples/dsa_ver.cpp | 92 + .../3rdparty/botan/doc/examples/eax_test.cpp | 241 + .../3rdparty/botan/doc/examples/eax_tv.txt | 461 + .../3rdparty/botan/doc/examples/ecdsa.cpp | 57 + .../3rdparty/botan/doc/examples/encrypt.cpp | 179 + .../3rdparty/botan/doc/examples/encrypt2.cpp | 55 + .../3rdparty/botan/doc/examples/factor.cpp | 144 + .../3rdparty/botan/doc/examples/gen_certs.cpp | 124 + .../3rdparty/botan/doc/examples/gtk/dsa.cpp | 556 + .../botan/doc/examples/gtk/gtk_ui.cpp | 78 + .../3rdparty/botan/doc/examples/gtk/gtk_ui.h | 25 + .../botan/doc/examples/gtk/readme.txt | 18 + src/libs/3rdparty/botan/doc/examples/hash.cpp | 64 + .../3rdparty/botan/doc/examples/hash_fd.cpp | 71 + .../botan/doc/examples/hash_quickly.cpp | 90 + .../3rdparty/botan/doc/examples/hasher.cpp | 58 + .../3rdparty/botan/doc/examples/hasher2.cpp | 72 + .../botan/doc/examples/make_prime.cpp | 73 + .../3rdparty/botan/doc/examples/passhash.cpp | 86 + .../3rdparty/botan/doc/examples/pkcs10.cpp | 73 + .../3rdparty/botan/doc/examples/pqg_gen.cpp | 116 + .../3rdparty/botan/doc/examples/readme.txt | 77 + .../3rdparty/botan/doc/examples/ressol.cpp | 80 + .../3rdparty/botan/doc/examples/rng_test.cpp | 143 + .../botan/doc/examples/row_encryptor.cpp | 143 + .../3rdparty/botan/doc/examples/rsa_dec.cpp | 127 + .../3rdparty/botan/doc/examples/rsa_enc.cpp | 151 + .../3rdparty/botan/doc/examples/rsa_kgen.cpp | 65 + .../botan/doc/examples/rsa_manykey.cpp | 36 + .../3rdparty/botan/doc/examples/self_sig.cpp | 79 + .../3rdparty/botan/doc/examples/sig_gen.cpp | 90 + .../3rdparty/botan/doc/examples/stack.cpp | 86 + .../3rdparty/botan/doc/examples/test_es.cpp | 115 + .../3rdparty/botan/doc/examples/x509info.cpp | 154 + .../3rdparty/botan/doc/examples/xor_ciph.cpp | 96 + src/libs/3rdparty/botan/doc/fips140.tex | 156 + src/libs/3rdparty/botan/doc/indent.el | 57 + src/libs/3rdparty/botan/doc/insito_manual.pdf | Bin 0 -> 150405 bytes src/libs/3rdparty/botan/doc/internals.tex | 179 + src/libs/3rdparty/botan/doc/license.txt | 40 + src/libs/3rdparty/botan/doc/log.txt | 1323 + src/libs/3rdparty/botan/doc/pgpkeys.asc | 83 + src/libs/3rdparty/botan/doc/scripts/comba.py | 65 + .../botan/doc/scripts/combine_bmarks.pl | 120 + src/libs/3rdparty/botan/doc/scripts/dist.sh | 64 + src/libs/3rdparty/botan/doc/scripts/primes.py | 63 + .../3rdparty/botan/doc/scripts/print_deps.py | 70 + .../3rdparty/botan/doc/scripts/update_deps.py | 41 + src/libs/3rdparty/botan/doc/thanks.txt | 49 + src/libs/3rdparty/botan/doc/tutorial.pdf | Bin 0 -> 115992 bytes src/libs/3rdparty/botan/doc/tutorial.tex | 883 + src/libs/3rdparty/botan/readme.txt | 44 + .../botan/src/algo_factory/algo_cache.h | 224 + .../botan/src/algo_factory/algo_factory.cpp | 286 + .../botan/src/algo_factory/algo_factory.h | 132 + .../3rdparty/botan/src/algo_factory/info.txt | 21 + .../botan/src/algo_factory/prov_weight.cpp | 33 + .../botan/src/alloc/alloc_mmap/info.txt | 30 + .../botan/src/alloc/alloc_mmap/mmap_mem.cpp | 124 + .../botan/src/alloc/alloc_mmap/mmap_mem.h | 30 + src/libs/3rdparty/botan/src/alloc/allocate.h | 37 + src/libs/3rdparty/botan/src/alloc/info.txt | 8 + .../botan/src/alloc/mem_pool/info.txt | 12 + .../botan/src/alloc/mem_pool/mem_pool.cpp | 265 + .../botan/src/alloc/mem_pool/mem_pool.h | 74 + src/libs/3rdparty/botan/src/alloc/secmem.h | 438 + .../botan/src/alloc/system_alloc/defalloc.cpp | 100 + .../botan/src/alloc/system_alloc/defalloc.h | 43 + .../botan/src/alloc/system_alloc/info.txt | 13 + src/libs/3rdparty/botan/src/asn1/alg_id.cpp | 103 + src/libs/3rdparty/botan/src/asn1/alg_id.h | 49 + src/libs/3rdparty/botan/src/asn1/asn1_alt.cpp | 228 + src/libs/3rdparty/botan/src/asn1/asn1_att.cpp | 60 + src/libs/3rdparty/botan/src/asn1/asn1_dn.cpp | 304 + src/libs/3rdparty/botan/src/asn1/asn1_int.cpp | 68 + src/libs/3rdparty/botan/src/asn1/asn1_int.h | 108 + src/libs/3rdparty/botan/src/asn1/asn1_obj.h | 160 + src/libs/3rdparty/botan/src/asn1/asn1_oid.cpp | 176 + src/libs/3rdparty/botan/src/asn1/asn1_oid.h | 96 + src/libs/3rdparty/botan/src/asn1/asn1_str.cpp | 160 + src/libs/3rdparty/botan/src/asn1/asn1_tm.cpp | 297 + src/libs/3rdparty/botan/src/asn1/ber_dec.cpp | 471 + src/libs/3rdparty/botan/src/asn1/ber_dec.h | 122 + src/libs/3rdparty/botan/src/asn1/der_enc.cpp | 393 + src/libs/3rdparty/botan/src/asn1/der_enc.h | 91 + src/libs/3rdparty/botan/src/asn1/info.txt | 31 + .../botan/src/benchmark/benchmark.cpp | 189 + .../3rdparty/botan/src/benchmark/benchmark.h | 59 + .../3rdparty/botan/src/benchmark/info.txt | 21 + src/libs/3rdparty/botan/src/block/aes/aes.cpp | 257 + src/libs/3rdparty/botan/src/block/aes/aes.h | 81 + .../3rdparty/botan/src/block/aes/aes_tab.cpp | 406 + .../3rdparty/botan/src/block/aes/info.txt | 11 + .../3rdparty/botan/src/block/block_cipher.h | 100 + .../botan/src/block/blowfish/blfs_tab.cpp | 190 + .../botan/src/block/blowfish/blowfish.cpp | 125 + .../botan/src/block/blowfish/blowfish.h | 40 + .../botan/src/block/blowfish/info.txt | 11 + .../3rdparty/botan/src/block/cast/cast128.cpp | 172 + .../3rdparty/botan/src/block/cast/cast128.h | 47 + .../3rdparty/botan/src/block/cast/cast256.cpp | 165 + .../3rdparty/botan/src/block/cast/cast256.h | 44 + .../botan/src/block/cast/cast_tab.cpp | 412 + .../3rdparty/botan/src/block/cast/info.txt | 13 + src/libs/3rdparty/botan/src/block/des/des.cpp | 265 + src/libs/3rdparty/botan/src/block/des/des.h | 70 + .../3rdparty/botan/src/block/des/des_tab.cpp | 636 + .../3rdparty/botan/src/block/des/desx.cpp | 43 + src/libs/3rdparty/botan/src/block/des/desx.h | 35 + .../3rdparty/botan/src/block/des/info.txt | 13 + .../botan/src/block/gost_28147/gost_28147.cpp | 139 + .../botan/src/block/gost_28147/gost_28147.h | 67 + .../botan/src/block/gost_28147/info.txt | 10 + .../3rdparty/botan/src/block/idea/idea.cpp | 174 + src/libs/3rdparty/botan/src/block/idea/idea.h | 34 + .../3rdparty/botan/src/block/idea/info.txt | 10 + src/libs/3rdparty/botan/src/block/info.txt | 13 + .../3rdparty/botan/src/block/kasumi/info.txt | 10 + .../botan/src/block/kasumi/kasumi.cpp | 215 + .../3rdparty/botan/src/block/kasumi/kasumi.h | 36 + .../3rdparty/botan/src/block/lion/info.txt | 15 + .../3rdparty/botan/src/block/lion/lion.cpp | 114 + src/libs/3rdparty/botan/src/block/lion/lion.h | 43 + .../botan/src/block/lubyrack/info.txt | 14 + .../botan/src/block/lubyrack/lubyrack.cpp | 116 + .../botan/src/block/lubyrack/lubyrack.h | 38 + .../3rdparty/botan/src/block/mars/info.txt | 11 + .../3rdparty/botan/src/block/mars/mars.cpp | 276 + src/libs/3rdparty/botan/src/block/mars/mars.h | 38 + .../botan/src/block/mars/mars_tab.cpp | 100 + .../3rdparty/botan/src/block/misty1/info.txt | 10 + .../botan/src/block/misty1/misty1.cpp | 249 + .../3rdparty/botan/src/block/misty1/misty1.h | 35 + .../3rdparty/botan/src/block/noekeon/info.txt | 10 + .../botan/src/block/noekeon/noekeon.cpp | 198 + .../botan/src/block/noekeon/noekeon.h | 37 + .../3rdparty/botan/src/block/rc2/info.txt | 10 + src/libs/3rdparty/botan/src/block/rc2/rc2.cpp | 163 + src/libs/3rdparty/botan/src/block/rc2/rc2.h | 37 + .../3rdparty/botan/src/block/rc5/info.txt | 10 + src/libs/3rdparty/botan/src/block/rc5/rc5.cpp | 103 + src/libs/3rdparty/botan/src/block/rc5/rc5.h | 35 + .../3rdparty/botan/src/block/rc6/info.txt | 10 + src/libs/3rdparty/botan/src/block/rc6/rc6.cpp | 122 + src/libs/3rdparty/botan/src/block/rc6/rc6.h | 35 + .../3rdparty/botan/src/block/safer/info.txt | 11 + .../botan/src/block/safer/safe_tab.cpp | 121 + .../botan/src/block/safer/safer_sk.cpp | 115 + .../3rdparty/botan/src/block/safer/safer_sk.h | 40 + .../3rdparty/botan/src/block/seed/info.txt | 11 + .../3rdparty/botan/src/block/seed/seed.cpp | 127 + src/libs/3rdparty/botan/src/block/seed/seed.h | 43 + .../botan/src/block/seed/seed_tab.cpp | 192 + .../3rdparty/botan/src/block/serpent/info.txt | 10 + .../botan/src/block/serpent/serpent.cpp | 369 + .../botan/src/block/serpent/serpent.h | 35 + .../botan/src/block/serpent_ia32/info.txt | 35 + .../src/block/serpent_ia32/serp_ia32.cpp | 51 + .../botan/src/block/serpent_ia32/serp_ia32.h | 30 + .../src/block/serpent_ia32/serp_ia32_imp.S | 669 + .../botan/src/block/skipjack/info.txt | 10 + .../botan/src/block/skipjack/skipjack.cpp | 162 + .../botan/src/block/skipjack/skipjack.h | 38 + .../3rdparty/botan/src/block/square/info.txt | 11 + .../botan/src/block/square/sqr_tab.cpp | 460 + .../botan/src/block/square/square.cpp | 187 + .../3rdparty/botan/src/block/square/square.h | 52 + .../3rdparty/botan/src/block/tea/info.txt | 10 + src/libs/3rdparty/botan/src/block/tea/tea.cpp | 58 + src/libs/3rdparty/botan/src/block/tea/tea.h | 34 + .../3rdparty/botan/src/block/twofish/info.txt | 11 + .../botan/src/block/twofish/two_tab.cpp | 293 + .../botan/src/block/twofish/twofish.cpp | 218 + .../botan/src/block/twofish/twofish.h | 48 + .../3rdparty/botan/src/block/xtea/info.txt | 10 + .../3rdparty/botan/src/block/xtea/xtea.cpp | 64 + src/libs/3rdparty/botan/src/block/xtea/xtea.h | 34 + .../botan/src/build-data/arch/alpha.txt | 31 + .../botan/src/build-data/arch/amd64.txt | 27 + .../botan/src/build-data/arch/arm.txt | 23 + .../botan/src/build-data/arch/hitachi-sh.txt | 11 + .../botan/src/build-data/arch/hppa.txt | 17 + .../botan/src/build-data/arch/ia32.txt | 60 + .../botan/src/build-data/arch/ia64.txt | 15 + .../botan/src/build-data/arch/m68k.txt | 15 + .../botan/src/build-data/arch/mips32.txt | 22 + .../botan/src/build-data/arch/mips64.txt | 22 + .../botan/src/build-data/arch/ppc.txt | 24 + .../botan/src/build-data/arch/ppc64.txt | 26 + .../botan/src/build-data/arch/s390.txt | 7 + .../botan/src/build-data/arch/s390x.txt | 7 + .../botan/src/build-data/arch/sparc32.txt | 34 + .../botan/src/build-data/arch/sparc64.txt | 15 + .../botan/src/build-data/botan-config.in | 69 + .../botan/src/build-data/botan.doxy.in | 233 + .../3rdparty/botan/src/build-data/botan.pc.in | 12 + .../3rdparty/botan/src/build-data/buildh.in | 66 + .../3rdparty/botan/src/build-data/cc/bcc.txt | 31 + .../botan/src/build-data/cc/compaq.txt | 29 + .../botan/src/build-data/cc/ekopath.txt | 40 + .../3rdparty/botan/src/build-data/cc/gcc.txt | 89 + .../3rdparty/botan/src/build-data/cc/hpcc.txt | 32 + .../3rdparty/botan/src/build-data/cc/icc.txt | 35 + .../3rdparty/botan/src/build-data/cc/kai.txt | 30 + .../botan/src/build-data/cc/mipspro.txt | 42 + .../3rdparty/botan/src/build-data/cc/msvc.txt | 27 + .../botan/src/build-data/cc/open64.txt | 30 + .../3rdparty/botan/src/build-data/cc/pgi.txt | 31 + .../botan/src/build-data/cc/sgipro64.txt | 30 + .../botan/src/build-data/cc/sunwspro.txt | 47 + .../3rdparty/botan/src/build-data/cc/xlc.txt | 29 + .../botan/src/build-data/makefile/nmake.in | 107 + .../botan/src/build-data/makefile/unix.in | 121 + .../botan/src/build-data/makefile/unix_shr.in | 137 + .../3rdparty/botan/src/build-data/os/aix.txt | 7 + .../3rdparty/botan/src/build-data/os/beos.txt | 16 + .../botan/src/build-data/os/cygwin.txt | 13 + .../botan/src/build-data/os/darwin.txt | 19 + .../botan/src/build-data/os/defaults.txt | 19 + .../botan/src/build-data/os/dragonfly.txt | 11 + .../botan/src/build-data/os/freebsd.txt | 11 + .../3rdparty/botan/src/build-data/os/hpux.txt | 13 + .../3rdparty/botan/src/build-data/os/irix.txt | 7 + .../botan/src/build-data/os/linux.txt | 12 + .../botan/src/build-data/os/mingw.txt | 22 + .../botan/src/build-data/os/netbsd.txt | 7 + .../botan/src/build-data/os/openbsd.txt | 7 + .../3rdparty/botan/src/build-data/os/qnx.txt | 7 + .../botan/src/build-data/os/solaris.txt | 15 + .../botan/src/build-data/os/tru64.txt | 11 + .../botan/src/build-data/os/windows.txt | 26 + .../botan/src/cert/cvc/asn1_eac_str.cpp | 130 + .../botan/src/cert/cvc/asn1_eac_tm.cpp | 361 + .../3rdparty/botan/src/cert/cvc/cvc_ado.cpp | 135 + .../3rdparty/botan/src/cert/cvc/cvc_ado.h | 101 + .../3rdparty/botan/src/cert/cvc/cvc_ca.cpp | 46 + src/libs/3rdparty/botan/src/cert/cvc/cvc_ca.h | 51 + .../3rdparty/botan/src/cert/cvc/cvc_cert.cpp | 102 + .../3rdparty/botan/src/cert/cvc/cvc_cert.h | 94 + .../botan/src/cert/cvc/cvc_gen_cert.h | 177 + .../3rdparty/botan/src/cert/cvc/cvc_key.h | 54 + .../3rdparty/botan/src/cert/cvc/cvc_req.cpp | 68 + .../3rdparty/botan/src/cert/cvc/cvc_req.h | 63 + .../3rdparty/botan/src/cert/cvc/cvc_self.cpp | 327 + .../3rdparty/botan/src/cert/cvc/cvc_self.h | 167 + .../3rdparty/botan/src/cert/cvc/eac_asn_obj.h | 244 + .../3rdparty/botan/src/cert/cvc/eac_obj.h | 131 + .../3rdparty/botan/src/cert/cvc/ecdsa_sig.cpp | 64 + .../3rdparty/botan/src/cert/cvc/ecdsa_sig.h | 88 + .../3rdparty/botan/src/cert/cvc/freestore.h | 85 + src/libs/3rdparty/botan/src/cert/cvc/info.txt | 44 + .../botan/src/cert/cvc/signed_obj.cpp | 67 + .../3rdparty/botan/src/cert/cvc/signed_obj.h | 93 + .../3rdparty/botan/src/cert/x509/certstor.cpp | 48 + .../3rdparty/botan/src/cert/x509/certstor.h | 39 + .../3rdparty/botan/src/cert/x509/crl_ent.cpp | 107 + .../3rdparty/botan/src/cert/x509/crl_ent.h | 78 + .../3rdparty/botan/src/cert/x509/info.txt | 45 + .../3rdparty/botan/src/cert/x509/pkcs10.cpp | 200 + .../3rdparty/botan/src/cert/x509/pkcs10.h | 101 + .../3rdparty/botan/src/cert/x509/x509_ca.cpp | 284 + .../3rdparty/botan/src/cert/x509/x509_ca.h | 108 + .../3rdparty/botan/src/cert/x509/x509_crl.cpp | 147 + .../3rdparty/botan/src/cert/x509/x509_crl.h | 90 + .../3rdparty/botan/src/cert/x509/x509_ext.cpp | 581 + .../3rdparty/botan/src/cert/x509/x509_ext.h | 317 + .../3rdparty/botan/src/cert/x509/x509_obj.cpp | 235 + .../3rdparty/botan/src/cert/x509/x509_obj.h | 67 + .../3rdparty/botan/src/cert/x509/x509cert.cpp | 366 + .../3rdparty/botan/src/cert/x509/x509cert.h | 185 + .../3rdparty/botan/src/cert/x509/x509find.cpp | 111 + .../3rdparty/botan/src/cert/x509/x509find.h | 60 + .../3rdparty/botan/src/cert/x509/x509opt.cpp | 108 + .../3rdparty/botan/src/cert/x509/x509self.cpp | 176 + .../3rdparty/botan/src/cert/x509/x509self.h | 198 + .../3rdparty/botan/src/cert/x509/x509stor.cpp | 695 + .../3rdparty/botan/src/cert/x509/x509stor.h | 143 + .../botan/src/checksum/adler32/adler32.cpp | 74 + .../botan/src/checksum/adler32/adler32.h | 35 + .../botan/src/checksum/adler32/info.txt | 14 + .../botan/src/checksum/crc24/crc24.cpp | 100 + .../3rdparty/botan/src/checksum/crc24/crc24.h | 34 + .../botan/src/checksum/crc24/info.txt | 14 + .../botan/src/checksum/crc32/crc32.cpp | 102 + .../3rdparty/botan/src/checksum/crc32/crc32.h | 34 + .../botan/src/checksum/crc32/info.txt | 14 + src/libs/3rdparty/botan/src/cms/cms_algo.cpp | 164 + src/libs/3rdparty/botan/src/cms/cms_comp.cpp | 107 + src/libs/3rdparty/botan/src/cms/cms_dalg.cpp | 276 + src/libs/3rdparty/botan/src/cms/cms_dec.cpp | 127 + src/libs/3rdparty/botan/src/cms/cms_dec.h | 65 + src/libs/3rdparty/botan/src/cms/cms_ealg.cpp | 401 + src/libs/3rdparty/botan/src/cms/cms_enc.cpp | 86 + src/libs/3rdparty/botan/src/cms/cms_enc.h | 92 + src/libs/3rdparty/botan/src/cms/info.txt | 31 + .../botan/src/codec/base64/b64_char.cpp | 47 + .../botan/src/codec/base64/base64.cpp | 228 + .../3rdparty/botan/src/codec/base64/base64.h | 94 + .../3rdparty/botan/src/codec/base64/info.txt | 15 + .../3rdparty/botan/src/codec/bzip2/bzip2.cpp | 275 + .../3rdparty/botan/src/codec/bzip2/bzip2.h | 61 + .../3rdparty/botan/src/codec/bzip2/info.txt | 21 + src/libs/3rdparty/botan/src/codec/hex/hex.cpp | 191 + src/libs/3rdparty/botan/src/codec/hex/hex.h | 90 + .../3rdparty/botan/src/codec/hex/hex_char.cpp | 48 + .../3rdparty/botan/src/codec/hex/info.txt | 15 + .../3rdparty/botan/src/codec/openpgp/info.txt | 15 + .../botan/src/codec/openpgp/openpgp.cpp | 197 + .../botan/src/codec/openpgp/openpgp.h | 34 + .../3rdparty/botan/src/codec/pem/info.txt | 15 + src/libs/3rdparty/botan/src/codec/pem/pem.cpp | 143 + src/libs/3rdparty/botan/src/codec/pem/pem.h | 35 + .../3rdparty/botan/src/codec/zlib/info.txt | 23 + .../3rdparty/botan/src/codec/zlib/zlib.cpp | 287 + src/libs/3rdparty/botan/src/codec/zlib/zlib.h | 58 + .../botan/src/cryptobox/cryptobox.cpp | 146 + .../3rdparty/botan/src/cryptobox/cryptobox.h | 42 + .../3rdparty/botan/src/cryptobox/info.txt | 22 + .../botan/src/engine/amd64_eng/eng_amd64.cpp | 27 + .../botan/src/engine/amd64_eng/eng_amd64.h | 26 + .../botan/src/engine/amd64_eng/info.txt | 10 + .../botan/src/engine/def_engine/def_eng.h | 83 + .../botan/src/engine/def_engine/def_mode.cpp | 209 + .../src/engine/def_engine/def_pk_ops.cpp | 121 + .../botan/src/engine/def_engine/def_powm.cpp | 24 + .../botan/src/engine/def_engine/info.txt | 24 + .../src/engine/def_engine/lookup_block.cpp | 264 + .../src/engine/def_engine/lookup_hash.cpp | 209 + .../src/engine/def_engine/lookup_mac.cpp | 70 + .../src/engine/def_engine/lookup_stream.cpp | 61 + src/libs/3rdparty/botan/src/engine/engine.h | 140 + .../3rdparty/botan/src/engine/gnump/eng_gmp.h | 57 + .../botan/src/engine/gnump/gmp_dh.cpp | 53 + .../botan/src/engine/gnump/gmp_dsa.cpp | 124 + .../botan/src/engine/gnump/gmp_elg.cpp | 92 + .../botan/src/engine/gnump/gmp_if.cpp | 81 + .../botan/src/engine/gnump/gmp_mem.cpp | 70 + .../botan/src/engine/gnump/gmp_nr.cpp | 107 + .../botan/src/engine/gnump/gmp_powm.cpp | 53 + .../botan/src/engine/gnump/gmp_wrap.cpp | 98 + .../botan/src/engine/gnump/gmp_wrap.h | 38 + .../3rdparty/botan/src/engine/gnump/info.txt | 26 + .../botan/src/engine/ia32_eng/eng_ia32.cpp | 62 + .../botan/src/engine/ia32_eng/eng_ia32.h | 29 + .../botan/src/engine/ia32_eng/info.txt | 10 + src/libs/3rdparty/botan/src/engine/info.txt | 18 + .../botan/src/engine/openssl/arc4_openssl.cpp | 82 + .../botan/src/engine/openssl/bn_powm.cpp | 54 + .../botan/src/engine/openssl/bn_wrap.cpp | 116 + .../botan/src/engine/openssl/bn_wrap.h | 53 + .../botan/src/engine/openssl/eng_ossl.h | 64 + .../botan/src/engine/openssl/info.txt | 28 + .../botan/src/engine/openssl/ossl_bc.cpp | 200 + .../botan/src/engine/openssl/ossl_dh.cpp | 60 + .../botan/src/engine/openssl/ossl_dsa.cpp | 126 + .../botan/src/engine/openssl/ossl_elg.cpp | 95 + .../botan/src/engine/openssl/ossl_if.cpp | 85 + .../botan/src/engine/openssl/ossl_md.cpp | 126 + .../botan/src/engine/openssl/ossl_nr.cpp | 113 + .../botan/src/engine/sse2_eng/eng_sse2.cpp | 27 + .../botan/src/engine/sse2_eng/eng_sse2.h | 26 + .../botan/src/engine/sse2_eng/info.txt | 15 + .../botan/src/entropy/beos_stats/es_beos.cpp | 65 + .../botan/src/entropy/beos_stats/es_beos.h | 28 + .../botan/src/entropy/beos_stats/info.txt | 19 + .../src/entropy/cryptoapi_rng/es_capi.cpp | 93 + .../botan/src/entropy/cryptoapi_rng/es_capi.h | 33 + .../botan/src/entropy/cryptoapi_rng/info.txt | 21 + .../botan/src/entropy/dev_random/es_dev.cpp | 125 + .../botan/src/entropy/dev_random/es_dev.h | 53 + .../botan/src/entropy/dev_random/info.txt | 28 + .../3rdparty/botan/src/entropy/egd/es_egd.cpp | 156 + .../3rdparty/botan/src/entropy/egd/es_egd.h | 49 + .../3rdparty/botan/src/entropy/egd/info.txt | 32 + .../3rdparty/botan/src/entropy/entropy_src.h | 95 + src/libs/3rdparty/botan/src/entropy/info.txt | 11 + .../botan/src/entropy/proc_walk/es_ftw.cpp | 146 + .../botan/src/entropy/proc_walk/es_ftw.h | 42 + .../botan/src/entropy/proc_walk/info.txt | 34 + .../botan/src/entropy/unix_procs/es_unix.cpp | 114 + .../botan/src/entropy/unix_procs/es_unix.h | 39 + .../botan/src/entropy/unix_procs/info.txt | 33 + .../botan/src/entropy/unix_procs/unix_cmd.cpp | 236 + .../botan/src/entropy/unix_procs/unix_cmd.h | 59 + .../botan/src/entropy/unix_procs/unix_src.cpp | 61 + .../src/entropy/win32_stats/es_win32.cpp | 118 + .../botan/src/entropy/win32_stats/es_win32.h | 27 + .../botan/src/entropy/win32_stats/info.txt | 24 + .../3rdparty/botan/src/filters/algo_filt.cpp | 124 + .../3rdparty/botan/src/filters/basefilt.cpp | 74 + .../3rdparty/botan/src/filters/basefilt.h | 99 + .../3rdparty/botan/src/filters/buf_filt.cpp | 71 + .../3rdparty/botan/src/filters/buf_filt.h | 39 + .../3rdparty/botan/src/filters/data_snk.cpp | 62 + .../3rdparty/botan/src/filters/data_snk.h | 65 + .../3rdparty/botan/src/filters/data_src.cpp | 207 + .../3rdparty/botan/src/filters/data_src.h | 150 + .../botan/src/filters/fd_unix/fd_unix.cpp | 53 + .../botan/src/filters/fd_unix/fd_unix.h | 23 + .../botan/src/filters/fd_unix/info.txt | 28 + .../3rdparty/botan/src/filters/filter.cpp | 127 + src/libs/3rdparty/botan/src/filters/filter.h | 113 + src/libs/3rdparty/botan/src/filters/filters.h | 189 + src/libs/3rdparty/botan/src/filters/info.txt | 41 + .../3rdparty/botan/src/filters/out_buf.cpp | 119 + src/libs/3rdparty/botan/src/filters/out_buf.h | 43 + src/libs/3rdparty/botan/src/filters/pbe.h | 56 + src/libs/3rdparty/botan/src/filters/pipe.cpp | 306 + src/libs/3rdparty/botan/src/filters/pipe.h | 275 + .../3rdparty/botan/src/filters/pipe_io.cpp | 45 + .../3rdparty/botan/src/filters/pipe_rw.cpp | 167 + .../3rdparty/botan/src/filters/secqueue.cpp | 205 + .../3rdparty/botan/src/filters/secqueue.h | 43 + .../botan/src/hash/fork256/fork256.cpp | 149 + .../3rdparty/botan/src/hash/fork256/fork256.h | 35 + .../3rdparty/botan/src/hash/fork256/info.txt | 14 + .../botan/src/hash/gost_3411/gost_3411.cpp | 236 + .../botan/src/hash/gost_3411/gost_3411.h | 41 + .../botan/src/hash/gost_3411/info.txt | 14 + .../3rdparty/botan/src/hash/has160/has160.cpp | 159 + .../3rdparty/botan/src/hash/has160/has160.h | 35 + .../3rdparty/botan/src/hash/has160/info.txt | 14 + src/libs/3rdparty/botan/src/hash/hash.h | 52 + src/libs/3rdparty/botan/src/hash/info.txt | 11 + src/libs/3rdparty/botan/src/hash/md2/info.txt | 10 + src/libs/3rdparty/botan/src/hash/md2/md2.cpp | 108 + src/libs/3rdparty/botan/src/hash/md2/md2.h | 37 + src/libs/3rdparty/botan/src/hash/md4/info.txt | 14 + src/libs/3rdparty/botan/src/hash/md4/md4.cpp | 108 + src/libs/3rdparty/botan/src/hash/md4/md4.h | 36 + .../3rdparty/botan/src/hash/md4_ia32/info.txt | 35 + .../botan/src/hash/md4_ia32/md4_ia32.cpp | 27 + .../botan/src/hash/md4_ia32/md4_ia32.h | 28 + .../botan/src/hash/md4_ia32/md4_ia32_imp.S | 137 + src/libs/3rdparty/botan/src/hash/md5/info.txt | 14 + src/libs/3rdparty/botan/src/hash/md5/md5.cpp | 136 + src/libs/3rdparty/botan/src/hash/md5/md5.h | 35 + .../3rdparty/botan/src/hash/md5_ia32/info.txt | 35 + .../botan/src/hash/md5_ia32/md5_ia32.cpp | 32 + .../botan/src/hash/md5_ia32/md5_ia32.h | 28 + .../botan/src/hash/md5_ia32/md5_ia32_imp.S | 166 + .../3rdparty/botan/src/hash/mdx_hash/info.txt | 10 + .../botan/src/hash/mdx_hash/mdx_hash.cpp | 105 + .../botan/src/hash/mdx_hash/mdx_hash.h | 42 + .../3rdparty/botan/src/hash/par_hash/info.txt | 10 + .../botan/src/hash/par_hash/par_hash.cpp | 103 + .../botan/src/hash/par_hash/par_hash.h | 36 + .../3rdparty/botan/src/hash/rmd128/info.txt | 14 + .../3rdparty/botan/src/hash/rmd128/rmd128.cpp | 172 + .../3rdparty/botan/src/hash/rmd128/rmd128.h | 35 + .../3rdparty/botan/src/hash/rmd160/info.txt | 14 + .../3rdparty/botan/src/hash/rmd160/rmd160.cpp | 210 + .../3rdparty/botan/src/hash/rmd160/rmd160.h | 35 + .../3rdparty/botan/src/hash/sha1/info.txt | 14 + .../3rdparty/botan/src/hash/sha1/sha160.cpp | 162 + .../3rdparty/botan/src/hash/sha1/sha160.h | 38 + .../botan/src/hash/sha1_amd64/info.txt | 34 + .../botan/src/hash/sha1_amd64/sha1_amd64.cpp | 31 + .../botan/src/hash/sha1_amd64/sha1_amd64.h | 28 + .../src/hash/sha1_amd64/sha1_amd64_imp.S | 260 + .../botan/src/hash/sha1_ia32/info.txt | 35 + .../botan/src/hash/sha1_ia32/sha1_ia32.cpp | 32 + .../botan/src/hash/sha1_ia32/sha1_ia32.h | 31 + .../botan/src/hash/sha1_ia32/sha1_ia32_imp.S | 244 + .../botan/src/hash/sha1_sse2/info.txt | 28 + .../botan/src/hash/sha1_sse2/sha1_sse2.cpp | 24 + .../botan/src/hash/sha1_sse2/sha1_sse2.h | 31 + .../src/hash/sha1_sse2/sha1_sse2_imp.cpp | 331 + .../3rdparty/botan/src/hash/sha2/info.txt | 16 + .../3rdparty/botan/src/hash/sha2/sha2_32.cpp | 193 + .../3rdparty/botan/src/hash/sha2/sha2_32.h | 59 + .../3rdparty/botan/src/hash/sha2/sha2_64.cpp | 208 + .../3rdparty/botan/src/hash/sha2/sha2_64.h | 60 + .../3rdparty/botan/src/hash/skein/info.txt | 14 + .../botan/src/hash/skein/skein_512.cpp | 262 + .../3rdparty/botan/src/hash/skein/skein_512.h | 41 + .../3rdparty/botan/src/hash/tiger/info.txt | 15 + .../3rdparty/botan/src/hash/tiger/tig_tab.cpp | 364 + .../3rdparty/botan/src/hash/tiger/tiger.cpp | 164 + .../3rdparty/botan/src/hash/tiger/tiger.h | 44 + .../botan/src/hash/whirlpool/info.txt | 15 + .../botan/src/hash/whirlpool/whrl_tab.cpp | 540 + .../botan/src/hash/whirlpool/whrlpool.cpp | 146 + .../botan/src/hash/whirlpool/whrlpool.h | 42 + src/libs/3rdparty/botan/src/kdf/info.txt | 14 + src/libs/3rdparty/botan/src/kdf/kdf.cpp | 68 + src/libs/3rdparty/botan/src/kdf/kdf.h | 60 + src/libs/3rdparty/botan/src/kdf/kdf1/info.txt | 14 + src/libs/3rdparty/botan/src/kdf/kdf1/kdf1.cpp | 24 + src/libs/3rdparty/botan/src/kdf/kdf1/kdf1.h | 36 + src/libs/3rdparty/botan/src/kdf/kdf2/info.txt | 14 + src/libs/3rdparty/botan/src/kdf/kdf2/kdf2.cpp | 41 + src/libs/3rdparty/botan/src/kdf/kdf2/kdf2.h | 34 + src/libs/3rdparty/botan/src/kdf/mgf1/info.txt | 14 + src/libs/3rdparty/botan/src/kdf/mgf1/mgf1.cpp | 58 + src/libs/3rdparty/botan/src/kdf/mgf1/mgf1.h | 36 + .../3rdparty/botan/src/kdf/ssl_prf/info.txt | 16 + .../botan/src/kdf/ssl_prf/prf_ssl3.cpp | 76 + .../3rdparty/botan/src/kdf/ssl_prf/prf_ssl3.h | 27 + .../3rdparty/botan/src/kdf/tls_prf/info.txt | 17 + .../botan/src/kdf/tls_prf/prf_tls.cpp | 85 + .../3rdparty/botan/src/kdf/tls_prf/prf_tls.h | 34 + .../3rdparty/botan/src/kdf/x942_prf/info.txt | 16 + .../botan/src/kdf/x942_prf/prf_x942.cpp | 91 + .../botan/src/kdf/x942_prf/prf_x942.h | 31 + src/libs/3rdparty/botan/src/libstate/botan.h | 18 + .../3rdparty/botan/src/libstate/get_enc.cpp | 238 + src/libs/3rdparty/botan/src/libstate/info.txt | 45 + src/libs/3rdparty/botan/src/libstate/init.cpp | 75 + src/libs/3rdparty/botan/src/libstate/init.h | 41 + .../3rdparty/botan/src/libstate/libstate.cpp | 338 + .../3rdparty/botan/src/libstate/libstate.h | 125 + .../3rdparty/botan/src/libstate/look_pk.cpp | 76 + .../3rdparty/botan/src/libstate/look_pk.h | 78 + .../3rdparty/botan/src/libstate/lookup.cpp | 296 + src/libs/3rdparty/botan/src/libstate/lookup.h | 239 + .../botan/src/libstate/oid_lookup/info.txt | 14 + .../botan/src/libstate/oid_lookup/oids.cpp | 76 + .../botan/src/libstate/oid_lookup/oids.h | 58 + .../3rdparty/botan/src/libstate/pk_engine.cpp | 175 + .../3rdparty/botan/src/libstate/pk_engine.h | 95 + .../3rdparty/botan/src/libstate/policy.cpp | 511 + .../3rdparty/botan/src/libstate/scan_name.cpp | 74 + .../3rdparty/botan/src/libstate/scan_name.h | 77 + .../botan/src/mac/cbc_mac/cbc_mac.cpp | 109 + .../3rdparty/botan/src/mac/cbc_mac/cbc_mac.h | 40 + .../3rdparty/botan/src/mac/cbc_mac/info.txt | 14 + src/libs/3rdparty/botan/src/mac/cmac/cmac.cpp | 162 + src/libs/3rdparty/botan/src/mac/cmac/cmac.h | 44 + src/libs/3rdparty/botan/src/mac/cmac/info.txt | 14 + src/libs/3rdparty/botan/src/mac/hmac/hmac.cpp | 99 + src/libs/3rdparty/botan/src/mac/hmac/hmac.h | 38 + src/libs/3rdparty/botan/src/mac/hmac/info.txt | 14 + src/libs/3rdparty/botan/src/mac/info.txt | 13 + src/libs/3rdparty/botan/src/mac/mac.cpp | 26 + src/libs/3rdparty/botan/src/mac/mac.h | 60 + .../3rdparty/botan/src/mac/ssl3mac/info.txt | 14 + .../botan/src/mac/ssl3mac/ssl3_mac.cpp | 90 + .../3rdparty/botan/src/mac/ssl3mac/ssl3_mac.h | 39 + .../3rdparty/botan/src/mac/x919_mac/info.txt | 14 + .../botan/src/mac/x919_mac/x919_mac.cpp | 107 + .../botan/src/mac/x919_mac/x919_mac.h | 41 + .../botan/src/math/bigint/big_code.cpp | 154 + .../3rdparty/botan/src/math/bigint/big_io.cpp | 55 + .../botan/src/math/bigint/big_ops2.cpp | 224 + .../botan/src/math/bigint/big_ops3.cpp | 190 + .../botan/src/math/bigint/big_rand.cpp | 61 + .../3rdparty/botan/src/math/bigint/bigint.cpp | 369 + .../3rdparty/botan/src/math/bigint/bigint.h | 534 + .../3rdparty/botan/src/math/bigint/divide.cpp | 106 + .../3rdparty/botan/src/math/bigint/divide.h | 19 + .../3rdparty/botan/src/math/bigint/info.txt | 33 + .../src/math/bigint/monty_amd64/info.txt | 32 + .../src/math/bigint/monty_amd64/mp_monty.S | 399 + .../src/math/bigint/monty_generic/info.txt | 7 + .../math/bigint/monty_generic/mp_monty.cpp | 78 + .../botan/src/math/bigint/mp_amd64/info.txt | 19 + .../botan/src/math/bigint/mp_amd64/mp_asm.h | 69 + .../botan/src/math/bigint/mp_amd64/mp_asmi.h | 243 + .../3rdparty/botan/src/math/bigint/mp_asm.cpp | 179 + .../botan/src/math/bigint/mp_asm64/info.txt | 27 + .../botan/src/math/bigint/mp_asm64/mp_asm.h | 119 + .../botan/src/math/bigint/mp_comba.cpp | 920 + .../3rdparty/botan/src/math/bigint/mp_core.h | 98 + .../botan/src/math/bigint/mp_generic/info.txt | 8 + .../botan/src/math/bigint/mp_generic/mp_asm.h | 54 + .../src/math/bigint/mp_generic/mp_asmi.h | 191 + .../botan/src/math/bigint/mp_ia32/info.txt | 19 + .../botan/src/math/bigint/mp_ia32/mp_asm.h | 67 + .../botan/src/math/bigint/mp_ia32/mp_asmi.h | 235 + .../src/math/bigint/mp_ia32_msvc/info.txt | 18 + .../src/math/bigint/mp_ia32_msvc/mp_asmi.h | 528 + .../botan/src/math/bigint/mp_karat.cpp | 336 + .../botan/src/math/bigint/mp_misc.cpp | 94 + .../botan/src/math/bigint/mp_shift.cpp | 138 + .../3rdparty/botan/src/math/bigint/mp_types.h | 33 + .../src/math/bigint/mulop_amd64/info.txt | 32 + .../src/math/bigint/mulop_amd64/mp_mulop.cpp | 96 + .../math/bigint/mulop_amd64/mp_mulop_amd64.S | 130 + .../src/math/bigint/mulop_generic/info.txt | 7 + .../math/bigint/mulop_generic/mp_mulop.cpp | 77 + .../botan/src/math/bigint/mulop_ia32/info.txt | 34 + .../src/math/bigint/mulop_ia32/mp_mulop.S | 64 + .../botan/src/math/gfpmath/curve_gfp.cpp | 165 + .../botan/src/math/gfpmath/curve_gfp.h | 177 + .../botan/src/math/gfpmath/gfp_element.cpp | 699 + .../botan/src/math/gfpmath/gfp_element.h | 311 + .../botan/src/math/gfpmath/gfp_modulus.h | 127 + .../3rdparty/botan/src/math/gfpmath/info.txt | 22 + .../botan/src/math/gfpmath/point_gfp.cpp | 1154 + .../botan/src/math/gfpmath/point_gfp.h | 315 + .../botan/src/math/numbertheory/blinding.cpp | 49 + .../botan/src/math/numbertheory/blinding.h | 34 + .../botan/src/math/numbertheory/def_powm.h | 64 + .../botan/src/math/numbertheory/dsa_gen.cpp | 135 + .../botan/src/math/numbertheory/info.txt | 33 + .../botan/src/math/numbertheory/jacobi.cpp | 53 + .../botan/src/math/numbertheory/make_prm.cpp | 97 + .../botan/src/math/numbertheory/mp_numth.cpp | 71 + .../botan/src/math/numbertheory/numthry.cpp | 346 + .../botan/src/math/numbertheory/numthry.h | 120 + .../botan/src/math/numbertheory/pow_mod.cpp | 157 + .../botan/src/math/numbertheory/pow_mod.h | 93 + .../botan/src/math/numbertheory/powm_fw.cpp | 104 + .../botan/src/math/numbertheory/powm_mnt.cpp | 180 + .../botan/src/math/numbertheory/primes.cpp | 676 + .../botan/src/math/numbertheory/reducer.cpp | 97 + .../botan/src/math/numbertheory/reducer.h | 36 + .../botan/src/math/numbertheory/ressol.cpp | 82 + src/libs/3rdparty/botan/src/modes/cbc/cbc.cpp | 158 + src/libs/3rdparty/botan/src/modes/cbc/cbc.h | 55 + .../3rdparty/botan/src/modes/cbc/info.txt | 14 + src/libs/3rdparty/botan/src/modes/cfb/cfb.cpp | 143 + src/libs/3rdparty/botan/src/modes/cfb/cfb.h | 47 + .../3rdparty/botan/src/modes/cfb/info.txt | 15 + src/libs/3rdparty/botan/src/modes/ctr/ctr.cpp | 75 + src/libs/3rdparty/botan/src/modes/ctr/ctr.h | 31 + .../3rdparty/botan/src/modes/ctr/info.txt | 15 + src/libs/3rdparty/botan/src/modes/cts/cts.cpp | 134 + src/libs/3rdparty/botan/src/modes/cts/cts.h | 60 + .../3rdparty/botan/src/modes/cts/info.txt | 14 + src/libs/3rdparty/botan/src/modes/eax/eax.cpp | 172 + src/libs/3rdparty/botan/src/modes/eax/eax.h | 85 + .../3rdparty/botan/src/modes/eax/eax_dec.cpp | 127 + .../3rdparty/botan/src/modes/eax/info.txt | 18 + src/libs/3rdparty/botan/src/modes/ecb/ecb.cpp | 105 + src/libs/3rdparty/botan/src/modes/ecb/ecb.h | 73 + .../3rdparty/botan/src/modes/ecb/info.txt | 15 + src/libs/3rdparty/botan/src/modes/info.txt | 15 + .../botan/src/modes/mode_pad/info.txt | 10 + .../botan/src/modes/mode_pad/mode_pad.cpp | 128 + .../botan/src/modes/mode_pad/mode_pad.h | 120 + .../3rdparty/botan/src/modes/modebase.cpp | 54 + src/libs/3rdparty/botan/src/modes/modebase.h | 39 + .../3rdparty/botan/src/modes/ofb/info.txt | 14 + src/libs/3rdparty/botan/src/modes/ofb/ofb.cpp | 66 + src/libs/3rdparty/botan/src/modes/ofb/ofb.h | 33 + .../3rdparty/botan/src/modes/xts/info.txt | 15 + src/libs/3rdparty/botan/src/modes/xts/xts.cpp | 344 + src/libs/3rdparty/botan/src/modes/xts/xts.h | 76 + src/libs/3rdparty/botan/src/mutex/info.txt | 9 + src/libs/3rdparty/botan/src/mutex/mutex.h | 56 + .../botan/src/mutex/noop_mutex/info.txt | 10 + .../botan/src/mutex/noop_mutex/mux_noop.cpp | 50 + .../botan/src/mutex/noop_mutex/mux_noop.h | 26 + .../botan/src/mutex/pthreads/info.txt | 30 + .../botan/src/mutex/pthreads/mux_pthr.cpp | 58 + .../botan/src/mutex/pthreads/mux_pthr.h | 26 + .../botan/src/mutex/qt_mutex/info.txt | 18 + .../botan/src/mutex/qt_mutex/mux_qt.cpp | 35 + .../botan/src/mutex/qt_mutex/mux_qt.h | 27 + .../src/mutex/win32_crit_section/info.txt | 17 + .../mutex/win32_crit_section/mux_win32.cpp | 34 + .../src/mutex/win32_crit_section/mux_win32.h | 26 + src/libs/3rdparty/botan/src/pbe/get_pbe.cpp | 130 + src/libs/3rdparty/botan/src/pbe/get_pbe.h | 33 + src/libs/3rdparty/botan/src/pbe/info.txt | 16 + .../3rdparty/botan/src/pbe/pbes1/info.txt | 19 + .../3rdparty/botan/src/pbe/pbes1/pbes1.cpp | 184 + src/libs/3rdparty/botan/src/pbe/pbes1/pbes1.h | 53 + .../3rdparty/botan/src/pbe/pbes2/info.txt | 23 + .../3rdparty/botan/src/pbe/pbes2/pbes2.cpp | 239 + src/libs/3rdparty/botan/src/pbe/pbes2/pbes2.h | 53 + src/libs/3rdparty/botan/src/pk_pad/eme.cpp | 50 + src/libs/3rdparty/botan/src/pk_pad/eme.h | 42 + .../3rdparty/botan/src/pk_pad/eme1/eme1.cpp | 103 + .../3rdparty/botan/src/pk_pad/eme1/eme1.h | 45 + .../3rdparty/botan/src/pk_pad/eme1/info.txt | 16 + .../botan/src/pk_pad/eme_pkcs/eme_pkcs.cpp | 70 + .../botan/src/pk_pad/eme_pkcs/eme_pkcs.h | 30 + .../botan/src/pk_pad/eme_pkcs/info.txt | 10 + src/libs/3rdparty/botan/src/pk_pad/emsa.h | 36 + .../3rdparty/botan/src/pk_pad/emsa1/emsa1.cpp | 105 + .../3rdparty/botan/src/pk_pad/emsa1/emsa1.h | 41 + .../3rdparty/botan/src/pk_pad/emsa1/info.txt | 14 + .../botan/src/pk_pad/emsa1_bsi/emsa1_bsi.cpp | 29 + .../botan/src/pk_pad/emsa1_bsi/emsa1_bsi.h | 32 + .../botan/src/pk_pad/emsa1_bsi/info.txt | 14 + .../3rdparty/botan/src/pk_pad/emsa2/emsa2.cpp | 111 + .../3rdparty/botan/src/pk_pad/emsa2/emsa2.h | 41 + .../3rdparty/botan/src/pk_pad/emsa2/info.txt | 15 + .../3rdparty/botan/src/pk_pad/emsa3/emsa3.cpp | 152 + .../3rdparty/botan/src/pk_pad/emsa3/emsa3.h | 65 + .../3rdparty/botan/src/pk_pad/emsa3/info.txt | 15 + .../3rdparty/botan/src/pk_pad/emsa4/emsa4.cpp | 143 + .../3rdparty/botan/src/pk_pad/emsa4/emsa4.h | 43 + .../3rdparty/botan/src/pk_pad/emsa4/info.txt | 16 + .../botan/src/pk_pad/emsa_raw/emsa_raw.cpp | 50 + .../botan/src/pk_pad/emsa_raw/emsa_raw.h | 34 + .../botan/src/pk_pad/emsa_raw/info.txt | 10 + .../botan/src/pk_pad/hash_id/hash_id.cpp | 116 + .../botan/src/pk_pad/hash_id/hash_id.h | 24 + .../botan/src/pk_pad/hash_id/info.txt | 14 + src/libs/3rdparty/botan/src/pk_pad/info.txt | 16 + src/libs/3rdparty/botan/src/pubkey/dh/dh.cpp | 119 + src/libs/3rdparty/botan/src/pubkey/dh/dh.h | 80 + .../3rdparty/botan/src/pubkey/dh/dh_core.cpp | 69 + .../3rdparty/botan/src/pubkey/dh/dh_core.h | 38 + src/libs/3rdparty/botan/src/pubkey/dh/dh_op.h | 45 + .../3rdparty/botan/src/pubkey/dh/info.txt | 20 + .../botan/src/pubkey/dl_algo/dl_algo.cpp | 167 + .../botan/src/pubkey/dl_algo/dl_algo.h | 116 + .../botan/src/pubkey/dl_algo/info.txt | 18 + .../botan/src/pubkey/dl_group/dl_group.cpp | 333 + .../botan/src/pubkey/dl_group/dl_group.h | 162 + .../botan/src/pubkey/dl_group/info.txt | 19 + .../3rdparty/botan/src/pubkey/dlies/dlies.cpp | 137 + .../3rdparty/botan/src/pubkey/dlies/dlies.h | 69 + .../3rdparty/botan/src/pubkey/dlies/info.txt | 16 + .../3rdparty/botan/src/pubkey/dsa/dsa.cpp | 134 + src/libs/3rdparty/botan/src/pubkey/dsa/dsa.h | 62 + .../botan/src/pubkey/dsa/dsa_core.cpp | 63 + .../3rdparty/botan/src/pubkey/dsa/dsa_core.h | 37 + .../3rdparty/botan/src/pubkey/dsa/dsa_op.cpp | 73 + .../3rdparty/botan/src/pubkey/dsa/dsa_op.h | 53 + .../3rdparty/botan/src/pubkey/dsa/info.txt | 22 + .../botan/src/pubkey/ec_dompar/ec_dompar.cpp | 573 + .../botan/src/pubkey/ec_dompar/ec_dompar.h | 121 + .../botan/src/pubkey/ec_dompar/info.txt | 18 + .../botan/src/pubkey/ecc_key/ecc_key.cpp | 269 + .../botan/src/pubkey/ecc_key/ecc_key.h | 154 + .../botan/src/pubkey/ecc_key/info.txt | 20 + .../3rdparty/botan/src/pubkey/ecdsa/ecdsa.cpp | 230 + .../3rdparty/botan/src/pubkey/ecdsa/ecdsa.h | 145 + .../botan/src/pubkey/ecdsa/ecdsa_core.cpp | 55 + .../botan/src/pubkey/ecdsa/ecdsa_core.h | 47 + .../botan/src/pubkey/ecdsa/ecdsa_op.cpp | 129 + .../botan/src/pubkey/ecdsa/ecdsa_op.h | 64 + .../3rdparty/botan/src/pubkey/ecdsa/info.txt | 25 + .../botan/src/pubkey/eckaeg/eckaeg.cpp | 152 + .../3rdparty/botan/src/pubkey/eckaeg/eckaeg.h | 137 + .../botan/src/pubkey/eckaeg/eckaeg_core.cpp | 59 + .../botan/src/pubkey/eckaeg/eckaeg_core.h | 44 + .../botan/src/pubkey/eckaeg/eckaeg_op.cpp | 36 + .../botan/src/pubkey/eckaeg/eckaeg_op.h | 49 + .../3rdparty/botan/src/pubkey/eckaeg/info.txt | 24 + .../botan/src/pubkey/elgamal/elg_core.cpp | 97 + .../botan/src/pubkey/elgamal/elg_core.h | 44 + .../botan/src/pubkey/elgamal/elg_op.cpp | 56 + .../botan/src/pubkey/elgamal/elg_op.h | 52 + .../botan/src/pubkey/elgamal/elgamal.cpp | 124 + .../botan/src/pubkey/elgamal/elgamal.h | 59 + .../botan/src/pubkey/elgamal/info.txt | 22 + .../botan/src/pubkey/if_algo/if_algo.cpp | 215 + .../botan/src/pubkey/if_algo/if_algo.h | 85 + .../botan/src/pubkey/if_algo/if_core.cpp | 87 + .../botan/src/pubkey/if_algo/if_core.h | 45 + .../botan/src/pubkey/if_algo/if_op.cpp | 47 + .../3rdparty/botan/src/pubkey/if_algo/if_op.h | 52 + .../botan/src/pubkey/if_algo/info.txt | 22 + src/libs/3rdparty/botan/src/pubkey/info.txt | 30 + .../botan/src/pubkey/keypair/info.txt | 14 + .../botan/src/pubkey/keypair/keypair.cpp | 73 + .../botan/src/pubkey/keypair/keypair.h | 47 + .../3rdparty/botan/src/pubkey/nr/info.txt | 22 + src/libs/3rdparty/botan/src/pubkey/nr/nr.cpp | 134 + src/libs/3rdparty/botan/src/pubkey/nr/nr.h | 63 + .../3rdparty/botan/src/pubkey/nr/nr_core.cpp | 62 + .../3rdparty/botan/src/pubkey/nr/nr_core.h | 37 + .../3rdparty/botan/src/pubkey/nr/nr_op.cpp | 71 + src/libs/3rdparty/botan/src/pubkey/nr/nr_op.h | 53 + .../3rdparty/botan/src/pubkey/pk_algs.cpp | 112 + src/libs/3rdparty/botan/src/pubkey/pk_algs.h | 31 + .../botan/src/pubkey/pk_codecs/info.txt | 18 + .../botan/src/pubkey/pk_codecs/pkcs8.cpp | 313 + .../botan/src/pubkey/pk_codecs/pkcs8.h | 177 + .../botan/src/pubkey/pk_codecs/x509_key.cpp | 176 + .../botan/src/pubkey/pk_codecs/x509_key.h | 110 + .../3rdparty/botan/src/pubkey/pk_filts.cpp | 115 + src/libs/3rdparty/botan/src/pubkey/pk_filts.h | 91 + .../3rdparty/botan/src/pubkey/pk_keys.cpp | 54 + src/libs/3rdparty/botan/src/pubkey/pk_keys.h | 180 + src/libs/3rdparty/botan/src/pubkey/pubkey.cpp | 396 + src/libs/3rdparty/botan/src/pubkey/pubkey.h | 392 + .../botan/src/pubkey/pubkey_enums.cpp | 42 + .../3rdparty/botan/src/pubkey/pubkey_enums.h | 77 + .../3rdparty/botan/src/pubkey/rsa/info.txt | 17 + .../3rdparty/botan/src/pubkey/rsa/rsa.cpp | 164 + src/libs/3rdparty/botan/src/pubkey/rsa/rsa.h | 88 + .../3rdparty/botan/src/pubkey/rw/info.txt | 17 + src/libs/3rdparty/botan/src/pubkey/rw/rw.cpp | 148 + src/libs/3rdparty/botan/src/pubkey/rw/rw.h | 56 + .../botan/src/rng/auto_rng/auto_rng.cpp | 158 + .../botan/src/rng/auto_rng/auto_rng.h | 44 + .../3rdparty/botan/src/rng/auto_rng/info.txt | 16 + .../botan/src/rng/hmac_rng/hmac_rng.cpp | 223 + .../botan/src/rng/hmac_rng/hmac_rng.h | 59 + .../3rdparty/botan/src/rng/hmac_rng/info.txt | 14 + src/libs/3rdparty/botan/src/rng/info.txt | 12 + .../3rdparty/botan/src/rng/randpool/info.txt | 15 + .../botan/src/rng/randpool/randpool.cpp | 213 + .../botan/src/rng/randpool/randpool.h | 53 + src/libs/3rdparty/botan/src/rng/rng.cpp | 38 + src/libs/3rdparty/botan/src/rng/rng.h | 103 + .../3rdparty/botan/src/rng/x931_rng/info.txt | 14 + .../botan/src/rng/x931_rng/x931_rng.cpp | 154 + .../botan/src/rng/x931_rng/x931_rng.h | 45 + src/libs/3rdparty/botan/src/s2k/info.txt | 13 + .../3rdparty/botan/src/s2k/pbkdf1/info.txt | 14 + .../3rdparty/botan/src/s2k/pbkdf1/pbkdf1.cpp | 55 + .../3rdparty/botan/src/s2k/pbkdf1/pbkdf1.h | 44 + .../3rdparty/botan/src/s2k/pbkdf2/info.txt | 14 + .../3rdparty/botan/src/s2k/pbkdf2/pbkdf2.cpp | 82 + .../3rdparty/botan/src/s2k/pbkdf2/pbkdf2.h | 40 + .../3rdparty/botan/src/s2k/pgps2k/info.txt | 14 + .../3rdparty/botan/src/s2k/pgps2k/pgp_s2k.cpp | 74 + .../3rdparty/botan/src/s2k/pgps2k/pgp_s2k.h | 36 + src/libs/3rdparty/botan/src/s2k/s2k.cpp | 55 + src/libs/3rdparty/botan/src/s2k/s2k.h | 102 + src/libs/3rdparty/botan/src/selftest/info.txt | 21 + .../3rdparty/botan/src/selftest/selftest.cpp | 184 + .../3rdparty/botan/src/selftest/selftest.h | 22 + .../3rdparty/botan/src/stream/arc4/arc4.cpp | 105 + .../3rdparty/botan/src/stream/arc4/arc4.h | 41 + .../3rdparty/botan/src/stream/arc4/info.txt | 14 + src/libs/3rdparty/botan/src/stream/info.txt | 14 + .../botan/src/stream/salsa20/info.txt | 14 + .../botan/src/stream/salsa20/salsa20.cpp | 217 + .../botan/src/stream/salsa20/salsa20.h | 41 + .../botan/src/stream/stream_cipher.cpp | 30 + .../3rdparty/botan/src/stream/stream_cipher.h | 92 + .../3rdparty/botan/src/stream/turing/info.txt | 15 + .../botan/src/stream/turing/tur_tab.cpp | 81 + .../botan/src/stream/turing/turing.cpp | 307 + .../3rdparty/botan/src/stream/turing/turing.h | 47 + .../botan/src/stream/wid_wake/info.txt | 14 + .../botan/src/stream/wid_wake/wid_wake.cpp | 147 + .../botan/src/stream/wid_wake/wid_wake.h | 41 + src/libs/3rdparty/botan/src/sym_algo/info.txt | 16 + .../3rdparty/botan/src/sym_algo/sym_algo.h | 101 + .../3rdparty/botan/src/sym_algo/symkey.cpp | 141 + src/libs/3rdparty/botan/src/sym_algo/symkey.h | 62 + .../botan/src/timer/cpu_counter/info.txt | 36 + .../botan/src/timer/cpu_counter/tm_hard.cpp | 51 + .../botan/src/timer/cpu_counter/tm_hard.h | 33 + .../botan/src/timer/gettimeofday/info.txt | 33 + .../botan/src/timer/gettimeofday/tm_unix.cpp | 24 + .../botan/src/timer/gettimeofday/tm_unix.h | 27 + src/libs/3rdparty/botan/src/timer/info.txt | 14 + .../botan/src/timer/posix_rt/info.txt | 29 + .../botan/src/timer/posix_rt/tm_posix.cpp | 33 + .../botan/src/timer/posix_rt/tm_posix.h | 27 + src/libs/3rdparty/botan/src/timer/timer.cpp | 52 + src/libs/3rdparty/botan/src/timer/timer.h | 45 + .../src/timer/win32_query_perf_ctr/info.txt | 26 + .../timer/win32_query_perf_ctr/tm_win32.cpp | 23 + .../src/timer/win32_query_perf_ctr/tm_win32.h | 27 + .../botan/src/utils/asm_amd64/asm_macr.h | 127 + .../botan/src/utils/asm_amd64/info.txt | 16 + .../botan/src/utils/asm_ia32/asm_macr.h | 128 + .../botan/src/utils/asm_ia32/info.txt | 16 + src/libs/3rdparty/botan/src/utils/bit_ops.h | 91 + src/libs/3rdparty/botan/src/utils/bswap.h | 62 + .../botan/src/utils/buf_comp/buf_comp.h | 126 + .../botan/src/utils/buf_comp/info.txt | 11 + src/libs/3rdparty/botan/src/utils/charset.cpp | 201 + src/libs/3rdparty/botan/src/utils/charset.h | 44 + .../botan/src/utils/datastor/datastor.cpp | 172 + .../botan/src/utils/datastor/datastor.h | 61 + .../botan/src/utils/datastor/info.txt | 13 + src/libs/3rdparty/botan/src/utils/exceptn.cpp | 62 + src/libs/3rdparty/botan/src/utils/exceptn.h | 197 + src/libs/3rdparty/botan/src/utils/info.txt | 33 + src/libs/3rdparty/botan/src/utils/loadstor.h | 281 + src/libs/3rdparty/botan/src/utils/mem_ops.h | 40 + src/libs/3rdparty/botan/src/utils/mlock.cpp | 45 + src/libs/3rdparty/botan/src/utils/parsing.cpp | 288 + src/libs/3rdparty/botan/src/utils/parsing.h | 41 + src/libs/3rdparty/botan/src/utils/rotate.h | 30 + src/libs/3rdparty/botan/src/utils/stl_util.h | 86 + src/libs/3rdparty/botan/src/utils/types.h | 42 + src/libs/3rdparty/botan/src/utils/ui.cpp | 36 + src/libs/3rdparty/botan/src/utils/ui.h | 36 + src/libs/3rdparty/botan/src/utils/util.cpp | 68 + src/libs/3rdparty/botan/src/utils/util.h | 39 + src/libs/3rdparty/botan/src/utils/version.cpp | 36 + src/libs/3rdparty/botan/src/utils/version.h | 61 + src/libs/3rdparty/botan/src/utils/xor_buf.h | 74 + .../wrappers/boost-python/botan/__init__.py | 27 + .../botan/wrappers/boost-python/nisttest.py | 61 + .../botan/wrappers/boost-python/results.txt | 60 + .../botan/wrappers/boost-python/rng_test.py | 22 + .../botan/wrappers/boost-python/src/block.cpp | 152 + .../botan/wrappers/boost-python/src/core.cpp | 73 + .../wrappers/boost-python/src/filter.cpp | 176 + .../botan/wrappers/boost-python/src/hash.cpp | 108 + .../botan/wrappers/boost-python/src/macs.cpp | 59 + .../botan/wrappers/boost-python/src/pk.cpp | 125 + .../wrappers/boost-python/src/python_botan.h | 54 + .../wrappers/boost-python/src/stream.cpp | 54 + .../botan/wrappers/boost-python/src/x509.cpp | 140 + .../3rdparty/botan/wrappers/perl-xs/Botan.pm | 117 + .../3rdparty/botan/wrappers/perl-xs/Botan.xs | 829 + .../3rdparty/botan/wrappers/perl-xs/Changes | 4 + .../3rdparty/botan/wrappers/perl-xs/MANIFEST | 15 + .../botan/wrappers/perl-xs/data/ca.cert.der | Bin 0 -> 712 bytes .../botan/wrappers/perl-xs/data/ca.cert.pem | 17 + .../botan/wrappers/perl-xs/t/base64.t | 273 + .../3rdparty/botan/wrappers/perl-xs/t/filt.t | 56 + .../3rdparty/botan/wrappers/perl-xs/t/hex.t | 256 + .../3rdparty/botan/wrappers/perl-xs/t/oid.t | 45 + .../3rdparty/botan/wrappers/perl-xs/t/pipe.t | 98 + .../botan/wrappers/perl-xs/t/testutl.pl | 26 + .../botan/wrappers/perl-xs/t/x509cert.t | 42 + .../3rdparty/botan/wrappers/perl-xs/typemap | 62 + .../3rdparty/botan/wrappers/swig/base.cpp | 61 + src/libs/3rdparty/botan/wrappers/swig/base.h | 102 + .../3rdparty/botan/wrappers/swig/botan.swg | 26 + src/libs/3rdparty/botan/wrappers/swig/doit.py | 49 + .../3rdparty/botan/wrappers/swig/filter.cpp | 39 + .../3rdparty/botan/wrappers/swig/pipe.cpp | 89 + src/libs/3rdparty/botan/wrappers/swig/pk.swg | 8 + .../3rdparty/botan/wrappers/swig/readme.txt | 34 + .../botan/wrappers/swig/tests/block.py | 52 + .../botan/wrappers/swig/tests/block2.py | 44 + .../botan/wrappers/swig/tests/encrypt.py | 37 + .../botan/wrappers/swig/tests/filter.py | 27 + .../botan/wrappers/swig/tests/hash.py | 30 + .../3rdparty/botan/wrappers/swig/tests/mac.py | 12 + .../botan/wrappers/swig/tests/pubkey.py | 10 + .../botan/wrappers/swig/tests/stream.py | 17 + .../3rdparty/botan/wrappers/swig/x509.swg | 9 + 1494 files changed, 158357 insertions(+) create mode 100644 src/libs/3rdparty/botan/checks/algos.cpp create mode 100644 src/libs/3rdparty/botan/checks/bench.cpp create mode 100644 src/libs/3rdparty/botan/checks/bench.h create mode 100644 src/libs/3rdparty/botan/checks/bigint.cpp create mode 100644 src/libs/3rdparty/botan/checks/block.cpp create mode 100644 src/libs/3rdparty/botan/checks/check.cpp create mode 100644 src/libs/3rdparty/botan/checks/clock.cpp create mode 100644 src/libs/3rdparty/botan/checks/common.h create mode 100644 src/libs/3rdparty/botan/checks/cvc_tests.cpp create mode 100644 src/libs/3rdparty/botan/checks/dolook.cpp create mode 100644 src/libs/3rdparty/botan/checks/dolook2.cpp create mode 100644 src/libs/3rdparty/botan/checks/ec_tests.cpp create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/CSCA.CSCA.csca-germany.1.crt create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/CSCA.CSCA.csca-germany.1.pem create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/DE1_flen_chars_cvcRequest_ECDSA.der create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/Lidia.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/Lidia.pem create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/ado create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/ado.cvcreq create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_cvca.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_dvca_ado2.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_dvca_cert1.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_dvca_req.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_dvca_req2.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_dvca_req2b.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_is_cert.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_is_req.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_link12.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/cvca01.cv.crt create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/cvca_illegal_chars.cv.crt create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/cvca_illegal_chars2.cv.crt create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/ec_for_flex_mes.sig create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/ec_oid_not_in_reg_private_2.pkcs8.pem create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/flex_cert.crt create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/flex_mes create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/flex_mes.sig create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/insito_expl_ec.pem create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/insito_oid_ec.pem create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/link_SHA1.166.crt create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/link_SHA256.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/my_cv_cert.ber create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/my_cv_cert2.ber create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/my_cv_req.ber create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/nodompar_private.pkcs8.pem create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/private.pem create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/root1_SHA256.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/root2_SHA256.cer create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/root_SHA1.163.crt create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/withdompar_private.pkcs8.pem create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/x509_req_test_expl.pem create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/x509_req_test_oid.pem create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/x509_test_privkey_expl_pw123456.pem create mode 100644 src/libs/3rdparty/botan/checks/ecc_testdata/x509_test_privkey_oid_pw123456.pem create mode 100644 src/libs/3rdparty/botan/checks/ecdsa.cpp create mode 100644 src/libs/3rdparty/botan/checks/eckaeg.cpp create mode 100644 src/libs/3rdparty/botan/checks/fail.dat create mode 100644 src/libs/3rdparty/botan/checks/getopt.cpp create mode 100644 src/libs/3rdparty/botan/checks/getopt.h create mode 100644 src/libs/3rdparty/botan/checks/gfpmath.cpp create mode 100644 src/libs/3rdparty/botan/checks/misc.cpp create mode 100644 src/libs/3rdparty/botan/checks/mp_valid.dat create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/failure.txt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/readme.txt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test01/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test01/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test01/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test02/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test02/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test02/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test02/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test02/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test03/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test03/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test03/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test03/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test03/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test04/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test04/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test04/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test04/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test04/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test04/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test04/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test05/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test05/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test05/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test05/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test05/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test06/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test06/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test06/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test06/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test06/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test07/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test07/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test07/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test07/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test07/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test08/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test08/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test08/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test08/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test08/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test09/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test09/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test09/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test09/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test09/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test10/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test10/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test10/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test10/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test10/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test11/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test11/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test11/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test11/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test11/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test12/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test12/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test12/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test12/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test12/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test13/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test13/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test13/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test13/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test13/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test14/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test14/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test14/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test14/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test14/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test15/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test15/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test15/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test15/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test15/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test16/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test16/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test16/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test16/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test16/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test17/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test17/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test17/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test17/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test17/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test18/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test18/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test18/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test18/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test18/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test19/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test19/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test19/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test19/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test20/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test20/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test20/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test20/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test20/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test21/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test21/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test21/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test21/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test21/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test22/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test22/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test22/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test22/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test22/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test23/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test23/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test23/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test23/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test23/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test24/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test24/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test24/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test24/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test24/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test25/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test25/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test25/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test25/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test25/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test26/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test26/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test26/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test26/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test26/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test27/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test27/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test27/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test27/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test27/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test28/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test28/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test28/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test28/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test28/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test29/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test29/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test29/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test29/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test29/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test30/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test30/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test30/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test30/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test30/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test31/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test31/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test31/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test31/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test31/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test32/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test32/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test32/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test32/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test32/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test33/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test33/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test33/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test33/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test33/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test34/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test34/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test34/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test34/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test34/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test35/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test35/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test35/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test35/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test35/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test36/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test36/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test36/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test36/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test36/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test36/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test36/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test37/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test37/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test37/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test37/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test37/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test37/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test37/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test38/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test38/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test38/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test38/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test38/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test38/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test38/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test39/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test39/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test39/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test40/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test40/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test40/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test40/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test40/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test40/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test40/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test40/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test40/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test41/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test41/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test41/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test41/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test41/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test41/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test41/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test41/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test41/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test42/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int4.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int4.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test42/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test42/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test43/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int4.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int4.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test43/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test43/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test44/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int4.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int4.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test44/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test44/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test45/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int4.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int4.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test45/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test45/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test46/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int4.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int4.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test46/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test46/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test47/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int4.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int4.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test47/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test47/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test48/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test48/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test48/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test48/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test48/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test49/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test49/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test49/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test49/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test49/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test50/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test50/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test50/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test50/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test50/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test51/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test51/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test51/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test51/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test51/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test52/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test52/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test52/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test52/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test52/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test53/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test53/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test53/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test53/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test53/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test54/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test54/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test54/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test54/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test54/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test54/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test54/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test55/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test55/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test55/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test55/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test55/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test55/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test55/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test56/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test56/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test56/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test56/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test56/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test57/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test57/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test57/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test57/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test57/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test58/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test58/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test58/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test59/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test59/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test59/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test60/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int4.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int4.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test60/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test60/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test61/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int4.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int4.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test61/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test61/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test62/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int4.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int4.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test62/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test62/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test63/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int3.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int3.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int4.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int4.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test63/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test63/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test64/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test64/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test64/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test64/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test64/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test65/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test65/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test65/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test65/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test65/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test65/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test66/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test66/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test66/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test66/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test66/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test67/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test67/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test67/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test67/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test67/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test67/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test68/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test68/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test68/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test68/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test68/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test68/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test68/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test69/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test69/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test69/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test69/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test69/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test70/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test70/int1.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test70/int1.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test70/int2.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test70/int2.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test70/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test70/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test71/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test71/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test71/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test71/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test71/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test72/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test72/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test72/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test72/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test72/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test73/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test73/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test73/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test73/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test73/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test74/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test74/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test74/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test74/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test74/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test75/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test75/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test75/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test75/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test75/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test76/end.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test76/int.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test76/int.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test76/root.crl create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/tests/test76/root.crt create mode 100644 src/libs/3rdparty/botan/checks/nist_tests/x509test.cpp create mode 100644 src/libs/3rdparty/botan/checks/pk.cpp create mode 100644 src/libs/3rdparty/botan/checks/pk_bench.cpp create mode 100644 src/libs/3rdparty/botan/checks/pk_valid.dat create mode 100644 src/libs/3rdparty/botan/checks/timer.cpp create mode 100644 src/libs/3rdparty/botan/checks/timer.h create mode 100644 src/libs/3rdparty/botan/checks/validate.cpp create mode 100644 src/libs/3rdparty/botan/checks/validate.dat create mode 100644 src/libs/3rdparty/botan/checks/validate.h create mode 100644 src/libs/3rdparty/botan/checks/x509.cpp create mode 100644 src/libs/3rdparty/botan/configure.pl create mode 100644 src/libs/3rdparty/botan/configure.py create mode 100644 src/libs/3rdparty/botan/doc/api.pdf create mode 100644 src/libs/3rdparty/botan/doc/api.tex create mode 100644 src/libs/3rdparty/botan/doc/architecture.pdf create mode 100644 src/libs/3rdparty/botan/doc/building.pdf create mode 100644 src/libs/3rdparty/botan/doc/building.tex create mode 100644 src/libs/3rdparty/botan/doc/credits.txt create mode 100644 src/libs/3rdparty/botan/doc/examples/GNUmakefile create mode 100644 src/libs/3rdparty/botan/doc/examples/asn1.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/base.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/base64.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/bench.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/benchmark.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/bzip.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/ca.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/checksum.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/cms_dec.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/cms_enc.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/cryptobox.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/decrypt.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/dh.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/dsa_kgen.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/dsa_sign.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/dsa_ver.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/eax_test.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/eax_tv.txt create mode 100644 src/libs/3rdparty/botan/doc/examples/ecdsa.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/encrypt.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/encrypt2.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/factor.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/gen_certs.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/gtk/dsa.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/gtk/gtk_ui.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/gtk/gtk_ui.h create mode 100644 src/libs/3rdparty/botan/doc/examples/gtk/readme.txt create mode 100644 src/libs/3rdparty/botan/doc/examples/hash.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/hash_fd.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/hash_quickly.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/hasher.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/hasher2.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/make_prime.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/passhash.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/pkcs10.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/pqg_gen.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/readme.txt create mode 100644 src/libs/3rdparty/botan/doc/examples/ressol.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/rng_test.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/row_encryptor.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/rsa_dec.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/rsa_enc.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/rsa_kgen.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/rsa_manykey.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/self_sig.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/sig_gen.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/stack.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/test_es.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/x509info.cpp create mode 100644 src/libs/3rdparty/botan/doc/examples/xor_ciph.cpp create mode 100644 src/libs/3rdparty/botan/doc/fips140.tex create mode 100644 src/libs/3rdparty/botan/doc/indent.el create mode 100644 src/libs/3rdparty/botan/doc/insito_manual.pdf create mode 100644 src/libs/3rdparty/botan/doc/internals.tex create mode 100644 src/libs/3rdparty/botan/doc/license.txt create mode 100644 src/libs/3rdparty/botan/doc/log.txt create mode 100644 src/libs/3rdparty/botan/doc/pgpkeys.asc create mode 100644 src/libs/3rdparty/botan/doc/scripts/comba.py create mode 100644 src/libs/3rdparty/botan/doc/scripts/combine_bmarks.pl create mode 100644 src/libs/3rdparty/botan/doc/scripts/dist.sh create mode 100644 src/libs/3rdparty/botan/doc/scripts/primes.py create mode 100644 src/libs/3rdparty/botan/doc/scripts/print_deps.py create mode 100644 src/libs/3rdparty/botan/doc/scripts/update_deps.py create mode 100644 src/libs/3rdparty/botan/doc/thanks.txt create mode 100644 src/libs/3rdparty/botan/doc/tutorial.pdf create mode 100644 src/libs/3rdparty/botan/doc/tutorial.tex create mode 100644 src/libs/3rdparty/botan/readme.txt create mode 100644 src/libs/3rdparty/botan/src/algo_factory/algo_cache.h create mode 100644 src/libs/3rdparty/botan/src/algo_factory/algo_factory.cpp create mode 100644 src/libs/3rdparty/botan/src/algo_factory/algo_factory.h create mode 100644 src/libs/3rdparty/botan/src/algo_factory/info.txt create mode 100644 src/libs/3rdparty/botan/src/algo_factory/prov_weight.cpp create mode 100644 src/libs/3rdparty/botan/src/alloc/alloc_mmap/info.txt create mode 100644 src/libs/3rdparty/botan/src/alloc/alloc_mmap/mmap_mem.cpp create mode 100644 src/libs/3rdparty/botan/src/alloc/alloc_mmap/mmap_mem.h create mode 100644 src/libs/3rdparty/botan/src/alloc/allocate.h create mode 100644 src/libs/3rdparty/botan/src/alloc/info.txt create mode 100644 src/libs/3rdparty/botan/src/alloc/mem_pool/info.txt create mode 100644 src/libs/3rdparty/botan/src/alloc/mem_pool/mem_pool.cpp create mode 100644 src/libs/3rdparty/botan/src/alloc/mem_pool/mem_pool.h create mode 100644 src/libs/3rdparty/botan/src/alloc/secmem.h create mode 100644 src/libs/3rdparty/botan/src/alloc/system_alloc/defalloc.cpp create mode 100644 src/libs/3rdparty/botan/src/alloc/system_alloc/defalloc.h create mode 100644 src/libs/3rdparty/botan/src/alloc/system_alloc/info.txt create mode 100644 src/libs/3rdparty/botan/src/asn1/alg_id.cpp create mode 100644 src/libs/3rdparty/botan/src/asn1/alg_id.h create mode 100644 src/libs/3rdparty/botan/src/asn1/asn1_alt.cpp create mode 100644 src/libs/3rdparty/botan/src/asn1/asn1_att.cpp create mode 100644 src/libs/3rdparty/botan/src/asn1/asn1_dn.cpp create mode 100644 src/libs/3rdparty/botan/src/asn1/asn1_int.cpp create mode 100644 src/libs/3rdparty/botan/src/asn1/asn1_int.h create mode 100644 src/libs/3rdparty/botan/src/asn1/asn1_obj.h create mode 100644 src/libs/3rdparty/botan/src/asn1/asn1_oid.cpp create mode 100644 src/libs/3rdparty/botan/src/asn1/asn1_oid.h create mode 100644 src/libs/3rdparty/botan/src/asn1/asn1_str.cpp create mode 100644 src/libs/3rdparty/botan/src/asn1/asn1_tm.cpp create mode 100644 src/libs/3rdparty/botan/src/asn1/ber_dec.cpp create mode 100644 src/libs/3rdparty/botan/src/asn1/ber_dec.h create mode 100644 src/libs/3rdparty/botan/src/asn1/der_enc.cpp create mode 100644 src/libs/3rdparty/botan/src/asn1/der_enc.h create mode 100644 src/libs/3rdparty/botan/src/asn1/info.txt create mode 100644 src/libs/3rdparty/botan/src/benchmark/benchmark.cpp create mode 100644 src/libs/3rdparty/botan/src/benchmark/benchmark.h create mode 100644 src/libs/3rdparty/botan/src/benchmark/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/aes/aes.cpp create mode 100644 src/libs/3rdparty/botan/src/block/aes/aes.h create mode 100644 src/libs/3rdparty/botan/src/block/aes/aes_tab.cpp create mode 100644 src/libs/3rdparty/botan/src/block/aes/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/block_cipher.h create mode 100644 src/libs/3rdparty/botan/src/block/blowfish/blfs_tab.cpp create mode 100644 src/libs/3rdparty/botan/src/block/blowfish/blowfish.cpp create mode 100644 src/libs/3rdparty/botan/src/block/blowfish/blowfish.h create mode 100644 src/libs/3rdparty/botan/src/block/blowfish/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/cast/cast128.cpp create mode 100644 src/libs/3rdparty/botan/src/block/cast/cast128.h create mode 100644 src/libs/3rdparty/botan/src/block/cast/cast256.cpp create mode 100644 src/libs/3rdparty/botan/src/block/cast/cast256.h create mode 100644 src/libs/3rdparty/botan/src/block/cast/cast_tab.cpp create mode 100644 src/libs/3rdparty/botan/src/block/cast/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/des/des.cpp create mode 100644 src/libs/3rdparty/botan/src/block/des/des.h create mode 100644 src/libs/3rdparty/botan/src/block/des/des_tab.cpp create mode 100644 src/libs/3rdparty/botan/src/block/des/desx.cpp create mode 100644 src/libs/3rdparty/botan/src/block/des/desx.h create mode 100644 src/libs/3rdparty/botan/src/block/des/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/gost_28147/gost_28147.cpp create mode 100644 src/libs/3rdparty/botan/src/block/gost_28147/gost_28147.h create mode 100644 src/libs/3rdparty/botan/src/block/gost_28147/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/idea/idea.cpp create mode 100644 src/libs/3rdparty/botan/src/block/idea/idea.h create mode 100644 src/libs/3rdparty/botan/src/block/idea/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/kasumi/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/kasumi/kasumi.cpp create mode 100644 src/libs/3rdparty/botan/src/block/kasumi/kasumi.h create mode 100644 src/libs/3rdparty/botan/src/block/lion/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/lion/lion.cpp create mode 100644 src/libs/3rdparty/botan/src/block/lion/lion.h create mode 100644 src/libs/3rdparty/botan/src/block/lubyrack/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/lubyrack/lubyrack.cpp create mode 100644 src/libs/3rdparty/botan/src/block/lubyrack/lubyrack.h create mode 100644 src/libs/3rdparty/botan/src/block/mars/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/mars/mars.cpp create mode 100644 src/libs/3rdparty/botan/src/block/mars/mars.h create mode 100644 src/libs/3rdparty/botan/src/block/mars/mars_tab.cpp create mode 100644 src/libs/3rdparty/botan/src/block/misty1/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/misty1/misty1.cpp create mode 100644 src/libs/3rdparty/botan/src/block/misty1/misty1.h create mode 100644 src/libs/3rdparty/botan/src/block/noekeon/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/noekeon/noekeon.cpp create mode 100644 src/libs/3rdparty/botan/src/block/noekeon/noekeon.h create mode 100644 src/libs/3rdparty/botan/src/block/rc2/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/rc2/rc2.cpp create mode 100644 src/libs/3rdparty/botan/src/block/rc2/rc2.h create mode 100644 src/libs/3rdparty/botan/src/block/rc5/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/rc5/rc5.cpp create mode 100644 src/libs/3rdparty/botan/src/block/rc5/rc5.h create mode 100644 src/libs/3rdparty/botan/src/block/rc6/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/rc6/rc6.cpp create mode 100644 src/libs/3rdparty/botan/src/block/rc6/rc6.h create mode 100644 src/libs/3rdparty/botan/src/block/safer/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/safer/safe_tab.cpp create mode 100644 src/libs/3rdparty/botan/src/block/safer/safer_sk.cpp create mode 100644 src/libs/3rdparty/botan/src/block/safer/safer_sk.h create mode 100644 src/libs/3rdparty/botan/src/block/seed/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/seed/seed.cpp create mode 100644 src/libs/3rdparty/botan/src/block/seed/seed.h create mode 100644 src/libs/3rdparty/botan/src/block/seed/seed_tab.cpp create mode 100644 src/libs/3rdparty/botan/src/block/serpent/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/serpent/serpent.cpp create mode 100644 src/libs/3rdparty/botan/src/block/serpent/serpent.h create mode 100644 src/libs/3rdparty/botan/src/block/serpent_ia32/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/serpent_ia32/serp_ia32.cpp create mode 100644 src/libs/3rdparty/botan/src/block/serpent_ia32/serp_ia32.h create mode 100644 src/libs/3rdparty/botan/src/block/serpent_ia32/serp_ia32_imp.S create mode 100644 src/libs/3rdparty/botan/src/block/skipjack/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/skipjack/skipjack.cpp create mode 100644 src/libs/3rdparty/botan/src/block/skipjack/skipjack.h create mode 100644 src/libs/3rdparty/botan/src/block/square/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/square/sqr_tab.cpp create mode 100644 src/libs/3rdparty/botan/src/block/square/square.cpp create mode 100644 src/libs/3rdparty/botan/src/block/square/square.h create mode 100644 src/libs/3rdparty/botan/src/block/tea/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/tea/tea.cpp create mode 100644 src/libs/3rdparty/botan/src/block/tea/tea.h create mode 100644 src/libs/3rdparty/botan/src/block/twofish/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/twofish/two_tab.cpp create mode 100644 src/libs/3rdparty/botan/src/block/twofish/twofish.cpp create mode 100644 src/libs/3rdparty/botan/src/block/twofish/twofish.h create mode 100644 src/libs/3rdparty/botan/src/block/xtea/info.txt create mode 100644 src/libs/3rdparty/botan/src/block/xtea/xtea.cpp create mode 100644 src/libs/3rdparty/botan/src/block/xtea/xtea.h create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/alpha.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/amd64.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/arm.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/hitachi-sh.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/hppa.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/ia32.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/ia64.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/m68k.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/mips32.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/mips64.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/ppc.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/ppc64.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/s390.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/s390x.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/sparc32.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/arch/sparc64.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/botan-config.in create mode 100644 src/libs/3rdparty/botan/src/build-data/botan.doxy.in create mode 100644 src/libs/3rdparty/botan/src/build-data/botan.pc.in create mode 100644 src/libs/3rdparty/botan/src/build-data/buildh.in create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/bcc.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/compaq.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/ekopath.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/gcc.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/hpcc.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/icc.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/kai.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/mipspro.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/msvc.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/open64.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/pgi.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/sgipro64.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/sunwspro.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/cc/xlc.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/makefile/nmake.in create mode 100644 src/libs/3rdparty/botan/src/build-data/makefile/unix.in create mode 100644 src/libs/3rdparty/botan/src/build-data/makefile/unix_shr.in create mode 100644 src/libs/3rdparty/botan/src/build-data/os/aix.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/beos.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/cygwin.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/darwin.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/defaults.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/dragonfly.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/freebsd.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/hpux.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/irix.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/linux.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/mingw.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/netbsd.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/openbsd.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/qnx.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/solaris.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/tru64.txt create mode 100644 src/libs/3rdparty/botan/src/build-data/os/windows.txt create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/asn1_eac_str.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/asn1_eac_tm.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/cvc_ado.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/cvc_ado.h create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/cvc_ca.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/cvc_ca.h create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/cvc_cert.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/cvc_cert.h create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/cvc_gen_cert.h create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/cvc_key.h create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/cvc_req.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/cvc_req.h create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/cvc_self.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/cvc_self.h create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/eac_asn_obj.h create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/eac_obj.h create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/ecdsa_sig.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/ecdsa_sig.h create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/freestore.h create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/info.txt create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/signed_obj.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/cvc/signed_obj.h create mode 100644 src/libs/3rdparty/botan/src/cert/x509/certstor.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/x509/certstor.h create mode 100644 src/libs/3rdparty/botan/src/cert/x509/crl_ent.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/x509/crl_ent.h create mode 100644 src/libs/3rdparty/botan/src/cert/x509/info.txt create mode 100644 src/libs/3rdparty/botan/src/cert/x509/pkcs10.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/x509/pkcs10.h create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509_ca.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509_ca.h create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509_crl.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509_crl.h create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509_ext.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509_ext.h create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509_obj.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509_obj.h create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509cert.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509cert.h create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509find.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509find.h create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509opt.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509self.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509self.h create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509stor.cpp create mode 100644 src/libs/3rdparty/botan/src/cert/x509/x509stor.h create mode 100644 src/libs/3rdparty/botan/src/checksum/adler32/adler32.cpp create mode 100644 src/libs/3rdparty/botan/src/checksum/adler32/adler32.h create mode 100644 src/libs/3rdparty/botan/src/checksum/adler32/info.txt create mode 100644 src/libs/3rdparty/botan/src/checksum/crc24/crc24.cpp create mode 100644 src/libs/3rdparty/botan/src/checksum/crc24/crc24.h create mode 100644 src/libs/3rdparty/botan/src/checksum/crc24/info.txt create mode 100644 src/libs/3rdparty/botan/src/checksum/crc32/crc32.cpp create mode 100644 src/libs/3rdparty/botan/src/checksum/crc32/crc32.h create mode 100644 src/libs/3rdparty/botan/src/checksum/crc32/info.txt create mode 100644 src/libs/3rdparty/botan/src/cms/cms_algo.cpp create mode 100644 src/libs/3rdparty/botan/src/cms/cms_comp.cpp create mode 100644 src/libs/3rdparty/botan/src/cms/cms_dalg.cpp create mode 100644 src/libs/3rdparty/botan/src/cms/cms_dec.cpp create mode 100644 src/libs/3rdparty/botan/src/cms/cms_dec.h create mode 100644 src/libs/3rdparty/botan/src/cms/cms_ealg.cpp create mode 100644 src/libs/3rdparty/botan/src/cms/cms_enc.cpp create mode 100644 src/libs/3rdparty/botan/src/cms/cms_enc.h create mode 100644 src/libs/3rdparty/botan/src/cms/info.txt create mode 100644 src/libs/3rdparty/botan/src/codec/base64/b64_char.cpp create mode 100644 src/libs/3rdparty/botan/src/codec/base64/base64.cpp create mode 100644 src/libs/3rdparty/botan/src/codec/base64/base64.h create mode 100644 src/libs/3rdparty/botan/src/codec/base64/info.txt create mode 100644 src/libs/3rdparty/botan/src/codec/bzip2/bzip2.cpp create mode 100644 src/libs/3rdparty/botan/src/codec/bzip2/bzip2.h create mode 100644 src/libs/3rdparty/botan/src/codec/bzip2/info.txt create mode 100644 src/libs/3rdparty/botan/src/codec/hex/hex.cpp create mode 100644 src/libs/3rdparty/botan/src/codec/hex/hex.h create mode 100644 src/libs/3rdparty/botan/src/codec/hex/hex_char.cpp create mode 100644 src/libs/3rdparty/botan/src/codec/hex/info.txt create mode 100644 src/libs/3rdparty/botan/src/codec/openpgp/info.txt create mode 100644 src/libs/3rdparty/botan/src/codec/openpgp/openpgp.cpp create mode 100644 src/libs/3rdparty/botan/src/codec/openpgp/openpgp.h create mode 100644 src/libs/3rdparty/botan/src/codec/pem/info.txt create mode 100644 src/libs/3rdparty/botan/src/codec/pem/pem.cpp create mode 100644 src/libs/3rdparty/botan/src/codec/pem/pem.h create mode 100644 src/libs/3rdparty/botan/src/codec/zlib/info.txt create mode 100644 src/libs/3rdparty/botan/src/codec/zlib/zlib.cpp create mode 100644 src/libs/3rdparty/botan/src/codec/zlib/zlib.h create mode 100644 src/libs/3rdparty/botan/src/cryptobox/cryptobox.cpp create mode 100644 src/libs/3rdparty/botan/src/cryptobox/cryptobox.h create mode 100644 src/libs/3rdparty/botan/src/cryptobox/info.txt create mode 100644 src/libs/3rdparty/botan/src/engine/amd64_eng/eng_amd64.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/amd64_eng/eng_amd64.h create mode 100644 src/libs/3rdparty/botan/src/engine/amd64_eng/info.txt create mode 100644 src/libs/3rdparty/botan/src/engine/def_engine/def_eng.h create mode 100644 src/libs/3rdparty/botan/src/engine/def_engine/def_mode.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/def_engine/def_pk_ops.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/def_engine/def_powm.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/def_engine/info.txt create mode 100644 src/libs/3rdparty/botan/src/engine/def_engine/lookup_block.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/def_engine/lookup_hash.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/def_engine/lookup_mac.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/def_engine/lookup_stream.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/engine.h create mode 100644 src/libs/3rdparty/botan/src/engine/gnump/eng_gmp.h create mode 100644 src/libs/3rdparty/botan/src/engine/gnump/gmp_dh.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/gnump/gmp_dsa.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/gnump/gmp_elg.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/gnump/gmp_if.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/gnump/gmp_mem.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/gnump/gmp_nr.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/gnump/gmp_powm.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/gnump/gmp_wrap.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/gnump/gmp_wrap.h create mode 100644 src/libs/3rdparty/botan/src/engine/gnump/info.txt create mode 100644 src/libs/3rdparty/botan/src/engine/ia32_eng/eng_ia32.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/ia32_eng/eng_ia32.h create mode 100644 src/libs/3rdparty/botan/src/engine/ia32_eng/info.txt create mode 100644 src/libs/3rdparty/botan/src/engine/info.txt create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/arc4_openssl.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/bn_powm.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/bn_wrap.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/bn_wrap.h create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/eng_ossl.h create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/info.txt create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/ossl_bc.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/ossl_dh.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/ossl_dsa.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/ossl_elg.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/ossl_if.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/ossl_md.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/openssl/ossl_nr.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/sse2_eng/eng_sse2.cpp create mode 100644 src/libs/3rdparty/botan/src/engine/sse2_eng/eng_sse2.h create mode 100644 src/libs/3rdparty/botan/src/engine/sse2_eng/info.txt create mode 100644 src/libs/3rdparty/botan/src/entropy/beos_stats/es_beos.cpp create mode 100644 src/libs/3rdparty/botan/src/entropy/beos_stats/es_beos.h create mode 100644 src/libs/3rdparty/botan/src/entropy/beos_stats/info.txt create mode 100644 src/libs/3rdparty/botan/src/entropy/cryptoapi_rng/es_capi.cpp create mode 100644 src/libs/3rdparty/botan/src/entropy/cryptoapi_rng/es_capi.h create mode 100644 src/libs/3rdparty/botan/src/entropy/cryptoapi_rng/info.txt create mode 100644 src/libs/3rdparty/botan/src/entropy/dev_random/es_dev.cpp create mode 100644 src/libs/3rdparty/botan/src/entropy/dev_random/es_dev.h create mode 100644 src/libs/3rdparty/botan/src/entropy/dev_random/info.txt create mode 100644 src/libs/3rdparty/botan/src/entropy/egd/es_egd.cpp create mode 100644 src/libs/3rdparty/botan/src/entropy/egd/es_egd.h create mode 100644 src/libs/3rdparty/botan/src/entropy/egd/info.txt create mode 100644 src/libs/3rdparty/botan/src/entropy/entropy_src.h create mode 100644 src/libs/3rdparty/botan/src/entropy/info.txt create mode 100644 src/libs/3rdparty/botan/src/entropy/proc_walk/es_ftw.cpp create mode 100644 src/libs/3rdparty/botan/src/entropy/proc_walk/es_ftw.h create mode 100644 src/libs/3rdparty/botan/src/entropy/proc_walk/info.txt create mode 100644 src/libs/3rdparty/botan/src/entropy/unix_procs/es_unix.cpp create mode 100644 src/libs/3rdparty/botan/src/entropy/unix_procs/es_unix.h create mode 100644 src/libs/3rdparty/botan/src/entropy/unix_procs/info.txt create mode 100644 src/libs/3rdparty/botan/src/entropy/unix_procs/unix_cmd.cpp create mode 100644 src/libs/3rdparty/botan/src/entropy/unix_procs/unix_cmd.h create mode 100644 src/libs/3rdparty/botan/src/entropy/unix_procs/unix_src.cpp create mode 100644 src/libs/3rdparty/botan/src/entropy/win32_stats/es_win32.cpp create mode 100644 src/libs/3rdparty/botan/src/entropy/win32_stats/es_win32.h create mode 100644 src/libs/3rdparty/botan/src/entropy/win32_stats/info.txt create mode 100644 src/libs/3rdparty/botan/src/filters/algo_filt.cpp create mode 100644 src/libs/3rdparty/botan/src/filters/basefilt.cpp create mode 100644 src/libs/3rdparty/botan/src/filters/basefilt.h create mode 100644 src/libs/3rdparty/botan/src/filters/buf_filt.cpp create mode 100644 src/libs/3rdparty/botan/src/filters/buf_filt.h create mode 100644 src/libs/3rdparty/botan/src/filters/data_snk.cpp create mode 100644 src/libs/3rdparty/botan/src/filters/data_snk.h create mode 100644 src/libs/3rdparty/botan/src/filters/data_src.cpp create mode 100644 src/libs/3rdparty/botan/src/filters/data_src.h create mode 100644 src/libs/3rdparty/botan/src/filters/fd_unix/fd_unix.cpp create mode 100644 src/libs/3rdparty/botan/src/filters/fd_unix/fd_unix.h create mode 100644 src/libs/3rdparty/botan/src/filters/fd_unix/info.txt create mode 100644 src/libs/3rdparty/botan/src/filters/filter.cpp create mode 100644 src/libs/3rdparty/botan/src/filters/filter.h create mode 100644 src/libs/3rdparty/botan/src/filters/filters.h create mode 100644 src/libs/3rdparty/botan/src/filters/info.txt create mode 100644 src/libs/3rdparty/botan/src/filters/out_buf.cpp create mode 100644 src/libs/3rdparty/botan/src/filters/out_buf.h create mode 100644 src/libs/3rdparty/botan/src/filters/pbe.h create mode 100644 src/libs/3rdparty/botan/src/filters/pipe.cpp create mode 100644 src/libs/3rdparty/botan/src/filters/pipe.h create mode 100644 src/libs/3rdparty/botan/src/filters/pipe_io.cpp create mode 100644 src/libs/3rdparty/botan/src/filters/pipe_rw.cpp create mode 100644 src/libs/3rdparty/botan/src/filters/secqueue.cpp create mode 100644 src/libs/3rdparty/botan/src/filters/secqueue.h create mode 100644 src/libs/3rdparty/botan/src/hash/fork256/fork256.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/fork256/fork256.h create mode 100644 src/libs/3rdparty/botan/src/hash/fork256/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/gost_3411/gost_3411.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/gost_3411/gost_3411.h create mode 100644 src/libs/3rdparty/botan/src/hash/gost_3411/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/has160/has160.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/has160/has160.h create mode 100644 src/libs/3rdparty/botan/src/hash/has160/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/hash.h create mode 100644 src/libs/3rdparty/botan/src/hash/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/md2/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/md2/md2.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/md2/md2.h create mode 100644 src/libs/3rdparty/botan/src/hash/md4/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/md4/md4.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/md4/md4.h create mode 100644 src/libs/3rdparty/botan/src/hash/md4_ia32/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/md4_ia32/md4_ia32.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/md4_ia32/md4_ia32.h create mode 100644 src/libs/3rdparty/botan/src/hash/md4_ia32/md4_ia32_imp.S create mode 100644 src/libs/3rdparty/botan/src/hash/md5/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/md5/md5.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/md5/md5.h create mode 100644 src/libs/3rdparty/botan/src/hash/md5_ia32/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/md5_ia32/md5_ia32.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/md5_ia32/md5_ia32.h create mode 100644 src/libs/3rdparty/botan/src/hash/md5_ia32/md5_ia32_imp.S create mode 100644 src/libs/3rdparty/botan/src/hash/mdx_hash/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/mdx_hash/mdx_hash.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/mdx_hash/mdx_hash.h create mode 100644 src/libs/3rdparty/botan/src/hash/par_hash/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/par_hash/par_hash.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/par_hash/par_hash.h create mode 100644 src/libs/3rdparty/botan/src/hash/rmd128/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/rmd128/rmd128.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/rmd128/rmd128.h create mode 100644 src/libs/3rdparty/botan/src/hash/rmd160/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/rmd160/rmd160.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/rmd160/rmd160.h create mode 100644 src/libs/3rdparty/botan/src/hash/sha1/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/sha1/sha160.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/sha1/sha160.h create mode 100644 src/libs/3rdparty/botan/src/hash/sha1_amd64/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/sha1_amd64/sha1_amd64.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/sha1_amd64/sha1_amd64.h create mode 100644 src/libs/3rdparty/botan/src/hash/sha1_amd64/sha1_amd64_imp.S create mode 100644 src/libs/3rdparty/botan/src/hash/sha1_ia32/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/sha1_ia32/sha1_ia32.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/sha1_ia32/sha1_ia32.h create mode 100644 src/libs/3rdparty/botan/src/hash/sha1_ia32/sha1_ia32_imp.S create mode 100644 src/libs/3rdparty/botan/src/hash/sha1_sse2/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/sha1_sse2/sha1_sse2.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/sha1_sse2/sha1_sse2.h create mode 100644 src/libs/3rdparty/botan/src/hash/sha1_sse2/sha1_sse2_imp.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/sha2/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/sha2/sha2_32.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/sha2/sha2_32.h create mode 100644 src/libs/3rdparty/botan/src/hash/sha2/sha2_64.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/sha2/sha2_64.h create mode 100644 src/libs/3rdparty/botan/src/hash/skein/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/skein/skein_512.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/skein/skein_512.h create mode 100644 src/libs/3rdparty/botan/src/hash/tiger/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/tiger/tig_tab.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/tiger/tiger.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/tiger/tiger.h create mode 100644 src/libs/3rdparty/botan/src/hash/whirlpool/info.txt create mode 100644 src/libs/3rdparty/botan/src/hash/whirlpool/whrl_tab.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/whirlpool/whrlpool.cpp create mode 100644 src/libs/3rdparty/botan/src/hash/whirlpool/whrlpool.h create mode 100644 src/libs/3rdparty/botan/src/kdf/info.txt create mode 100644 src/libs/3rdparty/botan/src/kdf/kdf.cpp create mode 100644 src/libs/3rdparty/botan/src/kdf/kdf.h create mode 100644 src/libs/3rdparty/botan/src/kdf/kdf1/info.txt create mode 100644 src/libs/3rdparty/botan/src/kdf/kdf1/kdf1.cpp create mode 100644 src/libs/3rdparty/botan/src/kdf/kdf1/kdf1.h create mode 100644 src/libs/3rdparty/botan/src/kdf/kdf2/info.txt create mode 100644 src/libs/3rdparty/botan/src/kdf/kdf2/kdf2.cpp create mode 100644 src/libs/3rdparty/botan/src/kdf/kdf2/kdf2.h create mode 100644 src/libs/3rdparty/botan/src/kdf/mgf1/info.txt create mode 100644 src/libs/3rdparty/botan/src/kdf/mgf1/mgf1.cpp create mode 100644 src/libs/3rdparty/botan/src/kdf/mgf1/mgf1.h create mode 100644 src/libs/3rdparty/botan/src/kdf/ssl_prf/info.txt create mode 100644 src/libs/3rdparty/botan/src/kdf/ssl_prf/prf_ssl3.cpp create mode 100644 src/libs/3rdparty/botan/src/kdf/ssl_prf/prf_ssl3.h create mode 100644 src/libs/3rdparty/botan/src/kdf/tls_prf/info.txt create mode 100644 src/libs/3rdparty/botan/src/kdf/tls_prf/prf_tls.cpp create mode 100644 src/libs/3rdparty/botan/src/kdf/tls_prf/prf_tls.h create mode 100644 src/libs/3rdparty/botan/src/kdf/x942_prf/info.txt create mode 100644 src/libs/3rdparty/botan/src/kdf/x942_prf/prf_x942.cpp create mode 100644 src/libs/3rdparty/botan/src/kdf/x942_prf/prf_x942.h create mode 100644 src/libs/3rdparty/botan/src/libstate/botan.h create mode 100644 src/libs/3rdparty/botan/src/libstate/get_enc.cpp create mode 100644 src/libs/3rdparty/botan/src/libstate/info.txt create mode 100644 src/libs/3rdparty/botan/src/libstate/init.cpp create mode 100644 src/libs/3rdparty/botan/src/libstate/init.h create mode 100644 src/libs/3rdparty/botan/src/libstate/libstate.cpp create mode 100644 src/libs/3rdparty/botan/src/libstate/libstate.h create mode 100644 src/libs/3rdparty/botan/src/libstate/look_pk.cpp create mode 100644 src/libs/3rdparty/botan/src/libstate/look_pk.h create mode 100644 src/libs/3rdparty/botan/src/libstate/lookup.cpp create mode 100644 src/libs/3rdparty/botan/src/libstate/lookup.h create mode 100644 src/libs/3rdparty/botan/src/libstate/oid_lookup/info.txt create mode 100644 src/libs/3rdparty/botan/src/libstate/oid_lookup/oids.cpp create mode 100644 src/libs/3rdparty/botan/src/libstate/oid_lookup/oids.h create mode 100644 src/libs/3rdparty/botan/src/libstate/pk_engine.cpp create mode 100644 src/libs/3rdparty/botan/src/libstate/pk_engine.h create mode 100644 src/libs/3rdparty/botan/src/libstate/policy.cpp create mode 100644 src/libs/3rdparty/botan/src/libstate/scan_name.cpp create mode 100644 src/libs/3rdparty/botan/src/libstate/scan_name.h create mode 100644 src/libs/3rdparty/botan/src/mac/cbc_mac/cbc_mac.cpp create mode 100644 src/libs/3rdparty/botan/src/mac/cbc_mac/cbc_mac.h create mode 100644 src/libs/3rdparty/botan/src/mac/cbc_mac/info.txt create mode 100644 src/libs/3rdparty/botan/src/mac/cmac/cmac.cpp create mode 100644 src/libs/3rdparty/botan/src/mac/cmac/cmac.h create mode 100644 src/libs/3rdparty/botan/src/mac/cmac/info.txt create mode 100644 src/libs/3rdparty/botan/src/mac/hmac/hmac.cpp create mode 100644 src/libs/3rdparty/botan/src/mac/hmac/hmac.h create mode 100644 src/libs/3rdparty/botan/src/mac/hmac/info.txt create mode 100644 src/libs/3rdparty/botan/src/mac/info.txt create mode 100644 src/libs/3rdparty/botan/src/mac/mac.cpp create mode 100644 src/libs/3rdparty/botan/src/mac/mac.h create mode 100644 src/libs/3rdparty/botan/src/mac/ssl3mac/info.txt create mode 100644 src/libs/3rdparty/botan/src/mac/ssl3mac/ssl3_mac.cpp create mode 100644 src/libs/3rdparty/botan/src/mac/ssl3mac/ssl3_mac.h create mode 100644 src/libs/3rdparty/botan/src/mac/x919_mac/info.txt create mode 100644 src/libs/3rdparty/botan/src/mac/x919_mac/x919_mac.cpp create mode 100644 src/libs/3rdparty/botan/src/mac/x919_mac/x919_mac.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/big_code.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/big_io.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/big_ops2.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/big_ops3.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/big_rand.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/bigint.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/bigint.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/divide.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/divide.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/bigint/monty_amd64/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/bigint/monty_amd64/mp_monty.S create mode 100644 src/libs/3rdparty/botan/src/math/bigint/monty_generic/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/bigint/monty_generic/mp_monty.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_amd64/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_amd64/mp_asm.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_amd64/mp_asmi.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_asm.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_asm64/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_asm64/mp_asm.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_comba.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_core.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_generic/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_generic/mp_asm.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_generic/mp_asmi.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_ia32/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_ia32/mp_asm.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_ia32/mp_asmi.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_ia32_msvc/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_ia32_msvc/mp_asmi.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_karat.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_misc.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_shift.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mp_types.h create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mulop_amd64/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mulop_amd64/mp_mulop.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mulop_amd64/mp_mulop_amd64.S create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mulop_generic/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mulop_generic/mp_mulop.cpp create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mulop_ia32/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/bigint/mulop_ia32/mp_mulop.S create mode 100644 src/libs/3rdparty/botan/src/math/gfpmath/curve_gfp.cpp create mode 100644 src/libs/3rdparty/botan/src/math/gfpmath/curve_gfp.h create mode 100644 src/libs/3rdparty/botan/src/math/gfpmath/gfp_element.cpp create mode 100644 src/libs/3rdparty/botan/src/math/gfpmath/gfp_element.h create mode 100644 src/libs/3rdparty/botan/src/math/gfpmath/gfp_modulus.h create mode 100644 src/libs/3rdparty/botan/src/math/gfpmath/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/gfpmath/point_gfp.cpp create mode 100644 src/libs/3rdparty/botan/src/math/gfpmath/point_gfp.h create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/blinding.cpp create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/blinding.h create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/def_powm.h create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/dsa_gen.cpp create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/info.txt create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/jacobi.cpp create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/make_prm.cpp create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/mp_numth.cpp create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/numthry.cpp create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/numthry.h create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/pow_mod.cpp create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/pow_mod.h create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/powm_fw.cpp create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/powm_mnt.cpp create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/primes.cpp create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/reducer.cpp create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/reducer.h create mode 100644 src/libs/3rdparty/botan/src/math/numbertheory/ressol.cpp create mode 100644 src/libs/3rdparty/botan/src/modes/cbc/cbc.cpp create mode 100644 src/libs/3rdparty/botan/src/modes/cbc/cbc.h create mode 100644 src/libs/3rdparty/botan/src/modes/cbc/info.txt create mode 100644 src/libs/3rdparty/botan/src/modes/cfb/cfb.cpp create mode 100644 src/libs/3rdparty/botan/src/modes/cfb/cfb.h create mode 100644 src/libs/3rdparty/botan/src/modes/cfb/info.txt create mode 100644 src/libs/3rdparty/botan/src/modes/ctr/ctr.cpp create mode 100644 src/libs/3rdparty/botan/src/modes/ctr/ctr.h create mode 100644 src/libs/3rdparty/botan/src/modes/ctr/info.txt create mode 100644 src/libs/3rdparty/botan/src/modes/cts/cts.cpp create mode 100644 src/libs/3rdparty/botan/src/modes/cts/cts.h create mode 100644 src/libs/3rdparty/botan/src/modes/cts/info.txt create mode 100644 src/libs/3rdparty/botan/src/modes/eax/eax.cpp create mode 100644 src/libs/3rdparty/botan/src/modes/eax/eax.h create mode 100644 src/libs/3rdparty/botan/src/modes/eax/eax_dec.cpp create mode 100644 src/libs/3rdparty/botan/src/modes/eax/info.txt create mode 100644 src/libs/3rdparty/botan/src/modes/ecb/ecb.cpp create mode 100644 src/libs/3rdparty/botan/src/modes/ecb/ecb.h create mode 100644 src/libs/3rdparty/botan/src/modes/ecb/info.txt create mode 100644 src/libs/3rdparty/botan/src/modes/info.txt create mode 100644 src/libs/3rdparty/botan/src/modes/mode_pad/info.txt create mode 100644 src/libs/3rdparty/botan/src/modes/mode_pad/mode_pad.cpp create mode 100644 src/libs/3rdparty/botan/src/modes/mode_pad/mode_pad.h create mode 100644 src/libs/3rdparty/botan/src/modes/modebase.cpp create mode 100644 src/libs/3rdparty/botan/src/modes/modebase.h create mode 100644 src/libs/3rdparty/botan/src/modes/ofb/info.txt create mode 100644 src/libs/3rdparty/botan/src/modes/ofb/ofb.cpp create mode 100644 src/libs/3rdparty/botan/src/modes/ofb/ofb.h create mode 100644 src/libs/3rdparty/botan/src/modes/xts/info.txt create mode 100644 src/libs/3rdparty/botan/src/modes/xts/xts.cpp create mode 100644 src/libs/3rdparty/botan/src/modes/xts/xts.h create mode 100644 src/libs/3rdparty/botan/src/mutex/info.txt create mode 100644 src/libs/3rdparty/botan/src/mutex/mutex.h create mode 100644 src/libs/3rdparty/botan/src/mutex/noop_mutex/info.txt create mode 100644 src/libs/3rdparty/botan/src/mutex/noop_mutex/mux_noop.cpp create mode 100644 src/libs/3rdparty/botan/src/mutex/noop_mutex/mux_noop.h create mode 100644 src/libs/3rdparty/botan/src/mutex/pthreads/info.txt create mode 100644 src/libs/3rdparty/botan/src/mutex/pthreads/mux_pthr.cpp create mode 100644 src/libs/3rdparty/botan/src/mutex/pthreads/mux_pthr.h create mode 100644 src/libs/3rdparty/botan/src/mutex/qt_mutex/info.txt create mode 100644 src/libs/3rdparty/botan/src/mutex/qt_mutex/mux_qt.cpp create mode 100644 src/libs/3rdparty/botan/src/mutex/qt_mutex/mux_qt.h create mode 100644 src/libs/3rdparty/botan/src/mutex/win32_crit_section/info.txt create mode 100644 src/libs/3rdparty/botan/src/mutex/win32_crit_section/mux_win32.cpp create mode 100644 src/libs/3rdparty/botan/src/mutex/win32_crit_section/mux_win32.h create mode 100644 src/libs/3rdparty/botan/src/pbe/get_pbe.cpp create mode 100644 src/libs/3rdparty/botan/src/pbe/get_pbe.h create mode 100644 src/libs/3rdparty/botan/src/pbe/info.txt create mode 100644 src/libs/3rdparty/botan/src/pbe/pbes1/info.txt create mode 100644 src/libs/3rdparty/botan/src/pbe/pbes1/pbes1.cpp create mode 100644 src/libs/3rdparty/botan/src/pbe/pbes1/pbes1.h create mode 100644 src/libs/3rdparty/botan/src/pbe/pbes2/info.txt create mode 100644 src/libs/3rdparty/botan/src/pbe/pbes2/pbes2.cpp create mode 100644 src/libs/3rdparty/botan/src/pbe/pbes2/pbes2.h create mode 100644 src/libs/3rdparty/botan/src/pk_pad/eme.cpp create mode 100644 src/libs/3rdparty/botan/src/pk_pad/eme.h create mode 100644 src/libs/3rdparty/botan/src/pk_pad/eme1/eme1.cpp create mode 100644 src/libs/3rdparty/botan/src/pk_pad/eme1/eme1.h create mode 100644 src/libs/3rdparty/botan/src/pk_pad/eme1/info.txt create mode 100644 src/libs/3rdparty/botan/src/pk_pad/eme_pkcs/eme_pkcs.cpp create mode 100644 src/libs/3rdparty/botan/src/pk_pad/eme_pkcs/eme_pkcs.h create mode 100644 src/libs/3rdparty/botan/src/pk_pad/eme_pkcs/info.txt create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa.h create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa1/emsa1.cpp create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa1/emsa1.h create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa1/info.txt create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa1_bsi/emsa1_bsi.cpp create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa1_bsi/emsa1_bsi.h create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa1_bsi/info.txt create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa2/emsa2.cpp create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa2/emsa2.h create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa2/info.txt create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa3/emsa3.cpp create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa3/emsa3.h create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa3/info.txt create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa4/emsa4.cpp create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa4/emsa4.h create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa4/info.txt create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa_raw/emsa_raw.cpp create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa_raw/emsa_raw.h create mode 100644 src/libs/3rdparty/botan/src/pk_pad/emsa_raw/info.txt create mode 100644 src/libs/3rdparty/botan/src/pk_pad/hash_id/hash_id.cpp create mode 100644 src/libs/3rdparty/botan/src/pk_pad/hash_id/hash_id.h create mode 100644 src/libs/3rdparty/botan/src/pk_pad/hash_id/info.txt create mode 100644 src/libs/3rdparty/botan/src/pk_pad/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/dh/dh.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/dh/dh.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/dh/dh_core.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/dh/dh_core.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/dh/dh_op.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/dh/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/dl_algo/dl_algo.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/dl_algo/dl_algo.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/dl_algo/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/dl_group/dl_group.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/dl_group/dl_group.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/dl_group/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/dlies/dlies.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/dlies/dlies.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/dlies/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/dsa/dsa.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/dsa/dsa.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/dsa/dsa_core.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/dsa/dsa_core.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/dsa/dsa_op.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/dsa/dsa_op.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/dsa/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/ec_dompar/ec_dompar.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/ec_dompar/ec_dompar.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/ec_dompar/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/ecc_key/ecc_key.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/ecc_key/ecc_key.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/ecc_key/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_core.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_core.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_op.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_op.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/ecdsa/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_core.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_core.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_op.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_op.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/eckaeg/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/elgamal/elg_core.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/elgamal/elg_core.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/elgamal/elg_op.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/elgamal/elg_op.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/elgamal/elgamal.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/elgamal/elgamal.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/elgamal/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/if_algo/if_algo.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/if_algo/if_algo.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/if_algo/if_core.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/if_algo/if_core.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/if_algo/if_op.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/if_algo/if_op.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/if_algo/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/keypair/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/keypair/keypair.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/keypair/keypair.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/nr/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/nr/nr.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/nr/nr.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/nr/nr_core.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/nr/nr_core.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/nr/nr_op.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/nr/nr_op.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/pk_algs.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/pk_algs.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/pk_codecs/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/pk_codecs/pkcs8.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/pk_codecs/pkcs8.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/pk_codecs/x509_key.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/pk_codecs/x509_key.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/pk_filts.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/pk_filts.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/pk_keys.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/pk_keys.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/pubkey.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/pubkey.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/pubkey_enums.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/pubkey_enums.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/rsa/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/rsa/rsa.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/rsa/rsa.h create mode 100644 src/libs/3rdparty/botan/src/pubkey/rw/info.txt create mode 100644 src/libs/3rdparty/botan/src/pubkey/rw/rw.cpp create mode 100644 src/libs/3rdparty/botan/src/pubkey/rw/rw.h create mode 100644 src/libs/3rdparty/botan/src/rng/auto_rng/auto_rng.cpp create mode 100644 src/libs/3rdparty/botan/src/rng/auto_rng/auto_rng.h create mode 100644 src/libs/3rdparty/botan/src/rng/auto_rng/info.txt create mode 100644 src/libs/3rdparty/botan/src/rng/hmac_rng/hmac_rng.cpp create mode 100644 src/libs/3rdparty/botan/src/rng/hmac_rng/hmac_rng.h create mode 100644 src/libs/3rdparty/botan/src/rng/hmac_rng/info.txt create mode 100644 src/libs/3rdparty/botan/src/rng/info.txt create mode 100644 src/libs/3rdparty/botan/src/rng/randpool/info.txt create mode 100644 src/libs/3rdparty/botan/src/rng/randpool/randpool.cpp create mode 100644 src/libs/3rdparty/botan/src/rng/randpool/randpool.h create mode 100644 src/libs/3rdparty/botan/src/rng/rng.cpp create mode 100644 src/libs/3rdparty/botan/src/rng/rng.h create mode 100644 src/libs/3rdparty/botan/src/rng/x931_rng/info.txt create mode 100644 src/libs/3rdparty/botan/src/rng/x931_rng/x931_rng.cpp create mode 100644 src/libs/3rdparty/botan/src/rng/x931_rng/x931_rng.h create mode 100644 src/libs/3rdparty/botan/src/s2k/info.txt create mode 100644 src/libs/3rdparty/botan/src/s2k/pbkdf1/info.txt create mode 100644 src/libs/3rdparty/botan/src/s2k/pbkdf1/pbkdf1.cpp create mode 100644 src/libs/3rdparty/botan/src/s2k/pbkdf1/pbkdf1.h create mode 100644 src/libs/3rdparty/botan/src/s2k/pbkdf2/info.txt create mode 100644 src/libs/3rdparty/botan/src/s2k/pbkdf2/pbkdf2.cpp create mode 100644 src/libs/3rdparty/botan/src/s2k/pbkdf2/pbkdf2.h create mode 100644 src/libs/3rdparty/botan/src/s2k/pgps2k/info.txt create mode 100644 src/libs/3rdparty/botan/src/s2k/pgps2k/pgp_s2k.cpp create mode 100644 src/libs/3rdparty/botan/src/s2k/pgps2k/pgp_s2k.h create mode 100644 src/libs/3rdparty/botan/src/s2k/s2k.cpp create mode 100644 src/libs/3rdparty/botan/src/s2k/s2k.h create mode 100644 src/libs/3rdparty/botan/src/selftest/info.txt create mode 100644 src/libs/3rdparty/botan/src/selftest/selftest.cpp create mode 100644 src/libs/3rdparty/botan/src/selftest/selftest.h create mode 100644 src/libs/3rdparty/botan/src/stream/arc4/arc4.cpp create mode 100644 src/libs/3rdparty/botan/src/stream/arc4/arc4.h create mode 100644 src/libs/3rdparty/botan/src/stream/arc4/info.txt create mode 100644 src/libs/3rdparty/botan/src/stream/info.txt create mode 100644 src/libs/3rdparty/botan/src/stream/salsa20/info.txt create mode 100644 src/libs/3rdparty/botan/src/stream/salsa20/salsa20.cpp create mode 100644 src/libs/3rdparty/botan/src/stream/salsa20/salsa20.h create mode 100644 src/libs/3rdparty/botan/src/stream/stream_cipher.cpp create mode 100644 src/libs/3rdparty/botan/src/stream/stream_cipher.h create mode 100644 src/libs/3rdparty/botan/src/stream/turing/info.txt create mode 100644 src/libs/3rdparty/botan/src/stream/turing/tur_tab.cpp create mode 100644 src/libs/3rdparty/botan/src/stream/turing/turing.cpp create mode 100644 src/libs/3rdparty/botan/src/stream/turing/turing.h create mode 100644 src/libs/3rdparty/botan/src/stream/wid_wake/info.txt create mode 100644 src/libs/3rdparty/botan/src/stream/wid_wake/wid_wake.cpp create mode 100644 src/libs/3rdparty/botan/src/stream/wid_wake/wid_wake.h create mode 100644 src/libs/3rdparty/botan/src/sym_algo/info.txt create mode 100644 src/libs/3rdparty/botan/src/sym_algo/sym_algo.h create mode 100644 src/libs/3rdparty/botan/src/sym_algo/symkey.cpp create mode 100644 src/libs/3rdparty/botan/src/sym_algo/symkey.h create mode 100644 src/libs/3rdparty/botan/src/timer/cpu_counter/info.txt create mode 100644 src/libs/3rdparty/botan/src/timer/cpu_counter/tm_hard.cpp create mode 100644 src/libs/3rdparty/botan/src/timer/cpu_counter/tm_hard.h create mode 100644 src/libs/3rdparty/botan/src/timer/gettimeofday/info.txt create mode 100644 src/libs/3rdparty/botan/src/timer/gettimeofday/tm_unix.cpp create mode 100644 src/libs/3rdparty/botan/src/timer/gettimeofday/tm_unix.h create mode 100644 src/libs/3rdparty/botan/src/timer/info.txt create mode 100644 src/libs/3rdparty/botan/src/timer/posix_rt/info.txt create mode 100644 src/libs/3rdparty/botan/src/timer/posix_rt/tm_posix.cpp create mode 100644 src/libs/3rdparty/botan/src/timer/posix_rt/tm_posix.h create mode 100644 src/libs/3rdparty/botan/src/timer/timer.cpp create mode 100644 src/libs/3rdparty/botan/src/timer/timer.h create mode 100644 src/libs/3rdparty/botan/src/timer/win32_query_perf_ctr/info.txt create mode 100644 src/libs/3rdparty/botan/src/timer/win32_query_perf_ctr/tm_win32.cpp create mode 100644 src/libs/3rdparty/botan/src/timer/win32_query_perf_ctr/tm_win32.h create mode 100644 src/libs/3rdparty/botan/src/utils/asm_amd64/asm_macr.h create mode 100644 src/libs/3rdparty/botan/src/utils/asm_amd64/info.txt create mode 100644 src/libs/3rdparty/botan/src/utils/asm_ia32/asm_macr.h create mode 100644 src/libs/3rdparty/botan/src/utils/asm_ia32/info.txt create mode 100644 src/libs/3rdparty/botan/src/utils/bit_ops.h create mode 100644 src/libs/3rdparty/botan/src/utils/bswap.h create mode 100644 src/libs/3rdparty/botan/src/utils/buf_comp/buf_comp.h create mode 100644 src/libs/3rdparty/botan/src/utils/buf_comp/info.txt create mode 100644 src/libs/3rdparty/botan/src/utils/charset.cpp create mode 100644 src/libs/3rdparty/botan/src/utils/charset.h create mode 100644 src/libs/3rdparty/botan/src/utils/datastor/datastor.cpp create mode 100644 src/libs/3rdparty/botan/src/utils/datastor/datastor.h create mode 100644 src/libs/3rdparty/botan/src/utils/datastor/info.txt create mode 100644 src/libs/3rdparty/botan/src/utils/exceptn.cpp create mode 100644 src/libs/3rdparty/botan/src/utils/exceptn.h create mode 100644 src/libs/3rdparty/botan/src/utils/info.txt create mode 100644 src/libs/3rdparty/botan/src/utils/loadstor.h create mode 100644 src/libs/3rdparty/botan/src/utils/mem_ops.h create mode 100644 src/libs/3rdparty/botan/src/utils/mlock.cpp create mode 100644 src/libs/3rdparty/botan/src/utils/parsing.cpp create mode 100644 src/libs/3rdparty/botan/src/utils/parsing.h create mode 100644 src/libs/3rdparty/botan/src/utils/rotate.h create mode 100644 src/libs/3rdparty/botan/src/utils/stl_util.h create mode 100644 src/libs/3rdparty/botan/src/utils/types.h create mode 100644 src/libs/3rdparty/botan/src/utils/ui.cpp create mode 100644 src/libs/3rdparty/botan/src/utils/ui.h create mode 100644 src/libs/3rdparty/botan/src/utils/util.cpp create mode 100644 src/libs/3rdparty/botan/src/utils/util.h create mode 100644 src/libs/3rdparty/botan/src/utils/version.cpp create mode 100644 src/libs/3rdparty/botan/src/utils/version.h create mode 100644 src/libs/3rdparty/botan/src/utils/xor_buf.h create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/botan/__init__.py create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/nisttest.py create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/results.txt create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/rng_test.py create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/src/block.cpp create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/src/core.cpp create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/src/filter.cpp create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/src/hash.cpp create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/src/macs.cpp create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/src/pk.cpp create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/src/python_botan.h create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/src/stream.cpp create mode 100644 src/libs/3rdparty/botan/wrappers/boost-python/src/x509.cpp create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/Botan.pm create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/Botan.xs create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/Changes create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/MANIFEST create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/data/ca.cert.der create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/data/ca.cert.pem create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/t/base64.t create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/t/filt.t create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/t/hex.t create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/t/oid.t create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/t/pipe.t create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/t/testutl.pl create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/t/x509cert.t create mode 100644 src/libs/3rdparty/botan/wrappers/perl-xs/typemap create mode 100644 src/libs/3rdparty/botan/wrappers/swig/base.cpp create mode 100644 src/libs/3rdparty/botan/wrappers/swig/base.h create mode 100644 src/libs/3rdparty/botan/wrappers/swig/botan.swg create mode 100644 src/libs/3rdparty/botan/wrappers/swig/doit.py create mode 100644 src/libs/3rdparty/botan/wrappers/swig/filter.cpp create mode 100644 src/libs/3rdparty/botan/wrappers/swig/pipe.cpp create mode 100644 src/libs/3rdparty/botan/wrappers/swig/pk.swg create mode 100644 src/libs/3rdparty/botan/wrappers/swig/readme.txt create mode 100644 src/libs/3rdparty/botan/wrappers/swig/tests/block.py create mode 100644 src/libs/3rdparty/botan/wrappers/swig/tests/block2.py create mode 100644 src/libs/3rdparty/botan/wrappers/swig/tests/encrypt.py create mode 100644 src/libs/3rdparty/botan/wrappers/swig/tests/filter.py create mode 100644 src/libs/3rdparty/botan/wrappers/swig/tests/hash.py create mode 100644 src/libs/3rdparty/botan/wrappers/swig/tests/mac.py create mode 100644 src/libs/3rdparty/botan/wrappers/swig/tests/pubkey.py create mode 100644 src/libs/3rdparty/botan/wrappers/swig/tests/stream.py create mode 100644 src/libs/3rdparty/botan/wrappers/swig/x509.swg diff --git a/src/libs/3rdparty/botan/checks/algos.cpp b/src/libs/3rdparty/botan/checks/algos.cpp new file mode 100644 index 00000000000..2edaaf14cd5 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/algos.cpp @@ -0,0 +1,105 @@ + +#include +#include +using namespace Botan; + +#include "common.h" + +std::vector get_algos() + { + std::vector algos; + + algos.push_back(algorithm("Block Cipher", "AES-128", "AES-128/ECB", 16)); + algos.push_back(algorithm("Block Cipher", "AES-192", "AES-192/ECB", 24)); + algos.push_back(algorithm("Block Cipher", "AES-256", "AES-256/ECB", 32)); + algos.push_back(algorithm("Block Cipher", "Blowfish", "Blowfish/ECB", 32)); + algos.push_back(algorithm("Block Cipher", "CAST-128", "CAST-128/ECB", 16)); + algos.push_back(algorithm("Block Cipher", "CAST-256", "CAST-256/ECB", 32)); + algos.push_back(algorithm("Block Cipher", "DES", "DES/ECB", 8)); + algos.push_back(algorithm("Block Cipher", "DESX", "DESX/ECB", 24)); + algos.push_back(algorithm("Block Cipher", "TripleDES", + "TripleDES/ECB", 24)); + algos.push_back(algorithm("Block Cipher", "GOST", "GOST/ECB", 32)); + algos.push_back(algorithm("Block Cipher", "IDEA", "IDEA/ECB", 16)); + algos.push_back(algorithm("Block Cipher", "KASUMI", "KASUMI/ECB", 16)); + + algos.push_back(algorithm("Block Cipher", + "Lion", + "Lion(SHA-256,Turing,8192)/ECB", 32)); + + algos.push_back(algorithm("Block Cipher", "Luby-Rackoff(SHA-512)", + "Luby-Rackoff(SHA-512)/ECB", 16)); + + algos.push_back(algorithm("Block Cipher", "MARS", "MARS/ECB", 32)); + algos.push_back(algorithm("Block Cipher", "MISTY1", "MISTY1/ECB", 16)); + algos.push_back(algorithm("Block Cipher", "Noekeon", "Noekeon/ECB", 16)); + algos.push_back(algorithm("Block Cipher", "RC2", "RC2/ECB", 16)); + algos.push_back(algorithm("Block Cipher", "RC5(12)", "RC5(12)/ECB", 16)); + algos.push_back(algorithm("Block Cipher", "RC5(16)", "RC5(16)/ECB", 16)); + algos.push_back(algorithm("Block Cipher", "RC6", "RC6/ECB", 32)); + algos.push_back(algorithm("Block Cipher", "SAFER-SK(10)", + "SAFER-SK(10)/ECB", 16)); + algos.push_back(algorithm("Block Cipher", "SEED", "SEED/ECB", 16)); + algos.push_back(algorithm("Block Cipher", "Serpent", "Serpent/ECB", 32)); + algos.push_back(algorithm("Block Cipher", "Skipjack", "Skipjack/ECB", 10)); + algos.push_back(algorithm("Block Cipher", "Square", "Square/ECB", 16)); + algos.push_back(algorithm("Block Cipher", "TEA", "TEA/ECB", 16)); + algos.push_back(algorithm("Block Cipher", "Twofish", "Twofish/ECB", 32)); + algos.push_back(algorithm("Block Cipher", "XTEA", "XTEA/ECB", 16)); + + algos.push_back(algorithm("Cipher Mode", "DES/CBC/PKCS7", 8, 8)); + algos.push_back(algorithm("Cipher Mode", "TripleDES/CBC/PKCS7", 24, 8)); + + algos.push_back(algorithm("Cipher Mode", "AES-128/CBC/PKCS7", 16, 16)); + algos.push_back(algorithm("Cipher Mode", "AES-128/CBC/CTS", 16, 16)); + algos.push_back(algorithm("Cipher Mode", "AES-128/CFB(128)", 16, 16)); + algos.push_back(algorithm("Cipher Mode", "AES-128/CFB(64)", 16, 16)); + algos.push_back(algorithm("Cipher Mode", "AES-128/CFB(32)", 16, 16)); + algos.push_back(algorithm("Cipher Mode", "AES-128/CFB(16)", 16, 16)); + algos.push_back(algorithm("Cipher Mode", "AES-128/CFB(8)", 16, 16)); + algos.push_back(algorithm("Cipher Mode", "AES-128/OFB", 16, 16)); + algos.push_back(algorithm("Cipher Mode", "AES-128/CTR", + "AES-128/CTR-BE", 16, 16)); + algos.push_back(algorithm("Cipher Mode", "AES-128/EAX", 16, 16)); + algos.push_back(algorithm("Cipher Mode", "AES-128/XTS", 32, 16)); + + algos.push_back(algorithm("Stream Cipher", "ARC4", 16)); + algos.push_back(algorithm("Stream Cipher", "Salsa20", 32)); + algos.push_back(algorithm("Stream Cipher", "Turing", 32)); + algos.push_back(algorithm("Stream Cipher", "WiderWake4+1", + "WiderWake4+1-BE", 16, 8)); + + algos.push_back(algorithm("Hash", "Adler32")); + algos.push_back(algorithm("Hash", "CRC24")); + algos.push_back(algorithm("Hash", "CRC32")); + algos.push_back(algorithm("Hash", "FORK-256")); + algos.push_back(algorithm("Hash", "GOST-34.11")); + algos.push_back(algorithm("Hash", "HAS-160")); + algos.push_back(algorithm("Hash", "HAS-V")); + algos.push_back(algorithm("Hash", "MD2")); + algos.push_back(algorithm("Hash", "MD4")); + algos.push_back(algorithm("Hash", "MD5")); + algos.push_back(algorithm("Hash", "RIPEMD-128")); + algos.push_back(algorithm("Hash", "RIPEMD-160")); + algos.push_back(algorithm("Hash", "SHA-160")); + algos.push_back(algorithm("Hash", "SHA-256")); + algos.push_back(algorithm("Hash", "SHA-384")); + algos.push_back(algorithm("Hash", "SHA-512")); + algos.push_back(algorithm("Hash", "Skein-512")); + algos.push_back(algorithm("Hash", "Tiger")); + algos.push_back(algorithm("Hash", "Whirlpool")); + + algos.push_back(algorithm("MAC", "CMAC(AES-128)", 16)); + algos.push_back(algorithm("MAC", "HMAC(SHA-1)", 16)); + algos.push_back(algorithm("MAC", "X9.19-MAC", 16)); + + algos.push_back(algorithm("RNG", "AutoSeeded", 4096)); + algos.push_back(algorithm("RNG", "HMAC_RNG", 4096)); + algos.push_back(algorithm("RNG", "Randpool", 4096)); + algos.push_back(algorithm("RNG", "X9.31-RNG", 4096)); + + algos.push_back(algorithm("Codec", "Base64_Encode")); + algos.push_back(algorithm("Codec", "Base64_Decode")); + + return algos; + } diff --git a/src/libs/3rdparty/botan/checks/bench.cpp b/src/libs/3rdparty/botan/checks/bench.cpp new file mode 100644 index 00000000000..6df7319c041 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/bench.cpp @@ -0,0 +1,198 @@ + +#include +#include +#include +#include +#include + +#include +using Botan::byte; +using Botan::u64bit; + +#include "common.h" +#include "timer.h" +#include "bench.h" + +/* Discard output to reduce overhead */ +struct BitBucket : public Botan::Filter + { + void write(const byte[], u32bit) {} + }; + +Botan::Filter* lookup(const std::string&, + const std::vector&, + const std::string& = "All"); + +namespace { + +double bench_filter(std::string name, Botan::Filter* filter, + Botan::RandomNumberGenerator& rng, + bool html, double seconds) + { + Botan::Pipe pipe(filter, new BitBucket); + + std::vector buf(128 * 1024); + rng.randomize(&buf[0], buf.size()); + + pipe.start_msg(); + + Timer timer(name, buf.size()); + + while(timer.seconds() < seconds) + { + timer.start(); + pipe.write(&buf[0], buf.size()); + timer.stop(); + } + + pipe.end_msg(); + + double bytes_per_sec = timer.events() / timer.seconds(); + double mbytes_per_sec = bytes_per_sec / (1024.0 * 1024.0); + + std::cout.setf(std::ios::fixed, std::ios::floatfield); + std::cout.precision(2); + if(html) + { + if(name.find("<") != std::string::npos) + name.replace(name.find("<"), 1, "<"); + if(name.find(">") != std::string::npos) + name.replace(name.find(">"), 1, ">"); + std::cout << " " << name + << std::string(25 - name.length(), ' ') << " "; + std::cout.width(6); + std::cout << mbytes_per_sec << std::endl; + } + else + { + std::cout << name << ": " << std::string(25 - name.length(), ' '); + std::cout.width(6); + std::cout << mbytes_per_sec << " MiB/sec" << std::endl; + } + return (mbytes_per_sec); + } + +double bench(const std::string& name, const std::string& filtername, bool html, + double seconds, u32bit keylen, u32bit ivlen, + Botan::RandomNumberGenerator& rng) + { + std::vector params; + + Botan::SecureVector key(keylen); + rng.randomize(key, key.size()); + params.push_back(hex_encode(key, key.size())); + + //params.push_back(std::string(int(2*keylen), 'A')); + params.push_back(std::string(int(2* ivlen), 'A')); + + Botan::Filter* filter = lookup(filtername, params); + + if(filter) + return bench_filter(name, filter, rng, html, seconds); + return 0; + } + +} + +void benchmark(const std::string& what, + Botan::RandomNumberGenerator& rng, + bool html, double seconds) + { + try { + if(html) + { + std::cout << "\n" + << "\n\n" + << "Botan Benchmarks\n\n" + << "\n\n" + << "

\n" + << "\n" + << "\n"; + } + + double sum = 0; + u32bit how_many = 0; + + std::vector algos = get_algos(); + + for(u32bit j = 0; j != algos.size(); j++) + if(what == "All" || what == algos[j].type) + { + double speed = bench(algos[j].name, algos[j].filtername, + html, seconds, algos[j].keylen, + algos[j].ivlen, rng); + if(speed > .00001) /* log(0) == -inf -> messed up average */ + sum += std::log(speed); + how_many++; + } + + if(html) + std::cout << "
Algorithm " + << "Mib / second\n" + << "
\n\n"; + + double average = std::exp(sum / static_cast(how_many)); + + if(what == "All" && html) + std::cout << "\n

Overall speed average: " << average + << "\n\n"; + else if(what == "All") + std::cout << "\nOverall speed average: " << average + << std::endl; + + if(html) std::cout << "\n"; + } + catch(Botan::Exception& e) + { + std::cout << "Botan exception caught: " << e.what() << std::endl; + return; + } + catch(std::exception& e) + { + std::cout << "Standard library exception caught: " << e.what() + << std::endl; + return; + } + catch(...) + { + std::cout << "Unknown exception caught." << std::endl; + return; + } + } + +u32bit bench_algo(const std::string& name, + Botan::RandomNumberGenerator& rng, + double seconds) + { + try { + std::vector algos = get_algos(); + + for(u32bit j = 0; j != algos.size(); j++) + { + if(algos[j].name == name) + { + bench(algos[j].name, algos[j].filtername, false, seconds, + algos[j].keylen, algos[j].ivlen, rng); + return 1; + } + } + return 0; + } + catch(Botan::Exception& e) + { + std::cout << "Botan exception caught: " << e.what() << std::endl; + return 0; + } + catch(std::exception& e) + { + std::cout << "Standard library exception caught: " << e.what() + << std::endl; + return 0; + } + catch(...) + { + std::cout << "Unknown exception caught." << std::endl; + return 0; + } + } diff --git a/src/libs/3rdparty/botan/checks/bench.h b/src/libs/3rdparty/botan/checks/bench.h new file mode 100644 index 00000000000..07d67e0d1d0 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/bench.h @@ -0,0 +1,37 @@ + +#ifndef BOTAN_BENCHMARCH_H__ +#define BOTAN_BENCHMARCH_H__ + +#include +#include +#include +#include +#include "timer.h" + +#include + +class Benchmark_Report + { + public: + void report(const std::string& name, Timer timer) + { + std::cout << name << " " << timer << std::endl; + data[name].insert(timer); + } + + private: + std::map > data; + }; + + +void benchmark(const std::string&, Botan::RandomNumberGenerator&, + bool html, double seconds); + +void bench_pk(Botan::RandomNumberGenerator&, + const std::string&, bool html, double seconds); + +u32bit bench_algo(const std::string&, + Botan::RandomNumberGenerator&, + double); + +#endif diff --git a/src/libs/3rdparty/botan/checks/bigint.cpp b/src/libs/3rdparty/botan/checks/bigint.cpp new file mode 100644 index 00000000000..a56fd91816e --- /dev/null +++ b/src/libs/3rdparty/botan/checks/bigint.cpp @@ -0,0 +1,353 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +using namespace Botan; + +#include "common.h" +#include "validate.h" + +#define DEBUG 0 + +u32bit check_add(const std::vector&); +u32bit check_sub(const std::vector&); +u32bit check_mul(const std::vector&); +u32bit check_sqr(const std::vector&); +u32bit check_div(const std::vector&); +u32bit check_mod(const std::vector&, + Botan::RandomNumberGenerator& rng); +u32bit check_shr(const std::vector&); +u32bit check_shl(const std::vector&); + +u32bit check_powmod(const std::vector&); +u32bit check_primetest(const std::vector&, + Botan::RandomNumberGenerator&); + +u32bit do_bigint_tests(const std::string& filename, + Botan::RandomNumberGenerator& rng) + { + std::ifstream test_data(filename.c_str()); + + if(!test_data) + throw Botan::Stream_IO_Error("Couldn't open test file " + filename); + + u32bit errors = 0, alg_count = 0; + std::string algorithm; + bool first = true; + u32bit counter = 0; + + while(!test_data.eof()) + { + if(test_data.bad() || test_data.fail()) + throw Botan::Stream_IO_Error("File I/O error reading from " + + filename); + + std::string line; + std::getline(test_data, line); + + strip(line); + if(line.size() == 0) continue; + + // Do line continuation + while(line[line.size()-1] == '\\' && !test_data.eof()) + { + line.replace(line.size()-1, 1, ""); + std::string nextline; + std::getline(test_data, nextline); + strip(nextline); + if(nextline.size() == 0) continue; + line += nextline; + } + + if(line[0] == '[' && line[line.size() - 1] == ']') + { + algorithm = line.substr(1, line.size() - 2); + alg_count = 0; + counter = 0; + + if(!first) + std::cout << std::endl; + std::cout << "Testing BigInt " << algorithm << ": "; + std::cout.flush(); + first = false; + continue; + } + + std::vector substr = parse(line); + +#if DEBUG + std::cout << "Testing: " << algorithm << std::endl; +#endif + + u32bit new_errors = 0; + if(algorithm.find("Addition") != std::string::npos) + new_errors = check_add(substr); + else if(algorithm.find("Subtraction") != std::string::npos) + new_errors = check_sub(substr); + else if(algorithm.find("Multiplication") != std::string::npos) + new_errors = check_mul(substr); + else if(algorithm.find("Square") != std::string::npos) + new_errors = check_sqr(substr); + else if(algorithm.find("Division") != std::string::npos) + new_errors = check_div(substr); + else if(algorithm.find("Modulo") != std::string::npos) + new_errors = check_mod(substr, rng); + else if(algorithm.find("LeftShift") != std::string::npos) + new_errors = check_shl(substr); + else if(algorithm.find("RightShift") != std::string::npos) + new_errors = check_shr(substr); + else if(algorithm.find("ModExp") != std::string::npos) + new_errors = check_powmod(substr); + else if(algorithm.find("PrimeTest") != std::string::npos) + new_errors = check_primetest(substr, rng); + else + std::cout << "Unknown MPI test " << algorithm << std::endl; + + if(counter % 3 == 0) + { + std::cout << '.'; + std::cout.flush(); + } + counter++; + alg_count++; + errors += new_errors; + + if(new_errors) + std::cout << "ERROR: BigInt " << algorithm << " failed test #" + << std::dec << alg_count << std::endl; + } + std::cout << std::endl; + return errors; + } + +namespace { + +// c==expected, d==a op b, e==a op= b +u32bit results(std::string op, + const BigInt& a, const BigInt& b, + const BigInt& c, const BigInt& d, const BigInt& e) + { + std::string op1 = "operator" + op; + std::string op2 = op1 + "="; + + if(c == d && d == e) + return 0; + else + { + std::cout << std::endl; + + std::cout << "ERROR: " << op1 << std::endl; + + std::cout << "a = " << std::hex << a << std::endl; + std::cout << "b = " << std::hex << b << std::endl; + + std::cout << "c = " << std::hex << c << std::endl; + std::cout << "d = " << std::hex << d << std::endl; + std::cout << "e = " << std::hex << e << std::endl; + + if(d != e) + { + std::cout << "ERROR: " << op1 << " | " << op2 + << " mismatch" << std::endl; + } + return 1; + } + } + +} + +u32bit check_add(const std::vector& args) + { + BigInt a(args[0]); + BigInt b(args[1]); + BigInt c(args[2]); + + BigInt d = a + b; + BigInt e = a; + e += b; + + if(results("+", a, b, c, d, e)) + return 1; + + d = b + a; + e = b; + e += a; + + return results("+", a, b, c, d, e); + } + +u32bit check_sub(const std::vector& args) + { + BigInt a(args[0]); + BigInt b(args[1]); + BigInt c(args[2]); + + BigInt d = a - b; + BigInt e = a; + e -= b; + + return results("-", a, b, c, d, e); + } + +u32bit check_mul(const std::vector& args) + { + BigInt a(args[0]); + BigInt b(args[1]); + BigInt c(args[2]); + + /* + std::cout << "a = " << args[0] << "\n" + << "b = " << args[1] << std::endl; + */ + /* This makes it more likely the fast multiply algorithms will be usable, + which is what we really want to test here (the simple n^2 multiply is + pretty well tested at this point). + */ + a.grow_reg(32); + b.grow_reg(32); + + BigInt d = a * b; + BigInt e = a; + e *= b; + + if(results("*", a, b, c, d, e)) + return 1; + + d = b * a; + e = b; + e *= a; + + return results("*", a, b, c, d, e); + } + +u32bit check_sqr(const std::vector& args) + { + BigInt a(args[0]); + BigInt b(args[1]); + + a.grow_reg(16); + b.grow_reg(16); + + BigInt c = square(a); + BigInt d = a * a; + + return results("sqr", a, a, b, c, d); + } + +u32bit check_div(const std::vector& args) + { + BigInt a(args[0]); + BigInt b(args[1]); + BigInt c(args[2]); + + BigInt d = a / b; + BigInt e = a; + e /= b; + + return results("/", a, b, c, d, e); + } + +u32bit check_mod(const std::vector& args, + Botan::RandomNumberGenerator& rng) + { + BigInt a(args[0]); + BigInt b(args[1]); + BigInt c(args[2]); + + BigInt d = a % b; + BigInt e = a; + e %= b; + + u32bit got = results("%", a, b, c, d, e); + + if(got) return got; + + word b_word = b.word_at(0); + + /* Won't work for us, just pick one at random */ + while(b_word == 0) + for(u32bit j = 0; j != 2*sizeof(word); j++) + b_word = (b_word << 4) ^ rng.next_byte(); + + b = b_word; + + c = a % b; /* we declare the BigInt % BigInt version to be correct here */ + + word d2 = a % b_word; + e = a; + e %= b_word; + + return results("%(word)", a, b, c, d2, e); + } + +u32bit check_shl(const std::vector& args) + { + BigInt a(args[0]); + u32bit b = std::atoi(args[1].c_str()); + BigInt c(args[2]); + + BigInt d = a << b; + BigInt e = a; + e <<= b; + + return results("<<", a, b, c, d, e); + } + +u32bit check_shr(const std::vector& args) + { + BigInt a(args[0]); + u32bit b = std::atoi(args[1].c_str()); + BigInt c(args[2]); + + BigInt d = a >> b; + BigInt e = a; + e >>= b; + + return results(">>", a, b, c, d, e); + } + +/* Make sure that (a^b)%m == r */ +u32bit check_powmod(const std::vector& args) + { + BigInt a(args[0]); + BigInt b(args[1]); + BigInt m(args[2]); + BigInt c(args[3]); + + BigInt r = power_mod(a, b, m); + + if(c != r) + { + std::cout << "ERROR: power_mod" << std::endl; + std::cout << "a = " << std::hex << a << std::endl; + std::cout << "b = " << std::hex << b << std::endl; + std::cout << "m = " << std::hex << m << std::endl; + std::cout << "c = " << std::hex << c << std::endl; + std::cout << "r = " << std::hex << r << std::endl; + return 1; + } + return 0; + } + +/* Make sure that n is prime or not prime, according to should_be_prime */ +u32bit check_primetest(const std::vector& args, + Botan::RandomNumberGenerator& rng) + { + BigInt n(args[0]); + bool should_be_prime = (args[1] == "1"); + + bool is_prime = Botan::verify_prime(n, rng); + + if(is_prime != should_be_prime) + { + std::cout << "ERROR: verify_prime" << std::endl; + std::cout << "n = " << n << std::endl; + std::cout << is_prime << " != " << should_be_prime << std::endl; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/checks/block.cpp b/src/libs/3rdparty/botan/checks/block.cpp new file mode 100644 index 00000000000..1e7de3726ba --- /dev/null +++ b/src/libs/3rdparty/botan/checks/block.cpp @@ -0,0 +1,98 @@ + +/* + We don't use the standard issue ECB filter, because we also want to check + that the encryption and decryption operations are inverses (ie, it works). + + This class only works with NoPadding mode, unlike the regular ECB filters +*/ + +#include +#include +#include +#include +#include +using namespace Botan; + +#include "common.h" + +class ECB_Encryption_ErrorCheck : public Filter + { + public: + void write(const byte[], u32bit); + void end_msg(); + ECB_Encryption_ErrorCheck(const std::string& cipher_name, + const std::string&, + const SymmetricKey& key) : + BLOCKSIZE(block_size_of(cipher_name)) + { + const std::string HASH = "CRC32"; + + cipher = get_block_cipher(cipher_name); + input_hash = get_hash(HASH); + decrypt_hash = get_hash(HASH); + buffer.create(BLOCKSIZE); + cipher->set_key(key); + position = 0; + } + ~ECB_Encryption_ErrorCheck() + { delete cipher; delete input_hash; delete decrypt_hash; } + private: + const u32bit BLOCKSIZE; + BlockCipher* cipher; + SecureVector buffer; + u32bit position; + HashFunction* input_hash, *decrypt_hash; + }; + +void ECB_Encryption_ErrorCheck::write(const byte input[], u32bit length) + { + input_hash->update(input, length); + buffer.copy(position, input, length); + if(position + length >= BLOCKSIZE) + { + cipher->encrypt(buffer); + send(buffer, BLOCKSIZE); + cipher->decrypt(buffer); + decrypt_hash->update(buffer, BLOCKSIZE); + input += (BLOCKSIZE - position); + length -= (BLOCKSIZE - position); + while(length >= BLOCKSIZE) + { + cipher->encrypt(input, buffer); + send(buffer, BLOCKSIZE); + cipher->decrypt(buffer); + decrypt_hash->update(buffer, BLOCKSIZE); + input += BLOCKSIZE; + length -= BLOCKSIZE; + } + buffer.copy(input, length); + position = 0; + } + position += length; + } + +void ECB_Encryption_ErrorCheck::end_msg() + { + SecureVector hash1 = input_hash->final(); + SecureVector hash2 = decrypt_hash->final(); + + if(hash1 != hash2) + { + std::cout << "In " << cipher->name() + << " decryption check failed." << std::endl; + } + + if(position) + throw Exception("ECB: input was not in full blocks"); + } + +Filter* lookup_block(const std::string& algname, const std::string& key) + { + Filter* cipher = 0; + try { + cipher = new ECB_Encryption_ErrorCheck(algname, "NoPadding", key); + } + catch(Algorithm_Not_Found) {} + + return cipher; + } diff --git a/src/libs/3rdparty/botan/checks/check.cpp b/src/libs/3rdparty/botan/checks/check.cpp new file mode 100644 index 00000000000..678cf4b09ef --- /dev/null +++ b/src/libs/3rdparty/botan/checks/check.cpp @@ -0,0 +1,240 @@ +/* + * Test Driver for Botan + */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace Botan; + +#include "getopt.h" +#include "bench.h" +#include "validate.h" +#include "common.h" + +const std::string VALIDATION_FILE = "checks/validate.dat"; +const std::string BIGINT_VALIDATION_FILE = "checks/mp_valid.dat"; +const std::string PK_VALIDATION_FILE = "checks/pk_valid.dat"; +const std::string EXPECTED_FAIL_FILE = "checks/fail.dat"; + +int run_test_suite(RandomNumberGenerator& rng); + +namespace { + +template +bool test(const char* type, int digits, bool is_signed) + { + if(std::numeric_limits::is_specialized == false) + { + std::cout << "WARNING: Could not check parameters of " << type + << " in std::numeric_limits" << std::endl; + + // assume it's OK (full tests will catch it later) + return true; + } + + // continue checking after failures + bool passed = true; + + if(std::numeric_limits::is_integer == false) + { + std::cout << "WARN: std::numeric_limits<> says " << type + << " is not an integer" << std::endl; + passed = false; + } + + if(std::numeric_limits::is_signed != is_signed) + { + std::cout << "ERROR: numeric_limits<" << type << ">::is_signed == " + << std::boolalpha << std::numeric_limits::is_signed + << std::endl; + passed = false; + } + + if(std::numeric_limits::digits != digits && digits != 0) + { + std::cout << "ERROR: numeric_limits<" << type << ">::digits == " + << std::numeric_limits::digits + << " expected " << digits << std::endl; + passed = false; + } + + return passed; + } + +void test_types() + { + bool passed = true; + + passed = passed && test("byte", 8, false); + passed = passed && test("u16bit", 16, false); + passed = passed && test("u32bit", 32, false); + passed = passed && test("u64bit", 64, false); + passed = passed && test("s32bit", 31, true); + passed = passed && test("word", 0, false); + + if(!passed) + std::cout << "Typedefs in include/types.h may be incorrect!\n"; + } + +} + +int main(int argc, char* argv[]) + { + try + { + OptionParser opts("help|html|test|validate|" + "benchmark|bench-type=|bench-algo=|seconds="); + opts.parse(argv); + + test_types(); // do this always + + Botan::LibraryInitializer init("thread_safe=no"); + + Botan::AutoSeeded_RNG rng; + + if(opts.is_set("help") || argc <= 1) + { + std::cerr << "Test driver for " + << Botan::version_string() << "\n" + << "Options:\n" + << " --test || --validate: Run tests (do this at least once)\n" + << " --benchmark: Benchmark everything\n" + << " --bench-type={block,mode,stream,hash,mac,rng,pk}:\n" + << " Benchmark only algorithms of a particular type\n" + << " --html: Produce HTML output for benchmarks\n" + << " --seconds=n: Benchmark for n seconds\n" + << " --init=: Pass to the library\n" + << " --help: Print this message\n"; + return 1; + } + + if(opts.is_set("validate") || opts.is_set("test")) + { + return run_test_suite(rng); + } + if(opts.is_set("bench-algo") || + opts.is_set("benchmark") || + opts.is_set("bench-type")) + { + double seconds = 5; + + if(opts.is_set("seconds")) + { + seconds = std::atof(opts.value("seconds").c_str()); + if(seconds < 0.1 || seconds > (5 * 60)) + { + std::cout << "Invalid argument to --seconds\n"; + return 2; + } + } + + const bool html = opts.is_set("html"); + + if(opts.is_set("benchmark")) + { + benchmark("All", rng, html, seconds); + } + else if(opts.is_set("bench-algo")) + { + std::vector algs = + Botan::split_on(opts.value("bench-algo"), ','); + + for(u32bit j = 0; j != algs.size(); j++) + { + const std::string alg = algs[j]; + u32bit found = bench_algo(alg, rng, seconds); + if(!found) // maybe it's a PK algorithm + bench_pk(rng, alg, html, seconds); + } + } + else if(opts.is_set("bench-type")) + { + const std::string type = opts.value("bench-type"); + + if(type == "all") + benchmark("All", rng, html, seconds); + else if(type == "block") + benchmark("Block Cipher", rng, html, seconds); + else if(type == "stream") + benchmark("Stream Cipher", rng, html, seconds); + else if(type == "hash") + benchmark("Hash", rng, html, seconds); + else if(type == "mode") + benchmark("Cipher Mode", rng, html, seconds); + else if(type == "mac") + benchmark("MAC", rng, html, seconds); + else if(type == "rng") + benchmark("RNG", rng, html, seconds); + else if(type == "pk") + bench_pk(rng, "All", html, seconds); + else + std::cerr << "Unknown --bench-type " << type << "\n"; + } + } + } + catch(std::exception& e) + { + std::cerr << "Exception: " << e.what() << std::endl; + return 1; + } + catch(...) + { + std::cerr << "Unknown (...) exception caught" << std::endl; + return 1; + } + + return 0; + } + +int run_test_suite(RandomNumberGenerator& rng) + { + std::cout << "Beginning tests..." << std::endl; + + u32bit errors = 0; + try + { + errors += do_validation_tests(VALIDATION_FILE, rng); + errors += do_validation_tests(EXPECTED_FAIL_FILE, rng, false); + errors += do_bigint_tests(BIGINT_VALIDATION_FILE, rng); + errors += do_pk_validation_tests(PK_VALIDATION_FILE, rng); + //errors += do_cvc_tests(rng); + } + catch(Botan::Exception& e) + { + std::cout << "Exception caught: " << e.what() << std::endl; + return 1; + } + catch(std::exception& e) + { + std::cout << "Standard library exception caught: " + << e.what() << std::endl; + return 1; + } + catch(...) + { + std::cout << "Unknown exception caught." << std::endl; + return 1; + } + + if(errors) + { + std::cout << errors << " test" << ((errors == 1) ? "" : "s") + << " failed." << std::endl; + return 1; + } + + std::cout << "All tests passed!" << std::endl; + return 0; + } diff --git a/src/libs/3rdparty/botan/checks/clock.cpp b/src/libs/3rdparty/botan/checks/clock.cpp new file mode 100644 index 00000000000..e5565ff9c2e --- /dev/null +++ b/src/libs/3rdparty/botan/checks/clock.cpp @@ -0,0 +1,82 @@ +#include "timer.h" +#include + +/************************************************* +* Platform specific settings for which clock type to use +*/ + +#if !defined(USE_CLOCK_GETTIME) && defined(BOTAN_TARGET_OS_IS_LINUX) + #define USE_GETTIMEOFDAY 1 +#endif + +#if !defined(USE_GETTIMEOFDAY) && defined(BOTAN_TARGET_OS_IS_FREEBSD) + #define USE_GETTIMEOFDAY 1 +#endif + +/************************************************* + Set the default, which is clock +*/ +#ifndef USE_CLOCK_GETTIME + #define USE_CLOCK_GETTIME 0 +#endif + +#ifndef USE_GETTIMEOFDAY + #define USE_GETTIMEOFDAY 0 +#endif + +#ifndef USE_TIMES + #define USE_TIMES 0 +#endif + +/* the default: ANSI/ISO clock */ +#ifndef USE_CLOCK + #define USE_CLOCK 1 +#endif + +#if USE_CLOCK_GETTIME + #include +#elif USE_GETTIMEOFDAY + #include +#elif USE_TIMES + #include + #include +#elif USE_CLOCK + #include +#endif + +/* The implementation: */ +u64bit Timer::get_clock() + { + static const u64bit billion = 1000000000; + +#if USE_CLOCK_GETTIME + + struct timespec tv; + clock_gettime(CLOCK_REALTIME, &tv); + return (billion * tv.tv_sec + tv.tv_nsec); + +#elif USE_GETTIMEOFDAY + + struct timeval tv; + gettimeofday(&tv, 0); + return (billion * tv.tv_sec + 1000 * tv.tv_usec); + +#elif USE_TIMES + + struct tms tms; + times(&tms); + + static const u64bit clocks_to_nanoseconds = + (billion / sysconf(_SC_CLK_TCK)); + + return (tms.tms_utime * clocks_to_nanoseconds); + +#elif USE_CLOCK + + static const u64bit clocks_to_nanoseconds = + (billion / CLOCKS_PER_SEC); + + return clock() * clocks_to_nanoseconds; + +#endif + } diff --git a/src/libs/3rdparty/botan/checks/common.h b/src/libs/3rdparty/botan/checks/common.h new file mode 100644 index 00000000000..fa41882ee4b --- /dev/null +++ b/src/libs/3rdparty/botan/checks/common.h @@ -0,0 +1,100 @@ +// common code for the validation and benchmark code + +#ifndef BOTAN_CHECK_COMMON_H__ +#define BOTAN_CHECK_COMMON_H__ + +#include +#include +#include +#include + +#include +#include +#include + +using Botan::byte; +using Botan::u32bit; + +struct algorithm + { + algorithm(const char* t, const char* n, + u32bit k = 0, u32bit i = 0) : + type(t), name(n), filtername(n), keylen(k), ivlen(i) {} + algorithm(const char* t, const char* n, + const char* f, u32bit k = 0, u32bit i = 0) : + type(t), name(n), filtername(f), keylen(k), ivlen(i) {} + std::string type, name, filtername; + u32bit keylen, ivlen, weight; + }; + +std::vector get_algos(); + +void strip_comments(std::string& line); +void strip_newlines(std::string& line); +void strip(std::string& line); +std::vector parse(const std::string& line); + +std::string hex_encode(const byte in[], u32bit len); +Botan::SecureVector decode_hex(const std::string&); + +Botan::Filter* lookup(const std::string& algname, + const std::vector& params, + const std::string& section); + +Botan::Filter* lookup_block(const std::string&, const std::string&); +Botan::Filter* lookup_cipher(const std::string&, const std::string&, + const std::string&, bool); +Botan::Filter* lookup_hash(const std::string&); +Botan::Filter* lookup_mac(const std::string&, const std::string&); +Botan::Filter* lookup_rng(const std::string&, const std::string&); +Botan::Filter* lookup_encoder(const std::string&); +Botan::Filter* lookup_s2k(const std::string&, const std::vector&); +Botan::Filter* lookup_kdf(const std::string&, const std::string&, + const std::string&); + +class Fixed_Output_RNG : public Botan::RandomNumberGenerator + { + public: + bool is_seeded() const { return !buf.empty(); } + + byte random() + { + if(buf.empty()) + throw std::runtime_error("Out of bytes"); + + byte out = buf.front(); + buf.pop_front(); + return out; + } + + void reseed(u32bit) {} + + void randomize(byte out[], u32bit len) + { + for(u32bit j = 0; j != len; j++) + out[j] = random(); + } + + std::string name() const { return "Fixed_Output_RNG"; } + + void add_entropy_source(Botan::EntropySource* src) { delete src; } + void add_entropy(const byte[], u32bit) {}; + + void clear() throw() {} + + Fixed_Output_RNG(const Botan::SecureVector& in) + { + buf.insert(buf.end(), in.begin(), in.begin() + in.size()); + } + Fixed_Output_RNG(const std::string& in_str) + { + Botan::SecureVector in = decode_hex(in_str); + buf.insert(buf.end(), in.begin(), in.begin() + in.size()); + } + + Fixed_Output_RNG() {} + private: + std::deque buf; + }; + +#endif diff --git a/src/libs/3rdparty/botan/checks/cvc_tests.cpp b/src/libs/3rdparty/botan/checks/cvc_tests.cpp new file mode 100644 index 00000000000..792e9c58d77 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/cvc_tests.cpp @@ -0,0 +1,600 @@ +/****************************************************** +* CVC EAC1.1 tests * +* * +* (C) 2008 Falko Strenzke * +* strenzke@flexsecure.de * +* 2008 Jack Lloyd * +******************************************************/ + +#include "validate.h" +#include + +#if defined(BOTAN_HAS_CARD_VERIFIABLE_CERTIFICATES) + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_DATA_DIR "checks/ecc_testdata" + +using namespace Botan; + +#define CHECK_MESSAGE(expr, print) try { if(!(expr)) std::cout << print << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } +#define CHECK(expr) try { if(!(expr)) std::cout << #expr << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } + +namespace { + +// helper functions +void helper_write_file(EAC_Signed_Object const& to_write, std::string const& file_path) + { + SecureVector sv = to_write.BER_encode(); + std::ofstream cert_file(file_path.c_str(), std::ios::binary); + cert_file.write((char*)sv.begin(), sv.size()); + cert_file.close(); + } + +bool helper_files_equal(std::string const& file_path1, std::string const& file_path2) + { + std::ifstream cert_1_in(file_path1.c_str()); + std::ifstream cert_2_in(file_path2.c_str()); + SecureVector sv1; + SecureVector sv2; + if (!cert_1_in || !cert_2_in) + { + return false; + } + while (!cert_1_in.eof()) + { + char now; + cert_1_in.read(&now, 1); + sv1.append(now); + } + while (!cert_2_in.eof()) + { + char now; + cert_2_in.read(&now, 1); + sv2.append(now); + } + if (sv1.size() == 0) + { + return false; + } + return sv1 == sv2; + } + +void test_enc_gen_selfsigned(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + EAC1_1_CVC_Options opts; + //opts.cpi = 0; + opts.chr = ASN1_Chr("my_opt_chr"); // not used + opts.car = ASN1_Car("my_opt_car"); + opts.cex = ASN1_Cex("2010 08 13"); + opts.ced = ASN1_Ced("2010 07 27"); + opts.holder_auth_templ = 0xC1; + opts.hash_alg = "SHA-256"; + + // creating a non sense selfsigned cert w/o dom pars + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.36.3.3.2.8.1.1.11")); + ECDSA_PrivateKey key(rng, dom_pars); + key.set_parameter_encoding(ENC_IMPLICITCA); + EAC1_1_CVC cert = CVC_EAC::create_self_signed_cert(key, opts, rng); + + SecureVector der(cert.BER_encode()); + std::ofstream cert_file; + cert_file.open(TEST_DATA_DIR "/my_cv_cert.ber", std::ios::binary); + //cert_file << der; // this is bad !!! + cert_file.write((char*)der.begin(), der.size()); + cert_file.close(); + + EAC1_1_CVC cert_in(TEST_DATA_DIR "/my_cv_cert.ber"); + CHECK(cert == cert_in); + // encoding it again while it has no dp + SecureVector der2(cert_in.BER_encode()); + std::ofstream cert_file2(TEST_DATA_DIR "/my_cv_cert2.ber", std::ios::binary); + cert_file2.write((char*)der2.begin(), der2.size()); + cert_file2.close(); + // read both and compare them + std::ifstream cert_1_in(TEST_DATA_DIR "/my_cv_cert.ber"); + std::ifstream cert_2_in(TEST_DATA_DIR "/my_cv_cert2.ber"); + SecureVector sv1; + SecureVector sv2; + if (!cert_1_in || !cert_2_in) + { + CHECK_MESSAGE(false, "could not read certificate files"); + } + while (!cert_1_in.eof()) + { + char now; + + cert_1_in.read(&now, 1); + sv1.append(now); + } + while (!cert_2_in.eof()) + { + char now; + cert_2_in.read(&now, 1); + sv2.append(now); + } + CHECK(sv1.size() > 10); + CHECK_MESSAGE(sv1 == sv2, "reencoded file of cert without domain parameters is different from original"); + + //cout << "reading cert again\n"; + CHECK(cert_in.get_car().value() == "my_opt_car"); + CHECK(cert_in.get_chr().value() == "my_opt_car"); + CHECK(cert_in.get_ced().as_string() == "20100727"); + CHECK(cert_in.get_ced().readable_string() == "2010/07/27 "); + + bool ill_date_exc = false; + try + { + ASN1_Ced("1999 01 01"); + } + catch (...) + { + ill_date_exc = true; + } + CHECK(ill_date_exc); + + bool ill_date_exc2 = false; + try + { + ASN1_Ced("2100 01 01"); + } + catch (...) + { + ill_date_exc2 = true; + } + CHECK(ill_date_exc2); + //cout << "readable = '" << cert_in.get_ced().readable_string() << "'\n"; + std::auto_ptr p_pk = cert_in.subject_public_key(); + //auto_ptr ecdsa_pk = dynamic_cast >(p_pk); + ECDSA_PublicKey* p_ecdsa_pk = dynamic_cast(p_pk.get()); + // letΒ΄s see if encoding is truely implicitca, because this is what the key should have + // been set to when decoding (see above)(because it has no domain params): + //cout << "encoding = " << p_ecdsa_pk->get_parameter_encoding() << std::endl; + CHECK(p_ecdsa_pk->get_parameter_encoding() == ENC_IMPLICITCA); + bool exc = false; + try + { + std::cout << "order = " << p_ecdsa_pk->domain_parameters().get_order() << std::endl; + } + catch (Invalid_State) + { + exc = true; + } + CHECK(exc); + // set them and try again + //cert_in.set_domain_parameters(dom_pars); + std::auto_ptr p_pk2 = cert_in.subject_public_key(); + ECDSA_PublicKey* p_ecdsa_pk2 = dynamic_cast(p_pk2.get()); + p_ecdsa_pk2->set_domain_parameters(dom_pars); + CHECK(p_ecdsa_pk2->domain_parameters().get_order() == dom_pars.get_order()); + bool ver_ec = cert_in.check_signature(*p_pk2); + CHECK_MESSAGE(ver_ec, "could not positively verify correct selfsigned cvc certificate"); + } + +void test_enc_gen_req(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + EAC1_1_CVC_Options opts; + + //opts.cpi = 0; + opts.chr = ASN1_Chr("my_opt_chr"); + opts.hash_alg = "SHA-160"; + + // creating a non sense selfsigned cert w/o dom pars + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + ECDSA_PrivateKey key(rng, dom_pars); + key.set_parameter_encoding(ENC_IMPLICITCA); + EAC1_1_Req req = CVC_EAC::create_cvc_req(key, opts.chr, opts.hash_alg, rng); + SecureVector der(req.BER_encode()); + std::ofstream req_file(TEST_DATA_DIR "/my_cv_req.ber", std::ios::binary); + req_file.write((char*)der.begin(), der.size()); + req_file.close(); + + // read and check signature... + EAC1_1_Req req_in(TEST_DATA_DIR "/my_cv_req.ber"); + //req_in.set_domain_parameters(dom_pars); + std::auto_ptr p_pk = req_in.subject_public_key(); + ECDSA_PublicKey* p_ecdsa_pk = dynamic_cast(p_pk.get()); + p_ecdsa_pk->set_domain_parameters(dom_pars); + CHECK(p_ecdsa_pk->domain_parameters().get_order() == dom_pars.get_order()); + bool ver_ec = req_in.check_signature(*p_pk); + CHECK_MESSAGE(ver_ec, "could not positively verify correct selfsigned (created by myself) cvc request"); + } + +void test_cvc_req_ext(RandomNumberGenerator&) + { + std::cout << "." << std::flush; + + EAC1_1_Req req_in(TEST_DATA_DIR "/DE1_flen_chars_cvcRequest_ECDSA.der"); + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.36.3.3.2.8.1.1.5")); // "german curve" + //req_in.set_domain_parameters(dom_pars); + std::auto_ptr p_pk = req_in.subject_public_key(); + ECDSA_PublicKey* p_ecdsa_pk = dynamic_cast(p_pk.get()); + p_ecdsa_pk->set_domain_parameters(dom_pars); + CHECK(p_ecdsa_pk->domain_parameters().get_order() == dom_pars.get_order()); + bool ver_ec = req_in.check_signature(*p_pk); + CHECK_MESSAGE(ver_ec, "could not positively verify correct selfsigned (external testdata) cvc request"); + } + +void test_cvc_ado_ext(RandomNumberGenerator&) + { + std::cout << "." << std::flush; + + EAC1_1_ADO req_in(TEST_DATA_DIR "/ado.cvcreq"); + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.36.3.3.2.8.1.1.5")); // "german curve" + //cout << "car = " << req_in.get_car().value() << std::endl; + //req_in.set_domain_parameters(dom_pars); + } + +void test_cvc_ado_creation(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + EAC1_1_CVC_Options opts; + //opts.cpi = 0; + opts.chr = ASN1_Chr("my_opt_chr"); + opts.hash_alg = "SHA-256"; + + // creating a non sense selfsigned cert w/o dom pars + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.36.3.3.2.8.1.1.11")); + //cout << "mod = " << hex << dom_pars.get_curve().get_p() << std::endl; + ECDSA_PrivateKey req_key(rng, dom_pars); + req_key.set_parameter_encoding(ENC_IMPLICITCA); + //EAC1_1_Req req = CVC_EAC::create_cvc_req(req_key, opts); + EAC1_1_Req req = CVC_EAC::create_cvc_req(req_key, opts.chr, opts.hash_alg, rng); + SecureVector der(req.BER_encode()); + std::ofstream req_file(TEST_DATA_DIR "/my_cv_req.ber", std::ios::binary); + req_file.write((char*)der.begin(), der.size()); + req_file.close(); + + // create an ado with that req + ECDSA_PrivateKey ado_key(rng, dom_pars); + EAC1_1_CVC_Options ado_opts; + ado_opts.car = ASN1_Car("my_ado_car"); + ado_opts.hash_alg = "SHA-256"; // must be equal to reqΒ΄s hash alg, because ado takes his sig_algo from itΒ΄s request + + //EAC1_1_ADO ado = CVC_EAC::create_ado_req(ado_key, req, ado_opts); + EAC1_1_ADO ado = CVC_EAC::create_ado_req(ado_key, req, ado_opts.car, rng); + CHECK_MESSAGE(ado.check_signature(ado_key), "failure of ado verification after creation"); + + std::ofstream ado_file(TEST_DATA_DIR "/ado", std::ios::binary); + SecureVector ado_der(ado.BER_encode()); + ado_file.write((char*)ado_der.begin(), ado_der.size()); + ado_file.close(); + // read it again and check the signature + EAC1_1_ADO ado2(TEST_DATA_DIR "/ado"); + CHECK(ado == ado2); + //ECDSA_PublicKey* p_ado_pk = dynamic_cast(&ado_key); + //bool ver = ado2.check_signature(*p_ado_pk); + bool ver = ado2.check_signature(ado_key); + CHECK_MESSAGE(ver, "failure of ado verification after reloading"); + } + +void test_cvc_ado_comparison(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + EAC1_1_CVC_Options opts; + //opts.cpi = 0; + opts.chr = ASN1_Chr("my_opt_chr"); + opts.hash_alg = "SHA-224"; + + // creating a non sense selfsigned cert w/o dom pars + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.36.3.3.2.8.1.1.11")); + ECDSA_PrivateKey req_key(rng, dom_pars); + req_key.set_parameter_encoding(ENC_IMPLICITCA); + //EAC1_1_Req req = CVC_EAC::create_cvc_req(req_key, opts); + EAC1_1_Req req = CVC_EAC::create_cvc_req(req_key, opts.chr, opts.hash_alg, rng); + + + // create an ado with that req + ECDSA_PrivateKey ado_key(rng, dom_pars); + EAC1_1_CVC_Options ado_opts; + ado_opts.car = ASN1_Car("my_ado_car1"); + ado_opts.hash_alg = "SHA-224"; // must be equal to req's hash alg, because ado takes his sig_algo from it's request + //EAC1_1_ADO ado = CVC_EAC::create_ado_req(ado_key, req, ado_opts); + EAC1_1_ADO ado = CVC_EAC::create_ado_req(ado_key, req, ado_opts.car, rng); + CHECK_MESSAGE(ado.check_signature(ado_key), "failure of ado verification after creation"); + // make a second one for comparison + EAC1_1_CVC_Options opts2; + //opts2.cpi = 0; + opts2.chr = ASN1_Chr("my_opt_chr"); + opts2.hash_alg = "SHA-160"; // this is the only difference + ECDSA_PrivateKey req_key2(rng, dom_pars); + req_key.set_parameter_encoding(ENC_IMPLICITCA); + //EAC1_1_Req req2 = CVC_EAC::create_cvc_req(req_key2, opts2, rng); + EAC1_1_Req req2 = CVC_EAC::create_cvc_req(req_key2, opts2.chr, opts2.hash_alg, rng); + ECDSA_PrivateKey ado_key2(rng, dom_pars); + EAC1_1_CVC_Options ado_opts2; + ado_opts2.car = ASN1_Car("my_ado_car1"); + ado_opts2.hash_alg = "SHA-160"; // must be equal to req's hash alg, because ado takes his sig_algo from it's request + + EAC1_1_ADO ado2 = CVC_EAC::create_ado_req(ado_key2, req2, ado_opts2.car, rng); + CHECK_MESSAGE(ado2.check_signature(ado_key2), "failure of ado verification after creation"); + + CHECK_MESSAGE(ado != ado2, "ado's found to be equal where they are not"); + // std::ofstream ado_file(TEST_DATA_DIR "/ado"); + // SecureVector ado_der(ado.BER_encode()); + // ado_file.write((char*)ado_der.begin(), ado_der.size()); + // ado_file.close(); + // read it again and check the signature + + // EAC1_1_ADO ado2(TEST_DATA_DIR "/ado"); + // ECDSA_PublicKey* p_ado_pk = dynamic_cast(&ado_key); + // //bool ver = ado2.check_signature(*p_ado_pk); + // bool ver = ado2.check_signature(ado_key); + // CHECK_MESSAGE(ver, "failure of ado verification after reloading"); + } + +void test_eac_time(RandomNumberGenerator&) + { + std::cout << "." << std::flush; + + const u64bit current_time = system_time(); + EAC_Time time(current_time); + // std::cout << "time as std::string = " << time.as_string() << std::endl; + EAC_Time sooner("", ASN1_Tag(99)); + //X509_Time sooner("", ASN1_Tag(99)); + sooner.set_to("2007 12 12"); + // std::cout << "sooner as std::string = " << sooner.as_string() << std::endl; + EAC_Time later("2007 12 13"); + //X509_Time later("2007 12 13"); + // std::cout << "later as std::string = " << later.as_string() << std::endl; + CHECK(sooner <= later); + CHECK(sooner == sooner); + + ASN1_Cex my_cex("2007 08 01"); + my_cex.add_months(12); + CHECK(my_cex.get_year() == 2008); + CHECK_MESSAGE(my_cex.get_month() == 8, "shoult be 8, was " << my_cex.get_month()); + + my_cex.add_months(4); + CHECK(my_cex.get_year() == 2008); + CHECK(my_cex.get_month() == 12); + + my_cex.add_months(4); + CHECK(my_cex.get_year() == 2009); + CHECK(my_cex.get_month() == 4); + + my_cex.add_months(41); + CHECK(my_cex.get_year() == 2012); + CHECK(my_cex.get_month() == 9); + + + + } + +void test_ver_cvca(RandomNumberGenerator&) + { + std::cout << "." << std::flush; + + EAC1_1_CVC req_in(TEST_DATA_DIR "/cvca01.cv.crt"); + + //auto_ptr ecdsa_pk = dynamic_cast >(p_pk); + //ECDSA_PublicKey* p_ecdsa_pk = dynamic_cast(p_pk.get()); + bool exc = false; + + std::auto_ptr p_pk2 = req_in.subject_public_key(); + ECDSA_PublicKey* p_ecdsa_pk2 = dynamic_cast(p_pk2.get()); + bool ver_ec = req_in.check_signature(*p_pk2); + CHECK_MESSAGE(ver_ec, "could not positively verify correct selfsigned cvca certificate"); + + try + { + p_ecdsa_pk2->domain_parameters().get_order(); + } + catch (Invalid_State) + { + exc = true; + } + CHECK(!exc); + } + +void test_copy_and_assignment(RandomNumberGenerator&) + { + std::cout << "." << std::flush; + + EAC1_1_CVC cert_in(TEST_DATA_DIR "/cvca01.cv.crt"); + EAC1_1_CVC cert_cp(cert_in); + EAC1_1_CVC cert_ass = cert_in; + CHECK(cert_in == cert_cp); + CHECK(cert_in == cert_ass); + + EAC1_1_ADO ado_in(TEST_DATA_DIR "/ado.cvcreq"); + //EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.36.3.3.2.8.1.1.5")); // "german curve" + EAC1_1_ADO ado_cp(ado_in); + EAC1_1_ADO ado_ass = ado_in; + CHECK(ado_in == ado_cp); + CHECK(ado_in == ado_ass); + + EAC1_1_Req req_in(TEST_DATA_DIR "/DE1_flen_chars_cvcRequest_ECDSA.der"); + //EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.36.3.3.2.8.1.1.5")); // "german curve" + EAC1_1_Req req_cp(req_in); + EAC1_1_Req req_ass = req_in; + CHECK(req_in == req_cp); + CHECK(req_in == req_ass); + } + +void test_eac_str_illegal_values(RandomNumberGenerator&) + { + std::cout << "." << std::flush; + + bool exc = false; + try + { + EAC1_1_CVC(TEST_DATA_DIR "/cvca_illegal_chars.cv.crt"); + + } + catch (Decoding_Error) + { + exc = true; + } + CHECK(exc); + + bool exc2 = false; + try + { + EAC1_1_CVC(TEST_DATA_DIR "/cvca_illegal_chars2.cv.crt"); + + } + catch (Decoding_Error) + { + exc2 = true; + } + CHECK(exc2); + } + +void test_tmp_eac_str_enc(RandomNumberGenerator&) + { + std::cout << "." << std::flush; + + bool exc = false; + try + { + ASN1_Car("abc!+-Β΅\n"); + } + catch (Invalid_Argument) + { + exc = true; + } + CHECK(exc); + // std::string val = car.iso_8859(); + // std::cout << "car 8859 = " << val << std::endl; + // std::cout << hex <<(unsigned char)val[1] << std::endl; + + + } + +void test_cvc_chain(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.36.3.3.2.8.1.1.5")); // "german curve" + ECDSA_PrivateKey cvca_privk(rng, dom_pars); + std::string hash("SHA-224"); + ASN1_Car car("DECVCA00001"); + EAC1_1_CVC cvca_cert = DE_EAC::create_cvca(cvca_privk, hash, car, true, true, 12, rng); + std::ofstream cvca_file(TEST_DATA_DIR "/cvc_chain_cvca.cer", std::ios::binary); + SecureVector cvca_sv = cvca_cert.BER_encode(); + cvca_file.write((char*)cvca_sv.begin(), cvca_sv.size()); + cvca_file.close(); + + ECDSA_PrivateKey cvca_privk2(rng, dom_pars); + ASN1_Car car2("DECVCA00002"); + EAC1_1_CVC cvca_cert2 = DE_EAC::create_cvca(cvca_privk2, hash, car2, true, true, 12, rng); + EAC1_1_CVC link12 = DE_EAC::link_cvca(cvca_cert, cvca_privk, cvca_cert2, rng); + SecureVector link12_sv = link12.BER_encode(); + std::ofstream link12_file(TEST_DATA_DIR "/cvc_chain_link12.cer", std::ios::binary); + link12_file.write((char*)link12_sv.begin(), link12_sv.size()); + link12_file.close(); + + // verify the link + CHECK(link12.check_signature(cvca_privk)); + EAC1_1_CVC link12_reloaded(TEST_DATA_DIR "/cvc_chain_link12.cer"); + EAC1_1_CVC cvca1_reloaded(TEST_DATA_DIR "/cvc_chain_cvca.cer"); + std::auto_ptr cvca1_rel_pk = cvca1_reloaded.subject_public_key(); + CHECK(link12_reloaded.check_signature(*cvca1_rel_pk)); + + // create first round dvca-req + ECDSA_PrivateKey dvca_priv_key(rng, dom_pars); + EAC1_1_Req dvca_req = DE_EAC::create_cvc_req(dvca_priv_key, ASN1_Chr("DEDVCAEPASS"), hash, rng); + std::ofstream dvca_file(TEST_DATA_DIR "/cvc_chain_dvca_req.cer", std::ios::binary); + SecureVector dvca_sv = dvca_req.BER_encode(); + dvca_file.write((char*)dvca_sv.begin(), dvca_sv.size()); + dvca_file.close(); + + // sign the dvca_request + EAC1_1_CVC dvca_cert1 = DE_EAC::sign_request(cvca_cert, cvca_privk, dvca_req, 1, 5, true, 3, 1, rng); + CHECK(dvca_cert1.get_car().iso_8859() == "DECVCA00001"); + CHECK(dvca_cert1.get_chr().iso_8859() == "DEDVCAEPASS00001"); + helper_write_file(dvca_cert1, TEST_DATA_DIR "/cvc_chain_dvca_cert1.cer"); + + // make a second round dvca ado request + ECDSA_PrivateKey dvca_priv_key2(rng, dom_pars); + EAC1_1_Req dvca_req2 = DE_EAC::create_cvc_req(dvca_priv_key2, ASN1_Chr("DEDVCAEPASS"), hash, rng); + std::ofstream dvca_file2(TEST_DATA_DIR "/cvc_chain_dvca_req2.cer", std::ios::binary); + SecureVector dvca_sv2 = dvca_req2.BER_encode(); + dvca_file2.write((char*)dvca_sv2.begin(), dvca_sv2.size()); + dvca_file2.close(); + EAC1_1_ADO dvca_ado2 = CVC_EAC::create_ado_req(dvca_priv_key, dvca_req2, + ASN1_Car(dvca_cert1.get_chr().iso_8859()), rng); + helper_write_file(dvca_ado2, TEST_DATA_DIR "/cvc_chain_dvca_ado2.cer"); + + // verify the ado and sign the request too + + std::auto_ptr ap_pk = dvca_cert1.subject_public_key(); + ECDSA_PublicKey* cert_pk = dynamic_cast(ap_pk.get()); + + cert_pk->set_domain_parameters(dom_pars); + //std::cout << "dvca_cert.public_point.size() = " << ec::EC2OSP(cert_pk->get_public_point(), ec::PointGFp::COMPRESSED).size() << std::endl; + EAC1_1_CVC dvca_cert1_reread(TEST_DATA_DIR "/cvc_chain_cvca.cer"); + CHECK(dvca_ado2.check_signature(*cert_pk)); + + CHECK(dvca_ado2.check_signature(dvca_priv_key)); // must also work + + EAC1_1_Req dvca_req2b = dvca_ado2.get_request(); + helper_write_file(dvca_req2b, TEST_DATA_DIR "/cvc_chain_dvca_req2b.cer"); + CHECK(helper_files_equal(TEST_DATA_DIR "/cvc_chain_dvca_req2b.cer", TEST_DATA_DIR "/cvc_chain_dvca_req2.cer")); + EAC1_1_CVC dvca_cert2 = DE_EAC::sign_request(cvca_cert, cvca_privk, dvca_req2b, 2, 5, true, 3, 1, rng); + CHECK(dvca_cert2.get_car().iso_8859() == "DECVCA00001"); + CHECK_MESSAGE(dvca_cert2.get_chr().iso_8859() == "DEDVCAEPASS00002", + "chr = " << dvca_cert2.get_chr().iso_8859()); + + // make a first round IS request + ECDSA_PrivateKey is_priv_key(rng, dom_pars); + EAC1_1_Req is_req = DE_EAC::create_cvc_req(is_priv_key, ASN1_Chr("DEIS"), hash, rng); + helper_write_file(is_req, TEST_DATA_DIR "/cvc_chain_is_req.cer"); + + // sign the IS request + //dvca_cert1.set_domain_parameters(dom_pars); + EAC1_1_CVC is_cert1 = DE_EAC::sign_request(dvca_cert1, dvca_priv_key, is_req, 1, 5, true, 3, 1, rng); + CHECK_MESSAGE(is_cert1.get_car().iso_8859() == "DEDVCAEPASS00001", "car = " << is_cert1.get_car().iso_8859()); + CHECK(is_cert1.get_chr().iso_8859() == "DEIS00001"); + helper_write_file(is_cert1, TEST_DATA_DIR "/cvc_chain_is_cert.cer"); + + // verify the signature of the certificate + CHECK(is_cert1.check_signature(dvca_priv_key)); + } + +} + +u32bit do_cvc_tests(Botan::RandomNumberGenerator& rng) + { + test_enc_gen_selfsigned(rng); + test_enc_gen_req(rng); + test_cvc_req_ext(rng); + test_cvc_ado_ext(rng); + test_cvc_ado_creation(rng); + test_cvc_ado_comparison(rng); + test_eac_time(rng); + test_ver_cvca(rng); + test_copy_and_assignment(rng); + test_eac_str_illegal_values(rng); + test_tmp_eac_str_enc(rng); + test_cvc_chain(rng); + + return 0; + } +#else +u32bit do_cvc_tests(Botan::RandomNumberGenerator&) { return 0; } +#endif diff --git a/src/libs/3rdparty/botan/checks/dolook.cpp b/src/libs/3rdparty/botan/checks/dolook.cpp new file mode 100644 index 00000000000..0c20448afb0 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/dolook.cpp @@ -0,0 +1,130 @@ +#include +#include + +#include +#include +#include + +#ifdef BOTAN_HAS_COMPRESSOR_BZIP2 +#include +#endif + +#ifdef BOTAN_HAS_COMPRESSOR_GZIP +#include +#endif + +#ifdef BOTAN_HAS_COMPRESSOR_ZLIB +#include +#endif + +using namespace Botan; + +#include "common.h" + +Filter* lookup(const std::string& algname, + const std::vector& params, + const std::string& section) + { + std::string key = params[0]; + std::string iv = params[1]; + Filter* filter = 0; + + // The order of the lookup has to change based on how the names are + // formatted and parsed. + filter = lookup_kdf(algname, key, iv); + if(filter) return filter; + + if(section == "Cipher Modes (Decryption)") + filter = lookup_cipher(algname, key, iv, false); + else + filter = lookup_cipher(algname, key, iv, true); + if(filter) return filter; + + filter = lookup_block(algname, key); + if(filter) return filter; + + filter = lookup_rng(algname, key); + if(filter) return filter; + + filter = lookup_encoder(algname); + if(filter) return filter; + + filter = lookup_hash(algname); + if(filter) return filter; + + filter = lookup_mac(algname, key); + if(filter) return filter; + + filter = lookup_s2k(algname, params); + if(filter) return filter; + + return 0; + } + +Filter* lookup_hash(const std::string& algname) + { + Filter* hash = 0; + + try { + hash = new Hash_Filter(algname); + } + catch(Algorithm_Not_Found) {} + + return hash; + } + +Filter* lookup_mac(const std::string& algname, const std::string& key) + { + Filter* mac = 0; + try { + mac = new MAC_Filter(algname, key); + } + catch(Algorithm_Not_Found) {} + + return mac; + } + +Filter* lookup_cipher(const std::string& algname, const std::string& key, + const std::string& iv, bool encrypt) + { + try { + if(encrypt) + return get_cipher(algname, key, iv, ENCRYPTION); + else + return get_cipher(algname, key, iv, DECRYPTION); + } + catch(Algorithm_Not_Found) {} + catch(Invalid_Algorithm_Name) {} + return 0; + } + +Filter* lookup_encoder(const std::string& algname) + { + if(algname == "Base64_Encode") + return new Base64_Encoder; + if(algname == "Base64_Decode") + return new Base64_Decoder; + +#ifdef BOTAN_HAS_COMPRESSOR_BZIP2 + if(algname == "Bzip_Compression") + return new Bzip_Compression(9); + if(algname == "Bzip_Decompression") + return new Bzip_Decompression; +#endif + +#ifdef BOTAN_HAS_COMPRESSOR_GZIP + if(algname == "Gzip_Compression") + return new Gzip_Compression(9); + if(algname == "Gzip_Decompression") + return new Gzip_Decompression; +#endif + +#ifdef BOTAN_HAS_COMPRESSOR_ZLIB + if(algname == "Zlib_Compression") + return new Zlib_Compression(9); + if(algname == "Zlib_Decompression") + return new Zlib_Decompression; +#endif + + return 0; + } diff --git a/src/libs/3rdparty/botan/checks/dolook2.cpp b/src/libs/3rdparty/botan/checks/dolook2.cpp new file mode 100644 index 00000000000..51ee8fec169 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/dolook2.cpp @@ -0,0 +1,212 @@ +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#if defined(BOTAN_HAS_RANDPOOL) + #include +#endif + +#if defined(BOTAN_HAS_HMAC_RNG) + #include +#endif + +#if defined(BOTAN_HAS_X931_RNG) + #include + #include +#endif + +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) + #include +#endif + +#include "common.h" +using namespace Botan; + + +/* A weird little hack to fit S2K algorithms into the validation suite + You probably wouldn't ever want to actually use the S2K algorithms like + this, the raw S2K interface is more convenient for actually using them +*/ +class S2K_Filter : public Filter + { + public: + void write(const byte in[], u32bit len) + { passphrase += std::string(reinterpret_cast(in), len); } + void end_msg() + { + s2k->change_salt(salt, salt.size()); + s2k->set_iterations(iterations); + SymmetricKey x = s2k->derive_key(outlen, passphrase); + send(x.bits_of()); + } + S2K_Filter(S2K* algo, const SymmetricKey& s, u32bit o, u32bit i) + { + s2k = algo; + outlen = o; + iterations = i; + salt = s.bits_of(); + + } + ~S2K_Filter() { delete s2k; } + private: + std::string passphrase; + S2K* s2k; + SecureVector salt; + u32bit outlen, iterations; + }; + +/* Not too useful generally; just dumps random bits for benchmarking */ +class RNG_Filter : public Filter + { + public: + void write(const byte[], u32bit); + + RNG_Filter(RandomNumberGenerator* r) : rng(r) {} + ~RNG_Filter() { delete rng; } + private: + RandomNumberGenerator* rng; + }; + +class KDF_Filter : public Filter + { + public: + void write(const byte in[], u32bit len) + { secret.append(in, len); } + void end_msg() + { + SymmetricKey x = kdf->derive_key(outlen, + secret, secret.size(), + salt, salt.size()); + send(x.bits_of(), x.length()); + } + KDF_Filter(KDF* algo, const SymmetricKey& s, u32bit o) + { + kdf = algo; + outlen = o; + salt = s.bits_of(); + } + ~KDF_Filter() { delete kdf; } + private: + SecureVector secret; + SecureVector salt; + KDF* kdf; + u32bit outlen; + }; + +Filter* lookup_s2k(const std::string& algname, + const std::vector& params) + { + S2K* s2k = 0; + + try { + s2k = get_s2k(algname); + } + catch(...) { } + + if(s2k) + return new S2K_Filter(s2k, params[0], to_u32bit(params[1]), + to_u32bit(params[2])); + return 0; + } + +void RNG_Filter::write(const byte[], u32bit length) + { + if(length) + { + SecureVector out(length); + rng->randomize(out, out.size()); + send(out); + } + } + +Filter* lookup_rng(const std::string& algname, + const std::string& key) + { + RandomNumberGenerator* prng = 0; + +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) + if(algname == "AutoSeeded") + prng = new AutoSeeded_RNG; +#endif + +#if defined(BOTAN_HAS_X931_RNG) + if(algname == "X9.31-RNG(TripleDES)") + prng = new ANSI_X931_RNG(new TripleDES, + new Fixed_Output_RNG(decode_hex(key))); + else if(algname == "X9.31-RNG(AES-128)") + prng = new ANSI_X931_RNG(new AES_128, + new Fixed_Output_RNG(decode_hex(key))); + else if(algname == "X9.31-RNG(AES-192)") + prng = new ANSI_X931_RNG(new AES_192, + new Fixed_Output_RNG(decode_hex(key))); + else if(algname == "X9.31-RNG(AES-256)") + prng = new ANSI_X931_RNG(new AES_256, + new Fixed_Output_RNG(decode_hex(key))); +#endif + +#if defined(BOTAN_HAS_RANDPOOL) + if(algname == "Randpool") + { + prng = new Randpool(new AES_256, new HMAC(new SHA_256)); + + prng->add_entropy(reinterpret_cast(key.c_str()), + key.length()); + } +#endif + +#if defined(BOTAN_HAS_X931_RNG) + // these are used for benchmarking: AES-256/SHA-256 matches library + // defaults, so benchmark reflects real-world performance (maybe) + if(algname == "X9.31-RNG") + { + RandomNumberGenerator* rng = +#if defined(BOTAN_HAS_HMAC_RNG) + new HMAC_RNG(new HMAC(new SHA_512), new HMAC(new SHA_256)); +#elif defined(BOTAN_HAS_RANDPOOL) + new Randpool(new AES_256, new HMAC(new SHA_256)); +#endif + + prng = new ANSI_X931_RNG(new AES_256, rng); + + } +#endif + +#if defined(BOTAN_HAS_HMAC_RNG) + if(algname == "HMAC_RNG") + { + prng = new HMAC_RNG(new HMAC(new SHA_512), new HMAC(new SHA_256)); + } +#endif + + if(prng) + { + prng->add_entropy(reinterpret_cast(key.c_str()), + key.length()); + return new RNG_Filter(prng); + } + + return 0; + } + +Filter* lookup_kdf(const std::string& algname, const std::string& salt, + const std::string& params) + { + KDF* kdf = 0; + try { + kdf = get_kdf(algname); + } + catch(...) { return 0; } + + if(kdf) + return new KDF_Filter(kdf, salt, to_u32bit(params)); + return 0; + } diff --git a/src/libs/3rdparty/botan/checks/ec_tests.cpp b/src/libs/3rdparty/botan/checks/ec_tests.cpp new file mode 100644 index 00000000000..2d25e2153b4 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/ec_tests.cpp @@ -0,0 +1,1223 @@ + +#include +#include "validate.h" + +#if !defined(BOTAN_HAS_ECDSA) + +void do_ec_tests(RandomNumberGenerator&) { return; } + +#else + +#include +#include +#include +#include +#include +#include +#include + +using namespace Botan; + +#include +#include + +#include "getopt.h" + +#include "common.h" + +#define CHECK_MESSAGE(expr, print) try { if(!(expr)) std::cout << print << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } +#define CHECK(expr) try { if(!(expr)) std::cout << #expr << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } + +namespace { + +void test_point_turn_on_sp_red_mul_simple() + { + std::cout << "." << std::flush; + + // setting up expected values + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.36.3.3.2.8.1.1.5")); + PointGFp p(dom_pars.get_base_point()); + p.turn_on_sp_red_mul(); + CHECK(p.get_affine_x().get_value() != BigInt(0)); + } + +void test_point_turn_on_sp_red_mul() + { + std::cout << "." << std::flush; + + // setting up expected values + std::string test_str("test"); + BigInt test_bi(3); + BigInt exp_Qx(std::string("466448783855397898016055842232266600516272889280")); + BigInt exp_Qy(std::string("1110706324081757720403272427311003102474457754220")); + BigInt exp_Qz(1); + + // performing calculation to test + std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; + std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; + std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; + std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; + SecureVector sv_p_secp = decode_hex(p_secp); + SecureVector sv_a_secp = decode_hex(a_secp); + SecureVector sv_b_secp = decode_hex(b_secp); + SecureVector sv_G_secp_comp = decode_hex(G_secp_comp); + BigInt bi_p_secp = BigInt::decode(sv_p_secp.begin(), sv_p_secp.size()); + BigInt bi_a_secp = BigInt::decode(sv_a_secp.begin(), sv_a_secp.size()); + BigInt bi_b_secp = BigInt::decode(sv_b_secp.begin(), sv_b_secp.size()); + CurveGFp secp160r1(GFpElement(bi_p_secp,bi_a_secp), GFpElement(bi_p_secp, bi_b_secp), bi_p_secp); + PointGFp p_G = OS2ECP(sv_G_secp_comp, secp160r1); + + BigInt d("459183204582304"); + + PointGFp r1 = d * p_G; + CHECK(r1.get_affine_x().get_value() != BigInt("0")); + + PointGFp p_G2(p_G); + + p_G2.turn_on_sp_red_mul(); + + PointGFp r2 = d * p_G2; + CHECK_MESSAGE(r1 == r2, "error with point mul after extra turn on sp red mul"); + CHECK(r1.get_affine_x().get_value() != BigInt("0")); + + std::tr1::shared_ptr p_r1(new PointGFp(r1)); + std::tr1::shared_ptr p_r2(new PointGFp(r2)); + + p_r1->mult2_in_place(); // wird fΓΌr Fehler nicht gebraucht + p_r2->turn_on_sp_red_mul(); // 1. t_o() macht nur p_r2 kaputt + p_r2->turn_on_sp_red_mul(); // 2. t_o() macht auch p_r1 kaputt!!! + p_r2->mult2_in_place(); // wird fΓΌr Fehler nicht gebraucht + CHECK_MESSAGE(p_r1->get_affine_x() == p_r2->get_affine_x(), "error with mult2 after extra turn on sp red mul"); + CHECK(p_r1->get_affine_x().get_value() != BigInt("0")); + CHECK(p_r2->get_affine_x().get_value() != BigInt("0")); + r1.mult2_in_place(); + + r2.turn_on_sp_red_mul(); + r2.turn_on_sp_red_mul(); + r2.mult2_in_place(); + + CHECK_MESSAGE(r1 == r2, "error with mult2 after extra turn on sp red mul"); + CHECK_MESSAGE(r1.get_affine_x() == r2.get_affine_x(), "error with mult2 after extra turn on sp red mul"); + CHECK(r1.get_affine_x().get_value() != BigInt("0")); + //std::cout << "r1 x = " << r1.get_affine_x() << endl; + r1 += p_G; + r2 += p_G2; + + CHECK_MESSAGE(r1 == r2, "error with op+= after extra turn on sp red mul"); + + p_G2.turn_on_sp_red_mul(); + + r1 += p_G; + r2 += p_G2; + + CHECK_MESSAGE(r1 == r2, "error with op+= after extra turn on sp red mul for both operands"); + p_G2.turn_on_sp_red_mul(); + r1.turn_on_sp_red_mul(); + r1 += p_G; + r2 += p_G2; + + CHECK_MESSAGE(r1 == r2, "error with op+= after extra turn on sp red mul for both operands"); + } + +void test_coordinates() + { + std::cout << "." << std::flush; + + //Setting up expected values + BigInt exp_x(std::string("1340569834321789103897171369812910390864714275730")); + BigInt exp_y(std::string("1270827321510686389126940426305655825361326281787")); + BigInt exp_z(std::string("407040228325808215747982915914693784055965283940")); + BigInt exp_affine_x(std::string("16984103820118642236896513183038186009872590470")); + BigInt exp_affine_y(std::string("1373093393927139016463695321221277758035357890939")); + + // precalculation + std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; + std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; + std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; + std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; + SecureVector sv_p_secp = decode_hex ( p_secp ); + SecureVector sv_a_secp = decode_hex ( a_secp ); + SecureVector sv_b_secp = decode_hex ( b_secp ); + SecureVector sv_G_secp_comp = decode_hex ( G_secp_comp ); + + BigInt bi_p_secp = BigInt::decode ( sv_p_secp.begin(), sv_p_secp.size() ); + BigInt bi_a_secp = BigInt::decode ( sv_a_secp.begin(), sv_a_secp.size() ); + BigInt bi_b_secp = BigInt::decode ( sv_b_secp.begin(), sv_b_secp.size() ); + CurveGFp secp160r1 ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); + PointGFp p0 = p_G; + PointGFp p1 = p_G.mult2_in_place(); + PointGFp point_exp(secp160r1, GFpElement(bi_p_secp, exp_affine_x), GFpElement(bi_p_secp, exp_affine_y)); + try + { + point_exp.check_invariants(); + } + catch (Illegal_Point e) + { + assert(false); + } + + // testarea + CHECK( p1.get_jac_proj_x().get_value() == exp_x); + CHECK( p1.get_jac_proj_y().get_value() == exp_y); + CHECK( p1.get_jac_proj_z().get_value() == exp_z); + CHECK_MESSAGE( p1.get_affine_x().get_value() == exp_affine_x, " p1_x = " << p1.get_affine_x().get_value() << "\n" << "exp_x = " << exp_affine_x << "\n"); + CHECK_MESSAGE( p1.get_affine_y().get_value() == exp_affine_y, " p1_y = " << p1.get_affine_y().get_value() << "\n" << "exp_y = " << exp_affine_y << "\n"); + } + + +/** +Test point multiplication according to +-------- +SEC 2: Test Vectors for SEC 1 +Certicom Research +Working Draft +September, 1999 +Version 0.3; +Section 2.1.2 +-------- +*/ + +void test_point_transformation () + { + std::cout << "." << std::flush; + + + // get a vailid point + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + PointGFp p = dom_pars.get_base_point(); + + // get a copy + PointGFp q = p; + + //turn on montg. + p.turn_on_sp_red_mul(); + CHECK_MESSAGE( p.get_jac_proj_x().get_value() == q.get_jac_proj_x().get_value(), "projective_x changed while turning on montg.!"); + CHECK_MESSAGE( p.get_jac_proj_y().get_value() == q.get_jac_proj_y().get_value(), "projective_y changed while turning on montg.!"); + CHECK_MESSAGE( p.get_jac_proj_z().get_value() == q.get_jac_proj_z().get_value(), "projective_z changed while turning on montg.!"); + CHECK_MESSAGE( p.get_affine_x().get_value() == q.get_affine_x().get_value(), "affine_x changed while turning on montg.!"); + CHECK_MESSAGE( p.get_affine_y().get_value() == q.get_affine_y().get_value(), "affine_y changed while turning on montg.!"); + } + +void test_point_mult () + { + std::cout << "." << std::flush; + + // setting up expected values + std::string test_str("test"); + BigInt test_bi(3); + BigInt exp_Qx(std::string("466448783855397898016055842232266600516272889280")); + BigInt exp_Qy(std::string("1110706324081757720403272427311003102474457754220")); + BigInt exp_Qz(1); + + // performing calculation to test + std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; + std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; + std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; + std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; + SecureVector sv_p_secp = decode_hex(p_secp); + SecureVector sv_a_secp = decode_hex(a_secp); + SecureVector sv_b_secp = decode_hex(b_secp); + SecureVector sv_G_secp_comp = decode_hex(G_secp_comp); + BigInt bi_p_secp = BigInt::decode(sv_p_secp.begin(), sv_p_secp.size()); + BigInt bi_a_secp = BigInt::decode(sv_a_secp.begin(), sv_a_secp.size()); + BigInt bi_b_secp = BigInt::decode(sv_b_secp.begin(), sv_b_secp.size()); + CurveGFp secp160r1(GFpElement(bi_p_secp,bi_a_secp), GFpElement(bi_p_secp, bi_b_secp), bi_p_secp); + PointGFp p_G = OS2ECP(sv_G_secp_comp, secp160r1); + + SecureVector sv_G_dec = EC2OSP(p_G,0x01); + std::string str_d_U = "aa374ffc3ce144e6b073307972cb6d57b2a4e982"; + SecureVector sv_d_U = decode_hex(str_d_U); + BigInt d_U = BigInt::decode(sv_d_U.begin(), sv_d_U.size()); + PointGFp Q_U = d_U * p_G; + CHECK( Q_U.get_jac_proj_x().get_value() == exp_Qx); + CHECK( Q_U.get_jac_proj_y().get_value() == exp_Qy); + CHECK( Q_U.get_jac_proj_z().get_value() == exp_Qz); + } + +#if 0 +void test_montgm_calc_R () + { + // this tests isntΒ΄t correct anymore. the determination of R has changed + // to be 0 mod word_range. + + // setting up (expected) values + BigInt prime_modulus(101); + u64bit n = prime_modulus.bits(); + BigInt exp_R(128); + // function under test + BigInt calc_R = montgm_calc_r_oddmod(prime_modulus); + CHECK_MESSAGE(exp_R == calc_R, "exp_R = " << exp_R << ", calc_R = " << calc_R << ", n = " << n << "\n"); + + } +#endif + +#if 0 +void test_naive_montg_mult () + { + std::cout << "." << std::flush; + + BigInt a_bar(1); + BigInt b_bar(2); + BigInt m(11); + BigInt m_dash(13); + BigInt r(5); + //BigInt test_res = montg_mult(a_bar, b_bar, m, m_dash, r); + //cout << "test_res = " << test_res << "\n"; + GFpElement a_norm_mult(11, 3); + GFpElement b_norm_mult(11, 5); + GFpElement c_norm_mult = a_norm_mult * b_norm_mult; + //cout << "c_norm_mult = " << c_norm_mult << "\n"; + GFpElement a_mm(11, 3, true); + GFpElement b_mm(11, 5, true); + GFpElement c_mm = a_mm * b_mm; + //cout << "c_mm = " << c_mm << "\n"; + CHECK_MESSAGE(c_norm_mult == c_mm, "c_norm_mult = " << c_norm_mult << "\n" << "c_mm = " << c_mm << "\n"); + } +#endif + +#if 0 + +void test_trf_mres () + { + // this tests isntΒ΄t correct anymore. the determination of R has changed + // to be 0 mod word_range. + + // + BigInt modulus(11); + BigInt r = montgm_calc_r_oddmod(modulus); + //cout << "r = " << r << "\n"; + BigInt r_inv = inverse_mod(r, modulus); + //cout << "r_inv = " << r_inv << "\n"; + // see C43: + BigInt exp_m_dash(13); + BigInt calc_m_dash = montgm_calc_m_dash(r, modulus, r_inv); + CHECK_MESSAGE(exp_m_dash == calc_m_dash, "exp_m_dash = " << exp_m_dash << "\n" << "calc_m_dash = " << calc_m_dash << "\n"); + BigInt ord_res(7); + BigInt exp_m_res(2); // see C43 + BigInt calc_m_res = montg_trf_to_mres(ord_res, r, modulus); + CHECK_MESSAGE(calc_m_res == exp_m_res, "calc_m_res = " << calc_m_res << "\nexp_m_res = " << exp_m_res); + BigInt calc_ord_res_back = montg_trf_to_ordres(calc_m_res,modulus, r_inv); + CHECK_MESSAGE(ord_res == calc_ord_res_back, "ord_res = " << ord_res << "\ncalc_ord_res_back = " << calc_ord_res_back << "\n"); + } +#endif + +void test_point_negative() + { + std::cout << "." << std::flush; + + //Setting up expected values + BigInt exp_p1_x(std::string("1340569834321789103897171369812910390864714275730")); + BigInt exp_p1_y(std::string("1270827321510686389126940426305655825361326281787")); + BigInt exp_p1_neg_x(std::string("1340569834321789103897171369812910390864714275730")); + BigInt exp_p1_neg_y(std::string("190674315820216529076744406410627194292458777540")); + + // performing calculation to test + std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; + std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; + std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; + std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; + SecureVector sv_p_secp = decode_hex ( p_secp ); + SecureVector sv_a_secp = decode_hex ( a_secp ); + SecureVector sv_b_secp = decode_hex ( b_secp ); + SecureVector sv_G_secp_comp = decode_hex ( G_secp_comp ); + BigInt bi_p_secp = BigInt::decode ( sv_p_secp.begin(), sv_p_secp.size() ); + BigInt bi_a_secp = BigInt::decode ( sv_a_secp.begin(), sv_a_secp.size() ); + BigInt bi_b_secp = BigInt::decode ( sv_b_secp.begin(), sv_b_secp.size() ); + CurveGFp secp160r1 ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); + + PointGFp p1 = p_G.mult2_in_place(); + + CHECK( p1.get_jac_proj_x().get_value() == exp_p1_x); + CHECK( p1.get_jac_proj_y().get_value() == exp_p1_y); + //cout << "p1.y_proj = " << p1.get_jac_proj_y() << "\n"; + PointGFp p1_neg = p1.negate(); + //cout << "p1_neg.y_proj = " << p1_neg.get_jac_proj_y() << "\n"; + //p1.negate(); + BigInt calc_y_value = p1_neg.get_jac_proj_y().get_value(); + BigInt calc_z_value = p1_neg.get_jac_proj_z().get_value(); + CHECK( p1_neg.get_jac_proj_x().get_value() == exp_p1_neg_x); + CHECK_MESSAGE( calc_y_value == exp_p1_neg_y, "calc_y_value = " << calc_y_value << "\nexp_p1_neg_v = " << exp_p1_neg_y); + //CHECK_MESSAGE( calc_z_value == exp_p1_neg_y, "calc_y_value = " << calc_y_value << "\nexp_p1_neg_v = " << exp_p1_neg_y); + } + +void test_zeropoint() + { + std::cout << "." << std::flush; + + + std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; + SecureVector sv_G_secp_comp = decode_hex ( G_secp_comp ); + BigInt bi_p_secp("0xffffffffffffffffffffffffffffffff7fffffff"); + BigInt bi_a_secp("0xffffffffffffffffffffffffffffffff7ffffffc"); + BigInt bi_b_secp("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); + CurveGFp secp160r1 ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + + BigInt bi_p1_xval ("1340569834321789103897171369812910390864714275730"); + BigInt bi_p1_yval ("1270827321510686389126940426305655825361326281787"); + BigInt bi_p1_zval ("407040228325808215747982915914693784055965283940"); + + GFpElement elem_p1_x(bi_p_secp, bi_p1_xval); + GFpElement elem_p1_y(bi_p_secp, bi_p1_yval); + GFpElement elem_p1_z(bi_p_secp, bi_p1_zval); + + + PointGFp p1(secp160r1,elem_p1_x, elem_p1_y, elem_p1_z); + + p1.check_invariants(); + p1 -= p1; + // cout << "p1 x " << p1.get_jac_proj_x().get_value() << "\n"; + // cout << "p1 y " << p1.get_jac_proj_y().get_value() << "\n"; + // cout << "p1 z " << p1.get_jac_proj_z().get_value() << "\n"; + + CHECK_MESSAGE( p1.is_zero(), "p - q with q = p is not zero!"); + } + +void test_zeropoint_enc_dec() + { + std::cout << "." << std::flush; + + + BigInt bi_p_secp("0xffffffffffffffffffffffffffffffff7fffffff"); + BigInt bi_a_secp("0xffffffffffffffffffffffffffffffff7ffffffc"); + BigInt bi_b_secp("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); + CurveGFp curve ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + + PointGFp p(curve); + CHECK_MESSAGE( p.is_zero(), "by constructor created zeropoint is no zeropoint!"); + + + SecureVector sv_p = EC2OSP(p, PointGFp::UNCOMPRESSED); + PointGFp p_encdec = OS2ECP(sv_p, curve); + CHECK_MESSAGE( p == p_encdec, "encoded-decoded (uncompressed) point is not equal the original!"); + + sv_p = EC2OSP(p, PointGFp::UNCOMPRESSED); + p_encdec = OS2ECP(sv_p, curve); + CHECK_MESSAGE( p == p_encdec, "encoded-decoded (compressed) point is not equal the original!"); + + sv_p = EC2OSP(p, PointGFp::HYBRID); + p_encdec = OS2ECP(sv_p, curve); + CHECK_MESSAGE( p == p_encdec, "encoded-decoded (hybrid) point is not equal the original!"); + } + +void test_calc_with_zeropoint() + { + std::cout << "." << std::flush; + + + + std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; + SecureVector sv_G_secp_comp = decode_hex ( G_secp_comp ); + BigInt bi_p_secp("0xffffffffffffffffffffffffffffffff7fffffff"); + BigInt bi_a_secp("0xffffffffffffffffffffffffffffffff7ffffffc"); + BigInt bi_b_secp("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); + CurveGFp curve ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + + BigInt bi_p1_xval ("1340569834321789103897171369812910390864714275730"); + BigInt bi_p1_yval ("1270827321510686389126940426305655825361326281787"); + BigInt bi_p1_zval ("407040228325808215747982915914693784055965283940"); + + GFpElement elem_p1_x(bi_p_secp, bi_p1_xval); + GFpElement elem_p1_y(bi_p_secp, bi_p1_yval); + GFpElement elem_p1_z(bi_p_secp, bi_p1_zval); + + PointGFp p(curve,elem_p1_x, elem_p1_y, elem_p1_z); + + p.check_invariants(); + CHECK_MESSAGE( !p.is_zero(), "created is zeropoint, shouldn't be!"); + + PointGFp zero(curve); + CHECK_MESSAGE( zero.is_zero(), "by constructor created zeropoint is no zeropoint!"); + + PointGFp res = p + zero; + CHECK_MESSAGE( res == p, "point + zeropoint is not equal the point"); + + res = p - zero; + CHECK_MESSAGE( res == p, "point - zeropoint is not equal the point"); + + res = zero * 32432243; + CHECK_MESSAGE( res.is_zero(), "zeropoint * skalar is not a zero-point!"); + } + +void test_add_point() + { + std::cout << "." << std::flush; + + //Setting up expected values + BigInt exp_add_x(std::string("1435263815649099438763411093143066583800699119469")); + BigInt exp_add_y(std::string("1300090790154238148372364036549849084558669436512")); + BigInt exp_add_z(std::string("562006223742588575209908669014372619804457947208")); + + // precalculation + std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; + std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; + std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; + std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; + SecureVector sv_p_secp = decode_hex ( p_secp ); + SecureVector sv_a_secp = decode_hex ( a_secp ); + SecureVector sv_b_secp = decode_hex ( b_secp ); + SecureVector sv_G_secp_comp = decode_hex ( G_secp_comp ); + BigInt bi_p_secp = BigInt::decode ( sv_p_secp.begin(), sv_p_secp.size() ); + BigInt bi_a_secp = BigInt::decode ( sv_a_secp.begin(), sv_a_secp.size() ); + BigInt bi_b_secp = BigInt::decode ( sv_b_secp.begin(), sv_b_secp.size() ); + CurveGFp secp160r1 ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); + + PointGFp p0 = p_G; + PointGFp p1 = p_G.mult2_in_place(); + + PointGFp expected ( secp160r1, GFpElement(bi_p_secp, BigInt(exp_add_x)), + GFpElement(bi_p_secp, BigInt(exp_add_y)), GFpElement(bi_p_secp, BigInt(exp_add_z))); + + p1 += p0; + CHECK(p1 == expected); +#if 0 + CHECK( p1.get_jac_proj_x().get_value() == exp_add_x); + CHECK( p1.get_jac_proj_y().get_value() == exp_add_y); + CHECK( p1.get_jac_proj_z().get_value() == exp_add_z); +#endif + } + +void test_sub_point() + { + std::cout << "." << std::flush; + + //Setting up expected values + BigInt exp_sub_x(std::string("112913490230515010376958384252467223283065196552")); + BigInt exp_sub_y(std::string("143464803917389475471159193867377888720776527730")); + BigInt exp_sub_z(std::string("562006223742588575209908669014372619804457947208")); + + // precalculation + std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; + std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; + std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; + std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; + SecureVector sv_p_secp = decode_hex ( p_secp ); + SecureVector sv_a_secp = decode_hex ( a_secp ); + SecureVector sv_b_secp = decode_hex ( b_secp ); + SecureVector sv_G_secp_comp = decode_hex ( G_secp_comp ); + BigInt bi_p_secp = BigInt::decode ( sv_p_secp.begin(), sv_p_secp.size() ); + BigInt bi_a_secp = BigInt::decode ( sv_a_secp.begin(), sv_a_secp.size() ); + BigInt bi_b_secp = BigInt::decode ( sv_b_secp.begin(), sv_b_secp.size() ); + CurveGFp secp160r1 ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); + + PointGFp p0 = p_G; + PointGFp p1 = p_G.mult2_in_place(); + + p1 -= p0; + PointGFp expected ( secp160r1, GFpElement(bi_p_secp, BigInt(exp_sub_x)), + GFpElement(bi_p_secp, BigInt(exp_sub_y)), GFpElement(bi_p_secp, BigInt(exp_sub_z))); + CHECK(p1 == expected); + +#if 0 + CHECK( p1.get_jac_proj_x().get_value() == exp_sub_x); + CHECK( p1.get_jac_proj_y().get_value() == exp_sub_y); + CHECK( p1.get_jac_proj_z().get_value() == exp_sub_z); +#endif + } + +void test_mult_point() + { + std::cout << "." << std::flush; + + //Setting up expected values + BigInt exp_mult_x(std::string("967697346845926834906555988570157345422864716250")); + BigInt exp_mult_y(std::string("512319768365374654866290830075237814703869061656")); + BigInt exp_mult_z(std::string("1")); + + // precalculation + std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; + std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; + std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; + std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; + SecureVector sv_p_secp = decode_hex ( p_secp ); + SecureVector sv_a_secp = decode_hex ( a_secp ); + SecureVector sv_b_secp = decode_hex ( b_secp ); + SecureVector sv_G_secp_comp = decode_hex ( G_secp_comp ); + BigInt bi_p_secp = BigInt::decode ( sv_p_secp.begin(), sv_p_secp.size() ); + BigInt bi_a_secp = BigInt::decode ( sv_a_secp.begin(), sv_a_secp.size() ); + BigInt bi_b_secp = BigInt::decode ( sv_b_secp.begin(), sv_b_secp.size() ); + CurveGFp secp160r1 ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); + + PointGFp p0 = p_G; + PointGFp p1 = p_G.mult2_in_place(); + + p1 *= p0.get_jac_proj_x().get_value(); + + PointGFp expected ( secp160r1, GFpElement(bi_p_secp, BigInt(exp_mult_x)), + GFpElement(bi_p_secp, BigInt(exp_mult_y)), GFpElement(bi_p_secp, BigInt(exp_mult_z))); + CHECK(p1 == expected); + +#if 0 + CHECK( p1.get_jac_proj_x().get_value() == exp_mult_x); + CHECK( p1.get_jac_proj_y().get_value() == exp_mult_y); + CHECK( p1.get_jac_proj_z().get_value() == exp_mult_z); +#endif + } + +void test_basic_operations() + { + std::cout << "." << std::flush; + + + // set up expected values + BigInt exp_p1_x(std::string("1340569834321789103897171369812910390864714275730")); + BigInt exp_p1_y(std::string("1270827321510686389126940426305655825361326281787")); + BigInt exp_p1_z(std::string("407040228325808215747982915914693784055965283940")); + + BigInt exp_p0_x(std::string("425826231723888350446541592701409065913635568770")); + BigInt exp_p0_y(std::string("203520114162904107873991457957346892027982641970")); + BigInt exp_p0_z(std::string("1")); + + BigInt exp_plus_x(std::string("1435263815649099438763411093143066583800699119469")); + BigInt exp_plus_y(std::string("1300090790154238148372364036549849084558669436512")); + BigInt exp_plus_z(std::string("562006223742588575209908669014372619804457947208")); + + BigInt exp_minus_x(std::string("112913490230515010376958384252467223283065196552")); + BigInt exp_minus_y(std::string("143464803917389475471159193867377888720776527730")); + BigInt exp_minus_z(std::string("562006223742588575209908669014372619804457947208")); + + BigInt exp_mult_x(std::string("43638877777452195295055270548491599621118743290")); + BigInt exp_mult_y(std::string("56841378500012376527163928510402662349220202981")); + BigInt exp_mult_z(std::string("1")); + + // precalculation + std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; + std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; + std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; + std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; + SecureVector sv_p_secp = decode_hex ( p_secp ); + SecureVector sv_a_secp = decode_hex ( a_secp ); + SecureVector sv_b_secp = decode_hex ( b_secp ); + SecureVector sv_G_secp_comp = decode_hex ( G_secp_comp ); + BigInt bi_p_secp = BigInt::decode ( sv_p_secp.begin(), sv_p_secp.size() ); + BigInt bi_a_secp = BigInt::decode ( sv_a_secp.begin(), sv_a_secp.size() ); + BigInt bi_b_secp = BigInt::decode ( sv_b_secp.begin(), sv_b_secp.size() ); + CurveGFp secp160r1 ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); + + PointGFp p0 = p_G; + PointGFp p1 = p_G.mult2_in_place(); + + // check that all points have correct values + CHECK( p1.get_jac_proj_x().get_value() == exp_p1_x); + CHECK( p1.get_jac_proj_y().get_value() == exp_p1_y); + CHECK( p1.get_jac_proj_z().get_value() == exp_p1_z); + + PointGFp expected ( secp160r1, GFpElement(bi_p_secp, exp_p0_x), + GFpElement(bi_p_secp, exp_p0_y), GFpElement(bi_p_secp, exp_p0_z)); + CHECK(p0 == expected); +#if 0 + CHECK( p0.get_jac_proj_x().get_value() == exp_p0_x); + CHECK( p0.get_jac_proj_y().get_value() == exp_p0_y); + CHECK( p0.get_jac_proj_z().get_value() == exp_p0_z); +#endif + + PointGFp simplePlus= p1 + p0; + PointGFp exp_simplePlus ( secp160r1, GFpElement(bi_p_secp, exp_plus_x), + GFpElement(bi_p_secp, exp_plus_y), GFpElement(bi_p_secp, exp_plus_z)); + CHECK(simplePlus == exp_simplePlus); +#if 0 + CHECK( simplePlus.get_jac_proj_x().get_value() == exp_plus_x); + CHECK( simplePlus.get_jac_proj_y().get_value() == exp_plus_y); + CHECK( simplePlus.get_jac_proj_z().get_value() == exp_plus_z); +#endif + + PointGFp simpleMinus= p1 - p0; + PointGFp exp_simpleMinus ( secp160r1, GFpElement(bi_p_secp, exp_minus_x), + GFpElement(bi_p_secp, exp_minus_y), GFpElement(bi_p_secp, exp_minus_z)); + CHECK(simpleMinus == exp_simpleMinus); +#if 0 + CHECK( simpleMinus.get_jac_proj_x().get_value() == exp_minus_x); + CHECK( simpleMinus.get_jac_proj_y().get_value() == exp_minus_y); + CHECK( simpleMinus.get_jac_proj_z().get_value() == exp_minus_z); +#endif + + PointGFp simpleMult= p1 * 123456789; + CHECK( simpleMult.get_jac_proj_x().get_value() == exp_mult_x); + CHECK( simpleMult.get_jac_proj_y().get_value() == exp_mult_y); + CHECK( simpleMult.get_jac_proj_z().get_value() == exp_mult_z); + + // check that all initial points hasn't changed + CHECK( p1.get_jac_proj_x().get_value() == exp_p1_x); + CHECK( p1.get_jac_proj_y().get_value() == exp_p1_y); + CHECK( p1.get_jac_proj_z().get_value() == exp_p1_z); + + CHECK( p0.get_jac_proj_x().get_value() == exp_p0_x); + CHECK( p0.get_jac_proj_y().get_value() == exp_p0_y); + CHECK( p0.get_jac_proj_z().get_value() == exp_p0_z); + } + +void test_enc_dec_compressed_160() + { + std::cout << "." << std::flush; + + + // Test for compressed conversion (02/03) 160bit + std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; + std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffC"; + std::string b_secp = "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45"; + std::string G_secp_comp = "024A96B5688EF573284664698968C38BB913CBFC82"; + std::string G_order_secp_comp = "0100000000000000000001F4C8F927AED3CA752257"; + + SecureVector sv_p_secp = decode_hex ( p_secp ); + SecureVector sv_a_secp = decode_hex ( a_secp ); + SecureVector sv_b_secp = decode_hex ( b_secp ); + SecureVector sv_G_secp_comp = decode_hex ( G_secp_comp ); + + BigInt bi_p_secp = BigInt::decode ( sv_p_secp.begin(), sv_p_secp.size() ); + BigInt bi_a_secp = BigInt::decode ( sv_a_secp.begin(), sv_a_secp.size() ); + BigInt bi_b_secp = BigInt::decode ( sv_b_secp.begin(), sv_b_secp.size() ); + + CurveGFp secp160r1 ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + + PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); + SecureVector sv_result = EC2OSP(p_G, PointGFp::COMPRESSED); + + CHECK( sv_result == sv_G_secp_comp); + } + +void test_enc_dec_compressed_256() + { + std::cout << "." << std::flush; + + + // Test for compressed conversion (02/03) 256bit + std::string p_secp = "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff"; + std::string a_secp = "ffffffff00000001000000000000000000000000ffffffffffffffffffffffFC"; + std::string b_secp = "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B"; + std::string G_secp_comp = "036B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"; + std::string G_order_secp_comp = "ffffffff00000000ffffffffffffffffBCE6FAADA7179E84F3B9CAC2FC632551"; + + SecureVector sv_p_secp = decode_hex ( p_secp ); + SecureVector sv_a_secp = decode_hex ( a_secp ); + SecureVector sv_b_secp = decode_hex ( b_secp ); + SecureVector sv_G_secp_comp = decode_hex ( G_secp_comp ); + + BigInt bi_p_secp = BigInt::decode ( sv_p_secp.begin(), sv_p_secp.size() ); + BigInt bi_a_secp = BigInt::decode ( sv_a_secp.begin(), sv_a_secp.size() ); + BigInt bi_b_secp = BigInt::decode ( sv_b_secp.begin(), sv_b_secp.size() ); + + CurveGFp secp160r1 ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + + PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); + SecureVector sv_result = EC2OSP(p_G, PointGFp::COMPRESSED); + + CHECK( sv_result == sv_G_secp_comp); + } + + +void test_enc_dec_uncompressed_112() + { + std::cout << "." << std::flush; + + + // Test for uncompressed conversion (04) 112bit + + std::string p_secp = "db7c2abf62e35e668076bead208b"; + std::string a_secp = "6127C24C05F38A0AAAF65C0EF02C"; + std::string b_secp = "51DEF1815DB5ED74FCC34C85D709"; + std::string G_secp_uncomp = "044BA30AB5E892B4E1649DD0928643ADCD46F5882E3747DEF36E956E97"; + std::string G_order_secp_uncomp = "36DF0AAFD8B8D7597CA10520D04B"; + + SecureVector sv_p_secp = decode_hex ( p_secp ); + SecureVector sv_a_secp = decode_hex ( a_secp ); + SecureVector sv_b_secp = decode_hex ( b_secp ); + SecureVector sv_G_secp_uncomp = decode_hex ( G_secp_uncomp ); + + BigInt bi_p_secp = BigInt::decode ( sv_p_secp.begin(), sv_p_secp.size() ); + BigInt bi_a_secp = BigInt::decode ( sv_a_secp.begin(), sv_a_secp.size() ); + BigInt bi_b_secp = BigInt::decode ( sv_b_secp.begin(), sv_b_secp.size() ); + + CurveGFp secp160r1 ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + + PointGFp p_G = OS2ECP ( sv_G_secp_uncomp, secp160r1 ); + SecureVector sv_result = EC2OSP(p_G, PointGFp::UNCOMPRESSED); + + CHECK( sv_result == sv_G_secp_uncomp); + } + +void test_enc_dec_uncompressed_521() + { + std::cout << "." << std::flush; + + + // Test for uncompressed conversion(04) with big values(521 bit) + std::string p_secp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + std::string a_secp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFC"; + std::string b_secp = "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00"; + std::string G_secp_uncomp = "0400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2ffA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"; + std::string G_order_secp_uncomp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409"; + + SecureVector sv_p_secp = decode_hex ( p_secp ); + SecureVector sv_a_secp = decode_hex ( a_secp ); + SecureVector sv_b_secp = decode_hex ( b_secp ); + SecureVector sv_G_secp_uncomp = decode_hex ( G_secp_uncomp ); + + BigInt bi_p_secp = BigInt::decode ( sv_p_secp.begin(), sv_p_secp.size() ); + BigInt bi_a_secp = BigInt::decode ( sv_a_secp.begin(), sv_a_secp.size() ); + BigInt bi_b_secp = BigInt::decode ( sv_b_secp.begin(), sv_b_secp.size() ); + + CurveGFp secp160r1 ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + + PointGFp p_G = OS2ECP ( sv_G_secp_uncomp, secp160r1 ); + + SecureVector sv_result = EC2OSP(p_G, PointGFp::UNCOMPRESSED); + std::string result = hex_encode(sv_result.begin(), sv_result.size()); + std::string exp_result = hex_encode(sv_G_secp_uncomp.begin(), sv_G_secp_uncomp.size()); + + CHECK_MESSAGE( sv_result == sv_G_secp_uncomp, "\ncalc. result = " << result << "\nexp. result = " << exp_result << "\n"); + } + +void test_enc_dec_uncompressed_521_prime_too_large() + { + std::cout << "." << std::flush; + + + // Test for uncompressed conversion(04) with big values(521 bit) + std::string p_secp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; // length increased by "ff" + std::string a_secp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFC"; + std::string b_secp = "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00"; + std::string G_secp_uncomp = "0400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2ffA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"; + std::string G_order_secp_uncomp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409"; + + SecureVector sv_p_secp = decode_hex ( p_secp ); + SecureVector sv_a_secp = decode_hex ( a_secp ); + SecureVector sv_b_secp = decode_hex ( b_secp ); + SecureVector sv_G_secp_uncomp = decode_hex ( G_secp_uncomp ); + + BigInt bi_p_secp = BigInt::decode ( sv_p_secp.begin(), sv_p_secp.size() ); + BigInt bi_a_secp = BigInt::decode ( sv_a_secp.begin(), sv_a_secp.size() ); + BigInt bi_b_secp = BigInt::decode ( sv_b_secp.begin(), sv_b_secp.size() ); + + CurveGFp secp521r1 ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + std::auto_ptr p_G; + bool exc = false; + try + { + p_G = std::auto_ptr(new PointGFp(OS2ECP ( sv_G_secp_uncomp, secp521r1))); + p_G->check_invariants(); + } + catch (std::exception e) + { + exc = true; + } + + CHECK_MESSAGE(exc, "attempt of creation of point on curve with too high prime did not throw an exception"); +#if 0 + cout << "mX == " << p_G.get_jac_proj_x() << endl; + std::cout << "mY == " << p_G.get_jac_proj_y() << endl; + std::cout << "mZ == " << p_G.get_jac_proj_x() << endl; +#endif + //SecureVector sv_result = EC2OSP(p_G, PointGFp::UNCOMPRESSED); + //string result = hex_encode(sv_result.begin(), sv_result.size()); + //string exp_result = hex_encode(sv_G_secp_uncomp.begin(), sv_G_secp_uncomp.size()); + + //CHECK_MESSAGE( sv_result == sv_G_secp_uncomp, "\ncalc. result = " << result << "\nexp. result = " << exp_result << "\n"); + } + +void test_gfp_store_restore() + { + std::cout << "." << std::flush; + + // generate point + //EC_Domain_Params dom_pars = global_config().get_ec_dompar("1.3.132.0.8"); + //EC_Domain_Params dom_pars("1.3.132.0.8"); + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + PointGFp p = dom_pars.get_base_point(); + + //store point (to std::string) + SecureVector sv_mes = EC2OSP(p, PointGFp::COMPRESSED); + std::string storrage = hex_encode(sv_mes, sv_mes.size()); + + // restore point (from std::string) + SecureVector sv_new_point = decode_hex(storrage); + PointGFp new_p = OS2ECP(sv_new_point, dom_pars.get_curve()); + + CHECK_MESSAGE( p == new_p, "original and restored point are different!"); + } + + +// maybe move this test +void test_cdc_curve_33() + { + std::cout << "." << std::flush; + + std::string G_secp_uncomp = "04081523d03d4f12cd02879dea4bf6a4f3a7df26ed888f10c5b2235a1274c386a2f218300dee6ed217841164533bcdc903f07a096f9fbf4ee95bac098a111f296f5830fe5c35b3e344d5df3a2256985f64fbe6d0edcc4c61d18bef681dd399df3d0194c5a4315e012e0245ecea56365baa9e8be1f7"; + + SecureVector sv_G_uncomp = decode_hex ( G_secp_uncomp ); + + BigInt bi_p_secp = BigInt("2117607112719756483104013348936480976596328609518055062007450442679169492999007105354629105748524349829824407773719892437896937279095106809"); + BigInt bi_a_secp("0xa377dede6b523333d36c78e9b0eaa3bf48ce93041f6d4fc34014d08f6833807498deedd4290101c5866e8dfb589485d13357b9e78c2d7fbe9fe"); + BigInt bi_b_secp("0xa9acf8c8ba617777e248509bcb4717d4db346202bf9e352cd5633731dd92a51b72a4dc3b3d17c823fcc8fbda4da08f25dea89046087342595a7"); + + CurveGFp curve( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + PointGFp p_G = OS2ECP ( sv_G_uncomp, curve); + bool exc = false; + try + { + p_G.check_invariants(); + } + catch (std::exception& e) + { + exc = true; + } + CHECK(!exc); + } + +void test_more_zeropoint() + { + std::cout << "." << std::flush; + // by Falko + + + + std::string G = "024a96b5688ef573284664698968c38bb913cbfc82"; + SecureVector sv_G_secp_comp = decode_hex ( G ); + BigInt bi_p("0xffffffffffffffffffffffffffffffff7fffffff"); + BigInt bi_a("0xffffffffffffffffffffffffffffffff7ffffffc"); + BigInt bi_b("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); + CurveGFp curve( GFpElement ( bi_p,bi_a ), GFpElement ( bi_p, bi_b ), bi_p ); + + BigInt bi_p1_xval ("1340569834321789103897171369812910390864714275730"); + BigInt bi_p1_yval ("1270827321510686389126940426305655825361326281787"); + BigInt bi_p1_zval ("407040228325808215747982915914693784055965283940"); + + GFpElement elem_p1_x(bi_p, bi_p1_xval); + GFpElement elem_p1_y(bi_p, bi_p1_yval); + GFpElement elem_p1_z(bi_p, bi_p1_zval); + + PointGFp p1(curve,elem_p1_x, elem_p1_y, elem_p1_z); + + p1.check_invariants(); + PointGFp minus_p1 = -p1; + minus_p1.check_invariants(); + PointGFp shouldBeZero = p1 + minus_p1; + shouldBeZero.check_invariants(); + GFpElement x1 = p1.get_affine_x(); + GFpElement y1 = p1.get_affine_y(); + + GFpElement shouldBeY2 = -y1; + + CHECK_MESSAGE(minus_p1.get_affine_x() == x1, "problem with minus_p1 : x"); + CHECK_MESSAGE(minus_p1.get_affine_y() == shouldBeY2, "problem with minus_p1 : y"); + + PointGFp zero(curve); + zero.check_invariants(); + CHECK_MESSAGE(p1 + zero == p1, "addition of zero modified point"); + +#if 0 + std::cout << "sbz x " << shouldBeZero.get_jac_proj_x().get_value() << "\n"; + std::cout << "sbz y " << shouldBeZero.get_jac_proj_y().get_value() << "\n"; + std::cout << "sbz z " << shouldBeZero.get_jac_proj_z().get_value() << "\n"; +#endif + + CHECK_MESSAGE( shouldBeZero.is_zero(), "p - q with q = p is not zero!"); + } + +void test_mult_by_order() + { + std::cout << "." << std::flush; + // std::cout << "starting test_mult_by_order..." << endl; + + + + // generate point + //EC_Domain_Params dom_pars = global_config().get_ec_dompar("1.3.132.0.8"); + //EC_Domain_Params dom_pars("1.3.132.0.8"); + EC_Domain_Params dom_pars = get_EC_Dom_Pars_by_oid("1.3.132.0.8"); + PointGFp p = dom_pars.get_base_point(); + PointGFp shouldBeZero = p * dom_pars.get_order(); +#if 0 + cout << "sbz x " << shouldBeZero.get_jac_proj_x().get_value() << "\n"; + std::cout << "sbz y " << shouldBeZero.get_jac_proj_y().get_value() << "\n"; + std::cout << "sbz z " << shouldBeZero.get_jac_proj_z().get_value() << "\n"; +#endif + CHECK_MESSAGE(shouldBeZero.is_zero(), "G * order != O"); + } + +void test_gfp_curve_precomp_mres() + { + std::cout << "." << std::flush; + + + //EC_Domain_Params parA("1.2.840.10045.3.1.1"); + EC_Domain_Params parA(get_EC_Dom_Pars_by_oid("1.2.840.10045.3.1.1")); + CurveGFp curve1 = parA.get_curve(); + CurveGFp curve2 = parA.get_curve(); + BigInt p = curve1.get_p(); + GFpElement x(p, BigInt("2304042084023")); + GFpElement a1_or = curve1.get_a(); + CHECK(!a1_or.is_trf_to_mres()); + + GFpElement b1_mr = curve1.get_mres_b(); + CHECK(b1_mr.is_trf_to_mres()); + + GFpElement a2_mr = curve2.get_mres_a(); + CHECK(a2_mr.is_trf_to_mres()); + + GFpElement b2_or = curve2.get_b(); + CHECK(!b2_or.is_trf_to_mres()); + + GFpElement prodA = a1_or*b1_mr; + GFpElement prodB = a2_mr*b2_or; + CHECK(prodA == prodB); + + CHECK(a1_or * x == a2_mr * x); + CHECK(x* a1_or == a1_or * x); + CHECK(x* a1_or == x * a2_mr); + CHECK(x* a1_or == a2_mr * x); + + CHECK(a1_or + a2_mr == a2_mr + a1_or); + CHECK(a1_or + b1_mr == a2_mr + b1_mr); + CHECK(a1_or + x == a2_mr + x); + } + +#if 0 +void test_point_worksp() + { + + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + std::tr1::shared_ptr > worksp1; + assert(worksp1.get() == 0); + { + PointGFp p = dom_pars.get_base_point(); + worksp1 = p.get_worksp_gfp(); + } + PointGFp p2 = dom_pars.get_base_point(); + p2.set_worksp_gfp(worksp1); + PointGFp p3 = p2*6; + PointGFp p4 = dom_pars.get_base_point(); + p4 *= 6; + CHECK_MESSAGE(p4 == p3,"points are not equal" ); + p2 *= 10; + for(int i=0; i<3; i++) + { + + PointGFp p5 = dom_pars.get_base_point(); + p5.set_worksp_gfp(worksp1); + p5 *= 10; + CHECK(p5 == p2); + } + } +#endif + +void test_point_swap(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + + PointGFp a(create_random_point(rng, dom_pars.get_curve())); + PointGFp b(create_random_point(rng, dom_pars.get_curve())); + b *= BigInt(20); + + PointGFp c(a); + PointGFp d(b); + + d.swap(c); + CHECK(a == d); + CHECK(b == c); + } + +/** +* This test verifies that the side channel attack resistant multiplication function +* yields the same result as the normal (insecure) multiplication via operator*= +*/ +void test_mult_sec() + { + std::cout << "." << std::flush; + + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + PointGFp a(dom_pars.get_base_point()); + BigInt scal("123413545342234"); + PointGFp b = a * scal; + PointGFp c(a); + c.mult_this_secure(scal, dom_pars.get_order(), dom_pars.get_order()-1); + PointGFp d(a); + d.mult_this_secure(scal, BigInt(0), dom_pars.get_order()-1); + CHECK(b == c); + CHECK(c == d); + } + +/** +* This test verifies that the side channel attack resistant multiplication function +* yields the same result as the normal (insecure) multiplication via operator*= +*/ +void test_mult_sec_mass(RandomNumberGenerator& rng) + { + + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + for(int i = 0; i<50; i++) + { + std::cout << "." << std::flush; + std::cout.flush(); + PointGFp a(create_random_point(rng, dom_pars.get_curve())); + BigInt scal(BigInt(rng, 40)); + PointGFp b = a * scal; + PointGFp c(a); + c.mult_this_secure(scal, dom_pars.get_order()*dom_pars.get_cofactor(), dom_pars.get_order()-1); + //PointGFp d(a); + //d.mult_this_secure(scal, BigInt(0), dom_pars.get_order()-1); + CHECK(b == c); + //CHECK(c == d); + } + } + +/** +* The following test verifies that PointGFps copy-ctor and assignment operator +* produce non-sharing Objects +*/ +void test_point_ctors_ass_unshared() + { + std::cout << "." << std::flush; + + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + PointGFp p = dom_pars.get_base_point(); + PointGFp ind_cpy(p); + + // doesnΒ΄t work this way, because getters of point return an independent copy! + CHECK(p.get_jac_proj_x().get_ptr_mod().get() != ind_cpy.get_jac_proj_x().get_ptr_mod().get()); + //CHECK(p.get_x().get_ptr_r().get() != ind_cpy.get_x().get_ptr_r().get()); + + PointGFp ind_ass(p); + ind_ass = p; + CHECK(p.get_jac_proj_x().get_ptr_mod().get() != ind_ass.get_jac_proj_x().get_ptr_mod().get()); + //CHECK(p.get_x().get_ptr_r().get() != ind_ass.get_x().get_ptr_r().get()); + } + +void test_curve_cp_ctor() + { + std::cout << "." << std::flush; + + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + CurveGFp curve(dom_pars.get_curve()); + } + +/** +* The following test checks assignment operator and copy ctor for ec keys +*/ +void test_ec_key_cp_and_assignment(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + + std::string g_secp("024a96b5688ef573284664698968c38bb913cbfc82"); + SecureVector sv_g_secp = decode_hex ( g_secp); + BigInt bi_p_secp("0xffffffffffffffffffffffffffffffff7fffffff"); + BigInt bi_a_secp("0xffffffffffffffffffffffffffffffff7ffffffc"); + BigInt bi_b_secp("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); + BigInt order = BigInt("0x0100000000000000000001f4c8f927aed3ca752257"); + CurveGFp curve(GFpElement(bi_p_secp,bi_a_secp), GFpElement(bi_p_secp, bi_b_secp), bi_p_secp); + BigInt cofactor = BigInt(1); + PointGFp p_G = OS2ECP ( sv_g_secp, curve ); + + EC_Domain_Params dom_pars = EC_Domain_Params(curve, p_G, order, cofactor); + ECDSA_PrivateKey my_priv_key(rng, dom_pars); + + std::string str_message = ("12345678901234567890abcdef12"); + SecureVector sv_message = decode_hex(str_message); + + // sign with the original key + SecureVector signature = my_priv_key.sign(sv_message.begin(), sv_message.size(), rng); + //cout << "signature = " << hex_encode(signature.begin(), signature.size()) << "\n"; + bool ver_success = my_priv_key.verify(sv_message.begin(), sv_message.size(), signature.begin(), signature.size()); + CHECK_MESSAGE(ver_success, "generated signature could not be verified positively"); + + // make a copy and sign + ECDSA_PrivateKey cp_key(my_priv_key); + SecureVector cp_sig = cp_key.sign(sv_message.begin(), sv_message.size(), rng); + + // now cross verify... + CHECK(my_priv_key.verify(sv_message.begin(), sv_message.size(), cp_sig.begin(), cp_sig.size())); + CHECK(cp_key.verify(sv_message.begin(), sv_message.size(), signature.begin(), signature.size())); + + // make an copy assignment and verify + ECDSA_PrivateKey ass_key = my_priv_key; + SecureVector ass_sig = ass_key.sign(sv_message.begin(), sv_message.size(), rng); + + // now cross verify... + CHECK(my_priv_key.verify(sv_message.begin(), sv_message.size(), ass_sig.begin(), ass_sig.size())); + CHECK(ass_key.verify(sv_message.begin(), sv_message.size(), signature.begin(), signature.size())); + } + +void test_ec_key_cast(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + std::string g_secp("024a96b5688ef573284664698968c38bb913cbfc82"); + SecureVector sv_g_secp = decode_hex ( g_secp); + BigInt bi_p_secp("0xffffffffffffffffffffffffffffffff7fffffff"); + BigInt bi_a_secp("0xffffffffffffffffffffffffffffffff7ffffffc"); + BigInt bi_b_secp("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); + BigInt order = BigInt("0x0100000000000000000001f4c8f927aed3ca752257"); + CurveGFp curve(GFpElement(bi_p_secp,bi_a_secp), GFpElement(bi_p_secp, bi_b_secp), bi_p_secp); + BigInt cofactor = BigInt(1); + PointGFp p_G = OS2ECP ( sv_g_secp, curve ); + + EC_Domain_Params dom_pars = EC_Domain_Params(curve, p_G, order, cofactor); + ECDSA_PrivateKey my_priv_key(rng, dom_pars); + ECDSA_PublicKey my_ecdsa_pub_key = my_priv_key; + + Public_Key* my_pubkey = static_cast(&my_ecdsa_pub_key); + ECDSA_PublicKey* ec_cast_back = dynamic_cast(my_pubkey); + + std::string str_message = ("12345678901234567890abcdef12"); + SecureVector sv_message = decode_hex(str_message); + + // sign with the original key + SecureVector signature = my_priv_key.sign(sv_message.begin(), sv_message.size(), rng); + //cout << "signature = " << hex_encode(signature.begin(), signature.size()) << "\n"; + bool ver_success = ec_cast_back->verify(sv_message.begin(), sv_message.size(), signature.begin(), signature.size()); + CHECK_MESSAGE(ver_success, "generated signature could not be verified positively"); + } + +} + +void do_ec_tests(RandomNumberGenerator& rng) + { + std::cout << "Testing ECC: " << std::flush; + + test_point_turn_on_sp_red_mul_simple(); + test_point_turn_on_sp_red_mul(); + test_coordinates(); + test_point_transformation (); + test_point_mult (); + //test_montgm_calc_R (); + //test_naive_montg_mult (); + //test_trf_mres (); + test_point_negative(); + test_zeropoint(); + test_zeropoint_enc_dec(); + test_calc_with_zeropoint(); + test_add_point(); + test_sub_point(); + test_mult_point(); + test_basic_operations(); + test_enc_dec_compressed_160(); + test_enc_dec_compressed_256(); + test_enc_dec_uncompressed_112(); + test_enc_dec_uncompressed_521(); + test_enc_dec_uncompressed_521_prime_too_large(); + test_gfp_store_restore(); + test_cdc_curve_33(); + test_more_zeropoint(); + test_mult_by_order(); + test_gfp_curve_precomp_mres(); + //test_point_worksp(); + test_point_swap(rng); + test_mult_sec(); + test_mult_sec_mass(rng); + test_point_ctors_ass_unshared(); + test_curve_cp_ctor(); + test_ec_key_cp_and_assignment(rng); + test_ec_key_cast(rng); + + std::cout << std::endl; + } + +#endif + diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/CSCA.CSCA.csca-germany.1.crt b/src/libs/3rdparty/botan/checks/ecc_testdata/CSCA.CSCA.csca-germany.1.crt new file mode 100644 index 0000000000000000000000000000000000000000..8653f961a2df69a102586923dedc1d5cabbf56d7 GIT binary patch literal 862 zcmXqLVvaIsVrE^y%*4pV#K>sC!^WZ2=5fxJg_)6+!63kp+klgeIh2J>n90S}kk^14 z#Npy$Nh-}tG2}7e0&%%{n3IY#VUn!EEGDLA=7ypM!XQaz9-idljzC%sX3>$X-OEUmR`KxzF|Il`1D(yU+YdB_-|mtB9pQ7na;{{IWn3vn3o+4 z<_`3e(7LgKMJw{urTNY*GO7*VY|cM%v}k7+-nddZ^Rb7}&Wn~N-R9JpC5S$HRC zuGOiF`C`JMylF-4v7UK8kHvlD^8UUPI#3(2D(rjFfueksV>{;gon511>OF7fsm0$e zmx(Z)MR(VQ-!m?X?eWgNw`cLv<&)<#F)}h+F|aV2d3p0QGQAAY+Ic4<^d>i3RDN8X zhh=;-=hYg))$2crhb7c~E3G@(k+VqYhRp(RshPi=kFMPFaB&l(fI$-@kAWE*bEvE! zi@t$wqXcqHIV2Tl>VcwJFD122FfFmdO54QJ$jHLd)WXQz$jE>Xq>rDG@jnX-GZQ15 zfh>s6$0Eie!Z6KM_i4w^v?FKki^*R6{MAId@VS9JNLrai!a%G6y8=g$0tFT;0}BH) zHcl3XdIol8Mn*;hO#^i{4sA9@R#tWVsTvAOtc(7~~`l z12#s+|4fVw2HGGo0TvYlr3QW@1C*rK$Zup|WNwI*_)ro*vm=9n9g{4>u`P1VOyYli zCU2cLPg}UykMm&DujF6v97R{Wy~-rZaH-Pb7UPboQWH`ZZkx95zJzqiv<}UK79U>g HCs_jk?#BQ~ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/CSCA.CSCA.csca-germany.1.pem b/src/libs/3rdparty/botan/checks/ecc_testdata/CSCA.CSCA.csca-germany.1.pem new file mode 100644 index 00000000000..725e1634e5d --- /dev/null +++ b/src/libs/3rdparty/botan/checks/ecc_testdata/CSCA.CSCA.csca-germany.1.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDWjCCAwWgAwIBAgIBATAMBggqhkjOPQQDAQUAMFAxCzAJBgNVBAYTAkRFMQ0w +CwYDVQQKDARidW5kMQwwCgYDVQQLDANic2kxDTALBgNVBAUTBDQ1NjcxFTATBgNV +BAMMDGNzY2EtZ2VybWFueTAeFw0wNzA3MTkxNTI3MThaFw0yODAxMTkxNTE4MDBa +MFAxCzAJBgNVBAYTAkRFMQ0wCwYDVQQKDARidW5kMQwwCgYDVQQLDANic2kxDTAL +BgNVBAUTBDQ1NjcxFTATBgNVBAMMDGNzY2EtZ2VybWFueTCCARMwgdQGByqGSM49 +AgEwgcgCAQEwKAYHKoZIzj0BAQIdANfBNKomQ2aGKhgwJXXR14ewnwdXl9qJ9X7I +wP8wPAQcaKXmLKnObBwpmAOmwVMLUU4YKtiwBCpZytKfQwQcJYD2PM/kQTiHBxOx +qSNp4z4hNdJm27NyOGxACwQ5BA2QKa0sflz0NAgjsqh9xoyeTOMXTB5u/e4SwH1Y +qlb3csBybyTGuJ5OzawkNUuemcqj9tN2FALNAh0A18E0qiZDZoYqGDAlddD7mNEW +vEtt3ryjpaeTnwIBAQM6AAQBNkpLDwEC6VAqudxoVdkLBlpvXl5IOV+DCdV8Eauv +8hdWYH72dX7JiGyiItg8oEsamfpDxam84aOCARAwggEMMDYGA1UdEQQvMC2BGGNz +Y2EtZ2VybWFueUBic2kuYnVuZC5kZYYRZmF4Ois0OTIyODk1ODI3MjIwDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQAlkUt5Yj5ZsTM3xYd0fP1NBtx5zAfBgNVHSME +GDAWgBQAlkUt5Yj5ZsTM3xYd0fP1NBtx5zBBBgNVHSAEOjA4MDYGCQQAfwAHAwEB +ATApMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LmJzaS5idW5kLmRlL2NzY2EwEgYD +VR0TAQH/BAgwBgEB/wIBADArBgNVHRAEJDAigA8yMDA3MDcxOTE1MjcxOFqBDzIw +MjcxMTE5MTUxODAwWjAMBggqhkjOPQQDAQUAA0EAMD4CHQDGtB6DAhf9TJO1np4r +E3NOCcGC+mP67kEVqO3VAh0A0nk42gG4lRqQZKG2lq7fGBt0logpwTjw6y9iOw== +-----END CERTIFICATE----- diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/DE1_flen_chars_cvcRequest_ECDSA.der b/src/libs/3rdparty/botan/checks/ecc_testdata/DE1_flen_chars_cvcRequest_ECDSA.der new file mode 100644 index 0000000000000000000000000000000000000000..358ca8f3497d11881493487d3abf4b9a15976a99 GIT binary patch literal 158 zcmb?*S zBBK8oyDB&IJy|lBKkC9Z)%P7&S6lu4BvaThuQD?I=q*mNz~(pG)0LG~ms1u}@}{o)$4-lEO=;4P0Hbe9R_wEqb(EVAt8m Nyxc#hKFo1a1OUpBLMZ?M literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/Lidia.cer b/src/libs/3rdparty/botan/checks/ecc_testdata/Lidia.cer new file mode 100644 index 0000000000000000000000000000000000000000..58c55689b17f020b3fe82f880e0c2312ccb1c920 GIT binary patch literal 985 zcmXqLV!mq7#B8^KnTe5!iILHOmyJ`a&7D}#ZTA-4f18*?ZNn=q4$tD&fY zFo?s&!xIv!;F4IBTU?TuQewzszy%WK=3#braW)h)5CQR+d3b#?T|6BXoE;SmtpfZE z==c) z-yL&EY@9R8qL3kB(VH&C=Jj_YmH$U(e=G40bdEHUc(z+McJbE*KWD23)?8Tg|8{E= z%junot1AqTynex;G_$RDm!iWjO?#$2%N=&;`7gC+UJ_Tubnl1|!>Ra=w%S1PC$fAT zr3{S|UI()5m|;Ho)X4)o=7wIG`F~-rGcOa10|P_j;wHuu22G4d4EWfXLuL6H8UM4e zFf%c+7!-o|3M^R$83t)=+}do6EQ|+onOT?^4Z;mV**LV>7+G1_nHa@9GfGMdimmkZ z%gf94axzmg6Lpgl^^#MP^)mC)@{4j4OERuz9Ed!X@(PZSI>r!EK980(uL%t_ZzqnP~iTb+ohfjEf6mo9`9- z=zmm|=h+$C-&4KbtE!-W=UdT#SsQHS4t82x4N^Uo+PrM*F9!zW>MnM^q%BX(b_q8b vS1e5Z{r$T5uHKf-zJEDm1!cfn^&cwvT#N3w1!gyL*Q{}`TdFvwwSUyRe zb4!`A*5rQjoI_lHOP=UkPI&*rD9Th$W`mKd-hJEp80R%TPL<4y|NK2aL)cY9;%~H4 zNJ6cS{^L0pZ(jM;!+HL4b9SuIktcS1E&{JvF7Aljy*^%nE4MN}zn~;OIio1vJfYj} zYsdLzSuIaywg%r#xUy@Xy36`mDZNsa<#Il{$qK7iKi9cy>)Pa!mHGYRSv}@Z-2(9^ zyLK(U{O7>|jhM%NmveiLaNCve3O)=CxH-ezsruuAFMZb93V{f=Jkd>_MZ%1;-(swF?`|EoE3_NRCh>Dwr4R+q3Z I`pKmN06^@c%K!iX literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/ado.cvcreq b/src/libs/3rdparty/botan/checks/ecc_testdata/ado.cvcreq new file mode 100644 index 0000000000000000000000000000000000000000..09a14bbb4103acb17b5c039c43479573e744b90d GIT binary patch literal 238 zcmYdqd|j{DIIG?-CSH?~q2AM-jf;h$o`IbS1llZF{QQna>7`ElVDS7`%oXiD%pMaL ztT_0-Mv9@T!F}7+70m~)K3ego=0VT*57lgTJKou8eQeHteoM4GUV+=i)lf-GLAma~ z!rFLqi*TvwvXa|Uer~XOFWzhP^zF~vF`lkhJg+`km%Neb*8a~|?lWB6)4V%Ev+>%N zzAN&bAO0lu)ORlU>Lh?4xbq;fOG%zqQFs%1%{L9A0!cfn^&IAIDGS?59tWtAM zYtxc2P%XW9y?w)c_VDSqI=|MPIPkwoCS&O{ot5WuWHe_mFFP2_9q1>abz=jIR^+Km z^PQVzR2#n8oPXkI(atWsaiwzRV>?CDOKG<^7g^*uaJN{p@J`TNt5X;A#e_q7(~8<- zJ@b4Xi~Gps{e35Npf+Mv*!Q9XMfobncFglTyGF&-d)~}bi@#ki6Ja{rit4Bfzh_(& z+vA;kZ_nbT%O}rovt%isvo3nqE6KMmBHHfzWH-c}JTAUHHtXeQ){R^fuJBYxGF>@b z>i_Lm_EAZGal5u@Y)KpS4wqcKI-{MDFBIDGinIKiR8%*ezT%y>9nm5qUek%56T zUWJW;6U;ET;7xK9xK=gy{|~m$(|YW4^0SxSwvP^(wot>%tzRPG&52yW2XFaXxm#BW UMjeyo-nLd`_r164YBur!0Q|U|x&QzG literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_dvca_ado2.cer b/src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_dvca_ado2.cer new file mode 100644 index 0000000000000000000000000000000000000000..1d6f7c173dd3058a04ff9f690865c8c8b34eaaba GIT binary patch literal 238 zcmYdqd|j{DIIG?-CSH?~q2AM-jf;h$o`IbS1llZFY){E=uyhpscZu<}Ypb=&JC0vB zmOS0#c!6Eys_dp&3g135I~Ls8+x=PGc;UBsYgW2msrVMywO3gzUV+=i)g{c?(KWy^ zI5^(iB1K2#PVxhB|4FL~_fLuMc=__p$!j+MlYK@0GtNx;yV7KZ$im+>CrQ7bJN=U91^`E*YlZ*- literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_dvca_cert1.cer b/src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_dvca_cert1.cer new file mode 100644 index 0000000000000000000000000000000000000000..c16c2d279c15b2e4112521330a25fc532c9d17a2 GIT binary patch literal 212 zcmb${;i*mLt Iy2`-@0CfpSM*si- literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_dvca_req.cer b/src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_dvca_req.cer new file mode 100644 index 0000000000000000000000000000000000000000..382351d6aec5edf8048d1fa566b3d130330c1261 GIT binary patch literal 158 zcmb9Md=}HyaKn2t4o-(qicX;aB#f2 zg~&>s^A%O%o~4%`ur}8kUXxxp$>wNyctJx6?Ct(6ZoKf@yfrIbuT*>s?Aog=7O%kV;_4FS?C2Wc7#tjL zZjqv+awqwLxc{V8h5M((cf5T0=HxY-|H-~0{~2ed{9S3XLS*6Z8Fy7;X6C&q{pXWs NvHgH=;@s7e>;N+x6?Ct(6ZoKf@yfrIbuT*>s?Aog=7O%kV;_4FS?C2Wc7#tjL zZjqv+awqwLxc{V8h5M((cf5T0=HxY-|H-~0{~2ed{9S3XLS*6Z8Fy7;X6C&q{pXWs NvHgH=;@s7e>;N+K)=&%n+E0&SKoy|IrT z&p8l!;QjNgzjF@lzjdRZ|IEg>=}SAm$cA->y`Q|z?m(O4%BxdLWIi0<+J3@V@NGNW zf^E&L@d}(SuAWd+efZco!KN}ZGBE}-GRLd3F>o+4FmT4JfEbJnobl!s99$7XSLRv8 z&U~}`+{`fNI~E->+gDZB|6a4FYu4lh;o`aI^_^SUQvMoqE&Lts9MMh! E09KSvvH$=8 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_is_req.cer b/src/libs/3rdparty/botan/checks/ecc_testdata/cvc_chain_is_req.cer new file mode 100644 index 0000000000000000000000000000000000000000..144495f8b252964fcbccbe1ab1df1d40fde0f4f2 GIT binary patch literal 151 zcmb&F(;(4xbq;fOG%zqQFs%1%{L9A0!cfn^&IAIDGS?59tWtAM zYtxc2P%XW9y?w)c_VDSqI=|MPIPkwoCS&O{ot5WuWHe_mFFP2_9q1>abz=jIR^+Km z^PQVzR2#n8oPXkI(atWsaiwzRV>?CDOKG<^7g^*uaJN{p@J`TNt5X;A#e_q7(~8<- zJ@b4Xi~Gps{e35Npf+Mv*!Q9XMfobncFglTyGF&-d)~}bi@#ki6Ja{rit4Bfzh_(& z+vA;kZ_nbT%O}rovt*eYcShxTl$heGCs+DEdiQK7dBd`w^%Hw`L$qaMK%&XEEp3PH z&uU;_-Nc+Bz?gj0Zmp2i2Wgvx>UKuPcm<^3Fsk?AW8(ye1~VfQV=&|4cvUtA4n_tB z&Uh6z22L=;+~TSgfsiObZ U%qVp`c}ZX2%Wuk5*7GMF0NzKKo&W#< literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/cvca01.cv.crt b/src/libs/3rdparty/botan/checks/ecc_testdata/cvca01.cv.crt new file mode 100644 index 0000000000000000000000000000000000000000..8f278167c3c423f763f6459726e3593f972b64a1 GIT binary patch literal 402 zcmbrPpojCBnNhV|IGo6*^a%41TFfTh8%pK?_p><;e zi&o^ROY@zZWmFr!*_?mkXwl9tym6&+=3_fW(@SZ$Hy2stIB>UEvhYsOT&q(T^TmWi zdDDv8V?FbH9*g_P<^6ppbf7k3RoM5U14a2N$9Bx~JG(~3)O+5{Q;WY{E)!uo+luO_ z3%_Sv6x-vSdvDL;rOPMJZ?j~Hf4)UcgflPw@uslS_q%U;&lhspSfufh^Fu}0rPj7; z`J!J5PbSUnIIusFIjY9)y!a`d#$aWR!xP#W8RHc&!^DS=jT0Os%#2Ko!HfsvRoNKW z88{d@;#Jrf8Ndv4i_D4{3LK{|c?PWAckY3eSZNw}{rbJS<>$qhUeq{$Ghuf0g}`2o YE0=^$JvRUHrDW>cmpZ()qOVeG0k7<$9RL6T literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/cvca_illegal_chars.cv.crt b/src/libs/3rdparty/botan/checks/ecc_testdata/cvca_illegal_chars.cv.crt new file mode 100644 index 0000000000000000000000000000000000000000..b1a3d266c2bbba1992bf03c2d57af57d7e72a17c GIT binary patch literal 402 zcmbrPpojCBnNhV|IGo6*^a%41TFfTh8%pK?_p><;e zi&o^ROY@zZWmFr!*_?mkXwl9tym6&+=3_fW(@SZ$Hy2stIB>UEvhYsOT&q(T^TmWi zdDDv8V?FbH9*g_P<^6ppbf7k3RoM5U14a2N$9Bx~JG(~3)O+5{Q;WY{E)!uo+luO_ z3%_Sv6x-vSdvDL;rOPMJZ?j~Hf4)UcgflPw@uslS_q%U;&lhspSfufh^Fu}0rPj7; z`J!J5PbSUnIIusFIjY9)y!a`d#$aWR!xP#W8RHcoVd97sCO&*@oZui~W@KUvW;__L z%ErLXz`@87ufoR20A`q5WLC^j;5dEBGhpq$a}TVPzvH6!TB~#zN)ZwiaeU(}Z08^%+-v9sr literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/cvca_illegal_chars2.cv.crt b/src/libs/3rdparty/botan/checks/ecc_testdata/cvca_illegal_chars2.cv.crt new file mode 100644 index 0000000000000000000000000000000000000000..00f09b61848569522d6886d213696d103ed4aafa GIT binary patch literal 402 zcmbrPpojCBnNhV|IGo6*^a%41TFfTh8%pK?_p><;e zi&o^ROY@zZWmFr!*_?mkXwl9tym6&+=3_fW(@SZ$Hy2stIB>UEvhYsOT&q(T^TmWi zdDDv8V?FbH9*g_P<^6ppbf7k3RoM5U14a2N$9Bx~JG(~3)O+5{Q;WY{E)!uo+luO_ z3%_Sv6x-vSdvDL;rOPMJZ?j~Hf4)UcgflPw@uslS_q%U;&lhspSfufh^Fu}0rPj7; z`J!J5PbSUnIIusFIjY9)y!a`d#$aWR!xP#W8RHcoVd97sCO&*@oZui~W@KUvW;__L z%ErLXz`@87ufoR20A`q5WLC^j;5dEBGhpq$a}TVPzvH6!TB~#zN)ZwiaeU(}Z01QE*TL1t6 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/ec_for_flex_mes.sig b/src/libs/3rdparty/botan/checks/ecc_testdata/ec_for_flex_mes.sig new file mode 100644 index 00000000000..6d9983b67a6 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/ecc_testdata/ec_for_flex_mes.sig @@ -0,0 +1 @@ +MGQCMG+ULXRAhLe+GESTVKd+aT3tn46209cLl9LTxDoj1lz/G9Xlw4QpwuCP1TJnRwNySgIwUu+8u32frzcZ2EhNMRrFcyH9t/8GGdvAlszc4k4TSvMK+Rz+5eZ+6hYX3lEsusCY diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/ec_oid_not_in_reg_private_2.pkcs8.pem b/src/libs/3rdparty/botan/checks/ecc_testdata/ec_oid_not_in_reg_private_2.pkcs8.pem new file mode 100644 index 00000000000..7a17079714f --- /dev/null +++ b/src/libs/3rdparty/botan/checks/ecc_testdata/ec_oid_not_in_reg_private_2.pkcs8.pem @@ -0,0 +1,7 @@ +-----BEGIN PRIVATE KEY----- +MIHaAgEAMIG0BgcqhkjOPQIBMIGoAgEBMCIGByqGSM49AQECFw4aFhluYAAAAAC8 +d5mvQORfIMKCpz8jMDIEFwpp6Dq3yY/XFMent6k68ZVN0TLoYuwCBBcF27ytezfC +QvUCsMLrgpmKMPgl7QmshQQvBAegDesPaZK6sjNlLdtcbzMdfScPlwnsBYlNHz+Z +VzzAHH+at1C946ahHkssjp4CFw4aFhluYAAAAAC8fxYY2GexW7hkdEGPAgEBBB4w +HAIBAQQXBJJ/aqWyXJt0gblb7AjQYjSqWnHULjY= +-----END PRIVATE KEY----- diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/flex_cert.crt b/src/libs/3rdparty/botan/checks/ecc_testdata/flex_cert.crt new file mode 100644 index 0000000000000000000000000000000000000000..0b9015cb22cae3f48c4bfbdc01c38f8cecc3d6a7 GIT binary patch literal 412 zcmXqLVw_>n#OS(!nTe5!iIKs8n~hzo&EuRc3nMFofsmnq0UsN4C=0VNdq`?=iGs7E zft)z6fw`ffk)@%bk&%IUlsK<}1rpal#*o*58={8=q{ookfD^=J6J~O8HE6tT(6|F? z1rwt|;~FMLMgt9~03#!lEW`DKCact()7rEo3{*=mUT@zppFMo~twEV9hJ6ExTA)Wv);;ZWYRqV`zNJfFwnK5}_~-w7S4MYsFH?->`x_IT&s z+p~D-^2zg=7#W%67?@Y3t0!)r-nTn`gQs+?;b+w|b8d>xeDwX$gWF$$n^Feepf!X#ORSqwoy)Ib;{$;`u(T%4S!o1R*fo0wN=AScdi zU~XV;Xkln*Y+zy@CC+PPW?*P&VQ64vVPF|$;7@{$Q2SYhnJp|V3~^Z4#3*dgcm?Vy zCPstC6HJVZ1{zQSMn)!ChU*7SR;f9swP{HhsFq&5-o9Zzd-(KQonPxt9Qbcw!y?0_ zWW3sERV&BDt!Ejyf~y^qzdbf?dsXOKxaQUc78#$^B+WOTVy7im1Ws3K^IFdk^VDYL z(y#uT7K(JUSh7Si8m`Us^VxX!Y4E>Y@7{Y%+jM|AI3j#PZAN+59R0XmFYN9s*UBFG zd$ja4OPAidW!dFM%esy$>7l#pQrLnE+gsW`9;(ZlI+gt_6C)$D6$8t~t)&}tDozWr zC_b6*@~F+QVz%M@H*cn`uBkdY&+wjB=v|Ko)5@R9zdvlp*6b5pqxDod-{8QKkAaJu z7zGTP7j*Bg!GEI8zT4%X%rPZGvfu6;|3NmPSSvmZla)=0-*a zd?0=NjEw(TSeTg@*$iYsd_ER27Lnb|t?e4Rv+Jd9O-@jFn)T_HQ1n{^d62X+i-dt# zgUI9?dnT7L&t1RBb>gfh-(czAdV$&ojvxgJELH{<24-xWEDZGw?97aej0Tzp>TDd^ zY>cd|>`aVe(itTs1y=g{<>lpiNDkBox!gbqWP~utNgM`jjEw)87#R$-L1F?dDh5go z{6+>SDX)>=$iT?l5Gm~;Cw*pn1_K)=8INrX%lWp*XNE6Lx7X@BhyN=Sn06Qd-vb1) literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/link_SHA256.cer b/src/libs/3rdparty/botan/checks/ecc_testdata/link_SHA256.cer new file mode 100644 index 0000000000000000000000000000000000000000..add40f738832333c8b19b76c4168662c96602677 GIT binary patch literal 1790 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 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/root_SHA1.163.crt b/src/libs/3rdparty/botan/checks/ecc_testdata/root_SHA1.163.crt new file mode 100644 index 0000000000000000000000000000000000000000..e1bf39f9acaaea17d089ad51beaeeb1d0553c4d7 GIT binary patch literal 860 zcmXqLVvaCqVrE^y%*4pV#Kf@JfSZk7tIgw_Eej(ngF%2Hw*e;`b0`a&Fq4a`A+G^9 zh{MIhl2n?PV#s5_1>$n^Feepf!X#ORSqwoy)Ib;{$;`u(T%4S!o1R*fo0wN=AScdi zU~XV;Xl`g=YGP~#IH_T@bpMIltF6+N@mq)qm4Mk!}`CmPkg! zwV8fC8}B|1{z9|8>mfN%ALMcaA&?QmASZDc zurV_JXJTY9&<2SKu&5X)HSil5pd`IUej@`Tb3>%Whn)7A9T*I3nPene&#cT%JS+3) zMsd5qmgv_9Z-`dsSgqVvUa6YMB+Ibhx%JSSzrA-ps2tqv%wxx1*?*+@&e0WLj!#uc F1OR{B1O5O2 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/withdompar_private.pkcs8.pem b/src/libs/3rdparty/botan/checks/ecc_testdata/withdompar_private.pkcs8.pem new file mode 100644 index 00000000000..85d7b575e28 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/ecc_testdata/withdompar_private.pkcs8.pem @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MGACAQAwGAYHKoZIzj0CAQYNKwYBBAHAbQMBAgkAIQRBMD8CAQEEOgG97/hDkXbJ +tgF36JmM7NliJIlDFzTm69KYouwhjPOsh6hKo5NPTtsmHafplOqpUf0TyAhB1Q88 +3xA= +-----END PRIVATE KEY----- diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/x509_req_test_expl.pem b/src/libs/3rdparty/botan/checks/ecc_testdata/x509_req_test_expl.pem new file mode 100644 index 00000000000..e4ae1a9b346 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/ecc_testdata/x509_req_test_expl.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIDFDCCApgCAQAwaTELMAkGA1UEBhMCREUxCzAJBgNVBAgTAk1EMRIwEAYDVQQH +EwlCYWx0aW1vcmUxEzARBgNVBAoTCkZsZXhTZWN1cmUxEDAOBgNVBAsTB1Rlc3Rp +bmcxEjAQBgNVBAMUCXRlc3RfemVydDCCAYUwggFNBgcqhkjOPQIBMIIBQAIBATA8 +BgcqhkjOPQEBAjEAjLkegqM4bSgPXW9+UOZB3xUvcQntVFa0ErHaGX+3ESOs06cp +kB0acYdHABMxB+xTMGQEMHvDgsY9jBUMPHIICs4Fr6DCvqKOT7InhxORZe+6kfkP +iqWBSlA61OsEqMfdIs4oJgQwBKjH3SLOKCaLObVUFvBEfC+3feEH3NKmLogOpT7r +YtV8tDkCldvJlDq3hpb6UEwRBGEEHRxk8GjPRf+ipjqBt8E/a4hHo+d+8U/j23/K +/gy9EOjoJuA0NtZGqu+HsuJH1K8eir4ddSD5wqRcseuOlc/VUmK3Cyn+7Fhk4ZwF +T/mRKSgORkYhd5GBEUKCA0EmPFMVAjEAjLkegqM4bSgPXW9+UOZB3xUvcQntVFaz +HxZubKwEJafPOrava3/DEDuIMgLpBGVlAgEBAzIAAjv2NeapXSWoiFe/2KBvFS8x +lDmexNgl0TK6vgVCDoI2AOVkkJQ9wjqpFsrKG67YlqCBnjArBgkqhkiG9w0BCQcx +HhMcYSBmaXhlZCBjaGFsbGVuZ2UgcGFzc3BocmFzZTBvBgkqhkiG9w0BCQ4xYjBg +MAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgbAMCcGA1UdJQQgMB4GCCsGAQUF +BwMCBggrBgEFBQcDBwYIKwYBBQUHAwQwFwYDVR0RBBAwDoEMdGVzdEB0ZXN0LmRl +MAwGCCqGSM49BAMBBQADaAAwZQIxAIOkl6jVpL8C2V6zpUqnLQEMC+T8ocxKGxnm ++0ZKEgwMCqfD9WJo2C1hZ/1iZPcQmgIwKNMUgDbn16AZZqJCk/2sU0JvqkR0D/Ue +FksrSdAxjpnauRDOXMTbzpdsnzAnDNIU +-----END CERTIFICATE REQUEST----- diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/x509_req_test_oid.pem b/src/libs/3rdparty/botan/checks/ecc_testdata/x509_req_test_oid.pem new file mode 100644 index 00000000000..2ae0c2ea521 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/ecc_testdata/x509_req_test_oid.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIB1jCCAVsCAQAwaTELMAkGA1UEBhMCREUxCzAJBgNVBAgTAk1EMRIwEAYDVQQH +EwlCYWx0aW1vcmUxEzARBgNVBAoTCkZsZXhTZWN1cmUxEDAOBgNVBAsTB1Rlc3Rp +bmcxEjAQBgNVBAMUCXRlc3RfemVydDBKMBQGByqGSM49AgEGCSskAwMCCAEBCwMy +AAMLt+cMOPYmbgVHwaUFmEJIfYCNpgPyWkIyYHPiY4SF2UC0nTQv7el1+Dpt4Ueo +mQGggZ4wKwYJKoZIhvcNAQkHMR4THGEgZml4ZWQgY2hhbGxlbmdlIHBhc3NwaHJh +c2UwbwYJKoZIhvcNAQkOMWIwYDAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIG +wDAnBgNVHSUEIDAeBggrBgEFBQcDAgYIKwYBBQUHAwcGCCsGAQUFBwMEMBcGA1Ud +EQQQMA6BDHRlc3RAdGVzdC5kZTAMBggqhkjOPQQDAQUAA2cAMGQCMC4uFJYZ7CUN +rqQrCAxJAqWIuZrKvvlHyu+Q6VibIUjwh2guPNJDmbW/iorXcu3yAwIwbOjPSSMD +5XvumhMwuV6kHmn+5DjCPLUQLuLQhNeU06bExcCuutz5DMVix05w7gox +-----END CERTIFICATE REQUEST----- diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/x509_test_privkey_expl_pw123456.pem b/src/libs/3rdparty/botan/checks/ecc_testdata/x509_test_privkey_expl_pw123456.pem new file mode 100644 index 00000000000..20f17130ca1 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/ecc_testdata/x509_test_privkey_expl_pw123456.pem @@ -0,0 +1,13 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIB4TBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIS+GhX0d3oQkCAggA +AgEYMBQGCCqGSIb3DQMHBAjSmLY2CqIVlgSCAZicGlQqDD2ZC8Tmnp43tqUnFnMc +ZU6RdY5ys1WQ2Blvn5eKhK0n9yz3b9LvIzs9U6shbBPN/GePeOFFZQi0M9+SIrjj +NjpjqaJtUvhPt3tDn0B3o0raWLsJ2TvXxO0UNRZYk1YniGEecCUY/shMPpop6Tns +079QXRNuAqGeEcouKIQcJjGR3GbPbccBUUbkAjrK7f4tMTHOzoei3SJ50IcSh1hh +vYbyKFBmxi30gYc95T9VO+XsrDLP4QZXrM6S6o8xkbx1o9hHuGeiSiSOpQ/6iVUt +nRMR1GW1MZGQeJazdnccx+8C4iuW9LOfyvA7HEC8F0LLZ6mCGtLcMt8Vk+en24nJ +od4W0EqJmcasfbF+VNPNuFzwIPvEzgeyYTp5P6wfc81cqlBMfl1AGKFR8u9372UW +PWPcsqrGR3OggRcXvRc+9UKtsLoALel8esZrJzNurqkU10XePUR9Vup3Ke7kvT/o +g+uA5vboio3Jy2FoJE/YF0jKDJfbzMWJeSetJwLfrKEvsmdpUf9jeUoaze0S4LzB +JHJ+NMg= +-----END ENCRYPTED PRIVATE KEY----- diff --git a/src/libs/3rdparty/botan/checks/ecc_testdata/x509_test_privkey_oid_pw123456.pem b/src/libs/3rdparty/botan/checks/ecc_testdata/x509_test_privkey_oid_pw123456.pem new file mode 100644 index 00000000000..ecd188a5dba --- /dev/null +++ b/src/libs/3rdparty/botan/checks/ecc_testdata/x509_test_privkey_oid_pw123456.pem @@ -0,0 +1,13 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIB4TBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIJ7F/jO3zVxQCAggA +AgEYMBQGCCqGSIb3DQMHBAjBY6p0ZIHowASCAZg/JGcpBr2lh1x9WUI7J/1jCdwn +HvJu+aes3+I57MdI75ca7Z5wixO50pYUWkfexfdkm5k11HVz7ETJuNvVw+p937kI +EJtX0ukBsdsgcGcoKFCZG1JIhClqyCnx38CIdE1C8TE/7Yyk5YFMeNP9LbMH9jC5 +gAJV9+YSpw1F9q6OOXv61s9uKIHq7VWza77CJKjFNLpn1/5FqTISmDXV3V2Rs8eI +j7hFMRBpRnEAA+DOgjuEkTMgF7UR39YTTBooUSzUB4kSlRQxeP7HrulboLB0ukO3 +CT5qa/kA9lHJgHYZXNjzS5NzsoZeZcU934AEBm7J2vr/voHYU8zPrgRAmz8D25Gf +UH4kaQLZ3LDGlbcba8yjlOYd+x5Rl9H6vKORoqAGN0sLPLAryjzs+vS486SUlRiy +LsNqcrSOYoW1MyOYAJajxvUsUDqZyxp64TMegZlyLZGIu2ngFOd1gZsh+T2X3g8C +Murum3ynFx+H3HF1JwpZB/gImz+BI8JigUnd4fG2gqvx7wu6cqoaRGJQayilj64O +AZU+x5c= +-----END ENCRYPTED PRIVATE KEY----- diff --git a/src/libs/3rdparty/botan/checks/ecdsa.cpp b/src/libs/3rdparty/botan/checks/ecdsa.cpp new file mode 100644 index 00000000000..532a1c5466c --- /dev/null +++ b/src/libs/3rdparty/botan/checks/ecdsa.cpp @@ -0,0 +1,556 @@ +/****************************************************** +* ECDSA tests * +* * +* (C) 2007 Falko Strenzke * +* Manuel Hartl * +* 2008 Jack Lloyd * +******************************************************/ + +#include "validate.h" + +#if defined(BOTAN_HAS_ECDSA) + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "common.h" + +using namespace Botan; + +#define TEST_DATA_DIR "checks/ecc_testdata" + +#define CHECK_MESSAGE(expr, print) try { if(!(expr)) std::cout << print << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } +#define CHECK(expr) try { if(!(expr)) std::cout << #expr << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } + +namespace { + +std::string to_hex(const SecureVector& bin) + { + return hex_encode(bin.begin(), bin.size()); + } + +/** + +* Tests whether the the signing routine will work correctly in case the integer e +* that is constructed from the message (thus the hash value) is larger than n, the order of the base point. +* Tests the signing function of the pk signer object +*/ + +void test_hash_larger_than_n(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + // n: + // 0x0100000000000000000001f4c8f927aed3ca752257 // 21 bytes + // -> shouldn't work with SHA224 which outputs 23 bytes + ECDSA_PrivateKey priv_key(rng, dom_pars); + SecureVector message; + for (unsigned j= 0; j<20; j++) + { + message.append(j); + } + + for (int i = 0; i<3; i++) + { + //cout << "i = " << i << endl; + std::string format; + if(i==1) + { + format = "EMSA1_BSI(SHA-224)"; + } + else + { + format = "EMSA1_BSI(SHA-1)"; + } + std::auto_ptr pk_signer(get_pk_signer(priv_key, format)); + SecureVector signature; + bool sig_exc = false; + try + { + signature = pk_signer->sign_message(message, rng); + } + catch(Encoding_Error e) + { + sig_exc = true; + } + if(i==1) + { + CHECK(sig_exc); + } + if(i==0) + { + CHECK(!sig_exc); + } + + + if(i==0) // makes no sense to check for sha224 + { + std::auto_ptr pk_verifier(get_pk_verifier(priv_key, format)); + bool ver = pk_verifier->verify_message(message, signature); + CHECK(ver); + } + + } // for + + // now check that verification alone fails + + // sign it with the normal EMSA1 + std::auto_ptr pk_signer(get_pk_signer(priv_key, "EMSA1(SHA-224)")); + SecureVector signature = pk_signer->sign_message(message, rng); + + std::auto_ptr pk_verifier(get_pk_verifier(priv_key, "EMSA1_BSI(SHA-224)")); + + // verify against EMSA1_BSI + // we make sure it doesn't fail because of the invalid signature, + // but because of the Encoding_Error + + bool ver_exc = false; + try + { + pk_verifier->verify_message(message, signature); + } + catch(Encoding_Error e) + { + ver_exc = true; + } + CHECK(ver_exc); + } + +/** +* Tests whether the the signing routine will work correctly in case the integer e +* that is constructed from the message is larger than n, the order of the base point +*/ +void test_message_larger_than_n(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + ECDSA_PrivateKey priv_key(rng, dom_pars); + std::string str_message = ("12345678901234567890abcdef1212345678901234567890abcdef1212345678901234567890abcdef12"); + + SecureVector sv_message = decode_hex(str_message); + bool thrn = false; + SecureVector signature; + try + { + signature = priv_key.sign(sv_message.begin(), sv_message.size(), rng); + } + catch (Invalid_Argument e) + { + thrn = true; + } + //cout << "signature = " << hex_encode(signature.begin(), signature.size()) << "\n"; + bool ver_success = priv_key.verify(sv_message.begin(), sv_message.size(), signature.begin(), signature.size()); + CHECK_MESSAGE(ver_success, "generated signature could not be verified positively"); + //CHECK_MESSAGE(thrn, "no exception was thrown although message to sign was too long"); + } + +void test_decode_ecdsa_X509() + { + std::cout << "." << std::flush; + + X509_Certificate cert(TEST_DATA_DIR "/CSCA.CSCA.csca-germany.1.crt"); + CHECK_MESSAGE(OIDS::lookup(cert.signature_algorithm().oid) == "ECDSA/EMSA1_BSI(SHA-224)", "error reading signature algorithm from x509 ecdsa certificate"); + + CHECK_MESSAGE(to_hex(cert.serial_number()) == "01", "error reading serial from x509 ecdsa certificate"); + CHECK_MESSAGE(to_hex(cert.authority_key_id()) == "0096452DE588F966C4CCDF161DD1F3F5341B71E7", "error reading authority key id from x509 ecdsa certificate"); + CHECK_MESSAGE(to_hex(cert.subject_key_id()) == "0096452DE588F966C4CCDF161DD1F3F5341B71E7", "error reading Subject key id from x509 ecdsa certificate"); + + std::auto_ptr pubkey(cert.subject_public_key()); + bool ver_ec = cert.check_signature(*pubkey); + CHECK_MESSAGE(ver_ec, "could not positively verify correct selfsigned x509-ecdsa certificate"); + } + +void test_decode_ver_link_SHA256() + { + std::cout << "." << std::flush; + + X509_Certificate root_cert(TEST_DATA_DIR "/root2_SHA256.cer"); + X509_Certificate link_cert(TEST_DATA_DIR "/link_SHA256.cer"); + + std::auto_ptr pubkey(root_cert.subject_public_key()); + bool ver_ec = link_cert.check_signature(*pubkey); + CHECK_MESSAGE(ver_ec, "could not positively verify correct SHA256 link x509-ecdsa certificate"); + + } +void test_decode_ver_link_SHA1() + { + std::cout << "." << std::flush; + + X509_Certificate root_cert(TEST_DATA_DIR "/root_SHA1.163.crt"); + X509_Certificate link_cert(TEST_DATA_DIR "/link_SHA1.166.crt"); + + std::auto_ptr pubkey(root_cert.subject_public_key()); + bool ver_ec = link_cert.check_signature(*pubkey); + CHECK_MESSAGE(ver_ec, "could not positively verify correct SHA1 link x509-ecdsa certificate"); + } + +void test_sign_then_ver(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + std::string g_secp("024a96b5688ef573284664698968c38bb913cbfc82"); + SecureVector sv_g_secp = decode_hex(g_secp); + BigInt bi_p_secp("0xffffffffffffffffffffffffffffffff7fffffff"); + BigInt bi_a_secp("0xffffffffffffffffffffffffffffffff7ffffffc"); + BigInt bi_b_secp("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); + BigInt order = BigInt("0x0100000000000000000001f4c8f927aed3ca752257"); + CurveGFp curve(GFpElement(bi_p_secp,bi_a_secp), GFpElement(bi_p_secp, bi_b_secp), bi_p_secp); + BigInt cofactor = BigInt(1); + PointGFp p_G = OS2ECP ( sv_g_secp, curve ); + + EC_Domain_Params dom_pars = EC_Domain_Params(curve, p_G, order, cofactor); + ECDSA_PrivateKey my_priv_key(rng, dom_pars); + + std::string str_message = ("12345678901234567890abcdef12"); + SecureVector sv_message = decode_hex(str_message); + SecureVector signature = my_priv_key.sign(sv_message.begin(), sv_message.size(), rng); + //cout << "signature = " << hex_encode(signature.begin(), signature.size()) << "\n"; + bool ver_success = my_priv_key.verify(sv_message.begin(), sv_message.size(), signature.begin(), signature.size()); + CHECK_MESSAGE(ver_success, "generated signature could not be verified positively"); + signature[signature.size()-1] += 0x01; + bool ver_must_fail = my_priv_key.verify(sv_message.begin(), sv_message.size(), signature.begin(), signature.size()); + CHECK_MESSAGE(!ver_must_fail, "corrupted signature could be verified positively"); + } + +bool test_ec_sign(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + try + { + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + ECDSA_PrivateKey priv_key(rng, dom_pars); + std::string pem_encoded_key = PKCS8::PEM_encode(priv_key); + + std::auto_ptr signer(get_pk_signer(priv_key, "EMSA1(SHA-224)")); + std::auto_ptr verifier(get_pk_verifier(priv_key, "EMSA1(SHA-224)")); + + for(u32bit i = 0; i != 256; ++i) + signer->update((byte)i); + SecureVector sig = signer->signature(rng); + + for(u32bit i = 0; i != 256; ++i) + verifier->update((byte)i); + if(!verifier->check_signature(sig)) + { + std::cout << "ECDSA self-test failed!"; + return false; + } + + // now check valid signature, different input + for(u32bit i = 1; i != 256; ++i) //starting from 1 + verifier->update((byte)i); + + if(verifier->check_signature(sig)) + { + std::cout << "ECDSA with bad input passed validation"; + return false; + } + + // now check with original input, modified signature + + sig[sig.size()/2]++; + for(u32bit i = 0; i != 256; ++i) + verifier->update((byte)i); + + if(verifier->check_signature(sig)) + { + std::cout << "ECDSA with bad signature passed validation"; + return false; + } + } + catch (std::exception& e) + { + std::cout << "Exception in test_ec_sign - " << e.what() << "\n"; + return false; + } + return true; + } + + +void test_create_pkcs8(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + try + { + RSA_PrivateKey rsa_key(rng, 1024); + //RSA_PrivateKey rsa_key2(1024); + //cout << "\nequal: " << (rsa_key == rsa_key2) << "\n"; + //DSA_PrivateKey key(DL_Group("dsa/jce/1024")); + + std::ofstream rsa_priv_key(TEST_DATA_DIR "/rsa_private.pkcs8.pem"); + rsa_priv_key << PKCS8::PEM_encode(rsa_key); + + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + ECDSA_PrivateKey key(rng, dom_pars); + + // later used by other tests :( + std::ofstream priv_key(TEST_DATA_DIR "/wo_dompar_private.pkcs8.pem"); + priv_key << PKCS8::PEM_encode(key); + } + catch (std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + } + } + +void test_create_and_verify(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + ECDSA_PrivateKey key(rng, dom_pars); + std::ofstream priv_key(TEST_DATA_DIR "/dompar_private.pkcs8.pem"); + priv_key << PKCS8::PEM_encode(key); + + std::auto_ptr loaded_key(PKCS8::load_key(TEST_DATA_DIR "/wo_dompar_private.pkcs8.pem", rng)); + ECDSA_PrivateKey* loaded_ec_key = dynamic_cast(loaded_key.get()); + CHECK_MESSAGE(loaded_ec_key, "the loaded key could not be converted into an ECDSA_PrivateKey"); + + std::auto_ptr loaded_key_1(PKCS8::load_key(TEST_DATA_DIR "/rsa_private.pkcs8.pem", rng)); + ECDSA_PrivateKey* loaded_rsa_key = dynamic_cast(loaded_key_1.get()); + CHECK_MESSAGE(!loaded_rsa_key, "the loaded key is ECDSA_PrivateKey -> shouldn't be, is a RSA-Key"); + + //calc a curve which is not in the registry + + // string p_secp = "2117607112719756483104013348936480976596328609518055062007450442679169492999007105354629105748524349829824407773719892437896937279095106809"; + std::string a_secp = "0a377dede6b523333d36c78e9b0eaa3bf48ce93041f6d4fc34014d08f6833807498deedd4290101c5866e8dfb589485d13357b9e78c2d7fbe9fe"; + std::string b_secp = "0a9acf8c8ba617777e248509bcb4717d4db346202bf9e352cd5633731dd92a51b72a4dc3b3d17c823fcc8fbda4da08f25dea89046087342595a7"; + std::string G_secp_comp = "04081523d03d4f12cd02879dea4bf6a4f3a7df26ed888f10c5b2235a1274c386a2f218300dee6ed217841164533bcdc903f07a096f9fbf4ee95bac098a111f296f5830fe5c35b3e344d5df3a2256985f64fbe6d0edcc4c61d18bef681dd399df3d0194c5a4315e012e0245ecea56365baa9e8be1f7"; + std::string order_g = "0e1a16196e6000000000bc7f1618d867b15bb86474418f"; + + // ::SecureVector sv_p_secp = decode_hex ( p_secp ); + SecureVector sv_a_secp = decode_hex ( a_secp ); + SecureVector sv_b_secp = decode_hex ( b_secp ); + SecureVector sv_G_secp_comp = decode_hex ( G_secp_comp ); + SecureVector sv_order_g = decode_hex ( order_g ); + + // BigInt bi_p_secp = BigInt::decode ( sv_p_secp.begin(), sv_p_secp.size() ); + BigInt bi_p_secp("2117607112719756483104013348936480976596328609518055062007450442679169492999007105354629105748524349829824407773719892437896937279095106809"); + BigInt bi_a_secp = BigInt::decode ( sv_a_secp.begin(), sv_a_secp.size() ); + BigInt bi_b_secp = BigInt::decode ( sv_b_secp.begin(), sv_b_secp.size() ); + BigInt bi_order_g = BigInt::decode ( sv_order_g.begin(), sv_order_g.size() ); + CurveGFp curve ( GFpElement ( bi_p_secp,bi_a_secp ), GFpElement ( bi_p_secp, bi_b_secp ), bi_p_secp ); + PointGFp p_G = OS2ECP ( sv_G_secp_comp, curve ); + + EC_Domain_Params dom_params(curve, p_G, bi_order_g, BigInt(1)); + p_G.check_invariants(); + + ECDSA_PrivateKey key_odd_oid(rng, dom_params); + std::string key_odd_oid_str = PKCS8::PEM_encode(key_odd_oid); + + DataSource_Memory key_data_src(key_odd_oid_str); + std::auto_ptr loaded_key2(PKCS8::load_key(key_data_src, rng)); + + if(!dynamic_cast(loaded_key.get())) + { + std::cout << "Failed to reload an ECDSA key with unusual parameter set\n"; + } + } + +void test_curve_registry(RandomNumberGenerator& rng) + { + std::vector oids; + oids.push_back("1.3.132.0.8"); + oids.push_back("1.2.840.10045.3.1.1"); + oids.push_back("1.2.840.10045.3.1.2"); + oids.push_back("1.2.840.10045.3.1.3"); + oids.push_back("1.2.840.10045.3.1.4"); + oids.push_back("1.2.840.10045.3.1.5"); + oids.push_back("1.2.840.10045.3.1.6"); + oids.push_back("1.2.840.10045.3.1.7"); + oids.push_back("1.3.132.0.6"); + oids.push_back("1.3.132.0.7"); + oids.push_back("1.3.132.0.28"); + oids.push_back("1.3.132.0.29"); + oids.push_back("1.3.132.0.9"); + oids.push_back("1.3.132.0.30"); + oids.push_back("1.3.132.0.31"); + oids.push_back("1.3.132.0.32"); + oids.push_back("1.3.132.0.33"); + oids.push_back("1.3.132.0.10"); + oids.push_back("1.3.132.0.34"); + oids.push_back("1.3.132.0.35"); + oids.push_back("1.3.6.1.4.1.8301.3.1.2.9.0.38"); + oids.push_back("1.3.36.3.3.2.8.1.1.1"); + oids.push_back("1.3.36.3.3.2.8.1.1.3"); + oids.push_back("1.3.36.3.3.2.8.1.1.5"); + oids.push_back("1.3.36.3.3.2.8.1.1.7"); + oids.push_back("1.3.36.3.3.2.8.1.1.9"); + oids.push_back("1.3.36.3.3.2.8.1.1.11"); + oids.push_back("1.3.36.3.3.2.8.1.1.13"); + + unsigned int i; + for (i = 0; i < oids.size(); i++) + { + std::cout << "." << std::flush; + + try + { + EC_Domain_Params dom_pars(get_EC_Dom_Pars_by_oid(oids[i])); + dom_pars.get_base_point().check_invariants(); + ECDSA_PrivateKey key(rng, dom_pars); + + std::string str_message = ("12345678901234567890abcdef12"); + SecureVector sv_message = decode_hex(str_message); + SecureVector signature = key.sign(sv_message.begin(), sv_message.size(), rng); + bool ver_success = key.verify(sv_message.begin(), sv_message.size(), signature.begin(), signature.size()); + CHECK_MESSAGE(ver_success, "generated signature could not be verified positively"); + } + catch(Invalid_Argument& e) + { + std::cout << "Error testing curve " << oids[i] << " - " << e.what() << "\n"; + } + } + // std::cout << "test_curve_registry finished" << endl; + } + +void test_read_pkcs8(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + try + { + std::auto_ptr loaded_key(PKCS8::load_key(TEST_DATA_DIR "/wo_dompar_private.pkcs8.pem", rng)); + ECDSA_PrivateKey* loaded_ec_key = dynamic_cast(loaded_key.get()); + CHECK_MESSAGE(loaded_ec_key, "the loaded key could not be converted into an ECDSA_PrivateKey"); + + std::string str_message = ("12345678901234567890abcdef12"); + SecureVector sv_message = decode_hex(str_message); + SecureVector signature = loaded_ec_key->sign(sv_message.begin(), sv_message.size(), rng); + //cout << "signature = " << hex_encode(signature.begin(), signature.size()) << "\n"; + bool ver_success = loaded_ec_key->verify(sv_message.begin(), sv_message.size(), signature.begin(), signature.size()); + CHECK_MESSAGE(ver_success, "generated signature could not be verified positively"); + + std::auto_ptr loaded_key_nodp(PKCS8::load_key(TEST_DATA_DIR "/nodompar_private.pkcs8.pem", rng)); + // anew in each test with unregistered domain-parameters + ECDSA_PrivateKey* loaded_ec_key_nodp = dynamic_cast(loaded_key_nodp.get()); + CHECK_MESSAGE(loaded_ec_key_nodp, "the loaded key could not be converted into an ECDSA_PrivateKey"); + + SecureVector signature_nodp = loaded_ec_key_nodp->sign(sv_message.begin(), sv_message.size(), rng); + //cout << "signature = " << hex_encode(signature.begin(), signature.size()) << "\n"; + bool ver_success_nodp = loaded_ec_key_nodp->verify(sv_message.begin(), sv_message.size(), signature_nodp.begin(), signature_nodp.size()); + CHECK_MESSAGE(ver_success_nodp, "generated signature could not be verified positively (no_dom)"); + try + { + std::auto_ptr loaded_key_withdp(PKCS8::load_key(TEST_DATA_DIR "/withdompar_private.pkcs8.pem", rng)); + + std::cout << "Unexpected success: loaded key with unknown OID\n"; + } + catch (std::exception& e) { /* OK */ } + } + catch (std::exception& e) + { + std::cout << "Exception in test_read_pkcs8 - " << e.what() << "\n"; + } + } + +/** +* The following test tests the copy ctors and and copy-assignment operators +*/ +void test_cp_and_as_ctors(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + std::auto_ptr loaded_key(PKCS8::load_key(TEST_DATA_DIR "/wo_dompar_private.pkcs8.pem", rng)); + ECDSA_PrivateKey* loaded_ec_key = dynamic_cast(loaded_key.get()); + CHECK_MESSAGE(loaded_ec_key, "the loaded key could not be converted into an ECDSA_PrivateKey"); + std::string str_message = ("12345678901234567890abcdef12"); + SecureVector sv_message = decode_hex(str_message); + SecureVector signature_1 = loaded_ec_key->sign(sv_message.begin(), sv_message.size(), rng); + //cout << "signature = " << hex_encode(signature.begin(), signature.size()) << "\n"; + + ECDSA_PrivateKey cp_priv_key(*loaded_ec_key); // priv-key, cp-ctor + SecureVector signature_2 = cp_priv_key.sign(sv_message.begin(), sv_message.size(), rng); + + ECDSA_PrivateKey as_priv_key = *loaded_ec_key; //priv-key, as-op + SecureVector signature_3 = as_priv_key.sign(sv_message.begin(), sv_message.size(), rng); + + ECDSA_PublicKey pk_1 = cp_priv_key; // pub-key, as-op + ECDSA_PublicKey pk_2(pk_1); // pub-key, cp-ctor + ECDSA_PublicKey pk_3; + pk_3 = pk_2; // pub-key, as-op + + bool ver_success_1 = pk_1.verify(sv_message.begin(), sv_message.size(), signature_1.begin(), signature_1.size()); + + bool ver_success_2 = pk_2.verify(sv_message.begin(), sv_message.size(), signature_2.begin(), signature_2.size()); + + bool ver_success_3 = pk_3.verify(sv_message.begin(), sv_message.size(), signature_3.begin(), signature_3.size()); + + CHECK_MESSAGE((ver_success_1 && ver_success_2 && ver_success_3), "different results for copied keys"); + } + +/** +* The following test tests whether ECDSA keys exhibit correct behaviour when it is +* attempted to use them in an uninitialized state +*/ +void test_non_init_ecdsa_keys(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + std::auto_ptr loaded_key(PKCS8::load_key(TEST_DATA_DIR "/wo_dompar_private.pkcs8.pem", rng)); + //ECDSA_PrivateKey* loaded_ec_key = dynamic_cast(loaded_key.get()); + //CHECK_MESSAGE(loaded_ec_key, "the loaded key could not be converted into an ECDSA_PrivateKey"); + std::string str_message = ("12345678901234567890abcdef12"); + ECDSA_PrivateKey empty_priv; + ECDSA_PublicKey empty_pub; + SecureVector sv_message = decode_hex(str_message); + bool exc1 = false; + try + { + SecureVector signature_1 = empty_priv.sign(sv_message.begin(), sv_message.size(), rng); + } + catch (std::exception e) + { + exc1 = true; + } + CHECK_MESSAGE(exc1, "there was no exception thrown when attempting to use an uninitialized ECDSA key"); + + bool exc2 = false; + try + { + empty_pub.verify(sv_message.begin(), sv_message.size(), sv_message.begin(), sv_message.size()); + } + catch (std::exception e) + { + exc2 = true; + } + CHECK_MESSAGE(exc2, "there was no exception thrown when attempting to use an uninitialized ECDSA key"); + } + +} + +u32bit do_ecdsa_tests(Botan::RandomNumberGenerator& rng) + { + std::cout << "Testing ECDSA (InSiTo unit tests): "; + + test_hash_larger_than_n(rng); + //test_message_larger_than_n(); + test_decode_ecdsa_X509(); + test_decode_ver_link_SHA256(); + test_decode_ver_link_SHA1(); + test_sign_then_ver(rng); + test_ec_sign(rng); + test_create_pkcs8(rng); + test_create_and_verify(rng); + test_curve_registry(rng); + test_read_pkcs8(rng); + test_cp_and_as_ctors(rng); + test_non_init_ecdsa_keys(rng); + + std::cout << std::endl; + + return 0; + } +#else +u32bit do_ecdsa_tests(Botan::RandomNumberGenerator&) { return 0; } +#endif diff --git a/src/libs/3rdparty/botan/checks/eckaeg.cpp b/src/libs/3rdparty/botan/checks/eckaeg.cpp new file mode 100644 index 00000000000..f25fbb292f6 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/eckaeg.cpp @@ -0,0 +1,286 @@ +/****************************************************** +* ECKAEG tests * +* * +* (C) 2007 Manuel Hartl * +* hartl@flexsecure.de * +* 2008 Jack Lloyd * +******************************************************/ + +#include + +#include "validate.h" +#include "common.h" + +#if defined(BOTAN_HAS_ECKAEG) + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace Botan; + +#define CHECK_MESSAGE(expr, print) try { if(!(expr)) std::cout << print << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } +#define CHECK(expr) try { if(!(expr)) std::cout << #expr << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } + +namespace { + +void test_eckaeg_normal_derivation(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + /* + std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; + std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; + std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; + std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; + ::Botan::SecureVector sv_p_secp = decode_hex(p_secp); + ::Botan::SecureVector sv_a_secp = decode_hex(a_secp); + ::Botan::SecureVector sv_b_secp = decode_hex(b_secp); + ::Botan::SecureVector sv_G_secp_comp = decode_hex(G_secp_comp); + BigInt bi_p_secp = BigInt::decode(sv_p_secp.begin(), sv_p_secp.size()); + BigInt bi_a_secp = BigInt::decode(sv_a_secp.begin(), sv_a_secp.size()); + BigInt bi_b_secp = BigInt::decode(sv_b_secp.begin(), sv_b_secp.size()); + CurveGFp secp160r1(GFpElement(bi_p_secp,bi_a_secp), GFpElement(bi_p_secp, bi_b_secp), bi_p_secp); + */ + + std::string g_secp("024a96b5688ef573284664698968c38bb913cbfc82"); + Botan::SecureVector sv_g_secp = decode_hex(g_secp); + BigInt bi_p_secp("0xffffffffffffffffffffffffffffffff7fffffff"); + BigInt bi_a_secp("0xffffffffffffffffffffffffffffffff7ffffffc"); + BigInt bi_b_secp("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); + BigInt order = BigInt("0x0100000000000000000001f4c8f927aed3ca752257"); + CurveGFp curve(GFpElement(bi_p_secp,bi_a_secp), GFpElement(bi_p_secp, bi_b_secp), bi_p_secp); + + BigInt cofactor = BigInt(1); + PointGFp p_G = OS2ECP ( sv_g_secp, curve ); + Botan::EC_Domain_Params dom_pars = Botan::EC_Domain_Params(curve, p_G, order, cofactor); + + /** + * begin ECKAEG + */ + // alices key (a key constructed by domain parameters IS an ephimeral key!) + Botan::ECKAEG_PrivateKey private_a(rng, dom_pars); + Botan::ECKAEG_PublicKey public_a = private_a; // Bob gets this + + // Bob creates a key with a matching group + Botan::ECKAEG_PrivateKey private_b(rng, dom_pars); //public_a.getCurve() + + // Bob sends the key back to Alice + Botan::ECKAEG_PublicKey public_b = private_b; // Alice gets this + + // Both of them create a key using their private key and the other's + // public key + Botan::SymmetricKey alice_key = private_a.derive_key(public_b); + Botan::SymmetricKey bob_key = private_b.derive_key(public_a); + + if(alice_key != bob_key) + { + std::cout << "The two keys didn't match!\n"; + std::cout << "Alice's key was: " << alice_key.as_string() << "\n"; + std::cout << "Bob's key was: " << bob_key.as_string() << "\n"; + } + } + +void test_eckaeg_some_dp(RandomNumberGenerator& rng) + { + std::vector oids; + oids.push_back("1.2.840.10045.3.1.7"); + oids.push_back("1.3.132.0.8"); + oids.push_back("1.2.840.10045.3.1.1"); + + for(Botan::u32bit i = 0; i< oids.size(); i++) + { + std::cout << "." << std::flush; + Botan::EC_Domain_Params dom_pars(Botan::get_EC_Dom_Pars_by_oid(oids[i])); + Botan::ECKAEG_PrivateKey private_a(rng, dom_pars); + Botan::ECKAEG_PublicKey public_a = private_a; + /*auto_ptr x509_key_enc = public_a.x509_encoder(); + Botan::MemoryVector enc_key_a = Botan::DER_Encoder() + .start_cons(Botan::SEQUENCE) + .encode(x509_key_enc->alg_id()) + .encode(x509_key_enc->key_bits(), Botan::BIT_STRING) + .end_cons() + .get_contents();*/ + + Botan::ECKAEG_PrivateKey private_b(rng, dom_pars); + Botan::ECKAEG_PublicKey public_b = private_b; + // to test the equivalence, we + // use the direct derivation method here + + Botan::SymmetricKey alice_key = private_a.derive_key(public_b); + + //cout << "encoded key = " << hex_encode(enc_key_a.begin(), enc_key_a.size()) << endl; + + Botan::SymmetricKey bob_key = private_b.derive_key(public_a); + CHECK_MESSAGE(alice_key == bob_key, "different keys - " << "Alice's key was: " << alice_key.as_string() << ", Bob's key was: " << bob_key.as_string()); + //cout << "key: " << alice_key.as_string() << endl; + } + + } + +void test_eckaeg_der_derivation(RandomNumberGenerator& rng) + { + std::vector oids; + oids.push_back("1.2.840.10045.3.1.7"); + oids.push_back("1.3.132.0.8"); + oids.push_back("1.2.840.10045.3.1.1"); + + for(Botan::u32bit i = 0; i< oids.size(); i++) + { + Botan::EC_Domain_Params dom_pars(Botan::get_EC_Dom_Pars_by_oid(oids[i])); + + Botan::ECKAEG_PrivateKey private_a(rng, dom_pars); + Botan::ECKAEG_PublicKey public_a = private_a; + + Botan::ECKAEG_PrivateKey private_b(rng, dom_pars); + Botan::ECKAEG_PublicKey public_b = private_b; + + Botan::MemoryVector key_der_a = private_a.public_value(); + Botan::MemoryVector key_der_b = private_b.public_value(); + Botan::SymmetricKey alice_key = private_a.derive_key(key_der_b.begin(), key_der_b.size()); + Botan::SymmetricKey bob_key = private_b.derive_key(key_der_a.begin(), key_der_a.size()); + CHECK_MESSAGE(alice_key == bob_key, "different keys - " << "Alice's key was: " << alice_key.as_string() << ", Bob's key was: " << bob_key.as_string()); + //cout << "key: " << alice_key.as_string() << endl; + } + } + +/** +* The following test tests the copy ctors and and copy-assignment operators +*/ +void test_eckaeg_cp_ctor_as_op(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + std::string g_secp("024a96b5688ef573284664698968c38bb913cbfc82"); + Botan::SecureVector sv_g_secp = decode_hex(g_secp); + BigInt bi_p_secp("0xffffffffffffffffffffffffffffffff7fffffff"); + BigInt bi_a_secp("0xffffffffffffffffffffffffffffffff7ffffffc"); + BigInt bi_b_secp("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); + BigInt order = BigInt("0x0100000000000000000001f4c8f927aed3ca752257"); + CurveGFp curve(GFpElement(bi_p_secp,bi_a_secp), GFpElement(bi_p_secp, bi_b_secp), bi_p_secp); + BigInt cofactor = BigInt(1); + PointGFp p_G = OS2ECP ( sv_g_secp, curve ); + Botan::EC_Domain_Params dom_pars = Botan::EC_Domain_Params(curve, p_G, order, cofactor); + + /** + * begin ECKAEG + */ + // alices key (a key constructed by domain parameters IS an ephimeral key!) + Botan::ECKAEG_PrivateKey private_a(rng, dom_pars); + Botan::ECKAEG_PrivateKey private_a2(private_a); + Botan::ECKAEG_PrivateKey private_a3; + private_a3 = private_a2; + + Botan::DH_PrivateKey dh_pr_empty; + Botan::DH_PublicKey dh_pub_empty; + + Botan::ECKAEG_PublicKey public_a = private_a; // Bob gets this + Botan::ECKAEG_PublicKey public_a2(public_a); + Botan::ECKAEG_PublicKey public_a3; + public_a3 = public_a; + // Bob creates a key with a matching group + Botan::ECKAEG_PrivateKey private_b(rng, dom_pars); //public_a.getCurve() + + // Bob sends the key back to Alice + Botan::ECKAEG_PublicKey public_b = private_b; // Alice gets this + + // Both of them create a key using their private key and the other's + // public key + Botan::SymmetricKey alice_key = private_a.derive_key(public_b); + Botan::SymmetricKey alice_key_2 = private_a2.derive_key(public_b); + Botan::SymmetricKey alice_key_3 = private_a3.derive_key(public_b); + + Botan::SymmetricKey bob_key = private_b.derive_key(public_a); + Botan::SymmetricKey bob_key_2 = private_b.derive_key(public_a2); + Botan::SymmetricKey bob_key_3 = private_b.derive_key(public_a3); + + CHECK_MESSAGE(alice_key == bob_key, "different keys - " << "Alice's key was: " << alice_key.as_string() << ", Bob's key was: " << bob_key.as_string()); + CHECK_MESSAGE(alice_key_2 == bob_key_2, "different keys - " << "Alice's key was: " << alice_key.as_string() << ", Bob's key was: " << bob_key.as_string()); + CHECK_MESSAGE(alice_key_3 == bob_key_3, "different keys - " << "Alice's key was: " << alice_key.as_string() << ", Bob's key was: " << bob_key.as_string()); + CHECK_MESSAGE(alice_key == bob_key_2, "different keys - " << "Alice's key was: " << alice_key.as_string() << ", Bob's key was: " << bob_key.as_string()); + CHECK_MESSAGE(alice_key_2 == bob_key_3, "different keys - " << "Alice's key was: " << alice_key.as_string() << ", Bob's key was: " << bob_key.as_string()); + } + +/** +* The following test tests whether ECKAEG keys exhibit correct behaviour when it is +* attempted to use them in an uninitialized state +*/ +void test_non_init_eckaeg_keys(RandomNumberGenerator& rng) + { + std::cout << "." << std::flush; + + // set up dom pars + std::string g_secp("024a96b5688ef573284664698968c38bb913cbfc82"); + Botan::SecureVector sv_g_secp = decode_hex(g_secp); + BigInt bi_p_secp("0xffffffffffffffffffffffffffffffff7fffffff"); + BigInt bi_a_secp("0xffffffffffffffffffffffffffffffff7ffffffc"); + BigInt bi_b_secp("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); + BigInt order = BigInt("0x0100000000000000000001f4c8f927aed3ca752257"); + CurveGFp curve(GFpElement(bi_p_secp,bi_a_secp), GFpElement(bi_p_secp, bi_b_secp), bi_p_secp); + BigInt cofactor = BigInt(1); + PointGFp p_G = OS2ECP ( sv_g_secp, curve ); + Botan::EC_Domain_Params dom_pars = Botan::EC_Domain_Params(curve, p_G, order, cofactor); + + // alices key (a key constructed by domain parameters IS an emphemeral key!) + Botan::ECKAEG_PrivateKey private_a(rng, dom_pars); + Botan::ECKAEG_PrivateKey private_b(rng, dom_pars); + + Botan::ECKAEG_PublicKey public_b; + + Botan::ECKAEG_PrivateKey private_empty; + Botan::ECKAEG_PublicKey public_empty; + + bool exc1 = false; + try + { + Botan::SymmetricKey void_key = private_empty.derive_key(public_b); + } + catch (Botan::Exception e) + { + exc1 = true; + } + + CHECK_MESSAGE(exc1, "there was no exception thrown when attempting to use an uninitialized ECKAEG key"); + + bool exc2 = false; + try + { + Botan::SymmetricKey void_key = private_a.derive_key(public_empty); + } + catch (Botan::Exception e) + { + exc2 = true; + } + + CHECK_MESSAGE(exc2, "there was no exception thrown when attempting to use an uninitialized ECKAEG key"); + } + +} + +u32bit do_eckaeg_tests(Botan::RandomNumberGenerator& rng) + { + std::cout << "Testing ECKAEG (InSiTo unit tests): "; + + test_eckaeg_normal_derivation(rng); + test_eckaeg_some_dp(rng); + test_eckaeg_der_derivation(rng); + test_eckaeg_cp_ctor_as_op(rng); + test_non_init_eckaeg_keys(rng); + + std::cout << std::endl; + + return 0; + } + +#else +u32bit do_eckaeg_tests(Botan::RandomNumberGenerator&) { return 0; } +#endif diff --git a/src/libs/3rdparty/botan/checks/fail.dat b/src/libs/3rdparty/botan/checks/fail.dat new file mode 100644 index 00000000000..e7be16f865a --- /dev/null +++ b/src/libs/3rdparty/botan/checks/fail.dat @@ -0,0 +1,100 @@ +# Botan validation file: expected failures + +# Each sequence in here should induce an exception on the part of the +# filter, or produce the wrong output, or something like that. + +# This needs a lot more work + +# MARKER: Block Ciphers + +[Blowfish] +0000000000000000:245946885754369B: +0000000000000000:245946885754369B:AA +0000000000000000:24594688575436:AA + +00000000000000:24594688575436: + +0000000000000000:245946885754369B:\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + +0000000000000000:245946885754369B:\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + +[CAST5] +0123456789ABCDEF:238B4FE5847E44B2:0123456712 + +# MARKER: Hash Functions + +[SHA-1] +A9:19DA91F2603889267DFD77786E07A5B8F067D6 +A8:19DA91F2603889267DFD77786E07A5B8F067D62A + +# MARKER: Cipher Modes (Encryption) + +[DES/CBC/CTS] +9F8789F30E3ED728:48C597491E0C3C1706:9076D5A743FC9721:A9A6C2AD38E682C1 + +9F8789F30E3ED72800:48C597491E0C3C1706:9076D5A743FC9721:A9A6C2AD38E682 + +9F8789F30E3ED72800:48C597491E0C3C1706:76D5A743FC9721:A9A6C2AD38E682 + +# MARKER: Cipher Modes (Decryption) + +[DES/CBC/PKCS7] +E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F662C16A27E4FCF276:\ +4E6F77206973207468652074696D6520666F7220616C6C20:\ +0123456789ABCDEF:1234567890ABCDEF + +E5C7CDDE872BF27C43E934008C389C0788499A7C05F662C16A27E4FCF276:\ +4E6F77206973207468652074696D6520666F7220616C6C20:\ +0123456789ABCDEF:1234567890ABCDEF + +E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F662C16A27E4FCF276:\ +4E6F77206973207468652074696D6520666F7220616C6C20:\ +1123456789ABCDEF:1234567890ABCDEF + +E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F662C16A27E4FCF276:\ +4E6F77206973207468652074696D6520666F7220616C6C20:\ +0123456789ABCDEF:1234567890ABCDEE + +1D2FECD6F0F733F1:AA:DC3A72A9BA8138EC:67E51C4F8403BF6F + +D90246C39C191E98:AA:45AAF3A76E729062:53C1F28656B05986 + +[DES/CBC/OneAndZeros] +28582FD8797D3DB5:AA:D404FD15970CB207:88269176E292DE0A +A2C23F6A496C7BE9:AA:829E7BE8C8A9B326:106E9D2E19FE874D + +[DES/CBC/CTS] +1F807F8FB9678124B8:9E1CA14BE6538A35DB:88B23AFD0683D337:BAC170D943D262CE + +[DES/CFB(1)] +105EFAA6251E7659:C5A1343F4AC4DD7B:C42B0F47482DABA0:48848E073CF89946 +105EFAA6251E7659:C5A1343F4AC4DD7B:C42B0F47482DABA0:48848E073CF899 + +[Base64_Decode] +3D514D3E:31 + +[Bzip_Compress ] +64484953204953204120425A49503220544553540A:\ +525A6839314159265359FDAED210000009DE0000104000100032604C1020\ +0021A4D1EA0FD2840D03401E19B4D4B254EE89F177245385090FDAED2105 + +[Bzip_Decompress ] +523A683917724538509000000110: + +425A6839314159265359FDAED210000009DE0000104000100032604C1020\ +0021A4D1EA0FD2840D03401E19B4D4B254EE89F167245385090FDAED2100:\ +54484953204953204120425A49503220544553540A + +123A6839314159265359FDAED210000009DE0000104000100032604C1020\ +0121A4D1EA0FD2840D03401E19B4D4B254EE89F166245385090FDAED2100:\ +54484953204953204120425A49503220544553540A + +[Zlib_Decompress ] +68DA734C4A76042247C7A4A4246710D3392D3F3F29B1880B106C380868:\ +416263416263414141626262436341626343666F6F6261720A + +78DA73742416700100E0260AB5:\ +3141414141414141414141414141414141414141414141414141414141414141\ +414141414141414141410A diff --git a/src/libs/3rdparty/botan/checks/getopt.cpp b/src/libs/3rdparty/botan/checks/getopt.cpp new file mode 100644 index 00000000000..c0145ca754d --- /dev/null +++ b/src/libs/3rdparty/botan/checks/getopt.cpp @@ -0,0 +1,85 @@ + +#include "getopt.h" + +#include +#include + +OptionParser::OptionParser(const std::string& opt_string) + { + std::vector opts = Botan::split_on(opt_string, '|'); + + for(size_t j = 0; j != opts.size(); j++) + flags.push_back(OptionFlag(opts[j])); + } + +OptionParser::OptionFlag +OptionParser::find_option(const std::string& name) const + { + for(size_t j = 0; j != flags.size(); j++) + if(flags[j].name() == name) + return flags[j]; + throw Botan::Exception("Unknown option " + name); + } + +bool OptionParser::is_set(const std::string& key) const + { + return (options.find(key) != options.end()); + } + +std::string OptionParser::value(const std::string& key) const + { + std::map::const_iterator i = options.find(key); + if(i == options.end()) + throw Botan::Exception("Option " + key + " not found"); + return i->second; + } + +std::string OptionParser::value_if_set(const std::string& key) const + { + return is_set(key) ? value(key) : ""; + } + +void OptionParser::parse(char* argv[]) + { + std::vector args; + for(int j = 1; argv[j]; j++) + args.push_back(argv[j]); + + for(size_t j = 0; j != args.size(); j++) + { + std::string arg = args[j]; + + if(arg.size() > 2 && arg[0] == '-' && arg[1] == '-') + { + const std::string opt_name = arg.substr(0, arg.find('=')); + + arg = arg.substr(2); + + std::string::size_type mark = arg.find('='); + + OptionFlag opt = find_option(arg.substr(0, mark)); + + if(opt.takes_arg()) + { + if(mark == std::string::npos) + throw Botan::Exception("Option " + opt_name + + " requires an argument"); + + std::string name = arg.substr(0, mark); + std::string value = arg.substr(mark+1); + + options[name] = value; + } + else + { + if(mark != std::string::npos) + throw Botan::Exception("Option " + opt_name + + " does not take an argument"); + + options[arg] = ""; + } + } + else + leftover.push_back(arg); + } + } diff --git a/src/libs/3rdparty/botan/checks/getopt.h b/src/libs/3rdparty/botan/checks/getopt.h new file mode 100644 index 00000000000..6d6cfe89f66 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/getopt.h @@ -0,0 +1,45 @@ + +#ifndef BOTAN_CHECK_GETOPT_H__ +#define BOTAN_CHECK_GETOPT_H__ + +#include +#include +#include + +class OptionParser + { + public: + std::vector leftovers() const { return leftover; } + bool is_set(const std::string&) const; + + std::string value(const std::string&) const; + std::string value_if_set(const std::string&) const; + + void parse(char*[]); + OptionParser(const std::string&); + private: + class OptionFlag + { + public: + std::string name() const { return opt_name; } + bool takes_arg() const { return opt_takes_arg; } + + OptionFlag(const std::string& opt_string) + { + std::string::size_type mark = opt_string.find('='); + opt_name = opt_string.substr(0, mark); + opt_takes_arg = (mark != std::string::npos); + } + private: + std::string opt_name; + bool opt_takes_arg; + }; + + OptionFlag find_option(const std::string&) const; + + std::vector flags; + std::map options; + std::vector leftover; + }; + +#endif diff --git a/src/libs/3rdparty/botan/checks/gfpmath.cpp b/src/libs/3rdparty/botan/checks/gfpmath.cpp new file mode 100644 index 00000000000..2352bba7e82 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/gfpmath.cpp @@ -0,0 +1,818 @@ +/****************************************************** +* gfp_element tests * +* * +* (C) 2007 Patrick Sona * +* * +* Falko Strenzke * +* strenzke@flexsecure.de * +* (C) 2008 Jack Lloyd * +******************************************************/ + +#include "validate.h" + +#if defined(BOTAN_HAS_BIGINT_GFP) + +#include +#include +#include +#include +#include +#include + +#include + +using namespace Botan; + +#define CHECK_MESSAGE(expr, print) if(!(expr)) { std::cout << print << "\n"; pass = false; } +#define CHECK(expr) if(!(expr)) { std::cout << #expr << "\n"; pass = false; } + +namespace { + +bool test_turn_on_sp_red_mul() + { + std::cout << "." << std::flush; + + bool pass = true; + + GFpElement a1(23,15); + GFpElement b1(23,18); + + GFpElement c1 = a1*b1; + + GFpElement a2(23,15); + GFpElement b2(23,18); + + a2.turn_on_sp_red_mul(); + a2.turn_on_sp_red_mul(); + b2.turn_on_sp_red_mul(); + b2.turn_on_sp_red_mul(); + + GFpElement c2 = a2*b2; + + if(c1 != c2) + { + std::cout << "test_turn_on_sp_red_mul: "; + std::cout << "c1 = " << c1 << " != "; + std::cout << "c2 = " << c2 << "\n"; + return false; // test failed + } + + return pass; // pass + } + +bool test_bi_div_even() + { + std::cout << "." << std::flush; + + bool pass = true; + + std::string str_large("1552518092300708935148979488462502555256886017116696611139052038026050952686323255099158638440248181850494907312621195144895406865083132424709500362534691373159016049946612882688577088900506460909202178541447303914546699487373976586"); + BigInt to_div(str_large); + BigInt half = to_div/2; + BigInt should_be_to_div = half*2; + CHECK_MESSAGE(should_be_to_div == to_div, "error in division/multiplication of large BigInt"); + + // also testing /=... + BigInt before_div = to_div; + to_div /= 2; + BigInt should_be_before(to_div*2); + CHECK_MESSAGE(should_be_before == before_div, "error in division/multiplication of large BigInt"); + + return pass; + } + +bool test_bi_div_odd() + { + std::cout << '.' << std::flush; + + bool pass = true; + + std::string str_large("1552518092300708935148979488462502555256886017116696611139052038026050952686323255099158638440248181850494907312621195144895406865083132424709500362534691373159016049946612882688577088900506460909202178541447303914546699487373976585"); + BigInt to_div(str_large); + BigInt half = to_div/2; + BigInt should_be_to_div = half*2; + BigInt diff = should_be_to_div-to_div; + CHECK_MESSAGE((diff <= 1) && (diff >= BigInt("-1")), "error in division/multiplication (/) of large BigInt, differnce = " << diff); + + // also testing /=... + BigInt before_div = to_div; + to_div /= 2; + BigInt should_be_before(to_div*2); + BigInt diff2(should_be_before - before_div); + CHECK_MESSAGE((diff2 <= 1) && (diff2 >= BigInt("-1")), "error in division/multiplication (/=) of large BigInt, difference = " << diff2); + + return pass; + } + +bool test_deep_montgm() + { + std::cout << '.' << std::flush; + + bool pass = true; + + std::string s_prime = "5334243285367"; + //std::string s_prime = "5"; + BigInt bi_prime(s_prime); + std::string s_value_a = "3333333333334"; + //std::string s_value_a = "4"; + BigInt bi_value_a(s_value_a); + std::string s_value_b = "4444444444444"; + //std::string s_value_b = "3"; + BigInt bi_value_b(s_value_b); + + GFpElement gfp_a_trf(bi_prime, bi_value_a, true); + GFpElement gfp_a_ntrf(bi_prime, bi_value_a, false); + GFpElement gfp_b_trf(bi_prime, bi_value_b, true); + GFpElement gfp_b_ntrf(bi_prime, bi_value_b, false); + + //CHECK(!gfp_b_trf.is_trf_to_mres()); + gfp_b_trf.get_mres(); + gfp_a_trf.get_mres(); + + GFpElement c_trf(gfp_a_trf * gfp_b_trf); + GFpElement c_ntrf(gfp_a_ntrf * gfp_b_ntrf); + + if(c_trf != c_ntrf) + { + std::cout << "test_deep_montgm - " << c_trf << " != " << c_ntrf << "\n"; + } + return pass; // pass + } + +bool test_gfp_div_small_numbers() + { + std::cout << '.' << std::flush; + + bool pass = true; + + std::string s_prime = "13"; + BigInt bi_prime(s_prime); + std::string s_value_a = "2"; + BigInt bi_value_a(s_value_a); + std::string s_value_b = "3"; + BigInt bi_value_b(s_value_b); + + GFpElement gfp_a(bi_prime, bi_value_a, true); + GFpElement gfp_b(bi_prime, bi_value_b, true); + GFpElement gfp_c(bi_prime, bi_value_b, false); + + CHECK(!gfp_a.is_trf_to_mres()); + //convert to montgomery + gfp_b.get_mres(); + CHECK(gfp_b.is_trf_to_mres()); + CHECK(!gfp_c.is_trf_to_mres()); + + GFpElement res_div_m = gfp_a / gfp_b; + CHECK(res_div_m.is_trf_to_mres()); + + GFpElement res_div_n = gfp_a / gfp_c; + CHECK(!res_div_n.is_trf_to_mres()); + + CHECK_MESSAGE(res_div_n.get_value() == res_div_m.get_value(), "transformed result is not equal to untransformed result"); + CHECK_MESSAGE(gfp_a.get_value() == s_value_a, "GFpElement has changed while division operation"); + CHECK_MESSAGE(gfp_b.get_value() == s_value_b, "GFpElement has changed while division operation"); + GFpElement inverse_b = inverse(gfp_b); + GFpElement res_div_alternative = gfp_a * inverse_b; + + if(res_div_m != res_div_alternative) + { + std::cout << "test_gfp_div_small_numbers - a/b != a*b^-1 where\n" + << "a = " << gfp_a << "\n" + << "b = " << gfp_b << "\n" + << "b^-1 = " << inverse_b << "\n" + << "a*b^-1 = " << res_div_alternative << "\n" + << "a/b = " << res_div_n << "\n"; + pass = false; + } + + CHECK_MESSAGE(res_div_m == res_div_alternative, "a/b is not as equal to a * b^-1"); + //cout << "Div-result transformed:" << res_div_m.get_value() << endl; + //cout << "Div-result untransformed:" << res_div_n.get_value() << endl; + //cout << "Div-Alternative: " << res_div_alternative.get_value() << endl; + return pass; + } + +bool test_gfp_basics() + { + std::cout << '.' << std::flush; + + bool pass = true; + + std::string s_prime = "5334243285367"; + BigInt bi_prime(s_prime); + std::string s_value_a = "3333333333333"; + BigInt bi_value_a(s_value_a); + + GFpElement gfp_a(bi_prime, bi_value_a, true); + CHECK(gfp_a.get_p() == s_prime); + CHECK(gfp_a.get_value() == s_value_a); + CHECK(!gfp_a.is_trf_to_mres()); + gfp_a.get_mres(); + CHECK(gfp_a.is_trf_to_mres()); + return pass; + } + +bool test_gfp_addSubNegate() + { + std::cout << '.' << std::flush; + + bool pass = true; + + std::string s_prime = "5334243285367"; + BigInt bi_prime(s_prime); + std::string s_value_a = "3333333333333"; + BigInt bi_value_a(s_value_a); + + GFpElement gfp_a(bi_prime, bi_value_a, true); + GFpElement gfp_b(bi_prime, bi_value_a, true); + + gfp_b.negate(); + GFpElement zero = gfp_a + gfp_b; + BigInt bi_zero("0"); + CHECK(zero.get_value() == bi_zero); + CHECK(gfp_a.get_value() == bi_value_a); + return pass; + } + +bool test_gfp_mult() + { + std::cout << '.' << std::flush; + + bool pass = true; + + std::string s_prime = "5334243285367"; + BigInt bi_prime(s_prime); + std::string s_value_a = "3333333333333"; + BigInt bi_value_a(s_value_a); + std::string s_value_b = "4444444444444"; + BigInt bi_value_b(s_value_b); + + GFpElement gfp_a(bi_prime, bi_value_a, true); + GFpElement gfp_b(bi_prime, bi_value_b, true); + GFpElement gfp_c(bi_prime, bi_value_b, false); + + CHECK(!gfp_a.is_trf_to_mres()); + //convert to montgomery + gfp_b.get_mres(); + CHECK(gfp_b.is_trf_to_mres()); + CHECK(!gfp_c.is_trf_to_mres()); + + GFpElement res_mult_m = gfp_a * gfp_b; + CHECK(res_mult_m.is_trf_to_mres()); + + GFpElement res_mult_n = gfp_a * gfp_c; + CHECK(!res_mult_n.is_trf_to_mres()); + + if(res_mult_n != res_mult_m) + std::cout << gfp_a << " * " << gfp_b << " =? " + << "n = " << res_mult_n << " != m = " << res_mult_m << "\n"; + return pass; + } + +bool test_gfp_div() + { + std::cout << '.' << std::flush; + + bool pass = true; + + std::string s_prime = "5334243285367"; + BigInt bi_prime(s_prime); + std::string s_value_a = "3333333333333"; + BigInt bi_value_a(s_value_a); + std::string s_value_b = "4444444444444"; + BigInt bi_value_b(s_value_b); + + GFpElement gfp_a(bi_prime, bi_value_a, true); + GFpElement gfp_b(bi_prime, bi_value_b, true); + GFpElement gfp_c(bi_prime, bi_value_b, false); + + CHECK(!gfp_a.is_trf_to_mres()); + //convert to montgomery + gfp_b.get_mres(); + CHECK(gfp_b.is_trf_to_mres()); + CHECK(!gfp_c.is_trf_to_mres()); + + GFpElement res_div_m = gfp_a / gfp_b; + CHECK(res_div_m.is_trf_to_mres()); + + GFpElement res_div_n = gfp_a / gfp_c; + CHECK(!res_div_n.is_trf_to_mres()); + + CHECK_MESSAGE(res_div_n.get_value() == res_div_m.get_value(), "transformed result is not equal to untransformed result"); + CHECK_MESSAGE(gfp_a.get_value() == s_value_a, "GFpElement has changed while division operation"); + CHECK_MESSAGE(gfp_b.get_value() == s_value_b, "GFpElement has changed while division operation"); + GFpElement inverse_b = inverse(gfp_b); + GFpElement res_div_alternative = gfp_a * inverse_b; + CHECK_MESSAGE(res_div_m == res_div_alternative, "a/b is not as equal to a * b^-1"); + //cout << "Div-result transformed:" << res_div_m.get_value() << endl; + //cout << "Div-result untransformed:" << res_div_n.get_value() << endl; + //cout << "Div-Alternative: " << res_div_alternative.get_value() << endl; + return pass; + } + +bool test_gfp_add() + { + std::cout << '.' << std::flush; + + bool pass = true; + + std::string s_prime = "5334243285367"; + BigInt bi_prime(s_prime); + std::string s_value_a = "3333333333333"; + BigInt bi_value_a(s_value_a); + std::string s_value_b = "4444444444444"; + BigInt bi_value_b(s_value_b); + + GFpElement gfp_a(bi_prime, bi_value_a, true); + GFpElement gfp_b(bi_prime, bi_value_b, true); + GFpElement gfp_c(bi_prime, bi_value_b, true); + + CHECK(!gfp_a.is_trf_to_mres()); + //convert to montgomery + gfp_b.get_mres(); + CHECK(gfp_b.is_trf_to_mres()); + CHECK(!gfp_c.is_trf_to_mres()); + + GFpElement res_add_m = gfp_a + gfp_b; + CHECK(res_add_m.is_trf_to_mres()); + + GFpElement res_add_n = gfp_a + gfp_c; + // commented out by patrick, behavior is clear: + // rhs might be transformed, lhs never + // for now, this behavior is only intern, doesn't matter for programm function + // CHECK_MESSAGE(res_add_n.is_trf_to_mres(), "!! Falko: NO FAIL, wrong test, please repair"); // clear: rhs might be transformed, lhs never + + CHECK(res_add_n.get_value() == res_add_m.get_value()); + return pass; + } + +bool test_gfp_sub() + { + std::cout << '.' << std::flush; + + bool pass = true; + + std::string s_prime = "5334243285367"; + BigInt bi_prime(s_prime); + std::string s_value_a = "3333333333333"; + BigInt bi_value_a(s_value_a); + std::string s_value_b = "4444444444444"; + BigInt bi_value_b(s_value_b); + + GFpElement gfp_a(bi_prime, bi_value_a, true); + GFpElement gfp_b(bi_prime, bi_value_b, true); + GFpElement gfp_c(bi_prime, bi_value_b, true); + + CHECK(!gfp_a.is_trf_to_mres()); + //convert to montgomery + gfp_b.get_mres(); + CHECK(gfp_b.is_trf_to_mres()); + CHECK(!gfp_c.is_trf_to_mres()); + + GFpElement res_sub_m = gfp_b - gfp_a; + CHECK(res_sub_m.is_trf_to_mres()); + CHECK(gfp_a.is_trf_to_mres()); // added by Falko + + GFpElement res_sub_n = gfp_c - gfp_a; + + // commented out by psona, behavior is clear: + // rhs might be transformed, lhs never + // for now, this behavior is only intern, doesn't matter for programm function + // CHECK_MESSAGE(!res_sub_n.is_trf_to_mres(), "!! Falko: NO FAIL, wrong test, please repair"); // falsche + // Erwartung: a wurde durch die operation oben auch + // ins m-residue transformiert, daher passiert das hier auch mit + // c, und das Ergebnis ist es auch + + CHECK(res_sub_n.get_value() == res_sub_m.get_value()); + return pass; + } + +bool test_more_gfp_div() + { + std::cout << '.' << std::flush; + + bool pass = true; + + std::string s_prime = "5334243285367"; + BigInt bi_prime(s_prime); + std::string s_value_a = "3333333333333"; + BigInt bi_value_a(s_value_a); + std::string s_value_b = "4444444444444"; + BigInt bi_value_b(s_value_b); + + GFpElement gfp_a(bi_prime, bi_value_a, true); + GFpElement gfp_b_trf(bi_prime, bi_value_b, true); + GFpElement gfp_b_ntrf(bi_prime, bi_value_b, false); + + CHECK(!gfp_b_trf.is_trf_to_mres()); + gfp_b_trf.get_mres(); + CHECK(gfp_b_trf.is_trf_to_mres()); + + CHECK(!gfp_a.is_trf_to_mres()); + + bool exc_ntrf = false; + try + { + gfp_b_ntrf.get_mres(); + } + catch(Botan::Illegal_Transformation e) + { + exc_ntrf = true; + } + CHECK(exc_ntrf); + + CHECK(!gfp_b_ntrf.is_trf_to_mres()); + + CHECK_MESSAGE(gfp_b_trf == gfp_b_ntrf, "b is not equal to itself (trf)"); + + GFpElement b_trf_inv(gfp_b_trf); + b_trf_inv.inverse_in_place(); + GFpElement b_ntrf_inv(gfp_b_ntrf); + b_ntrf_inv.inverse_in_place(); + CHECK_MESSAGE(b_trf_inv == b_ntrf_inv, "b inverted is not equal to itself (trf)"); + + CHECK(gfp_b_trf/gfp_b_ntrf == GFpElement(bi_prime, 1)); + CHECK(gfp_b_trf/gfp_b_trf == GFpElement(bi_prime, 1)); + CHECK(gfp_b_ntrf/gfp_b_ntrf == GFpElement(bi_prime, 1)); + GFpElement rhs(gfp_a/gfp_b_trf); + GFpElement lhs(gfp_a/gfp_b_ntrf); + + if(lhs != rhs) + { + std::cout << "test_more_gfp_div - " << lhs << " != " << rhs << "\n"; + pass = false; + } + + return pass; + } + +bool test_gfp_mult_u32bit() + { + std::cout << '.' << std::flush; + + bool pass = true; + + /* + Botan::EC_Domain_Params parA(Botan::get_EC_Dom_Pars_by_oid("1.2.840.10045.3.1.1")); + CurveGFp curve = parA.get_curve(); + //CurveGFp curve2 = parA.get_curve(); + BigInt p = curve.get_p(); + GFpElement a = curve.get_a(); + GFpElement a_mr = curve.get_mres_a(); + Botan::u32bit u_x = 134234; + BigInt b_x(u_x); + GFpElement g_x(p, b_x); + CHECK(a*u_x == a*g_x); + CHECK(a*u_x == u_x*a); + CHECK(a*g_x == g_x*a); + CHECK(a_mr*u_x == a*g_x); + CHECK(u_x*a_mr == a*g_x); + */ + return pass; + } + +/** +* This tests verifies the functionality of sharing pointers for modulus dependent values +*/ +bool test_gfp_shared_vals() + { + std::cout << '.' << std::flush; + + bool pass = true; + + BigInt p("5334243285367"); + GFpElement a(p, BigInt("234090")); + GFpElement shcpy_a(1,0); + shcpy_a.share_assign(a); + std::tr1::shared_ptr ptr1 = a.get_ptr_mod(); + std::tr1::shared_ptr ptr2 = shcpy_a.get_ptr_mod(); + CHECK_MESSAGE(ptr1.get() == ptr2.get(), "shared pointers for moduli arenΒ΄t equal"); + + GFpElement b(1,0); + b = a; // create a non shared copy + std::tr1::shared_ptr ptr_b_p = b.get_ptr_mod(); + CHECK_MESSAGE(ptr1.get() != ptr_b_p.get(), "non shared pointers for moduli are equal"); + + a.turn_on_sp_red_mul(); + GFpElement c1 = a * shcpy_a; + GFpElement c2 = a * a; + GFpElement c3 = shcpy_a * shcpy_a; + GFpElement c4 = shcpy_a * a; + shcpy_a.turn_on_sp_red_mul(); + GFpElement c5 = shcpy_a * shcpy_a; + + if(c1 != c2 || c2 != c3 || c3 != c4 || c4 != c5) + { + std::cout << "test_gfp_shared_vals failed" + << " a=" << a + << " shcpy_a=" << shcpy_a + << " c1=" << c1 << " c2=" << c2 + << " c3=" << c3 << " c4=" << c4 + << " c5=" << c5 << "\n"; + pass = false; + } + + swap(a,shcpy_a); + std::tr1::shared_ptr ptr3 = a.get_ptr_mod(); + std::tr1::shared_ptr ptr4 = shcpy_a.get_ptr_mod(); + CHECK_MESSAGE(ptr3.get() == ptr4.get(), "shared pointers for moduli arenΒ΄t equal after swap"); + CHECK(ptr1.get() == ptr4.get()); + CHECK(ptr2.get() == ptr3.get()); + + swap(a,b); + std::tr1::shared_ptr ptr_a = a.get_ptr_mod(); + std::tr1::shared_ptr ptr_b = shcpy_a.get_ptr_mod(); + CHECK(ptr_a.get() == ptr_b_p.get()); + CHECK(ptr_b.get() == ptr3.get()); + return pass; + } + +/** +* The following test checks the behaviour of GFpElements assignment operator, which +* has quite complex behaviour with respect to sharing groups and precomputed values +* (with respect to montgomery mult.) +*/ +bool test_gfpel_ass_op() + { + std::cout << '.' << std::flush; + + bool pass = true; + + + // test different moduli + GFpElement a(23,4); + GFpElement b(11,6); + + GFpElement b2(11,6); + + a = b; + CHECK(a==b2); + CHECK(a.get_value() == b2.get_value()); + CHECK(a.get_p() == b2.get_p()); + CHECK(a.get_ptr_mod().get() != b.get_ptr_mod().get()); // sharing groups + // may not be fused! + + // also test some share_assign()... + a.share_assign(b); + CHECK(a==b2); + CHECK(a.get_value() == b2.get_value()); + CHECK(a.get_p() == b2.get_p()); + CHECK(a.get_ptr_mod().get() == b.get_ptr_mod().get()); // sharing groups + // shall be fused! + //--------------------------- + + // test assignment within sharing group + // with montg.mult. + GFpElement c(5,2); + GFpElement d(5,2); + d.share_assign(c); + CHECK(d.get_ptr_mod().get() == c.get_ptr_mod().get()); + CHECK(d.get_ptr_mod()->get_p() == c.get_ptr_mod()->get_p()); + CHECK(c.get_ptr_mod()->get_r().is_zero()); + c.turn_on_sp_red_mul(); + CHECK(d.get_ptr_mod().get() == c.get_ptr_mod().get()); + CHECK(d.get_ptr_mod()->get_p() == c.get_ptr_mod()->get_p()); + CHECK(!c.get_ptr_mod()->get_p().is_zero()); + GFpElement f(11,5); + d = f; + CHECK(f.get_ptr_mod().get() != c.get_ptr_mod().get()); + + GFpElement e = c*c; + GFpElement g = d*d; + GFpElement h = f*f; + CHECK(h == g); + + GFpElement c2(5,2); + GFpElement d2(5,2); + d2.share_assign(c2); + GFpElement f2(11,5); + d2 = f2; + c2.turn_on_sp_red_mul(); + CHECK(d2.get_ptr_mod().get() != c2.get_ptr_mod().get()); // the sharing group was left + CHECK(d2.get_ptr_mod()->get_r() == f2.get_ptr_mod()->get_r()); + CHECK(c2.get_p() == 5); // c2Β΄s shared values werenΒ΄t modified because + // the sharing group with d2 was separated by + // the assignment "d2 = f2" + + d2.turn_on_sp_red_mul(); + CHECK(d2.get_ptr_mod()->get_p() != c2.get_ptr_mod()->get_p()); + GFpElement e2 = c2*c2; + GFpElement g2 = d2*d2; + GFpElement h2 = f2*f2; + CHECK(h2 == g2); + + GFpElement c3(5,2); + GFpElement d3(5,2); + d3.share_assign(c3); + GFpElement f3(11,2); + d3 = f3; + GFpElement e3 = c3*c3; + GFpElement g3 = d3*d3; + + CHECK(e == e2); + CHECK(g == g2); + + CHECK(e == e3); + CHECK(g == g2); + return pass; + } + +bool test_gfp_swap() + { + std::cout << '.' << std::flush; + + bool pass = true; + + + BigInt p("173"); + GFpElement a(p, BigInt("2342")); + GFpElement b(p, BigInt("423420")); + + GFpModulus* a_mod = a.get_ptr_mod().get(); + GFpModulus* b_mod = b.get_ptr_mod().get(); + + //GFpModulus* a_d = a.get_ptr_mod()->get_p_dash(); + //GFpModulus* b_d = b.get_ptr_mod()->get_p_dash(); + + swap(a,b); + CHECK_MESSAGE(b.get_value() == 2342%173, "actual value of b was: " << b.get_value() ); + CHECK_MESSAGE(a.get_value() == 423420%173, "actual value of a was: " << a.get_value() ); + + CHECK(a_mod == b.get_ptr_mod().get()); + CHECK(b_mod == a.get_ptr_mod().get()); + //CHECK(a_d == b.get_ptr_mod()->get_p_dash()); + //CHECK(b_d == a.get_ptr_p_dash()->get_p_dash()); + + GFpElement c(p, BigInt("2342329")); + GFpElement d(1,1); + d.share_assign(c); + d += d; + c.swap(d); + CHECK(d.get_value() == 2342329%173); + CHECK(c.get_value() == (d*2).get_value()); + return pass; + } + +bool test_inv_in_place() + { + std::cout << '.' << std::flush; + + bool pass = true; + + BigInt mod(173); + GFpElement a1(mod, 288); + a1.turn_on_sp_red_mul(); + a1.get_mres(); // enforce the conversion + + GFpElement a1_inv(a1); + a1_inv.inverse_in_place(); + + GFpElement a2(mod, 288); + GFpElement a2_inv(a2); + a2_inv.inverse_in_place(); + + /*cout << "a1_inv = " << a1_inv << endl; + cout << "a2_inv = " << a2_inv << endl;*/ + CHECK_MESSAGE(a1_inv == a2_inv, "error with inverting tranformed GFpElement"); + + CHECK(a1_inv.inverse_in_place() == a1); + CHECK(a2_inv.inverse_in_place() == a2); + return pass; + } + +bool test_op_eq() + { + std::cout << '.' << std::flush; + + bool pass = true; + + BigInt mod(173); + GFpElement a1(mod, 299); + a1.turn_on_sp_red_mul(); + a1.get_mres(); // enforce the conversion + GFpElement a2(mod, 288); + CHECK_MESSAGE(a1 != a2, "error with GFpElement comparison"); + return pass; + } + +bool test_rand_int(RandomNumberGenerator& rng) + { + bool pass = true; + + for(int i=0; i< 100; i++) + { + std::cout << '.' << std::flush; + BigInt x = BigInt::random_integer(rng, 1,3); + //cout << "x = " << x << "\n"; // only 1,2 are put out + CHECK(x == 1 || x==2); + } + + return pass; + } + +bool test_bi_bit_access() + { + std::cout << '.' << std::flush; + + bool pass = true; + + BigInt a(323); + CHECK(a.get_bit(1) == 1); + CHECK(a.get_bit(1000) == 0); + return pass; + } + +#if 0 +bool test_sec_mod_mul() + { + //cout << "starting test_sec_mod_mul" << endl; + + bool pass = true; + + //mod_mul_secure(BigInt const& a, BigInt const& b, BigInt const& m) + + BigInt m("5334243285367"); + BigInt a("3333333333333"); + BigInt b("4444444444444"); + for(int i = 0; i<10; i++) + { + std::cout << '.' << std::flush; + BigInt c1 = a * b; + c1 %= m; + BigInt c2 = mod_mul_secure(a, b, m); + CHECK_MESSAGE(c1 == c2, "should be " << c1 << ", was " << c2); + } + //cout << "ending test_sec_mod_mul" << endl; + return pass; + } +#endif + +#if 0 +bool test_sec_bi_mul() + { + //mod_mul_secure(BigInt const& a, BigInt const& b, BigInt const& m) + + bool pass = true; + + BigInt m("5334243285367"); + BigInt a("3333333333333"); + BigInt b("4444444444444"); + for(int i = 0; i<10; i++) + { + std::cout << '.' << std::flush; + BigInt c1 = a * b; + //c1 %= m; + BigInt c2(a); + c2.mult_this_secure(b, m); + CHECK_MESSAGE(c1 == c2, "should be " << c1 << ", was " << c2); + } + + return pass; + } +#endif + +} + +u32bit do_gfpmath_tests(Botan::RandomNumberGenerator& rng) + { + std::cout << "Testing GF(p) math " << std::flush; + + u32bit failed = 0; + + failed += !test_turn_on_sp_red_mul(); + failed += !test_bi_div_even(); + failed += !test_bi_div_odd(); + failed += !test_deep_montgm(); + failed += !test_gfp_div_small_numbers(); + failed += !test_gfp_basics(); + failed += !test_gfp_addSubNegate(); + failed += !test_gfp_mult(); + failed += !test_gfp_div(); + failed += !test_gfp_add(); + failed += !test_gfp_sub(); + failed += !test_more_gfp_div(); + failed += !test_gfp_mult_u32bit(); + failed += !test_gfp_shared_vals(); + failed += !test_gfpel_ass_op(); + failed += !test_gfp_swap(); + failed += !test_inv_in_place(); + failed += !test_op_eq(); + failed += !test_rand_int(rng); + failed += !test_bi_bit_access(); + //failed += !test_sec_mod_mul(); + //failed += !test_sec_bi_mul(); + +#if 0 + if(failed == 0) + std::cout << " OK"; + else + std::cout << ' ' << failed << " failed"; +#endif + + std::cout << std::endl; + + return failed; + } +#else +u32bit do_gfpmath_tests(Botan::RandomNumberGenerator&) { return 0; } +#endif diff --git a/src/libs/3rdparty/botan/checks/misc.cpp b/src/libs/3rdparty/botan/checks/misc.cpp new file mode 100644 index 00000000000..19867145170 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/misc.cpp @@ -0,0 +1,77 @@ +#include +#include +#include + +#include +#include +using namespace Botan; + +#include "common.h" + +void strip_comments(std::string& line) + { + if(line.find('#') != std::string::npos) + line = line.erase(line.find('#'), std::string::npos); + } + +void strip_newlines(std::string& line) + { + while(line.find('\n') != std::string::npos) + line = line.erase(line.find('\n'), 1); + } + +/* Strip comments, whitespace, etc */ +void strip(std::string& line) + { + strip_comments(line); + +#if 0 + while(line.find(' ') != std::string::npos) + line = line.erase(line.find(' '), 1); +#endif + + while(line.find('\t') != std::string::npos) + line = line.erase(line.find('\t'), 1); + } + +SecureVector decode_hex(const std::string& in) + { + SecureVector result; + + try { + Botan::Pipe pipe(new Botan::Hex_Decoder); + pipe.process_msg(in); + result = pipe.read_all(); + } + catch(std::exception& e) + { + result.destroy(); + } + return result; + } + +std::string hex_encode(const byte in[], u32bit len) + { + Botan::Pipe pipe(new Botan::Hex_Encoder); + pipe.process_msg(in, len); + return pipe.read_all_as_string(); + } + +std::vector parse(const std::string& line) + { + const char DELIMITER = ':'; + std::vector substr; + std::string::size_type start = 0, end = line.find(DELIMITER); + while(end != std::string::npos) + { + substr.push_back(line.substr(start, end-start)); + start = end+1; + end = line.find(DELIMITER, start); + } + if(line.size() > start) + substr.push_back(line.substr(start)); + while(substr.size() <= 4) // at least 5 substr, some possibly empty + substr.push_back(""); + return substr; + } + diff --git a/src/libs/3rdparty/botan/checks/mp_valid.dat b/src/libs/3rdparty/botan/checks/mp_valid.dat new file mode 100644 index 00000000000..88ec2df5ae8 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/mp_valid.dat @@ -0,0 +1,2983 @@ +# BigInt validation file + +# These are all in decimal, mostly to help make sure the I/O and decimal +# conversion stuff is working. We test the hex conversion in the PK tests +# anyway... + +# Some of the numbers have very simple binary representations (such as +# 2^256-2^192-1) while others are chosen 'randomly', mostly by me hitting +# random keys into 'bc'. Some where also machine generated with a strong PRNG. + +[Addition] +0:0:0 +0:1:1 +1:0:1 +1:1:2 +1:-1:0 + +5:-0:5 +-5:-0:-5 +-0:5:5 + +255:1:256 + +65535:1:65536 + +4294967295:1:4294967296 + +18446744073709551615:1:18446744073709551616 + +124536363637272472:124536363637272472:249072727274544944 + +9223372036854775807:281474976710655:9223653511831486462 + +9223372036854775807:137438953471:9223372174293729278 + +# Carry tests +340282366920938463463374607431768211455:\ +340282366920938463463374607431768211455:\ +680564733841876926926749214863536422910 + +340282366920938463463374607431768211455:\ +340282366920938463463374607431768211450:\ +680564733841876926926749214863536422905 + +11579208923731619542357098500868790785326998466564056403945758400791\ +3129639935:\ +11579208923731619542357098500868790785326998466564056403945758400791\ +3129639935:\ +23158417847463239084714197001737581570653996933128112807891516801582\ +6259279870 + +11579208923731619542357098500868790785326998466564056403945758400791\ +3129639935:\ +11579208923731619542357098500868790785326998466564056403945758400791\ +3129639919:\ +23158417847463239084714197001737581570653996933128112807891516801582\ +6259279854 + +13407807929942597099574024998205846127479365820592393377723561443721\ +76403007354697680187429816690342769003185818648605085375388281194656\ +9946433649006084095:\ +18446744073709551616:\ +13407807929942597099574024998205846127479365820592393377723561443721\ +76403007354697680187429816690342769003185818648605085375388281194658\ +8393177722715635711 + +13407807929942597099574024998205846127479365820592393377723561443721\ +76403007354697680187429816690342769003185818648605085375388281194656\ +9946433649006084095:1:\ +13407807929942597099574024998205846127479365820592393377723561443721\ +76403007354697680187429816690342769003185818648605085375388281194656\ +9946433649006084096 + +-397942700139194066108348269604271467697661897648384734165029652\ +9192053560111268857919862747528477749805933030612876334500852832\ +5994574657552726381901:\ +-342238655038:\ +-397942700139194066108348269604271467697661897648384734165029652\ +9192053560111268857919862747528477749805933030612876334500852832\ +5994574657894965036939 + +2511029185349894083125189792298767815734633609329237357694542628\ +9097725034326735312448621015537884914:\ +-365510811543986457345339657399796975273732516080550566276869562\ +81114038842935173436543461:\ +2511029185346238975009749927725314419160635639576500032533737123\ +2470038078045621273605685842101341453 + +27802650352:\ +660736146705288303126411072388564329913778942:\ +660736146705288303126411072388564357716429294 + +-134824589995504186480095446370988146623149603821668360871542456\ +6397833766910915722793041224478985289:\ +1151714952286618235856515264359526625702022859705853911311473221\ +8008332987904361457299261161227276764386173666571334749062651694\ +592291882972:\ +1151714952286618235856515264359526625701888035115858407124993126\ +3544623106438129961261044477618561339819775832804423833339858653\ +367812897683 + +-175405304416816169628682516351336019150390262549968865836182439\ +14226325157426408929602625346567256761818:\ +8652004279835272452069018101603566414024194616420826231795446815\ +19016990:\ +-175405304416816169628682516351327367146110427277516796818080835\ +57584922737964766846979445801885737744828 + +1288447760742982615563987140969486034581770182750513292185554983\ +74:\ +4438163138291508763620522351346106032205489281076979612299536118\ +73695276391917150913346479060246759720475193648:\ +4438163138291508763620522351346106032205489282365427373042518734\ +30093990488865754371523497335298088939030692022 + +1709484189262457846620911889502097055085989595277300243221975568\ +275935717696463:\ +-1646592344139809206374540620411514484579951199941360:\ +1709484189262457846620911887855504710946180388902759622810461083\ +695984517755103 + +3201758654296371761657093415761871025401806278064180152049287711\ +7023353895132395250905592913967322327352806288308303059519915387\ +7335714942842:\ +-282824169696073608987996588238668793593857085654548122761949764\ +0844399275054327390050478930503975773972:\ +3201758654296371761657093415761871025373523861094572791150488052\ +8784685101538538165251044791205372563268366360802870320514867494\ +6831739168870 + +-403539836054218172590829531210749614210541501474425943996337720\ +4111754181625695349185753326709217:\ +85450213703789913646546187382091037800:\ +-403539836054218172590829531210749614210541501474425943996329175\ +3898050391712048802998371235671417 + +-129216644607347987680152236338235788743165763918415128477552538\ +7363973852756087726243671676713861533673009088319851:\ +8045388958745181755374994252823750582362455317985903504033438417\ +6695557207064326714194569562489510933024274993575473943439469171\ +4971:\ +8045388958745181742453329792088951814347231684162324629716862025\ +8280428729511787977797184286880738308657107322189320576138560339\ +5120 + +-451986588700926309459451756852005697379481014956007968529234251\ +884946522682901215022086432597024324062240835564200177389:\ +15762983479:\ +-451986588700926309459451756852005697379481014956007968529234251\ +884946522682901215022086432597024324062240835548437193910 + +-390747541211572881697456702205527837411679402562428747433403883\ +1885743634200801846649105209920908153587891040882946582394429615\ +396962188674594744360388466:\ +1938936112365378546948796774781062371570792073982831173929981754\ +54362643521031390:\ +-390747541211572881697456702205527837411679402562428747433403883\ +1885743634006908235412567355226028476109784803725867374996146498\ +003964013220232100839357076 + +-72603710637966201224690926289:\ +-136184426422985332615812550349236126405125071507280171067688615\ +06299813289801666559564532:\ +-136184426422985332615812550349236126405125071507280171067689341\ +10010451256002891250490821 + +5607796083571305683140294840679074710788944676935750975947220760\ +3483968107693997028111823994257399379783658853302692762256851623\ +103019589392739:\ +-427057313888431079237360487703561848638868677065083968842:\ +5607796083571305683140294840679074710788944676935750975947220760\ +3483968107693997028111396936943510948704421492814989200408212754\ +425954505423897 + +-220980083850850444349478376253480033771210140515678470878219758\ +0824527899758308:\ +4284407650303949586450021392583759850781770841835415277411207859\ +6443089606598570396235816327987463393971710495985285591895096794\ +994387176281079:\ +4284407650303949586450021392583759850781770841835415277411207859\ +4233288768090065952741032565452663056259609090828500883112899214\ +169859276522771 + +3388776730880982684241784117615223232127223178833840452685901937\ +0507113927387984766381329515371768224976188337692:\ +349484339542971517481628970179002500341:\ +3388776730880982684241784117615223232127223178833840452685901937\ +0507113927737469105924301032853397195155190838033 + +8574808963985866072258732162153629808269070752641242695163010155\ +1228144063151688592419555048867068162:\ +-383634567691961960211191292397062452265352651123492760493087381\ +707279:\ +8574808963985866072258732162153591444812301556445221576033770448\ +8775878710500565099659061961485360883 + +23889807888563742283608049816129153552608399262924421832404872043475:\ +995:\ +23889807888563742283608049816129153552608399262924421832404872044470 + +-654786925833474864669230962582694222611472680701859262466465606\ +239654996048306783957549697781271829257774329538985:\ +-276137507159648540503039013089014674747:\ +-654786925833474864669230962582694222611472680701859262466465606\ +239654996048582921464709346321774868270863344213732 + +50463316268089933:\ +-140591583463431806921000349498135287589005423318927850947894242\ +9953101385694731575213124136524392343244191305277028999171613076\ +57443381774866237429:\ +-140591583463431806921000349498135287589005423318927850947894242\ +9953101385694731575213124136524392343244191305277028999171613076\ +57392918458598147496 + +1339015021665554488163337105187026760232395594198925052890859936\ +418304234254229440059229155546157793544192:\ +6294037420283433712414743361937677483761554699961644450461297486\ +2247932788230044871756877711635975905661325925915992499702811257\ +81761944353272:\ +6294037420283433712414743361937677485100569721627198938624634591\ +4118200390554000813746128240544575269844368268458286900295102813\ +27919737897464 + +-241446683:\ +-282671163032866994488211995758272717472259277760825940523445628\ +442206062910449311538519756165635175664610569214430918184214:\ +-282671163032866994488211995758272717472259277760825940523445628\ +442206062910449311538519756165635175664610569214431159630897 + +2358605503303452637996081421902056515951744611718383128442445119\ +505739707550326378912342448355046239066896995563581:\ +-383043722914532516527336452555126144064884579194968166126094695\ +6860463720730123941973615:\ +2358605503303452637996081418071619286806419446445018602891183678\ +856893915600644717651395491494582518336773053589966 + +1860794367587960058388097846258490:\ +-237344494507203983863096991896035366478949095337787603280:\ +-237344494507203983863095131101667778518890707239941344790 + +-286399096802321907543674770412181810379003627366516307780436082\ +546:\ +6433131620680089024037442172197761714707480582555136398379812339\ +597187475099646442833150194:\ +6433131620680089024037441885798664912385573038880365986198001960\ +593560108583338662397067648 + +1811803390771023695595378175836278947833228041818597295747524425\ +7214680056902377349016498752054120312533829578576324428322456925\ +9250011493:\ +-119912766577350317025030707802803587547945939765717835695952624\ +5067549497129923023348187933280753018204983010837846725666878521\ +137637491:\ +1799812114113288663892875105055998589078433447842025512177929163\ +2707925107189385046681679958726045010713331277492539755755769073\ +8112374002 + +-641402013955555338114086428916201846520512758110759261762820321\ +4491558550345077676836677565241902214951203461131114985869530775\ +0874152:\ +174441039:\ +-641402013955555338114086428916201846520512758110759261762820321\ +4491558550345077676836677565241902214951203461131114985869530757\ +6433113 + +1272757944308835857208037878018507337530557445422230495561634616\ +5037244198775127175123602392596401935136013522028214622088960493\ +31599624285621:\ +7326562354017884140300121264633612334070903165496641915889499701\ +38457507491850467631029977010:\ +1272757944308835857208037878018507337530557445422963151797036404\ +9177544320039760787457673295761898577051903021729599197163878997\ +99230654262631 + +-296171972628230:\ +-829576609912184321900082369936222286517382010256973151771639172\ +7126741710202086962877467940292139:\ +-829576609912184321900082369936222286517382010256973151771639172\ +7126741710202086963173639912920369 + +7469859140681995100248436821088394448284142227691915206159676323\ +62127522466922882591:\ +-20487191102299831461877807785745372724903547246374023:\ +7469859140681995100248436821088189576373119229377296428081818869\ +89402618919676508568 + +-4:\ +-234439009075326480604323496098115161312227136676259000693031887\ +6906455201397017135:\ +-234439009075326480604323496098115161312227136676259000693031887\ +6906455201397017139 + +-448761802739957373377693318750581411296787367117499463888322757\ +67882143882764:\ +20982187786:\ +-448761802739957373377693318750581411296787367117499463888322757\ +67861161694978 + +-601944008264824351134005823298148744369561537910415436895793990\ +7896782179207195666302228625496897271988494:\ +5325663024991554160033166078015937845836527207540797603647364222\ +91735917382015688217276924340984564880:\ +-601890751634574435592405491637368584991103172638340028919757517\ +1474490443289813650614011348572556287423614 + +-737554715636160268477263493571675308338509596629210590529282292\ +3781472871944886871927821129478599825311797681268315326408823018\ +2865250970217610487:\ +-30100016097092378349958946184353117306134810372681:\ +-737554715636160268477263493571675308338509596629210590529282292\ +3781472871944886871927821129478602835313407390506150322303441453\ +5982557105027983168 + +-221117706668970434568685275663894630667495895204444708028536428\ +3965878599873864667094550865713828159912:\ +-536556043937245689200756579876160678199726920153847573681478030\ +0517383963455858081652308237033460360040921820049494698892905680\ +307378540208:\ +-536556043937245689200756579876160678420844626822818008250163305\ +7156330270130817033696755317318824644006800419923359365987456546\ +021206700120 + +6074122512337108841968521649035076841633691574254417104144285970\ +8190687151580370231498672521465704184848502349798380642493738161\ +63440:\ +301843614094506325875637699:\ +6074122512337108841968521649035076841633691574254417104144285970\ +8190687151580370231498672521465704184848505368234521587556996918\ +01139 + +-518214776931158149908771340564348982010543985108065053479219152\ +7346598920424997741288096547136515478330872068932567407374262007\ +15673766732196603988:\ +-298351725577476937261155258873861370046745453114225573456588840\ +38760353928226157702249175218280718951979:\ +-518214776931158149908771340564348982010544014943237611226912878\ +8501857794286367788033549661362088934919712456536106689635839029\ +64848985012915555967 + +15937412249227240968245047444122:\ +1862146803761694261088224507009788278865690534402542585855766455\ +30381613666540347032550716844628275956253:\ +1862146803761694261088224507009788278865690534402542585855766455\ +30381613682477759281777957812873323400375 + +-125280101162586858550475042529281076239231054587017617079119695\ +27003855713485846140551107967495813584097081777160:\ +-539986280927242338236008809854961759996986302156061552378097160\ +849129372827386927545686899193598721998757419572890:\ +-552514291043501024091056314107889867620909407614763314086009130\ +376133228540872773686238007161094535582854501350050 + +-2454746908:\ +-382295712788939478005524215636037018707559207865555237605060467\ +9934415014573879513870030211860839641756441626913419699098985245\ +833920954444218:\ +-382295712788939478005524215636037018707559207865555237605060467\ +9934415014573879513870030211860839641756441626913419699098985245\ +833923409191126 + +-54288706131860071583318409080596095357980447323635:\ +-425339410556015631098973742993327323051438456819027069606294261\ +157940297643297240559452124432779202181589763874:\ +-425339410556015631098973742993327323051438456819027069606294315\ +446646429503368823877861205028874560162037087509 + +1418766894051319870818496026367686195459604395660119754151922014\ +257535705077512233275240217434104:\ +-111987390206074845527:\ +1418766894051319870818496026367686195459604395660119754151922014\ +257535705077400245885034142588577 + +-690410131860410477456103857594543515409677479242833618634809302\ +4529626004763532868225501682312348541164651530788457447229874477\ +19420052500874721214723:\ +-258469037743394674731135699243278836145549479106673938483740960\ +9897387109736539600623155880918146331681272708396146283818299:\ +-690410131860410477456103860179233892843624226554190611067597663\ +9084573915430926716599597781286219638530047537020016256411337794\ +00692760897021005033022 + +-2326153002179462643778624079324592172489363679671158:\ +-109819757548464054181938329012610459679:\ +-2326153002179572463536172543378774110818376290130837 + +-442875225056652548835385770919494174299378557880791141401695920\ +6453045495320705299466107784149485981354180907411034982168391:\ +-392477782593742153255217680053880075265812358324465405897205608\ +55741992694947322437679214611686905696:\ +-442875225056652548835389695697320111720911110057591680202448578\ +7688877941861295020026963526142180928676618586625646669074087 + +3047:\ +-735645878503131535237769321637196107334337768903902046180401737\ +9719600010085607082927794304834315616579528230750813527764131521\ +4:\ +-735645878503131535237769321637196107334337768903902046180401737\ +9719600010085607082927794304834315616579528230750813527764131216\ +7 + +-89094716573076464980713547115099137014719483620102078148320806773871\ +083148864:\ +89094716573076464980713547115099137014719483620102078148320806773871\ +083148864:0 + +-89094716573076464980713547115099137014719483620102078148320806773871\ +083148864:\ +-89094716573076464980713547115099137014719483620102078148320806773871\ +083148864:\ +-17818943314615292996142709423019827402943896724020415629664161354774\ +2166297728 + +7139718976538104911036273126224339498939049952371944598728684359\ +8407339615555456955143712741779487184644001767776382991377987516\ +772847242986:\ +-5821969555717973232123574849275726788359152255219972775831:\ +7139718976538104911036273126224339498939049952371944598728684359\ +8407339615555456949321743186061513952520426918500656203018835261\ +552874467155 + +-181409752656613138777964092635909379021826360390960647186726991\ +165227400176766831466541160049935205507919070233410228328274:\ +-523301382154855044703947051892202646490840761177533623732372519\ +6899184207698424247726764075013505280967149049152973476842478027\ +73107355881667545916901:\ +-523301382154855044703947052073612399147453899955497716368281898\ +7117447811608030719594033986665779282734817363818385077341830082\ +81026426115077774245175 + +6858961373707073067:\ +-334051508933893061433844279764271107181974906283364991309903077\ +649971606436918071327072869826471946094594594115614990907:\ +-334051508933893061433844279764271107181974906283364991309903077\ +649971606436918071327072869826471946087735632741907917840 + +-236350989303745694071719069604296168709084242815199446584909401\ +09956689534874971218650241680916564611:\ +-189589178757795228335995891331428279524485393011427187469792714\ +4384667023598274379343968662673642819854164720298367788750543006\ +0922528525205:\ +-189589178757795228335995891331428279524721744000730933163864433\ +5080709985285365221772120657139491913865160389251855285872408030\ +2603445089816 + +[Subtraction] +0:0:0 + +0:1:-1 + +1:-1:2 + +100:-100:200 + +0:-1:1 + +0:4294967296:-4294967296 + +4294967296:-4294967296:8589934592 +4294967295:-4294967295:8589934590 + +13407807929942597099574024998205846127479365820592393377723561443721\ +76403007354697680187429816690342769003185818648605085375388281194656\ +9946433649006084095:\ +13407807929942597099574024998205846127479365820592393377723561443721\ +76403007354697680187429816690342769003185818648605085375388281194656\ +9946433649006084095:0 + +13407807929942597099574024998205846127479365820592393377723561443721\ +76403007354697680187429816690342769003185818648605085375388281194656\ +9946433649006084095:\ +-13407807929942597099574024998205846127479365820592393377723561443721\ +76403007354697680187429816690342769003185818648605085375388281194656\ +9946433649006084095:\ +26815615859885194199148049996411692254958731641184786755447122887443\ +52806014709395360374859633380685538006371637297210170750776562389313\ +9892867298012168190 + +17976931348623159077293051907890247336179769789423065727343008115773\ +26758055009631327084773224075360211201138798713933576587897688144166\ +22492847430639474124377767893424865485276302219601246094119453082952\ +08500576883815068234246288147391311054082723716335051068458629823994\ +7245938479716304835356329624224137215:\ +-17976931348623159077293051907890247336179769789423065727343008115773\ +26758055009631327084773224075360211201138798713933576587897688144166\ +22492847430639474124377767893424865485276302219601246094119453082952\ +08500576883815068234246288147391311054082723716335051068458629823994\ +7245938479716304835356329624224137215:\ +35953862697246318154586103815780494672359539578846131454686016231546\ +53516110019262654169546448150720422402277597427867153175795376288332\ +44985694861278948248755535786849730970552604439202492188238906165904\ +17001153767630136468492576294782622108165447432670102136917259647989\ +4491876959432609670712659248448274430 + +# 2^512 - 1 +13407807929942597099574024998205846127479365820592393377723561443721\ +76403007354697680187429816690342769003185818648605085375388281194656\ +9946433649006084095:1:\ +13407807929942597099574024998205846127479365820592393377723561443721\ +76403007354697680187429816690342769003185818648605085375388281194656\ +9946433649006084094 + +89094716573076464980713547115099137014719483620102078148320806773871\ +083148864:\ +49505213825110728957828173754776257356620450607893971553289366249708\ +672306581:\ +39589502747965736022885373360322879658099033012208106595031440524162\ +410842283 + +65894747009896006767807716946835412110318548717263922395390971078905\ +789585431:\ +38842697419255082259907154168620472841946037999026507486310396086843\ +67281358:\ +62010477267970498541817001529973364826123944917361271646759931470221\ +422304073 + +5950196396451977566902121301707054218364717196893101360011491777\ +7619522537369647091659626133477106071641786829877837558948110242\ +88429224592316636383:\ +8750653273562160761286422180115618621879821429145276197424652349\ +306577311499807887070429373153777028581165316131683348567:\ +5950196396451977566902121292956400944802556435606679179895873155\ +8821308245916885117413102640411332956643707959173543827410339957\ +07263908460633287816 + +9815262808265519920770782360080149146267723690:\ +1406700576889160928136491935811529134135218991825578039756006074\ +8765650205261663193732434161580120817:\ +-140670057688916092813649193581152913413521899182557803877447979\ +40500130284490880833652285015312397127 + +-390149102941948621568479722346940666704376013734485343840154221\ +6058534125031549938788864908670209347775308945934163371753998650\ +65870417717658815158195790:\ +1456031684988128870809574635750149625240648487837308:\ +-390149102941948621568479722346940666704376013734485343840154221\ +6058534125031549938788864908670209347789869262784044660462094397\ +01620567342899463646033098 + +7473774301764883450943:\ +-262563698593678907551573728200523874834027237901855629084919338\ +12453:\ +2625636985936789075515737282005238748340272379765933721025681726\ +3396 + +3624634325121492202413918675700914884929548559339795200323734966\ +0142296147421019916619944353877490544706223768684758263065399016\ +597969:\ +2574427901445527995149185461475228850098549655325125750771680756\ +4031046245695227927925972232181431549249881995623555170649626659\ +54307425375180:\ +-257442786519918474393426343733604209308940080602964015737372875\ +3165754964427226645371577306598198801047497654856131748380204402\ +888908408777211 + +30129746266682790628283889040897642317014108334116727:\ +-158048052389539876256372171547438090363007387136214391586439872\ +4834897608423:\ +1580480523895398762563751845220647586420702155251184813506715738\ +943231725150 + +-4614735863800137951667138933166372061:\ +87175694379075561307234146162193190462135078700346746992273:\ +-87175694379075561307238760898056990600086745839279913364334 + +-3753904:\ +-11269137783745339515071988205310702154422777729974:\ +11269137783745339515071988205310702154422773976070 + +5925239484953794400820212797381700884029188584554700501406527871\ +71830058864932939900794505955437856926902975870288:\ +-205854658295495452479104108497931263758143158076949293929661651\ +111:\ +5925239484953794400820212797381700884029188584556759047989482826\ +24309162973430871164552649113514806220832637521399 + +-33993701617495591491176844355:\ +3438065097398894672826284379125235190693300918673662774192379185\ +002391232383325160416036963599856704698280:\ +-343806509739889467282628437912523519069330091867366277419237918\ +5002391232383359154117654459191347881542635 + +26876428790838270949718735111909136008255051776703:\ +-178112811296681037328619200883114927554699563526876724185996760\ +9117529616872536681035700534316457543887601645022:\ +1781128112966810373286192008831149275546995635268767241859967635\ +993958407710807630754435646225593552142653421725 + +2059771092932179758019770618974659367350250375647433386639519387\ +69317693429941871882153770641334267205446421916220398066553188:\ +3342500267594994347156312297990633112620923791590960237694328174\ +171473763026:\ +2059771092932179758019770618974659367350250375647399961636843437\ +74970537117643881249041149717542676245208727588046226592790162 + +5545520403000578843599072515870982842927227412121917598877293331\ +575380404618111609:\ +5991287327241003718821424770352575362437680738923552868139860461\ +945460339860477495902:\ +-598574180683800313997782569783670437959475351151143095054098316\ +8613884959455859384293 + +248039029608125071340:\ +3664608673:\ +248039029604460462667 + +15425705711415937103627:\ +-143550406551774570344004527686898291075408140547412300376755421\ +1132837427846963435621523810229738262235546179779885824:\ +1435504065517745703440045276868982910754081405474123003767554211\ +132837427846963435621523810229753687941257595716989451 + +5088284720510864560728156892268365268867173823603073291434760082\ +1086:\ +12176160963158:\ +5088284720510864560728156892268365268867173823603073290217143985\ +7928 + +-354265185659858189476700478770330228855421724619735662285097710\ +5341631254320181588119095376220762923216041205830017303882425678\ +3171761132:\ +-486486260736646884318469435312383053458853801109381241820880813\ +5799:\ +-354265185659858189476700478770330228855421724619735662285097710\ +5341630767833920851472211057751327610832987746976216194501183857\ +4363625333 + +-142859621471226831038214482817138481252017914160812187001355640\ +2879770424002218157546599921571184:\ +-4054101:\ +-142859621471226831038214482817138481252017914160812187001355640\ +2879770424002218157546599917517083 + +-200931:\ +-445588024601304957594828329131607177911517867255705194754496076\ +5970517168228311149083493083504573514296684748300915751495017756\ +5952218520297258834187372:\ +4455880246013049575948283291316071779115178672557051947544960765\ +9705171682283111490834930835045735142966847483009157514950177565\ +952218520297258833986441 + +105704314890799915321259:\ +8279235459450764155749124384991698144145630668774941008316577611\ +9049069747385436947778487411878749535140554980332961534712093812\ +3226038208:\ +-827923545945076415574912438499169814414563066877494100831657761\ +1904906974738543694777848741187874953514055498033295096428060473\ +23310716949 + +1448979433940064018828919290452280235308901982649341:\ +303926827425887072291878308433008512899006711759770318009:\ +-303925378446453132227859479513718060618771402857787668668 + +-243237595290235750457450892290434789864:\ +1981770207633427640298127306741732109846753330094746386538370200\ +5126562800253466403934608765512316565811954342319565128573969:\ +-198177020763342764029812730674173210984675333009474638653837020\ +05126562800253466403934852003107606801562411793211855563363833 + +294037338365659932242802023634:\ +4401245995535867764294876849802142926077599828776505639975554254\ +356763769548465:\ +-440124599553586776429487684980214292607759982877621160263718859\ +4424520967524831 + +7303853946195223307036710881687367004566538357189824031021831088\ +365362:\ +119286025999378935715794641163321741:\ +7303853946195223307036710881687366885280512357810888315227189925\ +043621 + +5711673553432872356876026107141104160674262893635054129088049406\ +96550592413192300554016875:\ +15872188842802631759540597:\ +5711673553432872356876026107141104160674262893635054129088049406\ +80678403570389668794476278 + +1002240129784524388754179399598974973256811336031329881209395070\ +412702275169416754240:\ +5942948247886059134314539354042003351647830595287234900671578947\ +7946474753657206800070515207967709079933420746952:\ +-594294824788605913431453935394177933866937815641181696071168145\ +04689663417625876918861120137555006804764003992712 + +1370431648825444838359719050380239722263203134555431526491525074\ +601463042144798545817957389:\ +3473869878:\ +1370431648825444838359719050380239722263203134555431526491525074\ +601463042144798542344087511 + +8548280229254726209:\ +3306612503526990498184932043401689273494314593558214198996828084\ +6973981913056248918:\ +-330661250352699049818493204340168927349431459355821419899682808\ +38425701683801522709 + +-190235588326875064895081507959663321759901299630299289585841701\ +1175963029327693964733408210016910253836443785984639809506517193\ +6899503:\ +2489927112752354534228346876280965340763863196622012469575197689\ +4193103779443050843040771191227522843088079031762445684377195650\ +493065096847292797:\ +-248992711275425689011161562692991615584345982983961148257150068\ +2315168794955481047333404813087485692518824813430081012223704204\ +8588130268784192300 + +-180035357552270638928830562379719669053087020435672292804206122\ +8497437075035917720399302198953687023:\ +-118756682615304660537085387309407764121711064830726245327571774\ +71384128016458332544642788404765469924496127460164:\ +1187566826152866570013301602455148810654730928638209366255282074\ +8456085955229835107567752487045070622297173773141 + +-29861551039945217879:\ +1113473025916855642353456146647542930581669082348409639697282960\ +8778892265003199963808382325823762328728689476247937892128298859\ +34:\ +-111347302591685564235345614664754293058166908234840963969728296\ +0877889226500319996380838232582376232872868947654655340252775103\ +813 + +5655329636567611538382182775649579176587072976497579206763033016\ +55328103665512287797108510139837643506491641987188791892506290:\ +-2188105671531473889939411772533707:\ +5655329636567611538382182775649579176587072976497579206763033016\ +55328103665512287797108510142025749178023115877128203665039997 + +-349535960680522202843083381184496349093812380954435872337802226:\ +-1829600726218222026679938:\ +-349535960680522202843083381184496349091982780228217650311122288\ + +-1:-6726974989587128275:6726974989587128274 + +-107142709838121196902389095205618516687047338619382145236348309\ +762148611647954748824:42484103615491:\ +-107142709838121196902389095205618516687047338619382145236348309\ +762148654132058364315 + +-905466304300857697648396075281161213818488784945743608120275996\ +40018921358040178215575723:\ +-118922408531468986902800063237122125617455464103913195171141030\ +774109638861272017660698580914239435114280434761425243:\ +1189224085314689869028000631465754951873696943390735876430249093\ +92260760366697656848670981274220513756240256545849520 + +-554504466708242712880172641672765736000158843011357818285065757\ +3063241939882570324573086267287272360432363387213743735507218270\ +373633222520429:\ +-151423255459028627628896755237194376177115:\ +-554504466708242712880172641672765736000158843011357818285065757\ +3063241939882570324573086267287272360280940131754715107878321515\ +136438846343314 + +-5247636471953421659649611318164848102069:\ +-4024324110573096565232590473170599175885004:\ +4019076474101143143572940861852434327782935 + +3941289260601504332248485425387937172318645783859022479504017847\ +2832:\ +-503832132195745214503468781543289068482546657912347492184846539\ +3400312:\ +5077734214563467188357172669686770056548653036962065146643505571\ +873144 + +-559794145880092270356836245052087667531874697277996402772042742\ +07843317583292736333912783829528270272642583004969175230274821:\ +-109633110576212669339535976775635762395927171313557427036242111\ +4760163985793453669084013340255712657141281083080320737794421813\ +69365924213118258269679:\ +1096331105762126693395359207962211743867001356299329218274753582\ +8854667077970508970412712618225368242139177439524824425117190872\ +6782919243943027994858 + +-387523538981733893474792162857729999063252864213028668543507370\ +50533204094183249691110:\ +2428819407377764342156426895396654728835493564788997075896393065\ +230009911546390816091652653701035085361:\ +-242881940737776438090878079357004407631470985056199698222167948\ +6532876765897127866624856747884284776471 + +-2784579005241382005249492720344:\ +-164204542616919252351131740123094674:\ +164201758037914010969126490630374330 + +2009488574208715447478080609723750390524012808225058048517328681\ +00:\ +-795957177479360455258269298038670876462147576765875895105714:\ +2009496533780490241082633192416730777232777429700825707276279738\ +14 + +217570540819:\ +1219550835977204209833842821666933073941855304313684768349807483\ +02158718406063500763434561937200696970170700:\ +-121955083597720420983384282166693307394185530431368476834980748\ +302158718406063500763434561937200479399629881 + +2335319252198456765380587281374076367944:\ +-4500271:\ +2335319252198456765380587281374080868215 + +-393694614027544181700073367147249369966344727230221941008713805\ +434207925307052598:\ +-153972676737062409261153899615588515236137907791841623991260363\ +8406802955653131579724891681323455217806580074596028231257978067\ +70:\ +1539726767370624092611538996155885152361379077914479293772328196\ +5898022219816590860252282340511529983964929365416861520049075417\ +2 + +114832549702862263167:\ +1292186490722995955874527641883028787538667360089228102228659716\ +5773569473039953984775959232814911435097412913078625:\ +-129218649072299595587452764188302878753866736008922810222865971\ +65773569473039953984775959232814796602547710050815458 + +6489502346837936889305337487724547956628371915228387374094443896\ +2663621059310651530729834259117675802940765940789328350084947778\ +66083:\ +1099205476533612407829257935144627350486541654788267826664706620\ +630745291371323154513322608446957760026881954001581:\ +6489502346837936888206132011190935548799113980083760023607902241\ +4780942792663585324422381345404444257807539856319750749816128238\ +64502 + +1699911441239587542538013131736629773378508702733583789516405216\ +01077152994474340806917796870911557233689087716056557:\ +-15409167:\ +1699911441239587542538013131736629773378508702733583789516405216\ +01077152994474340806917796870911557233689087731465724 + +[Multiplication] +0:0:0 +0:1:0 +1:0:0 +1:-1:-1 +-1:1:-1 +-1:-1:1 + +-0:5:0 +5:-0:0 +-5:-0:0 +-0:-5:0 + +4294967296:4294967295:18446744069414584320 + +# Tests on sign handling and linear mul +15928512:20395958369873946873946873498674938762987:\ +324877267646037601269025261886125746185503585344 + +-15928512:20395958369873946873946873498674938762987:\ +-324877267646037601269025261886125746185503585344 + +15928512:-20395958369873946873946873498674938762987:\ +-324877267646037601269025261886125746185503585344 + +-15928512:-20395958369873946873946873498674938762987:\ +324877267646037601269025261886125746185503585344 + +20395958369873946873946873498674938762987:15928512:\ +324877267646037601269025261886125746185503585344 + +-20395958369873946873946873498674938762987:15928512:\ +-324877267646037601269025261886125746185503585344 + +20395958369873946873946873498674938762987:-15928512:\ +-324877267646037601269025261886125746185503585344 + +-20395958369873946873946873498674938762987:-15928512:\ +324877267646037601269025261886125746185503585344 + +# Some tests for comba4 +340282366920938463444927863358058067579:\ +340282366920938463463374325956791500548:\ +11579208923731619541729378749232972134965448161202875719419539386122\ +8599533292 + +340282366920938463463374607431768211455:\ +170141183460469231731687303715884105728:\ +57896044618658097711785492504343953926464851149359812787997104700240\ +680714240 + +170141183460469231731687303715884697989:\ +255211775190703847597530955573823923340:\ +43422033463993573283839119378257736288536818090295526758568867574118\ +988163260 + +297747071055821155530452781502797180927:\ +170141183460468022805867689086709264301:\ +50659039041325475543690391927479197318639397862390185708883012434796\ +959187027 + +14601326942920387013816701832353570086:\ +24264364577528921915881695974297771845:\ +35429192025871610141024926748879851702222338457773664017578783702084\ +5028670 + +146013269429203870138167018323535700860:\ +242643645775289219158816959742977718450:\ +35429192025871610141024926748879851702222338457773664017578783702084\ +502867000 + +14601326942920387013816701832353570086:\ +242643645775289219158816959742977718450:\ +35429192025871610141024926748879851702222338457773664017578783702084\ +50286700 + +146013269429203870138167018323535700860:\ +24264364577528921915881695974297771845:\ +35429192025871610141024926748879851702222338457773664017578783702084\ +50286700 + +# This one triggered an internal error in the Karatsuba routines pre-1.5.1 +84464209123861960605955522581978104887597821936897255830387847065955\ +8899906113628751877643450961:\ +98736951733086678034646082696089517704609210537259909243889983275639\ +1381482452634765035178337262:\ +83397385394360978145497699467080869269009479990938738462835142243431\ +68965095514489024855209740810586369398339972616667107927536797156602\ +16305715905081674268833475056324309733116240691616008782 + +# Bunch of random tests +65391683115015322641882045438465620784076516421367563767344998373464\ +211053082289513139:\ +14690551177765498638640685224012137037306962019402563878738998365076\ +1050984890:\ +96063986740135661881270234408778414507112892608292678410994214305223\ +58175678639192181958429173932035325313118014847793404794351246657465\ +400198770681540554545469710 + +1459164589787755339073553407089181299573246969:\ +4955710571301004201072727045590614350659542263:\ +72311973828792724517911747511119452992590495960205135450079047249531\ +44018123225390192150847 + +3793974577745786452436021977649815501504431203:\ +2923303082707524288431115654231878223978230055:\ +11090937578838235312365399492067271746660860774658228109409108903923\ +640884753924587454406165 + +101303541515453867913135264584014138619190734343846977507421629791:\ +36729564208551355196057918758932548366821793131129547653209379728:\ +37208349326455106997710672468998674976019345812041319483326955314975\ +51053692760634209776285429196890853333966465984989349956276848 + +44895767034162990997987303986882660674722497505237491649296190658571\ +47197906588923414435381184370662953551284823547380833018151742197013\ +59303201872276975123159197578062043415450227149917179130060317248184\ +61724742069401359454784533576615919680949125073761586043027941204059\ +690093447093117249681641020785611986:\ +16696330082433130739210985196630214321753266552182432027772967004925\ +52487573743509832387533060375698218277114850491112782115377202073776\ +62825100480410971654051009789510884031202872930809935194297665183801\ +70736075740497155051843194560584923206479837331572253151736065154330\ +02181215131563438851752144164132708:\ +74959454570640520505374182178324326203870806497691482733643463532317\ +75442982425470080130736910895976501997512084030656668411349679742847\ +21690931312000529989464756559726986788294230843854125058213935382088\ +33087270201941766663613578038620398830216648062658181759195126557523\ +37555785758593956590738976578724612143644830770362020115624628734003\ +14793973405636949715493148568894826023486325367366577289710265462268\ +93078189596361078496041841642207401666400444087608269521582499768080\ +07159362627730642339199533209051979652974085966347840098279340160090\ +19527545420793815544675402025957881285966830564213200530247666994380\ +88 + +31239732497959818638292779200667312725332984706050265703512759466859\ +84736003183931208107094690791134882086398364414246612787541657212152\ +296954515345861259:\ +44486010269203082806521604993132013139417339215738521529001729101974\ +65470989031351517957857643691181436996411785695418178273749379126148\ +152297344989418668:\ +13897310607113977660431400418487955410781290158603183057898927941454\ +42790371799023389229350908578189623154651948470463734628718228022175\ +37160459735416212605027206307627525795256098590275806474422724678539\ +64782315844000916960349331847619603498272594899577643345409426860228\ +282896290162148120168283702192583012 + +91271582:\ +1044096341139516502862794205655492738851558322471722173871372437\ +43310942332:\ +952963248162153539313947560906101692644945912572602330737192268\ +7571591624552409224 + +-91271582:\ +1044096341139516502862794205655492738851558322471722173871372437\ +43310942332:\ +-952963248162153539313947560906101692644945912572602330737192268\ +7571591624552409224 + +91271582:\ +-1044096341139516502862794205655492738851558322471722173871372437\ +43310942332:\ +-952963248162153539313947560906101692644945912572602330737192268\ +7571591624552409224 + +-91271582:\ +-1044096341139516502862794205655492738851558322471722173871372437\ +43310942332:\ +952963248162153539313947560906101692644945912572602330737192268\ +7571591624552409224 + +-9007685545468534598743641658049346286545924671394080257:\ +2708960019652616340610787776914583117699836940876415749938089814\ +6081690884713840035653793589401490015282276:\ +-244014600122770296285710957465763428914667734328300934010213909\ +4856883353826536741655516010662407431799548978798414309377210905\ +45677125226465989158836569253624932 + +428475864:\ +1642909320501970182957064144199510240834448195404018829560344234\ +44879791407290995292738391711524351126135935031044584272585059146:\ +7039469905757345878447661340893057388183882714889777970681372359\ +9286724999378785107476015314565835105810467743874695068716694731\ +073452144 + +3804585298456788532803090036944486:\ +9742592765295469751314273699067197683737589672961737725951028020\ +8013084557451228262241241203602290304633025697300826898557186337\ +686135242:\ +3706652520369461349681131925078860959899355051485269139180490532\ +0467536020217182138330427311026318308608257076867490449833762996\ +8681057630927906028048393947534475842175612 + +-35149344750729324695898480464299390828429941822615:\ +1752615203067497391770113249494248437526672507748487522889401580\ +803582387921659886646983402010731854517398777968222841997058767:\ +-616032759879889488930577794740723910260183908336496340745761376\ +2386195653397211971686493794958963315038864032857733526167220510\ +1088470032335610958791871921057479688753244615705 + +2224887148112689653000916580023252657898661078193469990759133236\ +362617772742210818665763748892926451655031017362736825860:\ +-2254472752938568904593125981795197834529:\ +-501594745378325694157035263090451802038729306146676277613732491\ +0318865702652093235942446178330845500337957245272966813848791221\ +008304843258214793080794968119940 + +-326328701700361893997973482656600190641887240518503116265346556\ +55295515493003511016396059566561:\ +-21680483:\ +7074963869626767136670866125187215271008195405978317997637869508\ +45488283622299239531287490699813128963 + +4389513377810870521262475775128351860157070070803223156864617016\ +76781196153736168934878334587194620411888:\ +1591402338122279449286758479905480147444383058415555680119818315\ +:\ +6985481852667243947827954917503754523391596798272663056116832798\ +8639257425760121941859610354487659319836581325691828420744517855\ +7475650610301655551351877918657026128720 + +-5742879080477972131875:-117203:\ +673082656869259767772145625 + +-41663152776865616597841653055290004804009193:\ +5835026797641751552624640633869101411165325469966866477145:\ +-243105612927253227498125135247022492715711849036333775420426222\ +096834839368617968764219011608104393985 + +4173221:-226716880742:-946139647767009982 + +-2:-419149616949225277707956479498985786267693664978807:\ +838299233898450555415912958997971572535387329957614 + +-7465837654969091645574504830799010297689933581098938996:\ +-202766795624052324242807175739440132217946363911505883055059139\ +6802793334274781900133686867487904621446567316359570842284699541\ +23774859572282855983153:\ +1513823977947471878037349023375096499530047411943626417913495002\ +9266163268789802231784935230530990513196596039364219349962480236\ +2882318096853516252518151818670572226535777283574688903592768015\ +9878750734388 + +3279753735679960497081857312:\ +-120409079507914667933587089469886612743428895521786295640815348\ +9755449324053336110735728979481112654778080841040146337772577107\ +9932:\ +-394912128325868511771837525267263805962903118191080245346895278\ +2101319174909498798792301813784053942666817514010081546325334905\ +4670131212205861739934570662784 + +4087017444924453990694625061188553846924665921421375573052029701\ +043709060984050262732827338392612774866740696110490073121:\ +3201354694306000008850909268274836475189060544721638298393454399\ +7010152870984867537367271090975150700374414635283625090662581086\ +8464508777654674:\ +1308399248301941463281797376424136020032561422146839113205163993\ +0095140051921364225220153999482159067766281848161373837807682105\ +9323529563247238502827327776282135135915279474234713191582888777\ +1511404594446973439104298431438185694530043948690757478249515261\ +147417554 + +-179313367402631288677862721876578030440889951889929042528322527\ +8085266134713795430545312954193172520148465554221323897345577960\ +264434757547077538451:\ +-33744480794260115381826015778:\ +6050836482472199350882052360070598557985968830769735487227048700\ +2553193437634540742425617610465933528817398184780529934951394335\ +131691780368690568505046871430214639380927679878 + +3180313045123330718974011402998828102633:\ +-395949120505103380356259679899143757026704962287504981215815665\ +380:\ +-125924215314748995932963128833366357734780900635789980947564937\ +2075592673896477843481666129302983824945540 + +78394433139310872652394899769973779113149326061838893498:\ +-506317937717:\ +-396925077155891232039161994526220415197346559686986697686085602\ +64066 + +6992304690095528264306828961300165566845561346363146805401105701\ +874655545973774463962200355744318214727682521358902:\ +-133619017321721689986267587295828262450483752049648766344634742\ +91685037600448415:\ +-934304881504630204568833073073911400366279420013023235031438382\ +2934806501904607000964107025275607243164225972618594885288739045\ +8800341193419320569112624739820560918330202201239246722530352040\ +330 + +-279747165826180670739009508896477442612565831634509:\ +1001070223323787961662547493417138134890156942660669560843733241\ +4633638061364752177870909932683912027813180522891316:\ +-280046557767811427898723527174997897592562433513837063010261215\ +7561198396498373067781895023542952270308263849208412127831845586\ +715174925803969788307318868622842023844 + +-152342817045381492055715979459468344477216937481934776490228525\ +31778605803188114866165739904589756975:\ +-2212835903613879894390831209261230372573882516571420663066:\ +3371096552157007383916181066595556807779212082757370662982557178\ +6303181325061530061815766217946054712863588378057790411549645679\ +971413325974723607366298385350 + +-6494091656668836641394369738257289569440116499061905611026:\ +1112275782840317521987084233672591688806254182453409490318139855\ +2744964172429976273740793816660934415725201105937791700128767940\ +628761787374194934304:\ +-722322088125810479882613158179027486065378866899909715094586413\ +7631103621500568007359634288605863429230875357724233639767911115\ +2068815511020712301669909478881408853498125187530355741482610911\ +208923048035904 + +1259075970239705718009909682383850925181613342972607875664276820\ +78026:\ +-318663749166949940724436640747496455489904112200179629829091439\ +2694468149048117282961429675979014117768927070124265356881836359\ +049426402836926666527884852:\ +-401221869162599711356856060105595763645472859526212982202400149\ +5177647664741074762667141421159412849263518723551697751858002053\ +7542672075930439535906386249755965714824568354356750289932068520\ +3787316784029369163777807462152 + +2209196064019679034549708549203671427517764511470713969280084552\ +75125503453318134640933653347485145888239438775112197321859:\ +124322370280092642752:\ +2746524910923777881431201305680978264281158564024544236980377993\ +0636867162970792373254349391903852439413048040893096230035640839\ +019184047515968 + +3082058203728546610432890576347992072668373530737159518097003484\ +3125203068791784796435721368414598060677372556794113220896530315\ +739449185455779351233:\ +-552090427013053554588518469958636851397777719282856055637956259\ +9226137:\ +-170157482977557810525065897604283065952067566293743982849411731\ +4057452157313429551986153220866320527892664570619020242072409661\ +0134368039649413644973455415575096896642638467426667020714240674\ +6077334196123944909716776921 + +-750276999830609236437180125267494301299136351451377419221886149\ +8911986254315057380891206497595590249266192106292303419043717156\ +81219472681905129612:\ +4205355271908551:\ +-315518133662938357806548055254433388492269241826339016138263604\ +4618312099336135707474248962067915083570475597285597855437079628\ +850888491804577876260379972266112212 + +-891480538085009501272618223055661423871310460861205688650041631\ +6753749755092306432442174291514301244257968406437077389253407330\ +1027650622821713282798669:\ +1823891225274156993815141670030683418070006803521364429343774264\ +50339496570500278332821206013754250417471107492:\ +-162596353091593275777884582766611115972439819895849702568800957\ +2367685595981932088283461337162038543383704114341129033405716497\ +0880798827330185683075499346562579922155299739327439570345879557\ +1617840239191503928488539315719099552021212289189718073280973406\ +93528148 + +2124681182585249920847800665256356364758375848619965937406893722\ +55899052138313727858090571132568351249080019:\ +166675024913973810158544:\ +3541312890416478684229072496000778308444354108581194567659019593\ +9857314201986899403459218685673527418723464730927296640736532532\ +336 + +1821270812209449323858422000208483696090755511739052940949819411\ +630382944845340233359392421633:\ +2128599324432790723202832411330404647604668944765842006449683716\ +50019:\ +3876755820478193889141631692181181045914395285524928078325690250\ +7363257606428059488182369494828732792776883797717522047063810333\ +3437096328016399478420072360461027 + +-335011184237031303208123967960797661123087083840830392886248022\ +143119440501379:\ +-230989343999262588479185165706529031246884375719671837094628940\ +050182325:\ +7738401367932796012865144293474273194190542200590231371857014534\ +2578579884777706655220887725142189714172038628849075667359933189\ +054779585318363926175 + +9198355732743233736216530024186914753135748283508055875656089812\ +193:\ +5265840759145098384429490542373787636725124845354712989635142593\ +95934459401303991397630:\ +4843707653459529764586164414557294257741706853681297466140467212\ +4298268715305496704100180574245676306441226124334746402488026433\ +56143901511622354285302590 + +8714296327732867082392471731937188058841333771145620157971112718\ +8495045603213379592320067530490555856585188563018570084376435672\ +250185088374873:\ +4210349889307237465841484620878589644044295847340349009991385858\ +7615774626884639631625125100679586906920885988199787927848195684\ +62193938751049439136295957:\ +3669023657886054286232729883213956427553614823342184148988934625\ +8269564694550999939890817870432701814483867503196358666291080568\ +3307419798404926447543906006174853340917944983123029252530968474\ +2688682844881192340842766518335434033712938061191158275417587681\ +07991512024470998588265108393429890288461 + +2981019:\ +4433245119720584557487584549690245587480169135936518003445698498\ +9177614053957189552768994493672410015:\ +1321558793354433725697708180673306621094454631744034296211369269\ +35453261869513407243405875196532834030505285 + +3371841482115264548260749392909612923666167033836512042138667346\ +1110922005108438730679287361069225:\ +-1224839645782921647445211493292528894:\ +-412996512659022216647456819920862349778936230990047619735626685\ +9000246454258876625428723876322584511859911068016361053904468404\ +6687150 + +-339290341643379646242121130133274175571738607527:\ +3271401581452035936363564486098243173858343994842704626634540604\ +0333753792872314861533886742557607640566446319092917014148799834\ +8498182361629081026057:\ +-110995496022355374018357458920157866276843573465657648989031507\ +1492983893793639677118229990155541637204519376994267321550212870\ +3024690173524970745190362239190804266551097416929422331908148558\ +3331039 + +-302193108025958893465396831014238400181355654244499365872812914\ +0671578942520441667218976086488594667623103779245243552871642908\ +5538517727995241:\ +2017851085218627867440914776334445037676170997318580940821659303\ +5046997219650546605682041506090881913886238203842281306969809595\ +246163485422064601589012:\ +-609780690975771196107607785560739006824539433569270870499177868\ +0127071341610096112489032765719159734331084718676312427284431166\ +3160752183891441001416955478885614399224358737795082762053960238\ +3642229098982445564368202356432336746046757695325766162758445391\ +517573101567916271503836326565773891892 + +-35188123484838216734793425643059054080:\ +9000600267361446370368675857998:\ +-316714233645582443508665110125938608546684298371094101256326282\ +531840 + +-287546392987328273673797823271747266125547785306672698267720774\ +608232552065:-724:\ +2081835885228256701398296240487450206748965965620310335458298408\ +16360367695060 + +7239719440345013275638025455463886572537307213436218405718641390\ +921197615256801869733473418374:\ +1273855558831670011845427584052189147328498974982056877978612327\ +370857472534105245496452412950690926717874:\ +9222356853465202151464594272999727525831895475287638674380433334\ +6933374970835844231896759667044442575039030759210684473734626375\ +4867082551600245844507805177238750672856996150996602083141097106\ +5816876 + +-467193764317015751447832154618223252689085556761857235622959651\ +6527745:\ +4062614168720459964554950353412675872692580185950353528672485067\ +66348747462819:\ +-189802800645215543819126042173342480893460145936335827236015901\ +5836446083789360925533289958276050415814781716398053517857780132\ +893397801668369413155 + +-256291521346916076469577753590332243088939322304016068224382551\ +5025546499325406138:\ +-605053480861014149406513375530972230393655979785947325614347032\ +55672033601321733124376224905086861012031956149097:\ +1550700771061164855884803447589885127420417575088485989466750817\ +5220547092689946197222125349076097067231864772732377382975294424\ +7005994565440548405623573916996459703805738162154040744466006957\ +386 + +37657585687987148872355696565539718:\ +-1434800894234388160687:\ +-54031137619832058507887448613713814837731429449464666266 + +4393856668836163872660314169038850961070596126492582636740923958\ +869429568049592915508:\ +-725654263195468754856026662040358630736857297829750596111795962\ +7542041685201743870533093436197634453:\ +-318842082361080325483580016771866191199973311649234286812044253\ +9591641099237099919800666371105550379907533870255064162462208188\ +3994207992073068621770789270796474452792924978217098797124 + +-22262682191673391309862211106958012450603677337242458360760:\ +220733215635032249425562508910063071532478728405839033930940264210:\ +-491411342882883504420371271016231681619217410641501118113820080\ +3099803240779721785281408106422401055283687004275837896399600 + +-1943809061953917342683052893090:\ +7700827546161027851150293971073751401383411867756623153657156490\ +3719544057834222201379883202137441380031452353172493763083243:\ +-149689383687721546514336832201365455374120959277626078690972108\ +3971845846592875060793450410610935237925773161603531529842259112\ +43685728191984096169649490870 + +3786170367178724834730573252874138148565139634940161475730134462\ +072806346795721773969696184:\ +5642009735645474144794852846572624514752624565190901861011302937\ +5113755663421195546:\ +2136161007243476508223846179651669079978058344237194176489154392\ +7622668375501304536598877419397709190638503067245194075783305398\ +2326877049744197485569753314370744763673996464 + +13489797398057489738508057443:\ +-39829491566872094526554950598431919339453350924955014031891083289:\ +-537291771704743910798219370322043426391226290103531988511540464\ +278547553363892492512309370027 + +-323325112374943657482631147177688351925959386858544487312506089\ +86289604167358883842577746321363893167908786:\ +-246925431746938028131175064627088867042153744157154625487424933\ +24630571161151476958595194:\ +7983719296781021810724607567340308787943618592037051108694438338\ +2489270621359904712938918152105643713875728369108646194020367483\ +4484438934808794593359943127130153265367987222230213154933289974\ +484 + +-435100258456539648627052287294649432161393329378094060187883773\ +2690708495675481854054541928447945875268:\ +-10155417715410577307402999881053155099930501238885853034128275227:\ +4418624872709263597834477604499556163338660202529113122166495103\ +6300436212506625541915615934966052700868562630468721925914800339\ +297995368984918582710621377945716385836 + +# comba8 tests (256x256->512) +11579208923731619541729388327330122708943419524243289762333678181937\ +5385575424:\ +74179307167655687693225162271190690968501083926425986337482366849894\ +604086426:\ +85893769551194762664489787067237470111583081643887491027483108939248\ +54152414995879834924747381994424629165311199542893443807287227310529\ +677629685837594624 + +11574114654373435432769681547953871289980961721498085841658839565237\ +8326940031:\ +10711660777805634592035489333768778748163480146501669697332609614056\ +735426801:\ +12397798998107734697368913960056304565756856899698066529320990905885\ +80174831683647898327881664370985256756518936891247178025618131778049\ +267698975117170831 + +27006267526871349343129256945225699676622244016828866963870625652221\ +609619338:\ +10706691322561929820710026337093404691680917641214496572907959829962\ +995350055:\ +28914777018473950489193423936996699498718323255670979720398132582868\ +12326099575727022500582226148289338093647474428048875439902371078972\ +17011952607363590 + +# Karatsuba tests (512x512->1024) +67039039649712985497870124991029230637396829102961966888617807218608\ +82015036773488400937149083451713845015929093243025426876941405973284\ +973216824503042048:\ +67039039649712985497870124991029230637396829102961966888617807218608\ +82015036773488400937149083451713845015929093243025426876941405973284\ +973216824503042048:\ +44942328371557897693232629769725618340449424473557664318357520289433\ +16895137524078317711933060188400528002846996784833941469744220360415\ +56232118576598685310944419733562163713190755549003115235298632707380\ +21251442209537670585615720368478277635206809290837627671146574559986\ +811484619929076208839082406056034304 + +67039039649712985497870124991029230637396829102961966888617807218608\ +82015036773488400937149083451713845015929093243025426876941405973284\ +973216824503042048:\ +67039039649712985497870124991029230637396829102961966888617807218608\ +82015036773488400937149083451713845015929093243025426876941405973284\ +973216824503042049:\ +44942328371557897693232629769725618340449424473557664318357520289433\ +16895137524078317711933060188400528002846996784833941469744220360415\ +56232118576598685377983459383275149211060880540032345872695461810342\ +17940303990259531467630757141966678572355892742551472687075667803012\ +238361561335049493812299230559076352 + +67039039649712985497870124991029230637396829102961966888617807218608\ +82015036773488400937149085058651889274919368784987519218104008495487\ +966999617338343424:\ +67039039649712985497870124991029230637396829102961966888617807218608\ +82015036773488400937149085058651889274919368784987519218104008495487\ +966999617338343423:\ +44942328371557897693232629769725618340449424473557664318357520289433\ +16895137524078317711933062342952193277060785350743397497444921769834\ +74555755777883734829695075352889186645794406339299840443362841695908\ +49124479353346416074683250011190629511478487550142982175186156043821\ +992372090244262099992413871225700352 + +13407807929942597099574024998205846127479365820592393377723561443721\ +76403007354697680187429816690342769003185818648605085375388281194656\ +9946433649006084095:\ +13407807929942597099574024998205846127479365820592393377723561443721\ +76403007354697680187429816690342769003185818648605085375388281194656\ +9946433649006084095:\ +17976931348623159077293051907890247336179769789423065727343008115773\ +26758055009631327084773224075360211201138798713933576587897688144166\ +22492847430639474097562152033539671286128252223189553839160721441767\ +29825032171526323881440273437995950679223090335649513062086992526784\ +5538430714092411695463462326211969025 + +67039039649712985497870124991029230637396829102961966888617807218608\ +82015036773488400937149083451713845015929093243365709243862344436748\ +347824256271253504:\ +67039039649712985497870124991029230637396829102961966888617807218608\ +82015036773488400937149083451713845015929093243365709243862344436748\ +347824256271253504:\ +44942328371557897693232629769725618340449424473557664318357520289433\ +16895137524078317711933060188400528002846996785290185531506439882279\ +67948175579511934243229492219161469505115934541754787322072497766508\ +32568813609316312895189314891581055577244380152406865341154204627445\ +048144934853380616505964511432278016 + +67039039649712985497870124991029230637396829102961966888617807218608\ +82015036773488400937149083451713845015929093243365709243862344436748\ +347824256271253504:\ +67039039649712985497870124991029230637396829102961966888617807218608\ +82015036773488400937149083451713845015929093243025426876941405973303\ +419960898212593664:\ +44942328371557897693232629769725618340449424473557664318357520289433\ +16895137524078317711933060188400528002846996785062063500625330121359\ +98742154443577980079599561074597766784810090551438150849000845701430\ +39463393843012149940933139094628420823280505085783531419710269806521\ +710678242326571370194267352288198656 + +13407807929942597099574024998205846127479365820592393377723561443372\ +67729797885965581514188847955651931542202341709841678538338597448558\ +6698740166243034228:\ +13407807929942597099574024998205846127479365820592393377723557015178\ +15690541073572989474743035547506906776301480077261237516040494971968\ +7212579269664735026:\ +17976931348623159077293051907890247336179769789423065727343002177599\ +00942480367760499251857295455939596154105772404450931317906536826768\ +15455762278256937871060873932808316066099592555454681197347421682785\ +09568862593066461743520871555375522976812396705343420538862100685795\ +3308142564518141627105027011868469928 + +13407807929942597099574024998205846127479365820592393377723557015178\ +15690541073572989474743035547506906776301480077261237516040494971968\ +7212579269664735026:\ +13407807929942597099574024998205846127479365820592393377723561443372\ +67729797885965581514188847955651931542202341709841678538338597448558\ +6698740166243034228:\ +17976931348623159077293051907890247336179769789423065727343002177599\ +00942480367760499251857295455939596154105772404450931317906536826768\ +15455762278256937871060873932808316066099592555454681197347421682785\ +09568862593066461743520871555375522976812396705343420538862100685795\ +3308142564518141627105027011868469928 + +# 1024x1024->2048 +17976931348623159077293051907890247336179769789423065727343008115773\ +26758055009631327084773224075360211201138798713933576587897688144166\ +22492847430639474137785575823367462584850327217807092221598818903544\ +47838349239959440410649295502088991241512540406677820071644448472599\ +8099692362528251405302763273230221311:\ +17976931348623159077293051907890247336179769789423065727343008115773\ +26758055009631327084773224075360211201138798713933576587897688144166\ +22492847430639474124377767893424865485276302219601246094119453082952\ +08500576883815068234246288158970519977814343258692149569327420609321\ +7230604120280344292940337537353777151:\ +32317006071311007300714876688669951960444102669715484032130345427524\ +65513886789089319720141152291346368871796092189801949411955915049092\ +10950881523864482855309433042883335846718668037787037650188893055840\ +73018927951831283900011347985854627812829075980481789955530757008122\ +88824849145421420410206954413439564292684600051414432901225421532791\ +01381942730678481306279979329106412319570512109276383150572147028830\ +25199880085119057947572011024091985929007350883874353448844224836795\ +78442377318748543006187648103374862164234771293283689764786919194438\ +37888284136626985706746129572759980426766233612587290367814732695050\ +64961 + +17976931348623159077293051907890247336179769789423065727343008115773\ +26758055009631327084773224075360211201138798713933576587897688144166\ +22492847430639474124377767893424865485276302219601246094119453082952\ +08500576883815068234246288147391311054082723716335051068458629823994\ +7245938479716304835356329624224137247:\ +10112023883600526980977341698188264126601120506550474471630442065122\ +46301405942917621485184938542390118800640574276587636830692449581093\ +50152226679734704194962494440051486835467919998525700927942192359160\ +54781574497145975881763537082907612467921532090438466226007979275997\ +0325840394840421469887935413626077183:\ +18178315915112441606652118137376847977749807751714959768073319302982\ +61851561318862742342579398163882332490385301856763596544225202215114\ +31159870857173771592553548685191068103016094862345941793100727824215\ +91038007155695622986473612841033928065392845889702175791770421586624\ +26143899184951734174822450721084185903177062211837438496534372480202\ +97467411486790074725866007726424039330919514310082034160544731735015\ +05505148992020823080165429348056649053453259548580079987024817945821\ +06278219961860441688154154020423122651667491374047530445279534822367\ +96606089062121158502205590789299321244993290459201196063373244192071\ +35201 + +17976931348623159077293051907890247336179769789423065727343008115773\ +26758055009616165775278099964665396948321782087417396060386782903823\ +07012341545824090641587839835926419363551226096078071585202389405050\ +15136893796472153753067084907045685619026471680211462175364329863209\ +0971267582066228875273648785630167039:\ +16853373139334211634962236163647106877668534177584124119384070108537\ +43835676571529369141974897570650198001067623794312728051154082635155\ +83587044466224506991604157400085811392446533330876168213236987265267\ +57969290828576626469605895138179354113202553484064110376679965459995\ +054306732473403578314655902271012864:\ +30297193191854069344420196895628079962916346252858266280122198838304\ +36419268864745685317012104530668242911371513575805609806190451951607\ +10557715881476395538121318622342054920551385626039497775648111929192\ +11010149235353314669473560070738635821344900819492979642122564308821\ +93832836355009007808239907501987022158846860226885245037291654118972\ +21789040347542992939815493420694907963244430325400081905612531817013\ +53434121697017777687388707760265950247661467236793723639977817395453\ +05333658727917987431471148302830409557728284992844256725143219605511\ +19105089461515317003555642348174884134868178964134073119096779203778\ +9696 + +# a1 = random 512 bit integer +# b1 = (17*a1) mod 2^512 +# a = (a1 * 2^512) + a1 +# b = (b1 * 2^512) + b1 +17930121528120518743193890185292405362795914617726312913105692310966\ +79834089760159821608571760102261884739604751290203318392915809389705\ +18533152042879507565469760620770664602498091326659618430896499562864\ +33097556186753511259807783990999180942484334496111552855551238437298\ +5931442517394084353378720570213259961:\ +17181164400078273397607302623726933788654231870578267885308639434063\ +29050645768615733989348336532688661355059992510519187273205749318328\ +55178025838720042408416717379221896884862317068300037779659390111981\ +97244867335458644846343599813562216158033039927051277398059877872479\ +1239444995247411522594037321941878345:\ +30806036568802130707161344222425760549041581576622091565254201628592\ +14385467809668014385184785152271193843047948236592285206889142604429\ +75839733409984928244101830825691058271214860952936075111998155431716\ +66320122704699248615782786577874030694743967942269571299270175479177\ +49821546067026790701696727687868585663474591471567191830596615534450\ +88805296433793120856742255208087463783715754626092601017174650889346\ +66486074650833697034162201049220647206717383818466106882937622653918\ +76822429098414628373727606690842310063586870064304131814649299854186\ +12692628024925259230119912648154125622594020560204924767989260701214\ +44545 + +# 4096x4096->8192 +46230924351836247700632620916046176424079105466354534064042561034208\ +87179012808190823424753309565308557946849439937602914646826017759588\ +34308955397574010098112170264341488598373518621050984822173335661543\ +05503155484221582314725443772226962279179435429752927046418702379683\ +85046488722729558633796252405133615796333361764094300077585699651413\ +87522520295445886581348613967739679507144536630498779984858498466466\ +53949495585121328172175753765616536867610443894070462179968529055982\ +76558996753670646519698363689763792814553110716478538561711411517385\ +25392668340231371551312445292385216029091676115617060930552232679124\ +82696223439453451825724430911002048100764625928528148630937654751536\ +06304398468385126736497735857773379804983839043683211519322520305495\ +88047388177062785807692948814175519084337222913843071456581602029935\ +54683753460812611659451099340378672619627415242236591287093912255783\ +13140160231289453522976275483766396153309206695863277854402154450459\ +37546852895213179224578947936523539421852140479791200605839865108481\ +29541228564089187837510575385124529321309276742969232912010920107981\ +03957776659416089212281297890809164014975660550116306748020139153256\ +22848023511467181919573893647538869361729907908714966872881945389100\ +86101428:\ +54530990288249437719619266581633527950202167725686915722413802215908\ +13898808427693785305297340466057132347876044193194335670208491816947\ +45347065813804383143878587001488929429088856726119741100265880818083\ +08072469093027021085621909472228082331188302646328041787611120322548\ +39496025029182050271578730610401719162676648561607998168984589242763\ +61184308631479552158835170369552925804999967396481740557274002486324\ +19060734996166150772822594482483029608131347141723539465860333111879\ +99028176225288916692803103016047215834727819406429598388635703974625\ +46062134344556400079860063468483319482068487707023772004276424916600\ +70752394601181923057555584615258415106502514105268940487020754841912\ +85424335310397208518018385485167186844809177247714124187041081497708\ +96511319230068019588583992177882717832582994338933822583078086805742\ +83390233167682320436242724359199417834794808081825191377785708613777\ +86102596609226847851937748841875768625507263876321447582064560528748\ +35920609680394258473797857062463125872573573911021820161622994930998\ +20654635987081600595958107506315942531393518613570935900767436989518\ +52479980745679719049556332080920670567304319030704337342023640878866\ +09889825375285512294624431826722345023789066121979651546281497741903\ +392437648:\ +25210180868467768546757726362059843626852926905412382608676629170550\ +13500472614635251047265443464861022066815047034258382305517605789179\ +87828662358961696066164456254433404354134132444755460484661087112315\ +33092792254341786823634449794876609511305489030701548587221933119990\ +83152382137766693945997257582640307701836825909703642483047169261811\ +29415178374784201058252543144281486261236848516767550523665279551861\ +74465512384172617149107052187550658300617578084736260341723260747161\ +99876271562142167533309479325645255667176279131317552047451026692967\ +20839234037422676688042090117497405271103578405099807691583810119265\ +54336379063605406653618342419878681737223923065560012276952760198274\ +01935961653423534734281217002142980219703525915889622098752381243251\ +51337680928833690966007811584949672395686773570000393884061584225434\ +46095563213259068817841045213587660574716357554630835216272902060443\ +34556862089899310391156917797805143517814316196396914215338901147216\ +79277404380234128913536426196746405226500140030500544578565101666905\ +45355602687691883828602277709718492121846971571916556642975486330113\ +36222756064112088369190359637323581593192113210931211230367909305308\ +34626706120315368242528268242337577529275810260388371559227416421225\ +18288153930546296286935770867979820870699234878779491860155905073232\ +51502558862837164130223049756749662881084284616449485647823253076640\ +97817765026456231979422968578849627137552880186111486959114938973490\ +88961199014636207851962534069247724700485273408823799958467863418841\ +50462661461823344684758580652604422779162692518313890388399982545703\ +35206898267568862459046844795531325319249988156277069565297520226091\ +64600766297485223302985129710063725127737025349700933151412377658954\ +23709434501778907216692625235665266668930171909330255035266777372724\ +58877961350127654808072552639834541127026665379146043251830475968219\ +15018615283403488179263459581211497821758602281724174575392739616669\ +25703910463568680165861589391919447127830393426572990195899393637221\ +86477741974371802750413668808535147675421719142045765725335254381364\ +41785131009861024178374832421597792578801840696203626157231517656464\ +14052894526701810933176118179541201020906393719709492349877490392992\ +00696634018140352649412293680281970033556175696751860800582932013588\ +35349743517428143168973670929259662004881928288066741418602389631277\ +36600832956552929991925721216698487543280154312867126099744478225237\ +72707253967514116707979742986501040393426058104944823682176865543029\ +42410605893761344 + +# Tests for the asymetric Karatsuba. Historically this code has had +# more bugs in it. Getting good test cases can be hard for this stuff + +14092703816360934475287812379721584643540920654551533543420378905278\ +43263869087702953436962300677113653357118503684241080095903812797217\ +981771103880205148628392675409404139:\ +85196387648463903836201075338727419426772257423386800834159433024105\ +22722534550698330414221220484658429569965031071685565584585568273727\ +521831711430243837:\ +12006474573536728376030033121297441343323401321882664768043719554452\ +72355962084445501636044192472676171283378029237295859040510289867684\ +42082336586473179649397097120830906529744851914004493486594202273964\ +92849411579105282151504500626551480203959164076691081552725026900241\ +832342905034386191256909160400547992155689411647041343 + +57586096570152913699974892898380567793532123114264532903689671329431\ +52103259504474008372078212980297151898765610906745757706580551032703\ +6019308994315074097345724415:\ +14396524142538228424993723224595141948383030778566133225922417832357\ +88025814876118502093019553245074287974691402726686439426645137758175\ +9004827248578768524336431105:\ +82903962954674429277182094016068528967498403743392611678986796248035\ +46708705089408694697316410864619322862709322416615890526565883322100\ +81247286886157264936638535413026388243763541729092783487919143933560\ +11669949922966041936103836718052579102251260556254458882685015932709\ +9748064577321171189330220691056136254107213091963928575 + +# Got this one wrong in early versions of the asymetric Karatsuba code +69328033643988284668153554428298153814569184083886776453465872993395\ +29710746972404168269687728407520676676052832464833364865313305188652\ +27796258747613771385136143521786728820782913230366107236761071531140\ +69858079626875179117509513890923817643832927518504150773412897517798\ +24069151513573630274310883822191771430575394116104021217164852793487\ +74039487132887730707079890109620203394040795732717864706534187311456\ +47616397480632810489298476433897092835849191354914181079718876936239\ +96759799034047278741267946259806379049845381337965241128934112089387\ +26387200493807084368512264417392541693498708056601725438254379619500\ +04878549999476514473638562844231061393907117784824855718620742441873\ +33707730767137725282689693949863277338600908221830652962675544003225\ +784824252054526036890965:\ +69328033643988284668153554428298153814569184083886776453465872993395\ +29710746972404168269687728407520676676052832464833364865313305188652\ +27796258747613771385136143521786728820782913230366107236761071531140\ +69858079626875179117509513890923817643832927518504150773412897517798\ +24069151513573630274310883822191771430575394116104021217164852793487\ +74039487132887730707079890109620203394040795732717864706534187311456\ +47616397480632810489298476433897092835849191354914181079718876936239\ +96759799034047278741267946259806379049845381337965241128934112089387\ +26387200493807084368512264417392541693498708056601725438254379619500\ +04878549999476514473638562844231061393907117784824855718620742441873\ +33707730767137725282689693949863277338600908221830652962675544003225\ +784824252054526036890965:\ +48063762489419715168951981307754794589808870758952639965091476616647\ +54056167932393419567481296681069246248216008267853889839320423981745\ +60479443107279226057663425943342008520701374986979347783572983701184\ +85422697584729139817700527441440371002219958422883649678565900879400\ +20025210106297773515746894906726443036026187076658079744151459354129\ +76880294234848336533442648147663722096199825871118396947178334215521\ +76943880892409643115274415151713386236948639022804530054018234460138\ +65934020545172727964007195157289495135921213561302426988267171336165\ +92297396800884174510773976233843978906677436838567701962214997325767\ +17494685809458185719292759364630203908885946118898336175097083972837\ +89342035200573700398720235821406614593531258231227043379738167751614\ +68684582976839207443768269161778663395778873870774323940683360928515\ +48027194465603770338336645857674917792255648723659298382428421752797\ +57375177034382470966583814365325881784225896969066012430257742547184\ +72418596829523189950619686978201887223055028706607853375875849336866\ +58034693741263352377027728101357005623322435070019152178347117503006\ +68898867912930645058149633650634442077017541758124699937775536013889\ +00090985949751232201541388041823183135436540422469067343022614303960\ +55855903221443598575395492738166423176780792097697804248465562838489\ +55947563036566122615600202990367217608222400507033340848053927107788\ +50110168698504066173013701126736282373942179302874896060705586003228\ +79037941627812442489494360833298836822298442280730034168111230609093\ +310545565906004082962175112065394876123298631225 + +[Square] +0:0 + +-1:1 + +1:1 + +549755813888:302231454903657293676544 + +18140671814051116644:329083973865108631122076757343293822736 + +18446744073709551615:340282366920938463426481119284349108225 + +85070591670813493966310340604280700927:\ +72370055672222822149686532165239924548184855554193955235705358728264\ +18659329 + +85070591670813493966310340603475394559:\ +72370055672222822149686532163869766764144178225565969340654319581407\ +26804481 + +85070591670813493970922026622708088831:\ +72370055672222822157532909328992644361925323993014681825303471075565\ +86946561 + +85070591670813493980145398659562864639:\ +72370055672222822173225663656498083990682319746609654242487350548038\ +36600321 + +340282366920938463463374607431768211455:\ +11579208923731619542357098500868790785258941993179868711253083479304\ +9593217025 + +3138550867693340381917894711603833208069318394046068373092:\ +98505015490986198030697600250359034513838056601414221774853647899383\ +99716620339203600092485547982803495343709640464 + +3291009114642412084309938365114701009965471749407831540748334692:\ +10830740992659433045228180406808920716548582445089016068317535718032\ +308295472658277178853031537853949474393196307576171250734864 + +# These set off the bug in word3_muladd_2 with sizeof(word) == 1 +251232322172118783022840239225457019863:\ +63117679703995287066909540140557654581113950055128878944628202319505\ +176538769 + +273689842353342519508740475928754711696:\ +74906129807397480797309133044676004424334564639782656684007505697520\ +079196416 + +271302823667110475639266093952890097614:\ +73605222129747240032647628582852465568122948805929122728180342334818\ +448492996 + +319387279021025860024422185475130973014:\ +10200823400045462544411223752203740218511249559589398235010527269723\ +0396244196 + +293643199753680203052743123832843662352:\ +86226328761579733262787961688682814116999624225084316052032576511892\ +182171904 + +# word3_muladd_2 bug with sizeof(word) == 2 +202324725318880963191371356135299852624:\ +40935294475360631472543732691759944656086403346062162368816126408076\ +119685376 + +309321842385349400717946354447033364075:\ +95680002176666937035836738263162897574421497416350873907840493696211\ +500605625 + +233489517300128090786970749707229607527:\ +54517354689046815002040771363970021549478312409815296261172173208794\ +455055729 + +[LeftShift] +2121258017766159160754962465958381577677890208124499494536189186\ +869637798499791383037162061664492554205374097:204:\ +5453968336700566799508983726051663849667997549076624612345231282\ +8439638899716201006845993775936915589934028192020733447985075402\ +867441526514914927633382250278301101719552 + +9127815530925814339720645654057304030995143310324020188491605652\ +0167383202307739291645752386748299386607033417580789665740910548\ +485496057884342754125:116:\ +7583092465041842489806678334004575989684288504372713429243106807\ +3821340263788338036051275796540123856480834349684104861172576642\ +18512263948855799232636502228939840695954790558990336000 + +2720447254558553014578566972012963115777446398846598038146885883\ +1866886314261120634838361392523025566783357944737665:164:\ +6361500986895495805616781332881685455158868774711923425935172754\ +6665493357037199343516238602124200135772591677608344475613159685\ +2488399997844504678061831690534256640 + +2346814922039931311567833556790864002896525919808081028569793383\ +4008825609596357974972673276604:112:\ +1218535974727059175894407931694205043690238717758619344357411498\ +0976423842428997921600747804778709388243970226872640908420343398\ +4 + +136766652934857914:106:\ +11095829099781028284216214312551702886842940522496 + +-401051144733532769909045041716441134958154294462987253741112236\ +561026903932355958855274471955131:63:\ +-369904391368386363775763871932535866765470702774151965641848084\ +2144652587998489299622223077809753503943936440270848 + +2620878467008554581948549874850974711547561914123735587938770041\ +8388598339275821514904454964587607270922729716663659446422771149\ +9620476383257:195:\ +1316121661879758521098806625253965626323323320500789427869263340\ +6367324456851018233189899650111735222276905756611447392283605658\ +6424209018483795579529997393099798973115070359293039187878410704\ +39858176 + +4986386024639314608574963909430738820138995826850354329027683283\ +7084148930520285795218001501791951858649714264370213994065039723\ +183:24:\ +8365767539475510328001762170072394222505708301016699425463251243\ +0365357678350782716810417828388796339416772455162018414465188948\ +4421398528 + +-455552309543147716127587827277903635248610246950391821050011180\ +4998378889619941436810075030388024035287640271262080871447338739:\ +87:\ +-704933054965487499017626788420861259932661059464379088499410099\ +2559199084336675766400427127749751321008643932765664940335284556\ +99667386383995835821064192 + +1037757592587696398725288196824188929011363632075879222442626801\ +16359163984447531185310046467135652319371987503:95:\ +4110981359797486520990313529905064933484217701344426282406713957\ +3073026585644903347542613235747258250235327631427113860134353360\ +95122325504 + +1078541466278039800083311:111:\ +2800053733577506391526406073538574747169164913752227708928 + +-458929098580755:143:\ +-5117230445820379540747782782105603341274706553475212247040 + +-122928855329072870073433015110819526943336867562196620340919010\ +07272608951275193:11:\ +-251758295713941237910390814946958391179953904767378678458202132\ +62894303132211595264 + +2253797880121520663606973674330182144804901367932449178312384948\ +1031054670305841291542789729087450336886747413803342773383544037\ +2581272420142035100:211:\ +7417269366041670925252065169199359207792625796677651698479867559\ +0580700643261572311187905593603949279149066613049589728766147448\ +5040626948461011388280995781694782614846527093302465736147768556\ +526048195169484800 + +6442142951860149863781434107200105215105005142361888584824558528\ +2484597164156116892847036815:107:\ +1045297456599241794709977613787275378715930460342137602357284620\ +3705135174457613106078796927549665575893358403516669173432320 + +5097783526093860243839154243285093453167843731134916160503060680\ +6809190520533632436146045688586:126:\ +4336714610774466073591769540544761879648163769201204653675081413\ +2084346529112353622016096796405522770364375296300671020674092934\ +10304 + +-331899363008322441533569955164860025843805741291332922663910367\ +2943065616917605415617171113991360901486760154578289560762927508\ +7724:91:\ +-821743020962630744101604179924332933222787625033777030204941339\ +2423604240087684356284281911697948345840642580768340681886419299\ +0501324963749459198616746852352 + +-184253938912501307159324447512804721862709269931381112790263931\ +81321750494139191589459903767473167677816275893773523:152:\ +-105190403673940947755727602264308003613546006738759564870362217\ +0667469418523232027185126832293519850235443686300723583174147136\ +58107043639016550258714106195345408 + +4027173611709683208685144938635076643642081573452904517803697826\ +5275420130:216:\ +4241108819962870257795832303288513204199186270237663098986852370\ +8839925819263809342179370062199525789246961806149451534207820475\ +33392199680 + +1654910280148247058930466878701929681980555724947453908536393353\ +732583647848670616170583254506:78:\ +5001659417042237892080348861898586734617398707583112481824590338\ +23652150179951382510963323144882735068533089594507264 + +-353256518864739539912727355980967022578755727546889874982122719\ +759:107:\ +-573191472861980058226433447553366186933814120008015485620963412\ +26306829015345625594865954588721152 + +3358622889967376849369646308014887582255587127977426994425421674\ +4686208321633331897065809513496651:69:\ +1982581020522590603474492135975397792733918369926415317084561070\ +3822831264254057644126980676514200036423975856884416512 + +-8326918561933317515897484042242279813635:222:\ +-561233200828572354853379214799650393202723352144809535912742619\ +21980589457786088539861748815344432096215040 + +1738239605092625935802720509793:210:\ +2860281191896129448328585042777498571666530315075635885634512550\ +142285038644212151822720172032 + +1541590531164046827151493969434074217996086405826244177284191842\ +623229626655598394491064824017724575585890968239654882203827:130:\ +2098304299069634414151232805637412871131277307615398366601971342\ +9665834217942888720462643703124214574302721592303513592056859315\ +13427518479162077139334989713768448 + +1822414219485473007729455052579570934353421556802754634400780753\ +581487672806631709:25:\ +6115007400355837902569347395883763750593834759507216779268585854\ +2958784576028372828684288 + +5336246625295048457347325312327723275413189882766845079019668950\ +23491709759645168524198853958247909:145:\ +2380045526144475863333782125314997581392105067362688736487270903\ +5095219526391819075074039117499741190364575496806391148745118026\ +089345253900288 + +-276651306081170196285504936260680311592104354245874357656134941\ +6718897362629511494172851413903784541053958724076679151843367695\ +9748070409785949098743856:225:\ +-149170089146918319214991272148007797149650392266859882932532072\ +0896314266755406819672840795334582356690986796948912969229786129\ +8759392443252182124719967927140260518022196506128222178285661500\ +32303899305525355025417633792 + +-103357876921000174182112715460846616262383449332882137139998255\ +68582685162004410585410474998733490779307256347656936844453628:\ +128:\ +-351708629986009787155639181729583046307639877673123732501848524\ +3559886115426724541117518475093181639785217728536729396711614403\ +275792414126622561825487435090362368 + +1094708276267187017583512230031436979221999105657255772315062187\ +0590945418853726695999585645264076550:76:\ +8271381875782668577777728720058787519656348054693237381352477271\ +29815039067706300744940289871871309203285264026829638860800 + +-815525457724752321603940535029563571154068567797107498491974746\ +2624523816971433695155984655769263875263814891:185:\ +-399932520776254684164524385851380762766645298639846935216904114\ +2896647055743804753583601279854374681737834012702515619494942793\ +50304095670986950350223830081561690112 + +4052679849880044255138459864411550773099421944874654179650065311\ +7857061613513287290910396020606030441122363087181232793161493035:1:\ +8105359699760088510276919728823101546198843889749308359300130623\ +5714123227026574581820792041212060882244726174362465586322986070\ + +-248399491197694456686506789360892375748400795979825040399299010\ +53517808438265883:176:\ +-237919445383638978127975473390525029152877274034190677596480116\ +8519869938343860007136898454280955008871656020990685920874468986\ +585088 + +-341602794141123390057384653491582990307091266762526194256752907\ +742814:102:\ +-173213194813054140534683117609830955377834183581805190021073324\ +3591496880056169249935512491320672256 + +-958393530005648757477093349096350288904499954214052393312348399\ +2770943667934610603880158622319612235433869275282625539708353046\ +09:167:\ +-179288795303756735253272048111864507295054051907270903858033299\ +1984105913251800521090082264035457471680922762784248326006303327\ +80357892372568802535086338017562314555143800752177152 + +-244934270799654899396979330417224591920216069659327770883960842\ +308099872348715409398096:24:\ +-410931516700830297264139197394514709915731976734558842691872198\ +6944930107966825746000286580736 + +-2106457461641547906609473458:69:\ +-1243433014305839647767580171740431469025056260096 + +135142685675091:202:\ +8686636920585527698499063657324055240285043487766458873488405392\ +44004900864 + +-116790541221558472322206451254911347381714818839018118383610841\ +510309754344586351337420036400717803838650415501291198800754587:74:\ +-220611094952357360270322465694065886169870282492555195903063877\ +7058528470895456709658637256734101042181231965942902938524566534\ +006236702950668894208 + +-113662437497188191611046105180147670725123405622356749057822533\ +9374200354866981925638532649150827622554422704805900523233811186\ +7804339566343416115467056:164:\ +-265788541608259131511323286352380846617232004964000794820926894\ +1982659118064626109656559724002147778215968030048122363389101341\ +4916257633270717425007538758533769604203658211543099937688495500\ +8515178496 + +3139835124875473212694109318074161136799592793072048253708819570\ +6031251397956934770541559259048189239569502903816890554914148616\ +8710074892985168204104697:95:\ +1243816837708147260845084661039007547826018395188591656306366764\ +7513402868999491043335036172230767347465042406686594960568733454\ +486595586019513727045751542829562936306306793756164096 + +5599994070119518146348:199:\ +4499421759449900671784284327121118030698801585196299978528243915\ +527017858726887424 + +10270683209834825258725306919273690176679518030925177258309490:43:\ +9034188491533697033850866046124648731048958323889347163636163337\ +5107153920 + +4578000383070746273307:184:\ +1122522427702119950972128384343669227408405080033193267723578847\ +06832894656512 + +4806080526717717017641435948049790217951184540837962383194474375\ +4177372178226:213:\ +6326741927653364567544399799665952033829979000600292660407440869\ +8862171634248299057579558184663298119372699195026451647955448240\ +7792959291392 + +-213240753886670778938493896779297584390212374893239014196784169\ +31016786722016582:85:\ +-824935210136591658197356601203169660873055716952680926144487605\ +063939313393392322678258809253441593933824 + +-187286407031666462047035483383441327248520717346072223723620843\ +4454125887374738735368124928725176429609366:134:\ +-407873676011864041904214443478531790285593140265704678916369737\ +8659007443902659865299628228125085923760625746613398039989747449\ +2137333668230201344 + +8621689714197434562630867265841464865623072938828506100870809463\ +96744539349725331277869713700313427547966:97:\ +1366161267647991190642664883853673418069284183801958399635868396\ +0937205383180691314472971265906730508050012658612328503341173152\ +3633152 + +16955933412697913917032678757506722466737685:229:\ +1462819393593898553961710324275156357656459346902684987437691843\ +5481519688706703310919911715271056730027164958720 + +2180018258288311836232601230248111131649953969135839015779353659\ +8104321725586576274057148974991731503239472085567581116:165:\ +1019552081247881910408108587819850135603932052219933414781931958\ +7658929796456697439849089055853009742845594506749609005029155283\ +87206223717397886377023326519137153318912 + +[RightShift] +3163645694280286863843274284995813000413750703767888062060371447\ +2548769377833432476732199026703457620511:71:\ +1339856068247304299517035929669762064048406302964464795193542030\ +8616778680708128951 + +-14453551017278988424486997167045:183:0 + +-14453551017278988424486997167045:184:0 + +-14453551017278988424486997167045:250:0 + +-243110742861195501591733619507439366721710893401851315001032874\ +934976816617401149916967847829528780962:77:\ +-160877194558516235935268045675608004834374082748681492335699377\ +1554731869523279 + +1578511491667772739870432690812184603408439934845400990951391424\ +2042606791815444346835351458430330984370157647950174636188696067\ +901582998887813:172:\ +2636868630877883693962671763727310843333678410156464570287439347\ +867714845687034115945072876 + +-369990587551414900909444219626623817296602594145580698921004093\ +03886523992221862362854753622740275252526720452:175:\ +-772576394901327014846975657022405166419128733678436351046 + +664523869708591456637358847652496607157050130461836524747531314:\ +191:211729 + +-424946102426960838249158490450106473832054726611725352096551869\ +301633439915:132:-78050272313569003846694186065678698 + +-2477488754280410161548750939069:92:-500 + +3885576822798328723491155206700259517121985332303318810671479550\ +5721679465077987975131032494226814645578292798864088316633495241\ +72281732561:116:\ +4677092971402698635823599561404354384957452158155534044221842927\ +8654700322373721814974862542990905781201 + +-7784136527805956:72:0 + +173:199:0 + +4615578569620677656625:149:0 + +4905579994733063495470152932606524195238444602458194107223829134\ +6548096468622028014016518915362921381743841987304665341504653820\ +77:36:\ +7138558422932784735851095949483750439304923351240277562790767311\ +0236786987839191008266816665655527877597839669476765763 + +6860659646513892651503913841872495917865372347379124495074404003\ +48669:86:\ +8867194763939375066201545129950170866662337 + +4932993580763155556722299514:18:18817877123882887102975 + +-278747767898647506540238310041925406724691634519605101611983422\ +6204966588409142854005261436295569885823506142825506136904961441\ +137712103262466261:104:\ +-137433260320539729826934608254525294966481185197904919592889909\ +661839883445042061361887992911622135941137977531125 + +1882169262671501641122532021045100553271183358274828402533612516\ +4:215:0 + +-113308045504297792964762442633165425691924733661899127245385800\ +0508491250659909229734510933018929528943605300925959716095482095\ +0781551497986883190460:29:\ +-211052681327420832523633619087125036291637893136402829075950756\ +7637583707757125105214325586369129883020381072398200102328289477\ +3001878518586 + +57567025533800:64:0 + +-132072785244069918116388563501248470774742728409639846537789812\ +5119402223003876981196535555849118422274367340745545:47:\ +-938433581467776307621794014588434654731534070106419040781914109\ +4019259860231421876594989980795833320 + +332:218:0 + +-559822315679298304410139625796782279674102061246050482023351416\ +534297836795811816038579409314284017985789979551604:185:\ +-11415659555585642743745444064957984965053472879394546525917 + +-165370654266946240954843198912509990578949570887804349975976624\ +7848:193:-131725325 + +-194216125550322203453264566553636693381698:190:0 + +-574918037852237888178117788291362893480850545560575590351360319\ +3555180688115045992424767676514653030256481410814556185745502407\ +367635738697301:25:\ +-171338927105736103110944565621424583637967868316345092758941745\ +5659860577617599365837802790556744644122267189864682014508695127\ +77556053 + +22512966965683176238772169284:210:0 + +-571304627859240495908938310435848221105034147099897333911621990\ +2429210200375110530363596454364595974303366523715867605148466947\ +82:64:\ +-309704859338005592964733519326108195603366962254800737268694205\ +05469907491401631445860907279418326766038568169 + +-309596777436591740355404153813541201302898762127036944631572788\ +15893302883997570045883151320905855931366:104:\ +-152642996313836176964502120620181580006920013080253805054740742\ +4297460034 + +29089712758204609787443669188235835:57:201850430524318292 + +3772893855139299527739062333307773429569483215869291954483303258\ +8826307095346005890226120725877767624562307811438348806708086825\ +272884:33:\ +4392226523649063342878434729422178852336345258948034553885580109\ +062873187398771509787314655943513804180816259635420144385202 + +-107286131603440054982169113843212878238243177589333571934531:\ +220:0 + +-171860798431436300064006491940938069877937918743982288348494291\ +9605122825021394820452085254301230580701:35:\ +-500180753970740770641733228522754710510890927235544334248681238\ +27185564005671616773239955489 + +-736899297617589968040433744284158522983339306401749767611116884\ +1084063920382957413309258573768392475688901297388389668250828837:10:\ +-719628220329677703164486078402498557600917291407958757432731332\ +1371156172248981848934822825945695777039942673230849285401200 + +6494520002849829489554410861273180035603713191696971145227421658\ +53859125361930352324226:199:808309944002185489853551692 + +-8811428348398:35:-256 + +-472961757341800595001320983673882525933533190954393100297169797\ +9931906653571844489680727773893833490556432129528242730860714016\ +19:32:\ +-110119990385556732071871166972881771142951490114068868639219970\ +906430544647663936244340794484453124239957708155928243204 + +-950911712685005613285113124954832473131420819362306322439787774\ +9569705:103:-937671343067445278042307956226145570513 + +-879814295274183624334539929331740552569451467718612745386330333\ +5306363907959342879342226672:194:\ +-350406259275000216456910916623341 + +5510885178270303556262037168746873477241029300667748255749519664\ +7790961278402228092443936180348351958592120159109985931085584854\ +072:127:\ +3239007197543508321556333059695431531874740086907067131644479312\ +48944861718637164159925014157 + +-532599980357955121299969897485530088860096014928320106613667412\ +7658734:197:-26515022518 + +-751201308625232459519354741343046361775777470541080710058601279\ +4485802280356383896946090:190:-4786930913611882742357623031549 + +3399159309738603281217586458627167057868700201720622195013008494\ +5155275705802319966198750893042523074386045050458079803807735428\ +3187:206:\ +3305159424435509522890985455639702285024494664087298807252559331\ +827343 + +-163860953109333686549278104073264560158695392823410089526219985\ +3597217435977552163706193289327636667043413089396300868558342495\ +10158:28:\ +-610429618914923394282453149830045402641204717842527067386433427\ +630818425110560716579181436198814461768944967313222910671808 + +1169677491246850751212:155:0 + +1636926214665128743997698266803409352776056144809201:28:\ +6098025346789988666764267782879655632287473 + +32036789:197:0 + +-179819529231495425818261190658137469439875298005446780128564386\ +431:217:0 + +-13881:96:0 + +-201081314010698664682270171218698566959371060867314287561113777\ +01129681335253:40:\ +-182882389718268918552230544463508128464464844789576352524012488\ +18 + +[Division] +31082702275611665134711390509176302506278509424834232340028998555822\ +468563283335970816:\ +12141680576410806693246636917646993166515042744075872007823827560868\ +1517825325531136:256 + +31082702275611665134711390509176302506278509424834232340028998555822\ +468563283335970816:\ +12947964052188086825220046400459488806478932301299660383343378609832\ +0524868413554688:240 + +44966555772413807289969128318278041600000000000000000000000000000000\ +00000000000000000000000000000000000000000000000000000000000:\ +10000000000000000000000000000000000000000000000000000000000000000:\ +449665557724138072899691283182780416000000000000000000000000000 + +21098512396730698729871269182769821769128761892761987:3:\ +7032837465576899576623756394256607256376253964253995 + +105492561983653493649356345913849108845643809463809935:13:\ +8114812460281037973027411224142239141972600727985379 + +60281463990659139228203626236485205054653605407891394:5:\ +12056292798131827845640725247297041010930721081578278 + +105210958105812350283560987:65536:\ +1605391816800115208184 + +29614251982539440611171209425825912338459:524288:\ +56484703030661469671575945712711167 + +56978246562469415670177504927986945371616100345225344293332816228560\ +0752167:2147483648:\ +265325636428172773077047918587862259576172103850288988525666372052 + +37676726270241192487393385601963645387543268661126:\ +3162948793160806:11911898906396771271361947212182077 + +5381521826168870805682913114359466560841856996681731280221235281\ +1509347982906963231033117814383486428722076978472087592957820313\ +6046584241121779503933:\ +9668544070174123246320200737076440955801117408066349193856053605\ +114866903799592820480948520645947171624952907359157045540:\ +55660105462724064753070630466 + +1723834528325652138144287068293892732593026664886852512770150633\ +2776744620689:880523393623328:\ +19577384778297865485961051332688212998820791370774585297291841 + +1515496213019297763233177841945187397678421298227998213327928627\ +88716894139006899352549523462891658:\ +2837504714791238631293154232954335398939684196417059468771514311\ +350:53409469422883270966457345156344 + +9404536008735908917791097512770771428224998938693723982728653696\ +7624988457783138098124870580583091:142622867370:\ +6593988875807797411127801190252266506668676674421094260691453448\ +48811732719710346250661 + +1392866713189645633121390285073523887805815484659191269343858827\ +8526805205835017180928664701580352738609190657216273081064279937\ +78000446364:\ +3994371100075737516464195988347917583672726362309747721542773781\ +23623981222779902598092910701666748270156408025264:\ +3487073880449504057292395 + +2676049916504901888523537181437273561212503:\ +9341913943837642277221766393692439892564:286 + +2596351449981306834637204601381844425730435831169992187762230868\ +9984974618995828593891933726738665906555705360752479986:\ +1206034745333560481629722627489368003481730232554297338790:\ +21527998758138745589857127563572880142324265819094147184332850 + +5972458816709701659388787816816316579897252032508674599704692592\ +7058649324526265892715874715058327035883363955854176049442032564\ +309441091155243908284:363119954882801248387416067701593:\ +1644761940620239975738766021378227306491031556802927687823754679\ +29691855045229469191916674982018556672788351294907277 + +1179031947959075688529396972036519234258725785851394295456390535\ +71085372280587925290861953121759382460651235055866819:\ +6944577951175401788316018705171160466581578649464599557174064469\ +156454663085245879135170220436247473693597253951:\ +16977 + +2026650664981190253207120825245989396597395032888279675327874031\ +6428571783495257002384926183573616802093352971457675644937672443\ +66086144671180173:\ +11631153560785819891286797700491247192758386954476186081000494851:\ +1742433073718499161789694097861808628892528194276009183278062135\ +44214369556426533 + +2839636837334372650605745847855168203149142969651746071725807516\ +5633540988132586349575016474518431300299708784295829212402097919\ +78638935225269061241787155:\ +1906569338917937819117576221675263213381604280817243982366441014\ +3748504584308116848567559666016129206267348790454121809997280576\ +258634989:\ +148939604732445334 + +6371345663036222144347827991463755679970672243967017350001151581\ +3149043621560543503748545334895102360498672050891243434943238417\ +147807583195634840:\ +2803012481163625225461909183974367795369310930636762769680881703\ +4432088350353366279882990440057382400481292913134:\ +2273035067040180000190499573423209 + +3448761565369806483093631443732798385337886837688124530151199904\ +35214907404151562329499651293972622329230621111836:\ +1154398728297611607347339889796530761810873173035278653857672812\ +71070669711745252818396963830424218:\ +2987495984559585 + +3939766758764969916635508714517181254109527059899723535687606136\ +704576526260284945948460575945132796870670558656976658696699246:\ +2039193601576864286342975169071164596968234:\ +1932021930491755924504494733348282114697992509296048596879364255\ +013992177897790479689 + +2599570067192469214877296440421668709321992436666111483543544040\ +9558626508316404576861534763496892008536679796682457407142:\ +9865947223638288117488793858111648559036360190603549966937638974\ +384878768890886202494341034:\ +2634891519553273835810191600375 + +9953582546881861626054758979348156073957328868768555275026281270\ +3558132981561279486898511993570779719758639416109225470113031476\ +11758278075817:\ +72753887765933437843645860013004267290394240181603205482549:\ +1368116928528260130222427481511416637491457702447115334585560552\ +89688431510521935105 + +2777707354230450548824097922478859820718131575494711827631509815\ +849966141849784996342423141941423856370057172664302140424005921:\ +9887732931045287681192967993534615207992429003750153183843126191\ +7060602813748941:\ +28092459349393082079339190162534632411372212185 + +135175390055754599158926343035891673287590:4587240067074273761847622538022:\ +29467694753 + +1474508901852067097539817612956066371267340106475397703336120311\ +3477874932185558462473899178369214022436285310129280494436591650245178:\ +4880369721764333040209711516636996332699096293749849371410907103\ +371872025659064629729192743174282304112524555885248623478:\ +3021305732793 + +2458344447588213641014490759478425477739674803315383837923650388\ +1993781110774393121943801110702528757067967698929051580978401073\ +21258908424060287326045:\ +4220549808710022650484813532790907621975000231990739804525754365\ +8980362:\ +5824701896693376525879103155093475976637389780048291339267026554\ +0931549290645770 + +2235359829795993754168620762055024950392775900247276637443301544\ +6834872612125728471199341647165418100481804191461888838714869412\ +86190239242546459829:\ +1079446102417965701004684159063911518960227791488787275338443605\ +347380965151141469660172384738541132220010177148:\ +2070839687862853380670878474716925600 + +2261859020237326202277047516915478440734386573562935959890434522\ +4642995494057840711903761496596915458217743732578579075270459080\ +0633340:14203382288913876345794743990430:\ +1592479153365299674692434597912939527498958604158881610792107099\ +0007263922267553892387895651241383531760 + +1627272730547121895847771240538443456605751355188756262440532414\ +6146087377529161595400371637008556124469065:\ +4556444082143966348635739253264:\ +3571365523663868043578518888635769405026391569324510140958668270\ +949379670607 + +7053322761929289086579214480771179517943045501137109771651701088\ +637150889882789201445500740549670389506:\ +5820761818383944703677222410067006495183070681923349620668953689\ +735114782073218950052335558230765131355225215024903803474:0 + +72782874795717830428761392759834069051935680000647471818367555:\ +676006789231214575171585611498648177407768:\ +107665893235317651024 + +2678488124982838045802785770118519145558475116428679203089749164\ +976612334859762291787998110260325948674165281:\ +7944336793457702698467826157627761976858612495202494286895968701\ +65:3371569200324712887203021916554964731360476 + +[Modulo] +9:7:2 + +7:9:7 + +36049713:3409630:1953413 + +-5:7:2 + +-14:7:0 + +0:512568576:0 +-0:512568576:0 + +-512568576:512568576:0 + +-10062526826820804:29:0 + +-5:199461981:199461976 + +-8:7:6 +-7:7:0 +-6:7:1 +-5:7:2 +-4:7:3 +-3:7:4 +-2:7:5 +-1:7:6 +0:7:0 + +8254156815303331281824478486972822803470138521315156647307553049\ +3310587284245750487869183215107304761500042605982935676360476706\ +01141527698603403:\ +3106222408827874796097424168822651228359402578430811:\ +595826521675090943156444889338281014934863303289705 + +136863920521571139850391995526246731:\ +271472461994419020251392394864015015809448271748774:\ +136863920521571139850391995526246731 + +1828810863480002099820314884714568551379787631093473955109129851\ +510111922379100046301719263372:567966528088927995495333:\ +385016512426968327768361 + +861:7863900424362475800352483828371:861 + +31298056599359036104:\ +6834101648969675037772759079916190769657938079502342632053787936\ +8365474573457851465113672049521142215618176993202488827600681:\ +31298056599359036104 + +301132649529789235293089719211083808148317022029687377:\ +8985923799959631221206612:\ +174445061721403490019281 + +2281346996471575399039236209159382841371310520671504115347726755\ +6405318252398792419321309385257790020895332595371743866761791127\ +088953387770:\ +9148250100428904287337426958133211831148659494946573378694903126\ +9368755379167072338:\ +5712279541400722125363135520469561121058328307700157395773665287\ +3288007253222581108 + +18204134548129881201198951067056774604374867858971160:\ +2073934172352760752130567032660041512076751995427049488228564629\ +5445506418304709424209443465714405592187482184410284216568297836\ +202471453:\ +18204134548129881201198951067056774604374867858971160 + +1965719248782007406536742098914361273948365800827075363669455004\ +986089949754002988457038216772776062129273:55:8 + +242013738395129963274394550113335771936345:\ +5855690525992972254238170169720083764160159959672754491605994128\ +073126517:242013738395129963274394550113335771936345 + +25207834098049778316063817949139583672551899941064748428641:\ +2394034335403109766635463364608199166358381072109847929528549615\ +46998:25207834098049778316063817949139583672551899941064748428641 + +2806019740162818318268355414902530432876592478224294545991479160\ +4283116668034698476687974823971:\ +1582972323756438784786521922113831032463998151772165:\ +1502639578247286068956607674581436779911413521925746 + +7646186835577905185055298334837136208896759894169440852778842148\ +501161592245256816858212924947738806827200173857627:\ +52896776132731697503809705:\ +24742696196904988498029477 + +173957948128989810779090250062796172580059019371598891820856745013:\ +1799947313993959943024637237734385080822192208938376976998702929\ +3875551371653028911096579734599831769935491738680281300932262194\ +4984764:\ +173957948128989810779090250062796172580059019371598891820856745013 + +1013844499640750066199242350792839164:\ +19498430190523094593606790431509419:\ +19424559924072241925296038785858795 + +8622490124309718848844541942762:\ +2809153572052317438723547427922294488297174937286864313874241961\ +8679887592231751654390695362494978870866660168195696176431350266\ +533:\ +8622490124309718848844541942762 + +1072609375974667769429773421465107051839877399085576311546582931\ +2311070154546061306145007166868107111741792231898435921633768385:\ +1463259917133913245195500729566820615925140728085869641490936807\ +875627045359340:\ +1136336627131206018599354228978585378999102832169870507738700505\ +866665661308205 + +434178716356826614868022910336:\ +6634862369769044245968610325063754582:\ +434178716356826614868022910336 + +1415406337306642091120413528271804224015406023026499:\ +7034899662310880590118948531539534220057245091097123989790225455\ +718320598907482500:\ +1415406337306642091120413528271804224015406023026499 + +2119242142523650184634691519911880425707508853468661410230000555\ +581608937:\ +2008383355777044545530942339055540267683709901883165870378113231\ +22625039264578687:\ +2119242142523650184634691519911880425707508853468661410230000555\ +581608937 + +69585923602069681658329224976930117468163915197373271065425178:\ +2020927964630024370658097798162044021281840678272412358937742685\ +874564410640015186840535854739937:\ +69585923602069681658329224976930117468163915197373271065425178 + +96975588332536394385315130323058:\ +1315802351305852717882890944093568207768868622073415386004618717\ +2175427025633631880306918912341930581398571945990395254404556930\ +1546423248306886079218006:\ +96975588332536394385315130323058 + +1005028458858291820643604063469013555486792420347821851888080697\ +7432670023176937393067923:\ +9828498588177084544380049:\ +2075442833247971646995411 + +1189727226195844529530585:\ +6538657640728177165013773329092206385482700449306247249506942167\ +8887069241318642226489470387127398972818622366:\ +1189727226195844529530585 + +9913890361391387217552509180:38186248654:26592864996 + +7734726198125785627433577053431512633637067455428717621996818752\ +2575060294193475687274421372950273116057529131026941243649403546\ +7830323368528007:\ +5416039783030069273660577195279406145075794925910316773014188695\ +424126525007469657167631593847463121496915435500645:\ +4964806369541933457271704487044498217022879054817785578812091084\ +454769612571500637156272668116039380758996484864172 + +71080186231578425712419354407360937437540:\ +1176980859009014803857106593068944458701173958687578469120934483\ +659139465526500936333672752:\ +71080186231578425712419354407360937437540 + +6766067674766915237012186799976734148500111990982325235714483836\ +083584935230592805199170249391665243373021274113:\ +324423691845570163374834:\ +252059054229526041391927 + +2823188323141882531578618333354253113311374951152404070296742852\ +061375867436124935489341:\ +1728156565766891281495579170663414558716728498925558384066168759\ +527625796619507427264134231896939288551956874380:\ +2823188323141882531578618333354253113311374951152404070296742852\ +061375867436124935489341 + +262779290090979866282191640705312933450751046001:\ +1089280788909080319090197382760567576418992525818853374350259176\ +94325561016010292207663524094967470016917014:\ +262779290090979866282191640705312933450751046001 + +8360271732029582503734310894572886727078012043023629221111060787\ +7138104216267918615216895281636771:555311145:120907711 + +2366610337862898747408792992366342895990689944827378360469117410:\ +76427322404335731456359122655716444433:\ +30544640615708299605352469363039636872 + +97771381685586783382636393:2:1 + +435337671693078154773623349696989:834970971193485102214182395:\ +506732218892181192932591889 + +2322513198662380013738103320830701289301787295559139301156091472\ +554729188662496855277024270062871128249398241623259939409120778:\ +2:0 + +4680113793844806249835648380663376025372596959777178380:\ +2904997032241569138092132512949608009650334804336242983698449850\ +529852963482246181:\ +4680113793844806249835648380663376025372596959777178380 + +2117036483187135:\ +2956811587252136030883436487547510285350147695210005035315279431\ +098717006229487861087796324851514192381549211074032:\ +2117036483187135 + +5405482742629299751643548818366182062777872542836164736969326959\ +5853544020603118041671461286137567987302593373027659716:\ +4573526887169513117846642791864935937856091980821696964895032993\ +8:16470976317121249525195764490105435306011497015289420117425749982 + +4359239142132654586747373757743417755349625230737312986309991827\ +8424863374421135266551983:64803544028311:37353941578659 + +6890135792819098747339200650197811212669835729907537732727533511\ +643927448939258863466836536126445044614:1696179960288:\ +1324995865638 + +4586314642595210536059912268094819407838151440257177384187072112:\ +2948676315159331003320418147316303300898329201084534802048646109\ +2015178004559585679:\ +4586314642595210536059912268094819407838151440257177384187072112\ + +1295408061166295007189929428327291997766033572889635238933149973:\ +1972670797419796219560042479665734511348274052918937432115112357\ +6010380851770692946791:\ +1295408061166295007189929428327291997766033572889635238933149973\ + +3293867584681053035957322938418784576730188582989206165304195433\ +9408357109851822801814954109216343414383237957096721562712712888\ +0653015247183660828064748:\ +8765772621072630220689785618513364012217258182568420497034708789\ +586373847828131714253297705781538931737255620107899492006608937806:\ +8601837373552535609108321170415754873427613358207755850219844413\ +541399748799344512722771514163410191291986915042108883348141430988 + +1377746154164779665651413126473853834067870962817490604919589355\ +6407321117598745222627688834382600647541603271142562521784054:6:2 + +1667979945553031384209256450228364963479415272610809793730506411\ +9303788198076909155676052962187532066482528524026964557345352216\ +5283446668047080:\ +1259826323514238805985170200301657600905328450695745758777562588\ +7186049156983679189477135784008594900590887239:\ +8186664560221138319073860758641161066866118482696737858152118048\ +749012625273296415253954330502016523386663032 + +1604558310259870720456999045309843418780215517:\ +2314764593137129686707089727262818413583267016192300531282204770\ +7680963809189153750977995631646696992678572235424774049002424266\ +88494047914464727456:\ +1604558310259870720456999045309843418780215517 + +1409736422781005655489884086727910650059319122250699179352885575\ +1322893090584507459430329601684018675016713:\ +3037097985924054837918:2373301421797167262781 + +6701198625704:\ +3208271584698650102424018685293737567361186784549354155908725982\ +8050085877527140878207342707:6701198625704 + +6570726263552141736792215188836614380398234183174708281848591553\ +9115168019938378584836876558466414158281554497244823448201181:\ +1502182222571155013035645850314652637622098563760970718145694442\ +1198813038883709721878584487611894267955370991921368152768464674\ +7953186479:\ +6570726263552141736792215188836614380398234183174708281848591553\ +9115168019938378584836876558466414158281554497244823448201181 + +334479763778167:\ +2620180822092752558176129834916304534899606970427451061631144668\ +8169619730877675269585659135601795114355310342255614595194757773\ +7880241235214292696563:334479763778167 + +# Some that exposed old bugs +-19182011317708747655415793663840398231387658659684921854518950675010744\ +798088074160106794721561977563494710663654383617982647307741145787165689\ +415568325855995687160688325738126476982782410876428471011884289880631644\ +788665773228578260075978399410972382915954067959276715042755056729572829\ +093851913104244223672:\ +110589902576771067285674161059371867150853087104563757926013065022800986\ +359888876672387170062905874195180770816843413908369113777424570833424320\ +42777093021:\ +109391537162363400163656468557497811793910234020743027803411478222848317\ +478652922638466903221971706458039541796317994671218746507915453121571156\ +99186806428 + +-12729002947374921813333325067985579104471306056810166870370214872461518\ +835258302087462325432188644174454003894356884235513517741560628902891180\ +85736535643:\ +857393771208094202104259627990318636601332086981:\ +347124740076798815206019311966363093945724145995 + +-33561455954313714494272438259200225781962996013006223887793125858291980\ +416548560804296564715491363651855619074936805970007723556609659667595500\ +71261003601:\ +857393771208094202104259627990318636601332086981:\ +69829137374876952908916033728673445025 + +[ModExp] +# Sanity tests + +# 1:0:1:0 ??? + +1:0:2:1 + +2:103:150:8 + +3923:380:4033:1 + +6208938:141338444:179403587:74845992 + +# Random small test cases +35541290007:27861071413:54405498455:18392163817 + +33810311815:21623687837:67955609697:6168450286 + +390846234986723490867:258069:77811797476286981199753:388669864014945308514 + +# g=2 is a special case in pow_mod.cpp; make sure it's well tested +2:1024:159387639486734986734896734289672398467:\ +101251470522689220420018278313264853126 + +2:4096:4634968374896:302457470528 + +2:8190:46349683748963469823749683276389476398467349287:\ +22477714489988909289079275821119423277588139290 + +2:65537:4634968374896346982374968327638947639846734928734603867934764974\ +978569847636666666666663948673967394673496739673496739486739467:\ +39545100683930137608837226660935619825254176150139370772680647311426\ +83367133155871655171332348089412143539565993577352969480643 + +# A very big test case. bitsizes: (2624^2395)%2565 +79929780860261081309977632552711610540802328270286009268787208946266\ +52959801126270181797858326539991808408501955736107211154089990880864\ +13303849208224219100591662616178697815457369194539353353497852835501\ +41050889822915371610531527622477756791100346237932148802218221147910\ +83764160121545158487346802968250797762918640822953726116267698324397\ +97218709812746716531207101626249641544666652454598936868588048379676\ +16272912941048200311549530333983535276332190445765429717475889329196\ +82723327383286444096495073061099816572815545646462399372759381873394\ +86919484956198277784202729520512749754342112052047850740549446316888\ +78036856294503455545058266059097463500482961705306677988487417742491\ +15342399979893391684184998084322821589461452070845054017545885544579\ +571298686351226398527864005606439403913215:\ +57905475544917604320471424647112496473975795682168523689996102576776\ +26237088778306631051069455546703439634818835586436374397201459270953\ +73320224593906109498830519623033054321336538157343986271182875008898\ +46400895285646814945099135578078712638653971354390893897513549226862\ +42288943235147182911794944000641930092937330351756206882625430975695\ +44517498509112574132890275024912111320852904074917394291149467803521\ +35858911321807178002982306495559510988786798025982798386952917933172\ +94803214105228859170942097230151211488601051217081893388443911838163\ +36005486029723368697022501011466335322002083542926898677979222112122\ +26602746563675308094794277325137581108077975533806822750634437146271\ +95586058676179645844985231821190979452929:\ +10399205046598242703229657351883132701652276964362108506952937688714\ +32748288996020332036899375414937330955428206666889017559888570519250\ +50646752050470991826964779958550793771265289251619085920928563751890\ +69887180372385733236214632572059802975058104127044922162389962101924\ +84687865663461891419811205882677932740064370564080283318891658075996\ +58544432626283448453420230409266259464245167575870377225089095472270\ +35936225873319683727097162939426767650247431692626091054378261933883\ +04444592844359283277150336016415487591544524543727803303478523219741\ +67585351918391390323730198435093034895278122139553159165456287861721\ +05733915744785361299323192153909893286267220726431407206795271107384\ +11115626646378829487932946663804144605711055044827184543371896600950\ +5066861013496859002404865:\ +76383126271403199465553629505580460064061138700480822311446783865005\ +94033351331759734478813350785616549057262115034183484701333480536277\ +68750392900860337148760236002293999903452043982157916536463831543329\ +81510716218290076553514718078562286562453573978032941974718159086704\ +26254141182888039292181731039710070744775875012183282365743418038436\ +68118132938651461047089720835645326444415743163725663534054526664632\ +63369477979502118345322416804826584935088694928774075019074758940531\ +93696779256795084313220287359244619510038817488191412143951928835003\ +09516216069636385063459729195557820282023577637677540172121768705892\ +64355863735811421469235193223472628311338081133201771681274202506343\ +43861119601917402017293095701055272115112783553081034528116130152891\ +276971073856411987253305 + +958568327191:\ +10820434407851188405104973511902906513518224342681350271810370438073617412:\ +385412694768521967592874726457715560537359750887572236310781387057217187291:\ +124514485573662879135724475226939854111051534076732305767767212261825204773 + +993:\ +158082274092371197688912481356696199899964270448955828125938845871237934609:\ +195335598174576479907825469879133749630277214529613044392254617116806465841:\ +76319125426811367239700120840606231265432388418754186363393007030575232763 + +5837:5387594231:\ +52910803894426776035608204231136092295842162542576147924991587830017346711785:\ +41256038256951041015975957103736087906734912779021641091323861709915393683478 + +11820:\ +349248154095284306437849303504509069624812572044321414531019412890823663:\ +11695070112125499434524238623571455233638695379976237857792518028967433696813:\ +4877591936163920485322716677654737966141266950607206024720481980778956876733 + +1279509:\ +228828116455132585158359573618073983726467809680019810077325482377363026:\ +596955405275729008892203759914236488647769846458724773926971979942130809:\ +548455744959985761919173432531376978888129348803576565818991241228678799 + +1169325226204036541181168587818457846915410492286163370049583817559172758:583:\ +1347789004686354026667591408699204029024258192368477695588810277715014901:\ +986753196897611638420753041983500285520492197918271348656818055904410861 + +39684855714221597676995827906679339738237777820353232844682939092337386955:\ +79808721821529030962053171978817611068275131312667370272216709366985607610:\ +168218000729293476661981768796405354274622797227127241788417326533874081227:\ +10243904434954110191313565832244070050272803217812912164431747671168317597 + +473396006114590115230521230276516897096:\ +387145532418575837430469368595868663742:\ +554862946848974049157489689418354631387:\ +448855900130388136390865414336576134923 + +383239913102526615892890047333017777270:\ +5212692713946112175761972297467118924556477:\ +9600330398725582192064124044651400063154809:\ +553434761331054066751131351244038395387413 + +17023533902565202029648472226171284665775885307:\ +172062909283726569049023770937247425801:\ +2803129820108668499802071463467295777012106623420016438138627500\ +520764503324471534463345465793841061510744977815:\ +1087221030676278725112163308497001956646825599606083907052530601\ +511129847691028000053571012933461738616679305207 + +6861608600119069162748766903320668621565184418412102985517914652\ +495806067714718757017641467375130420763543:\ +6090170638405015131997058617056249184350028938641981546887188901\ +427704577888167364319592127129279546370159:\ +9244137284483765901488318500741614548852246750950515340492572279\ +249663219793564958021372197661101436416951:\ +4357639256086891490742558173162011739263189633058589469209912059\ +837628983627026566654010174880786564650028 + +1708391349301269900029298214389921761264445766152620652843393219\ +358035361114524948237829535432550149898389816132:\ +2879295558693495162441272767383253789140301947026867788739382060\ +6202058461437115060253107180150356177029255392:\ +4562451461011443048616592993727831094905333529601929282014937177\ +804484518010765376407040702135536959480150175881:\ +4780971485381051463987885157471185516431563444901967941411376359\ +86642717690683975282976174121121834972342669810 + +10517206412589906914919094336031596865011:\ +76918459253520716071622848977323758816926:\ +1505994032870020776188597437379504956214103601873594169817828353\ +64671206273170823011738702809865490437980268482169:\ +6782959072847327960243512935142614796318322133888530532951869324\ +5770409979689571346380672589348570036123781607470 + +11150372599265311570767859136324180752990207:\ +242724485078592151169084549880604092836:\ +5335081937310201228237642071226891497098426337909703107583644285\ +670654712470768061820964879543360755501155583507:\ +5289945663803755598608137950548888139591380435852466790487033227\ +703935262787324650046364967638572584406632742426 + +931466513478626427306310727788682496419061:\ +217994111091681034507066335081667319859874:\ +961964829688733829104056632507823404588589:\ +833173750092106303567501575871102318441517 + +33561455954313714494272438259200225781962996013006223887793125858291\ +98041654856080429656471549136365185561907493680597000772355660965966\ +759550071261003601:2:857393771208094202104259627990318636601332086981:\ +466300477512220407817532870461493708182430162598 + +# Format number:is_prime, where is_prime is 0 or 1 +[PrimeTest] +0:0 +1:0 +2:1 +3:1 +4:0 +65537:1 + +# This one passes Miller-Rabin with a base of 2, but not with most others +4294967297:0 + +# Random ones +10416536965533130067:1 + +62073521899194104903553565787:1 + +170585900781008069215236465296032411499:1 + +1443993313735051633697456797423139085424112074517:1 + +10771372029656662585340604592252023412983364818055143344382694346546\ +2298290643:1 + +11771372029656662585340604592252023412983364818055143344382694346546\ +2298290643:0 + +42588518477191145729:0 + +# The following are of the form p1*p2*p3*...*pn + 1 where px is the x'th prime +# This is to make sure the number gets past any checks for small prime factors, +# and tests the Miller-Rabin routines. It would be nice to look up or search +# for some Carmichael numbers to help this testing some. +32589158477190044731:0 + +4014476939333036189094441199026045136645885247731:0 + +1907826688958019501360189182099275775721983966835701205590751690\ +4309700014933909014729740191:0 + +4445236185272185438169240794291312557432222642727183809026451438\ +704160103479600800432029464271:0 + +6107692946593319609927894338899785515035614388823837148866549657\ +4810764573680243467182799164806563626522181311132959748531230211:0 + +6989612506894284794136067796445539076219364950255126280242854713\ +9923075880112964253713561700013194221462347575861905534037645370\ +21369947456703810795390696338067840821591:0 + +2577426147548683169379880845613862450845254401055092509543183257\ +2701791887072337189992932234179329410389241899414841054215169960\ +1546741832617953638436279944072980418788682453341495300190580109\ +0622787969540076319408964006231:0 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/failure.txt b/src/libs/3rdparty/botan/checks/nist_tests/failure.txt new file mode 100644 index 00000000000..0166e0ee6cd --- /dev/null +++ b/src/libs/3rdparty/botan/checks/nist_tests/failure.txt @@ -0,0 +1,12 @@ +Known Failures/Problems + +Policy extensions are not implemented, so we skip tests #34-#53. + +Tests #75 and #76 are skipped as they make use of relatively obscure CRL +extensions which are not supported. + +In addition, please note that some of the tests have their results altered from +what the test result should be according to NIST's documentation. The changes +are clearly marked (see x509test.cpp; search for "CHANGE OF TEST RESULT") and +there are comments explaining why the results where changed. Currently, tests +#19, #65, and #67 have had their results changed from the official results. diff --git a/src/libs/3rdparty/botan/checks/nist_tests/readme.txt b/src/libs/3rdparty/botan/checks/nist_tests/readme.txt new file mode 100644 index 00000000000..b992a5b30dc --- /dev/null +++ b/src/libs/3rdparty/botan/checks/nist_tests/readme.txt @@ -0,0 +1,26 @@ + +This package contains a program to exercise Botan's path validation +algorithm, as contained in the X509_Store object. The data used is +NIST's X.509v3 certificate path validation testing data, as found on +NIST's web site (version 1.0.7 of the testing data is currently +used). The PKCS #7 and PKCS #12 data files have been removed, as they +are not used in this test. + +Currently, some tests fail or are not be run for various reasons (in +particular, we don't have support policy extensions yet, so that +excludes running a good number of the tests). Even if all of the tests +DO pass, that does not imply that Botan's path validation and +certificate processing code is bug free, as there are many (*very +many*) possible options in X.509 which this testing data does not make +use of at all. However, it is helpful for implementation testing and +assurance (I have found a good number of bugs using these tests). + +Currently, we do not make use of the S/MIME or PKCS #12 testing data +contained in these tests, because Botan does not support either of +these standards. + +To use this, compile x509test.cpp, and run the resulting +executable. The results are written to standard output. Your system +must have a POSIX.1 dirent.h, and the code assumes Unix-style paths. + +Email me with any questions or comments about these tests. diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test01/end.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test01/end.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7e64d6de14e15ff446e6b7579cd0e13aeaf6a06 GIT binary patch literal 650 zcmXqLVrnyJVtl`VnTe5!iILHOmyJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT!RE^*)MJ&3bCIrv^cfM zP}ey?&%jX6z|f#^KC+(~Ss9ocdl?KGJDD0A8IGB}$>(_x$+stdm)_*vEX$d97If{r z{`C5@Q(isFHxf2ypYG^5e#4_K<>xo)$CYl5PZGbYx)**9nBw=TCd+&qkK6t^)0RG3 z&vUB#L(eW}FOI&f_Rns9=W}C&+*i*$u5#9pulD`Lo1ZgPe*ZDf(_Eb&RNA1m`@u>b z!=u}|ZLMEzWnyMzU|bwz5C9HNS$;;w|12!bOso&U(IBh9!f(K9z|F>)(B{FI%FJlM zXduYO94gDl!o|X|=JubDdsy`@fx}%^nT5xItAS(ntk*veJrC(e_A)ET%Z&`$9sW(N zYg0Ggf3(AA8d;YcBpjqbz3tVu7#gd@!l>JKL-G(6xFu? literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test01/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test01/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test01/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test01/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS|8dIm-Ya^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;9?rE>e&tNPFn7+Kd#7a5fA(&0Tkt^S?y3CR z6yvM6JHjsk$j*p zX}P1GiJ6gsadD7A05~{h`577iv#>BTu|5DtgRBAzzX7iSHydX{n+IbmGot~cfgl@m zs4O1~7Yj%I%t?KZ6F2_=hr6sY3y%R;1IM#IhuQwVQ=TDvnHA*aMh5LYvc^hJ73W{r zwBq|8-eXyJWuFL7+!AtA-Zge=s9(fgPtG~n^UOO$=;Agx$<=pSC%G) zYx?=_T*CI|rLb(Sz3ie-6DD%9-ZZ`E{7!4q#VB3Qx1shT8+?wtH#|D*|3Ln9PDNI$ Z_{O5neD&@%C*~^et4h0~r7^qz5T(vAQC literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test02/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test02/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..e7dfa96ee44db2bd3b45f328c3ae273fcbf86271 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj14BInBXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zc-H4I+uwJ}Gc*@7H#Ra%&zsg9xN3Dt?cL(XO#+Nz?eY~Jd(Ix|yx73Ca>xAkspTpP zd+cDLsh3Qi)ucHq=>6J?*?bSLFFf5V)%UH)!>>dty!`RQhU^u7+5kL{W<~%2 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test02/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test02/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..0aba75048feb53b03423a62b6346b10f9fcba912 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6C;xWFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%stm|Iz; zaIy6*sutY=7S=&%n_jtIWb>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test02/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test02/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS|8dIrV@a^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;1?FpCl>h%@lyJRvmG5}`2ayv&t|zJ_ihfw0 z?%w}VVmdmWK{Q9H-o z!ddKC(>1mw{ifCzWhc+JzuW8i%DQaUZ6>DT=1|7U69%W*|L&U}6PC&Cf9QV7dB6Wr z**8}+F*7nSE)FsX00*ZmKO^IR78YhE)(7BdkX2yeH{dnkX5&m~^I%M6W;9?l5M*Nx zmE~jMV&Smo-7xLO#MO4-aF+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj14BInV{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zIPWjka?0(-Y%~`$H#RaXR^ET~l;?$Kj~{Kh-clI*w%B-6boIB2CqnE6^E&^sE@Qke zvTTCuA!DX9yLLSeZJNctWEzw5y`Yb~Jr5jL@tYzVRG@TE-~O|8qjBfEXG`vvP3ykC zllPIH-a@M-QIn#E{2;3narW%Hp36`Pp1mw7Bn1td(LC(eD*~f^?$tM z=r7*%CZyCrPJQtSX93}Z_0tcnVX6P{wUBeh)&9hDhe{e&x+om$n`V1*N#^d2*E4M< ztlLzvYJ2|foi+Q`=5Oy33NhYn&sp8`V~xTSQxlg~UT{_WSZmUpWBj4qO l-ADWHPda&Mdd)efzyc%A?;?MBn42Ub8_(A=J-E4LIslox)LH-l literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test03/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test03/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test03/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test03/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*jz+r90eS{TdIp9Da^k#}mIj6fhK5E4h6V;v;=CpnNL+&ia_o1(V!yb7D8zog z(Bjl0Lxc+&=Og=>k(GhDv6sQ1v6HE>k>Sma)tT$o$VK+DR~!`Ycph};N?hoH^(7Vu zC)VkGP5LA2X2G=cdUNc=X;0TIDnGmF=aa)4A)6NmJ^CYjIj~r>YT@nwgZ3pTeT(;v@k4*o} zu9m}JB$=2Q85kD_83cfXQ@^ppSCFCV^_Ypl5@`0s(II%j>+C>4&d9hBi_KyOL#@rectW|tm}Nb zJvv=H&qQ@h+oQhY_5SXwdlzi`;%F2fT`2M6;_iFXe8uK>I!-Um(=1zUKiR})$xqAd bvo{Z)Hhp@0Z`@3!4LjB)ZBx|ph^+$vbCuLb literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test04/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test04/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..2f30c77b538a33291011b469476c08e0e810b7ab GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj10y{HLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zFgp};bU{|x3p5uqH#Ra%5t|zN>*lII6I)WxCPXZ`zCN9$qPJ#M!6)B{h5&(zYqB%H z%vl}OK4Z<{wllR8x#Nlryx&FVcPu%3M`>wlzFBeHvf6t_$+D`?Zi;;NEYMKA6l_y_ z`_<~b9hZz=)#WW&(|ss$g-m1pvM;Ke=AV`;51V6Zq4W6IR`=Z_z;-zx_IoU&{M literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test04/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test04/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..f4e88d58cc91b46aa1abe84f839a3a4008b1095d GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6C;}eFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%0j-6qPyoW$x*Lqt-9gL&Jo^|tnS5@&wk46@p{{gEzO>@Hg-QvX^4-%Vt4V=)e{LZ zuUQl9mNQh`WSHc3c%ORUrVY;@eLd)S<J^Z({2I zG?y|lGcqtPPBut1;AdkFl@(@W{LjK_z|6?_9~`=}{2&1qW>BnwVntSgh2MbJfSZjo zq0NIam6_3i(LfNSk&lIog~RMn%+Uo|WiPD<}*a z87!H zbM;^J7sRiK_GP#!p|v4yrF7cO@ILNJS<^~3B~L-eD*iAd!5#L><(YDg=Oy(Be}QN3-#jx)n?A3 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test04/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test04/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..e8596c3148f70b13ec9a8989ac9f6d533faea768 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* zUFQHj10y{HLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zSkSBHmGJEBR5TYeH#Rb~FrIgoidk!N_Co4CYc8I+Cn5`q^{WjvjU6H^gFY)4&2}xF z^-XoA!mYnwj|A-NJhSEDl9tBrojO9MyOn3eyT?z}H@A9G^K{nMrT)Lt<}A_fowAnK yyQWahXkx^JTJ9j}cQ+<^ZP8NrF4GoRwXglt4W=XdOLekCg+rSa&!nk`P6YsrA7nNF literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test04/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test04/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..727035b6c898d9627738bdbd6805e681dbeb6f2f GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6C=9;FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%!0wfo}F-Y!M1dJ_vxyJk4xu7U$xe*JHg z{M5~U%llHkP?~(TSB2c#Nv4na-aG56Ossh%xjJZxl=#-`pfG4;DEw`@q_)hNJ#l}t zpUT^f$CxG4`t6vnrG7nk@!08i3n%xT(8&@Ftx}j z&ghV;;|b~bBd=IQVsnL0FUwte&iTCGN?YTyru#dt$e!G=|J1bQ7TpT7qW0?~G4eZ~ YJhUiu;*1`ZZwyi!KBt(;Y-BD20DL*lEC2ui literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test04/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test04/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test04/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test04/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS{TdIm-Ya^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;{!44m&HJ?UgZ`t=&GXm)m@PGNdJx}Y29c>e zHN1TmZzn4)*XIfRyz;g9kNj;PjvAa^zi+p!HHYm{&Sfi`4SXLP?{NJzCo9L*^-+)J zL4DIuCyO_H4|YG<9WtvtP9s^d+v3d4gABTu|5DtgRBAzzX7iSHydX{n+IbmGot~cfgl@m zs4O1~7Ym17I7P`|8M`$|V?Ye^^^G*z0nu_Q(Gl>U=m(O*!28sf4L9v-hyMmGoX^>D%AdKH*dn z)3Cg@#dO2<@4lasPd{n@*^t%G?7zWvD_6+syE|T3x2*axGvn0ZT@sy(@)Wvwzluaw Z**x8PmsfCcv&q-}s*C11x+bJ<0{~Nz&Yl1O literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test05/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test05/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..a34ef279b0414ef0c87fae5136f3fadbe4ddf45a GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj10y{HBXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zVEe^?#jjsV8O_Dajg1TpJ00qam?PiBlsOB?rrec$825AI&JyXXHv1w^vKo9bovqLH z`0%H+NB?tw6g?I+x^ya=)xYi9?cfb_JQ^6Ub@|_0^6dT^e^pCIzIOc|7h^V_mb@^b y;h#E{2;3narW%Wr50>AARELn=H8Z)G?NdM-YDG?*eo!hqb z$%@$Xowweuz4yc`iS32lgc3DBvzR^mZnLy()!$#W?~d5pb+wn@?6u>(!nJ7UlsSv< zt>4PT%*epFIN2c4fS-*yR92Xg@jnZz0W%}xe{kr^@`D6en3)*az_B8$z`}39YrxIM znb79Jn99s(z-S-{(#Xfc#lpe%i~ovWzmzgK8f2AOcnr82I9AVk{qxZCkbdMaUerk^Hlx|7eiu{wTL@sW$MwQg)PYCo*@P_lV#mvX|?D4p#X zgRmj%(n4Xr@)yU~oG`hYdQtT7O5dj>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test05/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test05/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS{TdIrV@a^k!u<_3lahK5E4h6V;v;=CpnNL+&ia_o1(V!yb7D8zog z(Bjl0Bo{Q!NA@!#D+6<5FM~m2CsSi1!^yB0!QF>Max^DfE%z~a$SBs!^LUw=qE^j! zwxSQ77iX?GzT>c2I&ZrD#W&3s2PP#Ji8)C+8!b`4Z7|h#!>KbzQcBz>dVRENl8CVX zk$z7r*_+{yGux_#A68yEn37}sr238Xt;>qKSB*^8EVr`?a!S*!Yq0(B;rFKAJ09HG zNl%)Ym>C%u7Y7*xfP+((pONuD3kx$7>jQ8!$SSb#8}J%%vvDT0c`&9jGa4`&2(mGU z%JQ*rv2YZB{WWRc+X@wMxXUWD@ECA4aB!#m`yycDeaPw)4u`i9>3HQGmF*A<2u8DA;4>sWI@V%3SF Y@6GbMH`Agg+?lsFr`n87@`7kF08nMjK>z>% literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test06/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test06/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..d87cd7e26c1526f3061765401d842c59b70b981a GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj10y{HV{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z;72uAGrlPKD)Eb>U+$-UZ`siS-M13NA;pMUW`IXy0EYs{bd z!@TN-+TX9OW`VB4f4@wNsg8(vF-2*A@Y+cecZYuAXxq!mkP~dW$oWOwYTb>CrH@N3 y@1NSaF`#~i#E{2;3narW%Abx9+0x|LfJ}{VZ#hiP6?Z7zoPRU_58t!Dn=EfPKUu)!CHnk9!=#xRrNT}h z*bYCI*KYs*Xd%C9zKiq&%fHH=-wqis=(^eCdeLlWp5DPI_vhJfjMbOtm==cgJ!WnW z`p?A7$iTQb*&xw?pN%) z(B{FI%FJlMXdnpE$j8FP!oi*L?~f$g_X2P<$SSk&7;rUkte*Ay=b`5z{m5a!3JQZp zhGqMf@RmkAGt<3Y!}P88^eibuzSe~w4+I=Nx@>)nX1I_x=eGXKf3{p)yZ7Ms4Vu5_ z1a;I$C(rM>uF+=Y<+k(cj8{p|K399C-Bc*sn6v2fNxqW@Vym+)KXIysuE}y`{<7n% kUG@~sJsJiv#W~B~v3Q>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test06/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test06/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS{TdIly2a^k$E1_p)(hK5E4h6V;v;=CpnNL+&ia_o1(V!yb7D8zog z(Bjl0Bo{Q!NA@!#D+6<5FM~m2CsSi1!-nuDNdnvc=p4-9;W2)`Oi1P0rl8zYyE`<) zbWbAOIYkviyvU|5;d=nOGlyqd``Ih2MbJfSZjoq0NIam6_3i(Lj)m zIaHR9g^Pt_$I|ytGevw8z~L^d%)(>9)xZ(KynI5XfoCMLmsvqxZe-|s%Xm^QaQCUH zn^>|YymH#NDSgrc2c@*z?&})^8^82DDLk^~)ZC4Jy?(R4W_<#`*~o@(vdexg9_QAF{=1e@)lpKo7UaW$uCibc_p btUw3WH78P?Y9^*`oM_Uy$GmE1m|p<^0)g07 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test07/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test07/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..8064e91bccac78d30026808357c4680834ab865f GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj10y{H6LDTkO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zh+tkmq0+!J63xZTjg1Up7ZxeCt86RnJD4%c^4wcrr~Ey2b&9P;>|Y#E{2;3narW%qC> zu_nXkN|8^<>(%nF>`pHUFZbe+n8{_fBUz~IxK{3Y){gF`35!GASG0H;`7fKUtG@HXHy^`A-U(q z)Q?Qej0}v6lMNCL_}Q34WrZ0T|Ff_fFf%g#2ZydKKS+RunTe4N94oR4Ec^z%2Hb3% z32h#XsmzQ9j0S=rjeIOzEF2Nc%O_MCct(PwK~|ZC$AGJWWA&`pKMy?*=|>I&R!|r; zG8ieoIB#Dj@FFPI|H*n5(any%f>{g!wWsCoeM#GES`u?ae2F6SACc_-sSj(UjoSXL z?m0Hs@bRxpf4Kywbr(BJI9+&nxaz@U{*6{_TJ9_L_1EyTr+wKr#Xjuto>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test07/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test07/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS{TdIqKj3KINA2BroEh6aX)Mh1ok22tX?CKgCsg9LJ1;DW^k;s&A+ z7x0A^rxqc(p>aO4uNhexm>YW;3>rI`8XFn*DV(HddZPM0L_6EJG znB#A;d$-z|9q%&_Fz;_|XTQ0&l;dZFt$0`K&-Ojnv=6Usbr4Eh$~9q=%mc2nKPm?~ zF77-rfA?J`W=00a#X$xE-~g57XJq`(!otkN`T!gevI;Ex2D}E`Y@7*g9*n8Xj0TJb zf^5v8vV1IDEF2G($sJ^#^t&7!^0LY-JO*419QPh4DnHRv?n3r5E6B@@4A}<8`d_X# z`Lvkl1+%R9(Q?Y7u~jMc^MQ5m@11`Xr2dQDO8BjQ+Ptmt8_Fh6Xm2|C@nq1cr_Vl2 zce}yxX@g6D(V3#x{d)t=`PrE_A9DHmRpQoL7O@jcHk$l9)xCIbh~4||@Ao&&H&awr d=ic^Zi-yq^ACnn>UK#M7N)=!FVcvb2Kmef=)ad{K literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test08/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test08/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..d5ee3c3ce3eb7dd3bae060cedcb703d3f4546263 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj10y{HQ*mBPO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zxc4|w`H7x#7n+Ni8yguSr*hm3obhPdl1olZ7MK5XtiCm~G3VJG&sw>?40^c&^IK0B zKl6O}MAt3;U%PGjL6%c{c{X%hlrye~Z`RszGUY+|)70ZOk~;&m58aIs+QF|I)LD4o yNkVyWfLgPGu^{6HNwM^^$v=N>s(SV+e4jT%vhsylyC)hu@7&-Sv*qV6_GbWKpl6c+ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test08/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test08/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..d26979cdd6f04e0c115f14ad0a0a390f7d6ef106 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6C=L?FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%*r~ zX-RFZXcI&7OsVr0+ZZ1|V_P#@X6tOBm~S0M&Y5%4gaW&+q&?Z{yCZ$Q^`f-8WxDEO z*Pge{l<;$iR0&^Y{`Pd7#M0sw!Opi+ z?|c?v|GWSB(bg@W4ouQvKYQ^=-lmpm2U8|)`Mj>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test08/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test08/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS|;dIp9Da^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;`~$kn>I^RzY8d|b{_b&5{?<1}98XzT>MU&( z7m93F(6o|fJn?YLi{ca86kO(&ALbXeoMbJ@cgOzA&Ws&WGNuKb+n=TBmq?s=At&E5 z;o;w{>-ipk{A2l!RmFamSc|*KwAR=E1Zrxn5 zbj)UAW@KPo9Appx4o+EqM#ldvEX+)-55UnNtH8o XdEBa)RY!IDUy43BX~Oq4%)bTzSX9T& literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test09/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test09/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..fbd85145c26d74672d6b378e6480eb01b5a8c53c GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj17ke{Lvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zc$8#iWo@#k8qLMbjg1WTZ1RsB*dCoacrzxfD=FtnjkxdP!;9LNPGwh3pW*+vE+Ku!3BS%7OYQLx613%? y>dkd^A&=i=mMx3lS6&RVGTQl9~jeC9PHvJx(U%CKU@MNX{ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test09/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test09/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..c107dd756ca2c1518020f2bc979c49234b011f71 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6QiI3FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%ILjQRE8$<(r2DiUVYSd>^SkHhEp2{g-Q)XbrmeFS;Ji0mEs!!c0XG|G zLYoI;Dl?-2qk$kuBOePF3&*1*D=TZ0Mb+SFkX2^kG2m+8SUv0Y&qL2c`jNwc6%+=I z42FT5gO~qEc=%E-Y+usDrk>&{sa*%Y%-tzn$|~0U`o=UD>4(wJL;`~3gsv?W(5(Db zHZ?E%)npY*b3fkR56?Yh@*kY`$WN#?Y}qi0mm#O-bM^8>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test09/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test09/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS|;dIm-Ya^k#}76yg}hK5E4h6V;v;=Be1NL+&ia_o1(V!yb7D8zog z(Bjl0Bo{Q!NA@!#D+6<5FM~m2CsSi1!y%u}{I-WXG+dV%-*~F`|M7+YS`})He(a@j zjsNQRbRB)ft-g@Qk3*a9$&}M;x9qIbJ!EBl<~e`8=PX~jEAvmL{muNj@qu}^f7sc+ zwB5>!4|U$zXl(kU)97Btk@OXk7R>LzME>3PFy_#z{Ze5{O3u5tseViH<&#YpcoCS_ z_9^N%6Eh13@e>b!(CRHg~x!af#dtmlU%EI{c=L~GAqc-jST9%m+vn6zO?OT z+ZlyT!t2$qnXdY`(|y&UsXC6&q8bmcpD;;Ja%o<*$$IXC3nyJJ{mkopi%-w~tAraz zmH+Mb6PsLi%+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj17ke{BXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z_`dTb*Q#B=oX}j%+}Oy#eeu2N>#MInZ@$m2Ah_W{YKxbuc=m&*JA}?%e7GX{d^P)v z)SFi-TKZ-8)$LsQVY5yvAM-D%WH&Po0K!jvrbV(whSzG()R*WEp^bM^D} zZ8j4OCz}h+2%3KU`QnpYZoluZ;*{S!`@ZP3uBzPE3>m4)DJySy2?#E{2;3narW%C z_1&be40BGVtk}!EL#^jt{-uKL%4I+QUj8v_rv49ufa-4RB$l{2M{ek|p5?GITtB%} z>*=1P_{t+sy}DRucst*%s8U{BX>&Gyxz3DRhx=Mse4pyAa=+lWTauA!)d7F^2P;Tc&&C`oE6m9FpM}+cnUV27ICN$CK>{qyOpI*cSdmp=;Wywl;AZ1Y zX!Br9Wo9&BG!O)7D<}*a z8KSx3+i&q%{rG#NWXsv(#+gp+eqPB6!r2DUy`xPn0zQgLXv)E;shZedm z=|-iS3_4aR^j&N;&VOT4#COYF)AaFLlSLob8~jLijk~^1B}RI$QMTdnZnn3j;;9)* i7T@3fsoZ26UYyesr+S6&d0ddW+{rT5q9C7z?7{$hm(0`v literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test10/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test10/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test10/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test10/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS|;dIrV@a^k#}76yg}hK5E4h6V;v;=HB?2Ig?CK>|7UyI`?j+&~m! zKVN8ZY7vqP8s{VXnUR%&xv`hQps|ywv5{fRhATe1CmR-@GZuQ(a%t_v|KBJ3$n41t zRGTVsVAG|wi*!HEe1Cni_sw~YtlC*+s!ES`T#s2Vc3UMUX#OR29}Q`rPo>}8rDxBc zsGe7qu;V5g2bovYSJ*o_% zStjd~)z309GcqtP4l)P;2d6AQBjbM-7G@^a2jFOsRbb&a;5Fc8<4kDtU`%CZG+;Ck zWMdAM+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj17ke{V{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zXi?%jZGNd}0-B4N8yguW*C~4oYk!)Xcx_SG)L)7ZU;SP7)?t$4yT0yQ^B1f=em?X- zxS#i=4WE;n_Si3MxHyw6qiZ%OISD&3BN)y-F04pnp+xfm2WbN~RfGiD#E{2;3narW%) z(B{FI%FJlMXdnpE$j8FP!qK9{ciQ|?(FAZb$SSk&7;rUkte*Ay=b`5z{m5a!3JQZp z2IhDbCyf`X&z||R?4JK?e=Sd0=T1M>MGlcn$14(=q!w-DGS#$}ZvL&~vuWmJ%_~|$ zUK5`EaxV!Jcydgy@>E0FybTLec^y(?9~7RSQOyutymC3)mlHb_lFoC4R6HxWyme{Y jzr=PWjs>~#2fkXB&s7xHc1k#->T$a+fo1>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test11/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test11/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS|;dIly23gWz$76yg}hK5E4h6V;v68uI6rUpm?1_|W2zy*s7#0^9t zF5n9-PAx)mL*sm8Uo)~YFgNxx7&LY=H8wKrRQkI`)-!sMf56-6hnJj5a=!jJGJAI+ z|H)2`B-T%lI5xf5xMJlF-A#`7T5PxNueu*))mMIF>WvRci+|q`?m2Sa@yq;kvdaqc z7x6V*;dHrv`H6FMVZRZ>^TYr}8Nu4Qe{@$bb#OmJ{6E* z^M3t(uZXv+MGv_*tdL;PTXWH`;2cZjE18$G-|@WIZolhnk{Uy7W!m!XD=j$mQ$C75 z`m*)KgIg-^Rw*1QO*+;l@XMs~$hRdfYxn&99lt92sd-Vq(hTvsnitJgKGR(dqQ(B~ dTCnZ8>er1+qtY*j^8{B*?fPLa+p*3@69B5{*A)N& literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test12/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test12/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..7ce6928bb68dab8b652e28fb8ff93558af72a1b4 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj17ke{6LDTkO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z5V>Q%I8x?eC7O$w8ygvnnkst|O_^olr@h!HePqd-I9qXGiI41cvdfPyu>Mv1*Xyml)$&!pxA-0q zI2%55=lw;(-~Va9RJLBT?f?B-yA~g5I;DI2^)}i4R>4KhY#E{2;3narW%<#7XIf|a!G^bsaJG}4ytjqe9b+dBHj;~nT z@Mw}ks+Gm97hB4?ZEtT1leu1d=x6>JjbhGA*Ymep+Ih@+^)717FYW*Nf84n%?Hepk zY-VC+WMEvJY>;Tc&&C`oE6m9FpM}+cnUV27ICN$CK>{qyOpI*cSdmp=;Wywl;AZ1Y zX!Br9Wo9&BG!O)7kWR+QX47eINR?m9<^U(8_?|;5X*0}DmQ10)eC->q6^A{g!xuAYtW!aHTWhK)tCXPzQFd@mHR_l*ZCNE}8 z6m&mW=4xj5b@dKud%YViL0>$xwsV)h;r>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test12/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test12/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eY5}dX|<3a^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yFr3k*#33=9n#=Og=>k(GhDv6sQ1v6HE>k>N)}%F^>a>y`H|PQKq-G+(J-dwal^ zm^Cb)TBE0#vYziVIy3jy+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj0~0+1Lvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zu$+B=nViV(YiKTJZfs8p3EFNO zveZx944G*0Z6`fkAe73pMIx)5CsL@KcT20U3i;WX6Hs3MlzxsQ=;G)uL yb*bjY3GXAUt~V%8x69l5gH7x4OX0=bY?n@_RUG#E{2;3narW%~1fZ=U?-<|4fnG7=MayT(0yR6nt$jd?b6lRCGeP^H8Tope#7HA3kI zd?G9*C4aro@m$zkmLPp8{K?^+2i$5DPF^){Uc0;X#MG1pN>h2gvp-ecm+anMTU*~* z&BV;ez_>WsAkl!IjX6|Sn33^63#$P$BjbN?=*seg1X!4v7}>zFBCEi{Z@_E7&BmF~ z=E0cC%xJ)9APCaP$HK+JVLAK$GC7gm*TB&rtIWbXswiRXkgM@fDn7UY!#>?dZ%!Ay?|oYP0j$USTNw;jQxGT$Bd4 z$ARRYhSqt3@k=JDtf{T3=1Z|pEzw-FJx)u{_vM8Co{Jp)tTRRZ5! jMBRo3uXeL;G+y%VqfykA^{W%)?lBiH)ZZQznidTJ#jnaG literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test13/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test13/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test13/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test13/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbVklt12a@3yW)Dd%F3HSGH{>zkf`~A?3A-q7eJ} zLW@(2kX+C>AKA~0tPISJy$lA8olK3544bWI{@T|z>Hc2!tW>9XW%+Ln;R>?44V&1~ zFL3@#s@ocMagTQX((T{&WNStJTi^M;By^$}SH!}Af{BmZc&d3$h6{zJ*Rov_dvyKr z$_J06mO1PevRFBtFT9K`rYF7E@!s~kEmQv3$4)eqTgS|O=ZoU^d{^P3;}+i!E&efm zmg}C6Ow5c7jEjQ|0>FVQ%g@O8pM`~)iS+?E8e|n%_zidsxY;-p+B_IjnHdcj4FuVk zLuL6`xL7zAZ`t)wZ|$>caJb7Vv+x*jHE;x39$S8I(N@7e literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test14/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test14/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..ae372f38b5606cc0841b4569e427cc68336bd1c9 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj0~0+1BXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z2(mo3{NAFi&S)-XZfs;ob3K_cafgGU$!*3EceagDufK&W{GR=|{)VjmmnC&Cou)23 zEPJ!?)sNguQ-Wu`ykK8bD%*Bd=Z1ym@sjzDZFd?LX0KOsUoqj-?OHke!iuZ<2~UfH zT^9#FQ_Da0qarV5{-d~APmaFP@M2srOSu2I$fFfj{ac?rxaHv<6dk3~k;o1JWV&kA literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test14/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test14/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..6e97ee2b80bcf50b5894ba6f7d879389e9611032 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Qi^NFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%YW;3>rI`8XFnbR(QQxdM<9F^1SJP)cWeLJ3C%E-TL{6Tx7rJvH2IB zZFd~Ku~Cqtc=^)>=?VvLv}^sgu~~j__od_M3(h3$I*`6MZP%kKr{lV|*xJppzPz?W zDSYW-RfeuN`uwj==1p3&cbC*!ZYIOejn{-5uU%}ry5qY2f=c#yYtO0g+>2%%;xJNY zVrFDuT%2r>Xu!|L94af!$oQXy)qt6i@jp0pW%)q@EX+)dY~WatRbb&a;5Fc8<4kDt zU`%CZG+;Ck1Zm`B;bP$kvOKo@-lDC};AoIlX5lg5YT#Hs>-En=&qMl=!+;eO28|5v z%b%IQ&wRqV>F;V5CRN9|+iX{F6o^--iF)SsCE9h?tGIiT@r71<9yr+fWM8)m&b~bV zYsZ%S&xvay3m(;Pcq$ou_JhjS-=5M>!}r)_e>0AI*Pj6ZXVBW3 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test14/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test14/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test14/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test14/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM-nTe5!iBZmgmyJ`a&7D}zCjA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@6^4a7kr z%)$c6iG~Wg3eEv~1}1t2#tI4sa^k#}76yg}hK5E4h6V;v;=CrvT!RF1+~9)64dMo( z5I69J7N-^&>cZS$&^RC2-;Asb%#FPa292Fejg1W3TOW>LQmk)YHi>ERlH%ZqN35|=JRcoRh;1ZBGP0LhL0)cT5K#8` zVg0>lQMi5J%FBhF=Y^#TG|jf8!R!rDDt>ksHIQ=J^qwzxQZRZt-JhCQzVmgCaB literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test15/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test15/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..626049aaf0ab2f55c79fe4796b5e6761b5c21a2d GIT binary patch literal 341 zcmXqLVhl8B+|9(uXu!+HsnzDu_MMlJk(HIfAjOc|fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhSCO-AQ5I^Aq53z zM?(c&1qB7?06hZ}Jp*HLUQ0^@LjyxYBLhPNgD7!c6AL8n0%Ze5u;H>IEX*J$3bQeX z$||$)7;rUk%$IM`>;1ZBGMc-Y8ygw+%;1Y(9e1cCn)|}SAK^Q+EE&HvC{|Bf?yzwF z9K(0IKcrqvRJOL6-`068^;M=i_l;$-*{Qp^6qGYt4m>IUJ}av7kMkXqn=2|N8%bZ- zy?M=r>|+!2zc473ew=bMy!8@G(&db|jI$LRouk)Y*th6|%?xhFE}nfdXAX6*tvj@P H*`Z$m10-vm literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test15/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test15/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..23fb78c0f56e83814ea22ec95eec8d879e22bf45 GIT binary patch literal 671 zcmXqLVw!Ex#Kf|InTe5!iBZ;omyJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT!R#H>`%dBzqElQ#C{{%dHme)E6p6btfE573Mvkd-h`TBbR&oI<2z$6HlJ7Tlp+of0Z1I?Q{qA z+IfrB&PgmZdw;=F^W}3UW=00a#mNSV2K;Qyp|Zk^jQ?3!4VW1j|AWI=mLDX*!py|T z296t91r~k-UIT76&V)7(##ClT14aWukVZZhE*6gY@-2G3U)M|qM~1923y%R;1IOxF zuYVqT9@38-2CSekXk=KY#k%fI4K z`Lg?*hgkV$iJPs=DSn=R_MA9-pu%6aJL|gs$o%K_mbxv@|LJXn({F}ZJemuOmZ;y` xRUf%{+FZH+@*AIOoKL&>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test15/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test15/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zC*A-4f18*?ZNn=n&ou%V=Z zIEcd~ED)*}tf!#ho?n()l$V>DS7OLxzy*@x7G`$IcQF(&;DhkkLsE-NGV{_6r41xO zBFw@<&W?r(3JMCk3JT5vdIlzX1||k_;=Gm?28ITPhDHX41_n{$ye7z8g9KD(NEnEL z%;FN}2RnlVSBM*kf^;$q^Mw|t78&ZoUC=lm+3Sp~49tza3bk~ON~t@$VRYF?^T#M4fv$fDTw0-|fw_g+0`;d*j*pte%( zYu=896SoT6znN_z__u7ybKRpa=L60-aW_deWIeE?WKD@T4^U|**Fv0JQ!1%84VZ>1lgEFW%*dRSUB7*@(cVg&v!Qv1_>#%@ECA4a6DSH?-kdh zgVT_`%nI^yBZI~7d!{dKwy%GB>O)GGILGw*xuq|!ekvAlJ9sifVWWJENO8rXs%rBU zn#v;5x;)CW+PQ6XGi7-XJPo|MM(rb$-}26%llB$0MwA?^yXLm^%dtsYZwCsxzHa%? tA;g%fyLZrldon8Lu$6Ybw*uFrJSIa;ssw(-|hi^`sm&<$I1^~{{%X>;VeC7F5YhT;aIAQ5I^K4(Wm z1ziQ_06hZ}Jp&VQUQ0^@LjyxYBLhPNgD7!c6AL8n0%Ze5u)(q-EX*M139~VW$||$) z7;rUkJX*Bx71yJK)6m?^+}OzA5f*y*N#u!+_qti1PJUWtzfvNa<%UR3Kr9o3#B0@b zk;}gl?rGU+-b?sgWf~h^w%B>?j52e>_OrD&_D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT!RF1>`%dBzqo-Y#C|?! zM?(c&1?K=g0~0+16NAS2$bM#IWngaXWiV*$WNK_=co_do>WBLwEx&o?D_It?c$^dE zy>O>tPUg=#kv-3}Ydpjj3ihiWa65A55yOS=nr}rPXWq2v=)P~rw&yqhk*9079GES< z-`4$r^LpL5Ie!)JUtjAwk712Zs?&M>o99IjPFN(XwYtb_Nk~wBkw)I0`KOLOoxPoj z$Dq@q@11s>c-obtOw5c7jEj>E5)Js-m_ucS85#exuo^HkGX4jLuPi@EfQ6ZfkqsO# zvI;Ex2D}E`Y@7*g9*n8Xj0TJbf*_52EL9mhH-|h u)nFETsv~-vVW-QdZCW#8+bUgFowjle3E33U%x8K3tJv>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test16/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test16/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCTA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@8)4MagA z%))%mj)uC<0eS`|dIqKn3I=lGyp|RQh6aX)Mh1ok22tX?Cdgd!T;PJ&1);^MMF=+- zG|or%H6tqnb7L=qL1QOVV=bG1NtDWfl zV%e^(Hoot}q;0MrOXbz&_jUgJw#WO_5#`kxm;T=WJ0&jDyP9XpKaovycQlrM*^|q} z%*epFILIIX9H6rNjEw(TSeThuAAlo5R)K}zfY*SVjWeOmgE5tv(SXrFkc~N1mXC#t zh2tf+TRvyidsYKskdQJ9j{#Q$$GHV7Gk=I5TZ!ytR*;t)8LE?+!iwelgQG=Kou^KH z#rSk(yVzSc|A(L69*O##%4txTa^CIPd_~a@3cf{^UyiOz3jHH@TQ5?ZXV(>@i+2uR z&e|WR(Q^9r?wMKq1;3-y75~*fEQuCUHJ+cVckIE@_$vN|6XwmjIyZFX>w#gOubl$xJ0L<;uSO5S3 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test17/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test17/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..0b1ba6fda409171da7b544e17882a3ce4467b755 GIT binary patch literal 337 zcmXqLV)Qj=+|I>;VeC7F5YhT;aIAQ5I^J_QA5 zM?+ob06hZ}Jp)s5UQ0^@LjyxYBLhPNgD7!c6AL8n0%Ze5u)(q-EX*M139~VW$||$) z7;rUkoLjIm^N0Acm1u5eZfs=Ge8qIA2)} z`BjX$Ixyw&mereYss7!zv~smr@A2FZN0$1Y+oknsZ^B2173~oVp6(D+&r}htzk2#o zafVwmYtE6K*R}RLsZaj&?1K}RmA;}xcexdJT6dhqLJxsT(YNuUH=Z2L=E;n{kD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT!RF1>`%dBzqo-Y#C|>n z1!qS?UFQHj0~0+1Q-j9&$bM#IWngaXWiV*$WNK_=IFJ*Sbw{I?^XpEI`-X2@=L+4w zYf)c*CQxln@~o9_R3=UkKgvP@lXYlb4XY=xcjji-&R^N;4oz59^&@a03x<69ki1ii}zzwtfm zTK4;s&1v_^8i(DPm>C%u7bhDe8t}6*hsp{wGX7^_HDG3B{BHmXUs-;T01Gn{BO5qg zWEEKW4R{T>**Fv0JQ!1%84VZ>1VI}4Sh!d?&MjD(`9u8JN^nHTDzoqya5ZqOp7r|Y zq30p}$YH<=3WG+5)2;j$Rib)$u4K$%ym{Z@#;FqTzcpFg*k z>XiGxJ@%=)&a5zT>;K58zEky_t%6$_{>Wdy^(jhqv&SrFX8*9s$+P+6E?9k$y`afj v{HA1b{nX>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test17/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test17/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%wMWktf%1aALbh5=j-YhV#s5_1(M+wW_HPUF%&T1gYeixT!TYA{oD;j4TM1= z%)&g$iH5q)0eS`|dIn|&a^k#}76yg}hK5E4h6V;v;=CrvT!RE$_J`^P>nXVBm!%fv z<)-G9;I==txFj<#-B8>>6k)Wb zN!)iVBrT8cDC4`?T%huwp>p=or;<$9z6(h&@wxG*Ywx7}tF%|zCS|`Zc+oDp^IeIe tZ(4=0HQX28=*pTN4FJS|%x?ey literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test18/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test18/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..2948246d79e252f502e5ceab6c389b1c7cb9e204 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj0~0+1GjU!^O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zxWGL>#q(?Z1vD2kH#RaTFj+@0+V$-YXIkOM7g`)f=j!Y)yjIWYlAE12@1`H8NoUuF z{YP(nN&CCxN$8%3QJ1$~n3Q7jmGd2Q`}%nQY>~h>p85Yc3apE#b*y7l={&QvsWM3U y3%}g!=NhI?p;}kGTv&lwo69udi&d6$u0<}LuMgJtmm literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test18/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test18/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..eac3e8693adafb17bd6285413e5545549763f053 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Qi;LFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%YX}=VLzcw&F zO`rBtbG^Wm6Y*~{u2)N+Uv=!2ea_y)8@Ju4{jB|aw#?PPbA(Mq`raqZsWCmFw04Vc z^z!LU%!~|-i<1o!4fxrZLuG{-8UM4e8Za|5{s)JyEI&wqg_((w4IC@73M~8vyawEC zoC$3njH%3w28;%RAdP%1Tr3dyN*&dh#jlR7s-qD;Q=;ntTIF6_M47G${0@|*FwNY+`$=3koD_E=Ac m_0{=}6PC5yJD63t@ZK_hv2Sy|vdS%2xz%_!Z`E(i4FLcdOWNiD literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test18/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test18/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test18/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test18/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS|edIp9Da^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;dp{oDGBKb1hW8u5UBv@d zzfF>xBNp&oc(UNc!F)k;V<8ROFX!imPGfG!5Dk1$^y1Y{nFu)pDb;F$?@O!MgDh`a z-{^XtDEU&wbDM^D_k@DF#upDJzlu71U|zql&blwZrZv~t+e&W{+8DWD{-lx(^b literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test19/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test19/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..eff60dd15751da6eebfa8e557ee621f29a92b7b6 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6QimDFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%(tqdAM;nIxO7eXFv@ zecf6nW=00a#mNSV2K;Qyp|Zk^jQ?3!4VW1j|ARwUmLDX*!py|T296b31r~k-UIT76 z&V)7(##ClT14aWukVZZhE*6eVkNx(!8V|OEqd``gg~x!afn)Wo*FO(E59vn^16EKN zG%`d8-BXLxn!5|*~XUWXt^0;dK=e&AALHO#7rU%mw-oNPOg~dT-rvEa>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test19/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test19/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS{zdIp9Da^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;i|VO9Jg%>+w|`(%Ub*7-hBb3#F1&92`1Wt? zYN?ZEuP3>k4D}M5HlL$S&fM<#mrHNG?)P8yyLelUMd$oxHP!{KUsrFjJQtvSSa-*& zsh1^AE?wf-c-mrjpX<5Le07Ibl>a{Bx|YRw{oZ1|3!>q_`hzv&cEt01vUzgw^ZRV> z<+ItnnV1u1s+m&M*885(N%x~*)bzmC{JnD?Pq-lE zE_!Cu$-~E)?aLN#O`G$ithVIx$%*-0?XgS0aV?(jw>5_2!o$kj`7F!{+SA*(`-N|R apKNfuD@XJ|BOm)eAx6>f@AWPRW&!{u3e*h% literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test20/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test20/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..5755a2eaeede8624f2be725f06f0095fa6ebf16c GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj12a7XLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z;Al{rZnux~ESig%8ygw&oZ@=Fo36KZ%Db@Z$h7j#iOf7lw{Z*RTYcHkmay1vX~ey# zLpE0?oW1dE<*TFxn(y9qKCpjyfO&_{+nxKonya- z3h0EeEBs=Zz2&ib*#V^+ZWHEvXFG2#dMM-Yvic$Sp}#+u?qo6w=)3jq#E{2;3narW%fevkkQGZP~lI96m8SojTi4Y=7j z6WTl&Q<)hJ7!3qL8u?hbSU5Nu)TZ0*<2(zF23chm9s{lhj@7eX|2*_Oq#rp9SV3XX z$Z&D?3F&n8$+atAy~&d1XWZS(yY}O|Z_Ftw`+QmqPsZ@|9rbgJpLQ*6(sRwC7jjyY z$}Y;z){D`dV?K$)aPFPtO(m|z3bPI_(_1njaT?b;(cSCWF4(L&ol-pU$GPYJsfXw6 lt==8aSEKzlCR1^W%l?K}PmkIai?H6UoBVun-sL@Zw*bM*)zbg~ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test20/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test20/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test20/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test20/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uC<0eS{zdIm-Ya^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;I_59+oJSvNi#=X;++Aow8?U!lb%9Ca)Z>=Q!czZtl%Y;rXgNCil;Ovb`ax z^+8@*cn@pq5223fr@N|dYjGDo;e54_b(twcs#fJc4GT`G3C{nnnX&Flj@WXn@%Nqj zOXZAA%!~|-i-QaTz`-fY&&c?ng@u`k^#M2**Fv0JQ!1%84VZ>1lgEF zW%*dRSU9*ZE2&(vzA6k3cUff?9s{lhj*OZx%ZqPxw<3F)73AechQ&W-&*;gm(k|+q znRCuy&cAb?jQ{G)+4pB@myhM#^EZu8P3$Q1le1&z=UiD^^5gvH0|CiTWUQ5P4k?OX zx|5ivl`dMWc<{k9Z^I*!TT2^0B+vZbrXRH~n58*2?8-x@+iRR`D>bCH`Aqf|^=V!r Xo`0&>lBrO~wU<4oMepSdU*}!`TdvFt literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test21/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test21/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..ea3cbb9d8f4ffa3fedcedc0bce4f085729c85d6f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zUFQHj12a7XBXM3!O9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhw7Lp~vwTAC5TARwrI&O}c>|ZVGSbQPhL&N?0 Vv1^GZjVz}}s7Tz|qSPtI0|5B2YR3Qo literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test21/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test21/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..9082c4d77e3966e98440cc65357791394d717e71 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Qia9FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%Mp+SA?d#Iyi&jby4Bw&!#1R&vNo? zn{uyZ!Nx$b6knlgfzYT;bEZf9K5$oXx3C=3+#k2UX`K2{P`UPM)uNP{3Ul7}PVU=1 zO^}J1k%4h>vO%H&KO1wXtS}?ve->5)W=6*U;Lw%j2MMq+GcmG(V?|bhh2MbJfSZjo zq0NIam6_3i(LfNSk&lIog(IUT%<|$J-L2qgkX2^kG2m+8SUv0Y&qL2c`jNwc6%+=I z47<%&{fk<8X|>fYuTw7^Y_4i7ZPzoK{%P5%Li3r?dnG<3IO;M6SnU3_Mc`Mi$k9gC zbGDOA-f=!%5K*CDGd0MSqx83fzfs65epdF%HTUB-KtTRFZhk^D&q~7gvu>XrY=r>8hm@V|EA(30A63uxBvhE literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test21/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test21/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test21/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test21/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uCP&UyxhdIp9Da^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;uP0Z3>9D<3tV-f)G&ocle{n(B?M=C6@lE&B zIRJ^)99tO5(a0j~i!8)rhB2V*KTqXDCVARBY2 zEFTLO3r9|0V+%v}Onz{<%PO<*7;rUkd?|8Mnfkl+HL{mkL0)cTNH#Mv_K`kwBeL#- z*!eB@#q@UU;18Q=IrqWwu5Ul29%$qov}3<+85JI~`gcXvlFYsZ{~QAEhbt}Kze|6A zL)g3>k52qxd8YleOrx-2?qh?qXKYt)y;%Gvaz*0e++yiFQU=vktNSY#p6Zd$j{JRm Yj^o=xz7_A*)aH1XSey>))0uxB0KpZ~F8}}l literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test22/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test22/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..07e18398d45ed79ccd41ec09502d75ed3123fb63 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zT~B8{14BInLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z_)_GiGWB=sYcv-#H#RbaH=GflA@bo^mGIByJ*<;{UJ}%F@C*-}ss6(6)bZ#UYZLiB z7eD!4xzgro(Wl2dS9>hzW_)6>GVy|psnFFuaV{zmp?$0Q&q~Gz&Q82oHS4GU;fji@ zM`|KAY~=I0zy9W?Cpj54A2s`!{8~Rte4W0Hqvq?+f=&@u)5vK@b)QG88kPe9G*xM) literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test22/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test22/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..d0f401bae6e89aead5cc9b1366fc1d970ad2146b GIT binary patch literal 648 zcmXqLVrnsHVtl)RnTe5!iBa2tmyJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoJ;+vz~#W zo`Io3<9uWvGqN%;H}*0ZG(V{w0Q4>3=qVD^;g+;G)k-Uh_Tr@Ata}|N79F@MQKjE74aDy2o?f z(wukS`^F+0Y5s0~6^m-z{18z3Xgf}6Jvmm3*orm0^P`}X3>qEqeZ zYAN%yx9zPLwb)l?RgV7c*o`&VK(Ves;mO#TK>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test22/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test22/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uCP&Uyw$dIp9Da^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;wacLo46W1-SQoXemWj9<)fHp)cgrH*UmBX4 z`wW^|O43T(_+ATz*m^p^S|yEi&1l3u*k97w zj_hP&W@KPo9Appx4o+EqM#ldvEX+)-55UnNtH8om$mn=NA@x+$jglk4w+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zT~B8{10y{HLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zXtj6iUDn>e9?iwfjg1UyC+;uQJ$hxaW?_IIcUYDEUMv)zB4F-j{-;W~ zP-RirrNFuG7QPIrs$j`};`yzQaq((y$DQ9f4h!}-b+-sTUOeNBID5>&@F#_3M^5cK yJ!QUA&D0l1L_#ACRV5y5G#E{2;3narW%i$E}Yt+92lWry=$tNMJWh z;-{MuZ=Y|GIH|W_`LEsPVkWib_hfdjytesuw8Ml4a{LhnK ztUC4byx5H{XU3$M_2<*2b(&&MaaJzw+h(tJ$ZuK_n3XF{6? zV=6PF0i%H+NEaUq7Yj$Ly<6|H_Wt$YIFMCl;W6N9;8;ED_0L1kL;8^efE5$~jSNvj zok1^7XU)kx|KSDyABzvg#uN5UanK2{d7yll@lj#Df#{)SMO(W=#6!7j?M`!jHrh6= zb=5uxUWXseUi#bm4nl~kGe|#W4ckLN(gLefRIu4u7kGQ81 i|2^*(v!M6Q`B&DRljJxpv)lP(+1AZ|8>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test23/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test23/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uCP&Uyw$dIm-Ya^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;DutDa8^3sY{&(DMDW!R$#X@oF4UHv79v@w0 zG40))4d1s5E;e-g8Ti1PPF)n!MJnO!0k?=va zM?CkK7Q{Y{NjcN{EPeLu`NvXU@>rR@`SAa9&i3qSZ=JuWg{2%lXWFs0EP7IN<_d$f zdk1xUnV1~?} z>+RQ6_}B5e;{}f|3;i0O|8s8>|2|EDU+ZQnPvyfPyX7l?R4{zb`lmHR+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zT~B8{10y{HBXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z(3X?Px87#E49&&Njg1VJzo#FR{;|pJd!z2{UpFgJaUd70Pj?@gP< zKDkRRfBT*JMCGdHiQgH|g;)i%yEpn&JG}hay(5m_u({^q9{=yg|B_D%aZ6y2iEq4{7o{x)iAN5M)>4^-ASqp!etVftO7@TRQS4lD*&z!V@m)4 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test24/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test24/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..a4633ee9adf0cb1043b1362091c8637e9a5125a1 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6QjNXFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%vQ*@iD1n&;@$`?1%+&eZuh)SG&&6?o@hxv`8 z+MGI&R!|r; zGAz0{&m`vAq}z9nO_*3TyTPSW|61ri-52^f2I(HZkIma#$5o%5db)ep>^;?TQ`I+3 z+s4|s-Q2G#e6{tOwY4c$?;dCRyqxLclDnttY+?Blk8U2s;eR)Sv$R>5diYU)xZD% literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test24/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test24/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test24/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test24/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uCP&Uyw$dIrV@a^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;#@UPSwCpmgbqTc#%ZYyer0{CEhxFeg|7V1U z|M9Sh-Z8`dMtinn%imQB2fu0Vx_Irzv}gC2_Zl=B7kg=~s(#LuwCmlGd+Qd>x|^xH zaoY9bQ2qC&jjhw?XnvNP6VY?z#Hs~LY#QV&@+Yy(^=WX4)_?3c{Q=kA#2vm*Z1(fL zzM;69iJ6gsadD7A05~{h`577iv#>BTu|5DtgRBAzzX7iSHydX{n+IbmGot~cfgl@m zs4O1~7Ym2?$J+}1OS*r8!(CRHg~x!afy3@V!nex|Yy!w$W(9e7qKX^**IsPyQ9kn1Ggv29F@Y&+(_!H!m7M~8Nhj*(7;p+*m{J%Z zw9EVa%b=4P5uc7a&*GZb$r)O=UD8@iR_L$S_jH{#b@RNZ1%F)@+;HdqlPi@;)2vE< Z?!44t;c)%!Lp50io)gysuVj5!1^`6Z(q;ev literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test25/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test25/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..553e1bbd165b879187f334ac520a3cc35c4e957b GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zT~B8{10y{HV{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zuse|O?J@(K0Gf-L8yguypD1m$b#-;?oF@Kq;*Xo_m%7jTxO`>X%CbIYSNoTl_wUo}IDg@OuD$O$ yW_{pIc2oCB*|YS}TvtcL)6i)R`D literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test25/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test25/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..5d06aac4a7fc4e9ad8ddb787e616c3dfdfe94896 GIT binary patch literal 659 zcmXqLV(K?&V*IgynTe5!iP6x2myJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoJ;+vz~#G zo`JDJ<9uWvGqN%;H}*0ZGq^MoioT`amR;v8ImW;*At|7}Z;$1Vxl8^(x+WoE>HlcMgUWIR?v1BUIA1*}9X!pk zz)_EB9p`4Dr@xz9grgp;Xx))4tzLhnFM8qz`>f0ww!qbQ9@ljq+~U4BpLJ1MV`7_W zD-$y#1LNXYgJ^IJ$O^MC88CpuRhFNT@jnX-GZP~lI6h<*SojTi4Y=7j6WTl&Q<)hJ z7!3s3m_udxSh!d?><%P+yUf5Q0FD4zWfmR-t_F_PvtIu^^gN^=+4rm<-#0RtPM11q za{Wi(!mXm5KdWaj@3?rqp;Ld=WSQT0Jx;Kj^QTD`*}pryQ@Q)=-Zgz3Z35q-8~1Iw zG3D^HoiG0U+~M=F<;F6NzTQ9wbM8wTTqnNzHZdf`ED#nyd1uL_e63_Yg{>{Zb6@nG e-q>5!)vIf`;wQxy#K>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test25/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test25/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMmyJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uCP&Uyw$dIly2a^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;(H&3k#oFz;qPlycg877JOq{MgNuQlR+WiTd zF@2Bc!L7_MtDh?9Hf)^6ERc2N%Vz!8aV(-b^U}Y?9k=3+I90@ zm3MR+@8X2{M>cIS-dOr~M~cka`QL7P?0NNCqi;9sL**KVDY} zUvB+MCT2zk#>GJf0pQ@2{06)R+-#f)Z61uN%!~$%27+wN zp|X4|Tr3>QYklW>KiFpm4tH5)79Inx296%fJ=)V`Bv&GPnHA*aMuvV4?pKS|=PlJY zJC(z`Ow*R6=o!Ke<^YrAkTjjq=n`EY^FIyv%nVcBLbIx+keBG+kE8lkg z53rHDv1o(g?X8pFP2m>{+xzPLa^qk34z27U_IHo6V2|RGfdQyIMM+E?{d(%Sz literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test26/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test26/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..9f2f1b0a8871077f1214bd06608191b88cd9d444 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zT~B8{10y{H6LDTkO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z=&{_RJxxY(C7O$w8ygwIr(J)WE&S=|JZ6sxZ{z=^G79lqf0E(5*=4<@Q(E6=-z&?& zdb7Cv-^R{AC;PWva@KIRclLD2;F(?RXnp6hnsL;``0yxZM!R2z?C+#i{rC-c#F{9>vyjI$<<2sNKKivXc+*@f@M+w literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test26/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test26/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..e9c273a05285fddce0b3e1e19f192cb15cd7d88d GIT binary patch literal 662 zcmXqLVwz;o#Q1vwGZP~d6Qi*KFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%|Mr=6ji5m-`aC>(_$~iEM2y3{jBv@y^PYg zPnyqMxZ!r-(t>F}!u*`Oj_&uk?Qc+%xNR;+!`e3|4!urgRR6s(%k+iwt!0UGIpS9@ z56|pjJ{a`;^$wq=^po#yv>bk(qi5Ui$9SmS!FPX-l#^k2?lWnJZ#LNvcfE^2F#3%|G_~k%g@O8pM`~)iIEK)C9(=E{06)R+-#f) zZ61uN%!~$%27(}6d@Nin96gqMw5Q2Pt^~({tTGFa0apXZ>RGRU9(o?qj~oE3pa5uO z5M<)4obg}A_xL`Gli{212EUzIeRv*c`@9G%nPVHQ9`DJlc&QUw5U!QA%`!M^L8NuU z?Nm>%Mcye-R~fF-yELQfrge7QEARg-itM^S>bxRvKhbmJnfQr;;ZVNn#PiaE`u(p& kZ8-Ldv|P*y_x&*Y?&8Y~JAGGuyu0zk!Ls{H(gbe<09+^282|tP literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test26/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test26/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test26/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test26/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uCP&UywWdIp9Da^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;*|}0)w=~i{x)+Kc;okN4CC>`WjQD9nA%Y7Z zRF&1PUc5efNB^OhAD6%Cs}MXAs_D0I_KI2-Kh7P6!PjS=&kp)(oM|+S;BO|xPoo^0_thvpbu+ekc zsrs8t%!~|-i-QaTz`-fY&&c?ng@u`k^#M2**Fv0JQ!1%84VZ>1lgEF zW%*dRSUCI+ef)QLYvmnqxXUWD@ECA4aO9kx`Myeh=WJvzvx2uQ@sT9$tDwif7qIP2V# zhySFn^|J~q{am+9zojF3?wnKMT)S-YICgw~oKiJ8Iqt_BujKjXqE6k_$z4(xyQ=f_ Zi;a(^HSFT%@-Et&_KY`Mr)G75CjizN)eZmv literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test27/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test27/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..fd769e5f37d99e92a747d214704bf6b35d59a4c9 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zT~B8{0~0+1Lvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z$T>apeU~%tFS)~dF7U;xR(F`EhJ}i literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test27/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test27/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..4de4a9f51101e50bbd1257c926781b8009a3202d GIT binary patch literal 659 zcmXqLV(K?&V*IgynTe5!iP6-6myJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoJ;+vz~#8 zo`Io3<9uWvGqN%;H}*0ZG4tkAJ)KGOr#x z%y6Rl$c6dVo47Y!YZtauoo)K3+it_BDap;3IjYTnIG$%s|F$Kf|6bh8x|>EG9^J3s zc6%~0GcqtPjx~rj;9+A9l@(@THDG3B{BOVw;_N{tHBS2P}g~x!afn)Wo*FO(E59vqtJuArfjSQ_z zE*0lQ)n5MZc)Vx!HO_zAJfE>VV3of#Eos8RyNyMGw{r4Z7n>(MyuOsrIxtqzE4i9A zLNHP`eC0Yh;qS$ZU$i>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test27/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test27/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uCP&Uyx>dIp9Da^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;&X}Oi`xpN9)U?$6uNbz85ca%R*B6toBi^zR-QxmqD{v; zpO($gZRCmc@Zl|HNnEaXd0WzxBc?uItb}vgPF=iKota~iTk3AJ{^^{@x|WNgMXa`L z*#41;nUR5Uagad(I5=hb85#exurM>RJ^)99tO5(a0j~i!8)rhB2V*KTqXDCVARBY2 zEFTLO3rA;#wu@*C?_Y4Z%PO<*7;rUks3#oVE+sIx64}eFATKvEv@7rO_&0lP!ePxh zvJR=-^ZNK^&u`wP>8ZJLli=w~EBto7w)JZJ+*Gn-&T7`ES67r6_RX5KyHe{*ov*Fo zijoSIEFFoBE2e$g!L#d3g?+!vx@T9{FIS7RnD)xjsLn=iQ^z~Y-}4W>{JJ@oqx!W; Y*@Q_4I^4h59P6HAyME6Gm8)KM0Id$qjQ{`u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test28/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test28/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..35e87eb0bff68fc38e506d70cb68d71861f640c3 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zT~B8{15-T%Lvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zP)|6zT}ohXC7O$w8ygw4x2YvxejGnxW#}8Z8~*<065mU yklH@Bw3&%Bw#R!0{&=!bYqGcKIi}iR`^>~$(Fu7|Do!w3M7CO(?-XCcZw&yTy<^@0 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test28/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test28/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..fee01f21e73415a4f10c1381d3206359ff1f0863 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Qj8SFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%am+H+^v8k<+9M_IW#-=1G-yePYVsiN2N zpIz}!9{%5a-P>)2X}adsyGlqfDS^3_;AoIlX5lg5YT#Hs>-En=&qMl=!+;eO28|3} z-(zZo7v8)Z%N?sJvCUh#>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test28/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test28/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uCP&Uyx>dIm-Ya^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;;WrWDmp@d^>e%@rK>2`J#j5AND@yk1g{?Vf zEooTwEw@kZY(`{Y-!o;u_PdkpPcU&C%u7Y7*xfP+((pONuD3kx$7>jQ8!$SSb#8}J%%vvDT0c`&9jGa4`&2(mGU z%JQ*rv2e`dQVX;+KDZGa?y|}(JO*419AEzZab5i`G9TH?tROEpGWalRC5D!Cwnr>V zesy%qt)&W`BFqBTUuU-5k6xpC{`2|8u0O2`7(e^92Uxb8V+`MuShn|aU&+%a4%dTy zeIxqsoj+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zT~B8{15-T%BXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z`10?M>*{xr`DiX?ZfsNmpo_v zcmK+z86orHPQFt7o3vx|ON*ro7@qi_zoE}*6gb_~>XqiyGpBP-OnZLhy5@Ao30*pm z4n2Ky-BqhV=|I>qFSEISY}oCerM$n*sW5qtjf(sMPsNR)&!bO@#cZ-lOXs!&0F#Gn AM*si- literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test29/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test29/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..e830043fd99432c55160bbbf9913f38f604542ce GIT binary patch literal 662 zcmXqLVwz;o#Q1vwGZP~d6QiX8FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%)%Rd~9x-WKX-a9SLJNFv=8abBS^wf>nUSwOr{E5Lc zOvvM6ob2Tt586vjGyFT&lrLR;IqIa3;H3%S7gA&QJ=lFJVA-$9*?<4ET(RAIW9k1E z$y_F8Mh3>k2?lWn{A|pjvcimv|5;cKm>C)W8*qaJ_*qy$u?CJ3Sp^n;16~7eHqL}L z55`nxMgv9zL69Oo7A_W!FaQ3yu6`Gp4~_#_WfmR-t_F_PvtIu^^gN^=IRIEe0no^B z=>W^jgb2?ySF-+1-1gXY>kQs?A!gk(w%$Kl>{7-0&uc%o_{4ufyiO}PThvm6Ds!fK z_k3PqW68MG{m7(?*-96VJ2`0kb1X1x)lT)7_c3}?rZ|CZvEru}|0@IhvlK2Kscj2M iGTysRzN+51NPY6ATTZd6>4~D%LG1-WmTx8bp8){BIMLYv literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test29/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test29/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test29/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test29/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uCP&Uyx>dIrV@a^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;F~d@|tanQsOFnOYQNQ#;V#9XLhDdA0+G$QZ zH=dfxaXV~%&8p{qu0NbCXYidq`}kj$nFjkDHkqg+@)6846e2DtWUO}G=lQ-TeAyO( znTPJp30cq0t;(itvi1OL>5r1;DK)WCeJ|aazvMnWx+jonZJp_-Zno_U?e}lk{QFt% z-USbtm>C%u7Y7*xfP+((pONuD3kx$7>jQ8!$SSb#8}J%%vvDT0c`&9jGa4`&2(mGU z%JQ*rv2Zk6H|c)4n*9VE?y|}(JO*419N+y+7wPEBoj~?7E6B@@435%GYj|qUTkmyd zUiF>5x9h&Y8KXPfEOROOWZN({HRB0KpR8Kdz4LNS(&xnQ(Y37pe~)-5?^cM2U$+09 z<5ZWKF6w)%MGtOTFJK!Wert)}ybe9zKZ-`4jo+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zT~B8{15-T%V{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z`0i)ANJn4p1e%MP8ygu^N?uNW61c%uHt1iidf)`Zj0=9I#rLn?T2xcE$@fo0xwecz z^@qJ;FEy3--L<*#N3ywgP5#CJwrejKdCx1X3O6cDpJe&uyv ydd=$WH+EOoPUJITOnE$abxo@1p-10dUQX;%tKL58dyPy>_t}W3gadI7Ps;#L#A&Gj literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test30/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test30/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..26fd2cb6a50c41233312a360ec7fafc5e2b45fda GIT binary patch literal 662 zcmXqLVwz;o#Q1vwGZP~d6Qi{OFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%^Un zkjyyaz;1?rJ`pMT7mZ))FQ{J@`0O=nSRlK^i@n_vXYM@b&zryL#6i&?lV|aKNSS`@ z&9T5u442%F?8}#)JhfP~BE?Jo_|^W+XIJ~>c*hH*GPhn(=sL&mtmm+KvL#D|Ow7|) kZ;F&(>)#d0+T3B&6c#LE|LnMr_aDivEm!V$oi$Aa0QB0?a{vGU literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test30/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test30/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test30/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test30/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uCP&UyxBdIp9Da^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;+fb|6ordOLULQKwY&pRyXW@sV@8(Edcyw<{ z(nDqW-TxM|)T$a>U;5{??J@a@@{RHtj}=wg6=sX@zUB&(N^4>8jXm7)?8Zbh_vWdw zn>7@|HFQ|JXDw;lXd~*-e@W<1ve~DcS2t2yrV9LLYv|zdWEb8iT<_QQWpTt^wJ+W? zUtecpW@KPo9Appx4o+EqM#ldvEX+)-55UnNtH8o$cjmwJ@E{g45`CpP(YP!tUa+Ts`r@lNt=(qQG+1*JiFLuOg z+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zT~B8{12a7XLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zxFS&7zo=-w9-51p8ygvp)Y;EsVDdj_ZLd9lMr``R{lQ)fl7AkyJo$EZ(|_|u)7U$* zZi{C9eroydk@DAzclnp9K0c}1)FaDoGw)!z%oA;q)dlDB3->?Py=iN=Sj4+lqxDVB y@ffckzJHb&#p>3n#E{2;3narW%(XD_{)4*J*9{yl=yF~Y-tJ^|>a^LXq@5av z%Po)Yk@*#=e{rSP-*X3!PO9>YkUg@jcg@K-NwHgY`&+}z`nK*|uvEd@;JIwkrDJW^ zZx!Ben!1!nW!a~Du5%`p=*-o;Xu588g!`vxxz8`2np(^jUh!hz$qFBaeI^}`F6~&) zRAJ1-%*epFIN2c4fS-*yR92Xg@jnZz0W%}xe{kr^@`D6en3@Y&IEWsmr$=kxd8aDDJ>TKb901?J&Nsh?asq+Z)5D%=U% zVRGm}hS9XNV=9&h4lh1r=eXZ>qrdkufz8g*vlYBI?q1X%fA!lJX&I3>A#*2eKK15m m?Q#chiJi$Cil0rc)cvr($L(8Z#gmeIfwK>2`Jc@>(FFjF@Y_BB literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test31/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test31/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test31/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test31/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uCP&UyxBdIm-Ya^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;Nse>zb*3UW>;FVCpM23#lKXmE#>-iiZ@Uj^ zy6;Q;#q`OGXLW238`qr+JsmZ(v;+)!YHY*uv?EK>d>rQ;{v!O1&DYkn=m-P%;@@no zt(_*h*~eMxORP7(G|1d|pmMX7!PPqxZ*25eT)prAGZt5#D=8jIaW{BkU;=AIA!@68UM4eFf*|}07rwY0t>$ZuK_n3XF{6?V=6PF0i%H+8*`{E z9}5=?M}qm~7LT*~`QUJuRc7Ha;A-G_XWMNZFlU1wvX@ywUT$PiQ@qS&bS!0^_i6s! z3JS+JmruI#uv7kz{D$p}_OrPK+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zT~B8{12a7XBXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zcxT&f9WZBuADWAq8ygu^U;MsZHFZ0u%pR5V`OD_}bxRnPW-j@9E${ZL`OcLy7~LH| zn!T5euz7mUp&)xH_vBNmvO&q$J8FD1cTarQyR`O-LN$M4ZfnYm^aWn;n^|-{wf@fV yv@mWIP*wfYc*3lD=B9$w#H;e!CZ8IYWM15L?sU{XK9>pZ6L)Y`ytUt5I2`~jCT5EO literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test32/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test32/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..6df3396b79ab1172d12c26692912fde73d2690f1 GIT binary patch literal 662 zcmXqLVwz;o#Q1vwGZP~d6QjKWFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%`;FpnW^CLXvZTn>^rFSf4?kDUf8o7h`JJl=F5cnb zWmLafpPy~{YU^yDzPmyH71!SuIG3Mv%Ky&AbxYPC$u{OF3}HP~A!F!iz@8ZMRkCBx z^iU>dMh3>k2?lWn{A|pjvcimv|5;cKm>C)W8*qaJ_*qz(nV49>Q6j6r!f(K9z|F>) z(B{FI%FJlMXdnnu#K*$L!tu_w+d5#*20w5d$SSk&7;rUkte*Ay=b`5z{m22p3JQQm zhT0;W z1I(92#1FkyE52}V=l8icU(UAwBXen~+q)gVr;BR6nk!|<ObeKetLf)4J@GQ%b>ydyDR^@7Si=#k4pL0G2n>F8}}l literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test32/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test32/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test32/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test32/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uCP&UyxBdIrV@a^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;wt^p7`DNj4)6%oj{~WPSxFRK^uvW8n`F5PO9_37&@n`zef zXB9&^6Eh13@}VCN!$r0mF%jmvF>synmdK=a;=)Y!eYm|4=s5nV(+zC zV$wTeLR{ZJ-Qu%y@e%EWlCUif;h&!NPq1^z{B`ndWSLVOt3-y^vG)0M6l)r0bxi%$ ZU+J@~|4_$~(2o5JQns3VURt&H8UXSr)HVPB literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test33/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test33/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..4008e3d4680ec259e5b4de487dc6a497a5f8cbf9 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G zT~B8{12a7XV{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zSk9_?AUEvSVKf&rH#Rb8XjO-)nHH|NzI4YSrR950_5b~-BB(4SY{peB=r$`n?r23> z<+q|lx7(~&D^J_Eb6pBPIALL;%-ZQE48@LTc-^hLc`u}4TWwiHkh{gd;AgtbGuzLo yHn8SBK73&cON6p{X179a(d?YSudFVK`oA~bU3Hb^A8W>hnufaFAJ%bRn+E`4L}iWu literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test33/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test33/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..ba183696eac73a241f305e2325801b1e72017455 GIT binary patch literal 662 zcmXqLVwz;o#Q1vwGZP~d6QiR6FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%nhAmwZWnr=AxSv+kn0 zme!g4k2eKG19a*S zVn#?E+v@A?PoFK^x1jdN=1)QQytkA}?kF_TU+L@@!SA3~km%*vx2&1xOf}1w(CdYB zt#7WkuRN9C@z)}L=Gvz$-D_Wzw|vcS%>JsUR-5FqBRx}Q{o7;5_dI^YqToOKn8UAV j1p!@F!JkJio=D_YdF4Fs_Ur0=7n_@zk3V`D&r1OSo}>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test33/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test33/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uAc0eS|8dIp9Da^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;7Aardf_?ugukjwVzZAi8*iN(b^m%E&13&$q zT&d9K?o^STw&R`t%$pYiRJ^)99tO5(a0j~i!8)rhB2V*KTqXDCVARBY2 zEFTLO3rDrmC5Ed}epA5VF00JKW5CtGVI6AqMUI)J1lh~1ATKvE?42j&$;>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+14BInLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zunx8QBFD^9g63l8#zqFYYu63Ee zwaY=M$NSgayICm>50*ZE7jWhCv$OZIj>~T8TXZrpm*ws2S2q@J^AyULk}*#ye)BT$ z(bm1;+*7*t_+O5*oO8UA!|BWY54{Y+KhJuZ=G@RZP`ds6mniuaCH+2=C+-3O4uxuo literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test34/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test34/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..5657ddaf6fdfdc9c82574b046d3d1b236a9d2830 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Qi>MFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%9!06hak zJp)67#`(xTW@KexZtP_+XzXNaY-G4NLBdltf-k1xQwigNd7ZL<%a3&C&z_rJmhvgv zK(ha>Wq#NkKdD7`Uj@$1eHrboV7%*Y(x;di^DhVS%JLVhFXU9&XLM-Nt;b#)4fW(J zml~}9%{`%X6$jS}fBAP^Mbqz3`N^~BYKrpZ2#J?v;u$(A8x%^c)|9=kyZe^4XJ2e( zDHAgz1LNXkgG2*>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test34/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test34/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uAc0eS|8dIm-Ya^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;g@VZ}*GlJCzjZKtp|CRceDH&#fBow(Z(nqK zYrjWjjmOvA%F4?9S*uQUR)pxtuMofg%Jiwy%@4Y3T_WE}u;-esIkcZCz0{z1N%Ulm zZxR_jFX!uM#Jo+Me)L2_l8KMJudPw0tH8_G9%75%>Hk}$_iOsB&;Cck{x+E$|GVbR zpX0tv%!~|-i>(YSz`-fY&&c?ng@u`k^?`vP8*`{E9}5=?M|Au_7qxqL&w|5OR+)vz zfUALHq0!W-^CdV1kiEtV@>(N<%?z_g>ppP$Glj*t>Ym7`-d)({b6}aPkHUPnpDfSU zE<8NnVW#)$RHtJn%N(so8`*G?x-yL;NJ4SVsBVwo7U_1 zDc4-~zgfBJ!~!nv-iNUCP(DoG~B%Vy<_%f6?eI_t9_mV E08%p0mjD0& literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test35/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test35/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..f7021d32c0e01d892270a676fd63d5605241ead3 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+14BInBXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zSZFkL>U;@K0W=pgH#RcNzo)m+UNYg%eVO+3D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoHmF^w{4MdHcabBfqW#J%7S4OJb0;J*|J^9` zyytTI`L68DI7A_W!g+^1S z&X?d600+0MG7FCZR|CiDS+9Q{dLGh`>{nKhUmF?tq|?h+%wNCKs7B8@FuNgUcShl1 z>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test35/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test35/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*jz+ox0eS|8dIrV@a^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yETgbNzyBm0?=m4Ugjm%*U1lc}+h;qaE}{?lKXU;cQ^g74+pjZa>mR^ogozkKZ~ zg}5}0U4m|Vj*1Deg-X~Ner35F;`Bd2tGC|D9) z&!ufxKdbf#`hbm*}j?P+|ABPaDjSWeV3+VV|xbY(Ii#s|_lGV0$pMJ4?xNGpnSJD1OaCY14M#U75 zJ1Lr1CKYb{@>0c9HS2Nn|0UT|jz?H%%PD>0=KSmY+HRWu|BARB$GIZ3{@#lHUMzfB Z(SOMd?yS?!jC+K-AI;nT{IQT?005Y#&JO?p literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test36/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test36/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..d4ad1013d5729dbd068eaadac60d34b9cbf07de0 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+14BInV{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z@HxHHapzaAJTw!2JtU7_I3rn_e)jI-wz zhgr^;P&%(%E$yE3wd!pqhtI_PEz<9#E{2;3narW%9!06hak zJp*Hd#`(xTW@KexZtP_+XzXNaY-Bk7w}NM1`1meedOir$qia5&3Rd8Z(LEnd+xOL)>pT* z9eUTU^qn4YK4E>+6a)9|wH=4c4ou&Y6z zS6`W!85tNCCmSRh@Ut<8$_g_w{%2t|U}j|e4-Q>fevkkQGZP~lI96m8SojTi4Y=7j z6WTl&Q<)hJm<$9#8u?hbSU7x6?{wVxl`9V%4YJBCJO*419II!&{(0zmNI!BIu!6#% zkzt4C=h%%8K5sse*b>d5F@CS|Eni!L;u{W5vEjn#^>)c^e2o%(aM_NsMdK8_C8nvncS m_OCIE)WS;w?ru-jSy literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test36/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test36/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..d45cedceef685ee994b5cf04bab7138bb27057fc GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-GBf+14BInV{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z(3J={=yd1AH#8SBH#Rclp1AV+WYtoQB_F=)DVr`Y;jlk^dSVTS;M4p>Th*Ifl7;Uc z+dV$R_5Hvx!RpBqrb}0zjO<+BvrMUScU9YUiwym+_VrJ)PRx4Tnbh?7*I~97Qzn0Z z8$3^KZReMjufJz%-2apGcIkmV6LcReTk!9;+xsIs4oa8Ce4X`?@6Y}Iy0RSUM Ba(Ms% literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test36/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test36/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..87c8253c3c68fcd3c0bb803c3038c8c7b456963c GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6QhR#FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%#4GaN8eR+BTI(dl>=voW)>3h$v-U>mlTL=sOw5c7jEj>E5)Js- zm_ucS85#exuo^HkGX4jLt}H)DfQ6ZfkqsOxvI;Ex2D}E`Y@7*g9*n8Xj0TJbf*_52 zELon^e&xzT4g*$D7&J0WarIkSE?a48eb83* z_Xp3mz@427WU>l$EEl<^9X;Q(S*TAk*70rWe}kNLyA~HskJ);%F>6!bgOeXthT8Jn zotXanr_^jK%flc0Oa2^+Iwbi{_0{>!9HdwaU3F22@0r|Z9uQ9A&k)6a$g literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test36/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test36/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test36/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test36/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*jz+ox0eS|8dIly2a^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yETgbNzyBm0?=m4Ugjm%*U1lc}+h;dT7$$x)YrzL_E2@9m23XI@L+d}F7_ zIq#H^ec6-Zb0sgS-j|IN%h9OGnk*!CAa7q7=S9sz`@nN*AI$yh$ zN*{hEW=00a#X$xE;NXkZXqxGVPW@Xkx8JWWM XwsO2~Q_HiLe)wjgaF*@682dB;!2-oB literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test37/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test37/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..6b488fdb8f7a003e312f1a8158672fe087871e98 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+14BIn6LDTkO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zXuPWXrB3OU51Naa8yguW%I>J#G=GnWGqc0)jcfEKvc3PeUaePUJJ$|}e_iwPkDbvE zQjI?KSXT9&tN-(R?VA{9Z`4r`FmyRDy)^6L<#itmwz~HHIMTUi**P^~AIHx>Pdsy* zE9=s1cU7|G&Ye%U|DE4{MN(|4#J)o;UReq{6Eu6)a`P0`_vGE^s=n&8ZQCmV{Qzok literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test37/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test37/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..26b6b96053ecfa7dda9870551ece15646a54faf1 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Qh>_FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%9!06hak zJp&Vi#`(xTW@KexZtP_+XzXNaY-HHmEX@DOj{8T;{M!D4N!qH;Un@7f_dYv$d12Gu zdtvdiMQ&FPUvf6|H#a!#d3N(AO^3_XzgE9_{oqQrYmS&yLivM>Jr7qcSuADvf9C_g zS{|i!3F+y5#~q`4_`|*!9w~h4?7dQ9^G(-+yVHJUH%aH;ms%nsVDEY^-qYj!Tj8Sz zw3(P085kEQ8zdU=voVLt3NtePXJIv9W@P*i4qaJ(kN^ua6C)cqR%8`e_zidsxY;-p z+B_IjnHdcj4Fo|N`B=DEI2y0&eyLM>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-GBf+14BIn6LDTkO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zkX-Y6`x8MEO*9uXH#Rc#P1T6i_##_(ZFY~Tn2IConiF%97kaY(4f)$vkoI%xukRA8 ztDp8a{m{=UpZe{IX$o_*X~PGvUr!%<9MO>BY*klRbjaPl_TZcyMyY3ojp{xh62I;z yu`za*ce__#qNC4@&63x{kBjMa3SMC~w!13rGwE;heZfDETsJ5r+37c)UIPFNBxS(> literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test37/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test37/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..c0e986a08e0184b8cba0176bbfb5355169d2d6b3 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Qj2QFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%trigxcA@1?Ol`7E=e#PbPVvS z{>`o8G`C!}Oe$XJvHTp(MU9b8HdBs;cFYl58TpAJye3V7@sCt^#-auGvs^dvmL&Bb z*>=Wl%9hD`uik8T+iX^t|Mu8U+5NiJC4a9z>v*kKt7P`Zjbo`N6Eh{ z=1^H-M#ldvtOm@CjQ_!*E6WcOU}0urWCO>FtO5(a0j~i!8)rhB2V*KTqXDCVAV?!0 z3l|HA)akNn*E-5wLR+a zhg!?aXV&#Hx7Ld;?dv_G^wY_1%bz}_&C~YDTc~_aSE*pwzR3A_Zm{fI`IM4qF%#cI XSu@|i+x2K=@%H_U1t0h4$JhY?3<=M; literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test37/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test37/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test37/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test37/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*jz+ox0eS|8dIqKja^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yETgbNzyBm0?=m4Ugjm%*U1lc}+hVNc`y#IAi!y|SmbGdKluZtXki2 zV@mb`zxM`x@B3E1a6dV{G~wE__s(MPL!V9if1)64e$2~;z}`8#Ud=zT`k;K$Oa4{U z-l@jy3-j9Wiftj+vCWM13@8|je3n+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+14BInQ*mBPO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z=sU1@)|nd|#b_>OZfs;o={dW!izS4?X-svrt-ahDY)ws6m7G4xec$n07kp-G^hg`*-dF0Gml_ AoB#j- literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test38/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test38/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..c8ee614f43411d66817d982ecd5a498d6ba6297a GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Qi#IFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%9!06hak zJp)sN#`(xTW@KexZtP_+XzXNaY-Bik#?d(Z&lG_t9#+pkt(sP>HO=_x;!mvGnd=Ym z7${qA@%i0fA5$Ox?e=!*wdM?&?l;6awe$Th2De@IPW>00pz@Z_&*ja}b=w^Cj(-rZ zX>Vuz$i>v%yT|yAeV^*(`2BmzWW`kueioUO{G-6TQ=$1of5bf2-ReR5u@lqc>^W;L zGBGnUFfL9uNHpMQV-A%SW@P-&!fL?G$oL-|y0ZKr0TyN^MmBJ)$SSb#8}J%%vvDT0 zc`&9jGa4`&2!b^7v2d|)^c`3{>&y*~VsJFbDzoqya5ZqOp7r|Yq30p}$YH<=3WG+5 zh@*@p&)p5=FNM$K5Axr<>wd!j=>O6>MeJ+UR^K?b%Id@>KdCQMva%{5!68+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-GBf+14BInQ*mBPO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z2w+*?(bPC&2AYeR8ygv>&b4Y!`v3XjdakRc+M&5Q#b?Yv9SCg7jtFAD;$_GA|L1{) zY;5}#k4oon5;^s_Zu80zL5KU-{nov^sPu79$3{~@?P;m15;BXP{a$9C-0*(OMr*AZ yI+_P#%`3O29hJ6!S7z2bIoQx*EswMC)vxmHvaX_wOwt)z^rxQM`0ucB@GJl#SY-qN literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test38/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test38/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..8d2834294795fe914189521832a743af674087bd GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6QiF2FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%C~Z zZcy|}o4ja8-dvZK`n0*NcM^AG-F@n=`65>%g>6@g=`001ZOzs-%G)a^{ahU+a76IV zlUwKbxtbq2<;iNZB;4Ah&phG%&)n3qB~v|ef4?@(cAgX4V=DfXiJ6gsadEOiq5(e} zbEvE^BjbM-Rs&{6#{b~ZmE{KsurM<*vVmhoR)K}zfY*SVjWeOmgE5tv(SXT75Tuch zg^PtFfMtD0Q{#*o;AoIlX5lg5YT)QQuz1#)8yv;RVZaIsgGPqza=QywcUJG1X1{4) zgI~}2zYM-yO48>Ztu37&A<7nYO?{JG*YA+yMiH}T&bZNb=B;+{&vkjL^cNmD&CB1m z#pRpks`R)yP0AXx>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test38/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test38/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM#E{2;3narW%n@0l63r|d?_k(dt$Uv{n* z;=j?Xl{=F!^1-?$A*SLx?#`C04tb<=zpG@^1 z=5h#Zyuz^d)y69~&xpRs;MJbwX__f<;)RLXDz+a*TSD%g3TW(Msoq6=J~az^os Weks%~`+75t=cxII1+tO?H-!PiL(47z literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..f2a01385e5cebba4c715db163b62cb2df7e97a2c GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+14BInGjU!^O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zsO?_u6?FJ=Bbtku8ygv1_UZA?zF)|2Bdg^8LH~ylOwJ|7yJznbNZGS}vGe7Xl`1!; zm+i0bx#=%ro_uH5vT*;%0`Ff*ohfs!%SOz-@MWcU=)=u3zbXpZ3Cy!Ro9bw3Ipg^M za|;Wdmg#@mewcmocE>*HUcC#>CTsSkE%ixQzMyi7dbi5VN!boOH|Ewff5`&?#hqxJ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..b7003f7ebd9a6325a2a9fdd249d5f7457ba9848e GIT binary patch literal 706 zcmXqLV%lfW#H7A}nTe5!i7~){myJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoHmH5^jchIwa(XwtV7c?| zg9eQZH|{F3O_iLvSfmf;P+Q=H$C+#|NJjtV`*!;#)%E}8yS9{Ke%2=;nYci zBylEYMh3>kjok)~9R~bt%%QTvjEw(TSPhsN8UKUBSC$_nz{1SL$Yx**QlP+MW?*8# z&BmF~=E0cC%xJ)f%wa<2Fe7tV3i`B=DEIBL6Bdj%c7+z5^@S!EU;1Fi;+)w5pz zJoG%IA33mCL4noCP%kYl{VXQP=k8Xn9S4`EwfywW@cG-bq%kbOHtWOEg{c!uJ5;O} zZD$T?d8P8*|A_V0WTqu&o-ZhFWAvDFJZ)ipbkl~%9BT}JUemP}VSM~Q@XU|Bm6q#{ w|5lXN5y|V<7fstLmUONs_3MIjUzc4r{&Drg38gCyRk~Lf%(|t+l2Dur08}*K6#xJL literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..b6672d85a046c2816274b562480e9ae30aba85d3 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-GBf+14BInGjU!^O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z5IB^-2e zk-eUybXug7^mJe2>9<-E&PD$#uZ>?2J+t=aZlxRcPnjIGH+bA5EVWu;@mHX?*U2?&lIYYZumAT1~jvf9;=Hp4Aiak4(i@MR(tsuJHf>{5@wA literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..c56ce57f02757ae953cf06bec1ced9cf3932a32d GIT binary patch literal 691 zcmXqLVp?y|#3ZqRnTe5!i80WCmyJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uAc0eS|8dIn|&a^k#}76yg}hK5E4h6V;v;=CrvT-w-ggs{JHKC+J)Ss9oc zdl?KGJDD0A8TRn*ni2TV{M{|FsgisSeE!qAW;mJ7Sf*0-UU5<{*4TPglX}vnT>^gOT`LL_hpp)iv22Ob>Ohv{5!T(8!lr~K6P2ch7$eWMXDyU|d{lP;J1^ z#vCdu%*gnkh1GzWk?}t`bY=NL0xZl-jBEx5AO#96ng;3y+-#f)Z61uN%!~$%$Q&kQ z4zqzENCzJa7Ym2LkyIa_nM<#NBS==6g~x!afupv2wO7#L%Z@19YdWqhsg z;?fk+7kWRhX8VafOX@72@P59O-tvdNEmNaEyH9wp-?xD$*i^d7YWC$y>(!GIw%V;L fk>7h#bH(obi$_~`F8?Haefv7Yz-5m6FNy&GP%_zW literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int3.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int3.crl new file mode 100644 index 0000000000000000000000000000000000000000..453420be8d2426f5aa1c81bc9ffeb1898ddfc315 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-GBf+14BInGjU!^O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zxYTKsD8|9R7|q4Zjg1V;t0(x?wsWrw7E4)t?#DZ?OPmL$i)IPO_-3?~UB8?amTh#q z>DyNYr?p&HnWWw_JAKi8=oEAN>9cchW_a?Q-zhos`KEvlewD0doKE}IIu#S<8&?nGXQD_ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int3.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/int3.crt new file mode 100644 index 0000000000000000000000000000000000000000..ce1224adae0b5393f2ff63415ee64903aaf79951 GIT binary patch literal 678 zcmXqLVp?R-#KgUTnTe5!i8084myJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*jz+ox0eS|8dIn|&a^k#}76yg}hK5E4h6V;v;=CrvT-w-gjIh6PKC+J)Ss9oc zdl?KGJDD0A8P+&0GQ7BE({$DuPW?Ytn&E8>GZl9!Q7K6 zBFc`XDN3mVLqlon z?dF78&PE$AF8%s4C%66XpR-rXr~i>v44fhBe6H=p+EwdvI*PSs#xpT9GB7SKFvv6D zXJZbP6=r1o&%$cJ%*gm39J;dnAORL;CPp>`Wsm{|78wI618z3Xgf1xO>q>c8UkGalR* zjBmS`-hR|))uUUx4nB|;T_c!jwWa&a%6BK;`aR>YczW;4QpGEb0qOVVe5wC8?O@Uo zuJyU>`;RV@*y67>Pb^b#zP3^0#HD+7=;+5sFX<4q^EfJQ(IfTdE<+I8>C?}{)(-ZtmC(08T{JX#fBK literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test39/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM#E{2;3narW%#Zc%jWP+d9>AH!sWlKI3P%QtVzT6Eh{ z=1^H-M#ldvtOm@CjQ_!*E6WcOU}0ureE^OXSp^n;16~7eHqL}L55`nxMgt}TL6Am1 z7A_W!|9aK8!Y`hv14o0bG7FCZR|7|Y(YkkXF3x+A!+;eO28|46@x>*FW@oLfu=rsg&z`x7?3$S^f=j`w)pd^q{5gsXhAhGl8QkI^81AA9E+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+14BInb8%ivO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z(618yxY7I)3!00W8yguOu?4=55sbNB82Ro=Ci8*AeImj9bIijIv-%2#@BEO!=$tHY zBEzt+&LSk#m~nO2?dKu8cP-LNRIKXX5UX2R8yVucaQhRNTHT8W(s!y)aJRiPXrY4bo)_5rGWV~De8hg%Uu-`dPcrshv<&Y4duK)L(_dABzmyUe?mY15s4f5sw`TYN literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test40/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test40/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..5a8ac50060f0c3c96e00c5feacceffa3fb18e5f5 GIT binary patch literal 691 zcmXqLVp?y|#3ZqRnTe5!i7~{0myJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoHm{p{os9AvgnnRYyLdKfrsm+eT%G`-hSzmYnx5}w^jO&-K&GI@NW4f z%EZjbz__^9pxS_+jX6|Sn33^63#$P$BjbN?=*seg1X!4v7}*RAKnfICG!4`ZxY;-p z+B_IjnHdcjkvUAr9A*PSkPbc;E*1{`D&dbC%`dTlBS==6g~x!afn)Wo*FO(E59vn^ z9ad22G%{qC9B{F?IA=-3T7$butzUOM4z!RBxp3%WUHiOQS*)&eud-fa(Ft*PHp_l* z{^Ra+(-&Kh-xab=wOo-_%sSiVrSI|LgSyTK3K#o)RahOHv9)25*FDxlHy#-Fdrp2@ p5pNeDTPGIoBj&y0)V#b*tBEmEKV$lBC%Q{3gkAhv#uZfc6#%LN)B^wj literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test40/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test40/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..dde5a124c9d4ab9279ebaae86c1a97ebd5a9eeed GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-GBf+14BInb8%ivO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z@SMkJdU3)z7c>_$H#RcV8*MPDdV1aYBv0A)MFA19J=eSM86UA`aa5B2nWt%6D$hG( zvE8Dt=4LDPmfP>x8#FziZN`Szd6|dS1*>0KUEk0*eeUJu-U@rY_@?m-aNH?5ek^dO yLD9kamu}x*(7tfzhpM@bM*YUq(^cD@HrwD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uAc0eS|8dIshOa^k#}76yg}hK5E4h6V;v;=CrvT-w-ggs{JHKC+J)Ss9oc zdl?KGJDD0A8CF~WuQ`0Lv3Z)XUv_NqZSD`u4J_#r$0yYYhgtv02)T7gz4*tMvJ26| zE{`89^w65>&F{HwrcHZ@D#PV3Y@NEns~3EpIdy+{UDI^6?Od&Y*O;6<>CPoLLw##( zZA}2z^J7akD>aq;Pwv?j?RBcyDoEy6YS=GHm3y%R;1BZT<@W+kjmspSkgcTGZjSTr0_ODew(K)Zw z^(|*-iPIEQ)3-DArLV{eJ==VsbZ)_Zck|t6|NJcG*yL2dE9UO%wr8xR#>@g?&PwL< zI5wwF{kHr;DnqH@+66Q3FWB6s7b5SP>t}l2q*%Pv)W&_a@Y+>V=PsDSGXJdg#iUmb ZADD#B+r&0Cru*uMUyJqP%Wo;w0|0-#$xQ$N literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test40/int3.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test40/int3.crl new file mode 100644 index 0000000000000000000000000000000000000000..713fa4bbf1fcd5c90a3bf892fa3ccdab0cadb423 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-GBf+14BInb8%ivO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z2rydrPR_-7FPe*)8ygw=_xA`slDm@GxpYg2*s`;0tS>*i_*j#fw{-i?PozuNJ6<*Bs2Lj8`b;`?t%*ortkYM+1Wfvnk8Gsju!LCVuV zIL@2!#E{2;3narW%SZa9Jw+m$d$$({-YU{p~+#{G0diOvkE> zmkzBLUO5+4a^C8GZ*`@EhKt$L)KIpPfs}v|)I> z_D9Ie+Z~j3>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test40/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test40/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM#E{2;3narW%>v;ag_J-l1DJv%P z#7y7Nd2)F{utXqlLwBq4#JGm8E6NwrY@~lZF@AsF?^)07i>bbeOw5c7jEj>E5)Js- zm_ucS85#exuo^HkGX4jLt}H)DfQ6Zf^#M3mWEEKW4R{T>**Fv0JQ!1%84Z{W1VI}4 zSh!d?tV7PKUEPqS1daw-WfmR-t_F?+(eWwb`?Z!LhXE@n3>q2ClK-|VrYHT_(|9|u z`k>$f$GsQsXq@=+hW)g7d9VCW&8^Nts|@~}ve|dr>YC||i5t@AMZG8tZJJ|YS88`j zc@D?HOHZB%=-pYgUi6#nj}@JTYDFoY{tNSUs*WiXuGhFOUtD#i%UjlR-@g7#o8wIe W&Z`^+N(_>ZS|m3-Si$sk#aRGB^U+ZN literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test41/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test41/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..2d4c41521ccc068a59d494dbd9e45880e30bea3b GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+14BIn3vpgcO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zh{^u;gY|y+DKr-|H#Rb~`3MVtWMh2$P5r$2%BY9e8FwD#Irk@V{_;QXcpJNK`4*?= zyn1tNvF4wH3rjEDO@8?F%BgE-b}pXw!lrP`GWIR({omAnH;3w#e}C`J@NM}<=bSZ1 zKU?lhxVl`qWOd%;E};*fBqp4Hn!~qAEw0t!*j=R?VJp`z=v~@1E%xHauOaD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoHmlh=2Oz{pjB`u?_*20A#>Q<+3rHzlmB1cV?QBujmMU_8y8()HBI@w z-L8m9#6Z&cWToAtsSS=|zgv&}yreW&Biip1Gq1z}!zm>mm*;=oYEi^=K4(Xt@OqI; zUzwO085kEA7~~o7voVLt3NtePXJIv9W@P*i4qaJ(kN^ua6C;~}GDv{}i;RJk0XG|G zLYoI;Dl?-2BQl4{KoF#ekA;hcBPRRX57ztPr@(O{tIWbvoIE^85;xdE}d5 z9v6Nt|2Ka|wYm4rX$%>ezqf@uz4F)Cwf+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-GBf+14BIn3vpgcO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z(Dx}4ZAf|W9L>edjg1WE3j#K{2tRFDzxnplKy|lA9G4qz8aW!wov9?V^Ox6ygZr6U z_lwmPtJWkLD?Zz6e|M7q70dr-|IV2v^q-h-r{$K|`k?7|U;om#@qNmX|3d#UO=Amr y)h_+@Zmd{CirU+c%GYBe*0mg)bBopW!#E{2;3narW%ceCDM!?@o)9!Oitd*B%HDS?oZaAyZ@h>n!3SZ z(G{aBznFSew*=UUu zi>o@;E=k&PaHB8Z^>r*^n!iu5n!QSo-xP4rX?sQvW6*Qy>RoxROw5c7jEj>E5)Js- zm_ucS85#exuo^HkGX4jLt}H)DfQ6ZfkqsOxvI;Ex2D}E`Y@7*g9*n8Xj0TJbf*_52 zEL_RJbn}To`H9wStp;SRg~8!lT}-$ z%++2W*pT#hQPOjFKkl#RKWl8zX7QgotF?MoM~u^a!wfmCf4mpwaBZjwWA164cBgKE W3;Tp8hu3P}`Ty9@tY%Kkll=gfm(Jk; literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test41/int3.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test41/int3.crl new file mode 100644 index 0000000000000000000000000000000000000000..d26dc1b750579935cf36212393c7512bb82060d9 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-GBf+14BIn3vpgcO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zI1nA5BEDa1DVmF!8yguWC4Aie>gTt}%q1(AeM_0V@P9pP?P_zyy}F;+-}A^Vu-KdX zc74L5PZzG5PM9x$|K~bk-u3T9o7ZXDx;#28R`%cfutcb>>Z3i&+@x|^K9=q{axN|X zWPtkR_!}oOHHx>Y%vpJGlD*q@LHEP_ae~*C^=?g1H8}foTA<0)*mw2cr#E{2;3narW%MRLLpqa0*Iw#>b=PanldPbf4Sa|7{Ir<0pEIo6A;)%T z<9^v?C5yhdHu9a4SXi6I;8UA!6EqrU%lbkLn4(b1Fd5xKofX!f1| zAueJswp*lLT@je_Wp%O82Gc^dBeDv8I&RS$XZo;Y-RZ1c`&!4HiJ6gsadEOiq5(e} zbEvE^BjbM-Rs&{6#{b~ZmE{KsurM<*vVmhoR)K}zfY*SVjWeOmgE5tv(SXT75Tuch zg^PvbKy-YH_t7J}ZYdG}mdbBy$ XtkUR2$3cygbN0r6U3;zc=;t2*a(UF3 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test41/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test41/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test41/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test41/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*jwZSR0eS|8dIpvTa^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yETgbNzyBm0?=m4Ugjm%*U1lc}+hVMkv-k3o>HyE*%}wRg_zXQ^mfaQ_OHJtwfc zaM$)1d?sJqth==QIZrch5?}GfZL-P3tKTKA@hx7s%E0`SoT9`{!NB09zPYPEYOyP7 zes3_nzfP<@*Z0Mt;|#Ozrtjc;eXj5H)d&8Yv^kUoB(AS+m>FE@dZU4H@t;uloYuo0 zkN+k!F*7nSE)FsX00*ZmKO^IR78YhE)&~ZlXpmK4;Wywl;AZ1YX!Br9Wo9&BG!SHC z4wdC&;bP&CoFs9t{JvlnINW8GS$GV%8aS37ofFce_qr0<%d8+TH!@t*ewMZ3RwYmU zw8FC6HL0A|B5!NX9o=|utLXd+l@AxWt~oAwtz|md`^(wWMh~SP9~9&7^|iicu)}!k zEBnZF*U!((*1TBrB{Y!p{gGXrRw+vVkMZ0RJ~z{o!=%q{$MYjEcj(U9Y%;6!OVBi- apNn{QFqke-7Y{9vdca_1+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+14BInOL1OHO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 znCf!s=8h8UFfu$QnjP~O7@k;CaC+@iB~D*! zzw@uQA3Pbs`}*={TOZ@R6w@09r`W#cGoEG0=Xjsq!FO@K-iC$Ztmdm`Uo|w`+whGu z-!I_9%b%~R8FznvKHn&A-Jg%W5wj{@ub*UNP?x$&%4d;w@Aqh#2X+fBK0W{dPakOs literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..f344a9f27924a8a0280afffcb8d24630ddaca0cb GIT binary patch literal 691 zcmXqLVp?y|#3ZqRnTe5!i8022myJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoHmG4Nq-Q2l*o_61AUAt|y_4boB62)s5xJno$-?^`@r#oZIe~-?G5$c~6 zwV9Y185kGW8dMwbvoVLt3NtePXJIv9W@P*i4qaJ(kN^ua6C;~}0Z4%Yi>86P0XG|G zLYoI;Dl?-2BQl2xnZs-#2-3mF!o|Wd)#cR99VOOb;0TgcX5lg5YT#Hs>-En=&qMl= zLx&X}=L`XuwMpye^!=eCm6`{sEpnGFXGv)^6` z^9Xq^v^M7EzQ$)ox!jg(AH2S`^xxhMoj#i@re0s($R0Y`M9n5CKxbZB_396Tm+tDv qzes$^T6N}L;i{K@#%(r5$6St=gsGd>>ls=e-r2RU{h*+imIDBNqSjyl literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..32906057a382748cd5ebf18e7299f4a92ff7f13e GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-GBf+14BInOL1OHO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zU{;)wT=Q$`3p5uqH#RbaUzYvwt#?6Z@Y^JVxi7QU?$L2yx1MpypTiY;9}8~8z3;JX zd04L~81&oy1*^7f`XjfmEoW9H%hVopkd@rHKJt92Wx<}4MXR%T&!)=Hy`{jD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uAc0eS|8dIpvTa^k#}76yg}hK5E4h6V;v;=CrvT-w-ggs{JHKC+J)Ss9oc zdl?KGJDD0A8LkCd26w(vdb{XYU~@y$Ql=a8f2poI7y0|gzP6W#3>f&VFG#Jhmr(P6 z6T$p{@63no^HUbNh)y{?xBc1atc9->B95Luy#$HK+J!K^qVx#ri>7vMONRc7Ha;A-HQ>T>GljuPuI1xO>q=Hx|=tNlvX z*wuNh3*OgUQnQ7z=ett?pZV*oIbp^x&;GnB8hUZcYu=R%543K2#GlmYf1I^QL?hj1 zeTLQIqc>jt{^zb1JLh2SOqM^9Cnc^jG@Vbbj=Z_o_(IablJCu{gty45=`Oi+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-GBf+14BInOL1OHO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zI5jJ-KDTd{A)1Ss8ygvV#QMX(9Cf;I`Y59Zi`xBFk_k(mzgH1k+jDz8yURQNtT&Rn zaT%NAeg90=3hrJm#dTmA&+fV<3NPz_Eac}~zoK669q+t0owcXZzb;bOdbC1BSw#D3 z%av#E{2;3narW%H- literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int4.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test42/int4.crl new file mode 100644 index 0000000000000000000000000000000000000000..7602160fa0f2a245621dfb33a9567ce74675efe2 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}r z-GBf+14BInOL1OHO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zSbB6$NR!^{N;DTUH#RaXott`iO6Nj<mn5?)X0M xP1ZgcYzKZx`n*$#E{2;3narW%YWs-UJCalZr1M9y!^Ux>`u5T+S%7 z$6dGhl<%MJGEe(5#r@*<{Y*Fc&QG~5(j5P;%dApK%PB}}X4QNqW=00a#mNSV2K;Qy zp|Zk^jQ?3!4VW1j|ARwUmLDX*!py|T296b31r~k-UIT76&V)7(##ClT14aWukVZZh zE*6fZN9Tkz>AkK5M}w>~3y%R;1IMXZarL=6WX{Zc}yi1pppX%Rc}B literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test42/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test42/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test42/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test42/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*jwZSR0eS{zdIp9Da^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yETgbNzyBm0?=m4Ugjm%*U1lc}+hVby8&tp_fAnsI4$5cf7J-0rYROnu+8Zo`5}lMGc@j)yK0n9uji?fRF` z_YQD-#iY%*iPp|pYgI0t^i2EQ*SFi{HcS$F&9XDS?u}+T<4mjl=eIB2;4pP@yo9jH zytzfJx0#q385kE^8CZaWQ+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+12a7XLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zXmit-aJ#<89?iwfjg1W4+t=GI-?I0q_;16?tM|`#^gCZpZ0yJkGPS-C7Gf|txa?4HxMTBL$7#KwJ^t-?!pnlHt}I79ZF3oa{}LS^WSD6=_-k literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..e18a4e1688ab3ef3948c8ffdbb33a7a1c83a675c GIT binary patch literal 679 zcmXqLVp?p_#Kg0JnTe5!i80ZDmyJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoHmqlwLQI%gwI}=llFXY=--dd-*DbYsca@2f{Wd}F=u)Oiv z(sIsecF2JXpSyF9?eL6>y6P6Cmuh+VNfmd{@5RZDvL|nLZL;_kAYH#D>8HRd*;DB( z+nJad85kEA8sr=BvoVLt3NtePXJIv9W@P*i4qaJ(kN^ua6C)cqR%8`e_zidsxY;-p z+B_IjnHdcj4R}BrRY1BL7`Y4tK|DSdE*6e9H+>1W>wE0Mks_z{|7 zhx8+d2rDQ=8X1mTE>h{f@}e;){dr@cUHooworCHL&)r*sjel*`F6fIC&)t`}YKuTF z<8i}iiwWveo-=ZOjp3CM`Nh<%*=8#)a{jFy_uH#2^Phd$p%C)-|1u*NY4lH(UQgYTb8PGoAWeYc0XmzDECu#=2An+k0&R1Pk(V>9ssaM(lP)5 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..9820bc6f6b44f6db67c4302937695ce2af2d4ce3 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-GBf+12a7XLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zQ2AZ8V!3N&Bbtku8yguq-5#yvz5Y++L7!BBgjv%6jq0hVCN(Lr8f~9?-~U#E{2;3narW%ik?b-{?c2+^i*C6JF)$z5i}i&>Xb& zLmW?%g7A_LEVUQqmTg*dDRq9?Yu4`t83v+h*L98E7%m1}FJhnAYJI}ycTTUsyYBnj zP3^hP=vAN0a$9w9+w()=JO!)0**Fv0JQ!1%84VZ>1VI}4 zSh!d?RDM^jSngWc2#y9>WfmR-t_F@aH+>1W>wD~x!+;eO28|38g51o__x@id{#N>r zsC-6FU;{@}wN;*kBTLxVWZNYU5457Ko3H&93imv+sc&kQ;KDYKwHu{o$LFqHXl7kr zxKez*U7LOl*AjPsTQ(o}zXu~u{@U=mNwddr&%@giaq6>r`p@nE__!ff)L~)y&)&!m Vi`zFIo^3d(wfSmVKv~Q0djKst&Y%DQ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int3.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int3.crl new file mode 100644 index 0000000000000000000000000000000000000000..b8dfd8dfdc7106e5b9003873ee439b7b1d964bcd GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-GBf+12a7XLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zNWarFb(bMWBbtku8ygwSdi3jm%S76>irW6YTc{a%ZPC;5`Ix%Z1| y<=*v|lVVRP|C+la;hJ*(^+Rb^WM literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int3.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int3.crt new file mode 100644 index 0000000000000000000000000000000000000000..30b9706d8c7d69e8e553e8e51f5e2c3190063f45 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6JxRgFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%tX$(E)v zsYHnlCK;hiIIjK(KD^#>Vbi?qM82(69~5Uw_cFvtEIexP*>RUD6Eh{ z=1^H-M#ldvtOm@CjQ_!*E6WcOU}0urWCO>FtO5(a0j~i!8)rhB2V*KTqXDCVAV?!0 z3l|GV`kkJsy9_xR!O9)xe?hyK2R9*UCoZFkl6RK_i3D&5MSd>-|MyJdScd znzl3d#k=?%GM8m7gOE zBtA`AsbTA$d-vzlK#S70>Wtram|jN8J}nVXWS#F{xRN)1O~J(l%5$y+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}r z-GBf+12a7XLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zI60f!?9V2}iD)inZfs=ORA4J8qtl()^}JWZW}oGZ?S4I(_qOkEZ@FpuXszNNrppNl zrF%Rc^`4)x_un#^i4*e_w_VZlJYgv`)f_mPXGtayTm~=8@&aH|q+4HP_-AFol`O;LaX^v8&<(|#}M4xN4 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int4.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/int4.crt new file mode 100644 index 0000000000000000000000000000000000000000..949562273f4fff528151d3daff3539f9876dc455 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Jv@2FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%**Fv0JQ!1%84VZ>1VI}4 zSh!d?PR`~w`?E=LA~+gkm05TUxEeUp@AORFWysNp90shQFlb~b-nfH>RmbsF@A6OU zKN@uwxqpn-Fn-?rdV&y>IsZMWhqGn|`M9|;+1GS_xVoda|8>30DQ%6b?Ec|9E_m~^ z$+}Og3@BOfqT}A?ia%RlME<_;L6Ga>&lLH;%iWdEr2nt8HmJJf5O+x3&~^*=E{4}T X?*(ntefW#}Uxf17(nWhGOb-G8BBsun literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test43/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*jwZSR0eS{zdIm-Ya^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yETgbNzyBm0?=m4Ugjm%*U1lc}+h;ez%f!Ia%)Rz3ae`4z*#lewLlZ#mW49d>ir zJKOQdtlo;(N9|1Re0ANpZswZJB9~+|W-9NPGr^l<#`o^1r}5XYOl{^;?;?9{3Z_wruI2zUSHbj8k_`OySxrv*KWM&apcxOgDc0 z{hh7&da1%$#_JNFVrDDO44M4w-GcPuc})k5cCBg1>vz1;{lp}AY1zGP4;QjMu6XrM F3IN*B(M13N literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..2d4478cfc8f95ec6f94623efec2771dfba93c892 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+12a7XBXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zsLaY=JE=VPIhu=^8ygt}=I&{pvFUJ`->P$|r#EklcN5#j)OAPl{JA?t4XR?+F`=iw zNE@6h%3-w+_;!*zD`cMYOvCzx_gx~E{}lbsyW;xP(sqe&#@>M+znDZ;&po8OW$EOd zuO8n1nKDbzc$sY!ul)4+mDR%gt{r!jEBHR?+n(z!XC@k5i@Wsi*qT5ufqlyW0S#+@ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..fbfd2a4d08daf78039481f3582c82c472d8a2997 GIT binary patch literal 679 zcmXqLVp?p_#Kg0JnTe5!i80N9myJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoHmBg0Fe!tR=XN&q3UvuqBVEDP63qPN!TsTWY;N-Mk=}qp3ruJNS!c0XG|G zLYoI;Dl?-2qX7>{qY6k@10$<}Ac)7u!o|W-nU%kGQhDxkaHPm8v+x*jHE^t+_4?^%$baTHfrCFUKB4Xx_=krUr*2P)d6K+HnZP}KcnyQ zB24(>6D855b?UXtj7wkK`~J}E@5VDMDNUjeKY!IfwLs`}M=zV1%tPhHM%zB0v6ZQA t^PXtcJ>m70=bM6(B-Aw)KW4u8!7Q11YmRo2?)9m%9iFKvW?uaKvH-9W(f$Ac literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..780ef7c0f57d6d8a3b352d9ce5ca33dfdb64d9e8 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-GBf+12a7XBXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z&|SMkCq8D^-UZ#&3j3#5 yi5b;|b9W`CnU%BoR@SIS_+PsuYZ`jr-7$L3mY8D4MFFJ@QRV#CS6iQ+t^)wswPvCK literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..26f3193995f18d50070d2902bff1c2d0d205c305 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6JxpoFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%ci?=o%x!QmENXL$KN!i66m8(;)da#^&smD}xdPjq`O{f4v zS{hFt-;U~UpKWeEs=svb!z|4odseRYI5da#e|}Mcyg`E0aX%5}%S_CS42+AD4H6Cb z*_cCRg&7(Dv#=U4Gcx`MhpsF?NPvZziIEK)E3yhK{06)R+-#f)Z61uN%!~$%27(}s zd@Nin92#MvkAB>@cmj?FS!EU;1Fi;+%B=jglge|SBZmPiC=41IcG>ekW7`w=KTgcj zg7J#a@sG)WZwWFyx>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-GBf+12a7XBXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zII>abVv=Yo8=8xm8ygvfC)FO9)R13&PrPxV>?@9Dz0N(Swfp|veS0JL=OnJxZ}`o8 zYcF5@pVsRZFBH^stf$H8Y3y17^F?nx=0u-3;-sk*ztX6$+AzFpTeX3U$%BwD=NG=b yl;3ib@2=FjvXrOgi4zhXJ>7pUv5C07?d8e%hf$54ZVFP8EZ-+TG@rmQ=P3Y;%4oy@ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int3.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int3.crt new file mode 100644 index 0000000000000000000000000000000000000000..7f62ef6ef956fbb9f01f24ffe24ab40e3a959c4f GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Jv$}FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%~=WNAsAm+JEKZ|LfD-$y#1LNXkgG2*< zHs(-SVMfOPEUX61jEw)mp)1P|5@2CwVq^oyimU<)zX7iSHydX{n+IbmGot~cfgngD z9}5=?$B~Uf7n4L&*}%~ttIWb>_} zz^0kFYVWsy78Q;5kNQQDr9IbZnu*U$XL9-^kX6UD<`e}@g;ZTDVL)$yN^{qyK%t7*KFT+NhapHt-T88=L#ROoW)ggB=F45 XYY+d`&i2Ub+}>&`#`#{KaZWV=mkiJT literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int4.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int4.crl new file mode 100644 index 0000000000000000000000000000000000000000..5d775f551545e503ca27eac40b637c1297cd9443 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}r z-GBf+12a7XBXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z_)u?Cc%c4+ zORZNebLC9Q;HXVn8>2MNe!F!1`3E&myV9`CU~ZPpu_Y#9K}OjD)xKqwH-(<@CxwLO xJF6XB<1Q;J$?7CEPiuwV>$eUKwdU_9=e?8Zm;FBDUQfK2*!qU()w}fV3IX;qWqtqv literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int4.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/int4.crt new file mode 100644 index 0000000000000000000000000000000000000000..76d6111ec16845f38c9cbed0dcc52d4a240c8969 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Jw?UFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%_;MO z6m=#}Y@K&w&FVcz&)jU*Dad@ib9TL|;Gz@mYEx@NRv$jP(7fkIH4`%<1LNXkgG2*< zHs(-SVMfOPEUX61jEw)mp)1P|5@2CwVq^oyimU<)zX7iSHydX{n+IbmGot~cfgngD z9}5=?$KOlKcJ$`G=mkfEtTGFa0apXZk&QwZlSEV5ki&o#6b6k97VbPtuQY@#HFgfL z)|q+DN-lU;+@^TGRYu1nO_FEc`^Fek`(Cc3ecxm)RbEfU`X8|xUE&ATpI-I&*TtK; z!^l#~f6m6{eY+L+y#Mk|t$8Zz$4F@n3C6^N_T7rR>hAF^oFlw5_^oD6=c5HnBkKQ# Xo}4m8J4C?fbxzA6qw4<(C+7eFkgm<^ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test44/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*jwZSR0eS{zdIrV@a^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yETgbNzyBm0?=m4Ugjm%*U1lc}+hVL_1Pa_t~K_vhLjUS7-8p2%pYt@zRQMJ$Pn z>-myTncHMM)*XMe^S=^9(h>FZ*PFGCre*4VuNHpZv3NRz;4S^-g_~wamq<-xU&L|C zN%ewY@t6N*t89MpoY4%D_-W7n>DgMw^Cz@@-+oPP{`y^?L5^K)?)rJ1ee$NES0^-b zTFhI^#LURRxY)|T0vw#O{EUqMSy-5vSRWV&vN4Cs^09ESaAZy~cb=ECcs@9MWtCZY z47eIN_^h%&^UAudMfMsi$ZL%ZbFOg}X9bDQ_und~;H>I#&whdPy|;zgyO?6q9@^Q| zs(sVC=(elpn5Zr~9YO^uMulE`QuJ E0IS!_1ONa4 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..079062c148fcd8c47699ff27b099f1e920e0329c GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+12a7XV{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zaJ{5@b5;=7Ml=^QH#RajZ9Ekk+oSTy+w}4ap;xW3B1eismL-XbanHfHa2$ozKXo#`W=qZl@{~+P3QY0&UCt=eq)2gv@eDd27FuY xR)p@YzkOWZ#F)o7U$&>7M(0V*u69VX6QC literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..90ee8e3fe9df723e264d214d48bdaf2536214cbb GIT binary patch literal 679 zcmXqLVp?p_#Kg0JnTe5!i80%NmyJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoHmo{rbXUmI3`JH7IT<_hk;j<@Q%4$b{% z{D1OR+n2GKc?@Qk{h5y}2@w?fZ^hO0>$IxpDmOjpAA$=xqq>9lo!^_Y$mYq8OSe4h z`JR27eCm1Gyo?QdjaS`TXYRKro@e6iqAkiIf84*Co$d_S!(#vR;CD}pDOG=k%^qlp zzF)}1%*epFxX>WqfS-*yR92Xg@jnZz0W%}xe{kr^@`D6en3)*az_B8$z`}39YrxIM znb79Jn99s(z-Yh&(x?K`)xgMNAPC~|v2d|)xL#7dIV*^3BREoIm05TUxEeTC&wBmy z(DRUf>H4{N#l%O4ar9(jJjFlLRAweFjJ vmwCChj`=Bnc`pjq literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..7c12bd0c3b8f2e497f255ae7e3d4b58a622773d1 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-GBf+12a7XV{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zm|OTD`TvS}@6cS#+}Oy#^H8xjUi7nW^^9oUi7`qI54Zxw9=$v8?V%)hc?jDD$!}L? zY*^+vy~cP^lyI)%fPT*kz9%<~nYa)0%bWqHWjuOaVs#Me=Bs literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..7fc0467ca80842274239ddffc7978bdcfedc1887 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Jw46FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%p0d-UXt@bP`l<_wOUY)fa7^_mD4koxo<_y zI8~HpA@yr5ljPmitFKS#ckRNCT2zk#>L47i3a>^ z%%QTvjEw(TSPhsN8UKSrSC$_nz{1SL$OeuTSp^n;16~7eHqL}L55`nxMgv9zL6Am1 z7A_W!xrGms|F4+$4jc`#$}BtvTn!wqmsD@g3gX&`90shQFlc0G3wz-{!#FWBFQTp0 zcuJ{Oul>4NulG-Ix44oNXLO(8r*T?(waA7ew+vE)cUvpIJi+;7^22k-rRTh2)8M*( zwn8HB=e%`^TNJ0vIk$5D`3HN?)%-lkRhc2JF0fPiuim17rp<>Z<|eU7W-e&SFb&j+ XQw|9@Shzs==!dP#u6Azn3y}l>Y8%b8 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int3.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int3.crl new file mode 100644 index 0000000000000000000000000000000000000000..f81b5042f3e253a70ba3153f215950163a87d46d GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-GBf+12a7XV{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zD9&R$>umLBH=2u?8ygw4|2$g1L8$3!!)3tZvn7t;D!+eb?%*xN7g z-?yL?&bq3W?=$qvq;@Rac=yB3okgbeZk6BNX|Ml6Z0^Zl>{BKz3ebKMy1N+wp3`f6 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int3.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int3.crt new file mode 100644 index 0000000000000000000000000000000000000000..fb9500f12733c416623dbf5fc675cca0c870e821 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6JxFcFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%K*toJgXcH3S>-dkhbV5zHfK8e!})$-))vv&kZ`x1Q};Pa zeBI%a%90bK(~!`<@zbN^t;>QYY^`4V{l+){c{^XIZvXaa+Pu#BTq_T7rFgm7CN<3n zC}7RqzB**Fv0JQ!1%84VZ>1VI}4 zSh!d?iu2gcI$QnO4UPs`WfmR-t_F^|g%6VdubB4^ISg1qVbI86vL{CGQ&zwB-Ur2X z@vDQ6r1M@oXFidm=A__?t+^|=JuvG_T*@S5M literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int4.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/int4.crl new file mode 100644 index 0000000000000000000000000000000000000000..9e67a4a91d8a79651cf7b65685f115641377f548 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}r z-GBf+12a7XV{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z;Iqp9%q#1*7R|-Xjg1TiVhcWpxF#HMs6RH*ermYw@pl*AB&dCLxjoHYV#5+0J7Jpz z;znjZvRU`<_wN+VyVb>T?rMh{^V`i~SCc>aedSYE>`-Wn#E{2;3narW%>XKT_#LURRxH#D$(SVjz{n?Ei2CSekXk=L9w<_S|<2Z%NiWLo_ z=Ut}r#wHzMSalwfaL4AB%&I;zan3S> z&go5N2gKPs)J2PG1iGwx-pBi|YT-J0_28EytK(KqxuG*_qRzpk`_00-M9pP6(kn{l VmIw)#maJ60&bdfU^>By8DF77|$3y@C literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test45/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*jwZSR0eS{zdIly2a^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yETgbNzyBm0?=m4Ugjm%*U1lc}+h;lWh3?Cj`cWf6%J%?uSz&FxjIEzD?jJ{05q zKvzA0`Q_r!o`2g`JDSP$+Rj*f@cUQuz&ZuhCdLw{<8l}C|7Ts_^f7&d)WOuim%Fl? zTMzMu-xBEkquhP*!H(>e1rslK&01mTt=b#;Xk)C%na>X;9NL$?KRx3OzxZy`kQuLv z6SKIPm>C%u7Y7*xfP+((pONuD3kx$7>jQ8!$SSb#8}J%%vvDT0c`&9jGa4`&2(mGU z%JQ*rv2a-2n_@Y)WwIVP++~$ncnr82I2zT=-!GJ!$%X7?R*;t)8REL5uG|e-b0+!b z`u8PGwl_2O>~LROP-VL>qcgOpz$Q}j*DBN1cds2jqFy)e+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+12a7X6LDTkO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z5ItD4Ji%m!0Gf-L8ygwyg2cRK#BOY~SuNiD<9z$6$pu+@kH6N0FefXrZk#&r)I<3P zr{br^o%sL!Q`)M3Ki%WJ y+08du+|>E`q@}I7LxQctymf*4%+0-8CrU58yL(ROCG&oZ&}@@f*O%{9GgSd$foOvO literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..985a5d575695460ea3c45cf712468872919056a8 GIT binary patch literal 679 zcmXqLVp?p_#Kg0JnTe5!iLtD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoHmRUZ_2jQc89x!x^e2w7-BqD}8E>CDZAeO9alC|gOR>-U zl?z{nF6<2vn5?alYv|#=@uJ;yUH-+k{u$41hA-Hr6Zb1Wr|Xcqm(8S?7KSOGs|rr3 zGchwVFfJ}M$T#3;V-A%SW@P-&!fL?G$oL-|y0ZKr0TyN^MmBJ)$SSb#8}J%%vvDT0 zc`&9jGa4`&@PIU`fOIu5G8hPgczi5eEF7W-YnCUN%n$%aimWmVj{#Q$$Ld+He;#@s z(vKV>te_BSWY}d?#`E=kgU=`a1k+Qq;>f5@X tCLbtn@QQUiXL@h_MCSZYkM6K#Yo+&y^V!`D5oXgo-Mo5t)6~6&$pGiU)V=@! literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..02e82c48ad5a422739aa0ef325b6c4c698087117 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-GBf+12a7X6LDTkO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z@K`Rux7@MvD4L6z8ygvf=jfiUUmRBTr}X`eZl|m7y}zp%KAO$AZ7I7RuSDRLOXt^j zG5yZoXtc&K+}vH!;P!nbvsC-cFyX6ry{~_sw%+i9$)7p13{$$yrd`UCjWhjhU?66; y-=frc`_K9Bjwd$TDQ6nLDG;>#qoeabw!d@6n^n7aDYurD7^^S3)|am(a2f#1=Vi$N literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..ade64339c6661e2f5d3f532d53063374516f5ae6 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6JwzPFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%AJ@TajhCusH1vM&yng=Es*S~GPo>Qbz2-1C)TE}|r&xR; z({DyC>z(EMOYKe;U9H(vx}M9~!OMoRlSxEC(D&Cot!4U>kaXIm-%mF0_XEDQV6&&15gz_>WsAkl!I zjX6|Sn33^63#$P$BjbN?=*seg1X!4v7}>zFBCEi{Z@_E7&BmF~=E0cC%xJ)9APCaP z$HK+J;jvtRZ@FXTQE)WKDzoqya5Zp<9;{iOU@}7hISg1qVbI7hfkn!yErM}!)8zA} zZvB%KPdfBxX8v4tU}Ez5e>}X8|Eeyj+g6#ibY_=Iq(JiI^@|Q@2p;9D+Uaq!#n)!} zjCbi%%WtV~cg>%4b%Otv{g?kgdA0oFSx4Suy}3oje>yg%7_Pl{LEGerd);w1<<(C! Yj`Y>fJ@<5}+J&Ws>}yvXdTYcC0IA^Aq5uE@ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int3.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int3.crl new file mode 100644 index 0000000000000000000000000000000000000000..ddd59a80c42de9faa936a3ce7c69e6e349d7432c GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-GBf+12a7X6LDTkO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z$Y4~8{KvWU3!00W8ygv{a_7%3k}a@2;eEGqi(4^YlC)3o!3mvT4w-6KPMZDgaiMV9 z9yOh;pU&TQ>CA{yT^3go8zSqrahH7Y^gl(H6Fj~Kdp48=Pg|+DdU|iH(c5H^HJh_} y!gkKSS*R=F`px@#$bMrx(RicTi|1C|V?H|Rp~qpP*Y{2`{W`(Yws7{rAHM-@EoV*u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int3.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int3.crt new file mode 100644 index 0000000000000000000000000000000000000000..6e33faaaabf6508071e9f5e7c7155d296209c9ae GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6JwD9FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%w=FvE=-eG%wsp(9%4SMCSHIo!T?X|#Y`-jca?!WtZ;q?@ z^!>jSrI~XwO*QF}`|Ri!1!gQWi#G-(9gvRRnf>U+;VS)4^FMG3GchwVFfL9uNHpMQ zV-A%SW@P-&!fL?G$oL-|y0ZKr0TyN^MmBJ)$SSb#8}J%%vvDT0c`&9jGa4`&2!b^7 zv2d|)WH2g4{^MNw1sn~s$}BtvTn!u^%LVwBJ60Y=4g*$D7&J1-+?M1~U2C+bSiA!Q)mFFc$@uxZ#r@Wtq}SVSlt+sBd@NlNu+2SMuTeQM*Vn*8SXR?1 zS2H=P;5XNWvcqqbUu|zWZh2T-d}Rw#YXI$l%qjo? literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int4.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int4.crl new file mode 100644 index 0000000000000000000000000000000000000000..3dedfb11ec3318a1b6f4911fe68f638b375c200c GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}r z-GBf+12a7X6LDTkO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zXjC(Qzffu>7n+Ni8ygwU745C^R+-*CE%@#9Rddhx#~JLc-dyuRODyo>CCf^7z004I z0z1Wa>7@ShzgNEZjDd=@gmi?@imHUXQa1Jj{LagGWA5)x^PZcLH{USySB}=7v-ZnF xHGbO^aor5e;SS22J!OT%!Q(FsleYh2- literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int4.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/int4.crt new file mode 100644 index 0000000000000000000000000000000000000000..1b3fc57263eade24d53601f4c890b07edefa2e18 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6JxOfFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%20V^5is5o;o4vT^>9-$4sYpTVL_GuXgTu|3Tw2f!zg%MU~fo z^4ev`^v6$N51-%KYbLY(kBFXKxZt=`Pk2?;l4jY=;1ny<6sii$efe)Wenm9*)&c08J-Yij$b(wisnu(c_fpKxNL81Xa z8*`|vFeBrC7FGjhM#lf((3Rx}39v9TF|vVUMOJ}@-+|AJq+Zm8@?;n}S|!GSkr X74Mt#^S1pATxO~g)U#txo9l7_32Dy* literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test46/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*jwZSR0eS{zdIqKja^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yETgbNzyBm0?=m4Ugjm%*U1lc}+hVb4?}PyhYZ8+`tpmfouq)5GQAUG-dJ%KM1f z@*3_3=Km_K*)FqoilC(+%epI}$}?8`S_*F7yZP@6_nNnFS&nx8zUX&Id3w+fAEiS# z*E1}U`p#05#+uH_`_JsnPt&@*EZ&Q1X;no^QC=B~lvt1F9-RJoy=S1senHdI54KFc zyZh%|CT2zk#>G|!7U1BNCD86zAVu#(P_49a=KwXY{W}^PUtvP+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+12a7XQ*mBPO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zP|QBKN^EO74D1KBj@#QY!WZp-yGwi{jg^*_{Rkkv|VI0)f@raZfJ1; literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..bf3e222391acfdf3f54cb5e5c4243e8d4a8bdf1a GIT binary patch literal 679 zcmXqLVp?p_#Kg0JnTe5!iLumxmyJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoHmPhFJt~fl zs&m@X^dLRMO>u_HJel)91Ezj*-*aY{DQ~SJrx-)CrDd#PLsz1qO!WT~=7~$Dw#-{B zIL(qtUhu))Let0fS-UR8&dfd*6ykbGM7#Woec-Ntc813GWm^P2r!U@gV<%HjK{V52 zCT2zk#>IsO`3C%K%%QTvjEw(TSPhsN8UKSrSC$_nz{1SL$OeuTSp^n;16~7eHqL}L z55`nxMgv9z9*{;Akgf(sb^}2WkB^0mg+np>;3~<@TjziyMOK-G$AGJWWA&`pKMy?* z=|>I`R#1pEGO$Qb*lr(SZ`kFl?zO%1`jT1T?*5&8ynkH- zPQ|lL7s(4-aBS;uv)PIJ*Z+z>mBDK9UhUOR)}PNUj%agpzA^n$l)UZh3^tFwhZ|ed s_vM6Uxop)+f0R?1X>hSaQXxD1aaj7HSkZzIF7-~|NzWP^OYcep0E(^4R{#J2 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..f715c112d49a1f4e68cab136f086c1f81cc3092b GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-GBf+12a7XQ*mBPO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z2wB!R^X%7ZAv6~=H#Raj+r2COYH@<`s7{?@AmC4+!G01vo!V29zOr+&kPF@wFONRUY_k%x{w?jwqEyE-1nF! yD}iaTp{a8YW<9sg-Xo}4^Oh~tdAV)+v8x_R+e=!?8*aBY2D3Ka&UrL3>L>uYYG|4O literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..1b7854e33f705ed091e6e5a7f1b101a8cd708816 GIT binary patch literal 679 zcmXqLVp?p_#Kg0JnTe5!iLuOpmyJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uAc0eS{zdIqKja^k#}76yg}hK5E4h6V;v;=CrvT-w-ggs{JHKC+J)Ss9oc zdl?KGJDD0A8MeQ&m6%u->COAfagFmO-p0C3GnT%3B4z4OvxjfX8^;U0SL$V3xZ=;O zxV*mmi`Z04u0vI?4!gC?vEA9J>nw6k*>FNy>8FIxUQ)mHCabl@DDK~$_oeGu?}0Un zVUt9T%W-fh_8$Lwg|C5qhC^I+=w7AW^WAKJ-cWgO^l?_9M4L=66EhFtO5(a0j~i!8)rhB2V*KTqXDA<4@jd5 zNLK?RlYtNED9;Q6t4ZPtOZ z7e_X|=+5<6Eu}W`Jjee=rL)R?dWDNlH^nblbD(#D@TbS(=dyceJ}ukn>?LDz#WH4Q hX4s+UN!x$Sv)&tCd}51uqoU`ME2_0+%lg760RX?o(5L_a literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int3.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int3.crl new file mode 100644 index 0000000000000000000000000000000000000000..786aa5032a52b7c2639fac2840d108a67b3a5a21 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-GBf+12a7XQ*mBPO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zIQ!uD8`=K4WHc8uH#Ra%Qr*>lZO{Hk9KQEgUb4xXWZRnfvxR?tWDI9SD|-M#roZss zY|F}DDPIMX8t1=Tna0i{UpG_7azj!6D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*jz+ox0eS{zdIqKja^k#}76yg}hK5E4h6V;v;=CrvT-w-gjIh6PKC+J)Ss9oc zdl?KGJDD0A8IDE?EVN~IP2}=sOHGSaY`ryS>%rp>)7bLX{bhN=!NNL+adFy5&j;II z1q7UwJ;xx}@u);Y@P&|Lj-Ge&ll#w?NheEwlnYR}pkfrjaOZt!clUtB^7!GVx&_%gKQzaAT#fq8#LURRxVX?D-+-Tu zIaF4dk?}tZs{u13<9~4I%JPE*SeTg@*}$+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}r z-GBf+12a7XQ*mBPO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zIFz-e?gdA@Cz^|y8ygwsnq4vw-L&A_nyHIkGMw!EVYg&fQbVbj-WpzwiT)St--`Wg z_788kyYqlRfXyB*-iwo_c-=PNl6kYr*L6?x*@yjCu6sz;#m=6(-+Z-!#<>cqg`3=b yAMDw4-8V8VS*^4^sJQq@+e)?S6*JG-Fs5}en5TOrSvU5FoBq3(C4ZL5fC&JRD`leq literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int4.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/int4.crt new file mode 100644 index 0000000000000000000000000000000000000000..1c9a14344d69db195f3f030be306793e4d36d848 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6Jvz|FB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%eKpFoJ&wT%Ve{J_PYISmf9h&+pNz0vcFjxxnSSll*rOk3q+2e W@07nbMB{ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test47/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uAc0eS`&dIp9Da^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;HQjZ$5{}%g`({|~bJy|fmKI5NrJqOmv?k`v z+U?4$(Z(*+XT~_GQPFirkm3oUnc`FYGM0X|Kbhm?^>W^u*+Kd**Fv0JQ!1%84VZ>1lgEF zW%*dRSUA$m`O0}Eebm6=F00JKW5CtGu~1A)=DM`*a%3;Fg1p?wkhNR=di{e-pSzCh zYD{=lrdp_Ddz=65(&e0AYRvn0Hw64DjeOFeWK=w9_U6sfE%FIldLmkir+!VAioU{7 zAo#DcTuH?I0_(RPHmC28PP6>Ami(UeKTn`QQ=I*I``;J20+F6COiot>|4qJ?w7hm< X(z@s@fv+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+0}DL^Lvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zSSY3?b6r|@Ihu=^8ygwiRsY_8^diP~z5)Xi%i+U~x2LCavzEP?FBR?01GPgGwrFSyI7FwabJ+3$;yb0bRvT7HZ0 yi5Ljo-&?6+^rQTd=&u<4P|xG1XFM!c43T{}bCpN+egD6<6DH2@pMK(t5gP!Fe`5y# literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test48/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test48/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..b2eefc4ae71f5dc7cb893830c38bc81d686457c9 GIT binary patch literal 665 zcmXqLVw!5u#Q1LkGZP~d6JwPDFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%9!06hZ> zJp)67#`(xTW@KexZtP_+XzXNaY-Ct@>*LjUfAtf~_jw=opK!@9{p$1P+{wAE4+E;h z58qjzmi)v`hI#GugSurgr4y5msi#cVeZp=1$GNQk#D^l|EMxfx?COR*`5g1xwXftb z$9O-=-CUWIQnuQBYf)$Mz7KQzwsuYbw&vLy=60#@#+!#Smbj}i9M3+-U8>S$`%zWr zF%vT*1LNXkgG2*u`1H9-Ufx!o0RwPkqX!C5JVSY@6D1 z@8fEx#Rhv5^pr2y`POvsPPSm>$%}p*6q_e*aF>6{DkpW9G}(psd0e+{Iv>2Nk#L1I1tlby~v literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test48/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test48/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test48/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test48/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM#E{2;3narW%O|E@+&O>}N(+2Ij_I27|^*%uta%^4CqRBGuYtqDqXByu9<7q)?!C-? zZ=x{!()=!u_QnmRHnZm+v6kEX`b&h}4=yp6>|ZiluJed3R$z+=WpRI>uQ<6+x%SPT zyXjl{PhNP#_cH5%;NA@kt4}(%uV%b4*X^;@YT=frN7;`o_@mgC%@xVit#*UE{T5g6 zp4**F%!~|-i{lMq!NDoZ&&c?ng@u`k^?`vh8*`|v0*j1+lmRyzXF{6?V=6PF0V6Vp z$v_aKh>wMfh2uq!j_=ZEZ>zwOAgj#6W5CtG@gnk}fa;3GImrHJ1^K^`A^Zo6+S#qQ zH_V@;KJk05=oY?J!l#+)e^zu9wnl{P-g0kZ%I`_nqe2;rB?7m#$1jLu^#9qkSY7Xl zw4tbzW!Sa{Tc+=0IjnY8u8d)Ug++{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+0}DL^BXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zcoF$fKy^jp95fd*H#RbGZ2Zt+ASl*YA-TFku1a$1k6-hG+Zn>odRA?D8U6Hq?Cnhr zN|vg1x40yG1$W(glbDs|@{3_^ylna*p$Sjrk}VSZjxoJu364ClviZV_W=rk+ia{k4 y8|Gxlsd?o}{ofVC@$0qlEctz&lcSezocxVrhgd9M*G%ra`HybCyZB{J`xO9(#Ac8H literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test49/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test49/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..037f68d8b0aebadabe7abba5ff45c5310a6a313c GIT binary patch literal 678 zcmXqLVp?R-#KgUTnTe5!iLu6jmyJ`a&7D}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HPUF%&T1gYeixQj1G6^U@7P4TM1= z%)&e&MWw|h3XXZn8Tmy9a^k#}76yg}hK5E4h6V;v;=CrvT=MKs!E3*>qoHm&$}1hZNi7 znV19)xfcO*6W{#o`>`!2M8-D zKpGhmMLnMLW_s_u_^+WMA@_VRbE!mowZGWEnnPx_T-U#9t!cfgzDc5SbN7V3cS>q@ z*xr1=ttdU+vXYytwn(Dv%wB$9x2xA4d9dbwn{?KF2Wx<+S=Monb&IB1GA(gZ4LG^I m@!*qBefgZvbUuf59>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test49/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test49/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMD}zCtA-4f18*?ZNn=n&ou%U#3 z7>L6q%pa;3tf%0fUzS>wmz$bbV#s5_1(M+wW_HO>F%&T1gYeixQj1G6^U@7P4TM1= z%)&g*j)uAc0eS`&dIrV@a^k#}76yg}hK5E4h6V;v;=CrvT!RF1?03Opzqo-Y#D2ce z;?yD}7c|aC_A?_Z19M|9gF#~_Q)45;ZgGKMhnnv?S#Ejy-$wZ-MOgY)iJ zTK_41r?=~gT5fa1l~v7KCp_@u>fCsP$t}HaVu_$(?)Q?d*0HkLfi0)i9Zz`t%yv1| z9m~Yb$iTSR*T5SboU;6kjQ?3!n3-4~7zna4hsr9ja2aqIu(7d($|^8Gg!ovvSU6l~ zPMC7Tx#lN0$YqsTcnr82II@G+PBKVryp8NzR*-KS87h_jTD_E0n%4ADu#J1dzsIX& z%6#KaDg6Aw782-VnZx;Y*N%*$xmQ2jT(0K&=tE)j&eS~VN!wpZ-!x90D5J94{FwgR zkCsNgZajw%OjnwIYzcR8+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+0}DL^V{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z$PQjR$sn=uHkyl>8ygu49bfSKivOEl&OfOwd%~{L-Ws=)R~G$L4su^0X%*ed{w#5l zEbHpzH>-a?37?{VRda=^@{tPJ4oA_`Yk748`)`KisYmYF`{DB^>7BMKruLOjSSVv= yd}AJ4&38MK79Vp*iAmSw6&h1_)ko)V=~^zSy)o^}I~V=tE7nUm4n6$+YApbrdS)O1 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test50/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test50/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..74c41f0216ba253f244a639ded0e31b0cac05e52 GIT binary patch literal 660 zcmXqLVwzyk#Q1XoGZP~d6JwnLFB_*;n@8JsUPeY%RtAGOLv903Hs(+kHesgFU_%K5 zF%XAKm_Jl6SWm${zbv&VFE=%>#E{2;3narW%9!06hZ> zJp*Hd#`(xTW@KexZtP_+XzXNaY-BiP+Ixq+Ulwqp4P{&a#>gEh^Xf9I9R>^p1+v$ap8o@ z?@Y{$42+B83}OuU*_cCRg&7(Dv#=U4Gcx`MhpsF?NPvZziIL4f5TrnXh0B1$fQ^kM zR91ljBE-kS#ln#tympd7V&iRa49F_8@ECA4aIBv7`sbnNA^phSX9an`k>Tvy>ouNg z+a`8QIB;-cVXJZA^SuU!S0;AEeu`AdwKCNIaOJ9){pD*-o}c91R!R6QH8~!>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test50/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test50/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMDS7OLxzy*@w7G`$IPcalQ;DhkkLsE-NGV{_6MGb^O zBFw@(&W?t<0Regj7J3FI26E!OmKFwv28M=428IR(QR2KN$XtU2a_o1(V!yb7D8zog z(Bjl0Bo{Q!NA@!#D+6<5FM~m2CsSi1!+F)T{RMK@qIaiA3nmuxWC=egDlFgb_I8!z z?&T(5B>&l21ll&e+F5#Vj$VVB$ws+lvGV8tT&XTL%WrOZ`zl7p?7EHZv-u)N<#u~- z(c;gGD*x=rG*5{ow7}<>Pcpw`>ZOa%tK$FG@!2!{w12y@Xv&teCzrm}tzAx|bwo1wj0 zL`9>&LiuBzT})a3v4?_(NjC(!1r|Q$k;`O$(loIC5 z-@5+S_x1T_D_HeZtodYxS=*hai)HBL>)21omSlbV?fnhsIT!w+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+0}DL^6LDTkO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zn9(rtjo0h%)@UwfZfs;IxO=OoQ6}z))YiT7d&61hyu14@=Il1MSNg@eS&QoJECtnn zoqIDu+)+k0%T!Xlkx5=NQp2}BAmPccA9KU+3x7&Z%Xc}l>(SL8bKNejmpgOxqS}SG z|1-Cr4t4C>K7ER_>=pBbWe4tZ^66(kJ-Oyxf4E{>5gx{{ypaT{|9>p8XPFWU^yu`PXiVinJPeKVE^-nV`;ZMw1QSZsxJ{RbA? zg4>swm>C%u7bhDe8t}6*hsp{wGX7^_HDG3B{0|OYS$>cJ3o{cV8#q>E6OtI2vS?S$GV%8aP(Zdj0dz^N@bzFkl6R zK_kOH!-J>7Q<*ROeB*FF(6cZy>i^`g#~1j|_%&(Lk5c|$7G>wXr{82}xBnj>=JQeK zMuGFbYx{nx`n-@kefaR58BD$_ih|y7JaMpF@W+}X|DN?1NA3u(^e^7hl_Gme42Azr md}hz<5?Fs}(Ux}#Q=V>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test51/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test51/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMDS7OLxzy*@w7G`$IPcalQ;DhkkLsE-NGV{_6MGb^O zBFw@(&W?t<0Regj7J3Gz26E!OmKFwv28M=428IR(QR2KN$XtU2a_o1(V!yb7D8zog z(Bjl0Bo{Q!NA@!#D+6<5FM~m2CsSi1!w%Mo!3SP-{N9`YK|LvP`|jgjGxk2Nyxmdt zOX=YPul47idWEgN&=@kyWAhy&DJBW)@AKC5Ki`%<{qKp(w@(KztdLpsw&%Ueg>QKu zT+eCjxEJyDnJTBO?C0kGFR$08tXX?Yd-`tc#;Yv>kh ap+DX^=>M(v`|s?NKlohgs+{GqJRbno3DklB literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test52/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test52/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..ec220874c149351ffcd2760b73f349849ae2b32a GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+0}DL^Q*mBPO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zFqyYo>W5&26q<{f8ygw+Pkb}C`KERFG45|=Q`&9^tT?gXzj3X+drtoB_iMx}rd&Px z^~}`iTZ$%6{IlTO7n_aBg*z0VySwY0{-n?x*>>RbveoLAm6DT64RjlxpIdKM|Lc&( z@u&ljUHq z$)`$@mb8-sYri{bo=e&<^lI`em6?h66BXnOvg1wIm8;%-+Iqe-Lnl~7KP4?Uy+JH+ z)6<8n)_Ss!_h;4Xb#lCUd(miNvPIs6ty&V>cJP>d-dB0$xR=e#Men87ay>iO>=s;9 z?9ar^$iTQb*&xw?pN%) z(B{FI%FJlMY#<2I$j8FP!eKIRx6}{82q|zh$SSk&7;rUkte*Ay=b`5z{m5a!3JQZp zhE;6ctCm_A)aahKvb#9FMk4I}`egPq#Z8I4!t--hTyWXjwtvC;@MF22@xg6^%v%4l zHl$WqwW=F0edDC?PB)-lK-1Lfv-YdPS&|&4H6ojBGFOw%X}MOj)dMw&BF;X!k1$Y#IkHt~1?rm!Am$7B|O# literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test52/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test52/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test52/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test52/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM#Kg6LnTe5!iHV`rfR~L^tIebBJ1-+6D=ULRoFTUXCmVAp3!5-gXt1G# zff$IxCCneH7p$k?o?n()l$V>DS7OLxzy*@w7G`$IPcalQ;DhkkLsE-NGV{_6MGb^O zBFw@(&W?t<0Regj7J3F|26E!OmKFwv28M=428IR(QR2KN$XtU2a_o1(V!yb7D8zog z(Bjl0Bo{Q!NA@!#D+6<5FM~m2CsSi1!}H8m`)Tjj{n**<%+tWBEqGdlMd*iihu?u^ ziH|p2h$*kk*b~B2&+l{ManFX%bB$~vpXNWB_w(WL*!txhyWd7kaNcjStHOQz#Q)o_ z&q`+3;T0D-D*vZvEi+r$)u^9)yg$3;A1JKdlEzaI9FbOiN#GL4oRyK{$DM3B{wioO z=3m{-#LURRxH!ik3mlxX{EUqMSy-5vSRWV|urY_qDzIo8s2gyzaVE5RFs3py8ZaVr zn2lsa*DQ3 z^O`NKw{_b4*xT8CH) gX~uzh4sNG!EeyGGy~adh3BS?V(!T$q+6S%z0M<#+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-GBf+0}DL^GjU!^O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z_A(uBH-@buT=5Ye^Ix6i({(nmWB-0dmM0Mags*8E literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test53/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test53/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..72eac943f4c1a2bb6d81adde92679dfc667f07bf GIT binary patch literal 692 zcmXqLV%lKP#3Z?ZnTe5!iHV`bfR~L^tIebBJ1-+6D=ULRoFTUXCmVAp3!5-gXt1G# zff$IxCCneH7p$k?o?n()l$V>DS7OLxzy*@w7G`$IcQF(&;DhkkLsE-NGV{_6MGb^O zBFw@(Aw{LdB?^vt$r<@Y26E!OmKFwv28M=428IR(QR2KN$XxR5Pr+-yv!kJIK!Bcs zg`R<#LF0U6A2YHtFgNxx7&LY=H8wI#Rbv1Du32EO|F@e8d56qwk8U}9J#EF2)Akjo z5`JrMRPA`WUH|!Pm6t-gVS67+aY}7+%aDDxEI>d>;-^ly)~lH^LL750@a#NYa`JKC z^L#t2($x7OT+c6WIec_qpWydpd>+>i*G?bU(KEw)uI))rl?5AnpMS6TT>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test53/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test53/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMDS7OLxzy*@w7G`$IPcalQ;DhkkLsE-NGV{_6MGb^O zBFw@(&W=X90X}*LhI$5u26E!OmKFwv28M=428IR(QR2KN$XtU2a_o1(V!yb7D8zog z(Bjl0Lxc+&=Og=>k(GhDv6sQ1v6HE>k>L=d^UG&;qEAZ>JZ_1);<{w{#RuL!<~xh3 z|3)NfPdnfeb=cxfa`?$->t|#HcKzsQPr4~t_uA!x_Q#S>>@m{fMa8%3PpMkUEAYS4 z-_f;leP(|2%@@2U=jB>urT*o2^$4By_5S$;p`NE2|JU!mxP^azk+{XKweL=BU*ajk z)*h@>$;8aaz_>WbAOIYkviyvU|5;d=nOGlyqd``Ih2MbJfSZjoq0NIam6_3i(Lj)m zIaHR9g^PuQqx%jY)5L{E;Bc2!X5lg5YT%gJbW+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-2fjw14BInLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zkV?M%aL(%56=*JIZfs;IKPLIfV)ptoiwn|(_|!RftLn>$rEfJ2xOVtwY~)(b=@Nwu zQ+qdT$$BO%@Goa>*)iL^tO~bTF~W*f&f4$yEwpc1dXJBxkGpkx=>^H7g438|KkOD> ya#+?hVRt;2hDB`anTW&Jc5h)-6wBOm&E(qDs>eKeZ+kC=TbUT;yXbRI5&!`FEnyP? literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test54/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test54/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..140ef06691fb469c0b20771fec0acdcf90071e7f GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHV`jfR~L^tIebBJ1-+6D=ULRoFTUXCmVAp3!5-gXt1G# zff$IxCCneH7p$k?o?n()l$V>DS7OLxzy*@w7G`$IcQF(&;DhkkLsE-NGV{_6MGb^O zBFw@(Aw{LdB?^vt$r<@Y26E!OmKFwv28M=428IR(QR2KN$XxR5Pr+-yv!kJIfRCPm zp`L-ELF0U6A2YHtFgNxx7&LY=H8wIFF)b_KH9c>_dTWEEStl9wPRJdbD3MY9W%CZc ztQAfVcu##g6Wg!4%kkpOmZg8TC~M6Ne)&Z?dTF1oBVUHErsXob_5<9)HR;R;i_&|R zZoCpyy~c80>U^0S>u!De#W;OohE3)ljuUMV`itUA&XVs;D+aEk?E_y}y zXxUmOW=00a#c2j9210Dip|Zk^jQ?3U4A>YM|1&W%fCE^TA0)=Y%*4nBju=@57JdU> z18z3Xgf7VT>RIZKTkw137X02ygB-KmHOmYYkxGp z+!pohj@|RqX_m(B0nV%a&k4>vqNwmyin()}+qN@xD<3FcopDcSqKvavedpB~SqJ|K pbhjuxbNG6;$Xm$%-rt+`W|JiKl{c|8PuNhQ_HwoGwG^G}r2x<2)k**W literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test54/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test54/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..c531566a933ff6a8483c120097b402c25b8b151a GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-2fjw14BInLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 znAvsDFjy&WDVmF!8ygu?!skfcI9E4c)8F%J$-(;LH~*ZT?ein|v|d?0&umTI^KVxC zJ#t6>jf}*i&1YjWJOvz>C$st`ESSq>5g=muQR_$R&t0Drcl=&7UzTs9+LGT1>hpeV zy=^6H$kcC^n`anZmUHm9>{ORft2z7Y793-bUhc-_m%ZLwZ_S6>ZelZeXO#i~hUsPy literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test54/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test54/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..506761d71dc09d527b508e3709d9a8f5322a53f2 GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6B9$b0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzInapJFIrzz5;6holylWagzCiW&%m zM3{wnoE;5y1AO!h4D}2Q4dldmEiDWT4Gay93=9nnqQrSkkh!$6-w0uU<9uWvGqN%; zH}*0ZGQUT{4?re;Y zeZBfx_O6Z<6Dk$p(oA z{A|pjvcimv|5;cKm>C)WgF{!AA0)uS%*4nBjulx27JdU>18z3XgfFI?4-v`dt literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test54/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test54/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test54/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test54/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM;Tc z&&C`oE6m9FpM}+cnUV27ICN$CK>{qyOpMRKu_CL$!f(K9z|F>)(B{FI%FJlMXdnpE z$j8FP!eJ1`5pr&M`Fe0P$SSk&7;rUk{50W?<#O1Tha3j1pfG4;=s&sC_kmnL$GKyV zr_0Tr$Yo#s!})a`@3WAet$`<`szmkP*OvWy;r6!K`e5R`e^b*Y>nAnHJZn@4T2tH3 zd%ITuy7|TFnU8fg+3@~bY&G3r&7On1dH8ec=NI<=leqnQho;TE2j4Sirmd+kIC-5x YsnzgER{L|uYbyf3e{|xp3_KtY0M%~M;{X5v literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test55/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test55/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..371821e5e217e0ba942f1f80fa6b65a2973ae2d8 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-2fjw14BInBXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z$h2NzcAJeQ8qLMbjg1T`-gROod2yWQ()hkKzMAw%G)Fu%EOL!1W8ku$-_kC1uNh3w z2l&oT*jI62d%^a96OtKUole@o`Mtu*b;+Un!UHKg`kx-;=8t$(c1`(>_Qv^P?|w*E xv`r0kmE64|qpQ~K*v96DS7OLxzy*@w7G`$IcQF(&;DhkkLsE-NGV{_6MGb^O zBFw@(Aw{LdB?^vt$r<@Y26E!OmKFwv28M=428IR(QR2KN$XxR5Pr+-yv!kJIfRCPm zp`L+}LF0U6A2YHtFgNxx7&LY=H8wIlGxcW><#5F)n_$Zu&?vK^YwM2CsI`Re+pT&|JbxY zqV-z30Z&csmTVT=z@XdmtSt!7(AL%)(>9)xfcO*6W{#o`>`!2Lmf8 z7#bPu=PAE<@W^r=ca^70BI`e~^S0fmU#^nrTQxgf*~@%ln9_9_r{-(TAG@w(taNSMep+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-2fjw14BInBXM3!O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z_-Vo&%jK{w56#8Qjg1WPY<`FKr>%LnDd3gHk{fpv54_o+s+mt4<2y}kb5jc-OtTIYPjqB`DZYVtYEKjsrz#5qHe z!Jurm&D+4auk+phd8WifCf_&_RPe3Vf%&|t;@^j7U;JKu!Qi#>Y9?kz2FAt728jmz zY|Npu!i13{2R zJ{B$(j-Mvnv0M(@^1#s`tIWb5b>o=Sg zdRQ>?!De&g3w)=KZD#)wWEA22Agy?lgW4YU|IzbK)aK|W2&Epgj1J3dVzqF0YZ8>6 X{gHPr&*C3tCni@s6fcp;ttbEh6CceZ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test55/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test55/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test55/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test55/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMDS7OLxzy*@w7G`$IPcalQ;DhkkLsE-NGV{_6MGb^O zBFw@(&W?t<0X}*LhI$6Z26E!OmKFwv28M=428IR(QR2KN$XtU2a_o1(V!yb7D8zog z(Bjl0Bo{Q!NA@!#D+6<5FM~m2CsSi1!-nk(YMUl}{xAQ2UXOTvu&&i~t{J@{dk6JE{eU% zulj^LS*%uf%AU3SMm$M+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-2fjw14BInV{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z_-H1gzBcsLO*9uXH#Rc7h&-rUy7qzm_XU6XV_YKIw}sxnv+m!`y*vd0k_Vf`4|!~w zYAyb<{r}tF!9Rmvh!`$eyt3g1TgA`Ij!%ruZwqd$akb8!G@I1b6CmSTBZGBdD&v>b_<|Quxtg>n? literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test56/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test56/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..9b622cabd8483e23f75ec4f16338c60112c12812 GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHV`dfR~L^tIebBJ1-+6D=ULRoFTUXCmVAp3!5-gXt1G# zff$IxCCneH7p$k?o?n()l$V>DS7OLxzy*@w7G`$IcQF(&;DhkkLsE-NGV{_6MGb^O zBFw@(Aw{LdB?^vt$r<@Y26E!OmKFwv28M=428IR(QR2KN$XxR5Pr+-yv!kJIfRCPm zp`L-ULF0U6A2YHtFgNxx7&LY=H8wK5_SqGly2M1G{NZ)By7!%n%h(;Ker}rg>qmw9 ziO7DQ9e?@E+*hd|zQ?*J&F}PYr5(1P4trGGUR!J{*_%_fZ~7szP6y*FEMj6$Yp?sf zY>rB;x-(7AB`*8z@uRn7?+MPcx{%_nJv;Z}tUuu|9KJQLKeT4~nhxg#{kPnPW*<+i zVt&oU%*epFIL#o%K!}YwR92Xg@jnZP0UIOZevnHbr?5hJU>!f(K9 zz|F>)(B{FI%FJlMXdnpE%g4gS!tv2eM15`OtDE4MkX2^kG2m+8SUv0Y&qL2c`jLZy z6%-7O45EC2IY#wb7nS+$y0pgYg>G6trBwORvenb~Y`V)Ja5U3~vwN|w&hNhI^-qq+ z&e>U&>wkC4R9{s^zw^`iS4WG4%J^;lGLtEFlSuUm`vaFw^zb?tpS$m^%6-0^IoVOc oY~th9;kWkRP+%*3C!4WP?EF0CI@#}uQJtR-UVh-ubd>Ek0I(a<9RL6T literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test56/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test56/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test56/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test56/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMQlbjLEUmbu8%CS``fm93FUjZWSicT;(2i5 z@gmOudf!ct>^}G`TvyI4+f*$1)b2XF1&3!X%W613{2R zJ{B$(4*A45ruZ|`m%-5>tIWbzv=gO_Z zbBx{IbD#9%Jpah{lVxSfr>{z7^QGThf3@fGmE=o1U!2wZ?bB$p#_qz$sj~MLhjhru X_DIQm%UIK_Tz%GiX>+Sw+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-2fjw14BIn6LDTkO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zsPVQGxOrt!FPe*)8ygw&PljK=vNYsMO7WF0vnk%GTxzekC#QZEQuxF?L4dpF_{!4P zw^zM+V7)=F)_M_NUF6Dlov+%1_bDS7OLxzy*@w7G`$IcQF(&;DhkkLsE-NGV{_6MGb^O zBFw@(Aw{LdB?^vt$r<@Y26E!OmKFwv28M=428IR(QR2KN$XxR5Pr+-yv!kJIfRCPm zp`L+>LF0U6A2YHtFgNxx7&LY=H8wI_UNiT`6&5D0{7WtZ0&gD5lv*S$e6a0P!o*8A zj_#e7)^&GXp7j6TD||)IHuPG5cddS{?~wh>#-o{$Rlu{UGIL2#w%FlY7KitKIQxHQ zrNE-A(aCYO_8*iZ&SakXpZG!AM(Y*-s>;fqyCNx!6%(a+V`@Hm_gRKWRq$Qi{Lh@p zE}w~+k%4h>nn8+z5F2x-tS}?ve-;h{Hb%z(OpFZR0G8zkiLo#AWiee>k}o!oa%BpiMJC3UYU=iAfAPEDBgK2PWXn_HU8{UYyV$iL5D3xDpZrTWF`Or9vjYJ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test57/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test57/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test57/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test57/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMk_toPT{dDYTZks)ecWAKg-Z_ bPf+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-2fjw14BInQ*mBPO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 znD>8{clQn_HZ&JAH#Ran)3a=FIm*np^b3#N@kd*KE$;qzk6BLZ;d9lH2`sAkTiu3U|3A#`8O?U#{8TbE{E$YQb;_HAwo3rG@Mi@8 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..42e983122fc9bb50110fce4989842e06736bff8d GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTu?0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzIna?_wxmzz5;6holylWagzCiW&%m zM3{wnLW)X@OB5XQk~8v)4CKUlEiDWT4Gay93=9nnqQrSkkh$d9pMuwZXGcTb03SUA zLp=jigU0#DK4xTPU~cSXFlg*#YHVcqx7AS~t)fruaI2u4OKN$~&-a(7uW{LLFI4Ne zyROJ-1ABMvz6sJhZv8Rf-M+5VEcTClNnTyfnrRu)XI~$!@trp(E3e}0oeYjbi7DY~ zQ(diU|2heOkWajP?e9r@g{6F1?*5&;hub+n6)fvu*sSE4y@2Q0{8x9)TkqdqP#ZjL z`*$X0Mh3>kX$C0Tvcimv|5-Q;*cciAGcmG(16Y9)xfcO*6W{#o`>`!2Lmf8 z7#bN2wlF947^*Cj=+FE-we4+LsDbGJqZe*i6mO|6p6DwWbkF1Onq^x~dfd5Mzw&kh z!zWiGi(L^)FXQ=)U+XL`6aEqA`S)LJvJ&^E_;_E}9|Ea=S0731S(Z7WqRjEDyygyt mLm8e6`5OPZi!4YNaj?pC*Z$RTL(=)5=h@g9la*QXz5xJnn9#2P literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..7dec9c1ebe88de7f1ac66c9095b973f2ffedd2a9 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-2fjw14BInQ*mBPO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zIJsJE@0VJin`ka(Zfs;II~=!**=FN?=@|`A63gXoW=?uKr^?aA)(PuvieBVFw($z;rA0EixzW$$i7Mt&*y&1hr*U50$ zX>Bl1x4l^Wqrma^!PEU|_04Wu`xw@4Z{%&-{OoAzdX~C|2NR!J?oiOXCSVN!xjSpR literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..08eb808c4fe70e3b19a594a3008c2422ebba8596 GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTvN0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzInapJFIrzz5;6holylWagzCiW&%m zM3{wnoE;5y1AO!h4D}354dldmEiDWT4Gay93=9nnqQrSkkh!$6-w0uU<9uWvGqN%; zH}*0ZG!wV&(rxo7I}oKH9B{*nz0O+ zk6mL?`7rQ$*&l}l)i-a_I+kr+#>s7%@@R2OsCk0LM3?niDp`)w-**Fv0JQ!1%84VZ> z1VMWFSh!d?POcW)`=!?BCO9T!m05TUxEeU-{h#ICy~BwOIT%<$!O+Oir==1%$wy;f zRjBmRN&Ig+=VWpVUHE7rUEi(NtZ-$^_qFOPauz86SC!kAV13%5vfEo<%fzW=^U4}c zU)$hA$Nw)Y-dCrSKes)6s`RfVHy!^^+tqFEdV2b42W7Un1>fd1h%hM4&k(Y3HV?nH aWs!>IyN1_nvhu0^`%X1|;x!9B!wdks;LT$I literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int3.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test58/int3.crl new file mode 100644 index 0000000000000000000000000000000000000000..bec634480e1e6617fbcee52f425636bdeb66fe7d GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-2fjw14BInQ*mBPO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z;0(Q&b3NhDIy4tEH#Rb?Y~Lul$Y|m$(>HIYxXqHUK2!2w|J98jYL))WG=kv~RbY6a`He-Kz=HJ`rn)4$xmfVcGpnEU9@IY&at_Ay}EArRO zmcM%+o~69*LdxbTJ<(n}WEU6Ns_1=))_s&FTK|M2al-b_0MdUNha=o+cbsBAB~o-!@$V($7yr%h#>&tLz{xRA}{ z_4fE2rbkml62GoyGTF!ac=ozWA>SS?*}KnlkGFxJ4sVUr(FnKHzBkVQIPb^b%ivcy zR5|~ta`c;p>>MTOS;ZlqDe)IJ3TVB#a=L6+%({aKrc>qBU5-r-e9Xkm$iTQb%^<}< zh>bZ^R+y3TKMRKe8zbX?CPoHu0L$`{Y_7}>xPBdfr|Z@_E7&BmF~=E0cC%xJ)9 zAPCaS$HK+J!5Mll=X%1Qb>NtgRc7Ha;A-GFxms-Rms+2j$icu03Wi38+&vxTsmw1g zZ~pdonf|h`kB#0{wCEX$>0dw7RGa-s^}$WgRPj2vkV_`26PZ$3OSf4=eD8 zKiGTVz6?VFcl}SP8)qCW#aKgv?4Eph5O2BrL({ANyYYJ-`aUvW)@^dcyZ^4d__NZ} b=^ITlgD-G9v7gkFadBwrv*(^SV?hZ31su~A literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test58/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test58/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test58/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test58/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMxtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;KgCeMfDgiB4@oU9$;?YP6g3bA zi7*TEI6E5a2KeY180s0A8OVwAT3Q$w8Wn%rk1#cMJ~4&bFJfMVrFDuT%2r>Xu!|L z94af!$oQXy)qt6i@jp0pW%)q@EX+)d&%m)FtH8o9)xaUYDj_IY$f*)J3|K*7(8!Q%`f*8F_vuTgxy4!! zy>_`9UgTLXr{HfkBO~|I3PCwu>HHWmQ+~&qcauzH)MDpMVLi(k9kXGi9QYN z3v_>LtL%CdzQtv?NY9yjyX%7{Tzcjm%3Y!O%YtRe4+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-2fjw14BInGjU!^O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z$aU^|#c(ig7MhEh8yguqicOD1&)B}&dE=?ghiuh!ijN2Ey!g2Py}9z0W~b%hzK6?O zZ;RA?5xc{z#Tv{y-|)TK%g@!bRjOV7%~!Y0OEJ$2b9fmsaTY_tDVI2t&(r$j_WFw5 ytJ$n(xzzs{i}LR0GZTydt|&gewDrL6dF|)639KkP8@!{fYi5FXvqSIqn&$vzXK8c* literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..be0ee21f2e38efc8f52c5687ccd5616a6e02db1b GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTu~0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzIna?_wxmzz5;6holylWagzCiW&%m zM3{wnLW)X@OB5XQk~8v)4CKUlEiDWT4Gay93=9nnqQrSkkh$d9pMuwZXGcTb03SUA zLp=jCgU0#DK4xTPU~cSXFlg*#YHVaU_@JS~u}5EBZQ+gA0f)o{9CO;dAI4|>z0A1u z_pcDe^}e20zTG!77H-w}&~18}XX?-P_l>gK`oDyWulQrJetPKXS%HfM5S!{RM%4vxIv_xayn zb$B5YGb01z;xvO410go%P+4I{#{VoF25gLs|Ct!szyU1F4-#Wx2Jt}=Bdfr|Z@_E7 z&BmF~=E0cC%xJ)9APCaS$HK+Jk?Y*`is4|~EO1Q7Dzoqya5ZqOp7r|Yq30p}$icu0 z3Wi38gZWz`dUy{1nqRPbCDWyIQeIEFx9k?%`GO@}VM)g-UB18xdf$FC#S80akTG6$#mSYAlM;9{kAv&pn%t( literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..2b2fe9cedccb100fbbf917d3eb3165c0f12f2edb GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-2fjw14BInGjU!^O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z@O|suATgWG8O_Dajg1UDOj@IZ`igrht`x2>72ELVcG42tO|MNB-pdYL)OX><+{Qh# z-_6&YY2x!}v4LNwhwx`(h1_e;9xgs|DDYxdlmF*88&x{JGRpSKp1X0rrSG8D>CWT7 zg$ja-?w&dOR{HT#iIqFQu6`N+-)L4q)_LPqT3h^CvvRHcpH8WJ9rC>9@>XpC#Nuw7 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..a84a7ba5e0e82c6250b28ae97dbfe2e8f41c4c55 GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTvV0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzInapJFIrzz5;6holylWagzCiW&%m zM3{wnoE;5y1AO!h4D}4m4CKUlEiDWT4Gay93=9nnqQrSkkh!$6-w0uU<9uWvGqN%; zH}*0ZG$sIH*?)6Vin-J;t02LOQpu)yhSBBIdHh90WxYN$D>5-NGB7SqGe|KI zVq*@K6=r1o&%$BA#>n`eiID*uz_R=xF&1VfMmBK7$SSb#8}J%%vvDT0c`&9jGa4`& z2!izTv2d|)_`daSkeJQp42}s|WfmR-t_F@==dM=_2jgZT2Lmf87#bPO8GV*LJbw7l zu8NBxGi7uH=7c1^`BMIbOW;;LgWvP;d(U3D3#TwH%{}>Xw%opl0Ud7nyLBgqMCuAJ z%h0elIL_eOcD_$peA~=d4;=pN>Z#tiP*us^>N{uX&7i}D)jPf`9`atfsr0E=n@C;J aGPz6HZECOOe!R?r_#s?K5n literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int3.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test59/int3.crl new file mode 100644 index 0000000000000000000000000000000000000000..cb7885c171d2beabbf32c89f6830648d00226aa0 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-2fjw14BInGjU!^O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zkYAM$lq}>_iRNPF#zuyM@8^C>eA7za$}RCuW22I#1IOxVYVNHjFWQ+{k`1SAcMmN* zbMN~~mZho&W|JQ}&YAjv(ctS}W&7{f+CRmG)z>olEi}u$pk(dw_=51Xl%ON!EY?$2 y{;k`X!FG_I8I?cq)$iTQb%^<}< zh>bZ^R+y3TKMRKe8zbX?CPoHu0L$`{Y_7}>xPBdfr|Z@_E7&BmF~=E0cC%xJ)9 zAPCaS$HK+JA-^giC|Ss<5*!n<$}BtvTn!w)Z@n8NX0tgX2Lmf87#bNYrmubOz;z|S zH+HfX_f8LU|EXslzdaTiz~b34X_4!XXGaR=TwA%{O74xE*Tj8+ulid5teU6fc_Je< z-H*Y~@83F>`c+puUmO;V>Ag8~Y0JMZC6&T+Rqqo&md^L*dZYM2Hv4ea%Vm!yr$s(2 bxmP`FL)DFo`H9zFS}tqNJG-=bx$FS|BFoca literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test59/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test59/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test59/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test59/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM18z3Xgf)gxEXOHM~7-z*;PHzibp!dWmY`)9H!zO1`*YP}Azx$B+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-2fjw14BInb8%ivO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z*fK?^F7{*31~eBlH#Rb;U29Q}@8`Jm_3sXrkfl?UxgS11yDvC|M7XT?w)8Uqqh^^KPjWt6S^0#{NgFybbW1s=*QXm9=|u7nUI9Dd& ze4BmY3rl6O*M_RCESo13Ppx~gZ{{t9FVkFpOKlUMbnczalEY22RZa;PYwnx@0ORg! A+5i9m literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..01d844201b8ccb3dd33574838146505f97efcfd5 GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTu`0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzIna?_wxmzz5;6holylWagzCiW&%m zM3{wnLW)X@OB5XQk~8v)4CKUlEiDWT4Gay93=9nnqQrSkkh$d9pMuwZXGcTb03SUA zLp=j?gU0#DK4xTPU~cSXFlg*#YHVb9QYrL!viGi4d(#=KzrPBWx}q+byqhOHZfpAl z-|fwtw3Sm%b6q;nY*rQ(4L{Y!Dl?K zMHQ|t|G@42*jzx{brGYgq=lzZ4x{Imzh7-v6f4h>=MPt!;Op~1(z(knta6d^_AkLQ zOPQD%85kF*8Kf8pu`!3r3NtePXW=klV`Ti##K;B?U|D{U7z;Cq4~iIB1r~k-UIT76 z&V)7(##ClT14aWukX}9(E*6e0Q-tbbKlW?@$Aqjh3y%R;1IOxFuYVqT9@38-46LAF zXk@r_?w6y|W=^&<9u=tvEA_5Fx1E_T-63qNoY(lYv-s(~vXyJM&A54g`s-^F6RT59 z1J6t@Z+ST3r+PMzWaZ7<8>jlO=GVKHWj*PEoc^WNT)ws6KK;mzXK4PZEHhu2S+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-2fjw14BInb8%ivO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zQ2AG5C}qBJ7MhEh8ygw)RO?ux!rNFLcN}v}*qT@T{Z&i3cx7>$RZ`@FrRs_mM|^5u zpYzmx=BI0L*W~1}(55K`^UI2yj-LrMsx-0V@IlOF3{`X4JR!&^DZyIyju@$Rl y^Hf-z3-zc=6Po$*%jMPAw!hmR*z9g&vUUFQ7W?xOrZ?=~Pq3|9+@-5uQUw5&JZ72z literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..0054dc62264963fb5e2774865cc4ba503e28c123 GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTvR0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzInapJFIrzz5;6holylWagzCiW&%m zM3{wnoE;5y1AO!h4D}4m4dldmEiDWT4Gay93=9nnqQrSkkh!$6-w0uU<9uWvGqN%; zH}*0ZGhg-ot(Jk_z`YPGO_@a5N)3 zUU&62tX;Y@Nx1Lgo{9y(ZpH>FpU9VQZ{HbdXf)aSO2mB0e3Q;EvzeF~85kF*8Kf8p zu`!3r3NtePXW=klV`Ti##K;H^U|D{U7z;BKBO5qkWEEKW4R{T>**Fv0JQ!1%84VZ> z1VMWFSh!d?RQ}Z%N||q*1&#?>WfmR-t_F@RQ-tbbKlW@u4hB|GFf=mU@>+kNzq3HL zurj()L#f_(>z(?w&7~UxF3t4k=UKM+)0(^cc_$w1UcOB;^|ZfqZukXBR_Qz1-1?Pz zD~fC5b_L6QD*WhjB|h`^(U+IL`<+AY&b8U7N-{vP^k&=d#&=3LQW literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int3.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int3.crl new file mode 100644 index 0000000000000000000000000000000000000000..0b568e7cc87c4edf36835bb98ffcb0b25215c8a5 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-2fjw14BInb8%ivO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zSYx9WcxG?-J2V$FH#RbO_E|5#rz|AznjZ4nR^M!H!uIrKUZo5EE_J)5HYJ^*z49x& zV}@%80L?141{6Bl`g@2QxPsQHOIg`Fjm~Vj%<98k| yMHhbKIZ_R$^u@nQY|-agpucZ+re1pZ>{|JA3bQAye`!C#&f%Dh{jp9j+lv6oRAgKL literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int3.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int3.crt new file mode 100644 index 0000000000000000000000000000000000000000..6fff65cc774fe101ebce4cb0cefdbbc2bf6f5364 GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTvB0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzInapJFIrzz5;6holylWagzCiW&%m zM3{wnoE?pH1AO!h4D}4m4dldmEiDWT4Gay93=9nnqQrSkkh!$6-xy(k<9uWvGqN%; zH}*0ZGH|u<{Qx?p1HA+fzMOGkonZ|n`aF- zTQ!URJ`y_d{j5hT_!jSaZsDF+>bJbv+!)hv` literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int4.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int4.crl new file mode 100644 index 0000000000000000000000000000000000000000..4cf694a9873121d2c36b4d68dae84e6ac571eaf8 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}r z-2fjw14BInb8%ivO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 znBY=4o5yWk6Pk;e8ygvngaoGeHxGLiY0#LoWf#`#Nie4JP8-n|Jq>ZWFQ`SylA z(maMNsUDvu@hCAb{_#d@;nS}NUu4HCRg@N`DBaiX5GdN0E3)x^ZdS4J!uxH8w`45$ y&F>Vu9qquV`bY55G0$ufsp~y=MK&fjb#A?rt}D^|>YCsDPlc}-*zGgFw*mm_y<|-Q literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int4.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/int4.crt new file mode 100644 index 0000000000000000000000000000000000000000..c5eebca96031569bad4b3ea8d3ed77b8fdd5b827 GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BEO1170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;KgCeMfDgiB4@oU9$;?YP6g3bA zi7*TEI6E5a2KeY180s0A8_0?CT3Q$w8WuJoPKN-?R53bI@e zQ={kGtzEzIPJ7MLE$i5?_Lk}Xmx*x{cF$({7BJ%m@9WQBeV#m(Ui2>FlMhF|@70!n zcO+J+XGEv=e{Fuh{ZWZ|f7o2#$@vQ5F5kp|RxCLeEHLZU6McVAcP3^=2FAt728jmz zY|Npu!i13{2R zJ{B$(jtMS>vw7UsHG!i+R+)vzfUALHjg4C1nZ4ofki&o#6b6k9>bGT9<+;qf`P9{9 zlSYl(n+>gAR+6s^rvIv{JF(|I8^`OY{G{Fc+VTV+KHy3FVQsWQYOU^x-8H9Jecd%* zZS8)MdC*9FU4`JsN8f7wufItCTy}l?@9N~%73CjywVtt3|8Z~D@@B3`Nt62}Yec(D Xwa@cZm2KOS-73~~a%#M@MQkbn7J$*z literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test60/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMxtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;KgCeMfDgiB4@oU9$;?YP6g3bA zi7*TEI6Io?2KeY180r~V7|4n9T3Q$w8WnIo}!v@XW8y!^~+K;{0=iQGcqtPPBut1 z;AdkFl@(@W{LjK_z|6?_9~`=}{2&1qW+ujG;8>AWVBt65HQ;9BOlb39Ol4*?U^EZ} zY2;(!V&T|+V98wD)8Bl-(IBhL!ehYIz!A*4?nhZGZw+!7u!6#%ks-IiWV?Om{;1Qo zj2HIpk7fUV>L*Pe;{@}n~AZMU=XhyCBp;;wx9@}6^*-^voUTPk`_bJ%ksxILip z%bWUnFW8H_wR7tBM;@Iq literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..05c2809aaea2415bf84d741a094d0ec25a8dcc53 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-2fjw14BIn3vpgcO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z_$+oenSbjl12h*iH#RazCuq4x$xW-e+$2{ud$HP&-D(%r|5@D)d$Z@}i~}DQ&QO!s zE?o9BWxM?JbvK%Mv*n+kNSpiQ>uSG(={>#jXZD9EFx*wPZ+Nw%^m0q5K3m>HiN%xu z_q}xg>-*rvS^b)?lF#*bhkKhpGm`f6xc+|ScQ^4rpQQ{2zM%gjI06+zX7iS zHydX{n+IbmGot~cfgngP9}5=?$7iv-$^2Va8GvI#R+)vzfUALH^{m%F4?Pd*M-B#7 zP%tzy)b_sAPiXu(QO)P!=CkW8zTT3F+m_&Ax^#14hEAvImbJH(I8H13dj*<4*Zt$>Zbr`X=KgqgD+7HZJ>uJOS+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-2fjw14BIn3vpgcO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zi1=t+l9Ic_7tO`Yjg1WP|2y~`4BvdZ+?`XE*>*bf@Wo7*#YW|O9vrwODPIPg3 z_lvMo)p5qR5^{`FcOO6FJYVAGg)7mm2P1FzHC#PiC3AZDjy1^(g*!H0UAVScOZ8Ki yp=r-Pov%UGdCLw?iPV)1WmvU?>le?=)zRnqKXWLB)J{!1ZdZBX8Armqd7A(n?P;U{ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..bd4e40ea3455e4e9958505023f0b05479aa39f3e GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTvJ0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzInapJFIrzz5;6holylWagzCiW&%m zM3{wnoE;5y1AO!h4D}2w4CKUlEiDWT4Gay93=9nnqQrSkkh!$6-w0uU<9uWvGqN%; zH}*0ZG zAjHNTDl5#$_@9NtfQ^yyKNBM(IDlpOL1HY-OpI*ch>=xb;Wywl;AZ1YX!Br9Wo9&B zG!O*op@Rh@-;>|%fV>~G_G*6IGzRqb-ZpQ3-$j`8tU zT064Ua5>~33vXG|c>eXeiN?k|j=HjoocX<__s^`GU;m_BNcXUKu`jr4Uz++{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-2fjw14BIn3vpgcO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zNMKETsziQvtP0lo^tZEl4||6?1M*kE$wV+kJ(Vn@YYQJlFD@L`PFO@kDD9ouSytS y=IZWa)?=O@C%S2|`kM1s{3h*BSaQK_ugq-y=Y|f~BCgK4y26=@ebb{S|2YBH^k&)s literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int3.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int3.crt new file mode 100644 index 0000000000000000000000000000000000000000..4f9342b2066d70f97520666be16246915b0478b6 GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTvp0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzInapJFIrzz5;6holylWagzCiW&%m zM3{wnoE?pH1AO!h4D}2w4CKUlEiDWT4Gay93=9nnqQrSkkh!$6-xy(kBZ`k1Ss9oc zdl?KGJDD0A85S|U6+F7}yrqg_`#!BbT&+u#ds4JcCpB-(H3^|7Xdour;pT@0mjRoU4g79?#cThWrp_FQ1eDDzhaCuX-lxtl@EMOGv)t^rwugDqejq+`cQxN#(F$m8)>TmR5mOCT2zk#>Hs{DF#Ap z%%QTvjEw(TI1Jbr8UHgeGJ*qGmLDX>!py|T296k61r~k-UIT76&V)7(##ClT14aWu zkX}9(E*6di*2G61ZCi@LF(IqW!ehYIz!CA$xFjWahc8;hGdDIe2;Q2dx_iT?3!f{m zZ!fx8mCmrdMT$pW{ClIGN5PVy3E^| z&C>U*TmIO%Y)i>u6Ae@SO6IxgGJe-fw5N)`oTF=0x%PS)%ckuXa;c6hMD-0MzDS$y XT|QmYw(0Z>p&*wNRjzY3)SdzWfN94C literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int4.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int4.crl new file mode 100644 index 0000000000000000000000000000000000000000..7161f4192689764706b578d7f7b56036ce9d5ead GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}r z-2fjw14BIn3vpgcO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z2xeXPqpX#;2F=CHjg1U4MRS8g<`i0UeZLUGxBKY#TDhJp4tq*?zDxhP%r3<XX!$ z=>vj)_Lw}g&n@|*7diP>z~)z{d9P*z1@<0D9(3Lj;QO^O+OFqYT1~SBXRZjTG7Ol(pvy3J7}x` literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int4.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/int4.crt new file mode 100644 index 0000000000000000000000000000000000000000..5962eedfade82d7605df4374c2fefdb53954bfd7 GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BEM%170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;KgCeMfDgiB4@oU9$;?YP6g3bA zi7*TEI6E5a2KeY180r~V7|4n9T3Q$w8WWU9 zMc36Uv3VK?_R8fcUAp(}=Hf@yYuMEK1CmW-Zn~7RPCC0Y?$hoo8~#cy=kDBfwEE2M z&xhF_=x&zqf3IpJ6Bcv!$FVc#f8J1zV3}YUw&JSSnm>n5cWz#{^C=TEBLm~&WP?Nl zem3S%Sz$)T|17Kq%#4ix!J#Y54-#NuW@2Om$BL{13%>!c0XG|GLYoI;Dl?-2qk$ku zBOePF3r8^Px*uh&yfxrxkX2^kG2m+8NMKETuBdc;fr|~uX0@1DP;TU zPcC13R+!wbf9P`ec*KP}y|eP7)Ms0~{rI?2Vt#U9bz)7$$9aiUDl;ASGb;<;x!c8Q Yv@>DRmre2gif{c)=6|dEaBHg_00IitzyJUM literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test61/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMu>CVz<&c#{U@=zd3S$%vj>J zsxVNM`OobOc@di*{=FffbZ5!cQ|BDkZ#HjyI)e6eEr%Dr{5Oc+8wi|=BQ9J zYg6Ux-Av4k42+9|3C&vOMa#{a7c!JwR`g0VO|0m>9=I~x{6@EO=<>41C-rVs`;@RTg#v6V-SadK$D7!_os4~}o-~EFk bYOjAKugXcew*9@l#Qcig-p{`KoLvO~q6^oZ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..aa26a419ad65d913fb9e126b47775707f9a3f073 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-2fjw14BInOL1OHO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zc=vX7yC?VI1!yj2Zfs=8EjM*yDf8hzXSXQLB`}+plRu=jNWkIp!8toKZoXhxw2vvN zQgkNc*3BnBt*#AxCfI&5I{ti%l6TP>rVamt=G>FJ$hSb?-+bLqjs>9{Wz(A`E4>u` yBqq~8n@20Uvc5m^uxbCP=2<#cYMt&UEc+j47#rNad!U!~qlCiSxl7)+djS9wbYt=W literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..aee257d7e04fb38f618d0b31d057a2b216a5f802 GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTv60WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzIna?_wxmzz5;6holylWagzCiW&%m zM3{wnLW)X@OB5XQk~8v)4CKUlEiDWT4Gay93=9nnqQrSkkh$d9pMuwZXGcTb03SUA zLp=jagU0#DK4xTPU~cSXFlg*#YHVb9bTYMEUc2?r&*>Rk)^p6haa@~QMJ4mfV^t{@ zNrtIMZDnWk9cwY$bzp|sV$;)lenoF5Y?zkd=i|kjr@_AW(4;w2{YM|1&YNfdg2UA0)=Y4B~?#Mpl7^-+rK0T7p&wS#nC&sYu7l995`fEIzI(p%Q(6<&SG$ nI$OOClsj|gbICSoFUSa*uqLlA#;|2wb1{n^^PZincl`zcR6EVY literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..61e712f0d8a9ab65035cdd6d220375f7ddbb5624 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-2fjw14BInOL1OHO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zSiHeK_MiQSR5TYeH#Rb?UcNl;_K7n2!<`>DN7a_LE%Hbgy1fhdP}!mR|Er`7gOAX~Ij!Sw=-K)%ODcpo(Yw literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..a62d9a02625b90f7b371e2b2c302ec76fd23034c GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTvc0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzInapJFIrzz5;6holylWagzCiW&%m zM3{wnoE;5y1AO!h4D}2w4dldmEiDWT4Gay93=9nnqQrSkkh!$6-w0uU<9uWvGqN%; zH}*0ZG>7T=GW#fKH2Qcq+RBYw_eqK`+E9o@ZGW*^?s%{f445b^~?H4 z^v=hgr@viMiZ%=7d$!X-^vKiLUXgF#UdedRZ@VMtv|{(Kney3>6h7`zy}eH4!@lgM zl=UgIT)LFzPf9Fvx34?%`JtSp<;Uq<3)qcXo=3iRS~YXol)t9ALhG5B85tNCrx~Oe z2(dAT$_g_w{%7GZU}I$b&&0?A4q#b+kQfUy6C)cqVq_Iq_zidsxY;-p+B_IjnHdcj z4Fo}Y`B=DEI2LbkkNs!=Ar%}GvdSzx23!ps@7}I%_vAjj067>~LBY_-aPRAajju1i zp8wjQk9*SZg%A29jvDNpGtuh3oWFJCns02q%a(bim87NeTTK4mJoDVEi}&xh-2S5S zyM28l de>cHPQKj&d$SI@cjz_;QoY_**a{EQS8UWmr+;IQ^ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int3.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int3.crl new file mode 100644 index 0000000000000000000000000000000000000000..09707fd7bb11bbe57fd5b2c8a6f3609d1bb0e26c GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-2fjw14BInOL1OHO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z_{h+cZ?f7k1I@+Ejg1Uz7i?VjCSyt1sr|wm|0uCOs%X2tfss9}Ab8~u6TumBy%Aq- zygPN{vEl3sJqJH6T(fFfVWkgme$0;RJ-t^O*}2~ENwxoFHQDI4^~|T_lj3o^qG#T) z`7Q3N;<)|qyKLUPP|ttol0#nwpDXfo3P_d9>(=K!7H~JC%)tse0+w{*@I4yd!A>L%d#f&}F($Qc>%cirM?T>XP`y@f)R{g)Wk~m{a*ID^cx9?&B`;1-2Y)oZ^Smnw*s{ zp2=s3x+uEg%JntRG&sV{gJhZd{+7I(9Hk%4h>nn8+z z5F2x-tS}?ve-;h{Hb%z(OpJ`+0G8zkiLo#8w38zf>wqe>6HvQg@H>`JcKRA*TCUs`xDhBBV zJA4{+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}r z-2fjw14BInOL1OHO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z*nZ`W^v1L0O=vD=Zfs=myK#W^%FLu9>HT4c^q)=Y(&B8sviD?S^RQoek8cyz=17UYze_`G1-$pmN*7XtKU+eU0tCWxzKc-={)woGg;;QOb-J9tx0HA literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int4.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/int4.crt new file mode 100644 index 0000000000000000000000000000000000000000..7446030039267a4cd2ef3746ad08748944e2a649 GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BENy170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;KgCeMfDgiB4@oU9$;?YP6g3bA zi7*TEI6E5a2KeY180r~V8pw(BT3Q$w8WJucpHoRXaf;t!w#m~MQ@>Bhl30KLw)%;4{JVT#XeP%!e0i92?wftR^%Fl` zicV(e`nh@Cz5B(}N`CBU;0k&WTs7xQ^Tb)Y$$Rf!m+DMpk&JrmvLTg;nUR5Uak4?8 z0Y4jasH`v}<9`-b17=3X|KQM-+z>i-lwRl{eBG&z3iVqd``gg~x!af#V}XPrk`&#|-2!Ut&l?Sh6W3&3kgzJU)w$kE-W*Zu-1X^5xxI{@oq_Zg0tAUAJ<{$>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test62/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMxtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;KgCeMfDgiB4@oU9$;?YP6g3bA zi7*TEI6Io?2KeY180r}s7|4n9T3Q$w8WhM1%CFPB&?n;m7mMo6(nsW`FJlXNoHuvT ze19>2LFsSxN(`;*q|RPlm2bA~Lcq*5ixrnPKWnsS@zn_bzW2%n{l81RH--NWyFB~V zk3E9_mhE_;tehT_>F~?pamp&E#JO{S-g{E6JM#^LgV>MGdp3!_0+~$Aj0}v6lMNCL z_}Q34WrZ0T|Ff_fFf%g#2ZydKKS+RunThckI96m8SojTi4Y=7j6WTl&Q<)hJ7!3qL z8u?hbSU9>=*iY^W(-QzkgRC+Oj{#Q$$Cd}l78AJdJVOoxR!|r;GAwX&W(&||49|c6 zq~~8D)2)5iw&bqeS+vb6|K5v}YZiXppXzw~ee?oZiNwZEf8A-jY$aKo<@}BLK2)hb zIJI|Knf?=lWp!n~ccPm+Z>YN+SZrM8{pPxOOn$_npjPRW>HTi<6LomMaegw74f~|u Y`sc~wY59|R79PC&_)K9x%e>N00H%-8Y5)KL literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..40c4afc45008bd687747357d891daf81f110aaba GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-2fjw14BJS194tUO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zNJ;;CQoHD&ESig%8ygw=+$`r-oZfVw$=Fu@gtN8S-ML?l`&3ISd=AKaF#mPXe6;=4 z=CxO2)t8)9I^>($Q2bS9^^^6FyqRVv`6|5Df4Rw>XF=iiJ#%=O1)?YZpC7)_Xz%;I z7w4^rFg>oZvB{AuHr;K@0j?QUDsvY3+a=Vj6b!nbXWHN@AHVU$HoLQL%RT@A++}88 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..6b3f6eb4b2b21df2b8a191338f438be8b6d00f7d GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTvk0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzIna?_wxmzz5;6holylWagzCiW&%m zM3{wnLW)X@OB5XQk~8v)4CKUlEiDWT4Gay93=9nnqQrSkkh$d9pMuwZXGcTb03SUA zLp?(SgU0#DK4xTPU~cSXFlg*#YHVa!-}G$PkDyuSzHn7H$TWU9-xsrC^+DU{7(N5j zt;x|Q-S15bicj5Z`{>8y8?1xI2$&_Y_-G$hU_mB72E22d8915 z_@kSr)GP~7Ud;FI0e?Y@#V&6DZL%f%RI^f>ZqEPLcYBHLbTmnHbr?0W8Z85@TTo@j($ItH8oripI(u{Kk5BIYH!tW0m9Klk%haqYfBo$96kFB_tM7YEyX|6j#7+16-P`JZd| nt{gw7DG>a8*Mjw8dn#R%s+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-2fjw14BJS194tUO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zFf=bQed4|4Bbtku8ygwQrd&CCW&@k)w>9=`yVpG7Tj@M=`o)-n^V`b5xyVV&*i^rB zIMTUqx%`4-3#J!-%)ID3TevS~yFuPI-LGkV^KYvwwFh!F^6gl-qm=AczsyP5P$c}&>zNe~I;Xv` zwW!riF`sp`S#Qp*qcP4pqQ~w&=KHK|@zVUH=7~*J9gUya-sE1|8DFFa4p2xoc literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int3.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int3.crl new file mode 100644 index 0000000000000000000000000000000000000000..20f503c6bfe2429aedf3940acc968ac522a436c2 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~m z-2fjw14BJS194tUO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zDC4-iW5;4H4>T7uH#Rc(hJPz?WLqZ9QSG3!;!@=rXYc9*_jp)q+*=Q6UhjXlvVF#8 zwXgFuNc{gw53lkHrJq}(xMr}$&6ni9uz1prm5t|KP24(rexAVlnR@_iOJ>FZ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int3.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test63/int3.crt new file mode 100644 index 0000000000000000000000000000000000000000..2d636dd435cdd340953a63ba1615b60754390c66 GIT binary patch literal 669 zcmXqLVw!2t#Kg3KnTe5!iHTvQ0WTY;R+~rLcV0$DR#pasI74m&PB!LH7B*p~&|pIe z12GVXOPD`YFIZ2(J-;lqC@(iPuf&kYfD0tUEzInapJFIrzz5;6holylWagzCiW&%m zM3{wnoE?pH1AO!h4D}2R4CKUlEiDWT4Gay93=9nnqQrSkkh!$6-xy(k<9uWvGqN%; zH}*0ZGz4On-j{>QVhvmD&Vw{1MSd9~{{*2mqIKdv_15SKdo zsb9)xcqBUSj&hd&@`UU| zh^EV??l=8?c3t0zr#ba0ni{WOy3anxYQynx&hGr;j%PJ&v6tESHJPRzbeh7O>~f&h zbd^t$Y6DY|_q_WPyU*E6>GpsAC2Rifwz{%8r+3szKcWUTf&G4tuyD+@%TzXAYI)6E+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}r z-2fjw14BJS194tUO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 z*zzFRVgmP_XJ{^FZfs=8$!%nlzUUkk@&Bl6mBK_3do^~eot=4!QGfg2PS5;qDDBiM zuiP}d>+Ctnmo3{aY}~_cAMpJ}(^kEb&iVJw>*&Tide1L(beu3xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;KgCeMfDgiB4@oU9$;?YP6g3bA zi7*TEI6E5a2KeY180r}s7|4n9T3Q$w8WQ1hD zeRO}{z0N8YHe(j1)lEBf+V|!@HQQh(sPbI9+B&?`al!i)&(fS<-ezKEWMEvJY>;Tc z&&C`oE6m9FpM}+cnUV27ICN$CK>{qyOpI*cSdmp=;Wywl;AZ1YX!Br9Wo9&BG!O)7 zw4-a@D9?Xn;ruf(q_tYpvkoEB|-w&xiC zjW4G+cW+$H@`d%!KC9HAbtQ+^7BWP#bq6kADYW16-C^$~Rj;42%I1I9VDGKIH!EXy YPqD19>-Hy-TemW*Ec&P8Q+{y~08Y};3jhEB literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test63/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test63/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test63/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test63/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM~2 z(U8eIA^v=#VP(?m9q$9@$G>3z$p5=-i z%%QS;EL9)xeQ@;qtCUOsl^kdzlsFhA8n318G~0EtV{C^e)A@) aiRCqinZ8N={+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)510y{HLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zNWE}**CM9X-_Tsl+}Ox)Y{T(0D_>m8l**S^1>DCcOt#QuF5C4vZvBnk>-x6=hLdU3 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test64/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test64/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..1ae82584e8bdf9bd871056d7751ffc736b443cff GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BEN4170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8We!4VE>6cVY$D0293ppQ^_iy?%$!y7yy!zbDRlBxL zd*0N@#LURRxH#D$(SV+l8v$TKjR&bhd!Q$=?!w;%*1-JLytJ_oYaeC_N)0I=$ zFQ_eDR_FJKqjjsp literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test64/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test64/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test64/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test64/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM13@Ln{rJoUYY5*1G`xI@rem literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test65/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test65/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..bd2d906ff9cd2b70076ce57852dff0c7d221a211 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-5?)517ke{Lvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zU@cgne00U>EHoE0H#Ra%=4nuldVPMi-wZED8Jl;izh>MjyUx*i)O>m9&PBbci6|LScbI0cKK=Q1%+%(eD?Yt$|M29|-{*Ue z9MxH{z9>MtzDf16`59;ViEhO^ZGQFhy-T`w@%Vw)4j=hfSno|u@!=PK6@FD60Hq#q A-v9sr literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test65/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test65/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..214c839fe100679276d91c2a8d546198c93c1086 GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BENa170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8Wc?E)?E#k zO&vV~3{GAO?!QtRY#?CG<8I`mxPC6LS&3`t4)s`86Mg9^`OzD97buF|-!Alg{r3~U zMXql6Uo`j7waF)!buYi%ed~M3#%=6s$9FtGzdpb=>Rr*hS<2CpCm%1}Z}vxf!=1_n z^6vMUm>C%u7bhDe8t}6*hsp{wGX7^_HDG3B{0|OYS$>cJ3o{cV8#q>E6sa!1v5s+egQfY735R@*PW2yA@63*M lzv|BBzJ6l?^R6BXYu9}LnO(pCs%%?z{o=y862xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8WY#toWm)@Ihea>nxj(;rPAWVBt65HQ;9B zOlb39Ol4*?U^EZ}Y2;(!V&PydSfG4##px_?G{`Em@ECA4aIBv7`sbnNA^pf-rmeIt!LZOw;ILrubcO4Fm`*%M(~#G%igr^hhxFd>^M#5*{`3Q&fe<& z<=@w<4}_f>m=;}_tM!^+Kx0qxfOi!Zx8wu^rcXy9J>eQI(skaG;s^} mJoJCOSNdK4uS~Xo6PdfVL`+_mQgXgD@2K9nqdzXaSq=b_2-S%I literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test65/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test65/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test65/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test65/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMmo3fdSTVd5}-szt$IeMb|pN1!OjJO#O7zB2;Me z&3A?2Ow5c7jEjQ|0>Hs3%g@O8pM`~)iS+?E8e|n%_zidsxY;-p+B_IjnHdcj4FuVk zLuL6`xL7!PkDYdT5OeASINW8GS$GV%8aP%v1-wi%_`M6+%d8+TH!`$LaFVZkW4C;A zq4(1kzVm7&tcn+stfCcTmZ(2^{m8&yTX6x`(p`N^dz-iZIJltt&D_m@UP|q4uv&F1 zXY#3UhZ6U0lh~uK7HKBNbA;Pi-Y}XiWyO&cpFO?eS$h(c-gBK^THUkMS>LvdyUJGH ZXYQ}E@UDR7U-KRPEFL`FIAsx25CEh{(U<@L literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test66/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test66/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..f80b444e23540124a413c240dc09d83d826f6326 GIT binary patch literal 372 zcmXqLVk|Idyv4-GXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)510y{HLvdb9O9Mj#Lqj72Lj!{-ab6P(B(8z7fg%$V!zLtE1_lOE1`xYsMOm1+ z7#SBR8z_S9mK9-P2KfMFkE}8aj{#Q$$7-j5muUvSccFQUxv`OfQSw5C)rJ*QW7@l3 zn_XD5+Q-kZC$tJZMnSM+jswGJ1$(r?|XXg Y%$+O`vkv_&Tv(zmYWVWbZIxtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8Ww=@R2j}f3mVU0Ps{Maj97N6kbo6xWH#Ce} zD9Oak$iTQb*&xw?pN%) z(B{FI%FJlMXdnpE$j8FP!m-*Z;ANV@?_J<%kX2^kG2m+8SUv0Y&qL2c`jNwc6%+=I z4E=>4-k)rkJv02bg@vfm9qv2PSNQLgPGe=6d(=JIt6TWiamBv64{IfKx9oc#W%9Mm zTAI;-J$u6TuEKp`h8?RvXGJc4A;Ue#<+9GBw(uJaGsPZwTke0=uA`$RSC?n~!-+d< kqWj!4UbnXPZE{iy>NwIFGNtECm5y()_`BwnKToCt0PCpIxc~qF literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test66/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test66/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test66/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test66/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM$2sPx+p(=YAm5IA8n zi+%Ecdyd0Hs3%g@O8pM`~)iS+?E8e|n%_zidsxY;-p+B_IjnHdcj4FuVk zLuL6`xL7!j&MiB!Z&i*LINW8GS$GV%8aT>y?_au6;`s&H%d8+TH!^VlnYSrwh0h#j zC9aYW5x!otj#=tI)Lb#g;H32BReS9I{OeB)ShTjPS;f?=rt(ej#7qa6-=_0yS=$!5uwb6} a8N>9fzuv-p@oAp9Z%>|?-lnf(FAD$*2G9@y literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test67/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test67/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..92a4b3a952d9762ecb3ea707092374d64dca4b00 GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BEN`170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8WLDDnIPjs{s}79Inx29DLUUjIDwJft5v3|K*7 z(8$mwB)RU)vEp@dtv!FFIJFMUV@q&PP-E6gG5s?A4NvKw^QRcZG?s{NTzfb~v)Hk< zW(M!YQ<<6N_nrk@dLi0<^YV*z(%S>YuWP-xU^Mz5m7KU@!;SYA^=E#c-jchl+pI@N mZ|1>CKQ)|QCQawRK9SwVYTb#yg-c`a`^O#Yo48k@UIhT=lhn-s literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test67/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test67/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..3fe834938d98669fc9ce595c237e216d24f95733 GIT binary patch literal 372 zcmXqLVk|Idyv4-GXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)510y{HLvdb9O9Mj#Lqj72Lj!{-ab6P(B(8z7fg%$V!xkh}1_lOE1`xYsMOm1+ z7#SBR8z_S9mK9-P2KfMFkE}8aj{#Q$N15*ZOE*e9zo2=Gxv`O<_xQ%L<%`aref4;| zW2hACoM&8jOl1_$tl8@JI!dzR8$JMUtZGgG literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test67/int2.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test67/int2.crl new file mode 100644 index 0000000000000000000000000000000000000000..15593fa840e0e7c1508b7f45f56bfc94b8e269f6 GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)517ke{V{u+fO9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zDAT=v=|+j?7c>_$H#RcFPMLX9oB6F@i@$!PTSixal22f~laj!UONmM?71u6UxcaM> z%I!5haj!UN{|V9P{=emh_ZNvj3J=}C{!F8+TgCZ<0cnY|dwwOeA6Rs()V$`_iJtvS y{@%}yy6P4$)1VXc|J26jo5#P++hjM#hvD(Mmqs^My|gdk`=Ihs?9JgvN6P>)+G`X5 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test67/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test67/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test67/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test67/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM`Y^vE05l(XF5>$%$g zSw>x&+OyWkXh+-S?S`vw?K$S_vq3^c^;+xvDT{wEVu+P3@ng>jvbcV{OXbLx3#_d%tp1)v)Y%vcJ6=Bt#F&klz}VbYxPy{7jhd-zUSQR%Z@5~Ah$(i zt8@1JnXU9fa(}y`W^sU&D#L<@9W!lAXP#dE@A28KccuLw z@5{b3{Ta`-=MyH)lz&@MDLmoA*BLYXjGpn$Tri8J@>N5V+%-i-!zl_`d|!V54w{vs b7BsbOxp>#jvu0a_b~Sh|U*-2RXGt&sf;Q1X literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test68/int1.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test68/int1.crl new file mode 100644 index 0000000000000000000000000000000000000000..fdbf8ea0caeffe5cf4c5760f8554725078a7520c GIT binary patch literal 393 zcmXqLVr(^Ne9y$lXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)515-T%Lvdb9O9Mj#Lqj72Lj!{-ab6P(B(8ylff*AM!!{&U1_lOE28v+2WJOt+ zxfmG@gxNR~+B_IjnHYJP7#aVwFf%bSEKr6i5&`i+ikL%Xm05TUxEeVARdSw_V?DM9 z&9BUjjSTI68R9P)oTlk*Szk3Zd2*?6jr$vqf17?e`b@9A5wBZw)cfj^ZL6i;&FE#) zj8pozE0Vt=UYPN`L)KR1J?38~o>oWj;9!}Th qzqK8Wahz+GA20o~`S(|Eo(GJMkM8{MJHXh?G~x1zWzT0@zXbq{*K&{m literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test68/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test68/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..4bc8127b322d44fe0ad8e1ee96c1f1c378b98dad GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BEN$170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8WTnAi{5zG^GA){JO0~DzPff7 zW6zv@WANX8Wy7QwLJeQ8ALewq*3$S-U?bB-{&wcx#EB781(u4;m@8u*$~0{$`&Q{i zM;^2tHD+RZb$GM)Z~mmap5LT5`P^#Vu#3ysss3xb)i*AUZ9WZE+Ad*Q%?H)KO$&4h z`jgMZ%*epFIN2c4fS-*yR92Xg@jnZz0W%}xe{kr^@`D6en3)*az_B8$z`}39YrxIM znb79Jn99s(z-S-{(#Xfc#lrEglJlG#>#;rHXpmKA;W6N9;8;ED_0L1kL;8`!fE5%5 zjSO3Ve(%}2BTjJph7~U5UFkDwoD_G@Jio-jSUFSGLSqhZXwa7#)7CoV*j`qQZ~K)! zjp6NACx(3!tIp3b+PLenY*CbuXlm>WTmG4Ijve~pQz-NC--_VC#kKaAEbLRAw)~&? l^gI8}7!kM0RvcSo+Nv{xIGb7*$Hf1gaM?$I+h)UL4*)*~(M+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-5?)515-T%Lvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zn7nv9qeS@CAT$>N(HIGoyNcv{=`tZi$xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;KgCeMfDgiB4@oU9$;?YP6g3bA zi7*TEI6E5Z2Kne2nCclA8pw(BT3Q$w8Wo??fX)}YYdr-U-@fp z366SfC)%@b&+jNczXFX{&raN_c;Tc z&&C`oE6m9FpM}+cnUV27ICN$CK>{qyOpI*cSdmp=;Wywl;AZ1YX!Br9Wo9&BG!O)7 z>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test68/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test68/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMU`}`IdyKZ`=aVPMFbVv5X9tkal z9Q`D19e?ld8VOvB zt2P*XEo;8naq|2ptN5kUMepBpeqlSc_g?4a>1rOTi8^A&qN1-;LQ*$wT4hqYsek&i zG(%1%W=00a#X$xE;NXnvPvx2aFDK5X5SYdJl@X)c$l^Qk+r zzB~7SXs*{Wczd#D`X>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)515-T%BXM3!O9Mj#Lqj72Lj!{-ab6P(B(8ylff*AM!%ies1_lOE28v+2WJOt+ zxfmG@gxNR~+B_IjnHYJP7#aVwFf%bSEKr6i5&`i+ikL%Xm05TUxEeSj_PjXQKjXAG znqQe48ySLmUwmDBKJCC&ks{CL@Y1)dwbWEnI~4P-{OID{#52LmO8I&3ow~jqt?Gg^ zmfbtJ_i$l>`J=vsn^#X3FWaPl-qY23k-U3Z9*rvxbHr!x6cRVDfZFBcNyNc(^4{xoOVPBaidKm!U0dwI1 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test69/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test69/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..6c19ee09e9306290605686f77cf5d5500dcaea33 GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BEM@170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8W7@+g6-Sap38sJyYKLS?tN@3{Qc*?3kqymt}fXax;@Z*&i>skyVC9%`I>9*o2Nhh z|I=NK-Im4fEvmQIq^&>I{J&#Wbj`o}r|;P?-2Ksg&wb}a-UZ2zrDyBLdoQ`3{N?kO zZCk!GF*7nSE>1Q`G~j1r4wV&VWc<&_Rv6rVCKn-bE9r4WSWJAG`rS)YjLIgOc9@7A%i_{EX`Xd;fon(cewTx< m?6rRTR60BNtttJ|dr66{@U>n_9LIXu>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test69/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test69/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMK!Owu=3kM+_%<+$=NO>2@L4-PgA#!+9$6irSa?aZebo{+n~m z=G5Q!_S;#bmmk^suSnV4f7cbK{L?$12n*;=I~*VUl6k=`eQm+z5&q6Aq8HEEuf1aC z%Qed-n5Hr@GcqtP4l)P;2d6AQBjbM-7G@^a2jFOsRbb&a;5Fc8<4kDtU`%CZG+;Ck zWMdAM>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)512a7XLvdb9O9Mj#Lqj72Lj!{-ab6P(B(8z7fg%$V!)_#11_lOE1`xYsMOm1+ z7#SB>7?^?WmK9-P2KhjkjWeOmgE5tfk%x(q@jpnA0c^RfG7FCZR|ChB9r2~F+La>E z{L0+e$S`Hz(OqJ^tGYw`7IkLVq}I6|dR)LGT4#3uP5)6UcKKn_lojeHYxeai%{a9B*Oli+70hOnc~ZU@x%N6}M_gL7 o!)2>`a))=eZ`ZNsOMJJt83kP~Jo=O6RQ3mT$-e(>GR*c*0S8%eS^xk5 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test70/int1.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test70/int1.crt new file mode 100644 index 0000000000000000000000000000000000000000..5509c543800c79680baa68107466bd4e1c0ca531 GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BENO170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8W+>=V zorjZWt^HxDcv)Qd@4c+ED~`#EEQ~94Ijg*$ed2T0u&-VVtC>wCAD&j2>|7JxBF+<7 z=y*bY=QG!xx=(DT2X5QNZIr&P&i?eKX}jViW>>fwPwt9{QO;amJMYrZRYxV?aV2rS z$p~d)W@KPooNSP2z|Y1UDl5#$_@9NAWVBt65HQ;9B zOlb39Ol4*?U^EZ}Y2;(!V&QnQBfj)iyHW%=8f2AOcnr82I9AVk{qxZCkbdMaUHy`}vKUdn~{DVIj~&9>q+c{I z$~nH-yyyLv>k}C=%>||$&g(q(w|&>2#<(Xd*KvG!5}Uhc*Mio0c+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n}* z-5?)512a7XLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=!b14Xd0vLYkX2^kG2m+8 zSpW6>)!Vx>j-k1jxv`N!DJ5b41?%PVaYr6`KUCk_cclI7+&7GOKV4sRmvMi)-Zk#& z(FP`RTsHoFmAi|D+LXLaLl3^WJ1sA45PiUu`o6Y9WTm#|Tx}V% yM(O*B^CgWLGqp1(tiG;xiZT6pMc;vckMAtBn--Z=6}@|7Ps=>dB=I{s8My#Zq-VGQ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test70/int2.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test70/int2.crt new file mode 100644 index 0000000000000000000000000000000000000000..9af80b8e47a4c6131636087cf1a6a12ffdc5c21e GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BEO3170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;KgCeMfDgiB4@oU9$;?YP6g3bA zi7*TEI6E5Z2Kne2nCTf98pw(BT3Q$w8W;gqSahs$>q=)M1Ed@P22qjE#d=e^cu0y3*brq-mKR}qho z>dTxoJ5u9bz5dK!zjkcY>2{y{V*hRiC%GR5XCHD%^%jL_7{8S5S#Y8D^%6^t()s?q z2ZO9i)=oM(VVz>g;-VP2Kc>;&#A5cvCO8Y#T-e9zAGxt_zoGd#Ste#i2FAt728jmz zY|Npu!i13{2R zJ{B$(j`d&9U%kCM;}|#^WR+QX47eINp6rM(ebufMfgA>`pfG4;VB2pPusiXMfOpka)E!@|VcU)H0Q{3;Z*b_SSaIohb7%w#z{|&`tl%l>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test70/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test70/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMG?ICaf zX}^{byZ!B3#O{BNA$3!)ya|`!U;Ztmv17--4;qJC>|eC}JDZ)F&CIxP|8qUl)L$mH z=It8dOw5c7jEjQ|0>Hs3%g@O8pM`~)iS+?E8e|n%_zidsxY;-p+B_IjnHdcj4FuVk zLuL6`xL7!TWWAsHLjQdjINW8GS$GV%8aRTZjQVXt_xT`unHA*aMut|ir<<<-xzo&j z+$&h5Ago@axQyS)Xv^8cxj}m?75C54y;39^u#Qme{MCux*~hp`QMZF{rUX-#{wq_ af91}~Q_35r@<~^1*1lAEN!z$6CIJ9#aMp|f literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test71/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test71/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..c34a95df1cc72084b6b37b1548ee24c6161fe972 GIT binary patch literal 393 zcmXqLVr(^Ne9y$lXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)512a7XBXM3!O9Mj#Lqj72Lj!{-ab6P(B(8z7fg%$V!#*Tc1_lOE1`xYsMOm1+ z7#SB>7?^?WmK9-P2KhjkjWeOmgE5tfk%x(q@jpnA0c^RfG7FCZR|7|Ilu^G;=sq7b zzcM#AGBEY_&q>?j_uyzne#03d2^6aWAK literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test71/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test71/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..07076019cf9ba033e9e977f0970d1d2003624b31 GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BEN;170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8WJ=2MHws`%q>yAmcfy=3vNj$rlOr=`TOEn?l1 zOM$uN+jUnzzwX<9bm3v0Y{3hG-W|cVk`aEERiD&aUr5fHa_HCWXtfCrKCi=D!e%{Q z|6Z7hnUR5Uak4?80Y4jasH`v}<9`-b17=3X|KQM-+z>i-jXN%BbHabe|768f2AOcnr82I9AVk{qxZCkbdMaUyyrUak+jo@dor_aP#Zgyyqy4zUAyHn?5i{z;<8{9KC zhHyN~bK3Dsby;S>e#exwe?C|9*TvSi{$DblP($qV-S_1)UQYa)v2S8#xMgQa{~68T>-}B^R{@cO*319^ literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test71/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test71/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test71/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test71/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMb9dT1`Jy2khkg$8jiQMq-^Tjz! z<|=%-o3rra=HIUSJ6CgaY@O)8xnJk-q7};iD@Bemn}6GWXOA)at0kLdnHKm&Rr}c= zmQ&WbAOIYkviyvU|5;d=nOGlyqd``Ih2MbJfSZjoq0NIam6_3i(Lj)m zIaHR9g^PtFG4SKL)vh~Yz~L^d%)(>9)xc4FWa1;857`@#z03;oaw7wCq;E*s=aXGa z3_j1kded-zopvOD`tu2i_3MLPmR^gVdN}WZ!o-Om!hYB^E`9ufd*4!XQ|AA#zSo`m zvRm=T#8>NX>FR#C9_tvO!Q5)(u)IoWaqOzvQ*}2CN{z3`_ieVFvqG(X+Ceo9S#>6# a=!3^KwL=WH7dF3Ik}^YbS+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)519LqCLvdb93j;#~LjyAdLj!{-7}wAU%w3>tpa?crR)mEaLsehhjNA#096Hjf9@@7tV*Ec)x_}`!0 zv+_sFO|sN^g8K^Z2QAogyE0GXee_+cO*5N1cgiPAYEQN}XdZ9Few{sr@yKK2=o#0~ y9m&lS+cAA1zw*PW`tH-spG~{x|8nDT2frpeYmsNJl7|xYHbqx;f0YteECB$wJZ2mK literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test72/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test72/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..36b1f205234f6bd5a65128fb29a4753961c2fb77 GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BEOJ170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8WFPT}})|DpPc#7Pph ztHL^GRIf2UEw+TKY+v=dSs@R7csHl+%8i}RwRYd5KdXvn_h{Um$>JxY^iSiB@f41BrBm>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test72/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test72/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM**Fv0JQ!1%84VZ>1lgEF zW%*dRSU9@ZhF{Xo#Z}e2eU5R*;t)8Md$#NPWL1`&iTQ z&d$G|&fWTJnyMmk;LL>!(`8--Oy3k8Ui_2I`c|iy*i^5x@86e6ACw9Rp17^&<%h(5 z<)8J%xwocIiz2 Z+BJ@RO=V59jV`fBJxW;4x=OZ30sz>#&qn|N literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test73/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test73/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..6b76dc0b8a32102600dafe687a35cccea4df8a6b GIT binary patch literal 335 zcmXqLV)Qm>+{(nrXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)519LqCBXM3+0|P??LjyAdLj!{-7}wAU%w3>tpa?crR)mEa)yz z5z`_PVy+q7a61yBm^}CA-uHIjHQyMA#?N2;d#B{CPMN!N7z5d}Hm}S&^zo#ot_iQx yp>=-#rmPpQad<70J|TUzaPb7TulD*JzYUo@L!k9yYA7<_V literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test73/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test73/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..ff6df2598cfd270084e8044420fc2452349faddb GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BENh170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAni?1w8W1Q`G~j1r4wV&VWc<&zo`~uUXOFgbsx>wbfFZy$s`Idry!?fJi_nhAU t&y`4=44J@bw88(x)U13%?_eDh^&OW_OzjhicVE3%PWP+v>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test73/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test73/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMol11K>vG$<)T4w&(75|@vmsD1>Cn|n()BnpTZn1Jx%fuktwcPtR3;Yx4 zDA=cV)zMk%Qn{zc#*|Z2S^gUKv%WCZw>fXt#Ik?R;*^gqQa6mvdmWyBt?(2#wA0+{ z^o*H_nUR5Uagad(I5=hb85#exurM>RJ^)99tO5(a0j~i!8)rhB2V*KTqXDCVARBY2 zEFTLO3x`00=r!(LKW)L`F00JKW5CtG5u=Gu2dwRSx{k-VS Xy@bhMrt55!mGzcM5qIRRozMmVLea!z literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test74/int.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test74/int.crl new file mode 100644 index 0000000000000000000000000000000000000000..8733b183c855873ff3279790589e1655f34755d4 GIT binary patch literal 337 zcmXqLV)Qj=+|I>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)519LqCV{u+fO9Mj#LjyAdLj!{-34S93Qv;BIp%GYMfwF-j*kD-^7G{w1K!(UF zv+x*jHE_hJ-mFR#oDziQX6D9524kL+HTH1}PX(t0_*k63|KDb!U(V&5ob736#9v-m z`_@$I98>p{&=*GW9?Ww3d_Q+CQ@J5CN887>rjEa>|Lva28k22?A&Oon@6@l}5jbD- z=$4oZGdH-;VoTY4A#>NAZJaH$_$4(GG_`KaFUeWI*G7uj*iLfkbpG|yEY9VjUt=o) Dntx&F literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test74/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test74/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..c9258148d991908a45e70af6a7144ad281805a74 GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BEN>170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8W^-%EN`fBwiTz`N=pF|<@M7yo2<%smN4Vp z;g<5mFB~z(C9^MHyfJCz)1=9s?sI2mKa$ito0GCxSMJ}7m)r-n49zb;Vg7z*Qs21? zOB-u%FWgu0X;#3Q{KWqJ2*+M^>D9-ts?->-^xVgGk?+RQ4>8LmZi!|8cxWV$5hQ4l z`Q4d`nUR5Uak4?80Y4jasH`v}<9`-b17=3X|KQM-+z>i-jXb^=4I~;FKV6G{`Em@ECA4aIBv7`sbnNA^pfyZEFm3V5-QQJZU$FrdZl@zWpmY-c3+YUb1`HFOBKn!)0`J&#~D3 zIjI+U>fh~5`;+VL|5BOX*`?A~qSDmHn&f+al1*O>@3V8~vRY!*E&jFb%lVOYxR?3W lOs{1-mf5&|S@}nQo&0z8O@ftoCZ&BYOMA=^u)dOs9{>+3(q8}o literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test74/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test74/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test74/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test74/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM2)iTN2k>*55n8I0O8_q!tlTw0%O z*p<55ZRMxh7fo}ste;5iW#>7W%(Hy|Ff_#GqFAZM}w>a3%>!c0XG|GLYoI;Dl?-2qk$kB zbEqsI3l|H=k#9FxlGy_o!Qn2e%)(>9)xaTVPW?v3A_mnzy>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)50}DL^Lvdb9O9Mj#Lqj72Lj!{-ab6P(B<=zu0|T(JvLY~EKQ#xtLt-{e!V;okWR9$s%{#if3l$Oz7nn$f@VvF~KTb@M)F IRvjq<0MEv2i2wiq literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test75/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test75/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..4a4c27e8caa1c5880f918df14e80d2b260f6185d GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BENx170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8WVvz$BR*{t%;7i&u|l{9eGcg2hJ`6RHJ z&&iL?`*~G6Q#hl=q3vSG7g=M=IgYi`Mf}&6-nw_-i)#7hz@CWTUHA7UTv2@YnX7e< z2E#ArSzn&}UOBQeR_033Ro;lC42HiN2cjN+@OJ%jD%`@DY5xkdMGt3}F_tHVxm4KI z@G~(pGB7SqHb^w!XJZbP6=r1o&%$cJ%*gm39J;dnAORL;CPp@JtjH>`@EhxOe1Rm}XiQ1o<&C>D2W?FO6jO&FJ&o-#eSTko5=e@6rw>j#&_vK!n>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test75/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test75/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmMwA9&mepb0CV4NY<$ywGew?NkV z%e7ap&xPHrtI56=C;H4&VM@J)W)XL-jm_em%> zDNWxe6;!<1PE50KOXt$-4$q{XuUKn({#W{f{}~)-Rac+5e#c~5+TZC*%_78~-`TU_ zNL58S6Eh13@>;VeC7F5YhN1?-AQ5I^9%n~G z-5?)514}&vLvdb9O9Mj#Lqj72Lj!{-ab6P(B<=ze10%4pvLY@@tSnvX#cMCM zBId@ol8()S51yu{J}$Lh-p9R{Gwfs0!o&MCoMK&$`sKV!xFxipM5W7E+H!@t(i)*1 zVj5TXO`A07s9fC@$8+q9SKL^!c&W9%MAUH+&7+sE|5aUb%TP$%D&ph4&3sqga_TN^ P`m?|I?o#7VB7$=PA+BrG literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test76/int.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test76/int.crt new file mode 100644 index 0000000000000000000000000000000000000000..ab1c643902906a6da393304acecf0a29ba328239 GIT binary patch literal 666 zcmXqLVwz^q#Q1*!GZP~d6BEO6170>xtu~Lg@4SqRtgH+MafaLmoNUaYENsF|p}~d{ z24Wx%moR^*Ua+2mdwyAJQC@CpUWp-(0T)PyTbS7;-^EbCfDgiB4@oU9$;?YP6g3bA zi7*TEgcOw)mnb;qC1>Op8OVwAT3Q$w8W8HNlzj%W%{Y7Hat&i=NVzpRfc<-CiZ=JuP z6;~A`+C8NfADQ<;!TEsMPrccG*I67`Tuz8s8J|C{e)fZFRs9aFSeqvs zLw+(bGcqtPPBut1;AdkFl@(@W{LjK_z|6?_9~`=}{2&1qW+p~9aIDBGu<#r38gR35 zCbW4lrZO`cFd7JgH1e@OF5_VG}EPSeI;jwW@Q@1_Pa&@hrc^C9_t%xUuWZDK@5x zGoiIL^{F?!ZJy2ixx$xmr`_C?g8n+sQey|k%{&p|kwGj~=C3y&kN(|#ZY5)?rptVf kgdZXc`7&pj$KRFSI&af`w|hp*U-HUkRVnQMXUxt60Q_*yD*ylh literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test76/root.crl b/src/libs/3rdparty/botan/checks/nist_tests/tests/test76/root.crl new file mode 100644 index 0000000000000000000000000000000000000000..de65024ad4cfd7062c4f0806dcd0203b4abea52f GIT binary patch literal 371 zcmXqLV$3&ayvfAKXu!+HsnzDu_MMlJk(HIfAkL86fRl|ml!Z;0DKywn!axkf;S%N# z)eF{BaL+GGEy~MH%_}kFG2jBpa0@fL>;VeC7F5YhN1?-AQ5I^o{*x_ z;t~bNyyT4hB5__zO9Mj#Lqj72Lj!{-ab6P(B(8yyfdUhwI+7v-1A{07h*h$pEX-Vt zj0=-^JFT-s>V8VQXYJV^`Cz^4oy~K0bXf39vT5i=UG-me zxM;)8-x0gy9a^J)e>r^Dere_L9o4}FlH8A<^3S`?k}FwZ*PuPQ*Jz69r-^fOep_!T W>X_8km8-mkvBJ$^rS7w{Tw(yBv~m#u literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/checks/nist_tests/tests/test76/root.crt b/src/libs/3rdparty/botan/checks/nist_tests/tests/test76/root.crt new file mode 100644 index 0000000000000000000000000000000000000000..d7dfd9d48f0460a72466c63c92a3ca4f8ce85c70 GIT binary patch literal 624 zcmXqLV#+aSV!XP5nTe5!iJ7r&z5y>Ar&gOs+jm|@Mpjk^gE&KO15P&PP!={}rqEzR z2?H?@hfA10R4-Uh!9Bk$wJ0w)HLt{w$AAkY!!6A0lJ8*S&Z{P@nOGsa>$60QR+F|n6Eh*vKFj#-F&R zz1#nFijef-)=006ht^9K4@T-uT$Axn_hOZ->w_RB(EIHoIW zyO8^gqMcjA8s1e*m5}<9T%cw-TT-E=cXv|!eVv82f21#1?Y?nF+DvHC>a}*y9tLeG d6&8G>K6P30`O9a%_}$pGW9`~AQmM +#include +using namespace Botan; + +#include +#include +#include +#include +#include +#include +#include + +#include + +#define POLICY_TEST1 1000 +#define POLICY_TEST2 2000 +#define POLICY_TEST3 3000 + +std::vector dir_listing(const std::string&); + +void run_one_test(u32bit, X509_Code, + std::string, std::string, + std::vector, + std::vector); + +std::map expected_results; + +u32bit unexp_failure, unexp_success, wrong_error, skipped; + +void populate_expected_results(); + +int main() + { + const std::string root_test_dir = "tests/"; + unexp_failure = unexp_success = wrong_error = skipped = 0; + + try { + + LibraryInitializer init; + + populate_expected_results(); + + std::vector test_dirs = dir_listing(root_test_dir); + std::sort(test_dirs.begin(), test_dirs.end()); + + for(size_t j = 0; j != test_dirs.size(); j++) + { + const std::string test_dir = root_test_dir + test_dirs[j] + "/"; + std::vector all_files = dir_listing(test_dir); + + std::vector certs, crls; + std::string root_cert, to_verify; + + for(size_t k = 0; k != all_files.size(); k++) + { + const std::string current = all_files[k]; + if(current.find("int") != std::string::npos && + current.find(".crt") != std::string::npos) + certs.push_back(test_dir + current); + else if(current.find("root.crt") != std::string::npos) + root_cert = test_dir + current; + else if(current.find("end.crt") != std::string::npos) + to_verify = test_dir + current; + else if(current.find(".crl") != std::string::npos) + crls.push_back(test_dir + current); + } + + if(expected_results.find(j+1) == expected_results.end()) + { +#if 0 + std::cout << "Testing disabled for test #" << j+1 + << " " << std::endl; +#endif + skipped++; + continue; + } + + run_one_test(j+1, expected_results[j+1], + root_cert, to_verify, certs, crls); + } + + } + catch(std::exception& e) + { + std::cout << e.what() << std::endl; + return 1; + } + + std::cout << "Total unexpected failures: " << unexp_failure << std::endl; + std::cout << "Total unexpected successes: " << unexp_success << std::endl; + std::cout << "Total incorrect failures: " << wrong_error << std::endl; + std::cout << "Tests skipped: " << skipped << std::endl; + + return 0; + } + +void run_one_test(u32bit test_no, X509_Code expected, + std::string root_cert, std::string to_verify, + std::vector certs, + std::vector crls) + { + std::cout << "Processing test #" << test_no << "... "; + std::cout.flush(); + + X509_Code result = VERIFIED; + + X509_Store store; + + store.add_cert(X509_Certificate(root_cert), true); + + X509_Certificate end_user(to_verify); + + for(size_t j = 0; j != certs.size(); j++) + store.add_cert(X509_Certificate(certs[j])); + + for(size_t j = 0; j != crls.size(); j++) + { + DataSource_Stream in(crls[j]); + + X509_CRL crl(in); + /* + std::vector crl_entries = crl.get_revoked(); + for(u32bit k = 0; k != crl_entries.size(); k++) + { + std::cout << "Revoked: " << std::flush; + for(u32bit l = 0; l != crl_entries[k].serial.size(); l++) + printf("%02X", crl_entries[k].serial[l]); + std::cout << std::endl; + } + */ + result = store.add_crl(crl); + if(result != VERIFIED) + break; + } + + /* if everything has gone well up until now */ + + if(result == VERIFIED) + { + result = store.validate_cert(end_user); + + X509_Code result2 = store.validate_cert(end_user); + + if(result != result2) + std::cout << "Two runs, two answers: " << result << " " + << result2 << std::endl; + } + + if(result == expected) + { + std::cout << "passed" << std::endl; + return; + } + + if(expected == VERIFIED) + { + std::cout << "unexpected failure: " << result << std::endl; + unexp_failure++; + } + else if(result == VERIFIED) + { + std::cout << "unexpected success: " << expected << std::endl; + unexp_success++; + } + else + { + std::cout << "wrong error: " << result << "/" << expected << std::endl; + wrong_error++; + } + } + +std::vector dir_listing(const std::string& dir_name) + { + DIR* dir = opendir(dir_name.c_str()); + if(!dir) + { + std::cout << "Error, couldn't open dir " << dir_name << std::endl; + std::exit(1); + } + + std::vector listing; + + while(true) + { + struct dirent* dir_ent = readdir(dir); + + if(dir_ent == 0) + break; + const std::string entry = dir_ent->d_name; + if(entry == "." || entry == "..") + continue; + + listing.push_back(entry); + } + closedir(dir); + + return listing; + } + +/* + The expected results are essentially the error codes that best coorespond + to the problem described in the testing documentation. + + There are a few cases where the tests say there should or should not be an + error, and I disagree. A few of the tests have test results different from + what they "should" be: these changes are marked as such, and have comments + explaining the problem at hand. +*/ +void populate_expected_results() + { + /* OK, not a super great way of doing this... */ + expected_results[1] = VERIFIED; + expected_results[2] = SIGNATURE_ERROR; + expected_results[3] = SIGNATURE_ERROR; + expected_results[4] = VERIFIED; + expected_results[5] = CERT_NOT_YET_VALID; + expected_results[6] = CERT_NOT_YET_VALID; + expected_results[7] = VERIFIED; + expected_results[8] = CERT_NOT_YET_VALID; + expected_results[9] = CERT_HAS_EXPIRED; + expected_results[10] = CERT_HAS_EXPIRED; + expected_results[11] = CERT_HAS_EXPIRED; + expected_results[12] = VERIFIED; + expected_results[13] = CERT_ISSUER_NOT_FOUND; + + // FIXME: we get the answer right for the wrong reason + // ummm... I don't know if that is still true. I wish I had thought to + // write down exactly what this 'wrong reason' was in the first place. + expected_results[14] = CERT_ISSUER_NOT_FOUND; + expected_results[15] = VERIFIED; + expected_results[16] = VERIFIED; + expected_results[17] = VERIFIED; + expected_results[18] = VERIFIED; + + /************* CHANGE OF TEST RESULT FOR TEST #19 ************************ + One of the certificates has no attached CRL. By strict X.509 rules, if + there is no good CRL in hand, then the certificate shouldn't be used for + CA stuff. But while this is usually a good idea, it interferes with simple + uses of certificates which shouldn't (IMO) force the use of CRLs. There is + no assigned error code for this scenario because I don't consider it to be + an error (probably would be something like NO_REVOCATION_DATA_AVAILABLE) + **************************************************************************/ + expected_results[19] = VERIFIED; + expected_results[20] = CERT_IS_REVOKED; + expected_results[21] = CERT_IS_REVOKED; + + expected_results[22] = CA_CERT_NOT_FOR_CERT_ISSUER; + expected_results[23] = CA_CERT_NOT_FOR_CERT_ISSUER; + expected_results[24] = VERIFIED; + expected_results[25] = CA_CERT_NOT_FOR_CERT_ISSUER; + expected_results[26] = VERIFIED; + expected_results[27] = VERIFIED; + expected_results[28] = CA_CERT_NOT_FOR_CERT_ISSUER; + expected_results[29] = CA_CERT_NOT_FOR_CERT_ISSUER; + expected_results[30] = VERIFIED; + + expected_results[31] = CA_CERT_NOT_FOR_CRL_ISSUER; + expected_results[32] = CA_CERT_NOT_FOR_CRL_ISSUER; + expected_results[33] = VERIFIED; + + /* + Policy tests: a little trickier because there are other inputs which + affect the result. + + In the case of the tests currently in the suite, the default method (with + acceptable policy being "any-policy" and with no explict policy required), + will almost always result in a verified status. This is not particularly + helpful. So, we do several different tests for each test set: + + 1) With the user policy as any-policy and no explicit policy + 2) With the user policy as any-policy and an explicit policy required + 3) With the user policy as test-policy-1 (2.16.840.1.101.3.1.48.1) and + an explict policy required + 4) With the user policy as either test-policy-1 or test-policy-2 and an + explicit policy required + + This provides reasonably good coverage of the possible outcomes. + */ + + /* + expected_results[34] = VERIFIED; + expected_results[34+POLICY_TEST1] = ; + expected_results[34+POLICY_TEST2] = ; + expected_results[34+POLICY_TEST3] = ; + expected_results[35] = VERIFIED; + expected_results[35+POLICY_TEST1] = ; + expected_results[35+POLICY_TEST2] = ; + expected_results[35+POLICY_TEST3] = ; + expected_results[36] = VERIFIED; + expected_results[36+POLICY_TEST1] = ; + expected_results[36+POLICY_TEST2] = ; + expected_results[36+POLICY_TEST3] = ; + expected_results[37] = VERIFIED; + expected_results[37+POLICY_TEST1] = ; + expected_results[37+POLICY_TEST2] = ; + expected_results[37+POLICY_TEST3] = ; + expected_results[38] = VERIFIED; + expected_results[38+POLICY_TEST1] = ; + expected_results[38+POLICY_TEST2] = ; + expected_results[38+POLICY_TEST3] = ; + expected_results[39] = VERIFIED; + expected_results[39+POLICY_TEST1] = ; + expected_results[39+POLICY_TEST2] = ; + expected_results[39+POLICY_TEST3] = ; + expected_results[40] = VERIFIED; + expected_results[40+POLICY_TEST1] = ; + expected_results[40+POLICY_TEST2] = ; + expected_results[40+POLICY_TEST3] = ; + expected_results[41] = VERIFIED; + expected_results[41+POLICY_TEST1] = ; + expected_results[41+POLICY_TEST2] = ; + expected_results[41+POLICY_TEST3] = ; + expected_results[42] = VERIFIED; + expected_results[42+POLICY_TEST1] = ; + expected_results[42+POLICY_TEST2] = ; + expected_results[42+POLICY_TEST3] = ; + expected_results[43] = VERIFIED; + expected_results[43+POLICY_TEST1] = ; + expected_results[43+POLICY_TEST2] = ; + expected_results[43+POLICY_TEST3] = ; + expected_results[44] = VERIFIED; + expected_results[44+POLICY_TEST1] = ; + expected_results[44+POLICY_TEST2] = ; + expected_results[44+POLICY_TEST3] = ; + expected_results[45] = EXPLICT_POLICY_REQUIRED; + expected_results[45+POLICY_TEST1] = ; + expected_results[45+POLICY_TEST2] = ; + expected_results[45+POLICY_TEST3] = ; + expected_results[46] = ACCEPT; + expected_results[46+POLICY_TEST1] = ; + expected_results[46+POLICY_TEST2] = ; + expected_results[46+POLICY_TEST3] = ; + expected_results[47] = EXPLICT_POLICY_REQUIRED; + expected_results[47+POLICY_TEST1] = ; + expected_results[47+POLICY_TEST2] = ; + expected_results[47+POLICY_TEST3] = ; + expected_results[48] = VERIFIED; + expected_results[48+POLICY_TEST1] = ; + expected_results[48+POLICY_TEST2] = ; + expected_results[48+POLICY_TEST3] = ; + expected_results[49] = VERIFIED; + expected_results[49+POLICY_TEST1] = ; + expected_results[49+POLICY_TEST2] = ; + expected_results[49+POLICY_TEST3] = ; + expected_results[50] = VERIFIED; + expected_results[50+POLICY_TEST1] = ; + expected_results[50+POLICY_TEST2] = ; + expected_results[50+POLICY_TEST3] = ; + expected_results[51] = VERIFIED; + expected_results[51+POLICY_TEST1] = ; + expected_results[51+POLICY_TEST2] = ; + expected_results[51+POLICY_TEST3] = ; + expected_results[52] = VERIFIED; + expected_results[52+POLICY_TEST1] = ; + expected_results[52+POLICY_TEST2] = ; + expected_results[52+POLICY_TEST3] = ; + expected_results[53] = VERIFIED; + expected_results[53+POLICY_TEST1] = ; + expected_results[53+POLICY_TEST2] = ; + expected_results[53+POLICY_TEST3] = ; + */ + + expected_results[54] = CERT_CHAIN_TOO_LONG; + expected_results[55] = CERT_CHAIN_TOO_LONG; + expected_results[56] = VERIFIED; + expected_results[57] = VERIFIED; + expected_results[58] = CERT_CHAIN_TOO_LONG; + expected_results[59] = CERT_CHAIN_TOO_LONG; + expected_results[60] = CERT_CHAIN_TOO_LONG; + expected_results[61] = CERT_CHAIN_TOO_LONG; + expected_results[62] = VERIFIED; + expected_results[63] = VERIFIED; + + expected_results[64] = SIGNATURE_ERROR; + + /************ CHANGE OF TEST RESULT FOR TEST #65 ************************* + I cannot figure out what exactly the problem here is supposed to be; + looking at it by hand, everything seems fine. If someone can explain I + would be happy to listen. + ************************************************************************/ + expected_results[65] = VERIFIED; + expected_results[66] = CRL_ISSUER_NOT_FOUND; + + /************ CHANGE OF TEST RESULT FOR TEST #67 ************************* + The test docs say this should be verified. However, the problem being that + there is an extra CRL with an unknown issuer. Returning VERIFIED in this + case is obviously bad, since the user may well want to know that the CRL + in question has no known issuer. So we return CRL_ISSUER_NOT_FOUND instead + of VERIFIED. The actual certificate path of course still verifies, but + it's kind of an all-or-nothing testing procedure. + ************************************************************************/ + expected_results[67] = CRL_ISSUER_NOT_FOUND; + + expected_results[68] = CERT_IS_REVOKED; + expected_results[69] = CERT_IS_REVOKED; + expected_results[70] = CERT_IS_REVOKED; + expected_results[71] = CERT_IS_REVOKED; + expected_results[72] = CRL_HAS_EXPIRED; + expected_results[73] = CRL_HAS_EXPIRED; + expected_results[74] = VERIFIED; + + /* These tests use weird CRL extensions which aren't supported yet */ + //expected_results[75] = ; + //expected_results[76] = ; + } diff --git a/src/libs/3rdparty/botan/checks/pk.cpp b/src/libs/3rdparty/botan/checks/pk.cpp new file mode 100644 index 00000000000..c0200524590 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/pk.cpp @@ -0,0 +1,775 @@ +#include +#include +#include +#include +#include +#include + +#include + +#if defined(BOTAN_HAS_RSA) + #include +#endif + +#if defined(BOTAN_HAS_DSA) + #include +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + #include +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + #include +#endif + +#if defined(BOTAN_HAS_RW) + #include +#endif + +#if defined(BOTAN_HAS_ELGAMAL) + #include +#endif + +#if defined(BOTAN_HAS_DLIES) + #include + #include +#endif + +#include +#include +#include +using namespace Botan; + +#include "common.h" +#include "validate.h" + +namespace { + +BigInt to_bigint(const std::string& h) + { + return BigInt::decode(reinterpret_cast(h.data()), + h.length(), BigInt::Hexadecimal); + } + +} + +#define DEBUG 0 + +namespace { + +void dump_data(const SecureVector& out, + const SecureVector& expected) + { + Pipe pipe(new Hex_Encoder); + + pipe.process_msg(out); + pipe.process_msg(expected); + std::cout << "Got: " << pipe.read_all_as_string(0) << std::endl; + std::cout << "Exp: " << pipe.read_all_as_string(1) << std::endl; + } + +void validate_decryption(PK_Decryptor* d, const std::string& algo, + const SecureVector ctext, + const SecureVector ptext, + bool& failure) + { + SecureVector decrypted = d->decrypt(ctext); + if(decrypted != ptext) + { + std::cout << "FAILED (decrypt): " << algo << std::endl; + dump_data(decrypted, ptext); + failure = true; + } + delete d; + } + +void validate_encryption(PK_Encryptor* e, PK_Decryptor* d, + const std::string& algo, const std::string& input, + const std::string& random, const std::string& exp, + bool& failure) + { + SecureVector message = decode_hex(input); + SecureVector expected = decode_hex(exp); + Fixed_Output_RNG rng(decode_hex(random)); + + SecureVector out = e->encrypt(message, rng); + if(out != expected) + { + std::cout << "FAILED (encrypt): " << algo << std::endl; + dump_data(out, expected); + failure = true; + } + + validate_decryption(d, algo, out, message, failure); + delete e; + } + +void validate_signature(PK_Verifier* v, PK_Signer* s, const std::string& algo, + const std::string& input, const std::string& random, + const std::string& exp, bool& failure) + { + SecureVector message = decode_hex(input); + + SecureVector expected = decode_hex(exp); + + Fixed_Output_RNG rng(decode_hex(random)); + SecureVector sig = s->sign_message(message, message.size(), rng); + + if(sig != expected) + { + std::cout << "FAILED (sign): " << algo << std::endl; + dump_data(sig, expected); + failure = true; + } + + if(!v->verify_message(message, message.size(), sig, sig.size())) + { + std::cout << "FAILED (verify): " << algo << std::endl; + failure = true; + } + + /* This isn't a very thorough testing method, but it will hopefully + catch any really horrible errors */ + sig[0]++; + if(v->verify_message(message, message.size(), sig, sig.size())) + { + std::cout << "FAILED (accepted bad sig): " << algo << std::endl; + failure = true; + } + + delete v; + delete s; + } + +void validate_kas(PK_Key_Agreement* kas, const std::string& algo, + const SecureVector& pubkey, const std::string& output, + u32bit keylen, bool& failure) + { + SecureVector expected = decode_hex(output); + + SecureVector got = kas->derive_key(keylen, + pubkey, pubkey.size()).bits_of(); + + if(got != expected) + { + std::cout << "FAILED: " << algo << std::endl; + dump_data(got, expected); + failure = true; + } + + delete kas; + } + +u32bit validate_rsa_enc_pkcs8(const std::string& algo, + const std::vector& str, + RandomNumberGenerator& rng) + { + if(str.size() != 4 && str.size() != 5) + throw Exception("Invalid input from pk_valid.dat"); + + +#if defined(BOTAN_HAS_RSA) + std::string pass; + if(str.size() == 5) pass = str[4]; + strip_newlines(pass); /* it will have a newline thanks to the messy + decoding method we use */ + + DataSource_Memory keysource(reinterpret_cast(str[0].c_str()), + str[0].length()); + + std::auto_ptr privkey(PKCS8::load_key(keysource, rng, pass)); + + RSA_PrivateKey* rsapriv = dynamic_cast(privkey.get()); + if(!rsapriv) + throw Invalid_Argument("Bad key load for RSA key"); + + RSA_PublicKey* rsapub = dynamic_cast(rsapriv); + + std::string eme = algo.substr(12, std::string::npos); + + PK_Encryptor* e = get_pk_encryptor(*rsapub, eme); + PK_Decryptor* d = get_pk_decryptor(*rsapriv, eme); + + bool failure = false; + validate_encryption(e, d, algo, str[1], str[2], str[3], failure); + return (failure ? 1 : 0); +#endif + + return 2; + } + +u32bit validate_rsa_enc(const std::string& algo, + const std::vector& str, + RandomNumberGenerator& rng) + { + if(str.size() != 6) + throw Exception("Invalid input from pk_valid.dat"); + + +#if defined(BOTAN_HAS_RSA) + RSA_PrivateKey privkey(rng, + to_bigint(str[1]), to_bigint(str[2]), + to_bigint(str[0])); + + RSA_PublicKey pubkey = privkey; + + std::string eme = algo.substr(6, std::string::npos); + + PK_Encryptor* e = get_pk_encryptor(pubkey, eme); + PK_Decryptor* d = get_pk_decryptor(privkey, eme); + + bool failure = false; + validate_encryption(e, d, algo, str[3], str[4], str[5], failure); + return (failure ? 1 : 0); +#endif + + return 2; + } + +u32bit validate_elg_enc(const std::string& algo, + const std::vector& str, + RandomNumberGenerator& rng) + { + if(str.size() != 6 && str.size() != 7) + throw Exception("Invalid input from pk_valid.dat"); + + +#if defined(BOTAN_HAS_ELGAMAL) + DL_Group domain(to_bigint(str[0]), to_bigint(str[1])); + ElGamal_PrivateKey privkey(rng, domain, to_bigint(str[2])); + ElGamal_PublicKey pubkey = privkey; + + std::string eme = algo.substr(8, std::string::npos); + + PK_Decryptor* d = get_pk_decryptor(privkey, eme); + + bool failure = false; + if(str.size() == 7) + { + PK_Encryptor* e = get_pk_encryptor(pubkey, eme); + validate_encryption(e, d, algo, str[4], str[5], str[6], failure); + } + else + validate_decryption(d, algo, decode_hex(str[5]), + decode_hex(str[4]), failure); + return (failure ? 1 : 0); +#endif + + return 2; + } + +u32bit validate_rsa_sig(const std::string& algo, + const std::vector& str, + RandomNumberGenerator& rng) + { + if(str.size() != 6) + throw Exception("Invalid input from pk_valid.dat"); + + +#if defined(BOTAN_HAS_RSA) + RSA_PrivateKey privkey(rng, + to_bigint(str[1]), to_bigint(str[2]), + to_bigint(str[0])); + + RSA_PublicKey pubkey = privkey; + + std::string emsa = algo.substr(7, std::string::npos); + + PK_Verifier* v = get_pk_verifier(pubkey, emsa); + PK_Signer* s = get_pk_signer(privkey, emsa); + bool failure = false; + validate_signature(v, s, algo, str[3], str[4], str[5], failure); + return (failure ? 1 : 0); +#endif + + return 2; + } + +u32bit validate_rsa_ver(const std::string& algo, + const std::vector& str) + { + if(str.size() != 5) /* is actually 4, parse() adds an extra empty one */ + throw Exception("Invalid input from pk_valid.dat"); + +#if defined(BOTAN_HAS_RSA) + RSA_PublicKey key(to_bigint(str[1]), to_bigint(str[0])); + + std::string emsa = algo.substr(6, std::string::npos); + + std::auto_ptr v(get_pk_verifier(key, emsa)); + + SecureVector msg = decode_hex(str[2]); + SecureVector sig = decode_hex(str[3]); + + bool passed = true; + passed = v->verify_message(msg, msg.size(), sig, sig.size()); + return (passed ? 0 : 1); +#endif + + return 2; + } + +u32bit validate_rsa_ver_x509(const std::string& algo, + const std::vector& str) + { + if(str.size() != 5) /* is actually 3, parse() adds extra empty ones */ + throw Exception("Invalid input from pk_valid.dat"); + +#if defined(BOTAN_HAS_RSA) + DataSource_Memory keysource(reinterpret_cast(str[0].c_str()), + str[0].length()); + + std::auto_ptr key(X509::load_key(keysource)); + + RSA_PublicKey* rsakey = dynamic_cast(key.get()); + + if(!rsakey) + throw Invalid_Argument("Bad key load for RSA public key"); + + std::string emsa = algo.substr(11, std::string::npos); + + std::auto_ptr v(get_pk_verifier(*rsakey, emsa)); + + SecureVector msg = decode_hex(str[1]); + SecureVector sig = decode_hex(str[2]); + + bool passed = v->verify_message(msg, msg.size(), sig, sig.size()); + return (passed ? 0 : 1); + +#endif + + return 2; + } + +u32bit validate_rw_ver(const std::string& algo, + const std::vector& str) + { + if(str.size() != 5) + throw Exception("Invalid input from pk_valid.dat"); + + + +#if defined(BOTAN_HAS_RW) + RW_PublicKey key(to_bigint(str[1]), to_bigint(str[0])); + + std::string emsa = algo.substr(5, std::string::npos); + + std::auto_ptr v(get_pk_verifier(key, emsa)); + + SecureVector msg = decode_hex(str[2]); + SecureVector sig = decode_hex(str[3]); + + bool passed = true; + passed = v->verify_message(msg, msg.size(), sig, sig.size()); + return (passed ? 0 : 1); +#endif + + return 2; + } + +u32bit validate_rw_sig(const std::string& algo, + const std::vector& str, + RandomNumberGenerator& rng) + { + if(str.size() != 6) + throw Exception("Invalid input from pk_valid.dat"); + + +#if defined(BOTAN_HAS_RW) + RW_PrivateKey privkey(rng, to_bigint(str[1]), to_bigint(str[2]), + to_bigint(str[0])); + RW_PublicKey pubkey = privkey; + + std::string emsa = algo.substr(3, std::string::npos); + + PK_Verifier* v = get_pk_verifier(pubkey, emsa); + PK_Signer* s = get_pk_signer(privkey, emsa); + + bool failure = false; + validate_signature(v, s, algo, str[3], str[4], str[5], failure); + return (failure ? 1 : 0); +#endif + + return 2; + } + +u32bit validate_dsa_sig(const std::string& algo, + const std::vector& str, + RandomNumberGenerator& rng) + { + if(str.size() != 4 && str.size() != 5) + throw Exception("Invalid input from pk_valid.dat"); + + std::string pass; + if(str.size() == 5) pass = str[4]; + strip_newlines(pass); /* it will have a newline thanks to the messy + decoding method we use */ + +#if defined(BOTAN_HAS_DSA) + + DataSource_Memory keysource(reinterpret_cast(str[0].c_str()), + str[0].length()); + + std::auto_ptr privkey(PKCS8::load_key(keysource, rng, pass)); + + DSA_PrivateKey* dsapriv = dynamic_cast(privkey.get()); + if(!dsapriv) + throw Invalid_Argument("Bad key load for DSA private key"); + + DSA_PublicKey* dsapub = dynamic_cast(dsapriv); + + std::string emsa = algo.substr(4, std::string::npos); + + PK_Verifier* v = get_pk_verifier(*dsapub, emsa); + PK_Signer* s = get_pk_signer(*dsapriv, emsa); + + bool failure = false; + validate_signature(v, s, algo, str[1], str[2], str[3], failure); + return (failure ? 1 : 0); +#endif + + return 2; + } + +u32bit validate_dsa_ver(const std::string& algo, + const std::vector& str) + { + if(str.size() != 5) /* is actually 3, parse() adds extra empty ones */ + throw Exception("Invalid input from pk_valid.dat"); + + DataSource_Memory keysource(reinterpret_cast(str[0].c_str()), + str[0].length()); + + +#if defined(BOTAN_HAS_DSA) + std::auto_ptr key(X509::load_key(keysource)); + + DSA_PublicKey* dsakey = dynamic_cast(key.get()); + + if(!dsakey) + throw Invalid_Argument("Bad key load for DSA public key"); + + std::string emsa = algo.substr(7, std::string::npos); + + std::auto_ptr v(get_pk_verifier(*dsakey, emsa)); + + SecureVector msg = decode_hex(str[1]); + SecureVector sig = decode_hex(str[2]); + + v->set_input_format(DER_SEQUENCE); + bool passed = v->verify_message(msg, msg.size(), sig, sig.size()); + return (passed ? 0 : 1); +#endif + + return 2; + } + +u32bit validate_nr_sig(const std::string& algo, + const std::vector& str, + RandomNumberGenerator& rng) + { + if(str.size() != 8) + throw Exception("Invalid input from pk_valid.dat"); + + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + + DL_Group domain(to_bigint(str[0]), to_bigint(str[1]), to_bigint(str[2])); + NR_PrivateKey privkey(rng, domain, to_bigint(str[4])); + NR_PublicKey pubkey = privkey; + + std::string emsa = algo.substr(3, std::string::npos); + + PK_Verifier* v = get_pk_verifier(pubkey, emsa); + PK_Signer* s = get_pk_signer(privkey, emsa); + + bool failure = false; + validate_signature(v, s, algo, str[5], str[6], str[7], failure); + return (failure ? 1 : 0); +#endif + + return 2; + } + +u32bit validate_dh(const std::string& algo, + const std::vector& str, + RandomNumberGenerator& rng) + { + if(str.size() != 5 && str.size() != 6) + throw Exception("Invalid input from pk_valid.dat"); + + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + DL_Group domain(to_bigint(str[0]), to_bigint(str[1])); + + DH_PrivateKey mykey(rng, domain, to_bigint(str[2])); + DH_PublicKey otherkey(domain, to_bigint(str[3])); + + std::string kdf = algo.substr(3, std::string::npos); + + u32bit keylen = 0; + if(str.size() == 6) + keylen = to_u32bit(str[5]); + + PK_Key_Agreement* kas = get_pk_kas(mykey, kdf); + + bool failure = false; + validate_kas(kas, algo, otherkey.public_value(), + str[4], keylen, failure); + return (failure ? 1 : 0); +#endif + + return 2; + } + +u32bit validate_dlies(const std::string& algo, + const std::vector& str, + RandomNumberGenerator& rng) + { + if(str.size() != 6) + throw Exception("Invalid input from pk_valid.dat"); + +#if defined(BOTAN_HAS_DLIES) + DL_Group domain(to_bigint(str[0]), to_bigint(str[1])); + + DH_PrivateKey from(rng, domain, to_bigint(str[2])); + DH_PrivateKey to(rng, domain, to_bigint(str[3])); + + const std::string opt_str = algo.substr(6, std::string::npos); + + std::vector options = split_on(opt_str, '/'); + + if(options.size() != 3) + throw Exception("DLIES needs three options: " + opt_str); + + MessageAuthenticationCode* mac = get_mac(options[1]); + u32bit mac_key_len = to_u32bit(options[2]); + + PK_Decryptor* d = + new DLIES_Decryptor(to, + get_kdf(options[0]), + mac->clone(), mac_key_len); + + DLIES_Encryptor* e = + new DLIES_Encryptor(from, + get_kdf(options[0]), + mac, mac_key_len); + + e->set_other_key(to.public_value()); + + std::string empty = ""; + bool failure = false; + validate_encryption(e, d, algo, str[4], empty, str[5], failure); + return (failure ? 1 : 0); +#else + return 2; +#endif + } + +void do_pk_keygen_tests(RandomNumberGenerator& rng) + { + std::cout << "Testing PK key generation: " << std::flush; + +#define DL_SIG_KEY(TYPE, GROUP) \ + { \ + TYPE key(rng, DL_Group(GROUP)); \ + key.check_key(rng, true); \ + std::cout << '.' << std::flush; \ + } + +#define DL_ENC_KEY(TYPE, GROUP) \ + { \ + TYPE key(rng, DL_Group(GROUP)); \ + key.check_key(rng, true); \ + std::cout << '.' << std::flush; \ + } + +#define DL_KEY(TYPE, GROUP) \ + { \ + TYPE key(rng, DL_Group(GROUP)); \ + key.check_key(rng, true); \ + std::cout << '.' << std::flush; \ + } + +#if defined(BOTAN_HAS_RSA) + { + RSA_PrivateKey rsa1024(rng, 1024); + rsa1024.check_key(rng, true); + std::cout << '.' << std::flush; + } +#endif + +#if defined(BOTAN_HAS_RW) + { + RW_PrivateKey rw1024(rng, 1024); + rw1024.check_key(rng, true); + std::cout << '.' << std::flush; + } +#endif + +#if defined(BOTAN_HAS_DSA) + DL_SIG_KEY(DSA_PrivateKey, "dsa/jce/512"); + DL_SIG_KEY(DSA_PrivateKey, "dsa/jce/768"); + DL_SIG_KEY(DSA_PrivateKey, "dsa/jce/1024"); +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + DL_KEY(DH_PrivateKey, "modp/ietf/768"); + DL_KEY(DH_PrivateKey, "modp/ietf/2048"); + DL_KEY(DH_PrivateKey, "dsa/jce/1024"); +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + DL_SIG_KEY(NR_PrivateKey, "dsa/jce/512"); + DL_SIG_KEY(NR_PrivateKey, "dsa/jce/768"); + DL_SIG_KEY(NR_PrivateKey, "dsa/jce/1024"); +#endif + +#if defined(BOTAN_HAS_ELGAMAL) + DL_ENC_KEY(ElGamal_PrivateKey, "modp/ietf/768"); + DL_ENC_KEY(ElGamal_PrivateKey, "modp/ietf/1024"); + DL_ENC_KEY(ElGamal_PrivateKey, "dsa/jce/1024"); +#endif + + std::cout << std::endl; + } + +} + +u32bit do_pk_validation_tests(const std::string& filename, + RandomNumberGenerator& rng) + { + std::ifstream test_data(filename.c_str()); + + if(!test_data) + throw Botan::Stream_IO_Error("Couldn't open test file " + filename); + + u32bit errors = 0, alg_count = 0; + std::string algorithm, print_algorithm; + + while(!test_data.eof()) + { + if(test_data.bad() || test_data.fail()) + throw Botan::Stream_IO_Error("File I/O error reading from " + + filename); + + std::string line; + std::getline(test_data, line); + + strip_comments(line); + if(line.size() == 0) continue; + + // Do line continuation + while(line[line.size()-1] == '\\' && !test_data.eof()) + { + line.replace(line.size()-1, 1, ""); + std::string nextline; + std::getline(test_data, nextline); + strip_comments(nextline); + if(nextline.size() == 0) continue; + line.push_back('\n'); + line += nextline; + } + + if(line[0] == '[' && line[line.size() - 1] == ']') + { + std::string old_algo = print_algorithm; + algorithm = line.substr(1, line.size() - 2); + print_algorithm = algorithm; + if(print_algorithm.find("_PKCS8") != std::string::npos) + print_algorithm.replace(print_algorithm.find("_PKCS8"), 6, ""); + if(print_algorithm.find("_X509") != std::string::npos) + print_algorithm.replace(print_algorithm.find("_X509"), 5, ""); + if(print_algorithm.find("_VA") != std::string::npos) + print_algorithm.replace(print_algorithm.find("_VA"), 3, ""); + + if(old_algo != print_algorithm && old_algo != "") + { + std::cout << std::endl; + alg_count = 0; + } + + if(old_algo != print_algorithm) + std::cout << "Testing " << print_algorithm << ": "; + continue; + } + + std::vector substr = parse(line); + +#if DEBUG + std::cout << "Testing: " << print_algorithm << std::endl; +#endif + + u32bit new_errors = 0; + + try + { + + if(algorithm.find("DSA/") != std::string::npos) + new_errors = validate_dsa_sig(algorithm, substr, rng); + else if(algorithm.find("DSA_VA/") != std::string::npos) + new_errors = validate_dsa_ver(algorithm, substr); + + else if(algorithm.find("RSAES_PKCS8/") != std::string::npos) + new_errors = validate_rsa_enc_pkcs8(algorithm, substr, rng); + else if(algorithm.find("RSAVA_X509/") != std::string::npos) + new_errors = validate_rsa_ver_x509(algorithm, substr); + + else if(algorithm.find("RSAES/") != std::string::npos) + new_errors = validate_rsa_enc(algorithm, substr, rng); + else if(algorithm.find("RSASSA/") != std::string::npos) + new_errors = validate_rsa_sig(algorithm, substr, rng); + else if(algorithm.find("RSAVA/") != std::string::npos) + new_errors = validate_rsa_ver(algorithm, substr); + else if(algorithm.find("RWVA/") != std::string::npos) + new_errors = validate_rw_ver(algorithm, substr); + else if(algorithm.find("RW/") != std::string::npos) + new_errors = validate_rw_sig(algorithm, substr, rng); + else if(algorithm.find("NR/") != std::string::npos) + new_errors = validate_nr_sig(algorithm, substr, rng); + else if(algorithm.find("ElGamal/") != std::string::npos) + new_errors = validate_elg_enc(algorithm, substr, rng); + else if(algorithm.find("DH/") != std::string::npos) + new_errors = validate_dh(algorithm, substr, rng); + else if(algorithm.find("DLIES/") != std::string::npos) + new_errors = validate_dlies(algorithm, substr, rng); + else + std::cout << "WARNING: Unknown PK algorithm " + << algorithm << std::endl; + + if(new_errors == 0) // OK + std::cout << '.'; + else if(new_errors == 1) // test failed + std::cout << 'X'; + else if(new_errors == 2) // unknown algo + std::cout << '?'; + + std::cout.flush(); + + alg_count++; + if(new_errors == 1) + errors += new_errors; + } + catch(std::exception& e) + { + std::cout << "Exception: " << e.what() << "\n"; + } + + if(new_errors == 1) + std::cout << "ERROR: \"" << algorithm << "\" failed test #" + << std::dec << alg_count << std::endl; + } + + std::cout << std::endl; + + errors += do_gfpmath_tests(rng); + do_ec_tests(rng); + errors += do_ecdsa_tests(rng); + errors += do_eckaeg_tests(rng); + do_pk_keygen_tests(rng); + do_x509_tests(rng); + + return errors; + } + diff --git a/src/libs/3rdparty/botan/checks/pk_bench.cpp b/src/libs/3rdparty/botan/checks/pk_bench.cpp new file mode 100644 index 00000000000..88a72afde6a --- /dev/null +++ b/src/libs/3rdparty/botan/checks/pk_bench.cpp @@ -0,0 +1,682 @@ +#include +#include +#include +#include +#include + +#if defined(BOTAN_HAS_RSA) + #include +#endif + +#if defined(BOTAN_HAS_DSA) + #include +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + #include +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + #include +#endif + +#if defined(BOTAN_HAS_RW) + #include +#endif + +#if defined(BOTAN_HAS_ELGAMAL) + #include +#endif + +#if defined(BOTAN_HAS_DLIES) + #include + #include + #include + #include +#endif + +#if defined(BOTAN_HAS_ECDSA) + #include +#endif + +#if defined(BOTAN_HAS_ECKAEG) + #include +#endif + +using namespace Botan; + +#include "common.h" +#include "timer.h" +#include "bench.h" + +#include +#include +#include +#include + +namespace { + +void benchmark_enc_dec(PK_Encryptor& enc, PK_Decryptor& dec, + Timer& enc_timer, Timer& dec_timer, + RandomNumberGenerator& rng, + u32bit runs, double seconds) + { + SecureVector plaintext, ciphertext; + + for(u32bit i = 0; i != runs; ++i) + { + if(enc_timer.seconds() < seconds || ciphertext.size() == 0) + { + plaintext.create(enc.maximum_input_size()); + + // Ensure for Raw, etc, it stays large + if((i % 100) == 0) + { + rng.randomize(plaintext.begin(), plaintext.size()); + plaintext[0] |= 0x80; + } + + enc_timer.start(); + ciphertext = enc.encrypt(plaintext, rng); + enc_timer.stop(); + } + + if(dec_timer.seconds() < seconds) + { + dec_timer.start(); + SecureVector plaintext_out = dec.decrypt(ciphertext); + dec_timer.stop(); + + if(plaintext_out != plaintext) + { // has never happened... + std::cerr << "Contents mismatched on decryption during benchmark!\n"; + } + } + } + } + +void benchmark_sig_ver(PK_Verifier& ver, PK_Signer& sig, + Timer& verify_timer, Timer& sig_timer, + RandomNumberGenerator& rng, + u32bit runs, double seconds) + { + SecureVector message, signature, sig_random; + + for(u32bit i = 0; i != runs; ++i) + { + if(sig_timer.seconds() < seconds || signature.size() == 0) + { + if((i % 100) == 0) + { + message.create(48); + rng.randomize(message.begin(), message.size()); + } + + sig_timer.start(); + signature = sig.sign_message(message, rng); + sig_timer.stop(); + } + + if(verify_timer.seconds() < seconds) + { + verify_timer.start(); + bool verified = ver.verify_message(message, signature); + verify_timer.stop(); + + if(!verified) + std::cerr << "Signature verification failure\n"; + + if((i % 100) == 0) + { + sig_random.create(signature.size()); + rng.randomize(sig_random, sig_random.size()); + + verify_timer.start(); + bool verified2 = ver.verify_message(message, sig_random); + verify_timer.stop(); + + if(verified2) + std::cerr << "Signature verification failure (bad sig OK)\n"; + } + } + } + } + +/* + Between benchmark_rsa_rw + benchmark_dsa_nr: + Type of the key + Arguments to the constructor (A list of some arbitrary type?) + Type of padding +*/ + +#if defined(BOTAN_HAS_RSA) +void benchmark_rsa(RandomNumberGenerator& rng, + double seconds, + Benchmark_Report& report) + { + + size_t keylens[] = { 512, 1024, 2048, 4096, 6144, 8192, 0 }; + + for(size_t i = 0; keylens[i]; ++i) + { + size_t keylen = keylens[i]; + + //const std::string sig_padding = "EMSA4(SHA-1)"; + //const std::string enc_padding = "EME1(SHA-1)"; + const std::string sig_padding = "EMSA-PKCS1-v1_5(SHA-1)"; + const std::string enc_padding = "EME-PKCS1-v1_5"; + + Timer keygen_timer("keygen"); + Timer verify_timer(sig_padding + " verify"); + Timer sig_timer(sig_padding + " signature"); + Timer enc_timer(enc_padding + " encrypt"); + Timer dec_timer(enc_padding + " decrypt"); + + try + { + +#if 0 + // for profiling + PKCS8_PrivateKey* pkcs8_key = + PKCS8::load_key("rsa/" + to_string(keylen) + ".pem", rng); + RSA_PrivateKey* key_ptr = dynamic_cast(pkcs8_key); + + RSA_PrivateKey key = *key_ptr; +#else + keygen_timer.start(); + RSA_PrivateKey key(rng, keylen); + keygen_timer.stop(); +#endif + + while(verify_timer.seconds() < seconds || + sig_timer.seconds() < seconds) + { + std::auto_ptr enc(get_pk_encryptor(key, enc_padding)); + std::auto_ptr dec(get_pk_decryptor(key, enc_padding)); + benchmark_enc_dec(*enc, *dec, enc_timer, dec_timer, rng, 10000, seconds); + + std::auto_ptr sig(get_pk_signer(key, sig_padding)); + std::auto_ptr ver(get_pk_verifier(key, sig_padding)); + benchmark_sig_ver(*ver, *sig, verify_timer, + sig_timer, rng, 10000, seconds); + } + + const std::string rsa_keylen = "RSA-" + to_string(keylen); + + report.report(rsa_keylen, keygen_timer); + report.report(rsa_keylen, verify_timer); + report.report(rsa_keylen, sig_timer); + report.report(rsa_keylen, enc_timer); + report.report(rsa_keylen, dec_timer); + } + catch(Stream_IO_Error) + { + } + catch(Exception& e) + { + std::cout << e.what() << "\n"; + } + } + + } +#endif + +#if defined(BOTAN_HAS_RW) +void benchmark_rw(RandomNumberGenerator& rng, + double seconds, + Benchmark_Report& report) + { + + const u32bit keylens[] = { 512, 1024, 2048, 4096, 6144, 8192, 0 }; + + for(size_t j = 0; keylens[j]; j++) + { + u32bit keylen = keylens[j]; + + std::string padding = "EMSA2(SHA-256)"; + + Timer keygen_timer("keygen"); + Timer verify_timer(padding + " verify"); + Timer sig_timer(padding + " signature"); + + while(verify_timer.seconds() < seconds || + sig_timer.seconds() < seconds) + { + keygen_timer.start(); + RW_PrivateKey key(rng, keylen); + keygen_timer.stop(); + + std::auto_ptr sig(get_pk_signer(key, padding)); + std::auto_ptr ver(get_pk_verifier(key, padding)); + + benchmark_sig_ver(*ver, *sig, verify_timer, sig_timer, rng, 10000, seconds); + } + + const std::string nm = "RW-" + to_string(keylen); + report.report(nm, keygen_timer); + report.report(nm, verify_timer); + report.report(nm, sig_timer); + } + } +#endif + +#if defined(BOTAN_HAS_ECDSA) + +void benchmark_ecdsa(RandomNumberGenerator& rng, + double seconds, + Benchmark_Report& report) + { + const char* domains[] = { "1.3.132.0.6", // secp112r1 + "1.3.132.0.28", // secp128r1 + "1.3.132.0.30", // secp160r2 + "1.3.132.0.33", // secp224r1 + "1.3.132.0.34", // secp384r1 + "1.3.132.0.35", // secp512r1 + NULL }; + + for(size_t j = 0; domains[j]; j++) + { + EC_Domain_Params params = get_EC_Dom_Pars_by_oid(domains[j]); + + u32bit pbits = params.get_curve().get_p().bits(); + + u32bit hashbits = pbits; + + if(hashbits < 160) + hashbits = 160; + if(hashbits == 521) + hashbits = 512; + + const std::string padding = "EMSA1(SHA-" + to_string(hashbits) + ")"; + + Timer keygen_timer("keygen"); + Timer verify_timer(padding + " verify"); + Timer sig_timer(padding + " signature"); + + while(verify_timer.seconds() < seconds || + sig_timer.seconds() < seconds) + { + keygen_timer.start(); + ECDSA_PrivateKey key(rng, params); + keygen_timer.stop(); + + std::auto_ptr sig(get_pk_signer(key, padding)); + std::auto_ptr ver(get_pk_verifier(key, padding)); + + benchmark_sig_ver(*ver, *sig, verify_timer, + sig_timer, rng, 1000, seconds); + } + + const std::string nm = "ECDSA-" + to_string(pbits); + + report.report(nm, keygen_timer); + report.report(nm, verify_timer); + report.report(nm, sig_timer); + } + } + +#endif + +#if defined(BOTAN_HAS_ECKAEG) + +void benchmark_eckaeg(RandomNumberGenerator& rng, + double seconds, + Benchmark_Report& report) + { + const char* domains[] = { "1.3.132.0.6", // secp112r1 + "1.3.132.0.28", // secp128r1 + "1.3.132.0.30", // secp160r2 + "1.3.132.0.33", // secp224r1 + "1.3.132.0.34", // secp384r1 + "1.3.132.0.35", // secp512r1 + NULL }; + + for(size_t j = 0; domains[j]; j++) + { + EC_Domain_Params params = get_EC_Dom_Pars_by_oid(domains[j]); + + u32bit pbits = params.get_curve().get_p().bits(); + + Timer keygen_timer("keygen"); + Timer kex_timer("key exchange"); + + while(kex_timer.seconds() < seconds) + { + keygen_timer.start(); + ECKAEG_PrivateKey eckaeg1(rng, params); + keygen_timer.stop(); + + keygen_timer.start(); + ECKAEG_PrivateKey eckaeg2(rng, params); + keygen_timer.stop(); + + ECKAEG_PublicKey pub1(eckaeg1); + ECKAEG_PublicKey pub2(eckaeg2); + + SecureVector secret1, secret2; + + for(u32bit i = 0; i != 1000; ++i) + { + if(kex_timer.seconds() > seconds) + break; + + kex_timer.start(); + secret1 = eckaeg1.derive_key(pub2); + kex_timer.stop(); + + kex_timer.start(); + secret2 = eckaeg2.derive_key(pub1); + kex_timer.stop(); + + if(secret1 != secret2) + std::cerr << "ECKAEG secrets did not match, bug in the library!?!\n"; + } + } + + const std::string nm = "ECKAEG-" + to_string(pbits); + report.report(nm, keygen_timer); + report.report(nm, kex_timer); + } + } + +#endif + +template +void benchmark_dsa_nr(RandomNumberGenerator& rng, + double seconds, + Benchmark_Report& report) + { +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) || defined(BOTAN_HAS_DSA) + const char* domains[] = { "dsa/jce/512", + "dsa/jce/768", + "dsa/jce/1024", + "dsa/botan/2048", + "dsa/botan/3072", + NULL }; + + const std::string algo_name = PRIV_KEY_TYPE().algo_name(); + + for(size_t j = 0; domains[j]; j++) + { + u32bit pbits = to_u32bit(split_on(domains[j], '/')[2]); + u32bit qbits = (pbits <= 1024) ? 160 : 256; + + const std::string padding = "EMSA1(SHA-" + to_string(qbits) + ")"; + + Timer keygen_timer("keygen"); + Timer verify_timer(padding + " verify"); + Timer sig_timer(padding + " signature"); + + while(verify_timer.seconds() < seconds || + sig_timer.seconds() < seconds) + { + DL_Group group(domains[j]); + + keygen_timer.start(); + PRIV_KEY_TYPE key(rng, group); + keygen_timer.stop(); + + std::auto_ptr sig(get_pk_signer(key, padding)); + std::auto_ptr ver(get_pk_verifier(key, padding)); + + benchmark_sig_ver(*ver, *sig, verify_timer, + sig_timer, rng, 1000, seconds); + } + + const std::string nm = algo_name + "-" + to_string(pbits); + report.report(nm, keygen_timer); + report.report(nm, verify_timer); + report.report(nm, sig_timer); + } +#endif + } + +#ifdef BOTAN_HAS_DIFFIE_HELLMAN +void benchmark_dh(RandomNumberGenerator& rng, + double seconds, + Benchmark_Report& report) + { + const char* domains[] = { "modp/ietf/768", + "modp/ietf/1024", + "modp/ietf/2048", + "modp/ietf/3072", + "modp/ietf/4096", + "modp/ietf/6144", + "modp/ietf/8192", + NULL }; + + for(size_t j = 0; domains[j]; j++) + { + Timer keygen_timer("keygen"); + Timer kex_timer("key exchange"); + + while(kex_timer.seconds() < seconds) + { + DL_Group group(domains[j]); + + keygen_timer.start(); + DH_PrivateKey dh1(rng, group); + keygen_timer.stop(); + + keygen_timer.start(); + DH_PrivateKey dh2(rng, group); + keygen_timer.stop(); + + DH_PublicKey pub1(dh1); + DH_PublicKey pub2(dh2); + + SecureVector secret1, secret2; + + for(u32bit i = 0; i != 1000; ++i) + { + if(kex_timer.seconds() > seconds) + break; + + kex_timer.start(); + secret1 = dh1.derive_key(pub2); + kex_timer.stop(); + + kex_timer.start(); + secret2 = dh2.derive_key(pub1); + kex_timer.stop(); + + if(secret1 != secret2) + std::cerr << "DH secrets did not match, bug in the library!?!\n"; + } + } + + const std::string nm = "DH-" + split_on(domains[j], '/')[2]; + report.report(nm, keygen_timer); + report.report(nm, kex_timer); + } + } +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) && defined(BOTAN_HAS_DLIES) +void benchmark_dlies(RandomNumberGenerator& rng, + double seconds, + Benchmark_Report& report) + { + const char* domains[] = { "modp/ietf/768", + "modp/ietf/1024", + "modp/ietf/2048", + "modp/ietf/3072", + "modp/ietf/4096", + "modp/ietf/6144", + "modp/ietf/8192", + NULL }; + + for(size_t j = 0; domains[j]; j++) + { + Timer keygen_timer("keygen"); + Timer kex_timer("key exchange"); + + Timer enc_timer("encrypt"); + Timer dec_timer("decrypt"); + + while(enc_timer.seconds() < seconds || dec_timer.seconds() < seconds) + { + DL_Group group(domains[j]); + + keygen_timer.start(); + DH_PrivateKey dh1_priv(rng, group); + keygen_timer.stop(); + + keygen_timer.start(); + DH_PrivateKey dh2_priv(rng, group); + keygen_timer.stop(); + + DH_PublicKey dh2_pub(dh2_priv); + + DLIES_Encryptor dlies_enc(dh1_priv, + new KDF2(new SHA_160), + new HMAC(new SHA_160)); + + dlies_enc.set_other_key(dh2_pub.public_value()); + + DLIES_Decryptor dlies_dec(dh2_priv, + new KDF2(new SHA_160), + new HMAC(new SHA_160)); + + benchmark_enc_dec(dlies_enc, dlies_dec, + enc_timer, dec_timer, rng, + 1000, seconds); + } + + const std::string nm = "DLIES-" + split_on(domains[j], '/')[2]; + report.report(nm, keygen_timer); + report.report(nm, enc_timer); + report.report(nm, dec_timer); + } + } +#endif + +#ifdef BOTAN_HAS_ELGAMAL +void benchmark_elg(RandomNumberGenerator& rng, + double seconds, + Benchmark_Report& report) + { + const char* domains[] = { "modp/ietf/768", + "modp/ietf/1024", + "modp/ietf/2048", + "modp/ietf/3072", + "modp/ietf/4096", + "modp/ietf/6144", + "modp/ietf/8192", + NULL }; + + const std::string algo_name = "ElGamal"; + + for(size_t j = 0; domains[j]; j++) + { + u32bit pbits = to_u32bit(split_on(domains[j], '/')[2]); + + const std::string padding = "EME1(SHA-1)"; + + Timer keygen_timer("keygen"); + Timer enc_timer(padding + " encrypt"); + Timer dec_timer(padding + " decrypt"); + + while(enc_timer.seconds() < seconds || + dec_timer.seconds() < seconds) + { + DL_Group group(domains[j]); + + keygen_timer.start(); + ElGamal_PrivateKey key(rng, group); + keygen_timer.stop(); + + std::auto_ptr dec(get_pk_decryptor(key, padding)); + std::auto_ptr enc(get_pk_encryptor(key, padding)); + + benchmark_enc_dec(*enc, *dec, enc_timer, dec_timer, rng, 1000, seconds); + } + + const std::string nm = algo_name + "-" + to_string(pbits); + report.report(nm, keygen_timer); + report.report(nm, enc_timer); + report.report(nm, dec_timer); + } + } +#endif + +} + +void bench_pk(RandomNumberGenerator& rng, + const std::string& algo, bool, double seconds) + { + /* + There is some strangeness going on here. It looks like algorithms + at the end take some kind of penalty. For example, running the RW tests + first got a result of: + RW-1024: 148.14 ms / private operation + but running them last output: + RW-1024: 363.54 ms / private operation + + I think it's from memory fragmentation in the allocators, but I'm + not really sure. Need to investigate. + + Until then, I've basically ordered the tests in order of most important + algorithms (RSA, DSA) to least important (NR, RW). + + This strange behaviour does not seem to occur with DH (?) + + To get more accurate runs, use --bench-algo (RSA|DSA|DH|ELG|NR); in this + case the distortion is less than 5%, which is good enough. + + We do random keys with the DL schemes, since it's so easy and fast to + generate keys for them. For RSA and RW, we load the keys from a file. The + RSA keys are stored in a PKCS #8 structure, while RW is stored in a more + ad-hoc format (the RW algorithm has no assigned OID that I know of, so + there is no way to encode a RW key into a PKCS #8 structure). + */ + + global_state().set_option("pk/test/private_gen", "basic"); + + Benchmark_Report report; + +#if defined(BOTAN_HAS_RSA) + if(algo == "All" || algo == "RSA") + benchmark_rsa(rng, seconds, report); +#endif + +#if defined(BOTAN_HAS_DSA) + if(algo == "All" || algo == "DSA") + benchmark_dsa_nr(rng, seconds, report); +#endif + +#if defined(BOTAN_HAS_ECDSA) + if(algo == "All" || algo == "ECDSA") + benchmark_ecdsa(rng, seconds, report); +#endif + +#if defined(BOTAN_HAS_ECKAEG) + if(algo == "All" || algo == "ECKAEG") + benchmark_eckaeg(rng, seconds, report); +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + if(algo == "All" || algo == "DH") + benchmark_dh(rng, seconds, report); +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) && defined(BOTAN_HAS_DLIES) + if(algo == "All" || algo == "DLIES") + benchmark_dlies(rng, seconds, report); +#endif + +#if defined(BOTAN_HAS_ELGAMAL) + if(algo == "All" || algo == "ELG" || algo == "ElGamal") + benchmark_elg(rng, seconds, report); +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + if(algo == "All" || algo == "NR") + benchmark_dsa_nr(rng, seconds, report); +#endif + +#if defined(BOTAN_HAS_RW) + if(algo == "All" || algo == "RW") + benchmark_rw(rng, seconds, report); +#endif + } diff --git a/src/libs/3rdparty/botan/checks/pk_valid.dat b/src/libs/3rdparty/botan/checks/pk_valid.dat new file mode 100644 index 00000000000..1e2a84c19cf --- /dev/null +++ b/src/libs/3rdparty/botan/checks/pk_valid.dat @@ -0,0 +1,4808 @@ +# Validation File for Public Key Algorithms +# Not as comprehensive as it should be + +# RSA Format: exponent:p:q:message:nonce:output +[RSAES/Raw] +# Tests for keys 512,520,...,1016,1024 bits, and random messages +3ED19:\ +D987D71CC924C479D30CD88570A626E15F0862A9A138874F7016684216984215:\ +C5660F33AB35E41CB10A30D3A58354ADB5CC3243342C22E1A5BCCB79C391A533:\ +098825DEC8B4DAB5765348CEE92C4C6A527A172E4A4311399B0B02914E75822F1789B583180AD\ +EADE98C200B7B7670D7B9FBA19946F3D8A7FC8322F80CF67C::\ +A54A45C5F534A6C727212802CD4B2A0B9D0069EFE32B1D239D3B13958BC49711E1CA5BB499FBF\ +7402B6006E654C719C5FB7614C7C00699866B38445228EC7663 + +3ED19:\ +C5660F33AB35E41CB10A30D3A58354ADB5CC3243342C22E1A5BCCB79C391A533:\ +D987D71CC924C479D30CD88570A626E15F0862A9A138874F7016684216984215:\ +098825DEC8B4DAB5765348CEE92C4C6A527A172E4A4311399B0B02914E75822F1789B583180AD\ +EADE98C200B7B7670D7B9FBA19946F3D8A7FC8322F80CF67C::\ +A54A45C5F534A6C727212802CD4B2A0B9D0069EFE32B1D239D3B13958BC49711E1CA5BB499FBF\ +7402B6006E654C719C5FB7614C7C00699866B38445228EC7663 + +1F1DD:\ +DA78C89EBDDB277831DC1591C26AAB1C11CE9721DBB3AAFAE8F73178BC2D60055:\ +CDA647FE7D18AE11DB26331116DD7F0C22D1E79E524D6886768260156827C6E9D:\ +CC11049A69951999393D2F48CF7DD27F99C735BC424E538F60EDB512815F88F17B71C27C875D0\ +5BD3DDE4B1573C61F8C91AE22D50BC2AC32422C87C34F2B8A40::\ +946F392678443684494FA6AEC5A862C2825CB3B27B6FB6EA5E9654A9C18503F41E8D6FD34AF40\ +76B5A703E14287F133E6A2B0222FF812309DEBE733543FCE97792 + +35AF7:\ +B6B91AC270B7F066374A83555D690D67F0122398B3BFE69EE955F385A87C7736DF:\ +FF43B5A334ED37C059E693C68B9567C41E7EC17A3BFD922EDF50CC000902846A7D:\ +C1BDC66E04769D8D104B4FAC19AA8756FEAB153BF57E3FE305F2A6DA718EA7A140D8C4B5A8FC2\ +05E327DCC13554A378F1D19ACEAF5DB3D06266F90EC4C72ED6B5B::\ +73604C1C3F699A56053A627A46502A67D0B604009F811D2E3A296830F5DE6DB0820EF1288A37A\ +3DD47974D339FD06DDBDCA44C53F3A88765F4532A26DAC97BFF7F3A + +1EFB3:\ +DB08ED25044A98F91CDCD7A92FC81C376A51FF58329E2D2EC54AE71C25C17B639EF:\ +B99DBF6E1FD6D5A2986FBB818B6887AA41BADE5761C333EE98B095E7D551CC70865:\ +6BBB92A591C6A9B612EA82FD766100E7B37D8DE8FACDECE322B20E18D7932B854A5594FA67972\ +B13D79AA9D37CDE29386644D9FCA609A7717C55EBF568687015A2E0::\ +50825633A36B199F23931AD09DB38DBC8548AACC6A37F1923ABC6F94CE7256427E98E5A433A7F\ +0FDC6DC8C8519B0DFD94A5A98C8AE80D1B502C0EC3592173DCBBC8E5A + +22E79:\ +FC0A336E6CA2935826038319B45E921F77E4917D978B3177D162FB0CF75058B6EE2B:\ +B8551618F76501F4518336A579117533AB27866B44A4D15A4C0999D919024F1C558D:\ +483E61678CFF7AF78306C5E538D0AE750F1B172BA0BECAF561EF7D9C6369F713AD0FDD7C75F56\ +F1D4570B668D45563CE7801BD97C6EBB7C9909A9C454369DEAFB57E97::\ +ADE77710A5E9C390151CF6E7226E63692367567D1C02A7E5C1554ABE84E487B48EB18BFA20A8B\ +F42180BF0AD5A6E1A6FFC7EC45A4CFCFEEF1E3F3333B85C98101FE8E339 + +EAF1:\ +FFE0213AED2397C0663C26A85DC88DD4C95AA61345C4B68492C3FB1F63B61B1AB1CE3:\ +FD1DCC4D3B4B474BF2269DB028091B4A4C8AA244D2F2D9C5F55FE449ECF5D2F2DB491:\ +BE889EC220BEBD6F542B5FE8E670453333BBBD438EA2DAB4718E72872189FB74E1D1D677C1D45\ +8D769C82D8CE7FE163E2384DFE458C39FB5E8ABB78E5D5D3454CEF0AA74::\ +4213C1FBF227222B30F20340E345ACD86F90656034F3B318E43D3BC1A46A0FCFFA2E0E6998826\ +97025096D999290CC80801E10F5CB9FC0BC52A2170A16B52B9AEEFF6C5FBD + +6B7D:\ +CEDD0A94A36B76B858DDC6936C74AD06FFDB4924DB40A67A92E1E04B2D8C40F79C323D:\ +B78925E051D7502B08DF6E08CCE50079CD135C4E598A0C4401AE7300580ABC4E8EBE03:\ +98F60C8C957EE09B5AA93A4F1260143AD426B5C4A3704DBF02006766910247D2629F867B50DB7\ +00C4BE6BE97571D00BB201B2B3F3A4D663DF47C0F54BC48556E5EBC34AD82::\ +7CB497661BE76C5DF706EB0C0501946ACDC5F29FAEE801A77F8977663C1428136DCBE39A27146\ +272635C3F793546D1EE26850612D784D57C5F3F3F1C14A2DD58E07B06C2773A + +3F5DF:\ +CFDB1855F00EF13CE24453CA18C30292853D7E67AFE568F0C03E1AFBB68A0FC957559EF:\ +BD6E7EDAC9168F48C0B79E5C8DEBFEE0344AFD7DF63632C9F10084605EA7EA2C37DAAEB:\ +F34B51F68AE00AB209B178FA4ABA876F1DCF438016CF7054A4E979B1D239C6FE087E492AD69C4\ +7C5F4574DA5C506AB9CE37E6088FC82BCFA7ECAAEC4C14F2C8C7D9144C351D0::\ +94450AA696DB0715A5EB2B4FBE5A9CD4B1396A6DD8748359947C809061E13122C5266368415EA\ +7D4AB343B7981229CAC73BBE2233B3DF2F706DC26F32AA428377A0172AC58C662 + +17577:\ +C3DFA0C60823C8F5355CA1768BABB4A33C3FFC55CE89FD372F5D9B2B2B49DDD23C669A77:\ +EF50ED5CD6B6BF898586F8DAACBCBD5FEE637F56936C2535F4F5E30B35B9F5DD8B8D6D61:\ +FE19C87AA946B87FB8CA1C274DAC3D67F5E2D67EF2518BA3C1C6779D42E90FADC96C849065908\ +D836E74F5932536C2CA8F6B65ADCA245F78C6D4F3230D50264E804B460D6C50B7::\ +13AF743D2FE2542AE28DB8BC52119F3B563C8D800D88ACCBF66EEDF6C418D9919D21A7B4AEB02\ +882CD8BC201CB66DD81953E27BBC29584148CAD99A4AADB5864B403326A56B19F18 + +3967B:\ +EA749A2B3E172EDD565949DFF7C6D6862CD6C0926221E02E48A4C57169DB99058F1AA0B1F:\ +FBCE4C37F70845A76B894DA16FE38ABA97AC9BB41502DDBB3B8A324D49ED6BCFE424AEECF:\ +2C6BD8FEDCB431F2F5C4EC93841BC7C96E5AF33CD0A92C40D552F18F27D1021122F1841402059\ +41BCD9943C17FB14EAB112BD0298BBD73280611DD873EDB7F8431840D01618564F7::\ +06D86CBFCCCD3053F2280DF34E2EE6CFD7C8F9A2C2E1F610918C160BEB3D96C677A44B0F26BF73\ +8AE8A94764ECD03AF8F450761CC58698C2D4D62C8357A97EF09811E5AD7272888398 + +2B62B:\ +B9C09DF3CFC53D3C72EA055D8F4C10E4D477CD657D37F0ABAF4EEA736AC1B2628B00726F0D:\ +FE01AC6F0BBE2BA6C593FB96A0C24829183D1D99F5CF39909BEF7B2F0D8859D325689CF93F:\ +DEAEE8D8F4D64EB0D88BC82DCBF7883558A44886105BEAAA2E193ED843C956521F155A750BEA3\ +76E179B54465574C75E817B38BC51C2451739DCC8F6A55193076E4654CCED925DFDB4::\ +AD285E351DF685D52E53BECFF44B24288C323F1E3ECD960D0773D530A7D4D622473222BA35F50\ +78ECD49D2234FEBE178AC099BCAF0C6D11D6309099BEA61DB86AAC27AFC2452034CCD5D + +A57D:\ +EE13F2AF183D15108C8A537E0FE9B39B3ECAF21B3E29995F121C6C0234FAF590102E90B46BD:\ +F369E93A0B0B6F459077A41C4548218D32CB0C2F7E3227EB61E06A2D77D5A638DE0DCAFE987:\ +BC46B68B8D7CDA2EE172E33D3D4B0A0C3A6174C69920BDDFF99795F36178BE629970182EFF3D3\ +A1D796AB6EEEA3FCCA7AC719436718619D86D8BD6F8F4415464899CCC852E104CC5841B::\ +5F85961809D44F4D5FA6161F1F69DCEEF6B4D9B1EAC9378595A329761480B9658CC5C5A2E0AA4\ +F63B96E7961AC450C0C37B57BE0956BFB8B4613C9B4FF88C0849E02CFD586AA03847482DA + +13B57:\ +F7B57711898D0CD9F7A01F3089748199E36657205D9886C225BF2CB2E592745F139B1C4EEFCB:\ +BFAA7B146C59824446B21716A991A09742D9A84B94F7F0A16BF0717B2D9C1A4665C3E8C17E35:\ +913167F67F74B1AC7D534A9A6C5DE71227B7F53BCB806897284666E147AF50CB263433F938DD0\ +7B5609DA8E0BE690220B57D99F4051AC8D5D67E86ADE626F1EEB0771C62DAB8F4452A637E::\ +97A5809F41C9AF2CE06CB4E43D96D0762B5317D3DA5B56F38493D4D8A75CB3C7361801887C921\ +0D39B5772BA7F32D302F91CD622CDD9FAB50C3A14AD95824692660D1631AC601C310DB91D61 + +2FF3F:\ +F6F1763D1518036D58CA36D95E429BB9B47B2C064227B8C8875E0B16326A09E8397EA805DA825:\ +FF0ADACC5EE6B8D4E5E94985C9DFCC826A650A1AE1CE888ACD44D474483873E855FEC4EE7C235:\ +92D02535AB6B255F85546AB69CE4223E63F4355ECB57DC8DF1F0E56505721A78233A9D94A5B60\ +1537CBEAD6E092F1ED4441B32510883B2CA7C2211D04785E78E5A1AB4EA07E4983DACC4DA1C::\ +E131DB04F4578910C3DB88C909BF429D29D02541219925CB4447493CE13BA756D5EAC4D68EBBD\ +3AE853844EBD5E3914F3001A5B722D4EFE0C1203D89B9045440145966B61D3BA1CED4AD32C773\ + +22E97:\ +E420CB77F5D12BA62595E0472843C39756E9CB097992EE1CD06F96EFA9AC\ +C96D664764A674C953:\ +E65E2465225710AF7467023D6E9546BFCD04BBFEEEF6A29302B584ED6C9F\ +E4ED4E0680ACB9A79F:\ +B2D4480F64C8E6D357A260031C3940D93380AAA828FC80171DE482B4788A\ +F1373EA3833F2D547\ +B5AC63279BFB8E68A2BF5C9721352F650E0F00E1932D9106235B2A99D74D\ +133374CFB08D9FBD0::\ +072FB6A4F6B90C43226E0ED5A5233BE19529055EC3005D161AE60506A98DDD5B5E60C48FFA2DEE\ +0CCD2B4F3F39938D52A5FFD3C48496232C4FD6C05D05E72BACC87087908FEFC6849BD196686D7F + +3EF9B:\ +F6F758693253F88229EE11BB55982A8D27B424032BDB3FB47DBEE09ED159D54D2B4F3D9B3E540\ +97:\ +D3C1DBA4606571FD58FF9CAE5B0B74CA2F496F444C37BBC0672AE5CC22547EC5CA90837A68654\ +77:\ +26B0E340A506CF587FE2AEAA4BBFF8E8A721C5DD9F96823274EC3050C3AE7C04ED8D102044AAA\ +86F4AE7BCDB8D53FB0129B152E4CBEE7C176A7945BDFA561D03554EC6135205A0B0D7FB79B98C\ +63::\ +6D48A0CA04F5E1B1CB5C8C58A14A3F79AE1FE20583D6A22BAAD4BE1F9CDE028935E7246C2DEF2\ +BF591BAB9AB2974AC6EE226031207754FF6E0FA032CED158AD41B9183FE13087C5C07624B4192\ +B1F1 + +15465:\ +D005A4FCE046350601ACFF864B0D2B2A09E38D5E96F2CCD6AFD0A1C52270FCE297219A52EB10BD\ +AD:\ +DFDF0E254343E651DD4EB4B04B881B8274565CCCE054DEA6CF2E24B18B1B124B9C455A898C6D98\ +9B:\ +105D43C035EA626D0474851CA5EDCBA0C4848737F0C24653AC2C0025D0076A7164DFC6BE2F383\ +3D34CC52773C4A9E5C29D18CF02558D3A3A0BA45BC142221933923066F745386E4FFCB12600AC\ +DEDB::\ +5AD148B4FD171F7CF6D44F69A5A90D96097D20C2119A88692490D9D86F1CF3D00DD0D0D84D71D\ +3634EFD7EADCF1052161608355D1FB00DA6C36679C51BCF079348A62C1D6BD5E094F9CD9095EB\ +828057 + +1D9AD:\ +E2698781666556447427B2E3956F7A8A9C089021158415144C4C48555C4B8AD95862C275C7D31\ +9FDF:\ +E7588730EDF12A42C40BF58E0E32E0FEA473D683577C7901F46B26793DD002B6EBA0F9E72D79B\ +1B97:\ +B31908872EB8E97BDF94B976F04F24546FEDDD4E20D91B6555DD4B4B8E33EABE577AD922C5EEB\ +3EFE8E060EB69763D9D9072F121DD26097B262A765C1556BBA32AC3D80FF23538ED50CD759480\ +5D8165::\ +94A809E73195D7EB2155623CC8B383C28B971920A4399787809EC0CC2E6B41AC9027C0B939157\ +AC45936DE7CA116F625C01EE6419010061B8CD2D0A9047F89FB5B5DB630AC86AA5572A81C326B\ +6906355D + +32623:\ +C83A47D71C360BC385D1A52A792F209596F5B71A0E1743B7AE19ADEB0C84E3A74288884786AC5\ +F5B4D:\ +E72046AFE6C5478EC868F602A71316FBED2FDC8D872D48A5EAAA05235EBFC42A4DFB599C13BC6\ +1D8A3:\ +5C5CE3F7AE9AF68B16F451F67057F8C041398A53C6FD194BEC1CBBF0F074C2A45C5C88ED48E4A\ +215E32CDFABDA45C92F24F94CED95E8C2DBCFEFF9506181BAAFB8EB6F5688ACFB42C0AA0DD1DA\ +8CF4B760::\ +1D7BCBCA46326BB722340D45EAD0825F5FB1D6C9FF3C7841C749815500A227990592D599BD210\ +4F53C9D2DE460CE8078222A3FF34218F89FE0065E4FB852E623024987FAC1AD0A12EF239BFFB8\ +781B38A86B + +1F471:\ +FD762F93472C2FC5B3198306AC6E4D18088B0A65AD4975EE26FDC78C52C4B7CE3E754532E95A5\ +B548BF:\ +F15450F4E38CB8DAFC3153725CC289DA9F0F218CFC65F6D62BCE770F4D42763CFFADFD26DD236\ +82F419:\ +C4BD415792D696D83CAD82285A0E7A06CD7F05455653F13F56DC4D463CEE6753B6237B301A511\ +2D7C8995815650C38113272BD0F6AF0D5D51D7E5EFC82B9DA66242B5A71FC6A6C0436DCBEB86A\ +3C1CCDB75B::\ +EBE9C9D258C09B1F708235D5CDC2751923A993A9176241A5554356C752C62F081AEBFF2E13300\ +2B1E70F5902CBE6C8DE8B12080FB9CFE04C1E7EF7036D0A6D07CA091DA3B085FB9159BC5107C7\ +28F55FAA25A2 + +2DF8F:\ +C3362EF39B78C21469D23C2FEC1642D3EB7A7B72695A14FD07A0E6D616B0C50884540BCE16597\ +1AD3833:\ +DF631F65CDC45053FDDBA18E67E47F45F14D876E4D89101E531303735B38C883621A2CB7C16AF\ +DCBF26B:\ +50F14DFFF4F8B138F12159A52BD7B22BCB6979062C8EFDA7E9923A7EF43996C954EF15524745D\ +3A3E5BE1A57D416B02F11D9F7BE36BBF56CA3CC22DC27DAADB3423B4788B5DC72BD0E6D3083F3\ +303AD92AAD72::\ +5F5BA5370BCD31B61BA12DFACE38C80A3941C76091E3CD629DB5B6BA90415D83EDDE9C640D84D\ +8D671F13974DB70A85ED0956EE53ACBCE54EBC328729630AED05321A2FF3C3FD7F1DCCEE8968F\ +9317FE00FE3244 + +33801:\ +ED0A07AAA76BE91DE67ED0EB199779B16FCA57E376724DDE07B11C538ECA422B15E20D2668E6E\ +76E6023F:\ +F053CA61904163A5AD824276A97ADD3153B473CC1A45C401EA87DF2CC9150B2B8BF817499A2A0\ +E2EF7C3D:\ +585918DAE91862F4B8AA6F15273D1CDB9FE2ED4D7F0AAE8AB18D2568BB844B37297FD3B7AF38C\ +A29C3FD944DF17C62258CB0A4774FCFCF3D46C1D8A96EC87E935D38D9069F337998C7960DE1BF\ +808940E2E5ADD7::\ +978782932C74CE5E40602583D3A3F4C18444692C62F13B571C2FBB0BC3512F5305A90298EE626\ +C3E32AFAED17BC3CD85EA6C05A8F84E8262160AD9486EC5706560769494E0B3E90CA6B752DCF2\ +75FEEEBAEB1C78AA + +28F63:\ +F69378CC655534C08A24FF41A6984AA981AA71574EFBBC565ABC63320F1CB5A20CB599FEDFD12\ +559C884A9:\ +C954A6E1207C0C36D39ECA530B5496D91A12175E2BD9FDD2DD897542694DF50292D9313625249\ +3F5FDF347:\ +6D63D56180ACB06BA7DBE50E01F9D50424B9545CD054AFE4BFD6BD4B14B718014F2A9E712B3EB\ +EEEC83B1209F895C709186E9D898CC9CED462168B129534CB241D6C06FB2CE1984D04C2434153\ +AAC472994AA6D3B3::\ +4A2046DBC2C49E68FB37D77CFF89E2883610F0076AC081FCB9684A4962BF8A21829EB10E94C35\ +C5816FADD1F1CFC4405FE9833F79CD363A512DBACC6517D98305FB38F17F5F04CBB3C8E944845\ +C3727295CD5A097824 + +3C283:\ +D9E9285C4E77272100900893E78AFF01DE4C6CF03EB8B7B62B4615DC09B58DF98ACCA559DE476\ +255363DB7B:\ +E756DE8333A525E410D4E896B4E8C4404B55C919BA168F97B6E0B6D1922CC56EF3BCA5991A3D9\ +822EF04725:\ +3134FD350325ECBC1E8E1E702C1CB3EFA940122410B2A31BF90B7578D8B5370AE8C961CF2824C\ +5D5A8B298F84CA31F57353C432A22C17C9CCA6501250A6B930E4C043E634CD0308057C0E719E2\ +20478022C4A13D27B4::\ +3BF6E6EC491B9615E640A19A9C50AA27AB57E3493F96C4271CAE56C377815CCF2A65867CF9327\ +7948D6ADBDAECFA629E41E72E20974735AC615692DB76EB7CB83F9388FC86C86C615E13CFDBEA\ +9567A95E2D6B61FE6077 + +E505:\ +F0D1129E96239792FF1B59BE8D2B755018BD8CB83DE5D825C04685917762185A62A080DCE9D98\ +D389AF0040F:\ +F4227E1F8DE368420D5D6069E03709168A8BFAED59C8E85C8294317C6FFB98332D736540CF888\ +EEF6C0C5CA7:\ +72D86399CF78FC56C6E3FCFEB75AD0399692D3864AA1060E5D92473E82BC9950D037D478D2130\ +994A2ED377D8ECF987048E0014A1227D818C5913CC1F8646B0EE10961A3189A031073867D7632\ +62BBCCA2FD04AB7DA443::\ +AEDA2E28A4DBD01A7F288202D1D3D83BECD2DDAC7E6CB38261CAC58F5DB02916DFF53A9FE8EF5\ +70CC804209081D465560CFE9563C8A217581DF8FAB4E1F7FC22AB8D89A9D1BD9A78C1AFCA5197\ +BCF6BC9A8D84AF53A5EBAA + +3DEB:\ +C09753C0621B13376CECE340B0B0048DA5F4BAA4C8DA1F0E7EA92ED44E5DE757971F155A6AECE\ +BE751E485A9B:\ +CA4B0930AB38FF92E10A4AAC631797ACAD2924219FBF36E4AF18DC918BB40574B072F23ACC1CC\ +2C4B5ED15187:\ +C82FA6530BBF74AB38EAB8C116F5AD50AB007BD36E2BF91B9E14AE69CA2639E6FD928FCDBA3B0\ +AE7A1E58142B37167B41885DC2B6E07DB003944BE7D1815F3EC442B47FD4518BF3B31909DAD3D\ +950ADF4FBB212B31C9B62F::\ +03B2926F1560ED49557BA17D127C669D4DA2B37809F14C0ACEE845F6AEA36EAA118125D94F9D9D\ +017C9EFAC9AFB2EBA7C4DA17B95833CE1EDBD846761E0F7872247C23EFE8B2451CD4F5F84C6888\ +159705A9C4AAFC3489C2AB + +F4E7:\ +D8658E89C4E85DD9EB45D4584265686E8D19E9AA823D5C37532C6F9EAE8BE236713DCD3DB23F4\ +14C55D8B6D867:\ +DC3A02867F7A3BE96A167491BA202175E8902776A9F3D9A852929F27DEE0FF99F5C321A8D5663\ +F7CF074D7AF01:\ +A77BC6D9F770F51BAC0612C4939F10AC9F336B61EA6D87E3C5E25B053792D9A90F990A18CFB82\ +08D027D7C63E14FD4076243803D4EF226C4E17C801EAA3265AF361B8434EC8AAC8144777FC005\ +41898C637A7681353C99CD7C::\ +3CD72CDEA001A4F815D1634599DC6BE03371FD68D30D2AD40FB38E1ADD92057E4481822E5977A\ +94EA02F9DEAE1D59DEC6F9158D45D0841A981D4D9FAC7C766A8F9E92BA06B67AE058CF022FE39\ +FD7373230B831AF141C3CA721F + +10C8F:\ +D946C37A4DA5F1D01ECE1ABCCA98DF361D2AE47BD1AF421464106FDCEA6DCBECFF3B91163FF9C\ +0AF06EF9FE368F:\ +E3D6B43DDFAD06AAA4941129A4FAB542C41BC55834B4D9BA01C5A4BDEBA010B0EA2D125C23396\ +B669B8CDFA5651:\ +FCCB925AC2AD6E6E5855455E84E266CAF5E6A397AEA993003E80F3F7D3A1B83E3A1DF9F87233C\ +BC3F2969152057EE85254B84260EB6D156DAF844C994F03EEFC0B4446B25D6C1B4C464238871A\ +5EEFB45DC37794DD64E4A8C175::\ +3026BC29CE98BE196930D34F12C2DA7702373BF4B15860DDD5FD61DAE4EF0DBDB353DAAD8091B\ +D89723BFAD2AEC3CA127594A9A8F2E7244AD821483EB73B014DB00806A8C5BECAFC92FD79609E\ +7F9469EEA28F21BF4CB1AD468E4D + +D89D:\ +D65E29ADBAD552696C44154EA2C80C23F49A604DF256730AB1BDEE5FCB9D9C2480CB1EBC78830\ +DCA559F40ED42F3:\ +EEA2E85BCCEB57BA0730F0D01940F79A55B91D2CAFF54B709E7616364B020FF9F640C4AB1884B\ +8EF031523855693:\ +702D36984EFF9FDD16A879C177768B4C497E384E657CCE78C9DB496F0898FC3DE110E46A96798\ +38900A5177027E9AF0907A8074BF553019327FE47DCD86E11E4C545D80AC4275FADD2E0909236\ +E55C6846317BED4D286A8B9D5122::\ +3A3E20F621512BA40CBFA6CECA990404275CFD2D6465DF62EC70A3CF0AFAA337D6968EBFE5E66\ +B6FF9666BCC800E80F4BCEC9DD33076DEA1033A391AB220DBEEFE6257505F8DA1F61EA0219BE7\ +B93A89CEDD5EB1E6895EE81DF52DCD + +96B7:\ +BA0A5FCBF606CCA93394B2874ACD6B27E8A56B358ADAABE8FE70577C37B13EB508278ABFA5C3D\ +055419150FA77145:\ +B8399927DAD237158D4385C3D52A5237BAB2FDE90A50CA601CF8C9A91316D69E8AF3A66DC400F\ +884FFFCCA4B4D6E3:\ +1BDAAE1316925E851F9A25903F3551D8EB7DD69B81A63D9574C961CB8A3F2ADAE7341C82D8C60\ +DD6F28D947A40D48063FBDCF4AF69D5B355C0C931850129EB8384CA5B805692EDAD9D5A26C0C9\ +D2A02B195BD8617DC39ACA0F349B7E::\ +7660C59184EE406D35A4B6909A5711B2F7053F948DE92C3D75947191406959434B529C035AAB7\ +785DDA4B14D9D741085AE1ACC5113AA0A3E93A26845F0E6A25DC88C4865CA046F35A1EC6E8E4D\ +AB59055DC49955021EDF85A50FF3D08D + +1CDB:\ +DFADFD5EF2FFE2F823AA107FAB9388C6E4614833F697701882301A874CF2D2CC8C5E8D881DE3B\ +1C86D043B0EAEEE87:\ +D5483867A334313530C629B9B6386CC1A385716FEF988EA995DE8987380FDC1F2518388107C93\ +9DA0E1F3D869A66FD:\ +E1B889BB7FE5A95A69CEFB78A20C748F3F44E9734F7ABCD7D241E9831DCD3B33A36622F21EE32\ +FF85FFBB1C56A379D8ED3A0CFF791E61BD6E4822AFC05F22E356CB10899DF3B2D5119BD9350FB\ +901A261995D616FBC5F851D0C787E31A::\ +04D5337CD443A196514E2FF4A3C264481DA91FD1A01C8C819BD376222A824CA6527F7C4884936\ +45808577F17E896A6D9A39B6A3E9CDFDCEAC46A2160752D4F30223FBEC4ACA5A01C3AE3CAFC34\ +ADABDF661BF198C7A0EB4C696C60D590E9 + +FE1D:\ +FC7C6FE9C0AEB5586DAD9FE052587B0174899B7BA9336E1F43AA74DA97B6A51C1095255F88F25\ +18070C79CD3D1753E3:\ +BA97ED086E482E723CF61B68685946173D5E3E18E08755EDF817671144D752D388C6CFFE89E0A\ +A1B0C204E9BDD749DB:\ +ACCD4BA9136BDF04D0DE4EEA9DF329AD891D115E2426A3AAAC41F69F2AE156D01BA34B5B2515A\ +7CE7191A0266A7EB280798D6BEE627B65AD3A8D7A5E94603C79DE429D9EF8BC9C4DCCDAD768D0\ +BE24E89AD29FDE7978651ED712D17F4269::\ +66F0DA8E2D30844A391FA9320732CB75AB1ECC4D6694B0775DA41D029A8A8FDD0CC7AB74E52D2\ +E2D522AE7F336D3A7C21BEAA708C933AFF48BF117C99062D899052B2F9CC5C7C86DB7F2A5CF91\ +95A1CC8E73B82ED6F3B4C7AAFC9760843E15 + +2F99:\ +E2AF62AD078155F452BCDD17DD1F37F73F22652E4D341AE558A261FD958E7304FB6A7DAA6F1D9\ +4F670F2A6163ECCCFD7:\ +E716A2EEE122C98651180F8AFB865C6617389489B69462D9A18570A4DA0A1006AFCDE60DE41F3\ +33908DCFD82C31C39EB:\ +1350D7DD6D558BF7B2CC13628D12E6DA39F925D6F966103BF00529005E6B0A90A63FD58A67446\ +7468B065EA3E48636B9B409EB4167443699A47B435ADB68847D1EF00C90BB890AEDC6EB57BC3E\ +8DB01CC990F14E6076AB5E7DFE5B7C5246DC::\ +46DE5E9C22FBBB39C33457C66F4C447E922EA5B4D822BAFA60FA072B83628D34B27316B8FC418\ +AEA2FA0C6E495C474BC205DC35F32BE6FADAC38D2BE7E0CD1AF1A548908F0D5C1F97ABBC1A3AB\ +C30664E46579E12CC9624DFA7D431D44ED4809 + +E3D:\ +E7D355D9F62F6E79567C02305D34EBE95852FD5E77123BD392ED843E3D28C22FAFF3390E7A1FF\ +42E453730ADDB98598BD:\ +D6AF51AA7C89556E79A491895000665242EE272FE3E18E79A6CDD9B7BA694784BF1A9611C9FB1\ +0183105DF0535DA57207:\ +8B7800B682AD7562D7677DF8AE845D1A67582F5400D32CF51B044DC7DD9507C5074BE468AAAE7\ +A6C862E7C5267389A93D365CED7E60D70E0FCBCCAEE2ED4CF549B7FE6BB2A3D561AFE19B9EE0D\ +094082921FBF7DA194B884189A659E72989DB2::\ +815912EA98FAD3D186E4E778617398B99482FD96B642B5D97C76B401FD028C0925017DA2938DD\ +756289DA08F8409F73E0D382AC7709AD0924AFABC918380C2A5B00804BDEB99B249FDA0AAC227\ +083861D9961EBDE7A64935E2B71271B9558CACB8 + +37337:\ +C3335C0E3243BB8172670A390A4C6F1D51CC249F8AAFDC77B53CA05912808CB2A7AEFF1A8CF56\ +129D45C80256C6760E9F1:\ +C8978DAD5BC81B1DCE811A010274BB838F641C996AE49B186018BFE91EA04A54E8488CF31D9E1\ +DD1ED2486CD817CB7F05F:\ +7EE901DD41DF722A51579A4499C02E981D73664634BD6A032BCECC326E1CE5C7247ABF9E62358\ +77312D282F3D3F6613D3B7BB97F963B4437C69C6EDFB6DDEDD519F72BB99E155406A7577AEBA8\ +5390AC7EDC18046D639C70D5EBE3EBD73466DF68::\ +4B2E3B069A2B0559A1BA2E50170C0DC28930B7D2F6954DD02D4FBD2D97975D8FF1E2CA851640E\ +D8522DEAC48A7FBCF85DFB18D698F9D3DEFCDDACD99AEBE52651CB2456420497507D3CE55CC4C\ +E411249840D776AC2952FA5011C68DF7353F832FEA + +4935:\ +CFEE1A3877BEEC28653154CC1E158B7DF10BB6BC046A0DA3A4BCBB9545964D34BCDB256508D47\ +7B4C2DAF0C3A15BF602487:\ +FB2AD04D99FFA45B66A5A60F1F674107A384D121C5B463177FBEE5964A1B3713BFD37CD051713\ +2B74F85B792DE1EE71E7CB:\ +8E90BB43D3CF22F8A7893F4B36C746259DA901FABECFA8F4667798AB74DAE54C9B2539DFE6B25\ +211EB9A1E169B609B3F84C212B4A568CE1B86157780612E41E90D20B6A1F71507D16992FA88A1\ +1D9C897C8E98CBCFE6B265E31A1B242670E23B5AD4::\ +54F84FCBF1573D4B08E67172693B2BA017EA34E8D27ACB16C9A43B0CFCD0C7CEC122C1B8ABEE8\ +FD58CF82F98FED112A31FB4DED936143BB442F947BACED07555041DAF78785C63D3B323347F45\ +BA800E78E545FC115D873BEEDEE9AA14D281439141FE + +DBC5:\ +F75E869AD89EC4CF9BB028E3A67A40533FB4BDF8E663DC038E70A19C23B37D49ADE4CFD219C3D\ +F67DD18A0CD6869494EC05D:\ +C921AA94CC7653F9D02548B5DB56A46FC5304A9308CC0232773537EA52E03D5A2E6CAB5061B5C\ +788B357BFB34C4CA782FCEF:\ +7B766FAA923F1925F89D91707735570A0E856AEF65FB5232A1EAEAFB1966BCADB826120DE38D4\ +6513368A864290B36A5708F970AC9C114743964ACCC95E100AA2AC1A0A4993B34A70BA336968A\ +9C7CCDC264A06BCEA69D47092856FE451BE7892B17F1::\ +5DCBA27ED4BA89D25550AE6587846322D73483F60EE2F128B025C496A0440680FB49B49A57CAC\ +9479ED3210A27BC31F06257878FE3278D79DE65C14083DAD0B29ABC32C4C1DF53019267C69843\ +8FEE0609C3E2492009F2E28B39A04553F6D6B18D16D867 + +20B7B:\ +EE50E2D3362D0950E6A79003E342238AD710D03737EBAE5BAAB7A0A4FD7A7F6AFA814E768D9F1\ +2B16C52A5294A8652E4BD44D:\ +C9977D38FACE5D6003FA12B76880D2545BC15A78FBB19DA19FBDBCB5C5916DFF18A35E10E0479\ +FF9F5C5D807D219F2A10D64F:\ +A298A470C3B161484FC89CB9CCF39F6ED2E141447DF74EF559CB049F2DDBF1DB354864814E961\ +37E790390AF567253B3461D3FE0FD359D8C59268B0E6BB401A17F849414D6B33FB43DB254ED55\ +7CF14A97FBC72CE7F13D1B0F607381D009C88C64889BB7::\ +6C777A801C39D3E984289AA21D01456AFE5946DA4C236373B3FCE7DCF15621DA90871AF969CBC\ +06E671DFA7105892C89BE8649B3F27E28461D1C02C071C7D319F8F5A3D5A53B1A66D033057980\ +7B7F6AE0C897A71367207A7BD3263B10F4C3824BFD11B8C5 + +C31:\ +BFD406DD82D7EB42637387460A82E2948FCBF40F9CBD8025F1B02499ECF9B84D5777C596F3004\ +814F746360BD6F599526E4099:\ +EC593281958D49E5E4D8CA8EC3C68A00A19CB520255E19E1A6813E724A0B7A8C7ED9ACD221997\ +E2CC915570F702A58CB9B4B1B:\ +06FC724F11105899E12F70570719F342CF56476A1631C7391196F856012032C97B94C10865CE4\ +BBBD6D524316B0A6DD4796F56B62FCF585F83DA7D138EAEA0FBD7E9E7074C5F1D835C267D2DFA\ +369EFE75C2D1AB473A29B035750AB3E048A5CAE8CBB7CB7C::\ +A34426C6435AAAE6C0A176881E4EC4FA6DCF1963761C36144B109F01BAC3ECC7FCCD63591C708\ +6BE2BF77EEEE7B707CB13D19533FB82AF97F80E430552BA461DB9E6DFB37B573C0B8875C86C90\ +60342235A2727EE1B291F9B8F89A84CDE67FD48BDD923AC1D1 + +3165:\ +E13F572C3892DE9E82619F265EF1D0E028AB2112A9F6B855883837C930AF6C50DE5958B8EF9E7\ +06E8A5BF1FD041FA89D4E1A66F:\ +E255C42A2B88D2E4B1FC51167ED335964D980670B30B9EEFC8E896A52DCFFBE8AB5C15D465C06\ +9040312DB7B9D9C62D990A78B5:\ +62505EB7C1E4AB70E230CF8B9974CC32845FCDC37174DFF0CEFF7BB28FB44D4DC9C326393C4B1\ +85E8B2F5E306CD56D33DCDA16DBB33832F3FCB437AD3A31D7205C87BECAFBF42C81CFFB14D430\ +9B1503604015480BA539AA79653455E481A34FD24D6086C04F::\ +00B5D962C18B90010043C6B3B73DAB6644EBDC9BEA758C890F60B8F5694DB3419C29968AA245C\ +AFCD6784E91608670E50F6C9E726200ACBA8C776438C2D35E6E0CCD52E2B73EC9F50DF0BC864B\ +F45909AFB80AB9CD3DD2C2C1246E7AE78FC759669C43A1D69A5D + +139B3:\ +E87416D7D28BF6370DBF37061938D4098CE25E503F6974CBB36494B21FE81AE18DA11C25C0077\ +E8F147115B259B2663733CA24FF:\ +BDE29B664ED4544404CFB420E81CCC2875CC6088A82D193167CCE66EFA4D6E30790D882F4DE4F\ +D6852568E8A81B52769C8D4E039:\ +5B514F002EEE84D142DB23D38386460AF5EFDAA7FBDE017347A3AE359573338DE196215D4935A\ +E0F8EFD5929FCFF748FEF07FD42C9614635B249130F291DAF70F8193991EB2D7D2B77096395A1\ +12C0E792F76B4049BA7037D4CBC4D2964DE324FD456B52E4D153::\ +662807DC23C41CA24C64A2E5502C389314EBC3C9949E93DA2D2BDF7FB1C1EEC21619C373948A7\ +C62F2B902F77B7B5BD5823ABA38991CFE6A60C12FAF6C1FDFAB2AF539CACBCA7F805C33875D89\ +85B3C7642CE9551738C214BAF9F465309CF94F91C2029D5900823C + +BB4D:\ +CF8454329613DFADA528D9556A346FD8566F5B1B42A5EE1E972F0A7B8D03DB800C9A04D93DE07\ +ECBF14CD67A11BE27F8909F603B9:\ +F67C6ED7DDAD52B15215D9A1798A099BCF20B7D65434CCA74A279BD63CDDF9D27F381410167C6\ +7294535784F860BF22CFB9E90501:\ +ABD2BD2EF35FF7CAB549E375FCDD9396CCC9F6D51F390DBB06AFCDFA2690BCF4E7B4EB8FD3470\ +2CF7C272ECB64A8D3EC50F551FE8548DF5D58455D8113940E65D8D32864BFB36CD641410B6013\ +7DA69EDDA58A45EA19834031E788204E4C57B7CCB300F8264F2150::\ +26AB09BA08816E7EE65791E8B5539DD6D19A60A4559315969EF3ECB299334F6A9838502555FC7\ +449D80B3434C4C824805BD1F4BA3537D7C0C8DFE56792AF5664B8337031C393498AAA558FA892\ +78988D33ED4DD0BB896F44ADF623A78F385E135085288BCFDF5E31DD + +2EC05:\ +C5BBAA73868BB968A5A3693AE84E7FFC58D7B77AFF05BED1B6D2CFBB62207F95CA33CA7BD2900\ +0A1592C9895CA60175C4E8EC9F7F3:\ +FEFA4B1CE3D3A3A00FDA17D05E0A95D4AADC7118801B54C04E06A6D6F417D07322EDA0EB9E867\ +2C3CD2C40D90D50D8AEBD61ECA747:\ +F294399D778469FDE1D6062DDA214686C51069A8F4EE2DD4056D68E3CAA76FFB149AB5B3F2D09\ +51190411B4795CA893A87CE2832FD728FCBB865491349EF9091BEC02FB4611AEFF9B88E7C5D5E\ +3CB2F26D6311FE4742DC234F12A15DCBFBC09DB18ED8D663EDDF3801::\ +6A01851AB2C0F15AEB5F3C0F7C4ED4B80D0DB1075B25352DBDB2DB7BA6DFBD07AF4C262AD0C61\ +5E8885EDE377738406391BF6402C3A7EE8BEFCF26C91DA0F4D9FABD4A6F06E76047B87B8EE0A5\ +D9C8A04B174504F1E3C4E6A4DDFEED36FA4F5E78F63ABF4838A89DB8EA + +1B30D:\ +D0E3CCBAEEF5BA9BAFAD06D5B5C6727D5AB85B23D1C231BC0A18EE4F166D4EDDAD542BFDDFF0A\ +9185F3EC41216768774239400D7567:\ +C55B49B03706EF2293963E81A301DF8856C42FC2C2CB10E1CD36E1F91100C87718D06D20A1C7B\ +0DC125D0029104A6B957513DD1926D:\ +881A8AF4FC9C7F9C48102D904F44829E80A5F8879B8E65792E36B8F15AE189DD36AC9E976BE57\ +A69CE59BD455116C3E281C4371CE0A89A4B59B12CEB51948FD3CEB67B8682B966B9874A67AA61\ +C497E72AB8516F595B582BB828C94AADCCABB51C00498CF7D5BD8CF005::\ +25816413403B2DC77D9345ECF1B02C9A95F715AA3A46E8EB9DAE5E7953FC30BA601F22CD28DE3\ +C0397699C004631FF297CD48985B13629FF9E8527FFDDDEE18E6D371DC0CD75353590C8DF50C0\ +9032D16C3CBDBFB72C0272D4816349B07459C2F7020955B6A88FC03A0DC4 + +349F1:\ +FD6F20281B82FA202413D8E4C9A6873AC3387FF46DEED6E320F80430A1B8B6BD8509FCC0AD982\ +DDCB2583CFA2EE092838881C8F292B9:\ +D46FC162BE2FEA78106D7111E94AA9CE05067D4577E32400FCFB80085976F75DAD9EC175532B0\ +C2E3DB59CEE5F00B02B361754F27A77:\ +0BFEDB7551AD05FA01CBCCD7EFDA1FFE2BEF0959D0707B74047F7CB64A165AFE80737F259D741\ +1D5C0BB7713470325EC4C282D7B4F5CEEDFD9C57383AD0409A76BFA7D9F391BE001F3A3CB535A\ +DE0D2726EF9F7D33D805E6A607B19AA83A7457F3911DAE74145E2FE732A0::\ +4685DAE11C6F04EAC0BA5FC5017CAC0F398B0290D128C857D0F791A9D5B0E19329C86461C1D04\ +F08EA31FA7B64B899AF5414C3B9183338AFE87278D74A1E7B2B40A7B2973D2C4F13D848A9F81A\ +F279622E1CC097296CF370634B0DBE6FD31B6763B6D9F22A5CC1E85A9655AA + +38D9F:\ +F4F791961203FD4D4015567EC4CE6C4C281900A0E73EC013C766D0211F20CD369B698208EBC76\ +F9573942A8FED30CEB201E4508776D31:\ +DEEF6180D28D8B4DBADD5274DE22A249FF83E8A3E77F381B01A455FB3BC461BCCED640A6CF399\ +B48DCC2B35B5250BF82212F49BF0101B:\ +B52F8BF8BF76798AA7F876E0D76D4EB5821186244A5570D26029F2E720B966A610D4275BA74D1\ +C369990F6174F6DFB4090F3C6E98E3A0363019FD98C1EB913F0F5AE47095224064FA01EE862DD\ +089A6A16B6AB78719927F571BC04A2D1CCF90906D93C3AB5BBE89FA368385F::\ +455F2109456B04D35ADB476EBD40DE17B5843DFB011872A444B14DBB3EF1EDC9508C16DFEC97B\ +29047F46E5837284AF8A5EF12B28CBF61BAB7EE7B92ED5D60B121FA8EC4B8027FE9A63E24E85E\ +4E7E01817073AA40AEA874710452C3C5067106BFF3F2DA855AB7DF04787D0711 + +26B67:\ +F160B54868F1B3FF0AD90572170B554F75E7F49A579783BD6338F55AD88678DE5AFF6BAEA9F51\ +159CCC80B84B196C357B0B89F58EAFC55:\ +CF68CCDA550EB334438AF72DE86D8CF18B0D218E1A15B2061E1EA663083905762427533CE71B4\ +04B965D37124DB8391638C62F5F747E41:\ +41C35AD24402B4D134126B140B75150CA4192AB757E03F243150FFF9B69B721C51DC09716782B\ +494948522185A1EEAF642492DE7B4523896B4A73B264FE8A5739754DE7FD1261047F0446C9B44\ +D85EC72262A03EFE848EF19E471BD110D380C0E555D0E8B8377DBFE07B38A8E8::\ +B4702064042C93F7B2BE232DC34B8F8EB59554DB7B68B98F1B642A91F1AFA89F6D33BE1DD8B61\ +62767D444B3D8207C578DC83A69F85BDF8E4784A266C9F474A556C1423C54C9940EF602F1063D\ +BC0D6CAF08E05D628A2426DA8CF6978A41D4EA0611FA43BC5C6BB92C39F2486468 + +238D3:\ +C607A2D95AB46A416CC4694E087C93E73EBCAFD1738D7B5CFEBC322FE0A1632099A129596C3AE\ +955C77A6171A7BE65E0B9610842556B7AB:\ +EDD4D4CA2759A11B0D256830C17CE7DE58E7152B971246CCBB7E52F3863173C1819F633F3AD7D\ +5EE1217F747169718EB8EC14B68DBE6D31:\ +EB8006B8C13866902B142447B8A360719CDBFB017B1A9473565648B9940A61B495412881BEC7E\ +023B410186C8F57F555EABB860469C22C155546F78C9DFB957707EA6F4E51E79E1CCFC3A8C7CD\ +8B560EF11C28509F034832DD095F3B378BF2AEAA6ECB1813E0462955825A3EC14B::\ +6ADEE0AECBED2E017022BA21FC0B369E1CA9D7C9A3359A53FDE22A817E0C8A8E4853433CF4C96\ +E20B72F0AE6102065C6401C31B87A7CA48EE75494EF31BE7AB42C7B127E558716CC57E9AFF019\ +AF32FD0CC1C7A09922A46B3DF31C8094D4F996C87C980AAA49A50FB4F6B97AEA4530 + +FC65:\ +E51741CAD444F02E7F689DEE1AFDAA02C6F7BD29847F3535C988E7284F6434C4CD8FAE24E04AD\ +8AD605155D264DA6DD31AEC0919B3FBCF27:\ +EB66E3C33FF2BD0F27072C71455B8CD72B732345FA06B94C2F4A3D799C2E12DDC3BF2EDD59B4D\ +4B29DBBB96C3346DCDE5EC1E3B2030C5565:\ +7C06B972ECB5E6457E7BC929E2095469A724A641F93DA43EF9C2AAE756D2A5558C7F21EE47612\ +B57DB9104F90C52567DA8E68208D487AFEDD30F2EFFC3642FF010591075AD1B03D543B1E3E025\ +D4529A1D3970BE040AC8CFDA9C5B5B41F2E6E28C7FFE8C2A17123D5CEC05BFA3DBA9::\ +4CCE57B3471D119AB5D0D8EDB148B38C48CCEC514E11E6A00C023448374F011C78E2D1ABDE688\ +C3BB2B48733FF9B9523A7AB3B01F6FE116293D8E36080672E4A726E2796ADE6097A2000097350\ +C99E36B584B652880930942A6918BB0DE28DB94C846AEEF8151BEE6A3E96D423B32097 + +C407:\ +BE39B346B02ACDF3F067D1CC0689ACA4811AFE9509B1513E9E4B52E6BF648F219253824105114\ +E749DF1857758C5A0C54830B1ED96B15E301:\ +C1C2031D5F29D74B4ACCAB0C211A1FB29A7087BE34A800AB601363662CD998574314F6A60F76E\ +A153DCCE7FE75BC7D13C859B45BED8CFB259:\ +E2C9221D1C5B3C297E54881C4A484DC88E229A1F89CB9E03A7A836C0478696ED1448636BE98E0\ +6A549BAF0BE30DA4AC1552B17211662DA4D945F0849900EA02CCAF1215EE1B631D795BE58F572\ +CA1B498961780B2C50A88C67A3EDAA950BA986193BF10B3DFF1EE9E0F6D8814F4EA821::\ +0F19E9BEA836057F18CBC1C1A7ED08DAD6D58FE84864755FDAD69BEC2BD1AD9D\ +DF0097D21B05268737898F852643F3DAE32FB5097D95B4AD70A74EF2E7AC1E77\ +14FA57436A904AE361EDF9451EC406C9B726DABD0269EA5BB9F92A74BA4808A9\ +51204A92C6EC3AAC9466F2086CDC4EB279 + +1DB8B:\ +E1677D97157A28E686A6DA2327E0DB9B1BB00C0A286D2939348B44B14A1484F5C32F1281D9250\ +3DDEE248145FAB855F41959C7372AED2D7647:\ +F86F396FB930A154377F68536927C5EE34F9A948AB1887AF13D296505F4762F459015CA892E5D\ +92F44938E3E4F855130A624322F2D0D5698A5:\ +6F1FBD316F2B02DD8917432A5E941C511C482F93CB179AC4C7DFC34C334932976A1D8FE9D7057\ +1CB02BD8A34125FAF0E0F136E6C3EDB74F3B0F2D8188AB73FB25DA5A3B1D6472B4009A6F53AAE\ +0B58FADDD971B808118230C88AFC628B3DCF85A238053642BCD1F1478BE2B05514A56ACA::\ +B3D24948C2D3BFF08B9B3B11818E0517890DE8FFCB40AB7DD40AC1B0FBDA19E2678C67C53C6C3\ +F921CC4AAF05CAC7DA47B5CBF6EC5731561CF5F42FAA0A394D1CF7FA4874AE7E344883D3982FF\ +B91175E56AC49D21B01859D93787AAC3AC1C24A03D73C93E1E43981D860C7DC4C84D307A53 + +3CAD5:\ +BAF9A508017229DEDAAAC51B93F8E12A8C10E489AD9CF90CEB127EF503C1F56158F92972A3748\ +DD4CD20AC162DDC4DA061626176525E9A80365:\ +C8504C3E93C15C6241850609EEAED406F18E0E5B9EFB9FD6BFC0D474D35D7BDAA63CA925B3A1F\ +4EDAE9F9A99C1366D6EF5432188EB672EE86A3:\ +6BEB86F20DC86874BC052DC6C032E40E2E555D563D6002A6C269FF9C335680C0BCD901D02583E\ +F30A3FC3E68AB218CC47228EF9E6CC14930CF78CA67F5618323C95605D73BEC5389017B77C300\ +D0361AFEAB7E97D7215A8B826F91B9BE823D2467032EC6A58A9DF42766CD912F6D3EFE2AE9::\ +765765BCEAEF80D33430417318FD4775357D8DFFFBB4147B60EC0BB7704E5801A6E329B2D7A39\ +587DE75AE2143671AF854213664583C69CDE7A26BF7F108513B9F0BA6CDF81B28A65C7E2AA541\ +F4BE5817761F146AB1ECAC76EB2EF1D1FC42A5F4D10C93CC2F3D2556CCA71A0215B96257BCA7 + +203B3:\ +C9336B9F9A8D36E22D93739B8EF9506C3A9A6BB976ADC8777BD29747FF186681B5E77A5ECF525\ +3B1E9AE531EF7B32EB86FEC641AA718916C64CB:\ +BC37BB3C56AF232171EE83DE4113C79CF78E675B7E4E1F4F6771384949382CED626507FA5F489\ +B3CCFD69E18191C21AFDECE4D9A17BC7EACE0E9:\ +2C4B930C9ADEBCD1E36957E1817989B56304B53B03C9BA009875825CCCF5B0D77A7F7F76164EB\ +0B35DD262817D8E1EB5C498ACF16F4D4CDB0AF8918E54E7F5EFF050283D533598E4E6CD128E58\ +CDF5417F520F0980671FEF7CE77E75E64EF2261F27BD50ACA5C68D8FE96F33B85A76337556FF::\ +1327DCEBED97BCEFA5EC0D6F4BFCD98B28AB14C555D31480C81F31E1E0FECC2DC4608E8BED5F2\ +AB89237B3B44C46443C4169E25AEEDE620C7625B18B862614DE26DABACCC21901218D667D27C8\ +A676EAA261E575579E06532DFFA1EC9E18F23D8A94B6DF6DFB5C52A30F9AFD22B6590081DF745\ +3 + +2487F:\ +DF3FF505147F8C7CD7352E57F5CCC3661B4DA5B003BF7D3DE39761EE8CAD575B64BEB5332DDD4\ +C3ED6BA64162633A0453FE4FBF33AF34329C5759:\ +BBA02FF73B4C0ED4F774C4A878D696658CACEB13F56C9A936193C28F3FA20A4056213B8A7E710\ +23806DB7C0D49161C59E2F88B00604E442AFB909:\ +A527A2D970C829A7C3E0FD2BFFE9590B3A3C8E05C3DF8EA923AF156DDC30222BB304CFFFEFA4D\ +F81A63B597FF983052C556E69D6CEDEA86518F9A5A301D03E6686D19E346780EDB5DB589C9047\ +C18E6CC6216D4A0C2E14505E744E3DED365DA0F1B1FF00EAD5FEC05E6BC9F7EBE8408AD89757C\ +A::\ +57FF544A0A4E5E892217382BE63F656D0CB49582414DA7AD5257C09AAC803D60CBCFAFCCC00E8\ +DA84D02AC0059CA11868996F8E163C226FDF23C7C7F7550AF30AADD03A484EA81DE3D6411BA9B\ +0642532A22A57D01953BA8D21814B72AF28EA499070938224BB8F98A0569F00BA55D7D4FE6813\ +D43 + +35AE7:\ +CC072B3228FDB247BBCD39BE7CDE954BF98133426E79C6416E8658BE8DF09269BA3E5A5AC0784\ +065895D3E03355DD1DFD7EFF7F0859F317F8A32DF:\ +C78470AE335A28BB07ACF2DE39A1C180481C0F5DB37C0B60B97F68D584B24A3C39A4C315D2D20\ +04105D774D966892BB0659DAB963C298FBC7720E7:\ +6B18E5D6236AEB054CDE9DBCCC8710E2F8505F7836AD84B4F90BA5E1F96361871DD99AC16913E\ +8168A74A1B39E607B6FC0E47799A5E55970D53A9D5B0708D7BF7FFF88CB9EFBAA18F6A0101093\ +AD2272A1829594206B329783D299DD139F1EBF85C7FDB18330D91223ADAA6EDB317F6C54854D0\ +02F::\ +42F95CD54C8F50ECCE32D08DD5C66A8D2B5D20B3E3A5FF70CB772CB6706120D666EAE0C608E42\ +FBFFBB3C064D7810B424A640EC7E01930A76B2EFD6618A8C967F126CFECDC61476C7BD0981A0C\ +86A0A50B5F04166FBDE23479CBFF6430A6C5D433AD4BD7F0F0C9A47D060D795191FD49D8B71DB\ +F8111 + +4813:\ +D55EB495A0EDD8784C918DB2C9905CADB34AA873865B61F959CC39F3944444E4E411CA490B323\ +FF92A47E780BF90FD861EB630ADA012F4B17C8FB19:\ +DF5304947138D4539E8D0DF7F5A521DA90D0A79468FBCE67108DAC5D904ED820444C84FE09C09\ +93DF8CA649AED14E7B77A8C8E96F3EBBDF6FEE063F:\ +407D8F49B0A0162D162DB9E89547FCA67DF28597E3EDF4024225A815CD16C113EBC2406DD8D5A\ +57C7828E80C81F87F6AAC25E69382C4F23B6DAD015EB4A373D48025188A3861E6DD5B6430CD21\ +EFBC0DD48B80225810831F23F75E4BE2FB5AE9A6191C633F073463FEC87B33C5B03D6ABC3DF82\ +5EDCE::\ +A9FD95925F1EB6A3D6D1396DDD8F459FE31135A07BE71DD9449596F457DF174124B2D9A4993D1\ +15055EFB664EDAFB73D51992E366D6010299E0CA65EA40CA76AF496EF024F72706C04AC618A50\ +823FC4647868F607B6CC6BB489AD6D2041970074452B8A0826D4BB0E9463D296C0DC54D241736\ +F59B506 + +1E497:\ +F9DA4CF8C42981521AE47857D0A58BAA9B0D7EB223646D19E3D1F418B980FA9BE962AFB73619A\ +09D3B308E7E42AA3899FB9194C6325C3AA423CEC03B:\ +D6E7608CB975895E638794C140060A7B19794890E373274D24D29B786D1510B923CDD83EE844B\ +78035219E4ADFD085A91752B4A0DEFC8CC3411904C9:\ +677C0ABB673F029F63CDC4854CECC572EB8FD3AE9EC5B254CD64803CD853B8AFBB958399D077F\ +8F0F8DF0F109C780B89D317D293953D3C814F8F9EC1E4AAC029B6B895453D951090558DA2614F\ +94DB90ED3E62164D12E2A5ECA60234E153274154B82181FD3B060E84EFB9718F643ADCA016EED\ +2C89D40::\ +21E9AACA4B288AD3843FEA09406E17D94599BB610FFB02C86EA9843076DA91ED2CF55EE3D32C1\ +F6C53B5777DDA632D05403DFD77AED342521B988ABED48ADCA7FC1F4E3599949F257A5CC27102\ +18FE6F7E18554C9C26383198808C32B41A4600C19FF249291B788B8C438C999B2872F8CBA86FA\ +FE8838E96 + +12B8D:\ +C6C04E18BA8EEA6AD830FE2652FF3547F4F693F41B681B516B2F397BE89C2562D259C0FC3698B\ +326290366331582F687C0DE212C30D1F573A5494DDA9:\ +D4D610D560F7AF67828C7602E12EC69F6665DADE3E339619DCCD53518009DA9EB019D4DF7D14D\ +29B1CAEB46AB04A414C50C1073E61BC85310144730F9:\ +F55E6FEA0FFF7EE032AD7C94208C337EE80B2AA0F4F2E0D066A05DC8FB528EA638539DB948203\ +33CA86D759086CF2E78E9695BED9B1DBF8DBF3E362801C685F688E36D7C41D37BF4B4DECAE181\ +6070518246FF9B73E807BB91B7057DBC74B8991E0B7E1C79FC1C1F87C780D7221FC476494D1F4\ +AB666DB3D::\ +27B21E28A286DD57100FCFD98CCE8C2ED2F1E2D2108E5A02BF96A0125AF563DA0EED6AF54BB8D\ +0D993BA772079EA644A2884E7160776F31F5F11D7BB47495611B30441F990FC107667F740C08B\ +660232EDD4A83484AE029E34326AD69E01EDE3461B54733580773B1DFE807CB54926980213896\ +7F59F59826C + +52D9:\ +ED557EA9DB53E4E24795FAA88F8414BC67C6354111CA244E2AC0C99C48A0BEF2FA69E69AECC74\ +F5E6DC79B0E2EF849C95E881CE9BD5B60516408D8A8D5:\ +D08480C28C9228B2E196E5F672272551E456E80086EA3A0300D5440978F35420211823516D2D1\ +30D444602DBEF4E68EAD7AF41F06E970BC95D9E90BA8B:\ +EA763D61DFA0624CFE25EEA744FF0AC80C5C85C4ED6A7E8C2303A1CAC4010931EF4D9B9414A98\ +ECB5300CAFF1AAFEE877813545EE56F7DD26A6005F142F771F4D3D1A97CA5995F91FEF25B1BB7\ +72B12AFC6A1D37A1CDA7175E5CE22571A3F8CB88664A06FC907FFCBFD5E6BF3FD2BFA98D5993B\ +D5D949EE887::\ +BC9AC00C07CB8BAB375AC69C14556D39DA85D019BA1D776CBC4857546AD44E857E616EC312839\ +E2A9AB55C3432373682255A1CC06BEB9CE7C3973E8B4FC02C1729B992AC40C0B371195E0A5CAF\ +80F074D0608CA75885F63C340C96A1E29237C64AA3D60F9EE59D425D757ECF8CC9009DE2B2AAE\ +8AC3786F639B3 + +17549:\ +E60CA06397622C744F64ECF95F3264F1C8C819FE0D596877859DC7DA2EAF6CFE25907E4D018D8\ +FE457EE7113B09AE7E2D14B54A7AD7C1F294FAEA719A2B:\ +E3FE78DD4001FC135E4185121D5E8F6BD766DFE45B818DFCC1C2DC9F1E1CD4D1E9F5F7D42582F\ +36A918E7787D446E93DF1CA90AE6A52220D9A1D2683F89:\ +C0D448DE6D8C704B5AFBA03AFD8DCFE4CDCA0493A9D64D095B0A19320861E5F42B0EC566B82B1\ +BBEB4198815AE19238EBCEDF59FE26E4283E5942CF77CD1B23C5B901A542648D28051B5F99416\ +3C877D57FE27BB3D3B54CB929F9F4C24FC1B05F9EE7BCB7E1414DA3843032657FCE85787A1185\ +F2BE2C025D100::\ +C9E14845932307783E85CF97F3D9FCAB04C3872E5767E04AE1F954E7A45956CC7FBA483DB7891\ +36702B48446B177F8D36917674732972990053F5896D35D563C975962C4C405F522DD44E5D007\ +2AE7A403AAA1C8DB53E47E87534148B55CCC38896A8105A583D363D3C5EBBCA3076729F69E127\ +2B24F12AB7DC983 + +189F9:\ +C630CD0B8D86A93343EEDDA96B43122C8DC58318F5664950CF34CECDC9EF3796F71675712EDD7\ +D08E675F491EFA99383EF1DDECBA36CFB4F2CEABF3BBD4B:\ +F9012CA0D0A2C91BC317819EA8EC23127357B84FF6F4B4995BD3DC6EBFDFFE8A7809C42B4C4D6\ +4267CDC77D29FEBAF99355F00B4D64872C7B4A466C7195F:\ +C42CF8F1ABF85A849137F421EE51F3B2237D052E89F62D2F8576EDFBAC6D926285096C4F5AB82\ +10D467F2ABC0A8C99FD39EF76EF51CD479B9DA20F082ED598E006E0EFE884D33B59D5F52E969B\ +D42F7997447BB052F70AE020E7E1FB6E8BDB90E5B8E53AE483CD29970184BA4BE51747BDC1D75\ +2B214497705D75F::\ +A2BFCB298708CC1D0F0E5B3817F669757CA02AF173BD04B6C77ABFD7446331E4E7E2526DA90D2\ +E79B60ADC06284F72FF053854CE1EF8E449FFB70333450887EFBEDB4BB833696105AF4109ECE8\ +E24FF9AAC5B16C3D3467B081967C1534782C29205706E199ED51D2FC87832C2ED5568EAD28F66\ +8009908AD66834A24 + +26175:\ +BD3E5ED73F6D8751F6B7F6A9791AFB12A42AFC6BD4E2F73C14146945ABFD1073BFA87778B6805\ +891860A636884618ABB924E681C26C44D08A6A2354351EA5:\ +D14A005FB2E1CE65F51F36F10C23211BDA04159AA1E25510CC1A7BD643A76B923BA0ED4754516\ +1B50AE0E137EAC684D9064E258D0389818695715431B6695:\ +01224CC754FC5E4922AAE8D64BCF2EE50D13765F80317818CB3973B187BF3C17DED4B3AF27C93\ +8BD0E36F875A6D953808B590444A1B0C161189A93938063C80A78DB5DB689BC4AAC587F0DF6EA\ +119DFFE6CA9B67549005FA4FF451354174175D2AB236B3D6A1E604DF2D5ACAF956AA42B82A5F0\ +3DED91DA07039C464::\ +466BBAB71EF00D9436CDBDC02DA1C7CFD3D59AB48D60E82A87C39097BCF8DFF3D6807D6DD73CA\ +D16101245515ACD333DC808C9A894B9BD754F6921C518C5E9E16F71B6009B078E15F53CA3400F\ +0BD927D2416BE129DEE6035BFA74E3D8630A70055C229BA3B0AEA304D8F77A8407DD8998E124B\ +93DBD1EAB29CE11B558 + +32C0D:\ +BFD70BCEA35FB6BC5C4C753CAD49FB6E86985D6F3687AAD9CACA49753676D121AADD87D175D17\ +EE5D80B9D6659B00289EC4475BF003D7D400177012ACCB72F:\ +EA764CF0C0D3583F0C4B4F9D096E1E4668439343F9A937EFFCC1A0E589BD3B64F4F14D745FF1E\ +38D720E581A64A3045F70B92A6BF2031E67EFF656749EA1D9:\ +A4F527A26115BC6402C7DACC1D8925A28D5AB036B56677634DEAE7560EE6F79DF87293564556E\ +155C8CBB934ABE781313AF7DBA88D65D0DEF4975AD6284A5077CA35CE49F1DE12FB46ABBB3072\ +C2B17FDDD93D010408F9790A9D1896FFA362C43FE3B61B6065A09F715E97B353BB471F2AD94F1\ +15CAF8A5FDE6B91826E::\ +80C7B635AD6C6499764DE4AD8F9EE1654FC83763B4097E4AFF6713EF1B3C7D627B291CDAF41D9\ +D8567758D6F9107AF7ECD0021DA4F54FBF979F1C1AF24993B46347008F51BA00F3AE1386B5C9A\ +D29B378FE434CC6B620CB2239CE94D5C2755FEE67621649B526505A49451F4469B29003DF8396\ +C2213475FE7CC671CF0D7 + +D6A9:\ +DD24EA4BA93BCCEA6C7676405EA6F04F13838390AFC51713DAFE299D36362C525F6C2D1CD4DB1\ +5DA08B743005F46E243BF34F285A9458575DD61C31F12A2DE5:\ +C152185775ADD140C1FF045BCADC81A81DB36BDFB61B6581F78B29B9130F8B7F3D31C508524E0\ +B487F441F01BA831D8C05F23CF47D14B35DFA5402F0A9C003F:\ +14815E63D355877FF38F110A6B5BBDC86633936B9B28669E66E6DAEBC85A213D40C63080C5DDA\ +21237D04602C02DD480E753E4230206DC216263E56E129566D094D5B574ADAD461C04D3D20145\ +855F94E02ADD5854E89C48EF18330C5F9BBF7D1EC9638E4ABD835755DB84ADE864E3AD2DF04D6\ +26E91ABD952EF451292CB::\ +2A432208D0CC726487A772598BE3DA4799B484D4C28ADF06E2A914BDF7ACF826080BD56DFCBC9\ +C1E8DB37AD3D57E2EB42CC5589E4DFB2AAC63B7F61A05FF744CDF6D68441694947B2EE1003D33\ +E25F706C4EA70EF39DE831B520B39FB7DC02EF7A9427ABF86900053DD316BDE944ED001CAD53F\ +4C6E68C336B3050AF52B081 + +34213:\ +E35B81A5A1B6199B689C0484C332C4E9CF8237BA3B3215A3C50B9FA9704BEE13BBF8D96B8FCB7\ +16390A4A52D9E0D8066F4C171DE3007C0E3CCAF7E7ED0A3974D:\ +BBBDE5B062860702D894E1B70C555330E8CAC1688484C94DD8C9029487E181FD32B3E4A263789\ +43B5AA33DA24676E240973076712FFD89A66A9B58C5BA83C69D:\ +96BA67D8ACBE483DB6CADA644C2D8A30710395047775A43D5DEC9F2C1E81D2B5D3D926B27DE20\ +7A7000189AC87F10ED06DE57793C301A9B05958537C9E5D486B3769BF41E9B18904C5D1EFF9B5\ +A90C040E1E5FF21E872A06FFA9C5F0BE274A346F425D46BD3B666CE2C0D9843DC4067C04CE019\ +FE447131D78A610A5BD648C::\ +7A7667774523649C72636F1A0599A0D1865B32A14E9C50201849A6DAD8AB96D1CBCE55054BAF7\ +31947DDF6645937C9C39D9F11ACB9D2A3DBC7C16EC7CD5CE13AC82C85DDE8213E769A6440B67C\ +1A78A1A8BE142D50A9CF127EA9BE1BA252B21460A4C8A196B50D7DF022E289B6C0977D13C2D57\ +FD0F4F90675C7E8F018EC780F + +# RSA PKCS8 format: KEY:message:nonce:output:password + +# If password is not specified, the key had better either be an unencrypted +# PKCS #8 key, or encrypted using the empty string as a password. + +[RSAES_PKCS8/Raw] +-----BEGIN PRIVATE KEY-----\ +MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEArpub5dL9a8aZji3a\ +w3205ODGa/HgXylGNDWCanG5V6smkqiDZfpr2Ldh+HL4hZCIe5NOBf3DsTCocit4\ +BMyBxwIBAwJAdGe9Q+H+R9m7tB6R16kjQ0CER/aVlMYuzXkBnEvQ5RuqUIthLugh\ +lUEHgzdj+vd8magYEJnkatQ3v43GeIYYuwIhANrmAnvA+cpZoFav67qxSSn8jSZl\ +A2QMncJquHvLvBRNAiEAzDPU9d6kbx81gAO0J9vUI5iKA4gTiQRUkmgeUoRHSGMC\ +IQCR7qxSgKaG5mrkdUfRy4Yb/bNu7gJCsxPW8dBSh9K4MwIhAIgijfk/GEoUzlVX\ +zW/n4sJlsVewDQYC4wxFaYxYL4WXAiAxtWZl8m1fSBhTkhLJJ7ZZqAojlyTkPYJZ\ +q3JR3z0fZg==\ +-----END PRIVATE KEY-----:\ +01B40EAED76EC2A26C41DF58CC23516E7974537ADDB1D3ECD0DCBAA4F09458AC\ +49675A20D51CC2415DA2992AC5EA983E5EEBB83B9C8C276C68E11158756904BE::\ +32E6A9BFF82BF351E96292947AC218E977AEEB069D09CF438DA0B96478DF7A18\ +53EB8BA770C16B5024D31B6C2D2F83E867AA37C9AD42E7F13369F171BDF2308D + +-----BEGIN PRIVATE KEY-----\ +MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAxYJRkiu+shjNapT3\ +ra+jaefGrLY6mH96JR9cbnBCZhNktqLa8Cn0y4rJVGuScwtqYKpmy46jS3d+AEqy\ +MOf2fQIBAwJBAIOsNmFyfyFl3kcN+nPKbPFFLx3O0br/psNqPZ71gZlhFzvXDpH2\ +pis8mkPPCn15KPe81S9vjaZVYzxiAZLpVWsCIQDmkmjzvCF/8Eq8ReiBlWjA1b0H\ +FV+IcMbHs4RzBDv2KQIhANtKd1FZFnuaZSWozIEhbOwXUh/vB8ZhMKFyMzzQTgA1\ +AiEAmbbwon1rqqAx0tlFq7jwgI5+BLjqWvXZ2netogLSpBsCIQCSMaTg5g79EZjD\ +xd2ra53yuja/9K/ZliBroXd94DQAIwIgZjnLdn9+HnIRhfrix52NDS5nY9yaisGu\ +kQlWG2ag2AY=\ +-----END PRIVATE KEY-----:\ +01453FBFA6B146374602261D86822493E2CCC960B75D2A124B182EC70F22FFBF\ +673F7E0EF0C54536C76B534DED77E1D044AA30FB075A0D52733C19825E1941C6::\ +AAADBBBEA2716C35EAD89736AA97A8FFF0078A07F48A9888294929B8917297CC\ +53AA9CBA9FA9D80791F24F749BB1133D0A48C2117572DB73C5813881F4B5087A + +-----BEGIN PRIVATE KEY-----\ +MIIB4wIBADANBgkqhkiG9w0BAQEFAASCAc0wggHJAgEAAmEAotk6TE/qf3yBOcQL\ +jo0t6KVeOgtNLwCwP2dR7wp4bFTWUpMOx/Y4dQ+2izzRl5neyEHxIaUc11jMuua1\ +s+HW58L3WifM04yT9BQ5gkxxZuqA3+UjKeD9fs/qP+y0CDULAgMBAAECYGCO4xVa\ +kVWUMl9ZEe0tYto+K3fJObOz+c0uaxOMpsi9KPN/RNVl9iXa8kbvAeudDNx8FfI7\ +1u9FDLFfmZsSqDR/VVAvkMwXu4zg5uc9xmwhefdY+URTdt9IshAdlgMiaQIxANJ+\ +YtpDxwL1ROjnNEWKnrCd4gVsMBSsn+zRw0pUw3iVDt0kVllxXVMhbR+NNNNRTwIx\ +AMYN9PgfUr07e5p/3xE5rXJJpBTKktVB0APHORafHsauhs2rBd7F62ZWMfdTdb3Z\ +hQIwG9557hYNMloQ7pk19YMd8Zplw3wIfaRBZFR9e8jvPHbXyfW2rQ7yYUBKt2O1\ +u8jHAjAd7uQUUB+gLApNWoArSU1WlZyv68Hva0f2GjkdmyT6oEwNb4iul7kxOVvJ\ +5ppH/EUCMF13TTGrTH9qiNUHOoS8RLZmPoNwjePw02BYUBcLEwhUw+AbR12FlNf2\ +O3iiv1ounw==\ +-----END PRIVATE KEY-----:\ +010E1F619D8F90D37563050B014DEB3FA3E9B735F8D28D625682D6A4663E6B33\ +4C8B94E91A24BD8F88C29A890F85C9B36F80E8675275C9A8F79F4D5DDDB89129\ +4325125D4ACFECD291875BA10C24547BA43CE2F7B1AB9FA84AEC0627A59750E8::\ +296F935C38845C940F820C379F8032101EA4003CED8BEEE212F2C6F72EB430C0\ +ADF48B7ECDDB296544D8FAE80E2FFF084671E88A88334EB8E718FE8B2524358C\ +CF9EC32CEDF93087CBD39E784FA66B3BD32A427D69EEC93607A8352955C774E1 + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIICETAbBgkqhkiG9w0BBQMwDgQI164w6OtruCcCAggABIIB8HCD8Ae9Zia6ppjK\ +OgZTy4I85VqUgHT1lcOjveqRTtnKeexhbhwR+M8kN4p4wiCHoLu+kNp2lX56Id7+\ +wt+PnN4HofDGkepxS7bve4emEIJN3TLMS1ux17Ste7cJMs4KAKLbtwh5E/slQeAz\ +/uEpTpKnyfDXbI21GxRdiJtHQuw7z+RpX1uuOIZB9t4dE5QSASdbtDJsrvekcNaV\ +tDxzWkZ1BoXcf2otaEW9yzFWlVCuerzc+IcsAtyt3GUuOkLAoY82TQ5XuJFpc2XX\ +J1GVtncjReFdzLyb1gZePiEyE9TZDtbzR2Q/iJkJE61hgNIptCwhe4nvHzMs+fGV\ +8zsudkfzvsgwb05qHt9CJVSs6Hd0frCJsqahpQSsiNUoV3SD2EsH44T5gJrTg3Ke\ +DJu46uIpMyM8VbFc5Ra6CSOuD5udSx2yV1klx7bMHWONzTOCLZnaZVT9cKC/4og/\ +em3A9OdPrfAZouqZsQ3j8u7ZS9Qun9WOZApjRxD1vObuz2VPHglIxp/ckvDJ8BJt\ +Sb4QEqFwe+Vd6tBiBTmK7Is8Fji5Ummbx0tLMSd/Xtw6jBtrrzyf85ywnFAAoTyZ\ +Or4ey/Mf5KDp4LscmXVgkAauBn/Q/wWjK+rdjTBMUW8eQFiLsQnv6087sLSdEUSm\ +jg3w4Mg=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +012E1CD97DB414715594E404B8B0BA9C3928CDC2CCF5F71C712C462B7BC44B90\ +F36869701C7DE17111C575CA752F66AE583371242868409A9486C5104B10A03E\ +780AAE94878F0599547A63C9AAC97802FCE926255167BFE5ED84F5389496760D::\ +3ACD3EC198014D833BBF4DF281C82C96777C9534584CC926F9DEC42E7C1F846B\ +582A267B95EE4CDAAEA7AA953330BE584BDAF75089FCAF66D386AFAE39C9BF70\ +B9D21C0E4C6590C67302AAC0A8917A3F33A39F7F921820E8DF6E6DF85CD6B6E2:\ +password + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIICoTAbBgkqhkiG9w0BBQMwDgQIXbcBBmYh+DoCAggABIICgFFUCKS9lRmjJR33\ +Gndp+hSXD7IHV1kpR6ayZcbGGfYlqsDc63yaWcLiROTQzZ+DMYxaFxePhd8tKtLP\ +38iw/MyXa6IRAYA/C6JHPsXATrKRc+Og8cD5pCxc4STCrt0Wg/SCWl7V6nbnnWco\ +vfOBUHXmflnvQYMEUahsu6lZkR0wJeSyK8G5dMKb4IZ6vOffADQ0U8UuYYK+ymfJ\ +bv5XKXhfje0Iesg6eReLdQMxLI1CURCg4oio1aQsfTosa0wJ9deSry0cjXk7K4c+\ +7MROei4UWXT0Otv1CFYR6zbmBrFbds+CY7EaqoVzgsBcNPLmWWdFlrKebquGc8xy\ +HoIvJ9e/YSnE+YU+C/LapQpmyXoqcQB/Gr4Zdrb3+5ED5WYzgVY+jw8z2f2DAGJt\ +bdzzL9JvFuEG4iZ1vNi9TSy9CyEgoqTyxfcLlHZY9BG2iIhu8pajkjnYmrxodSQB\ +uRyYNJ/T9vFOJGUWHbe9Zii82TedNUBnF0G0e/aRMxBT6wQUrsB4Q2P6ntIIHuaW\ +8q0lhOG7MRnC1FtQ+qSrzpMTX9i/01F0YXegnzeiww4ROMTcO4vUtIRmF55LZv0v\ +8YOjZClzYQP6nNhpHX/+jDpZy+4GFXPVmiOhqjnqJtRbclu+CcDZG6NRFH2V9vrg\ +P+leIuPeA4hV20lbkG3xxrlnxEUAqMNCC+uwj1zTVdNKY8AlWK7umsdWiAPIIITY\ +GQCn/D/Jom7PzbMSVa4HmvsGntPxXP4PxrwErWbCNOZpE2fe0y+tiZidaoQZqmUj\ +UDvM5gYsamu9O5UcEes6QneMr6+NakYwWNl14V3jNB480sI5z8R5bmJW+tGRmYr7\ +/+MveWY=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +01C4B6CAAFF5ABF4FA027C945EE26974E77DAF3FDE5F51899CD64DD7DDDCAE09\ +A164D350597E445481C1E8DFA352538ACF03C9AD621A37FEF184D5CE6083D701\ +E8AB5141299695AA577E89FAD0DD849FE04E4C4268834159071628689AFF6982\ +AABBC3D451597EA8D708A2A7E52646C5749207DD1648361D5F5E85F95EEF7B08::\ +8095B914D477DE2AE3F2AC7648B32EB497B7C1F4FF298D4B82F0A77298574E94\ +530DD9FF57A205499100D5920999182E1CED1F25971B27C0C3BCB06F0507305E\ +E90AD35A00469341B47A6E2E1BB7DD792F6543F74D1FDC2CDBD433DC7C9728F5\ +58DA656E5134FC174723012151360E0310B31D4112FF5CC5829B0709F8EE7303:\ +alt.alien.vampire.die.die.die + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIICoTAbBgkqhkiG9w0BBQMwDgQIfbv0EM4sRhcCAggABIICgIOfgSDzsjOhLX+b\ +1h3lXZiIw4nhiyV9q88CDEyB0x5y+aNkWipVetWoRPqZ6oAD6qE4yGQRhJuSa0o7\ +SzHQlZ7aqBAjtiNXw3Q7yeAP9lagXLolhnIovOKbhyj9iyblgKQgzTerbevaDgp/\ +jYTWXutKLhvjZeYVH1lRBgQYw3z1jIQQDRxw5ok4sYwD0/fpv9WtQ0Rr7XvdDRDB\ +PUhDqEu8GelR+qO7yH3M8Q5qhnTxHRpDWRU+K7f3XRNwJQTdiwWJtSJtUdrSpqYV\ +cqhDzejL3BJZRTcMbjsmq/uABwL5X9prXG2M6j2+9SrQQTWFQrLsyRIGXfKbKN8i\ +wFXaUNzGFKMskk7N6ywkiLMvAIhcaDO2ATm1bHunAcTeuIfdJfdpSWcQ6oz9x9Re\ +ACnWiQ0CRRYQlSYib/u0tt28rwOvCj4F/dSSUMyXegVz0gq3koGNwk3pbHEVvvUm\ +1bqiGQSr2d7DJ+ffe5IoIWB9cUgLeTFP4BBC1hegjDfTsaGEYPVFv5Qxi6W0BaN8\ +cq/HVWofFqu9jXeGgFq1W0IjYU7zftoVc9DyKor6ffDoDzYbNcivd8OcDydLnRVI\ +aofPN+fBAREXHuSz3cYr+arBe5PLbaHTz0iCi4zZUCWU83Usz8oLAtwkK/Ta4rDR\ +KLdv8RB3C3z4r811tWuTrgvoZeG2a4Xa94rb6okHWqOXbSHV00Z2eaqqLIuc89eX\ +JDu1iJrfARsaCN/Xu9unUnJWBRcqGzWgDRMSjnOoUhTCtjKqF3WDTsOfS1n8RSQs\ +F0zMsrXMiHXrWfcN4gDB8q/uz/laLapd8BTp6IZ0oygsHc9J5OHy36TLfoPhObo5\ +HcVJbxc=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +01C84780E9F341C7AC81703D1E1727D134E08DE7F80636F38284BC4EE3D55F95\ +9DA715879A564E46D8BF83F6D6AAC70B8A55F2825B2875DDAC312B90068B25A4\ +323A2BCC9079126838965F0F40261ACB7B0C4DD634C3B3E1F4DF71FB6A969F9C\ +D0CA6860437AC97C10288B514EA51CCAB169A0E52C54C62133371C9DCDBB399D::\ +A22AF2E3FDC9AD8215510CF6B55118A720DE36C84DE8CE00FA769325E03BB0CA\ +81BBD2960E834543443472E58754F9ECDE84D32B4F7CB2C2A5A14A60CA91C908\ +0D3AA675E56E53B2198627938C9B00ADAC3F07A50AB0622833F2DAD34C73D0EC\ +5717613E02A58936EEA60928C1A894C589FE4995607B1AF62C2BE8FD3E8ABB83:\ +foofoofoo_bar + +# PBES2 encrypted (DES-EDE) +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIzgSAjcnspfUCAggA\ +MBQGCCqGSIb3DQMHBAiupWhsYLF7rQSCAoC8ySMPx/GEUvnlb4pj/KjYaeyUJ7En\ +9jzyLKNhfP2L+aCLao3FRSXEz3UL/Bzqx15XW96xfADw+LOXbVfM+HDyDwTm8W33\ +XQbjSyTCf+4hG+XZdzCppTo5jlGLv+3St6Tx/V4D4GbN7mZnO9tSHKim2qPzITE4\ +PCiV1pzDkOFDz/BtOEqL4AQaelBHldyyTrsSBuBVk5iN20mZ5SiEA7bhSuyBxIYW\ +QAqo2/M1JSvqXzXfgcLUNWG02ROmEc1hEvGIdZZAnjVHRUaC8oecTZlROCGyQ0ec\ +5HJt+hSVTtjVvVYRyR9k0Qn+E2tz1VBLFTxXdL2bD+vbGXhHUKLG0NM1Ks9Xea7s\ +YHTGb1wvwxAGh9MoK4bWeEl14fDRIlDlEnHtt6CpF+hXhOcI1UU9MHDQhXqA6E5w\ ++0FtnGMdxd/RgSkOvkvmMzTlbBGnA2W93R3Vv66iiDVIUO4DMAxOSlH4lZmn4kiG\ +gXHIu2BpYiR/CaeKCGDW1L5Ii/T5gnxYz6rKE1NJihRlrCplGe3ip9Ra7K4h+yA4\ +S3P2OuTjImCwBI1uL65vwnPLvdKuA6exGtI6eTyoyL3XN8Wt8LAXQwn1ijVNMXej\ +f/9zQnrdkhgYwQU5yvCi5yi5ewGi+Lqfo4rxJV2lt2b2wDfHoUULFVpIHlpUsWnR\ +aVIwa0t7S5gq/lFRxbnhsHBREJgZWP9kN1XHv8hrEcyedFO4aFj2J6I9GX1vvqrp\ +F5o4a38RBjfmR8FDsH9Au7IvuuH/TUipBybgCbIUyvQADexibuthq5MI2lpmS53c\ +vo6QOp6bwusFSPUE/qbDoW4lX9SWi3vF/RcQs1j7opsDbhqQk+G05h0R\ +-----END ENCRYPTED PRIVATE KEY-----:\ +3BA94D8CC1749902F4599D63A527DACA74870714BC794813247D000DCF31BC57\ +E285CE5A1236EFD1956723B800C3C19094185EAAD7C744DA4917E34D3DCE5FCE\ +F4E6D797510B7A5BA67087ABBFB69FCEE5D8A98AD9A3D3B2AEE9876B9358562F\ +460A0D6C4B5D98E3D305D6B944832859CFB01072C6FCEB5D0558BA7D101458BD::\ +1185126E43C7B5F8D15523E65DAEEB6526CDCF2C8901DC7A1EC836C22CD4C344\ +1C24B16AC8ABC3E00A95C6BD03EBEC74DCA1EBD0DA6E61395452587B36DCD734\ +7184C9005177839FEDA5273007DD0AAC0E8C87A3EEA71F7DBEDDC7FDDD637A2D\ +FCA2FA1215DE8C332ED4BA093B6443C65B32AF294D8A56A1BF8702C1B9086E36:\ +foo + +# PBES2 encrypted (DES-EDE) +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBoTBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQItEsDvV486kcCAggA\ +AgEYMBQGCCqGSIb3DQMHBAgzfU6L9FUlJgSCAViXz0OqV1SBvbiF0sEH8GsMQJwB\ +Q1RVEjyO8uncdbujalyVCeLukh/H0W0unlgceVMSdN7/nQBitkGkvLSoWRv9hYc/\ +UlkCMcq4R3Fx2hLF6Yquq/DyBgF57LVyOpomRa/Kj8TYjfZkx3JXJnRsqjoLhTbH\ +USzwv3DkKV5gljZqLTXdPAYFyWw28GAb+3iNfzwhudblH5JXaZ3X0GWSJEium0UC\ +WPpvBGlNOUyoMFo44q100ywORYAWl/Cc7UNXWMFLQT773FypPsx+bcWpA6Lmx665\ +POrVFb4rTh+AGX9f6Kp/yfgY1VJxuju55imTaHIHZUf6phAnwoTDI+UIZTw1IwHT\ +JdYbYaxjEZglCx0u9wZT5J9IwQVKT7/eLjowV4GS8zDr/tlssDMixQboJ/dRmUYp\ +jcwhnv36cThFx6GoqWMA7ShTVT//QDpvBbebuDOnlSmqq+5qmw==\ +-----END ENCRYPTED PRIVATE KEY-----:\ +35489193F2E4B7B7FC7A52CB4A3AE2F7F97C02CBF43A60934CBD8AC221592666\ +92767C6C587BAE7B73E63EA470A07EA67927923FEC2ACDDB1ADDDAC75E8FFA15::\ +29772BC15B6095A66060CC76884B3E4C77A2330A880D9FE64B007C1DF792CBA5\ +B3422F9BDDF51C48E567F114776566653A7F7DDDB8686BFCEBC94B224D7CB0B3:\ +i_am_very_poor + +# PBES2 encrypted (DES) +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBnjBABgkqhkiG9w0BBQ0wMzAeBgkqhkiG9w0BBQwwEQQI9uqEGDMT/W0CAggA\ +AgEIMBEGBSsOAwIHBAiMfWZMW3qofASCAVgcAhB3yW1aNLIQaoo+WlTe6IRLjKWF\ +itkCW4/m6qJRvR0Yy5BTyDy5mD4QyOcVwvPGUPs6q5R+tjfbBb1orWttBDXvQn38\ +OMD8qV7voCVlDgljidAtSLmHOHy1jq7gCeyKdyC3XEMX1RZa9NIS5/fyJtrcQKxd\ +ktclLolFkiujbGH5i+LiRHWJBE8+9StxBdO+v0PE0FYR7vwxj05xKieg4UiKAVfp\ +C3+iX5XpVqMI+FTqtz/+4sm51ZgGRpz3vmNRJWqh3VqDWiwN8/w53qceDfjmNm5T\ +SfyA0K0dfSkaylprLFd666567HjDXGJlxtA4nM8N1yahRWMz/ufSd1u70dfN9l2L\ +mjghOP+WWverl+Td1cNHRE7/rvkOuhwLJpC4rnZHA4rnIxzwcQmsapk8rsu0S3I4\ +tdZEBhRZsoswIVQo030K6x9DZHMSIpghSc6BlMmu2Jbnew==\ +-----END ENCRYPTED PRIVATE KEY-----:\ +35068206D5C287A47F95BD8ECD11E557D86EDDC993FCAD94F03D86C1BC97E2B2\ +68E637ED1A6B0EE459214E0F61099B74469AD36A3A37217182C42B0C48A4B413::\ +261D5A9298BE592400EE703BC27C2A16761F6C855607D9AA62A9B36307FC5100\ +6EEE06E59C55C9606FFBCF8DF74A98B5C9FBD17F0D7ABB867B4A7CB8DD5DC15D:\ +give_me_$$$ + +# The first bunch are from an RSA DSI document +[RSAES/EME1(SHA-1)] +10001:\ +D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ +F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ +CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ +4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ +6628194E12073DB03BA94CDA9EF9532397D50DBA79B987004AFEFE34:\ +18B776EA21069D69776A33E96BAD48E1DDA0A5EF:\ +354FE67B4A126D5D35FE36C777791A3F7BA13DEF484E2D3908AFF722FAD468FB\ +21696DE95D0BE911C2D3174F8AFCC201035F7B6D8E69402DE5451618C21A535F\ +A9D7BFC5B8DD9FC243F8CF927DB31322D6E881EAA91A996170E657A05A266426\ +D98C88003F8477C1227094A0D9FA1E8C4024309CE1ECCCB5210035D47AC72E8A + +10001:\ +D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ +F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ +CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ +4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ +D94AE0832E6445CE42331CB06D531A82B1DB4BAAD30F746DC916DF24D4E3C245\ +1FFF59A6423EB0E1D02D4FE646CF699DFD818C6E97B051:\ +2514DF4695755A67B288EAF4905C36EEC66FD2FD:\ +423736ED035F6026AF276C35C0B3741B365E5F76CA091B4E8C29E2F0BEFEE603\ +595AA8322D602D2E625E95EB81B2F1C9724E822ECA76DB8618CF09C5343503A4\ +360835B5903BC637E3879FB05E0EF32685D5AEC5067CD7CC96FE4B2670B6EAC3\ +066B1FCF5686B68589AAFB7D629B02D8F8625CA3833624D4800FB081B1CF94EB + +10001:\ +D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ +F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ +CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ +4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ +26521050844271:\ +E4EC0982C2336F3A677F6A356174EB0CE887ABC2:\ +42CEE2617B1ECEA4DB3F4829386FBD61DAFBF038E180D837C96366DF24C097B4\ +AB0FAC6BDF590D821C9F10642E681AD05B8D78B378C0F46CE2FAD63F74E0AD3D\ +F06B075D7EB5F5636F8D403B9059CA761B5C62BB52AA45002EA70BAACE08DED2\ +43B9D8CBD62A68ADE265832B56564E43A6FA42ED199A099769742DF1539E8255 + +10001:\ +0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B3\ +38AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43:\ +012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46D\ +B09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7:\ +8FF00CAA605C702830634D9A6C3D42C652B58CF1D92FEC570BEEE7:\ +8C407B5EC2899E5099C53E8CE793BF94E71B1782:\ +0181AF8922B9FCB4D79D92EBE19815992FC0C1439D8BCD491398A0F4AD3A329A\ +5BD9385560DB532683C8B7DA04E4B12AED6AACDF471C34C9CDA891ADDCC2DF34\ +56653AA6382E9AE59B54455257EB099D562BBE10453F2B6D13C59C02E10F1F8A\ +BB5DA0D0570932DACF2D0901DB729D0FEFCC054E70968EA540C81B04BCAEFE720E + +10001:\ +0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B3\ +38AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43:\ +012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46D\ +B09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7:\ +A7EB2A5036931D27D4E891326D99692FFADDA9BF7EFD3E34E622C4ADC085F721\ +DFE885072C78A203B151739BE540FA8C153A10F00A:\ +9A7B3B0E708BD96F8190ECAB4FB9B2B3805A8156:\ +00A4578CBC176318A638FBA7D01DF15746AF44D4F6CD96D7E7C495CBF425B09C\ +649D32BF886DA48FBAF989A2117187CAFB1FB580317690E3CCD446920B7AF82B\ +31DB5804D87D01514ACBFA9156E782F867F6BED9449E0E9A2C09BCECC6AA0876\ +36965E34B3EC766F2FE2E43018A2FDDEB140616A0E9D82E5331024EE0652FC7641 + +10001:\ +0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B3\ +38AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43:\ +012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46D\ +B09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7:\ +2EF2B066F854C33F3BDCBB5994A435E73D6C6C:\ +EB3CEBBC4ADC16BB48E88C8AEC0E34AF7F427FD3:\ +00EBC5F5FDA77CFDAD3C83641A9025E77D72D8A6FB33A810F5950F8D74C73E8D\ +931E8634D86AB1246256AE07B6005B71B7F2FB98351218331CE69B8FFBDC9DA0\ +8BBC9C704F876DEB9DF9FC2EC065CAD87F9090B07ACC17AA7F997B27ACA48806\ +E897F771D95141FE4526D8A5301B678627EFAB707FD40FBEBD6E792A25613E7AEC + +10001:\ +0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B3\ +38AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43:\ +012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46D\ +B09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7:\ +2D:B600CF3C2E506D7F16778C910D3A8B003EEE61D5:\ +018759FF1DF63B2792410562314416A8AEAF2AC634B46F940AB82D64DBF165EE\ +E33011DA749D4BAB6E2FCD18129C9E49277D8453112B429A222A8471B0709939\ +98E758861C4D3F6D749D91C4290D332C7A4AB3F7EA35FF3A07D497C955FF0FFC\ +95006B62C6D296810D9BFAB024196C7934012C2DF978EF299ABA239940CBA10245 + +10001:\ +01BF01D216D73595CF0270C2BEB78D40A0D8447D31DA919A983F7EEA781B77D85F\ +E371B3E9373E7B69217D3150A02D8958DE7FAD9D555160958B4454127E0E7EAF:\ +018D3399658166DB3829816D7B295416759E9C91987F5B2D8AECD63B04B48BD7B2\ +FCF229BB7F8A6DC88BA13DD2E39AD55B6D1A06160708F9700BE80B8FD3744CE7:\ +087820B569E8FA8D:\ +8CED6B196290805790E909074015E6A20B0C4894:\ +026A0485D96AEBD96B4382085099B962E6A2BDEC3D90C8DB625E14372DE85E2D5B\ +7BAAB65C8FAF91BB5504FB495AFCE5C988B3F6A52E20E1D6CBD3566C5CD1F2B831\ +8BB542CC0EA25C4AAB9932AFA20760EADDEC784396A07EA0EF24D4E6F4D37E5052\ +A7A31E146AA480A111BBE926401307E00F410033842B6D82FE5CE4DFAE80 + +10001:\ +01BF01D216D73595CF0270C2BEB78D40A0D8447D31DA919A983F7EEA781B77D85F\ +E371B3E9373E7B69217D3150A02D8958DE7FAD9D555160958B4454127E0E7EAF:\ +018D3399658166DB3829816D7B295416759E9C91987F5B2D8AECD63B04B48BD7B2\ +FCF229BB7F8A6DC88BA13DD2E39AD55B6D1A06160708F9700BE80B8FD3744CE7:\ +6CC641B6B61E6F963974DAD23A9013284EF1:\ +6E2979F52D6814A57D83B090054888F119A5B9A3:\ +02994C62AFD76F498BA1FD2CF642857FCA81F4373CB08F1CBAEE6F025C3B512B42\ +C3E8779113476648039DBE0493F9246292FAC28950600E7C0F32EDF9C81B9DEC45\ +C3BDE0CC8D8847590169907B7DC5991CEB29BB0714D613D96DF0F12EC5D8D3507C\ +8EE7AE78DD83F216FA61DE100363ACA48A7E914AE9F42DDFBE943B09D9A0 + +10001:\ +027458C19EC1636919E736C9AF25D609A51B8F561D19C6BF6943DD1EE1AB8A4A3F\ +232100BD40B88DECC6BA235548B6EF792A11C9DE823D0A7922C7095B6EBA5701:\ +0210EE9B33AB61716E27D251BD465F4B35A1A232E2DA00901C294BF22350CE490D\ +099F642B5375612DB63BA1F20386492BF04D34B3C22BCEB909D13441B53B5139:\ +4A86609534EE434A6CBCA3F7E962E76D455E3264C19F605F6E5FF6137C65C56D\ +7FB344CD52BC93374F3D166C9F0C6F9C506BAD19330972D2:\ +1CAC19CE993DEF55F98203F6852896C95CCCA1F3:\ +04CCE19614845E094152A3FE18E54E3330C44E5EFBC64AE16886CB1869014CC578\ +1B1F8F9E045384D0112A135CA0D12E9C88A8E4063416DEAAE3844F60D6E96FE155\ +145F4525B9A34431CA3766180F70E15A5E5D8E8B1A516FF870609F13F896935CED\ +188279A58ED13D07114277D75C6568607E0AB092FD803A223E4A8EE0B1A8 + +10001:\ +027458C19EC1636919E736C9AF25D609A51B8F561D19C6BF6943DD1EE1AB8A4A3F\ +232100BD40B88DECC6BA235548B6EF792A11C9DE823D0A7922C7095B6EBA5701:\ +0210EE9B33AB61716E27D251BD465F4B35A1A232E2DA00901C294BF22350CE490D\ +099F642B5375612DB63BA1F20386492BF04D34B3C22BCEB909D13441B53B5139:\ +B0ADC4F3FE11DA59CE992773D9059943C03046497EE9D9F9A06DF1166DB46D98\ +F58D27EC074C02EEE6CBE2449C8B9FC5080C5C3F4433092512EC46AA793743C8:\ +F545D5897585E3DB71AA0CB8DA76C51D032AE963:\ +0097B698C6165645B303486FBF5A2A4479C0EE85889B541A6F0B858D6B6597B13B\ +854EB4F839AF03399A80D79BDA6578C841F90D645715B280D37143992DD186C80B\ +949B775CAE97370E4EC97443136C6DA484E970FFDB1323A20847821D3B18381DE1\ +3BB49AAEA66530C4A4B8271F3EAE172CD366E07E6636F1019D2A28AED15E + +10001:\ +03B0D3962F6D17549CBFCA11294348DCF0E7E39F8C2BC6824F2164B606D687860D\ +AE1E632393CFEDF513228229069E2F60E4ACD7E633A436063F82385F48993707:\ +02E4C32E2F517269B7072309F00C0E31365F7CE28B236B82912DF239ABF39572CF\ +0ED604B02982E53564C52D6A05397DE5C052A2FDDC141EF7189836346AEB331F:\ +AF71A901E3A61D3132F0FC1FDB474F9EA6579257FFC24D164170145B3DBDE8:\ +44C92E283F77B9499C603D963660C87D2F939461:\ +036046A4A47D9ED3BA9A89139C105038EB7492B05A5D68BFD53ACCFF4597F7A686\ +51B47B4A4627D927E485EED7B4566420E8B409879E5D606EAE251D22A5DF799F79\ +20BFC117B992572A53B1263146BCEA03385CC5E853C9A101C8C3E1BDA31A519807\ +496C6CB5E5EFB408823A352B8FA0661FB664EFADD593DEB99FFF5ED000E5 + +10001:\ +03B0D3962F6D17549CBFCA11294348DCF0E7E39F8C2BC6824F2164B606D687860D\ +AE1E632393CFEDF513228229069E2F60E4ACD7E633A436063F82385F48993707:\ +02E4C32E2F517269B7072309F00C0E31365F7CE28B236B82912DF239ABF39572CF\ +0ED604B02982E53564C52D6A05397DE5C052A2FDDC141EF7189836346AEB331F:\ +15C5B9EE1185:49FA45D3A78DD10DFD577399D1EB00AF7EED5513:\ +0812B76768EBCB642D040258E5F4441A018521BD96687E6C5E899FCD6C17588FF5\ +9A82CC8AE03A4B45B31299AF1788C329F7DCD285F8CF4CED82606B97612671A45B\ +EDCA133442144D1617D114F802857F0F9D739751C57A3F9EE400912C61E2E6992B\ +E031A43DD48FA6BA14EEF7C422B5EDC4E7AFA04FDD38F402D1C8BB719ABF + +10001:\ +04A6CE8B7358DFA69BDCF742617005AFB5385F5F3A58A24EF74A22A8C05CB7CC38\ +EBD4CC9D9A9D789A62CD0F60F0CB941D3423C9692EFA4FE3ADFF290C4749A38B:\ +0404C9A803371FEDB4C5BE39F3C00B009E5E08A63BE1E40035CDACA5011CC701CF\ +7EEBCB99F0FFE17CFD0A4BF7BEFD2DD536AC946DB797FDBC4ABE8F29349B91ED:\ +684E3038C5C041F7:\ +3BBC3BD6637DFE12846901029BF5B0C07103439C:\ +008E7A67CACFB5C4E24BEC7DEE149117F19598CE8C45808FEF88C608FF9CD6E6\ +95263B9A3C0AD4B8BA4C95238E96A8422B8535629C8D5382374479AD13FA3997\ +4B242F9A759EEAF9C83AD5A8CA18940A0162BA755876DF263F4BD50C6525C560\ +90267C1F0E09CE0899A0CF359E88120ABD9BF893445B3CAE77D3607359AE9A52F8 + +10001:\ +04A6CE8B7358DFA69BDCF742617005AFB5385F5F3A58A24EF74A22A8C05CB7CC38\ +EBD4CC9D9A9D789A62CD0F60F0CB941D3423C9692EFA4FE3ADFF290C4749A38B:\ +0404C9A803371FEDB4C5BE39F3C00B009E5E08A63BE1E40035CDACA5011CC701CF\ +7EEBCB99F0FFE17CFD0A4BF7BEFD2DD536AC946DB797FDBC4ABE8F29349B91ED:\ +4046CA8BAA3347CA27F49E0D81F9CC1D71BE9BA517D4:\ +DD0F6CFE415E88E5A469A51FBBA6DFD40ADB4384:\ +0630EEBCD2856C24F798806E41F9E67345EDA9CEDA386ACC9FACAEA1EEED06ACE5\ +83709718D9D169FADF414D5C76F92996833EF305B75B1E4B95F662A20FAEDC3BAE\ +0C4827A8BF8A88EDBD57EC203A27A841F02E43A615BAB1A8CAC0701DE34DEBDEF6\ +2A088089B55EC36EA7522FD3EC8D06B6A073E6DF833153BC0AEFD93BD1A3 + +10001:\ +0749262C111CD470EC2566E6B3732FC09329469AA19071D3B9C01906514C6F1D26\ +BAA14BEAB0971C8B7E611A4F79009D6FEA776928CA25285B0DE3643D1A3F8C71:\ +06BC1E50E96C02BF636E9EEA8B899BBEBF7651DE77DD474C3E9BC23BAD8182B619\ +04C7D97DFBEBFB1E00108878B6E67E415391D67942C2B2BF9B4435F88B0CB023:\ +47AAE909:43DD09A07FF4CAC71CAA4632EE5E1C1DAEE4CD8F:\ +1688E4CE7794BBA6CB7014169ECD559CEDE2A30B56A52B68D9FE18CF1973EF97B2\ +A03153951C755F6294AA49ADBDB55845AB6875FB3986C93ECF927962840D282F9E\ +54CE8B690F7C0CB8BBD73440D9571D1B16CD9260F9EAB4783CC482E5223DC60973\ +871783EC27B0AE0FD47732CBC286A173FC92B00FB4BA6824647CD93C85C1 + +10001:\ +0749262C111CD470EC2566E6B3732FC09329469AA19071D3B9C01906514C6F1D26\ +BAA14BEAB0971C8B7E611A4F79009D6FEA776928CA25285B0DE3643D1A3F8C71:\ +06BC1E50E96C02BF636E9EEA8B899BBEBF7651DE77DD474C3E9BC23BAD8182B619\ +04C7D97DFBEBFB1E00108878B6E67E415391D67942C2B2BF9B4435F88B0CB023:\ +D4738623DF223AA43843DF8467534C41D013E0C803C624E263666B239BDE40A5\ +F29AEB8DE79E3DAA61DD0370F49BD4B013834B98212AEF6B1C5EE373B3CB:\ +7866314A6AD6F2B250A35941DB28F5864B585859:\ +0AB14C373AEB7D4328D0AAAD8C094D88B9EB098B95F21054A29082522BE7C27A31\ +2878B637917E3D819E6C3C568DB5D843802B06D51D9E98A2BE0BF40C031423B00E\ +DFBFF8320EFB9171BD2044653A4CB9C5122F6C65E83CDA2EC3C126027A9C1A56BA\ +874D0FEA23F380B82CF240B8CF540004758C4C77D934157A74F3FC12BFAC + +10001:\ +0A02EF8448D9FAD8BBD0D004C8C2AA9751EF9721C1B0D03236A54B0DF947CBAED5\ +A255EE9E8E20D491EA1723FE094704A9762E88AFD16EBB5994412CA966DC4F9F:\ +092D362E7ED3A0BFD9E9FD0E6C0301B6DF29159CF50CC83B9B0CF4D6EEA71A61E0\ +02B46E0AE9F2DE62D25B5D7452D498B81C9AC6FC58593D4C3FB4F5D72DFBB0A9:\ +050B755E5E6880F7B9E9D692A74C37AAE449B31BFEA6DEFF83747A897F6C2C82\ +5BB1ADBF850A3C96994B5DE5B33CBC7D4A17913A7967:\ +7706FFCA1ECFB1EBEE2A55E5C6E24CD2797A4125:\ +09B3683D8A2EB0FB295B62ED1FB9290B714457B7825319F4647872AF889B304094\ +72020AD12912BF19B11D4819F49614824FFD84D09C0A17E7D17309D12919790410\ +AA2995699F6A86DBE3242B5ACC23AF45691080D6B1AE810FB3E3057087F0970092\ +CE00BE9562FF4053B6262CE0CAA93E13723D2E3A5BA075D45F0D61B54B61 + +10001:\ +0A02EF8448D9FAD8BBD0D004C8C2AA9751EF9721C1B0D03236A54B0DF947CBAED5\ +A255EE9E8E20D491EA1723FE094704A9762E88AFD16EBB5994412CA966DC4F9F:\ +092D362E7ED3A0BFD9E9FD0E6C0301B6DF29159CF50CC83B9B0CF4D6EEA71A61E0\ +02B46E0AE9F2DE62D25B5D7452D498B81C9AC6FC58593D4C3FB4F5D72DFBB0A9:\ +8604AC56328C1AB5AD917861:EE06209073CCA026BB264E5185BF8C68B7739F86:\ +4BC89130A5B2DABB7C2FCF90EB5D0EAF9E681B7146A38F3173A3D9CFEC52EA9E0A\ +41932E648A9D69344C50DA763F51A03C95762131E8052254DCD2248CBA40FD3166\ +7786CE05A2B7B531AC9DAC9ED584A59B677C1A8AED8C5D15D68C05569E2BE780BF\ +7DB638FD2BFD2A85AB276860F3777338FCA989FFD743D13EE08E0CA9893F + +10001:\ +FC8D6C04BEC4EB9A8192CA7900CBE536E2E8B519DECF33B2459798C6909DF4F1\ +76DB7D23190FC72B8865A718AF895F1BCD9145298027423B605E70A47CF58390\ +A8C3E88FC8C48E8B32E3DA210DFBE3E881EA5674B6A348C21E93F9E55EA65EFD:\ +D200D45E788AACEA606A401D0460F87DD5C1027E12DC1A0D7586E8939D9CF789\ +B40F51AC0442961DE7D21CC21E05C83155C1F2AA9193387CFDF956CB48D153BA\ +270406F9BBBA537D4987D9E2F9942D7A14CBFFFEA74FECDDA928D23E259F5EE1:\ +F735FD55BA92592C3B52B8F9C4F69AAA1CBEF8FE88ADD095595412467F9CF4EC\ +0B896C59EDA16210E7549C8ABB10CDBC21A12EC9B6B5B8FD2F10399EB6:\ +8EC965F134A3EC9931E92A1CA0DC8169D5EA705C:\ +267BCD118ACAB1FC8BA81C85D73003CB8610FA55C1D97DA8D48A7C7F06896A4D\ +B751AA284255B9D36AD65F37653D829F1B37F97B8001942545B2FC2C55A7376C\ +A7A1BE4B1760C8E05A33E5AA2526B8D98E317088E7834C755B2A59B12631A182\ +C05D5D43AB1779264F8456F515CE57DFDF512D5493DAB7B7338DC4B7D78DB9C0\ +91AC3BAF537A69FC7F549D979F0EFF9A94FDA4169BD4D1D19A69C99E33C3B554\ +90D501B39B1EDAE118FF6793A153261584D3A5F39F6E682E3D17C8CD1261FA72 + +10001:\ +FC8D6C04BEC4EB9A8192CA7900CBE536E2E8B519DECF33B2459798C6909DF4F1\ +76DB7D23190FC72B8865A718AF895F1BCD9145298027423B605E70A47CF58390\ +A8C3E88FC8C48E8B32E3DA210DFBE3E881EA5674B6A348C21E93F9E55EA65EFD:\ +D200D45E788AACEA606A401D0460F87DD5C1027E12DC1A0D7586E8939D9CF789\ +B40F51AC0442961DE7D21CC21E05C83155C1F2AA9193387CFDF956CB48D153BA\ +270406F9BBBA537D4987D9E2F9942D7A14CBFFFEA74FECDDA928D23E259F5EE1:\ +53E6E8C729D6F9C319DD317E74B0DB8E4CCCA25F3C8305746E137AC63A63EF37\ +39E7B595ABB96E8D55E54F7BD41AB433378FFB911D:\ +FCBC421402E9ECABC6082AFA40BA5F26522C840E:\ +232AFBC927FA08C2F6A27B87D4A5CB09C07DC26FAE73D73A90558839F4FD66D2\ +81B87EC734BCE237BA166698ED829106A7DE6942CD6CDCE78FED8D2E4D81428E\ +66490D036264CEF92AF941D3E35055FE3981E14D29CBB9A4F67473063BAEC79A\ +1179F5A17C9C1832F2838FD7D5E59BB9659D56DCE8A019EDEF1BB3ACCC697CC6\ +CC7A778F60A064C7F6F5D529C6210262E003DE583E81E3167B89971FB8C0E15D\ +44FFFEF89B53D8D64DD797D159B56D2B08EA5307EA12C241BD58D4EE278A1F2E + +10001:\ +ECF5AECD1E5515FFFACBD75A2816C6EBF49018CDFB4638E185D66A7396B6F809\ +0F8018C7FD95CC34B857DC17F0CC6516BB1346AB4D582CADAD7B4103352387B7\ +0338D084047C9D9539B6496204B3DD6EA442499207BEC01F964287FF6336C398\ +4658336846F56E46861881C10233D2176BF15A5E96DDC780BC868AA77D3CE769:\ +BC46C464FC6AC4CA783B0EB08A3C841B772F7E9B2F28BABD588AE885E1A0C61E\ +4858A0FB25AC299990F35BE85164C259BA1175CDD7192707135184992B6C29B7\ +46DD0D2CABE142835F7D148CC161524B4A09946D48B828473F1CE76B6CB6886C\ +345C03E05F41D51B5C3A90A3F24073C7D74A4FE25D9CF21C75960F3FC3863183:\ +BCDD190DA3B7D300DF9A06E22CAAE2A75F10C91FF667B7C16BDE8B53064A2649\ +A94045C9:\ +5CACA6A0F764161A9684F85D92B6E0EF37CA8B65:\ +6318E9FB5C0D05E5307E1683436E903293AC4642358AAA223D7163013ABA87E2\ +DFDA8E60C6860E29A1E92686163EA0B9175F329CA3B131A1EDD3A77759A8B97B\ +AD6A4F8F4396F28CF6F39CA58112E48160D6E203DAA5856F3ACA5FFED577AF49\ +9408E3DFD233E3E604DBE34A9C4C9082DE65527CAC6331D29DC80E0508A0FA71\ +22E7F329F6CCA5CFA34D4D1DA417805457E008BEC549E478FF9E12A763C477D1\ +5BBB78F5B69BD57830FC2C4ED686D79BC72A95D85F88134C6B0AFE56A8CCFBC8\ +55828BB339BD17909CF1D70DE3335AE07039093E606D655365DE6550B872CD6D\ +E1D440EE031B61945F629AD8A353B0D40939E96A3C450D2A8D5EEE9F678093C8 + +5:\ +C7FBA2CB9FB24C6034C9E239E9350080AC8B9CB2DC8D428C5A1DA72767179679\ +1021093809F5F79052ACACA1EC1ED7E019818D8B2D417E8FC60812EE1A67992B:\ +FD06033468C106ADBCAA26AC4B6BD24CF4919EA5EEB99458D6E3C758ED606D63\ +9AA3D3B0BC36CFCAEC3507AD0280BF6E9F9C3EBCF41A0B33A95CC6EEBBDD57EF:\ +7730307421:67C6697351FF4AEC29CDBAABF2FBE3467CC254F8:\ +1A025CC4A2C1B8488760786162C62EC677F6546F329D84E6EE0DA11379573D17\ +92526104BF637DE57807C4394C492919021DD81ADECE3530D8D2BC1802EC2E88\ +A46C9C5E8FF11E34D7476530B7E11DE0236992DE293355494471223263664199\ +01CA2F27E4A996512BDC650D76280A54D1DE2BE17D6E59EE1D156745036D8DC5 + +11:\ +EECFAE81B1B9B3C908810B10A1B5600199EB9F44AEF4FDA493B81A9E3D84F632\ +124EF0236E5D1E3B7E28FAE7AA040A2D5B252176459D1F397541BA2A58FB6599:\ +C97FB1F027F453F6341233EAAAD1D9353F6C42D08866B1D05A0F2035028B9D86\ +9840B41666B42E92EA0DA3B43204B5CFCE3352524D0416A5A441E700AF461503:\ +D436E99569FD32A7C8A05BBC90D32C49:\ +AAFD12F659CAE63489B479E5076DDEC2F06CB58F:\ +1253E04DC0A5397BB44A7AB87E9BF2A039A33D1E996FC82A94CCD30074C95DF7\ +63722017069E5268DA5D1C0B4F872CF653C11DF82314A67968DFEAE28DEF04BB\ +6D84B1C31D654A1970E5783BD6EB96A024C2CA2F4A90FE9F2EF5C9C140E5BB48\ +DA9536AD8700C84FC9130ADEA74E558D51A74DDF85D8B50DE96838D6063E0955 + +11:\ +C078DF95FFF0FC15570627120760AE74601094E47D0C879075B1F1A3EC33B255\ +3490AB1484E588C18A62A166876C5FD1F9790C265CD5ECB5ADA8BE03D5ACE4DF:\ +CDECBA049D6379CAF66158D85E5A1CA40ECFB849E832109B6E018DBE5F2DC8D8\ +63DDC8DF00D93BBAD5AA1EEEF896AEF694D253C11B806547D8F3621F6C0B7041:\ +7730307421:67C6697351FF4AEC29CDBAABF2FBE3467CC254F8:\ +40BD2CCDFEB88BDBF6AE80EE37045142EEBA60D51063335F6145BD30223A1635\ +D18C4E67FAD80D158BFA711A6BBCCCE8980A171027083D2D4E6B7DA2C465ADDB\ +D1F44350C51A9E03D808EB5784F0A3602B7E23903CE4530DF3D45829375E1113\ +7FCD639874F71E68742B9C145D21ADF4C4C8416B54AC4A01B25AB4CF1570CFBD + +13:\ +C975657B7786E7335EA9B72E0DFE6FA895F5F7CE9E559CED9E6C9960ECECFCC1\ +EC9D515BD14849E798B4D699F7C2898B6C256A63EA5F33D2FD77A51232B722A3:\ +D502E40CEA5B850C45E3BDE7E05EF0B13F4AE0DE9D93FCE969E5A119191785A6\ +3E5C181BD0CB3F440A1B519B3961B2FB519A8526BF29A3DA6DAC68261F70149B:\ +7730307421:67C6697351FF4AEC29CDBAABF2FBE3467CC254F8:\ +4B4B2F855CE4E8D5675589DE93335E31C1EC3ADA263855252DF49BD4836DBF29\ +3E07BE72C537B9C7685B38F7C838E067BC9172DF032C1F7AE337310A41A5F103\ +B00E662E3F78E04C234825A3DA6D31CC84D591EF5E8FE970ECC2C0B23E280463\ +25D88534EC256FED8C501034F8017C771983A07EB60E396F97418AD903282B59 + +67:\ +BEDC7B14D1A21178D999DAAF657792371C8E55D29DA042030BBCAF411D36FDD2\ +F2A1F79DBEF6B61AF19A750562ED9C7A73386929951C9D330789504FB322C99B:\ +DA9ACA1C011181903DD4C24863408D49E4E134283CE92C65C842B753FBFBA463\ +4024837D6C1C17C18254BD8CA696F85BFCEB2578BD41B2584F2F47D6B12C18F7:\ +7730307421:67C6697351FF4AEC29CDBAABF2FBE3467CC254F8:\ +11C86DA2269774A6F24161A81B25D913B1A8C9F7332D066F96AE896221BF0B30\ +63C2254FF1B082721C18BE2BC3F0B1E0CEC028D8CEF7C762E985A6C327ECEE03\ +6070B9BCA0E6E41EF72B8404C7874CBA08E2D05612D69D11DD14C1EA42E605A2\ +92AB1C5A19C2F0EF39441225C783BC573775A28857F8AEFFF4C7748C164C8A79 + +FFFB:\ +C7479D7196291025D82523AC1840AAF09C3FF8844A444A9FED1C63996FD34566\ +B75FB997746D175CB1B253C470AF4CBC5A0EB9969A85EF32A12C75053B8D7681:\ +EC73649E669157A56375BEC8AA903491543605C6A55AA7E4C804A0A8854C1363\ +56485CF4595B5922FF408E2A364F19F8BA82D658CD179118227BAC50046802B1:\ +4920414D20534F20475245415421204920414D20534F20475245415421:\ +67C6697351FF4AEC29CDBAABF2FBE3467CC254F8:\ +B73D7477B95133222DF24ECE7F6FC3E183DC7378503F2DB0E95CCBCAD9134CB4\ +7F5CEBDBE94AB4063E473A5168CB7402E75B2423E5774FB328D2D463AB79D62D\ +46DBC2AE11382F90AB2D63CC061816991062C17B08FF6D29DB1F646C57BF122A\ +1F23017207DF6630B739134995B250260907096971F530E8006B06534A333974 + +11:\ +FAEC2B060722051B29D1A7E1D3E060CE3CCBCB29CCFC68819F26BB7566B7C5BB\ +D02C16C5A99E7F8EC22AA7050175DEA2C6C8939A24FBFD9015DA5C33C9E13985\ +F6E788E3BB02771A4B273B4C9D376E8204E469EE1433CE4ADEE78FF6B0B96445\ +673D5A0CB10156647B5F0418CC47A3469C6D0027D6AAEBC402D2DDBA1DA5B693:\ +D4795D21407AB236151E75957B45907F27BCFCDC38A0D9E322B1F2810FADA359\ +61527F1834B1909BDAFDD8D6B779C60694E36380BA45CFC786FD28C8310AEE62\ +30432FBA0996E87D22F7792D101EA4C171AAE38956762E3EDB2DCC8919BA0269\ +F9CDE6B3D95F6D9EC93D22D118FCC837B2EE5990D6E84CB181D3416FCFFA9A23:\ +7730307421:67C6697351FF4AEC29CDBAABF2FBE3467CC254F8:\ +67114A6F725F764D578FFB44F36CEB3A2B51CDEB1183AEA7201337DF4D2F9A0E\ +7DADE80202AD35BE2C5A209E493D31437189B95C86B53EE4B849536F94782E03\ +35E1501978588A525192001D2D1B1C521A31F94ADC1A3119D50E07318246D352\ +61F44EB0C2677F0E358E486A82E2B971996C926474F3199A4686ABAE7AFE130F\ +BF419FDB7B92CB69D8FCB7FD1536234C9B82409474F9968BF16CFBDFBB57EA34\ +C01436A684B8C521A435462CB6A6EBDB5DA4D97AAD2662738810DBC40C2616D3\ +241D47085D53D92518BB24D26B2D7E8404ABE334E6C4848DEE793F0EB6B61ACA\ +D0BAAFB220CB2C9ECBCF9667ACA41661B21E0A68E187DCBB39C3D7C5C31A7771 + +# These catch a bug in versions before 0.8.7 +10001:\ +D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ +F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ +CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ +4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ +54657374206F6620454D453120286F75745B305D3D3D6F75745B315D3D3D3029:\ +55BF28124E5DCC8B92E4419464AAD74B9D489259:\ +21154AF8EAAB2063615CE16397CB0AE8FA55C94D8DB6A1738F90CE17B1F2B77C\ +57A5E2B7D892FCE8715B950070C2AEDCC6972A5B06BB20607D948FE755E24EBC\ +408456375121DB3A0205F45030DC840EBFF0ED359449B670B3AB77B9E8167658\ +DD73AE971C6B131F77C3A5143974393A2121F2F457146C7AA22DD56A7EEE86EB + +10001:\ +D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ +F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ +CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ +4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ +454D45313A20286F75745B302C312C325D3D3D3029:\ +825B0D7E7CCA6E1DE021437268D678C0CB8427D2:\ +039FB7DCBC3ED3DC57BF06055A269E47C00119FBF1F55FEF6E4174F9859C1BBE\ +FC40B0A73E128FC5DF5DC6DA3C292BD13E428CB90A181983FA2383B092375B1B\ +66FB2263174CD75266AD03B1DA49FC5BF69ED911017ACB87FA405DC118E8EE69\ +26C7ADE4392802C8CBD26D7534B8347F9C6C40F7CB776857F45EFF31D6D17CA5 + +10001:\ +D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ +F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ +CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ +4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ +454D45313A20286F75745B302C312C325D3D3D3029:\ +20A708C1E55F288CFAE84EE6A521D3268234673B:\ +80960E4DF6DBD44A685EF7175BDCC12A53EC5DB0C8CD2866D72C120274D0F525\ +88A71E97B449B65A9E0D36AF3A6C3437440163444EA9CC03C26FC52596576B54\ +67CAFB8F171A2156135FD8CE93F7BA2E1418A4646E977DE60B19F1E7140B28EF\ +C241AB3068FD4F0B70332962F253D67B6FC41D60806D0E6B62A81C759C24F405 + +[RSAES_PKCS8/EME1(SHA-1)] +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIICoTAbBgkqhkiG9w0BBQMwDgQIvr4d1PWvUvsCAggABIICgHacnCUtLfHl6orN\ +3TlqanvKYD4NVYiXpM4lhPbOk43UDH4iR+uEXmoGbt6HCjDJuFLt8HNcxMO0jrrZ\ +fjD14doLd5Byv8oldAKBHz4GHP2wGxb0l5vPqHE9WgDN/NKke35TJLuzkrV104K+\ +hir+LhhwDsDCV71jqsVL7ld2+AxCKF8+1uC+uSOoD91tFAXPLt2BApqByMJ59OMQ\ +MK5LKsTQJivywXSyQHVXVTCkJyx0jiChpr/ns+ABsZ7BVD8B+C2QTY4j9w4F80ms\ +dJkdEmmiRtIIPZoHrLKisPjLWE2oBgMxwfgE0twL6LgjMPAKaXPX5z9rmD+is0D7\ +BovbmCVNDLNvIB0z3ehP/EzP9V2WtPfpjwnKL746+Hy4h5bdt7pVUYjWiTxXpiAr\ +twjm8R5OUseNYrsVf2mitm8VRF97egF9BTQ74kUDQPKvwDSfVxkaOPttfo7xB0j2\ +GYRgXOsO/fosiafakBs3ARLJ7U8vjq2JtkTbKBtWvlJQmc3VHALZ64Ukt7epOlV3\ +W+hE1Hd6YnAuzCQIgPW8TtJkcSeUbH2NtR1ZCY7hUnLmqbiLAVqNezmYg5HIKZIQ\ +/IWMonvvrJimIRzz9F+EUIGM1JjgMrIIQ2zHIB8Hp0IhLNel+pWtSAZ/CDSTbOkP\ +An63u+Btp0CNGaIYPBNkW3rN9rKSRn85QFAU54LKRrtY3agVJs8VCH/jU1nBNl+P\ +pti1MKjJGAa8yCjn15jLBmS/PSRmLT04XwlDEuxBrfsAy8zScQkvMYLlVUj0JXJj\ +uEsBmm2wi8aCsD7cylqyflyePKOSAlig88cmFGWR37nq2HP8Gfi6IrzSFcLFyeOi\ +SJjGj3U=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +B2207519BAFEA1FFA5561CE47F903CE59DA9FE82DA7D4C867A92F28F180D:\ +FC0DBB14EEF2D2FBD6D75C7D920D96F5057C45DA:\ +C1659606D25D6D3274B0380373D8F0F740EECFBE0E7C5AF20F22ADFE54063E0D\ +B5AA23737992C216A66550E8B0D1730684588B1CA0FEAC63680A7EAC2EB6DD73\ +EA5B2DFDFE2A41C47D28027E9400FD71A2A8109271993C629A39A9B006AA11AB\ +E798FCB1297BCA3B42CE1BFCE817928DC3BDD7661BFB2CFEA5B1C2D02B48B821:\ +ilikepie + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBgTAbBgkqhkiG9w0BBQMwDgQIeNQ67v0/C1QCAggABIIBYDTbkO1cl0ur+Osz\ +kTIQYqsi+YChtwLeTE0HipSPbuvlsFI5eoQvKjaEZjSMjsZwT6hX9zVbaclDFu7o\ +fOzrEwGSGXoquFzS0GfbtynnUhk1IAPviLRdesPFCrRWFByaTRC4y2G3zT0bopo+\ +Q6as/Tk28V88dpN7qC0Q5GlAaPTzc2PAy9FGc4lnu71WGQQOVByZ4LFomBPez2F8\ +S95H85Q0OZADlp+7gGUjUtlhZqlmn0b1OGNIsU9Ua4VntOFODr2AWMhoKpmZ2nNd\ +9Nc97uwP4jx1F8hfQP3/eRlG/FgYPX9FtVPAmKV8NA1QoBIIrfW0T8/JDnOYsxA1\ +/EwyNoamD1UJ3xq0kHS9a6c1zU00l7fgc1Cn+qECu93FxAffVN/cpA/+QwQwNXhs\ +ypmHWNSJuTUwx+MvjO/aEUAaGFN5HNwiwjOgoPecnSbHyPeyc7Fy6fVp6bjYuCJH\ +gjnIOR4=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +A3208DF23DFB014D257B4C3D7238A857AD:\ +0E151CD5DD9014F9BCE7BB3500D1E3A7EF3F36F8:\ +374FCFFE225903D58CE988FC469AF9B6D660A90A48FFB7DCE207888D871587D5\ +0494260231664CB03C18A427B04BED666770B503B6EF08632A00D9D03888B1A0:\ +unguessable_password + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBgTAbBgkqhkiG9w0BBQMwDgQIfovX98csqwwCAggABIIBYA3nZapMLCVG6H+1\ +GVg9ThDA2RPjb5bI24AU8UcRV08Tw81SMQmZ3BCFgcbUlcEAM8BlGfc3g4KbxSt0\ +P8o0/ImCsZG4tcjQqw10CjQkG7Wg4WrKJ7wVUoKenR+9vPkzDtAFLctNqfWgbtmX\ +hD/O0twe0NT3puypunDReKq0HRu4LnMnXBzSNg9FHFvW95KU3JX6Lk0Yt77Lb0nk\ +663We9Tdr5kQnONjai5Q9gPst8suI6K9miInimPWgPSyCVy8Yp9Epl660QOpS3P4\ +mSg5ZPCT3pzcyKdSK/I1HfFSuXfP8+XYixjNHGjX3TZWl/x0g0EACowNlKQi63s2\ +9MRpBpMxu5Y/AhrpZ2GwUPQnFxmJXKOIXoSaTSzAW15QwfBGybB9F2goM3KM+xEY\ +g177HF0JWHexJGbMurT8shUjwrxFb190hoHIUYsmVN2qRT4tFNsUYAGjDAE287SW\ +YX8pFFg=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +8F6B78A9F0D0F35BEFD38B:25D6DBAA5DEA01099646C5DD25589A10C414B6AE:\ +0091AA69E80C2690C78B99D5BB71002BDF019B12CC6ED5F7ADB0D2AF7284D1E2F\ +E14E372C71FEBBCE91309D7D18EC979DACCFE11799E31BEFF9B4D25D2B9DEF8DD:\ +akira + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBgTAbBgkqhkiG9w0BBQMwDgQI4boeHBzsmTgCAggABIIBYNQg9WdcjfVuPIof\ +D5/vhwOE3m3fxFqPmEeGf1m6729KiaVGuICWos3o0+rca6zGwulfUe++yARG4TW4\ +Ug/kjQhYVBZ6C+0cU8HmkpyO7mNcOrIGLJVgYmfcZbIm5DKS4g8vdLLF+mC7ic3n\ +ccBmbAN7JpPUjUiPVLlmNU691TajXdf0H14oKvmagjW9revy6KPrp9Hm0DkA5k9m\ +eMc6CyVk5IUijwEQyl5kwgCZMvR1N5ojum+FS5/+m4oOOPlowypEWPJYIIrH8vqv\ +bL/ZrBN1BsNKo2vkFvgs2AUJWhtuCdOI30HpVuI9t8crCZ2jHD1N+UdPQK474xhj\ +7/kTvM+LxAJm5ZKbcTJ8IlwVvEKvjN3+NPHpOIhThNI7IuBiLbljf5Q2hO68fUrL\ +D+6blox9MfSfpObyHzAk1sz9TnglnwgszUnnQDnF0akbR0sjmAntr2J0SPQ04Ore\ +GMrVEDI=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +E729D4D596553F96AF:36FBC9529B999745EF9F19DF5A7C4E783013C661:\ +02A9176EF95FD74880B641C1E67367F3780B59456EBBDC05A4B6EEC3D3F8B8ED\ +E063DD1E2300E24CFABF475C8F3BCCF987C043A9A839976ED7B3995752EB3A746B:\ +It's my hobby, Sakura-chan + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBgTAbBgkqhkiG9w0BBQMwDgQIikN0UUeS0WcCAggABIIBYB5e4OfogtTUEoKL\ +N1xxteoWJirrMjzmXFVbief3OhiPTrLLAHZxQFdvnljURvY3UTUCDAJsBwgVfQlt\ +v0sYNdgxCv3seyb4f+MmDQKppHcaoPUfoE6R7J35lwE8eZs7S7sQIhA2loBuYrGf\ +V7GJ1nr0zWzb+JfRoOypMWbt0f06PMfJGdjd9dWaiR01L8PAHwwNNNREtbobrGcc\ +9jrw3bUDwMW/hkJIIrrPbQ41OqIJsQ09x+1VVBqaqcS/dy9wnB6FmUT8xvGY8YMx\ +ru23dTzd7ONBVWmhOq3Sov6o0i2eaFG8U656/L64qlw74lAUgJOVlZ8YNUEgaegc\ +rOSDDAe04/Piddbq8wpgpkB3pqJzFkleNVSBfduZaQ5azdtgpNKahIneAPbltnKm\ +hJVZ9OZImRKQaVOVZfqM5dJoohTrvTee+rT4n9O6/YcBgoP3QtTscPLSHyaQB8+A\ +X2ppo4M=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +45A04558B8:6587ECBA1C8A7BA7C2A8B4DAE9D4076D85CAA2FE:\ +011F8E0F8A7FAF157D2C5938B137AE3A8A2158F9784E1F09E205A7C7C71505E7\ +D50DB8E967B1CC637EDB766B12570328B7C7832DAE3F79C25D14F26DF0729F72\ +6C80:qwerty + +-----BEGIN PRIVATE KEY-----\ +MIIB4QIBADANBgkqhkiG9w0BAQEFAASCAcswggHHAgEAAmEAsgsx0714GvWOspp9\ +CrFOjZ+rSKi2q1nt22CJM/vGvtVr3wfCvaszroOths+vl8OzNFWJWXLQjYx6vsiX\ +n5lcQyzeXW7Qd9VCRGoTwgd6aVvhHjfqEBttQVDJmFf+R1wrAgELAmBAvkCqFlo4\ +WUsprIqPhkscOg+9VJ+EILOVl3e1z+suHw/0AtJzhBLLGJwxBbQ3L+N3a0aQYOwP\ +uiYXuJbt7KzaKWnFP0XHzme+6X3zOGai7+2xM0CkIiAzNqdHJ49xneMCMQDkL4WP\ +uwc4vo4biGjfjqqdb29RLR3JLZ+b3C9c0LZYlW7oA/L4zeaWs1TvobkCuWMCMQDH\ +vwG8rUApjgPiBI+xv9ZNy4wt07LJMAVbi8oIW6nQsqSO5wVT764dxyilCXrMMJkC\ +MHx3AwiUj5NQqpqnfwWTouGCmc8v4bONP8lg1AQUwI1oyCF2hIe2IK9Ki2tvfDAI\ +BwIwNnnpM3URf7JeJl5VvB0L5qvgaZbTqzukXskIjep0IaUVm1ZHRW/pqwfFREhn\ +TvX7AjA/Z/CkJNDAkHNUTW67+VzPRulGiW4+Lzs0f+laa/ZL9SizJ1nS+HtUeREG\ +Ya7AO/g=\ +-----END PRIVATE KEY-----:\ +F5BF1834145D40D0A09D6331204035F76EB7DC981734E09CD1D755B46484675A\ +447F8E58DDCE287D6B8CAE8BCCE3833A9A5F:\ +C91DFAC04EBDD389B0A172520B3D189C6E19FDFB:\ +75CBD6ABBDDA5A8DF4470955E212778FD872B0816E659C42F9D796A48ED86EAE\ +FFAE39EB4D25A218A5EB6252DAC6A73DA23B35D967286C673FC9A603AC9B2803\ +A8F75BAA72A22A3601FC0A1AD9923CF8A75B749126E2C98BD3AEB4EE2FE3452F + +# The actual (internal) name is PKCS1v15, so test out the aliasing code. +[RSAES/EME-PKCS1-v1_5] +5:\ +DA8D6D0AE1B959B8A446CE3807F195BC6737491490206535AC8F85E5D6E5C18F:\ +F74FE3F3CFC5BDF517A50A887676E7CC2D20C509758B7657ACAB73DFDD581D07:\ +426C696E672D426C696E672E:\ +C66FF974AC57FF20D15AADF04D472ECF48F945F50945822FDA962591C160072A\ +AFAC9AB61302ABAD458A2528D610C73DCD:\ +11F10A948BAE2ED28555EE8B36028C8AE3001E8AE76DA4567A59DD59EE8B490E\ +54617009CF6E346360BE39E22B432DD7B50F0C41BEB1A6DF655E486FD5D822AA + +C3E9:\ +B90114E3BA96AD3076C08F63255E07A6BA0F46C0EC9332EB9081EA81100FFF2E\ +D3F886DB2DE1CE4F01ABD44D477DA8E61B66C65A9FB666B1CA8F79FC7B3EF25F:\ +E67921A8F5C8C04169E8CCEDE6EE147CB3B1E139BFA6CB6789E24238CBBA10AD\ +522B4BBA6F3B3138C7B038856F01C3735B2B61FDB18A47DB57D5B4B5B52B6E77:\ +426C696E672D426C696E672E:\ +8D4557C36F53ECB344131ADE3F85684BD10DCE1B84BB9B95A8AAF565D73283C4\ +46251D7FAFAF6C84FB216C627EEBEBD0F38C0E4C2849BB5FD95E453C9F4729E8\ +B54E0AA5700EA7ED197A0A64DA43AA33A0D232ED403F2DD5C519FD070242DBA4\ +6FAA023D4FCA255AABB85A9AEC28DB83A6:\ +9642171747FA6A731DF3D17AE28EC0AA0FB8E4046CDC0170335610B1FEBA9673\ +8E4A7FB6BD7761A035B41161696A2270AD429C09980005307A6F154B65F6CCAE\ +0C7C9CC1FC2E61BB52B5AE4AB41618023B673201D14C83DFADFDCB21BC7EF65F\ +CB497A7625E324F1ABE70B045D465051C4668A02B5F38F25606FACFAF62296FD + +11:\ +F233C84BB80BD0BCA772A629AFAE474650A81C10B863747364DF21776B1ED919\ +39FE9011E45B6C317F7C913F1A2E9395797C2E778FB97A0B1F57AEF663213557:\ +FB5B0E26BDD59E3494998727361831FDEC1715C0DB65E0FFF318A2BE9B33993B\ +76984F868CA9179807F29C1DE6C5489C1D43C76BBB7959BBF85922016BCECC43:\ +4C65742773206F7665727468726F772074686520676F7665726E6D656E742120\ +286D616B65207375726520746F20656E6372797074207374756666206C696B65\ +207468617429:\ +2D76481668E437FBFD3DF446DF2BC5F7F0EAA857CB913E739D5CDB6042D32ACD\ +BD332E5A99EDD3B4B210FC2937440EF8EDA3EEDE33D7B7:\ +7B8F8AAC5BBC997CD4A1DE682FBB96AC8E80C6FC2102B1E7926D9AAD97BC10A4\ +6F981BE12F8F1B51F9A9E1F8D8B7AED9CC42F2AC0420368341D994D942071766\ +79B5F2187FB6BD8F962B678CC379009D0A82ABB9933093371B71C6CDECEED957\ +EE08962B0A94C7DCF40325E5CE38C61C81D327AAE5E140F345597EE7774B8A11 + +11:\ +C768A0691EA020997054C37D371440D61BBE79DA842AB00DB0FED730D00BEFB7\ +A466BEFED1BD928211E7E3F56B59A275135C80EF31B6F7348EAA7887E798FE41:\ +E12F3186A97838D1D57671508F249E538C85DCFD34CFEC3A98DF3A16C9559408\ +5A7F706FBAD2ABB69D654BDF2EF64C11A0B20CF70BA9AF62E416031C090F6D8B:\ +57616E7465643A20437574652063727970746F2067726F757069652E20507265\ +66657261626C792066656D616C652E:\ +22FA636CF24BFC2DAA1ED4FFA8D8D65370A45AD16A24454A2132ABA993A935B6\ +EAF3932BF7AFCC89CCE080CC4AD06914148C164C659A24468DAC947B73BE7B5B\ +09FC516E16EF7E89AE02F590EC23:\ +A0DF6D9AB85D31C7AF2E9748005C10E245A25987BA91990046FAD410E9640CE9\ +DDB51D11E8A05423D80CA8AEA69AA08A42D58AC8609B0D1390F4FBB6E48EE8D4\ +FB031A13CBA1050240E1CB5C03793CA0ECBCD543718B3DF51F6ED411512ACE95\ +FACCEF2A127D731AC0E25A47722C07FFD1A1DD5DFE0B1EEF6EDEB3C8C654AAD4 + +1300D:\ +E8E314B7ECD4CEDE513D6E229A3A3A0E1D0DAF974ABDA9997E1978972FD0863A\ +FFD6259861CFC26F136DEBD1ED9CB227E091823C21DD79B57E8ECF67B9293113:\ +CE47F1506E6DDA70A95A6EC56E34B9F3F929D15C92DD4AC537162C6E3BD6C4EB\ +FD3C51D08BA61216685A333062EBABA4B5E647C81550C7FBE132A1D48D7EF00D:\ +486F7720646F2049206C6F766520746865653F20204D7920616363756D756C61\ +746F72206F766572666C6F77732E:\ +25B8D6560A33737B64EE77A02D5A3BA53F0F165468CCB98E7DBC6DFFA4C29033\ +A209E8B6821A3A7CF9EE89C02B42CD25F62FAFCE56B80E703897A3299F78520B\ +A251DAC421CC5A0B52E0E4B15FBB1E:\ +5A188A2132B9331B1072BCEA281DAE53070C0AAB0722D583BC7FE767BC85443B\ +5E36286AC568246781792CE04FCEA86D26124F14F3E8ADB69CF1E8A0A1D86E3E\ +0AC0F141C18CCA5F1B8228AC2996E81938B6593F37A603A41128D4CC0D453610\ +42B5F86539BDBAC1B1867E4FE351F599E955B452F675B0945093FE8310A70C9F + +13271:\ +D4AA40364C695FC262073498EAE363EAE585720A8AA211D37CC2BB74ABDAE7A8\ +B6D9C55D5D8E3A0E4D3B39D57D543E8A17F697FBBD45E32EC53B9240188F7EF5:\ +D4420A0041902AFD838833F2EF3AD89AFCF3EF66CA5B20036692BDC45FF861B2\ +0BE756CE35DCEC97A7BDD28DBBC09315E5B7E0249E61772436CA728C7639A8B5:\ +5768617465766572206F63637572732066726F6D206C6F766520697320616C77\ +617973206265796F6E6420676F6F6420616E64206576696C2E:\ +25C23B57F9C9E9A3A2C08F3320214F5365B1A70417F5A6AFDAEFDCF76D4CCA56\ +3D9F9625E2BA783733DE9691108973AF66BDE07A7E8854035B972387BEEA4DBD\ +4A2081CF:\ +985B3B945917B229B8274441C174B1748627F6A83986AAE295745694174928AF\ +8D6E3D309A8FDEB57F3BFB73AF2B776D13278028E7A7CFDD3F489AD3A46B2045\ +409683AABDD1C01CDF60ED850D4C918608ABC5B58C9BE3A438DB0D6D6B9C1019\ +C9498E17233D5092165471B0A1DAECE0A68104539FB85C51648176E8B7AEC1B4 + +1A11:\ +32A4716E0F397B9340565530800F691F9E457C2C5F8ABF0A8F62971B89B43584\ +EFCD7EF66765E8BF6B84163D914364F855DF8F6C82DD49BEF76EDB1397257215:\ +360C8C90CA0B2216B342A9681EEF05BB8CF8DE2AB8F0997C97738AA32B88B956\ +D94515E35FE96238974AE8A8F0164E0FBE25C1161D7A1E9D170B821FEAD5A3CD:\ +4772617669746174696F6E2063616E6E6F742062652068656C6420726573706F\ +6E7369626C6520666F722070656F706C652066616C6C696E6720696E206C6F76\ +652E20202D2D20416C626572742045696E737465696E:\ +DADE975E4B9FCE8E3010EB1568FFDF1BCDED9A454796A0DFA6F793093A2FBE25\ +813FC6EADC4225:\ +06DE6646853E49A067C85492FCA580E49D286981CCFDC4E13B5642489CC19E80\ +3A69116BC2D75CD005B768F3FE7AA780BF7E5A2A3EA53085619946DB4B3E9DB7\ +592A8D060CDF185B3AB2C1BD551587EA8AC3745FEF60D945387B27C2001CF7A9\ +EAE9A086AA58B769A59CC4D09BCF9E100ED630EE44889F341C8DCCF52F003CF1 + +[RSAES_PKCS8/EME-PKCS1-v1_5] +-----BEGIN PRIVATE KEY-----\ +MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAt1wZLCQfj0PUKyhr\ +fWhKMm1DnCH+sT6xKHwPiyH1UTbaMaXjoKLKdfwK42UwDgJHGcSfQ9/ZYjj97o8P\ +8YiBSwIBAwJAej1mHW1qX4KNchryU5rcIZ4tEsFUdinLcFK1B2v44M4Z6+AwBTtS\ +Kb4KbbDsY3vruqonUnKa/wxxIhzZdero+wIhAO59Gs349up2k0gUJhwl+ght6JOs\ +cjb84p4QGQfob0EvAiEAxNK6zZ/S5MDLsyq1sVLOXRPc0JvBuebDtitKwdg44qUC\ +IQCe/hHepfnxpGIwDW69bqawSUW3yEwkqJcUCrtamvTWHwIhAIM3JzO/4e3V3SIc\ +eSDh3ui36IsSgSaZ187Hhyvle0HDAiEAmIKQMDlgg/7bJV+gm28s7qMpWyFfT+HI\ +oGFH/wROJlI=\ +-----END PRIVATE KEY-----:\ +A7AAF7FC80A74D35A163A575173A094DB366949207150DBFFF1D0B9DB01A43:\ +77BA577E606EF4A69F7C66726923ECDAB4EFF065BCAB972AD9EEF7478C09:\ +AF1F80B3057046EDE4EB139FE4954141350325E0D8291D1431F73FB601F57DA6\ +05D986965EC3B141E7BD467108EC29003C7F56315E11FA89708588B7A562A738 + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBgTAbBgkqhkiG9w0BBQMwDgQIndH0S5IM+YwCAggABIIBYPxUf3adJCBZMSwg\ +whFKB9mFbB++xWg9UxkyZwpUsqReJMloMmtyYqGhAVvR753CWAkSi/l4cUK9hwnO\ +zs0vbQcU8MfwihHed61SwDqVHN2gp76KwdFtXKAsPlQ2WHBp2azO4VySxIYu8yMr\ +zpl5o6dnKqX9p0m38OcuMOvWiWjUbPdtNKPP9/t9xUY2dYdxoOJ02h2dWRH1bYth\ +jXFD5Zf0dgv958tcsUvCd6Omn6zyYvm0k0j8XFr3btJN6msWALYadCN7QrrJDsZL\ +eKD+a5eu3AYHA7Kk4or3AAKGH4LfDN/JsFe+Z9PO1xdxwwEf75mJbOyG4LQWkDP9\ ++pUPkPY311fcblEOx9Vin5c3is/+QnackDvnKjwU7JhP7mLHk5sRwDVswN1DPA+c\ +mlC3M8/Bib94M3ts/U6EjE4r+JW3/bVsVslKelJ2zOEiqt9HK+wZBb38NgGWwrBZ\ +7Ik3umA=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +6ECA65B7FDB0986062B70E8C68171DCAF736:A83BC3A6BA075EDE453B7338CEE\ +83BB8F5AE8B5968E3A99462181DC4E73F943B66E433F43D0E8E6F08DA14:\ +1346A7E48F0ED39B333041451A0A293DBD8E1C906B21200A1AAC228DB8C9FC0A\ +9A24DD2B434E2279051106BD625AE24DD1554704E57EC48D659AA3E9515D2B41:\ +password + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBgTAbBgkqhkiG9w0BBQMwDgQIjb2KJZiMO9cCAggABIIBYHQXbyKPzgfuHZYm\ +b81zMQ7Kk4w5O+3XrNpFjSiRppkx3stZphGJ6vtI6NwDKb7mCf7arfeCzMIiF+gg\ +n4j27huU1KRl8SRSD9qaLaqrYrHOCpxnG3owavB8LtWacGQq3tD1/pyw/DXM/H3F\ +bdOd4q2ByvvltRAREy+0PjAwRaGBCdF3bEUP+ikIZ1zUUAhGalil1H8pPTf+8W04\ +/4NvlCyhWPqNwUEZJhFzzO1IRrAWSvn0PZAg0CHsNGHVwCRGB5/MfdEvvn6D31V2\ +wDFR/BzgNmPo7jFo7x83C/RRP/HCHHMhfTg3LHxehf1oCGI65Pj04PyHkYSNmyXz\ +QbQoP/Z6cTcbC250Q/2AT0xPamF9eAnhAcvu8QRq7M7wQQtW1z2+B/kvA5mf2020\ +4mGslEX3Iz08lZcdMwghw0xwVBZW+VCB1y07JXE8KxAhlsEj6aIbwg0KBM+d+npX\ +Ddyijnc=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +64E8425A6B898502A081B6B78A0546F4BF2DEB85E187ED:57893B2A6A4AA7863\ +785AB8FFA68E81F3239BDA659E704833319DF5E3377AEC911AA90F205B1:\ +871A94A51ED756EAD36EE976354D2D6DE467CA5B8C9D198FAFA6D5B24BFA674A\ +20F89CF53B85F75F7E17481E212F2BF543AEC428B841C79E3E36CFD75BB7CA8D:\ +pkcsv15_isnt_very_secure + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBgTAbBgkqhkiG9w0BBQMwDgQIbcPIyX5hozwCAggABIIBYIL0VCCWjld4Zk1N\ +0s3+Uec+axsZm1cuOEm6KKqiSDUPA5bIwWJFTksEWqEfspq6VkQVGGD95hQY4a7u\ +PflXcQ2PcFeTe5vvKNcQ/5lnSY56gidhFIHYEUQMPXjzkruxzbnLMBN5Cc4oFf15\ +YnF4B3uZjsb9e0k7hb1h7lSbf1/Y2du1xdbhvXhF3q/uoCsrnxeGnjKIwesA9skS\ +U8gdojj96STbZl78HZ9vbS+RP9Dtg73qCQkeWnMz4pES9GZ1u9HJ7Q/D4sU/NaOq\ +Gg5y/WW1oNqI6Q8hTtat6oWE0pBnD5q8xuovlycEk9PJbh/b4waGh5Lc/CFUV75b\ +gxAbqn9OIzeXVZsKnHU+JQpgX3x/3+dGHKGd54w1N/0a+N8YUNyYXxyDlU7f4zNp\ +fuc2uwzfxFm4spigfxTTul+E90SMMZOIVHSp58cakq+ibeprcp2zMJcxO2EpXfas\ +GfgFhK0=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +1548C7CEC500A26A59D493176E3B6ECECDC23FFBC485D75E4E20C978AD14F9C2\ +5CC19021C1328B1A061E317559A04326628222:66832C587BB0FC43A7380A:\ +022092438BAB2CF4A6C50D71EE39419E2E11C9E9644E0B9C2221EF81098FE318\ +8E9BE0E6E27C02A742571C0BD757C6B7F2160DCFA9A734AB6E90BDB0EF27DCD567:\ +whereismymind + +[RSASSA/EMSA1(SHA-1)] +5:\ +BE88E0EF4EC64120FBD9E0CC62E931D0DCB02D7FBC59FC6B\ +3E919777E5178DA0E1C83696670F02DF3166D8ACB5B09A15:\ +EC1C473C7D3ED0B090C7DEC82343B1E3C5E6018947DC6820\ +17941BA4754715A8599D779A340FD85FC6613A1757D5B51B:\ +4920686F70652049276C6C2062652061626C6520746F2066\ +696E6420776F726B20746869732073756D6D6572::\ +9F35898F6508FB66FBF266C8D057F4FA9FB875213FA62051AFC62ABA177D42F4\ +B37FBC6F7236B01F27C1A856EA2F8CBDF88AD9FB4FEFDE0065BB7FE6F8978225\ +074A8F220C3D328C50070A953BB4E852B3F56E84594CD289A14F8F8717F5A4D1 + +4F:\ +F1066D3E8128C009B795BBC5AC0988D73A981C108E631AC43424D63E6C964FDE\ +6B0E331D4A1FE6CEF3B744607723F4BDB1F9683D69651813AC03C757ED2412A1:\ +C00F576BC6CD63F75ECA04FB7FA5CABCC3287CBCBF99EC456CB75E9F56E2D20A\ +7F8C99BE857FA9E819BFE02C08D0405CC5045BB97C3F766F734390D881B27DEB:\ +447564652C2077686572652773206D79206361723F::\ +AD50D554C24FDE2B4D312C64D17B25F471C32CF76E54430BE37CAD31E6C961C3\ +4957AB1B4D1D2AC6782B4A979118CF7FE58BA40FB0900C2C2F5BFF26134C9489\ +136EC16EFA0E82A9B01F1C6AE744E4D4C4D126FC6466AEBA86353E83D69065AB\ +A220F460AD4AE3AB3083732290FED091D4675864EBA47B0DCB7C858264574360 + +[RSASSA/EMSA2(SHA-1)] +11:\ +BEFBF638255034EFF995CF15A610243A48784CEFB89CF10A11982F5ADFA0C5F2\ +49B373E33900A1A4A957F38A1EBFD49C4C74A2D7E74EEF2168F18424C6B6A843:\ +E538D5D8FE4A5800F16398B7732FCDCBBA9D397A8E77A67204458F0A89F13BEC\ +8AADE35E2346F489FF7005398596BA8A496D48D114BDBCC6D9CE292EE6ED7C93:\ +447564652C2077686572652773206D79206361723F::\ +4B9BE36BE0AAACC62FFA857A34D8032BE865C0D757C7A7827AD5D5C6DF6C5FD6\ +FD32A2EB0E851A0D04258FDBB94849CA2AD78FFA2CCC56070219B8AC198D0F98\ +165956D027A6D0325619B8C1458F01EC6A34DA517D89F3F3046AED0F169A2797\ +442FB6E586C6099B7CBE4F07682ACF751E291123AC5DF312088A9D84A54A7D54 + +# An official IEEE 1363 test vector, sort of. The vector in question is using +# the RSA2 signing primitives, where the output is "modulus - signature" if +# signature is greater than modulus/2. So we just use the intermediate result, +# since Botan doesn't support the RSA2 scheme +3:\ +D8CD81F035EC57EFE822955149D3BFF70C53520D769D6D76646C7A792E16EBD8\ +9FE6FC5B606B56F63EB11317A8DCCDF203650EF28D0CB9A6D2B2619C52480F51:\ +CC1092495D867E64065DEE3E7955F2EBC7D47A2D7C9953388F97DDDC3E1CA19C\ +35CA659EDC3D6C08F64068EAFEDBD91127F9CB7EDC1748711B624E30B857CAAD:\ +616263::\ +A6B496F4A802AF9092F1F561931D84DBD0B943EF34C102B94DD51AB01E1054BC\ +0E0572A1FB2DB034569883F382B74E449F6C80C4060FBC0FFBD3A9CA9D66685B\ +90873007D207C1D64C692D0111157BB976A4551E72DDC83C767A9D75A4746C51\ +9B73CE52C2BFBD1C3C431D254FE8BB4308FEA486787F239FD2944390DA49DE45 + +[RSASSA/EMSA2(SHA-224)] +10001:\ +FBB75326D3DC76F89BB46C6D66A8CE0F0E2167309750D5CA6158BF7306DA8C6ED2D0E9D62524\ +8977ED06900A5C23CC1F:\ +D92E794F850892F13B6CBBCE1C67E1C670ACF8DCF8DEEA2DF958529C1CF5D89E30D5D05787A2\ +5602AAFFA5B5007800B3:\ +7072696F6E636F7270::\ +0EEA6057C2FE9892BE77B7A7E38E00EF2537D4E8EE7F2B856CBD4B29C7B5E38299D02B2A845991C2A8F4AC6BFA5E58A34139716B20CDD27471F549037D07DB76A02C3372AE2FAFDA3BF1414E9BFF71C0DFA03AA0409D62CC9D5FEEAA7B42D52A + +10001:\ +D620C17FD01B4B8986B2C4934F2B78CF9EA43B862D70AB88763E2B133D7398E4E6633D8DD408\ +05D02EC5F2E59C0EB19A85B87D2F2EBFEB2E8189B2E21C71368D:\ +E0B20464041EC9EC74FE86CC00D7191A1F6730E05C80ECE6B7714CE158ED72BDF3215D96E3E8\ +ADDB4D8123B6006509362BE8B2EFC853C959AAB0D21C09A2B835:\ +7072696F6E636F7270::\ +A10AD2439FA7F9638298CAD2E8BD18830A580555F0D0A71CB2DAAB2392ED61FB6C3659FA706D434C7F373761165580D9E3B4B72423AE3C27F71C53DE3DD812BB064C3F52A86C2C5E42BA10BAF4C90E2064D988B56C59186B48D16B151FFDA0859FE41C585D388884EBF6B2E570A69F5EF5B5D96E005BF353076662F7697DEA3A + +10001:\ +E3BAAE58893F9DEE6CFF0F0551AE0C95B1E8EC0F3F7C9E271C6DB3D84A24EB37FF785425FE90\ +6D9B9A4905CCAAA6CB95658635FB58BAA6691383DBFC3B05E403:\ +CEE7816F245FE20C99EB54A067340ED98A2003958186E78E2F9BAC8242E6F894FAA2726374E8\ +86CB3B718399BF5DA67B2558E086993897BEF2F6C580C7E04201:\ +7072696F6E636F7270::\ +85EFECF3B1EEB4386A61AA4AB0D0A4335F64C56C24C258AECEE4CA8547638F52858FFB7842EA399E3EC97C882891E9B52A76D3A4B76BBB843D6165EF06181BC887B342900C0EDFD42EC355967AD052A76A760EF2130499A24FD9A059C79C334C586AB44C400278C5DEA17BFA9CC5127CBF392DC74B65458627A34437A8AE9FDE + +10001:\ +FA1CAC0BF58B08369A927D3B2FDE1C1F926A2EA31F26C2AA49EBA42DFBB8661E79660928D476\ +D5F82D0C370BD6514F492A8D4AA95039B0E5D1E5512E257532A0AC6BE1C294F75253A2B2255C\ +7B7A84EC7D0E0A34BD67CED0E9BCC1897B3D4897:\ +F6366AEBC742DA02A8B5884B0AF4A0DC24F8A7652D1F30E5A176C8ABEE3AC5527429EC62A3C1\ +6715A782D4BE9B8C40721909F4B5D466836050C637479DAE39528DC284ADADEB0471FFAB90F2\ +368784977B8F21F53BFFBD4D065DBDC19CBED061:\ +7072696F6E636F7270::\ +7F721D5DD07950287F217BC11C130E32567BD45E538A1FAD278CF25A66150448B486BCDBFC4A\ +D3FB81A4EFC7E6081DC6613982940D1149C514AF67351B9E096C8977B5F9776BFEC7CD70C56C\ +666C49BFE9618F4ACF281F6CFC3B2F5B91BD7CE3DBBE643EF0B5BE9CB133CD3C22A2355CE87B\ +10E538A4AD3A098CC7E7125409765F22B5D78D5F3F0603EE6721C68C2D5F22C84B7714067BDF\ +28B82091CD1B9943F9D619F501F5C0D418425B63AB2BE2DB5A43BF8455E6ADB7B60C86C606699D69 + +[RSASSA/EMSA2(SHA-256)] +10001:\ +EFBF3A50D1165B053F78FF95134BA3AE221F7ED5E7037675B633557899978B154F1E4A505E3A\ +3A10247FD4FC3F8698B7:\ +CA052EDE74D1308CE00551FD8E9DE9BC5F9DAD3ABFB6EDF14820480D3FB9E468A02DFF23B6D0\ +C0E009544091CEC9108B:\ +7072696F6E636F7270::\ +38FBB52FF41301D176F11DD6A536AEC2161DD783C455556CCFD51468292C8C68AEE955EE4947\ +DFCE5D090A5DC81A7ED925623DE7C52A4872303002CD89A7A63798F29D13337274AE0F59886A\ +62EE58FDF73CFA29DD7B1BF4CA8A23B803B68E67 + +10001:\ +CCEAD3D62F90C7E9F3E8E59F8989C4FFDD4921D7B6A2309B967CADB0B844362D4FC9A23A8ED2\ +8DFBF908A87FB04D880D7C1B68B8AA0B7CB5CD46656328189AFF:\ +CD9F8E596AF2C90F2811086F8D3AD8EB35E83593CCC09ECD57874DC98EF5120CA2F8EEE1FE73\ +1220578CDFD5CB31D019825904D8FB7811CA99C017C1963E1D4B:\ +7072696F6E636F7270::\ +1891F9604BC85FCE085AEC5C8221D0E06119A5B1E1D399764CEF9BC732F01A3C4A29D31FEA49\ +72EFCFA749A900CC8FD1238EAA90B7B04F0A092BBC90E5C01B5B6F7022193290CD2237F6509F\ +84150D542842BA98157D1C69C067DB357F52013632F6961533D7672D05394E76C219EF532ED1\ +BBAD1A5AC7AF5A0CE36C1173A8E1 + +10001:\ +CC1D8027CE1F5163B3D5DC6DCC63DD14E5685894437A1A8734CC4AA4EE5CC8BFF96298D4FCBD\ +2208C17C3A069D0B4E1EE6B43A553DDBECB2ABCAB7F0CFA9CE01:\ +EDFFF64FC3E0CBAD1F36B472E868B0317DEEF27854D40179FC875DCE1C5CE3D3BADE0AFD191E\ +4661B5931844C56C53E53409B824DE0EC24E2C7C04508F022A6D:\ +7072696F6E636F7270::\ +86E1AAF65A3C352A514148D8C3B8CBB77E7C59CF001E2AA7850CBBB703D2684160A362ACE398\ +71EA60207044F9E266FF9BEC03E647E0A30B74CF24B45161619F1DBDDE0FEF6B491337EE2D66\ +BF2E9E5B5BB8E4C568D580C8584DBD4F758194523A34218631978DAF8BF8364D6C4399063DCB\ +E866029E6418F4D0BE384B66AF19 + +10001:\ +E92BE18C86C96D98C8C47C9C279C42EC136D8CAB91F74DBD383611DEE72977411CDA0188146C8\ +9CEAF6AF4674CBDC56D0045F94033868EA7AD2871C349EC885FC832F394425A70BFFE5652A569\ +8AB3884A0780162A4B9E6DEBF3D091E1D7BE29:\ +D18F7F50ECEDE65887B004C7A9D715F1DE87D8FE37A14302848AD1C93A0502267A6A0E446F480\ +9F6F8FE43B934A456BD10975E819B7F2037EAB3BAFD5E699354B8B7384467CE25D80F8FB6F231\ +CBE28D39E55D2ABEF2107D719D0A758676D7B7:\ +7072696F6E636F7270::\ +AB183E642A3A50775FE8F158DE2085CF02C1F78A55DAD193D1F0F68DE45BCF8AE6812CCB81D47\ +6C27D4ECF63D9F1D9E9C5EEFA269CE214AF5A8FF24D933DABAEC2080491DA4BBB9654473C06A6\ +BAE99095C247515611B5A45D0E02E8AED9D708D20E823288D5761ECF80AC72D307260B9443747\ +4923AA53D34058147709CA35105B98C7039D1ADD75F0E38FEAE7E3121331937C0A01399177698\ +7522E43AC1072182C98BFA3D28940D03B0CF0533E41A42DC574A835BC57D77396B43D4A007A4 + +[RSASSA/EMSA2(SHA-384)] +10001:\ +DEC98FD436DE44985FDC398C4EDDD4356AE3D95A2A7CD0DDF5CCBC47C35405F85F05599C59A3C\ +CD143E5B663C4435F29:\ +D2556E2A05CEBC6D61F7485D1F8D4CA410D2EFB65055D461AD1D28031B4478261C5DC5C9B58AD\ +C7C4C609C7CA0A30F15:\ +7072696F6E636F7270::\ +36495268E4297C9F416915F3F9057C1B772FE6ED204995A2C30FBBDADEF3CDCF38420E3A11014\ +1BCC8BDD06F688B139E6D8BE97CF3201E48585B4391CE9CF2ADB91B5C20991B2AFC5C6A6F5E84\ +5E055971631E066391D962FB265FF3D90F3530 + +10001:\ +FC488F1438DA425D701C068382AB37E85798CA4D7A6A151A20C7ECCA84CDAE3EDD3AC22F6ABF0\ +01107DA6188382F0CD8B5B591EEF45DF60C016FD22B6AB91F97:\ +E8A7CD9F6BE666AF5F10A81EBA40BE26B69A20A6F090C43035268B65AB7742D1410FC28F16D18\ +090F776E7162771765A757F754A8EFD75FAA83BC9258ACD9999:\ +7072696F6E636F7270::\ +09EFAA53EBF1FA0A23B84EA68DC7292F235C7F2A2EB555FC85F73A11A7A3785AF4284BE98840A\ +4F6D289647B04FAC1D867EE0EFD1E95E060FE4D2D766D11B03E678607E474621A0F5212139146\ +00977E8F3F31FB0E678D1C79079ECF39F5EC6FD2F62480C0C3F1DCEE06139ED661B33A32CCD1B\ +213F7557F6CF87A0425BBE88C + +10001:\ +F74FAFF1F8533804A2ED81EA92E9872505551954DF623503615B558EFCA368D32C7CC10B39679\ +160E0FDABEB0DDB874469677C2DDF45E369FAC599F4EBBCD5C5:\ +BBB2824D01BF3A3820C349D77CB6761081590767A8BD5753AAF71893C9220080ADF01D89D5217\ +FE714FCAD68AFEAD388F103DA7273AE2A67414198CE7022DD29:\ +7072696F6E636F7270::\ +858691CD4D14CD74841AEA3CF1564734D939CB7D8B4341BA1F74D88FDA993761AA5D850B258BDBEB228BECCC0F6B6C0EF96A3DEDC43A7078BF05D9FF4EA0224184572DEB43D77F0C9162CE69192EE3E50402579317B56838AEAC091369F216F19D271E7141149F1A5760071A65F08515D7226336C9C5EA6CF35691B1C92451C4 + +10001:\ +F6B23AAC1C0FD29065D68C3DE26B5868E7ECEB7CCB2AA9A2DAD4497678E77547AD8BA78BFED51\ +3D2C303355B7850184A3C6DA974322ACA6CC553393BD532B8ABCFD02B961A5CDF81ADBC9F5A6F\ +A36D55652428788BA133741055635911595947:\ +F2C5190C41D49FAD95CE70CF1CD086F32F9C154E856156DC95007215B2D1C01F485370AB4A091\ +C919168732C99FA57BCF44A6041EDFC878EEC65EC54C0360A6320AFFEE19EFE7A4A0F62137A29\ +98BACFD7D364320FA178C8724EEBAC65D0E7DF:\ +7072696F6E636F7270::\ +9A399CE7D50ECA7184290BE01D43FF7D570F0A2232D385182AA068EA0FB097691C197B25ADF90\ +9397CC0648AE74029DA3477DB95CA4F3328E5E4CDA4A4BC67BF1D34020C8D9AA24B56861B0365\ +92D207026CFE4AA04B0B2ABDEF3911320D948776304FA648B60A18F7D07018804476E904213D0\ +9B1E99C31E66A8F37B4BBC1A57A753069BF9024C3636AD3690CC1FC1E6DEA4211F5E49F7F1DBE\ +2B94C31C19B0DFFDF41949D1AA6337BDFF1336486FFEF1369C3770C837FA2E1526B93A64CBB2 + +[RSASSA/EMSA2(SHA-512)] +10001:\ +F37DB2223CC3E4FB8D7FB028992B01A553CBDBCC700386BFA1A21422F1D15BE3E6E0CAAB5A7EB\ +5F0A58E4FDDEF70AEDD:\ +C490D201792C50C9840EB241B736093E647E27159EBEB336295985847E866FD5C44103ABCA57E\ +BA86AD3E6159D485755:\ +7072696F6E636F7270::\ +7F175F5E66601757E1B0ABC051602FDAE2B652B69B551BB35F8C6B295F580DD0D27360E91B8D5\ +3184D3E1C1606690ED84EFB9C2A5122936BB94C4ED7FA49D40195508499FB87249BC1FE07DAB2\ +17970EAAB46809BC6925D3AE54ECF6F62E76A9 + +10001:\ +DF3B69AB64C8CB728CAFCC27A18233789AF1423A6D916860A4FCEF21FBA4DEEC43DE4A8E7BBB3\ +272F55FEE50565BB18A1B944B73EE20F13DAD9444BF9225505D:\ +FE7079379535E7BAB62DA87263F089364FAAA27796DACA16C7C82D29FED8FFC93C1E8B3B65431\ +4D336AF98932708EA37BDC150BA749A28DB4F12492966B51FFD:\ +7072696F6E636F7270::\ +786C58FA17D5A5A5B411B0A85F3306062D27978B84C9ACCFA79665E1C951AFB2746CD0FF03616\ +0BCCCBAAB15E7848E8E8582168804B0520867AA15F44456B018051AB290C9FE72AA121E5A1CF8\ +8B761C9F73B81F329B76DD2A4FF2A7F7905418B3343136C524089D368948CB9223A2FBD35C14A\ +3B994BAA333F5CFD60BCF47B8 + +10001:\ +FC3439077A50A7A006CD1077683A5A5BE8E4B9B66CA0AB80AE5DEB4315D746DE493F354A3E172\ +D080132BEEB7F17B80CDC10E7301289CBEEA18A80D20F0387FD:\ +F20A00C5C12DB0F8E57C98DF1F69F76F14BA9E2137FFD7AC228DB02D2EFC1D574B9DA545A331E\ +0D906D57075FA15B7CD6ABC58362703DB9E9670709D33C9C1B1:\ +7072696F6E636F7270::\ +8DC903239378EA69E965121FD519C85D1D136D67126626EA93A31EA3706410E420984A6443AC8\ +731AEC98BA412CF4E2B39F2BE7308065F7BABAA15D25E126C996D7244D499C5E907B58441426A\ +407F001F62AAEC4274EF84AAD979FE504B05E277CD1B06A74DBB838EB7A20DC34D19B2CAB5206\ +351AF53BB968651CA4116F54B + +10001:\ +DCA8E48536240777EFE1290C0C89DB9492B33BD5767F7B8C12BC9659D21D35D253C054469FFC2\ +574EEED15509093B7606C59EB108A4F4EF4576BD84D2B61922A4CD3587E0A92D3A95AB3CDEE4F\ +31410CB1270F369E9E395524E22AD261609A05:\ +CAF14E53927C9C38D0EEE7DDA60162B9FD3A270EC0B8B301BAA41F880527FBF015BABE0413DFC\ +FF22338E8E1FED4F2026FAF720373F2ED955EE5252F486B13BAE0930E5012D0149B1780053029\ +96D967370C272513E20CAD5721F49A46869E4F:\ +7072696F6E636F7270::\ +3697C05A657A8904C792E750515BCB11751D2D4C4C1460FA6055A10A2C5F2320CFF2D82C0CF08\ +6E2E213CF5C4A4BE890F5C0A9F98789710646A500DA83333AE1CC6A24E99167B97B7E7EC06FDC\ +789037DF23F6FD1608695643C7D7C6462A0B37AD926FCA364A826DE539CC89419C99397C7FA1F\ +1CD244B0C7D3C27E77B6A4D4806E749B1291A23F8F3E6873BC8DE349F871530AE11CF4EC42E27\ +B6E3BACAA3DD6A40AE51463EDE39B510E94F0A177328F868C91B5C35F13AF0FEF0AA4AD88B4D + +[RSASSA/EMSA2(RIPEMD-128)] +10001:\ +C6C21C5648183B9EF1AD5A7FEBD163C247F324CC8E4D1D57604B1CBF2E7FD20E501ED4E23C984\ +A19D67B006A46131597:\ +CCD27CFDADBD21DFE2E63324DA85389CC9DC4EEBEA55505E271A8BEFA966ABBD9AD57B714B09F\ +580B9E87C6BAE1FC2C3:\ +7072696F6E636F7270::\ +63F9A46002EEDF74A3B21A58AF360C78A0389A6FA469CC6C7F3F37B9298CB666C59CF993CD3EE\ +741C8D6896F61135D2223C3D02B0AE001DF8EC270968F8E999FFD7575F437747E2C0B4181EB3A\ +CFE51ADAD24924D75E86EFA2DF4531FFD1A718 + +10001:\ +D9111254AD4B5B0403A9E3DD027F9C121A48A4B2ED5AB5F47E3F9C7EFC7CD1956AF1079EF2D78\ +B80034E9AF2455FEAEE955D718964E89C7588992B1E6D1022D5:\ +B8E8CA6745A849EC7F3471C1C83EFAD8AE65A8D5551A6924B45869D40ECCAE5B784A353F84301\ +EDC6A8365CDB25768B4BCEE67382E05E15367DF3F4274F06599:\ +7072696F6E636F7270::\ +38CDF4F149F7CAE46ECC24C32F98F30A73DA6B57F0281009493CBCCEE2B902F66DCCCFDEBB142\ +2992BBB4D62030D24FF6674C27163CE4015A3BC899CFE6A01ACC06A7E0CC36754ABFAD8D19F5E\ +7372747557FC9B2F5F8F19563F33AFD0D4E3CAF639657922468457E44032E72E865517E095B72\ +8E8ED3169D37B45374E53D692 + +10001:\ +D130C34C595669CA5711EEEFE6176671DAE51D8841D0571A70C9F0B0A3DC9A7409B0AAEC4BE23\ +37B45163FC8A41AD5A16AF72462E0FDE6224D15082AEFFB5BB7:\ +E4DE294D95CD57AED2F82B8487FC20FBBD3A8E5C6A35D9BAF5C7DE67AE8FEC8BA82634A5654B9\ +3340D447F62367A861F10D1ED976D2B9CB0C856336F514BC301:\ +7072696F6E636F7270::\ +9CC6743EA34FB010B0B64975E37CF4C90BEDC063B9CA90F543CCA616C67D16A8EA0883DCAE11F\ +BA595CA8D42F45DA84532E8173149A55196D01E45588FF372A1D95DEBC58353B3892810F43F58\ +A935E85AFF87B46BCB77C6176422E887BA3671F44BD6112DB0E4A56B44BBED76EFDB01B079C43\ +FE9AD593E65162C9FDB92B42A + +10001:\ +F63306C54246545F8A552CA5E15BA425F1B2E096D8FFA17E8E2DB786FBB50D2D3EDC94D676955\ +E69B98A87674B4CBAD9651A99BA4D53B78B60F3A9ED4C871102D0E3A3576009439D55FA412191\ +D55F93EDBF0239DA1F60B5B68F270A629642B1:\ +EC9F3A07B1783A510793763A9D1B8F190E4ECA35165AF643E9C8365897D9803C3DE5BBAB35C37\ +D43475A9E4062C1B8A2FBA574C4C44778D75BA3706B4242ECB976EC0F58D0D04CE4D9B9E2465C\ +0723B3F0970F04C8E8236A9FAED6797CD87401:\ +7072696F6E636F7270::\ +3D2E76A438D4B927C4578B27EAAD666CC041D4495A14A462A530BC81AF115D961C4CF840E9B14\ +6C83BE619E9D7730ACC4589DC17665CB4B10A19E021BF4E5BD0F7A1CAF720BC4677B809F6E2BD\ +6A15B94590A5DA3F03E83D819B1A429F22D595D2D042468EF602944508915C88480AAE928ABA3\ +2B4CC8FB4C7125496623912FCEBFF28D8DB33CAF008AB6B7195019DF8BAC96E23238EA8EC60D1\ +C9527D91EC4018AA23A50B8B3998BB70006EC441334C1301D0A47C160FCE995A14831A737681 + +[RSASSA/EMSA2(RIPEMD-160)] +10001:\ +DC6B9418363C6D83813A2588C0C4DFE5105F3A7305D5A0539E157379DFA832D7F9C59FD8FAD36\ +2A716D111A374D6865F:\ +CF72057C7ACAC7F030000803AE1EEFB72C3812727FF304FAC9B086C2248BB36936AC9200C4605\ +BD7142BC3C17EB144E5:\ +7072696F6E636F7270::\ +3D2F44712403CAD3F07AC10278811EF59DE6441522F323CB3CD1C287B233B5FAC7EC2A3398383\ +FCD4A0AF6E404392707C72B22CA1C503C6FAEE3F3E992AE9D02C38564173CB492C9ED2EAA9664\ +859A06EBCAC73836DC80F7282D604A43B41BDE + +10001:\ +CBF2B084B2F9A826A2A1E1C6C3889E5B43A906B6A773AC56F44CC06E92F36EB5F624BDC0E550E\ +25DF80B9720988819FA79675DC4A9D28E86BFE0D95EE2A8B851:\ +E56C1DB39B5B2DC6893D4383433C33FD78B1260660B7FC2313B9ED808126D685AD9F2EA7DCAD6\ +5B8FF78F2D9F2BEBCE9A3EA33D68C2D4A2995DA2DBD50E32951:\ +7072696F6E636F7270::\ +A10E2A0C3743B0C8E9C4BA0AC71A60A368E98F0BE67623A22FBBE958FB590A31E2E07B016E55F\ +EDFCC8472F9CA002BC6F0A107FD77E839D77D24E65B48AE6688AA1309C3E8727C62337792DD43\ +0FBA8ACBB1B3F730C8D316F66683E13D892EA35E57E145E1F54AA0B786E19561BBB910C4D7997\ +D88852923C5D84DFFC9EF8644 + +10001:\ +EBD673DDF90D8CBA51137B6F81EE230365F912C58B4D4792914C7FC8FFF9618CF494A59F31B8B\ +0DEC407F28FABF6F95360C8F42D2C1B4D8D485BE42A25646CE5:\ +E0AB6EA0A78039FED1A9192B22E0E3131717B79824DB21EC6013C34C63F60D1AD7E73DF2BA71B\ +F29279995EAA8C4116EB783199E3A0ADE2E1F597BC3A011C1FF:\ +7072696F6E636F7270::\ +2AAF175A74264765198AFE9556BA61BE30069B909D8D13C31B7EB5051ACCC2BCD80D51C0D0407\ +0A7C0BDA0E9C2F88E531D2CD0B27DABA850AD37F7B7390914AB1E40EA4C27F700D91C6F17D177\ +FACBD439A98CA75CD8B4D1DEC88A975A03C9727A75815A47909D490920CD9C9A7C7E1FBE63F7B\ +A724F4985B84C283176E0A28E + +10001:\ +F74DA54D764C5C4A5FA36661C976F579BD857ECB969B94078A16179B109D92021BFD8D09EFC05\ +B889874489E631F1132194FB5B7970A74ACEB17984C6AA2132BDE2C2C8770F63E36A85DCFA080\ +7DE2FA3DCF16CB34A2AC9A95078613193ADE47:\ +C71F05592CBA0FCA8879FE18C8A251C49386C45BE0A0BB96A60AA434E369050660293A61A56AD\ +B2D2B14A5DEC650539151A30007C2E5313298B240CD8C4DC83E93B1C8F9D74D622587C4FDC080\ +0D14C5900413DA7BCAE98C41E8731486D9D2D3:\ +7072696F6E636F7270::\ +86BC93AF170E1C26E10914E9D403FBC6B5CCD3F2B5EF2E2D94118E4DD024A82095EC8B6F71BFF\ +2CF91F0528CF7ACA12F2C74DCBC01D1DBD52A87A369AABE406F62F3FCC975826EAC8F56D3482E\ +2FD396D06F5BB1CFED3EC5B3C08AB318FDE17A7807054BDBE44EB0BDABCCFE3A627569B58EF91\ +FD8BC9E06B2EA40AE55E3C124418D6CD469F8F9552176B0229240660325E452802CEB3A01D726\ +9460AD098FB25A8ABB98F122F3ACB84B7158954DDFFC6FB3EEAF3615877D7BDE533CE8A6A8BA + +[RSASSA/EMSA2(Whirlpool)] +10001:\ +C29370B3C4A445B4E638BA903092A7E6110DC8B5317FCD1E0729110C2324FC266CD6F2AE787EF\ +67CB219AA8CC382C3FB:\ +F5489C8111D841E2D4FBCF7FA2A06ABBC451B730835D41786D3CC4AAA3B31CA63A6E7D3FD2C26\ +79272A682D1BA40565B:\ +7072696F6E636F7270::\ +79C185314A87A5518D05B68A26889DA466A04D66497704D8FD0566B263F9FF4250D214B1A27EF\ +D557D79C9EBADF08A6715183D0225D45CA81A643898572B24DAF7FCCA7856F36D0168EE480A89\ +E15836B7235ACF83E75A83628424E7B058A61B + +10001:\ +C249C71113E5E469BA2689A821439024EDBFF7E1C01378BA65E4E8FD0ED377D6ED03F4935C4F0\ +F203CCD9F9CDDE6B59D313A7F76760C680E9DAF0FB2C6A30593:\ +B9C9A9BDC0FFB402EA1996E46C51E654AA7CA62400FE0441E8DA7F78E4A70D00348B54F5B664D\ +C0DF24DD760888D65A81D4380D3BDFCD2241EDAA777F8A4EC89:\ +7072696F6E636F7270::\ +2B7BB8B433BB6696562290BFE540BAEA1EF89D22DEAE1B5EAC8EE950772D0AADC6234CB598CFA\ +9FB2179AF94D320A177A8468C5AB8EA7AD71A14552001FC4FC578E0A1D1BB5D862B35EFC075E4\ +9FB085F3195CB1D332CD07881978BA4729B1B3C180D8D2FDF63D3F7E0E9C6A93B1AB70323BFD3\ +203520F28AF06E1CEE43D6C54 + +10001:\ +DE2341F362821590F880B50B5AC864447DE5AF850BAF4D1B9FE89887DB107C9C94F4B978F6556\ +DE0D976E640F40590EA06557BA9FD53834AB3084A8717F9B91D:\ +CF5B9021453ABE9351007DC6F8B325F2A4FEAE0FDBB1AC667BC6CABCF9EC296D7230C2988ECF7\ +0425917718CB60B1397A40E5368CB68CB8B4C216FE7B4A1B6D7:\ +7072696F6E636F7270::\ +2402FDCA5051000AAB63E930AEDB1DFF71D8EB1BD0AEF2E9038D62E90849B9890BD5460C8A4B3\ +611C05F967E53F4E789DCDB0A1855BDA841C4DC92056B8B49F8056C5FD2651AD2ABAB6FE85493\ +31912CF0C0142590357964879E5C875143D589B5D7FD5BB210A51EE77F3447092ED2C6BF16FD8\ +935E9A509371CBB790B1AEE32 + +10001:\ +CE1C752C02B795269599B060A5B88B6D1736B0B61534F841C316FEDDA6F429BF517821C21F924\ +CA115A3CFC902F35080354D036026717A720AFF85B4F1BBDA360A2D98207E6A6933659DB50B51\ +CF213F71908E0841417650DB80B5FE776CB885:\ +D6B9456FE2A050A0795BFA09025866CEDF378D2124FAC433B07366E0B16390A2C1463333136B9\ +79C2DB9006681185B3ED23223BD0B96BAE8F1F3CE173F7D405CE79FCAC09C4151A012D84B775C\ +445B6BD8C836F06005FC8994961B57B62C8C9D:\ +7072696F6E636F7270::\ +7748BFC3043893FCFBF4CBDD3F9BA00F995DB6183C39777D4545CA57287EDC6D5D6B620AD26EA\ +EA1FE60F4B809831614CC4D78A209BCE6CD712D4D3CC71623962F4EC7FC8519E861206E26AA9B\ +0B6FB1E16D0816E19B00F63E0701189688214FC063CE6835D1007794AE86E23A515C261B54E5F\ +963FC519FD8F4FE26FBBF7A445CA379857CD037753788E1A278F12BE61EB62AB7099FED68E8CA\ +78F2A5D35E873CBEC10B612FCB5A11084AF8D99A85EBB8685D54FA4E4EF5362A421D760346F0 + +[RSASSA/EMSA3(Raw)] + +10001:\ +EC52390A18D0746B6CEED07F19FEA4C259BD24828E864DA60B13E6E125B21AC62B8FCA7EAFC98\ +E1FFF88909C250317C790254EEE922535C45A1D6CFAF3A73BBB:\ +B855A27256300A0DFAF83F8FF98FAC15112EE4A1498C2F70277529A4A968250321834347B5244\ +BC0E019934742993FCAA113DB15F6B24B74AA134600E127C8F7:\ +3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9::\ +0E5FEDDAABCAC45E40ED484C89742408A1225204246EF04BF0F5FC87CF97EBB68EB3911E54824\ +0B5528FDA1E1C6D1DFFC2A70480466900FA7524ADEBA694B291CDCDF2560D9D6F70364AECF20F\ +504876AA1DDB8C69897E52DE92A13FD9E4684AD9EB8256A5723B1CCD34D4E552D9E2A5FA8B48F\ +AE13AF7CAE023450D65731DE8 + +10001:\ +1C136DA3E140F55A5F07C1F314FBE3D97E4A69DF7456E95E4E06405375071405426D81261E4D1D089754D50C4C4AF42BF4D:\ +1F7303CD6DC61CC6833563E83C3AF5706E20BC7651257C0F890F2C8B1CB78554EE43715EBC1D026908CD78F56B489B33F03:\ +3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9::\ +01E6EF82D25EE46471883D373869C553A54E0C256968958FBAC41D79C571940E523B96494360E\ +EEEC45DA943F94CE44DDBDFBF141E8F7B251E44EC47B64DDEEE2873C4B78A849242F3377F135E\ +EFC9AD4658061F575516C7B19321A3120D0BB3B11BC7 + +10001:\ +C0E2F8859C52B2455C02E64F14D55CA27D91E802586702E028093D623153C63EBD03EBFB0C891\ +563C893E3DD5A7DF4DF7EB29FF7D4E7C14A3002FDDCF3B8617F:\ +FD058A73BB8BA46BB8F23BDA37BA33706BCA2E8B648DA3FB5D76A3C46DED8A2438A43A3E84D3B\ +5CA22C4DC30B0A607557032C53F6D95B825F18BDF1DC188EA27:\ +3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9::\ +B2D322A392288D260F4D0AF6A3412A3F11B97A141367559FE3F2BDEEF208E14F2987E63B5C6A8\ +56190B37BE98A36A217AB8E49862427851A2C0E3FBFB8B1A2845A14DF7170B045833A8B2CC663\ +F481432E9B4B72E1AF141ACFF368C8DEEFECDBB35598BD5B815C3B26BB496BCEFE5CA308D56AF\ +870F3D92CCBCC9D3642FEDAD5 + +10001:\ +E283F14941AC5DCFFA0A7C20B057885F75846966D15A88A02DC9837ED39EAB7D493CEA91D54F1\ +8EDCB0F8574CA257635663DD92B8881F0BCA3DDBEF415A8801B:\ +BB743C0E63157B359737BA7615DEEDF953B79CFB99A266BFAA05253F5E04051647450CEF0F7E7\ +15E6CA7A09A907B8F80EE99A4269E02714B9854C9B4D192941D:\ +3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9::\ +5D71634BD519BF992AC97451C3BD856735498D963A37FD4E5F36E4611EAC7002CE762607EFAA8\ +A50FE0A054084E5DA46B99AC242733444087F94D7EF0FE1B0297EAFE035D13B4AE75BEF37B5BC\ +DB2F38C2216320351E09D277B3D6AAE701236550EA44B8AFB6A75B21721CA5C780DEE26244072\ +8A245036385CF917310DA42D6 + +10001:\ +EA7D376F36A655748DBC105361285D9E2DD5A90F7087380EE6EA1EC931BEFCC76BD8FF1C0E9C2\ +05A4271FA5CFF3260BFE92319737CFEBCA0AFD56C0EF5A5DC404416F642E188A9574700687A71\ +937C2EBD6B4A047C4D35C901C6E28BAEC7EE03:\ +D6770E9C288C807D4E0BF8A4BAC4AA70E7A83E2E394BC448F0874B909C061392F4FBF51DB10F2\ +C87E117F242B222A31B74A9BD72522062AD87BEDE477D47A96A2D74477E7A9936E14F3488D3CF\ +620024A8EE42133ADBC7C49526D74804CD15A7:\ +3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9::\ +5559398D21B7EF94223BB1BFFC8BB230640737A3F6D1E780DC59CF23A188206C1BF85EF086FBC\ +9D44B76B70F09E86C464AE53301CA8F31C704F5BA0CA4348B505FAB3B0940FFD831EDEBD22F8D\ +1215FA1CD0EB8ED678A3C7D4C713EBC8EC613F5D9B4BBC2E4AC47E403207E43C79E8F6EA12E7D\ +B8FA08D723864EA8D9580A274E84E2FFC3C57F366ED0CAEC9790F4B7E82B3E8419CE0F6143965\ +74F95CA498DDB75EB23AEC063C2B81251895F4A119A3B579D56011DCD412EF2B24FA4725D5FD + + +[RSASSA/EMSA3(MD2)] +10001:\ +33D48445C859E52340DE704BCDDA065FBB4058D740BD1D67D29E9C146C11CF61:\ +335E8408866B0FD38DC7002D3F972C67389A65D5D8306566D5C4F2A5AA52628B:\ +45766572796F6E65206765747320467269646179206F66662E::\ +05FA6A812FC7DF8BF4F2542509E03E846E11B9C620BE2009EFB440EFBCC66921\ +6994AC04F341B57D05202D428FB2A27B5C77DFD9B15BFC3D559353503410C1E1 + +[RSASSA/EMSA3(MD5)] +11:\ +F8C72F6AD1A116B15688E6DDB4458E1CD69A21E4330AAB1F1024CA09AEA20C57\ +C1A1D3DFB612928E7FEEE51987D5898A24817F9A389A39A0E5A7C43CF30A16D9:\ +DDA05F490F538B6F09B2C1D14D85E66DC724D8B77D3218958A8AD6D1E9DC62D3\ +05A1FD010251CF0AD2BE511464CF33E5D8F7108E4E6E0FDBE0ED524A95DBF027:\ +556E7265717569746564206C6F7665207375636B732E::\ +7B558B0763B621830BDAF0AF9BD183A026041051579C303F351DCBC9DC168444\ +75D54EF5CCCEF59467015C4E4F8E17FF233BDE1D69B01DE46837884DFC265664\ +C5384E734555E5811259A206A05126EE70C2C1ED36A7EC2FD4F71F4F637EEF5C\ +833F92FAC30062434C43788DFB75B85BAF05227F5B1258CBC9EFF3F1D7BB9916 + +10003:\ +D53E981F3D9AE9628B5038C8E48CBB944534522E8293145A3A98B855C4BB091E\ +67493348454DFDE02FF3C7148E313B917A199415937407B4856A98E50A570BDF:\ +CE8671329A80756167093EEFDB10D2E0E0906BDBC58C4A1A8E8FF1CD2AD25086\ +8C79F360A357B7EDC1A7220CF698D0565385ECCC9FFBB89EE76EFAA6B70E8881:\ +426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ +723320616E64206C306E2E20416E64207468652052656E64657A766F75732E::\ +319F7DA1448E5BA7EDAC7A5FB422A401481E895E0508D1C0FDEDA2AC51DE1D39\ +913F0D412E6E6D9313141992A202FBEFF3BD333542C88F626457046190AEB16F\ +F2A499DF5820240A5248074445B2D54DDF0C298F57B61D89EEABE7ABC728D4BD\ +E82834BA594C2231F2757A7FCD047039D3A3FE220571F30C41B5C25FDDE4FE87 + +5:\ +314C5009A2E3B5B5C7C2E1C2A44AD98921F8005CD2C2AAB617F4DE5932FD5599\ +391584977B46ACB1020DE1E106E6B2861C2A6E0C980C151860967E51372E19F09:\ +331C1FA43BF7B78EEC60EB3627954A971FC50357F1ABDA7EFBF758793A75D601\ +6154DD9F5F878CFFDA6C5DD4F88BB5958C4D6EF4633DB0F3E578382BD69B2D567:\ +2831303238206269742074657374206F6620504B4353233129::\ +0484FEA19814279782BD0732A7A7E29738B2B2DF0D0D2928253921990B4F3908\ +F69B968FAF934C227FAF39BD35DBFD82F1C9BEAE66C4977E3AF69E0567635E18\ +A7D831D5C66A75AD8D80A6BC994EDBBE7D6F7FEC327A1E2055AA81720B336530\ +05C2CE87DF23E4A286D5A3CFF376643B969134C49E6929CC69A23E4137CE9AC719 + +7:\ +436D230A470CA8401CA047FF1AEBAFF72FECC04A3D085576866701D5B2108D7B\ +355E8AFBEF3A687EEB6FBFF7C1152769E100EC77D72D000D6460E99C68BE30065:\ +57CDC664033ACB369AD87F6624A1342CD57E95F1CA0B44386AABD1664B511690\ +10AD4D724A900DBA16A8F10411800C15A91BE59D10ABF7147B4C291B0B0DE3AFB:\ +2831303239206269742074657374206F6620504B4353233129205075752120::\ +13AB41A8252B19A23ECC3781A7AA969ABF929AA562418750B9347F140F2C6DEE\ +BD760C27F650D403D4BC692B1BB9C99B0A8CB20D75502C3B451AEFE81BB1278E\ +23A4B7F5C3C438064CFC25890F68ED689EC7815F015C018BDCE766EE3A4A1535\ +19020BEAEC16F56F5559B8413BF0C4240645D2D8EF69B023639B336F1A2BD2A622 + +3:\ +77757FAB85AED403810500EC7FF71C2D702A2681F4152757A6F553B3BFE264D8\ +78800D4D8021F95A425FF61153BBB9536BC67E92B5DA6FF752EC17B7F812A3DE9:\ +686C51FF0113EE267F13E63615215EF4988EF8EE5D519B41BCE5F405CFA73E7F\ +FD01E8B16727733A9F09F9E8114FDE3E6E40E93CB6B0D6DBAEBA9CE2368BBAFD3:\ +2831303330206269742074657374206F6620504B4353233129205075752120::\ +0F017BEC0E1206F2F7BD50500898EA57A1E798FBE0D8C66594F85064E1CD7FF6\ +FD528D562667C9B1D75492B83131CB1262906ABD657B3B15871CDE20F871D81D\ +E98CDF6FD87C5753A0A9E8C223BA1F1761273B9BF8756ACBDC0BD7E6E1CDCFAB\ +3C1722F1B3053ED85CE3CAA15A843112788E779E463BBF51BE3B51243CB14E6FF1 + +B:\ +800CE163A96B6457B06761B5D3869E44137E7213E39ADE143127E9A539E1B0D8\ +1B28C3B950E90F437EF6ED8B983C0EDCA9A63B0B995A06230769069576CE144C3:\ +92A8C827CFD05C51EFA0BE5C958ED88B9813948B99A20042E3F54A8FF71F2FD3\ +5BC83DE9A242CBB3760071EDD6980C3BA7204B5CFB625FAC1367CB2DC83200CB7:\ +2831303330206269742074657374206F6620504B4353233129205075752120::\ +38DE0D39AECE20C3DA94E1B869C09F04BD22C072B1DB012E986DEEA9E254A5DD\ +5E6A946901EFC92A5EBABE010603125B60FD594A3D974986F58F6FC714473334\ +27B1FDC960512C121E8C81F0354EB956698EEE49A4F989390950B679E03A0B6D\ +964EBA3829C52C989A1ADDAE430D600188F1A215BB306EDFDE6E512E23F113C52C + +5:\ +A9E8F0A318CB66175E30DA2291CD2EDCD9A48DBDE30CC6D4AE4E479452DCB873\ +370599E4417350FA1F70E2F9B918C2284DF773680950983BBE35743010439A9F1:\ +83BAD868C9AD825C6C6CADE47F55F4D89974B2056293DA9C3D867EC11147720D\ +F048357E3331384C0EE2F6AFD28B9B8746BCA799C8896190C6879C1F59BD1B363:\ +2831303331206269742074657374206F6620504B4353233129205075752120::\ +192283FBAF7B9018D464D30A428689046AE3E25A499F8E437096800E09F4883B\ +E72626B9C0B50E982C5D53B6C733CECB6FF5C3CC2958BCE854BE89AA1D166361\ +ADFC0CA4B23D7A5D404B0F75ADE3FB134C965E427233F743925AB36DD45564F0\ +7FEC46F424A61977645E0C4D275A2BFB65A403FE14B20210B0CD3ED319C9D31420 + +723B:\ +D7AFE0CDE0A05A44FEA97C7710960C3F1D7341279C025CBE16D4038C8EEF49BD\ +A81F1149AD31B33DE594C97431C52AF0F2D52198E3847CCE0AD02C5D6BFFE39D\ +52824BD671CE867AC0E219612A2AB769D82DCEA187E8AAA02428FCDE8ACCBDEF:\ +BA36A3D8F1F8AFFC57251452119236A532516ECBE4CF5AA6AC44533F4CA9995A\ +DA0FD9B0A742941AACA7FF0B12F2D317B046F5C3BC0609B519C4F564604D2969\ +19F677D590AF519ED70DE189ADEC8E024286D4C2E8866F7056E2333AF584E847:\ +47697665206D652073747566662E::\ +5C9417A66AE951AFD8900FF15463CBEC5D01DB8D771BE4BC35FBB2416D2D4D1D\ +89151E3CE6AFBC4F676627B538511C40EA1361FC2AE34DA5DE06C6507EF6FE27\ +E362830230F3B990AE26221960B459CAF308246EB6183FBB75A38A89A1A34A2D\ +D4466F18832917AC3A68AE63A8920FFC7F3353802D8E18F760F00B3BC62D5981\ +0F7F132CCB8C4A5EE2F2ABD6EC2A8FE03911F1336D70A4BBA00DDE153683CA0A\ +F730619C15AF48AC2021DF431C675874BD10B42432260EC07FAF5C2E93DE868F + +7205:\ +DEFB5C1A68C464B3190677215DD4D5098673AC1B510684135E5BF2AA8EF07395\ +6F29BE13C058AFD613308000261A2C90D8A8328AC2DCFBD65AD132B5D32FEDA8\ +FDF4601AA0BBCE72B56B1C01C65E6B2F3F1DAB6975574B70160BC2DA2F72F658\ +9FB9C35A8DEC519F7E4759CA4E71EB27C3CE37BF6152134B477CD8E9F5656D23:\ +EF363BC1C200BA863315BE1EBB8D0FBD5445D168BD8802D9E0DA108D4ABA276F\ +64C54006D180B53DDB655692740BE6FFAFE82565526E45626683C5CEFB768E64\ +6CA0348F5D70F435247775C5DCDFF681D955480EE5C41A2E739DDF27F321F24D\ +A4022998624D43FD566453C4603F2207A4CE906660D0D6EEFDCBC6B0585A633B:\ +47697665206D652073747566662E::\ +693E0EB1075D852FC14E4C3E54CC180F9B215A663C53AA85FE3F8777F25EF089\ +8871C922DE5508B7CD068559DEAAF1BB2C8FF590CDA7586BB8D8CD2FED31122F\ +E09A858ACE8BE7CDBD7DCEB1FB6E80ED4D1E203EA60DA5B4FC4127D3B649FE4E\ +F4991394F4B28AE8D2FF33A4B89FF8E18B9656137C43F4F950FB013882C1CCAB\ +486289B162256038F882AECFA6A5FC0B377A1B61F95B34ABCE4562805E614859\ +22B36B10C1DABAB069BDFE0EFBA0C44587CCB4FEB6839E6B2F7F07B2E90EFC1F\ +C8FA953FD56D603AE54458AFDEBDBDB99BCC29733194E1DF5DB9E7E63E993756\ +A043443A254CF4E41A171A65BE4DD3CF5AA4079F3AA69D220615B0BF935134E0 + +71BB:\ +EED87D797D13FDD31AAD41AC7F88FED35F6483D4AC6989FDDCB540C04E69E2B5\ +085FF650613BDF8B8BCFF09E328176B8C6E5E8608A6B0BC6EA2C6461BC060FD7\ +B884A9155FB7DA583F95EA9EC896AE8C678454D9D9337C9E21F658E6B5B2EAE9\ +A8477E7D2A3F9115625A1D429087C3DA4DC71E7C9A08A44C91697B564A8ECE7C\ +E7BFF1C626F6C2D898E512CEED855A64090648FF5B71B385B551658B04F29D81\ +A00C6DA0600375D7BCB26AAE5E211EFA97AB806DABB4D783C5F8FE61BEE81565:\ +E9E6B997D92FB0DB4162D4412326D008CEA106665DEEBFC9B819E5B044A7B98B\ +3E628887BAE89C86066FFDBADFD0A52715DADCE0F4A2CCCBCCCBB095A2DD0014\ +FD8BEE4FEDEB95F19C1B7CF694E2C505BD614D06E18F362713A3DCAA41DA398D\ +29D507698D4B3FB1D8C070285A4B8A4808BE4BF60299D4E6912BA4C43CAB65D9\ +5B06F96FF50838E13B4938084C4D736FFB28477B30E4FBCD4C6826D1250B3A85\ +68DC0A7A0997CB2669DA44D925FCBD248ACDED9F5930DC805F019014AA806781:\ +47697665206D652073747566662E::\ +D0C2D44B72627C4CDF868393F38BA331742F7C553F930DBD85C2F52E8C57CEB5\ +08C31D7284DFCAD0EE161F298AB52D0B3E04FB0A6D1785F7EF0AD2B527F1DB04\ +50831A832F3F1D46357F042970DFEA8F81BBEC44B2B99272D15D6ED9587F116D\ +97E572B6534B4ED107BF43AA3DE758C074B4EB391B9AE3BDFE6D4A4FB2180A60\ +A1EC259E22825FDEADD6A13B19F011045EE8DDEF14EB404A0063DE0D953E9245\ +EF022943AF6476118600E6A726994C94309571C47B2155C9459D8BC757CB226C\ +057820443E593B4A78023F5D8BAA64BB48DD46C4AA77CE39E256A6388E2FC59C\ +E2B453AF687DA37A2C6D7E10D8328D25FF1CDE51926BB27C6200A590C8BA4BF4\ +274CC8E72CCD10271F14018573A1F41F9F1C582FC102D7621C2AC5078A14DAAB\ +36D26E055B3AA6DFBE6BE1C463C4415891086DECA173D99495188FA21F497E9D\ +270FDEB830B3F9D62F15CC843AE19F490717E9A7979139175BB7240F706851A0\ +F56BAD12970F2E0F031C313F93C9DAD4AAD0A26592D5E618B9E73566E68DCF72 + +6FC1:\ +F34CAEA3D0B3D9BBEA6519414CDBAAF20A44AB2014D51545961B5917FF2D8F40\ +ADB5971ACB2116B7C5600DB30D8F80D54F54DDDE605A4AB5C7A4269A5678508A\ +545BB9EC585EA877EDC4C23C2370F44DB68A2FCEB73C09307CF22468CC4F51A4\ +2C1EF139FCE1867598F909931E7C364AFF8B5C1B60FAD396A641FE949888C6A0\ +C2FFF84FD7EB476B1292FACFF2DFB7F8B48934ED0352615E1AD701491C47098A\ +49920DCA9C9BE01C1C70F4AFC9BCFE869362816E21C552BBB918F521FD57688C\ +018969C6C48308D18589C2EC486A8C84E41263F594BC35993F15BD23BCE1EAB3\ +185D0828F441064D38D84148367DA2F6FFC9C29510ABABEBC33F6E525090C7B3:\ +FF433D0B39AE58722F5A84FBF7A09D31AC8D7A8A78C30E00EDB3B062C635C6DB\ +29472989F3039DB7319AC5F806E02BFAD02BFE61C01BDAD786DEFA6445E6F36E\ +CB3773B5A509E14BD414491DF694D4C5E798A33B1E4A0D371DA83B4C7B8D8D9C\ +7C8AAD77FE9ADC5CC67CFA0C9DC0772435EC455A6BC7F65D43E1B5653A80064A\ +E4EA6D910F509E16BBA32C3949BE9037F52A9A96AE49ACE787BEB0FF28E6061D\ +DB8004F4B34F65FB96DB8173AC72ACD89CFAA3428944612D4509546A3CBD0AB1\ +5B8C9CCCECF2D634CEF7D7DBB2DB35C107E7E3E6AAD6C8C73FF22166FADF2C6B\ +4F788889B7720A43EA2DA69203BE545C5A7897A8B9971E5EED87C3D57072A985:\ +426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ +723320616E64206C306E2E20416E64207468652052656E64657A766F75732E::\ +C4F7914A7930FF55A16083CCF84D72F03C900374BF60145EDEF156AF48ADCBCC\ +51AD3912EF0F27A84AACE8CF7DB7EDFC2133BE617EDA7AD5C69C82C2BC1532CC\ +04B005CE6349EC5F4951BDECCA0D65AA5A07923570A23F51A30C972B0966B2C7\ +FC3D0821D14555A2A2EF281AB0D533F5C37FA6B3A683B794C8770CCD41BBE418\ +262D1D6EFB98108BEFA271BA5441FCF68FDFAA450E02AEB78AAE5FBE8FE02D37\ +EFF8D7D250503F6BD5E6805BEDF3177FBBF8DEEEE4D2A36BEC34106B7E2FA7ED\ +1874C9023B6B71CBA87ED2954D0B0F52C1C51D8242B4012AA22689F9FCCA74C4\ +C1BEB23DA240C6FA183A2AFC494615382D3AB7C3A96601C2097B381C5EB5F530\ +AF1DA74FB05BDBC52B5F08030CB8C3518D8B9AE17A6164A781493FA7827E1E95\ +7EE09D0277019DE3304C03FA8071F8A4C720290DCF4ADEBA54C93BA3B71F886C\ +D20D959424599480BC35D7F6D6A3B0A112BCB5CD99F16DEF87B08816497E9B6A\ +6FA9D28049239776B0266AA28557D3B811B48FEB601E6CA16951CB899D6F56C7\ +828E37201420A9A51360750698BAD1DB0567BE0A3CE32CFEF34566FCEAC272FF\ +944FB8990C29A3430A5CFE9048D8F595B47AFA93CD910FEB471139FC9D992EEC\ +BDC0DD304AD20F551D2AC1AF97AA7C2F058DEDD9302BB7EAA3210748B49BBA81\ +95BC3B83719656AC55773D0A49A9F74F0DA0FFFA76BAF700F430EFCE96DF961C + +[RSASSA/EMSA3(SHA-1)] +10001:\ +33D48445C859E52340DE704BCDDA065FBB4058D740BD1D67D29E9C146C11CF61:\ +335E8408866B0FD38DC7002D3F972C67389A65D5D8306566D5C4F2A5AA52628B:\ +45766572796F6E65206765747320467269646179206F66662E::\ +0610761F95FFD1B8F29DA34212947EC2AA0E358866A722F03CC3C41487ADC604\ +A48FF54F5C6BEDB9FB7BD59F82D6E55D8F3174BA361B2214B2D74E8825E04E81 + +10001:\ +D7103CD676E39824E2BE50B8E6533FE7CB7484348E283802AD2B8D00C80D19DF:\ +C89996DC169CEB3F227958275968804D4BE9FC4012C3219662F1A438C9950BB3:\ +74657374::\ +A7E00CE4391F914D82158D9B732759808E25A1C6383FE87A5199157650D4296C\ +F612E9FF809E686A0AF328238306E79965F6D0138138829D9A1A22764306F6CE + +11:\ +D255E2DEC6F7B4A61424CCDBAA356FAC0D29CA7912EC755AD4C72D8F4C4ADA5B\ +51790C518C074098C5CF97CF651AD8F5D2D3926BC16872D69DF533ADCF71251D:\ +DAF30344A35FE911419B2BFB9C8B461B57A1FAB11DA8451391357AEA6B81348F\ +5CCC4E23B38D3DBA82603CC52AA5F1BDC6F37015246F33CD02C3027F557A265D:\ +7730307421::\ +A372D1D551F9260896C2513932A0828748086C5AAE2E8B5DFADEA3250E9A8748\ +3C9DBA5D6F3513202510C2970624C1EFDE858C432DE7E50ADCDC7D639C30AE8D\ +9D3B6E521AAC286D8613223066559148E6B06EFCEF9799541447C468D6B49ABD\ +E9B51B14B34E475B3D04A6747DEB2CCAC5400D1032DD977C0A98D79A74EB38AE + +11:\ +BFE1C1173207E6E33F699074865B0C285CDB92A7973DD2DE1E10F525E845DDA0\ +2A2145CE553BC039DFEE68AA6826855F9DD8398820536BCF83EF422E2E75A93F:\ +C542F0BF4CB661A6D3B0FBC3952BC85BF7C8A13F81F3D66A78A39A1A4480A172\ +26B913A53D0AF44775D76E611030782BEFFD979C74BF3483A709FF1A58F140A7:\ +556E7265717569746564206C6F7665207375636B732E::\ +0B43E57A2A216D15795C2538ADFE794FF0D4342CE4F61D0D0A5E7F38A2968F9D\ +6A032DF4B772DC7E0AEE89B5BC829D3F0BBB05758F0B95A10CF8B26677862737\ +CC3277443E4B5D162182B326723E210A3E2D8E6E9BFDC7C935CA2BF4E57036A5\ +A83661AC1EACC4033E79FD2B9EC525623B1EBA9F13BD70822EEFD0EF443B0993 + +10003:\ +C739CEC54F45D25B3B4D69D70CAE94F2B5299A406F4F045076ACD84687A59E8A\ +1AFBE7DBE229186EC588D12397E401CE51A42BEA67CB6B10C984C117E2CB876B:\ +D549FD1428B28FBFC7CFE760D16AD9E4BD6129AB407AD79D4B964F6362B78DDF\ +AF20C8EA51471CD49A5E329F49420571F3A6E30E781BEB80CEB1CD7E07F57D61:\ +49742773206D7920626972746864617920746F646179212053656E64206D6520\ +736F6D657468696E6721::\ +1EE0E873EE0EBF9DCFD452596D731936F8115BD3EFDFA2D1383CDCF04B97DCE6\ +ED35853C19ECBCADAE81E431BD31ACBF9E4CD709D2490E552853FD523D6C680E\ +C59A0E6E51DC0BBDC4E783608BACF3B6648931B5DCC2979D932652A42D9F0EFC\ +6B1E6AAA85C97BF5DF88736BBDAF33139B729FB0340C89CED70AD556097EBA0F + +10003:\ +BAE8E1ECE4B7E06903A894BCDB1E4B576D8C7719D23343814D6EA2B65E26EA06\ +ED68DAA07048917EA74B8A75B6DF6BB68060BE68F3C0594EF99DAD5CAF9C2A75:\ +F1C1AF40EBC0BBD628E105246AC61FBDFE7C926156D8A644F6297C758500DC4E\ +943B392014068978BEBB3ACDEB73358D1E1F035DB73D01BDCF0536928EBDE885:\ +49206D65616E206974212053656E64206D6520736F6D657468696E6721204E4F\ +5721203A29::\ +4D0AC8B75C4338C456533A431596339617955F786998BA05BFE41A4BE24AEBAD\ +DF92201340E076E7384BB8E211FBEC7662573C1F63915E3033CD6C351D7CDAB8\ +AED5F3458AFFEBEFAB21612BF742EE012674D04AAD37C592775A55D6F78C6674\ +DFC0F927303F486E82AFDAFE28A55660E91687FEC0CA2AEDDC83512BEADA05B2 + +11:\ +FBBB490DE6F5F485B0A25B71394A393488AF8131B5391C8D3F99ADAB2B5B1F89\ +87B9556C5FBF2F85DD56BA0F9507C500787E07C88726476F56A07491CC4FB97F:\ +E1C5F70CC3DA03313682723C22241CEC93AAE0455B59501F4E6603E790A06083\ +3710E9CFBD2D8472E193C0B9433B2290CF303389B3CEED97CD1F5C934AFDCAF3:\ +57687920646F204920616C7761797320656E64207570206C696B696E67206769\ +726C7320696E206C6F6E672D7465726D2072656C6174696F6E73686970733F::\ +4AE5B5600003871EDF01BC589DBDE5F5F8B558AF6F286D09572555FB4D34F640\ +173F0D17AEB67E18D05CD598595C78AA4E1246DDB0D311F38E3E21C02241F4F5\ +542B872DA50ADFE17407DC115C14DCB35847C3AFF8914967D8714B89CECC5745\ +C353D9831AE5B2C666A3077D5AC1131160AA59113193278587308D3E5BAED895 + +3:\ +B6E4B50A4B61F147CC30C319CCEBEA1BB8151EE3012BFD2C80E8B13DBAE1657E\ +7AED914E80A26A4D1FCAFED54BF4457D609A33C6AE7631DE9A310E3EFD4353F1:\ +B841BF00069AE6F05A68CB11FF5E6389ED0C8AC9D2DBDD24CF0E0076B05FC226\ +E771C0D06C220908A559E5BF6626537B265B8D9C50E05E214724155F1C14A7E1:\ +4920616D20736F20677265617421204920616D20736F2067726561742120::\ +24D98B51D0419DD3D987D7E51528F571790AC78D2C80F36F64C7B4E05D90239E\ +8A5D9D7F46D636741B9F9A1DA58E58002D268A814528A4BF6B0AEE3B8EFEF0BD\ +72C956E4895FAA28E3EBD13E7EFD46A7BDFC3872D220EF4A2455E6CCCC407411\ +C2274D7F2BEDF4A727B569BFAE999F910BF69F5689DB7686328F97DED76C64E5 + +7:\ +1343E65E7C11BE13536BB8BB569AAF091119ADE46FDCA9AE627910A39F9F909B\ +F921EDD9AB862813AA5AA5969620FD97ABD051352C89A336E420D1BCFB37A9CDF:\ +10A76D6261BE5FB018492566D9819028CA13B55A982C8A2A7CA31520124AB832\ +0F583BD5003F0E800775664DE2718481C15C841888350BF980D8F3EC017B9D851:\ +4920616D20736F20677265617421204920616D20736F20677265617421202831\ +3032352062697429::\ +0069212B4D49B93D56DBFD35534686BC4CE5EF057D3E5EB08E38C0CAC44A33C8\ +1ACF7E54ACB2F7D7029F63778B55D63C31E0FEBED8AF57050EC46E7C6B857112\ +B8A1FA0B4D5C11F976D01B5F56EBF55C678393CECFC801E51D6040A3631A0E77\ +56F9E81E2FF7A03E1B8A20F7DFAE90CF631043029AFFE3F615A54EA68ED470B393 + +3:\ +1F16A49C815B9878A399B22419F0D948B33E8D7367A9F5928ED63146FEA7C69F\ +6C8A0EACA711970E370FB87CA3CCCDA71E1DBA9A12DBC003ED79F545876BFDA7D:\ +1F5C7840900C1C2E18340C156F8BE4EE70A4A0603412E689602C93B09FDD205E\ +23A775E7E1EAD3078EF9D5487D8A2EA5BABE8EE94AA0536CBA268B3BE7AD4B519:\ +4920616D20736F20677265617421204920616D20736F20677265617421202831\ +3032362062697429::\ +030551DE7296296876189AC2155EA4F80B3A68EF2A51F926494821E038A52548\ +4BDCA8CC4525D4BD04BEE373313D79DFEC59E22F21FB853C688FF9DA4CDCF6D1\ +2255BECED6DF3EFDED6046D4381D69B89EF17B892685707AE7B49E2205D95F73\ +0A1A003638FBCDDE5F4A5AEB028252F46195DB3CA1C708AAE22ACA7687B0DD2401 + +7:\ +2037B35FDD14FACFA8B6DC8F48EC575F43CE8E2B5B89375A6FDDE1CFB66DACB9\ +8D7C57CE0F025BC7DD15533233AFCCBF392C0CB9DD79F49334D31F1FC0D17465D:\ +21265626E63E26739C0D086C3F19D7C8DA5B2FCD1452CE5290FF16F80AE6CDC3\ +49722661765B5AE418F23FBDAE4048C4FBB845822B2264C012ED6A8A257365F69:\ +4920616D20736F20677265617421204920616D20736F20677265617421202831\ +3032372062697429::\ +0090FD2E6B167F5B8E68AD965C170F87E2DDC69BA9312DE03B79018C90A80BF1\ +67704999C1A1B8AD31041428DBFE74FD89B398F5682F252DE85E19F33830CA2B\ +B775966C01EFCD6F95A5334DCEF07A0DF1F1114C21FEAA03D619EBCA60010F47\ +F671C35D754BD63DD5045E45CA21F7CB15FE2731AB27D91162D52320A540B17AE1 + +# Following were genererated by Crypto++ 5.5.2 +11:\ +B7B1C37488F9585ABEE4F6C1255E70726F9FEC2532D86321:\ +C22463589E6BFBF3D9ACEC3D29F978BA3CD80D48478F40ED:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20\ +64617461206D696E696E672C206578706572742073797374656D732C2063727970746F\ +6772617068792C2073746567616E6F6772617068792C20646563656E7472616C697A65\ +64207472757374206D616E6167656D656E742C206661756C7420746F6C6572616E6365\ +2C207265706C69636174696F6E20616E642063616368696E672C2073656C662D686561\ +6C696E6720736F6674776172652C20776972656C65737320636F6D6D756E6963617469\ +6F6E732C20656D6265646465642073797374656D732C206D6963726F6B65726E656C20\ +617263686974656374757265732C206D7574616E74732C206379626F726765722E0A0A\ +776520646F6E277420746F79::\ +7019481E38A7ECA4D6E865FA22BFECBEE46963D4582419C3C79A272ED88630B4152AD9\ +336B08DE71B5C45FCE6C45B925 + +11:\ +D83C1647F81DF86BD9F30E06C54CB22CDFB1BAA3224FBEE7:\ +E57DB05FC990CFDE83B59433D37C69CA6079AB4EBC103C59:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20\ +64617461206D696E696E672C206578706572742073797374656D732C2063727970746F\ +6772617068792C2073746567616E6F6772617068792C20646563656E7472616C697A65\ +64207472757374206D616E6167656D656E742C206661756C7420746F6C6572616E6365\ +2C207265706C69636174696F6E20616E642063616368696E672C2073656C662D686561\ +6C696E6720736F6674776172652C20776972656C65737320636F6D6D756E6963617469\ +6F6E732C20656D6265646465642073797374656D732C206D6963726F6B65726E656C20\ +617263686974656374757265732C206D7574616E74732C206379626F726765722E0A0A\ +776520646F6E277420746F79::\ +340E91C744AB8748E6891202979BDDFBA6003FFDAE83584359BF6FA5CAAFC8E811598C\ +5985CAFBC679417B64F6F42B02 + +11:\ +CC1416D18974D023AF2D6FCA7BEEE85FCE5F036739E2AD8D89032C591C3B50498971F4FC2E25\ +384B789001D6526F4733963F2D98BCE1BA53121D15CE51C0C237:\ +EB2CB9DEAA582AEA4B7322C77308CADABCB824A2E511B93CBCF60A0DD6AFDA456A7FCEC6F7DE\ +F2F7CD3EE32C36BBD2A4445F2C6DDE86BD3881B25CFA6B4EE279:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +3B2CB445D8A533B0C3CF4C05EA87C266902EDB4CDF9BCB0289340253DD3110753D0712AA51FE\ +91CD0E59B73226BE63673FEABFE472BBF136B0C8F4A803284FE3DAD892233A8E81C97406E065\ +C5AADC4DA86746EA88E7E107FCFE1C925AEF5E5E4C13E76BE2129F114527A467A6227FE22BB0\ +2B6866ADBA5F6B11E8F85DFB4A8E + +# Generated by Crypto++ 5.5.2 +[RSASSA/EMSA3(SHA-224)] +11:\ +BA54D5BBCC6D8E5A4DB29FF530C38DFBA7F970DDD062B74AB768F4E44353CA6DD790F4ADD677\ +38BAFE49D30ECDF22C55A856440F43D718433D5A508BF6A77183:\ +F08BDCEE74246EDD61D1FFCECE322630219FC68EFB5337AC80AA88630D2332654397759B18BD\ +F709004AFC150F2EE339B60F72E16C1BA3B6EEF910F698C2EDA1:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +9B3E6BA1DC0AF7133861A0EA2B956BE516918292AB708FF762548DCFBB02B1742AA3331DEF07\ +7504718F827C13E27F9102EE7B93D36E601C5A3E687F2F7289A20BDA7BDD1463BC2BED074AB9\ +8E7A4F3A0ECD579E8F40679D877DA0A8A7B97115A1CB965FD0B3BB65C84F62E5BE38E6C2E328\ +D8940DA14522E53075386712B8A4 + +11:\ +EB5C08446CE56F03AB2B0AE7A4D9E4EF1FE2D706FB226577B03CEF9F004B3FD258814319F586\ +BFBAC234DBB5E9ADA33F638DB333FA948824C0C5F917E05201B03CAB20558F7D7CDB0DE42549\ +D51EBA4CF93068433F02727472C2559626D47A8E071B0AD848FD5B35965FB8E06DB4F65995CA\ +E876227DDD8A34C401ABE5BCB11D:\ +F4833CD56CEF4C9DACE2039CA3FB287172CF37C899D1D3267EC0D14EB967E42859A001CFA440\ +9DC1D8BA4952C5EA13D12FC4C016617F9062778E5B9F3BF0FB79C2870BE355F39BACC4B6178F\ +FD0B7A1C8B545A3FC781C1A2D54A962A93F7E41CE144B6C6E22AD3CF61DDB05A8F27508DD5AB\ +6725D8D0579732E621C33360ED7B:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +D685C80FB40EC09FC602880E6E55BCBA96332964505BA8BDFB8A181DC6700C2CBCDE6BD35E13\ +32E56FC5F6E2F80AAD046F9CCBBA36A6E3CB115969A2AF661CBAD42AC0D3C22662CFDE9C8544\ +E41018E88D5BD173AA59D0FE5FD0731730C44261E792F7958C76D7587CDDDF9AF0B99D70BFB7\ +4D6DCA952ADDCBBBAA711E6226E2568E532AE8DBF2BA2AE80F35DFCE1EFCC11BF68C100B32B4\ +8B2D4E22D782B42C97DF8B18164B3E73CC6A129F99E11AF30830A54376C9A5BE4A7F7B3C0115\ +F2B595EC5A4D841D55048E6BB226FC53D5998079E5F38D51BD1281B77E9E69E44DF8F1ED0F6A\ +BC10D2E11B941ABE6238ECEEFDC277EE6719B43F54317E98029AB437 + +10001:\ +F75306FB8700184C998959EB1D271B3DBAB883726D270E21B91CA78C1BD148D1D428533853A8\ +8E4AB4E4CB033CF27E2A8A6C1A12880206D6B4D74A9373F35B5F:\ +E615C504FD127394B4522FF5BC0143C93A07636D184B9B40DF6461E3BAACC23AA1937C52B06E\ +95849692465060D092713D36B9E49FD76CA86D2389CF1B0F1A73:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +04C401283813191B750C8F6CEE6C41C1C9ADB7CBE26685E568D046D7F073775F19F9ACA0A43A\ +B9A6C200C07174C6AC6A67E89B6367DBA7135DC5C2236218BE42B7DEC0A40C1E165BF24F9B33\ +E69AB196B8FAADBDCAA657512B1641AF7D0DBBB9BE1BFD8895C6B79EA30C104A5DF1380182D3\ +D2C9B553D59F564DB82D7940E18A + +# Generated by Crypto++ 5.5.2 +[RSASSA/EMSA3(SHA-256)] +10001:\ +B6661EB38B9C75A91E65FE5E6743C6949D6415D57CC4BCE84ED81E39EB8B4A77A867A15A3415\ +5B7E1CCCF972D6A06D73:\ +B85D9FA07D4F7CE1CF05150256FCE15BF7E647CDA350DDC574E72104DBDAF1F1F87930D1FAD8\ +C8E3094746ABE9E8C46B:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +275AB9846DD6999FDF4FC46F0E454B3CFF8C125096C0880DA957D65766A6298EDB41AE0F33DB\ +9FB15F9369E98B2738B37FF7165175E529B2349961C48B9459432FD58795052ADC2506D0B5F8\ +37879E771C66F59880F1371D78290B03F86454F9 + +10001:\ +EF97A42D03FAA9A42A22D161B7819A932C4C5FAF5338A6E57C4379AE8C0A32C924B1398A53E1\ +37409B322A0E793090361417290C159D7B34A6A62A0D2E84D997:\ +DAA28E8CB6CCBF9A4EA5884AF7C791DC08BAEFEAB75F23EADE53A7D29D26B35CBE806C65886C\ +70597A03007949F556924E7D60E5298689E4D5F4E46311E48BAB:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +23223B652D5D0A17866DE55C77ECDA94A3B69ABB8CE335E5ACC03FE33A7D2D8257FF4227036DCAAD05820C135E2E5F332A01D77BE4FB3013529F6B1B9255669FFB64C134DBF01995CBF24C1735AE0028381B40A657E5C28D983478632C7975CD0C776CD8CFC3796DE7D8FDA86A0112ECE359361B35EB6DBDC7F5E44D469AED13 + +10001:\ +D3B065134310F6A02A68E78829DBE58C5AFB148D95B30C7E54D8F463F0A66DFD3A78E2A15A26\ +18D5C6C972AD2BB14785E524CAFBA3B652C94D8F2579FA9C1F05:\ +F2CD098B9EBBD2B5AD589C30FD963EACD78D559190EB4D06880C8BA12EB55404D43AD51562D4\ +BC9B61B304AE664D22290AC6F4E20601A4DB97FE16A5DD0ACA5F:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +382C32D8EED4F7364BF68925FBE83338957605B064109AFF275457A3EE9BE4FD1EC1EBFBB3A4\ +72C3395F44DDBF378FEFEFC2B64CBFBC9C557B315DF6E8016FE3BBACB56A7DD3505F16A5F4A2\ +469250C77CEAFD2DE55D2FE96250E50CE813D529A909B8262456FFEF298D7472A8F5264CE667\ +24ABDB9F65C64C3747227804BCD1 + +10001:\ +C24FBEA1E9F303117CF19C1EAC7721AF5DC228E39007336E48B1462CB5E7D2C9E61A69E8F501\ +FD26E71F5D881398A5FDE56FF565EED8715AA2CC0B46D78DB74F083253649A22E0C99DAABC26\ +3E87FE3F713A1270FBE3843FA596F35D43E577FB:\ +E346A9F2672A70264D5F2EAC6F17FEFA50457ACF92F30F4E849ADDDE6F3B95FDB6E17F55B939\ +D50FEE1D2F6114B0F7FB74AE8B4AACDD491FB085B2ED7D125A32121DFA87F2319F8357BEE127\ +F103EB1B31D98A52403498476A1E34F18B6CBAFB:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +8F4A78545DD1F10329A692EC66DBAE0B5D3302FCF6AA2561DF2CC73FA16C71EA947C919BA326\ +50A7C1F7938BDCF75C4E77CFEA7BAB8A083EDB531F95B4A67CF93CB5EDFE6B4BA07CEF887CA6\ +10C9A917C374399BE8CCD4B84BD15295C02028502348278E50A64D4B990E9F754C64FD55B8C4\ +E6E7EF8A2A2182864159A1BA012F325B3BF7F1B23D44593B749E51F382C290FBC6AD65EF5011\ +47F3A9A5A92AC5EBE4C82E259A212E52C95F94BA91CDFA88DF26BED55E4305EB08675A430CAC5B04 + +# Generated by Crypto++ 5.5.2 +[RSASSA/EMSA3(SHA-384)] +10001:\ +D6392D7E84F9A7233FAEE9B2F386C7921BC9974393EB3581EAFA66D8E7DDFB75BC2F0AF8A674\ +6563FF9C80A420B56BD1:\ +D6D02FCFD0CEBEC15844AB927C37BAE12E8EFD552FF706B3B632A30E5FC14C39BC0ACF423C73\ +C412BC8AF0A473276283:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +8CF24497F9C2DDB9183822444F2074CA22C5D51B52E3F513919EA69BDA0082B9C40680EB813B\ +E914E95EB9DACD3A3A238AAA675FB7DEFD55D2F981D5B3D6B9467DB8060081AE6F56EC7C0FC6\ +E6E078D614497ECF896DE4DAA4F679F683FE0A2D + +10001:\ +E39E5402011ED488B404C162C767046DFF79619DBA222F7EBF8B0FF0525F1213DA8316DCFB6B\ +35E22987CDF373EBD91F9467491391345DB4F15DE2D1928563A5:\ +D1B9E418890830E84D570E5209BFE6BC5A619C01F27E7EEDC1DD8FF0153B5891FEBC94A1843B\ +FFE8F8D3CEB9351CA75EE208AE2A9EC08DD52445AB3194489553:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +64A89B5FFD98351CEFC750C278B2E4A8808EFD83EA57FE6752AE245E058A2BB821DF2AE980F1\ +9618C2C6201CE72FE46F9E9CD0502B12EEE6A9E180B3FF61C97640CC82DB7D583FB17A78BA88\ +86884FEDB1D4F27929A203069B142FC314D27E4342AAFFC5100F7BDFF8162CAA98DC3A8A1F5C\ +5DD7B7234F67F1AEB34D911E7CD6 + +10001:\ +C773EB83CEAF603D4C2D187CCE60A2564C7358C318E8817E183BDFA03BFBDE7EAB98A3A42E97\ +30F5E9D6F0849B438C7AB00E3B3032DEE05CBF32888BD63245CD:\ +BE95654D6DB5FDEFA2D3CB805687BD08D859982896071C433CA0C5051A44D8F49F1311BD35C4\ +9C8B6CA0CA746BE1ECF2126302758A5423BC0926AF4E96517931:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +519A0A554D5C8B4E749CDD92C21DCD8CBD5BB4494E9F15C91876F073756A896EE5A983A9AB72\ +6CCC6BDC0AA093B6643D683BFAAFE5BCD1A637ACBCA2B14C652C4926671A12275D4B3BEAA8A9\ +D5C57182B7AD6F8C89FE6A2555C8B8057A431FFF5BF1902E52183FFAD4D916563EA765809E92\ +6C626505FBDCE74ECD70F1EADEDD + +10001:\ +F914636EBBB1EBF51B642B8B8DE6BBB43390119D517139C9C6072C60A16E9E4CBD0598F929FF\ +D6B25C904CEFF6A434FD101B095E3AB5D454D07D813DF7823CEE33F638519BD2103E014DE215\ +0B6D8BAFAA698BB5619930FB39C64C3C1C31E72D:\ +F06C3A4F26E3144A3030B8424C41A7709812EEDABF37FB919DECA5554EF2AA2AFB4DB9A0986D\ +10ECFBA5897F43A7709FE7D3526C57A6EFAEFC116E26ECE0C577A63CF83638EB24911FAF54E0\ +C468215BAA4151178ACF872D2E5B3399A97C31F7:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +3577C7731A6D1E436F66F4367AE53EC80A3B632A8755DA97CA1DC7B5B7D6A946CA0D6AD0BA2B\ +B6C0EB8E2BC74725B606C00D6E96C87B75E73FD80F68DA2C829C57963855A85A66FD857FBF2C\ +7BF584501E5ED58BA06D5CE73FAA45BBE2F5C806409507A7F403E95FBC2971E0B7F399603F5E\ +EC3A67F4C912369A9FE03467AF0139CAF9D92A1364ECA159FBA485A73A10B9AA33667810707F\ +E8061F3632C43178BBA3C5113734F50A6360347A6119F87AD6A7A2308C9E42FA5FE096558586AC0D + +# Generated by Crypto++ 5.5.2 +[RSASSA/EMSA3(SHA-512)] +10001:\ +FF1414834AF27B94F7818DC435D95D756FCC9F4F4DD9B25FFDC23BDACB511DAA9F76E39B411D\ +AD20D543AF198F8CC867:\ +F025AE2AC9135A5E23B1D90E17DEEAA872D45E6700CF011015E949429D320142EC0A802B7863\ +C8BDF99313FDAF2BF5CF:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +0C98A091C5B53A71F0BA4FD4CE5F58B0773070C05DB916B4FCFE5298267F28C457322A3AB262\ +E44079CE440DB56997AFCF30AF33E13DE774D066F07B92CBB8B6321F2DD967A94524DF050A1C\ +67AAA05D28C232472FAB214CE819792DD1147750 + +10001:\ +B876A61A8F19113F9D5396BDDB5F54FFCCF8A35D1255979C797246F96D94D99A5B000B2DE9AB\ +81D1BBD16FFAAA092029500472F1FAAEADDC9E8D077F2E694B81:\ +DB86AB91CF13E90943B0D18016DADF2C4702AC4D6989299CF8338C3AB1620C8532D5297929D0\ +C1A0F76AA4D4DFC78D5D407399EEF35483BA6C8ACCC0A0C09C05:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +84E79B96AA2A3C43EA41FA415ECBF88D3DF93C15D8378EBC51CE114B6FAB16A8B07A3DD9148E\ +D1018A0E0385B19BE2AAEF0CB7603E3493DAA92C1ADB18EC5489BBCEAB9FDBEC41B423109A74\ +551425DBEA6A52A61530ACB8F955D102EBDCD15F2C96F01461DC1F196A87ED25F0B61DEB24B9\ +B7A02324B095219D3EB01855A40F + +10001:\ +D37A85110EE0F0CF8843EDFA1480F3CA4798798B5B592AD80F40C9E42BD21B162979F6002F64\ +EDDAC84E1D6DF41E02ABBC85D862B9ABE6B38FA9193701826CC9:\ +F3DA6327A3276EC647E5B1B9E8846314C2F7B5E84D3DA78E1EF18714158CAA3D700F438A03A4\ +D45A8B7422943F64ADCD582271BC30A687F6FF73A26263E89621:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +C18FF41DB165E740B5BE6D649E9C5F01E4C84862FA453DBD12485975F4BA802A460AC263AB1F\ +BCB53ABD46CA057C195A70381A83707515B154E2B5DA3529C8986034C47F6AE706D06B96D5A2\ +4B9A370276CF93129DB3519C15BCB2A35150C7EFE1B06CAFDD7DAA0B111E10DEBCCF53C04CF7\ +5D86DCD03F9B2C20336EC3FCD1C8 + +10001:\ +C1CC91EFC0B3EA7938897E5675CE09E44A531492742770EA9C2AF96F7614F6ED4B6A17E85DBE\ +F6A24652CAACEA68E4E0F4100BAABE78F744668A973727B3B188194190F67D6E4E152E1498F9\ +45E7714CAAE6C37E215E2511596720C7B9DE49AD:\ +EB4D1A619C6E3947B9E3B07C84DD87244E130251B3F9C5D22B0162DBDA3BDFFED664C14848E9\ +9B02523B3D382D15546F8414888E4D3F95DD542F48C46CEFE19A85F36D98DBFC4BBBF3B5A1E6\ +0BCE38DC5DFC787C5D4C3B72011CAB73912A41F3:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +0437766509CEEFEA9ABC433289884E578D65BA463C572ED61BF3A48AE34769E8DDA73F2F4898\ +431068D518C16B7057467D7402796A0665A7FC7C4D8FD30077D4ABC08CB1E5207D78F130843D\ +42928F1968F49A87481B1B40B441E6E1135025BB23F8A9EA1F43F27EDF03FCF36EDFBE418A89\ +F7C11184571D8D80AFCEDF41A4F93FCFBD73A39D7BFAC2E263FCF91D4264E8571D044B1D568B\ +BA6F228FD47324132B2274EBF26CD4BC7520A2DBFFFBEE41A5DF72A5D8FD2C6647E62C28F04995AB + + +[RSASSA/EMSA3(RIPEMD-160)] +# Generated by Crypto++ 5.5.2 +10001:\ +BB305054066BEE5B66E9C651583F6B5F4005D3CE970520CDF277EF463EF1EF1B10E9428C6BCA\ +4254F42E40F0040C7577:\ +BE54384C3A200BBB597B8A59F8165D553B24B2A9F96236521580AB79924EBC6095E0905E58A7\ +C1BB302DFDA4FE489395:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +05C9082DAF39A7A706F6AE5CC1FE1A26F820301257DCDDB7B4DD91DB01B472E4C855E1AE6108\ +C32967659C69169197949BA58A194FFDE8449911FD5A8E7751A4E15CCED118DF2FF677D89827\ +99A76B59409BC76A31E696B26FEA324EC2CB6558 + +10001:\ +D59E1378C1E752ACA0454839C11AA792AB2F0064920CABC3697A1701671DE4178103D8C619BA\ +12B453B3575BAD2E61CDD02C4509F188FF01B052121E2EB8634F:\ +F9761A2C67B685690846BD6746F0741FEACF188808B441CC66A54FA21B68C9CCA6F1BE26BD3C\ +CD67C11C0B6CD048CA5904A56F368D16843EE1E086B4A8461C6B:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +50971DC72D885146BCD0AE6D48271A71FEA3EFBD2B23F94F07333F421939F44DF8CA92CE88C0\ +10A65540F904D6FF9E2C4A4A0755CB21D6181581BB77FC58042A1A6F9993B24BC048B06F1985\ +A08CF902C06B0DAEB3997DB94398FC26C7E3EAF0D0787BFA3370C1E5E186F2064B803679B05E\ +481F0363895240FF54FF88E03C59 + +10001:\ +EA0E165F4F81A6A6ED0FC49F26DE95FB7C42ACE29E650EBFFA2B1093389C987EC43B601B02E0\ +D3596D9718062CB071576D31BECB98E53570187CA122F3E20A83:\ +B731579363899B63B6E8857F983E0AFB56CD07EA8D3225A7A182BA2EAB6D3BDE2CC43620447E\ +A2D76947A7BD83439213271002261749F3E9F31E30209106F945:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +5A7A06EAA128549977CD5C0CDD8E1E4689EBEEB06B6EDDC2E39FEBE7BCF4D0068CB14CA8FF11\ +853C00A868F3B520F6503EED8055E9801AF20A277232C037079ECF06AEFD91CFAF387E4EC0C1\ +2C8D4635C5FA5FEFAD2F67E770FD7FD4115FF98A9B4883FC9D2BBD236126AB45EA3A05BF9F0A\ +355BD5F2AEA9158C4D70DF4A83FD + +10001:\ +DBB4D78472CE88FD41DAF8F0A6AE2D147BF34EDFFCD14B3855F5CE7C2ADA8AD08569BEA843B1\ +B568BE73BC7A567175114F8F493BBA87E777426828CDF044E08D1DB7E54231221FC64DE7A993\ +EF4281687EBC11E654E58BDAB125E289CFECC779:\ +D8CD194A4EA3650C927355B187BFE4367604F4BCE10D7633529455A6D11B8AE2745F9A3F0C99\ +D85853D0D645F25D7C9D03AAE28AA85FA3F434D72BBDCDB74AF5B2910B1BDBA9618FB5ADDA0F\ +34E201003E832764A55E6B625F2BB66DC124ECB1:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +85A0774004DF91004DF8A118EEB46EBEFFE690C964BC2F4D1429C76FB19B44969BA80C492FAD\ +BCAC6E36A1F118C3AB8E9BBE0DCE93E7B938E97177B3621CAAB19F1CBDC0AE9261B774782FDC\ +D2DB62AEB93F2EFB16386C5D1439A5CA6545D59FA11BD330BC0F49336FADF0A7EBF2636F6037\ +364DAFAEA4FEC9C290D34CF68FB1D9698E36385E56058CE62C0D25B98F95DA416AE9A5697CD2\ +6305D8DA193C7BA1AB9F66EDAC9087C9495B4B40B50D9812F2F2F6FB9FBDAD19B243FAFDCA7CEF2A + + +[RSASSA/EMSA3(Tiger)] +10001:\ +D402D64E23A5EA4FE4A256B14BBDF89832C814E0400B3C9673774073AE5D6EEE039C0744D486\ +3A0492DE49D402066A69:\ +FE7202E1A686745A0576A21FF1603090EA5CE042BBC943ED9BD4E931271542C77A12E6E1B5E5\ +FEEC5B90B5EA27D90237:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +908DD085BB0A924EECEA7F3DBDCDEFB8989A1F6971DE434F227289733F24D3F66AFF294BBF9D\ +23E80CCA352F232076397D5A862D4AE32DDC901C67416FECEAD311714105FF46044B0996CCC3\ +2938CE2EB5A95EC8E0631516BCA3855C82A712B7 + +10001:\ +E826441E9CEDB949A69AE8C15C088F507B3095CAF8BDADF49F317DEABF45113F70E90910C182\ +EC1A2C433FCFF181CECC9211BAF3943517FCB32383F4CCBE526B:\ +C3B08505952722C91C384AA7962FDB3F96B27EDA6D7C65D081D924BCF8CF8AC6B8BECD12AA81\ +BD8D0B6CC8CA4646240A66A3718F89DC324C5E315D40F90AA51B:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +0F41FBA33B6E3A11EF94F8FD736431288C277B2E00DEE94B447FECD215E61E19B383687911BF\ +B2F46C0A9EF1AA3A787487C88A8C43006BC7D4D6C1D6137939B6B815D532EACFE05FEA6BC3A7\ +57E2A625F4188CE30792D6C75F205EB2C6515FC639780A86E1ED56C32CB223C7FBA8479682AC\ +24FCCC993F32EF55F818DC2F018E + +10001:\ +E493B0520556D6D50DACBF90EC41772CAE3873000EF163A94CE9F52BEF1F7962D7933E727ED3\ +EB4F03633CB3868F59BEC993B7DDF28FAA315456CA381D6650D5:\ +B996BB66BDF65F2FFDE68C156848DEC56BECEFBB6604CB0FE04A404D592CD13EC44DC0C5511B\ +25B7D5AB808B3FC16873BFF19210AD7245FC806062A6C72F3A47:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +0AF90FE65CB6FCB7BE90C5090943DC697534F9ED3A384FCE6F85AD5FDA36644D4BD68A0EC363\ +98E7F704796244B4793DF320F6D034D62AA4ECC579474D4EEA0E5F91C82F729B5A62A8314022\ +9C5DA882A6EB0D7DBC3436B73D1B493BFD7ECD32E11716A424A5FB2195A7865D1DCB05FCB95C\ +BED76FC52A85DE2AA9A9C2AA29D2 + +10001:\ +C0800968E0C6E46099141267F195911D4EE36876E7D79DC6CB679FB1FE7C18387100CA9702F8\ +3E373EDB3799CBD97BBE966FE8B4A344BA4CCE3FEF86275ED0C42A1089B90C63010A135064EC\ +79769D2FC2B44ACC280AA7601329C8EB6E9C1AEB:\ +D939658B1F8C590B3A190CBCDFB9CAD087033FBCD775D18EA9EE5461EBFDB3286A488D196F03\ +426A939BC387A864E1657FFFD1C31651D8A7CBD6E57190C98590EE97BAE08CC29FB9822B4949\ +321BBEE59E9F8E5CBA8A62A1F3BE75E8F24DAFD1:\ +7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ +61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ +2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ +616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ +6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ +776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ +656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ +732C206379626F726765722E0A0A776520646F6E277420746F79::\ +05C402CB39615771565E3F6E2C2CBC81B7528EFB38D19CB493E6F3525198D7B2604706811FC8\ +A28D9AE028C31326E5C43D1EF9F02FA74D12C9D8EB3639520BD190F2084E34DAFD70E761C9EB\ +1D410034A90A8475410E5DA5DDC5B5628060B1CEDE86E8C86D1ABFF24F2EFD725BEAB66957E2\ +464B57379308556D2E93F28743F4A652785B29247A5DB2A3D913C3B5C19ECC8F46FEB3C3C41A\ +4360D557BDE14022897F312FEE1F964508DE44A4B5CA23AF1D2A2D00C2183D0D5733E3CC3EF76A7D + +# These are (some of) the official RSADSI PSS test vectors, +# plus a few specially constructed ones at the end +[RSASSA/EMSA4(SHA-1)] +10001:\ +E7E8942720A877517273A356053EA2A1BC0C94AA72D55C6E86296B2DFC967948\ +C0A72CBCCCA7EACB35706E09A1DF55A1535BD9B3CC34160B3B6DCD3EDA8E6443:\ +B69DCA1CF7D4D7EC81E75B90FCCA874ABCDE123FD2700180AA90479B6E48DE8D\ +67ED24F9F19D85BA275874F542CD20DC723E6963364A1F9425452B269A6799FD:\ +10AAE9A0AB0B595D0841207B700D48D75FAEDDE3B775CD6B4CC88AE06E4694EC\ +74BA18F8520D4F5EA69CBBE7CC2BEBA43EFDC10215AC4EB32DC302A1F53DC6C4\ +352267E7936CFEBF7C8D67035784A3909FA859C7B7B59B8E39C5C2349F1886B7\ +05A30267D402F7486AB4F58CAD5D69ADB17AB8CD0CE1CAF5025AF4AE24B1FB87\ +94C6070CC09A51E2F9911311E3877D0044C71C57A993395008806B723AC38373\ +D395481818528C1E7053739282053529510E935CD0FA77B8FA53CC2D474BD4FB\ +3CC5C672D6FFDC90A00F9848712C4BCFE46C60573659B11E6457E861F0F604B6\ +138D144F8CE4E2DA73:A8AB69DD801F0074C2A1FC60649836C616D99681:\ +2A34F6125E1F6B0BF971E84FBD41C632BE8F2C2ACE7DE8B6926E31FF93E9AF98\ +7FBC06E51E9BE14F5198F91F3F953BD67DA60A9DF59764C3DC0FE08E1CBEF0B7\ +5F868D10AD3FBA749FEF59FB6DAC46A0D6E504369331586F58E4628F39AA2789\ +82543BC0EEB537DC61958019B394FB273F215858A0A01AC4D650B955C67F4C58 + +10001:\ +D17F655BF27C8B16D35462C905CC04A26F37E2A67FA9C0CE0DCED472394A0DF7\ +43FE7F929E378EFDB368EDDFF453CF007AF6D948E0ADE757371F8A711E278F6B:\ +C6D92B6FEE7414D1358CE1546FB62987530B90BD15E0F14963A5E2635ADB6934\ +7EC0C01B2AB1763FD8AC1A592FB22757463A982425BB97A3A437C5BF86D03F2F:\ +859EEF2FD78ACA00308BDC471193BF55BF9D78DB8F8A672B484634F3C9C26E6478AE1026\ +0FE0DD8C082E53A5293AF2173CD50C6D5D354FEBF78B26021C25C02712E78CD4694C9F46\ +9777E451E7F8E9E04CD3739C6BBFEDAE487FB55644E9CA74FF77A53CB729802F6ED4A5FF\ +A8BA159890FC:E3B5D5D002C1BCE50C2B65EF88A188D83BCE7E61:\ +8DAA627D3DE7595D63056C7EC659E54406F10610128BAAE821C8B2A0F3936D54DC3BDCE4\ +6689F6B7951BB18E840542769718D5715D210D85EFBB596192032C42BE4C29972C856275\ +EB6D5A45F05F51876FC6743DEDDD28CAEC9BB30EA99E02C3488269604FE497F74CCD7C7F\ +CA1671897123CBD30DEF5D54A2B5536AD90A747E + +10001:\ +E7E8942720A877517273A356053EA2A1BC0C94AA72D55C6E86296B2DFC967948\ +C0A72CBCCCA7EACB35706E09A1DF55A1535BD9B3CC34160B3B6DCD3EDA8E6443:\ +B69DCA1CF7D4D7EC81E75B90FCCA874ABCDE123FD2700180AA90479B6E48DE8D\ +67ED24F9F19D85BA275874F542CD20DC723E6963364A1F9425452B269A6799FD:\ +BC656747FA9EAFB3F0:056F00985DE14D8EF5CEA9E82F8C27BEF720335E:\ +4609793B23E9D09362DC21BB47DA0B4F3A7622649A47D464019B9AEAFE53359C\ +178C91CD58BA6BCB78BE0346A7BC637F4B873D4BAB38EE661F199634C547A1AD\ +8442E03DA015B136E543F7AB07C0C13E4225B8DE8CCE25D4F6EB8400F81F7E18\ +33B7EE6E334D370964CA79FDB872B4D75223B5EEB08101591FB532D155A6DE87 + +10001:\ +016601E926A0F8C9E26ECAB769EA65A5E7C52CC9E080EF519457C644DA6891C5A1\ +04D3EA7955929A22E7C68A7AF9FCAD777C3CCC2B9E3D3650BCE404399B7E59D1:\ +014EAFA1D4D0184DA7E31F877D1281DDDA625664869E8379E67AD3B75EAE74A580\ +E9827ABD6EB7A002CB5411F5266797768FB8E95AE40E3E8A01F35FF89E56C079:\ +DABA032066263FAEDB659848115278A52C44FAA3A76F37515ED336321072C40A\ +9D9B53BC05014078ADF520875146AAE70FF060226DCB7B1F1FC27E9360:\ +57BF160BCB02BB1DC7280CF0458530B7D2832FF7:\ +014C5BA5338328CCC6E7A90BF1C0AB3FD606FF4796D3C12E4B639ED9136A5FEC\ +6C16D8884BDD99CFDC521456B0742B736868CF90DE099ADB8D5FFD1DEFF39BA4\ +007AB746CEFDB22D7DF0E225F54627DC65466131721B90AF445363A8358B9F60\ +7642F78FAB0AB0F43B7168D64BAE70D8827848D8EF1E421C5754DDF42C2589B5B3 + +10001:\ +016601E926A0F8C9E26ECAB769EA65A5E7C52CC9E080EF519457C644DA6891C5A1\ +04D3EA7955929A22E7C68A7AF9FCAD777C3CCC2B9E3D3650BCE404399B7E59D1:\ +014EAFA1D4D0184DA7E31F877D1281DDDA625664869E8379E67AD3B75EAE74A580\ +E9827ABD6EB7A002CB5411F5266797768FB8E95AE40E3E8A01F35FF89E56C079:\ +52A1D96C8AC39E41E455809801B927A5B445C10D902A0DCD3850D22A66D2BB07\ +03E67D5867114595AABF5A7AEB5A8F87034BBB30E13CFD4817A9BE7623002360\ +6D0286A3FAF8A4D22B728EC518079F9E64526E3A0CC7941AA338C437997C680C\ +CAC67C66BFA1:FCA862068BCE2246724B708A0519DA17E648688C:\ +007F0030018F53CDC71F23D03659FDE54D4241F758A750B42F185F87578520C3\ +0742AFD84359B6E6E8D3ED959DC6FE486BEDC8E2CF001F63A7ABE16256A1B84D\ +F0D249FC05D3194CE5F0912742DBBF80DD174F6C51F6BAD7F16CF3364EBA095A\ +06267DC3793803AC7526AEBE0A475D38B8C2247AB51C4898DF7047DC6ADF52C6C4 + +10001:\ +01BD36E18ECE4B0FDB2E9C9D548BD1A7D6E2C21C6FDC35074A1D05B1C6C8B3D5\ +58EA2639C9A9A421680169317252558BD148AD215AAC550E2DCF12A82D0EBFE853:\ +01B1B656AD86D8E19D5DC86292B3A192FDF6E0DD37877BAD14822FA00190CAB2\ +65F90D3F02057B6F54D6ECB14491E5ADEACEBC48BF0EBD2A2AD26D402E54F61651:\ +594B37333BBB2C84524A87C1A01F75FCEC0E3256F108E38DCA36D70D0057:\ +F31AD6C8CF89DF78ED77FEACBCC2F8B0A8E4CFAA:\ +0088B135FB1794B6B96C4A3E678197F8CAC52B64B2FE907D6F27DE761124964A\ +99A01A882740ECFAED6C01A47464BB05182313C01338A8CD097214CD68CA103B\ +D57D3BC9E816213E61D784F182467ABF8A01CF253E99A156EAA8E3E1F90E3C6E\ +4E3AA2D83ED0345B89FAFC9C26077C14B6AC51454FA26E446E3A2F153B2B16797F + +10001:\ +01BD36E18ECE4B0FDB2E9C9D548BD1A7D6E2C21C6FDC35074A1D05B1C6C8B3D5\ +58EA2639C9A9A421680169317252558BD148AD215AAC550E2DCF12A82D0EBFE853:\ +01B1B656AD86D8E19D5DC86292B3A192FDF6E0DD37877BAD14822FA00190CAB2\ +65F90D3F02057B6F54D6ECB14491E5ADEACEBC48BF0EBD2A2AD26D402E54F61651:\ +8B769528884A0D1FFD090CF102993E796DADCFBDDD38E44FF6324CA451:\ +FCF9F0E1F199A3D1D0DA681C5B8606FC642939F7:\ +02A5F0A858A0864A4F65017A7D69454F3F973A2999839B7BBC48BF7864116917\ +9556F595FA41F6FF18E286C2783079BC0910EE9CC34F49BA681124F923DFA88F\ +426141A368A5F5A930C628C2C3C200E18A7644721A0CBEC6DD3F6279BDE3E8F2\ +BE5E2D4EE56F97E7CEAF33054BE7042BD91A63BB09F897BD41E81197DEE99B11AF + +10001:\ +01BD36E18ECE4B0FDB2E9C9D548BD1A7D6E2C21C6FDC35074A1D05B1C6C8B3D5\ +58EA2639C9A9A421680169317252558BD148AD215AAC550E2DCF12A82D0EBFE853:\ +01B1B656AD86D8E19D5DC86292B3A192FDF6E0DD37877BAD14822FA00190CAB2\ +65F90D3F02057B6F54D6ECB14491E5ADEACEBC48BF0EBD2A2AD26D402E54F61651:\ +1ABDBA489C5ADA2F995ED16F19D5A94D9E6EC34A8D84F84557D26E5EF9B02B22\ +887E3F9A4B690AD1149209C20C61431F0C017C36C2657B35D7B07D3F5AD87085\ +07A9C1B831DF835A56F831071814EA5D3D8D8F6ADE40CBA38B42DB7A2D3D7A29\ +C8F0A79A7838CF58A9757FA2FE4C40DF9BAA193BFC6F92B123AD57B07ACE3E6A\ +C068C9F106AFD9EEB03B4F37C25DBFBCFB3071F6F9771766D072F3BB070AF660\ +5532973AE25051:986E7C43DBB671BD41B9A7F4B6AFC80E805F2423:\ +0244BCD1C8C16955736C803BE401272E18CB990811B14F72DB964124D5FA7606\ +49CBB57AFB8755DBB62BF51F466CF23A0A1607576E983D778FCEFFA92DF7548A\ +EA8EA4ECAD2C29DD9F95BC07FE91ECF8BEE255BFE8762FD7690AA9BFA4FA0849\ +EF728C2C42C4532364522DF2AB7F9F8A03B63F7A499175828668F5EF5A29E3802C + +10001:\ +01BD36E18ECE4B0FDB2E9C9D548BD1A7D6E2C21C6FDC35074A1D05B1C6C8B3D5\ +58EA2639C9A9A421680169317252558BD148AD215AAC550E2DCF12A82D0EBFE853:\ +01B1B656AD86D8E19D5DC86292B3A192FDF6E0DD37877BAD14822FA00190CAB2\ +65F90D3F02057B6F54D6ECB14491E5ADEACEBC48BF0EBD2A2AD26D402E54F61651:\ +8FB431F5EE792B6C2AC7DB53CC428655AEB32D03F4E889C5C25DE683C461B53A\ +CF89F9F8D3AABDF6B9F0C2A1DE12E15B49EDB3919A652FE9491C25A7FCE1F722\ +C2543608B69DC375EC:F8312D9C8EEA13EC0A4C7B98120C87509087C478:\ +0196F12A005B98129C8DF13C4CB16F8AA887D3C40D96DF3A88E7532EF39CD992\ +F273ABC370BC1BE6F097CFEBBF0118FD9EF4B927155F3DF22B904D90702D1F7B\ +A7A52BED8B8942F412CD7BD676C9D18E170391DCD345C06A730964B3F30BCCE0\ +BB20BA106F9AB0EEB39CF8A6607F75C0347F0AF79F16AFA081D2C92D1EE6F836B8 + +10001:\ +01BD36E18ECE4B0FDB2E9C9D548BD1A7D6E2C21C6FDC35074A1D05B1C6C8B3D5\ +58EA2639C9A9A421680169317252558BD148AD215AAC550E2DCF12A82D0EBFE853:\ +01B1B656AD86D8E19D5DC86292B3A192FDF6E0DD37877BAD14822FA00190CAB2\ +65F90D3F02057B6F54D6ECB14491E5ADEACEBC48BF0EBD2A2AD26D402E54F61651:\ +FEF4161DFAAF9C5295051DFC1FF3810C8C9EC2E866F7075422C8EC4216A9C4FF\ +49427D483CAE10C8534A41B2FD15FEE06960EC6FB3F7A7E94A2F8A2E3E43DC4A\ +40576C3097AC953B1DE86F0B4ED36D644F23AE14425529622464CA0CBF0B1741\ +347238157FAB59E4DE5524096D62BAEC63AC64:\ +50327EFEC6292F98019FC67A2A6638563E9B6E2D:\ +021ECA3AB4892264EC22411A752D92221076D4E01C0E6F0DDE9AFD26BA5ACF6D\ +739EF987545D16683E5674C9E70F1DE649D7E61D48D0CAEB4FB4D8B24FBA84A6\ +E3108FEE7D0705973266AC524B4AD280F7AE17DC59D96D3351586B5A3BDB895D\ +1E1F7820AC6135D8753480998382BA32B7349559608C38745290A85EF4E9F9BD83 + +10001:\ +01BD36E18ECE4B0FDB2E9C9D548BD1A7D6E2C21C6FDC35074A1D05B1C6C8B3D5\ +58EA2639C9A9A421680169317252558BD148AD215AAC550E2DCF12A82D0EBFE853:\ +01B1B656AD86D8E19D5DC86292B3A192FDF6E0DD37877BAD14822FA00190CAB2\ +65F90D3F02057B6F54D6ECB14491E5ADEACEBC48BF0EBD2A2AD26D402E54F61651:\ +EFD237BB098A443AEEB2BF6C3F8C81B8C01B7FCB3FEB:\ +B0DE3FC25B65F5AF96B1D5CC3B27D0C6053087B3:\ +012FAFEC862F56E9E92F60AB0C77824F4299A0CA734ED26E0644D5D222C7F0BD\ +E03964F8E70A5CB65ED44E44D56AE0EDF1FF86CA032CC5DD4404DBB76AB85458\ +6C44EED8336D08D457CE6C03693B45C0F1EFEF93624B95B8EC169C616D20E553\ +8EBC0B6737A6F82B4BC0570924FC6B35759A3348426279F8B3D7744E2D222426CE + +10001:\ +029232336D2838945DBA9DD7723F4E624A05F7375B927A87ABE6A893A1658FD4\ +9F47F6C7B0FA596C65FA68A23F0AB432962D18D4343BD6FD671A5EA8D148413995:\ +020EF5EFE7C5394AED2272F7E81A74F4C02D145894CB1B3CAB23A9A0710A2AFC\ +7E3329ACBB743D01F680C4D02AFB4C8FDE7E20930811BB2B995788B5E872C20BB1:\ +9FB03B827C8217D9:ED7C98C95F30974FBE4FBDDCF0F28D6021C0E91D:\ +0323D5B7BF20BA4539289AE452AE4297080FEFF4518423FF4811A817837E7D82\ +F1836CDFAB54514FF0887BDDEEBF40BF99B047ABC3ECFA6A37A3EF00F4A0C4A8\ +8AAE0904B745C846C4107E8797723E8AC810D9E3D95DFA30FF4966F4D75D1376\ +8D20857F2B1406F264CFE75E27D7652F4B5ED3575F28A702F8C4ED9CF9B2D44948 + +10001:\ +029232336D2838945DBA9DD7723F4E624A05F7375B927A87ABE6A893A1658FD4\ +9F47F6C7B0FA596C65FA68A23F0AB432962D18D4343BD6FD671A5EA8D148413995:\ +020EF5EFE7C5394AED2272F7E81A74F4C02D145894CB1B3CAB23A9A0710A2AFC\ +7E3329ACBB743D01F680C4D02AFB4C8FDE7E20930811BB2B995788B5E872C20BB1:\ +0CA2AD77797ECE86DE5BF768750DDB5ED6A3116AD99BBD17EDF7F782F0DB1CD0\ +5B0F677468C5EA420DC116B10E80D110DE2B0461EA14A38BE68620392E7E893C\ +B4EA9393FB886C20FF790642305BF302003892E54DF9F667509DC53920DF583F\ +50A3DD61ABB6FAB75D600377E383E6ACA6710EEEA27156E06752C94CE25AE99F\ +CBF8592DBE2D7E27453CB44DE07100EBB1A2A19811A478ADBEAB270F94E8FE36\ +9D90B3CA612F9F:22D71D54363A4217AA55113F059B3384E3E57E44:\ +049D0185845A264D28FEB1E69EDAEC090609E8E46D93ABB38371CE51F4AA65A5\ +99BDAAA81D24FBA66A08A116CB644F3F1E653D95C89DB8BBD5DAAC2709C89840\ +00178410A7C6AA8667DDC38C741F710EC8665AA9052BE929D4E3B16782C16621\ +14C5414BB0353455C392FC28F3DB59054B5F365C49E1D156F876EE10CB4FD70598 + +10001:\ +029232336D2838945DBA9DD7723F4E624A05F7375B927A87ABE6A893A1658FD4\ +9F47F6C7B0FA596C65FA68A23F0AB432962D18D4343BD6FD671A5EA8D148413995:\ +020EF5EFE7C5394AED2272F7E81A74F4C02D145894CB1B3CAB23A9A0710A2AFC\ +7E3329ACBB743D01F680C4D02AFB4C8FDE7E20930811BB2B995788B5E872C20BB1:\ +288062AFC08FCDB7C5F8650B29837300461DD5676C17A20A3C8FB5148949E3F7\ +3D66B3AE82C7240E27C5B3EC4328EE7D6DDF6A6A0C9B5B15BCDA196A9D0C76B1\ +19D534D85ABD123962D583B76CE9D180BCE1CA:\ +4AF870FBC6516012CA916C70BA862AC7E8243617:\ +03FBC410A2CED59500FB99F9E2AF2781ADA74E13145624602782E2994813EEFC\ +A0519ECD253B855FB626A90D771EAE028B0C47A199CBD9F8E3269734AF416359\ +9090713A3FA910FA0960652721432B971036A7181A2BC0CAB43B0B598BC62174\ +61D7DB305FF7E954C5B5BB231C39E791AF6BCFA76B147B081321F72641482A2AAD + +10001:\ +029232336D2838945DBA9DD7723F4E624A05F7375B927A87ABE6A893A1658FD4\ +9F47F6C7B0FA596C65FA68A23F0AB432962D18D4343BD6FD671A5EA8D148413995:\ +020EF5EFE7C5394AED2272F7E81A74F4C02D145894CB1B3CAB23A9A0710A2AFC\ +7E3329ACBB743D01F680C4D02AFB4C8FDE7E20930811BB2B995788B5E872C20BB1:\ +6F4F9AB9501199CEF55C6CF408FE7B36C557C49D420A4763D2463C8AD44B3CFC\ +5BE2742C0E7D9B0F6608F08C7F47B693EE:\ +40D2E180FAE1EAC439C190B56C2C0E14DDF9A226:\ +0486644BC66BF75D28335A6179B10851F43F09BDED9FAC1AF33252BB9953BA42\ +98CD6466B27539A70ADAA3F89B3DB3C74AB635D122F4EE7CE557A61E59B82FFB\ +786630E5F9DB53C77D9A0C12FAB5958D4C2CE7DAA807CD89BA2CC7FCD02FF470\ +CA67B229FCCE814C852C73CC93BEA35BE68459CE478E9D4655D121C8472F371D4F + +10001:\ +029232336D2838945DBA9DD7723F4E624A05F7375B927A87ABE6A893A1658FD4\ +9F47F6C7B0FA596C65FA68A23F0AB432962D18D4343BD6FD671A5EA8D148413995:\ +020EF5EFE7C5394AED2272F7E81A74F4C02D145894CB1B3CAB23A9A0710A2AFC\ +7E3329ACBB743D01F680C4D02AFB4C8FDE7E20930811BB2B995788B5E872C20BB1:\ +E17D20385D501955823C3F666254C1D3DD36AD5168B8F18D286FDCF67A7DAD94\ +097085FAB7ED86FE2142A28771717997EF1A7A08884EFC39356D76077AAF8245\ +9A7FAD45848875F2819B098937FE923BCC9DC442D72D754D812025090C9BC03D\ +B3080C138DD63B355D0B4B85D6688AC19F4DE15084A0BA4E373B93EF4A555096\ +691915DC23C00E954CDEB20A47CD55D16C3D8681D46ED7F2ED5EA42795BE17BA\ +ED25F0F4D113B3636ADDD585F16A8B5AEC0C8FA9C5F03CBF3B9B73:\ +2497DC2B4615DFAE5A663D49FFD56BF7EFC11304:\ +022A80045353904CB30CBB542D7D4990421A6EEC16A8029A8422ADFD22D6AFF8\ +C4CC0294AF110A0C067EC86A7D364134459BB1AE8FF836D5A8A2579840996B32\ +0B19F13A13FAD378D931A65625DAE2739F0C53670B35D9D3CBAC08E733E4EC2B\ +83AF4B9196D63E7C4FF1DDEAE2A122791A125BFEA8DEB0DE8CCF1F4FFAF6E6FB0A + +10001:\ +029232336D2838945DBA9DD7723F4E624A05F7375B927A87ABE6A893A1658FD4\ +9F47F6C7B0FA596C65FA68A23F0AB432962D18D4343BD6FD671A5EA8D148413995:\ +020EF5EFE7C5394AED2272F7E81A74F4C02D145894CB1B3CAB23A9A0710A2AFC\ +7E3329ACBB743D01F680C4D02AFB4C8FDE7E20930811BB2B995788B5E872C20BB1:\ +AFBC19D479249018FDF4E09F618726440495DE11DDEEE38872D775FCEA74A238\ +96B5343C9C38D46AF0DBA224D047580CC60A65E9391CF9B59B36A860598D4E82\ +16722F993B91CFAE87BC255AF89A6A199BCA4A391EADBC3A24903C0BD667368F\ +6BE78E3FEABFB4FFD463122763740FFBBEFEAB9A25564BC5D1C24C93E422F750\ +73E2AD72BF45B10DF00B52A147128E73FEE33FA3F0577D77F80FBC2DF1BED313\ +290C12777F50:A334DB6FAEBF11081A04F87C2D621CDEC7930B9B:\ +00938DCB6D583046065F69C78DA7A1F1757066A7FA75125A9D2929F0B79A60B6\ +27B082F11F5B196F28EB9DAA6F21C05E5140F6AEF1737D2023075C05ECF04A02\ +8C686A2AB3E7D5A0664F295CE12995E890908B6AD21F0839EB65B70393A7B5AF\ +D9871DE0CAA0CEDEC5B819626756209D13AB1E7BB9546A26FF37E9A51AF9FD562E + +10001:\ +03F2F331F4142D4F24B43AA10279A89652D4E7537221A1A7B2A25DEB551E5DE9\ +AC497411C227A94E45F91C2D1C13CC046CF4CE14E32D058734210D44A87EE1B73F:\ +034F090D73B55803030CF0361A5D8081BFB79F851523FEAC0A2124D08D4013FF\ +08487771A870D0479DC0686C62F7718DFECF024B17C9267678059171339CC00839:\ +30C7D557458B436DECFDC14D06CB7B96B06718C48D7DE57482A868AE7F065870\ +A6216506D11B779323DFDF046CF5775129134B4D5689E4D9C0CE1E12D7D4B06C\ +B5FC5820DECFA41BAF59BF257B32F025B7679B445B9499C92555145885992F1B\ +76F84891EE4D3BE0F5150FD5901E3A4C8ED43FD36B61D022E65AD5008DBF3329\ +3C22BFBFD07321F0F1D5FA9FDF0014C2FCB0358AAD0E354B0D29:\ +081B233B43567750BD6E78F396A88B9F6A445151:\ +0BA373F76E0921B70A8FBFE622F0BF77B28A3DB98E361051C3D7CB92AD045291\ +5A4DE9C01722F6823EEB6ADF7E0CA8290F5DE3E549890AC2A3C5950AB217BA58\ +590894952DE96F8DF111B2575215DA6C161590C745BE612476EE578ED384AB33\ +E3ECE97481A252F5C79A98B5532AE00CDD62F2ECC0CD1BAEFE80D80B962193EC1D + +10001:\ +03F2F331F4142D4F24B43AA10279A89652D4E7537221A1A7B2A25DEB551E5DE9\ +AC497411C227A94E45F91C2D1C13CC046CF4CE14E32D058734210D44A87EE1B73F:\ +034F090D73B55803030CF0361A5D8081BFB79F851523FEAC0A2124D08D4013FF\ +08487771A870D0479DC0686C62F7718DFECF024B17C9267678059171339CC00839:\ +328C659E0A6437433CCEB73C14:\ +9AEC4A7480D5BBC42920D7CA235DB674989C9AAC:\ +0BC989853BC2EA86873271CE183A923AB65E8A53100E6DF5D87A24C4194EB797\ +813EE2A187C097DD872D591DA60C568605DD7E742D5AF4E33B11678CCB639032\ +04A3D080B0902C89ABA8868F009C0F1C0CB85810BBDD29121ABB8471FF2D39E4\ +9FD92D56C655C8E037AD18FAFBDC92C95863F7F61EA9EFA28FEA401369D19DAEA1 + +10001:\ +04F0548C9626AB1EBF1244934741D99A06220EFA2A5856AA0E75730B2EC96ADC\ +86BE894FA2803B53A5E85D276ACBD29AB823F80A7391BB54A5051672FB04EEB543:\ +0483E0AE47915587743FF345362B555D3962D98BB6F15F848B4C92B1771CA8ED\ +107D8D3EE65EC44517DD0FAA481A387E902F7A2E747C269E7EA44480BC538B8E5B:\ +0F6195D04A6E6FC7E2C9600DBF840C39EA8D4D624FD53507016B0E26858A5E0A\ +ECD7ADA543AE5C0AB3A62599CBA0A54E6BF446E262F989978F9DDF5E9A41:\ +A87B8AED07D7B8E2DAF14DDCA4AC68C4D0AABFF8:\ +086DF6B500098C120F24FF8423F727D9C61A5C9007D3B6A31CE7CF8F3CBEC1A2\ +6BB20E2BD4A046793299E03E37A21B40194FB045F90B18BF20A47992CCD799CF\ +9C059C299C0526854954AADE8A6AD9D97EC91A1145383F42468B231F4D72F237\ +06D9853C3FA43CE8ACE8BFE7484987A1EC6A16C8DAF81F7C8BF42774707A9DF456 + +10001:\ +04F0548C9626AB1EBF1244934741D99A06220EFA2A5856AA0E75730B2EC96ADC\ +86BE894FA2803B53A5E85D276ACBD29AB823F80A7391BB54A5051672FB04EEB543:\ +0483E0AE47915587743FF345362B555D3962D98BB6F15F848B4C92B1771CA8ED\ +107D8D3EE65EC44517DD0FAA481A387E902F7A2E747C269E7EA44480BC538B8E5B:\ +9906D89F97A9FDEDD3CCD824DB687326F30F00AA25A7FCA2AFCB3B0F86CD41E7\ +3F0E8FF7D2D83F59E28ED31A5A0D551523374DE22E4C7E8FF568B386EE3DC411\ +63F10BF67BB006261C9082F9AF90BF1D9049A6B9FAE71C7F84FBE6E55F02789D\ +E774F230F115026A4B4E96C55B04A95DA3AACBB2CECE8F81764A1F1C99515411\ +087CF7D34AEDED0932C183:FBBE059025B69B89FB14AE2289E7AAAFE60C0FCD:\ +0A40A16E2FE2B38D1DF90546167CF9469C9E3C3681A3442B4B2C2F581DEB385C\ +E99FC6188BB02A841D56E76D301891E24560550FCC2A26B55F4CCB26D837D350\ +A154BCACA8392D98FA67959E9727B78CAD03269F56968FC56B68BD679926D83C\ +C9CB215550645CCDA31C760FF35888943D2D8A1D351E81E5D07B86182E751081EF + +10001:\ +07EEFB424B0E3A40E4208EE5AFB280B22317308114DDE0B4B64F730184EC68DA\ +6CE2867A9F48ED7726D5E2614ED04A5410736C8C714EE702474298C6292AF07535:\ +070830DBF947EAC0228DE26314B59B66994CC60E8360E75D3876298F8F8A7D14\ +1DA064E5CA026A973E28F254738CEE669C721B034CB5F8E244DADD7CD1E159D547:\ +8D80D2D08DBD19C154DF3F14673A14BD03735231F24E86BF153D0E69E74CBFF7\ +B1836E664DE83F680124370FC0F96C9B65C07A366B644C4AB3:\ +0C09582266DF086310821BA7E18DF64DFEE6DE09:\ +10FD89768A60A67788ABB5856A787C8561F3EDCF9A83E898F7DC87AB8CCE7942\ +9B43E56906941A886194F137E591FE7C339555361FBBE1F24FEB2D4BCDB80601\ +F3096BC9132DEEA60AE13082F44F9AD41CD628936A4D51176E42FC59CB76DB81\ +5CE5AB4DB99A104AAFEA68F5D330329EBF258D4EDE16064BD1D00393D5E1570EB8 + +10001:\ +07EEFB424B0E3A40E4208EE5AFB280B22317308114DDE0B4B64F730184EC68DA\ +6CE2867A9F48ED7726D5E2614ED04A5410736C8C714EE702474298C6292AF07535:\ +070830DBF947EAC0228DE26314B59B66994CC60E8360E75D3876298F8F8A7D14\ +1DA064E5CA026A973E28F254738CEE669C721B034CB5F8E244DADD7CD1E159D547:\ +45013CEBAFD960B255476A8E2598B9AA32EFBE6DC1F34F4A498D8CF5A2B4548D\ +08C55D5F95F7BCC9619163056F2D58B52FA032:\ +9D5AD8EB452134B65DC3A98B6A73B5F741609CD6:\ +07EB651D75F1B52BC263B2E198336E99FBEBC4F332049A922A10815607EE2D98\ +9DB3A4495B7DCCD38F58A211FB7E193171A3D891132437EBCA44F318B280509E\ +52B5FA98FCCE8205D9697C8EE4B7FF59D4C59C79038A1970BD2A0D451ECDC5EF\ +11D9979C9D35F8C70A6163717607890D586A7C6DC01C79F86A8F28E85235F8C2F1 + +10001:\ +08DAD7F11363FAA623D5D6D5E8A319328D82190D7127D2846C439B0AB72619B0\ +A43A95320E4EC34FC3A9CEA876422305BD76C5BA7BE9E2F410C8060645A1D29EDB:\ +0847E732376FC7900F898EA82EB2B0FC418565FDAE62F7D9EC4CE2217B97990D\ +D272DB157F99F63C0DCBB9FBACDBD4C4DADB6DF67756358CA4174825B48F49706D:\ +E2F96EAF0E05E7BA326ECCA0BA7FD2F7C02356F3CEDE9D0FAABF4FCC8E60A973\ +E5595FD9EA08:435C098AA9909EB2377F1248B091B68987FF1838:\ +2707B9AD5115C58C94E932E8EC0A280F56339E44A1B58D4DDCFF2F312E5F34DC\ +FE39E89C6A94DCEE86DBBDAE5B79BA4E0819A9E7BFD9D982E7EE6C86EE68396E\ +8B3A14C9C8F34B178EB741F9D3F121109BF5C8172FADA2E768F9EA1433032C00\ +4A8AA07EB990000A48DC94C8BAC8AABE2B09B1AA46C0A2AA0E12F63FBBA775BA7E + +10001:\ +08DAD7F11363FAA623D5D6D5E8A319328D82190D7127D2846C439B0AB72619B0\ +A43A95320E4EC34FC3A9CEA876422305BD76C5BA7BE9E2F410C8060645A1D29EDB:\ +0847E732376FC7900F898EA82EB2B0FC418565FDAE62F7D9EC4CE2217B97990D\ +D272DB157F99F63C0DCBB9FBACDBD4C4DADB6DF67756358CA4174825B48F49706D:\ +04DC251BE72E88E5723485B6383A637E2FEFE07660C519A560B8BC18BDEDB86E\ +AE2364EA53BA9DCA6EB3D2E7D6B806AF42B3E87F291B4A8881D5BF572CC9A85E\ +19C86ACB28F098F9DA0383C566D3C0F58CFD8F395DCF602E5CD40E8C7183F714\ +996E2297EF:C558D7167CBB4508ADA042971E71B1377EEA4269:\ +33341BA3576A130A50E2A5CF8679224388D5693F5ACCC235AC95ADD68E5EB1EE\ +C31666D0CA7A1CDA6F70A1AA762C05752A51950CDB8AF3C5379F18CFE6B5BC55\ +A4648226A15E912EF19AD77ADEEA911D67CFEFD69BA43FA4119135FF642117BA\ +985A7E0100325E9519F1CA6A9216BDA055B5785015291125E90DCD07A2CA9673EE + +10001:\ +CFD50283FEEEB97F6F08D73CBC7B3836F82BBCD499479F5E6F76FDFCB8B38C4F\ +71DC9E88BD6A6F76371AFD65D2AF1862B32AFB34A95F71B8B132043FFEBE3A95\ +2BAF7592448148C03F9C69B1D68E4CE5CF32C86BAF46FED301CA1AB403069B32\ +F456B91F71898AB081CD8C4252EF5271915C9794B8F295851DA7510F99CB73EB:\ +CC4E90D2A1B3A065D3B2D1F5A8FCE31B544475664EAB561D2971B99FB7BEF844\ +E8EC1F360B8C2AC8359692971EA6A38F723FCC211F5DBCB177A0FDAC5164A1D4\ +FF7FBB4E829986353CB983659A148CDD420C7D31BA3822EA90A32BE46C030E8C\ +17E1FA0AD37859E06B0AA6FA3B216D9CBE6C0E22339769C0A615913E5DA719CF:\ +883177E5126B9BE2D9A9680327D5370C6F26861F5820C43DA67A3AD609:\ +04E215EE6FF934B9DA70D7730C8734ABFCECDE89:\ +82C2B160093B8AA3C0F7522B19F87354066C77847ABF2A9FCE542D0E84E920C5\ +AFB49FFDFDACE16560EE94A1369601148EBAD7A0E151CF16331791A5727D05F2\ +1E74E7EB811440206935D744765A15E79F015CB66C532C87A6A05961C8BFAD74\ +1A9A6657022894393E7223739796C02A77455D0F555B0EC01DDF259B6207FD0F\ +D57614CEF1A5573BAAFF4EC00069951659B85F24300A25160CA8522DC6E6727E\ +57D019D7E63629B8FE5E89E25CC15BEB3A647577559299280B9B28F79B040900\ +0BE25BBD96408BA3B43CC486184DD1C8E62553FA1AF4040F60663DE7F5E49C04\ +388E257F1CE89C95DAB48A315D9B66B1B7628233876FF2385230D070D07E1666 + +# These have specially constructed seeds that result in leading +# bytes of the output being 0 (this was a problem in version prior +# to 0.8.7) +10001:\ +D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ +F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ +CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ +4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ +454D5341342074657374206F66206C656164696E67203073:\ +5C7F7F0932FC4FF8555C3875CE3A0F86BF5B744E:\ +049C40560875766E164A89B2D19D91EF2AABAB4AC182657CAD93680319D8CDBE\ +3CABCF3E87BF41C16013AC4E3D2DEBFB8F89E9E057012B8EDFD0310E24E2BBF4\ +3D54B2664DF3AC82D7E8913ABE29D0A022277EB74D2E0C8C5F4C3F46FABB35D9\ +32A4A713A82FC9464581D9B1F43A2AFB9AB8177DEE8C38CC9F15A7E8F3F9B4D3 + +10001:\ +D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ +F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ +CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ +4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ +454D5341342074657374206F66206C656164696E67203073:\ +B0E37FD9119056FBC17F9C726B0AE7829350F93D:\ +82E54D1CD28D562D85DD3774636C65313CF26628076FC16A4D25AACCB566FCC8\ +77401BB44DFCB8ADBC6E595D515146D227E9AE6D4D585759F435642DFF2BB1EA\ +3AC72E633C05FB3DC0D8E63395099D5A535DF6EA89341E36D73808D5116299EE\ +C827BB2B6C3141AC0A5698DCDC252B7EDC3A5C24DE75287EEB60F45A37DFBEA3 + +10001:\ +D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ +F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ +CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ +4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ +454D5341342074657374206F66206C656164696E67203073:\ +E4AE5BB1DD6DF73F8F75E441DA531F0E493AC0A7:\ +8A64E30AEC76B278B08FF3BF61B7FF439DC2B0F6B789459F1386C0FBF24AF863\ +EFC5A58C5E9CB841EA08D2E22E40293B1876BBB976947038AEEAA36B1751FF97\ +13B9F7BD306D9360CC8D78B7A607F9CA7B4C18C308D85330E534337998D97D6F\ +70F828D6AD1C9C7F6916476127993E4E6F7D596BA6C246F0EB7312A02D09BFB3 + +# These test verification with various seed sizes. Botan cannot actually create +# such a signature, since seed sizes != size of hash are not allowed. These +# were created by some RSA PSS test code, with various salt sizes. This is not +# an exhautive test (obviously), but from this, and a careful reading of +# emsa4.cpp, it looks like Botan's EMSA4 will accept any valid EMSA4 message +# representative. + +# Format for verification: e:n:message:signature +[RSAVA/EMSA4(SHA-1)] +# No salt +10001:\ +AABBFB1E4E6F15D4D59E50C25998870956ED9E822D3DD899CAB0FA597B4D1C0E\ +61997501FD1C6E9D756BDCBE9BF49C7FA32926F3FDB387D83296BE35EF360872\ +350AE98C934D760BE7A933CFE85DFB99621D32105AC89496C9F001FE9CEAB097\ +C8DD55D6FD3D913496106BB04F265ED12F8ACD5F4B3FD7129809CA8D80E2E1D3:\ +B841D0374D3C86E67B67BDF00B:\ +1060A74E3EF067A9B17754500B16B8C9F6B3B453FB290C71FCAE779DD37A6B9A\ +24A45D1560DF5E4BC31143E6197AB15684236D8FE578E022495897F70451FD90\ +2BFA5703947EDFF0B63BF1140C63AE1C8D369A87B192E8BF6A3D486E909C3979\ +703806010367CA0E0026F8920EA766B7E3759E23954D0EC2F746E6046FC14758 + +# No salt +10001:\ +AABBFB1E4E6F15D4D59E50C25998870956ED9E822D3DD899CAB0FA597B4D1C0E\ +61997501FD1C6E9D756BDCBE9BF49C7FA32926F3FDB387D83296BE35EF360872\ +350AE98C934D760BE7A933CFE85DFB99621D32105AC89496C9F001FE9CEAB097\ +C8DD55D6FD3D913496106BB04F265ED12F8ACD5F4B3FD7129809CA8D80E2E1D3:\ +0F1D14F9:\ +7D4F2EE63FF4B46A09EBB8F9E2F58B4634234B890F7270FDF3454CD2EEAF1BAC\ +AC3516BB5D0F678365E5226034032D6AD49069ED9C7B8BE471BFC6D9BBE3327C\ +BA545675212A5552948524E52567FCE84D9D211191AAB864153C08DFC7576703\ +C21FB9315578A0F1C167FF4D2B810578DC98FBC1235A4CD62ED89BD092C31C00 + +# 1 byte salt +10001:\ +A7DB819EAAF3E6876B927ED6EEA94B97E20D06753C7555A7440631216FF4E943\ +720DE7BE6364B8DE17E663705549051F04141D8612214BC269CC09FBDF1F561E\ +474A2ECA28ADDE3530CA339015F23CEE63750C508A1416FE5D1AEF5AA09BBA7F\ +36CFC02874B15DCA913E35B52B281D32B1CEBD22EAF3C629123988FE78FD0561:\ +AEAD5A03023E17D894226CB2C7C77D5D4341E8BF7F1453140D58B427B40B0B18A9:\ +27ABB6E27D9DBA0F9E5DB3607BF04E20112150A779EAF67D4AA76D50A6060F70\ +03BB33BE5A580789E567C3768AF938BDBADE712F7344B72655118636095EA8D6\ +97888B9382BF3030D56A685079980A992A9BED3AF0DC81AE4316AF31681A3BDD\ +78CC4E83FD3C227A9984C261ADF36D201AA417243A28BA47488BD81CB1DA63A4 + +# 2 byte salt +10001:\ +AABBFB1E4E6F15D4D59E50C25998870956ED9E822D3DD899CAB0FA597B4D1C0E\ +61997501FD1C6E9D756BDCBE9BF49C7FA32926F3FDB387D83296BE35EF360872\ +350AE98C934D760BE7A933CFE85DFB99621D32105AC89496C9F001FE9CEAB097\ +C8DD55D6FD3D913496106BB04F265ED12F8ACD5F4B3FD7129809CA8D80E2E1D3:\ +6A4BAEE539612920ECB3075EF6C31BD7EEA01F43:\ +36F7211C290577ED0CF54007551BA65943C388BF2AE58F12E8BF7B6E7339348F\ +2534E7515232D0AD72AD8F6EA173FA3D21DE13D392DE10C457DDA7C569AAAE17\ +0C8806A3ACA457461EFBAA7EC870947ABE2D5A91821B9254EA34A74E95E7648E\ +D98A7ACD2300D4FC88C8B968E0AE68DF9BFF849E53AF03A2E12965C1453AAFC4 + +# 3 byte salt +10001:\ +CB6484FE402A7E96E3E43AC26CBF3FED47FBDF6921D40072FC27FA110CFF8D94\ +EDAC5E119D0801CEC89875BBB6FBD838BD0FB7F7F7FA62FAEA798CC6975F43ED\ +CADA7947BABA41DBDEB321E273C870973A9E741791380886B4B131165EDDFCF4\ +F162E17AD36E8D7A763502920527DFA9CDFF0D1046914195D2924D4075DEA235:\ +0F50:\ +707E1B680D4D7E2CD102ED7AF2B63AE63CAD9266476418F330FB739FD052A777\ +4A0182624E81C3AD14C12BA5BA1D99315217D84EA1FAABF4A90E7CFF19875351\ +46D4944AE27E2C84F313E5E5A22C5B86A88333DBBC4D17425F180C6B0F4BFD3E\ +9F03DE21B422EC125DA6FF2835A93CEBED8C1283568E04BB634CAC410D144B91 + +# 4 byte salt +10001:\ +A7DB819EAAF3E6876B927ED6EEA94B97E20D06753C7555A7440631216FF4E943\ +720DE7BE6364B8DE17E663705549051F04141D8612214BC269CC09FBDF1F561E\ +474A2ECA28ADDE3530CA339015F23CEE63750C508A1416FE5D1AEF5AA09BBA7F\ +36CFC02874B15DCA913E35B52B281D32B1CEBD22EAF3C629123988FE78FD0561:\ +5C3DB99915C8F7EEACB045ECBB7C35C06D4ED5A96AA9025A49093B70D7C2EDD4\ +85930D18DEB57C0282563F2B07FBA63245FDC773CF851985475DFB4F6FA335BE\ +1B4C2C28A294E84E50172AA585B382BE1E1038FBD02F2BD37691D85A18346AD0\ +4CC81948698FF248CFAF33E222EA8B5FCAEC0E5AA8F753521EC47BCB756E05CF\ +95E4365E06A69BB6C99A34A62939B478AC1209FFACC49BA4027749801D4A9F58\ +3395B34340:\ +9705B191BE8BD52D3E6CA1743DACDA5EDC1C7665B6EBC769A5983BB74D2F52C7\ +9F94954DC8CAB9A44FB3B387A0FF2843311CDA640DC39BA975518B511DF87064\ +B17709804D707DA08A315F14D24CF6385310A62D7F6C47689B66C4A12F449FC9\ +5796F1821EA6838DE2941D0725B55EC860CB553B36878C2BA3994DCD0A8992FF + +# 5 byte salt +10001:\ +CB6484FE402A7E96E3E43AC26CBF3FED47FBDF6921D40072FC27FA110CFF8D94\ +EDAC5E119D0801CEC89875BBB6FBD838BD0FB7F7F7FA62FAEA798CC6975F43ED\ +CADA7947BABA41DBDEB321E273C870973A9E741791380886B4B131165EDDFCF4\ +F162E17AD36E8D7A763502920527DFA9CDFF0D1046914195D2924D4075DEA235:\ +F1FE75913B7A152626C287B1287B6ED4A04EB546950C0414B2D7AAF82DF8F255\ +E08E20A2CACD2399C4304FD9F77B9CF8B2A244C15ABC25DCFE1B144F2B125AF7\ +91B05877E11BEAF3ECC75FC9:\ +87337D2D71F36C4452216459D55586634D755C84D9D8F80D058E029A1CB61A6D\ +4819E3993B623AF90FF915AC585AE6088DF7565A2A205D6282252EA0863A7F12\ +F07A06189F2E2C4EC6B27EBDF3955ADC7C85B803C612D44B9EA5D5FC0B7F15D8\ +AC704D83DEC3D8F84808C2AA5F984FD06D1456B4EF875C33A7346051514DCECC + +# 6 byte salt +10001:\ +CB6484FE402A7E96E3E43AC26CBF3FED47FBDF6921D40072FC27FA110CFF8D94\ +EDAC5E119D0801CEC89875BBB6FBD838BD0FB7F7F7FA62FAEA798CC6975F43ED\ +CADA7947BABA41DBDEB321E273C870973A9E741791380886B4B131165EDDFCF4\ +F162E17AD36E8D7A763502920527DFA9CDFF0D1046914195D2924D4075DEA235:\ +04F7B2C9BEEE7F00FD42C651A3492E6F61816AB3B0903477CFB49B2DDE8AB64D\ +898019C6C937FE653A92C1BD992A3304F357:\ +14949A71A7AF9EC4364DDF90E5A7C4283F8FEF7DD3A544FFA4B1BCEC5FEA6C21\ +4FE7C9105393E72D308CA0994F6F900479219439B8FDC850E15404C024AB757B\ +F7DDF35B0CEC668AEAAAB5039EC81F739C160DD57B26ACDECE905F608AB0396F\ +9DE8F99A53F765D37FB625C8E90C68B4E5B32AEF48C0FDA39B7314FCE942A9E9 + +# 7 byte salt +10001:\ +A7DB819EAAF3E6876B927ED6EEA94B97E20D06753C7555A7440631216FF4E943\ +720DE7BE6364B8DE17E663705549051F04141D8612214BC269CC09FBDF1F561E\ +474A2ECA28ADDE3530CA339015F23CEE63750C508A1416FE5D1AEF5AA09BBA7F\ +36CFC02874B15DCA913E35B52B281D32B1CEBD22EAF3C629123988FE78FD0561:\ +71D2C0843ACA68C291953E66:\ +4C22BC81446B062A561D9A922E959036E7763B0803DD84168C48AC51DBE79A12\ +9D017E22BF9DA19996C09BE7369C4F0808ACC2E708DFF48AA2AD41EF78F5F97B\ +914FFE079BE9F9D30E67049BA28BEE714FE622A18A3524FC7E58ED7C451714F1\ +4718F4475814B6D9A6590845D9CF6FEA2DCD313CFD580B47D5BEF6960CB0E463 + +# 9 byte salt +10001:\ +A8802DFF63A68E53D5B4AEFDF9BFBDDC2F3FF809D248CBC4AA250AE710830671\ +4ECD4BA4C465298C7E7EFAAD9ED969BDD23D851D31BAD61FA942B24A60D34469\ +F2774133D488E82E66B01FE4C7C8CDF95CB194D721FBE3B98FFC61D31F07D8CE\ +E32318EFF73E374755CBCB3785D93772A414DA3C25B240B16F40C83723448861:\ +9D5116B54CBA7970742B66BE6924D122A1D7E570F037DA06B29A2B34175C8F94\ +28D1E8E908EF492892AFD6B08019EED0123F32B74D04324DDB98171ADE66347C\ +1FFB56BD1B05E1CECE2ADD838BD95CDEB74E36A51B69F2602322593462182437\ +AF357BB63EF748F45CDDB66BE5357E9701C8B21C6613857432CB99C91CDFCB72\ +54D087B361CCF05E77AF961F023E83416D9FF539A572A5C89117FE1506AF6633\ +5321A0CB7BF096DA0590D2E79FA60DD7A38B9DF2D352673F5A31A873111E3C8D:\ +A73BC3BD89ADF92FF2B8EE3B5430849301C322074696BD58FCA3D0C113BC9CD7\ +9D6D822FCE31ABF1C276C1272D045E5FD92BAE9FBC07EE54742D3342A2B03E85\ +47B1DC94E86C5D08A13708780952498CE3EF3B07710E5777683C9630821248A9\ +D38BEC8AB7C77DF1CA6E695F0289443C13A8A4834D97CE6DCBB6782A70F866B1 + +# 10 byte salt +10001:\ +A7DB819EAAF3E6876B927ED6EEA94B97E20D06753C7555A7440631216FF4E943\ +720DE7BE6364B8DE17E663705549051F04141D8612214BC269CC09FBDF1F561E\ +474A2ECA28ADDE3530CA339015F23CEE63750C508A1416FE5D1AEF5AA09BBA7F\ +36CFC02874B15DCA913E35B52B281D32B1CEBD22EAF3C629123988FE78FD0561:\ +75352B85B47E73B18E8CD9608354ACCA4DF8E2B73313C681A8119D6578CAF8F9\ +A52EB4710B97D334D2CD49C365BC0E0BB89D63CEBE3EC62055E7948C9DF696B4\ +06EAB60881B0371F5AE092D0A43ED9AD307D026B2CB6477AF5ACC32919D470C3\ +9C9BAA71B0FA78F8687BF762C399407BB39C59727AF3B61DF3EA486E473D4CC8\ +D67805E8810F:\ +7F51B49FA57C4EC7AC72A90C9EBB51F6E21E3B6EE67E6DE32119AC9FCF97FB19\ +09F74491CDE182ECBED994B66EEC44AC817A8F620444BB6520A3A223BE4AFA78\ +B50F11C057FA4F4835D55283157F5C8AE60A2A46D0CB9D4BE3411FD3505F0FAC\ +5202ED1C0629575B59001488B30E9F12E738F2B388C7EF8A82684CBA43115010 + +# 11 byte salt +10001:\ +A7DB819EAAF3E6876B927ED6EEA94B97E20D06753C7555A7440631216FF4E943\ +720DE7BE6364B8DE17E663705549051F04141D8612214BC269CC09FBDF1F561E\ +474A2ECA28ADDE3530CA339015F23CEE63750C508A1416FE5D1AEF5AA09BBA7F\ +36CFC02874B15DCA913E35B52B281D32B1CEBD22EAF3C629123988FE78FD0561:\ +DA40B3B401DEED4DBCC3848CC729C8B5FD169A140914C40FEB752E2D3F2F7EFA\ +A97CE26BABE4099BDBBAA522BB09DB37A1D06CB53A3BF7D621:\ +328E325D4F95D0013019B97F5936EBB347F1E5B01A559560518C1C47DC044343\ +92BD2168DA08668E4EEA9A06A5CED7C9076BF7CAC667503FE6B7903953958BAB\ +B31EE9B29E356274F7136F35F5224A1BF50F3663D002B6220C3EA8572C1368D1\ +1D3C6DD6E1F3D700811257EF8B46246C2A6A975C08DEA782003F5CD45703FD22 + +# 16 byte salt +10001:\ +AABBFB1E4E6F15D4D59E50C25998870956ED9E822D3DD899CAB0FA597B4D1C0E\ +61997501FD1C6E9D756BDCBE9BF49C7FA32926F3FDB387D83296BE35EF360872\ +350AE98C934D760BE7A933CFE85DFB99621D32105AC89496C9F001FE9CEAB097\ +C8DD55D6FD3D913496106BB04F265ED12F8ACD5F4B3FD7129809CA8D80E2E1D3:\ +1C79CF64CCAA6C913ABAA5A555558BC251:\ +0C9485139F787BB6EFBF23783CEC74A53DFF16937FA6E76BF120D15ACF87D848\ +0B7EACED7B44ACD2A87C92A3F5AB185B81664AE248C7557C2766656C05A5D206\ +DD110E0E97F4F63364BB396F8431ECA2352FF84B4DB5F54FFAB155768624489F\ +D6E7C40282D1F9D85674D21E01571FD24423461F3D04D9595C43BFEB8EC586E3 + +# 19 byte salt +10001:\ +A7DB819EAAF3E6876B927ED6EEA94B97E20D06753C7555A7440631216FF4E943\ +720DE7BE6364B8DE17E663705549051F04141D8612214BC269CC09FBDF1F561E\ +474A2ECA28ADDE3530CA339015F23CEE63750C508A1416FE5D1AEF5AA09BBA7F\ +36CFC02874B15DCA913E35B52B281D32B1CEBD22EAF3C629123988FE78FD0561:\ +3096922A62DABF6B98A4480D2F86629D1992FFE1545869DCE5E69F810EB793C5\ +ABFFAEE2EEB846644C8BE8E31942BA16FE51B7988F355999CFFBA28CFB9DDB1B\ +5F4919790B7E63E37F00289C6CD42F56F7520A2DDA73AEA4BCB2D10053AB9720\ +B201D52AAE450BF22AF2C4E3AC:\ +43F583905ED6D2D53045C60E472FC1FED12EBD88C190EE810F9576E262F3881F\ +BF006211DD5943A48BAC7FF21C4317BC28E4968C98FF6E0F94C055FB104555C1\ +E7B533F9DDC49D200CAA8C2F62C5EDC6A9E9E76290DDEBF38BAEC88EEF8B32B3\ +DE804FF19627C04B13261CE2EF2101619CA1D6BDF3C5C7DEDCF21E18726081CE + + +# Format: KEY:message:signature +# These tests are copies of a couple above. The only reason they exist +# is to test parsing of RSA public keys in X.509 format. +[RSAVA_X509/EMSA4(SHA-1)] +-----BEGIN PUBLIC KEY-----\ +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqu/seTm8V1NWeUMJZmIcJVu2e\ +gi092JnKsPpZe00cDmGZdQH9HG6ddWvcvpv0nH+jKSbz/bOH2DKWvjXvNghyNQrp\ +jJNNdgvnqTPP6F37mWIdMhBayJSWyfAB/pzqsJfI3VXW/T2RNJYQa7BPJl7RL4rN\ +X0s/1xKYCcqNgOLh0wIDAQAB\ +-----END PUBLIC KEY-----:\ +B841D0374D3C86E67B67BDF00B:\ +1060A74E3EF067A9B17754500B16B8C9F6B3B453FB290C71FCAE779DD37A6B9A\ +24A45D1560DF5E4BC31143E6197AB15684236D8FE578E022495897F70451FD90\ +2BFA5703947EDFF0B63BF1140C63AE1C8D369A87B192E8BF6A3D486E909C3979\ +703806010367CA0E0026F8920EA766B7E3759E23954D0EC2F746E6046FC14758 + +-----BEGIN PUBLIC KEY-----\ +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn24GeqvPmh2uSftbuqUuX4g0G\ +dTx1VadEBjEhb/TpQ3IN575jZLjeF+ZjcFVJBR8EFB2GEiFLwmnMCfvfH1YeR0ou\ +yiit3jUwyjOQFfI87mN1DFCKFBb+XRrvWqCbun82z8AodLFdypE+NbUrKB0ysc69\ +IurzxikSOYj+eP0FYQIDAQAB\ +-----END PUBLIC KEY-----:\ +5C3DB99915C8F7EEACB045ECBB7C35C06D4ED5A96AA9025A49093B70D7C2EDD4\ +85930D18DEB57C0282563F2B07FBA63245FDC773CF851985475DFB4F6FA335BE\ +1B4C2C28A294E84E50172AA585B382BE1E1038FBD02F2BD37691D85A18346AD0\ +4CC81948698FF248CFAF33E222EA8B5FCAEC0E5AA8F753521EC47BCB756E05CF\ +95E4365E06A69BB6C99A34A62939B478AC1209FFACC49BA4027749801D4A9F58\ +3395B34340:\ +9705B191BE8BD52D3E6CA1743DACDA5EDC1C7665B6EBC769A5983BB74D2F52C7\ +9F94954DC8CAB9A44FB3B387A0FF2843311CDA640DC39BA975518B511DF87064\ +B17709804D707DA08A315F14D24CF6385310A62D7F6C47689B66C4A12F449FC9\ +5796F1821EA6838DE2941D0725B55EC860CB553B36878C2BA3994DCD0A8992FF + +[RSAVA/EMSA4(SHA-224)] +10001:\ +B8961C3F4D6A9DC27FAE6C30229E1DA910AF796C4EFB2E97DB11E636A7D6ED94672BE33FD7771\ +75CD0D879D805D06F1C9B2A064DCCFB38A63BD768BC092A0AC3740FE390452492A4BB1C2ECD38\ +C771264D0B2FF0496AF5CD6D139287ED3200A9:\ +7072696F6E636F7270:\ +B7530DA7632263B5AA4B0DC9FCBC3BCDF8B44EE2B4BECFD90BDEC108F50EBE325BE6F4EC8900B\ +A1C345F2B6F59FB625C3D99BC6F04D99704144B05C2ACDD61927D3EBD886650E933774DF72EED\ +0A5A3AA2810C17B56F877D989AF3A469950D0B + +10001:\ +CA76759F53C1F5F771C00A7C6E09E20754132CEE14C671ACAF687DD4006CCC54F34018C554601\ +18DA1036951EF27EB3211138369D9C3C5EB1C3960A9F6DE7794798E2B33856EB0120CA6771CAA\ +824F1F00FFB4596604700676A6C117C87E12EAEFB6476CD4D83A08C6A6A2EAB3ABC3B71FAF967\ +9EA09735DCC8849ACF80F3705:\ +7072696F6E636F7270:\ +B4816EA318CD92A64FBCF77C4E42E283534B2C500652DF6D88FF24130EB5C84350E9F52E4822B\ +F60D7C4AE4FA11C811A7A0B4DF93C0215BC9B3D04337BC044E1994959D67E0E33121C9CDE1C50\ +699B6C00966160F51C606334E15EBF60FBB8C76EFBBBA51460C75D30DE0F47863A1020885F5A4\ +DF8AAA397C03AA409833380B1 + +10001:\ +EA70F789F0117223878E296C191838EC52A63918C0B47E02430331182938F8590CB3295FEE645\ +9A90C9923A888F0FCCEF8D422D75B60DCA3ADD01D6C738472211CECE779420FD4BD381C04C572\ +F9AFF554CABB6532C6361F78EE0AAB4FF5A1FA33C5FE7EF3AFE1C5F6CFEA0BA25B0CC4C6FC396\ +BF30535D69928282B6E20371B:\ +7072696F6E636F7270:\ +4FAF0FB7EEBB26B9BA778D092B42CEECBBA36B4DBBBE35C6B383439F23F2062642CB3D091BA77\ +C4E1C46280E85C8C40A24FCEF5CDC9F4E383A54B19BB3BCD8B5DC28070CD5FFCA1525F6A655CE\ +672EF96438F375E6483ACEB338180B24FAD3E4F67B58E246D0BCE09DFEDF5249F30517DA52FDE\ +9340EE69B1B1316B81C2E2E1E + +10001:\ +FA294359ECC80FF6077B2BC558710A384A24A72CBF61FBDFF3820BA2DE987906A93FD7591BB0D\ +CCB7FA287343876FEB5CF5ABAE579D01A5626C7924FDA429BEADB924CA9E49F99074A850F7084\ +F7E8747E9A7531BAF576524994AEEDA1CFF1D561B3D16793310280626A2FD0A942324FD04E6B9\ +B80AE0A9CBFC3D8E0D5CA12CE5D04C3C49ABF871D62366A8657342690EA73CE1EC68F65A1835D\ +48B4008346E8EECBCC4FA48C7D62E8844C149AAA4E75717DDE3F38F72FE37CE1269B3C2BF7A7:\ +7072696F6E636F7270:\ +EB6106EBBC6F7F29B503E7AED4CF9FD01F75F2C11433DE73188AC19A9A41D59F995107AD9F8B6\ +57B0718226245A4C149E352BF5D129F53971E30A4DE702876528EA67A8EBFD096396B7229BA9D\ +6DA710DB37613F5FB1F3993B391741CE8E11EE0C324E3F33CFBEB78DB0F270B0C0CC7D3497F85\ +94EC262D88EF9E03EBFD9E26ECE0921006C521A4B1B41D75BD79B5534B183893A18FE183DCCD1\ +506B22E0E7FEF53E56B74870B62EDD262AA45F3FA9CBFC18045A549D5E202D2D20E08322799D + +[RSAVA/EMSA4(SHA-256)] +10001:\ +9E244363D137F1E002C5071CD7E7B7F59823770FADDF1D3D8AF934438C9B6A97258BD5FC0390F29\ +971DDEB394E7D2A6E1C8422368D6A5EB7E1F51E6472546EED2CAF1AD242AFD03C1A4FDD8894B305\ +EE31EEA8F8A36C099A00478EC29D11E17F:\ +7072696F6E636F7270:\ +73F68238B7F19889120893C903258DBE620171982CAD9D155892CDEFECB3C153224D8A94BFD13B4\ +691A4D51175756186AE4F689B6A1A1432EA255C0E8DD844E9C055397090C110C632EB6E24BA5ACA\ +380239D399BF010E1451293DB948D4274C + +10001:\ +C34649A69B6C468C51A93B54B7FC54BA7287C14563867406FC87FD98E0B70B307811FD2A7EC2646\ +4D50B5A0213A04C4567CD22B22F2DB162DD464E617A7445A8ECA9DDF71BE38AA32F44181E20922A\ +7AE9851282478741FF69B24158EED69568B0B27AE54FA043F778DC54DD2B23E3D5E0C00113181CC\ +DAD35E04573018155AF:\ +7072696F6E636F7270:\ +3CFA8F2D410D5BE87DA2B644BD6615CE3588C7E4B261F05C18673F24CB570355A7F5D41BBF62F85\ +9BC0CDD5300CCA3DBF2B2AF13DDF455DD6D919811836B22BD4280EFAD24DF30EA185D7357C89599\ +CF0C08A22F4D03162295379E842215DEBEA0DA0AE985F355AF392DD0F9F8A6A1F2827AF781630C5\ +D2A2B917C5544B3206C + +10001:\ +B3705A2FBAEB5B8A311150C3EC5315B29C7FB17F9A0680B0CC0A6E463113D9DB68FBD8CEB8C12FB\ +833639F29C76136B70320D0C9A5C4F191ED419598FD4D876ABFD815C1D4E0AA594C1C5D08EB56D3\ +707263CD1F9A09C12F5E9717177E39986F82EA2F65780D2121C537D9D14BA7BED64B46365A898B4\ +5FC1D5386BA954B613B:\ +7072696F6E636F7270:\ +417D26DAAC12A39FEDA2C17EA2ED932AF9544DA11E6BB84B0E9D4758A57FBD9878457171DE72B88\ +8EF7AF40183EE7FDF81044512232D7199C11CF52A53CDE62022352EA747292FB3187EE51B2A17E9\ +AF8DABA658DB6C4A5E4F07A5CF2E9203295E59B1916F526C1EF8F84F72CBA70065EFF5D4BA0467C\ +B77165BAC3ACE21462D + +10001:\ +A323715CEF7F9FB81BDA579ADD3CB75FFF4051DD5D7ED2B0D3A48DE237A003831042C44A7E9FBD5\ +55F791C350B1C8424384D1E005E54ACFD67C8747EDC8DD8DC9A5AA48D0EFE5CC127CA706E1E7670\ +8A0130519572A1FCB35CBEBC8575454EF6A72DC2F2A6394E1FB593FD60AA9BDB84C99523B91F371\ +7E263793301685BD380357134BB56AC499AA80B887A28596C2208BD4CA7910CAFDDDB565A788F02\ +1C295F3C3DDB064271D917D986D72BAE38C1BC8A6644320F61C84E71FC5BA378D681:\ +7072696F6E636F7270:\ +7BBB18C1CA207CE639E323DF26B14475CD407995EC612F6D53ECEE977D4400E4BFC198ADF8B40BF\ +E27363241A1F9541F01677AAD98F87E93998935146A8F77E7FFBD3DE59A2E22E5766409733F06EA\ +2993620A27122B71C4D9DE755E70C703B4EC6AF5F314E0F720B656FDA93E2B3EE9A1688D711174E\ +0D72D0D486DE36DCE1F9DA031EA46FBD6156B1E7A65A25B42696C9ACCD453D8E467313DA76F70DB\ +225D3C44E133E65E8BCC177D065F53BB81AF13076AB0695AD2205040CD9B4DF851FD + +[RSAVA/EMSA4(RIPEMD-160)] +10001:\ +BB3066B7BA3873399F0B957B6993E7E4AE7D97E1D3579F2AD45F48ABDA8730C74B09A4DBFB5F6A9\ +0769BA261D5FE0F7290A06F91FB8C9B45AEA37EF61CC7F5C407960F89C0699890C2C49C10E18BB6\ +42FA27FB8B38E9A1E406114027F914E587:\ +7072696F6E636F7270:\ +B24136372B7716310F83846719F61CB4F86B11855BE752E85AE6DE9CAAD99746693B255666DFEB8\ +C4A709C93A9DD1B2A08A9BE75831DA000AFA7D6230212C40F0DA59AB8B6291D1CC1DBA24D86D92F\ +C318F764E905E0BE2CCE73E074498A7DC6 + +10001:\ +86BC0A053525DD69C5D827DD664A07063C6099565D3AF545DEC168BA5FDDA7E355D426266D7D6CC\ +FE204E53390D2287347593201D5798F937A9A06B853FDCD3516526EC3F697B3F519611B9D124286\ +54A5C7A6EC1872067B308DB2EC172963160FB17DEC45D27792A39CB3F398D48282B6536A0B1E6A9\ +911005DDBE73EA8787D:\ +7072696F6E636F7270:\ +0795B1835ED3412E4EF2DA7DF692D04E959D5204331C6CA3D978F48F319A79B3A1A51CB584E56B0\ +572853527B1C2F99CA3390C91E006466AAD7628A0FA48887397A865F864D6921575CCF186D3FA56\ +9EAF9137EB626A9FB920466FC042AE9B6FB6B8D7EEB4F8193E7DC175B9093FA3E49FBE4D6D472F3\ +F38289A755933234C46 + +10001:\ +ED1782D5C4807EA628D68A733D736B5438B1A9D9340537576FCC55BDF0121AA423659B67576DA2A\ +3FB8B06009CBB1A009B5010C7A76FA8F1A50BEA540E9A6AFC0E48A95A2FE849F41075E94494E11E\ +459B8AD5D0311900C6DD0FD9215B0A5B33DB0B49B9BE67597D57F636AA3B3E4677AEC213E419EB2\ +777D752A1613334AB15:\ +7072696F6E636F7270:\ +375AC6A2B3CC508CDE09109C1FA52980098EA989C2021CC19D74097A7D67B07F599F3FA0C65B02B\ +DA6FCCBA9219D33A1F07219B616C30B1D455311726FE2470F63B86A02DE283391272D85B77C6D83\ +4ACE4246B692E1B4B512D5E72F3192142E765E38553CD3FCA435D129C7543F777997D8715A2CBE2\ +B15A5659CDC67DA72F5 + +10001:\ +B4B8E2EC2E25925A087F2731D8FBE4D180681A229D190B58F829099E3781F1A850D564999EBD14B\ +0FC4D8BAC48642FD38B7DC9E2DE709FE8C14FDB2477B72BBC58EC0F5FA6A810E44B2C84E207CBDB\ +1BC7A0358AD6F60CF9061EFCD40A3CF665FC976BF167F8A610D747A1075B7C3753131E78967106A\ +D2F20D5BB1E28D6A0D3D722B2F044670B20530FD1F7983513D7F3527A662571A3AE98E1DAFF9403\ +04B2BA6481B766DB0812AC4BBCD1B87E2A29A74565A5C82A2821F6F1E1B5C764690B:\ +7072696F6E636F7270:\ +32631E346368C620BAF6FA5475F04B56FB60BA5CA67D1E3E22805ED5910ECEE71777FE198279831\ +51E88AA1F9E57E96FDC536CE2F927AA3B34A94441E72FB498A649864488D976A0A4AB7B6490451A\ +4F4712A3AF3587579A791CF8CB18EA4AD388B5C34F6BF54E9CB0F4AC5EA21EA2AA42A2266EA755D\ +5EFFC02FD41C583E1CBDA53C1821BB79FB392D68A4524B0F65EBB64FF6656C52BF54D5774DF2D91\ +6C9B793E206E0D5351D7B4D18DE3CA4CCFA8F7A3ABFB36048C9297F7512B3FDA70F7 + +# RW Format: exponent:p:q:message:nonce:output +[RW/EMSA2(SHA-1)] +2:\ +F21624A28732743BBE9B1A2B320CA31EF4A127456547ACDF5C523995E25A990B:\ +BC6EDE730E7CEC8993A6E6296EA8DFBBC7D46615122F23F635FF988E284E31CF:\ +5075752E::\ +44CB3C6CD992A656AC2D8C92E044FCCC60FAA1B47FE153E7BA4B647136DA4A42\ +88BD50FB0935E3B9180AF477F8B88E1EA1106569CCAB8D354E0A7E3AC92D70B3 + +2:\ +F2E5CDF6CA7387C132242CE031CEC8FE2CEAFA8530EC9795F16605B1CBD97BCB:\ +DA330E4440FE5CD00A37A738DDFBDD5623A31FAE273AD98E41DA0D3DB937CEBF:\ +4C6F7665207375636B732E20556E7265717569746564206C6F7665207375636B\ +73206D6F72652E::\ +5AB035B8E6415D691951DBCEACC6A61987599000A590A414363BF52FB95C5BAB\ +C12812152C5BCBC6A443C68B971EE0AA5E864C9FF9ABE0A85BB86FA544239958 + +2:\ +13CE5CDF6CA7387C132242CE031CEC8FE2CEAFA8530EC9795F16605B1CBD978A3:\ +14FE360AA550965F93CE76E4B01F55FBFDD7A049B2761817505CB6959A73A4C07:\ +4C6F7665207375636B732E20556E7265717569746564206C6F7665207375636B7\ +3206D6F72652E::\ +0085AC363AEA57F36E348936599A77167BAF17194D250787F347C710019558A9F\ +773DDC25A2216DA694D38E03CAA4F7423BDF03DB0E75161221906222FC9E0F23D + +2:\ +1947A060ECFEFA3F8DDED8AE580D45B02D82DE108496AFC322FFD14EA02B7BFE3:\ +1E1384A66A21500DEE4DC2B36F43EF398B1C50BDEE7600CD4340B663471F0F16F:\ +4A65737369652048616E68616D20697320612064616D6E2063757465206769726C::\ +00BE5B2A5EE3CB613ABE4548C856F6C8F8B4B9EAD3795675E59E4DDC4A015D019\ +2F29B6352CDD913C289961BE57F84005F0BBD3AE7E2BBE73DABC50B2201923CC0 + +2:\ +1AA83F51426F2BDA398221C48E8D322EF66D59098D0418E0C2B06DE6EA2F97D33:\ +1E4C7924C9E6D7ABDB372B112601D4C091FAE6C8FEB518595DF436FE9B354E26F:\ +492077616E742061206472696E6B2E204E6F772E::\ +010E8838216B05B4C2739B65AB2A7ABC114A046E3CD37CF1E97815ECA53750B1B\ +F486A9BA684B9FE2D983BBA5F9D97565F0DCF6A5176C169EC67B6BB6C9616CEA6 + +2:\ +22C9D42C6803B9AC87F641E9465D300DE8898694427D138761C4A5B121B0632DB:\ +25DA5C05701C99EDDF0FBAA61DCDBA404C05D860DD539E06B0AECA7E56354DEA7:\ +54657374696E6720766172696F7573206B657973697A657320666F72205257207\ +369676E6174757265733A2035313220746F203531392C20616E642031303234::\ +0191F1BA45BC571445612D8C1A7818B52DFF78566E6CCFF7AB55B2F35FA21210C\ +951F171E27A2921032718AE01BB4F209164BA0B21A5842D1925B35D09C7538050 + +2:\ +388F732F05B06F5BA10816242E8F75A000E235C97174F57931E8D845442147F8B:\ +2F3758EBE44182841FB1743D3BA6AEEC0AEC5758660E1DB37C818199B90A1A307:\ +54657374696E6720766172696F7573206B657973697A657320666F72205257207\ +369676E6174757265733A2035313220746F203531392C20616E642031303234::\ +046C31E4EA320DF130FE1F361184DDC03713BBAC169E08266B91655B42A01F39E\ +1E3FF781B04B2F44B2504F37ACC9688C1ADD7EB94A998779EFCDFBEB9FAFFC82D + +2:\ +4AE4F716610D77E35A6FA2FEAAAC3E92706B996414C012EF72BCBE86E3F1A97BB:\ +5145D9E08DA9021E87080C437BE1835B06E5C9ECCDA8E7CF7E30F682D0CB1A9F7:\ +54657374696E6720766172696F7573206B657973697A657320666F72205257207\ +369676E6174757265733A2035313220746F203531392C20616E642031303234::\ +01BF0E20BF646E5E427B8D28CBAF696D7AA6B6DE878BB91C295D5559B1FA9A94F\ +114FF61C11C0BC97066C2FC919815B0FD150CE70F63D696CEA4D5D1D7BDEDC035 + +2:\ +6AA3DB8710567A30D7E9E61956962D4E4D50BC0510C2238D9136A93CC5DC3A73B:\ +6CAC9FF49F1035D179668B399927A610608788A8C884B76A94A6DDBCA94A52327:\ +57414E5445443A2043757465204A6170616E657365206769726C667269656E64::\ +1695A91578EBC67ED86C20EC4886B2E3895E11A7647D22FFB41091E1C7A3CA0DC\ +E091A1FCBACB859C4A5C8B3B841C0F0F7039BEFEA790A423114F35F9D809DBCD2 + +2:\ +9EADA4F7D1BEC405BC2BFB4F836E19A488E079030F8C09DE76810B9E63FB41873:\ +AD5DEBCF83372200B106812A6A7CF3A702C35BAF4FC095617794314EBCAC4DE47:\ +476F6C642073747564733F213F204576656E20746865204D544120756E6465727\ +374616E647320746865206E65656420666F722074686520424C494E472D424C494E4721::\ +203FCE80570CA0DA3C2D50634A33BAACEA6D397618F36620EE10DE4E6A51018C0\ +BADE98DF220E47DBA140AEAE910A28F3177D4349740EC05A5EB7BA280D7BF8F34 + +2:\ +E39815FB87BACBCCF779BC66EA0AE9784FC95E0DA094E9BEDE99FB45F73E2078\ +3038AE0488539A2CE982B4F180FC71858F2E5759E61E2C5A5FAFA435BA3A62A3:\ +CDC7D5FE3805572EA3FF554C086C7DD4020A3CE48DF5A09A5CEB75E6AABCD338\ +F800F362448E87CE7E1A55331ADF2BBF3A22B3E6134035FDA52D9578FD3F72F7:\ +57687920696E20746865206E616D65206F6620616C6C20746861742069732067\ +6F6F6420616E6420686F6C792061726520796F752072656164696E6720746869\ +733F213F21::\ +05BDC911B3F19F2201EDF6CCC792A68BCEC40506F00112A6DCAEEAA2D7A62192\ +931D8968F7312EBFE7F7646CED6A8948E58327862527EFD960F15CD8EC74D1DF\ +1FDC37F369A4A844D15DB7ACC6DB5ADA884B119148929439D5305B6916D0A081\ +1D395E6A28042F83D1154FF45DA6A79A3801858031A2C91EA699C02DD6055CC2 + +2:\ +EF86DD7AF3F32CDE8A9F6564E43A559A0C9F8BAD36CC25330548B347AC158A34\ +5631FA90F7B873C36EFFAE2F7823227A3F580B5DD18304D5932751E743E9281B:\ +F5BB4289C389D9019C36F96C6B81FFFBF20BE0620C6343E2B800AEFB1B55A330\ +8CC1402DA7A2A558579A2A5146B30CB08E3F20B501081248F2F1DE36CDFCE9DF:\ +2CA039854B55688740E3::\ +1AF029CBEC9C692CE5096E73E4E9A52EC9A28D207A5511CCEC7681E5E3D867A4\ +AE2E22DE4909D89196A272F1B50DE6FA3248BCA334D46E0D57171A790B6F4697\ +E7BA7047DB79DECD47BD21995243DEBBF25915DDBC93C45875C14DE953792257\ +C5C6825C905AFF40109C8CC7E793123D47AC1B5B6304A436CFA9BEEC8E0054E7 + +2:\ +EF86DD7AF3F32CDE8A9F6564E43A559A0C9F8BAD36CC25330548B347AC158A34\ +5631FA90F7B873C36EFFAE2F7823227A3F580B5DD18304D5932751E743E9281B:\ +F5BB4289C389D9019C36F96C6B81FFFBF20BE0620C6343E2B800AEFB1B55A330\ +8CC1402DA7A2A558579A2A5146B30CB08E3F20B501081248F2F1DE36CDFCE9DF:\ +2119A954F1AC0F3DCDB2::\ +60C3CCF4F086B15B7F850B445F384333F7AE5A4B5EDE2820C7233239E1B86D6E\ +4B4FCA4F50B087CE1DF17DA5D62672A17F2CF87A2875BBD9B138CAF6863821D6\ +A4D553E9EB64C9254A8F9A6B960E57E39069D65E3F561AA1FA91643D42FEEFB9\ +270D34AB0861DEA1E234EA587F580503D46A1989D413DAC2FFE0FC4CA663CE68 + +2:\ +EF86DD7AF3F32CDE8A9F6564E43A559A0C9F8BAD36CC25330548B347AC158A34\ +5631FA90F7B873C36EFFAE2F7823227A3F580B5DD18304D5932751E743E9281B:\ +F5BB4289C389D9019C36F96C6B81FFFBF20BE0620C6343E2B800AEFB1B55A330\ +8CC1402DA7A2A558579A2A5146B30CB08E3F20B501081248F2F1DE36CDFCE9DF:\ +7A4C634DE6F16315BD5F::\ +308A5D65224201BED626CC83FB901EC84874EE03B2E7AB4E752EDBDE024C754E\ +3CC9841CA062100A8843DE9183354B4E0596E8C68F1605828287884F0F9BA696\ +8FC7A9F0CA09418A8485B90465E5D3F96CE4995A5FC7A6E5ABD9CC06BB8A2C3C\ +8109F72EAE67FB4C108852C881CA645B3C5586F27F12FF3028ADE56E32AD9434 + +02:\ +0BC31C063F43B3ADE2CD633D554913339071D6EBED5FD665FC5DD7D47B80721A\ +976C3B14FBD253F0F988C354725289F2897D7FB62C5C74AF7D597A1E22AAFBA1D3:\ +0F816BF0ADD559AFDA38B008E4087F6A38B575C56FFF453056EAAAB3381C9552\ +0969546F954D458D48E44850938B1DB471CF4B40AFC47E067FB5BCE67BA98BE8D7:\ +EF0F1D56F4E5D587C212::\ +3E544FEBB6623F5D392003B729FE2BFC20E2CB3ECAC22734DFCA55150254E616\ +A41C5E54CE3B50FBC2FE2363EE9AF9B15C70615497B0A458F8AB6D850992EEEB\ +56D65F87EA1BD6E2B4B7E40A0F5E1635C7DDB17110C61039CF712D3524C9C2C1\ +F35D9163BE5C70276F46634514BE16EC09602782E88FE74EAEB2F50CBB0E3B5C4A + +02:\ +0BC31C063F43B3ADE2CD633D554913339071D6EBED5FD665FC5DD7D47B80721A\ +976C3B14FBD253F0F988C354725289F2897D7FB62C5C74AF7D597A1E22AAFBA1D3:\ +0F816BF0ADD559AFDA38B008E4087F6A38B575C56FFF453056EAAAB3381C9552\ +0969546F954D458D48E44850938B1DB471CF4B40AFC47E067FB5BCE67BA98BE8D7:\ +EC5CC4228C3C70EE8F35::\ +228BAA85062F10DCC9D99A23D340BC4B9E463D8AB86A6781A6D2143564303E2D\ +C78772BF68449BE1E2711A68D5A15CF04A23573FB3870454308F583BBB5F2467\ +069EF1395431E70F91BD56D846DC8DB2E88AB3D26A9770660B87A76D6C3575DE\ +512BAFA8A0B901AD15B7D8E8BE2F176A182D16A9609F19A4298416245873175805 + +02:\ +0BC31C063F43B3ADE2CD633D554913339071D6EBED5FD665FC5DD7D47B80721A\ +976C3B14FBD253F0F988C354725289F2897D7FB62C5C74AF7D597A1E22AAFBA1D3:\ +0F816BF0ADD559AFDA38B008E4087F6A38B575C56FFF453056EAAAB3381C9552\ +0969546F954D458D48E44850938B1DB471CF4B40AFC47E067FB5BCE67BA98BE8D7:\ +FEF5EE07C74118DA30B9::\ +2637E16E2599B6EC2F4728C73D3B29F483C2B881F1E1969C426027605EF080E9\ +B17D258D5E1EBC6472A2501E04CF19C144537FCB38A1DA00D948EBD39FA11322\ +D9230B62E2C12AEDB366BD85A2089588A8D52E941FD986D89828A342B83438A9\ +60B6FD87E9AD025AD75A692AA9DFEA873A9467B42D84879E85C5D11EFAB347FBED + +02:\ +FA880A456F9C205A26E02C3357536531DEC150BE0EF8747F69EA30D987FF7DD8\ +9E9A1075EBD39F04FA495BD26D8408A8DE69113A9FBB52F20713D1D046A76B47\ +8CF77C46454A7AFDA2EF418F63FAF67C947D898BCA109F3275999E8F2E60E2C0\ +EEC133FF69E71A2D396632670B52D8EA03F7589D8144AB580B1D3E60EFA1280B:\ +BADCC718DD2D761C4893C4831D56ADA30FC5C7C148D473BEDF7615B7E821B92F\ +319676CE278349F1309FB3D264C1A22BDE71B221354C7A4D31117B3EC3C9D480\ +2E0A26BD8EC05D28B6502C65F35C687AF7F8396B963ED029A2C5AE38DD7C5C96\ +2A953C113C0F590957AB19A6E2AFDA6DB84F22C0C31AE243DEBD2920FBE9FBDF:\ +15E7B7B7ED0F176B6799::\ +39FF4B5FA50AE498F3C91A655E6865840D1FC401EE02DBC8460A59DEB8816E66\ +80F712B7BAF8D4DC11A3B54BF906BE698306F0449BB43F3F223B944D930A1A3C\ +718E8A9E2EEDEC5A07AB817C26A80CC2A2EE2846A597EAB8A999D38DB9849016\ +6F2574524038BBDF24B4E4622C843210C6B94987638C6976562EA9727385B152\ +614C18349BD54AD95DE33D5354954B505E5259CCDA47E3CECEF3154F6E5481E5\ +36BAB568146A0BFCB66573714A7BA7ABE0385115720687F33D9C6EF6BB60272F\ +1272CF349990E3A2FBCCE180B730792101089B164AE5A001F5263F7493AF148D\ +6E0953E311AD12E4202D35F96DD30885663B5101F9B05675FCD2FCC4FCC4DDFF + +02:\ +FA880A456F9C205A26E02C3357536531DEC150BE0EF8747F69EA30D987FF7DD8\ +9E9A1075EBD39F04FA495BD26D8408A8DE69113A9FBB52F20713D1D046A76B47\ +8CF77C46454A7AFDA2EF418F63FAF67C947D898BCA109F3275999E8F2E60E2C0\ +EEC133FF69E71A2D396632670B52D8EA03F7589D8144AB580B1D3E60EFA1280B:\ +BADCC718DD2D761C4893C4831D56ADA30FC5C7C148D473BEDF7615B7E821B92F\ +319676CE278349F1309FB3D264C1A22BDE71B221354C7A4D31117B3EC3C9D480\ +2E0A26BD8EC05D28B6502C65F35C687AF7F8396B963ED029A2C5AE38DD7C5C96\ +2A953C113C0F590957AB19A6E2AFDA6DB84F22C0C31AE243DEBD2920FBE9FBDF:\ +B36724C92954C38D0288::\ +3C8CD3614555568BBECA99174B7B203D0BC6FABE9E6FFE0C41EB4D9A2C601D23\ +93CA1E01B7D7E99337758AC914C9F151311E5AE6708DAF1D8C825DA471652C6E\ +13A8FE5802D7AE097BFC899A4EC8CA235B5982B9058C53AAD52823ACF692290E\ +B8823C126635AB0BBF101C2B3149AB16183FA2DBB049DDB99C5E83723E4D4693\ +CA3A08588AA868C677D42ABDAA6586EF192391D276C5E5AF0763ACCA6293F062\ +50C51FDC2AD369CD44EB5F654E98761C881DDEC08E795FFB229B20522349B071\ +4059E18B7B23A48875EAB12ED3F0A011D3A985DD7384B0046F39FA6C1A331F3D\ +4C5125100BA58666935C68A7A10849D9C74850BAB82AE15EC950A283F3E7DAD8 + +# Format: e:n:message:signature +[RWVA/EMSA2(SHA-1)] +02:\ +E5EB47BC1F82DB3001FAAEABC5BBE71B7D307B431889AC10255262281EC5F5AF\ +8A790BD7BBEC5EFFFA442CF2C3FD5CA4778763B9D15AEAC0B9B71BDB13DA8272\ +7F4967AC685975F8FF05A763C864D100B7CC1142102AA2DD343EA1A0AB530255\ +195C3A6400ECAB7B27EFF9B01EF6D37381FA6FB5401347F195354396772E8285:\ +2A51DF4AF88613D91A37:\ +6FF18F4471E1A8F850C910A181A9F28E69AACD8E8126969605E000A853197541\ +AF9047E5D17315BF062B9CD8DF91196F0343285D9E31D5C72560C156782B6D0E\ +5AF8F06D7DCDD8CABEC01B2438C168C40C21F6A8794648361BD2AEE13573A49E\ +CA07A7EED97C0B9C5B1E508869E4CFD5FE1771924B1CF5A4BFF7D4379E5CD59F + +02:\ +E5EB47BC1F82DB3001FAAEABC5BBE71B7D307B431889AC10255262281EC5F5AF\ +8A790BD7BBEC5EFFFA442CF2C3FD5CA4778763B9D15AEAC0B9B71BDB13DA8272\ +7F4967AC685975F8FF05A763C864D100B7CC1142102AA2DD343EA1A0AB530255\ +195C3A6400ECAB7B27EFF9B01EF6D37381FA6FB5401347F195354396772E8285:\ +1CF8DDD95D780A89D7CF:\ +539C266B0313E0E256ED98EEF13E6AE64CED90C160A4999B3D47CBDA5285DAB0\ +E0678C0E079CE9B8EB23E10EDFACFC19A80EEBB8F38ED5B5D6C8A988AB8CEC40\ +A5A5BA102F75586167EAB6D5BF0CE8FF30C656895800F6F1B37D69FBBAF9055F\ +7505DBEB537C0F986A1B5F0270DC12A640FFCB626F9763FDCFEFA1208C104003 + +02:\ +E5EB47BC1F82DB3001FAAEABC5BBE71B7D307B431889AC10255262281EC5F5AF\ +8A790BD7BBEC5EFFFA442CF2C3FD5CA4778763B9D15AEAC0B9B71BDB13DA8272\ +7F4967AC685975F8FF05A763C864D100B7CC1142102AA2DD343EA1A0AB530255\ +195C3A6400ECAB7B27EFF9B01EF6D37381FA6FB5401347F195354396772E8285:\ +F6959926E6D9D37D8BC0:\ +249E1066542618CE0D236A7174708F801E7AB257931E9967A65C483ED66FB585\ +98F99B6664AF0EAE221E2A6B271D7D17875ED02BF7FE35AA0786023858521CB7\ +9FEE0D134D9DDA609B0270FC9804BB6BF74AD90AE11EB339353533DC0D5A69E6\ +B8758212B86024ED563767EA5D9B59655E0B8CC21244F720BA4ED663BF668E3A + +02:\ +B660EB18786256C993EBC6DCB5892EAC342F6D91229B73DC5D04F1AFB9BB0DD4\ +EB0B48895F514B4C9AFEAF86E91226F2299126D37528CE374E89CC312C06F47C\ +81112BF5CA60FFC33B98318E04A17627269F1AF461B6CB40F3BE03B0113FB2D8\ +404E154C7191306B36FD3EFA73C784AD9189115D0BB1BD82B850D000E7CC8D2035:\ +2C9EA313EACF2C5DA43A:\ +1FEFF88814BB53E447E1E955AC8F1AF597C15C3866033E337AFBAB8627306F2E\ +C1276621FF2176C89323CE32EA20F6AEC2CC271F1ED749408B2A3E43A23A44D6\ +A3F38DCDDCAB696B239110AA7ECF12C6681B0E97E6FFF1B72F4F6D796BF82B94\ +50AB8B3D28CA9D220BDF84ACCEA1DA5EDA0B470C3A82BBDD77B4C2723297608BD4 + +02:\ +B660EB18786256C993EBC6DCB5892EAC342F6D91229B73DC5D04F1AFB9BB0DD4\ +EB0B48895F514B4C9AFEAF86E91226F2299126D37528CE374E89CC312C06F47C\ +81112BF5CA60FFC33B98318E04A17627269F1AF461B6CB40F3BE03B0113FB2D8\ +404E154C7191306B36FD3EFA73C784AD9189115D0BB1BD82B850D000E7CC8D2035:\ +0B9554FFE4F6ADAB2C76:\ +095952F24D9FBEF3A93A932865F4BDBB522CF24EBE153CE4BBB24CF301A1C7B5\ +1FE47B94F8F8B211CBC5A926FF6BAF9A6BBF7E15975D2DCCB95EF01AB7E64168\ +7870B0D01FC18B6B16FE17D3FC82931FBBCD4FD18C7F9588CEE8491876D72F98\ +F2E7EEA90C12907210D6859053ADC7178B87BF8B4826954D6986FE761E71E1B7EA + +02:\ +B6DEE7375BF4385043B3CC2AC5CACBC14AD11A17574738DD2BD84D2D1E6C74E1\ +6066C2A5C35BC3B87839858AFB5EE5E8ABFAB408F38772866F6F833F39FAB248\ +3A2C34ED55AD7098F9F63D4EC70B7950F02DAAAAB10781A0008F993C4027E381\ +6BFD45C52F59452A7B28873513DCE415A84FC8BC06601567F91EC41647DA2304\ +5B6E01E24516724ACC02947AD5AA2DBA4D952BC4F49D18ADA0B0F7CC5D488814\ +B921C0BC2B33D8828D80130DF7D79B0992CEC40D3BC7217D4A4DFF3699345E44\ +DAC968575194845AA7B60DCF3C712D9B0A384824C3579B40DBA265457D50F69F\ +02A140884D89B7FDEE9F0A787E76A37C58C92CF2D3818C72097D41B3FAA7AA95:\ +00AA5515CDAE5CD0F0DC:\ +30EECA6B48D796552F5A6A3C11F28D730FA077422CAAB34FDEB879AE0F71DF21\ +330E2F3BE5BF3A8CA372EBCD3DFA7C81B3398C31B0972D0B857926CB39732351\ +AACEB8276D52B9D82F9C245FA0F1CF49E785A2BC00FF27FBCF777F84D05BEF17\ +FCC0505820B029AC8F0CE17D2469372CE47E1428BB941004FE170EF87163E072\ +98EFFCC1BFA7E7CB1F572C340CAA075A5962A15B69CE937BC7EFB492F501FC88\ +CBF0119C351C8498782091EF6EFB19120195E5FF51DF86F90E90FAEB225AA2EE\ +43AB4E8358101C0348C7E3859B9DEBA19464C74B74AC48A0B73FC8D2E7F8033E\ +86208F0792B6E5B6DE36C99DEF604949811D1671EF6B0A4781B4E7A0A72AD855 + +02:\ +B6DEE7375BF4385043B3CC2AC5CACBC14AD11A17574738DD2BD84D2D1E6C74E1\ +6066C2A5C35BC3B87839858AFB5EE5E8ABFAB408F38772866F6F833F39FAB248\ +3A2C34ED55AD7098F9F63D4EC70B7950F02DAAAAB10781A0008F993C4027E381\ +6BFD45C52F59452A7B28873513DCE415A84FC8BC06601567F91EC41647DA2304\ +5B6E01E24516724ACC02947AD5AA2DBA4D952BC4F49D18ADA0B0F7CC5D488814\ +B921C0BC2B33D8828D80130DF7D79B0992CEC40D3BC7217D4A4DFF3699345E44\ +DAC968575194845AA7B60DCF3C712D9B0A384824C3579B40DBA265457D50F69F\ +02A140884D89B7FDEE9F0A787E76A37C58C92CF2D3818C72097D41B3FAA7AA95:\ +B8E2FB9EAE22FB2C0021:\ +416D33F8C213CF81F805F54FC1D4E7C6A588A0965F1C9CAEEA1D41452E20935A\ +AF2D30F957584B56621035430212A428E27A2F687CA9DBB596C19864AE692EF7\ +BBA730F3D70CC2DDE15AB71E1E350C0C316EFA1A831ACD1441598B112482487D\ +F72F58ED318182C7CD0906FE39C5655BF1313F29A15D60A6178CBF600C7FBFF8\ +994840ED649C3C4026A463B3EA39C692B7D112B128BE49E1E32D4A7FF8D45132\ +83D8DCD9CCB8FB7300BE0BDD4C44DAA2F7049B3AD83437093E623442AC69B489\ +11CDA21E95E0775041F67F6E6AE01DCE646AEC20908E7C1B693600FE41ABA85A\ +C0C778641E46C419083E41773C749DB3E1BD8FD764E271860D2D7F8E11BD6AB3 + +02:\ +B6DEE7375BF4385043B3CC2AC5CACBC14AD11A17574738DD2BD84D2D1E6C74E1\ +6066C2A5C35BC3B87839858AFB5EE5E8ABFAB408F38772866F6F833F39FAB248\ +3A2C34ED55AD7098F9F63D4EC70B7950F02DAAAAB10781A0008F993C4027E381\ +6BFD45C52F59452A7B28873513DCE415A84FC8BC06601567F91EC41647DA2304\ +5B6E01E24516724ACC02947AD5AA2DBA4D952BC4F49D18ADA0B0F7CC5D488814\ +B921C0BC2B33D8828D80130DF7D79B0992CEC40D3BC7217D4A4DFF3699345E44\ +DAC968575194845AA7B60DCF3C712D9B0A384824C3579B40DBA265457D50F69F\ +02A140884D89B7FDEE9F0A787E76A37C58C92CF2D3818C72097D41B3FAA7AA95:\ +8C8C306A629373BAE647:\ +0E9A00045FFD399D9DA9D0D7E543CF9FFD098BC23E72DD7763A64F22C7F0479C\ +E866E31438B8F7DE31A18F35AF419BED6C67BE1540614D3310DD24F019E14FCC\ +3AF73743F4C143D4B79CDF35C752A300F0A8251CCFF4AAF18785C533A7DF1A20\ +AFE6770DEBD1B8BA2C83B2E345A04F833CD173E998FF9840C2F8A370FFDCFF5F\ +D95CBD71B25FC9972192470FD145975344F64C2F6D68CB3513F48F9FC070021B\ +EE8F6A4282D098C44DF655CE415E89B97994AE3ABE85986C7EE0AC348EF2A4F5\ +2D102EA80836E77E81AD3678803E53C83CF2F30D2D4950FB6B038CCB3F2690A9\ +381EB34D6C09E88C090AB05E28047DC490EB8A1282FEB38E82FB0B18309284C4 + +02:\ +B6DEE7375BF4385043B3CC2AC5CACBC14AD11A17574738DD2BD84D2D1E6C74E1\ +6066C2A5C35BC3B87839858AFB5EE5E8ABFAB408F38772866F6F833F39FAB248\ +3A2C34ED55AD7098F9F63D4EC70B7950F02DAAAAB10781A0008F993C4027E381\ +6BFD45C52F59452A7B28873513DCE415A84FC8BC06601567F91EC41647DA2304\ +5B6E01E24516724ACC02947AD5AA2DBA4D952BC4F49D18ADA0B0F7CC5D488814\ +B921C0BC2B33D8828D80130DF7D79B0992CEC40D3BC7217D4A4DFF3699345E44\ +DAC968575194845AA7B60DCF3C712D9B0A384824C3579B40DBA265457D50F69F\ +02A140884D89B7FDEE9F0A787E76A37C58C92CF2D3818C72097D41B3FAA7AA95:\ +FA95400C2B14E064F76A:\ +3F67F9DBEB88E6AD057BEDC3D97030555A908867EC578A6CA572137CB61C2103\ +6AADE6DDC5592EC7CCB6B263E51B4C886A51904C858040E493D64B9ACE5BAA50\ +C4A66D04ACCDFE0039D8541C4363DEFFCF93BDF5F5CC1FB64855D956B5EFD42D\ +4C9B96B9CBAA97A32F02AAB307674E53404E6836DB5C96B59572ADBFD1113B87\ +608ACE6D0898CB02E35575CC28D38A9FF8C1C4AD36BAA991DEFAB533F0A6C9C2\ +F0F0815F1D659ED576E5DB18494A54B6817D9E34A134F3B9A0F1E8C77FC204B6\ +EE087C0445A7036C935117E338D092F6E1FF4DF7605525C409456A5195233A17\ +6B29B2FD8FB2808D0412FCA0541B2BB6800BD8BB9DC9DC25230166071E8D961E + +# Format: KEY:message:k:sig:passphrase +[DSA/EMSA1(SHA-1)] +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBGDBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIKioqKioqKioCAggA\ +AgEYMBQGCCqGSIb3DQMHBAgqKioqKioqKgSB0C1Q0dDyQ+/aB6Rid4iU+Kytf/dl\ +y0cmCXyXGWwZhoc0fqq9FwUyoxDFkZgpdYCgInJvW52O5kkgAAYYZdBSziQU4E7n\ +I6KUeZDYDqJU6VgkK9V1k4JoBKS13L68NwLawvXS+iDcSUoV3C591ynOVMeGsMgv\ +FLhGimZW7KaqaUVnqfcHuKp8UfboW6aqrjknltDeHixpTOduOsTzJUrxGMM/o/iV\ +BKSYqmkNrJmNIq0kqOyYBvxgwsfYO3cBPkB5gVBK1qtlg/gwsAA/sDOqyLU=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ +723320616E64206C306E2E20416E64207468652052656E64657A766F75732E:\ +868788898A8B8C8D8E8F9091929394959697989A:\ +19F24178D7369B619E566C5256C49EA648B68CC22C1999EFC24BD22471563EC1\ +5435356577466CAD:lrbbmq + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBmTBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIhoeIiYqLjI0CAggA\ +AgEYMBQGCCqGSIb3DQMHBAiOj5CRkpOUlQSCAVCe8zFeu43ErHj8bV0SwfCflqCh\ +WsKecYnHronPutGoumfIOc3vAOsm+H7MdBv7RI8VYcoSd7ccVKCrbrxT7sYpHw7H\ +2gxq4I3IUDjDRr/IcuDCzztP5fm5dcuIgs5qDZdqphYo4L1BNs4XLphK4E1RqW6T\ +UfNHUzrY1Rh26x8HRgd1Zr7O+J1A2ZvlopHIpwT6Byb1SQBiwvI2S3P63yPeqDZy\ +s8wDfcL8+xbpKu8qVN4/D33vQh4F6Ptmdv0xXJuQUij820h+LcFhj+0xRmUae9PB\ +dp8ykyAS5QB+29j2R5YXR93ANtH9q6uAWeRPv08XryEl9WBQy2h6vPOM2NNJJAhw\ +V5rx1HHa+NLJHPaSsTtgiXEC4/9HeMRNIRpwm/aaYyUtx8Y8zamXNf5sfs/RIp5Z\ +n2XIqLzaahgk+xm5C+pqqMAclBkLhT4iX4GvcE0=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ +723320616E64206C306E2E20416E64207468652052656E64657A766F75732E:\ +DBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEF:\ +4B4471C82B030F2C2115B65309DF23A8B6AE1EEAE0C4AF91DAD7CFA7D3DFC6B2\ +5D5FE99E7FE4BF62:cdarzowkkyhid + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBmTBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQI29zd3t/g4eICAggA\ +AgEYMBQGCCqGSIb3DQMHBAjj5OXm5+jp6gSCAVA3igMQIZIcNy49pBMJeSd/a6q0\ +oICNlYtfNlACbx6K23do+QjlwjgUzUkhpBWzVVNzSxNI7mUgqcFOF7OrBNQWldl3\ +F940k5OrNU0GZCPhZLIT3cIpkiyXSN+DGpMTH5pis+g5f2IG2TKgTz+fVyZ39qUC\ +Be+9sbTVElrF5eYjpMsGzgZW8t33hHH5hvpiXjCqKl49IApI/56EoATwYV/JHJRI\ +sC4m4M+8zYyXHJRiUMnLFgEZK+8M9S8jQf/tXtmT7Ua4ddc3XAhhSJ5zeRupLSI1\ +KEyKjq9T0uf3snhslzw7Vk6XRiUQS9I+QGnfXfW2ZLLji2gA54K/C+yC+UaM2yrV\ +HipE6cWA7f/uWQH/Hn9Al5vjWnY/Vb0WHx54lYVps9Mlaga5vIQcFsxrTS1ZQvHw\ +bygjEqFWhZNCSDQjvvFnelOqKOoq6cYcWmfwSeQ=\ +-----END ENCRYPTED PRIVATE KEY-----:\ +426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ +723320616E64206C306E2E20416E64207468652052656E64657A766F75732E:\ +A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B8:\ +76EC77EFBCE0F6B01C1AA676ADC3AC6409950FB79EC0DD25E6A76CE85447715F\ +91AB563454FE3242:scdxrj + +-----BEGIN PRIVATE KEY-----\ +MIIBSwIBADCCASsGByqGSM44BAEwggEeAoGBAP795cm2680csLqzJLxt8vzriDGR\ +5cPejI7Sa3BtZNF9JkBLExBeClf891HGVhmc59HI7CSkVwKycD/HXXmNE6VCm4Ju\ +FmT5ENfw3OERv7Wac7sI9PenVT8qc3vfVi0lRcSvx9vXlfqNEEJBWIPV+s03NZLv\ +AAOKv0WQF0B6TtIRAhUA1wYYSyBGcR6bjdb2mt7KjxgCNtMCgYBO9ZCSK5GnL8Lo\ +Mz2/fQnl+/Gtu8REi6ZiwPDrMhjS/7DsLq9eL8OFzZAh85q0rGzVe0d2tow0bm6d\ +DYINiLcmiuH1TwRqYYvOecg2Ek3K/+w76b4An8IY/vtvg/9nx1izTuhyEhG7RZr3\ +yV9bc6caqfPjcIppb6FZ5ikOeTBR0wQXAhUAwi5MTj9OW+mLNUQQUTiUFOy+ZMs=\ +-----END PRIVATE KEY-----:\ +426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ +723320616E64206C306E2E20416E64207468652052656E64657A766F75732E:\ +A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B9:\ +22E16319CB7FCC90CA03D66B1550FBEB6121AB426E1AE3618A3F8A65C0457A91\ +E1E80D6EB35C8277: + +-----BEGIN PRIVATE KEY-----\ +MIIBSwIBADCCASwGByqGSM44BAEwggEfAoGBANsWdaItyazuSLhac0WrnmYSEKcO\ +ydCRzbSxSvp/QNn46SVucs4UdyCm+YqGchYVdL4MGLNu4H/VXW4D5vU/206YEPm5\ +sqLj0zba9/hohpwb+vHTg9Ak/EX/E+mr8z28TeHkg3LRX18EclzHjKe/zl7r0WlS\ +MbOz27LP4f5uKBUTAhUAyr5cJPSqLKo/EFDJsuzXb1KFgg0CgYEAxY953m2fa6IF\ +vcOJtSpk8KLe/8ZsGbugnFHBaHz+QWt+2sJauf/eTh2hyi48wEmWsAmyI2Jz64u5\ +WrXdJG6Y0DhcwJhbKts5wbztDIL3NAWxuppyGd89dJubaWElqyat81bQtIf7IuLB\ +KgXoL1Ci6BznryfA7cuv3ZPe5aefsgoEFgIUM6rqDcBQGunu3douZ54MG5I7Ve0=\ +-----END PRIVATE KEY-----:\ +426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ +723320616E64206C306E2E20416E64207468652052656E64657A766F75732E:\ +9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB1:\ +033A7684B382E2D2DE424111A110A7A326BA2158AED4BAC034815B8D3CDE92B2\ +D71A5CE03092079C: + +-----BEGIN PRIVATE KEY-----\ +MIIBOQIBADCCARoGByqGSM44BAEwggENAnkAwD9dAnTwxHobWWmnm8IVsVZuKY8w\ +cjg4YwWmib0iv+wvwhiKon2XNhbtErdg9uqnTPXJJ5dYAVf1cq11jKidgW37g0P+\ +J046VzuAdGjtWaxqcP8KuqBPIu72NK8c6Q2q59LYYS023XY/pvEf5JRSkmk38bgY\ +CK0pAhUAsPZ+YCHrRD4mQrzJXv3dtmWJumcCeQCwP26D/4ElPV4uQ9QilY5wcprT\ +ZzTGSzXTb8WAFHTT89dJjlwqQpAdIiBKrJmyKfWTEpqWtVMr8ugcGhdA1HjOzYTD\ +hsD2kOIYFfuKXmP68902Mpak+WbjsnLaJF4KfC9PrzUL/6ZGF+YSFexN0KvP1rCo\ +eno7RrEEFgIUHmzIejm5tPDB8oEZD9WD+5zm7Hs=\ +-----END PRIVATE KEY-----:\ +49206F6674656E20646F207468696E6773204920656E6A6F7920617420746865\ +2074696D652C20627574206C61746572206665656C2064697367757374656420\ +77697468206D7973656C6620666F7220656E6A6F79696E67:\ +8788898A8B8C8D8E8F909192939495969798999B:\ +4AF54C9F782C3B4B1D5000985F684B64D5EF030F7952FEEFA06475487BAA979D\ +AF382E53BE6C4D5A:rcby + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBiTBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIh4iJiouMjY4CAggA\ +AgEYMBQGCCqGSIb3DQMHBAiPkJGSk5SVlgSCAUC8VXV4fX+c+kMB1JpVinAEo/XN\ +U9LzjtAS6C4hUUV5VZQHKNKp8HiOdc65BWrpLOPc72kuNAgb+KjYunVWSCD6k7pX\ +Tm1XHIhbm54dsLynwY/F5jiNcSVKP0115E+WuJ5A4ps6sO0mk/UMzmH6IMmmNeK/\ +pmqK+Gcw63tYchYNXoY6gYAlEHlxF0QijPw2mV93Jl+pxWEwFvkttGmtPCBwCXLx\ +AdNRy9B4RSeaNaAMcALM0X/IrEx3owhoV9LAs8fUViJlVlI3BuVNofXCXeMU2vxv\ +Ax8d3H+CECKAMbtyGL8tBmVE0HKd5ubpjGQpHBW9egaagwSNvQFiXJKAUm9ST1uA\ +4iZgRW0sOEOyNNgWUbxUoI+OYmcDiMbGBzv2JeO/yVFQolmgzflqlE6L3JJ6yqc6\ +y6wZBPcO7I4uLnzuIQ==\ +-----END ENCRYPTED PRIVATE KEY-----:\ +49206F6674656E20646F207468696E6773204920656E6A6F7920617420746865\ +2074696D652C20627574206C61746572206665656C2064697367757374656420\ +77697468206D7973656C6620666F7220656E6A6F79696E67:\ +9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B2:\ +00F04C3A7E9D31CC7C76BAA9246F5A0BFC3B552BC3593C856C5AF7E7E7B2224C\ +05445802A7D726C6:cdyg + +-----BEGIN PRIVATE KEY-----\ +MIIBOQIBADCCARkGByqGSM44BAEwggEMAnkAtqJA6Mv/8I9ZVRd/288VFQUCcTPA\ +qkAfIn9ZP0aUqDJfRuchnUFrOWkzp0QUTA0eFVMwt3T+R2iL7Rp7HwFbAXLictS1\ +SzGX2CSCgOS4xGDYb8H7s6n/U4twEdQQfRsqKu4Z+gSdpfZStfFKZ0dYA9skEhI8\ +m7NPAhUAnoE2PuOpzxxrKPJtMLBvcW3m46cCeB6j1vT7dpPk4RV8L79QL7S5aJsn\ +5uK9HR3mIdntB2OXTm67qD+pHbVZuYfhrtrM97e72jopd/diGOlwZ0h0iL9xklxq\ +NvSlcuvRWCrlXk4NsJnUGm+fY6YUnWWuyhVVW/rLdD8xwkqP/us3TBdzN6Hhwk1J\ +oB9JKAQXAhUAlmo1ft2RX6ivJhmvitzUcFwvvOQ=\ +-----END PRIVATE KEY-----:\ +49206F6674656E20646F207468696E6773204920656E6A6F7920617420746865\ +2074696D652C20627574206C61746572206665656C2064697367757374656420\ +77697468206D7973656C6620666F7220656E6A6F79696E67:\ +838485868788898A8B8C8D8E8F90919293949597:\ +01224EAC2D585D92840280C76FB57306222E42800075D2AB872F08A8709651A2\ +219B1E7FAF242103: + +# Format: KEY:message:DER_sig +[DSA_VA/EMSA1(SHA-1)] +-----BEGIN PUBLIC KEY-----\ +MIHwMIGoBgcqhkjOOAQBMIGcAkEAp7fQiSIN41Jmp5D6sTiK5uZqM+NRrtZHVPwP\ +gicmBY7jLGKeSK7CNlaPTVkgKeQ04p7YCyLfMWk33vMYiAndOwIVAOoV8IwGiIXb\ +Rcm44dWRfdsOJI8BAkBUtk78F7Kf8X7/5eapEczOy4i8h8F0QkYQp7CZVONaPi3T\ +i2HA64tp3zM/z1WEEmO6wC4I5UrY9a84ckwLIwp8A0MAAkAS1f/NjG3z1z7Fhx7x\ +koG5Oitf7m9ER3YzYJEe/vQ1mtDcgiNnAV33SOCz02jfaFr7+H3AdI5KzDXTB8HB\ +2sQw\ +-----END PUBLIC KEY-----:\ +00BF86875B7DE45A29680AD78B41CF13BA70DA1DFB8500:\ +302C02147FF68E7723C6D6718D4B5BFD04069D4F86F48A1402147E78482F2BF0\ +37283BDE610C957E75CCFB5E1785 + +-----BEGIN PUBLIC KEY-----\ +MIIBUTCB6AYHKoZIzjgEATCB3AJhANh0wGx4pOKnBg64l80gNBxTm0ql7BlotR9A\ +jFdGqVBK9BZTU7sqGRSgQx4WLiLvJZB9VRmYo0pBWd7/YKS/yufwytojoirhXhz/\ +IG5KkKbUZI+uWnFUFD+8YBiJo7hYtwIVANVZFYUPbGdHhTuhnGII8o33i3yHAmAr\ +nFyiH8nbC3hVOFq/ba0ftJ1HD/gRIKIhdjJP+BmDb9epR/45W8dgvPwZr8NCix4G\ +iJhaDt3B5ozEsFVtG2Wguk9tONZocCQByx48+tP0ELWhfHvsSv+gMrd+AeVzg34D\ +ZAACYQCmvNmEahHpA348XBaXHK9qVJIm7JIS9v1Zx7w10UUSe9fha2BKH+DCirfL\ +HVD5L1Ll3mJVJH/j+uO1PMZu5Sbuw7SDN/fNSMnpU/0krR8eZ65B3Strd3tM/vQ3\ +fS083Gc=\ +-----END PUBLIC KEY-----:\ +E58DEDE156818EFCDDC72022EEB5D457CF25032BC6:\ +302E0215009BB427CCD68D7269D3692A29489026F9AFA71745021500AAC0B52E\ +5C8BDEFD0E7B3F81189C50CA8C46A3E1 + +-----BEGIN PUBLIC KEY-----\ +MIIBtjCCASsGByqGSM44BAEwggEeAoGBAMtC1tIjltuwKtWprTwYrEpO5ClbyUvd\ +BTIvUuYLrAaai7mGCSXbGRBXAHPS4hLQjUPZ7JuWYiLA2/WEttUP0Ai8P+oGsMKX\ +DIP31KifdwNHa3jckrPS1mMgA2xVDm/nIM07HxquQ3mXuM3YJ8Di47yqvlAoOeZP\ +e8fgPLe76zPJAhUAwy/14/bLpyDtp3898V+kSbHKb+ECgYBHUenqYLWd/ZNUXWCo\ +hihbT2FmS8kxCjiVsqhAd1YfXe+KyPKR+N5r2qfwoN87L/7jNO6Mm90T+OxEsfKu\ +HZMBAwwOXN54eGBjiJhQYAAryMQuwFV8KICbgOG8FyJDUjo9P6qaqmezV1ibqqsr\ +SVqHE6BjEgqU7T7ee6JbhdHWyQOBhAACgYAJDkq1oVGgIE+HdMGjj1LPclk51Euk\ +Fd1GMt+RLxB7Yt6Ism0txDoBE/aTbIi/b2bNCShn0y+Sr8+KT/6kYElwIfN9y1ZZ\ +mFlp+idxV25J7VpcMnSwlkaFuP+gmPkesXImQafs1NAgMvbLtAqmARO8OX3bO3o6\ +fz7eifelYX+8dQ==\ +-----END PUBLIC KEY-----:\ +EAD985D13D2A1217AD620068A2CF985F031F37BD22:\ +302D02144CEAA8139F1A477CB91B77B9B20CD66F13291B0402150082191AD5BC\ +88067D833F7DB0629527B1A19EF36F + +# The reason for these tests it to make sure that EMSA1 shifts the hash over +# properly (because the 192-bit Tiger hash is bigger than the smaller q). +[DSA/EMSA1(Tiger)] +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBCDBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIg4SFhoeIiYoCAggA\ +AgEYMBQGCCqGSIb3DQMHBAiLjI2Oj5CRkgSBwErzYywRqfwW9IxzqzsovFjnZK0Z\ +KNpUiGOk4CJxENZd0/qt6ap3AaspM9u9xsfhO6WOK5eDimQDpN+lBsqhrKbmErWK\ +9ngRAE3/vj6DlO5RHn01E57fr+aQE1kigjhHaNPwAYZXEKlBqS1SxSYd26LlwcjT\ +JrRqblCY4cBjCBGtzvVJK3escwTELNTZGgTr4X0A3sX4jCs/b/+MRt67cfb1SYOI\ +hmojiK/EqJ978yCZu8YPtQFo68Vq/RTuaHvUEA==\ +-----END ENCRYPTED PRIVATE KEY-----:\ +54686973206973206D6F73746C792061207465737420666F7220454D5341312028736563\ +6F6E64207465737429:C40DA376ACBB379890ACDFB021E02A:\ +041A7C1033F50A295DA0C4D436BD612466FB65ECE1357D4770BF93413F2F:\ +lorellnmpapq + +-----BEGIN ENCRYPTED PRIVATE KEY-----\ +MIIBEDBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIxA2jdqy7N5gCAggA\ +AgEYMBQGCCqGSIb3DQMHBAiQrN+wIeAqKgSByLDSSPDO/Ck1yLY91WOlFZzkM+jZ\ +P4jSwPOiJljd7+2i7+zBAe2LCkVyQZ+WMsScjNVvmYvmP9wucmMnj98XdpZuXScd\ +1GLkFurNB6MFJqW/jKUURrHWEwkIZiUlKVObnDyMdAk6PS/xpfRkDdQfqIvCTsyf\ +X5uscHniJlAfqUMAsiMUGUgyunrZj63DVpoP89mj4E6Ep6WuSmjF48QwbAHuYPBs\ +gwCpLRTCgr8EBF0WtZT+V4RzTmAG1qYyYEV0wdpiG0d5Pn7M\ +-----END ENCRYPTED PRIVATE KEY-----:\ +492077616E7420736F6D65207069652E:8182838485868788898A8B8C8D8E90:\ +6DD27F32F0012698CECB2D8BE550ED662111608A6586A481CC7E2E4C5CB4:\ +khopkmcoqh + +-----BEGIN PRIVATE KEY-----\ +MIG6AgEAMIGhBgcqhkjOOAQBMIGVAkAA8HR2W1fHj8t8G9/BzpO5z1Ea5YnMTwMS\ +/ozvaNrdRuRf+RuNGAEer1deRluO3BrQlknECrK+0BxpzfPT51qPAg8m1F08NAua\ ++OtE3W4FMysCQAC+p3SjytVnkwVRSkxKcdSsbBv9NbW+TGQrxWE6KqfRoxN/Tov8\ ++iZbtXywoSMLpPjP+oi/LQQtJTV7B07mRwQEEQIPJIiuAFmX4/IH2oOwMoAZ\ +-----END PRIVATE KEY-----:\ +54686973206973206D6F73746C792061207465737420666F7220454D534131:\ +25ECC0ED4CE7118A72D133704D002A:\ +14593FBF63EAC64976987524044D8B11AB9A95B4B75A760FE22C45A3EFD6: + +# NR Format: p:q:g:y:x:message:k:output +[NR/EMSA1(SHA-1)] +# Trickiness: in some of these, we put a leading 0 digit on the nonce (k). This +# is to work around iteractions between the way we generate the random numbers +# inside the particular algorithms, the way that we 'fix' the RNG so it +# produces the output we want, and the sizes of some of the numbers (usually +# off bit sizes, eg not a multiple of 8). It's a horrible hack. I wish I could +# figure out a better way of doing this... +FCA682CE8E12CABA26EFCCF7110E526DB078B05EDECBCD1EB4A208F3AE1617AE\ +01F35B91A47E6DF63413C5E12ED0899BCD132ACD50D99151BDC43EE737592E17:\ +962EDDCC369CBA8EBB260EE6B6A126D9346E38C5:\ +DE0B54EFABF297087EE623D5CA5588C64828EF4FDE4FFBAE1ECD2006776B05B1\ +1B81EA3CDE9BC3964C1687C5325BF43D7CCEFA0D0A86BE5DFFDDD0D1143DCD75:\ +D057B29DA96809BDC761F3210E467BBA5931B3C406581B268121FA5625C2F850\ +8B95ABC87CB061A8C32FA04E67397762F69A23ED42ABE051BD761DED4BD61582:\ +78E2D47D180E4EADD866235F5CFE0E487E862226:\ +FCABA2CF434AC8DCFCEC:\ +91F1D3A9C129D91120EA3F6486A079AA695AB632:\ +44EC399FAA3853B7F7313FCCB3A30B82B20A18C45E53188FC58B0E3C141A0851\ +BAEA0A7723C71A94 + +DC523995E25A96ABE93502691F3411D3A6C19AAC218404B476913794A81EA8E7\ +8C3F8A60E6A05C151C61430743C19B4F1BA140EAAFB0235F93E83CF2995FF0F3:\ +BC1624A28732743BBE9B1A2B320CA31EF4A127456547ACFF:\ +829D8EE7A7221DC83F22F85FB5FC955E4D1E30563151D87AA82F1466E379A991\ +3351026B996C05413B01AB6E1AA83A8B3A30F0BFF50E118F0806A59209B3DB91:\ +8F8340D8E87FCFDE0BA81B45003DA97B7FDD21B4C1F256463507E56CA0F0FD25\ +FBA142C93E23AACAA89289379B953FA55B3E143164A035E470104A9A984B083A:\ +4CCBC8427B955CE5D0263D682AC2B8BF7861ED6226B848F8:\ +5075752E:A876034938F576056B00569E4706963C8B28D23E03AEABE2:\ +3097CCDF824E2BB33089DAA042551335625D9802A2BDE54C10810881157C8DC3\ +7E2ADC8195251FBE040B919D56512F57 + +19A61288F2865F83256E77DBD8D651E6481A3DBFFD5F76777ACFC8C7F7F67BBF\ +112ABE08CF39A751295EAE6D388DA7D469CD312DA63C024304948A6C6AEC9732D:\ +1ACDF5C523995E25A96ABE93502691F3411D3A6CB:\ +50438F2395561269EE8DB64D7AB5602F3BA1544BB997A33CC5090B24B0911872\ +377669726D11BFCA63922CC669DB9D4B87D031079D10990012FFCFC54BBC8068:\ +DF49BE748682A13BC2EDB80D5E4C793E429F6F5F1F042A18ED8515529AB2F1B2\ +1E0F9E824C3F6C65FA04DB99E3D8C6A1DE6E052EEBFDF98F5655A58680A964F7:\ +16226B848F79E4E38E49D072AEEAE3AF4C3E1CF6B:\ +5075752E:019E4706963C8B28D23E03AEABE27C7B294EEC2337:\ +006AAA75DD2B3A7AE867D2DA3581D04AE2AAA5905C0074F8C1507136682A93A2\ +3A89504DC0FEA5603946 + +2AC218404B476913794A81EA8E78C3F8A60E6A05B71066EDE730E7CEC8993A6E\ +6296EA8DFBBC7D46615122FB2F836005517F32C1DF25ABCE53CAC404E95E72675:\ +1ACDF5C523995E25A96ABE93502691F3411D3A6CB:\ +65052FC9728732E830ABDDC1AF7F1DAFB410BF1FB02A5414D718DDF0A867B8F1\ +C22EF2654B66C4EC538F34A4BAEE73981F86D07366EB672D2EEECFC347EA4674:\ +29F696C36E3BDF9B3945A031481EA7CF153ACAB0B689CAB7B799FFA9B5042929\ +234AE9C64D72690FDA8932E7C9AA808ED242E5E06AC68279544CA0B0BDC21F7F:\ +120FEB207F73754A9A42CD019FD2AC263476AF3CE:\ +5075752E:019540EEBCCFFBC202BB81AD78F1E046F4D4597F53:\ +013D9A09041BA0E9DD2ECE20C5042F5442DD14C8F00113A3C080CB2B8FCC156D\ +33E7FB8966032FE1570D + +C7ACDF5C523995E25A96ABE93502691F3411D3A6C19AAC218404B476913794A8\ +1EA8E78C3F8A60E6A05B71066EDE730E7CEC8993A6E6296EA8DFBBC7D4661512\ +2F23F635FF988E284E3018C2C5347734940F7A0B045A5C9A61288F2865F83256\ +E77DBD8D651E6481A3DC0CE0373D9A1EC8FC785D39DBF228112FB58056F7B0E9:\ +C1624A28732743BBE9B1A2B320CA31EF4A127459D:\ +92EC521C2E2C415DF4DE9675A934648149CB0DB1BDC2B11A59D276B1408DA81E\ +D2070E5A311EFD6D7A01B1D327331A7D5C830B781B9CC08D385EAB22AECFC558\ +3052C387ADD3F5FBEC04C1240BD3F48CC2482334F58606C0EC62DEAEEBFF0AC3\ +BC4ED688EA0E27DCE1FCA166CF67741D1FC0EBD7F19E10554C5218C0A5FA7BB0:\ +C0F8288391AC019CC4CFD7DEB3D85ECBCEE4386A4655E9FE68AB66B30098C7B4\ +8601B106B3EEA4F5D71995BB0FDFA27870B83ECF6F7EE4842B2C623367AF864E\ +0439A3D1125D7E697B085ED98AB85981D4C72BF10B2E2DDE9FD6D53D29D68AB2\ +DD87122F58EB8C8E9C52E2C1E346A192F12CCB472CD54DAF600E0E93EE06DA19:\ +64E6970384247DDE2C94701DEE2BD4255785BCA10:\ +5075752E:0AF20FE4162B721067160E55F9BC980AAC8A51BFCC:\ +05B325CB3BAC1A189B132F8F88DB1389958604305104AB71A2C77D8A9C902655\ +9C2E1765D44A81A1178B + +1ACDF5C523995E25A96ABE93502691F3411D3A6C19AAC218404B476913794A81E\ +A8E78C3F8A60E6A05B71066EDE730E7CEC8993A6E6296EA8DFBBC7D46615122F2\ +3F635FF988E284E3018C2C5347734940F7A0B045A5C9A61288F2865F83256E77D\ +BD8D651E6481A3DBFFEC15AEB9410B3CB207A15FB0737509DFACD160A39DC3:\ +C1624A28732743BBE9B1A2B320CA31EF4A127459D:\ +9C78F55BBBF7C3B8AC9EE5F94F3DD9A20A521F933FB57A035CF27659EC01BC859\ +D1DE6F187791E92DD4F6F547707B7DB7586678E7DCC58F08897E3E552F2BB2ECC\ +61F4F06F4685F382DB34EB23ED93BF22FC7FC2E9C0A4151344CD22AD014B0ABFD\ +C715A199E4EE599F09967E07282624F6F520FE79752B94FD6B32A1BEA8D6D:\ +4C9421E17B605A89976C7274DA20BD5BB94DEAEBF07CB926B4D33C9B9C1E5939E\ +4BC1DB1BDA3CD1CD7828F17456666D243CB05DF5C02B430B25D41EB5E6CC466E6\ +7A5AC7D89EE3830690E3590588EA0CAD1883E299D2B9984B9234C6A49194BE1BA\ +31D5CD8F744177064622E696318B4C15AC1C94854F63473F695F2F517807F:\ +69E4706963C8B28D23E03AEABE27C7B294EEC2338:\ +47656E6B696B656E67617220466C61726521:\ +0A9A8513912E5A2AA2375A50A53E505C0F8D4D0A7F:\ +082B6655BB32ED12D90CA95B8DDCBE36DA1DF3C96F009F88917FCB93F04D6198D\ +438A1EF1FB732914332 + +3ACDF5C523995E25A96ABE93502691F3411D3A6C19AAC218404B476913794A81EA\ +8E78C3F8A60E6A05B71066EDE730E7CEC8993A6E6296EA8DFBBC7D46615122F23F\ +635FF988E284E3018C2C5347734940F7A0B045A5C9A61288F2865F83256E77DBD8\ +D651E6481A3DC0091CB01E4ECF2CE88F83F8CE4E39290A544519A92FAFF:\ +3C1624A28732743BBE9B1A2B320CA31EF4A1274569:\ +1CC1C87EDAF647CBD7356D6B162BC027C549063734D50446C9FD5DF04EE59547BC\ +B4022D7BD4784DDD0C890B3D17357E1C679BF2BF5688B647982816D63E1CE6254D\ +551211B03D7547B72D734152499257C0E8D45C33B192B62280D365B921881E644A\ +A31C11888EBAAF02791415F433C5635AF09A8FAC366797F40D18365576B:\ +E43E4F1FDD4D7C26D80916ED6A8E5748A4F900B2F6042E1FD2A42B55240258BEAC\ +FD494DFD669CEACD659F8DBBC7649ECBBF1B2DECDD1BE41142BC8A420E05F7A92E\ +3E23DCF021E8363E7027A0B896A456FE087A4CF5AFEBF5702FC8E64B82AE9369CF\ +BEBB174A7080F6911D4D03677671A7011DFB18B1E2B807FF1ECDACE6B9:\ +169E4706963C8B28D23E03AEABE27C7B294EEC2338:\ +47656E6B696B656E67617220466C61726521:\ +2A9A8513912E5A2AA2375A50A53E505C0F8D4D0A7F:\ +34CD8EEF38DE00C87C2281ADEA5A597E85AFB8BDB42F59C80618D6EDB7361EF766\ +74C0D535B31BDA3A9A + +7ACDF5C523995E25A96ABE93502691F3411D3A6C19AAC218404B476913794A81EA\ +8E78C3F8A60E6A05B71066EDE730E7CEC8993A6E6296EA8DFBBC7D46615122F23F\ +635FF988E284E3018C2C5347734940F7A0B045A5C9A61288F2865F83256E77DBD8\ +D651E6481A3DC00A927480187FDEA61E094D4DBCCD2A60F4B5E9F613829:\ +3C1624A28732743BBE9B1A2B320CA31EF4A1274569:\ +74C4E94AFFBFD290B2F15EF802B81F51A1F4C872687FE373BC410C9CAC231F8AE6\ +9F0D48921AB3497334E5D692E6DCF5F8A7A64C571E1DFFE0D4361CD3EE6B74FED9\ +5AFF2C67C616B1D6C9A072973B33510D86CD64080388D757ECE5DF8BAD1D4DA42F\ +021A35C5A7225591470AC32F8699772AE9562FDAD76F811F3131FAF9259:\ +3C9A8741FBBF7AC5A245F138922CD64EE798B62AA99931D050A71650D12B3FFBEF\ +E1AA95450A6DCFD526D9BE866089BD400FD2D6F4921533F5BB10FDC559C67FAEE8\ +4C75A8A611A57D83E69E26991E2B3F9B1224B61BECAB77D249F5F83DF42B284E3C\ +89565EB5D875573A61066275D3A8D2C90897CDA7DC4D02CA0AFF4A14DB5:\ +169E4706963C8B28D23E03AEABE27C7B294EEC2338:\ +47656E6B696B656E67617220466C61726521:\ +2A9A8513912E5A2AA2375A50A53E505C0F8D4D0A7F:\ +3255F933B90A659F32A2CEBDAD6C3465A494A87D350255D303139C95B0B60D3258\ +A060B4510B0F26B22A + +C537448C630CDBA7C285B31E420F2BEA827EC72309E3D707251350BAFA3DB9FAAA\ +889769A43A2B48A08B46D18842BDA591EE3FDF95A3E3D6A2137BB273E2FB7632C5\ +D7F620122DBED2574A5C9F6F34123132A3A1A6F7C5E105C129375A3733245580C3\ +659A11D4FBA7D50C116FE2D9BA950D6E03A0D20FA083056B38B3A3000C3:\ +2C0094AEAA23065124FC9C8ED04E1006D9403F4BB9:\ +834E982235B6DB4EF6EC52025C56C3A5BB4533BBB83F99C2BD12A200A0FCEC8840\ +94075F74F9D7BD5E4C1F4FA719E082EAC7F4C8A7AC5799F9F614C974E4C84A0487\ +AACA50CB2D7ED3A1FDE75D5147D8EA9654BB2E0D19C807188A64A5B4FAF05A52DD\ +AE1EAFA74146E28A1BC61B8C57192CC404D139F760DD3943E94B547930C:\ +470421750B0C8EF53949D4474F8DE8ADE8CCBF57FB1BB29238968074D9D703286A\ +E7BB845F8BAF54C865FCBF89AC0668F7941A2EEF751D9E477543133CB5BA4FEAE1\ +59A877ADC3D590ED0AD0EBA0D0AC1134B7B1BBCCCAE4B26E1452C0A9308B476DAC\ +D13B3BBAF3B7764BE5C2D9805DBD0640CF2D82FAABB58A4C4F1322E11D9:\ +2B9C9338848ACEB05F7C4F412F401C769616D48324:\ +49276D206A757374206C656164696E67206D79206C696665206F66207175696574\ +206465737065726174696F6E2E:\ +2B51BC665CF466B2CEC3DCA92F6D8F0F02F6A4F05E:\ +26DA0260F10D5C283D85A29399B341384B295B01EE2B2BF011377942FE9DA24B07\ +1B87D83E4167B0B5C8 + +1E9FFA630130BC80BC709C3FCA6F819848DA96CC300AE868236F4AE5F93ED150B3\ +7FF1DF910C28996364F2E737E574811F85DCEC79AFF30B76C4415E742A2519D596\ +ED1227EF561CEBCE6BC029A10B71BE3C88DA1486774B985F5AE5CA97B3ABF3CBDE\ +F7C35402BE0029AC89BEEB2E3BAA596D913B046168E38F02291023BAE525:\ +2BE48B895976B2E8C34B129EB01DD76697C0C16829:\ +C4AB3CB5A673050E19379A28C6A044AD1E85FB66C4D52DFB640B1ACC103D31242D\ +68B19E11F0058F6507E9582094393B43160EF231CF73588CB6B02C4884898EA886\ +DC2EBF9C85E0FA567464D649C17562A15E5CA5A6E8E2F93CC30454AB3DA0D5DEAF\ +833F78B734ED3374AB5FFB9A110DA42C27AD87762EFEB112EBC88B103E3:\ +14707CF4838E01CD359472ACDA71737D51D0BEBC61D0F825275265E42EACA744D4\ +587249D54F901C0BD4F64B0879D4035EC9EDB40C222A15C7113701F8096D6E5CAA\ +3288CA411C7C8DB6B923E933CB297760ECE68EAD0A9CF22CCA855448717399A8E5\ +94DA9925D0CE334BC8434C32CAA225026F03443FD0B74499F3D82127E830:\ +1902ECD8813827AE27FA8033C1DE6A65093BBA1469:\ +49276D206A757374206C656164696E67206D79206C696665206F66207175696574\ +206465737065726174696F6E2E:\ +260FE1BF1BC190EB4014A860AD06DAACF0E62B5C2D:\ +073B5E19E15868A062940B6904BC19083869FECF5E0FAA319A9FD3D414F405D16F\ +11D8EC0EE01B489277 + +33752A90D9CB3CE0672B72DDC545B97314D990EA3B6B86BB493F1256737CC3EEE6\ +1B1390F29E5E6A733998ED28B04527E05A19EE0994795318587ADDD8FC45C6A0E3\ +B8D83FE78BBDDE6C8BF74BF1A11A1785CB13F894B99E536AB152F5CC6DDBE4DF0A\ +E0B3323085AD6C851D18AC2C6C7A5D9F6F5F6297049C9943F9A9C050DD4B:\ +3B67337DCC5D5318D237B3CC48D05E60B7CFBA17CB:\ +4085148908A5902F01579635FE4BA536F3C5FA00B458A178A2A487D8ADDB0BB4F0\ +6DB1D740975F937FDF4D368444F85E210FD2576242DD0FCA58B3EE0595AA85BBB3\ +73D72B5E03C2C26B6C9AAB1C2D29669AE586347649A011F7428E05F727DB6AF5F2\ +5DF9338D668866E48014F0AE18B84675DB2A1BC9358D1613EB1DBFE2263:\ +24C4791E394B5A015AF827BB0638ED99C394AE67A913A21A04EDD2DEC49166BE7D\ +15CB82DBC0A64AF31C0EDA89B1E7FCEA26F421931AC663215B71516E406EB2677B\ +A4C48C759EC28623833ECE3B2836EBE4FD2405A93695C6C15D8D87ADC8F34162BE\ +B0C2030D59417C8B7275076C1DD64B278051A4813DCF815CFF3325D0BC5A:\ +15DFFDB80E7F4698D43771C5F4ADE8C9CD4DFA9832:\ +49276D206A757374206C656164696E67206D79206C696665206F66207175696574\ +206465737065726174696F6E2E:\ +2C6C5DDC20577082E4711D5F1327B0A8EEAA166617:\ +2AB302E2CFF9D76ADF6B8B348621D5E9A3D8D68F982DF65DFC1E84A31C40C1501C\ +367752E42743FD967A + +6A4F538DD1BDFB47B448BB75B0B01837973251C2F2CE4D0C9075685333998DA6A2\ +07B9E5F6624B3F80009877842D334A8D23422AF7D74465A98608BF34390B66C1ED\ +36C83D3EB047DEFCBC62679BBE7D966CB9801CEA54BCA7D88D8511CC4B16A2BF4C\ +9724AA861AD69737FC86ACBAD6D7B3CA756C2C3BD07001741071F60C367F:\ +380DC2F4A7A781B34B0182939CCFAA95F837AAE5FD:\ +4EF29DC07DAEB84A86C077853672D2B37BC8B068923861685ABD55A95BAF109443\ +EFF1B8B14A3B8713E095DB5CCEB6BB52D90EB136699CD017A98F77DB536410B447\ +C70CA8AF4B940D957E68EC0BBE3415C496CB70DD95CBF1F4E63C789EB06DB4548F\ +0B073C95DFFABAE82FDBFDB740D188FC94298857D2EEA9BE482ECF228C51:\ +339533E7F3414DE16F4F01A63E2E8705956A63921433B6D01CBF87D2CB7FE174FE\ +AC1C11856344B017BD123642CFC91EF3B7403F79E88F1CA8EE5B4CCE4C6FD18F89\ +03849C722407D7B864AFC6D81D04A40A9578D004D3E9E4A8BC0DAE6D7BA15EA57D\ +60F486AEBC187343F299DB3CCD1602D70291EE1836C08D28723B9F0AF472:\ +13ABB2B93794CB0F4058A4FDB9B266E5AC74681017:\ +44616D6E20697420776F6D616E21204D616B65206D6520612070696521:\ +23AEAF18FB8F0D808218A587F86C16B16AA5DFA48E:\ +07D6C64CF9FF00D7B8D9191C160ABF50D61E3B90281C06D436B4CBDB6CB380E84A\ +0D0AAB183A11E527BD + +# ElGamal format: p:g:x:y:message:nonce:ciphertext +[ElGamal/Raw] +C2742F0AB4664BDDE65B66471C32BBD5A383491C1C8FE71A7525B5C301B1CAE7\ +A48317D2ABE8C078CEE424899FEC4D876891BCF3E401E4BF339E27C1ACB97E39\ +83ECFB81E1C74093E8206CC794DD180E5B646EB1D195455092859F981FDB3C39\ +47B179FD9DA4C96A1F716570149B0E5E91AFE7168F4B5B92797B1E374AED6097:\ +D:3571A939ADCC0E0A61F8FE6720372DA9FB130C33757B101BED87CF677B77F94:\ +380BF24E9D162C61E95E2E84EDC0F9E56EADF564F5BE33D7A46BC4E0BBCF9151\ +5129E2A547583E576154A216AC035C11523111F877A4B56EE4C459ED645C63DC\ +52D4131D865DD4BA8D057F9FC1EB77352A13037CA23BC2BDE49794B3AB5A611F\ +D106ADC74D9F48FEC91DB1EC77AE70EC9408EA0E750D1CA4B2E437E4233F3E32:\ +02AD1D776D591520E4D8BEF8B21CC2F54FB4EB788E52ECEBE13564435DA66284\ +D51A6A6696E615EF599786CE4CBEFAFF066E0A1CD8868454EB5CE0CA99241B29\ +E1D1492CF2712C2C101B3F3779034683AD8271098C2E3FBAA83901A97D9645FA\ +5815AF79F4F638ECBE09020003F434D708914899C668F34830E70F4CAF0803:\ +0A5842A8D0C1B07E5DE6FD3E0C6B1108523D4D35417F:\ +5B99F58B48F3D473327075F2FF4EEA3C8C1FEB0B241F042864610D6FC512A81F\ +431A965724195DB71C3B84B6B9F1DFAE0DAE60E7CDA957703D10FCCDA45CDD0E\ +F8C8F76AA4F51F3EDAD8E5085B97D69523A3EAC89D67CDFDDCF0A30491A98BE2\ +FD6C5E69C3A2C95300B9DB4EDF2111E7613EF7B2CA430D0CFFBDECF6A7BE592A\ +853B404B6910C48A0204ED3430691E766FBAF21A428B9F833C5932C053C616EE\ +B59850150A22331A8FB5AF2065B595E4F08881B1DB7CB85A28A33F4449890739\ +679CCAA431A9205210995BEA68759B475BE4183A975C9D042FBBEDF589AB6AF0\ +17D7523B2CC90CD63526BC584F1E9EF42ABAAA9238987D7F73B94E323C6AADFD + +FE25EB971E3488A92A4BE75E51050B0824E69B18AC433B5AE7DE98EBCCE8AAA6\ +301237489ABD17A52EA9759AEC87D0E90F7766D64096A49CA99EFBEC82049898\ +06F5C49479FCB6CE8B881BC28F19732F0325786E7DAC54F8C216B6C84562C88F:\ +5:CC4D3B878DB91C340CEBA8495CB5F703ED90AB24BD793E4470125CC:\ +4B722A9E2DC991CEEA1D596586D245EB9B8129515AD66688CEFDBF84FDFF8C19\ +4A2D2BCB2AA82C47CA9FBB3FFB86BFC5CB4676B4DC4A2FF006AC3D578010C9FA\ +E140822DBF9DC26CCCE1701B8CF08740ADEBA1CB94056FB33FA2E88DE84CD477:\ +02C1ED6A171875F055809F12BC61829961CC740935C6DCC468FA663E8D1A7DE9\ +E0555E3EA99476436743FC5C76D3E041055FAEB7641907F8E2F1F94061B22E72\ +B7CD39EDD7A6367828CCDC000301CEA7D91CB1E8A3E20DC85FAA23EF6D08E6:\ +F42F854C10C9DD14A6712594A31326A1FD2CF5:\ +9E47FB001BDDB12F2D8E0FA5501A7EAC1B185FDFC7D2FF3E4461B0D75D626F51\ +56DEDD4D25F13C6C1F5F9A1F916058045705F5E82F748E9B6F0DC95D572B8DC2\ +770159092EECA13946F0522FE2A859705009B615818A1B4F98E8DD38CF00DE74\ +6ABD5F3852D93F8D9299DE18EB763F11E41A8B9660C5F056538EED431BB8E219\ +9D9012F50C7FBEF5AAD35ECCD7F141CD9AC6553315A2699D6718F50EBDCEAE62\ +A11ACC466E8533EDBAF13C15B5532B323EBF283B108F892DBFCEA21231DFD548 + +FCA682CE8E12CABA26EFCCF7110E526DB078B05EDECBCD1EB4A208F3AE1617AE\ +01F35B91A47E6DF63413C5E12ED0899BCD132ACD50D99151BDC43EE737592E17:\ +DE0B54EFABF297087EE623D5CA5588C64828EF4FDE4FFBAE1ECD2006776B05B1\ +1B81EA3CDE9BC3964C1687C5325BF43D7CCEFA0D0A86BE5DFFDDD0D1143DCD75:\ +841CBF70BC6E95C7E5ABAE60DC6538EE:\ +12C0A0D25B072D8698FD929B8EA219874E4EB6A7FB7D7EB5857A246235D70F6C\ +950118914598E62ACC2EE8E061B560A1FE272B9CA163A7C134E1D6767910ECD:\ +47E586A7E7D98C116A6F553F652E57BF:\ +BEF5E7EFAA76C52A8ECEE604EDAFD31B:\ +CD70DE085B0C586B4E64097EA3AB4CE0B60A71B0F640FE4468F4F940412EDBD\ +D9035EEC602530CFF81B2CDC35805264A866E4689DDBADC3438575B6337118B\ +B23A5AB7710F85F2A4E1E0DBEC5652FEF73C868747ECB7043BA08241A0879A2\ +DC588D3EC14ED552E62B1B111646FF4DFA9050754240A46A840EA5EB1D97712F2BB + +FCA682CE8E12CABA26EFCCF7110E526DB078B05EDECBCD1EB4A208F3AE1617AE\ +01F35B91A47E6DF63413C5E12ED0899BCD132ACD50D99151BDC43EE737592E17:\ +DE0B54EFABF297087EE623D5CA5588C64828EF4FDE4FFBAE1ECD2006776B05B1\ +1B81EA3CDE9BC3964C1687C5325BF43D7CCEFA0D0A86BE5DFFDDD0D1143DCD75:\ +AA3837AF7A7ECF6DB7E0B702A054363C:\ +74349C465B92635C1692BB6F2932E06C1BDF3FC81E78DEBD661BB1DBF1FAC1DC\ +C24EA052A119CFD272CCA2BE1E6BDF4579A7D69C739E8A412D4AACDDFE9EDFB5:\ +74BC8D009250F4CD2E08BC556EE01449:\ +A2951BE393736E39E9D209FE978C7546:\ +6D6ED1C6E519C628CACC7981A5BBE487F6E013B26448D711911698CEEAA4F746\ +182A716602183A746FC35B022BD7B27EF079F7164309653D148D0CE91907FF6C\ +4A9001A0CCA2A0A163F3F93200C2E40A957919CB84AC35B928E026F1827E6D4A\ +9B986B592BE39861538414D5EA6980248FD3C3C0CDEE372F392D5AC46DB8EEFB + +FCA682CE8E12CABA26EFCCF7110E526DB078B05EDECBCD1EB4A208F3AE1617AE\ +01F35B91A47E6DF63413C5E12ED0899BCD132ACD50D99151BDC43EE737592E17:\ +DE0B54EFABF297087EE623D5CA5588C64828EF4FDE4FFBAE1ECD2006776B05B1\ +1B81EA3CDE9BC3964C1687C5325BF43D7CCEFA0D0A86BE5DFFDDD0D1143DCD75:\ +8FAF3D43EA4C7EEEFB9C08807D90B160:\ +F9AD56F050A9FBF969A0A7D2A56BE409BA0EFCF23CCED06980E5A8965EBC6C30\ +08858AA845370F56C1BAB31177C2BB76DBFA9E04FE89DCCEA67BCED6C55ADD8F:\ +01AFE1A93EDB9CD3E3715523C952478D:\ +9500DDCD404618F64A2063BC19941A6E:\ +0636C3F1C63C54CAB4B48B6EF0ECBFF00BA6AB70DF4DB6266D0785351B37279D\ +41D957D16CAB48C64035DCB2A1CD75BAC298C8ECAE8057D87071EADAA5DA6E2B\ +69B5F353B5753F7E24DA81ABAD40059CD73CFA6E78CAB1C7DA418D55E5DBD42F\ +A4F2B876A25B4AF63588C80E0DB11E8BAB1531960E951C08C1A68C8FAE0DA87C + +E9E642599D355F37C97FFD3567120B8E25C9CD43E927B3A9670FBEC5D8901419\ +22D2C3B3AD2480093799869D1E846AAB49FAB0AD26D2CE6A22219D470BCE7D77\ +7D4A21FBE9C270B57F607002F3CEF8393694CF45EE3688C11A8C56AB127A3DAF:\ +DEEE9EF5ED1516CE7E695E672B8CEE45E6CD7B36E0E6385F894BA86163F6F3E6\ +C6D4E8A81146D4017DEFDD71CBD90FA0247659B88B7CC1C894F48269FD4F1AAC\ +0A30538DFF6B3FC76CFB131C9E7965B58858AB0A43B557335912A8AA547F9568:\ +FF4FD921EDD9618570ADA5C59C2A01ABBB9A51:\ +BDF5D785E7621256CAEB307A92AED0BCBC34B6ABCC568C200D413585AEF1E686\ +9C60E87001A664A8FF8645C3F79E1667BC2769D82605C3B1AB1A0DC2734AE831\ +32652544275F5C59CCA355BAA02D9DB3796A6B6CCECC14BD85B02A2C18EC7EC8:\ +58E72BD0F04B11:\ +EF07721FF6B28A8A3B4EBC95C16B13A83649B7:\ +C7B6ACADBBCFD3A34EDA31CE9CA7F7889FBB2DF5C6C25793EB974591BF0EDE93\ +637B6A95E8075BDB2A987039D92487665465C98AAD0C123FA00BB9736170E780\ +69AA32DFBEB07099A0B7D439AA807A2D3D6F9F913EBC673F9F8CD5D3C0E9DD0D\ +988EAC4D8204928C2DA8ECD1FA3A598FCBFFEF5017DB8542D123CF69E8C92EB9\ +56F10DC995AE6B6564967D5C12A07BA35607C54CC3F10A36FF3603DD7CC14906\ +64610002977CE8C4A4EFFBD1421C902D4D8DFF81D014E1AB55F239E0F2FD28AB + +E9E642599D355F37C97FFD3567120B8E25C9CD43E927B3A9670FBEC5D8901419\ +22D2C3B3AD2480093799869D1E846AAB49FAB0AD26D2CE6A22219D470BCE7D77\ +7D4A21FBE9C270B57F607002F3CEF8393694CF45EE3688C11A8C56AB127A3DAF:\ +DEEE9EF5ED1516CE7E695E672B8CEE45E6CD7B36E0E6385F894BA86163F6F3E6\ +C6D4E8A81146D4017DEFDD71CBD90FA0247659B88B7CC1C894F48269FD4F1AAC\ +0A30538DFF6B3FC76CFB131C9E7965B58858AB0A43B557335912A8AA547F9568:\ +B3BF90978FB3EF96E40F2AE8260F42B908EE1E:\ +578C33240691D5351BCDF2C727BEDF8C4B956EB32520ED93DB034D00EF69C44E\ +523639DCE55E09631D8EB6C6D6760CE10C510AA68847B7CEED43A3749F653B5B\ +2BAE4B07F95F85DA8F058F8DA2A0D07A2F0C5B009E63C06B638FA1B43CE7F7A9:\ +C37AA41207A357DBCCFBE93DC45C5BD91D29FD29CBA29B26AC437A9B560C3BEA:\ +A36338E4D7815E6A4B178E951BEF073C6D5A7F:\ +D824C94623313298600CC20203F8A40006CAFCFC8F883C99AC09DBAE4B95E6DB\ +9FB5737E24D9D7E39B603893076BC81A2BC0C0D608B32B353972B57066535DAA\ +C49E3F7F2A0E243618EEE01C5AB3AFAE1D55E3A1DB33CF713E5187AD51D55144\ +B1A108354ECA651E55F85F253FE73C1C15FA5EDDDA47467BD0425F09E3C41565\ +48E71896659C618B84FD72BA176E2DEEECD8B15F2C05F870697EA464B8827374\ +2BD6ECBA5164424F34EBB9E13E31683A16712901818C7E5F502720FBCB075EA1 + +E9E642599D355F37C97FFD3567120B8E25C9CD43E927B3A9670FBEC5D8901419\ +22D2C3B3AD2480093799869D1E846AAB49FAB0AD26D2CE6A22219D470BCE7D77\ +7D4A21FBE9C270B57F607002F3CEF8393694CF45EE3688C11A8C56AB127A3DAF:\ +DEEE9EF5ED1516CE7E695E672B8CEE45E6CD7B36E0E6385F894BA86163F6F3E6\ +C6D4E8A81146D4017DEFDD71CBD90FA0247659B88B7CC1C894F48269FD4F1AAC\ +0A30538DFF6B3FC76CFB131C9E7965B58858AB0A43B557335912A8AA547F9568:\ +EE639A2B80F4FBBB96B82A0DA6ACF23124A1A1:\ +5D13E05491C00E0FAE1245BFE0E374F2753CBF1926352FB4180F11D740A2F6BC\ +8486C0E0F52D2990773ACFE01CD4AE6F428D55092FF33144C2D9F37692BC1230\ +89D9E77ED393C495ACBEAE7A9E927F4AF1D0E845D2EE93E733BCD0D50268A47:\ +36FDC0501B44AF:\ +832BC01DB63F958D47B6962AEAA74C0831A6AB:\ +62E46CDF100BADF4419215256BEC8427DD0388D1B60B5A8675532C0934351BA0\ +036AF58032AB6C4DB829F1A0C8217FBF2CB9C10A5C60FF285919BCAF238E89FB\ +AA4771CAD13D4A69AB2C1FFF0A44D2F9287F1E70D58210AE859074B3969EE800\ +A9D1507BA48582BD1E03CC234B0CB11408BE0932763EDC99CA4BEC6E496A4522\ +37F920972C629714EA2F1FF212460C23B66DB56BC73E94743D32D2CD3536A17A\ +136F56D7F7C24E3B8F102F48BBB21633279D3E584E71DC37B436104CA69A6BB3 + +FD7F53811D75122952DF4A9C2EECE4E7F611B7523CEF4400C31E3F80B6512669\ +455D402251FB593D8D58FABFC5F5BA30F6CB9B556CD7813B801D346FF26660B7\ +6B9950A5A49F9FE8047B1022C24FBBA9D7FEB7C61BF83B57E7C6A8A6150F04FB\ +83F6D3C51EC3023554135A169132F675F3AE2B61D72AEFF22203199DD14801C7:\ +469603512E30278CD3947595DB22EEC9826A6322ADC97344F41D740C325724C8\ +F9EFBAA7D4D803FF8C609DCD100EBC5BDFCFAD7C6A425FAEA786EA2050EBE983\ +51EA1FDA1FDF24D6947AA6B9AA23766953802F4D7D4A8ECBA06D19768A2491FF\ +B16D0EF9C43A99B5F71672FF6F0A24B444D0736D04D38A1A1322DAF6CDD88C9D:\ +A0A2CF6E5C2C3157078FE232D88778DD7A864507FEF:\ +23020176F56436414B28AA4246433075433AC50C81C803275AB4BFB132D8A42A\ +27B69E40D9A219F36546801348E0191E7CEA23AA70B7EDBD52A44D0FA48946F9\ +0211186E58DAD6C7D2E9207379F31FEF083224FDE665576AC0A1EF193CE23FE0\ +8DB42715CE27A6E00DE4F373F92A221759C1E318161302ADC3CE9F1229290D46:\ +DF72B687F62AFEA3A51195EE876E4C87708F7ABB8D2D5DD72B68256DAC6D:\ +0B333C9C486C5F3A96F37D00133ADD18113376C9BE76:\ +4156CF437A39C415B212AAA34C9AACAFA3F3113F53BB75E0BD3D759089E21754\ +EF89B4BA1A8B37E5EDA13F8A2F87D16F03F3B6FE19A5CF799B17D83F7B5E9A22\ +5F324AAD7D46E80A1DAFCA337A3F500930A7831D1F3785763EB9A6994063CED0\ +33177E1CA2770B751B3053C1445ADFEAED790E49E4685A05B9563D1EF32BD321\ +971D541B525D648EA7C8741D8FA7E46293D46A0F4345BE73EA4FAF1E4C16BCBE\ +11C53BA0FCBA2975BD37F11FE5ADA8731CAED3C403EA6E43AE47ADAA7E284334\ +04AD3ADE6AA8E12BFC374BADAAFB167F3AAF91DC6F8398003E5F8528E8D4773F\ +800D48C8EDDAEDD72A3870E97679F946CE27FB692BC11677757A28F3899A3DA8 + +FD7F53811D75122952DF4A9C2EECE4E7F611B7523CEF4400C31E3F80B6512669\ +455D402251FB593D8D58FABFC5F5BA30F6CB9B556CD7813B801D346FF26660B7\ +6B9950A5A49F9FE8047B1022C24FBBA9D7FEB7C61BF83B57E7C6A8A6150F04FB\ +83F6D3C51EC3023554135A169132F675F3AE2B61D72AEFF22203199DD14801C7:\ +469603512E30278CD3947595DB22EEC9826A6322ADC97344F41D740C325724C8\ +F9EFBAA7D4D803FF8C609DCD100EBC5BDFCFAD7C6A425FAEA786EA2050EBE983\ +51EA1FDA1FDF24D6947AA6B9AA23766953802F4D7D4A8ECBA06D19768A2491FF\ +B16D0EF9C43A99B5F71672FF6F0A24B444D0736D04D38A1A1322DAF6CDD88C9D:\ +B81133CD81461728FBE2D40682850CBC1176BBF24D9:\ +650BDDC18070CC54F0DC4DFBBF4B3144749D7D219E4122E27092FB005F82612D\ +39B652486DFF5B628FBE626B54D70FC5F3C11E5E4C7CCB5CBC78E528AC70E740\ +302FA043581A55A93EBB7143E807C056748702353A65715E39A86F3F1F90FD00\ +FBBB817D7C48A465A1DBC8DE5D8CDCE259D129D02EB673A4181B9CC88B7636A6:\ +F73BB7E5C8A5619380:\ +0AD9527B09EAD1E59B4A1CAF58C861B69A856AB8AA80:\ +C9881464A37749949D66D75CD9B7A8ACAD33DD1FAC7561F684E9CB5343D2ED15\ +969D7EDB4135518B50F0FEC9A9559C1D5E44DAB42C14BBDE2D2711EA4D02D7F2\ +7D1A9BCFEC9E8B73FA64BA3C54707FDDE7D5BE695E17FB9D259FB576FD4E57D6\ +6C8F727DC236E2A6E9FD01709D34B8D09F7DD3890F003EBE616042B4E0A8A00F\ +6C3F34DE7E002FE72A84AF8D014D64E8CD08B9B56CC3A6BBE6F966B92105A92C\ +5ABF4F2BF735670622F6213FE9739FAD65692E1C0EBF708A47E18600A22972A5\ +A3DA0F22D11C581D46F734151A083FF757E961351EB183B467A859FBB9ED1DAC\ +396FA405701FD6E3A62EB126E93648C3C6DFA9C4DBF3C005880F4799F66B310E + +# DH format: p:g:privkey:pubkey:finalkey:keylen +# where privkey is our private key, pubkey is the other users public key, and +# keylen is the output size we want (often this is ignored; if it's not there, +# keylen=0 is assumed) + +# Raw: Use the straight output of DH as the key (bad idea in practice) +[DH/Raw] +813E0E814BEE676DBD3D9D28ED73D36735D21FF6457236F68D3D6145560C0FAB:02:\ +66277A816EEEF66675319C2AEBF2E8D6154EE359370E8E1B194AAA1B9A20FABC:\ +3B4C5FEFBA6AC0A402C6AE132540B7312C93DCB3259530F3A45F7A2C408C920D:\ +5D9A64F9E54B011381308CF462C207CB0DB7630EAB026E06E5B893041207DBD8 + +8732EC631F04F7AE57F66AD4A481AB4462AE26400348AC764D679311C41C5EF6\ +5BF618A6E0742A27D59A18868FC7A131DFF158C83ADA310EFA493CB86CC2966B:02:\ +0AAA1D96792CE097CD533208550433ECDAECF557F1DB669A5A0ADE4284B5272C\ +12D46FEA0E9A549B28130CBBB76C36C9122BBD0AA3D3D1C055731DA91F28A99E:\ +675F1A653994E03B986BA4FA13A2B51C4493B310EBFA5EDE77D493CD243FEDCF\ +FFBE9731D3E50A4586EB405FBAFE446E71EB7DF638C1ED43EE3DE69A7363BB61:\ +65F79BCC47862E02DDE775B8FC7B1D0CBA094B753E502D49A446868768\ +1F178CEE98016210E136E80255FC8FDECC4D38D91EBC82C94B17652BDC7569AC383F39 + +FAD40DCD165ACBDA7D4BB0FA4830F5B27A27D9A01A66A60BB177CC31CED51DBE\ +9B269227BED5BCDD18E217A98D9BE4E55D0498717AB21A4BC1A32BD32D7BB6B3:02:\ +8A2264FE1D57CE13B9D16448C25626CB4A5E254A9A158DEC352C2CF36864F986\ +2021AFAAFDB8F5FBB51282A19A2251C91AF08173E71EED2B2BA7BD3378F3355F:\ +2B86E1EBADFBB7F10C9807602F90EB2BBFE9D77FDFA743777B8CC212892E54DB\ +D01CA7F4023EEF2A56BA9277778A80BC27EC86298E22030469A0EF3D49B57C3E:\ +290BF0265BAAD40A5853BAF3CC18B315982FF282C82D7332DA6A8826E789330D\ +875F29F57D9A622DB7DDF156CF4440EDB8455BC32859FA2A178D42528FA64136 + +95A2F3D72B3D394EFDE4C055EF6C6E4E7A598242D0F2D2F9F31A2BB5191D7CB4\ +7FDFBDE16BC277BEEBBE02079632F2374CFCF4F9719C154DF8A9BAE52A8D7127:05:\ +2B600D6C9CF358D21D41E0DEE2B3C81520FC617420F63B2ADD9E64D2B13954B1\ +AB117B40B6A1EDA56237DA1ED34DF9643FA471C2B4AFB5A00455DE9A0FBAF399:\ +6A097559AEA851EB6DB23A0D45A5060F32F50961BBBEF3D22A01B4EC229E651C\ +932958088814DFF54E9647FAAABEB555EA966542C24F28980B2A47A902798B55:\ +4ED3B2ED6B3E8446D8E1C3D2BCA00FB939464874BB6750BDE5F5DACFE9F81959\ +7E96F6B1DBA27C785553383AE87188019734A160B6BA5396760B88EC1F2A0E92 + +86B7815320710E1415DC26FC566F64866BD5AE7FD8DA39F42CFD3533C80B4E37\ +402557B45D027EBDB8BBBFE66769942408E2FB00A9433597BB20B9312A9F84A7\ +F767F7A5851A35F1A4C2A89AD1DC977F45689183C9836C96AA5DA075CFF03419\ +B45B885D83DCC4C0E3FEE66E76212CCCA1382FE314E4846EA0BEB29772FA625B:02:\ +21716E2202D31407E8471E0575465FAC1D309A30C90C9FA498F1718BA4047E7A\ +831E85E0E358C847CA4DC9DE47F007279D4BB22107889E5B7BE0D02F8519D585\ +2A1DCFD54F0AED08906797D9382BBD6F7B4712850F8981E855D6A6769807722B\ +7D93FEF6B822533C2A51CEF857AB9359A36AE6A3B7035AB6C0B7B4660953DAB9:\ +07BC618157B3FD72B2D80494B73AA7A5E5F40BF4A5537E4FD878D3CB6C9B0D70\ +D6A3CB3B35BE49259E7BFCFCBE9FE133B0133924A8CAFB4317005165416F7343\ +42F1593C71854B696ABFEA7E3AABBE99F1ABC745AF0E56AF283DEB81CDD91F26\ +B1FAF1EDE40D97B1E3370339841AA28A99A638DCA7958631BD6ED0BE6A470525:\ +2B6D9504C1D7ACAD9652CF79A6A0630EA9D19C197E908E992BC318BE2867FAE3\ +C1AD5BE83E6E4AA1CBE0347774038F20ACD790DEA82B2A5862BF21FA4A1AB464\ +AE985CA8AC4E5076AD0843E144C1305759BA047446A3A7F2426BE0C724F26900\ +9B54447B6A970876E5E4C613356805014D6060039C081AFB046863CA9BE9C848 + +# The primes and generators in the next three are from RFC 2412: "The OAKLEY +# Key Determination Protocol" +FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ +020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ +4FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF:02:\ +70F70628FC92FFAB93039B31EFC65E760121EA6632F9D37189767CE01D4A7C5F\ +782022DB71857281E270A7AAAD68467C2825635FC198208F749A5BF25C444D12\ +74F6F760E068FE11A7B7FAADC154EBE77DFBD2F9A399BF1710C75291E6B33E53:\ +35F4FE8E20A94672FECC2F8C24597541E7A1EDBF76C0D0A92FDC6E99CA016F4A\ +3F315E42A5CFAF0A50541E420F2ABB632A2609336077CB8E0320CAAD94796478\ +8B26954B847E08B1AE08FC3D2D0F9DCD449A890B2E4448E4B2D106DFA887FB61:\ +1835BAAC22790A32874BAD6465BBFA22BEA8A8FFF9847814273311E715FFED51\ +5AFEFAFBDB88F5F6059A874B8ECA325553D2399B36BDAF703E23D9BA426B440A\ +B9B3232319E82F60651B5D9610FF5F62D9676AB0CC691DAD9373E14407515B06 + +FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ +020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ +4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\ +EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF:02:\ +A71FB45046F3E7058521C35F08200AF51A0193D68776BABC6F5571BCF092A77D\ +D44E7B4E5AA450A7C4FD142DF648C03BA1C6944941B3A5C2F2515177B23CFC01\ +09825B85029798C6D3EF8C46D9C85A71558AF8CAA411B270EA3FDDD7D3586784\ +DF92CCFAD908096A0FB647B18A62D7E4AEDAA26D9F4E1247BB208232FA9EFB9C:\ +51F0590A0593A41182A1E132E68E33D28F67CE0BF42C6BEFF057EB10255BB78D\ +0BA2517603700FFBEE570EA1591F56468EA7AEAFBE03B10D3B7A04271B94F819\ +0031DADD2D852F8778D9A88486C89EF3C5FF4F478D4E21660A0B1542FB58FE82\ +FF89FD8E10334A455C937EA11FBE28A8188C1DA05B014FAC2A28A273AA517082:\ +78E5A35AEBE11E2A6EE2AC7CF250BB6D14D4194E4B4F863388B403A6D4F77179\ +2399B005B60876A2B54F38B10E80D7FABD5CA0260DA7F49D3C8BC319EAB0DCE9\ +8DB256D55A3D286FB4A92D426908121A48FBE08BCAFBB2CCBD79CF2422ADC0BF\ +7FD6D32BBD7179CC92C5B6F3A0A66F75521119B054C9C890A5508FB82DFCF947 + +FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ +020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ +4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\ +EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05\ +98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB\ +9ED529077096966D670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF:02:\ +4E83BC69DEB2E98884E5BEACD0331AD07869BC0CB3025B4882670A9AF4FF1F62\ +8FE59526733B16B43D90D976EF55BE00A95C7846F447374451565D6470373096\ +C93448F390EBE47E63F22F1840AD1E006F09A85B75EB69DCA9D3D823F9D3F32D\ +81A03DB69CE3A9D35B7999B3F1F692F795805411762570D247B55F02EB64A3C9\ +CDE4EDF05BB008BE68863FA5A01E7BAC582B189A6C5D845E1216C91F2152B708\ +DAB6F985EF5E220C86D2B5CD50739F6A8F6E86527072777EB3940E8F12FDB8FF:\ +3F11982BD3DFBFFCDB49F3B4E401A004C42DB40DB314990413064C5B63D6E0D1\ +E1A5178FAB51AF92AE6B7184DDD06F76B6EF9366247A8CD5ABBE13C61468BFCD\ +BA7CD147EA543D567433E691EFBE80DDBBED90CD2F606EE4C36E568AA00EFDC7\ +8CC2D6F8F98C09E781B120421BF98A8EEB2A1064D93085105307A46CAC09B27B\ +4D1FDD6E3000574FA348D2632865D7958BF64A3A858A8605370F73DD82A1D79F\ +66071E312328BFB4D965BC51044DB4F981C00E23128AA00ABC3F908A2690E0:\ +142195F7212A66E8E79E6CBCBB092107C38051B998A46110A759B2DD35DB9371\ +68AB11CE2AF35F8C9263C585FAE7FFF37B9080F65B6AF33A983D8177455F9D90\ +5ACADB57DBFF67A27D4947C999A2B5CAD13BEDAF05BB2A197654740F54C932D8\ +4580F6B954F57C0A42317CC77036346CB8FB3BB07A72497C74BE7A454AA98BCD\ +458F85B323119565C650AE6F884BAD489BFE34B4A7116412E5FA6920355DCA65\ +24110068A5BFA93E1CACB6A9A3B4FF47A760107AE212279D86C1A333AAC0E7BE + +[DH/KDF2(SHA-1)] +B842DBEC0BBC87979604EA9E14FEA8FB0DCB4BB09653621A7363A54A9DE9332B\ +1D878344D9D98BB06FD14C79315C7B097A7CEAAF4B0F66A422ADDFFF200CA78B:3:\ +7036B197651B364DFF16DCABAE5C6D:\ +9AA69B0066B495822A5586AF3FC19933E5EBF46B715B90DFBBD5393F58926AB3\ +8D02834A54E06798315558C7E274A193D5D9360AC855DA792BFCFE7FC635E213:\ +EDE06CF771:05 + +C5344A976F327A107D669D4835946362AC3CC1B1198770826CE684958E70B288\ +E5FD065BD2368CB172391B8D046DB93FB1C3ACC0103435EBE8A75C706F63B8E3:3:\ +EFF15251EAB928852C16CA1517E1DC:\ +4772265D1FDB3FC3F2FFB5DFE863FE8D93E871D5B20D697A49BE130DB9B0561E\ +B118B8E8513CC9A6C07CA9647363CEDBF5C0AFDEF41AF7D6BC0F0E6BFAD50672:\ +02F0A9B8677D7874494627C1AE8B1507:16 + +B9E01426AE646FF40980427636195AAA04DB2D9FC12ECDB4398812D1AE99B885\ +0396A2D6B0CFCFED532DA21A6DC58A491B75833985AF38D97727F44EFC8B2DB7:2:\ +E0E9E13CEE9C43CAE541A8ECD0FDAE:\ +9E549B7F385537D7CE2E0F332D6F98E5865DCA0E6C633B110CFAAB832B4EF75A\ +62617B58C33F9F4D0D957FB0218CB9363C2C6CC4C8DFCD9FDC35D401A69382E1:\ +6F6B153DC35648A59C2A43398318F90CC1015C:19 + +6591F4A4899EE64DCADDE9E5ABF3A9BC409857F4F7372435F4A45C27E5B0C2CE\ +3E6E35D9FE555B49B80BC978D1B4E7EAFAF7C93A08FB3D9A48C59C9BC596C720B:3:\ +BAF42B613C37B6FB6409D33D9B89DB:\ +C275194FE458D0ED562103E3FE7765AF9639B1C826BD329A60028013B8EE48245\ +487A91EE6B221D29DD30D17FF0C35B55C3CA435BE482EED716A60D266D350A7:\ +5A70601B0668BA303F8FBFC90FBA82B9D589BD586C576B414A6AF17F9B386C7020:33 + +# DLIES format is p:g:priv1:priv2:message:ciphertext + +# p and g are DH parameters +# priv1 is the private key of the party encrypting the message +# priv2 is the private key of the party decrypting the message + +# The underlying SVDP is Diffie-Hellman +[DLIES/KDF2(SHA-1)/HMAC(SHA-1)/16] +FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ +020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ +4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\ +EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF:2:\ +A6963780ACB9D2C5C410D502AE60F027A807AB5BBE5:\ +88EF9E0354C67E9EB781A8BE95DD281A215CA1DCFD3:\ +AB5BBE0D:\ +538F9C9CAC3EEB460B6D40B4AC331EBD3E2F3065E515177F47A083D1AC71533B\ +F3B2931F52D71A99CA0804A633E1948F3B286453EA6CF0DD83C6DD1D2BD93B20\ +F4942D9679CFDE5856DD81E152E1E5ADD023324B945CE68425B025AE5D0CF86C\ +0D33244A60AF6045BD57018FFE5F84A9BF82193242FF32A64691586AAA298FE5\ +31CF06A56412DFEC3AD1F50FF8CD296310E5BB4D06E15AB0 + +FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ +020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ +4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\ +EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF:2:\ +C2D89AA7566998A9E90E22F9244C84F68B55473594C:\ +AF719F4ACF99CD35BB3B71F0DCBF27F6A4268D91264:\ +C43BB390:\ +C04F6BD6D1BFBDE74E775FB391A29B2D6FB7EE84C13D2061291DBA8708E406B0\ +A6788F69F7DFEBE4CA35B31917EACD7D36CDBEBDCC51567ADF3F287F57592A0F\ +73E1C990B807E0A67ACAE3F07361DF123C59E0A95CFCA9DEB3C7CCDC47C925F9\ +75AF0948B3DE9EC1E34EED30391FD4080D77DD07F091E3D5D89BC158A96485B2\ +8477AA95D62EFB9FA1D2B44A38A698F81C9518355BAE8B74 + +FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ +020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ +4FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF:2:\ +B8BBACE15066DF21FC2ADF8F2FB47776D98716F5:\ +EB2EDB317A29CE6BD580D1BBDBDA5585450D9B7B:\ +3B06E0705DC9DBA971AA624393984D5B:\ +2AB9B180CEF08E761EDB4D7B7C538FBA0FD37BACE9416789A0DD6551F2DDC602\ +5C76A663F1AAD5000EC03418A6220ABA6D3DC5EA82D7340E2FFCB5665AD3A222\ +3CDFF9C39889CBE31E44CD31BCFDCEFCF2A9916FD39E2720A7B826F7E6998F73\ +4F251C71DC970AF3FB12949C14AA759966733BFC976CAD0BE71FC5DBE285200E\ +75647C62 + +FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ +020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ +4FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF:2:\ +B2A1040661E071F702CB2190ACAF3CC532FE1DC2:\ +8A9B563FD9A12356EC7851943CF453AF7236A596:\ +DD92A05E19BBAD4A33CEFFA0FA2727E9:\ +3F0300C53C0BB02A3EF2EFCC751EE5D98AE991730C1C2FE39D11A74D32D892AD\ +63A9EECA09BBBE606FB426E03BBD480FD224E09712BB85FE649D543CBC23113A\ +39F9102C65D31DF330ADF233735C1D60D1BCDE22744392D2D9DE50393984F276\ +A33DD85F763ED1226B88DF1662554AD27820F66A995FE1481189A2B8C3071D0C\ +32EE9960 + +FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ +020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ +4FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF:2:\ +C56BAF8FAC2AB023B2995F5958D5E929C7501555:\ +9F48260F8B6FF09E0F71B97EFA50E2469F316C3D:\ +174E756AF8FFB51990BF3C69688D3A7F0B388F2BCE62A095BC12CD6DA2C2AD65:\ +B99BBBC64F6320060200E6FFE7D1FE6E5EEA79DF142111AF88D377037BD91863\ +41B7A7A27F2AE8BB77282B8EA13D821DD77186412CA3B9B5E1650A0D20687B1C\ +8D556FD7D547D475F71BBD7D6417311F535A9A6D95CEA8AFD1146B1A1741828E\ +8AD46B058507A67111CB62132350EEAC1212D90535677855E17B1DA9DC4CE790\ +C4B917B1359123226FE62DCCE5475721F09CEA23 + +FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ +020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ +4FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF:2:\ +F54BB009FFFFD728677F76CFF2B1BDF05F24226C:\ +F6F5DFFCEA9F09A784C15BEACBDE88C0F58D19F7:\ +75DAD921764736E389C4224DAF7B278EC291E682044742E2E9C7A025B54DD62F:\ +C591E27A2C12742A959652F5F341F558CA0C7DAF2E6B5ACE32DCAAF459553BA2\ +3EF0235EAFD86A7F2D70587239D858484E5CD36122C2B9F6E410C7A9C307B2A2\ +A084BB1B634A15AC9F09E38EAF421D14C5A07B6EB5EDE6915E8DE9D3D9D01DBD\ +8822FBD79BA7FF3DF921B5451BBD9A12AB41FD4DAB829599BC2736B23753063C\ +0C5FFCBA7DB06DE26D3C441D126FC1A46531F593 diff --git a/src/libs/3rdparty/botan/checks/timer.cpp b/src/libs/3rdparty/botan/checks/timer.cpp new file mode 100644 index 00000000000..c42aaa4b2ec --- /dev/null +++ b/src/libs/3rdparty/botan/checks/timer.cpp @@ -0,0 +1,51 @@ +#include "timer.h" +#include + +Timer::Timer(const std::string& n, u32bit e_mul) : + name(n), event_mult(e_mul) + { + time_used = 0; + timer_start = 0; + event_count = 0; + } + +void Timer::start() + { + stop(); + timer_start = get_clock(); + } + +void Timer::stop() + { + if(timer_start) + { + u64bit now = get_clock(); + + if(now > timer_start) + time_used += (now - timer_start); + + timer_start = 0; + ++event_count; + } + } + +std::ostream& operator<<(std::ostream& out, Timer& timer) + { + //out << timer.value() << " "; + + double events_per_second_fl = + static_cast(timer.events() / timer.seconds()); + + u64bit events_per_second = static_cast(events_per_second_fl); + + out << events_per_second << " " << timer.get_name() << " per second; "; + + std::string op_or_ops = (timer.events() == 1) ? "op" : "ops"; + + out << std::setprecision(2) << std::fixed + << timer.ms_per_event() << " ms/op" + << " (" << timer.events() << " " << op_or_ops << " in " + << timer.milliseconds() << " ms)"; + + return out; + } diff --git a/src/libs/3rdparty/botan/checks/timer.h b/src/libs/3rdparty/botan/checks/timer.h new file mode 100644 index 00000000000..48d6b6805c6 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/timer.h @@ -0,0 +1,50 @@ + +#ifndef BOTAN_BENCHMARK_TIMER_H__ +#define BOTAN_BENCHMARK_TIMER_H__ + +#include +#include +#include + +using Botan::u64bit; +using Botan::u32bit; + +class Timer + { + public: + static u64bit get_clock(); + + Timer(const std::string& name, u32bit event_mult = 1); + + void start(); + + void stop(); + + u64bit value() { stop(); return time_used; } + double seconds() { return milliseconds() / 1000.0; } + double milliseconds() { return value() / 1000000.0; } + + double ms_per_event() { return milliseconds() / events(); } + double seconds_per_event() { return seconds() / events(); } + + u64bit events() const { return event_count * event_mult; } + std::string get_name() const { return name; } + private: + std::string name; + u64bit time_used, timer_start; + u64bit event_count, event_mult; + }; + +inline bool operator<(const Timer& x, const Timer& y) + { + return (x.get_name() < y.get_name()); + } + +inline bool operator==(const Timer& x, const Timer& y) + { + return (x.get_name() == y.get_name()); + } + +std::ostream& operator<<(std::ostream&, Timer&); + +#endif diff --git a/src/libs/3rdparty/botan/checks/validate.cpp b/src/libs/3rdparty/botan/checks/validate.cpp new file mode 100644 index 00000000000..8fb225137dd --- /dev/null +++ b/src/libs/3rdparty/botan/checks/validate.cpp @@ -0,0 +1,310 @@ +/* + Validation routines +*/ + +#include +#include +#include +#include +#include + +#include +#include +using namespace Botan; + +#include "validate.h" +#include "common.h" + +#define EXTRA_TESTS 0 +#define DEBUG 0 + +namespace { + +u32bit random_word(Botan::RandomNumberGenerator& rng, + u32bit max) + { +#if DEBUG + /* deterministic version for tracking down buffering bugs */ + static bool first = true; + if(first) { srand(5); first = false; } + + u32bit r = 0; + for(u32bit j = 0; j != 4; j++) + r = (r << 8) | std::rand(); + return ((r % max) + 1); // return between 1 and max inclusive +#else + /* normal version */ + u32bit r = 0; + for(u32bit j = 0; j != 4; j++) + r = (r << 8) | rng.next_byte(); + return ((r % max) + 1); // return between 1 and max inclusive +#endif + } + +} + +Botan::Filter* lookup(const std::string&, const std::vector&, + const std::string& = "All"); + +bool failed_test(const std::string&, std::vector, bool, bool, + const std::string&, std::string&, + Botan::RandomNumberGenerator& rng); + +std::vector parse(const std::string&); +void strip(std::string&); +Botan::SecureVector decode_hex(const std::string&); + +u32bit do_validation_tests(const std::string& filename, + RandomNumberGenerator& rng, + bool should_pass) + { + std::ifstream test_data(filename.c_str()); + bool first_mark = true; + + if(!test_data) + throw Botan::Stream_IO_Error("Couldn't open test file " + filename); + + u32bit errors = 0, alg_count = 0; + std::string algorithm; + std::string section; + std::string last_missing; + bool is_extension = false; + u32bit counter = 0; + + while(!test_data.eof()) + { + if(test_data.bad() || test_data.fail()) + throw Botan::Stream_IO_Error("File I/O error reading from " + + filename); + + std::string line; + std::getline(test_data, line); + + const std::string MARK = "# MARKER: "; + + if(line.find(MARK) != std::string::npos) + { + if(first_mark) + first_mark = false; + else if(should_pass) + std::cout << std::endl; + counter = 0; + section = line; + section.replace(section.find(MARK), MARK.size(), ""); + if(should_pass) + std::cout << "Testing " << section << ": "; + } + + strip(line); + if(line.size() == 0) continue; + + // Do line continuation + while(line[line.size()-1] == '\\' && !test_data.eof()) + { + line.replace(line.size()-1, 1, ""); + std::string nextline; + std::getline(test_data, nextline); + strip(nextline); + if(nextline.size() == 0) continue; + line += nextline; + } + + if(line[0] == '[' && line[line.size() - 1] == ']') + { + const std::string ext_mark = ""; + algorithm = line.substr(1, line.size() - 2); + is_extension = false; + if(algorithm.find(ext_mark) != std::string::npos) + { + is_extension = true; + algorithm.replace(algorithm.find(ext_mark), + ext_mark.length(), ""); + } + +#if DEBUG + if(should_pass) + std::cout << "Testing " << algorithm << "..." << std::endl; + else + std::cout << "Testing (expecing failure) " + << algorithm << "..." << std::endl; +#endif + alg_count = 0; + continue; + } + + std::vector substr = parse(line); + + alg_count++; + + if(should_pass && + (counter % 100 == 0 || (counter < 100 && counter % 10 == 0))) + { + std::cout << '.'; + std::cout.flush(); + } + counter++; + + bool failed = true; // until proven otherwise + + try + { + failed = failed_test(algorithm, substr, + is_extension, should_pass, + section, last_missing, rng); + } + catch(std::exception& e) + { + std::cout << "Exception: " << e.what() << "\n"; + } + + if(failed && should_pass) + { + std::cout << "ERROR: \"" << algorithm << "\" failed test #" + << alg_count << std::endl; + errors++; + } + + if(!failed && !should_pass) + { + std::cout << "ERROR: \"" << algorithm << "\" passed test #" + << alg_count << " (unexpected pass)" << std::endl; + errors++; + } + + } + if(should_pass) + std::cout << std::endl; + return errors; + } + +bool failed_test(const std::string& algo, + std::vector params, + bool is_extension, bool exp_pass, + const std::string& section, + std::string& last_missing, + Botan::RandomNumberGenerator& rng) + { +#if DEBUG + std::cout << "Testing: " << algo; + if(!exp_pass) + std::cout << " (expecting failure)"; + std::cout << std::endl; +#endif + +#if !EXTRA_TESTS + if(!exp_pass) return true; +#endif + + const std::string in = params[0]; + const std::string expected = params[1]; + + params.erase(params.begin()); + params.erase(params.begin()); + + if(in.size() % 2 == 1) + { + std::cout << "Can't have an odd sized hex string!" << std::endl; + return true; + } + + Botan::Pipe pipe; + + try { + Botan::Filter* test = lookup(algo, params, section); + if(test == 0 && is_extension) return !exp_pass; + if(test == 0) + { + if(algo != last_missing) + { + std::cout << "WARNING: \"" + algo + "\" is not a known " + << "algorithm name." << std::endl; + last_missing = algo; + } + return 0; + } + + pipe.reset(); + pipe.append(test); + pipe.append(new Botan::Hex_Encoder); + + Botan::SecureVector data = decode_hex(in); + const byte* data_ptr = data; + + // this can help catch errors with buffering, etc + u32bit len = data.size(); + pipe.start_msg(); + while(len) + { + u32bit how_much = random_word(rng, len); + pipe.write(data_ptr, how_much); + data_ptr += how_much; + len -= how_much; + } + pipe.end_msg(); + } + catch(Botan::Algorithm_Not_Found& e) + { + std::cout << "Algorithm not found: " << e.what() << std::endl; + return false; + } + catch(Botan::Exception& e) + { + if(exp_pass || DEBUG) + std::cout << "Exception caught: " << e.what() << std::endl; + return true; + } + catch(std::exception& e) + { + if(exp_pass || DEBUG) + std::cout << "Standard library exception caught: " + << e.what() << std::endl; + return true; + } + catch(...) + { + if(exp_pass || DEBUG) + std::cout << "Unknown exception caught." << std::endl; + return true; + } + + std::string output; + + if(pipe.remaining()) + { + /* Test peeking at an offset in Pipe/SecureQueue */ + u32bit offset = random_word(rng, pipe.remaining() - 1); + u32bit length = random_word(rng, pipe.remaining() - offset); + + Botan::SecureVector peekbuf(length); + pipe.peek(peekbuf, length, offset); + + output = pipe.read_all_as_string(); + + bool OK = true; + + for(u32bit j = offset; j != offset+length; j++) + if(static_cast(output[j]) != peekbuf[j-offset]) + OK = false; + + if(!OK) + throw Botan::Self_Test_Failure("Peek testing failed in validate.cpp"); + } + + if(output == expected && !exp_pass) + { + std::cout << "FAILED: " << expected << " == " << std::endl + << " " << output << std::endl; + return false; + } + + if(output != expected && exp_pass) + { + std::cout << "\nFAILED: " << expected << " != " << std::endl + << " " << output << std::endl; + return true; + } + + if(output != expected && !exp_pass) return true; + + return false; + } diff --git a/src/libs/3rdparty/botan/checks/validate.dat b/src/libs/3rdparty/botan/checks/validate.dat new file mode 100644 index 00000000000..675e1afb0e7 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/validate.dat @@ -0,0 +1,45951 @@ +# Main Botan validation file + +# This has test vectors for block ciphers in ECB mode, stream ciphers, hash +# functions, MACs, KDFs, S2K algorithms, encoders/decoders, and block cipher +# modes (CBC, CTS, CFB, OFB, CTR, and EAX) + +# MARKER: Block Ciphers + +# Block cipher format is plaintext:ciphertext:key + +[AES] +# From the AES documentation for Rijndael +506812A45F08C889B97F5980038B8359:D8F532538289EF7D06B506A4FD5BE9C9:\ +00010203050607080A0B0C0D0F101112 + +5C6D71CA30DE8B8B00549984D2EC7D4B:59AB30F4D4EE6E4FF9907EF65B1FB68C:\ +14151617191A1B1C1E1F202123242526 + +53F3F4C64F8616E4E7C56199F48F21F6:BF1ED2FCB2AF3FD41443B56D85025CB1:\ +28292A2B2D2E2F30323334353738393A + +A1EB65A3487165FB0F1C27FF9959F703:7316632D5C32233EDCB0780560EAE8B2:\ +3C3D3E3F41424344464748494B4C4D4E + +3553ECF0B1739558B08E350A98A39BFA:408C073E3E2538072B72625E68B8364B:\ +50515253555657585A5B5C5D5F606162 + +67429969490B9711AE2B01DC497AFDE8:E1F94DFA776597BEACA262F2F6366FEA:\ +64656667696A6B6C6E6F707173747576 + +93385C1F2AEC8BED192F5A8E161DD508:F29E986C6A1C27D7B29FFD7EE92B75F1:\ +78797A7B7D7E7F80828384858788898A + +B5BF946BE19BEB8DB3983B5F4C6E8DDB:131C886A57F8C2E713ABA6955E2B55B5:\ +8C8D8E8F91929394969798999B9C9D9E + +41321EE10E21BD907227C4450FF42324:D2AB7662DF9B8C740210E5EEB61C199D:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 + +00A82F59C91C8486D12C0A80124F6089:14C10554B2859C484CAB5869BBE7C470:\ +B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 + +7CE0FD076754691B4BBD9FAF8A1372FE:DB4D498F0A49CF55445D502C1F9AB3B5:\ +C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA + +23605A8243D07764541BC5AD355B3129:6D96FEF7D66590A77A77BB2056667F7F:\ +DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +12A8CFA23EA764FD876232B4E842BC44:316FB68EDBA736C53E78477BF913725C:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE010002 + +BCAF32415E8308B3723E5FDD853CCC80:6936F2B93AF8397FD3A771FC011C8C37:\ +04050607090A0B0C0E0F101113141516 + +89AFAE685D801AD747ACE91FC49ADDE0:F3F92F7A9C59179C1FCC2C2BA0B082CD:\ +2C2D2E2F31323334363738393B3C3D3E + +F521D07B484357C4A69E76124A634216:6A95EA659EE3889158E7A9152FF04EBC:\ +40414243454647484A4B4C4D4F505152 + +3E23B3BC065BCC152407E23896D77783:1959338344E945670678A5D432C90B93:\ +54555657595A5B5C5E5F606163646566 + +79F0FBA002BE1744670E7E99290D8F52:E49BDDD2369B83EE66E6C75A1161B394:\ +68696A6B6D6E6F70727374757778797A + +DA23FE9D5BD63E1D72E3DAFBE21A6C2A:D3388F19057FF704B70784164A74867D:\ +7C7D7E7F81828384868788898B8C8D8E + +E3F5698BA90B6A022EFD7DB2C7E6C823:23AA03E2D5E4CD24F3217E596480D1E1:\ +A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 + +BDC2691D4F1B73D2700679C3BCBF9C6E:C84113D68B666AB2A50A8BDB222E91B9:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 + +BA74E02093217EE1BA1B42BD5624349A:AC02403981CD4340B507963DB65CB7B6:\ +08090A0B0D0E0F10121314151718191A + +B5C593B5851C57FBF8B3F57715E8F680:8D1299236223359474011F6BF5088414:\ +6C6D6E6F71727374767778797B7C7D7E + +3DA9BD9CEC072381788F9387C3BBF4EE:5A1D6AB8605505F7977E55B9A54D9B90:\ +80818283858687888A8B8C8D8F909192 + +4197F3051121702AB65D316B3C637374:72E9C2D519CF555E4208805AABE3B258:\ +94959697999A9B9C9E9FA0A1A3A4A5A6 + +9F46C62EC4F6EE3F6E8C62554BC48AB7:A8F3E81C4A23A39EF4D745DFFE026E80:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA + +0220673FE9E699A4EBC8E0DBEB6979C8:546F646449D31458F9EB4EF5483AEE6C:\ +BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE + +B2B99171337DED9BC8C2C23FF6F18867:4DBE4BC84AC797C0EE4EFB7F1A07401C:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 + +A7FACF4E301E984E5EFEEFD645B23505:25E10BFB411BBD4D625AC8795C8CA3B3:\ +E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 + +F7C762E4A9819160FD7ACFB6C4EEDCDD:315637405054EC803614E43DEF177579:\ +F8F9FAFBFDFEFE00020304050708090A + +9B64FC21EA08709F4915436FAA70F1BE:60C5BC8A1410247295C6386C59E572A8:\ +0C0D0E0F11121314161718191B1C1D1E + +52AF2C3DE07EE6777F55A4ABFC100B3F:01366FC8CA52DFE055D6A00A76471BA6:\ +20212223252627282A2B2C2D2F303132 + +2FCA001224386C57AA3F968CBE2C816F:ECC46595516EC612449C3F581E7D42FF:\ +34353637393A3B3C3E3F404143444546 + +4149C73658A4A9C564342755EE2C132F:6B7FFE4C602A154B06EE9C7DAB5331C9:\ +48494A4B4D4E4F50525354555758595A + +AF60005A00A1772F7C07A48A923C23D2:7DA234C14039A240DD02DD0FBF84EB67:\ +5C5D5E5F61626364666768696B6C6D6E + +6FCCBC28363759914B6F0280AFAF20C6:C7DC217D9E3604FFE7E91F080ECD5A3A:\ +70717273757677787A7B7C7D7F808182 + +7D82A43DDF4FEFA2FC5947499884D386:37785901863F5C81260EA41E7580CDA5:\ +84858687898A8B8C8E8F909193949596 + +5D5A990EAAB9093AFE4CE254DFA49EF9:A07B9338E92ED105E6AD720FCCCE9FE4:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AA + +4CD1E2FD3F4434B553AAE453F0ED1A02:AE0FB9722418CC21A7DA816BBC61322C:\ +ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE + +5A2C9A9641D4299125FA1B9363104B5E:C826A193080FF91FFB21F71D3373C877:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 + +B517FE34C0FA217D341740BFD4FE8DD4:1181B11B0E494E8D8B0AA6B1D5AC2C48:\ +D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 + +014BAF2278A69D331D5180103643E99A:6743C3D1519AB4F2CD9A78AB09A511BD:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FA + +B529BD8164F20D0AA443D4932116841C:DC55C076D52BACDF2EEFD952946A439D:\ +FCFDFEFF01020304060708090B0C0D0E + +2E596DCBB2F33D4216A1176D5BD1E456:711B17B590FFC72B5C8E342B601E8003:\ +10111213151617181A1B1C1D1F202122 + +7274A1EA2B7EE2424E9A0E4673689143:19983BB0950783A537E1339F4AA21C75:\ +24252627292A2B2C2E2F303133343536 + +AE20020BD4F13E9D90140BEE3B5D26AF:3BA7762E15554169C0F4FA39164C410C:\ +38393A3B3D3E3F40424344454748494A + +BAAC065DA7AC26E855E79C8849D75A02:A0564C41245AFCA7AF8AA2E0E588EA89:\ +4C4D4E4F51525354565758595B5C5D5E + +7C917D8D1D45FAB9E2540E28832540CC:5E36A42A2E099F54AE85ECD92E2381ED:\ +60616263656667686A6B6C6D6F707172 + +BDE6F89E16DAADB0E847A2A614566A91:770036F878CD0F6CA2268172F106F2FE:\ +74757677797A7B7C7E7F808183848586 + +C9DE163725F1F5BE44EBB1DB51D07FBC:7E4E03908B716116443CCF7C94E7C259:\ +88898A8B8D8E8F90929394959798999A + +3AF57A58F0C07DFFA669572B521E2B92:482735A48C30613A242DD494C7F9185D:\ +9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE + +3D5EBAC306DDE4604F1B4FBBBFCDAE55:B4C0F6C9D4D7079ADDF9369FC081061D:\ +B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 + +C2DFA91BCEB76A1183C995020AC0B556:D5810FE0509AC53EDCD74F89962E6270:\ +C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 + +C70F54305885E9A0746D01EC56C8596B:03F17A16B3F91848269ECDD38EBB2165:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EA + +C4F81B610E98012CE000182050C0C2B2:DA1248C3180348BAD4A93B4D9856C9DF:\ +ECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE + +EAAB86B1D02A95D7404EFF67489F97D4:3D10D7B63F3452C06CDF6CCE18BE0C2C:\ +00010203050607080A0B0C0D0F101112 + +7C55BDB40B88870B52BEC3738DE82886:4AB823E7477DFDDC0E6789018FCB6258:\ +14151617191A1B1C1E1F202123242526 + +BA6EAA88371FF0A3BD875E3F2A975CE0:E6478BA56A77E70CFDAA5C843ABDE30E:\ +28292A2B2D2E2F30323334353738393A + +08059130C4C24BD30CF0575E4E0373DC:1673064895FBEAF7F09C5429FF75772D:\ +3C3D3E3F41424344464748494B4C4D4E + +9A8EAB004EF53093DFCF96F57E7EDA82:4488033AE9F2EFD0CA9383BFCA1A94E9:\ +50515253555657585A5B5C5D5F606162 + +0745B589E2400C25F117B1D796C28129:978F3B8C8F9D6F46626CAC3C0BCB9217:\ +64656667696A6B6C6E6F707173747576 + +2F1777781216CEC3F044F134B1B92BBE:E08C8A7E582E15E5527F1D9E2EECB236:\ +78797A7B7D7E7F80828384858788898A + +353A779FFC541B3A3805D90CE17580FC:CEC155B76AC5FFDA4CF4F9CA91E49A7A:\ +8C8D8E8F91929394969798999B9C9D9E + +1A1EAE4415CEFCF08C4AC1C8F68BEA8F:D5AC7165763225DD2A38CDC6862C29AD:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 + +E6E7E4E5B0B3B2B5D4D5AAAB16111013:03680FE19F7CE7275452020BE70E8204:\ +B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 + +F8F9FAFBFBF8F9E677767170EFE0E1E2:461DF740C9781C388E94BB861CEB54F6:\ +C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA + +63626160A1A2A3A445444B4A75727370:451BD60367F96483042742219786A074:\ +DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +717073720605040B2D2C2B2A05FAFBF9:E4DFA42671A02E57EF173B85C0EA9F2B:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE010002 + +78797A7BEAE9E8EF3736292891969794:ED11B89E76274282227D854700A78B9E:\ +04050607090A0B0C0E0F101113141516 + +838281803231300FDDDCDBDAA0AFAEAD:433946EAA51EA47AF33895F2B90B3B75:\ +18191A1B1D1E1F20222324252728292A + +18191A1BBFBCBDBA75747B7A7F78797A:6BC6D616A5D7D0284A5910AB35022528:\ +2C2D2E2F31323334363738393B3C3D3E + +848586879B989996A3A2A5A4849B9A99:D2A920ECFE919D354B5F49EAE9719C98:\ +40414243454647484A4B4C4D4F505152 + +0001020322212027CACBF4F551565754:3A061B17F6A92885EFBD0676985B373D:\ +54555657595A5B5C5E5F606163646566 + +CECFCCCDAFACADB2515057564A454447:FADEEC16E33EA2F4688499D157E20D8F:\ +68696A6B6D6E6F70727374757778797A + +92939091CDCECFC813121D1C80878685:5CDEFEDE59601AA3C3CDA36FA6B1FA13:\ +7C7D7E7F81828384868788898B8C8D8E + +D2D3D0D16F6C6D6259585F5ED1EEEFEC:9574B00039844D92EBBA7EE8719265F8:\ +90919293959697989A9B9C9D9FA0A1A2 + +ACADAEAF878485820F0E1110D5D2D3D0:9A9CF33758671787E5006928188643FA:\ +A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 + +9091929364676619E6E7E0E1757A7B78:2CDDD634C846BA66BB46CBFEA4A674F9:\ +B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CA + +BABBB8B98A89888F74757A7B92959497:D28BAE029393C3E7E26E9FAFBBB4B98F:\ +CCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE + +8D8C8F8E6E6D6C633B3A3D3CCAD5D4D7:EC27529B1BEE0A9AB6A0D73EBC82E9B7:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 + +86878485010203040808F7F767606162:3CB25C09472AFF6EE7E2B47CCD7CCB17:\ +F4F5F6F7F9FAFBFCFEFE010103040506 + +8E8F8C8D656667788A8B8C8D010E0F0C:DEE33103A7283370D725E44CA38F8FE5:\ +08090A0B0D0E0F10121314151718191A + +C8C9CACB858687807A7B7475E7E0E1E2:27F9BCD1AAC64BFFC11E7815702C1A69:\ +1C1D1E1F21222324262728292B2C2D2E + +6D6C6F6E5053525D8C8D8A8BADD2D3D0:5DF534FFAD4ED0749A9988E9849D0021:\ +30313233353637383A3B3C3D3F404142 + +28292A2B393A3B3C0607181903040506:A48BEE75DB04FB60CA2B80F752A8421B:\ +44454647494A4B4C4E4F505153545556 + +A5A4A7A6B0B3B28DDBDADDDCBDB2B3B0:024C8CF70BC86EE5CE03678CB7AF45F9:\ +58595A5B5D5E5F60626364656768696A + +323330316467666130313E3F2C2B2A29:3C19AC0F8A3A3862CE577831301E166B:\ +6C6D6E6F71727374767778797B7C7D7E + +27262524080B0A05171611100B141516:C5E355B796A57421D59CA6BE82E73BCA:\ +80818283858687888A8B8C8D8F909192 + +040506074142434435340B0AA3A4A5A6:D94033276417ABFB05A69D15B6E386E2:\ +94959697999A9B9C9E9FA0A1A3A4A5A6 + +242526271112130C61606766BDB2B3B0:24B36559EA3A9B9B958FE6DA3E5B8D85:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA + +4B4A4948252627209E9F9091CEC9C8CB:20FD4FEAA0E8BF0CCE7861D74EF4CB72:\ +BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE + +68696A6B6665646B9F9E9998D9E6E7E4:350E20D5174277B9EC314C501570A11D:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 + +34353637C5C6C7C0F0F1EEEF7C7B7A79:87A29D61B7C604D238FE73045A7EFD57:\ +E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 + +32333031C2C1C13F0D0C0B0A050A0B08:2C3164C1CC7D0064816BDC0FAA362C52:\ +F8F9FAFBFDFEFE00020304050708090A + +CDCCCFCEBEBDBCBBABAAA5A4181F1E1D:195FE5E8A05A2ED594F6E4400EEE10B3:\ +0C0D0E0F11121314161718191B1C1D1E + +212023223635343BA0A1A6A7445B5A59:E4663DF19B9A21A5A284C2BD7F905025:\ +20212223252627282A2B2C2D2F303132 + +0E0F0C0DA8ABAAAD2F2E515002050407:21B88714CFB4E2A933BD281A2C4743FD:\ +34353637393A3B3C3E3F404143444546 + +070605042A2928378E8F8889BDB2B3B0:CBFC3980D704FD0FC54378AB84E17870:\ +48494A4B4D4E4F50525354555758595A + +CBCAC9C893909196A9A8A7A6A5A2A3A0:BC5144BAA48BDEB8B63E22E03DA418EF:\ +5C5D5E5F61626364666768696B6C6D6E + +80818283C1C2C3CC9C9D9A9B0CF3F2F1:5A1DBAEF1EE2984B8395DA3BDFFA3CCC:\ +70717273757677787A7B7C7D7F808182 + +1213101125262720FAFBE4E5B1B6B7B4:F0B11CD0729DFCC80CEC903D97159574:\ +84858687898A8B8C8E8F909193949596 + +7F7E7D7C3033320D97969190222D2C2F:9F95314ACFDDC6D1914B7F19A9CC8209:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AA + +4E4F4C4D484B4A4D81808F8E53545556:595736F6F0F70914A94E9E007F022519:\ +ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE + +DCDDDEDFB0B3B2BD15141312A1BEBFBC:1F19F57892CAE586FCDFB4C694DEB183:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 + +93929190282B2A2DC4C5FAFB92959497:540700EE1F6F3DAB0B3EDDF6CAEE1EF5:\ +D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 + +F5F4F7F6C4C7C6D9373631307E717073:14A342A91019A331687A2254E6626CA2:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FA + +93929190B6B5B4B364656A6B05020300:7B25F3C3B2EEA18D743EF283140F29FF:\ +FCFDFEFF01020304060708090B0C0D0E + +BABBB8B90D0E0F00A4A5A2A3043B3A39:46C2587D66E5E6FA7F7CA6411AD28047:\ +10111213151617181A1B1C1D1F202122 + +D8D9DADB7F7C7D7A10110E0F787F7E7D:09470E72229D954ED5EE73886DFEEBA9:\ +24252627292A2B2C2E2F303133343536 + +FEFFFCFDEFECED923B3A3D3C6768696A:D77C03DE92D4D0D79EF8D4824EF365EB:\ +38393A3B3D3E3F40424344454748494A + +D6D7D4D58A89888F96979899A5A2A3A0:1D190219F290E0F1715D152D41A23593:\ +4C4D4E4F51525354565758595B5C5D5E + +18191A1BA8ABAAA5303136379B848586:A2CD332CE3A0818769616292E87F757B:\ +60616263656667686A6B6C6D6F707172 + +6B6A6968A4A7A6A1D6D72829B0B7B6B5:D54AFA6CE60FBF9341A3690E21385102:\ +74757677797A7B7C7E7F808183848586 + +000102038A89889755545352A6A9A8AB:06E5C364DED628A3F5E05E613E356F46:\ +88898A8B8D8E8F90929394959798999A + +2D2C2F2EB3B0B1B6B6B7B8B9F2F5F4F7:EAE63C0E62556DAC85D221099896355A:\ +9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE + +979695943536373856575051E09F9E9D:1FED060E2C6FC93EE764403A889985A2:\ +B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 + +A4A5A6A7989B9A9DB1B0AFAE7A7D7C7F:C25235C1A30FDEC1C7CB5C5737B2A588:\ +C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 + +C1C0C3C2686B6A55A8A9AEAFEAE5E4E7:796DBEF95147D4D30873AD8B7B92EFC0:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EA + +C1C0C3C2141716118C8D828364636261:CBCF0FB34D98D0BD5C22CE37211A46BF:\ +ECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE + +93929190CCCFCEC196979091E0FFFEFD:94B44DA6466126CAFA7C7FD09063FC24:\ +00010203050607080A0B0C0D0F101112 + +B4B5B6B7F9FAFBFC25241B1A6E69686B:D78C5B5EBF9B4DBDA6AE506C5074C8FE:\ +14151617191A1B1C1E1F202123242526 + +868784850704051AC7C6C1C08788898A:6C27444C27204B043812CF8CF95F9769:\ +28292A2B2D2E2F30323334353738393A + +F4F5F6F7AAA9A8AFFDFCF3F277707172:BE94524EE5A2AA50BBA8B75F4C0AEBCF:\ +3C3D3E3F41424344464748494B4C4D4E + +D3D2D1D00605040BC3C2C5C43E010003:A0AEAAE91BA9F31F51AEB3588CF3A39E:\ +50515253555657585A5B5C5D5F606162 + +73727170424140476A6B74750D0A0B08:275297779C28266EF9FE4C6A13C08488:\ +64656667696A6B6C6E6F707173747576 + +C2C3C0C10A0908F754555253A1AEAFAC:86523D92BB8672CB01CF4A77FD725882:\ +78797A7B7D7E7F80828384858788898A + +6D6C6F6EF8FBFAFD82838C8DF8FFFEFD:4B8327640E9F33322A04DD96FCBF9A36:\ +8C8D8E8F91929394969798999B9C9D9E + +F5F4F7F684878689A6A7A0A1D2CDCCCF:CE52AF650D088CA559425223F4D32694:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 + +2D33EEF2C0430A8A9EBF45E809C40BB6:DFF4945E0336DF4C1C56BC700EFF837F:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C + +6AA375D1FA155A61FB72353E0A5A8756:B6FDDEF4752765E347D5D2DC196D1252:\ +1E1F20212324252628292A2B2D2E2F30323334353738393A + +BC3736518B9490DCB8ED60EB26758ED4:D23684E3D963B3AFCF1A114ACA90CBD6:\ +3C3D3E3F41424344464748494B4C4D4E5051525355565758 + +AA214402B46CFFB9F761EC11263A311E:3A7AC027753E2A18C2CEAB9E17C11FD0:\ +5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +02AEA86E572EEAB66B2C3AF5E9A46FD6:8F6786BD007528BA26603C1601CDD0D8:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 + +E2AEF6ACC33B965C4FA1F91C75FF6F36:D17D073B01E71502E28B47AB551168B3:\ +969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 + +0659DF46427162B9434865DD9499F91D:A469DA517119FAB95876F41D06D40FFA:\ +B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 + +49A44239C748FEB456F59C276A5658DF:6091AA3B695C11F5C0B6AD26D3D862FF:\ +D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +66208F6E9D04525BDEDB2733B6A6BE37:70F9E67F9F8DF1294131662DC6E69364:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C + +3393F8DFC729C97F5480B950BC9666B0:D154DCAFAD8B207FA5CBC95E9996B559:\ +0E0F10111314151618191A1B1D1E1F20222324252728292A + +606834C8CE063F3234CF1145325DBD71:4934D541E8B46FA339C805A7AEB9E5DA:\ +2C2D2E2F31323334363738393B3C3D3E4041424345464748 + +FEC1C04F529BBD17D8CECFCC4718B17F:62564C738F3EFE186E1A127A0C4D3C61:\ +4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 + +32DF99B431ED5DC5ACF8CAF6DC6CE475:07805AA043986EB23693E23BEF8F3438:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 + +7FDC2B746F3F665296943B83710D1F82:DF0B4931038BADE848DEE3B4B85AA44B:\ +868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 + +8FBA1510A3C5B87E2EAA3F7A91455CA2:592D5FDED76582E4143C65099309477C:\ +A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0 + +2C9B468B1C2EED92578D41B0716B223B:C9B8D6545580D3DFBCDD09B954ED4E92:\ +C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE + +0A2BBF0EFC6BC0034F8A03433FCA1B1A:5DCCD5D6EB7C1B42ACB008201DF707A0:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFC + +25260E1F31F4104D387222E70632504B:A2A91682FFEB6ED1D34340946829E6F9:\ +FEFE01010304050608090A0B0D0E0F10121314151718191A + +C527D25A49F08A5228D338642AE65137:E45D185B797000348D9267960A68435D:\ +1C1D1E1F21222324262728292B2C2D2E3031323335363738 + +3B49FC081432F5890D0E3D87E884A69E:45E060DAE5901CDA8089E10D4F4C246B:\ +3A3B3C3D3F40414244454647494A4B4C4E4F505153545556 + +D173F9ED1E57597E166931DF2754A083:F6951AFACC0079A369C71FDCFF45DF50:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374 + +8C2B7CAFA5AFE7F13562DAEAE1ADEDE0:9E95E00F351D5B3AC3D0E22E626DDAD6:\ +767778797B7C7D7E80818283858687888A8B8C8D8F909192 + +AAF4EC8C1A815AEB826CAB741339532C:9CB566FF26D92DAD083B51FDC18C173C:\ +94959697999A9B9C9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0 + +40BE8C5D9108E663F38F1A2395279ECF:C9C82766176A9B228EB9A974A010B4FB:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBEC + +0C8AD9BC32D43E04716753AA4CFBE351:D8E26AA02945881D5137F1C1E1386E88:\ +2A2B2C2D2F30313234353637393A3B3C3E3F404143444546 + +1407B1D5F87D63357C8DC7EBBAEBBFEE:C0E024CCD68FF5FFA4D139C355A77C55:\ +48494A4B4D4E4F50525354555758595A5C5D5E5F61626364 + +E62734D1AE3378C4549E939E6F123416:0B18B3D16F491619DA338640DF391D43:\ +84858687898A8B8C8E8F90919394959698999A9B9D9E9FA0 + +5A752CFF2A176DB1A1DE77F2D2CDEE41:DBE09AC8F66027BF20CB6E434F252EFC:\ +A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE + +A9C8C3A4EABEDC80C64730DDD018CD88:6D04E5E43C5B9CBE05FEB9606B6480FE:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDC + +EE9B3DBBDB86180072130834D305999A:DD1D6553B96BE526D9FEE0FBD7176866:\ +1A1B1C1D1F20212224252627292A2B2C2E2F303133343536 + +A7FA8C3586B8EBDE7568EAD6F634A879:0260CA7E3F979FD015B0DD4690E16D2A:\ +38393A3B3D3E3F40424344454748494A4C4D4E4F51525354 + +37E0F4A87F127D45AC936FE7AD88C10A:9893734DE10EDCC8A67C3B110B8B8CC6:\ +929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE + +3F77D8B5D92BAC148E4E46F697A535C5:93B30B750516B2D18808D710C2EE84EF:\ +464748494B4C4D4E50515253555657585A5B5C5D5F606162 + +D25EBB686C40F7E2C4DA1014936571CA:16F65FA47BE3CB5E6DFE7C6C37016C0E:\ +828384858788898A8C8D8E8F91929394969798999B9C9D9E + +4F1C769D1E5B0552C7ECA84DEA26A549:F3847210D5391E2360608E5ACB560581:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBC + +8548E2F882D7584D0FAFC54372B6633A:8754462CD223366D0753913E6AF2643D:\ +BEBFC0C1C3C4C5C6C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA + +87D7A336CB476F177CD2A51AF2A62CDF:1EA20617468D1B806A1FD58145462017:\ +DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8 + +03B1FEAC668C4E485C1065DFC22B44EE:3B155D927355D737C6BE9DDA60136E2E:\ +FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 + +BDA15E66819FA72D653A6866AA287962:26144F7B66DAA91B6333DBD3850502B3:\ +18191A1B1D1E1F20222324252728292A2C2D2E2F31323334 + +4D0C7A0D2505B80BF8B62CEB12467F0A:E4F9A4AB52CED8134C649BF319EBCC90:\ +363738393B3C3D3E40414243454647484A4B4C4D4F505152 + +626D34C9429B37211330986466B94E5F:B9DDD29AC6128A6CAB121E34A4C62B36:\ +54555657595A5B5C5E5F60616364656668696A6B6D6E6F70 + +333C3E6BF00656B088A17E5FF0E7F60A:6FCDDAD898F2CE4EFF51294F5EAAF5C9:\ +727374757778797A7C7D7E7F81828384868788898B8C8D8E + +687ED0CDC0D2A2BC8C466D05EF9D2891:C9A6FE2BF4028080BEA6F7FC417BD7E3:\ +90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABAC + +487830E78CC56C1693E64B2A6660C7B6:6A2026846D8609D60F298A9C0673127F:\ +AEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CA + +7A48D6B7B52B29392AA2072A32B66160:2CB25C005E26EFEA44336C4C97A4240B:\ +CCCDCECFD1D2D3D4D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8 + +907320E64C8C5314D10F8D7A11C8618D:496967AB8680DDD73D09A0E4C7DCC8AA:\ +EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 + +B561F2CA2D6E65A4A98341F3ED9FF533:D5AF94DE93487D1F3A8C577CB84A66A4:\ +08090A0B0D0E0F10121314151718191A1C1D1E1F21222324 + +DF769380D212792D026F049E2E3E48EF:84BDAC569CAE2828705F267CC8376E90:\ +262728292B2C2D2E30313233353637383A3B3C3D3F404142 + +79F374BC445BDABF8FCCB8843D6054C6:F7401DDA5AD5AB712B7EB5D10C6F99B6:\ +44454647494A4B4C4E4F50515354555658595A5B5D5E5F60 + +4E02F1242FA56B05C68DBAE8FE44C9D6:1C9D54318539EBD4C3B5B7E37BF119F0:\ +626364656768696A6C6D6E6F71727374767778797B7C7D7E + +CF73C93CBFF57AC635A6F4AD2A4A1545:ACA572D65FB2764CFFD4A6ECA090EA0D:\ +80818283858687888A8B8C8D8F90919294959697999A9B9C + +9923548E2875750725B886566784C625:36D9C627B8C2A886A10CCB36EAE3DFBB:\ +9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA + +4888336B723A022C9545320F836A4207:010EDBF5981E143A81D646E597A4A568:\ +BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8 + +F84D9A5561B0608B1160DEE000C41BA8:8DB44D538DC20CC2F40F3067FD298E60:\ +DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 + +C23192A0418E30A19B45AE3E3625BF22:930EB53BC71E6AC4B82972BDCD5AAFB3:\ +F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314 + +B84E0690B28B0025381AD82A15E501A7:6C42A81EDCBC9517CCD89C30C95597B4:\ +161718191B1C1D1E20212223252627282A2B2C2D2F303132 + +ACEF5E5C108876C4F06269F865B8F0B0:DA389847AD06DF19D76EE119C71E1DD3:\ +34353637393A3B3C3E3F40414344454648494A4B4D4E4F50 + +0F1B3603E0F5DDEA4548246153A5E064:E018FDAE13D3118F9A5D1A647A3F0462:\ +525354555758595A5C5D5E5F61626364666768696B6C6D6E + +FBB63893450D42B58C6D88CD3C1809E3:2AA65DB36264239D3846180FABDFAD20:\ +70717273757677787A7B7C7D7F80818284858687898A8B8C + +4BEF736DF150259DAE0C91354E8A5F92:1472163E9A4F780F1CEB44B07ECF4FDB:\ +8E8F90919394959698999A9B9D9E9FA0A2A3A4A5A7A8A9AA + +7D2D46242056EF13D3C3FC93C128F4C7:C8273FDC8F3A9F72E91097614B62397C:\ +ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8 + +E9C1BA2DF415657A256EDB33934680FD:66C8427DCD733AAF7B3470CB7D976E3F:\ +CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 + +E23EE277B0AA0A1DFB81F7527C3514F1:146131CB17F1424D4F8DA91E6F80C1D0:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304 + +3E7445B0B63CAAF75E4A911E12106B4C:2610D0AD83659081AE085266A88770DC:\ +060708090B0C0D0E10111213151617181A1B1C1D1F202122 + +767774752023222544455A5BE6E1E0E3:38A2B5A974B0575C5D733917FB0D4570:\ +24252627292A2B2C2E2F30313334353638393A3B3D3E3F40 + +72737475717E7F7CE9E8EBEA696A6B6C:E21D401EBC60DE20D6C486E4F39A588B:\ +424344454748494A4C4D4E4F51525354565758595B5C5D5E + +DFDEDDDC25262728C9C8CFCEF1EEEFEC:E51D5F88C670B079C0CA1F0C2C4405A2:\ +60616263656667686A6B6C6D6F70717274757677797A7B7C + +FFFE0100707776755F5E5D5C7675746B:246A94788A642FB3D1B823C8762380C8:\ +7E7F80818384858688898A8B8D8E8F90929394959798999A + +E0E1E2E3424140479F9E9190292E2F2C:B80C391C5C41A4C3B30C68E0E3D7550F:\ +9C9D9E9FA1A2A3A4A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8 + +2120272690EFEEED3B3A39384E4D4C4B:B77C4754FC64EB9A1154A9AF0BB1F21C:\ +BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 + +ECEDEEEF5350516EA1A0A7A6A3ACADAE:FB554DE520D159A06BF219FC7F34A02F:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4 + +32333C3D25222320E9E8EBEACECDCCC3:A89FBA152D76B4927BEED160DDB76C57:\ +F6F7F8F9FBFCFDFE00010203050607080A0B0C0D0F101112 + +40414243626160678A8BB4B511161714:5676EAB4A98D2E8473B3F3D46424247C:\ +14151617191A1B1C1E1F20212324252628292A2B2D2E2F30 + +94959293F5FAFBF81F1E1D1C7C7F7E79:4E8F068BD7EDE52A639036EC86C33568:\ +323334353738393A3C3D3E3F41424344464748494B4C4D4E + +BEBFBCBD191A1B14CFCEC9C8546B6A69:F0193C4D7AFF1791EE4C07EB4A1824FC:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C + +2C2D3233898E8F8CBBBAB9B8333031CE:AC8686EECA9BA761AFE82D67B928C33F:\ +6E6F70717374757678797A7B7D7E7F80828384858788898A + +84858687BFBCBDBA37363938FDFAFBF8:5FAF8573E33B145B6A369CD3606AB2C9:\ +8C8D8E8F91929394969798999B9C9D9EA0A1A2A3A5A6A7A8 + +828384857669686B909192930B08090E:31587E9944AB1C16B844ECAD0DF2E7DA:\ +AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 + +BEBFBCBD9695948B707176779E919093:D017FECD91148ABA37F6F3068AA67D8A:\ +C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4 + +8B8A85846067666521202322D0D3D2DD:788EF2F021A73CBA2794B616078A8500:\ +E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8FAFBFCFDFE010002 + +76777475F1F2F3F4F8F9E6E777707172:5D1EF20DCED6BCBC12131AC7C54788AA:\ +04050607090A0B0C0E0F10111314151618191A1B1D1E1F20 + +A4A5A2A34F404142B4B5B6B727242522:B3C8CF961FAF9EA05FDDE6D1E4D8F663:\ +222324252728292A2C2D2E2F31323334363738393B3C3D3E + +94959697E1E2E3EC16171011839C9D9E:143075C70605861C7FAC6526199E459F:\ +40414243454647484A4B4C4D4F50515254555657595A5B5C + +03023D3C06010003DEDFDCDDFFFCFDE2:A5AE12EADE9A87268D898BFC8FC0252A:\ +5E5F60616364656668696A6B6D6E6F70727374757778797A + +10111213F1F2F3F4CECFC0C1DBDCDDDE:0924F7CF2E877A4819F5244A360DCEA9:\ +7C7D7E7F81828384868788898B8C8D8E9091929395969798 + +67666160724D4C4F1D1C1F1E73707176:3D9E9635AFCC3E291CC7AB3F27D1C99A:\ +9A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 + +E6E7E4E5A8ABAAD584858283909F9E9D:9D80FEEBF87510E2B8FB98BB54FD788C:\ +B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4 + +71707F7E565150537D7C7F7E6162636C:5F9D1A082A1A37985F174002ECA01309:\ +D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 + +64656667212223245555AAAA03040506:A390EBB1D1403930184A44B4876646E4:\ +F4F5F6F7F9FAFBFCFEFE01010304050608090A0B0D0E0F10 + +9E9F9899ABA4A5A6CFCECDCC2B28292E:700FE918981C3195BB6C4BCB46B74E29:\ +121314151718191A1C1D1E1F21222324262728292B2C2D2E + +C7C6C5C4D1D2D3DC626364653A454447:907984406F7BF2D17FB1EB15B673D747:\ +30313233353637383A3B3C3D3F40414244454647494A4B4C + +F6F7E8E9E0E7E6E51D1C1F1E5B585966:C32A956DCFC875C2AC7C7CC8B8CC26E1:\ +4E4F50515354555658595A5B5D5E5F60626364656768696A + +BCBDBEBF5D5E5F5868696667F4F3F2F1:02646E2EBFA9B820CF8424E9B9B6EB51:\ +6C6D6E6F71727374767778797B7C7D7E8081828385868788 + +40414647B0AFAEAD9B9A99989B98999E:621FDA3A5BBD54C6D3C685816BD4EAD8:\ +8A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 + +69686B6A0201001F0F0E0908B4BBBAB9:D4E216040426DFAF18B152469BC5AC2F:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4 + +C7C6C9C8D8DFDEDD5A5B5859BEBDBCB3:9D0635B9D33B6CDBD71F5D246EA17CC8:\ +C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 + +DEDFDCDD787B7A7DFFFEE1E0B2B5B4B7:10ABAD1BD9BAE5448808765583A2CC1A:\ +E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6F8F9FAFBFDFEFE00 + +4D4C4B4A606F6E6DD0D1D2D3FBF8F9FE:6891889E16544E355FF65A793C39C9A8:\ +020304050708090A0C0D0E0F11121314161718191B1C1D1E + +B7B6B5B4D7D4D5DAE5E4E3E2E1FEFFFC:CC735582E68072C163CD9DDF46B91279:\ +20212223252627282A2B2C2D2F30313234353637393A3B3C + +CECFB0B1F7F0F1F2AEAFACAD3E3D3C23:C5C68B9AEEB7F878DF578EFA562F9574:\ +3E3F40414344454648494A4B4D4E4F50525354555758595A + +CACBC8C9CDCECFC812131C1D494E4F4C:5F4764395A667A47D73452955D0D2CE8:\ +5C5D5E5F61626364666768696B6C6D6E7071727375767778 + +9D9C9B9AD22D2C2FB1B0B3B20C0F0E09:701448331F66106CEFDDF1EB8267C357:\ +7A7B7C7D7F80818284858687898A8B8C8E8F909193949596 + +7A7B787964676659959493924F404142:CB3EE56D2E14B4E1941666F13379D657:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4 + +AAABA4A5CEC9C8CB1F1E1D1CABA8A9A6:9FE16EFD18AB6E1981191851FEDB0764:\ +B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 + +93929190282B2A2DC4C5FAFB92959497:3DC9BA24E1B223589B147ADCEB4C8E48:\ +D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6E8E9EAEBEDEEEFF0 + +EFEEE9E8DED1D0D339383B3A888B8A8D:1C333032682E7D4DE5E5AFC05C3E483C:\ +F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E + +7F7E7D7CA2A1A0AF78797E7F112E2F2C:D593CC99A95AFEF7E92038E05A59D00A:\ +10111213151617181A1B1C1D1F20212224252627292A2B2C + +84859A9B2B2C2D2E868784852625245B:51E7F96F53B4353923452C222134E1EC:\ +2E2F30313334353638393A3B3D3E3F40424344454748494A + +B0B1B2B3070405026869666710171615:4075B357A1A2B473400C3B25F32F81A4:\ +4C4D4E4F51525354565758595B5C5D5E6061626365666768 + +ACADAAABBDA2A3A00D0C0F0E595A5B5C:302E341A3EBCD74F0D55F61714570284:\ +6A6B6C6D6F70717274757677797A7B7C7E7F808183848586 + +121310115655544B5253545569666764:57ABDD8231280DA01C5042B78CF76522:\ +88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4 + +DEDFD0D166616063EAEBE8E94142434C:17F9EA7EEA17AC1ADF0E190FEF799E92:\ +A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 + +DBDAD9D81417161166677879E0E7E6E5:2E1BDD563DD87EE5C338DD6D098D0A7A:\ +C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6D8D9DADBDDDEDFE0 + +6A6B6C6DE0EFEEED2B2A2928C0C3C2C5:EB869996E6F8BFB2BFDD9E0C4504DBB2:\ +E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE + +B1B0B3B21714151A1A1B1C1D5649484B:C2E01549E9DECF317468B3E018C61BA8:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C + +39380706A3A4A5A6C4C5C6C77271706F:8DA875D033C01DD463B244A1770F4A22:\ +1E1F20212324252628292A2B2D2E2F30323334353738393A + +5C5D5E5F1013121539383736E2E5E4E7:8BA0DCF3A186844F026D022F8839D696:\ +3C3D3E3F41424344464748494B4C4D4E5051525355565758 + +43424544EAD5D4D72E2F2C2D64676661:E9691FF9A6CC6970E51670A0FD5B88C1:\ +5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +55545756989B9A65F8F9FEFF18171615:F2BAEC06FAEED30F88EE63BA081A6E5B:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 + +05040B0A525554573C3D3E3F4A494847:9C39D4C459AE5753394D6094ADC21E78:\ +969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 + +14151617595A5B5C8584FBFA8E89888B:6345B532A11904502EA43BA99C6BD2B2:\ +B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 + +7C7D7A7BFDF2F3F029282B2A51525354:5FFAE3061A95172E4070CEDCE1E428C8:\ +D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +38393A3B1E1D1C1341404746C23D3C3E:0A4566BE4CDF9ADCE5DEC865B5AB34CD:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C + +8D8C939240474645818083827C7F7E41:CA17FCCE79B7404F2559B22928F126FB:\ +0E0F10111314151618191A1B1D1E1F20222324252728292A + +3B3A39381A19181F32333C3D45424340:97CA39B849ED73A6470A97C821D82F58:\ +2C2D2E2F31323334363738393B3C3D3E4041424345464748 + +F0F1F6F738272625828380817F7C7D7A:8198CB06BC684C6D3E9B7989428DCF7A:\ +4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 + +89888B8A0407061966676061141B1A19:F53C464C705EE0F28D9A4C59374928BD:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 + +D3D2DDDCAAADACAF9C9D9E9FE8EBEAE5:9ADB3D4CCA559BB98C3E2ED73DBF1154:\ +868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 + +834EADFCCAC7E1B30664B1ABA44815AB:1946DABF6A03A2A2C3D0B05080AED6FC:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 + +D9DC4DBA3021B05D67C0518F72B62BF1:5ED301D747D3CC715445EBDEC62F2FB4:\ +28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E + +A291D86301A4A739F7392173AA3C604C:6585C8F43D13A6BEAB6419FC5935B9D0:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +4264B2696498DE4DF79788A9F83E9390:2A5B56A596680FCC0E05F5E0F151ECAE:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E + +EE9932B3721804D5A83EF5949245B6F6:F5D6FF414FD2C6181494D20C37F2B8C4:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 + +E6248F55C5FDCBCA9CBBB01C88A2EA77:85399C01F59FFFB5204F19F8482F00B8:\ +C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +B8358E41B9DFF65FD461D55A99266247:92097B4C88A041DDF98144BC8D22E8E7:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 + +F0E2D72260AF58E21E015AB3A4C0D906:89BD5B73B356AB412AEF9F76CEA2D65C:\ +18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E + +475B8B823CE8893DB3C44A9F2A379FF7:2536969093C55FF9454692F2FAC2F530:\ +40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 + +688F5281945812862F5F3076CF80412F:07FC76A872843F3F6E0081EE9396D637:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E + +08D1D2BC750AF553365D35E75AFACEAA:E38BA8EC2AA741358DCC93E8F141C491:\ +90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 + +8707121F47CC3EFCECA5F9A8474950A1:D028EE23E4A89075D0B03E868D7D3A42:\ +B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE + +E51AA0B135DBA566939C3B6359A980C5:8CD9423DFC459E547155C5D1D522E540:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 + +069A007FC76A459F98BAF917FEDF9521:080E9517EB1677719ACF728086040AE3:\ +08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E + +726165C1723FBCF6C026D7D00B091027:7C1700211A3991FC0ECDED0AB3E576B0:\ +30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 + +D7C544DE91D55CFCDE1F84CA382200CE:DABCBCC855839251DB51E224FBE87435:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E + +FED3C9A161B9B5B2BD611B41DC9DA357:68D56FAD0406947A4DD27A7448C10F1D:\ +80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 + +4F634CDC6551043409F30B635832CF82:DA9A11479844D1FFEE24BBF3719A9925:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE + +109CE98DB0DFB36734D9F3394711B4E6:5E4BA572F8D23E738DA9B05BA24B8D81:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 + +4EA6DFABA2D8A02FFDFFA89835987242:A115A2065D667E3F0B883837A6E903F8:\ +70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 + +5AE094F54AF58E6E3CDBF976DAC6D9EF:3E9E90DC33EAC2437D86AD30B137E66E:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE + +764D8E8E0F29926DBE5122E66354FDBE:01CE82D8FBCDAE824CB3C48E495C3692:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 + +3F0418F888CDF29A982BF6B75410D6A9:0C9CFF163CE936FAAF083CFD3DEA3117:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E + +E4A3E7CB12CDD56AA4A75197A9530220:5131BA9BD48F2BBA85560680DF504B52:\ +10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 + +211677684AAC1EC1A160F44C4EBF3F26:9DC503BBF09823AEC8A977A5AD26CCB2:\ +38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E + +D21E439FF749AC8F18D6D4B105E03895:9A6DB0C0862E506A9E397225884041D7:\ +60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 + +D9F6FF44646C4725BD4C0103FF5552A7:430BF9570804185E1AB6365FC6A6860C:\ +88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE + +0B1256C2A00B976250CFC5B0C37ED382:3525EBC02F4886E6A5A3762813E8CE8A:\ +B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 + +B056447FFC6DC4523A36CC2E972A3A79:07FA265C763779CCE224C7BAD671027B:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE + +5E25CA78F0DE55802524D38DA3FE4456:E8B72B4E8BE243438C9FFF1F0E205872:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 + +A5BCF4728FA5EAAD8567C0DC24675F83:109D4F999A0E11ACE1F05E6B22CBCB50:\ +28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E + +814E59F97ED84646B78B2CA022E9CA43:45A5E8D4C3ED58403FF08D68A0CC4029:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +15478BEEC58F4775C7A7F5D4395514D7:196865964DB3D417B6BD4D586BCB7634:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E + +253548FFCA461C67C8CBC78CD59F4756:60436AD45AC7D30D99195F815D98D2AE:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 + +FD7AD8D73B9B0F8CC41600640F503D65:BB07A23F0B61014B197620C185E2CD75:\ +C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +06199DE52C6CBF8AF954CD65830BCD56:5BC0B2850129C854423AFF0751FE343B:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 + +F17C4FFE48E44C61BD891E257E725794:7541A78F96738E6417D2A24BD2BECA40:\ +18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E + +9A5B4A402A3E8A59BE6BF5CD8154F029:B0A303054412882E464591F1546C5B9E:\ +40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 + +79BD40B91A7E07DC939D441782AE6B17:778C06D8A355EEEE214FCEA14B4E0EEF:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E + +D8CEAAF8976E5FBE1012D8C84F323799:09614206D15CBACE63227D06DB6BEEBB:\ +90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 + +3316E2751E2E388B083DA23DD6AC3FBE:41B97FB20E427A9FDBBB358D9262255D:\ +B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE + +8B7CFBE37DE7DCA793521819242C5816:C1940F703D845F957652C2D64ABD7ADF:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 + +F23F033C0EEBF8EC55752662FD58CE68:D2D44FCDAE5332343366DB297EFCF21B:\ +08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E + +59EB34F6C8BDBACC5FC6AD73A59A1301:EA8196B79DBE167B6AA9896E287EED2B:\ +30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 + +DCDE8B6BD5CF7CC22D9505E3CE81261A:D6B0B0C4BA6C7DBE5ED467A1E3F06C2D:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E + +E33CF7E524FED781E7042FF9F4B35DC7:EC51EB295250C22C2FB01816FB72BCAE:\ +80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 + +27963C8FACDF73062867D164DF6D064C:ADED6630A07CE9C7408A155D3BD0D36F:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE + +77B1CE386B551B995F2F2A1DA994EEF8:697C9245B9937F32F5D1C82319F0363A:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 + +F083388B013679EFCF0BB9B15D52AE5C:AAD5AD50C6262AAEC30541A1B7B5B19C:\ +F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E + +C5009E0DAB55DB0ABDB636F2600290C8:7D34B893855341EC625BD6875AC18C0D:\ +20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 + +7804881E26CD532D8514D3683F00F1B9:7EF05105440F83862F5D780E88F02B41:\ +48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E + +46CDDCD73D1EB53E675CA012870A92A3:C377C06403382061AF2C9C93A8E70DF6:\ +70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 + +A9FB44062BB07FE130A8E8299EACB1AB:1DBDB3FFDC052DACC83318853ABC6DE5:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE + +2B6FF8D7A5CC3A28A22D5A6F221AF26B:69A6EAB00432517D0BF483C91C0963C7:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 + +1A9527C29B8ADD4B0E3E656DBB2AF8B4:0797F41DC217C80446E1D514BD6AB197:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E + +7F99CF2C75244DF015EB4B0C1050AEAE:9DFD76575902A637C01343C58E011A03:\ +10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 + +E84FF85B0D9454071909C1381646C4ED:ACF4328AE78F34B9FA9B459747CC2658:\ +38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E + +89AFD40F99521280D5399B12404F6DB4:B0479AEA12BAC4FE2384CF98995150C6:\ +60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 + +A09EF32DBC5119A35AB7FA38656F0329:9DD52789EFE3FFB99F33B3DA5030109A:\ +88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE + +61773457F068C376C7829B93E696E716:ABBB755E4621EF8F1214C19F649FB9FD:\ +B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 + +A34F0CAE726CCE41DD498747D891B967:DA27FB8174357BCE2BED0E7354F380F9:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE + +856F59496C7388EE2D2B1A27B7697847:C59A0663F0993838F6E5856593BDC5EF:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 + +CB090C593EF7720BD95908FB93B49DF4:ED60B264B5213E831607A99C0CE5E57E:\ +28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E + +A0AC75CD2F1923D460FC4D457AD95BAF:E50548746846F3EB77B8C520640884ED:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +2A2B282974777689E8E9EEEF525D5C5F:28282CC7D21D6A2923641E52D188EF0C:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E + +909192939390919E0F0E09089788898A:0DFA5B02ABB18E5A815305216D6D4F8E:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 + +777675748D8E8F907170777649464744:7359635C0EECEFE31D673395FB46FB99:\ +C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +717073720605040B2D2C2B2A05FAFBF9:73C679F7D5AEF2745C9737BB4C47FB36:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 + +64656667FEFDFCC31B1A1D1CA5AAABA8:B192BD472A4D2EAFB786E97458967626:\ +18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E + +DBDAD9D86A696867B5B4B3B2C8D7D6D5:0EC327F6C8A2B147598CA3FDE61DC6A4:\ +40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 + +5C5D5E5FE3E0E1FE31303736333C3D3E:FC418EB3C41B859B38D4B6F646629729:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E + +545556574B48494673727574546B6A69:30249E5AC282B1C981EA64B609F3A154:\ +90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 + +ECEDEEEFC6C5C4BB56575051F5FAFBF8:5E6E08646D12150776BB43C2D78A9703:\ +B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE + +464744452724252AC9C8CFCED2CDCCCF:FAEB3D5DE652CD3447DCEB343F30394A:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 + +E6E7E4E54142435C878681801C131211:A8E88706823F6993EF80D05C1C7B2CF0:\ +08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E + +72737071CFCCCDC2F9F8FFFE710E0F0C:8CED86677E6E00A1A1B15968F2D3CCE6:\ +30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 + +505152537370714EC3C2C5C4010E0F0C:9FC7C23858BE03BDEBB84E90DB6786A9:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E + +A8A9AAAB5C5F5E51AEAFA8A93D222320:B4FBD65B33F70D8CF7F1111AC4649C36:\ +80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 + +DEDFDCDDF6F5F4EB10111617FEF1F0F3:C5C32D5ED03C4B53CC8C1BD0EF0DBBF6:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE + +BDBCBFBE5E5D5C530B0A0D0CFAC5C4C7:D1A7F03B773E5C212464B63709C6A891:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 + +8A8B8889050606F8F4F5F2F3636C6D6E:6B7161D8745947AC6950438EA138D028:\ +F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E + +A6A7A4A54D4E4F40B2B3B4B539262724:FD47A9F7E366EE7A09BC508B00460661:\ +20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 + +9C9D9E9FE9EAEBF40E0F08099B949596:00D40B003DC3A0D9310B659B98C7E416:\ +48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E + +2D2C2F2E1013121DCCCDCACBED121310:EEA4C79DCC8E2BDA691F20AC48BE0717:\ +70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 + +F4F5F6F7EDEEEFD0EAEBECEDF7F8F9FA:E78F43B11C204403E5751F89D05A2509:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE + +3D3C3F3E282B2A2573727574150A0B08:D0F0E3D1F1244BB979931E38DD1786EF:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 + +B6B7B4B5F8FBFAE5B4B5B2B3A0AFAEAD:042E639DC4E1E4DDE7B75B749EA6F765:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E + +B7B6B5B4989B9A95878681809BA4A5A6:BC032FDD0EFE29503A980A7D07AB46A8:\ +10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 + +A8A9AAABE5E6E798E9E8EFEE4748494A:0C93AC949C0DA6446EFFB86183B6C910:\ +38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E + +ECEDEEEFD9DADBD4B9B8BFBE657A7B78:E0D343E14DA75C917B4A5CEC4810D7C2:\ +60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 + +7F7E7D7C696A6B74CACBCCCD929D9C9F:0EAFB821748408279B937B626792E619:\ +88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE + +08090A0B0605040BFFFEF9F8B9C6C7C4:FA1AC6E02D23B106A1FEF18B274A553F:\ +B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 + +08090A0BF1F2F3CCFCFDFAFB68676665:0DADFE019CD12368075507DF33C1A1E9:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE + +CACBC8C93A393837050403020D121310:3A0879B414465D9FFBAF86B33A63A1B9:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 + +E9E8EBEA8281809F8F8E8988343B3A39:62199FADC76D0BE1805D3BA0B7D914BF:\ +28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E + +515053524645444BD0D1D6D7340B0A09:1B06D6C5D333E742730130CF78E719B4:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +42434041ECEFEE1193929594C6C9C8CB:F1F848824C32E9DCDCBF21580F069329:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E + +EFEEEDECC2C1C0CF76777071455A5B58:1A09050CBD684F784D8E965E0782F28A:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 + +5F5E5D5C3F3C3D221D1C1B1A19161714:79C2969E7DED2BA7D088F3F320692360:\ +C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +000102034142434C1C1D1A1B8D727371:091A658A2F7444C16ACCB669450C7B63:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 + +8E8F8C8DB1B2B38C56575051050A0B08:97C1E3A72CCA65FA977D5ED0E8A7BBFC:\ +18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E + +A7A6A5A4E8EBEAE57F7E7978CAD5D4D7:70C430C6DB9A17828937305A2DF91A2A:\ +40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 + +8A8B888994979689454443429F909192:629553457FBE2479098571C7C903FDE8:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E + +8C8D8E8FE0E3E2ED45444342F1CECFCC:A25B25A61F612669E7D91265C7D476BA:\ +90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 + +FFFEFDFC4C4F4E31D8D9DEDFB6B9B8BB:EB7E4E49B8AE0F024570DDA293254FED:\ +B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE + +FDFCFFFECCCFCEC12F2E29286679787B:38FE15D61CCA84516E924ADCE5014F67:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 + +67666564BAB9B8A77071767719161714:3AD208492249108C9F3EBEB167AD0583:\ +08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E + +9A9B98992D2E2F2084858283245B5A59:299BA9F9BF5AB05C3580FC26EDD1ED12:\ +30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 + +A4A5A6A70B0809365C5D5A5B2C232221:19DC705B857A60FB07717B2EA5717781:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E + +464744455754555AF3F2F5F4AFB0B1B2:FFC8AEB885B5EFCAD06B6DBEBF92E76B:\ +80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 + +323330317675746B7273747549464744:F58900C5E0B385253FF2546250A0142B:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE + +A8A9AAAB181B1A15808186872B141516:2EE67B56280BC462429CEE6E3370CBC1:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 + +E7E6E5E4202323DDAAABACAD343B3A39:20DB650A9C8E9A84AB4D25F7EDC8F03F:\ +F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E + +A8A9AAAB2221202FEDECEBEA1E010003:3C36DA169525CF818843805F25B78AE5:\ +20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 + +F9F8FBFA5F5C5D42424344450E010003:9A781D960DB9E45E37779042FEA51922:\ +48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E + +57565554F5F6F7F89697909120DFDEDD:6560395EC269C672A3C288226EFDBA77:\ +70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 + +F8F9FAFBCCCFCEF1DDDCDBDA0E010003:8C772B7A189AC544453D5916EBB27B9A:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE + +D9D8DBDA7073727D80818687C2DDDCDF:77CA5468CC48E843D05F78EED9D6578F:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 + +C5C4C7C6080B0A1588898E8F68676665:72CDCC71DC82C60D4429C9E2D8195BAA:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E + +83828180DCDFDED186878081F0CFCECD:8080D68CE60E94B40B5B8B69EEB35AFA:\ +10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 + +98999A9BDDDEDFA079787F7E0A050407:44222D3CDE299C04369D58AC0EBA1E8E:\ +38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E + +CECFCCCD4F4C4D429F9E9998DFC0C1C2:9B8721B0A8DFC691C5BC5885DBFCB27A:\ +60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 + +404142436665647B29282F2EABA4A5A6:0DC015CE9A3A3414B5E62EC643384183:\ +88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE + +33323130E6E5E4EB23222524DEA1A0A3:705715448A8DA412025CE38345C2A148:\ +B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 + +CFCECDCCF6F5F4CBE6E7E0E199969794:C32B5B0B6FBAE165266C569F4B6ECF0B:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE + +BABBB8B97271707FDCDDDADB29363734:4DCA6C75192A01DDCA9476AF2A521E87:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 + +C9C8CBCA4447465926272021545B5A59:058691E627ECBC36AC07B6DB423BD698:\ +28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E + +050407067477767956575051221D1C1F:7444527095838FE080FC2BCDD30847EB:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +00000000000000000000000000000000:0EDD33D3C621E546455BD8BA1418BEC8:\ +80000000000000000000000000000000 + +00000000000000000000000000000000:C0CC0C5DA5BD63ACD44A80774FAD5222:\ +40000000000000000000000000000000 + +00000000000000000000000000000000:2F0B4B71BC77851B9CA56D42EB8FF080:\ +20000000000000000000000000000000 + +00000000000000000000000000000000:6B1E2FFFE8A114009D8FE22F6DB5F876:\ +10000000000000000000000000000000 + +00000000000000000000000000000000:9AA042C315F94CBB97B62202F83358F5:\ +08000000000000000000000000000000 + +00000000000000000000000000000000:DBE01DE67E346A800C4C4B4880311DE4:\ +04000000000000000000000000000000 + +00000000000000000000000000000000:C117D2238D53836ACD92DDCDB85D6A21:\ +02000000000000000000000000000000 + +00000000000000000000000000000000:DC0ED85DF9611ABB7249CDD168C5467E:\ +01000000000000000000000000000000 + +00000000000000000000000000000000:807D678FFF1F56FA92DE3381904842F2:\ +00800000000000000000000000000000 + +00000000000000000000000000000000:0E53B3FCAD8E4B130EF73AEB957FB402:\ +00400000000000000000000000000000 + +00000000000000000000000000000000:969FFD3B7C35439417E7BDE923035D65:\ +00200000000000000000000000000000 + +00000000000000000000000000000000:A99B512C19CA56070491166A1503BF15:\ +00100000000000000000000000000000 + +00000000000000000000000000000000:6E9985252126EE344D26AE369D2327E3:\ +00080000000000000000000000000000 + +00000000000000000000000000000000:B85F4809F904C275491FCDCD1610387E:\ +00040000000000000000000000000000 + +00000000000000000000000000000000:ED365B8D7D20C1F5D53FB94DD211DF7B:\ +00020000000000000000000000000000 + +00000000000000000000000000000000:B3A575E86A8DB4A7135D604C43304896:\ +00010000000000000000000000000000 + +00000000000000000000000000000000:89704BCB8E69F846259EB0ACCBC7F8A2:\ +00008000000000000000000000000000 + +00000000000000000000000000000000:C56EE7C92197861F10D7A92B90882055:\ +00004000000000000000000000000000 + +00000000000000000000000000000000:92F296F6846E0EAF9422A5A24A08B069:\ +00002000000000000000000000000000 + +00000000000000000000000000000000:E67E32BB8F11DEB8699318BEE9E91A60:\ +00001000000000000000000000000000 + +00000000000000000000000000000000:B08EEF85EAF626DD91B65C4C3A97D92B:\ +00000800000000000000000000000000 + +00000000000000000000000000000000:661083A6ADDCE79BB4E0859AB5538013:\ +00000400000000000000000000000000 + +00000000000000000000000000000000:55DFE2941E0EB10AFC0B333BD34DE1FE:\ +00000200000000000000000000000000 + +00000000000000000000000000000000:6BFE5945E715C9662609770F8846087A:\ +00000100000000000000000000000000 + +00000000000000000000000000000000:79848E9C30C2F8CDA8B325F7FED2B139:\ +00000080000000000000000000000000 + +00000000000000000000000000000000:7A713A53B99FEF34AC04DEEF80965BD0:\ +00000040000000000000000000000000 + +00000000000000000000000000000000:18144A2B46620D32C3C32CE52D49257F:\ +00000020000000000000000000000000 + +00000000000000000000000000000000:872E827C70887C80749F7B8BB1847C7E:\ +00000010000000000000000000000000 + +00000000000000000000000000000000:6B86C6A4FE6A60C59B1A3102F8DE49F3:\ +00000008000000000000000000000000 + +00000000000000000000000000000000:9848BB3DFDF6F532F094679A4C231A20:\ +00000004000000000000000000000000 + +00000000000000000000000000000000:925AD528E852E329B2091CD3F1C2BCEE:\ +00000002000000000000000000000000 + +00000000000000000000000000000000:80DF436544B0DD596722E46792A40CD8:\ +00000001000000000000000000000000 + +00000000000000000000000000000000:525DAF18F93E83E1E74BBBDDE4263BBA:\ +00000000800000000000000000000000 + +00000000000000000000000000000000:F65C9D2EE485D24701FFA3313B9D5BE6:\ +00000000400000000000000000000000 + +00000000000000000000000000000000:E4FC8D8BCA06425BDF94AFA40FCC14BA:\ +00000000200000000000000000000000 + +00000000000000000000000000000000:A53F0A5CA1E4E6440BB975FF320DE6F8:\ +00000000100000000000000000000000 + +00000000000000000000000000000000:D55313B9394080462E87E02899B553F0:\ +00000000080000000000000000000000 + +00000000000000000000000000000000:34A71D761F71BCD344384C7F97D27906:\ +00000000040000000000000000000000 + +00000000000000000000000000000000:233F3D819599612EBC89580245C996A8:\ +00000000020000000000000000000000 + +00000000000000000000000000000000:B4F1374E5268DBCB676E447529E53F89:\ +00000000010000000000000000000000 + +00000000000000000000000000000000:0816BD27861D2BA891D1044E39951E96:\ +00000000008000000000000000000000 + +00000000000000000000000000000000:F3BE9EA3F10C73CA64FDE5DB13A951D1:\ +00000000004000000000000000000000 + +00000000000000000000000000000000:2448086A8106FBD03048DDF857D3F1C8:\ +00000000002000000000000000000000 + +00000000000000000000000000000000:670756E65BEC8B68F03D77CDCDCE7B91:\ +00000000001000000000000000000000 + +00000000000000000000000000000000:EF968CF0D36FD6C6EFFD225F6FB44CA9:\ +00000000000800000000000000000000 + +00000000000000000000000000000000:2E8767157922E3826DDCEC1B0CC1E105:\ +00000000000400000000000000000000 + +00000000000000000000000000000000:78CE7EEC670E45A967BAB17E26A1AD36:\ +00000000000200000000000000000000 + +00000000000000000000000000000000:3C5CEE825655F098F6E81A2F417DA3FB:\ +00000000000100000000000000000000 + +00000000000000000000000000000000:67BFDB431DCE1292200BC6F5207ADB12:\ +00000000000080000000000000000000 + +00000000000000000000000000000000:7540FD38E447C0779228548747843A6F:\ +00000000000040000000000000000000 + +00000000000000000000000000000000:B85E513301F8A936EA9EC8A21A85B5E6:\ +00000000000020000000000000000000 + +00000000000000000000000000000000:04C67DBF16C11427D507A455DE2C9BC5:\ +00000000000010000000000000000000 + +00000000000000000000000000000000:03F75EB8959E55079CFFB4FF149A37B6:\ +00000000000008000000000000000000 + +00000000000000000000000000000000:74550287F666C63BB9BC7838433434B0:\ +00000000000004000000000000000000 + +00000000000000000000000000000000:7D537200195EBC3AEFD1EAAB1C385221:\ +00000000000002000000000000000000 + +00000000000000000000000000000000:CE24E4D40C68A82B535CBD3C8E21652A:\ +00000000000001000000000000000000 + +00000000000000000000000000000000:AB20072405AA8FC40265C6F1F3DC8BC0:\ +00000000000000800000000000000000 + +00000000000000000000000000000000:6CFD2CF688F566B093F67B9B3839E80A:\ +00000000000000400000000000000000 + +00000000000000000000000000000000:BD95977E6B7239D407A012C5544BF584:\ +00000000000000200000000000000000 + +00000000000000000000000000000000:DF9C0130AC77E7C72C997F587B46DBE0:\ +00000000000000100000000000000000 + +00000000000000000000000000000000:E7F1B82CADC53A648798945B34EFEFF2:\ +00000000000000080000000000000000 + +00000000000000000000000000000000:932C6DBF69255CF13EDCDB72233ACEA3:\ +00000000000000040000000000000000 + +00000000000000000000000000000000:5C76002BC7206560EFE550C80B8F12CC:\ +00000000000000020000000000000000 + +00000000000000000000000000000000:F6B7BDD1CAEEBAB574683893C4475484:\ +00000000000000010000000000000000 + +00000000000000000000000000000000:A920E37CC6DC6B31DA8C0169569F5034:\ +00000000000000008000000000000000 + +00000000000000000000000000000000:919380ECD9C778BC513148B0C28D65FD:\ +00000000000000004000000000000000 + +00000000000000000000000000000000:EE67308DD3F2D9E6C2170755E5784BE1:\ +00000000000000002000000000000000 + +00000000000000000000000000000000:3CC73E53B85609023A05E149B223AE09:\ +00000000000000001000000000000000 + +00000000000000000000000000000000:983E8AF7CF05EBB28D71EB841C9406E6:\ +00000000000000000800000000000000 + +00000000000000000000000000000000:0F3099B2D31FA5299EE5BF43193287FC:\ +00000000000000000400000000000000 + +00000000000000000000000000000000:B763D84F38C27FE6931DCEB6715D4DB6:\ +00000000000000000200000000000000 + +00000000000000000000000000000000:5AE3C9B0E3CC29C0C61565CD01F8A248:\ +00000000000000000100000000000000 + +00000000000000000000000000000000:F58083572CD90981958565D48D2DEE25:\ +00000000000000000080000000000000 + +00000000000000000000000000000000:7E6255EEF8F70C0EF10337AAB1CCCEF8:\ +00000000000000000040000000000000 + +00000000000000000000000000000000:AAD4BAC34DB22821841CE2F631961902:\ +00000000000000000020000000000000 + +00000000000000000000000000000000:D7431C0409BB1441BA9C6858DC7D4E81:\ +00000000000000000010000000000000 + +00000000000000000000000000000000:EF9298C65E339F6E801A59C626456993:\ +00000000000000000008000000000000 + +00000000000000000000000000000000:53FE29F68FF541ABC3F0EF3350B72F7E:\ +00000000000000000004000000000000 + +00000000000000000000000000000000:F6BBA5C10DB02529E2C2DA3FB582CC14:\ +00000000000000000002000000000000 + +00000000000000000000000000000000:E4239AA37FC531A386DAD1126FC0E9CD:\ +00000000000000000001000000000000 + +00000000000000000000000000000000:8F7758F857D15BBE7BFD0E416404C365:\ +00000000000000000000800000000000 + +00000000000000000000000000000000:D273EB57C687BCD1B4EA7218A509E7B8:\ +00000000000000000000400000000000 + +00000000000000000000000000000000:65D64F8D76E8B3423FA25C4EB58A210A:\ +00000000000000000000200000000000 + +00000000000000000000000000000000:623D802B4EC450D66A16625702FCDBE0:\ +00000000000000000000100000000000 + +00000000000000000000000000000000:7496460CB28E5791BAEAF9B68FB00022:\ +00000000000000000000080000000000 + +00000000000000000000000000000000:34EA600F18BB0694B41681A49D510C1D:\ +00000000000000000000040000000000 + +00000000000000000000000000000000:5F8FF0D47D5766D29B5D6E8F46423BD8:\ +00000000000000000000020000000000 + +00000000000000000000000000000000:225F9286C5928BF09F84D3F93F541959:\ +00000000000000000000010000000000 + +00000000000000000000000000000000:B21E90D25DF383416A5F072CEBEB1FFB:\ +00000000000000000000008000000000 + +00000000000000000000000000000000:4AEFCDA089318125453EB9E8EB5E492E:\ +00000000000000000000004000000000 + +00000000000000000000000000000000:4D3E75C6CD40EC4869BC85158591ADB8:\ +00000000000000000000002000000000 + +00000000000000000000000000000000:63A8B904405436A1B99D7751866771B7:\ +00000000000000000000001000000000 + +00000000000000000000000000000000:64F0DAAE47529199792EAE172BA53293:\ +00000000000000000000000800000000 + +00000000000000000000000000000000:C3EEF84BEA18225D515A8C852A9047EE:\ +00000000000000000000000400000000 + +00000000000000000000000000000000:A44AC422B47D47B81AF73B3E9AC9596E:\ +00000000000000000000000200000000 + +00000000000000000000000000000000:D16E04A8FBC435094F8D53ADF25F5084:\ +00000000000000000000000100000000 + +00000000000000000000000000000000:EF13DC34BAB03E124EEAD8B6BF44B532:\ +00000000000000000000000080000000 + +00000000000000000000000000000000:D94799075C24DCC067AF0D392049250D:\ +00000000000000000000000040000000 + +00000000000000000000000000000000:14F431771EDDCE4764C21A2254B5E3C8:\ +00000000000000000000000020000000 + +00000000000000000000000000000000:7039329F36F2ED682B02991F28D64679:\ +00000000000000000000000010000000 + +00000000000000000000000000000000:124EE24EDE5551639DB8B8B941F6141D:\ +00000000000000000000000008000000 + +00000000000000000000000000000000:C2852879A34D5184E478EC918B993FEE:\ +00000000000000000000000004000000 + +00000000000000000000000000000000:86A806A3525B93E432053C9AB5ABBEDF:\ +00000000000000000000000002000000 + +00000000000000000000000000000000:C1609BF5A4F07E37C17A36366EC23ECC:\ +00000000000000000000000001000000 + +00000000000000000000000000000000:7E81E7CB92159A51FFCEA331B1E8EA53:\ +00000000000000000000000000800000 + +00000000000000000000000000000000:37A7BE002856C5A59A6E03EAFCE7729A:\ +00000000000000000000000000400000 + +00000000000000000000000000000000:BDF98A5A4F91E890C9A1D1E5FAAB138F:\ +00000000000000000000000000200000 + +00000000000000000000000000000000:4E96ACB66E051F2BC739CC3D3E34A26B:\ +00000000000000000000000000100000 + +00000000000000000000000000000000:EE996CDD120EB86E21ECFA49E8E1FCF1:\ +00000000000000000000000000080000 + +00000000000000000000000000000000:61B9E6B579DBF6070C351A1440DD85FF:\ +00000000000000000000000000040000 + +00000000000000000000000000000000:AC369E484316440B40DFC83AA96E28E7:\ +00000000000000000000000000020000 + +00000000000000000000000000000000:0A2D16DE985C76D45C579C1159413BBE:\ +00000000000000000000000000010000 + +00000000000000000000000000000000:DA3FDC38DA1D374FA4802CDA1A1C6B0F:\ +00000000000000000000000000008000 + +00000000000000000000000000000000:B842523D4C41C2211AFE43A5800ADCE3:\ +00000000000000000000000000004000 + +00000000000000000000000000000000:9E2CDA90D8E992DBA6C73D8229567192:\ +00000000000000000000000000002000 + +00000000000000000000000000000000:D49583B781D9E20F5BE101415957FC49:\ +00000000000000000000000000001000 + +00000000000000000000000000000000:EF09DA5C12B376E458B9B8670032498E:\ +00000000000000000000000000000800 + +00000000000000000000000000000000:A96BE0463DA774461A5E1D5A9DD1AC10:\ +00000000000000000000000000000400 + +00000000000000000000000000000000:32CEE3341060790D2D4B1362EF397090:\ +00000000000000000000000000000200 + +00000000000000000000000000000000:21CEA416A3D3359D2C4D58FB6A035F06:\ +00000000000000000000000000000100 + +00000000000000000000000000000000:172AEAB3D507678ECAF455C12587ADB7:\ +00000000000000000000000000000080 + +00000000000000000000000000000000:B6F897941EF8EBFF9FE80A567EF38478:\ +00000000000000000000000000000040 + +00000000000000000000000000000000:A9723259D94A7DC662FB0C782CA3F1DD:\ +00000000000000000000000000000020 + +00000000000000000000000000000000:2F91C984B9A4839F30001B9F430493B4:\ +00000000000000000000000000000010 + +00000000000000000000000000000000:0472406345A610B048CB99EE0EF3FA0F:\ +00000000000000000000000000000008 + +00000000000000000000000000000000:F5F39086646F8C05ED16EFA4B617957C:\ +00000000000000000000000000000004 + +00000000000000000000000000000000:26D50F485A30408D5AF47A5736292450:\ +00000000000000000000000000000002 + +00000000000000000000000000000000:0545AAD56DA2A97C3663D1432A3D1C84:\ +00000000000000000000000000000001 + +00000000000000000000000000000000:DE885DC87F5A92594082D02CC1E1B42C:\ +800000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C749194F94673F9DD2AA1932849630C1:\ +400000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0CEF643313912934D310297B90F56ECC:\ +200000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C4495D39D4A553B225FBA02A7B1B87E1:\ +100000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:636D10B1A0BCAB541D680A7970ADC830:\ +080000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:07CF045786BD6AFCC147D99E45A901A7:\ +040000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6A8E3F425A7599348F95398448827976:\ +020000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5518276836148A00D91089A20D8BFF57:\ +010000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F267E07B5E87E3BC20B969C61D4FCB06:\ +008000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5A1CDE69571D401BFCD20DEBADA2212C:\ +004000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:70A9057263254701D12ADD7D74CD509E:\ +002000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:35713A7E108031279388A33A0FE2E190:\ +001000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E74EDE82B1254714F0C7B4B243108655:\ +000800000000000000000000000000000000000000000000 + +00000000000000000000000000000000:39272E3100FAA37B55B862320D1B3EB3:\ +000400000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6D6E24C659FC5AEF712F77BCA19C9DD0:\ +000200000000000000000000000000000000000000000000 + +00000000000000000000000000000000:76D18212F972370D3CC2C6C372C6CF2F:\ +000100000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B21A1F0BAE39E55C7594ED570A7783EA:\ +000080000000000000000000000000000000000000000000 + +00000000000000000000000000000000:77DE202111895AC48DD1C974B358B458:\ +000040000000000000000000000000000000000000000000 + +00000000000000000000000000000000:67810B311969012AAF7B504FFAF39FD1:\ +000020000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C22EA2344D3E9417A6BA07843E713AEA:\ +000010000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C79CAF4B97BEE0BD0630AB354539D653:\ +000008000000000000000000000000000000000000000000 + +00000000000000000000000000000000:135FD1AF761D9AE23DF4AA6B86760DB4:\ +000004000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D4659D0B06ACD4D56AB8D11A16FD83B9:\ +000002000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F7D270028FC188E4E4F35A4AAA25D4D4:\ +000001000000000000000000000000000000000000000000 + +00000000000000000000000000000000:345CAE5A8C9620A9913D5473985852FF:\ +000000800000000000000000000000000000000000000000 + +00000000000000000000000000000000:4E8980ADDE60B0E42C0B287FEA41E729:\ +000000400000000000000000000000000000000000000000 + +00000000000000000000000000000000:F11B6D74E1F15155633DC39743C1A527:\ +000000200000000000000000000000000000000000000000 + +00000000000000000000000000000000:9C87916C0180064F9D3179C6F5DD8C35:\ +000000100000000000000000000000000000000000000000 + +00000000000000000000000000000000:71AB186BCAEA518E461D4F7FAD230E6A:\ +000000080000000000000000000000000000000000000000 + +00000000000000000000000000000000:C4A31BBC3DAAF742F9141C2A5001A49C:\ +000000040000000000000000000000000000000000000000 + +00000000000000000000000000000000:E7C47B7B1D40F182A8928C8A55671D07:\ +000000020000000000000000000000000000000000000000 + +00000000000000000000000000000000:8E17F294B28FA373C6249538868A7EEF:\ +000000010000000000000000000000000000000000000000 + +00000000000000000000000000000000:754404096A5CBC08AF09491BE249141A:\ +000000008000000000000000000000000000000000000000 + +00000000000000000000000000000000:101CB56E55F05D86369B6D1069204F0A:\ +000000004000000000000000000000000000000000000000 + +00000000000000000000000000000000:73F19BB6604205C6EE227B9759791E41:\ +000000002000000000000000000000000000000000000000 + +00000000000000000000000000000000:6270C0028F0D136C37A56B2CB64D24D6:\ +000000001000000000000000000000000000000000000000 + +00000000000000000000000000000000:A3BF7C2C38D1114A087ECF212E694346:\ +000000000800000000000000000000000000000000000000 + +00000000000000000000000000000000:49CABFF2CEF7D9F95F5EFB1F7A1A7DDE:\ +000000000400000000000000000000000000000000000000 + +00000000000000000000000000000000:EC7F8A47CC59B849469255AD49F62752:\ +000000000200000000000000000000000000000000000000 + +00000000000000000000000000000000:68FAE55A13EFAF9B07B3552A8A0DC9D1:\ +000000000100000000000000000000000000000000000000 + +00000000000000000000000000000000:211E6B19C69FAEF481F64F24099CDA65:\ +000000000080000000000000000000000000000000000000 + +00000000000000000000000000000000:DBB918C75BC5732416F79FB0C8EE4C5C:\ +000000000040000000000000000000000000000000000000 + +00000000000000000000000000000000:98D494E5D963A6C8B92536D3EC35E3FD:\ +000000000020000000000000000000000000000000000000 + +00000000000000000000000000000000:C9A873404D403D6F074190851D67781A:\ +000000000010000000000000000000000000000000000000 + +00000000000000000000000000000000:073AEF4A7C77D921928CB0DD9D27CAE7:\ +000000000008000000000000000000000000000000000000 + +00000000000000000000000000000000:89BDE25CEE36FDE769A10E52298CF90F:\ +000000000004000000000000000000000000000000000000 + +00000000000000000000000000000000:26D0842D37EAD38557C65E0A5E5F122E:\ +000000000002000000000000000000000000000000000000 + +00000000000000000000000000000000:F8294BA375AF46B3F22905BBAFFAB107:\ +000000000001000000000000000000000000000000000000 + +00000000000000000000000000000000:2AD63EB4D0D43813B979CF72B35BDB94:\ +000000000000800000000000000000000000000000000000 + +00000000000000000000000000000000:7710C171EE0F4EFA39BE4C995180181D:\ +000000000000400000000000000000000000000000000000 + +00000000000000000000000000000000:C0CB2B40DBA7BE8C0698FAE1E4B80FF8:\ +000000000000200000000000000000000000000000000000 + +00000000000000000000000000000000:97970E505194622FD955CA1B80B784E9:\ +000000000000100000000000000000000000000000000000 + +00000000000000000000000000000000:7CB1824B29F850900DF2CAD9CF04C1CF:\ +000000000000080000000000000000000000000000000000 + +00000000000000000000000000000000:FDF4F036BB988E42F2F62DE63FE19A64:\ +000000000000040000000000000000000000000000000000 + +00000000000000000000000000000000:08908CFE2C82606B2C15DF61B75CF3E2:\ +000000000000020000000000000000000000000000000000 + +00000000000000000000000000000000:B3AA689EF2D07FF365ACB9ADBA2AF07A:\ +000000000000010000000000000000000000000000000000 + +00000000000000000000000000000000:F2672CD8EAA3B98776660D0263656F5C:\ +000000000000008000000000000000000000000000000000 + +00000000000000000000000000000000:5BDEAC00E986687B9E1D94A0DA7BF452:\ +000000000000004000000000000000000000000000000000 + +00000000000000000000000000000000:E6D57BD66EA1627363EE0C4B711B0B21:\ +000000000000002000000000000000000000000000000000 + +00000000000000000000000000000000:03730DD6ACB4AD9996A63BE7765EC06F:\ +000000000000001000000000000000000000000000000000 + +00000000000000000000000000000000:A470E361AA5437B2BE8586D2F78DE582:\ +000000000000000800000000000000000000000000000000 + +00000000000000000000000000000000:7567FEEFA559911FD479670246B484E3:\ +000000000000000400000000000000000000000000000000 + +00000000000000000000000000000000:29829DEA15A4E7A4C049045E7B106E29:\ +000000000000000200000000000000000000000000000000 + +00000000000000000000000000000000:A407834C3D89D48A2CB7A152208FA4ED:\ +000000000000000100000000000000000000000000000000 + +00000000000000000000000000000000:68F948053F78FEF0D8F9FE7EF3A89819:\ +000000000000000080000000000000000000000000000000 + +00000000000000000000000000000000:B605174CAB13AD8FE3B20DA3AE7B0234:\ +000000000000000040000000000000000000000000000000 + +00000000000000000000000000000000:CCAB8F0AEBFF032893996D383CBFDBFA:\ +000000000000000020000000000000000000000000000000 + +00000000000000000000000000000000:AF14BB8428C9730B7DC17B6C1CBEBCC8:\ +000000000000000010000000000000000000000000000000 + +00000000000000000000000000000000:5A41A21332040877EB7B89E8E80D19FE:\ +000000000000000008000000000000000000000000000000 + +00000000000000000000000000000000:AC1BA52EFCDDE368B1596F2F0AD893A0:\ +000000000000000004000000000000000000000000000000 + +00000000000000000000000000000000:41B890E31B9045E6ECDC1BC3F2DB9BCC:\ +000000000000000002000000000000000000000000000000 + +00000000000000000000000000000000:4D54A549728E55B19A23660424A0F146:\ +000000000000000001000000000000000000000000000000 + +00000000000000000000000000000000:A917581F41C47C7DDCFFD5285E2D6A61:\ +000000000000000000800000000000000000000000000000 + +00000000000000000000000000000000:604DF24BA6099B93A7405A524D764FCB:\ +000000000000000000400000000000000000000000000000 + +00000000000000000000000000000000:78D9D156F28B190E232D1B7AE7FC730A:\ +000000000000000000200000000000000000000000000000 + +00000000000000000000000000000000:5A12C39E442CD7F27B3CD77F5D029582:\ +000000000000000000100000000000000000000000000000 + +00000000000000000000000000000000:FF2BF2F47CF7B0F28EE25AF95DBF790D:\ +000000000000000000080000000000000000000000000000 + +00000000000000000000000000000000:1863BB7D193BDA39DF090659EB8AE48B:\ +000000000000000000040000000000000000000000000000 + +00000000000000000000000000000000:38178F2FB4CFCF31E87E1ABCDC023EB5:\ +000000000000000000020000000000000000000000000000 + +00000000000000000000000000000000:F5B13DC690CC0D541C6BA533023DC8C9:\ +000000000000000000010000000000000000000000000000 + +00000000000000000000000000000000:48EC05238D7375D126DC9D08884D4827:\ +000000000000000000008000000000000000000000000000 + +00000000000000000000000000000000:ACD0D81139691B310B92A6E377BACC87:\ +000000000000000000004000000000000000000000000000 + +00000000000000000000000000000000:9A4AA43578B55CE9CC178F0D2E162C79:\ +000000000000000000002000000000000000000000000000 + +00000000000000000000000000000000:08AD94BC737DB3C87D49B9E01B720D81:\ +000000000000000000001000000000000000000000000000 + +00000000000000000000000000000000:3BCFB2D5D210E8332900C5991D551A2A:\ +000000000000000000000800000000000000000000000000 + +00000000000000000000000000000000:C5F0C6B9397ACB29635CE1A0DA2D8D96:\ +000000000000000000000400000000000000000000000000 + +00000000000000000000000000000000:844A29EFC693E2FA9900F87FBF5DCD5F:\ +000000000000000000000200000000000000000000000000 + +00000000000000000000000000000000:5126A1C41051FEA158BE41200E1EA59D:\ +000000000000000000000100000000000000000000000000 + +00000000000000000000000000000000:302123CA7B4F46D667FFFB0EB6AA7703:\ +000000000000000000000080000000000000000000000000 + +00000000000000000000000000000000:A9D16BCE7DB5C024277709EE2A88D91A:\ +000000000000000000000040000000000000000000000000 + +00000000000000000000000000000000:F013C5EC123A26CFC34B598C992A996B:\ +000000000000000000000020000000000000000000000000 + +00000000000000000000000000000000:E38A825CD971A1D2E56FB1DBA248F2A8:\ +000000000000000000000010000000000000000000000000 + +00000000000000000000000000000000:6E701773C0311E0BD4C5A097406D22B3:\ +000000000000000000000008000000000000000000000000 + +00000000000000000000000000000000:754262CEF0C64BE4C3E67C35ABE439F7:\ +000000000000000000000004000000000000000000000000 + +00000000000000000000000000000000:C9C2D4C47DF7D55CFA0EE5F1FE5070F4:\ +000000000000000000000002000000000000000000000000 + +00000000000000000000000000000000:6AB4BEA85B172573D8BD2D5F4329F13D:\ +000000000000000000000001000000000000000000000000 + +00000000000000000000000000000000:11F03EF28E2CC9AE5165C587F7396C8C:\ +000000000000000000000000800000000000000000000000 + +00000000000000000000000000000000:0682F2EB1A68BAC7949922C630DD27FA:\ +000000000000000000000000400000000000000000000000 + +00000000000000000000000000000000:ABB0FEC0413D659AFE8E3DCF6BA873BB:\ +000000000000000000000000200000000000000000000000 + +00000000000000000000000000000000:FE86A32E19F805D6569B2EFADD9C92AA:\ +000000000000000000000000100000000000000000000000 + +00000000000000000000000000000000:E434E472275D1837D3D717F2EECC88C3:\ +000000000000000000000000080000000000000000000000 + +00000000000000000000000000000000:74E57DCD12A21D26EF8ADAFA5E60469A:\ +000000000000000000000000040000000000000000000000 + +00000000000000000000000000000000:C275429D6DAD45DDD423FA63C816A9C1:\ +000000000000000000000000020000000000000000000000 + +00000000000000000000000000000000:7F6EC1A9AE729E86F7744AED4B8F4F07:\ +000000000000000000000000010000000000000000000000 + +00000000000000000000000000000000:48B5A71AB9292BD4F9E608EF102636B2:\ +000000000000000000000000008000000000000000000000 + +00000000000000000000000000000000:076FB95D5F536C78CBED3181BCCF3CF1:\ +000000000000000000000000004000000000000000000000 + +00000000000000000000000000000000:BFA76BEA1E684FD3BF9256119EE0BC0F:\ +000000000000000000000000002000000000000000000000 + +00000000000000000000000000000000:7D395923D56577F3FF8670998F8C4A71:\ +000000000000000000000000001000000000000000000000 + +00000000000000000000000000000000:BA02C986E529AC18A882C34BA389625F:\ +000000000000000000000000000800000000000000000000 + +00000000000000000000000000000000:3DFCF2D882AFE75D3A191193013A84B5:\ +000000000000000000000000000400000000000000000000 + +00000000000000000000000000000000:FAD1FDE1D0241784B63080D2C74D236C:\ +000000000000000000000000000200000000000000000000 + +00000000000000000000000000000000:7D6C80D39E41F007A14FB9CD2B2C15CD:\ +000000000000000000000000000100000000000000000000 + +00000000000000000000000000000000:7975F401FC10637BB33EA2DB058FF6EC:\ +000000000000000000000000000080000000000000000000 + +00000000000000000000000000000000:657983865C55A818F02B7FCD52ED7E99:\ +000000000000000000000000000040000000000000000000 + +00000000000000000000000000000000:B32BEB1776F9827FF4C3AC9997E84B20:\ +000000000000000000000000000020000000000000000000 + +00000000000000000000000000000000:2AE2C7C374F0A41E3D46DBC3E66BB59F:\ +000000000000000000000000000010000000000000000000 + +00000000000000000000000000000000:4D835E4ABDD4BDC6B88316A6E931A07F:\ +000000000000000000000000000008000000000000000000 + +00000000000000000000000000000000:E07EFABFF1C353F7384EBB87B435A3F3:\ +000000000000000000000000000004000000000000000000 + +00000000000000000000000000000000:ED3088DC3FAF89AD87B4356FF1BB09C2:\ +000000000000000000000000000002000000000000000000 + +00000000000000000000000000000000:4324D01140C156FC898C2E32BA03FB05:\ +000000000000000000000000000001000000000000000000 + +00000000000000000000000000000000:BE15D016FACB5BAFBC24FA9289132166:\ +000000000000000000000000000000800000000000000000 + +00000000000000000000000000000000:AC9B7048EDB1ACF4D97A5B0B3F50884B:\ +000000000000000000000000000000400000000000000000 + +00000000000000000000000000000000:448BECE1F86C7845DFA9A4BB2A016FB3:\ +000000000000000000000000000000200000000000000000 + +00000000000000000000000000000000:10DD445E87686EB46EA9B1ABC49257F0:\ +000000000000000000000000000000100000000000000000 + +00000000000000000000000000000000:B7FCCF7659FA756D4B7303EEA6C07458:\ +000000000000000000000000000000080000000000000000 + +00000000000000000000000000000000:289117115CA3513BAA7640B1004872C2:\ +000000000000000000000000000000040000000000000000 + +00000000000000000000000000000000:57CB42F7EE7186051F50B93FFA7B35BF:\ +000000000000000000000000000000020000000000000000 + +00000000000000000000000000000000:F2741BFBFB81663B9136802FB9C3126A:\ +000000000000000000000000000000010000000000000000 + +00000000000000000000000000000000:E32DDDC5C7398C096E3BD535B31DB5CE:\ +000000000000000000000000000000008000000000000000 + +00000000000000000000000000000000:81D3C204E608AF9CC713EAEBCB72433F:\ +000000000000000000000000000000004000000000000000 + +00000000000000000000000000000000:D4DEEF4BFC36AAA579496E6935F8F98E:\ +000000000000000000000000000000002000000000000000 + +00000000000000000000000000000000:C356DB082B97802B038571C392C5C8F6:\ +000000000000000000000000000000001000000000000000 + +00000000000000000000000000000000:A3919ECD4861845F2527B77F06AC6A4E:\ +000000000000000000000000000000000800000000000000 + +00000000000000000000000000000000:A53858E17A2F802A20E40D44494FFDA0:\ +000000000000000000000000000000000400000000000000 + +00000000000000000000000000000000:5D989E122B78C758921EDBEEB827F0C0:\ +000000000000000000000000000000000200000000000000 + +00000000000000000000000000000000:4B1C0C8F9E7830CC3C4BE7BD226FA8DE:\ +000000000000000000000000000000000100000000000000 + +00000000000000000000000000000000:82C40C5FD897FBCA7B899C70713573A1:\ +000000000000000000000000000000000080000000000000 + +00000000000000000000000000000000:ED13EE2D45E00F75CCDB51EA8E3E36AD:\ +000000000000000000000000000000000040000000000000 + +00000000000000000000000000000000:F121799EEFE8432423176A3CCF6462BB:\ +000000000000000000000000000000000020000000000000 + +00000000000000000000000000000000:4FA0C06F07997E98271DD86F7B355C50:\ +000000000000000000000000000000000010000000000000 + +00000000000000000000000000000000:849EB364B4E81D058649DC5B1BF029B9:\ +000000000000000000000000000000000008000000000000 + +00000000000000000000000000000000:F48F9E0DE8DE7AD944A207809335D9B1:\ +000000000000000000000000000000000004000000000000 + +00000000000000000000000000000000:E59E9205B5A81A4FD26DFCF308966022:\ +000000000000000000000000000000000002000000000000 + +00000000000000000000000000000000:3A91A1BE14AAE9ED700BDF9D70018804:\ +000000000000000000000000000000000001000000000000 + +00000000000000000000000000000000:8ABAD78DCB79A48D79070E7DA89664EC:\ +000000000000000000000000000000000000800000000000 + +00000000000000000000000000000000:B68377D98AAE6044938A7457F6C649D9:\ +000000000000000000000000000000000000400000000000 + +00000000000000000000000000000000:E4E1275C42F5F1B63D662C099D6CE33D:\ +000000000000000000000000000000000000200000000000 + +00000000000000000000000000000000:7DEF32A34C6BE668F17DA1BB193B06EF:\ +000000000000000000000000000000000000100000000000 + +00000000000000000000000000000000:78B6000CC3D30CB3A74B68D0EDBD2B53:\ +000000000000000000000000000000000000080000000000 + +00000000000000000000000000000000:0A47531DE88DD8AE5C23EAE4F7D1F2D5:\ +000000000000000000000000000000000000040000000000 + +00000000000000000000000000000000:667B24E8000CF68231EC484581D922E5:\ +000000000000000000000000000000000000020000000000 + +00000000000000000000000000000000:39DAA5EBD4AACAE130E9C33236C52024:\ +000000000000000000000000000000000000010000000000 + +00000000000000000000000000000000:E3C88760B3CB21360668A63E55BB45D1:\ +000000000000000000000000000000000000008000000000 + +00000000000000000000000000000000:F131EE903C1CDB49D416866FD5D8DE51:\ +000000000000000000000000000000000000004000000000 + +00000000000000000000000000000000:7A1916135B0447CF4033FC13047A583A:\ +000000000000000000000000000000000000002000000000 + +00000000000000000000000000000000:F7D55FB27991143DCDFA90DDF0424FCB:\ +000000000000000000000000000000000000001000000000 + +00000000000000000000000000000000:EA93E7D1CA1111DBD8F7EC111A848C0C:\ +000000000000000000000000000000000000000800000000 + +00000000000000000000000000000000:2A689E39DFD3CBCBE221326E95888779:\ +000000000000000000000000000000000000000400000000 + +00000000000000000000000000000000:C1CE399CA762318AC2C40D1928B4C57D:\ +000000000000000000000000000000000000000200000000 + +00000000000000000000000000000000:D43FB6F2B2879C8BFAF0092DA2CA63ED:\ +000000000000000000000000000000000000000100000000 + +00000000000000000000000000000000:224563E617158DF97650AF5D130E78A5:\ +000000000000000000000000000000000000000080000000 + +00000000000000000000000000000000:6562FDF6833B7C4F7484AE6EBCC243DD:\ +000000000000000000000000000000000000000040000000 + +00000000000000000000000000000000:93D58BA7BED22615D661D002885A7457:\ +000000000000000000000000000000000000000020000000 + +00000000000000000000000000000000:9A0EF559003AD9E52D3E09ED3C1D3320:\ +000000000000000000000000000000000000000010000000 + +00000000000000000000000000000000:96BAF5A7DC6F3DD27EB4C717A85D261C:\ +000000000000000000000000000000000000000008000000 + +00000000000000000000000000000000:B8762E06884900E8452293190E19CCDB:\ +000000000000000000000000000000000000000004000000 + +00000000000000000000000000000000:785416A22BD63CBABF4B1789355197D3:\ +000000000000000000000000000000000000000002000000 + +00000000000000000000000000000000:A0D20CE1489BAA69A3612DCE90F7ABF6:\ +000000000000000000000000000000000000000001000000 + +00000000000000000000000000000000:700244E93DC94230CC607FFBA0E48F32:\ +000000000000000000000000000000000000000000800000 + +00000000000000000000000000000000:85329E476829F872A2B4A7E59F91FF2D:\ +000000000000000000000000000000000000000000400000 + +00000000000000000000000000000000:E4219B4935D988DB719B8B8B2B53D247:\ +000000000000000000000000000000000000000000200000 + +00000000000000000000000000000000:6ACDD04FD13D4DB4409FE8DD13FD737B:\ +000000000000000000000000000000000000000000100000 + +00000000000000000000000000000000:9EB7A670AB59E15BE582378701C1EC14:\ +000000000000000000000000000000000000000000080000 + +00000000000000000000000000000000:29DF2D6935FE657763BC7A9F22D3D492:\ +000000000000000000000000000000000000000000040000 + +00000000000000000000000000000000:99303359D4A13AFDBE6C784028CE533A:\ +000000000000000000000000000000000000000000020000 + +00000000000000000000000000000000:FF5C70A6334545F33B9DBF7BEA0417CA:\ +000000000000000000000000000000000000000000010000 + +00000000000000000000000000000000:289F58A17E4C50EDA4269EFB3DF55815:\ +000000000000000000000000000000000000000000008000 + +00000000000000000000000000000000:EA35DCB416E9E1C2861D1682F062B5EB:\ +000000000000000000000000000000000000000000004000 + +00000000000000000000000000000000:3A47BF354BE775383C50B0C0A83E3A58:\ +000000000000000000000000000000000000000000002000 + +00000000000000000000000000000000:BF6C1DC069FB95D05D43B01D8206D66B:\ +000000000000000000000000000000000000000000001000 + +00000000000000000000000000000000:046D1D580D5898DA6595F32FD1F0C33D:\ +000000000000000000000000000000000000000000000800 + +00000000000000000000000000000000:5F57803B7B82A110F7E9855D6A546082:\ +000000000000000000000000000000000000000000000400 + +00000000000000000000000000000000:25336ECF34E7BE97862CDFF715FF05A8:\ +000000000000000000000000000000000000000000000200 + +00000000000000000000000000000000:ACBAA2A943D8078022D693890E8C4FEF:\ +000000000000000000000000000000000000000000000100 + +00000000000000000000000000000000:3947597879F6B58E4E2F0DF825A83A38:\ +000000000000000000000000000000000000000000000080 + +00000000000000000000000000000000:4EB8CC3335496130655BF3CA570A4FC0:\ +000000000000000000000000000000000000000000000040 + +00000000000000000000000000000000:BBDA7769AD1FDA425E18332D97868824:\ +000000000000000000000000000000000000000000000020 + +00000000000000000000000000000000:5E7532D22DDB0829A29C868198397154:\ +000000000000000000000000000000000000000000000010 + +00000000000000000000000000000000:E66DA67B630AB7AE3E682855E1A1698E:\ +000000000000000000000000000000000000000000000008 + +00000000000000000000000000000000:4D93800F671B48559A64D1EA030A590A:\ +000000000000000000000000000000000000000000000004 + +00000000000000000000000000000000:F33159FCC7D9AE30C062CD3B322AC764:\ +000000000000000000000000000000000000000000000002 + +00000000000000000000000000000000:8BAE4EFB70D33A9792EEA9BE70889D72:\ +000000000000000000000000000000000000000000000001 + +00000000000000000000000000000000:E35A6DCB19B201A01EBCFA8AA22B5759:\ +8000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5075C2405B76F22F553488CAE47CE90B:\ +4000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:49DF95D844A0145A7DE01C91793302D3:\ +2000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E7396D778E940B8418A86120E5F421FE:\ +1000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:05F535C36FCEDE4657BE37F4087DB1EF:\ +0800000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D0C1DDDD10DA777C68AB36AF51F2C204:\ +0400000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1C55FB811B5C6464C4E5DE1535A75514:\ +0200000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:52917F3AE957D5230D3A2AF57C7B5A71:\ +0100000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C6E3D5501752DD5E9AEF086D6B45D705:\ +0080000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A24A9C7AF1D9B1E17E1C9A3E711B3FA7:\ +0040000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B881ECA724A6D43DBC6B96F6F59A0D20:\ +0020000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EC524D9A24DFFF2A9639879B83B8E137:\ +0010000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:34C4F345F5466215A037F443635D6F75:\ +0008000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5BA5055BEDB8895F672E29F2EB5A355D:\ +0004000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B3F692AA3A435259EBBEF9B51AD1E08D:\ +0002000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:414FEB4376F2C64A5D2FBB2ED531BA7D:\ +0001000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A20D519E3BCA3303F07E81719F61605E:\ +0000800000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A08D10E520AF811F45BD60A2DC0DC4B1:\ +0000400000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B06893A8C563C430E6F3858826EFBBE4:\ +0000200000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0FFEE26AE2D3929C6BD9C6BEDFF84409:\ +0000100000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4D0F5E906ED77801FC0EF53EDC5F9E2B:\ +0000080000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8B6EC00119AD8B026DCE56EA7DEFE930:\ +0000040000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:69026591D43363EE9D83B5007F0B484E:\ +0000020000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:27135D86950C6A2F86872706279A4761:\ +0000010000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:35E6DB8723F281DA410C3AC8535ED77C:\ +0000008000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:57427CF214B8C28E4BBF487CCB8D0E09:\ +0000004000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6DF01BF56E5131AC87F96E99CAB86367:\ +0000002000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3856C5B55790B768BBF7D43031579BCF:\ +0000001000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1E6ED8FB7C15BC4D2F63BA7037ED44D0:\ +0000000800000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E1B2ED6CD8D93D455534E401156D4BCF:\ +0000000400000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EFBCCA5BDFDAD10E875F02336212CE36:\ +0000000200000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0B777F02FD18DCE2646DCFE868DFAFAD:\ +0000000100000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C8A104B5693D1B14F5BF1F10100BF508:\ +0000000080000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4CCE6615244AFCB38408FECE219962EA:\ +0000000040000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F99E7845D3A255B394C9C050CBA258B1:\ +0000000020000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B4AFBB787F9BCFB7B55FDF447F611295:\ +0000000010000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:AE1C426A697FAF2808B7EF6ADDB5C020:\ +0000000008000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7572F92811A85B9BDD38DEAD9945BCAE:\ +0000000004000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:71BC7AA46E43FB95A181527D9F6A360F:\ +0000000002000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5542EF2923066F1EC8F546DD0D8E7CA8:\ +0000000001000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6B92317C7D623790B748FDD7EFC42422:\ +0000000000800000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0FE7C097E899C71EF045360F8D6C25CF:\ +0000000000400000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4ECE7EE107D0264D04693151C25B9DF6:\ +0000000000200000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FD6AE687CBFCA9E301045888D3BB9605:\ +0000000000100000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:476B579C8556C7254424902CC1D6D36E:\ +0000000000080000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4133CBCDFDD6B8860A1FC18665D6D71B:\ +0000000000040000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3B36EC2664798C108B816812C65DFDC7:\ +0000000000020000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:364E20A234FEA385D48DC5A09C9E70CF:\ +0000000000010000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4A4BA25969DE3F5EE5642C71AAD0EFD1:\ +0000000000008000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E42CBAAE43297F67A76C1C501BB79E36:\ +0000000000004000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:23CEDEDA4C15B4C037E8C61492217937:\ +0000000000002000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A1719147A1F4A1A1180BD16E8593DCDE:\ +0000000000001000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:AB82337E9FB0EC60D1F25A1D0014192C:\ +0000000000000800000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:74BF2D8FC5A8388DF1A3A4D7D33FC164:\ +0000000000000400000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D5B493317E6FBC6FFFD664B3C491368A:\ +0000000000000200000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BA767381586DA56A2A8D503D5F7ADA0B:\ +0000000000000100000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E8E6BC57DFE9CCADB0DECABF4E5CF91F:\ +0000000000000080000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3C8E5A5CDC9CEED90815D1F84BB2998C:\ +0000000000000040000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:283843020BA38F056001B2FD585F7CC9:\ +0000000000000020000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D8ADC7426F623ECE8741A70621D28870:\ +0000000000000010000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D7C5C215592D06F00E6A80DA69A28EA9:\ +0000000000000008000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:52CF6FA433C3C870CAC70190358F7F16:\ +0000000000000004000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F63D442A584DA71786ADEC9F3346DF75:\ +0000000000000002000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:549078F4B0CA7079B45F9A5ADAFAFD99:\ +0000000000000001000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F2A5986EE4E9984BE2BAFB79EA8152FA:\ +0000000000000000800000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8A74535017B4DB2776668A1FAE64384C:\ +0000000000000000400000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E613342F57A97FD95DC088711A5D0ECD:\ +0000000000000000200000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3FFAEBF6B22CF1DC82AE17CD48175B01:\ +0000000000000000100000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BAFD52EFA15C248CCBF9757735E6B1CE:\ +0000000000000000080000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7AF94BC018D9DDD4539D2DD1C6F4000F:\ +0000000000000000040000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FE177AD61CA0FDB281086FBA8FE76803:\ +0000000000000000020000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:74DBEA15E2E9285BAD163D7D534251B6:\ +0000000000000000010000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:23DD21331B3A92F200FE56FF050FFE74:\ +0000000000000000008000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A69C5AA34AB20A858CAFA766EACED6D8:\ +0000000000000000004000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3F72BB4DF2A4F941A4A09CB78F04B97A:\ +0000000000000000002000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:72CC43577E1FD5FD14622D24D97FCDCC:\ +0000000000000000001000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D83AF8EBE93E0B6B99CAFADE224937D1:\ +0000000000000000000800000000000000000000000000000000000000000000 + +00000000000000000000000000000000:44042329128D56CAA8D084C8BD769D1E:\ +0000000000000000000400000000000000000000000000000000000000000000 + +00000000000000000000000000000000:14102D72290DE4F2C430ADD1ED64BA1D:\ +0000000000000000000200000000000000000000000000000000000000000000 + +00000000000000000000000000000000:449124097B1ECD0AE7065206DF06F03C:\ +0000000000000000000100000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D060A99F8CC153A42E11E5F97BD7584A:\ +0000000000000000000080000000000000000000000000000000000000000000 + +00000000000000000000000000000000:65605B3EA9261488D53E48602ADEA299:\ +0000000000000000000040000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C5E5CAD7A208DE8EA6BE049EFE5C7346:\ +0000000000000000000020000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4C280C46D2181646048DD5BC0C0831A5:\ +0000000000000000000010000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5DD65CF37F2A0929559AABAFDA08E730:\ +0000000000000000000008000000000000000000000000000000000000000000 + +00000000000000000000000000000000:31F2335CAAF264172F69A693225E6D22:\ +0000000000000000000004000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3E28B35F99A72662590DA96426DD377F:\ +0000000000000000000002000000000000000000000000000000000000000000 + +00000000000000000000000000000000:570F40F5D7B20441486578ED344343BE:\ +0000000000000000000001000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C54308AD1C9E3B19F8B7417873045A8C:\ +0000000000000000000000800000000000000000000000000000000000000000 + +00000000000000000000000000000000:CBF335E39CE13ADE2B696179E8FD0CE1:\ +0000000000000000000000400000000000000000000000000000000000000000 + +00000000000000000000000000000000:9C2FBF422355D8293083D51F4A3C18A9:\ +0000000000000000000000200000000000000000000000000000000000000000 + +00000000000000000000000000000000:5ED8B5A31ECEFAB16C9AA6986DA67BCE:\ +0000000000000000000000100000000000000000000000000000000000000000 + +00000000000000000000000000000000:627815DCFC814ABC75900041B1DD7B59:\ +0000000000000000000000080000000000000000000000000000000000000000 + +00000000000000000000000000000000:9EF3E82A50A59F166260494F7A7F2CC3:\ +0000000000000000000000040000000000000000000000000000000000000000 + +00000000000000000000000000000000:878CD0D8D920888B5935D6C351128737:\ +0000000000000000000000020000000000000000000000000000000000000000 + +00000000000000000000000000000000:E44429474D6FC3084EB2A6B8B46AF754:\ +0000000000000000000000010000000000000000000000000000000000000000 + +00000000000000000000000000000000:EBAACF9641D54E1FB18D0A2BE4F19BE5:\ +0000000000000000000000008000000000000000000000000000000000000000 + +00000000000000000000000000000000:13B3BF497CEE780E123C7E193DEA3A01:\ +0000000000000000000000004000000000000000000000000000000000000000 + +00000000000000000000000000000000:6E8F381DE00A41161F0DF03B4155BFD4:\ +0000000000000000000000002000000000000000000000000000000000000000 + +00000000000000000000000000000000:35E4F29BBA2BAE01144910783C3FEF49:\ +0000000000000000000000001000000000000000000000000000000000000000 + +00000000000000000000000000000000:55B17BD66788CEAC366398A31F289FFB:\ +0000000000000000000000000800000000000000000000000000000000000000 + +00000000000000000000000000000000:11341F56C0D6D1008D28741DAA7679CE:\ +0000000000000000000000000400000000000000000000000000000000000000 + +00000000000000000000000000000000:4DF7253DF421D83358BDBE924745D98C:\ +0000000000000000000000000200000000000000000000000000000000000000 + +00000000000000000000000000000000:BAE2EE651116D93EDC8E83B5F3347BE1:\ +0000000000000000000000000100000000000000000000000000000000000000 + +00000000000000000000000000000000:F9721ABD06709157183AF3965A659D9D:\ +0000000000000000000000000080000000000000000000000000000000000000 + +00000000000000000000000000000000:19A1C252A613FE2860A4AE6D75CE6FA3:\ +0000000000000000000000000040000000000000000000000000000000000000 + +00000000000000000000000000000000:B5DDB2F5D9752C949FBDE3FFF5556C6E:\ +0000000000000000000000000020000000000000000000000000000000000000 + +00000000000000000000000000000000:81B044FCFFC78ECCFCD171AAD0405C66:\ +0000000000000000000000000010000000000000000000000000000000000000 + +00000000000000000000000000000000:C640566D3C06020EB2C42F1D62E56A9B:\ +0000000000000000000000000008000000000000000000000000000000000000 + +00000000000000000000000000000000:EA6C4BCF425291679FDFFD26A424FBCC:\ +0000000000000000000000000004000000000000000000000000000000000000 + +00000000000000000000000000000000:57F6901465D9440D9F15EE2CBA5A4090:\ +0000000000000000000000000002000000000000000000000000000000000000 + +00000000000000000000000000000000:FBCFA74CADC7406260F63D96C8AAB6B1:\ +0000000000000000000000000001000000000000000000000000000000000000 + +00000000000000000000000000000000:DFF4F096CEA211D4BBDACA033D0EC7D1:\ +0000000000000000000000000000800000000000000000000000000000000000 + +00000000000000000000000000000000:1EE5190D551F0F42F675227A381296A9:\ +0000000000000000000000000000400000000000000000000000000000000000 + +00000000000000000000000000000000:F98E1905012E580F097623C10B93054F:\ +0000000000000000000000000000200000000000000000000000000000000000 + +00000000000000000000000000000000:E7D43743D21DD3C9F168C86856558B9A:\ +0000000000000000000000000000100000000000000000000000000000000000 + +00000000000000000000000000000000:632A9DDA730DAB67593C5D08D8AC1059:\ +0000000000000000000000000000080000000000000000000000000000000000 + +00000000000000000000000000000000:E084317000715B9057BC9DE9F3AB6124:\ +0000000000000000000000000000040000000000000000000000000000000000 + +00000000000000000000000000000000:61F9EF33A0BB4E666C2ED99101919FAB:\ +0000000000000000000000000000020000000000000000000000000000000000 + +00000000000000000000000000000000:6DC1D68A11834657D46703C22578D59A:\ +0000000000000000000000000000010000000000000000000000000000000000 + +00000000000000000000000000000000:53AC1548863D3D16F1D4DC7242E05F2C:\ +0000000000000000000000000000008000000000000000000000000000000000 + +00000000000000000000000000000000:E82CD587A408306AD78CEAE0916B9F8C:\ +0000000000000000000000000000004000000000000000000000000000000000 + +00000000000000000000000000000000:0FD2D40EA6AD17A3A767F0A8600D6295:\ +0000000000000000000000000000002000000000000000000000000000000000 + +00000000000000000000000000000000:AD84CC8255ADB39DFCA23F92761AE7E9:\ +0000000000000000000000000000001000000000000000000000000000000000 + +00000000000000000000000000000000:F4F20CF7D51BEE7DA024A2B11A7ECA0B:\ +0000000000000000000000000000000800000000000000000000000000000000 + +00000000000000000000000000000000:5057691B85D9CE93A193214DB0A016B6:\ +0000000000000000000000000000000400000000000000000000000000000000 + +00000000000000000000000000000000:0F58C960876390BDEF4BB6BE95CAA1EE:\ +0000000000000000000000000000000200000000000000000000000000000000 + +00000000000000000000000000000000:9A3E66EEBC21BC0BD9430B341EF465FA:\ +0000000000000000000000000000000100000000000000000000000000000000 + +00000000000000000000000000000000:20415035F34B8BCBCB28ABF07F78F0D4:\ +0000000000000000000000000000000080000000000000000000000000000000 + +00000000000000000000000000000000:AC89FC7BA10479EBF10DE65BCEF89B3C:\ +0000000000000000000000000000000040000000000000000000000000000000 + +00000000000000000000000000000000:068FA75A30BE443171AF3F6FEB1A20D2:\ +0000000000000000000000000000000020000000000000000000000000000000 + +00000000000000000000000000000000:50E02F213246C525A8C27700CA34B502:\ +0000000000000000000000000000000010000000000000000000000000000000 + +00000000000000000000000000000000:227DA47D5A0906DB3AB042BB0A695FB6:\ +0000000000000000000000000000000008000000000000000000000000000000 + +00000000000000000000000000000000:8663AC30ED12514F1DE46777F4514BFC:\ +0000000000000000000000000000000004000000000000000000000000000000 + +00000000000000000000000000000000:A987D4BC12E1DE9F4B6DF43567C34A8B:\ +0000000000000000000000000000000002000000000000000000000000000000 + +00000000000000000000000000000000:6D5A0370F599ACA605F63B04E5143D0C:\ +0000000000000000000000000000000001000000000000000000000000000000 + +00000000000000000000000000000000:9809266E378B07B7AFDB3BAA97B7E442:\ +0000000000000000000000000000000000800000000000000000000000000000 + +00000000000000000000000000000000:8F753252B30CCCACE12D9A301F4D5090:\ +0000000000000000000000000000000000400000000000000000000000000000 + +00000000000000000000000000000000:032465F6C0CE34D41962F561692A1AFF:\ +0000000000000000000000000000000000200000000000000000000000000000 + +00000000000000000000000000000000:C50E9AD5BEB8F3B00821DD47FF8AC093:\ +0000000000000000000000000000000000100000000000000000000000000000 + +00000000000000000000000000000000:9C6FEA3D46268D54A6829B2AD25BB276:\ +0000000000000000000000000000000000080000000000000000000000000000 + +00000000000000000000000000000000:0FD8575E87706F561343D7B3A41E044A:\ +0000000000000000000000000000000000040000000000000000000000000000 + +00000000000000000000000000000000:BEE9BEB3739540D88CBCE77925F0A114:\ +0000000000000000000000000000000000020000000000000000000000000000 + +00000000000000000000000000000000:D24EAEE7FFFBAC3D6F26C2DCE0DCDE28:\ +0000000000000000000000000000000000010000000000000000000000000000 + +00000000000000000000000000000000:47771A90398FF0F7FA821C2F8F5E1398:\ +0000000000000000000000000000000000008000000000000000000000000000 + +00000000000000000000000000000000:4639741B6F84B135AD118C8249B64ED0:\ +0000000000000000000000000000000000004000000000000000000000000000 + +00000000000000000000000000000000:8EE5505EC85567697A3306F250A27720:\ +0000000000000000000000000000000000002000000000000000000000000000 + +00000000000000000000000000000000:7C8A19AC1AEFBC5E0119D91A5F05D4C2:\ +0000000000000000000000000000000000001000000000000000000000000000 + +00000000000000000000000000000000:5141B9B672E54773B672E3A6C424887B:\ +0000000000000000000000000000000000000800000000000000000000000000 + +00000000000000000000000000000000:B5A2D3CD206653C6402F34FB0AE3613D:\ +0000000000000000000000000000000000000400000000000000000000000000 + +00000000000000000000000000000000:0F5BD9408738231D114B0A82753279A3:\ +0000000000000000000000000000000000000200000000000000000000000000 + +00000000000000000000000000000000:FEF033FF4268EA487FC74C5E43A45338:\ +0000000000000000000000000000000000000100000000000000000000000000 + +00000000000000000000000000000000:A3EDC09DCD529B113910D904AD855581:\ +0000000000000000000000000000000000000080000000000000000000000000 + +00000000000000000000000000000000:AB8FBB6F27A0AC7C55B59FDD36B72F1C:\ +0000000000000000000000000000000000000040000000000000000000000000 + +00000000000000000000000000000000:EEA44D5ED4D769CC930CD83D8999EC46:\ +0000000000000000000000000000000000000020000000000000000000000000 + +00000000000000000000000000000000:6972276803AE9AA7C6F431AB10979C34:\ +0000000000000000000000000000000000000010000000000000000000000000 + +00000000000000000000000000000000:86DEAA9F39244101818178474D7DBDE9:\ +0000000000000000000000000000000000000008000000000000000000000000 + +00000000000000000000000000000000:88C6B466EA361D662D8D08CBF181F4FE:\ +0000000000000000000000000000000000000004000000000000000000000000 + +00000000000000000000000000000000:91AB2C6B7C63FF59F7CBEEBF91B20B95:\ +0000000000000000000000000000000000000002000000000000000000000000 + +00000000000000000000000000000000:2DFE6C146AD5B3D8C3C1718F13B48E01:\ +0000000000000000000000000000000000000001000000000000000000000000 + +00000000000000000000000000000000:C7CFF1623451711391A302EEC3584AAA:\ +0000000000000000000000000000000000000000800000000000000000000000 + +00000000000000000000000000000000:089FE845CC05011686C66019D18BE050:\ +0000000000000000000000000000000000000000400000000000000000000000 + +00000000000000000000000000000000:08C8410B9B427211A67124B0DCCEAD48:\ +0000000000000000000000000000000000000000200000000000000000000000 + +00000000000000000000000000000000:8D91592F5566085254784606334D7629:\ +0000000000000000000000000000000000000000100000000000000000000000 + +00000000000000000000000000000000:3298FEAAF2E1201D6299FF8846639C97:\ +0000000000000000000000000000000000000000080000000000000000000000 + +00000000000000000000000000000000:C497CB9F0BDFE0EFC8C2F3F90760AA72:\ +0000000000000000000000000000000000000000040000000000000000000000 + +00000000000000000000000000000000:2788AFD046E0309CBE4424690DA2AB89:\ +0000000000000000000000000000000000000000020000000000000000000000 + +00000000000000000000000000000000:E9891707F25EF29FEE372890D4258982:\ +0000000000000000000000000000000000000000010000000000000000000000 + +00000000000000000000000000000000:DB041D94A23D45D4D4DCED5A030CAF61:\ +0000000000000000000000000000000000000000008000000000000000000000 + +00000000000000000000000000000000:FFAFDBF0ECB18DF9EA02C27077448E6D:\ +0000000000000000000000000000000000000000004000000000000000000000 + +00000000000000000000000000000000:2DAAA42A7D0A1D3B0E4761D99CF2150A:\ +0000000000000000000000000000000000000000002000000000000000000000 + +00000000000000000000000000000000:3B7A54CB7CF30ABE263DD6ED5BFE8D63:\ +0000000000000000000000000000000000000000001000000000000000000000 + +00000000000000000000000000000000:EEFA090174C590C448A55D43648F534A:\ +0000000000000000000000000000000000000000000800000000000000000000 + +00000000000000000000000000000000:9E15798731ED42F43EA2740A691DA872:\ +0000000000000000000000000000000000000000000400000000000000000000 + +00000000000000000000000000000000:31FBD661540A5DEAAD1017CFD3909EC8:\ +0000000000000000000000000000000000000000000200000000000000000000 + +00000000000000000000000000000000:CDA9AE05F224140E28CB951721B44D6A:\ +0000000000000000000000000000000000000000000100000000000000000000 + +00000000000000000000000000000000:0C5BC512C60A1EAC3434EFB1A8FBB182:\ +0000000000000000000000000000000000000000000080000000000000000000 + +00000000000000000000000000000000:AA863610DEEEEB62D045E87EA30B59B5:\ +0000000000000000000000000000000000000000000040000000000000000000 + +00000000000000000000000000000000:6AC2448DE568D279C7EEBE1DF403920C:\ +0000000000000000000000000000000000000000000020000000000000000000 + +00000000000000000000000000000000:E2011E3D292B26888AE801215FD0CB40:\ +0000000000000000000000000000000000000000000010000000000000000000 + +00000000000000000000000000000000:E06F3E15EE3A61672D1C99BADE5B9DBE:\ +0000000000000000000000000000000000000000000008000000000000000000 + +00000000000000000000000000000000:BB7027F0548CF6712CEB4C7A4B28E178:\ +0000000000000000000000000000000000000000000004000000000000000000 + +00000000000000000000000000000000:061EC21FB70FADBDF87C3BD2AE23825B:\ +0000000000000000000000000000000000000000000002000000000000000000 + +00000000000000000000000000000000:4C21F26FE94ABBAC381352375314C3EB:\ +0000000000000000000000000000000000000000000001000000000000000000 + +00000000000000000000000000000000:F7CEE6DD99909C2B569EEDA61ED8942E:\ +0000000000000000000000000000000000000000000000800000000000000000 + +00000000000000000000000000000000:CE98C4A876C65E4CCB261EBB1D9DF7F5:\ +0000000000000000000000000000000000000000000000400000000000000000 + +00000000000000000000000000000000:A5491881CF833C3604ABC08044F402AC:\ +0000000000000000000000000000000000000000000000200000000000000000 + +00000000000000000000000000000000:A1BA16E64CCCB3087D57A768507B0BFC:\ +0000000000000000000000000000000000000000000000100000000000000000 + +00000000000000000000000000000000:D55951E202D2949EBD3BE43120C738BF:\ +0000000000000000000000000000000000000000000000080000000000000000 + +00000000000000000000000000000000:EBB8E43069E69F450EFEC65DCD52B7FD:\ +0000000000000000000000000000000000000000000000040000000000000000 + +00000000000000000000000000000000:2B292135663B4AA5ABFE9423D57E7EE9:\ +0000000000000000000000000000000000000000000000020000000000000000 + +00000000000000000000000000000000:E91BF974B3BE3AD966249D8655292A85:\ +0000000000000000000000000000000000000000000000010000000000000000 + +00000000000000000000000000000000:384365998EAA9562236CC58F6ADF9610:\ +0000000000000000000000000000000000000000000000008000000000000000 + +00000000000000000000000000000000:C2E997012AA3D4D8D359C9A947CBE69F:\ +0000000000000000000000000000000000000000000000004000000000000000 + +00000000000000000000000000000000:F49421204148BA213BE87E2D5C22B0BF:\ +0000000000000000000000000000000000000000000000002000000000000000 + +00000000000000000000000000000000:82ED0ED9953AA92E4DF30929CA65C00F:\ +0000000000000000000000000000000000000000000000001000000000000000 + +00000000000000000000000000000000:291EB1D11653C8479437C74A977F5106:\ +0000000000000000000000000000000000000000000000000800000000000000 + +00000000000000000000000000000000:BCB997B1939B8983ABD550D6025683E3:\ +0000000000000000000000000000000000000000000000000400000000000000 + +00000000000000000000000000000000:1FBA2592C6F489775CAADA71F9B983E9:\ +0000000000000000000000000000000000000000000000000200000000000000 + +00000000000000000000000000000000:969F66F217AF1A3DB9E41C1B29039824:\ +0000000000000000000000000000000000000000000000000100000000000000 + +00000000000000000000000000000000:A54BB7D6B17E423AC0A7744C19073CB8:\ +0000000000000000000000000000000000000000000000000080000000000000 + +00000000000000000000000000000000:B0AC6E6578D1021F47DCF9748A32EAD5:\ +0000000000000000000000000000000000000000000000000040000000000000 + +00000000000000000000000000000000:B87B361C3B7B194C77A4358D4669153E:\ +0000000000000000000000000000000000000000000000000020000000000000 + +00000000000000000000000000000000:46A133847F96EAA8282A799DC8899D58:\ +0000000000000000000000000000000000000000000000000010000000000000 + +00000000000000000000000000000000:2265EC3A9F2D5C9547A091CC8CFB18EA:\ +0000000000000000000000000000000000000000000000000008000000000000 + +00000000000000000000000000000000:54CBF3A6FC4FE56D426117AA1FFD1DDE:\ +0000000000000000000000000000000000000000000000000004000000000000 + +00000000000000000000000000000000:5312877CCEAB6CFB0905394A370A8003:\ +0000000000000000000000000000000000000000000000000002000000000000 + +00000000000000000000000000000000:7190BD6EC613FE38B84ECFE28F702FE4:\ +0000000000000000000000000000000000000000000000000001000000000000 + +00000000000000000000000000000000:D1FA5B9CA89A43B04C05F0EF29EF68CD:\ +0000000000000000000000000000000000000000000000000000800000000000 + +00000000000000000000000000000000:808285751548ED934FD1056D2D9AE8BA:\ +0000000000000000000000000000000000000000000000000000400000000000 + +00000000000000000000000000000000:2758DEF3E7B95A9AE89777BE64D5A6CF:\ +0000000000000000000000000000000000000000000000000000200000000000 + +00000000000000000000000000000000:07D81F87DB3E0ACC82B01E08FB22F3C1:\ +0000000000000000000000000000000000000000000000000000100000000000 + +00000000000000000000000000000000:8DA250E5553D650711A75EE1CB4FD1C7:\ +0000000000000000000000000000000000000000000000000000080000000000 + +00000000000000000000000000000000:A93D946BD0E87F32719DF5F158CEE669:\ +0000000000000000000000000000000000000000000000000000040000000000 + +00000000000000000000000000000000:03945236EC2A4D4EAF30B8ABEB54330D:\ +0000000000000000000000000000000000000000000000000000020000000000 + +00000000000000000000000000000000:11CC35301F24B79DDE31AEA2D1354F88:\ +0000000000000000000000000000000000000000000000000000010000000000 + +00000000000000000000000000000000:E73715B3E8D9A290F44AE6FFBF247E5D:\ +0000000000000000000000000000000000000000000000000000008000000000 + +00000000000000000000000000000000:7345E07732B71CB158BBF64CCA5C5B96:\ +0000000000000000000000000000000000000000000000000000004000000000 + +00000000000000000000000000000000:6E128F296D24705A1924FD9B70C4ED04:\ +0000000000000000000000000000000000000000000000000000002000000000 + +00000000000000000000000000000000:95A789776F036783FBD330947083F54F:\ +0000000000000000000000000000000000000000000000000000001000000000 + +00000000000000000000000000000000:360DEC2533EA4AA2E3E54FD3DE2906EB:\ +0000000000000000000000000000000000000000000000000000000800000000 + +00000000000000000000000000000000:E68EFD7FECF4D601EA22727BD764965B:\ +0000000000000000000000000000000000000000000000000000000400000000 + +00000000000000000000000000000000:9065C64A8BFF44AC33EDBB611CF83D7B:\ +0000000000000000000000000000000000000000000000000000000200000000 + +00000000000000000000000000000000:8F33C8DF2A7A51CE8090E8F123BC3723:\ +0000000000000000000000000000000000000000000000000000000100000000 + +00000000000000000000000000000000:807F391FFBA8291BA625623210F99018:\ +0000000000000000000000000000000000000000000000000000000080000000 + +00000000000000000000000000000000:5E8B3F3A701522CE5CAA761C929D6292:\ +0000000000000000000000000000000000000000000000000000000040000000 + +00000000000000000000000000000000:3BA404DC38735A78289E3809E8364835:\ +0000000000000000000000000000000000000000000000000000000020000000 + +00000000000000000000000000000000:D23BEDBAD229F8305DC425B6B759DCC9:\ +0000000000000000000000000000000000000000000000000000000010000000 + +00000000000000000000000000000000:44880F21CF5913040AE376AEE2A10AD8:\ +0000000000000000000000000000000000000000000000000000000008000000 + +00000000000000000000000000000000:9BC98E29D057C0E828C3B5CCE69256C1:\ +0000000000000000000000000000000000000000000000000000000004000000 + +00000000000000000000000000000000:B293CC7A975DA141A68279368057CC41:\ +0000000000000000000000000000000000000000000000000000000002000000 + +00000000000000000000000000000000:8D60FB87ACD91385B313BE5F1D7BD30F:\ +0000000000000000000000000000000000000000000000000000000001000000 + +00000000000000000000000000000000:2C8E56132D70291B303C48FDF75543CD:\ +0000000000000000000000000000000000000000000000000000000000800000 + +00000000000000000000000000000000:D1F80035B826791F6CE4E59B7DB1BB0D:\ +0000000000000000000000000000000000000000000000000000000000400000 + +00000000000000000000000000000000:42CE6224FC36469339A133DD08173BD4:\ +0000000000000000000000000000000000000000000000000000000000200000 + +00000000000000000000000000000000:61817155EA41BCBA2AF7F06AE7CBF585:\ +0000000000000000000000000000000000000000000000000000000000100000 + +00000000000000000000000000000000:D1923A9866068D2EF5FB77D57C3315B6:\ +0000000000000000000000000000000000000000000000000000000000080000 + +00000000000000000000000000000000:B37CBDB5D719F49691CA968EF2E84140:\ +0000000000000000000000000000000000000000000000000000000000040000 + +00000000000000000000000000000000:EC974E653A055D7F8F22171030F68E1D:\ +0000000000000000000000000000000000000000000000000000000000020000 + +00000000000000000000000000000000:DDE5D3B9AAD9C32213BB3675A822499C:\ +0000000000000000000000000000000000000000000000000000000000010000 + +00000000000000000000000000000000:D3B6E9216EA1AE57EB1C628A3C38AB78:\ +0000000000000000000000000000000000000000000000000000000000008000 + +00000000000000000000000000000000:82C99ECC69472B7E96324B042AE8B87A:\ +0000000000000000000000000000000000000000000000000000000000004000 + +00000000000000000000000000000000:97144DC5338C43600F84439C0AA0D147:\ +0000000000000000000000000000000000000000000000000000000000002000 + +00000000000000000000000000000000:400AC4A0BBADA1DB2121EB144C7E5209:\ +0000000000000000000000000000000000000000000000000000000000001000 + +00000000000000000000000000000000:EFD9D550EB419ED278F4885A490AB54C:\ +0000000000000000000000000000000000000000000000000000000000000800 + +00000000000000000000000000000000:2AB7816E149B7C0404C88A8857793670:\ +0000000000000000000000000000000000000000000000000000000000000400 + +00000000000000000000000000000000:5B591DFF9E8DEE15BAD24C025DBCA481:\ +0000000000000000000000000000000000000000000000000000000000000200 + +00000000000000000000000000000000:0C06633E30721C3749F49AD8CBF2B754:\ +0000000000000000000000000000000000000000000000000000000000000100 + +00000000000000000000000000000000:96D6D31A41B5123B2035FD91A921D4CA:\ +0000000000000000000000000000000000000000000000000000000000000080 + +00000000000000000000000000000000:E7F6C34D86668BC2805CA7793C5E86AD:\ +0000000000000000000000000000000000000000000000000000000000000040 + +00000000000000000000000000000000:F46DFF5FF500D6879C4D3E45CF0CF0F3:\ +0000000000000000000000000000000000000000000000000000000000000020 + +00000000000000000000000000000000:60D842D9C61DA7495C116197B7CECBBE:\ +0000000000000000000000000000000000000000000000000000000000000010 + +00000000000000000000000000000000:D45B24EDB673353EBDF248B8FA06B67A:\ +0000000000000000000000000000000000000000000000000000000000000008 + +00000000000000000000000000000000:119EAEBCC165D0BD02C0D35DC82EF992:\ +0000000000000000000000000000000000000000000000000000000000000004 + +00000000000000000000000000000000:E673143680414ADA301D0ED34626B9FE:\ +0000000000000000000000000000000000000000000000000000000000000002 + +00000000000000000000000000000000:6B6CFE160A6263631B292F879EEFF926:\ +0000000000000000000000000000000000000000000000000000000000000001 + +80000000000000000000000000000000:3AD78E726C1EC02B7EBFE92B23D9EC34:\ +00000000000000000000000000000000 + +40000000000000000000000000000000:45BC707D29E8204D88DFBA2F0B0CAD9B:\ +00000000000000000000000000000000 + +20000000000000000000000000000000:161556838018F52805CDBD6202002E3F:\ +00000000000000000000000000000000 + +10000000000000000000000000000000:F5569B3AB6A6D11EFDE1BF0A64C6854A:\ +00000000000000000000000000000000 + +08000000000000000000000000000000:64E82B50E501FBD7DD4116921159B83E:\ +00000000000000000000000000000000 + +04000000000000000000000000000000:BAAC12FB613A7DE11450375C74034041:\ +00000000000000000000000000000000 + +02000000000000000000000000000000:BCF176A7EAAD8085EBACEA362462A281:\ +00000000000000000000000000000000 + +01000000000000000000000000000000:47711816E91D6FF059BBBF2BF58E0FD3:\ +00000000000000000000000000000000 + +00800000000000000000000000000000:B970DFBE40698AF1638FE38BD3DF3B2F:\ +00000000000000000000000000000000 + +00400000000000000000000000000000:F95B59A44F391E14CF20B74BDC32FCFF:\ +00000000000000000000000000000000 + +00200000000000000000000000000000:720F74AE04A2A435B9A7256E49378F5B:\ +00000000000000000000000000000000 + +00100000000000000000000000000000:2A0445F61D36BFA7E277070730CF76DA:\ +00000000000000000000000000000000 + +00080000000000000000000000000000:8D0536B997AEFEC1D94011BAB6699A03:\ +00000000000000000000000000000000 + +00040000000000000000000000000000:674F002E19F6ED47EFF319E51FAD4498:\ +00000000000000000000000000000000 + +00020000000000000000000000000000:292C02C5CB9163C80AC0F6CF1DD8E92D:\ +00000000000000000000000000000000 + +00010000000000000000000000000000:FA321CF18EF5FE727DD82A5C1E945141:\ +00000000000000000000000000000000 + +00008000000000000000000000000000:A5A7AFE1034C39CCCEBE3C584BC0BE05:\ +00000000000000000000000000000000 + +00004000000000000000000000000000:4FF5A52E697E77D081205DBDB21CEA39:\ +00000000000000000000000000000000 + +00002000000000000000000000000000:209E88DC94C9003000CE0769AF7B7166:\ +00000000000000000000000000000000 + +00001000000000000000000000000000:5DEE41AF864CB4B650E5F51551824D38:\ +00000000000000000000000000000000 + +00000800000000000000000000000000:A79A63FA7E4503AE6D6E09F5F9053030:\ +00000000000000000000000000000000 + +00000400000000000000000000000000:A48316749FAE7FAC7002031A6AFD8BA7:\ +00000000000000000000000000000000 + +00000200000000000000000000000000:D6EEE8A7357A0E1D64262CA9C337AC42:\ +00000000000000000000000000000000 + +00000100000000000000000000000000:B013CA8A62A858053E9FB667ED39829E:\ +00000000000000000000000000000000 + +00000080000000000000000000000000:DF6EA9E4538A45A52D5C1A43C88F4B55:\ +00000000000000000000000000000000 + +00000040000000000000000000000000:7D03BA451371591D3FD5547D9165C73B:\ +00000000000000000000000000000000 + +00000020000000000000000000000000:0E0426281A6277E186499D365D5F49FF:\ +00000000000000000000000000000000 + +00000010000000000000000000000000:DBC02169DD2059E6CC4C57C1FEDF5AB4:\ +00000000000000000000000000000000 + +00000008000000000000000000000000:826590E05D167DA6F00DCC75E22788EB:\ +00000000000000000000000000000000 + +00000004000000000000000000000000:34A73F21A04421D9786335FAAB49423A:\ +00000000000000000000000000000000 + +00000002000000000000000000000000:ED347D0E0128EE1A7392A1D36AB78AA9:\ +00000000000000000000000000000000 + +00000001000000000000000000000000:EE944B2FE6E9FC888042608DA9615F75:\ +00000000000000000000000000000000 + +00000000800000000000000000000000:9E7C85A909EF7218BA7947CFB4718F46:\ +00000000000000000000000000000000 + +00000000400000000000000000000000:811AE07A0B2B1F816587FA73699AE77D:\ +00000000000000000000000000000000 + +00000000200000000000000000000000:68466FBF43C2FE13D4B18F7EC5EA745F:\ +00000000000000000000000000000000 + +00000000100000000000000000000000:D20B015C7191B219780956E6101F9354:\ +00000000000000000000000000000000 + +00000000080000000000000000000000:5939D5C1BBF54EE1B3E326D757BDDE25:\ +00000000000000000000000000000000 + +00000000040000000000000000000000:B1FDAFE9A0240E8FFEA19CE94B5105D3:\ +00000000000000000000000000000000 + +00000000020000000000000000000000:D62962ECE02CDD68C06BDFEFB2F9495B:\ +00000000000000000000000000000000 + +00000000010000000000000000000000:B3BB2DE6F3C26587BA8BAC4F7AD9499A:\ +00000000000000000000000000000000 + +00000000008000000000000000000000:E0B1072D6D9FF703D6FBEF77852B0A6B:\ +00000000000000000000000000000000 + +00000000004000000000000000000000:D8DD51C907F478DE0228E83E61FD1758:\ +00000000000000000000000000000000 + +00000000002000000000000000000000:A42DFFE6E7C1671C06A25236FDD10017:\ +00000000000000000000000000000000 + +00000000001000000000000000000000:25ACF141550BFAB9EF451B6C6A5B2163:\ +00000000000000000000000000000000 + +00000000000800000000000000000000:4DA7FCA3949B16E821DBC84F19581018:\ +00000000000000000000000000000000 + +00000000000400000000000000000000:7D49B6347CBCC8919C7FA96A37A7A215:\ +00000000000000000000000000000000 + +00000000000200000000000000000000:900024B29A08C6721B95BA3B753DDB4D:\ +00000000000000000000000000000000 + +00000000000100000000000000000000:6D2182FB283B6934D90BA7848CAB5E66:\ +00000000000000000000000000000000 + +00000000000080000000000000000000:F73EF01B448D23A4D90DE8B2F9666E7A:\ +00000000000000000000000000000000 + +00000000000040000000000000000000:4AD9CDA2418643E9A3D926AF5E6B0412:\ +00000000000000000000000000000000 + +00000000000020000000000000000000:7CAEC8E7E5953997D545B033201C8C5B:\ +00000000000000000000000000000000 + +00000000000010000000000000000000:3C43CA1F6B6864503E27B48D88230CF5:\ +00000000000000000000000000000000 + +00000000000008000000000000000000:44F779B93108FE9FEEC880D79BA74488:\ +00000000000000000000000000000000 + +00000000000004000000000000000000:9E50E8D9CFD3A682A78E527C9072A1CF:\ +00000000000000000000000000000000 + +00000000000002000000000000000000:68D000CBC838BBE3C505D6F814C01F28:\ +00000000000000000000000000000000 + +00000000000001000000000000000000:2CB2A9FEC1ACD1D9B0FA05205E304F57:\ +00000000000000000000000000000000 + +00000000000000800000000000000000:01EB2806606E46444520A5CC6180CD4B:\ +00000000000000000000000000000000 + +00000000000000400000000000000000:DAA9B25168CC702326F217F1A0C0B162:\ +00000000000000000000000000000000 + +00000000000000200000000000000000:3E07E648975D9578D03555B1755807ED:\ +00000000000000000000000000000000 + +00000000000000100000000000000000:0B45F52E802C8B8DE09579425B80B711:\ +00000000000000000000000000000000 + +00000000000000080000000000000000:659595DA0B68F6DF0DD6CA77202986E1:\ +00000000000000000000000000000000 + +00000000000000040000000000000000:05FF42873893536E58C8FA98A45C73C4:\ +00000000000000000000000000000000 + +00000000000000020000000000000000:B5B03421DE8BBFFC4EADEC767339A9BD:\ +00000000000000000000000000000000 + +00000000000000010000000000000000:788BCD111ECF73D4E78D2E21BEF55460:\ +00000000000000000000000000000000 + +00000000000000008000000000000000:909CD9EC6790359F982DC6F2393D5315:\ +00000000000000000000000000000000 + +00000000000000004000000000000000:332950F361535FF24EFAC8C76293F12C:\ +00000000000000000000000000000000 + +00000000000000002000000000000000:A68CCD4E330FFDA9D576DA436DB53D75:\ +00000000000000000000000000000000 + +00000000000000001000000000000000:27C8A1CCFDB0B015D1ED5B3E77143791:\ +00000000000000000000000000000000 + +00000000000000000800000000000000:D76A4B95887A77DF610DD3E1D3B20325:\ +00000000000000000000000000000000 + +00000000000000000400000000000000:C068AB0DE71C66DAE83C361EF4B2D989:\ +00000000000000000000000000000000 + +00000000000000000200000000000000:C2120BCD49EDA9A288B3B4BE79AC8158:\ +00000000000000000000000000000000 + +00000000000000000100000000000000:0C546F62BF2773CD0F564FCECA7BA688:\ +00000000000000000000000000000000 + +00000000000000000080000000000000:18F3462BEDE4920213CCB66DAB1640AA:\ +00000000000000000000000000000000 + +00000000000000000040000000000000:FE42F245EDD0E24B216AEBD8B392D690:\ +00000000000000000000000000000000 + +00000000000000000020000000000000:3D3EEBC8D3D1558A194C2D00C337FF2B:\ +00000000000000000000000000000000 + +00000000000000000010000000000000:29AAEDF043E785DB42836F79BE6CBA28:\ +00000000000000000000000000000000 + +00000000000000000008000000000000:215F90C6744E2944358E78619159A611:\ +00000000000000000000000000000000 + +00000000000000000004000000000000:8606B1AA9E1D548E5442B06551E2C6DC:\ +00000000000000000000000000000000 + +00000000000000000002000000000000:987BB4B8740EC0EDE7FEA97DF033B5B1:\ +00000000000000000000000000000000 + +00000000000000000001000000000000:C0A3500DA5B0AE07D2F450930BEEDF1B:\ +00000000000000000000000000000000 + +00000000000000000000800000000000:525FDF8312FE8F32C781481A8DAAAE37:\ +00000000000000000000000000000000 + +00000000000000000000400000000000:BFD2C56AE5FB9C9DE33A6944572A6487:\ +00000000000000000000000000000000 + +00000000000000000000200000000000:7975A57A425CDF5AA1FA929101F650B0:\ +00000000000000000000000000000000 + +00000000000000000000100000000000:BF174BC49609A8709B2CD8366DAA79FE:\ +00000000000000000000000000000000 + +00000000000000000000080000000000:06C50C43222F56C874B1704E9F44BF7D:\ +00000000000000000000000000000000 + +00000000000000000000040000000000:0CEC48CD34043EA29CA3B8ED5278721E:\ +00000000000000000000000000000000 + +00000000000000000000020000000000:9548EA34A1560197B304D0ACB8A1698D:\ +00000000000000000000000000000000 + +00000000000000000000010000000000:22F9E9B1BD73B6B5B7D3062C986272F3:\ +00000000000000000000000000000000 + +00000000000000000000008000000000:FEE8E934BD0873295059002230E298D4:\ +00000000000000000000000000000000 + +00000000000000000000004000000000:1B08E2E3EB820D139CB4ABBDBE81D00D:\ +00000000000000000000000000000000 + +00000000000000000000002000000000:0021177681E4D90CEAF69DCED0145125:\ +00000000000000000000000000000000 + +00000000000000000000001000000000:4A8E314452CA8A8A3619FC54BC423643:\ +00000000000000000000000000000000 + +00000000000000000000000800000000:65047474F7222C94C6965425FF1BFD0A:\ +00000000000000000000000000000000 + +00000000000000000000000400000000:E123F551A9C4A8489622B16F961A9AA4:\ +00000000000000000000000000000000 + +00000000000000000000000200000000:EF05530948B80915028BB2B6FE429380:\ +00000000000000000000000000000000 + +00000000000000000000000100000000:72535B7FE0F0F777CEDCD55CD77E2DDF:\ +00000000000000000000000000000000 + +00000000000000000000000080000000:3423D8EFC31FA2F4C365C77D8F3B5C63:\ +00000000000000000000000000000000 + +00000000000000000000000040000000:DE0E51C264663F3C5DBC59580A98D8E4:\ +00000000000000000000000000000000 + +00000000000000000000000020000000:B2D9391166680947AB09264156719679:\ +00000000000000000000000000000000 + +00000000000000000000000010000000:10DB79F23B06D263835C424AF749ADB7:\ +00000000000000000000000000000000 + +00000000000000000000000008000000:DDF72D27E6B01EC107EA3E005B59563B:\ +00000000000000000000000000000000 + +00000000000000000000000004000000:8266B57485A5954A4236751DE07F6694:\ +00000000000000000000000000000000 + +00000000000000000000000002000000:669A501E1F1ADE6E5523DE01D6DBC987:\ +00000000000000000000000000000000 + +00000000000000000000000001000000:C20C48F2989725D461D1DB589DC0896E:\ +00000000000000000000000000000000 + +00000000000000000000000000800000:DE35158E7810ED1191825D2AA98FA97D:\ +00000000000000000000000000000000 + +00000000000000000000000000400000:4FE294F2C0F34D0671B693A237EBDDC8:\ +00000000000000000000000000000000 + +00000000000000000000000000200000:087AE74B10CCBFDF6739FEB9559C01A4:\ +00000000000000000000000000000000 + +00000000000000000000000000100000:5DC278970B7DEF77A5536C77AB59C207:\ +00000000000000000000000000000000 + +00000000000000000000000000080000:7607F078C77085184EAA9B060C1FBFFF:\ +00000000000000000000000000000000 + +00000000000000000000000000040000:9DB841531BCBE7998DAD19993FB3CC00:\ +00000000000000000000000000000000 + +00000000000000000000000000020000:D6A089B654854A94560BAE13298835B8:\ +00000000000000000000000000000000 + +00000000000000000000000000010000:E1E223C4CF90CC5D195B370D65114622:\ +00000000000000000000000000000000 + +00000000000000000000000000008000:1CBED73C50D053BDAD372CEEE54836A1:\ +00000000000000000000000000000000 + +00000000000000000000000000004000:D309E69376D257ADF2BFDA152B26555F:\ +00000000000000000000000000000000 + +00000000000000000000000000002000:740F7649117F0DEE6EAA7789A9994C36:\ +00000000000000000000000000000000 + +00000000000000000000000000001000:76AE64417C297184D668C5FD908B3CE5:\ +00000000000000000000000000000000 + +00000000000000000000000000000800:6095FEA4AA8035591F1787A819C48787:\ +00000000000000000000000000000000 + +00000000000000000000000000000400:D1FF4E7ACD1C79967FEBAB0F7465D450:\ +00000000000000000000000000000000 + +00000000000000000000000000000200:5F5AD3C42B9489557BB63BF49ECF5F8A:\ +00000000000000000000000000000000 + +00000000000000000000000000000100:FB56CC09B680B1D07C5A52149E29F07C:\ +00000000000000000000000000000000 + +00000000000000000000000000000080:FF49B8DF4A97CBE03833E66197620DAD:\ +00000000000000000000000000000000 + +00000000000000000000000000000040:5E070ADE533D2E090ED0F5BE13BC0983:\ +00000000000000000000000000000000 + +00000000000000000000000000000020:3AB4FB1D2B7BA376590A2C241D1F508D:\ +00000000000000000000000000000000 + +00000000000000000000000000000010:58B2431BC0BEDE02550F40238969EC78:\ +00000000000000000000000000000000 + +00000000000000000000000000000008:0253786E126504F0DAB90C48A30321DE:\ +00000000000000000000000000000000 + +00000000000000000000000000000004:200211214E7394DA2089B6ACD093ABE0:\ +00000000000000000000000000000000 + +00000000000000000000000000000002:0388DACE60B6A392F328C2B971B2FE78:\ +00000000000000000000000000000000 + +00000000000000000000000000000001:58E2FCCEFA7E3061367F1D57A4E7455A:\ +00000000000000000000000000000000 + +80000000000000000000000000000000:6CD02513E8D4DC986B4AFE087A60BD0C:\ +000000000000000000000000000000000000000000000000 + +40000000000000000000000000000000:423D2772A0CA56DAABB48D2129062987:\ +000000000000000000000000000000000000000000000000 + +20000000000000000000000000000000:1021F2A8DA70EB2219DC16804445FF98:\ +000000000000000000000000000000000000000000000000 + +10000000000000000000000000000000:C636E35B402577F96974D8804295EBB8:\ +000000000000000000000000000000000000000000000000 + +08000000000000000000000000000000:1566D2E57E8393C19E29F892EA28A9A7:\ +000000000000000000000000000000000000000000000000 + +04000000000000000000000000000000:883C878FED70B36CC09D040F9619DD19:\ +000000000000000000000000000000000000000000000000 + +02000000000000000000000000000000:06734593A974965790E715594FC34AA9:\ +000000000000000000000000000000000000000000000000 + +01000000000000000000000000000000:F19B389948D9A45534E5BD36C984134A:\ +000000000000000000000000000000000000000000000000 + +00800000000000000000000000000000:D8410DFC14FA6D175EC968EA8CAC514C:\ +000000000000000000000000000000000000000000000000 + +00400000000000000000000000000000:7E6C6EBB4029A177CF7B2FDD9AC6BB7A:\ +000000000000000000000000000000000000000000000000 + +00200000000000000000000000000000:4B51DD4850DC0A6C3A46D924003D2C27:\ +000000000000000000000000000000000000000000000000 + +00100000000000000000000000000000:2E510A9D917B15BE32A192B12A668F23:\ +000000000000000000000000000000000000000000000000 + +00080000000000000000000000000000:88F6F79962B0FB77FEA8E7C632D3108E:\ +000000000000000000000000000000000000000000000000 + +00040000000000000000000000000000:A3A35AB1D88DAF07B52794A0F065383A:\ +000000000000000000000000000000000000000000000000 + +00020000000000000000000000000000:DC6CC878433E2B3BB193049A4ECBFC53:\ +000000000000000000000000000000000000000000000000 + +00010000000000000000000000000000:EFCD3763EB7B1A415938248A9A5B4FD5:\ +000000000000000000000000000000000000000000000000 + +00008000000000000000000000000000:AB7E9FB9A66DBE5BB44854F07D9015EE:\ +000000000000000000000000000000000000000000000000 + +00004000000000000000000000000000:8B8E9D3365F8F6743ECF7E33E99255A4:\ +000000000000000000000000000000000000000000000000 + +00002000000000000000000000000000:54D37B4F176FF3D8F6AFC866066D8572:\ +000000000000000000000000000000000000000000000000 + +00001000000000000000000000000000:E83310889480FBF3C00342E3126D0D02:\ +000000000000000000000000000000000000000000000000 + +00000800000000000000000000000000:D321AB2511F92F098174AA2DE6E85DA2:\ +000000000000000000000000000000000000000000000000 + +00000400000000000000000000000000:D8E3F40B1112D5149D58C481DFA9983F:\ +000000000000000000000000000000000000000000000000 + +00000200000000000000000000000000:2454C4E0806639DDF19854D6C68054AD:\ +000000000000000000000000000000000000000000000000 + +00000100000000000000000000000000:A5506D410F7CA32F3955DD79D9D09418:\ +000000000000000000000000000000000000000000000000 + +00000080000000000000000000000000:7908EE40677699568A7DC1AA317C7E4E:\ +000000000000000000000000000000000000000000000000 + +00000040000000000000000000000000:B4B7B29DD43B2F5CF765E25192273982:\ +000000000000000000000000000000000000000000000000 + +00000020000000000000000000000000:92AFE9668159BEFFE2A86F8503260164:\ +000000000000000000000000000000000000000000000000 + +00000010000000000000000000000000:5C36A232FBA6D187A84657AD4028B18F:\ +000000000000000000000000000000000000000000000000 + +00000008000000000000000000000000:A2E994DFAB3A798DF8F54F6DA87E58E2:\ +000000000000000000000000000000000000000000000000 + +00000004000000000000000000000000:6CDAB10A72ADF77D71D0765BAAE95631:\ +000000000000000000000000000000000000000000000000 + +00000002000000000000000000000000:9FE3C801BCAAF7BB800F2E6BF3278E21:\ +000000000000000000000000000000000000000000000000 + +00000001000000000000000000000000:B459D90D9A6C392E5493BC91CF5A0863:\ +000000000000000000000000000000000000000000000000 + +00000000800000000000000000000000:0518A9FA5007F6787E0FB4E5AC27D758:\ +000000000000000000000000000000000000000000000000 + +00000000400000000000000000000000:BED9795415D28599700ED7952384A963:\ +000000000000000000000000000000000000000000000000 + +00000000200000000000000000000000:F0140421173D60251EF6CAB0229B1B50:\ +000000000000000000000000000000000000000000000000 + +00000000100000000000000000000000:460EB4652B3F6779EA28CB11B37529ED:\ +000000000000000000000000000000000000000000000000 + +00000000080000000000000000000000:C4283D351C960A6AC13CD19CCF03AE38:\ +000000000000000000000000000000000000000000000000 + +00000000040000000000000000000000:6815A10047B2C834A798EBDCC6786C75:\ +000000000000000000000000000000000000000000000000 + +00000000020000000000000000000000:99BA19F0CDD5990D0386B32CE56C9C4C:\ +000000000000000000000000000000000000000000000000 + +00000000010000000000000000000000:DE76F62C61E07915162DA13E79679DEC:\ +000000000000000000000000000000000000000000000000 + +00000000008000000000000000000000:DD0325D6854803D06D1D2277D5FB8D67:\ +000000000000000000000000000000000000000000000000 + +00000000004000000000000000000000:580B71A41DE37D6FAC83CCB0B3BB1C97:\ +000000000000000000000000000000000000000000000000 + +00000000002000000000000000000000:E9B1AB470A1B02EF0FF5E6754A092C96:\ +000000000000000000000000000000000000000000000000 + +00000000001000000000000000000000:8590620F5AF5993B7410282F4126BC1F:\ +000000000000000000000000000000000000000000000000 + +00000000000800000000000000000000:8D4914D2F1B22B2E268E66E532D29D7C:\ +000000000000000000000000000000000000000000000000 + +00000000000400000000000000000000:FD826CE48E62C5E30867044B86BA4B56:\ +000000000000000000000000000000000000000000000000 + +00000000000200000000000000000000:100E7B831C9F35FA1271F5F1316C6FCF:\ +000000000000000000000000000000000000000000000000 + +00000000000100000000000000000000:0A2DD0C17F68B996AA96C007003D0B31:\ +000000000000000000000000000000000000000000000000 + +00000000000080000000000000000000:C95F68C57E06B0A2E1F623C83C5D80BF:\ +000000000000000000000000000000000000000000000000 + +00000000000040000000000000000000:571CAFC92C7C8A5EC54C0741E186905C:\ +000000000000000000000000000000000000000000000000 + +00000000000020000000000000000000:22514353E95312C112255E1EED0B2DF6:\ +000000000000000000000000000000000000000000000000 + +00000000000010000000000000000000:791A8BF462BD17580BD9152C6D11C6C5:\ +000000000000000000000000000000000000000000000000 + +00000000000008000000000000000000:5882A0178D548F84A165DB809C60DC28:\ +000000000000000000000000000000000000000000000000 + +00000000000004000000000000000000:3CE4A90EED4458CA6039E42DDADB71C3:\ +000000000000000000000000000000000000000000000000 + +00000000000002000000000000000000:D3CBAB261207A16BE2751E77044FD7C9:\ +000000000000000000000000000000000000000000000000 + +00000000000001000000000000000000:24E32B698A7B32217093628B01F424AB:\ +000000000000000000000000000000000000000000000000 + +00000000000000800000000000000000:9F6AFC0AF27CF565110C77E3C24F4F5B:\ +000000000000000000000000000000000000000000000000 + +00000000000000400000000000000000:E088AA5CDA20EF267BB039B00C72C45B:\ +000000000000000000000000000000000000000000000000 + +00000000000000200000000000000000:5CF1018B7E0BA1775601C2E279900360:\ +000000000000000000000000000000000000000000000000 + +00000000000000100000000000000000:3B1A7388B89FB9416AD8753CF5AF35D2:\ +000000000000000000000000000000000000000000000000 + +00000000000000080000000000000000:137FA4ED00AFCD9F5D8BC0D14BD5837A:\ +000000000000000000000000000000000000000000000000 + +00000000000000040000000000000000:806F5C9B663559BB56F234881E4A3E60:\ +000000000000000000000000000000000000000000000000 + +00000000000000020000000000000000:8069A449152292DF2DE8642992C632B6:\ +000000000000000000000000000000000000000000000000 + +00000000000000010000000000000000:37C6CF2A1ABD1B1F1922B46C7B4A280D:\ +000000000000000000000000000000000000000000000000 + +00000000000000008000000000000000:7A2835260E5A0AA2B5DC301800EC8438:\ +000000000000000000000000000000000000000000000000 + +00000000000000004000000000000000:EE81FAF2F9058213FFCACF281CB8509E:\ +000000000000000000000000000000000000000000000000 + +00000000000000002000000000000000:57F22D93C37129BA331FDBA38E005A1E:\ +000000000000000000000000000000000000000000000000 + +00000000000000001000000000000000:EC798782E87B7D9F780CC3C3A46519B5:\ +000000000000000000000000000000000000000000000000 + +00000000000000000800000000000000:43EA28497F5D40E3A4744FA2EDAA42DE:\ +000000000000000000000000000000000000000000000000 + +00000000000000000400000000000000:91F004E7DEBF41B3414DD8C5C317372C:\ +000000000000000000000000000000000000000000000000 + +00000000000000000200000000000000:C249EAE54E7B4DF43B938C1B4CC28314:\ +000000000000000000000000000000000000000000000000 + +00000000000000000100000000000000:32C289D7EEFB99D2F17AD7B7D45FE1EC:\ +000000000000000000000000000000000000000000000000 + +00000000000000000080000000000000:A675FB2E8DDBF810CEF01CF2B728CD2B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000040000000000000:A418AAAB6E6921CC731AA8A349386080:\ +000000000000000000000000000000000000000000000000 + +00000000000000000020000000000000:2E2B0F44863E67D9B0215C4ABD60417F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000010000000000000:F0AF7CB19E911D481F6426DAEFDD2240:\ +000000000000000000000000000000000000000000000000 + +00000000000000000008000000000000:CB1304DAAA2DF6878F56AC2E0F887E04:\ +000000000000000000000000000000000000000000000000 + +00000000000000000004000000000000:B1B70A7E6A0CD1916D9B78BEA19084AE:\ +000000000000000000000000000000000000000000000000 + +00000000000000000002000000000000:0CDE9F9BE646A5FCE3436B794A9CFC65:\ +000000000000000000000000000000000000000000000000 + +00000000000000000001000000000000:68C7946D476A0A36674B36AFD7E5DF33:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000800000000000:48770159A07DD8DFFF06C80105F8D57C:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000400000000000:665E62801B3260E3C45BD3BE34DFDEBE:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000200000000000:4159C1F686BFBE5B0E50BDB0DA532B69:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000100000000000:6333100A5A4AD917DC2D4E78A04869A3:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000080000000000:866A4519AB1D199F25886B89D0539ACC:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000040000000000:EC0CFD37E4CBC7E8BE385283F7AEA75A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000020000000000:CA2F383AACCA0810AA13F3E710621422:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000010000000000:1D0EEF6870444F950937831EC0A55D98:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000008000000000:37839B35ED6801E7670496D479A95017:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000004000000000:02317C8C7098C4F94AB867AC7A49DD8D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000002000000000:FFB4CB4E3F7F8BF3367EBD43236518B4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000001000000000:36BEDEF1E4AA3E4A40A305741713FCBF:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000800000000:B2DFE3C4870269C1E3FEEC39161540D9:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000400000000:147EF2518AD45DA0026056ECBF6A3DFA:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000200000000:027A75E4DE635790E47ACE90D7928804:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000100000000:C4CF3CCB59BF87D0AFBD629F48CFBB7B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000080000000:35165C93F564C97E1C32EF97E8151A87:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000040000000:449DE37F7D5A1BBD628ABBE7E061701D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000020000000:B1D45EAF218F1799B149BAD677FE129F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000010000000:BE08AC6DB6BD0583AA9D2ABC71C73DCD:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000008000000:BCC835BD3DF1A79E4C7C145B899A5C25:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000004000000:3D311EA611FF5AF371301C58A8E9912D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000002000000:A5A1BEA594ACC7CA80F09EA5ADDB5C71:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000001000000:0F09492429FE7222D6CD8190D9F2FFBF:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000800000:816D2220A16B8AAEE71364FD43636C6F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000400000:D7E8702408419ED73191B107EAF75A0B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000200000:9B170EFB1E235B433C78E276BEA082F0:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000100000:03BBECC5598AE974430F29395522F096:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000080000:DB53517766C0E8CF42059607CBA89380:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000040000:2E2AF4B7931F0AEFFAC5471148A5BB97:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000020000:C872C0408266403B984F635FF5683DE4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000010000:15DCF750B0E3A68AD1F4EFD07E8967B4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000008000:B41092048E9E6A749F6FD8CE515A23A3:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000004000:4DA9267D62507994312BD5C99ADDE730:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000002000:9E2FCA6D1D626E9C6A924EBF7DBF618A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000001000:E092E8D7EF2C2465AEFB2493C3063590:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000800:1C0E58DA37D1068378A88DBE2EDE4E10:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000400:19063F854232B8509A6A3A6D46809959:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000200:447FB09E54EFA285F7530F25C4EA0022:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000100:F6ABE86321BE40E1FBFDAFED37CC1D9B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000080:4E8506CD006666341D6CF51F98B41F35:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000040:53995DE0009CA18BECAFB8307C54C14C:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000020:2006BF99F4C58B6CC2627856593FAEEA:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000010:2DA697D2737CB30B744A4644FA1CBC6E:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000008:47A22ACDB60C3A986A8F76ECD0EA3433:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000004:FDAA17C2CDE20268FE36E164EA532151:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000002:98E7247C07F0FE411C267E4384B0F600:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000001:CD33B28AC773F74BA00ED1F312572435:\ +000000000000000000000000000000000000000000000000 + +80000000000000000000000000000000:DDC6BF790C15760D8D9AEB6F9A75FD4E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +40000000000000000000000000000000:C7098C217C334D0C9BDF37EA13B0822C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +20000000000000000000000000000000:60F0FB0D4C56A8D4EEFEC5264204042D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +10000000000000000000000000000000:73376FBBF654D0686E0E84001477106B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +08000000000000000000000000000000:2F443B52BA5F0C6EA0602C7C4FD259B6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +04000000000000000000000000000000:75D11B0E3A68C4223D88DBF017977DD7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +02000000000000000000000000000000:779B38D15BFFB63D8D609D551A5CC98E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +01000000000000000000000000000000:5275F3D86B4FB8684593133EBFA53CD3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00800000000000000000000000000000:1CEF2074B336CEC62F12DEA2F6AB1481:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00400000000000000000000000000000:1AEF5ABBAD9D7160874578DCD8BAE172:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00200000000000000000000000000000:46C525DB17E72F26BF03216846B6F609:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00100000000000000000000000000000:E24411F941BBE08788781E3EC52CBAA4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00080000000000000000000000000000:83A3DEDD1DD27018F6A6477E40527581:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00040000000000000000000000000000:B68F8A2CDBAB0C923C67FC8F0F1087DE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00020000000000000000000000000000:649944A70C32BF87A7409E7AE128FDE8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00010000000000000000000000000000:2846526D67387539C89314DE9E0C2D02:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00008000000000000000000000000000:A9A0B8402E53C70DD1688054BA58DDFD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00004000000000000000000000000000:4A72E6E1B79C83AC4BE3EBA5699EED48:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00002000000000000000000000000000:B0E36B867BA4FF2B77D0614B0E364E4C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00001000000000000000000000000000:49B57DE141F6418E3090F24DDD4014B6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000800000000000000000000000000:A6C0D5B9797258E1987AC5F6CD20146D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000400000000000000000000000000:426CF4BDCAA369175965D26E7C71EEA2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000200000000000000000000000000:E27F484CE54BC99BC1A52BDA3B518A26:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000100000000000000000000000000:D16D186284C7E6EE64B8104E0EF20BA5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000080000000000000000000000000:6431F8538AD54E1E044A9F71F8EF556B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000040000000000000000000000000:ECD57CEB451D27EB96C55B2042257E8E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000020000000000000000000000000:4F0F188DC911B1954AFBC734C9F68872:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000010000000000000000000000000:B54DEF0337626B65614E81EDFDE620F3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000008000000000000000000000000:6655D8074CAE0B90B0D3A3FE72D4D9DB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000004000000000000000000000000:C6B74B6B9EB4FC0C9A237DB1B616D09A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000002000000000000000000000000:D7B5D076EA56EC2B20791D7AD51CCF8F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000001000000000000000000000000:FE160C224BF003CE3BDDC90CB52ED22C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000800000000000000000000000:5E00DA9BA94B5EC0D258D8A8002E0F6A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000400000000000000000000000:09AC6DCFF4DACFF1651E2BA212A292A3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000200000000000000000000000:B283617E318D99AF83A05D9810BA89F7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000100000000000000000000000:0B5F70CCB40B0EF2538AE9B4A9770B35:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000080000000000000000000000:43282BF180248FB517839B37F4DDAAE4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000040000000000000000000000:DDBD534C8B2E6D30A268F88C55AD765B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000020000000000000000000000:A41A164E50EC2D9F175E752B755E0B5C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000010000000000000000000000:37BFF99FF2F7AA97779E4ADF6F13FB10:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000008000000000000000000000:9BA4F7BD298152903A683C4CEC669216:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000004000000000000000000000:5FB750C7CE10DE7B4504248914D0DA06:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000002000000000000000000000:3E748BFA108E086F51D56EC74A9E0FB9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000001000000000000000000000:31D4E56B99F5B73C1B8437DF332AFB98:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000800000000000000000000:9DC6717B84FC55D266E7B1D9B5C52A5F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000400000000000000000000:8EF8BA007F23C0A50FC120E07041BCCD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000200000000000000000000:C58F38E1839FC1918A12B8C9E88C66B6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000100000000000000000000:B695D72A3FCF508C4050E12E40061C2D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000080000000000000000000:5D2736AD478A50583BC8C11BEFF16D7A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000040000000000000000000:DF0EACA8F17847AD41F9578F14C7B56B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000020000000000000000000:E5AA14AD48AD0A3C47CC35D5F8020E51:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000010000000000000000000:11BE6C8F58EBD8CEF1A53F591A68E8CE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000008000000000000000000:ECFE7BAFCBF42C1FEE015488770B3053:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000004000000000000000000:E552649F8D8EC4A1E1CD6DF50B6E6777:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000002000000000000000000:521C0629DE93B9119CDB1DDC5809DDEA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000001000000000000000000:CB38A62A0BAB1784156BA038CBA99BF6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000800000000000000000:76CCEE8AAACD394DE1EEF3DDA10CB54B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000400000000000000000:6AFF910FA1D5673140E2DB59B8416049:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000200000000000000000:064A12C0EF73FB386801BF4F35F3120D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000100000000000000000:2240E374929D5B1BB8FF0FFDDDF640EC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000080000000000000000:D4BA15C904C7692185DE85C02052E180:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000040000000000000000:1714A315AB0166728A44CD91D4AE9018:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000020000000000000000:6C970BDD9F0E222722EA31A1D12DD0AD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000010000000000000000:F5956EDF02BD36A401BBB6CE77C3D3FB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000008000000000000000:0CA11F122CCD7C259DC597EED3DF9BC4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000004000000000000000:50109AB4912AD2560B206F331B62EB6C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000002000000000000000:DBE7C91A4175614889A2D4BEFD64845E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000001000000000000000:0D3322853A571A6B46B79C0228E0DD25:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000800000000000000:96E4EE0BB9A11C6FB8522F285BADDEB6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000400000000000000:96705C52D2CFCE82E630C93477C79C49:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000200000000000000:C50130AED6A126149D71F3888C83C232:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000100000000000000:4816EFE3DEB380566EBA0C17BF582090:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000080000000000000:0390857B4C8C98E4CF7A2B6F3394C507:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000040000000000000:422E73A02025EBE8B8B5D6E0FA24FCB2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000020000000000000:3271AA7F4BF1D7C38050A43076D4FF76:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000010000000000000:D2074946F0D37B8975607BFC2E70234C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000008000000000000:1A509194C1270AB92E5A42D3A9F8D98B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000004000000000000:512438946360CCC4A5C6D73F6EED7130:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000002000000000000:98CFCDEC46EBEA1A286B3004F2746A0D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000001000000000000:A1CF369949677A3AF3D58E3EABF2741B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000800000000000:D84C2E1A0E4A52166FA8FF6889D1E5E2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000400000000000:4AD91CCEEF60119B5078FD162D2735DE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000200000000000:2860793D818E97AAFF1D339D7702438D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000100000000000:6F9068BE73364AE250D89D78A6C9CE6F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000080000000000:024FC3FEF4883FEB1A8DD005305FECCE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000040000000000:08A61FE0816D75EA15EB3C9FB9CCDED6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000020000000000:449C86DFA13F260175CE39797686FFA4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000010000000000:4FFFFC29A59858E1133F2BFB1A8A4817:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000008000000000:19425D1F6480B25096561295697DC2B7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000004000000000:31974727ECDD2C77C3A428FC3A8CB3FC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000002000000000:A57CD704B3C95E744D08DF443458F2F5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000001000000000:486D8C193DB1ED73ACB17990442FC40B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000800000000:5E4DBF4E83AB3BC055B9FCC7A6B3A763:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000400000000:ACF2E0A693FBBCBA4D41B861E0D89E37:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000200000000:32A7CB2AE066A51D2B78FC4B4CFCB608:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000100000000:677D494DBB73CAF55C1990158DA12F14:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000080000000:082A0D2367512ADF0D75A151BFBE0A17:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000040000000:5E5BB7337923C482CE8CBA249E6A8C7D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000020000000:D3001BA7C7026EE3E5003179530AFCFC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000010000000:46EC44F8931E629FE8FD8961312EDDE1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000008000000:C5F8ECD79C7B30E81D17E32079969310:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000004000000:5B8AD6919E24CAEBCC55401AEE0C9802:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000002000000:C2302B7E701B5CC7F8B29E3516DBBFA6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000001000000:A1D04D6A76F9F7A94D49FAA64A87F244:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000800000:7FB6F92D35B5CB6C631600EDB9E860BA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000400000:B2EF7078BCFACE07AEEC3F9B48830EB3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000200000:F475A7493D24C7036E53390374C378B3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000100000:B36802AC987377A37BD8EADC97C57D60:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000080000:ADDCD3D19689C4DDC738CE5F69DC9505:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000040000:0DAF8CA22884915403C0F0BB1F4BD74F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000020000:4AF36BAE2660503B3248E4685059FD05:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000010000:7D5631814DD8E917D97A0D514C743971:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000008000:BC3352500FC0CBB9DB5B5F6B491C1BE8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000004000:6A4A30BA87E87AF65C90AEB7AFEDC76B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000002000:77E6125897668AC8E73E8C79A6FF8336:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000001000:3FA9D39104EBB323C7AAAA248960DD1E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000800:FAD75AD76AB10ADC49036B250E229D39:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000400:2FACAA5FE35B228A16AC74088D702EC4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000200:88B6CBCFDFEF8AD91720A1BB69A1F33E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000100:C7E9D250998632D444356242EF04058D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000080:B14DAD8D3D9153F46C0D3A1AD63C7A05:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000040:60ABA678A506608D0845966D29B5F790:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000020:482DC43F2388EF25D24144E144BD834E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000010:1490A05A7CEE43BDE98B56E309DC0126:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000008:ABFA77CD6E85DA245FB0BDC5E52CFC29:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000004:DD4AB1284D4AE17B41E85924470C36F7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000002:CEA7403D4D606B6E074EC5D3BAF39D18:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000001:530F8AFBC74536B9A963B4F1C4CB738B:\ +0000000000000000000000000000000000000000000000000000000000000000 + + + + +# From FIPS 197 +00112233445566778899AABBCCDDEEFF:69C4E0D86A7B0430D8CDB78070B4C55A:\ +000102030405060708090A0B0C0D0E0F +00112233445566778899AABBCCDDEEFF:DDA97CA4864CDFE06EAF70A0EC0D7191:\ +000102030405060708090A0B0C0D0E0F1011121314151617 +00112233445566778899AABBCCDDEEFF:8EA2B7CA516745BFEAFC49904B496089:\ +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F + +506812A45F08C889B97F5980038B8359:D8F532538289EF7D06B506A4FD5BE9C9:\ +00010203050607080A0B0C0D0F101112 +5C6D71CA30DE8B8B00549984D2EC7D4B:59AB30F4D4EE6E4FF9907EF65B1FB68C:\ +14151617191A1B1C1E1F202123242526 +53F3F4C64F8616E4E7C56199F48F21F6:BF1ED2FCB2AF3FD41443B56D85025CB1:\ +28292A2B2D2E2F30323334353738393A +A1EB65A3487165FB0F1C27FF9959F703:7316632D5C32233EDCB0780560EAE8B2:\ +3C3D3E3F41424344464748494B4C4D4E +3553ECF0B1739558B08E350A98A39BFA:408C073E3E2538072B72625E68B8364B:\ +50515253555657585A5B5C5D5F606162 +67429969490B9711AE2B01DC497AFDE8:E1F94DFA776597BEACA262F2F6366FEA:\ +64656667696A6B6C6E6F707173747576 +93385C1F2AEC8BED192F5A8E161DD508:F29E986C6A1C27D7B29FFD7EE92B75F1:\ +78797A7B7D7E7F80828384858788898A +3E23B3BC065BCC152407E23896D77783:1959338344E945670678A5D432C90B93:\ +54555657595A5B5C5E5F606163646566 +79F0FBA002BE1744670E7E99290D8F52:E49BDDD2369B83EE66E6C75A1161B394:\ +68696A6B6D6E6F70727374757778797A +DA23FE9D5BD63E1D72E3DAFBE21A6C2A:D3388F19057FF704B70784164A74867D:\ +7C7D7E7F81828384868788898B8C8D8E +E3F5698BA90B6A022EFD7DB2C7E6C823:23AA03E2D5E4CD24F3217E596480D1E1:\ +A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 +BDC2691D4F1B73D2700679C3BCBF9C6E:C84113D68B666AB2A50A8BDB222E91B9:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 +BA74E02093217EE1BA1B42BD5624349A:AC02403981CD4340B507963DB65CB7B6:\ +08090A0B0D0E0F10121314151718191A +B5C593B5851C57FBF8B3F57715E8F680:8D1299236223359474011F6BF5088414:\ +6C6D6E6F71727374767778797B7C7D7E + +FEC1C04F529BBD17D8CECFCC4718B17F:62564C738F3EFE186E1A127A0C4D3C61:\ +4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 +32DF99B431ED5DC5ACF8CAF6DC6CE475:07805AA043986EB23693E23BEF8F3438:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 +7FDC2B746F3F665296943B83710D1F82:DF0B4931038BADE848DEE3B4B85AA44B:\ +868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 +8FBA1510A3C5B87E2EAA3F7A91455CA2:592D5FDED76582E4143C65099309477C:\ +A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0 +2C9B468B1C2EED92578D41B0716B223B:C9B8D6545580D3DFBCDD09B954ED4E92:\ +C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE +0A2BBF0EFC6BC0034F8A03433FCA1B1A:5DCCD5D6EB7C1B42ACB008201DF707A0:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFC +25260E1F31F4104D387222E70632504B:A2A91682FFEB6ED1D34340946829E6F9:\ +FEFE01010304050608090A0B0D0E0F10121314151718191A +C527D25A49F08A5228D338642AE65137:E45D185B797000348D9267960A68435D:\ +1C1D1E1F21222324262728292B2C2D2E3031323335363738 +3B49FC081432F5890D0E3D87E884A69E:45E060DAE5901CDA8089E10D4F4C246B:\ +3A3B3C3D3F40414244454647494A4B4C4E4F505153545556 +D173F9ED1E57597E166931DF2754A083:F6951AFACC0079A369C71FDCFF45DF50:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374 +8C2B7CAFA5AFE7F13562DAEAE1ADEDE0:9E95E00F351D5B3AC3D0E22E626DDAD6:\ +767778797B7C7D7E80818283858687888A8B8C8D8F909192 +AAF4EC8C1A815AEB826CAB741339532C:9CB566FF26D92DAD083B51FDC18C173C:\ +94959697999A9B9C9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0 +40BE8C5D9108E663F38F1A2395279ECF:C9C82766176A9B228EB9A974A010B4FB:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBEC +0C8AD9BC32D43E04716753AA4CFBE351:D8E26AA02945881D5137F1C1E1386E88:\ +2A2B2C2D2F30313234353637393A3B3C3E3F404143444546 +1407B1D5F87D63357C8DC7EBBAEBBFEE:C0E024CCD68FF5FFA4D139C355A77C55:\ +48494A4B4D4E4F50525354555758595A5C5D5E5F61626364 + +E51AA0B135DBA566939C3B6359A980C5:8CD9423DFC459E547155C5D1D522E540:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 +069A007FC76A459F98BAF917FEDF9521:080E9517EB1677719ACF728086040AE3:\ +08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E +726165C1723FBCF6C026D7D00B091027:7C1700211A3991FC0ECDED0AB3E576B0:\ +30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 +D7C544DE91D55CFCDE1F84CA382200CE:DABCBCC855839251DB51E224FBE87435:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E +FED3C9A161B9B5B2BD611B41DC9DA357:68D56FAD0406947A4DD27A7448C10F1D:\ +80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 +4F634CDC6551043409F30B635832CF82:DA9A11479844D1FFEE24BBF3719A9925:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE +109CE98DB0DFB36734D9F3394711B4E6:5E4BA572F8D23E738DA9B05BA24B8D81:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 +4EA6DFABA2D8A02FFDFFA89835987242:A115A2065D667E3F0B883837A6E903F8:\ +70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 +5AE094F54AF58E6E3CDBF976DAC6D9EF:3E9E90DC33EAC2437D86AD30B137E66E:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE +764D8E8E0F29926DBE5122E66354FDBE:01CE82D8FBCDAE824CB3C48E495C3692:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 +3F0418F888CDF29A982BF6B75410D6A9:0C9CFF163CE936FAAF083CFD3DEA3117:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E +E4A3E7CB12CDD56AA4A75197A9530220:5131BA9BD48F2BBA85560680DF504B52:\ +10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 +211677684AAC1EC1A160F44C4EBF3F26:9DC503BBF09823AEC8A977A5AD26CCB2:\ +38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E +D21E439FF749AC8F18D6D4B105E03895:9A6DB0C0862E506A9E397225884041D7:\ +60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 +D9F6FF44646C4725BD4C0103FF5552A7:430BF9570804185E1AB6365FC6A6860C:\ +88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE +0B1256C2A00B976250CFC5B0C37ED382:3525EBC02F4886E6A5A3762813E8CE8A:\ +B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 +B056447FFC6DC4523A36CC2E972A3A79:07FA265C763779CCE224C7BAD671027B:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE +5E25CA78F0DE55802524D38DA3FE4456:E8B72B4E8BE243438C9FFF1F0E205872:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 +A5BCF4728FA5EAAD8567C0DC24675F83:109D4F999A0E11ACE1F05E6B22CBCB50:\ +28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E +814E59F97ED84646B78B2CA022E9CA43:45A5E8D4C3ED58403FF08D68A0CC4029:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 +15478BEEC58F4775C7A7F5D4395514D7:196865964DB3D417B6BD4D586BCB7634:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E + +# From the 'official' Blowfish vectors (mostly by SSLeay, aka OpenSSL) +[Blowfish] +0000000000000000:245946885754369A:0123456789ABCDEF +0000000000000000:4EF997456198DD78:0000000000000000 +0000000000000000:F21E9A77B71C49BC:FFFFFFFFFFFFFFFF +004BD6EF09176062:452031C1E4FADA8E:584023641ABA6176 +0123456789ABCDEF:0ACEAB0FC6A0A28D:FEDCBA9876543210 +0123456789ABCDEF:7D0CC630AFDA1EC7:1111111111111111 +0123456789ABCDEF:A790795108EA3CAE:1F1F1F1F0E0E0E0E +0123456789ABCDEF:C39E072D9FAC631D:E0FEE0FEF1FEF1FE +0123456789ABCDEF:FA34EC4847B268B2:0101010101010101 +01A1D6D039776742:59C68245EB05282B:7CA110454A1A6E57 +0248D43806F67172:1730E5778BEA1DA4:07A1133E4A0B2686 +02FE55778117F12A:CF9C5D7A4986ADB5:49E95D6D4CA229BF +059B5E0851CF143A:48F4D0884C379918:0113B970FD34F2CE +072D43A077075292:7A8E7BFA937E89A3:4FB05E1515AB73A7 +0756D8E0774761D2:432193B78951FC98:0170F175468FB5E6 +1000000000000001:7D856F9A613063F2:3000000000000000 +1111111111111111:2466DD878B963C9D:1111111111111111 +1111111111111111:61F9C3802281B096:0123456789ABCDEF +164D5E404F275232:5F99D04F5B163969:37D06BB516CB7546 +1D9D5C5018F728C2:D1ABB290658BC778:018310DC409B26D6 +26955F6835AF609A:D887E0393C2DA6E3:04689104C2FD3B2F +305532286D6F295A:55CB3774D13EF201:1C587F1C13924FEF +3BDD119049372802:2EEDDA93FFD39C79:07A7137045DA2A16 +42FD443059577FA2:353882B109CE8F1A:04B915BA43FEB5B6 +437540C8698F3CFA:53C55F9CB49FC019:49793EBC79B3258F +480D39006EE762F2:7555AE39F59B87BD:025816164629B007 +51454B582DDF440A:A25E7856CF2651EB:3849674C2602319E +5CD54CA83DEF57DA:B1B8CC0B250F09A0:0131D9619DC1376E +6B056E18759F5CCA:4A057A3B24D3977B:1F08260D1AC2465E +762514B829BF486A:13F04154D69D1AE5:43297FAD38E373FE +FFFFFFFFFFFFFFFF:014933E0CDAFF6E4:0000000000000000 +FFFFFFFFFFFFFFFF:51866FD5B85ECB8A:FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF:6B5C5A9C5D9E0A5A:FEDCBA9876543210 + +0123456789ABCDEF1111111111111111:7D0CC630AFDA1EC72466DD878B963C9D:\ +1111111111111111 + +FEDCBA9876543210:CC91732B8022F684:57686F206973204A6F686E2047616C743F + +424C4F5746495348:324ED0FEF413A203:\ +6162636465666768696A6B6C6D6E6F707172737475767778797A + +FEDCBA9876543210:F9AD597C49DB005E:F0 +FEDCBA9876543210:E91D21C1D961A6D6:F0E1 +FEDCBA9876543210:E9C2B70A1BC65CF3:F0E1D2 +FEDCBA9876543210:BE1E639408640F05:F0E1D2C3 +FEDCBA9876543210:B39E44481BDB1E6E:F0E1D2C3B4 +FEDCBA9876543210:9457AA83B1928C0D:F0E1D2C3B4A5 +FEDCBA9876543210:8BB77032F960629D:F0E1D2C3B4A596 +FEDCBA9876543210:E87A244E2CC85E82:F0E1D2C3B4A59687 +FEDCBA9876543210:15750E7A4F4EC577:F0E1D2C3B4A5968778 +FEDCBA9876543210:122BA70B3AB64AE0:F0E1D2C3B4A596877869 +FEDCBA9876543210:3A833C9AFFC537F6:F0E1D2C3B4A5968778695A +FEDCBA9876543210:9409DA87A90F6BF2:F0E1D2C3B4A5968778695A4B +FEDCBA9876543210:884F80625060B8B4:F0E1D2C3B4A5968778695A4B3C +FEDCBA9876543210:1F85031C19E11968:F0E1D2C3B4A5968778695A4B3C2D +FEDCBA9876543210:79D9373A714CA34F:F0E1D2C3B4A5968778695A4B3C2D1E +FEDCBA9876543210:93142887EE3BE15C:F0E1D2C3B4A5968778695A4B3C2D1E0F +FEDCBA9876543210:03429E838CE2D14B:F0E1D2C3B4A5968778695A4B3C2D1E0F00 +FEDCBA9876543210:A4299E27469FF67B:F0E1D2C3B4A5968778695A4B3C2D1E0F0011 +FEDCBA9876543210:AFD5AED1C1BC96A8:F0E1D2C3B4A5968778695A4B3C2D1E0F001122 +FEDCBA9876543210:10851C0E3858DA9F:F0E1D2C3B4A5968778695A4B3C2D1E0F00112233 +FEDCBA9876543210:E6F51ED79B9DB21F:F0E1D2C3B4A5968778695A4B3C2D1E0F0011223344 +FEDCBA9876543210:64A6E14AFD36B46F:F0E1D2C3B4A5968778695A4B3C2D1E0F001122334455 +FEDCBA9876543210:80C7D7D45A5479AD:\ +F0E1D2C3B4A5968778695A4B3C2D1E0F00112233445566 +FEDCBA9876543210:05044B62FA52D080:\ +F0E1D2C3B4A5968778695A4B3C2D1E0F0011223344556677 + +# First one is from RFC 2144. The rest were done with OpenSSL and bits taken +# from /dev/urandom +[CAST-128] +0123456789ABCDEF:238B4FE5847E44B2:0123456712345678234567893456789A +0D5ED4BF2C101A00:851769123481EEBD:51D35D2CFC978231CC8D404C05F20778 +D6AA8EAE1E559AAE:C7FAFAFC64204DDE:3148F2F7A5EC9832C918B3FCE3A882D4 +F2504FFBB8970532:6371C64A362D2A06:23CA10AC5007672EAAC2A652A1033051 +4B1E9D8F450B7342:9CC2B912173553F3:69698114EB6B0C7DA021394E8294BA81 +26D7BA5E58E367FC:A2D1FCB23EDBE861:E29067C7B82F2BB5787A95961C4B145B +960370DF205DF0C9:E1F5DCA58544FE69:724096996EA7E796847CC954DDB02F21 +3E16104523173535:EF4B1D186287F9E4:C44CD3B7C176A89B849AEC9D1A834D25 +6AB0B4F6FBDFE766:273B54BDF2B5588C:F5A1E7B8DF1852E0A12E150665812CE1 +76300E213C3F9D73:6C51876F5EA9CE03:1BCBC553F08BA5AE3DC87E3A08D720A5 +22A5191C0722F0D8:F1E19892EE7A4E51:0265563A752CB548404FEBA1C7231FA7 +D20430D1B98AE949:79E576FC40F1DC98:9C553CF85065EC9EFE0A6526070DF766 +1C7401D639A47971:BD2172A2ED5F5C02:1895E906311E100D6F189B0622248BC3 +B8591CA50C7E763D:573F3DB3C43731FA:616A2B2C30F26B1386CD8B1E9E15D77E +CDA3984E06CC637A:2525D6596ACE9CD1:14422858FA163B7C5267FF819773CE1D +5B5A603C9C090115:3729DAB86CB1CCF7:172E65C14E746EE6203025E94171D520 +9F9881CA42D7024C:9C3C573D7B958521:3E9FB858087C4E937A408EC1352482B1 +4A5C46FD61058258:2A1E5FD727F67F13:A32E8B1498839F6017802758076B0BFC +EBBB828350790FDA:78FC70F88D1622ED:E303C6052387C310524721A2E461E89A +5097EDFFDFC0CA5B:3ABDD3B9A69C7330:3B3DE3DA709304F69F1DD00F00A05064 +8F950AE00DD2F279:2C62AFD2C641CCE8:C36EC561C6E005B5FC5F03F2A90B097E +D23B8A5E996E263D:31A202CC0F9FB2B7:202F39862076420EA9DF9DECCDC507AB +8D953359228A4C76:AA454DE10B7A6863:CCD6F6AAEEB788E928CECF99440BBF07 +D2E9C19314726F4D:B744FAB9846F35E4:017779EA29084F30B867FDDFF56A2158 +F4C032C960A5B463:EDA7B0739A0638EE:CE44271A18D709DCC62648F709C1CBE2 +81A0FD9AA423ED36:C3CCCC1389F1D712:B9F0598CFA6D4F92294C4BA43ED360F2 +B7E0072AE1CBEE65:AEF33EEDCCC2E47F:5A6C06E02E3D5177D26F0D63DF839057 +F5810D9F1D639F82:A7A88EFA33ACF56E:547DF75C2FCFF20C1ED3A77AF1AD66E8 +984A16BE2CD649AC:444FC61F5CAB5A14:9CC9412E02C03D423E055D340BC74460 +8BC57E1C4D4DB959:6AAFD5AD02B48AAD:D2E4D28086A37BF2927C9477C8184907 +E79C0E003AE33C71:DCD139EFE59F5B1B:AFE83744D296834750A5AEC59C1FA546 +5E8EB11FF48AE593:947A1A1472AF838E:B933E959F7D492EACA22E7DF1C179C79 +FD9072FAB981B8AA:57A9C621EF5BE045:6DC4F66D0812A820134C3F61E398195E +53515B1ABC74C9FB:C87A6000F80DADAF:4FA0C134D50DDCAE2FA8828479149C61 +1086DE79B6DC0C18:102FFA93ECBB99CF:7A6ECA7EAAF393694A32AF561FF7E056 +351228904431D12A:DC8B4548DA69C92D:42400F970D5E6E38DE297B365C0704D3 +889F00F0EC62610F:3AEC2335A78EC8F9:50D77ED75F69D9FD89C0B58A5374CC8E +05CC553B50019A76:7A3F48D2954FB957:321E02B40C3F7D9D55A5135620685DC8 +D30DBA7A648B2CE9:242C1509768F5F9E:DA1CA8F596F04697592CE210752FD08D +1917132061B5B572:28FDDE7607EBE08D:9C56B69695DB96CEDBF1133386D13768 +8420D1986EBBABFC:EAACBF83A093CB44:9F79CA83F4FDCCACA166BF18BF1B0CC2 + +# From my AES CD, I'm guessing +[CAST-256] +00000000000000000000000000000000:66918B620F075819CDE620469D5F39B8:\ +80000000000000000000000000000000 +00000000000000000000000000000000:C842A08972B43D20836C91D1B7530F6B:\ +2342BB9EFA38542C0AF75647F29F615D +00000000000000000000000000000001:4DBF11C2CA26D5A712578A5C18E8487B:\ +00000000000000000000000000000000 +00000000000000000000000000000000:1B386C0210DCADCBDD0E41AA08A7A7E8:\ +2342BB9EFA38542CBED0AC83940AC298BAC77A7717942863 +80000000000000000000000000000000:D64AD4962DCF990CB9EB1BEF19A21B98:\ +000000000000000000000000000000000000000000000000 +00000000000040000000000000000000:0154FF22D769EB57AE14D7ECDD60C1D8:\ +000000000000000000000000000000000000000000000000 +80000000000000000000000000000000:D64AD4962DCF990CB9EB1BEF19A21B98:\ +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000001:4DBF11C2CA26D5A712578A5C18E8487B:\ +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000:41C30E3025A7E66F6AE733DFDC861341:\ +0000000000000000000000200000000000000000000000000000000000000000 +00000000000000000000000000000000:4F6A2038286897B9C9870136553317FA:\ +2342BB9EFA38542CBED0AC83940AC2988D7C47CE264908461CC1B5137AE6B604 + +0000000000000000000000000C9B2807:963A8A50CEB54D08E0DEE0F1D0413DCF:\ +2342BB9EFA38542C0AF75647F29F615D +000000000000000000000000EE356B0F:B25683CD9188DB9307F8A1236B53DE86:\ +2342BB9EFA38542CBED0AC83940AC298BAC77A7717942863 +000000000000000000000000B2E9D805:AAB348855CAC0DC7BDF2FA02757A2154:\ +2342BB9EFA38542CBED0AC83940AC2988D7C47CE264908461CC1B5137AE6B604 + +[DES] +059B5E0851CF143A:86A560F10EC6D85B:0113B970FD34F2CE +4E6F772069732074:3FA40E8A984D4815:0123456789ABCDEF +666F7220616C6C20:893D51EC4B563B53:0123456789ABCDEF +68652074696D6520:6A271787AB8883F9:0123456789ABCDEF +5CD54CA83DEF57DA:7A389D10354BD271:0131D9619DC1376E +0756D8E0774761D2:0CD3DA020021DC09:0170F175468FB5E6 +1D9D5C5018F728C2:5F4C038ED12B2E41:018310DC409B26D6 +480D39006EE762F2:A1F9915541020B56:025816164629B007 +26955F6835AF609A:5C513C9C4886C088:04689104C2FD3B2F +42FD443059577FA2:AF37FB421F8C4095:04B915BA43FEB5B6 +0248D43806F67172:868EBB51CAB4599A:07A1133E4A0B2686 +3BDD119049372802:DFD64A815CAF1A0F:07A7137045DA2A16 +16393BCDD6560506:9966ADCFC53BF968:0A3FDDC8350AFF39 +DC7FC6CF0358ECC0:A47A7485661F7085:10DD6DCD5C89E151 +305532286D6F295A:63FAC0D034D9F793:1C587F1C13924FEF +F786D02413C574FC:54C160D369F62AE3:1EB00767BDEE584E +6B056E18759F5CCA:EF1BF03E5DFA575A:1F08260D1AC2465E +905EA29AEEA26E07:2292E9AEBEE6A4B6:28EE445D8A21C534 +164D5E404F275232:0A2AEEAE3FF4AB77:37D06BB516CB7546 +51454B582DDF440A:7178876E01F19B2A:3849674C2602319E +68FF9D6068C71513:84595F5B9D046132:3CDE816EF9EF8EDB +762514B829BF486A:EA676B2CB7DB2B7A:43297FAD38E373FE +437540C8698F3CFA:6FBF1CAFCFFD0556:49793EBC79B3258F +02FE55778117F12A:5A6B612CC26CCE4A:49E95D6D4CA229BF +1F508A50ADB3D6E2:470204969876604A:4BB53ECFEFB38DDE +072D43A077075292:2F22E49BAB7CA1AC:4FB05E1515AB73A7 +004BD6EF09176062:88BF0DB6D70DEE56:584023641ABA6176 +5AA1D62806AE0EAD:6DB0F280FEF2B564:5F2B51F59E781D9C +7E1B1C6776833772:EB11CD3C72F7E90E:699C920D7CE1E0B1 +5DBFB47C5F471136:9C8B904D4D772BE7:7AC2FDEEE4C79746 +01A1D6D039776742:690F5B0D9A26939B:7CA110454A1A6E57 +4DE2F0926CF598D7:BA107655991DF529:7FC92C3098ECF14A +F45E6819E3108559:F0C76BA556283B2F:9AB645E268430854 +51D4EAAAC6D76553:BF3C6E8FD15BA861:A6B0AE88F980011A +6A89626EA8038511:1067B36913CBCC47:BAFEBAFAFEAEEAFF +7B0313C0D3A866F9:E49E15E4F46F10E9:BB2420B5FEE5A6A1 +9D4A44AEFCE79965:77B2ECC9278E9714:BEBAFBEABAFFEAAF +59BCDFC253424CB5:0A50ABBBCD07061A:C38C6F20230D9ED5 +D6C059A85EE2B13E:25977533635BEB5B:C6F974504D954C7E +F9E4821DFCAA5466:48EC3A79399E9A00:CB959B7FFD94F734 +35E8554BAD60FB29:993A3AF0BC0D77A4:CFB23034323CD19A +9F97210D75B7E6DF:4729E3396E57AE4E:D4D861035745F2C8 +FFFFFFFFFFFFFFFF:B5CE4F28FDEB21E8:E36972FC4BEC7587 +323837024123C918:7F28BF28ADFA1CF0:E91A71A7ED5EB0EF +37DFE527086AF0A0:5F53C6C87760256E:EBBBBAEBFBBEFABA +20678F45B5B8AC00:7CC8ECF2638CC808:EBBEEEAEBBBBFFFF +78481ED0C5A7C93E:4CA3A08300EA6AFC:FBEAFFEEFFEEABAB +E2CCD415AC25412A:BD85B3B659AB7276:FD8A675C0ED08301 +CCCC5BDFD9029507:DA57553D7D55775F:FFFFFFFFFFFFFFFF +0000000000000000:23083A3CA70DD027:D5D44FF720683D0D +0100000000000000:6F353E3388ABE2EF:D5D44FF720683D0D + +95F8A5E5DD31D900:8000000000000000:0101010101010101 +95F8A5E5DD31D900:8000000000000000:0000000000000000 +DD7F121CA5015619:4000000000000000:0101010101010101 +2E8653104F3834EA:2000000000000000:0101010101010101 +4BD388FF6CD81D4F:1000000000000000:0101010101010101 +20B9E767B2FB1456:0800000000000000:0101010101010101 +20B9E767B2FB1456:0800000000000000:0001010101010100 +55579380D77138EF:0400000000000000:0101010101010101 +6CC5DEFAAF04512F:0200000000000000:0101010101010101 +0D9F279BA5D87260:0100000000000000:0101010101010101 +D9031B0271BD5A0A:0080000000000000:0101010101010101 +424250B37C3DD951:0040000000000000:0101010101010101 +B8061B7ECD9A21E5:0020000000000000:0101010101010101 +F15D0F286B65BD28:0010000000000000:0101010101010101 +ADD0CC8D6E5DEBA1:0008000000000000:0101010101010101 +E6D5F82752AD63D1:0004000000000000:0101010101010101 +ECBFE3BD3F591A5E:0002000000000000:0101010101010101 +F356834379D165CD:0001000000000000:0101010101010101 +2B9F982F20037FA9:0000800000000000:0101010101010101 +889DE068A16F0BE6:0000400000000000:0101010101010101 +E19E275D846A1298:0000200000000000:0101010101010101 +329A8ED523D71AEC:0000100000000000:0101010101010101 +E7FCE22557D23C97:0000080000000000:0101010101010101 +12A9F5817FF2D65D:0000040000000000:0101010101010101 +A484C3AD38DC9C19:0000020000000000:0101010101010101 +FBE00A8A1EF8AD72:0000010000000000:0101010101010101 +750D079407521363:0000008000000000:0101010101010101 +64FEED9C724C2FAF:0000004000000000:0101010101010101 +F02B263B328E2B60:0000002000000000:0101010101010101 +9D64555A9A10B852:0000001000000000:0101010101010101 +D106FF0BED5255D7:0000000800000000:0101010101010101 +E1652C6B138C64A5:0000000400000000:0101010101010101 +E428581186EC8F46:0000000200000000:0101010101010101 +AEB5F5EDE22D1A36:0000000100000000:0101010101010101 +E943D7568AEC0C5C:0000000080000000:0101010101010101 +DF98C8276F54B04B:0000000040000000:0101010101010101 +B160E4680F6C696F:0000000020000000:0101010101010101 +FA0752B07D9C4AB8:0000000010000000:0101010101010101 +CA3A2B036DBC8502:0000000008000000:0101010101010101 +5E0905517BB59BCF:0000000004000000:0101010101010101 +814EEB3B91D90726:0000000002000000:0101010101010101 +4D49DB1532919C9F:0000000001000000:0101010101010101 +25EB5FC3F8CF0621:0000000000800000:0101010101010101 +AB6A20C0620D1C6F:0000000000400000:0101010101010101 +79E90DBC98F92CCA:0000000000200000:0101010101010101 +866ECEDD8072BB0E:0000000000100000:0101010101010101 +8B54536F2F3E64A8:0000000000080000:0101010101010101 +EA51D3975595B86B:0000000000040000:0101010101010101 +CAFFC6AC4542DE31:0000000000020000:0101010101010101 +8DD45A2DDF90796C:0000000000010000:0101010101010101 +1029D55E880EC2D0:0000000000008000:0101010101010101 +5D86CB23639DBEA9:0000000000004000:0101010101010101 +1D1CA853AE7C0C5F:0000000000002000:0101010101010101 +CE332329248F3228:0000000000001000:0101010101010101 +8405D1ABE24FB942:0000000000000800:0101010101010101 +E643D78090CA4207:0000000000000400:0101010101010101 +48221B9937748A23:0000000000000200:0101010101010101 +DD7C0BBD61FAFD54:0000000000000100:0101010101010101 +2FBC291A570DB5C4:0000000000000080:0101010101010101 +E07C30D7E4E26E12:0000000000000040:0101010101010101 +0953E2258E8E90A1:0000000000000020:0101010101010101 +5B711BC4CEEBF2EE:0000000000000010:0101010101010101 +CC083F1E6D9E85F6:0000000000000008:0101010101010101 +D2FD8867D50D2DFE:0000000000000004:0101010101010101 +06E7EA22CE92708F:0000000000000002:0101010101010101 +166B40B44ABA4BD6:0000000000000001:0101010101010101 +0000000000000000:95A8D72813DAA94D:8001010101010101 +0000000000000000:0EEC1487DD8C26D5:4001010101010101 +0000000000000000:7AD16FFB79C45926:2001010101010101 +0000000000000000:D3746294CA6A6CF3:1001010101010101 +0000000000000000:809F5F873C1FD761:0801010101010101 +0000000000000000:C02FAFFEC989D1FC:0401010101010101 +0000000000000000:4615AA1D33E72F10:0201010101010101 +0000000000000000:2055123350C00858:0180010101010101 +0000000000000000:DF3B99D6577397C8:0140010101010101 +0000000000000000:31FE17369B5288C9:0120010101010101 +0000000000000000:DFDD3CC64DAE1642:0110010101010101 +0000000000000000:178C83CE2B399D94:0108010101010101 +0000000000000000:50F636324A9B7F80:0104010101010101 +0000000000000000:A8468EE3BC18F06D:0102010101010101 +0000000000000000:A2DC9E92FD3CDE92:0101800101010101 +0000000000000000:CAC09F797D031287:0101400101010101 +0000000000000000:90BA680B22AEB525:0101200101010101 +0000000000000000:CE7A24F350E280B6:0101100101010101 +0000000000000000:882BFF0AA01A0B87:0101080101010101 +0000000000000000:25610288924511C2:0101040101010101 +0000000000000000:C71516C29C75D170:0101020101010101 +0000000000000000:5199C29A52C9F059:0101018001010101 +0000000000000000:C22F0A294A71F29F:0101014001010101 +0000000000000000:EE371483714C02EA:0101012001010101 +0000000000000000:A81FBD448F9E522F:0101011001010101 +0000000000000000:4F644C92E192DFED:0101010801010101 +0000000000000000:1AFA9A66A6DF92AE:0101010401010101 +0000000000000000:B3C1CC715CB879D8:0101010201010101 +0000000000000000:19D032E64AB0BD8B:0101010180010101 +0000000000000000:3CFAA7A7DC8720DC:0101010140010101 +0000000000000000:B7265F7F447AC6F3:0101010120010101 +0000000000000000:9DB73B3C0D163F54:0101010110010101 +0000000000000000:8181B65BABF4A975:0101010108010101 +0000000000000000:93C9B64042EAA240:0101010104010101 +0000000000000000:5570530829705592:0101010102010101 +0000000000000000:8638809E878787A0:0101010101800101 +0000000000000000:41B9A79AF79AC208:0101010101400101 +0000000000000000:7A9BE42F2009A892:0101010101200101 +0000000000000000:29038D56BA6D2745:0101010101100101 +0000000000000000:5495C6ABF1E5DF51:0101010101080101 +0000000000000000:AE13DBD561488933:0101010101040101 +0000000000000000:024D1FFA8904E389:0101010101020101 +0000000000000000:D1399712F99BF02E:0101010101018001 +0000000000000000:14C1D7C1CFFEC79E:0101010101014001 +0000000000000000:1DE5279DAE3BED6F:0101010101012001 +0000000000000000:E941A33F85501303:0101010101011001 +0000000000000000:DA99DBBC9A03F379:0101010101010801 +0000000000000000:B7FC92F91D8E92E9:0101010101010401 +0000000000000000:AE8E5CAA3CA04E85:0101010101010201 +0000000000000000:9CC62DF43B6EED74:0101010101010180 +0000000000000000:D863DBB5C59A91A0:0101010101010140 +0000000000000000:A1AB2190545B91D7:0101010101010120 +0000000000000000:0875041E64C570F7:0101010101010110 +0000000000000000:5A594528BEBEF1CC:0101010101010108 +0000000000000000:FCDB3291DE21F0C0:0101010101010104 +0000000000000000:869EFD7F9F265A09:0101010101010102 +0000000000000000:88D55E54F54C97B4:1046913489980131 +0000000000000000:0C0CC00C83EA48FD:1007103489988020 +0000000000000000:83BC8EF3A6570183:10071034C8980120 +0000000000000000:DF725DCAD94EA2E9:1046103489988020 +0000000000000000:E652B53B550BE8B0:1086911519190101 +0000000000000000:AF527120C485CBB0:1086911519580101 +0000000000000000:0F04CE393DB926D5:5107B01519580101 +0000000000000000:C9F00FFC74079067:1007B01519190101 +0000000000000000:7CFD82A593252B4E:3107915498080101 +0000000000000000:CB49A2F9E91363E3:3107919498080101 +0000000000000000:00B588BE70D23F56:10079115B9080140 +0000000000000000:406A9A6AB43399AE:3107911598090140 +0000000000000000:6CB773611DCA9ADA:1007D01589980101 +0000000000000000:67FD21C17DBB5D70:9107911589980101 +0000000000000000:9592CB4110430787:9107D01589190101 +0000000000000000:A6B7FF68A318DDD3:1007D01598980120 +0000000000000000:4D102196C914CA16:1007940498190101 +0000000000000000:2DFA9F4573594965:0107910491190401 +0000000000000000:B46604816C0E0774:0107910491190101 +0000000000000000:6E7E6221A4F34E87:0107940491190401 +0000000000000000:AA85E74643233199:19079210981A0101 +0000000000000000:2E5A19DB4D1962D6:1007911998190801 +0000000000000000:23A866A809D30894:10079119981A0801 +0000000000000000:D812D961F017D320:1007921098190101 +0000000000000000:055605816E58608F:100791159819010B +0000000000000000:ABD88E8B1B7716F1:1004801598190101 +0000000000000000:537AC95BE69DA1E1:1004801598190102 +0000000000000000:AED0F6AE3C25CDD8:1004801598190108 +0000000000000000:B3E35A5EE53E7B8D:1002911598100104 +0000000000000000:61C79C71921A2EF8:1002911598190104 +0000000000000000:E2F5728F0995013C:1002911598100201 +0000000000000000:1AEAC39A61F0A464:1002911698100101 + +# Vectors randomly generated using OpenSSL + +0CEB1136A85AD37A:9CE3A1058A483F55:309A4B21A2067196 +9BBBD2F50EC248A8:7694CA89548B0A3B:CA61DEF25C51A5A0 +FF82E00A54C33870:ADF2C2D3F57C12EC:054F6AC2C779D51A +3E33A822C3C3573A:91481544C1349FD2:AB28E5763F23361A +8BB2EC62E042C9BF:62F0E53062A010B9:A9C631D31852201F +4844511C42049973:C7265CA05D9F3253:3D90CADF843BBA1B +38F11633A3766D10:66D55E36CCE18435:B6006A2C549DEA94 +746BC597A7501FF0:0032D9CA6E094980:070A848D67D7701C +FA5F22A6A7DDBB8B:91ECEFD28E217506:A12AE6006E8F8D37 +8D3D08E33FBB298D:CF132CE973D16AA3:9998A725FB90FDE4 +397CA570B07AF49E:4C2959260E6C27DC:F111F3AFD4602715 +6ACFBFF2962511A9:2D325409EF2CD744:EF97EA242CCBAC00 +EB5167B434A4595A:483EA80264F0DCF6:9080E3410BFCDB73 +E72EDA1F8AE27EB9:0E4AF25FBDD5A85E:8A37156BE5515D5D +B0F7D48AA74DD638:7F6747AEF2C9EAC9:DF09A6387CFE9A6B +334A69684C8B728A:6717F2AD848DEAF7:B4FCAFFB540653E5 +A78C724DA4DC969D:AC6A97ECE16A8892:183972A45732379A +4310191D687F40D6:C9B0C9CA84CFC141:979D352937F85083 +F630889FB4B5ED90:6166F3231EC1EAD9:5CEDCE103F7F73C4 +C9C7BFE95A2F77FD:B6C234EAF4A39B1F:4AD1B967A715F5A9 +43E2B87BB55A3038:B9BE452E0E4EA44D:F883F548F16E692A +42AA788D751F49A5:5302E3BA833E598A:D75198DF25CC1345 +63E22CDF499763C3:70E8BD70BCE301CB:7033D4C5D9B36096 +665976555719E76F:65769A95FB144DE9:76B7EAC1DB819238 +12DD07305BC143DE:A5E73B90A3E75586:76FC0A292121B094 +45A11A91EF86DDA6:6E2C2CC2A2333C88:B775628F1EC6520C +537FEBCB1219673B:D578B8AA85351F91:65BF73315A05061C +F5F17039BA37C1C0:3D6A8E5991C3AEBB:E772317D24F6D307 +D0530A774112DC14:307AE98F2B6864D0:461E02D82081CA3A +A46F062CBB7BFC33:A9D2B0940F0A7F58:08FF3D9BDE9EEA8E +A47F14BAA946FB7B:4E79EBEFD716D85F:4D92A8AE6F9C6A35 +692A27DA86F2E283:29961C5FD6744638:FB1C7BB97C7ED50C +74D5CD027725903C:B8A8076072E55000:C9B0558D7C353C5E +2311E3818223DFA9:17A4E5989E9C9A3D:60D82E111EEEDEA8 +984B849763274BD3:205C2B2AEDB6052D:76DB3E3505FD3A95 +9852C739E74737B7:525CBAD9C2D50EA0:558EF761EEE52DCF +6C4236CFAEFF63EC:E1AD916DED6850F4:AC340D97D96CF29E +1A95C43E9C7D5339:B60E5C4C76CE51C6:50F5C29F83C8F2BF +7DBE4645B2C169F4:285276D256091B2E:C7BF9EB44254ACA6 +841DEAE87A860986:799A5A58E5CE9D59:FE80AB20EAC7AD16 +1529ACE917CA5AB4:AAB07F8FDBDC494E:B012DE369D9B7436 +86462C0AD4003FEC:51310B7C123C64C4:61896A3271D3E2B2 +A67151571BE9AB07:3024667AFF88ADAB:8514D38254A5A55F +B314608B183F3329:AA966A7A395FFAE7:F607C0CD0FAFCC60 +84B322B129ABACDF:C50F0D6E439E8490:10EEC9E7F07A51D3 +E296E275356AA9A0:B3963851F7DEB2C3:32F4E03E3B10DB42 +4DF2292E321837F6:1D017CE1B3C03380:52205900EE0836E6 +88A2C60FB19E5983:77763644264C8FB8:A481D9B2C7FDA435 +06CA0C88A4347E12:F1FCAEAF30C63870:404025B368276238 +FEFD2DF531FE9112:8F49A08722BB14F0:657486656993AC7B + +[DESX] +94DBE082549A14EF:9011121314151617:\ +0123456789ABCDEF01010101010101011011121314151617 +B83DF91F844FF695:FA942810AC8355C0:\ +E874076EF40EDA62908D12ADF2B7B9ECDA474BF3FEDCDA11 +4EF5D7337D420403:B2C3C73B303BE0D7:\ +2AF5602DA83F821A69C81B1B83EFA70A3B4E3C1D546BF825 +8D3C8F07A610FD51:5712559676CABA44:\ +BEB7DF4A710FACB364183EEBCA3EE934A5B470031CE64A03 +B39949A845EF61C1:3769F87FB393D49F:\ +46312600F8B5F05AFAA080D26672B9C44AF057D694702AB5 +B00E6572A847D27A:6B1C14571BC9EBCE:\ +25A3EAE6D9FB10E86E14032BB652262CD1D7ED74A2BFC75B +07608C7CB2B11972:CD627B22E13ECCD4:\ +3D5BEA2C2216E30CE961882A593608CB5BA96FC656AF7487 +C2B7BCC1EA18B54A:66EF45BEA20DDAAF:\ +5AD28C1D67C65E4D5F4A9DB38C32827BC6C4FE098996F017 +59004793279BBEFA:F0B6AC1318F01331:\ +8A94FCBF30415180EF79881D32C8C061E4527DE53BF5915D + +[TripleDES] +0123456789ABCDE7:7F1D0A77826B8AFF:0123456789ABCDEFFEDCBA9876543210 +4E6F772069732074:3FA40E8A984D4815:0123456789ABCDEF0123456789ABCDEF +42FD443059577FA2:AF37FB421F8C4095:04B915BA43FEB5B604B915BA43FEB5B6 +AFA4284FCCEAA61A:32527D5701D92B90:4BC59E2C68ACA60767A9A4B623BBBCCC +50B503A331D5B5CC:E46A59E18B0C41E3:B955BB7861FDE77E7DC6418475457FE1 +3404435D5DF2CB47:644DD68EA73053AE:C0557629EAA72ABD4C102C5DC9CE8B47 +C7D80E955D1B6627:9FE1C5A12CCE6DD9:9EAA94DA916F30092E79DACDCDCC45C0 +BDCBE8929CD0E12F:F2B6430450AB348B:A55279671807D9B71FE62A77341249F8 +4B7A96B7051C64FC:1555F08B2DE690A0:672E20826AD49C3DF7579FAB3752479E +902F4EDD44EAF3C1:3CE357EBA0FB3E26:0CE61EDE2659B413AB9F717AE4AFAD3E +39C0F8E4C85CD70D:882DE9B6D0209A58:E878020815AE517CD2808B6571EAC2B4 +F77A1947A921B209:E10DBEE5615F312E:D891CA20919F06A054BA3943C7DABA16 +06D0416E0F0DB7CE:0CEC5D1E59D7E347:4909AED1F94EB77B6CACBCAE2B25689A +F7BB3A396D73D8A8:F893B6B2A15D3FCE:8B9A5C13B0B118A1EE35EB912866FFA6 +BD35E3134B90CCBC:12A7AF172FD0CA7F:FA7911D664326074B42E2F38E599B288 +E046B7F5707DA4FC:32B6A3FC72C7C480:406903B340B8637928FDE8058BDD6710 +58EB1DC16C482213:A6C6234A8BBAA116:37A2B53E2AF8F6C9A73B39F919D969DE +4BD0F4854297FBDE:F4AB771861457DC6:711F2CECDB92B2E201DFEFA79FA7BA2F + +42FD443059577FA2:AF37FB421F8C4095:\ +04B915BA43FEB5B604B915BA43FEB5B604B915BA43FEB5B6 +736F6D6564617461:18D748E563620572:\ +0123456789ABCDEF5555555555555555FEDCBA9876543210 +7371756967676C65:C07D2A0FA566FA30:\ +0352020767208217860287665908219864056ABDFEA93457 +0123456789ABCDE7:DE0B7C06AE5E0ED5:\ +0123456789ABCDEFFEDCBA987654321089ABCDEF01234567 +0123456789ABCDE7:7F1D0A77826B8AFF:\ +0123456789ABCDEFFEDCBA98765432100123456789ABCDEF +4115E551299A5C4B:F7A0822FC310686C:\ +1EF743A68D629F68A5E3136C36AD7953A835CF849BB4EC3C +D5AB44E0FE46E1B5:02AED9BF72ECA222:\ +B7D560BE49C3936728EF0BF57B602D2EB7E5C631DD7F753E +B4077DFDB721D88C:F76ABA838B1C4372:\ +D2D98706E9AB867647D244BDCDBCD5EF8B4DBC9CF4F35493 +890E98AB385FA1A1:187087C77790C3B2:\ +153B963004101D12683E8F87116001B8C5526475510B5036 +02D5DA6D5F247CD2:89FC7DF1E7913163:\ +45E4275DCCC5D8B5A27993C16D9960CA939C023E2763216A +5AF9E5A3525E3F7D:8FCC7A8BC337E484:\ +F6C2474B33934EA76E6C841D9B1E86E37189095A895A3E5A +12864DDE8E694BD1:5B4DDE8F000A5A9B:\ +5B4F6D3185EFBAE97D58ED9CC75E2BAE655D2CEFB2DD09CD +0123456789ABCDE7:C95744256A5ED31D:\ +0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF +68652074696D6520:6A271787AB8883F9:\ +0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF +4E6F772069732074:3FA40E8A984D4815:\ +0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF + +94A8A0655AF71024:A427AA4C6234817E:\ +C9B6D82EF93DD4C7AC365AB2D9280EB39DD92C0CE3F72BDE +2881AE1EF7DC8DE2:5C009647DE419151:\ +704A6378B5C72C3F1617B97508777FACF8E2205C66D29279 +462EC3631C8C0DA9:52E8D6E3F54404C3:\ +9D5DF5B9222F4E04197A0E194AFBD4BA0225D1472F925076 +941F85F14CC3E9F8:3FE08C51BC513AD9:\ +8374C4173F715AA127877D3BEFB8C0B2FF5987E12B112FD9 +99A30F38CE575814:5C02AECC12404AB6:\ +CD5BCCEC928C04E91E4CFC715E10E029E01F870FB98E7B34 +69F80C7EAF46CBAD:9FF8BCB5707A0ED9:\ +59345A37BE821AA78E0BD97259C54BEBB1F644B78B1FD310 +62522184CE03EFF7:0E98911465E30E76:\ +E3C22C1AAAAF0FBF61A170BC24361F274B404E36C8F1794A +DED10258F58DAA03:2CD2D1F377C13A53:\ +C0E492C873EFE871E534A2A30600418D636C3FC76C4E9EA6 +AFC190AF21D37A39:E7B312CCC287374C:\ +DC80FA652BBB01186C6CFDDF55E109808F6CCEC99DEE3633 +8A206F645001553B:B824E9E801940B83:\ +276B5FC5C5255AE2484114EAC33CD228A7BEAA9487D9A729 +2095D9F03C7EC366:537201E0D3FFCECE:\ +70890F38A3A6744162356109589DC20ABF2D3AD8E989A77F +D51A8F5310D314DE:7EE4FEA9B78CB899:\ +86164AB6C13CA0AD6B35EEDDDE102428C822C22DB1326661 +B0317287CC8D536B:118293DE51E43D00:\ +98D2D51E2916D25237DAFC6B5CFBB5AED7CCD916BF243004 +A8BF0F3A57822AFE:9FD4F7B0500C0F53:\ +BBA72F7362A8E3BA6EE190C4E0AC25560BB0DF1097F94C13 +C16B7EAD2367C87D:9FE31F892EB7E617:\ +6F9DD25B6ACAB7019A548B6B0E1AA35AFEF95D89DB20FB11 +C5E3D11391C7875B:0B5BC8B430785004:\ +1670F96FC4D670CF3BEC580AE1735FE3DFB3E0377FEC16C8 +CCCBFFFAB48110DB:08E145136C8112C4:\ +3B55AC7156436FCA1D639BC33541F91AD0BE7525C3D0E823 +039391950AC5937C:5251FDDBD6E2E70D:\ +D24A2A7340C974E68265C4DFACE67041852889ADDF1216AF +41BD298935B10395:228EDD3DA5B00098:\ +777EAD928BFB661003A4E0F0920CD161A2C03963C816F1F3 +FFC524C0B0F48806:092D1465E01D9356:\ +6335EA2F228A811B7B70AE47BF13F8D456A717BC2AC1F301 +2E499BC53CFEB666:87B59F9BD6ADE17C:\ +EFACE1D2899E742C6A65EB523447B6001E2FE3DB1D6BD904 +8250B551ADAEE699:A286D77E36481FA8:\ +DA0BB6DD13B7707C674C72DD1A7C1B3FD03B13832C8CFC13 +F48717AE3466F0F5:403CB3AFDA050BFB:\ +0F6997BD4AFACC4E2228180FA60A683D13C6E237325BC671 +8308D7DDC9BE043C:08FF7FB8D322FE1E:\ +77790E57117F767476AE9E623A839D1B5B596623CB193C08 +DA0EDCDC26C81F71:5E54344C7E8CF8A0:\ +1A34BA494ADC8ED74B6AD1EDAF317DA506FBDA7A0D0DD40C + +[GOST-28147-89(R3411_94_TestParam)] + +# The test vectors included in Crypto++ 5.6.0 +0DF82802B741A292:07F9027DF7F7DF89:\ +BE5EC2006CFF9DCF52354959F1FF0CBFE95061B5A648C10387069C25997C0672 + +1354EE9C0A11CD4C:4FB50536F960A7B1:\ +B385272AC8D72A5A8B344BC80363AC4D09BF58F41F540624CBCB8FDCF55307D7 + +6693D492C4B0CC39:670034AC0FA811B5:\ +AEE02F609A35660E4097E546FD3026B032CD107C7D459977ADF489BEF2652262 + +99E2D13080928D79:8118FF9D3B3CFE7D:\ +320E9D8422165D58911DFC7D8BBB1F81B0ECD924023BF94D9DF7DCF7801240E0 + +D1E787749C72814C:A083826A790D3E0C:\ +C9F703BBBFC63691BFA3B7B87EA8FD5E8E8EF384EF733F1A61AEF68C8FFA265F + +D4C05323A4F7A7B5:4D1F2E6B0D9DE2CE:\ +728FEE32F04B4C654AD7F607D71C660C2C2670D7C999713233149A1C0C17A1F0 + +8742D9A05F6A3AF6:2F3BB84879D11E52:\ +35FC96402209500FCFDEF5352D1ABB038FE33FC0D9D58512E56370B22BAA133B + +F86506DA04E41CB8:96F0A5C77A04F5CE:\ +D416F630BE65B7FE150656183370E07018234EE5DA3D89C4CE9152A03E5BFB77 + +# Generated by OpenSSL's gost89.c and GostR3411_94_TestParamSet +# This implementation was written by CryptoCom who is a Russian +# company active in standardizing GOST usage in the IETF, etc + +66320DB73158A35A:4732FE56B7854AF7:\ +67C6697351FF4AEC29CDBAABF2FBE3467CC254F81BE8E78D765A2E63339FC99A + +3E017E97EADC6B96:4CDDBE526625E368:\ +255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC67 + +75D8BE6189F95CBB:4FD8C167F5C05C76:\ +8F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C94 + +14735AC55E4B7963:DFCD9EFC3FA9BAFB:\ +A8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD1F231EA81C7B64C5 + +0BE11A1C7F23F829:E0BB12ECA3001350:\ +3B706424119E09DCAAD4ACF21B10AF3B33CDE3504847155CBB6F2219BA9B7DF5 + +167241EC4441196D:2361B9315757145A:\ +FA7F444FD5D2002D294B96C34DC57D297ED55FDA3214D99BD79F7A0EF8972DF2 + +2EDD19A28A1D950C:0B4CB6EE4CDBC46E:\ +8DAF30DA74AD04F28263CCB577A6504E45CB5C3D628A2F79FC706540B27EAD3F + +634BCA6A5D11B73A:990D426E1415B346:\ +8161C1F80712474CDDA3893F2DB8B829291D69DB9C161ACAF3336C7D51018AD2 + +E9E4E1E217ED0467:83F7B229D74D5068:\ +B5407AE2F9320C225075FDEC8C17B67F4A22FD9B24876D87D238F13049A86AFE + +40140A581D78BB49:D48ADCE9AE2DF9A7:\ +620153EE18096E622B6BFE4FF26BD6C4A3C8F4ED705FEB5943CC3B5AB93FC11C + +[GOST-28147-89(R3411_CryptoPro)] + +167241EC4441196D:A4BA7733087BF46B:\ +FA7F444FD5D2002D294B96C34DC57D297ED55FDA3214D99BD79F7A0EF8972DF2 + +2EDD19A28A1D950C:9F5F0C9271672126:\ +8DAF30DA74AD04F28263CCB577A6504E45CB5C3D628A2F79FC706540B27EAD3F + +634BCA6A5D11B73A:68E44CBA27E3B0C3:\ +8161C1F80712474CDDA3893F2DB8B829291D69DB9C161ACAF3336C7D51018AD2 + +E9E4E1E217ED0467:0B9B79E1AFE9D61F:\ +B5407AE2F9320C225075FDEC8C17B67F4A22FD9B24876D87D238F13049A86AFE + +40140A581D78BB49:5C960D01D404702D:\ +620153EE18096E622B6BFE4FF26BD6C4A3C8F4ED705FEB5943CC3B5AB93FC11C + +705616C1D3DE72D4:C934D4A3CDF6725C:\ +3AD1D828517CC8B001F0CA84010B3A0968AF11272336DE5A91A7AD69B49E7EEE + +EBEF9233826BE3C4:E29B5234B9903B4B:\ +CE3C58CF4893D9B042EAD76520B5C0B15C6D1A100B99FF7BEF153DC2F4AF96C2 + +87826FF76C95C3C3:ABDC9E8C2A556516:\ +55BA2A7570EA26CC5741DD62DADCDEC9F11B8CE5CA22A8B5113AE993A5CC58FA + +35FC60B2FFDA201E:391DD791413EAF33:\ +D6A025B07C037A6E1E0653E828FB9E3A3587CDDA5325D4DAA743D113D995D6AF + +3BE742AA8B844EB7:06798A7B621A4F7F:\ +E07306086FA442A42B107F7F355359DD972BF070C0C71FF5C37FA7C259C7E039 + +[IDEA] +D53FABBF94FF8B5F:1D0CB2AF1654820A:729A27ED8F5C3E8BAF16560D14C90B43 +848F836780938169:D7E0468226D0FC56:729A27ED8F5C3E8BAF16560D14C90B43 +819440CA2065D112:264A8BBA66959075:729A27ED8F5C3E8BAF16560D14C90B43 +6C2E3617DA2BAC35:1569E0627007B12E:729A27ED8F5C3E8BAF16560D14C90B43 +0808080808080808:F5DB1AC45E5EF9F9:9D4075C103BC322AFB03E7BE6AB30006 +0102030405060708:97BCD8200780DA86:3A984E2000195DB32EE501C8C47CEA60 +05320A6414C819FA:65BE87E7A2538AED:006400C8012C019001F4025802BC0320 +0000000100020003:11FBED2B01986DE5:00010002000300040005000600070008 +0102030405060708:540E5FEA18C2F8B1:00010002000300040005000600070008 +0019324B647D96AF:9F0A0AB6E10CED78:00010002000300040005000600070008 +F5202D5B9C671B08:CF18FD7355E2C5C5:00010002000300040005000600070008 +FAE6D2BEAA96826E:85DF52005608193D:00010002000300040005000600070008 +0A141E28323C4650:2F7DE750212FB734:00010002000300040005000600070008 +050A0F14191E2328:7B7314925DE59C09:00010002000300040005000600070008 +0102030405060708:3EC04780BEFF6E20:0005000A000F00140019001E00230028 +0000000000000000:0001000100000000:00000000000000000000000000000000 +D5D5D5D5D5D5D5D5:75F7C7005EA47839:D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 +4A4A4A4A4A4A4A4A:759A3CB94586706D:4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A +0000000000000000:AA553A5DEC50E4A4:00000000000000040000000000000000 +0000000000000001:0013FFF500120009:00000000000000000000000000000000 + +# Test vectors taken from ARIB STD-T63-35.203 V6.0.0 +[KASUMI] +EA024714AD5C4D84:DF1F9B251C0BF45F:2BD6459F82C5B300952C49104881FF48 +D3C5D592327FB11C:DE551988CEB2F9B7:8CE33E2CC3C0B5FC1F3DE8A6DC66B1F3 +62A540981BA6F9B7:4592B0E78690F71B:4035C6680AF8C6D1A8FF8667B1714013 + +# Checked against Crypto++ 2.3, so we're compatible with somebody, at least. +[Luby-Rackoff(SHA1)] +1112131415161718191A1B1C1D1E1F2021222324\ +25262728292A2B2C2D2E2F303132333435363738:\ +2015B3DB2DC49529C2D26B1F1E86C65EC7B946AB\ +127503CB92F07C0DD4ECD3D7700F31FA0268D381:\ +00112233445566778899AABBCCDDEEFF + +00112233445566778899AABBCCDDEEFF10213243\ +5465768798A9BACBDCEDFE0F2031425364758697:\ +84ACC1578337453D0F94FE2A09EAAE844B2BDE24\ +0F6D6225A0AD87EB3773BC29C2B85B51FD068674:\ +00112233445566778899AABBCCDDEEFF0123456789ABCDEFFEDCBA9876543210 + +[MARS] +F94512A9B42D034EC4792204D708A69B:225DA2CB64B73F79069F21A5E3CB8522:\ +CB14A1776ABBC1CDAFE7243DEF2CEA02 + +4DF955AD5B398D66408D620A2B27E1A9:A4B737340AE6D2CAFD930BA97D86129F:\ +86EDF4DA31824CABEF6A4637C40B0BAB + +93A953A82C10411DD158860838874D95:4FA0E5F64893131712F01408D233E9F7:\ +D158860838874D9500000000000000000000000000000000 + +1344ABA4D3C44708A8A72116D4F49384:458335D95EA42A9F4DCCD41AECC2390D:\ +FBA167983E7AEF22317CE28C02AAE1A3E8E5CC3CEDBEA82A99DBC39AD65E7227 + +00000000000000000000000000000000:DCC07B8DFB0738D6E30A22DFCF27E886:\ +00000000000000000000000000000000 + +DCC07B8DFB0738D6E30A22DFCF27E886:33CAFFBDDC7F1DDA0F9C15FA2F30E2FF:\ +00000000000000000000000000000000 + +33CAFFBDDC7F1DDA0F9C15FA2F30E2FF:62D0D531FD18BAC77177CEB2395EF18F:\ +00000000000000000000000000000000 + +62D0D531FD18BAC77177CEB2395EF18F:FC444017478822797D800F790622D77B:\ +00000000000000000000000000000000 + +FC444017478822797D800F790622D77B:D584ED203C50582BCBF74B0469417EDC:\ +00000000000000000000000000000000 + +D584ED203C50582BCBF74B0469417EDC:7134D3EF595D573FE88E18CE5CB2E612:\ +00000000000000000000000000000000 + +7134D3EF595D573FE88E18CE5CB2E612:9172072F22CFC72234A7697D73412DB9:\ +00000000000000000000000000000000 + +9172072F22CFC72234A7697D73412DB9:06B0DDCAAE6EA44BD0C509CE2BC838AC:\ +00000000000000000000000000000000 + +06B0DDCAAE6EA44BD0C509CE2BC838AC:77512E7A4A90D6D5CD66637DEEF1FD52:\ +00000000000000000000000000000000 + +77512E7A4A90D6D5CD66637DEEF1FD52:8BC4E466ABE0E2F8FD76019B8237F36E:\ +00000000000000000000000000000000 + +8BC4E466ABE0E2F8FD76019B8237F36E:77D40822866C0DD51E0594AA81E5F1B5:\ +00000000000000000000000000000000 + +77D40822866C0DD51E0594AA81E5F1B5:B8AB0608C7976E1D8F57B2BA493C7503:\ +00000000000000000000000000000000 + +B8AB0608C7976E1D8F57B2BA493C7503:ED4AFE77CE3A2F8C00D0A5E4FDF23426:\ +00000000000000000000000000000000 + +ED4AFE77CE3A2F8C00D0A5E4FDF23426:1B52C34EDB3826E2BF564E4E3A8C9FA6:\ +00000000000000000000000000000000 + +1B52C34EDB3826E2BF564E4E3A8C9FA6:AE7E643A355B4847D4F1DBD126518993:\ +00000000000000000000000000000000 + +AE7E643A355B4847D4F1DBD126518993:3E144191008102E869184D9714BAE7CF:\ +00000000000000000000000000000000 + +3E144191008102E869184D9714BAE7CF:89ABFA208A52F85CA60F296CE99FC97A:\ +00000000000000000000000000000000 + +89ABFA208A52F85CA60F296CE99FC97A:FA092A3DD37EF94837715BBC72C9008F:\ +00000000000000000000000000000000 + +FA092A3DD37EF94837715BBC72C9008F:8A2288E53B2F0DD376ED385911BB4BB9:\ +00000000000000000000000000000000 + +8A2288E53B2F0DD376ED385911BB4BB9:0CD12B0AEC2BA1C57F06E268A4BF5966:\ +00000000000000000000000000000000 + +0CD12B0AEC2BA1C57F06E268A4BF5966:0B86524D05D0963C1BDF538290156686:\ +00000000000000000000000000000000 + +0B86524D05D0963C1BDF538290156686:79031361A2E423A7C4D1613C3873C0A0:\ +00000000000000000000000000000000 + +79031361A2E423A7C4D1613C3873C0A0:DD66BC447E835A9F426D0A2267850461:\ +00000000000000000000000000000000 + +DD66BC447E835A9F426D0A2267850461:4294DCCF31F54E693179449F25B514CC:\ +00000000000000000000000000000000 + +4294DCCF31F54E693179449F25B514CC:0A402C1A0F2EB568EDB7252AFDA4192B:\ +00000000000000000000000000000000 + +0A402C1A0F2EB568EDB7252AFDA4192B:FFACF106A37C74D17009E2566E611BE0:\ +00000000000000000000000000000000 + +FFACF106A37C74D17009E2566E611BE0:99E058DA9540E6B5C5A869CB9204010B:\ +00000000000000000000000000000000 + +99E058DA9540E6B5C5A869CB9204010B:8D616AB19B75842DC5EF102CE4BB2A51:\ +00000000000000000000000000000000 + +8D616AB19B75842DC5EF102CE4BB2A51:06C7C640672895C3CCFD52DB2CD9D51B:\ +00000000000000000000000000000000 + +06C7C640672895C3CCFD52DB2CD9D51B:EB2B67E27ABCB5C06DA3D3EECEC8A25B:\ +00000000000000000000000000000000 + +EB2B67E27ABCB5C06DA3D3EECEC8A25B:62EC35DC05A0BA40FE5D33A0B974C152:\ +00000000000000000000000000000000 + +62EC35DC05A0BA40FE5D33A0B974C152:A4CB55D7881ACC44F868C8BCFE098091:\ +00000000000000000000000000000000 + +A4CB55D7881ACC44F868C8BCFE098091:5CEE73CEBCAA22DF78C8C9FB8A47E5D3:\ +00000000000000000000000000000000 + +5CEE73CEBCAA22DF78C8C9FB8A47E5D3:62FCD19C3AC4370A4CC58AA619B0EA2F:\ +00000000000000000000000000000000 + +62FCD19C3AC4370A4CC58AA619B0EA2F:3583E618DAC3CE4347FD0E8AE6D6F5E9:\ +00000000000000000000000000000000 + +3583E618DAC3CE4347FD0E8AE6D6F5E9:2B307B42E0B9EF2D2EC3EEA07D339A87:\ +00000000000000000000000000000000 + +2B307B42E0B9EF2D2EC3EEA07D339A87:29A212AF4220054975D7C2AE9242AFA8:\ +00000000000000000000000000000000 + +29A212AF4220054975D7C2AE9242AFA8:67D5BD878FF66CDB33A4DD07EB634F91:\ +00000000000000000000000000000000 + +67D5BD878FF66CDB33A4DD07EB634F91:53944CA7C3BBBBE32C9BA9D8A8B765D6:\ +00000000000000000000000000000000 + +53944CA7C3BBBBE32C9BA9D8A8B765D6:9213B43D06D0AB7ECCC5CA751C5DBAA8:\ +00000000000000000000000000000000 + +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:97778747D60E425C2B4202599DB856FB:\ +000000000000000000000000000000000000000000000000 + +97778747D60E425C2B4202599DB856FB:885C6C280610DA436936E3C5AEEB9512:\ +000000000000000000000000000000000000000000000000 + +885C6C280610DA436936E3C5AEEB9512:749935A9971B7060043018F95329A530:\ +000000000000000000000000000000000000000000000000 + +749935A9971B7060043018F95329A530:05F0D089DE79801B3BE3D3D1361628DD:\ +000000000000000000000000000000000000000000000000 + +05F0D089DE79801B3BE3D3D1361628DD:35F8044736D1FF4142460E4E72610700:\ +000000000000000000000000000000000000000000000000 + +35F8044736D1FF4142460E4E72610700:B7028947854FE0C670E1E7416C2803DC:\ +000000000000000000000000000000000000000000000000 + +B7028947854FE0C670E1E7416C2803DC:D4F8A703F24F7E0AC5807EADADCA8CC9:\ +000000000000000000000000000000000000000000000000 + +D4F8A703F24F7E0AC5807EADADCA8CC9:77F1D30164CD2984C52ACEC02CAE2CD9:\ +000000000000000000000000000000000000000000000000 + +77F1D30164CD2984C52ACEC02CAE2CD9:CE509EEFF43FB5C22A9756B023573775:\ +000000000000000000000000000000000000000000000000 + +CE509EEFF43FB5C22A9756B023573775:B9D5ACCA79E9719979DA1E657C391F07:\ +000000000000000000000000000000000000000000000000 + +B9D5ACCA79E9719979DA1E657C391F07:9E3B2E46FC6E2D71D46AF0D5CF36B456:\ +000000000000000000000000000000000000000000000000 + +9E3B2E46FC6E2D71D46AF0D5CF36B456:D8104637E81C52CCEFB0AFE87F4BAF85:\ +000000000000000000000000000000000000000000000000 + +D8104637E81C52CCEFB0AFE87F4BAF85:C7F9AF5B41E9EB5387DB1D122E483F0E:\ +000000000000000000000000000000000000000000000000 + +C7F9AF5B41E9EB5387DB1D122E483F0E:D7ACF96A441BB267B591FBCEECB0494F:\ +000000000000000000000000000000000000000000000000 + +D7ACF96A441BB267B591FBCEECB0494F:DA2234B06D83F32064A78AD3C5303D73:\ +000000000000000000000000000000000000000000000000 + +DA2234B06D83F32064A78AD3C5303D73:70EF6DCDD349CD7F1D1A0EB3CB18C8C7:\ +000000000000000000000000000000000000000000000000 + +70EF6DCDD349CD7F1D1A0EB3CB18C8C7:DA093FB2C0F00258D8D9F216C91C0C9C:\ +000000000000000000000000000000000000000000000000 + +DA093FB2C0F00258D8D9F216C91C0C9C:26EAEEAE8FBE4835E5C43CBF3249CBB6:\ +000000000000000000000000000000000000000000000000 + +26EAEEAE8FBE4835E5C43CBF3249CBB6:35692A1CC8E9FBB99DEE2AD149EE7F33:\ +000000000000000000000000000000000000000000000000 + +35692A1CC8E9FBB99DEE2AD149EE7F33:6929CAD6052F809A2850D7E754C11C8D:\ +000000000000000000000000000000000000000000000000 + +6929CAD6052F809A2850D7E754C11C8D:5F4E499D26ED1D290D9A187FB7B7FB14:\ +000000000000000000000000000000000000000000000000 + +5F4E499D26ED1D290D9A187FB7B7FB14:BC5B30B2BAE077710A9DF5686794965F:\ +000000000000000000000000000000000000000000000000 + +BC5B30B2BAE077710A9DF5686794965F:41661F98160A6556815A15B1C1C2E080:\ +000000000000000000000000000000000000000000000000 + +41661F98160A6556815A15B1C1C2E080:EC2E71697E742ABDBB5FE516E50DBAD5:\ +000000000000000000000000000000000000000000000000 + +EC2E71697E742ABDBB5FE516E50DBAD5:CB104FF2203633E97573D308923C7AE9:\ +000000000000000000000000000000000000000000000000 + +CB104FF2203633E97573D308923C7AE9:C47B77D5FAD3535CFAE0BE60B48C741E:\ +000000000000000000000000000000000000000000000000 + +C47B77D5FAD3535CFAE0BE60B48C741E:BCA5C36E33821A60CAF6E2DA72956C5E:\ +000000000000000000000000000000000000000000000000 + +BCA5C36E33821A60CAF6E2DA72956C5E:B780AA350F6EFB3B805E505A2D32249F:\ +000000000000000000000000000000000000000000000000 + +B780AA350F6EFB3B805E505A2D32249F:8857D872D91FE8937E292C8948C0AF24:\ +000000000000000000000000000000000000000000000000 + +8857D872D91FE8937E292C8948C0AF24:4FCF851C845CBD7D7C528F55B8E84662:\ +000000000000000000000000000000000000000000000000 + +4FCF851C845CBD7D7C528F55B8E84662:BDDEE7D374D810E3658670F46054F99B:\ +000000000000000000000000000000000000000000000000 + +BDDEE7D374D810E3658670F46054F99B:16A4F2C3A95B296FBB7F8DEC6F70A9D0:\ +000000000000000000000000000000000000000000000000 + +16A4F2C3A95B296FBB7F8DEC6F70A9D0:2583F970ED6970C6D0963015D67217B6:\ +000000000000000000000000000000000000000000000000 + +2583F970ED6970C6D0963015D67217B6:0E7BB2CDF9CD553709D2BE4E9497D2F3:\ +000000000000000000000000000000000000000000000000 + +0E7BB2CDF9CD553709D2BE4E9497D2F3:A6D82EE721AAF1BA1BC3EBD8C75ABA9F:\ +000000000000000000000000000000000000000000000000 + +A6D82EE721AAF1BA1BC3EBD8C75ABA9F:C1211304A35315EC827DAE80B3F29BBB:\ +000000000000000000000000000000000000000000000000 + +C1211304A35315EC827DAE80B3F29BBB:4F0842F2D9EA5CD1AB743A8626DA6BE7:\ +000000000000000000000000000000000000000000000000 + +4F0842F2D9EA5CD1AB743A8626DA6BE7:BF39E62B863AFFFAD3DEE960962E03AE:\ +000000000000000000000000000000000000000000000000 + +BF39E62B863AFFFAD3DEE960962E03AE:147C3CB084958D3FBB9D4223D3126BF3:\ +000000000000000000000000000000000000000000000000 + +147C3CB084958D3FBB9D4223D3126BF3:6E76BEF9304B115EFC1C9002FBB848A0:\ +000000000000000000000000000000000000000000000000 + +62E45B4CF3477F1DD65063729D9ABA8F:0F4B897EA014D21FBC20F1054A42F719:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0F4B897EA014D21FBC20F1054A42F719:9A4D42A7F27D42E542286ACF6650CF8A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9A4D42A7F27D42E542286ACF6650CF8A:5E5F71257B5156C075FDC4BCBE996527:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5E5F71257B5156C075FDC4BCBE996527:5A8112FB681B184766069A229BC0E1B6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5A8112FB681B184766069A229BC0E1B6:2169853AD199721728B2F41FF6C3F316:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2169853AD199721728B2F41FF6C3F316:FD3954D96EF5B4078F5C301BAF15A3DE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +FD3954D96EF5B4078F5C301BAF15A3DE:DB1F3D03E0012505E354B2F4D7C7A255:\ +0000000000000000000000000000000000000000000000000000000000000000 + +DB1F3D03E0012505E354B2F4D7C7A255:375CECE4E897512373B86A82A6A660D5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +375CECE4E897512373B86A82A6A660D5:4CDA1DDDD8849D47609D7D9803FD67D6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4CDA1DDDD8849D47609D7D9803FD67D6:20A6C90C54A118487C173AE3166EF219:\ +0000000000000000000000000000000000000000000000000000000000000000 + +20A6C90C54A118487C173AE3166EF219:F4A0164DFC1F38E967F3DDE74B7B0CAD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F4A0164DFC1F38E967F3DDE74B7B0CAD:638D1B47820C0FD0A1BFA5FB05AE9087:\ +0000000000000000000000000000000000000000000000000000000000000000 + +638D1B47820C0FD0A1BFA5FB05AE9087:CDE141CD9E784912B6BEFD62003FE253:\ +0000000000000000000000000000000000000000000000000000000000000000 + +CDE141CD9E784912B6BEFD62003FE253:84276E8EB17CB38307F3ACFE9480A771:\ +0000000000000000000000000000000000000000000000000000000000000000 + +84276E8EB17CB38307F3ACFE9480A771:27BA4090E1929A7E65D0C5078039A677:\ +0000000000000000000000000000000000000000000000000000000000000000 + +27BA4090E1929A7E65D0C5078039A677:264E4F150552D0D5F81583635189EED1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +264E4F150552D0D5F81583635189EED1:F052005B58BE2C8981575BA5C31D812C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F052005B58BE2C8981575BA5C31D812C:807E73C57A18CA88CA0F58C2FFD06394:\ +0000000000000000000000000000000000000000000000000000000000000000 + +807E73C57A18CA88CA0F58C2FFD06394:C317C6C0411947887DFCE0A9B2270B5F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C317C6C0411947887DFCE0A9B2270B5F:8ACD4164453A4C1C0DACBC8C2ED0896C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8ACD4164453A4C1C0DACBC8C2ED0896C:2BA5D280D05FBAF78A8B55BF5FD8D343:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2BA5D280D05FBAF78A8B55BF5FD8D343:DDF70B8350ED845F6D875B0C85961D39:\ +0000000000000000000000000000000000000000000000000000000000000000 + +DDF70B8350ED845F6D875B0C85961D39:039FD445F0A6D65698D5146D498C8BDB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +039FD445F0A6D65698D5146D498C8BDB:22AE4D552D09558DEEEFC9518C01F4E2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +22AE4D552D09558DEEEFC9518C01F4E2:D5947EA67A7BD88DA577A28254EE44EF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D5947EA67A7BD88DA577A28254EE44EF:22698C92691EE76CAD72880F577EFEC3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +22698C92691EE76CAD72880F577EFEC3:10ECA6E5E499742DDEC48434B767EBA1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +10ECA6E5E499742DDEC48434B767EBA1:3D97E93A44C2CB1CE9AF5770A4BD1A34:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3D97E93A44C2CB1CE9AF5770A4BD1A34:F89C438D5311FC8235C632629CE1F3A0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F89C438D5311FC8235C632629CE1F3A0:4114C623ADF6DB0958FFA2DC27A2A828:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4114C623ADF6DB0958FFA2DC27A2A828:980089430C89563A5510DF5196E07040:\ +0000000000000000000000000000000000000000000000000000000000000000 + +980089430C89563A5510DF5196E07040:1D1FEFBD55AA23487CD2DEC4D370302D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +1D1FEFBD55AA23487CD2DEC4D370302D:73A8AAE732EF445F3462353181168B23:\ +0000000000000000000000000000000000000000000000000000000000000000 + +73A8AAE732EF445F3462353181168B23:1D8116306AF7D70FE419226F35251687:\ +0000000000000000000000000000000000000000000000000000000000000000 + +1D8116306AF7D70FE419226F35251687:84EFA8A595B06C91A5A083440DAF5B50:\ +0000000000000000000000000000000000000000000000000000000000000000 + +84EFA8A595B06C91A5A083440DAF5B50:630EECD4A8A957A610765E01A1D07C45:\ +0000000000000000000000000000000000000000000000000000000000000000 + +630EECD4A8A957A610765E01A1D07C45:825A47AD6FCE09FEDB5D8F07DE6A2707:\ +0000000000000000000000000000000000000000000000000000000000000000 + +825A47AD6FCE09FEDB5D8F07DE6A2707:0C472D25510DD0592B5130FB4272DECA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0C472D25510DD0592B5130FB4272DECA:3DA22A91B605A540E474383672C8D06C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3DA22A91B605A540E474383672C8D06C:9A1C14309E4B246C9E7B485A7F41D046:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B3E2AD5608AC1B6733A7CB4FDF8F9952:\ +80000000000000000000000000000000 + +00000000000000000000000000000000:8655D5CCAF76A3A8AA09841F04689465:\ +40000000000000000000000000000000 + +00000000000000000000000000000000:F611F21A70C0AB5FB3D52AD5E8196E09:\ +20000000000000000000000000000000 + +00000000000000000000000000000000:6676D02EAE3EE58FA396BE40A3A6A234:\ +10000000000000000000000000000000 + +00000000000000000000000000000000:786E147E5D66764A16DFE1DCB10F3F13:\ +08000000000000000000000000000000 + +00000000000000000000000000000000:FDDBC84DA51496AD1CA2B7013B93FFA8:\ +04000000000000000000000000000000 + +00000000000000000000000000000000:B5A0BB3A8E7FEAC192B7BF8080E2CC81:\ +02000000000000000000000000000000 + +00000000000000000000000000000000:9A4802E8BF4426467617E9A44072EB76:\ +01000000000000000000000000000000 + +00000000000000000000000000000000:BE279F4EE696EC5B07820A1066F110CD:\ +00800000000000000000000000000000 + +00000000000000000000000000000000:4BBB919E52C258960549FAE9DD5FF524:\ +00400000000000000000000000000000 + +00000000000000000000000000000000:6B077B5DE4C9961DC6E11053662E3CFB:\ +00200000000000000000000000000000 + +00000000000000000000000000000000:755358499858F166C9DEAF2E79B3EDA3:\ +00100000000000000000000000000000 + +00000000000000000000000000000000:632644AA2ACB4FB3214E9E5BFF57D4D8:\ +00080000000000000000000000000000 + +00000000000000000000000000000000:DD3F06DD5A90BD7EA3F4B1BFB56E4ABB:\ +00040000000000000000000000000000 + +00000000000000000000000000000000:B2FB07551FD5B549C857020356B99D45:\ +00020000000000000000000000000000 + +00000000000000000000000000000000:5DE9EF4627A3EB6FD3920C322ECE9FAB:\ +00010000000000000000000000000000 + +00000000000000000000000000000000:A8D37D0254E1C908AAD02631B614A0C6:\ +00008000000000000000000000000000 + +00000000000000000000000000000000:91372C769C1E64DE0FDDC1C63436B623:\ +00004000000000000000000000000000 + +00000000000000000000000000000000:4F8FF5063FFF638497733E1526EE27BD:\ +00002000000000000000000000000000 + +00000000000000000000000000000000:5157ECB5597AC6A8D761E97517C65C0F:\ +00001000000000000000000000000000 + +00000000000000000000000000000000:117B9349CFFD2066452CC0FE204C18A5:\ +00000800000000000000000000000000 + +00000000000000000000000000000000:AE0AF51926529A3F354F7585578F6439:\ +00000400000000000000000000000000 + +00000000000000000000000000000000:B2723B8D2D61497DBF44FF9D70E48C0E:\ +00000200000000000000000000000000 + +00000000000000000000000000000000:464B3EB2A0F8A394DA239E0D0D62EDE2:\ +00000100000000000000000000000000 + +00000000000000000000000000000000:AA03D30E1CE0E91DC360B1E538017F05:\ +00000080000000000000000000000000 + +00000000000000000000000000000000:B1EDF5E18160BF8E16F386D999BF65BE:\ +00000040000000000000000000000000 + +00000000000000000000000000000000:85F1BDD358B23675328841103F1DCE65:\ +00000020000000000000000000000000 + +00000000000000000000000000000000:38DEA42C35E5758C7C5CCF451936DFCB:\ +00000010000000000000000000000000 + +00000000000000000000000000000000:E484E7CB2D35D5AE92939B06864A0E6B:\ +00000008000000000000000000000000 + +00000000000000000000000000000000:53B7E22F63F4D8AAC66D148619A7691D:\ +00000004000000000000000000000000 + +00000000000000000000000000000000:0042A8EDB756329533D82ED13386E648:\ +00000002000000000000000000000000 + +00000000000000000000000000000000:44BBDB223AFCC69EB69C5D07AF10E5D8:\ +00000001000000000000000000000000 + +00000000000000000000000000000000:C5B1739AF4C0AE459BF11144132D0979:\ +00000000800000000000000000000000 + +00000000000000000000000000000000:151BBFAECB027BAB90C8DA3E4743F033:\ +00000000400000000000000000000000 + +00000000000000000000000000000000:376786816F319B96A19B134143952FE5:\ +00000000200000000000000000000000 + +00000000000000000000000000000000:3E94AC897203461EFD9EED441F66AE9F:\ +00000000100000000000000000000000 + +00000000000000000000000000000000:61A93766162F0B01EDC84D47B1D4ECAA:\ +00000000080000000000000000000000 + +00000000000000000000000000000000:B21FA9D0AC731750F15B47FFF2BC4030:\ +00000000040000000000000000000000 + +00000000000000000000000000000000:BDE8813E0E4EAE6CECCBC4C6BD10C610:\ +00000000020000000000000000000000 + +00000000000000000000000000000000:50A5AE30DC3432F3060EE3628B274FFB:\ +00000000010000000000000000000000 + +00000000000000000000000000000000:E3DA95B76AD9E29F0B3F14DD33C670AC:\ +00000000008000000000000000000000 + +00000000000000000000000000000000:969DC8A583DED13E53042450FA4BE8FA:\ +00000000004000000000000000000000 + +00000000000000000000000000000000:D7CB0D2F9BFF048CBD8CBD8452361611:\ +00000000002000000000000000000000 + +00000000000000000000000000000000:E056677749114108153C6AC262EC0396:\ +00000000001000000000000000000000 + +00000000000000000000000000000000:E5572F1812044977D4309B8D675CAE48:\ +00000000000800000000000000000000 + +00000000000000000000000000000000:F00C1AB95B5CE3D3ACC2162E7A7F0262:\ +00000000000400000000000000000000 + +00000000000000000000000000000000:AB33C3682E0C1BFA627F4932AE4AAD94:\ +00000000000200000000000000000000 + +00000000000000000000000000000000:EE5B68820CB978CAACA22B1D590E31CF:\ +00000000000100000000000000000000 + +00000000000000000000000000000000:8ACACFB9E872873E315D84657613756B:\ +00000000000080000000000000000000 + +00000000000000000000000000000000:75CD1E528E5B6DB21BC8E44E70E5ECFA:\ +00000000000040000000000000000000 + +00000000000000000000000000000000:3195CE6F460654E6FC00672755A5B7C3:\ +00000000000020000000000000000000 + +00000000000000000000000000000000:8ACC17F3EDF59AA02DBBA93F27AD11D0:\ +00000000000010000000000000000000 + +00000000000000000000000000000000:DD82C41281BE711F7E5DCDCDC6CBBF6F:\ +00000000000008000000000000000000 + +00000000000000000000000000000000:971ABFC0649C9ABE7DE583799F31DD9D:\ +00000000000004000000000000000000 + +00000000000000000000000000000000:9CD8E45DE9909A8146956F2B581AE664:\ +00000000000002000000000000000000 + +00000000000000000000000000000000:095314A316B4DB9CE6F2CDDEC59ECE89:\ +00000000000001000000000000000000 + +00000000000000000000000000000000:B626E1C40D644E2E72370CA4A3528576:\ +00000000000000800000000000000000 + +00000000000000000000000000000000:002E4294BD6DDE3E3BFFB0CF5A5A7D4B:\ +00000000000000400000000000000000 + +00000000000000000000000000000000:DA89C327F041BEBDB09E835ED2A2DDBE:\ +00000000000000200000000000000000 + +00000000000000000000000000000000:9BC999880C14C9358CA89C435B1FDB00:\ +00000000000000100000000000000000 + +00000000000000000000000000000000:D0C92CFF98EB228C6C19B405E6EFEE77:\ +00000000000000080000000000000000 + +00000000000000000000000000000000:FAE5C83332BB176704F0E73B27442C0C:\ +00000000000000040000000000000000 + +00000000000000000000000000000000:DC9FB83F80E56CAF1DB807B5921927E8:\ +00000000000000020000000000000000 + +00000000000000000000000000000000:6FBB39934CC2627EE4F93343F50EB9D4:\ +00000000000000010000000000000000 + +00000000000000000000000000000000:02A31EDEF8DEA2DE3307748BF4DC1C54:\ +00000000000000008000000000000000 + +00000000000000000000000000000000:8C433C3D2005B30996ADA41F896436AC:\ +00000000000000004000000000000000 + +00000000000000000000000000000000:ED04C68D4D73C6EE193E0FC9E2CBD1B0:\ +00000000000000002000000000000000 + +00000000000000000000000000000000:515E01A6F25A4F1B2B57B27DECBFF195:\ +00000000000000001000000000000000 + +00000000000000000000000000000000:30A07996E5C40C41786FC75B9C56325B:\ +00000000000000000800000000000000 + +00000000000000000000000000000000:279C94707B0732D210DA7B619158825A:\ +00000000000000000400000000000000 + +00000000000000000000000000000000:07552A95AC44BB11CD34428C858FD19F:\ +00000000000000000200000000000000 + +00000000000000000000000000000000:BA67FC2E51DA92EA19079B237B42C9D8:\ +00000000000000000100000000000000 + +00000000000000000000000000000000:40387C974070B484E0DBAAFD5ADA0243:\ +00000000000000000080000000000000 + +00000000000000000000000000000000:3BF99A29B17D84BE5F8DC315616061F8:\ +00000000000000000040000000000000 + +00000000000000000000000000000000:D4EF00C794D337961FD9E3B5AF7A67A5:\ +00000000000000000020000000000000 + +00000000000000000000000000000000:1C77C28A6CBF3CBB24F2686ED3A408E2:\ +00000000000000000010000000000000 + +00000000000000000000000000000000:F93568CD7CBA7A6E9B9DD7144F1D4ABB:\ +00000000000000000008000000000000 + +00000000000000000000000000000000:C3BCD1F7F268E2806CCF0498C85D2E3E:\ +00000000000000000004000000000000 + +00000000000000000000000000000000:2FD2F0DEB5DBF7EB3B9050042E56A9A9:\ +00000000000000000002000000000000 + +00000000000000000000000000000000:2150DEB8C7C6327227A772031FF64047:\ +00000000000000000001000000000000 + +00000000000000000000000000000000:3E8B4B1CBB877B6F612BFB391043CFC3:\ +00000000000000000000800000000000 + +00000000000000000000000000000000:2376F56DFEB40C9348D758CA068C2127:\ +00000000000000000000400000000000 + +00000000000000000000000000000000:AABB351CA9BDCDACCD8E966766FF1C59:\ +00000000000000000000200000000000 + +00000000000000000000000000000000:212EF966B6CEECC65B5B0AE6A9DAA099:\ +00000000000000000000100000000000 + +00000000000000000000000000000000:99C95AC67935AE473E2EF3907DDCE5B3:\ +00000000000000000000080000000000 + +00000000000000000000000000000000:125DC68286DB1F81E6CD3D0C9EF8B922:\ +00000000000000000000040000000000 + +00000000000000000000000000000000:CC55D94C0102A12D87454DB8BA8E654C:\ +00000000000000000000020000000000 + +00000000000000000000000000000000:3F1E089ACAD719F7DB9292A770038475:\ +00000000000000000000010000000000 + +00000000000000000000000000000000:EC4D155D404F72B4BE88D1E17C345822:\ +00000000000000000000008000000000 + +00000000000000000000000000000000:276F8AECA95C7F65CD95B77680955548:\ +00000000000000000000004000000000 + +00000000000000000000000000000000:7D78CE850C26BB18B8631CDFF0A5E597:\ +00000000000000000000002000000000 + +00000000000000000000000000000000:6345692D62E879A058F342D5226A036D:\ +00000000000000000000001000000000 + +00000000000000000000000000000000:E19D5A2899061B7B5537EA6DF0390FE8:\ +00000000000000000000000800000000 + +00000000000000000000000000000000:4FAB8BB80E979853052BA0B19EF8521D:\ +00000000000000000000000400000000 + +00000000000000000000000000000000:E84EE11321AF1C0AE6430C4F600270B4:\ +00000000000000000000000200000000 + +00000000000000000000000000000000:73048F29C44F0953DFCC6B5380D36977:\ +00000000000000000000000100000000 + +00000000000000000000000000000000:16280B84B187AE90E25121AB297620FA:\ +00000000000000000000000080000000 + +00000000000000000000000000000000:FAAE881E9FA9DCA876B668CCAFA12B6A:\ +00000000000000000000000040000000 + +00000000000000000000000000000000:46A73C4A4516E1E0BE2140E175A7225F:\ +00000000000000000000000020000000 + +00000000000000000000000000000000:01C71A7B0BD6410894C9234A4250ABB4:\ +00000000000000000000000010000000 + +00000000000000000000000000000000:EA8CEF3C1E8EF94D4A17A4D4C1C28C32:\ +00000000000000000000000008000000 + +00000000000000000000000000000000:13BB356657B36C0D023047B324443468:\ +00000000000000000000000004000000 + +00000000000000000000000000000000:B14DCC5250036260131B3D92B1B26C18:\ +00000000000000000000000002000000 + +00000000000000000000000000000000:261E07BADC6E4BBB0EAD9ECCAE179821:\ +00000000000000000000000001000000 + +00000000000000000000000000000000:1D40D508EB8878251EC5C01D8E9949BB:\ +00000000000000000000000000800000 + +00000000000000000000000000000000:735BDCA8DF0C58679161E99BED3B8D3E:\ +00000000000000000000000000400000 + +00000000000000000000000000000000:49C907F757494623F8E8519F4A5D13A0:\ +00000000000000000000000000200000 + +00000000000000000000000000000000:AB858C224E5A3ADDF5A7549A98EEAF94:\ +00000000000000000000000000100000 + +00000000000000000000000000000000:7C7A62A1DBF206572A323682E0441458:\ +00000000000000000000000000080000 + +00000000000000000000000000000000:7461D6F4D609F8BCA9CAB4EB559C71C3:\ +00000000000000000000000000040000 + +00000000000000000000000000000000:2F646495150F4F9CA06B77281C1150FD:\ +00000000000000000000000000020000 + +00000000000000000000000000000000:A0C27498F797D6A9F513640AFE6CC316:\ +00000000000000000000000000010000 + +00000000000000000000000000000000:8D511A840453125335AB8DF8C64FA8E8:\ +00000000000000000000000000008000 + +00000000000000000000000000000000:9E64465740D81CCB74713A144F636985:\ +00000000000000000000000000004000 + +00000000000000000000000000000000:804499E6C6E8790988747009D3B3C66D:\ +00000000000000000000000000002000 + +00000000000000000000000000000000:59EBC223BAC60B13198C9AF47066274E:\ +00000000000000000000000000001000 + +00000000000000000000000000000000:CCA216CC095954AFD3DE594C91A26310:\ +00000000000000000000000000000800 + +00000000000000000000000000000000:06FF525F42EFF20A548DA1B7DCD1FFF8:\ +00000000000000000000000000000400 + +00000000000000000000000000000000:B2F1FD473FCA588111E6EB9DCE82CFA9:\ +00000000000000000000000000000200 + +00000000000000000000000000000000:557307573D2E5225AD6EDADDF1FCAB68:\ +00000000000000000000000000000100 + +00000000000000000000000000000000:CA159F81D155071BDCA701174C69184D:\ +00000000000000000000000000000080 + +00000000000000000000000000000000:41491AE31AB75E3ACA41B1A2CB75C1D9:\ +00000000000000000000000000000040 + +00000000000000000000000000000000:C3B4B9419C0E19D4A851C2DAD2954268:\ +00000000000000000000000000000020 + +00000000000000000000000000000000:6E3DD6DF183B80A0FF5D2D0A4B25A2C8:\ +00000000000000000000000000000010 + +00000000000000000000000000000000:EC69E1BD0815AE6C83876B75E58A7EB6:\ +00000000000000000000000000000008 + +00000000000000000000000000000000:8F5766DE11517F63A60459B1EDC32D44:\ +00000000000000000000000000000004 + +00000000000000000000000000000000:8A74C64985345925D8A6AB8E6A0D3589:\ +00000000000000000000000000000002 + +00000000000000000000000000000000:F65B8E5EAF04B33AD5FCF1B14874E059:\ +00000000000000000000000000000001 + +00000000000000000000000000000000:FD04E0B77403BBDC72A370240B45B92D:\ +800000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CB0B4AC08E20385D31CF468B52B356E2:\ +400000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C39B63B4A8F7BF5C3CC61141584DE462:\ +200000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C63F433FF98BEE849D75D0F0402C9273:\ +100000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:9433992C094CDBEC06199B0517970B5D:\ +080000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FA8B068AD3C2C32F99EF1A4F76C409AF:\ +040000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:014617D6109068C39137EE0CC522163E:\ +020000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:41B87685C649AD72C32D9390C23CF34B:\ +010000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6836281F31AA9120DC144E26074491EC:\ +008000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C4163CB0CA1315C3D0115D495E0FF701:\ +004000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F0B8F3585636D2785FF619523C4365B9:\ +002000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6E1740E818B450955C6B7612DBBA0DAE:\ +001000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:192A2FAAC85794EB20E43645E2E1B749:\ +000800000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5CA4011E7024A4978B58E1DFA9278625:\ +000400000000000000000000000000000000000000000000 + +00000000000000000000000000000000:498152C714A2CEFD692AC99DB90CDDBD:\ +000200000000000000000000000000000000000000000000 + +00000000000000000000000000000000:DEB3A9FEB22886C511A057AB858BB4DD:\ +000100000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D60466B1EA5C1C7A5DDFDA049A685B50:\ +000080000000000000000000000000000000000000000000 + +00000000000000000000000000000000:62A0EE49A6333815350E9C9CD7CB24D2:\ +000040000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3AE70846AFDCC299B32EB9DE118070B8:\ +000020000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5118414720E424364E15B5EDC8E64559:\ +000010000000000000000000000000000000000000000000 + +00000000000000000000000000000000:42F9E38F7FB493D6048C63F804F5AD62:\ +000008000000000000000000000000000000000000000000 + +00000000000000000000000000000000:71043DAA3CF78997D9965DE84B150FA6:\ +000004000000000000000000000000000000000000000000 + +00000000000000000000000000000000:55B0DF5816DD16D2EB5CDDC5478D0652:\ +000002000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CA853E905496251FF856259149FB5CCA:\ +000001000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BEF7C892708F0369378EA80C0EB9DD4A:\ +000000800000000000000000000000000000000000000000 + +00000000000000000000000000000000:3E7D986D91BEE75E597999C3E7372F06:\ +000000400000000000000000000000000000000000000000 + +00000000000000000000000000000000:8877D8DAF98680C7EC03C870BAFB66F9:\ +000000200000000000000000000000000000000000000000 + +00000000000000000000000000000000:493B8E5D02D01A6C98DDF4D016F4932D:\ +000000100000000000000000000000000000000000000000 + +00000000000000000000000000000000:E372455C9A44DCD5AEA803A276B2C5C3:\ +000000080000000000000000000000000000000000000000 + +00000000000000000000000000000000:92FCA63F71BCD0C950231E104D833246:\ +000000040000000000000000000000000000000000000000 + +00000000000000000000000000000000:1630F75A2F31B1998725D849CC2ADA9A:\ +000000020000000000000000000000000000000000000000 + +00000000000000000000000000000000:E3B636FC5BE0F05A036AEDF4DE7154BD:\ +000000010000000000000000000000000000000000000000 + +00000000000000000000000000000000:DBC8BD2D128A11715152306E19C9D1F9:\ +000000008000000000000000000000000000000000000000 + +00000000000000000000000000000000:AEFB45876EE3B0025A2D26A7A20E2A72:\ +000000004000000000000000000000000000000000000000 + +00000000000000000000000000000000:C7F1370CD98539026B8FD0968F7A8247:\ +000000002000000000000000000000000000000000000000 + +00000000000000000000000000000000:6D09CC037CDFD06ECAC142630A599C4F:\ +000000001000000000000000000000000000000000000000 + +00000000000000000000000000000000:94C29805153DB7FE4834BD261F0CA87E:\ +000000000800000000000000000000000000000000000000 + +00000000000000000000000000000000:B509BAF1EAB92764F8085764968CD111:\ +000000000400000000000000000000000000000000000000 + +00000000000000000000000000000000:E6ECD9CCAF93F302250A90E3C083C22E:\ +000000000200000000000000000000000000000000000000 + +00000000000000000000000000000000:1419D2C7A7A8F7AB5D78B327770EE8F7:\ +000000000100000000000000000000000000000000000000 + +00000000000000000000000000000000:984FA23C883200CFA802FCBF1DE752A2:\ +000000000080000000000000000000000000000000000000 + +00000000000000000000000000000000:003BFBA6334DEDFF7A3652DFDC73D04A:\ +000000000040000000000000000000000000000000000000 + +00000000000000000000000000000000:B21EC3CCD1303B81744348C64B5E5984:\ +000000000020000000000000000000000000000000000000 + +00000000000000000000000000000000:58557001247E8AFE91399042E723751B:\ +000000000010000000000000000000000000000000000000 + +00000000000000000000000000000000:0EF33C5A09600898D9FFE6AF5A06C2B6:\ +000000000008000000000000000000000000000000000000 + +00000000000000000000000000000000:AA0E866FEE8227BF6A8FDA4B318920AB:\ +000000000004000000000000000000000000000000000000 + +00000000000000000000000000000000:839A0DA3DB2718EEBB917B4CE37D23BF:\ +000000000002000000000000000000000000000000000000 + +00000000000000000000000000000000:BA3292A8130B2708EEBC5B2478B52C17:\ +000000000001000000000000000000000000000000000000 + +00000000000000000000000000000000:49B2A8F2FC9639B5918176993D96646A:\ +000000000000800000000000000000000000000000000000 + +00000000000000000000000000000000:21967CDE8F85ED1600F359F376CD18CA:\ +000000000000400000000000000000000000000000000000 + +00000000000000000000000000000000:6CCA94D43AB4B3A82FA4E514D928E644:\ +000000000000200000000000000000000000000000000000 + +00000000000000000000000000000000:3C76EAC404CF1E23B0A159C919A60206:\ +000000000000100000000000000000000000000000000000 + +00000000000000000000000000000000:F9DE0E78E8CC16D3A99D7642DEA13DB0:\ +000000000000080000000000000000000000000000000000 + +00000000000000000000000000000000:5B74643F1DEA8CA49078E4BF54B856CA:\ +000000000000040000000000000000000000000000000000 + +00000000000000000000000000000000:0E07FE27FBFAB005FF7EF334C3320736:\ +000000000000020000000000000000000000000000000000 + +00000000000000000000000000000000:477810CB11FC7E68144960AAD5372A64:\ +000000000000010000000000000000000000000000000000 + +00000000000000000000000000000000:A638D2171A231AFF384C97A7E9EFF6B6:\ +000000000000008000000000000000000000000000000000 + +00000000000000000000000000000000:9EA186F9AA6BE6D395E92474CCB9CAA3:\ +000000000000004000000000000000000000000000000000 + +00000000000000000000000000000000:7F6A295094E5512EDEA0B7206B977270:\ +000000000000002000000000000000000000000000000000 + +00000000000000000000000000000000:2DD07726A9333391A6EB41F4859A1627:\ +000000000000001000000000000000000000000000000000 + +00000000000000000000000000000000:515847FB17843E42C936A6201DF28563:\ +000000000000000800000000000000000000000000000000 + +00000000000000000000000000000000:35B29379EABD877B458FC4A4FB532931:\ +000000000000000400000000000000000000000000000000 + +00000000000000000000000000000000:B986149A6E871ACD8E3E1E5F5928C889:\ +000000000000000200000000000000000000000000000000 + +00000000000000000000000000000000:84D0A488FB56ADB915B553B2EDDBCC41:\ +000000000000000100000000000000000000000000000000 + +00000000000000000000000000000000:63B2B5A4D51E076D673044C71DC68B02:\ +000000000000000080000000000000000000000000000000 + +00000000000000000000000000000000:F388AD195E35B2892E586B830D728440:\ +000000000000000040000000000000000000000000000000 + +00000000000000000000000000000000:8FA923E8949678F76205CF4CBE07FF2F:\ +000000000000000020000000000000000000000000000000 + +00000000000000000000000000000000:ACCF2708E75B4CF48E45B641B81C1F41:\ +000000000000000010000000000000000000000000000000 + +00000000000000000000000000000000:0A7C295579AD4296447B7E56EB719ED3:\ +000000000000000008000000000000000000000000000000 + +00000000000000000000000000000000:06572AAB88739B2BDEE8E1E9CCA22883:\ +000000000000000004000000000000000000000000000000 + +00000000000000000000000000000000:2CF0CA3DB58CDC62890D386B07A4145F:\ +000000000000000002000000000000000000000000000000 + +00000000000000000000000000000000:CEFAEB3CEAA5959FAB15E884D46E9F09:\ +000000000000000001000000000000000000000000000000 + +00000000000000000000000000000000:57EB477F0573D6C75E45EE8606B5A2B6:\ +000000000000000000800000000000000000000000000000 + +00000000000000000000000000000000:C55F45149DE0FD18F2588B2B9F54CC22:\ +000000000000000000400000000000000000000000000000 + +00000000000000000000000000000000:ABCA7BE4CCC597AD8783C24EAB8BF17D:\ +000000000000000000200000000000000000000000000000 + +00000000000000000000000000000000:702F3D046E8651BF40D6A5914D8AC8B5:\ +000000000000000000100000000000000000000000000000 + +00000000000000000000000000000000:2C6424E1EF097C8FB44138C8A5160AE7:\ +000000000000000000080000000000000000000000000000 + +00000000000000000000000000000000:3F0E8296D93C233CBBE22623CCB66A52:\ +000000000000000000040000000000000000000000000000 + +00000000000000000000000000000000:D828348AFD520F98ED31F0B9FA4C48B1:\ +000000000000000000020000000000000000000000000000 + +00000000000000000000000000000000:BA7A4AA5F32D16DF08ABAA63E72F8BAD:\ +000000000000000000010000000000000000000000000000 + +00000000000000000000000000000000:9211FA0B1161E094BE702157D4CAFC73:\ +000000000000000000008000000000000000000000000000 + +00000000000000000000000000000000:1A4D5C52FDDEE81374295341F950055D:\ +000000000000000000004000000000000000000000000000 + +00000000000000000000000000000000:9544A653B635734B0FBC84E6C64B1AD5:\ +000000000000000000002000000000000000000000000000 + +00000000000000000000000000000000:8B7E7EE1A74570F35183E15D05114BD0:\ +000000000000000000001000000000000000000000000000 + +00000000000000000000000000000000:6567CE30F21EE879D60359CEE9AD3EC0:\ +000000000000000000000800000000000000000000000000 + +00000000000000000000000000000000:E5078C9B9B7572A60822A44150C6A4F4:\ +000000000000000000000400000000000000000000000000 + +00000000000000000000000000000000:51DFF3FE97481F08F6D5B66480AEE6D5:\ +000000000000000000000200000000000000000000000000 + +00000000000000000000000000000000:E84E478B15FB1BCD50E3CA9936FE9E01:\ +000000000000000000000100000000000000000000000000 + +00000000000000000000000000000000:FC614E54348A78E28ADB5DFB11130ADC:\ +000000000000000000000080000000000000000000000000 + +00000000000000000000000000000000:0F872CF9F54CE981ED17E41B23ED616C:\ +000000000000000000000040000000000000000000000000 + +00000000000000000000000000000000:AFCC9646ED78283BD19092853223F347:\ +000000000000000000000020000000000000000000000000 + +00000000000000000000000000000000:35D5A827B175D776F8F90F30F41A1C4B:\ +000000000000000000000010000000000000000000000000 + +00000000000000000000000000000000:B55980544140E694FCDFCE7C251C121C:\ +000000000000000000000008000000000000000000000000 + +00000000000000000000000000000000:244C4A55D5EEC8BD55C4F0D295ED2541:\ +000000000000000000000004000000000000000000000000 + +00000000000000000000000000000000:B3700314BD37894991C2FD4355B26845:\ +000000000000000000000002000000000000000000000000 + +00000000000000000000000000000000:43F3C6FFB517CD6E8EE1AEFCAA6FDE06:\ +000000000000000000000001000000000000000000000000 + +00000000000000000000000000000000:0F1A3E34821335E4EC22D404155192C2:\ +000000000000000000000000800000000000000000000000 + +00000000000000000000000000000000:22C59B22CC6A1E0EA313346F461324CD:\ +000000000000000000000000400000000000000000000000 + +00000000000000000000000000000000:2A90EF00D977A82EBDF6681F33D7DC1C:\ +000000000000000000000000200000000000000000000000 + +00000000000000000000000000000000:4B36176A8C174A635BF96A5B46BCF54C:\ +000000000000000000000000100000000000000000000000 + +00000000000000000000000000000000:E344C5213246712CAA2A056A6EE1868F:\ +000000000000000000000000080000000000000000000000 + +00000000000000000000000000000000:8F75D3C2ABBF84F3AA5E1734D6CC76A6:\ +000000000000000000000000040000000000000000000000 + +00000000000000000000000000000000:2258F75A5FC2B667DD0B28039CEA784C:\ +000000000000000000000000020000000000000000000000 + +00000000000000000000000000000000:D74F3EA90D02FC4908FDDCBE5849152E:\ +000000000000000000000000010000000000000000000000 + +00000000000000000000000000000000:0DCD8607E57390DD609717338591B205:\ +000000000000000000000000008000000000000000000000 + +00000000000000000000000000000000:594419C26F408B721F82ACCAC2DF1D5B:\ +000000000000000000000000004000000000000000000000 + +00000000000000000000000000000000:12D0F6A150858F64F0C88061CE592C11:\ +000000000000000000000000002000000000000000000000 + +00000000000000000000000000000000:5351E750DE5C9322AFA2885FB83C623B:\ +000000000000000000000000001000000000000000000000 + +00000000000000000000000000000000:7C120675A918C2C728149D332A196586:\ +000000000000000000000000000800000000000000000000 + +00000000000000000000000000000000:CDCA42B4E3ED64C2D37812847D7377CC:\ +000000000000000000000000000400000000000000000000 + +00000000000000000000000000000000:E4B73F8C0D9A40A67ACB9837CF8006DB:\ +000000000000000000000000000200000000000000000000 + +00000000000000000000000000000000:A863A13ED52E8BFD6652FEE291837B1D:\ +000000000000000000000000000100000000000000000000 + +00000000000000000000000000000000:64F9790C0BBD5C234FFADF0037485BB1:\ +000000000000000000000000000080000000000000000000 + +00000000000000000000000000000000:37A8AA3E38B937D92E1E41EC5E157FE0:\ +000000000000000000000000000040000000000000000000 + +00000000000000000000000000000000:F84D2A60A99BA9C17848BFBFBFEA0271:\ +000000000000000000000000000020000000000000000000 + +00000000000000000000000000000000:01AD547F2E1A713AC0B3D3E332A044A6:\ +000000000000000000000000000010000000000000000000 + +00000000000000000000000000000000:ED06A9B6EB5E24DF2CDA83564080AE93:\ +000000000000000000000000000008000000000000000000 + +00000000000000000000000000000000:3682650D35D3247471F3EB10A173479D:\ +000000000000000000000000000004000000000000000000 + +00000000000000000000000000000000:E3BD985B5B7C83F841F2F2A37A2974B3:\ +000000000000000000000000000002000000000000000000 + +00000000000000000000000000000000:EEA30254CF0FD6379A7203FC2328EEB6:\ +000000000000000000000000000001000000000000000000 + +00000000000000000000000000000000:4F2C052C360DA20FF826DFA98429AAA5:\ +000000000000000000000000000000800000000000000000 + +00000000000000000000000000000000:5F4CE32E4D55F0EB15799A3C46E1C40A:\ +000000000000000000000000000000400000000000000000 + +00000000000000000000000000000000:2EBE1C941F8247BBA3E85A04BA10B27C:\ +000000000000000000000000000000200000000000000000 + +00000000000000000000000000000000:9F41738ADB0CD8B4DD048527FCCFC23B:\ +000000000000000000000000000000100000000000000000 + +00000000000000000000000000000000:0E9F502FEE59A16CC5CEEDC82FD98E1A:\ +000000000000000000000000000000080000000000000000 + +00000000000000000000000000000000:56DC540BBAFB42B9817B4D464993DBCE:\ +000000000000000000000000000000040000000000000000 + +00000000000000000000000000000000:7421D3EB41769680565DD67683FE6737:\ +000000000000000000000000000000020000000000000000 + +00000000000000000000000000000000:777D08A4999E79A97CDBAFA5B6C33D12:\ +000000000000000000000000000000010000000000000000 + +00000000000000000000000000000000:4F3145690B092FAEDEBC672FE0ABC1EC:\ +000000000000000000000000000000008000000000000000 + +00000000000000000000000000000000:C221E4ABE2DD5ABA26DC29B6F3E421C6:\ +000000000000000000000000000000004000000000000000 + +00000000000000000000000000000000:EC48948223D3086FA730F6F81C103E8B:\ +000000000000000000000000000000002000000000000000 + +00000000000000000000000000000000:38B03357B1A0719A4E04FC3725B66400:\ +000000000000000000000000000000001000000000000000 + +00000000000000000000000000000000:A9458E67FD55DFB7F5D43344D7B8D994:\ +000000000000000000000000000000000800000000000000 + +00000000000000000000000000000000:C82BBCFE8E647A4915E578BB6BB410EC:\ +000000000000000000000000000000000400000000000000 + +00000000000000000000000000000000:27DA68521E57EFBC401640232896ABC7:\ +000000000000000000000000000000000200000000000000 + +00000000000000000000000000000000:DD6C4A6784C293F1D6B334731298C043:\ +000000000000000000000000000000000100000000000000 + +00000000000000000000000000000000:C2C4A691BD77C60869E6C030E357B7DF:\ +000000000000000000000000000000000080000000000000 + +00000000000000000000000000000000:EDA41EF6E7863F1A7D718E31A7D0AB0F:\ +000000000000000000000000000000000040000000000000 + +00000000000000000000000000000000:7915CF01D36808B875E1561FB88ECF2D:\ +000000000000000000000000000000000020000000000000 + +00000000000000000000000000000000:033826639ABFCBA709DEECD8F32306D5:\ +000000000000000000000000000000000010000000000000 + +00000000000000000000000000000000:B7CE1348B2832FABD58542A59319C947:\ +000000000000000000000000000000000008000000000000 + +00000000000000000000000000000000:479E3B195B3F9BE75AA2D0931F179495:\ +000000000000000000000000000000000004000000000000 + +00000000000000000000000000000000:6B9E7F0C5050E8CD232722C33261135D:\ +000000000000000000000000000000000002000000000000 + +00000000000000000000000000000000:063F64EDD05343702B76BE045A9D1DDD:\ +000000000000000000000000000000000001000000000000 + +00000000000000000000000000000000:E1AE2D5667E440C0A44EF9CC91AA10CC:\ +000000000000000000000000000000000000800000000000 + +00000000000000000000000000000000:A64A692A55AF5D1C99794707BA00E670:\ +000000000000000000000000000000000000400000000000 + +00000000000000000000000000000000:B975AC5AFA03D77D7361AACFF32E1B39:\ +000000000000000000000000000000000000200000000000 + +00000000000000000000000000000000:267A1379C257776BE4CA75C8B1A59EF6:\ +000000000000000000000000000000000000100000000000 + +00000000000000000000000000000000:ED392DDA2AD879B58405B41FAA7A56A1:\ +000000000000000000000000000000000000080000000000 + +00000000000000000000000000000000:4DECF57B85B75F1A78431A972CC873F6:\ +000000000000000000000000000000000000040000000000 + +00000000000000000000000000000000:5F9D95B7F415376A6665BDF645E5C6AC:\ +000000000000000000000000000000000000020000000000 + +00000000000000000000000000000000:5929FF53CC9876F923C6D19D3D101F18:\ +000000000000000000000000000000000000010000000000 + +00000000000000000000000000000000:D6CF5F18474D3A44D0BE029EE879E6FA:\ +000000000000000000000000000000000000008000000000 + +00000000000000000000000000000000:8860A98873A8DBFFDC4D7835F3D59BB7:\ +000000000000000000000000000000000000004000000000 + +00000000000000000000000000000000:4B506DF2FF9DA5672F55624AFE5374E8:\ +000000000000000000000000000000000000002000000000 + +00000000000000000000000000000000:B4D6692D5AAE39519C0AAB97597A5521:\ +000000000000000000000000000000000000001000000000 + +00000000000000000000000000000000:7185FA267D3926EA0804F07A91398C37:\ +000000000000000000000000000000000000000800000000 + +00000000000000000000000000000000:8C3BD232227C1C1B214186A603D85115:\ +000000000000000000000000000000000000000400000000 + +00000000000000000000000000000000:5300AFD8D507A60ACB0907B4D3E3D2B0:\ +000000000000000000000000000000000000000200000000 + +00000000000000000000000000000000:D8A16D32AE71F991EE2C1C19153B146D:\ +000000000000000000000000000000000000000100000000 + +00000000000000000000000000000000:32B3F26C1415BF7F82B6A637843F4C21:\ +000000000000000000000000000000000000000080000000 + +00000000000000000000000000000000:E416420B5F736F39328D36181992A720:\ +000000000000000000000000000000000000000040000000 + +00000000000000000000000000000000:619918287897135AD5516BA12A0FC6D7:\ +000000000000000000000000000000000000000020000000 + +00000000000000000000000000000000:69830C559F08DDCEEB6F83900DC14626:\ +000000000000000000000000000000000000000010000000 + +00000000000000000000000000000000:BB451FB76A7B1FE65E0332DE6E6712A3:\ +000000000000000000000000000000000000000008000000 + +00000000000000000000000000000000:AF2DE55E1EFFAF00EBF4EAEE45B29A4C:\ +000000000000000000000000000000000000000004000000 + +00000000000000000000000000000000:CA31B9A81450A198A073A299C7DF14C9:\ +000000000000000000000000000000000000000002000000 + +00000000000000000000000000000000:4FF7E9FADFCFFBB2DD3F23214B407180:\ +000000000000000000000000000000000000000001000000 + +00000000000000000000000000000000:B8BC9344751D34B0BFE353E5F3A9E309:\ +000000000000000000000000000000000000000000800000 + +00000000000000000000000000000000:4589951B936D1948299548D199E0612F:\ +000000000000000000000000000000000000000000400000 + +00000000000000000000000000000000:61B33E9A6A14F21B12D00832385F9BCA:\ +000000000000000000000000000000000000000000200000 + +00000000000000000000000000000000:652B66FBC2B192ACA177D4C16ACB1E3F:\ +000000000000000000000000000000000000000000100000 + +00000000000000000000000000000000:81A252288A18D4E4EC1F919FE34BD4C8:\ +000000000000000000000000000000000000000000080000 + +00000000000000000000000000000000:4D38323769C7AEFBF838F51A57E21C0E:\ +000000000000000000000000000000000000000000040000 + +00000000000000000000000000000000:C07D35D5788A04FEEBA6A337453DEFCA:\ +000000000000000000000000000000000000000000020000 + +00000000000000000000000000000000:6692591964FF5304D877DDE631E55AC2:\ +000000000000000000000000000000000000000000010000 + +00000000000000000000000000000000:1792F89A673DFE67A04BAC230317BFD3:\ +000000000000000000000000000000000000000000008000 + +00000000000000000000000000000000:0EC45273FAA59A4C6AA56C0BDF9DC1C4:\ +000000000000000000000000000000000000000000004000 + +00000000000000000000000000000000:273575F8DB870005ED51F0F1FB962A35:\ +000000000000000000000000000000000000000000002000 + +00000000000000000000000000000000:D9EDC0E324D69F3CAB465E3F63AC4CD3:\ +000000000000000000000000000000000000000000001000 + +00000000000000000000000000000000:647B9C834502295B5D46AE962ABD9059:\ +000000000000000000000000000000000000000000000800 + +00000000000000000000000000000000:3C8B932E1E8C1E9FD4629AF03D16D717:\ +000000000000000000000000000000000000000000000400 + +00000000000000000000000000000000:9FD433DAE0C3B5C35C7CA5468B4AF8DE:\ +000000000000000000000000000000000000000000000200 + +00000000000000000000000000000000:916E8226F1925A4C7E0056E8951B4609:\ +000000000000000000000000000000000000000000000100 + +00000000000000000000000000000000:A53FCF269CF194C323B2C2A5B82571E2:\ +000000000000000000000000000000000000000000000080 + +00000000000000000000000000000000:51C6D510F3053D502D141C99FBB28618:\ +000000000000000000000000000000000000000000000040 + +00000000000000000000000000000000:040E54E63CCF8E5D6EE6A27EEDCC02AB:\ +000000000000000000000000000000000000000000000020 + +00000000000000000000000000000000:DE90BD5F4C96E4F52EC9200D9E298DCD:\ +000000000000000000000000000000000000000000000010 + +00000000000000000000000000000000:87233EAEFC125F7C6E1FE329CC415520:\ +000000000000000000000000000000000000000000000008 + +00000000000000000000000000000000:71B61DD72D4FBD96542E73A5E5BD7CA5:\ +000000000000000000000000000000000000000000000004 + +00000000000000000000000000000000:F5F6E1B6215062A2547C1A7C84EB8E86:\ +000000000000000000000000000000000000000000000002 + +00000000000000000000000000000000:2DD740E5E0E0CBE72EBDF2808410D55F:\ +000000000000000000000000000000000000000000000001 + +00000000000000000000000000000000:EA4FCDBA1EB0C533938AA9FA32B740F3:\ +8000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B8E6D5134AB08E553AD5785B33D66111:\ +4000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:2D7805B2B86764E8FC3DD6E2EFB1532D:\ +2000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B9449A4D8C53639D0A6751DB3695B325:\ +1000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B2C6850F1AAAF7CD2E9B3FC1F5433FDC:\ +0800000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7D124E20CE475B66BEA88399FF95C8C0:\ +0400000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D5F5ED2CDEC8D3043BD0C58238AF2820:\ +0200000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:051135A86EADA21353CB5FFD7A58408E:\ +0100000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FEF406FC9C405AFB959C796E4ED0AF0D:\ +0080000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:52DA5222BB9974AE66CC9BB77E1F15E8:\ +0040000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F5DC2C5F98AF6CF4BCC23ECEEAF213AD:\ +0020000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:09DF90DE791250ACBE170DC643780CF2:\ +0010000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3FA812132A21BEB83162C33B28CC242C:\ +0008000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CEE571785850DD567A75D9E244660C66:\ +0004000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:642BB005B38790E518E53A53373C2474:\ +0002000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E3EBE5FA1C748BCB125602F8B7911FAE:\ +0001000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C863C98E1C09C28B4A05B5FBCE64DF28:\ +0000800000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B4BAB3A731F8CCD8A09A5D3AFF77BE60:\ +0000400000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1A3FC4F1DE42F1AC5DA5F88701E6F292:\ +0000200000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FF43862813E9F1CFEF044F4B8CFED265:\ +0000100000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8F2785A7E28C1910580BBFD989A7F0D3:\ +0000080000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:26059027035B43615A7996D19FED9D42:\ +0000040000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8CD8416F37E3BA1B5D6D0838F6B6E604:\ +0000020000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BB0BD60CD950DE5E0B9AAF78FF9A30DB:\ +0000010000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B99C1D4F98B68E8CD7495D16F3260D7D:\ +0000008000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4F1A4F8D20456CFE0EF0E39DE6C71B9C:\ +0000004000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F453DB1AB45A6F5834F9908E1A15D4F7:\ +0000002000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:DA25287B7CD050E9B3E2074ED3B49FCF:\ +0000001000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BAB2AE0FF7C4902697DE88ED7F2FA06C:\ +0000000800000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:ABE6F6C9D29A58B985A91782EE28CF3E:\ +0000000400000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5C59FBE090DB3D75D7A5A8FD76F8A3DB:\ +0000000200000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:DCA806B1D0BAFCEAB015EC19A3E5C7FA:\ +0000000100000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1BA870E6D62FEB16E6C2AA1128AE5ABA:\ +0000000080000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0FE91367D4C178DD313C6AB7F3D5149A:\ +0000000040000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BFE27CB1B52150E0636A81473148B018:\ +0000000020000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F79BE17022979D01E3AFFB3499556DC4:\ +0000000010000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A2F2B772060C53A539B5A3FE4C935171:\ +0000000008000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:DB97947A8B14B3E3859068A0288285F6:\ +0000000004000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1FD086FE698C5E092A8E0C9EE527714A:\ +0000000002000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8ADAB79B444DDDF86B8D53D2A9112881:\ +0000000001000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C36CEC9730A74CE94CF2EA5C7B0EC3ED:\ +0000000000800000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:033629A0675A45A11BE7924137D711EC:\ +0000000000400000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D5C22EF288E7D2D04BC04B57B702A03F:\ +0000000000200000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1FD290A5EB2E278C6396625034EB268C:\ +0000000000100000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:05C35E0CB6D27E6E9D680368B2ABA9B5:\ +0000000000080000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B0194CDF7510FE98EDF9464259378FAF:\ +0000000000040000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:043729754E5B1F63408F62742E5F2765:\ +0000000000020000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:24A2746042EC7970E8AB59589AD63775:\ +0000000000010000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7BDEF0A2EF8B637C4C3C5D001BAB5F85:\ +0000000000008000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0221B515A1559D96E9C3CBFB929E96A9:\ +0000000000004000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7E975026E5771D90EDA081B72C0BC77C:\ +0000000000002000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7C7F9F98B4739C9774F84E75E5B30A95:\ +0000000000001000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A4E176B7C98D76BC6662BBB3E606BA9C:\ +0000000000000800000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7FDBDA5910B26D8D3FE42987B09430C0:\ +0000000000000400000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7B134F40F8E10D8287B8E6FC0BDE45E8:\ +0000000000000200000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CF3C98CC0CAFB2935385C0B5D8F07857:\ +0000000000000100000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FB71BA47019735DA4082D68A1A587BDB:\ +0000000000000080000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E9D45576FC1A56DAFB48ABFB90A1DE4B:\ +0000000000000040000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:AE9408DC1A007CA9C13F2F9D12FC4F71:\ +0000000000000020000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B407201A6A44CB236468709B181BCA23:\ +0000000000000010000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:06E1A40D4F7534E24538D26802AF9E98:\ +0000000000000008000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3468992A9D6F274286611D1E5DB327BA:\ +0000000000000004000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:635748DEDCB4E65B76E818D09994D19A:\ +0000000000000002000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C2A0DACC741E90029F16CDA81BEB8D0C:\ +0000000000000001000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D20B9853FC98ED3FCFA4C3B9781352D3:\ +0000000000000000800000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:869B106388046F6F5F9AE5ADC1F23BC2:\ +0000000000000000400000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4F9BF7227D943B80C97B2FED132098FE:\ +0000000000000000200000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7232A96D275C409349A0382BAE576274:\ +0000000000000000100000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:ADAF9B3E14B8CC101A2F143B373517B7:\ +0000000000000000080000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:813E38DF25E4356EAFC7ECEB75270FD4:\ +0000000000000000040000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:46D6957C76223046E232EEBB661CCE59:\ +0000000000000000020000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1714E3EDD2A7BFE4FC35D4B6034E4184:\ +0000000000000000010000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:445ED35901D4608FAC3BCD59E685E77C:\ +0000000000000000008000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:236F86A3A59F563611C9A1A9C8DF045C:\ +0000000000000000004000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FC0739E82EF130E533C77FA15BD85B57:\ +0000000000000000002000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EDC81185A966066433F1B19BE7659080:\ +0000000000000000001000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:9D0ED59542D4851F7812B29640739765:\ +0000000000000000000800000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4BA903B83FD4A443564723403BD7D431:\ +0000000000000000000400000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5DA2CD3D64EDCB29588F02BFED3D575B:\ +0000000000000000000200000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E66697B697E8881555F5B358A2EB7628:\ +0000000000000000000100000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7DE9B3320A7872088B1417AAC4E841ED:\ +0000000000000000000080000000000000000000000000000000000000000000 + +00000000000000000000000000000000:236D82828CE9A9471B51DDCDA350C542:\ +0000000000000000000040000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CF250F09887F0B9300FF865810A2E03F:\ +0000000000000000000020000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0103157DB999DF64D6C6DACB16F15F78:\ +0000000000000000000010000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EA918B3C7929C992E6F0D7B0DD6B8A59:\ +0000000000000000000008000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FB853888B1D95F9C7BB7630231C9108E:\ +0000000000000000000004000000000000000000000000000000000000000000 + +00000000000000000000000000000000:46E63459DCC0514DD200BF82B6AEEA0B:\ +0000000000000000000002000000000000000000000000000000000000000000 + +00000000000000000000000000000000:19051C0A056D4B56DFF08C52FBBD4547:\ +0000000000000000000001000000000000000000000000000000000000000000 + +00000000000000000000000000000000:055240C320AC09978BE4EC0EE9E40123:\ +0000000000000000000000800000000000000000000000000000000000000000 + +00000000000000000000000000000000:E0D04118BAD95366416C6D715507646B:\ +0000000000000000000000400000000000000000000000000000000000000000 + +00000000000000000000000000000000:888C70E963419AA6446123CD9685252C:\ +0000000000000000000000200000000000000000000000000000000000000000 + +00000000000000000000000000000000:E060A32AF3CD8A525C60A8EB4BEB5B24:\ +0000000000000000000000100000000000000000000000000000000000000000 + +00000000000000000000000000000000:36A235722A72A5BD05896B74EBB39E35:\ +0000000000000000000000080000000000000000000000000000000000000000 + +00000000000000000000000000000000:665A781CF1F7839FA4E7EF66F5B47D45:\ +0000000000000000000000040000000000000000000000000000000000000000 + +00000000000000000000000000000000:8156E976338FB48ED3E469F1485EAA06:\ +0000000000000000000000020000000000000000000000000000000000000000 + +00000000000000000000000000000000:BA853DF1B7622D17A549624B234082F8:\ +0000000000000000000000010000000000000000000000000000000000000000 + +00000000000000000000000000000000:3A411EF75149822F0C4E998587BA0CAD:\ +0000000000000000000000008000000000000000000000000000000000000000 + +00000000000000000000000000000000:EA33525A7CC7C74340773389A764513E:\ +0000000000000000000000004000000000000000000000000000000000000000 + +00000000000000000000000000000000:E007DDE8158568CF80C470745E455EEE:\ +0000000000000000000000002000000000000000000000000000000000000000 + +00000000000000000000000000000000:C140AE31D6B8AB675539344B9D857A89:\ +0000000000000000000000001000000000000000000000000000000000000000 + +00000000000000000000000000000000:8C86266079ABCEE926A5EF6F80F50308:\ +0000000000000000000000000800000000000000000000000000000000000000 + +00000000000000000000000000000000:CD77B23315E31DF96FABD6E427184F9F:\ +0000000000000000000000000400000000000000000000000000000000000000 + +00000000000000000000000000000000:A72E93628614A603E59ECC5C766A639B:\ +0000000000000000000000000200000000000000000000000000000000000000 + +00000000000000000000000000000000:00EE192F18F06F5799B9593DE71B2FBE:\ +0000000000000000000000000100000000000000000000000000000000000000 + +00000000000000000000000000000000:A79378A27F39485A2A6757A953DE8D63:\ +0000000000000000000000000080000000000000000000000000000000000000 + +00000000000000000000000000000000:38353F1349680DF284CF7D59272D435B:\ +0000000000000000000000000040000000000000000000000000000000000000 + +00000000000000000000000000000000:0960EF878BE3F63CB8A25AFDEE9272F8:\ +0000000000000000000000000020000000000000000000000000000000000000 + +00000000000000000000000000000000:CB52EEC84DD320FB74A13DF2D4AF5B64:\ +0000000000000000000000000010000000000000000000000000000000000000 + +00000000000000000000000000000000:89525CFDCCC1A572987EEEC44507942D:\ +0000000000000000000000000008000000000000000000000000000000000000 + +00000000000000000000000000000000:894183826F3CD163F2BDCE8FD123BCBD:\ +0000000000000000000000000004000000000000000000000000000000000000 + +00000000000000000000000000000000:152FAB85782DD050EF29C8C7E95C5941:\ +0000000000000000000000000002000000000000000000000000000000000000 + +00000000000000000000000000000000:6C8CC544D1E6B9B8ACEB723A6E903710:\ +0000000000000000000000000001000000000000000000000000000000000000 + +00000000000000000000000000000000:9D1DCFEFD9CAEB5934AA93278F8E0988:\ +0000000000000000000000000000800000000000000000000000000000000000 + +00000000000000000000000000000000:86473616CFE39825E9F93B4A5D1518F0:\ +0000000000000000000000000000400000000000000000000000000000000000 + +00000000000000000000000000000000:3EC955C39DC4442411A578115482A331:\ +0000000000000000000000000000200000000000000000000000000000000000 + +00000000000000000000000000000000:117C11E5DAFA73A4CBA2E599582DF463:\ +0000000000000000000000000000100000000000000000000000000000000000 + +00000000000000000000000000000000:371B4F0F917CDC7F028CF90072EA6C0C:\ +0000000000000000000000000000080000000000000000000000000000000000 + +00000000000000000000000000000000:F6EAC5AC916431427022EE688D4E8248:\ +0000000000000000000000000000040000000000000000000000000000000000 + +00000000000000000000000000000000:5E7787153D1C5E94A860600D0FE0F695:\ +0000000000000000000000000000020000000000000000000000000000000000 + +00000000000000000000000000000000:44888E6DD958A843AF2143DA81986196:\ +0000000000000000000000000000010000000000000000000000000000000000 + +00000000000000000000000000000000:F3B940BFEFF393BFDAF0C435D262961C:\ +0000000000000000000000000000008000000000000000000000000000000000 + +00000000000000000000000000000000:40781DABC58A81B11FAA4039E6F73345:\ +0000000000000000000000000000004000000000000000000000000000000000 + +00000000000000000000000000000000:7685B120BD850BD6D7A618E023D42BA0:\ +0000000000000000000000000000002000000000000000000000000000000000 + +00000000000000000000000000000000:8088416E7FEDB30B1883DF50E29CD4D1:\ +0000000000000000000000000000001000000000000000000000000000000000 + +00000000000000000000000000000000:B0C9ED5257B103131AB5DBECC16D1547:\ +0000000000000000000000000000000800000000000000000000000000000000 + +00000000000000000000000000000000:01C8B821C4683B586CD8096A0DC4FDAA:\ +0000000000000000000000000000000400000000000000000000000000000000 + +00000000000000000000000000000000:4CA16F058B3AE1E2B3774E3DF99087CA:\ +0000000000000000000000000000000200000000000000000000000000000000 + +00000000000000000000000000000000:620D06B8EFBFDD1EE274D5EAE42B8F0E:\ +0000000000000000000000000000000100000000000000000000000000000000 + +00000000000000000000000000000000:34CF934F88C0D631B3D80BE0A5671B11:\ +0000000000000000000000000000000080000000000000000000000000000000 + +00000000000000000000000000000000:F8AB4045BD0CD95486B921B7430E74A0:\ +0000000000000000000000000000000040000000000000000000000000000000 + +00000000000000000000000000000000:96ECEC4088D81E2EF27D74A96E2614DC:\ +0000000000000000000000000000000020000000000000000000000000000000 + +00000000000000000000000000000000:EB0152474310B99F0F8F0DFD6D67962C:\ +0000000000000000000000000000000010000000000000000000000000000000 + +00000000000000000000000000000000:74DA68DA599D7DD37918F24F7654DC4D:\ +0000000000000000000000000000000008000000000000000000000000000000 + +00000000000000000000000000000000:F766AD686EB2BAF2950974F78968F510:\ +0000000000000000000000000000000004000000000000000000000000000000 + +00000000000000000000000000000000:A2D18CF5C770587E19DBD6FFEBD52FAE:\ +0000000000000000000000000000000002000000000000000000000000000000 + +00000000000000000000000000000000:DDADE16C2B9E78715FC281197149E4F0:\ +0000000000000000000000000000000001000000000000000000000000000000 + +00000000000000000000000000000000:79931CFAC3FD4F540E53905538B5E122:\ +0000000000000000000000000000000000800000000000000000000000000000 + +00000000000000000000000000000000:93F88DDDE5004BD8998CDB7A1BD1EE4D:\ +0000000000000000000000000000000000400000000000000000000000000000 + +00000000000000000000000000000000:011A413B2CC8E56A94A5C6D3932B3C3B:\ +0000000000000000000000000000000000200000000000000000000000000000 + +00000000000000000000000000000000:C509B737BBC749EE466ADF8142F52B28:\ +0000000000000000000000000000000000100000000000000000000000000000 + +00000000000000000000000000000000:514332276B9E9299F9F722B63752B0A8:\ +0000000000000000000000000000000000080000000000000000000000000000 + +00000000000000000000000000000000:D9F3A75F94986D0A1AB14258934C21D1:\ +0000000000000000000000000000000000040000000000000000000000000000 + +00000000000000000000000000000000:6FE84CDC49C9A8A55D85EA1A1D5C0DD9:\ +0000000000000000000000000000000000020000000000000000000000000000 + +00000000000000000000000000000000:0C85C65BD9DE393D2FEA3BE5AC7BAB67:\ +0000000000000000000000000000000000010000000000000000000000000000 + +00000000000000000000000000000000:904C7F2E8084FC10D59480C3DE1CB1A4:\ +0000000000000000000000000000000000008000000000000000000000000000 + +00000000000000000000000000000000:52C696236B4B7EE6B03B8876DEA8DD45:\ +0000000000000000000000000000000000004000000000000000000000000000 + +00000000000000000000000000000000:A0D46DAEA95CB4968F62BD9B3F8075A8:\ +0000000000000000000000000000000000002000000000000000000000000000 + +00000000000000000000000000000000:51BE75B32A05384D2A2E08CB1EAB5F63:\ +0000000000000000000000000000000000001000000000000000000000000000 + +00000000000000000000000000000000:1123151EB432831D2C65A90ED1D0A429:\ +0000000000000000000000000000000000000800000000000000000000000000 + +00000000000000000000000000000000:A26350A8FF6C10FCBA736D46FC26BF69:\ +0000000000000000000000000000000000000400000000000000000000000000 + +00000000000000000000000000000000:FF85BEF6CF6674FA5EE40EC9FB9052FF:\ +0000000000000000000000000000000000000200000000000000000000000000 + +00000000000000000000000000000000:6ED96DB33AB981AF27894AC436CB4D62:\ +0000000000000000000000000000000000000100000000000000000000000000 + +00000000000000000000000000000000:B38DE9B3C4D6D128101B02FDD05E3BF8:\ +0000000000000000000000000000000000000080000000000000000000000000 + +00000000000000000000000000000000:11E05766EBB66AB211E2D9653EF3144D:\ +0000000000000000000000000000000000000040000000000000000000000000 + +00000000000000000000000000000000:F6A196E085116E5BC21732A2EF9ACAF4:\ +0000000000000000000000000000000000000020000000000000000000000000 + +00000000000000000000000000000000:BC2A6753CA41E306A0500E97B38D8A9A:\ +0000000000000000000000000000000000000010000000000000000000000000 + +00000000000000000000000000000000:773A687B1FC97918943C1B66EF693354:\ +0000000000000000000000000000000000000008000000000000000000000000 + +00000000000000000000000000000000:C6E2112CCDBD821D2B9068B285C5192B:\ +0000000000000000000000000000000000000004000000000000000000000000 + +00000000000000000000000000000000:EA69C8E28021801EE9A14809848D781F:\ +0000000000000000000000000000000000000002000000000000000000000000 + +00000000000000000000000000000000:6290745CD4CB62DE172F8AB30966EB57:\ +0000000000000000000000000000000000000001000000000000000000000000 + +00000000000000000000000000000000:1051EE4C389B96B1365B417C74EFBF10:\ +0000000000000000000000000000000000000000800000000000000000000000 + +00000000000000000000000000000000:52B6F3EE6655128999EEE3831E708D76:\ +0000000000000000000000000000000000000000400000000000000000000000 + +00000000000000000000000000000000:5BDE19A1D741ECE40CE98CD02F02AD75:\ +0000000000000000000000000000000000000000200000000000000000000000 + +00000000000000000000000000000000:36EF5E803A68F6AC20D92FB14E2AFDF5:\ +0000000000000000000000000000000000000000100000000000000000000000 + +00000000000000000000000000000000:B3E1E30B78FBBCA07F065A422D33410B:\ +0000000000000000000000000000000000000000080000000000000000000000 + +00000000000000000000000000000000:5FA0E6C8E6C1FCD613975A18348484CB:\ +0000000000000000000000000000000000000000040000000000000000000000 + +00000000000000000000000000000000:B74E4A2406EEB2AB836AED857754A612:\ +0000000000000000000000000000000000000000020000000000000000000000 + +00000000000000000000000000000000:52EBF44DB69347A22DF8CA0ABAE3D668:\ +0000000000000000000000000000000000000000010000000000000000000000 + +00000000000000000000000000000000:986B7B05D1E9639779D034047FC3B780:\ +0000000000000000000000000000000000000000008000000000000000000000 + +00000000000000000000000000000000:1846AF7EB612C5C356DAF4FE42108444:\ +0000000000000000000000000000000000000000004000000000000000000000 + +00000000000000000000000000000000:22AD41F78567C6D5C2266486404168DC:\ +0000000000000000000000000000000000000000002000000000000000000000 + +00000000000000000000000000000000:73409A5B03D08BCEE496F7255417DEC5:\ +0000000000000000000000000000000000000000001000000000000000000000 + +00000000000000000000000000000000:32C47FAEB48DA7847B3C5B063153B049:\ +0000000000000000000000000000000000000000000800000000000000000000 + +00000000000000000000000000000000:5514F66B91C06AD15BE581AA99F5961B:\ +0000000000000000000000000000000000000000000400000000000000000000 + +00000000000000000000000000000000:38AF52E0648030498BA94D0BBF819B8A:\ +0000000000000000000000000000000000000000000200000000000000000000 + +00000000000000000000000000000000:91D48EEE9A769F0753C6A6DC1037405D:\ +0000000000000000000000000000000000000000000100000000000000000000 + +00000000000000000000000000000000:2CA3F3F2BB2332984A97E5274462E7AF:\ +0000000000000000000000000000000000000000000080000000000000000000 + +00000000000000000000000000000000:806EE4C1C6432102E40A21F03222B0E1:\ +0000000000000000000000000000000000000000000040000000000000000000 + +00000000000000000000000000000000:E8BBDC90505FE81AB2024274BB2FA258:\ +0000000000000000000000000000000000000000000020000000000000000000 + +00000000000000000000000000000000:307920977ADAD0EEDEBA2CB8AF83D3CE:\ +0000000000000000000000000000000000000000000010000000000000000000 + +00000000000000000000000000000000:6B0A17013DFAAD05442FA8B298043438:\ +0000000000000000000000000000000000000000000008000000000000000000 + +00000000000000000000000000000000:BA6EC60065FA6C9679D7E47FC1B85479:\ +0000000000000000000000000000000000000000000004000000000000000000 + +00000000000000000000000000000000:F1AA580B5E904BED235ACE85C0E009D0:\ +0000000000000000000000000000000000000000000002000000000000000000 + +00000000000000000000000000000000:9092A797F7024CC218B4A3575F4F7D63:\ +0000000000000000000000000000000000000000000001000000000000000000 + +00000000000000000000000000000000:CF404B154F2A8388DA9ED1E93AC78894:\ +0000000000000000000000000000000000000000000000800000000000000000 + +00000000000000000000000000000000:1B32215E25E3EB15FE4BED2F2F31281E:\ +0000000000000000000000000000000000000000000000400000000000000000 + +00000000000000000000000000000000:999B92E27EC161089F45DB53D036C8F0:\ +0000000000000000000000000000000000000000000000200000000000000000 + +00000000000000000000000000000000:B2F7DBFD67DBC260A7CFCD9C90FEF16F:\ +0000000000000000000000000000000000000000000000100000000000000000 + +00000000000000000000000000000000:7BD9AA3B08F103C796EE8023EF474F0A:\ +0000000000000000000000000000000000000000000000080000000000000000 + +00000000000000000000000000000000:483121AF85F36EA159BE2EB5802FBF21:\ +0000000000000000000000000000000000000000000000040000000000000000 + +00000000000000000000000000000000:AE2788C2115CB466713687AB06FE5E46:\ +0000000000000000000000000000000000000000000000020000000000000000 + +00000000000000000000000000000000:ADE758D100ABEEB7BA80BF257781494D:\ +0000000000000000000000000000000000000000000000010000000000000000 + +00000000000000000000000000000000:6DF30205652926EB339833F2EDD8472E:\ +0000000000000000000000000000000000000000000000008000000000000000 + +00000000000000000000000000000000:031E86B2AD4D83A4A19BCAF191F9B65A:\ +0000000000000000000000000000000000000000000000004000000000000000 + +00000000000000000000000000000000:F605CCC9E46B1792EA2F0B4124924F42:\ +0000000000000000000000000000000000000000000000002000000000000000 + +00000000000000000000000000000000:A70E3286C50B8DD8306109AB59119510:\ +0000000000000000000000000000000000000000000000001000000000000000 + +00000000000000000000000000000000:6922EEA4B8AE7BFECE899009848A33DA:\ +0000000000000000000000000000000000000000000000000800000000000000 + +00000000000000000000000000000000:1DD856F5453D1D61860E48035BFDADC7:\ +0000000000000000000000000000000000000000000000000400000000000000 + +00000000000000000000000000000000:9AE9BEC5D195B32BD52623EF21CF2AA3:\ +0000000000000000000000000000000000000000000000000200000000000000 + +00000000000000000000000000000000:C89ADA0E7DF448DE2155DB7C3E3EAAF2:\ +0000000000000000000000000000000000000000000000000100000000000000 + +00000000000000000000000000000000:0D176C6E373B2A3B3408AD24BE258365:\ +0000000000000000000000000000000000000000000000000080000000000000 + +00000000000000000000000000000000:8C2E48AF6FE6305B58EF5B950061E93C:\ +0000000000000000000000000000000000000000000000000040000000000000 + +00000000000000000000000000000000:2E81D19464919FFB1886E81C46AEDE37:\ +0000000000000000000000000000000000000000000000000020000000000000 + +00000000000000000000000000000000:7169BEE79D4DCC57F771A43AA0A80EF1:\ +0000000000000000000000000000000000000000000000000010000000000000 + +00000000000000000000000000000000:425223474892BA95538DAFF58F3DD0D3:\ +0000000000000000000000000000000000000000000000000008000000000000 + +00000000000000000000000000000000:B2650BF17E26E9A4F6484DD2992517D9:\ +0000000000000000000000000000000000000000000000000004000000000000 + +00000000000000000000000000000000:71936A21362F80ECCED8FC955FF159F3:\ +0000000000000000000000000000000000000000000000000002000000000000 + +00000000000000000000000000000000:E09665C274E582FFD6BCD0663BD6EA12:\ +0000000000000000000000000000000000000000000000000001000000000000 + +00000000000000000000000000000000:3E8D36D10E6AB4454154A226B7D6E50E:\ +0000000000000000000000000000000000000000000000000000800000000000 + +00000000000000000000000000000000:5D008338DDD66164591A9B98B23323CA:\ +0000000000000000000000000000000000000000000000000000400000000000 + +00000000000000000000000000000000:6BC5ACE2FA017CCC5CD0A8E88AF73B28:\ +0000000000000000000000000000000000000000000000000000200000000000 + +00000000000000000000000000000000:C115E4646FC054C50C2BBEC7C20C94F7:\ +0000000000000000000000000000000000000000000000000000100000000000 + +00000000000000000000000000000000:2CEB602F3C61BE94AF96FD012BB3190C:\ +0000000000000000000000000000000000000000000000000000080000000000 + +00000000000000000000000000000000:5A04F68F56580702891E4ECF6C600C92:\ +0000000000000000000000000000000000000000000000000000040000000000 + +00000000000000000000000000000000:D6A0DC0D5FB91B6478B9A1AAA586431B:\ +0000000000000000000000000000000000000000000000000000020000000000 + +00000000000000000000000000000000:E38BB33BF982D61BB2CD980BFCE4C2BF:\ +0000000000000000000000000000000000000000000000000000010000000000 + +00000000000000000000000000000000:B47BF164959077E378396A175020AC95:\ +0000000000000000000000000000000000000000000000000000008000000000 + +00000000000000000000000000000000:CC5CEE68ABBFDC2DFE32FD3A1E433932:\ +0000000000000000000000000000000000000000000000000000004000000000 + +00000000000000000000000000000000:A8180BBB689F29A560296FF24C785DC4:\ +0000000000000000000000000000000000000000000000000000002000000000 + +00000000000000000000000000000000:DCCBE0BB943D3B772010A08C11E82763:\ +0000000000000000000000000000000000000000000000000000001000000000 + +00000000000000000000000000000000:0439C5D8BB8BDD7FCB3A3281BD8A3A3F:\ +0000000000000000000000000000000000000000000000000000000800000000 + +00000000000000000000000000000000:2864CEAE94E09933190479BEA2515040:\ +0000000000000000000000000000000000000000000000000000000400000000 + +00000000000000000000000000000000:2AFF33A00C93057FE56EDCBBB65987BB:\ +0000000000000000000000000000000000000000000000000000000200000000 + +00000000000000000000000000000000:38C6B37E80EC873DE0A0ABEB9803438F:\ +0000000000000000000000000000000000000000000000000000000100000000 + +00000000000000000000000000000000:1D9428E92329672C0E902F6AA6AFC874:\ +0000000000000000000000000000000000000000000000000000000080000000 + +00000000000000000000000000000000:2AB8CC1998977DF208C97B2D0DC86C54:\ +0000000000000000000000000000000000000000000000000000000040000000 + +00000000000000000000000000000000:2E42C343E7E489916E2F2C0AD2AFFFB1:\ +0000000000000000000000000000000000000000000000000000000020000000 + +00000000000000000000000000000000:571C17477C9FB6C334718983E0B25859:\ +0000000000000000000000000000000000000000000000000000000010000000 + +00000000000000000000000000000000:3ABAD289F84A4B75412C82D8AD9BD739:\ +0000000000000000000000000000000000000000000000000000000008000000 + +00000000000000000000000000000000:E91C1A5E57DD295A7F4AC1687F6B8DB6:\ +0000000000000000000000000000000000000000000000000000000004000000 + +00000000000000000000000000000000:60CEAEC342165320652D7ED13FDAC05A:\ +0000000000000000000000000000000000000000000000000000000002000000 + +00000000000000000000000000000000:DA854CEC00C19BB97F7D8292ABAEB5BB:\ +0000000000000000000000000000000000000000000000000000000001000000 + +00000000000000000000000000000000:6BC45EBD7172512E5F6D51C60E271ACF:\ +0000000000000000000000000000000000000000000000000000000000800000 + +00000000000000000000000000000000:6604FAE8ECBC741D0F46D90AA235CAF6:\ +0000000000000000000000000000000000000000000000000000000000400000 + +00000000000000000000000000000000:5F95FA50CF7CDD4B619DCB8D6E0B7873:\ +0000000000000000000000000000000000000000000000000000000000200000 + +00000000000000000000000000000000:C98C198A5A988E2911302C22BFDC4890:\ +0000000000000000000000000000000000000000000000000000000000100000 + +00000000000000000000000000000000:4B5818505B80DA67A206BF3107DF2B4C:\ +0000000000000000000000000000000000000000000000000000000000080000 + +00000000000000000000000000000000:B2EA813634A26DC5894BFC4BB070E147:\ +0000000000000000000000000000000000000000000000000000000000040000 + +00000000000000000000000000000000:B6DDED10D2E8B13D7C758692C844017B:\ +0000000000000000000000000000000000000000000000000000000000020000 + +00000000000000000000000000000000:F2DC2468DF800E237C026F968CC3AAE2:\ +0000000000000000000000000000000000000000000000000000000000010000 + +00000000000000000000000000000000:EBCCE81109DCF1B9793AB60BD062F033:\ +0000000000000000000000000000000000000000000000000000000000008000 + +00000000000000000000000000000000:1BC015DC9E1B9DBB68293EB93D65088F:\ +0000000000000000000000000000000000000000000000000000000000004000 + +00000000000000000000000000000000:F718F0FC2A276D6CBB7A2BD59BBC3DB0:\ +0000000000000000000000000000000000000000000000000000000000002000 + +00000000000000000000000000000000:D89BE6BDD07222EF8297FDD246C3DA09:\ +0000000000000000000000000000000000000000000000000000000000001000 + +00000000000000000000000000000000:7013B55968A743157C4959DE2068AC57:\ +0000000000000000000000000000000000000000000000000000000000000800 + +00000000000000000000000000000000:758199FCB16B8ADF9B1350A02B10B735:\ +0000000000000000000000000000000000000000000000000000000000000400 + +00000000000000000000000000000000:29D38DC5215AA1F3CAEC044C8B472696:\ +0000000000000000000000000000000000000000000000000000000000000200 + +00000000000000000000000000000000:F5E1BCA4497ED2B1D871B5877C5BE3A8:\ +0000000000000000000000000000000000000000000000000000000000000100 + +00000000000000000000000000000000:C7388535D265CBFCEDE6423CC29F33A4:\ +0000000000000000000000000000000000000000000000000000000000000080 + +00000000000000000000000000000000:84992BD0280C4CDF8B1587D42AA63605:\ +0000000000000000000000000000000000000000000000000000000000000040 + +00000000000000000000000000000000:197E91D0F0261D975BA1F6FAA7983E51:\ +0000000000000000000000000000000000000000000000000000000000000020 + +00000000000000000000000000000000:644BDF2B1508CFF2E8D791DADC5D4BD6:\ +0000000000000000000000000000000000000000000000000000000000000010 + +00000000000000000000000000000000:D7BB8C6C07F21F648CE87A17A0589334:\ +0000000000000000000000000000000000000000000000000000000000000008 + +00000000000000000000000000000000:B6718CB65E557AF3C25D03770AD6B1FA:\ +0000000000000000000000000000000000000000000000000000000000000004 + +00000000000000000000000000000000:F32E30ADD384B71F7254A15B4042E1F6:\ +0000000000000000000000000000000000000000000000000000000000000002 + +00000000000000000000000000000000:B5C218F26198EE763B863EDA24446609:\ +0000000000000000000000000000000000000000000000000000000000000001 + +80000000000000000000000000000000:D962EFEBA75817BF6ED24BBBB5B7820D:\ +00000000000000000000000000000000 + +40000000000000000000000000000000:639B9F07305BCC1D2E64CE3D1671304A:\ +00000000000000000000000000000000 + +20000000000000000000000000000000:33ACF35AF3FF94B4C0A59C9035C99E79:\ +00000000000000000000000000000000 + +10000000000000000000000000000000:C18D6444EE8DEAECC4697D021B9694D2:\ +00000000000000000000000000000000 + +08000000000000000000000000000000:37DDA7DC913E6253679EB4A1906AE47C:\ +00000000000000000000000000000000 + +04000000000000000000000000000000:1DED0AB726E2358CCB57451EB5A1711A:\ +00000000000000000000000000000000 + +02000000000000000000000000000000:BFB43CD34EEC7C0A34CD77759E1396CE:\ +00000000000000000000000000000000 + +01000000000000000000000000000000:607C0F5FB6A489AED3D3238FB0C51D37:\ +00000000000000000000000000000000 + +00800000000000000000000000000000:0EBFB100FBBA1A66319743F846383323:\ +00000000000000000000000000000000 + +00400000000000000000000000000000:8ECA01741C7622FB9EB41FD9826EEA32:\ +00000000000000000000000000000000 + +00200000000000000000000000000000:BC7CABCFE201ECE01A42C2F4C49C1237:\ +00000000000000000000000000000000 + +00100000000000000000000000000000:6DD5E5FFF9A41C637553AC4873E118F6:\ +00000000000000000000000000000000 + +00080000000000000000000000000000:009DFBAA196DF5257E6F48F3310DDD58:\ +00000000000000000000000000000000 + +00040000000000000000000000000000:9A41BD1783AFB149865D341334D8DA3D:\ +00000000000000000000000000000000 + +00020000000000000000000000000000:9D3A9D9EA90505D970CA6C1FB39CBE11:\ +00000000000000000000000000000000 + +00010000000000000000000000000000:35495878D00360B50D980A6C7B193F2F:\ +00000000000000000000000000000000 + +00008000000000000000000000000000:81D74A81C7F5A5316314B02C6DB4BAA6:\ +00000000000000000000000000000000 + +00004000000000000000000000000000:4B0B95251D8737013E01F73B71DBEBFE:\ +00000000000000000000000000000000 + +00002000000000000000000000000000:8793996649604702198290E258A151DF:\ +00000000000000000000000000000000 + +00001000000000000000000000000000:99F161837DF7F24E3748C2BBCD71417F:\ +00000000000000000000000000000000 + +00000800000000000000000000000000:305049B5511EA8FBD5C36AB3E62E59EE:\ +00000000000000000000000000000000 + +00000400000000000000000000000000:89BF8940DD39B51B35E70F62137AE5EA:\ +00000000000000000000000000000000 + +00000200000000000000000000000000:301847CD9DA64B1BFD9E781056457761:\ +00000000000000000000000000000000 + +00000100000000000000000000000000:04B0F6A6C8BE9C4A771701DA1F2BD512:\ +00000000000000000000000000000000 + +00000080000000000000000000000000:91898CFEE3784B0299A655391057081E:\ +00000000000000000000000000000000 + +00000040000000000000000000000000:6515031342504BAC93832D74B18DE5F9:\ +00000000000000000000000000000000 + +00000020000000000000000000000000:D98ED2EEACB67C0FFDDA9724C309DF25:\ +00000000000000000000000000000000 + +00000010000000000000000000000000:4F963C1680E07CA4DD7C3759F848D2CC:\ +00000000000000000000000000000000 + +00000008000000000000000000000000:B51D85DC8C8F5A7EA15EFBEDBCBFC9E4:\ +00000000000000000000000000000000 + +00000004000000000000000000000000:F7C45BC3FA262A837C670776238C767E:\ +00000000000000000000000000000000 + +00000002000000000000000000000000:5E912791AC2F572389999FD369EC8E37:\ +00000000000000000000000000000000 + +00000001000000000000000000000000:7E8C9BA80ADC579747B1E4616D7EC9B3:\ +00000000000000000000000000000000 + +00000000800000000000000000000000:BF99640F187DB0C2944B959050B62F6D:\ +00000000000000000000000000000000 + +00000000400000000000000000000000:C5E61399609A0BE02A916D48A8A64C63:\ +00000000000000000000000000000000 + +00000000200000000000000000000000:07B4116F41B82767CB72E2E64CC046E3:\ +00000000000000000000000000000000 + +00000000100000000000000000000000:AB696B5F4E7ABDFCEC1D2DEDAC05E2A0:\ +00000000000000000000000000000000 + +00000000080000000000000000000000:50654EE25CF9E493B0B7138EE74BC166:\ +00000000000000000000000000000000 + +00000000040000000000000000000000:BDA01373F42BFC2B0F723366A46E1FF1:\ +00000000000000000000000000000000 + +00000000020000000000000000000000:AE25CD3DF7FC7BB8A2E645EBD79D2A29:\ +00000000000000000000000000000000 + +00000000010000000000000000000000:644664257BFAD3A0CF16D683A026A72A:\ +00000000000000000000000000000000 + +00000000008000000000000000000000:3AD0281E1F1225280383D5B7A3E90B04:\ +00000000000000000000000000000000 + +00000000004000000000000000000000:23F2882568F472EBC1B519122823441C:\ +00000000000000000000000000000000 + +00000000002000000000000000000000:8DE047245D62895A7E5852CEE8379A4F:\ +00000000000000000000000000000000 + +00000000001000000000000000000000:21ADF95994B6FEC5DA6FC40FEA782D79:\ +00000000000000000000000000000000 + +00000000000800000000000000000000:F2834B5587D63C382DBC397101EBB64F:\ +00000000000000000000000000000000 + +00000000000400000000000000000000:884C3D3850DC3EFFEAA0DB8785BEC5E5:\ +00000000000000000000000000000000 + +00000000000200000000000000000000:71AB2DB59AE3AAF781DAB5CAD1007975:\ +00000000000000000000000000000000 + +00000000000100000000000000000000:7793380505B20B6CDA1A2CEB6AF6D76D:\ +00000000000000000000000000000000 + +00000000000080000000000000000000:6A986D4B71CC337450CA165B110414AB:\ +00000000000000000000000000000000 + +00000000000040000000000000000000:EEC535764784A680C2852BD4B00ED6AC:\ +00000000000000000000000000000000 + +00000000000020000000000000000000:431A4B03918BD1A65D3523D63C7CBCA9:\ +00000000000000000000000000000000 + +00000000000010000000000000000000:6E657880D84A51B2241109E82B2A7EEE:\ +00000000000000000000000000000000 + +00000000000008000000000000000000:B4D163CFD4279B1F9DA0E1FC8616940C:\ +00000000000000000000000000000000 + +00000000000004000000000000000000:552143C6F2B0A0AB82B2AD487BD74DF4:\ +00000000000000000000000000000000 + +00000000000002000000000000000000:A8CED7B931A5AD407DDEF7F4510DBA70:\ +00000000000000000000000000000000 + +00000000000001000000000000000000:55BB234ED4164A9CC028C9C9DADA8A06:\ +00000000000000000000000000000000 + +00000000000000800000000000000000:0576F9792BA215C89BE0C86D8B3E84B6:\ +00000000000000000000000000000000 + +00000000000000400000000000000000:C117C7A4AF79DEECC8C18E8138BD4F78:\ +00000000000000000000000000000000 + +00000000000000200000000000000000:92FC2FDE8E99F5ECF5DFFB2B005C3790:\ +00000000000000000000000000000000 + +00000000000000100000000000000000:F3C94469F9B4166B76A7DA55FC45EE2B:\ +00000000000000000000000000000000 + +00000000000000080000000000000000:4C3A60421F79015B99A9B928477CC451:\ +00000000000000000000000000000000 + +00000000000000040000000000000000:ED6A1AF53574213F41812E8F5D41536B:\ +00000000000000000000000000000000 + +00000000000000020000000000000000:AF39A2A89D48B0A2F519B39F3DD4A7E9:\ +00000000000000000000000000000000 + +00000000000000010000000000000000:7F75ED2F965C9ED280CFA16B934E81D9:\ +00000000000000000000000000000000 + +00000000000000008000000000000000:B92C3EEB72B6BFD288E1F38D64248E93:\ +00000000000000000000000000000000 + +00000000000000004000000000000000:6FE1E1883D78ADF9FD415265A539D61C:\ +00000000000000000000000000000000 + +00000000000000002000000000000000:D5ABB34FC2D207FB0F8DF60DA81B9661:\ +00000000000000000000000000000000 + +00000000000000001000000000000000:751327283356553AF48AB6ED21DCE7C5:\ +00000000000000000000000000000000 + +00000000000000000800000000000000:B826F4F7B5C5DF743C87EE73119D71FF:\ +00000000000000000000000000000000 + +00000000000000000400000000000000:ACC2FA1CBD0FA5F8AAF147396AA72EF1:\ +00000000000000000000000000000000 + +00000000000000000200000000000000:F9F02491D78EA3B140D368CA71F0D6D4:\ +00000000000000000000000000000000 + +00000000000000000100000000000000:A414990595D6E5E3C657B3190A1AE3C6:\ +00000000000000000000000000000000 + +00000000000000000080000000000000:478FCFBDB52A6CDA402217483E26604F:\ +00000000000000000000000000000000 + +00000000000000000040000000000000:DE5E798198E306A2FF47F4F2DB7B3E2F:\ +00000000000000000000000000000000 + +00000000000000000020000000000000:B42E74D15CA26D9CC358A5E2B1F9DD70:\ +00000000000000000000000000000000 + +00000000000000000010000000000000:2800BCF67B76D76F7D0070950A85A20C:\ +00000000000000000000000000000000 + +00000000000000000008000000000000:808F9BE49A31AD5D0A62094A55372D64:\ +00000000000000000000000000000000 + +00000000000000000004000000000000:DAA7291D3A3289EAD026121F8CE16151:\ +00000000000000000000000000000000 + +00000000000000000002000000000000:93D7139BC6A67316FFAFEC2ACC89D245:\ +00000000000000000000000000000000 + +00000000000000000001000000000000:15D1444811E90AD554E50973F32B8AD6:\ +00000000000000000000000000000000 + +00000000000000000000800000000000:636FF061A2FCA2EAA8DFD3A195E8BA4F:\ +00000000000000000000000000000000 + +00000000000000000000400000000000:A2FBB57034BCF5E89E1495C216A44917:\ +00000000000000000000000000000000 + +00000000000000000000200000000000:7B370D533113C91233BBDC73B14B121F:\ +00000000000000000000000000000000 + +00000000000000000000100000000000:F21BC7D2EB7541EB3F0B40394FA064C7:\ +00000000000000000000000000000000 + +00000000000000000000080000000000:BAAD725D1BEBC934FEC792D158163DD5:\ +00000000000000000000000000000000 + +00000000000000000000040000000000:ED50A592E0D2DE126BC97FD8DAD20919:\ +00000000000000000000000000000000 + +00000000000000000000020000000000:11DB39B92B98A4719FE345FC44082787:\ +00000000000000000000000000000000 + +00000000000000000000010000000000:43B1AA58C190006D5EA3F6B708B90509:\ +00000000000000000000000000000000 + +00000000000000000000008000000000:8A19FB44B5962288640F48B27286904A:\ +00000000000000000000000000000000 + +00000000000000000000004000000000:C19B0558E72BABB1B9275EE8B48B9017:\ +00000000000000000000000000000000 + +00000000000000000000002000000000:587D8A04B1958388D69F26E4106D8232:\ +00000000000000000000000000000000 + +00000000000000000000001000000000:B53EB6177E1BC1C083E743878F476003:\ +00000000000000000000000000000000 + +00000000000000000000000800000000:A42E251AF82C03E4ADB9E5872AD8F7B2:\ +00000000000000000000000000000000 + +00000000000000000000000400000000:E2585AE29C6054CBDA85B6AA00D88C90:\ +00000000000000000000000000000000 + +00000000000000000000000200000000:3F6364A00BDCF925C6D62BA15DF56234:\ +00000000000000000000000000000000 + +00000000000000000000000100000000:6ECB0E56F218E4D1E790C34BBBCA06B8:\ +00000000000000000000000000000000 + +00000000000000000000000080000000:02ACC5470DD8D223ECB12339750D3BC0:\ +00000000000000000000000000000000 + +00000000000000000000000040000000:D67A590C0AB3B3E47406D19DB9F0A21F:\ +00000000000000000000000000000000 + +00000000000000000000000020000000:2B5CF7D06148DF6448016FB40FBF9F53:\ +00000000000000000000000000000000 + +00000000000000000000000010000000:4D635C044E9ACA243BA1F68268789D41:\ +00000000000000000000000000000000 + +00000000000000000000000008000000:0118FE9B311429CC06F01AA150D1FF08:\ +00000000000000000000000000000000 + +00000000000000000000000004000000:1E8AB1853E0D2F0E9FD49FE5285611AD:\ +00000000000000000000000000000000 + +00000000000000000000000002000000:E521BDB90371FAEC980E1EAC85C10137:\ +00000000000000000000000000000000 + +00000000000000000000000001000000:E2B8BB4A2EDF3DA04F6934EEF903DF17:\ +00000000000000000000000000000000 + +00000000000000000000000000800000:75528623E760DD71612DA5F9374EC616:\ +00000000000000000000000000000000 + +00000000000000000000000000400000:1FCEBEA2DDEDF905D645E1A03E2584EF:\ +00000000000000000000000000000000 + +00000000000000000000000000200000:4AC71EB7EBDA9AD47531FCAB0D34FA5A:\ +00000000000000000000000000000000 + +00000000000000000000000000100000:0458B8910A076F39CAAE517F5E3E4D59:\ +00000000000000000000000000000000 + +00000000000000000000000000080000:F5D01E6C7FA961F6AA1B94FFBFA59672:\ +00000000000000000000000000000000 + +00000000000000000000000000040000:652473292C5C5764658F8E1FF91B21F8:\ +00000000000000000000000000000000 + +00000000000000000000000000020000:05D5357FD61285F1B9FC19EB2BBF01C8:\ +00000000000000000000000000000000 + +00000000000000000000000000010000:2D379505C15DD6C1AD7544CB375720E1:\ +00000000000000000000000000000000 + +00000000000000000000000000008000:D5918DFA1A722206C89E7B5D518BB28D:\ +00000000000000000000000000000000 + +00000000000000000000000000004000:30C3BBEC945657A6EC5B9222BC36DB0B:\ +00000000000000000000000000000000 + +00000000000000000000000000002000:041305F2248F1FD0EC6181B4D6B619D3:\ +00000000000000000000000000000000 + +00000000000000000000000000001000:C275B6410A77513E4F33C21F9BC11924:\ +00000000000000000000000000000000 + +00000000000000000000000000000800:EECA71E0036A80BBAAAE62400EA1A237:\ +00000000000000000000000000000000 + +00000000000000000000000000000400:1025F24952D1691730DAD7CAF09C32C0:\ +00000000000000000000000000000000 + +00000000000000000000000000000200:FB7830146AC03E32BE6D03A4AE839E97:\ +00000000000000000000000000000000 + +00000000000000000000000000000100:A91E3D5B9DDC4F0315E718B4C190CBA9:\ +00000000000000000000000000000000 + +00000000000000000000000000000080:79FBBF61CB27651FBA333B9FFAF60F31:\ +00000000000000000000000000000000 + +00000000000000000000000000000040:FF598CBF22746883F86DAD6D679DC85E:\ +00000000000000000000000000000000 + +00000000000000000000000000000020:FA0ED9A5406FC13E532FDB74988A9554:\ +00000000000000000000000000000000 + +00000000000000000000000000000010:36DEA77F6832D3C81776801AFF839069:\ +00000000000000000000000000000000 + +00000000000000000000000000000008:262855946EE434D4F0DF924BAB0311BE:\ +00000000000000000000000000000000 + +00000000000000000000000000000004:01FF81B0107BEFA8427260954C7CD50C:\ +00000000000000000000000000000000 + +00000000000000000000000000000002:61DF2C54CDF545F8E774D50C8FF59752:\ +00000000000000000000000000000000 + +00000000000000000000000000000001:45F21B1FD1099CB36C64435337BAB3E3:\ +00000000000000000000000000000000 + +80000000000000000000000000000000:4433FCCBF2D4AA14783835D0968BB7A6:\ +000000000000000000000000000000000000000000000000 + +40000000000000000000000000000000:D565448D0753F08C6108B10CCEB4F213:\ +000000000000000000000000000000000000000000000000 + +20000000000000000000000000000000:1F2B7678DB0B0C33F2F5531FCB71D97E:\ +000000000000000000000000000000000000000000000000 + +10000000000000000000000000000000:8025160E9E0DF83CAC559816D3BA4AEA:\ +000000000000000000000000000000000000000000000000 + +08000000000000000000000000000000:A0F5D4524C743641214BD088EE9A4A0F:\ +000000000000000000000000000000000000000000000000 + +04000000000000000000000000000000:A2981925C529529B068FC1109A509836:\ +000000000000000000000000000000000000000000000000 + +02000000000000000000000000000000:AF60EDCB3C0FE50E4FE093509C1A87F6:\ +000000000000000000000000000000000000000000000000 + +01000000000000000000000000000000:6F475AF136CC10485515C95773A74AD2:\ +000000000000000000000000000000000000000000000000 + +00800000000000000000000000000000:6E09A8F5626CE2364668F8254F192E5A:\ +000000000000000000000000000000000000000000000000 + +00400000000000000000000000000000:5DE55C749F91D9392A87CA423F00FF95:\ +000000000000000000000000000000000000000000000000 + +00200000000000000000000000000000:4CD217660FCE3BD43999AC8353503118:\ +000000000000000000000000000000000000000000000000 + +00100000000000000000000000000000:94B45B0665BCB3FC486CFD980546E934:\ +000000000000000000000000000000000000000000000000 + +00080000000000000000000000000000:F924999F0213FE2DE932D1D072FBD38B:\ +000000000000000000000000000000000000000000000000 + +00040000000000000000000000000000:B64F96119ED3F9FD37A826E7A48C4F94:\ +000000000000000000000000000000000000000000000000 + +00020000000000000000000000000000:63E59879D0A422CD030E51727F379CC0:\ +000000000000000000000000000000000000000000000000 + +00010000000000000000000000000000:62B160854BBA6DB3EB960EDF53A60663:\ +000000000000000000000000000000000000000000000000 + +00008000000000000000000000000000:39A8147579540CC5A1F32F87768A4E3B:\ +000000000000000000000000000000000000000000000000 + +00004000000000000000000000000000:1B201066BC1D0173089BD0346C57630C:\ +000000000000000000000000000000000000000000000000 + +00002000000000000000000000000000:2818D6897E7AF26CF08409C1BBCDA8FC:\ +000000000000000000000000000000000000000000000000 + +00001000000000000000000000000000:8BCE5EE56402A19BB29979A05AB3EFF8:\ +000000000000000000000000000000000000000000000000 + +00000800000000000000000000000000:4F8B1F65E7CE872E514B53BE8DE8759A:\ +000000000000000000000000000000000000000000000000 + +00000400000000000000000000000000:3145B8EBF046F533D5378BBDF9C9E4F8:\ +000000000000000000000000000000000000000000000000 + +00000200000000000000000000000000:49E18ADC2929D19B61389C698DCEE532:\ +000000000000000000000000000000000000000000000000 + +00000100000000000000000000000000:BC7C0A8FDBEB8B63608F0BEF9C1E396F:\ +000000000000000000000000000000000000000000000000 + +00000080000000000000000000000000:89F15AD40BB43B2284B3563F2C974023:\ +000000000000000000000000000000000000000000000000 + +00000040000000000000000000000000:BB60A7897D5F438651EE13C02B5AA790:\ +000000000000000000000000000000000000000000000000 + +00000020000000000000000000000000:946FB4349CE2935BE1CCE99A2A01A6C9:\ +000000000000000000000000000000000000000000000000 + +00000010000000000000000000000000:90EA5937B4E393E34B4E60C787B33E2F:\ +000000000000000000000000000000000000000000000000 + +00000008000000000000000000000000:C5884097BC796E63B3046CB031919D15:\ +000000000000000000000000000000000000000000000000 + +00000004000000000000000000000000:06DC71C7CB99EF0B2EA4379CE5451E81:\ +000000000000000000000000000000000000000000000000 + +00000002000000000000000000000000:8A85BC61EAF50F065CB769B48243E51B:\ +000000000000000000000000000000000000000000000000 + +00000001000000000000000000000000:482E708D7AAA9637674AE923E2128BB5:\ +000000000000000000000000000000000000000000000000 + +00000000800000000000000000000000:1977127839A3FD886B5ACF2753A28D9F:\ +000000000000000000000000000000000000000000000000 + +00000000400000000000000000000000:39A993ED3ED7F4A1557FF18ADFE55CCD:\ +000000000000000000000000000000000000000000000000 + +00000000200000000000000000000000:8995CF677F032B100EF2FBA632AA4D67:\ +000000000000000000000000000000000000000000000000 + +00000000100000000000000000000000:B54C94BC29029F9DC78BAE0908B543C9:\ +000000000000000000000000000000000000000000000000 + +00000000080000000000000000000000:CD0A7D015E352D8B27687ED66B45C64D:\ +000000000000000000000000000000000000000000000000 + +00000000040000000000000000000000:F4E89BBAAA6DCB96952662F88DB0A60D:\ +000000000000000000000000000000000000000000000000 + +00000000020000000000000000000000:37FA1912B2636F3982A768C5208267B3:\ +000000000000000000000000000000000000000000000000 + +00000000010000000000000000000000:C5F27B0B8B93C4F693510EDAB0560073:\ +000000000000000000000000000000000000000000000000 + +00000000008000000000000000000000:EAD47638DF1D0AB1D3441D5B77A7459D:\ +000000000000000000000000000000000000000000000000 + +00000000004000000000000000000000:A9198F0441AAA6B84DB891AF859145E0:\ +000000000000000000000000000000000000000000000000 + +00000000002000000000000000000000:99604EEF14A27550AA1F58510BC6C745:\ +000000000000000000000000000000000000000000000000 + +00000000001000000000000000000000:133CE0B0F01E22DB16B51F6074A570E0:\ +000000000000000000000000000000000000000000000000 + +00000000000800000000000000000000:6E2503C056B37957BC00249175B6A829:\ +000000000000000000000000000000000000000000000000 + +00000000000400000000000000000000:8076A054B269283F5063CF9EDAFF721E:\ +000000000000000000000000000000000000000000000000 + +00000000000200000000000000000000:6ADC87C1A40ABF8DA9FF4DA863C4AAA1:\ +000000000000000000000000000000000000000000000000 + +00000000000100000000000000000000:676953B542456DDD155467F7F6E51C2A:\ +000000000000000000000000000000000000000000000000 + +00000000000080000000000000000000:441D72C0FB4A79E4451B9B0D3571E1E4:\ +000000000000000000000000000000000000000000000000 + +00000000000040000000000000000000:642DC2A4A84229406ADFE681FD1D2F51:\ +000000000000000000000000000000000000000000000000 + +00000000000020000000000000000000:CA1DF7DBF4163F601ED11216767E8C79:\ +000000000000000000000000000000000000000000000000 + +00000000000010000000000000000000:F8EBCE557E084052E74A5DEB45439D6A:\ +000000000000000000000000000000000000000000000000 + +00000000000008000000000000000000:589606504D2BBC4A85507D61AD1AE6E1:\ +000000000000000000000000000000000000000000000000 + +00000000000004000000000000000000:5627DFEFE159A8FEF32FDC29321CC705:\ +000000000000000000000000000000000000000000000000 + +00000000000002000000000000000000:BFC074B43DD81ED778082FB83AAB8D8D:\ +000000000000000000000000000000000000000000000000 + +00000000000001000000000000000000:6DF74B1434C13343CAE51F38BABDF4BF:\ +000000000000000000000000000000000000000000000000 + +00000000000000800000000000000000:1C9B11549C831CE68C7CE061F1CCFCEE:\ +000000000000000000000000000000000000000000000000 + +00000000000000400000000000000000:31D07F177D35A6EE067C75C5B1F3D728:\ +000000000000000000000000000000000000000000000000 + +00000000000000200000000000000000:D4B7FA191B9414FF3D293BC76C2E12A6:\ +000000000000000000000000000000000000000000000000 + +00000000000000100000000000000000:9D7AA5550DAE2B1B7D608147009DFE2B:\ +000000000000000000000000000000000000000000000000 + +00000000000000080000000000000000:5266FA9AB29440558FB71EDA1B43BFBA:\ +000000000000000000000000000000000000000000000000 + +00000000000000040000000000000000:2CF722D01CB1EAE802C78FB22AF095B2:\ +000000000000000000000000000000000000000000000000 + +00000000000000020000000000000000:B3C02698C56AB6D3EFCB90AC81CBD787:\ +000000000000000000000000000000000000000000000000 + +00000000000000010000000000000000:FBF4F2DC7FD1A9F6D4C8B8BFA3AA81FB:\ +000000000000000000000000000000000000000000000000 + +00000000000000008000000000000000:32D300D0B845E26F7A0505AAB453E0B2:\ +000000000000000000000000000000000000000000000000 + +00000000000000004000000000000000:EAA724538478C450FE5E893DFD206D5B:\ +000000000000000000000000000000000000000000000000 + +00000000000000002000000000000000:346E15BA10E1B15D2DE2A862C8BAB645:\ +000000000000000000000000000000000000000000000000 + +00000000000000001000000000000000:67E87A345284D00742FF8E0D6C67C677:\ +000000000000000000000000000000000000000000000000 + +00000000000000000800000000000000:D9FF605AF934D4EA36BB4D4678D250A5:\ +000000000000000000000000000000000000000000000000 + +00000000000000000400000000000000:C6BAAD911C8D06461FEB1C8FD73A1163:\ +000000000000000000000000000000000000000000000000 + +00000000000000000200000000000000:AFE155824F95065479A7326AF6FFAD5C:\ +000000000000000000000000000000000000000000000000 + +00000000000000000100000000000000:DAFA519AB33BC01A665BD43D7B578716:\ +000000000000000000000000000000000000000000000000 + +00000000000000000080000000000000:AB1A3C2AEA2AB0873FCE9B193AC3CE26:\ +000000000000000000000000000000000000000000000000 + +00000000000000000040000000000000:DB4E325C5F0C6A2A80A97FB53629CA42:\ +000000000000000000000000000000000000000000000000 + +00000000000000000020000000000000:AA0B63CE9363BCDC1840FE6DF3EEF598:\ +000000000000000000000000000000000000000000000000 + +00000000000000000010000000000000:564F6ED396958B6CD1C5156F30F12BD3:\ +000000000000000000000000000000000000000000000000 + +00000000000000000008000000000000:59CAEE5DD9D6D8A17DCD5761F285ACCD:\ +000000000000000000000000000000000000000000000000 + +00000000000000000004000000000000:4CAC1BC4EBF467854A15DDBC9410E30E:\ +000000000000000000000000000000000000000000000000 + +00000000000000000002000000000000:9D432A8BC205B2DAE6ED10E5D2573DB5:\ +000000000000000000000000000000000000000000000000 + +00000000000000000001000000000000:A1B2A6D98E8331CA5D2605C5053AE8D8:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000800000000000:CD3676661A44F4509EFBFFB4ED5AD60D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000400000000000:0E367EE025F2FF821D5F0B89FCECFFA9:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000200000000000:5F60D9B6A93F1F1B531A9D26C7465114:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000100000000000:E5753FFD3DF072BCD07292484E9AF749:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000080000000000:25F43090C51DFE3C48DB6F391B489669:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000040000000000:AE817F28DEE664D2B9739BF93AA73B1E:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000020000000000:F1D08CAFE3F5E56C18237E777C731DDD:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000010000000000:6ECFB7B90D05650F97B5D6D7F677ECE9:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000008000000000:FEA1BF5FD0BCFA04E0D906B4C5F8C51A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000004000000000:0739D17249C17E813B7716212E4E32F3:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000002000000000:81AA866868D538D53194B5B5D7014BD0:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000001000000000:E3CC87289C585148267231499BADA0F0:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000800000000:2016EF8808F2B5C38B0F790C5A81E9F7:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000400000000:7F06EC5E639B36CD7482E5D3568DD54E:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000200000000:9A066E0A89EDFF5F26F00F8CC76710B7:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000100000000:49A6ED8109D54E6628CD4F6418B788D4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000080000000:4C3F149C3D7A196B8F61AFF5691950FB:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000040000000:85B54F82B4586B3396C2200DFF3B26CC:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000020000000:705B756847815F1D0DA8D55A45F91BF5:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000010000000:4C81CA819469B5A80EB6AF78BB91570D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000008000000:5D057D02E17129A43E0B68D9425917CA:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000004000000:E472655E64E637CCD7D1FD3D46970F34:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000002000000:05B3391A2CABBED3F1AE0EBAEF6D61B3:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000001000000:96D1DAD8F5083314D8185517614E2E3B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000800000:B4054DBFE0DB6487C90505273A5FF3B1:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000400000:4E766330F2C22059E59B5C8972AA2AFC:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000200000:78AB8FC7997E2B63B59DC80F4F560D95:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000100000:059181B7493B3D66B61CC663B58D7860:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000080000:4149CD202F19C2BBF631FC2BA8FFDF41:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000040000:6465A8757C3E9E5D9A98EEF1CEE37324:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000020000:06A7F1D391336FFBEA9986A82BAFFD02:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000010000:6204BFF718C247F7A909C4FD4CB6444D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000008000:4B815F5F654E7C6E9B135D14773BF419:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000004000:D18FBE3FAACC1722641E66DB74220E98:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000002000:6E473DD470E74E9066FE07297434D8A4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000001000:E6FD048EB622EE77A092E1818472C477:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000800:2DCD5664A1151BF563F25E86B69767E4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000400:3455215DFA380B77C931C262A38B01EE:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000200:7470C0914B4AA37DB90DCDD87A253D94:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000100:CB15F18A9A66397EAC67FAC2BA875EE5:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000080:5F273D6F25D09AFE351CE02016E18218:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000040:CA995621063500658C47AAD5C89BE0FE:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000020:70724F68B3D09917AB7286449BCC71F3:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000010:10769D43746A1DBFB7CEEDD1EB9EBB0E:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000008:87F113ABDF184062224235392A20AF11:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000004:7D237E25D34FEC04FC635884B1342EC3:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000002:435B4DA29136AAA1275EF16F5394A235:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000001:70051777D259550440C9BB7884DFFBFA:\ +000000000000000000000000000000000000000000000000 + +80000000000000000000000000000000:7DEC45D013733A2FC3ACB05AC5EDCDA0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +40000000000000000000000000000000:A0CEAF180B51BFD4781D46CD10160457:\ +0000000000000000000000000000000000000000000000000000000000000000 + +20000000000000000000000000000000:498CEEDE242280926B1583FB4A2F9073:\ +0000000000000000000000000000000000000000000000000000000000000000 + +10000000000000000000000000000000:39E60B423F54786849C6E0BA2AF6BDD3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +08000000000000000000000000000000:CA6680EA57E0FE1628DC26EA79C948EA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +04000000000000000000000000000000:CA14A0AF4CF3D1C3615204EB95F216CC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +02000000000000000000000000000000:2D5A5029679E795D4F49CF1E7AA525FF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +01000000000000000000000000000000:5AAD27C9EABDAAD2296718BB0118871E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00800000000000000000000000000000:80CA60282018A1DD71762D84750EB459:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00400000000000000000000000000000:E2250B330EC2C407295F2A1BC8B33330:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00200000000000000000000000000000:210CEBA6B53AC0DE78757CDC785C6A35:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00100000000000000000000000000000:053FC841A2E3D6037B34CB9C7CCC0CFB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00080000000000000000000000000000:DED4DA1EFC0FCF248E9DA7885CA54A32:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00040000000000000000000000000000:BAE5DF7B5CB001EFCB26C5AA2DD2588D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00020000000000000000000000000000:9DD5C8DC680CC10FAF75B19331ED9FCD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00010000000000000000000000000000:D348D0D2E64F7C6B3EBC0844EA93A77E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00008000000000000000000000000000:E3AEE8A29AD4A08D979F08F030650A24:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00004000000000000000000000000000:272797A77F83C01290E213B511A1659E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00002000000000000000000000000000:B2E84007CACDA6638F4391ACCC8DD245:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00001000000000000000000000000000:EAA21531B492A737DDCB7EF2D8D4022A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000800000000000000000000000000:0DCF4259CFB5D0DEFA7C1DD26C5AE728:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000400000000000000000000000000:1B3596ABDAB6FE10E574A0505AE5EC1F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000200000000000000000000000000:0B07CA48F49D189E2E343D83D54784A1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000100000000000000000000000000:BB4977183CE7D829F90C1A4A0C0AD921:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000080000000000000000000000000:A30AAD2751895E667AF64C24F127EE00:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000040000000000000000000000000:1D407E4971F586E8BAFD780411DAB446:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000020000000000000000000000000:287E1CBFA05A25B90B94B0D1769DB4BE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000010000000000000000000000000:FEEE919F6634BFDEFD6950CA84FE7DDE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000008000000000000000000000000:DEBC950100E5BDB2B972D96B110CAAFB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000004000000000000000000000000:7E2B207B3204FF65ABD0E286E8FCFD88:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000002000000000000000000000000:E46FA1ACDA975397F893DA874257B063:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000001000000000000000000000000:48B472378DDB8297A1E70DB24B3B5784:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000800000000000000000000000:51E73F78E9E3DF78C460BD1D1D6F9D02:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000400000000000000000000000:A140D05B56E36B690DE8E5CC7CA2DA96:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000200000000000000000000000:4775063A5B2DB92E0A97A975DFD161AD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000100000000000000000000000:AD6913069340B8B88A42F09975A03E96:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000080000000000000000000000:CE03AA97EC230AF5130F7B49CF11F749:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000040000000000000000000000:CE235004F77A37CA2405AB272AE1F278:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000020000000000000000000000:0207B9546C956A9B96FC6FF8D8B25FF9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000010000000000000000000000:72284643B100DFEDAB7243D372000289:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000008000000000000000000000:2B97D40D51A9C400AC8F72285CB9D947:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000004000000000000000000000:16DEF3EF31FB9E0A9E11FE5DBD10FF6D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000002000000000000000000000:B8C5BEAB5058E1F8F31AC2537DFC2A04:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000001000000000000000000000:96240AFD00164E5BA929C470CC2EDFCD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000800000000000000000000:8255F69C848F0601DFA944E7DAA07B03:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000400000000000000000000:31D19233EB697EC50C087C6761658C22:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000200000000000000000000:0E267CDC580C17C21F207BB6A14A2A61:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000100000000000000000000:84F60557F8302489621586BC45B52D1D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000080000000000000000000:C6D5B38F47BB5298C521E41B9B722B44:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000040000000000000000000:384D3E44D70F9FD1783D7B86DC7C0B79:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000020000000000000000000:542B27EBC9FA37FA8CECF14E73545CB6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000010000000000000000000:04B5915863477F621C976F47ED7A6242:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000008000000000000000000:571E6627E25993D157D7306937A0F62F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000004000000000000000000:A256299F34E93EBEC69E04CFFF3476A0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000002000000000000000000:F202A1227405A4CDFC9308819B189FCB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000001000000000000000000:F99B66FEB8E9FFA89164A8EC1B8F1C85:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000800000000000000000:3C70D7CD09111B15069F54809724F1B0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000400000000000000000:B88FDCFD41AD34AE92091D31E90C585C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000200000000000000000:2A80BE073D50FCF2B7FA44A39F777AE1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000100000000000000000:65F620832AD465A2AA6A14129F382DEE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000080000000000000000:A4518AD23FA96370D83BD3B2FBAA54C9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000040000000000000000:22AB117786B312AD84C9C2CAF1E2C2CF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000020000000000000000:33C719DCCF25FCF76916B80C632ADD00:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000010000000000000000:7D95F59DB32ECC39D00DA9DF113AA2EF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000008000000000000000:376278196B5EE68F2B57B51B4D07A849:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000004000000000000000:F6EBAD4990425CD9BBF97D5AC51D33DE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000002000000000000000:2C64F1A0EB9601E7B5A29E9237040E39:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000001000000000000000:0D6E4B7D38620761D65CCDDE9EDDB24F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000800000000000000:FB954442EDC07197FAE86E9A0D714903:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000400000000000000:4B2CC93726DEE48282FA27816FEDC5D6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000200000000000000:75EBA30DFEE4BE2CEFAF7D097D08BE4E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000100000000000000:90A9750293D227B3F75839A1B1B72A1D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000080000000000000:EA6A6BADD96680C06A0F3FF72A89A3B9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000040000000000000:027957EFFC5F8D54F5E31DEFA4EA5B1C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000020000000000000:689E796B7CA20D52ABCA6E02DFF2FA19:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000010000000000000:D0894BC5EC6BB6548C2DEF7D271C5A84:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000008000000000000:B3AD04752FE8B3CED3BC0C721CFFA017:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000004000000000000:75EBEAA918EE7713AB6B555911A8895B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000002000000000000:4507EAC65B6F8825147535212B810659:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000001000000000000:488887A888AD9C4208981298C32C8802:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000800000000000:8516A2448258784F9CE88A4DF07E12BB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000400000000000:34C35EAEF661E815B02FAE1D82A5C6FC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000200000000000:88927ABABC4DCDBE547729DC8486C912:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000100000000000:E3F2B4AD45A40E8F61A1A002EBB1A6B4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000080000000000:7B8C8A12DFFF1B31E9BBBC9AB1BF191E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000040000000000:12896559E9F9818A45895A850949641F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000020000000000:0ABC2B5B0BE224FCC494D1EF9930663E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000010000000000:1975B8F3DBFEF1B3F68150526EFDFD9A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000008000000000:531360071C6EDFCE4194DD34F282687A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000004000000000:D7D44699A83FAA21673C244155E57276:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000002000000000:1AECF6542049C8ADAE288158FAB8797B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000001000000000:EB40D7F5FADCE30126B34463B1FCFB43:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000800000000:FEFA8ED45925FD4F51AA06EADD1D08CE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000400000000:7E36A1A7FC162B85AAC263DCA957F534:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000200000000:E5C330087D678D159C00C27CBBDC9F61:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000100000000:8F56044BB6E9321DADC1F21A70F1E8C5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000080000000:8714D0D553AD80DDCABE3E9DB67CFE11:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000040000000:B72D92FFF02A78AC4682ABAF141D77C9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000020000000:9550FBBFD4A34816E2FD792AC339D49D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000010000000:84981AB5DFBE8422A2086D0E5E470254:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000008000000:7BD5A92C5957B09FA5AA9F1A34E17943:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000004000000:B603FAB9ED51424992A737BBC1E910D6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000002000000:2E396DFC0B28E28353C2F97BA982C13D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000001000000:D4CC605A1C64E8A98592A8CD05AAFED0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000800000:26C58B071D9116B0123CB99734CFAAF2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000400000:3C9D6B460A2364020F55A70E41B5B2E5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000200000:40569C782ACA0CB05042D0F54967545B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000100000:7340B7EB0B49722A28D0F06056D8878C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000080000:8FA7508A26413C633B77FC418AE0EE80:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000040000:4EA014A1F02840246644548A9C09629D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000020000:B44678D49E3F80D998A94CB542CFBF83:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000010000:756FEB41FE20E403C5C1715AB9D0E58A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000008000:F061519982CD7D2C1451CB2BCA567F21:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000004000:43B291C8A4BBF59612F896EF8DE8C801:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000002000:8512D67DA5F121630DF707E1B87901A3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000001000:1CE9CE4393434F7A0BCD3F4424B95575:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000800:8DEE20BD926E0AEA8F5163FCF8D594E5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000400:B504027202FA9A205A36ACFF47E22CB5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000200:3B88E059888E28B7E61F2602A5361A4D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000100:264BE9E31092B5F5FAE3C90A8544E036:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000080:82ED5DDBF256FB53432873A896699723:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000040:AE8D4DC3B948546E1F0DB6173A7DA5D2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000020:01CD700F9FAAD9182FADAA2E62B9814C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000010:000C12107A21E608CFCC1285E1057373:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000008:3FCD4604A02D1142032433FF551F0F23:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000004:D049B0BD078583621E4841BC9F53B11F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000002:BAAEF3F9A301A25EE35FE6D6C054E06C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000001:5A991DB3C1149C0C16A523B8FC413C8D:\ +0000000000000000000000000000000000000000000000000000000000000000 + + + +# First 2 vectors from an expired Internet Draft (which is what I used to +# implement the code). The rest are from NESSIE. +[MISTY1] +0123456789ABCDEF:8B1DA5F56AB3D07C:00112233445566778899AABBCCDDEEFF +FEDCBA9876543210:04B68240B13BE95D:00112233445566778899AABBCCDDEEFF + +0A0A0A0A0A0A0A0A:DAD2CFFB201C00DF:0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A +0B0B0B0B0B0B0B0B:EBCF435B23CFB4C9:0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B +0C0C0C0C0C0C0C0C:92E00981E5350015:0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C +0D0D0D0D0D0D0D0D:CD70199048ADB686:0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D +0E0E0E0E0E0E0E0E:ACAD6C19AE66EB41:0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E +0F0F0F0F0F0F0F0F:4ECFE751E0E6A16F:0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F +1010101010101010:C7A91953216F1B61:10101010101010101010101010101010 +1111111111111111:0227EB3422109682:11111111111111111111111111111111 +1212121212121212:5B88EB8714B2CE08:12121212121212121212121212121212 +1313131313131313:E325B133AB02C021:13131313131313131313131313131313 +1414141414141414:93A4074EE9C38AE3:14141414141414141414141414141414 +1515151515151515:15AB85B70F337868:15151515151515151515151515151515 +1616161616161616:7EFD6E05D384512F:16161616161616161616161616161616 +1717171717171717:C1E46E7B54BAD271:17171717171717171717171717171717 +1818181818181818:956504E0F372D380:18181818181818181818181818181818 +1919191919191919:667C8BB548330E81:19191919191919191919191919191919 +1A1A1A1A1A1A1A1A:1F8787DF7582DCD0:1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A +1B1B1B1B1B1B1B1B:47F4EAF5BA82C610:1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B +1C1C1C1C1C1C1C1C:0F772431C6E54F3C:1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C +1D1D1D1D1D1D1D1D:51CF4361B3EF3EAC:1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D +1E1E1E1E1E1E1E1E:7AC52498328C66BE:1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E +1F1F1F1F1F1F1F1F:9C4E0F782BBBD830:1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F + +8181818181818181:2FFAF44121E4F834:81818181818181818181818181818181 +8282828282828282:4EED79D6916AA112:82828282828282828282828282828282 +8383838383838383:12B62B3C7FCAA24B:83838383838383838383838383838383 +8484848484848484:F7FAF70C7E4ED8B7:84848484848484848484848484848484 +8585858585858585:C58EC8FEE9DD45CF:85858585858585858585858585858585 +8686868686868686:A6159BD7C1E24B82:86868686868686868686868686868686 + +FFFFFFFFFFFFFFFF:651F3092AFA551D0:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + +[Noekeon] +# From the Nessie reference code +00000000000000000000000000000000:BA6933819299C71699A99F08F678178B:\ +00000000000000000000000000000000 + +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:52F88A7B283C1F7BDF7B6FAA5011C7D8:\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + +52F88A7B283C1F7BDF7B6FAA5011C7D8:5096F2BFC82AE6E2D9495515C277FA70:\ +BA6933819299C71699A99F08F678178B + +[RC2] +# First three came from RFC 2268, the rest were randomly generated by OpenSSL +FFFFFFFFFFFFFFFF:278B27E42E2F0D49:FFFFFFFFFFFFFFFF +1000000000000001:30649EDF9BE7D2C2:3000000000000000 +0000000000000000:2269552AB0F85CA6:88BCA90E90875A7F0F79C384627BAFB2 + +D8886B78E580404D:90748F6F07EF2836:1D +FE9C2CDD8C027870:EC184E6CEC40D9F5:5049 +A7E13BC9F22C595B:67A28EB51250764E:C4F82F +7177755D3F54A920:62A6F69BFE164A05:9190277A +D9DCB373FD4ABCB3:B80190D7B249614B:481B0F86EA +4B138DDE007975AD:7FD56A6AA67F6C83:499825B0D117 +971F30AF097B7350:5DFC9E205A2D14B8:4920D4274A62EA +F95DCF9157489637:4AC1643B949984EA:405F1C56CEFE4013 +1026140C4E7301D1:283EB71029EDE89A:AD6AF2DC8463BAB7C6 +36773B9B092E5FB1:FE60654754ADA82B:3BB04A71CB0D23A7DFCB +CBB90C2F7F42158C:30CFDEFED10675CC:0A6CC3F130AFD069222EEC +B07CDC0A13DD350A:3B050F6208CC43CE:6A9DB0629A46CA98E9F99450 +C0B69D0AD97D154E:BBA1918C34881835:200BCA0DCF0497C3DBF9A025D8 +649B5F71F3B3BDBA:349369793550565D:7C5DD0AC485AD056C57F4B15ABE7 +30B3ED77DBECDF2F:25174AD01E0BE2BC:65D6250D40CEDA1CB7A3CE29414ED4 +E5D64497786FB2D7:BAE8FA177F46151C:56B594BB2938E08B9504D189AD39EADB +2009AF9845F4D0E1:4508CBDEAC304883:48E5FB1C74186717F17C9B7EA8F40827 +8D7BF299E1DD2710:D5C504FF23ADE3A2:2E7C56B9A41B512817B702615EBA38A0 +66E588E1E54E69FA:FB599477D9EF7C14:68229077C5E04998A73CAC26265BC454 +3526264FB3AAD439:789C2F4906D4DD94:B2851A27F152B3B8D21FE19FE080DE93 +51F9D8B75E99850A:992215897C1C4D4E:A63FACCE8ED417ADDBE36262E334C934 +7643ADF384C7D876:280FBCA90127A9B7:68A2CD033B11F329BBF0E952FBDDADEF +61649CC1BB265F04:C04617D4C7F4688B:6562CAA391B7AD91F6F953860C142D53 +7027B6111FE67F27:526E8225707ED477:97FF0C4C1D58254DE89140EECFF8A15B +450500AFA05B83ED:5E55E20A0D0E3226:FDA85236CFEEFF046973CF46C182B41C +51E3A05332220E12:05B42A4CC45321EB:2F1810D1FCFC98C847DA1D21BCA75712 + +# Again, test vectors courtesy of our friends OpenSSL and /dev/urandom. +# Except the first few; I think they're from RFC 2040 +[RC5(12)] +0000000000000000:21A5DBEE154B8F6D:00000000000000000000000000000000 +21A5DBEE154B8F6D:F7C013AC5B2B8952:915F4619BE41B2516355A50110A9CE91 +F7C013AC5B2B8952:2F42B3B70369FC92:783348E75AEB0F2FD7B169BB8DC16787 +2F42B3B70369FC92:65C178B284D197CC:DC49DB1375A5584F6485B413B5F12BAF +65C178B284D197CC:EB44E415DA319824:5269F149D41BA0152497574D7F153125 + +9E1916F381491CCE:172A7A0BA70282E9:C0 +B97800C223082F9F:B5B1708AF59CCAD4:DBEC +F39054061481EB24:64CC1E0066FCA2AA:DA735B +7622BA5D3D51D560:FFCB9EA21917C3DE:0656F579 +A15418BC11B2F0E1:B52821179E5CB9B9:A59FB3DA35 +73B02BE42685EA56:308C21EFE81621EA:32594FCCFFEE +8CD5121F09DB7DFA:70921F59F5CD29AD:80E92B27999910 +532955C8EEBC75CF:CBFBB1E0A1A693F2:925498B73A9CAED6 +BC8B5CF722EEBCAC:F233FBDDC09D9561:3C379D8B11F23CC0F9 +EFABA1B87E0236FE:A573453E1BF7B74B:AED34B49E719D6157F93 +5248601C102C10C0:D96D76C05F5E4478:729B301AFAAB8FCADBEE25 +EF6671A5A29EDEF8:9EC6407003B827B1:982644C13B1AA070437C1144 +5EF9939F903D5AD3:8D9D5B5D12448231:3BADA3BBA56BF23EF64E0D208B +FEF8CD62F9DC8D1E:8FAF5F9D6A4A0A7B:BDD77CE81D8AF0B50ABE418F45F7 +C330D9BDC20D794D:0F74E03240C58D70:4AB4A9A4A31B700ECCB0FF23441F82 +502E1C61223F5522:86CC15281600FA7D:3668476363B42815FF575A65006DAC49 +62ECF065C5723856:5F8E3E9341B32B71:AEE7D59BFFC7FD4A2932C937C7277A2830 +CF8DDCB5035B3CC1:2D688A1A2A8DCA18:3A1CCFABC9F8C46F96FB8B58D02A1F9EC514 +D595EBBAFE479CCC:8AE450DB2A9A7C37:834BC680E250D2A3B5B2D5B03FF14F2F65E412 +9F24230CB25BC86E:EE922AA0AC2EB904:39A787D483A6E52FAEF9FBD2EC3CDF81A39495DA +EE68DE3FEEC31750:E71038E4AB9F475F:DD7ECA8D1145431F60F2B749FB576F82011BB65005 +9464C68A5E6FCE5C:54534C495295FEE4:51FEB601EDA05F5D3D903FA957E6E06B81E640E6DFBE +A91EACB2C38F78EC:997EBFE794F83F65:\ +0EF8C830DDE1838F1554195CAE006E69DD050C255B17FC +170D65C9396BFAE0:3B21E9B59F37FF96:\ +5C47BF0F8E6D0E7A445188E361E4A76A9C48CD9738791293 +D5961EA7B7C02063:15C33DA775B4154B:\ +44822C91949958ADAF7E938395113A4BCE343D39C30B3CBE70 +2C9A50C06A12E865:F060DD9CDBEA5738:\ +284FE5889A02AC1C83F9D1C62AC15AEAA08532EB478447B7A599 +780A3BD50CF78B15:D263CFB83966D499:\ +37F29AA9FDF4758489AD07C168965A73DB335049BDE60400BC19A7 +39EBCCE8CD770C35:BF040B7D806BEDA5:\ +8ED81E58E34274D0B72318A14812D1E50D117437B1F303AC72F75057 +E823EB34847F1551:489177CA2F6E7189:\ +AE591161BDC88AD08FF582EBEDB93A172C235E08E244AACA2F433CF1A5 +3C4DB181401E588C:E2CCD84073236831:\ +D1464349DB7C4D43777B3A44B4DC611C1F4DCCEF296D7A6E38443C773D60 +128787704DDA4240:6BE471CF49A4C1CE:\ +1234D3D3AFB98F7D24D63E3A829D7EBA96A16B516638B79F59F38FD6C75766 +28FE4812E9137CFB:18B5499EF0C1F9B4:\ +FAC10D2B235098D973E8E81997EC9189197DAFE989E4B3A18E6D3C0150BF48CE +725F91D74F3F3C66:F398FC47F4FEA520:\ +4780C11A3CD65D21435AAEC988609495A4DEF6C8FFF6AAE1B26C70BC6C336F73 + +4C706FD69646BA98:5B9A776AEAD6304A:\ +ED7E67F4D658C34693F0962687DB46628587EA2D35DB81C1129F00FA69833E1B +3361F4771047397D:DED25E1BD3872DD0:\ +5DB32571B70E3A66FEAD8ACC3F0C4F3A2A6E41A8ACF3D94E73EA0F91176FC3DB +D840360511EB9840:D95E6398EC528F68:\ +674C6060F45869214A7AA9BF0FA8F54AFCA92D06A0366EA8C4FEF4C8E79A53CB +DBBC3D4D45847930:74A00B919BE23D16:\ +FB0A5141B81EDEAC27DEA6D4789083AA487B7D830E0041E1E2D167A1355BD858 +5FF081C8F197D3ED:48305C0741ECBED9:\ +291FF645CA077953ECE2EF2AE8EA10A127E6D2A1DF4582A5A7B513227C8294C8 +30B8BAE80C26B18D:57F443D4060FAC4D:\ +A967EC9902F212F1D2D6645AB7C81F0DD1BF4439C131AABD7B8233836615F9F4 +E75EBB4AA43E6C45:A29B91450C2A637E:\ +0A30C331D6015E8A0F64E33994263741D996435CFBA3253CBD64B03A5E000310 +B53DD82028EBB35E:39718235AC88956E:\ +1B5E8C38D611847842ACE7CB7CCEDDF152F5043141B462E4704E729C57404D1D + +# All random OpenSSL-generated vectors; not one is in any way official. :) +[RC5(16)] +1CA702F26A04AF21:8105DD6EDD4051FB:2B +78195A51EF592AFF:89055B0265E67032:0957 +5BB2A022E7EDCCBF:94AD2F68A2D3E83C:698855 +3B8B7A2F20DA627F:CB4B25A4A493287F:F62251DF +C450CB97E69F2E94:77644E7454A72221:CB8CE363E0 +B7057F70F43A993B:E411E3023FCA87FC:1FE3BBD63969 +BE9976C68D70D0AA:FDBA816DB72A874C:F9EACED56552BD +6D340411F05E3B31:F58D02EEB481AFB6:BB0C6E15883513C7 +B3844D3B7CAF9F3D:21133B09AABC3C07:3312EEB8E2B619738A +2FBA65761241EAD7:99D16F970CF37B73:9CD7B7EAA3C7C0F2A962 +8B1DC2A2D8E02FC3:4643C45523471F25:347469C239C728FC135965 +A372047B4271030F:731303538F359918:3001E738EC0D082C1A80D84F +4E666F689DB1FF6E:AE11B65FD7E4AB67:7BFF831DE2C51FD9426AB7424A +5D440679051B3A6D:2B4BE8A815F9A35D:3DADAB349343D1CFA3009B49ABE1 +E461164D61914F95:32CF5B9FC95C48CA:D967EE11872B8C04EE0C4BCEE700EB +4AB29FEF7BB5FC5C:2518AA1C85B4600C:32F94338D7D70B4A5537FAEE03730745 +53D49E42AB3AC1FC:02419E4BFDBF550E:1D158F49A2D6878739C61FE6D2E37C11E9 +F99F9DD38CED0DB1:58E4BD6BBAE8565B:95EC4B43FC098B966E151F1B94EDC28D846A +4263C4FE2AB9B990:D267474CE38E6E9C:414326FF6F61C54E2932B56ABADB2496DEBB80 +375AEE48D204DEED:61600764332D10C0:B99CA2E96FB0C85A8633010AA6EC8C3DC6CC0EF8 +02B884BC12569B3F:86B0ED3E4CB4759F:1C4C076CA04C611316AA5D71659F163428479D929B +8AF5B9C53FDAE8B2:37091EFCD093D1D6:EA42742CF00A91F7CD9C63650EF450D20E34732A420C +9C42CAEEA47E2A06:BC1D42AFBE2CB8E5:\ +BEBE3CB5B711C83E150F2DA7A864AE63CF336D9E0EE282 +DD4B4CABDD5D5E35:31076D5D6EA4DE13:\ +3A0603293C5F5A1CCF9DB9337DCA010F243B29A6A2EB3455 +597699EDD1B4DD7D:95FA85725C0AE0DE:\ +00752D67E4E1CCC4ABC7C50B3188181FE664EABF7ED476BC3E +5E2DEED62635DB75:828E88B5D91A7DB4:\ +23B5163E359A7FE8BBD3704F1EA98B712A15FB6FA6D8BFC3AF0E +041BBDF41357E288:2FE24A38A1AE4D61:\ +041C609CFA10BAFD30D34D986B762A959146E7DEE3481DF8A8C70D +E8D46EFBAB44EF65:BA01FBBCF2FE39D6:\ +4CD0194425DF24845BABFB6895BAA18F45C395E8BADC196F36403C30 +0A382E03FB85CFCC:571B98B3E9710D58:\ +7D7CC7017CF9DA5A74E8A7F2D36E5CC016710C43A9CB3C0B9DFB771EED +A3D86E1D88602802:EBBB0C7614414D7C:\ +CBA9B751F404F861E1DA95FFC2D11C686F84D8508D9A1743E5B9A006DA8B +017E4B4EFEF05D71:3EE25FA34042CDE6:\ +28967E8AEBD065D3B5ED27158F953512035515ED3B388E2DA336E9705F16D4 + +9AD01B01AFEA67C0:249B074FC69E1042:\ +3257D40C6B4EBDF8CAEC563CFE94201E1A843B31F2C9B720FC58C8214B7E2C2B +1EE20108D1089F69:28FA504AB46349D7:\ +4120A9CA90A38A4E16E8323E6B9CB1D2CBA0594253AE578A1A64518B32ABCB20 +306786E25C18C9F0:76A525501E857BE5:\ +246F010FB9F2DDD99412824C602C7FB48C9F6A3B81688A4404E1F5EA21296599 +D0FCF3DC590D5A53:91A9699905107EEA:\ +754D9753401A56E2096D71C30102B885159CF5CE7305D93020ECE035869E0BC7 +83D2C97FFECD78A2:95FE3BD241FE9E5F:\ +534F366548F16D3825EDD61EAD00EF650DDC8E040B7955F68D240691AC34F840 +2D7F3F25DE4C0F05:31BD01CB7BA808E4:\ +3B2CCDDFC5371E5F2FF9E119E0E13B730193E563296865BADA20781A2E0FFE2D +140AF01EB286A1DE:098B274A3F2D50EA:\ +DED645862D8B88517F26EC729B8538BB6CE46D869E6D568A20DDC4D253E70749 +DB58306587587FFD:20E71B55168E5ACD:\ +D3C38159C3DB49A62E2369BF4BFEAF9EBDAF8E19B6FE9CB579E52C083FF70AB2 +0A55DD3E3A425245:1489079C596FB1BB:\ +2C15C8A0354DCA1FAF296FBF3FD8E64FD7B9C65EF2EA65B6E216943A551A2CFA +37EC03CAA189CBAE:99FB7B05635AB5AA:\ +8777192F49C195BAACCFF2096964683CFCF0009B2C57477B759F57B1C32C07F9 + +[RC6] +# From the RC6 AES submission package +80000000000000000000000000000000:F71F65E7B80C0C6966FEE607984B5CDF:\ +00000000000000000000000000000000 + +40000000000000000000000000000000:8CF4A482491CD207289D810C2BB29930:\ +00000000000000000000000000000000 + +20000000000000000000000000000000:80EF45D42327E3AED39CD45C4E3E6197:\ +00000000000000000000000000000000 + +10000000000000000000000000000000:F28D8DF12AC0837A0919254980B674F9:\ +00000000000000000000000000000000 + +08000000000000000000000000000000:9FB984DCBA5B0BDFFCFD97B02B648800:\ +00000000000000000000000000000000 + +04000000000000000000000000000000:46F7091CD30CCCF570AFC116F8446492:\ +00000000000000000000000000000000 + +02000000000000000000000000000000:77B517AA59EC7D3381188936BDEACCBD:\ +00000000000000000000000000000000 + +01000000000000000000000000000000:40D5D97CFFDC390AC35C2734F44CF9FF:\ +00000000000000000000000000000000 + +00800000000000000000000000000000:B5A6B7C92EFCB55D349B63066AC1E009:\ +00000000000000000000000000000000 + +00400000000000000000000000000000:152F0F5EA10FAFD0E63494C5FBDCC469:\ +00000000000000000000000000000000 + +00200000000000000000000000000000:61F669BF2B32CD27CF6278392C988510:\ +00000000000000000000000000000000 + +00100000000000000000000000000000:53A63CEE35DF00C73577B9255F55C855:\ +00000000000000000000000000000000 + +00080000000000000000000000000000:6E46B92E23344321A19321DF136CE9C5:\ +00000000000000000000000000000000 + +00040000000000000000000000000000:22F1261FAB993350F6ED41DA5D69B9B8:\ +00000000000000000000000000000000 + +00020000000000000000000000000000:0901BC0A1DB5CC87CDA91EF5F5FF46BC:\ +00000000000000000000000000000000 + +00010000000000000000000000000000:2EE65B377C16BE9517BA12F63189DE64:\ +00000000000000000000000000000000 + +00008000000000000000000000000000:74BD6FAA83668952E2D546A66B7A8243:\ +00000000000000000000000000000000 + +00004000000000000000000000000000:08FB4817F040B54E995B722C483C399E:\ +00000000000000000000000000000000 + +00002000000000000000000000000000:5630614200E248D1644B58E3694D8BA6:\ +00000000000000000000000000000000 + +00001000000000000000000000000000:659A3A27C9F3B0BBC65FC4C15D19051E:\ +00000000000000000000000000000000 + +00000800000000000000000000000000:FF3B39DCB459EE4FFAFCAC8C7331A6BE:\ +00000000000000000000000000000000 + +00000400000000000000000000000000:19F0727A66BD056DCB5541EDE14B4662:\ +00000000000000000000000000000000 + +00000200000000000000000000000000:D0DE4B5B30A294C8A3838B70387C93B6:\ +00000000000000000000000000000000 + +00000100000000000000000000000000:37BDB0A854686484E5EB52239D6C16C4:\ +00000000000000000000000000000000 + +00000080000000000000000000000000:3CC7113F6E6833C9BFB4EE07371488A5:\ +00000000000000000000000000000000 + +00000040000000000000000000000000:A56737C45AC4DBF2417243C2E3B40133:\ +00000000000000000000000000000000 + +00000020000000000000000000000000:B0A5C817B1E2C307A4BBF8258DF5F41B:\ +00000000000000000000000000000000 + +00000010000000000000000000000000:F2112329EFA070476BD515679C887FC6:\ +00000000000000000000000000000000 + +00000008000000000000000000000000:1AD2023CEC89B9436D03CCB9893C21C2:\ +00000000000000000000000000000000 + +00000004000000000000000000000000:6BA3E774FCDD02379C6CF2F7BF28B914:\ +00000000000000000000000000000000 + +00000002000000000000000000000000:A2F8638B0A4014F0641A3CB8A13B5ED9:\ +00000000000000000000000000000000 + +00000001000000000000000000000000:877FEDF7CACCBF0BD7BB5BB236BA96D5:\ +00000000000000000000000000000000 + +00000000800000000000000000000000:C9298A9A01C1F276E2E1E04226BF3D5C:\ +00000000000000000000000000000000 + +00000000400000000000000000000000:4E01DB16789DE364085416DE25871A59:\ +00000000000000000000000000000000 + +00000000200000000000000000000000:FD3B5DA07D0054DD10FFB79440AB3A00:\ +00000000000000000000000000000000 + +00000000100000000000000000000000:A2508E8BD26E2FB9944C27F04D60FAA0:\ +00000000000000000000000000000000 + +00000000080000000000000000000000:E9A43055D71335545A6A514F08B868BB:\ +00000000000000000000000000000000 + +00000000040000000000000000000000:587D5B71730D0B59BFBC0A93675B32F3:\ +00000000000000000000000000000000 + +00000000020000000000000000000000:90076413F890E8FFF04F1031C779C91F:\ +00000000000000000000000000000000 + +00000000010000000000000000000000:FAC9F46E9A1346646EE5C7CED45A84B9:\ +00000000000000000000000000000000 + +00000000008000000000000000000000:471F0738C4F4937E4253161F28086803:\ +00000000000000000000000000000000 + +00000000004000000000000000000000:A76F843041C4AED8241850B316D252A3:\ +00000000000000000000000000000000 + +00000000002000000000000000000000:5C5FD0334332A39924DB0CC7F0867C2E:\ +00000000000000000000000000000000 + +00000000001000000000000000000000:07B6EDDEF27EE890EBC8FFA187D84438:\ +00000000000000000000000000000000 + +00000000000800000000000000000000:11BB0F2DC24461F5E70D2830ED8A7463:\ +00000000000000000000000000000000 + +00000000000400000000000000000000:0AB1A99B63CB8E07290AC60D0A4F1FF3:\ +00000000000000000000000000000000 + +00000000000200000000000000000000:A26B0AFC4D55E7D61518C54E7C1BED01:\ +00000000000000000000000000000000 + +00000000000100000000000000000000:50C8C2B68E06CFCB98785E5AD3D5B09D:\ +00000000000000000000000000000000 + +00000000000080000000000000000000:ACA305D5D0D1E74FC51AC8C92A72FEA7:\ +00000000000000000000000000000000 + +00000000000040000000000000000000:5AF970E570BC1652C82FB4B0945D5410:\ +00000000000000000000000000000000 + +00000000000020000000000000000000:00C224433138C1A4BD60571AA35580BC:\ +00000000000000000000000000000000 + +00000000000010000000000000000000:4EBE79726DAAF4702B075A5898B26075:\ +00000000000000000000000000000000 + +00000000000008000000000000000000:8109EE81B1679CEC42DB80D9530AD2F6:\ +00000000000000000000000000000000 + +00000000000004000000000000000000:403B11B8181D460E9AC0172CBE6DD45F:\ +00000000000000000000000000000000 + +00000000000002000000000000000000:CDE78E92B5A84717AD9B4162E3B14BFA:\ +00000000000000000000000000000000 + +00000000000001000000000000000000:A173D6BEBAA05EC54A47C7E554415963:\ +00000000000000000000000000000000 + +00000000000000800000000000000000:EF31AD6CBFA7857ACF0C28294BDEF8B8:\ +00000000000000000000000000000000 + +00000000000000400000000000000000:209A30C46E41540C7B0AC8C4822DA253:\ +00000000000000000000000000000000 + +00000000000000200000000000000000:AF770103EC57EBEB913C83D99F58B6AC:\ +00000000000000000000000000000000 + +00000000000000100000000000000000:17D0C179EF34DE7F8EC7698A5371EC00:\ +00000000000000000000000000000000 + +00000000000000080000000000000000:E0285A3F97607250CDB89BF92CBD1F41:\ +00000000000000000000000000000000 + +00000000000000040000000000000000:D76BA3CE5E4DC974D4803ADB9F821A57:\ +00000000000000000000000000000000 + +00000000000000020000000000000000:B66579D4159CF0B0114011C0298EBDA3:\ +00000000000000000000000000000000 + +00000000000000010000000000000000:B9761796C787B51852E4C3130B8B662D:\ +00000000000000000000000000000000 + +00000000000000008000000000000000:D5C638801B97A1C2584ED42132F44109:\ +00000000000000000000000000000000 + +00000000000000004000000000000000:E54A021B145B7B7761487BCDFD0B032F:\ +00000000000000000000000000000000 + +00000000000000002000000000000000:3EB3AFE73582EFAB0396108B5E0CDEEC:\ +00000000000000000000000000000000 + +00000000000000001000000000000000:463E10507A26B708A1DFF3763276F5C9:\ +00000000000000000000000000000000 + +00000000000000000800000000000000:0EEBF8D85AE19EB24C810CEF565FA77B:\ +00000000000000000000000000000000 + +00000000000000000400000000000000:86CA894EEFD1CEAAEA70E00CD14645F6:\ +00000000000000000000000000000000 + +00000000000000000200000000000000:989B0FC1FFE4BA6F7CC0F1EDEEB5B932:\ +00000000000000000000000000000000 + +00000000000000000100000000000000:42916ED17877E58933D3D8CEDA8DD7B3:\ +00000000000000000000000000000000 + +00000000000000000080000000000000:88C0369158F2FEFFB4CF14130CE10B3B:\ +00000000000000000000000000000000 + +00000000000000000040000000000000:DB8976E1DDA56553340236F47F8E9CEF:\ +00000000000000000000000000000000 + +00000000000000000020000000000000:C6207672C411F088ACAD20814C66254A:\ +00000000000000000000000000000000 + +00000000000000000010000000000000:A792CF60F44A15D63FB293F9FCF879AC:\ +00000000000000000000000000000000 + +00000000000000000008000000000000:8F733746F91273D97ADA41D3A7D5A9E3:\ +00000000000000000000000000000000 + +00000000000000000004000000000000:5DA8F191833E6198689710D5A03EE262:\ +00000000000000000000000000000000 + +00000000000000000002000000000000:D6DB9CEB7E821F6DF4CB1E99105E07AA:\ +00000000000000000000000000000000 + +00000000000000000001000000000000:05F308FFAEA3E1E754974435CE0B77C3:\ +00000000000000000000000000000000 + +00000000000000000000800000000000:73B8639AAD53AFA1B24165E0C9FD397E:\ +00000000000000000000000000000000 + +00000000000000000000400000000000:AF45FDC65FD5F153E29A8D5032650AAD:\ +00000000000000000000000000000000 + +00000000000000000000200000000000:A8BB045FB5B867E85FCAD328E13756C9:\ +00000000000000000000000000000000 + +00000000000000000000100000000000:DD053128C46C78C4414CE3234C16AEB3:\ +00000000000000000000000000000000 + +00000000000000000000080000000000:B0C82152D1D9E21D7C3F33E1FC9B4D68:\ +00000000000000000000000000000000 + +00000000000000000000040000000000:11B56480D5C718A77A1BEA30CC3A53CF:\ +00000000000000000000000000000000 + +00000000000000000000020000000000:92C99F843674DED7F20A258C57253726:\ +00000000000000000000000000000000 + +00000000000000000000010000000000:63B218D069CE9CAF52EF97614BDACFF9:\ +00000000000000000000000000000000 + +00000000000000000000008000000000:76096721043A016C095D95DD02980289:\ +00000000000000000000000000000000 + +00000000000000000000004000000000:87AF16066939B8C4D90E242917DB05CF:\ +00000000000000000000000000000000 + +00000000000000000000002000000000:F7E0C931B7204308AB5020F106BBA0EF:\ +00000000000000000000000000000000 + +00000000000000000000001000000000:C697B3602711749580713737729E7049:\ +00000000000000000000000000000000 + +00000000000000000000000800000000:AF314640B147719EC1B4ABE27CDB58F5:\ +00000000000000000000000000000000 + +00000000000000000000000400000000:B67DAC5BF73AF7546D2FDC3BC142708D:\ +00000000000000000000000000000000 + +00000000000000000000000200000000:AC53D20E3C06FF82DE52470BCCE1B283:\ +00000000000000000000000000000000 + +00000000000000000000000100000000:7D65047AF522F01856FDD83A9AAA147A:\ +00000000000000000000000000000000 + +00000000000000000000000080000000:709D6454033E3FCF8962CAD39B0DC4BD:\ +00000000000000000000000000000000 + +00000000000000000000000040000000:7B8058E46789EF51D18700511D20CB70:\ +00000000000000000000000000000000 + +00000000000000000000000020000000:738088C404D8850041AD6B690CC6B65A:\ +00000000000000000000000000000000 + +00000000000000000000000010000000:7DFDFD55B53D4CD704F96CF93311AFC4:\ +00000000000000000000000000000000 + +00000000000000000000000008000000:1DBE62C57AF741D9F2FBF9A340E772C9:\ +00000000000000000000000000000000 + +00000000000000000000000004000000:E7349BAB7CB458736436943DB0CC411D:\ +00000000000000000000000000000000 + +00000000000000000000000002000000:64E229BF2AF893510358CB0DBEF7E97F:\ +00000000000000000000000000000000 + +00000000000000000000000001000000:4C632CF8C75AD0DDE8316A7B35F871CC:\ +00000000000000000000000000000000 + +00000000000000000000000000800000:2517115CB13E681F0EEA2206C26AD5C4:\ +00000000000000000000000000000000 + +00000000000000000000000000400000:8ED5E9D7005D980B078E7F58B47E591E:\ +00000000000000000000000000000000 + +00000000000000000000000000200000:8DBCD253443534B2B8BC698A03166ABE:\ +00000000000000000000000000000000 + +00000000000000000000000000100000:02F34EAB6CC1DBC8809F3D0EB80FA493:\ +00000000000000000000000000000000 + +00000000000000000000000000080000:47E5B71162F75B84D7A699A31FFA29DE:\ +00000000000000000000000000000000 + +00000000000000000000000000040000:B6C1EA2B410D1704058E905EB967C503:\ +00000000000000000000000000000000 + +00000000000000000000000000020000:4383238CE44E30ECDFC90A70EA4C9E96:\ +00000000000000000000000000000000 + +00000000000000000000000000010000:9314DFBB44D530768B159DAABCBD439F:\ +00000000000000000000000000000000 + +00000000000000000000000000008000:12D7C80912C299C4F668278FA494D580:\ +00000000000000000000000000000000 + +00000000000000000000000000004000:49FB1EACCA3B1743E15014010E9963DF:\ +00000000000000000000000000000000 + +00000000000000000000000000002000:0DF48D3B128AA63496DBE0CD11083495:\ +00000000000000000000000000000000 + +00000000000000000000000000001000:13240392854D6290A4BE08999843105B:\ +00000000000000000000000000000000 + +00000000000000000000000000000800:3D4B8705340C3225CE5A724917BA92B4:\ +00000000000000000000000000000000 + +00000000000000000000000000000400:425DCCF406AD46F2F565BBBC72FE234B:\ +00000000000000000000000000000000 + +00000000000000000000000000000200:88C09509CBB95339726C196E63346418:\ +00000000000000000000000000000000 + +00000000000000000000000000000100:90724430636A3DB610F25332BE2FEBE6:\ +00000000000000000000000000000000 + +00000000000000000000000000000080:044B4FAED3EA17338630E828B9960CA7:\ +00000000000000000000000000000000 + +00000000000000000000000000000040:4A59243AEB65BAA4F7432498FD87EF62:\ +00000000000000000000000000000000 + +00000000000000000000000000000020:4324DF8817589D894674B3F311256E9F:\ +00000000000000000000000000000000 + +00000000000000000000000000000010:0527269F9FA9E9CC01A03CFA59FD3854:\ +00000000000000000000000000000000 + +00000000000000000000000000000008:96CA56F9EFAA393F521679E0B6ACF231:\ +00000000000000000000000000000000 + +00000000000000000000000000000004:DA7A328F8A5BF03DD42BC52DEC5C4B15:\ +00000000000000000000000000000000 + +00000000000000000000000000000002:5FE3D4C46DB294523166AB46208E0711:\ +00000000000000000000000000000000 + +00000000000000000000000000000001:2519B9240C21C1F980FB722AD8CB793E:\ +00000000000000000000000000000000 + +80000000000000000000000000000000:A600B72AAC4DFB5271DC45F563FAE428:\ +000000000000000000000000000000000000000000000000 + +40000000000000000000000000000000:A7B1D7CBFBAB741B41744FF9100529B4:\ +000000000000000000000000000000000000000000000000 + +20000000000000000000000000000000:D9AAAA866BAB0D68AFFC39CF9888B8C6:\ +000000000000000000000000000000000000000000000000 + +10000000000000000000000000000000:32B0048A204036E1B45DE285E87E57B8:\ +000000000000000000000000000000000000000000000000 + +08000000000000000000000000000000:7267FEE7E04ACEB47C8FCC4096720484:\ +000000000000000000000000000000000000000000000000 + +04000000000000000000000000000000:FF0C22F756C2F5EBDC6610F085D74383:\ +000000000000000000000000000000000000000000000000 + +02000000000000000000000000000000:A6264FBCB2926C6181AA6F5551244B2F:\ +000000000000000000000000000000000000000000000000 + +01000000000000000000000000000000:D3A5B8FB3CBAA98419D394BB4C66B9D7:\ +000000000000000000000000000000000000000000000000 + +00800000000000000000000000000000:F9FE5D1BA274021F041023CD9AC20399:\ +000000000000000000000000000000000000000000000000 + +00400000000000000000000000000000:7307F7DEBBEFD911B0B590A0667E093D:\ +000000000000000000000000000000000000000000000000 + +00200000000000000000000000000000:4D8A3B987A1E66E72B3FFA520DDD57BB:\ +000000000000000000000000000000000000000000000000 + +00100000000000000000000000000000:0F444C0A7334947DBCB43D72F897E72F:\ +000000000000000000000000000000000000000000000000 + +00080000000000000000000000000000:448F29B848D7CFDA617D8A64AC518B0C:\ +000000000000000000000000000000000000000000000000 + +00040000000000000000000000000000:261B4EA7CD31F46C4FBF684395ED7FB8:\ +000000000000000000000000000000000000000000000000 + +00020000000000000000000000000000:25FA5AD347C57047749B15B97FE8ABE6:\ +000000000000000000000000000000000000000000000000 + +00010000000000000000000000000000:F7E13200EBA3F6E8E9F37B092B907961:\ +000000000000000000000000000000000000000000000000 + +00008000000000000000000000000000:9C934B121791B35AFE509A0D5A04BBF2:\ +000000000000000000000000000000000000000000000000 + +00004000000000000000000000000000:3C0F9D40F9608091CDFD831DD6D215EA:\ +000000000000000000000000000000000000000000000000 + +00002000000000000000000000000000:97D7D2AF2F635D43E536E0A5AA18C61E:\ +000000000000000000000000000000000000000000000000 + +00001000000000000000000000000000:1E41EB291C07ECF0908D49A9CBFAB57E:\ +000000000000000000000000000000000000000000000000 + +00000800000000000000000000000000:C9CCEB56AF06C494582F2C966EEEFD07:\ +000000000000000000000000000000000000000000000000 + +00000400000000000000000000000000:4B21E0D2942CCD21501F698ACA866BD0:\ +000000000000000000000000000000000000000000000000 + +00000200000000000000000000000000:BA0DC6ACC50486AD389EF65B5677DE19:\ +000000000000000000000000000000000000000000000000 + +00000100000000000000000000000000:EB80DE49F3D5605D9C3CE426EC80FAFD:\ +000000000000000000000000000000000000000000000000 + +00000080000000000000000000000000:D6984153BF67512062F876966BD190F3:\ +000000000000000000000000000000000000000000000000 + +00000040000000000000000000000000:AC789910F3458D59C5090BE936C6682A:\ +000000000000000000000000000000000000000000000000 + +00000020000000000000000000000000:5D64A268407F791DBDAFD0E5C6399A64:\ +000000000000000000000000000000000000000000000000 + +00000010000000000000000000000000:2B4F25AC69BA3AD941BBD4E1ECC75E79:\ +000000000000000000000000000000000000000000000000 + +00000008000000000000000000000000:FB943544937F3A34DFA0548C0257CE53:\ +000000000000000000000000000000000000000000000000 + +00000004000000000000000000000000:125A04339B61FA79FA3757576EC4FAA1:\ +000000000000000000000000000000000000000000000000 + +00000002000000000000000000000000:160B88277AC4C81603BD37ECA4FD73DC:\ +000000000000000000000000000000000000000000000000 + +00000001000000000000000000000000:4D65B09355F893E26C85E85955767604:\ +000000000000000000000000000000000000000000000000 + +00000000800000000000000000000000:1EE56A4AB4811DC3B17401CBAA8F5A15:\ +000000000000000000000000000000000000000000000000 + +00000000400000000000000000000000:6214728772DBD2CDA3124BA8BA2ABF38:\ +000000000000000000000000000000000000000000000000 + +00000000200000000000000000000000:328B60EDD6FD150934A30100286E07B5:\ +000000000000000000000000000000000000000000000000 + +00000000100000000000000000000000:2C976B076409056EA7489C7658BB34B9:\ +000000000000000000000000000000000000000000000000 + +00000000080000000000000000000000:D592EBBA861BBCC369DA99F832B0A773:\ +000000000000000000000000000000000000000000000000 + +00000000040000000000000000000000:E6F48FB373724153FFFC51758527C6E8:\ +000000000000000000000000000000000000000000000000 + +00000000020000000000000000000000:6C397B0BF5992740BD6A787F16BD511C:\ +000000000000000000000000000000000000000000000000 + +00000000010000000000000000000000:2CA57FEE77351E747799C8855780C63F:\ +000000000000000000000000000000000000000000000000 + +00000000008000000000000000000000:194C42AA377D361BBDF283693171FFDB:\ +000000000000000000000000000000000000000000000000 + +00000000004000000000000000000000:61832D4C637CCE219D2FBB36ACF7992E:\ +000000000000000000000000000000000000000000000000 + +00000000002000000000000000000000:945D2B20B9FD48F1961D04DBBA1708B5:\ +000000000000000000000000000000000000000000000000 + +00000000001000000000000000000000:EC152810AA2771AA5E871949BF12B6F1:\ +000000000000000000000000000000000000000000000000 + +00000000000800000000000000000000:E87712941A7EE80510D53509311196B7:\ +000000000000000000000000000000000000000000000000 + +00000000000400000000000000000000:776820A0500F2D90D4DF36F50C395674:\ +000000000000000000000000000000000000000000000000 + +00000000000200000000000000000000:64958DB0758C1E80FCFCBB9FC6195E6D:\ +000000000000000000000000000000000000000000000000 + +00000000000100000000000000000000:37F27D1D918D463B0668A470DE898AB9:\ +000000000000000000000000000000000000000000000000 + +00000000000080000000000000000000:AA71549A4B290289C7060D76FF5A20BC:\ +000000000000000000000000000000000000000000000000 + +00000000000040000000000000000000:95EF0C6213EB7CF56186D76BFA617174:\ +000000000000000000000000000000000000000000000000 + +00000000000020000000000000000000:2F6A4BD794419F9F34CFD0FED825B6CD:\ +000000000000000000000000000000000000000000000000 + +00000000000010000000000000000000:882C2B9E19854367479F0EE25D086F4E:\ +000000000000000000000000000000000000000000000000 + +00000000000008000000000000000000:D246FD18C625C1846741544EC4CE60B6:\ +000000000000000000000000000000000000000000000000 + +00000000000004000000000000000000:9EAF5A8C5673BE9F488D5C7B6521BD8C:\ +000000000000000000000000000000000000000000000000 + +00000000000002000000000000000000:9E7A685F738CB391FAE6ED184087630C:\ +000000000000000000000000000000000000000000000000 + +00000000000001000000000000000000:5E0AC39E49825B2424C7263AA8824232:\ +000000000000000000000000000000000000000000000000 + +00000000000000800000000000000000:0B06C4805E20BC990E601E5610A1BEAD:\ +000000000000000000000000000000000000000000000000 + +00000000000000400000000000000000:78A99615E809CA88F6F6C6E9AFA532FF:\ +000000000000000000000000000000000000000000000000 + +00000000000000200000000000000000:9ACF5CC740AA37663000C89C5F8EE8D8:\ +000000000000000000000000000000000000000000000000 + +00000000000000100000000000000000:35D76EBA8F59CA6A78FC2942AC5F7F43:\ +000000000000000000000000000000000000000000000000 + +00000000000000080000000000000000:39AD4C9AE2B4D46EF693303B54B53546:\ +000000000000000000000000000000000000000000000000 + +00000000000000040000000000000000:EA0833009C96171EAA2BFDEF50DEE473:\ +000000000000000000000000000000000000000000000000 + +00000000000000020000000000000000:868A8E86F525E50D3FF33A094A3AE119:\ +000000000000000000000000000000000000000000000000 + +00000000000000010000000000000000:3DBB9A366A2A3A660F027191B3613B95:\ +000000000000000000000000000000000000000000000000 + +00000000000000008000000000000000:E4CDE1FC6D811CDC25328CDAC8D0AD2B:\ +000000000000000000000000000000000000000000000000 + +00000000000000004000000000000000:332010FB6E39F82F00DC1FF6B6F8CFE6:\ +000000000000000000000000000000000000000000000000 + +00000000000000002000000000000000:00293BFE5BB3DA2D3652D4E06EE361B2:\ +000000000000000000000000000000000000000000000000 + +00000000000000001000000000000000:9BC99B26E0114669EFE218BF014A15AA:\ +000000000000000000000000000000000000000000000000 + +00000000000000000800000000000000:43C358B6DAB480D0EAEB96DCE57E5B85:\ +000000000000000000000000000000000000000000000000 + +00000000000000000400000000000000:9842333B8E9FCEC35A8779CCCA7D025A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000200000000000000:5A47529DB0D103DCC34D2ADD3A19C53F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000100000000000000:8F705A89D4C6EE7E27A14792EC49B652:\ +000000000000000000000000000000000000000000000000 + +00000000000000000080000000000000:6D4B9905F05096B23D6C13565588F012:\ +000000000000000000000000000000000000000000000000 + +00000000000000000040000000000000:23DDD34E8598F013C0559B3312341DBA:\ +000000000000000000000000000000000000000000000000 + +00000000000000000020000000000000:7B5AE9F49ACC68F2FEECB2823C3868A9:\ +000000000000000000000000000000000000000000000000 + +00000000000000000010000000000000:09F8EED21EB8EE33C02B90637EF24E6B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000008000000000000:00A2E8DB0417F61EAABAD6E9BF13E4BC:\ +000000000000000000000000000000000000000000000000 + +00000000000000000004000000000000:CF5DB5AA31599EEDB5A3143E08D23672:\ +000000000000000000000000000000000000000000000000 + +00000000000000000002000000000000:E09B69B9C0E3365C0EDA54AB3310A5AC:\ +000000000000000000000000000000000000000000000000 + +00000000000000000001000000000000:33650F826366AEC9A09D7D038708737D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000800000000000:E84A1EE9A00BA66952B24A6E6AD0C002:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000400000000000:11B1E0969380A0A24E876D6470872796:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000200000000000:D88FCA95FA29C35FDCD9467715F102D7:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000100000000000:A78B86EF0E6959C08F70C810AF8E99CD:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000080000000000:A83E4F27E34360C8033CBC304EBBDF0C:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000040000000000:0AA5B4F05A0B42358ABF19F6E55F66D2:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000020000000000:5C2AC2588982E3CCE99994101FC0A21A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000010000000000:60A3E107674A0B7F7B931C6EC35BC747:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000008000000000:123D266844DFFF63DA93C4D806325660:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000004000000000:08170908422DCB46EEB046F3D7E4AE3A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000002000000000:13754D93DC4807807A9535388553FB47:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000001000000000:DFA9741DD3883E39FED5716A706A65EC:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000800000000:CA5C3DCA7BE84DCBE33BF5238EA3F4B0:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000400000000:6EBEED89B297D6918FA5CEAB7A0E985E:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000200000000:3F79AB2119DEBCC44675E340C25B7D85:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000100000000:A7739DE45E6051EBBDC2F0365859BEE0:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000080000000:CEA0C2B3C653B7553605BACCFDD62DF8:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000040000000:7F9742EEE96193CA8981739712F73045:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000020000000:F0103101F4EC92C0CB48145FF34CF51F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000010000000:55A8A3B02951558F343C160E7F86288D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000008000000:3F9206DB4F3083E8F6EEC33CFE2C1BBF:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000004000000:F012723B2F08A28A5E24BB959FA5EFDD:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000002000000:1A28919DB3AB4A53D5A0E1E566982DF7:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000001000000:E17C960B43B7E926C83DF749C6A5532F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000800000:16DF63CFB77D31CC782C0ED3190136AD:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000400000:1643D697AC4075EC6FE609472FA4C678:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000200000:AD76BF6119FFC36369980D3466CF6570:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000100000:554E53F64D99F89A5BAA7FD5B70E0BD1:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000080000:BDC10FF10FA5E3A41B096C870666DECB:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000040000:6B12E2408646228502972EA7580B05E1:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000020000:B9583810806D5A491B2F69FFF2D2A327:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000010000:E8E9F4A50B834DDEF307503AECD8A3BC:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000008000:D7F4A1C7F7954E789BD61007866FFA80:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000004000:953D7D0FD6DDD25CA25FA23C9322339F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000002000:CD4E607B4324CEC7372DE19CEA5AEF78:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000001000:9B5C29709E0F0E586383EAB29E884009:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000800:28B822B70E7430E44182C2BBAED4D88D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000400:D2325AF7325642138C355BC4ACAF938F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000200:F4D1A000EC3A370B5A6386355CEE010C:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000100:F9D198D9FDC650AFA72320AD4826506B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000080:5024595BEB4DAA2239D495BB023757EA:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000040:8A6CDA8F518CA2FB0A860C5567C60104:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000020:D6D90C40B07164436453E8312A633109:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000010:3E73330AE10DF1B8B81D9CA72221E192:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000008:5029AE60BF118AA69E47B235C3551490:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000004:7299F32614EA0BD98D2375CA643EC47F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000002:DF4A7B804A4D3A13113529C509F8BAF6:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000001:3EFC3791618B7D832BFA6AE030C09122:\ +000000000000000000000000000000000000000000000000 + +80000000000000000000000000000000:30F5C183F6C81A72F39B618B086CC2DE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +40000000000000000000000000000000:DB11AFAAB4946101911DF90AFED8AC0D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +20000000000000000000000000000000:1487FC298DBDA9C520CC5851B17D4079:\ +0000000000000000000000000000000000000000000000000000000000000000 + +10000000000000000000000000000000:2321D38ACCAAEA5DBA682E7BDCE095AB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +08000000000000000000000000000000:C4DB11197AE15CF9DFE7D0F3457EC94C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +04000000000000000000000000000000:1054BFF1A1564172460A0194B57EBE6C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +02000000000000000000000000000000:2340568047F06139D03FE0A3C75CDBF1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +01000000000000000000000000000000:3FA18912A1C05E244663BD9A9B5D4046:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00800000000000000000000000000000:7220FA3179267839BB03569E43056BE8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00400000000000000000000000000000:C7D49A32A6B93D1323EFD7B99FC0A5F7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00200000000000000000000000000000:C30D9FFB19F2090109AD40FDAB73176B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00100000000000000000000000000000:54CA1E1FD38713CD454A07339385739F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00080000000000000000000000000000:034516E874272A5A325EB9D54831B6F7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00040000000000000000000000000000:42650A58269E311A3B4F7BC414D1488A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00020000000000000000000000000000:8D4916888A02DC18E1EE95B005C58E18:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00010000000000000000000000000000:B192C07FB927170DF62D6C44819BCD6F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00008000000000000000000000000000:973C835241ED02CBE39699AF2FFC150A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00004000000000000000000000000000:F9630817124B0787237D76697D66341F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00002000000000000000000000000000:51E98EC760A328E35B8D77289726AFC3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00001000000000000000000000000000:FC2E80BE856AE38BE0682E8C273616AE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000800000000000000000000000000:A440C29E6F4D6C3540D6C8DB6B02DE4F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000400000000000000000000000000:E04312CB849684A440114B40C242F1E0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000200000000000000000000000000:2186FC5F5947AAF6626DCAAFFFB47829:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000100000000000000000000000000:D357AAA0B4548EB23E9CF1B5D33487C3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000080000000000000000000000000:02239634F2A7CB81D1CACA279659C637:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000040000000000000000000000000:2EF92962D2F7D0A4B075992C3F8FA9C3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000020000000000000000000000000:F197F67C65438532F17DDBE41F87BA17:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000010000000000000000000000000:6A9387BE237C03056921A9F85AB7A394:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000008000000000000000000000000:5BE801A4767AD211AF20B295E4EB9F72:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000004000000000000000000000000:D38007A33C45B295D06FA99660E8C6E4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000002000000000000000000000000:C87746C9F5405E9BBBB53D17544AD016:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000001000000000000000000000000:142BB703DC8B4E870165F987B94A3D06:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000800000000000000000000000:3C25BD8199CD580D684BD7EC53601EED:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000400000000000000000000000:283CC22E28A7E48B9FB34F5454A1EB92:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000200000000000000000000000:BE6FA799CE3E6BB239EE35FEF2744A14:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000100000000000000000000000:99BF63EEB37E1C7E8686B28A0F13E120:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000080000000000000000000000:01308C588EC24E97B75A1D32F8C3E770:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000040000000000000000000000:F820CB9552F6800049E51037DD238E7B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000020000000000000000000000:BBC26F6098B0F4D2235FC139041EB78F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000010000000000000000000000:836E3B15AA777DEA46606FCC7C2FAB65:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000008000000000000000000000:AAB58970926FE6CFC4017F23FB44C287:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000004000000000000000000000:1DEEF417C2192D50694D1DF67F960E6E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000002000000000000000000000:4E4EA43FAD14AF207C311D98A1DB4B24:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000001000000000000000000000:E0731CEF0FAF7AE36B4FCB9E1AB95488:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000800000000000000000000:C6FF60796386126058694CAA35BFF163:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000400000000000000000000:AEA22D742BA1919C43E0A42719B1A9C8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000200000000000000000000:843793D2EF2427D745B9B35BC0AD0555:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000100000000000000000000:3C805CED7CBDEF4F896113D95D4BD975:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000080000000000000000000:5157A8B222432635BEBD29BDAA9C490B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000040000000000000000000:D7A88C8E82EB2F2BB827E56F33E7B1C3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000020000000000000000000:DA55FBE256EF08F565A70D870B969B27:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000010000000000000000000:951F6F33FD34701F7C79FC94EFB119CF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000008000000000000000000:BE2BD92D9F3DBFD3225B7488FFEC09C1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000004000000000000000000:3C560897DF4AC5F3C33818E2597E90B0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000002000000000000000000:52C4110C36C90E3A54921B3F1AAB66C0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000001000000000000000000:9DCED6AECC426A4DFB6B648490A7D002:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000800000000000000000:F2631BD62B10761B923DD415ADCCC59B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000400000000000000000:2B1E1C0D54367440A122D31058057A42:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000200000000000000000:544C870FBF43AB7CFCF114E00B05D974:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000100000000000000000:1E8B06D5FDF11BF70AD8F8748F7F6C33:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000080000000000000000:582BE6419DB732C646B80E8C8966C7CC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000040000000000000000:2AB0AEAAF06EAD0BA24CCDD46BCAC4D2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000020000000000000000:32ABA6C20CFFB3D81A4D3288BF4BDFB1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000010000000000000000:AB8F8FB0A91662A4E3C54C395BDD6711:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000008000000000000000:F154670ADDE837119060F4ECE9D7B636:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000004000000000000000:64CE436BCC7AAC1DE95D6CECC28C46C2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000002000000000000000:17A6371CFEAD87CBB6A545D9F9973155:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000001000000000000000:532AC851EF076F571D6B1C9418D7E2E9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000800000000000000:8CA057121128472C01EF7F6EC39EC63F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000400000000000000:283DF89A06A93492543BCA4D5DB109E9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000200000000000000:2A07389C26321F9F7AF46897D80E3CCF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000100000000000000:1473BBE037060B30273908A495C2F622:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000080000000000000:C937D109334A404B55CEE675092A2D2C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000040000000000000:0CAA09146104F478E231268F03EA4FB9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000020000000000000:7FCA0541DC09F947145B69C93E0E382F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000010000000000000:16739ED42CEF90CA03B686FF13A29A6C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000008000000000000:911BB934A7D6ED03A5AF9DF7A28E8129:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000004000000000000:3974614212BA6A30AC9541B7776CC29B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000002000000000000:8D17F86E8423398AB06E739B112048FB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000001000000000000:76A0AC6091D6DAF57C303E02D5AE8F97:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000800000000000:98C8AD3C3AB0EFB14DF2C96EC4A5923C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000400000000000:3AF0B1C79917659CF8E5B91D4ED31ED3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000200000000000:0F6C180C0D449B35A3C7026E513DA0D9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000100000000000:646F2B75831CA1CB950B5CC79F320F6F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000080000000000:2877CB6CFED0900A25FE65367B8DF5DC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000040000000000:5122F1C85198E03E269D90BDA811A8AD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000020000000000:7FEC2A1C88A6E72D22FE71B513B1C34D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000010000000000:1176120721DC2C20A1ED31F1572ECBB8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000008000000000:932B4B9980CF29A3EC9B982A2C0215CE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000004000000000:BFE6D2C8354E83D26AEF557E2AD1C2EF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000002000000000:FE4C742734F30C62964D5917C5B63723:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000001000000000:1663275B61F3FACEB365D56D8B51AE33:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000800000000:32EB39C865C149CF81E27D8AE0A91BDB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000400000000:0229846F9F8150006A27D62E60A762DE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000200000000:B88BACF0AFFAA2C5CAAC4C7036785A74:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000100000000:C61820350B4DAF92077DB18B2563C050:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000080000000:D4ABF17AA49B24F71DD5151339951D1B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000040000000:D7C632D6C753246A176B659DBCEF61D8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000020000000:1F34C055C434A025ADD592A5397D2D35:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000010000000:C399CB8A665E35A23F660C2F8C3D8FE9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000008000000:09E11B6D984BD70089CB2360448A4B60:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000004000000:E243F7445FCCF52878F8B83BE492EABA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000002000000:389F39873BDF652BC4F9043E30AD7CE0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000001000000:0669295AA4EA970860CF675D6469F765:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000800000:35C5F9A85171DC889BFD5332E6C8E0D7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000400000:E07600A31EA2F2F781EBC12A3DDC936E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000200000:FB4CBEC86740711F59995673EB73ADE8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000100000:E572F84C3AEFB9DFCE042B39E68EA160:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000080000:A87AB39149865D45B1E43D35D8C65001:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000040000:4E5215E398BD5D0F7223348581D18158:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000020000:2524BA2E297D0D2B26797441A7CDB01E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000010000:3DCE8EB2F6FBDBB7A33A26FF6485D4AE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000008000:28EC64C3D0C3AA145F21F4067322573B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000004000:EC6E0084F98693A0D3AD1E4790716ACE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000002000:F09BD8B4646FBAC5556B4F0B816B35EB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000001000:9CC8722245E3CD23DF490353DCACC9E0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000800:C73465C832CC907D4F79035E67F9AE29:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000400:F311B9CF73CF5A8FAFB9DBEECC67B9E1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000200:56494DBCF09A6019B1C6CEE3DB0C844B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000100:0364CB9DAF55D765BC5CCD46B58FA718:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000080:4DAFE2AAED6E49C98A7B8B979C32E6DB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000040:2F5BECD180A9449CE7A1ECCCB34057B1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000020:1C8B0DF1D643B9376B3E40B847850DFD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000010:674A46D61796154EC5DE8EC7EDA4BD3A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000008:8F111A48A7C598EFF1CBCB43414A7791:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000004:CBD9C99FB47C9518151222D6F8B07446:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000002:D449C5BE9B01257543932AF7B8777F69:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000001:283D43A1CEA6187A31581D1606BB8B7A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1AD578A02A08162850A15A1552A17AD4:\ +80000000000000000000000000000000 + +00000000000000000000000000000000:912E9CF1473035A8443A82495C0730D3:\ +40000000000000000000000000000000 + +00000000000000000000000000000000:3D3E851A80ABAF221761931747473048:\ +20000000000000000000000000000000 + +00000000000000000000000000000000:96CFC0510819EEB7FCDF2CC7BEABEF77:\ +10000000000000000000000000000000 + +00000000000000000000000000000000:FB787268EC3C583A3685973B861AEF8D:\ +08000000000000000000000000000000 + +00000000000000000000000000000000:2AE927525C73250D954B619EDAC718BE:\ +04000000000000000000000000000000 + +00000000000000000000000000000000:00298D1DB6C6DA02E28E49C63B4A5795:\ +02000000000000000000000000000000 + +00000000000000000000000000000000:7E32F418910C9AC8701292B5F96346F3:\ +01000000000000000000000000000000 + +00000000000000000000000000000000:9FC6C21A562A049AD320EAA0D43C1998:\ +00800000000000000000000000000000 + +00000000000000000000000000000000:7A0BD66C361D641DFD313CBE23F69A57:\ +00400000000000000000000000000000 + +00000000000000000000000000000000:C2E2CAD226964597A98C388B27127EA1:\ +00200000000000000000000000000000 + +00000000000000000000000000000000:B7F4837AC6F1F808D8EBBF1D08077FB4:\ +00100000000000000000000000000000 + +00000000000000000000000000000000:0495E1AEDA7A9EC9ACBF38FE41CB08FA:\ +00080000000000000000000000000000 + +00000000000000000000000000000000:E001020E1D0C05BE072695F3F48F07B2:\ +00040000000000000000000000000000 + +00000000000000000000000000000000:608CE7A12C9EEC348FF674FB9F8D1972:\ +00020000000000000000000000000000 + +00000000000000000000000000000000:916BEC60955C1A3540B4C245F4D3B94B:\ +00010000000000000000000000000000 + +00000000000000000000000000000000:B2B91EC4EFE12CD4EDDA71ED52B278B1:\ +00008000000000000000000000000000 + +00000000000000000000000000000000:0CA46CF5275313AB3D9494A5BB7D786A:\ +00004000000000000000000000000000 + +00000000000000000000000000000000:E679B7C6F661AE52BA5199EC24D4E542:\ +00002000000000000000000000000000 + +00000000000000000000000000000000:043FAB3A991B3FEC872AC747640731CB:\ +00001000000000000000000000000000 + +00000000000000000000000000000000:EF8C38151A67B9A51E0935BBA14D9E22:\ +00000800000000000000000000000000 + +00000000000000000000000000000000:2D4515423CFCF372B5632C2879A71267:\ +00000400000000000000000000000000 + +00000000000000000000000000000000:2420A9327B9D2426C19F755BC3D8BD88:\ +00000200000000000000000000000000 + +00000000000000000000000000000000:2151D88643EE81D8D23B44D22E2B0D65:\ +00000100000000000000000000000000 + +00000000000000000000000000000000:AEFA6F32E963CB2D4D89E673B503DDAC:\ +00000080000000000000000000000000 + +00000000000000000000000000000000:43DBE4D6B1BA3F05F16D73B2F80A12DF:\ +00000040000000000000000000000000 + +00000000000000000000000000000000:ED8C9B25558CAD4EF9469364BE97CA30:\ +00000020000000000000000000000000 + +00000000000000000000000000000000:BDE5B1DC5053F94670599CBE6845604B:\ +00000010000000000000000000000000 + +00000000000000000000000000000000:4529434499884BE7C4E6D009F3D5353E:\ +00000008000000000000000000000000 + +00000000000000000000000000000000:B3D4C642173189B9295912E860CF6880:\ +00000004000000000000000000000000 + +00000000000000000000000000000000:651F1B1629535AD03D5C296D560FDE1F:\ +00000002000000000000000000000000 + +00000000000000000000000000000000:8A380594D7396453771A1DFBE2914C8E:\ +00000001000000000000000000000000 + +00000000000000000000000000000000:395FE0214AC536428C86737514B6237F:\ +00000000800000000000000000000000 + +00000000000000000000000000000000:ACEFAC47A7AB6E635EA9F85EF74DEFF3:\ +00000000400000000000000000000000 + +00000000000000000000000000000000:8C208E26E96D9DFA248010D8C1CFDB3B:\ +00000000200000000000000000000000 + +00000000000000000000000000000000:D3AE8AE99B3A84C3721EAA57C8EB17B1:\ +00000000100000000000000000000000 + +00000000000000000000000000000000:40D8DA37A8A6591A203F2A38AB05A08D:\ +00000000080000000000000000000000 + +00000000000000000000000000000000:F0580D0B864E8C03638A33499B36C9A5:\ +00000000040000000000000000000000 + +00000000000000000000000000000000:10F19634C2D1006B0C208AA303065B0F:\ +00000000020000000000000000000000 + +00000000000000000000000000000000:7D43298935D0AF6DB498542752666C99:\ +00000000010000000000000000000000 + +00000000000000000000000000000000:456AD1F19D18900B4F85EB64E06DF643:\ +00000000008000000000000000000000 + +00000000000000000000000000000000:08C83A53955102F6E60C2CB0F6C02443:\ +00000000004000000000000000000000 + +00000000000000000000000000000000:351C1035006BC7475DF60694859BB491:\ +00000000002000000000000000000000 + +00000000000000000000000000000000:BB47464DFF62381AD4A93684D00A817F:\ +00000000001000000000000000000000 + +00000000000000000000000000000000:514AC91B28081BD0E0CAE22D766257DF:\ +00000000000800000000000000000000 + +00000000000000000000000000000000:7758C19B083A62E6F2CAAD2B4C3DF4DC:\ +00000000000400000000000000000000 + +00000000000000000000000000000000:46B352EAC71542E417619E0360221673:\ +00000000000200000000000000000000 + +00000000000000000000000000000000:648D51C6F9522FE38108BBFD34015F22:\ +00000000000100000000000000000000 + +00000000000000000000000000000000:DCD800CC104B9C098AB4B931C7538F00:\ +00000000000080000000000000000000 + +00000000000000000000000000000000:E40601C1632937FA769C58BE63DEB056:\ +00000000000040000000000000000000 + +00000000000000000000000000000000:BC968175089F3864C81124A55AA445EC:\ +00000000000020000000000000000000 + +00000000000000000000000000000000:05479ACFA5A7C6BC89FE432D8D25A366:\ +00000000000010000000000000000000 + +00000000000000000000000000000000:8DDF91E221B4C2043C079F5F0ED63EA7:\ +00000000000008000000000000000000 + +00000000000000000000000000000000:66C47E3E339FFD404A61547E54ED0F7F:\ +00000000000004000000000000000000 + +00000000000000000000000000000000:3D622A36A3375D2EFFF3B49363F25755:\ +00000000000002000000000000000000 + +00000000000000000000000000000000:C2E42DDC662F226D09908E2CFDD03D32:\ +00000000000001000000000000000000 + +00000000000000000000000000000000:3221BC8032E72E0DE7580480A99DFD7D:\ +00000000000000800000000000000000 + +00000000000000000000000000000000:C65A142D036E99D1A4DA370D964A8A44:\ +00000000000000400000000000000000 + +00000000000000000000000000000000:E9C03F4840645726563582AA30464D1E:\ +00000000000000200000000000000000 + +00000000000000000000000000000000:93C2F8237D526E910F007FA0CF0608A8:\ +00000000000000100000000000000000 + +00000000000000000000000000000000:6F3A45184B87581E98B7B0D873F8B315:\ +00000000000000080000000000000000 + +00000000000000000000000000000000:D3569BAB0FDD360451E113895B39D0E2:\ +00000000000000040000000000000000 + +00000000000000000000000000000000:4002FF10DDB6FCB6669AE3FED696B2EC:\ +00000000000000020000000000000000 + +00000000000000000000000000000000:B265C44F675800A3B498FFA91C440654:\ +00000000000000010000000000000000 + +00000000000000000000000000000000:092E77F2537EE742D627EA8628E473E9:\ +00000000000000008000000000000000 + +00000000000000000000000000000000:441859995F05E1C06D118CFFB389C9CE:\ +00000000000000004000000000000000 + +00000000000000000000000000000000:844480BB205810808DC1F87C2B5281E9:\ +00000000000000002000000000000000 + +00000000000000000000000000000000:4B2E7C3B31CFC0CA5B51EA589DFFC9AC:\ +00000000000000001000000000000000 + +00000000000000000000000000000000:D55D552EA89C267FF3B0AF688CF00D78:\ +00000000000000000800000000000000 + +00000000000000000000000000000000:6AD19E9DD39381C8A02F3CC6F60C8048:\ +00000000000000000400000000000000 + +00000000000000000000000000000000:271ED37DB771414743EB781B2B315841:\ +00000000000000000200000000000000 + +00000000000000000000000000000000:ED0A833C87FE6CDC56E021BCD3099508:\ +00000000000000000100000000000000 + +00000000000000000000000000000000:6DBE8FEEB66CF747FFEC4E6D3D2D6BB0:\ +00000000000000000080000000000000 + +00000000000000000000000000000000:79460469EFEA89FA576B526B17709D4E:\ +00000000000000000040000000000000 + +00000000000000000000000000000000:5C3C35EC3D15CFAE719221549293A6AC:\ +00000000000000000020000000000000 + +00000000000000000000000000000000:607106E18F8C8A6E725AF44A491D891A:\ +00000000000000000010000000000000 + +00000000000000000000000000000000:1C22A5627309A238E2CE5A39BE370243:\ +00000000000000000008000000000000 + +00000000000000000000000000000000:FB6D4F017D84E9B74C2A59204A2EA0D6:\ +00000000000000000004000000000000 + +00000000000000000000000000000000:B66A30712DB3BD6B580678BDA72CC5B5:\ +00000000000000000002000000000000 + +00000000000000000000000000000000:59C93B2A53BE699840E29D78ACF05DE0:\ +00000000000000000001000000000000 + +00000000000000000000000000000000:AD37DFE5DCBB5A50228537BF24ED0159:\ +00000000000000000000800000000000 + +00000000000000000000000000000000:C9FAB85DCB8DA12A7C9416B267F21486:\ +00000000000000000000400000000000 + +00000000000000000000000000000000:EC797A0F6EBED4C257BC7FC1D7BD0100:\ +00000000000000000000200000000000 + +00000000000000000000000000000000:629D633D7A7C345A3A3CF66565E298E1:\ +00000000000000000000100000000000 + +00000000000000000000000000000000:859D400CC95F29E7131561F4D7E4DD12:\ +00000000000000000000080000000000 + +00000000000000000000000000000000:932CFF2E8A828C61BA537E186F559E93:\ +00000000000000000000040000000000 + +00000000000000000000000000000000:62FA5692938CB84279C7E399BA10E08D:\ +00000000000000000000020000000000 + +00000000000000000000000000000000:50321207B2A375B12F4630F3F1909B08:\ +00000000000000000000010000000000 + +00000000000000000000000000000000:63978A72D0ACAF85676EAA2D1EE01F3C:\ +00000000000000000000008000000000 + +00000000000000000000000000000000:20721CCA68AE0451687D82534A360173:\ +00000000000000000000004000000000 + +00000000000000000000000000000000:9223A844EAB1CA5D3A43EBC4C5CF01C8:\ +00000000000000000000002000000000 + +00000000000000000000000000000000:70E162CC61AC398CF4D9DBE62FD653CE:\ +00000000000000000000001000000000 + +00000000000000000000000000000000:082CED7A4969FD3C8131BF9AE57754DB:\ +00000000000000000000000800000000 + +00000000000000000000000000000000:169070D4658D94C12041D14EC60A2B0A:\ +00000000000000000000000400000000 + +00000000000000000000000000000000:960E45070B5BA767F1A3117851ECF9DA:\ +00000000000000000000000200000000 + +00000000000000000000000000000000:4AAAA999C2421953E3607CA202D4C1DE:\ +00000000000000000000000100000000 + +00000000000000000000000000000000:E4B97E5B2BA83D2038B5D08EB792F92F:\ +00000000000000000000000080000000 + +00000000000000000000000000000000:ECBC7F9C422FC676152CC7E40391D730:\ +00000000000000000000000040000000 + +00000000000000000000000000000000:55EBABC43A33305FB82B39A88A737FFF:\ +00000000000000000000000020000000 + +00000000000000000000000000000000:C1BDA064749B2B7A9E9378137462F800:\ +00000000000000000000000010000000 + +00000000000000000000000000000000:BDDD0163E4CEAC2C614ABDA9EBE15F3D:\ +00000000000000000000000008000000 + +00000000000000000000000000000000:B767CF0E6717B409743AE41C56A2054D:\ +00000000000000000000000004000000 + +00000000000000000000000000000000:AD897CFAED8FBBD9A3006F7EB2A7C601:\ +00000000000000000000000002000000 + +00000000000000000000000000000000:2929929D821D010A1A30E9CF4415F809:\ +00000000000000000000000001000000 + +00000000000000000000000000000000:0C861D39741060051855648B385708B5:\ +00000000000000000000000000800000 + +00000000000000000000000000000000:4BA018EA1AFF5C0A9CF368592B08FD34:\ +00000000000000000000000000400000 + +00000000000000000000000000000000:4377CD44B655A0ABC40E5B9D3A480EC6:\ +00000000000000000000000000200000 + +00000000000000000000000000000000:2F604E94C9CD1DCB730AB0AF407FEDBD:\ +00000000000000000000000000100000 + +00000000000000000000000000000000:44A3514094941B7E497BCFE0D746BA48:\ +00000000000000000000000000080000 + +00000000000000000000000000000000:1235A968A7D12BA7042E7E63A897DBED:\ +00000000000000000000000000040000 + +00000000000000000000000000000000:0BA061C7AD274E004B2E06D3D5FC784D:\ +00000000000000000000000000020000 + +00000000000000000000000000000000:E0DB8CE28D1C2F6B692B230A7AB0CB44:\ +00000000000000000000000000010000 + +00000000000000000000000000000000:ED4BBD535080655AF3F4D71709B1B8D5:\ +00000000000000000000000000008000 + +00000000000000000000000000000000:92D183FBE0BD07A0884EBD1963A193BE:\ +00000000000000000000000000004000 + +00000000000000000000000000000000:995BB9E75386C99DA3038C3C6340C838:\ +00000000000000000000000000002000 + +00000000000000000000000000000000:4914DA6C7A8E1AB8297A9D280DE576F9:\ +00000000000000000000000000001000 + +00000000000000000000000000000000:6415185D85078CE80F46C6E09EDB8B78:\ +00000000000000000000000000000800 + +00000000000000000000000000000000:8B2908466F8BD3C1C3A4A5EAFCC0FF92:\ +00000000000000000000000000000400 + +00000000000000000000000000000000:425BF2FCF5DD8B0013773F9A0DC09B0D:\ +00000000000000000000000000000200 + +00000000000000000000000000000000:9AC35220BE56E453B73CD887B299D06E:\ +00000000000000000000000000000100 + +00000000000000000000000000000000:41900EF8223D019F1BC3E8EA68FC763C:\ +00000000000000000000000000000080 + +00000000000000000000000000000000:9D294A574144109A9C6DE8E90EE517B6:\ +00000000000000000000000000000040 + +00000000000000000000000000000000:4146D6BB7AE455D93EAF43753C7AE693:\ +00000000000000000000000000000020 + +00000000000000000000000000000000:4155B7D12FD12F96FD39C576FDD41422:\ +00000000000000000000000000000010 + +00000000000000000000000000000000:1AF1E634B06211668CE2410D5EDCA968:\ +00000000000000000000000000000008 + +00000000000000000000000000000000:815739510622BFE08EEE06B772368524:\ +00000000000000000000000000000004 + +00000000000000000000000000000000:E2F7D8411181A21B02C1466E750056C2:\ +00000000000000000000000000000002 + +00000000000000000000000000000000:13095792D8B1D771378839C912CA3C41:\ +00000000000000000000000000000001 + +00000000000000000000000000000000:8301730C7D5FEFC416BEEC1104C51E36:\ +800000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F7EF83BDD4C3D5B30E805C351DB87200:\ +400000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A236EB8595FDF9239C658D58342EF566:\ +200000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:236397EB9EEDA5EA8BF4A42864A5A39F:\ +100000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:21C3DD416D64F6055C8C3977EEFB4652:\ +080000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:59128F63BD9D834C3EECA5A5299417D1:\ +040000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0F95FA4C48DE95391B45A460B92B22BF:\ +020000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5073FABD5FA03D153108B9A5F2128C78:\ +010000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B83872427919126F2C976D45872B7596:\ +008000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:73F8E6C4181758AFA29945E970C8F854:\ +004000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B72DC39B9A72EFFA047E3657B1F02B1B:\ +002000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:081F1C50BF964CCC01949363A1A1C76C:\ +001000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D4A2AB8B904BE542386CC2342AC354D6:\ +000800000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BC94C45B53BB5281BFF16F7BC7CCD26E:\ +000400000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7D976240134D43279AB809A3EC1BAB8E:\ +000200000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BE18D342080322DBBCEDBB83C7F11CA5:\ +000100000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D1359D29060E0003C78066A900C90C00:\ +000080000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FD0A7E670B7E9B57C913D38E4649715E:\ +000040000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C9DFB5B1CB3E079CFC027E67DA61EC2A:\ +000020000000000000000000000000000000000000000000 + +00000000000000000000000000000000:10FDD69900FBC470499EDF0AFF655430:\ +000010000000000000000000000000000000000000000000 + +00000000000000000000000000000000:565721A361F5F0EB44366DEC1D6841BE:\ +000008000000000000000000000000000000000000000000 + +00000000000000000000000000000000:07AD173E39A769D345277F4CFD16BBA8:\ +000004000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8E89B6B70A10D1866ED4D139A0E6565C:\ +000002000000000000000000000000000000000000000000 + +00000000000000000000000000000000:88A431DD4CBBD94778AE53A36EE246DE:\ +000001000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F4C8E31B64506E9BDE6BB682DBCEF50A:\ +000000800000000000000000000000000000000000000000 + +00000000000000000000000000000000:5B0E256E4EAB25AEC08CD2CE5547334D:\ +000000400000000000000000000000000000000000000000 + +00000000000000000000000000000000:EDBAA578C13D7D215057EAD4F03B9E1C:\ +000000200000000000000000000000000000000000000000 + +00000000000000000000000000000000:7EA37DB8EB1B362E370A43DF1ADB2F0A:\ +000000100000000000000000000000000000000000000000 + +00000000000000000000000000000000:8B7C67AE8F749C4EFB7418788D369DEC:\ +000000080000000000000000000000000000000000000000 + +00000000000000000000000000000000:34D3A7E87A4B1B3FAC60672A3D82F40D:\ +000000040000000000000000000000000000000000000000 + +00000000000000000000000000000000:4FE628152A1D46CF6DA78D5F17255877:\ +000000020000000000000000000000000000000000000000 + +00000000000000000000000000000000:3460A571D035B6DA52AA8E59702B79C0:\ +000000010000000000000000000000000000000000000000 + +00000000000000000000000000000000:CA2375E2E96AB28C7FC3E61B6561B07C:\ +000000008000000000000000000000000000000000000000 + +00000000000000000000000000000000:7E33319A69017428DDBD979D3F6982C6:\ +000000004000000000000000000000000000000000000000 + +00000000000000000000000000000000:49DA8B8AD80A6BBA1003FF6B8D06E3D8:\ +000000002000000000000000000000000000000000000000 + +00000000000000000000000000000000:CCE4C841B39187943DCCA5EB8BBF1221:\ +000000001000000000000000000000000000000000000000 + +00000000000000000000000000000000:3B42FA9129BF36F87E445589460A19BD:\ +000000000800000000000000000000000000000000000000 + +00000000000000000000000000000000:3E397A22C64A8C09B5B59A9D397B0A96:\ +000000000400000000000000000000000000000000000000 + +00000000000000000000000000000000:159AB9C871FB3EB373A94721E9F0743A:\ +000000000200000000000000000000000000000000000000 + +00000000000000000000000000000000:9C2DECEEFEDF2475C26EFFEA3A0E2920:\ +000000000100000000000000000000000000000000000000 + +00000000000000000000000000000000:0FCC4399113E6BF62A23F657BEF97224:\ +000000000080000000000000000000000000000000000000 + +00000000000000000000000000000000:2FCA4167B034D9EDAC4E12828B911600:\ +000000000040000000000000000000000000000000000000 + +00000000000000000000000000000000:3F9434872C4E49EB8718EDB8896CFF2E:\ +000000000020000000000000000000000000000000000000 + +00000000000000000000000000000000:8168025815D16028078007C9E1370331:\ +000000000010000000000000000000000000000000000000 + +00000000000000000000000000000000:F0FBF790B49553EC3963805CC2F6AA7E:\ +000000000008000000000000000000000000000000000000 + +00000000000000000000000000000000:951C45D26A548A9A6152CCBC00D3C6FA:\ +000000000004000000000000000000000000000000000000 + +00000000000000000000000000000000:845DCC97B1F8CD3254D2B29A59C7AE41:\ +000000000002000000000000000000000000000000000000 + +00000000000000000000000000000000:6694A168D387E4FB3291A376B938136D:\ +000000000001000000000000000000000000000000000000 + +00000000000000000000000000000000:9569359A00659B9645565857398C982F:\ +000000000000800000000000000000000000000000000000 + +00000000000000000000000000000000:417C97D7F56216FFEBE64A73F8D81168:\ +000000000000400000000000000000000000000000000000 + +00000000000000000000000000000000:8C46288B3314B9E1BC91E3C901C784A8:\ +000000000000200000000000000000000000000000000000 + +00000000000000000000000000000000:8EB78926977246F186274D88A4B0E6B3:\ +000000000000100000000000000000000000000000000000 + +00000000000000000000000000000000:51E819059AB0325A2DF7F8CF49A54353:\ +000000000000080000000000000000000000000000000000 + +00000000000000000000000000000000:56A59894FC1972B03D66D6C43688138B:\ +000000000000040000000000000000000000000000000000 + +00000000000000000000000000000000:CB772637B59AD2330ACC8CC2FA7A338B:\ +000000000000020000000000000000000000000000000000 + +00000000000000000000000000000000:1E3759E5BBE19EA0F66FBB0702F07440:\ +000000000000010000000000000000000000000000000000 + +00000000000000000000000000000000:2112CFD246447D95F1A6BFF65A044121:\ +000000000000008000000000000000000000000000000000 + +00000000000000000000000000000000:8A7E580BAC4406B297E12B472C2748E3:\ +000000000000004000000000000000000000000000000000 + +00000000000000000000000000000000:349ABE7C34357C7C719BD48AB62DF95C:\ +000000000000002000000000000000000000000000000000 + +00000000000000000000000000000000:5EDB9089B865DAC899854DACE9DBBDBC:\ +000000000000001000000000000000000000000000000000 + +00000000000000000000000000000000:C82372837C0B459699779683785CE09C:\ +000000000000000800000000000000000000000000000000 + +00000000000000000000000000000000:B26532F7C0FDFF76BFADD7178E7A2A7A:\ +000000000000000400000000000000000000000000000000 + +00000000000000000000000000000000:965F80C599BF6AA85CA2199C785EDAF1:\ +000000000000000200000000000000000000000000000000 + +00000000000000000000000000000000:8434DFE0C8717514FB0F8A4FF46930B6:\ +000000000000000100000000000000000000000000000000 + +00000000000000000000000000000000:10D701937E2944C7B48BAA32DA64C6A5:\ +000000000000000080000000000000000000000000000000 + +00000000000000000000000000000000:9A401E466C3686609B7B92FC6C57EA3B:\ +000000000000000040000000000000000000000000000000 + +00000000000000000000000000000000:E3442053C50265AEBEFD327633E449B1:\ +000000000000000020000000000000000000000000000000 + +00000000000000000000000000000000:7DF5EC480DEFA928687A35116989A7E2:\ +000000000000000010000000000000000000000000000000 + +00000000000000000000000000000000:EB2D38038A867146E3999D3E4DACE2BD:\ +000000000000000008000000000000000000000000000000 + +00000000000000000000000000000000:AE420A68558A2A50085331D8C46D7685:\ +000000000000000004000000000000000000000000000000 + +00000000000000000000000000000000:049B78384DE81BB815C48CC565DC1029:\ +000000000000000002000000000000000000000000000000 + +00000000000000000000000000000000:38EDCB5D37E043621F1EB80C78E40657:\ +000000000000000001000000000000000000000000000000 + +00000000000000000000000000000000:928C462D2AE8B7B45C252D0CAE80B34C:\ +000000000000000000800000000000000000000000000000 + +00000000000000000000000000000000:B3AD5D661D6DACFD57C214FDB9384491:\ +000000000000000000400000000000000000000000000000 + +00000000000000000000000000000000:9785657218402C1F3D1A40E73B015359:\ +000000000000000000200000000000000000000000000000 + +00000000000000000000000000000000:302355F21D129456A3EC58CD4C74D334:\ +000000000000000000100000000000000000000000000000 + +00000000000000000000000000000000:7322A935E1F65E2F341F778D0A55DAC0:\ +000000000000000000080000000000000000000000000000 + +00000000000000000000000000000000:7EEEF0009743F18E1E08F5CB02CFA104:\ +000000000000000000040000000000000000000000000000 + +00000000000000000000000000000000:82FA95B00BA5C8D71CB372895E91F7AD:\ +000000000000000000020000000000000000000000000000 + +00000000000000000000000000000000:44E308A9BAE6315936931C0D6F3472A4:\ +000000000000000000010000000000000000000000000000 + +00000000000000000000000000000000:A0F7760CB5F12B2F7F7451688DCC6DB3:\ +000000000000000000008000000000000000000000000000 + +00000000000000000000000000000000:249CBF1A9027A9D4A049DCC61C100631:\ +000000000000000000004000000000000000000000000000 + +00000000000000000000000000000000:AE5191679DB49836EBD11781E1A9E809:\ +000000000000000000002000000000000000000000000000 + +00000000000000000000000000000000:6F0F72E56952895F7425A34EB97D0D41:\ +000000000000000000001000000000000000000000000000 + +00000000000000000000000000000000:E4C8937EA026250290E85A2AA4B3A338:\ +000000000000000000000800000000000000000000000000 + +00000000000000000000000000000000:0D1B7815F62D8C6DB79E9755EB5CC047:\ +000000000000000000000400000000000000000000000000 + +00000000000000000000000000000000:3B8DA219500F670D2D32C753F613E646:\ +000000000000000000000200000000000000000000000000 + +00000000000000000000000000000000:DC16F91F486975C2762AAEF8E4C66543:\ +000000000000000000000100000000000000000000000000 + +00000000000000000000000000000000:7CC222B3C5866AC0F27A60C9D9713981:\ +000000000000000000000080000000000000000000000000 + +00000000000000000000000000000000:B7F625FC185B3ACEF820AF59570370FD:\ +000000000000000000000040000000000000000000000000 + +00000000000000000000000000000000:8AA59EA7476AFE267D7745A2A5E1D0CB:\ +000000000000000000000020000000000000000000000000 + +00000000000000000000000000000000:DDB9E4AA397029E10ED5F1984513280B:\ +000000000000000000000010000000000000000000000000 + +00000000000000000000000000000000:C92B81F3061A4ABC6C35D1B0AF2BA410:\ +000000000000000000000008000000000000000000000000 + +00000000000000000000000000000000:05F510BA96377001A23093980C02FBCD:\ +000000000000000000000004000000000000000000000000 + +00000000000000000000000000000000:A22D14EBC78B338735CA0AAD155B0114:\ +000000000000000000000002000000000000000000000000 + +00000000000000000000000000000000:C562318B01D5235CCD4DC3D3A8B10DA0:\ +000000000000000000000001000000000000000000000000 + +00000000000000000000000000000000:FA248CAA2F7C4B029054A31917BE9B47:\ +000000000000000000000000800000000000000000000000 + +00000000000000000000000000000000:FCC4E2E3C6E5DB8DECBF2493E3A52B9A:\ +000000000000000000000000400000000000000000000000 + +00000000000000000000000000000000:C5D23718F33ADC9F8B3B35263E47248A:\ +000000000000000000000000200000000000000000000000 + +00000000000000000000000000000000:773E59C9CA8EFD081E1CFD4F3DF4BC16:\ +000000000000000000000000100000000000000000000000 + +00000000000000000000000000000000:9A5E5AB516ECEA600952D25684DFF5E9:\ +000000000000000000000000080000000000000000000000 + +00000000000000000000000000000000:4EB9B9CC17E48F68423C884D64091022:\ +000000000000000000000000040000000000000000000000 + +00000000000000000000000000000000:0CCD75BECA8406EBF53CB0ABB1B46B23:\ +000000000000000000000000020000000000000000000000 + +00000000000000000000000000000000:0242108DABD2ED9886E8ABD70AA97B29:\ +000000000000000000000000010000000000000000000000 + +00000000000000000000000000000000:C52A6EB2958C995465C4F870F1A8269E:\ +000000000000000000000000008000000000000000000000 + +00000000000000000000000000000000:5FD2C7F3C81B013B96EC3ACBB0688175:\ +000000000000000000000000004000000000000000000000 + +00000000000000000000000000000000:1E63A0B10B0293A8572FD7749ACB9A53:\ +000000000000000000000000002000000000000000000000 + +00000000000000000000000000000000:9E1D466FA752C13AF4296CFFB8566DB2:\ +000000000000000000000000001000000000000000000000 + +00000000000000000000000000000000:BA1A69D7AD2869734A4954553D4EF249:\ +000000000000000000000000000800000000000000000000 + +00000000000000000000000000000000:EC2E7D615474B0B08D47AFCBE4FD8402:\ +000000000000000000000000000400000000000000000000 + +00000000000000000000000000000000:5C295AA2183B5FB9498094DB774244D1:\ +000000000000000000000000000200000000000000000000 + +00000000000000000000000000000000:1C5A17D1BE0D9EDCF339DB3D2631F236:\ +000000000000000000000000000100000000000000000000 + +00000000000000000000000000000000:CF6E9758B39149E3E29FB66CD58D0976:\ +000000000000000000000000000080000000000000000000 + +00000000000000000000000000000000:4F3FF2CAB95F678D85207691BFDAB811:\ +000000000000000000000000000040000000000000000000 + +00000000000000000000000000000000:463F1FCDF4A918300A93D7BED72F788B:\ +000000000000000000000000000020000000000000000000 + +00000000000000000000000000000000:CA5C88802CF0520C6521B106F4A58977:\ +000000000000000000000000000010000000000000000000 + +00000000000000000000000000000000:95C83D16F101B16E82D9DF9108A6805A:\ +000000000000000000000000000008000000000000000000 + +00000000000000000000000000000000:F98E0BE43F35A4CD52F93FD0877C1638:\ +000000000000000000000000000004000000000000000000 + +00000000000000000000000000000000:3B0D41F3A12DE6BDACFCA225F1344D77:\ +000000000000000000000000000002000000000000000000 + +00000000000000000000000000000000:BCB6197992A90A62497B53EC8E7E5857:\ +000000000000000000000000000001000000000000000000 + +00000000000000000000000000000000:9CA86B881701310C33F6CB2911ED777E:\ +000000000000000000000000000000800000000000000000 + +00000000000000000000000000000000:DDF4EBC89B16643E7B4F0B43AB3FC443:\ +000000000000000000000000000000400000000000000000 + +00000000000000000000000000000000:650AA74CDF7C5E92720E02A87ECA8FB2:\ +000000000000000000000000000000200000000000000000 + +00000000000000000000000000000000:F44E947B2A18F15189884E55EAC372CD:\ +000000000000000000000000000000100000000000000000 + +00000000000000000000000000000000:A4CC79AB8F6ABA941D400B45C32DA248:\ +000000000000000000000000000000080000000000000000 + +00000000000000000000000000000000:3C49EE1D3E4D8FD1E5CE9C793511F2E7:\ +000000000000000000000000000000040000000000000000 + +00000000000000000000000000000000:49199A91A32424357890F5C8E08E168C:\ +000000000000000000000000000000020000000000000000 + +00000000000000000000000000000000:438EBCC76304C4231DCDBDF85A876A85:\ +000000000000000000000000000000010000000000000000 + +00000000000000000000000000000000:DD04C176440BBC6686C90AEE775BD368:\ +000000000000000000000000000000008000000000000000 + +00000000000000000000000000000000:1DBAE21DF9D10630D8E9BA704AA3A6E2:\ +000000000000000000000000000000004000000000000000 + +00000000000000000000000000000000:F46B5DF361FF1A58AD233A2884E9B73B:\ +000000000000000000000000000000002000000000000000 + +00000000000000000000000000000000:DBD49C75B6CCA6CCEF0423FF3941922A:\ +000000000000000000000000000000001000000000000000 + +00000000000000000000000000000000:2C62774D20D574A487057A24280EBBC9:\ +000000000000000000000000000000000800000000000000 + +00000000000000000000000000000000:A6E24FFF68DF51B5613692D4098F7E22:\ +000000000000000000000000000000000400000000000000 + +00000000000000000000000000000000:A961B427D5FCD129EE29830DBD2952DD:\ +000000000000000000000000000000000200000000000000 + +00000000000000000000000000000000:7F637C136F8A57358DD5229B5E3BC38C:\ +000000000000000000000000000000000100000000000000 + +00000000000000000000000000000000:6FC5A39B35D2EF01B808E20C05DB9DDE:\ +000000000000000000000000000000000080000000000000 + +00000000000000000000000000000000:95E085E82A0883C8F6C1C83D6F4DF270:\ +000000000000000000000000000000000040000000000000 + +00000000000000000000000000000000:BDEE30731D4CD3593E46D9A8222485CC:\ +000000000000000000000000000000000020000000000000 + +00000000000000000000000000000000:508B5BB4ECCE303014D5A9ABB47DD30D:\ +000000000000000000000000000000000010000000000000 + +00000000000000000000000000000000:047832614B07AEABC28A39D5E72007C9:\ +000000000000000000000000000000000008000000000000 + +00000000000000000000000000000000:C1D4B662EE239A6DB9262B23C561B677:\ +000000000000000000000000000000000004000000000000 + +00000000000000000000000000000000:E567714DF47D43F1505D318C8D553062:\ +000000000000000000000000000000000002000000000000 + +00000000000000000000000000000000:CDF70F29AFD13EC6820D2C126D053DC4:\ +000000000000000000000000000000000001000000000000 + +00000000000000000000000000000000:182F2FD0ADC68D8DC72B08AC17E642C1:\ +000000000000000000000000000000000000800000000000 + +00000000000000000000000000000000:5DAA43AFBCD59026C0C410072A263673:\ +000000000000000000000000000000000000400000000000 + +00000000000000000000000000000000:E0C6DD7A8971A7D21AFAE153F115D658:\ +000000000000000000000000000000000000200000000000 + +00000000000000000000000000000000:4ED2DAA970922690D8CDF6CDFDA2E8D3:\ +000000000000000000000000000000000000100000000000 + +00000000000000000000000000000000:C1F929B679E007B1DDBBE896CE91C8C5:\ +000000000000000000000000000000000000080000000000 + +00000000000000000000000000000000:2323F5569BA740E14E05E0FB0914CE44:\ +000000000000000000000000000000000000040000000000 + +00000000000000000000000000000000:875AFCE0522E00712AB29E0E77BA57D2:\ +000000000000000000000000000000000000020000000000 + +00000000000000000000000000000000:A6185ECBDEFEB900335BAB38D95D7583:\ +000000000000000000000000000000000000010000000000 + +00000000000000000000000000000000:1331B89B377EA2A88A181907300BC50C:\ +000000000000000000000000000000000000008000000000 + +00000000000000000000000000000000:FC9D177C5B5D072E041D6C2F9EE6B536:\ +000000000000000000000000000000000000004000000000 + +00000000000000000000000000000000:5BCE1EA4FD0CC1EDE325DCEB55790565:\ +000000000000000000000000000000000000002000000000 + +00000000000000000000000000000000:937FE02D20FCB72F0F57201012B88BA4:\ +000000000000000000000000000000000000001000000000 + +00000000000000000000000000000000:5280E7768E573DC74DB90ABDC10422FE:\ +000000000000000000000000000000000000000800000000 + +00000000000000000000000000000000:0995E2D8E83C853C58ECF916E8067C3A:\ +000000000000000000000000000000000000000400000000 + +00000000000000000000000000000000:98DF44D404B5BD54CA5D55D08E7F1B12:\ +000000000000000000000000000000000000000200000000 + +00000000000000000000000000000000:9FD5F1165CD60FA5229CF03080428664:\ +000000000000000000000000000000000000000100000000 + +00000000000000000000000000000000:B4AE95212E3E8FFD6B27D4F0CC079CCA:\ +000000000000000000000000000000000000000080000000 + +00000000000000000000000000000000:878BD051874AB0BAC12EA94C60CC2671:\ +000000000000000000000000000000000000000040000000 + +00000000000000000000000000000000:3B0F2EF2A0849425063F49E65DF4D3AB:\ +000000000000000000000000000000000000000020000000 + +00000000000000000000000000000000:07D4297668485EBBF0F9266C203407E2:\ +000000000000000000000000000000000000000010000000 + +00000000000000000000000000000000:C2ECFB79C073BD453BDD2323C77FF80D:\ +000000000000000000000000000000000000000008000000 + +00000000000000000000000000000000:5173B04FC7C211CA17161164B79D0AE7:\ +000000000000000000000000000000000000000004000000 + +00000000000000000000000000000000:5135A445A721783AACD06930D39F72C4:\ +000000000000000000000000000000000000000002000000 + +00000000000000000000000000000000:A511E849B1B75DC94B1D73D957B53D78:\ +000000000000000000000000000000000000000001000000 + +00000000000000000000000000000000:42312B67F192D72B73689C712D60EAB7:\ +000000000000000000000000000000000000000000800000 + +00000000000000000000000000000000:30C89A160855BC3F339A170B715DD482:\ +000000000000000000000000000000000000000000400000 + +00000000000000000000000000000000:8DC19A7A97319A3309B98797A59954FA:\ +000000000000000000000000000000000000000000200000 + +00000000000000000000000000000000:D0AA5A8B9DFF98E18281E5FF20CCA3DE:\ +000000000000000000000000000000000000000000100000 + +00000000000000000000000000000000:AFA70EF4B45EA22E90108B834019120A:\ +000000000000000000000000000000000000000000080000 + +00000000000000000000000000000000:2801C6A5C0547CB988A2137A559D12B0:\ +000000000000000000000000000000000000000000040000 + +00000000000000000000000000000000:D791F5709D4AFE0642955F1B072F144E:\ +000000000000000000000000000000000000000000020000 + +00000000000000000000000000000000:35BB50E6D59A693709DE9B88CC8581F6:\ +000000000000000000000000000000000000000000010000 + +00000000000000000000000000000000:9B58CC95279539C1AF0BBC274A62F5C8:\ +000000000000000000000000000000000000000000008000 + +00000000000000000000000000000000:F51803FF4EA1B0F0AFF1C68C5C98CB3A:\ +000000000000000000000000000000000000000000004000 + +00000000000000000000000000000000:975B5309F1D3ACE9BA08B3D2D3FCB43E:\ +000000000000000000000000000000000000000000002000 + +00000000000000000000000000000000:D53CD9381EA85B0C106C22DA611F7336:\ +000000000000000000000000000000000000000000001000 + +00000000000000000000000000000000:393270B47546F1BFE35690ACCAC0FEBD:\ +000000000000000000000000000000000000000000000800 + +00000000000000000000000000000000:53E21284948996FC03ED9BCC34B45B61:\ +000000000000000000000000000000000000000000000400 + +00000000000000000000000000000000:AD9CA2740670DA740C75703A8859382B:\ +000000000000000000000000000000000000000000000200 + +00000000000000000000000000000000:AC9C2960E3061E56D8B9A1CDD3EED010:\ +000000000000000000000000000000000000000000000100 + +00000000000000000000000000000000:E5F68B122D15823F131DEA0468977D70:\ +000000000000000000000000000000000000000000000080 + +00000000000000000000000000000000:7EB7C6460FE9885BC96AFD4D4B65E90E:\ +000000000000000000000000000000000000000000000040 + +00000000000000000000000000000000:409147483ADC22592CA41224D35BB323:\ +000000000000000000000000000000000000000000000020 + +00000000000000000000000000000000:AB61745316651F61F4E2CC1DFBF8135C:\ +000000000000000000000000000000000000000000000010 + +00000000000000000000000000000000:88977EAD91ECF9C83F33EBE41FB7410C:\ +000000000000000000000000000000000000000000000008 + +00000000000000000000000000000000:9DC923136A1882D73CB412C986103481:\ +000000000000000000000000000000000000000000000004 + +00000000000000000000000000000000:9914219ED77B8FA772B4B8C53F9AD2FC:\ +000000000000000000000000000000000000000000000002 + +00000000000000000000000000000000:B9A0FA2324625650A2052D691E7DE9C3:\ +000000000000000000000000000000000000000000000001 + +00000000000000000000000000000000:5172978A58543DE597060983FD799F1B:\ +8000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0F86AECE7ACE09A8EAC0345C935BE91A:\ +4000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8C8D6ACDB23AE4B5BEE4E2C15273286F:\ +2000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:11395D4BFE4C8258979EE2BF2D24DFF4:\ +1000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D50183337FD8B3FAEF06C78B2ECFC40F:\ +0800000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F3969970B4E37D9FFD9BD886200D7C0F:\ +0400000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FF101A14CCB71863E0B51E8583D22760:\ +0200000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0CACB5AB8A51226134656220DBF23228:\ +0100000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BF75C54F53A3F374DC549BE280F6C6E0:\ +0080000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1DC755ED6128DC50826E65632C7672D6:\ +0040000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D7A46C3A378DB6A9C041D7DB1835DE3F:\ +0020000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:175FDB12EFB7E7D950777FE12BAAC953:\ +0010000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1A5C489CB6E0608EADAF3DBFA8B5FD1B:\ +0008000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7FD567FB07007A65CA8D98D4BF66F7F1:\ +0004000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3256E4481641ED28938AD6471414CD04:\ +0002000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A2AD960B437DCD0669681BBBC30F0CF1:\ +0001000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FB04B658FA923EA9CD5FB98BE54989DE:\ +0000800000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F3F43741881655CF074E36BD655F420B:\ +0000400000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:637DCF9D891EAD8D85A842BE0DC8261F:\ +0000200000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E663749A2786E3BA3833348A9CE5E7F0:\ +0000100000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:76F0F7C439E25C54A9BC7AEA05640882:\ +0000080000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:2CDE682FC40895F1E2464739FAD230DD:\ +0000040000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3242FE919ADFDCE04F163EBE772AD51D:\ +0000020000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CE05F79A80B2947B13BD22EE37FB3F79:\ +0000010000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5345BDE33281A0CB4A899A4F18C57563:\ +0000008000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:2E971691DDFD33D36738C08A517B0B44:\ +0000004000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EE144813E2194B18F1593C44932F170F:\ +0000002000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F626C435E30ABA4FA6F6DCA30CC08833:\ +0000001000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8AD30F69BD7446793C36676755D05F57:\ +0000000800000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:56851CB7277CBE4AE9AFF86E5BD49F90:\ +0000000400000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CA864AC764D6B9B9141A08146CFA7F56:\ +0000000200000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:484518D9A3C6CF7B7B92393DBBF78E42:\ +0000000100000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:093F44542B0E41E300C11AE77A48C6C4:\ +0000000080000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6D9856ADC56605F70EF069D639C9D977:\ +0000000040000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3FFB2FF7C5457744CABDFB89C0BBA7E8:\ +0000000020000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6D8254191931BE754D64F70FE3E226C7:\ +0000000010000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:23F3CC55C460EE949A9934C7E5C06CCB:\ +0000000008000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8739DA7F4A9D821EAA7A349E25741DAA:\ +0000000004000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:73E724C08890501275A0559621526948:\ +0000000002000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4CC6569D4F6207DDB03B232BFA8AA481:\ +0000000001000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:52A6D921AEF99205822B361D8D9DD998:\ +0000000000800000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:970E1899AEEEB7CCD26F854CA25214E2:\ +0000000000400000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D1DEFC8AC21C95160CF71612AAC55A8C:\ +0000000000200000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D8C2A3AD65F16024265714C21B8A70C5:\ +0000000000100000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:55DE20482FAE35A03F0D57B7546EB980:\ +0000000000080000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:81BCA41F11D12EE26326E042E74961AF:\ +0000000000040000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6D8D5C30A508436401396224D4E417B5:\ +0000000000020000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0FA1ECAB0B3C598C51372A5AAF6E1315:\ +0000000000010000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:945BF2690A9CE9ED8009004039E1E743:\ +0000000000008000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:73618AD5FD3A9740CB92C3F870C772B9:\ +0000000000004000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A7BAB4D0765D66F06FCB85A42D4CF0EE:\ +0000000000002000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:2A659EA8BF9EA163976C33A0B7463A56:\ +0000000000001000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4D9D5CC19BF1B2D48EF2CF4CD313D3E3:\ +0000000000000800000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0D7A26F850BDD2A633689367901BC2A4:\ +0000000000000400000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1A1235352EC6CD1A7A1913E77EF7CE4D:\ +0000000000000200000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5FDC541376BAF15D5AC011B9C0B74E75:\ +0000000000000100000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CB8DCB7AD04598E8337747E02A8DF16E:\ +0000000000000080000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:2855A6EEA8B20B8B25EDEE37A7D7E976:\ +0000000000000040000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:58B5CD00D833233E718DBEAABCC48E8F:\ +0000000000000020000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6DF58A11F96B67C330ED10FFFB1E6D74:\ +0000000000000010000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8FD74AAB8D136DCF1B398D1174AA343B:\ +0000000000000008000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A81E2F57E80761E361DB1008AC1ABDD8:\ +0000000000000004000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BDD939E7A93F6FECC762E2E3321DFEC7:\ +0000000000000002000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C281060452693278B48AD9076911EC39:\ +0000000000000001000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C06C159EEAFF3CB4B509DB604060F537:\ +0000000000000000800000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:757CED2216A9912B5FBFA1E623077E5D:\ +0000000000000000400000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:9606EDC198F44F955F510FA525E9C80C:\ +0000000000000000200000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:ADE8D3FAE7A4651855E053F42FFF7905:\ +0000000000000000100000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:398BA679B6C0A63479F0C6FE25614F01:\ +0000000000000000080000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FB77ECA9DEF62902240E4BF3806F3A64:\ +0000000000000000040000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B4313D0A9D34B21F69021A5458680579:\ +0000000000000000020000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BDC7C4ED3B989BF8288E8B4ACDE3FEEA:\ +0000000000000000010000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:430A2DAFFA822532FD4843DF9CBAF824:\ +0000000000000000008000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:16A2DEBA266577150B6DC34995902C99:\ +0000000000000000004000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5902382C7675AF5C52A6ADF349454276:\ +0000000000000000002000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0D912AA37CFB56223C6ED9E04B3D563F:\ +0000000000000000001000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1FD8880BE6A6E51C0C0E9C2866127F7D:\ +0000000000000000000800000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BC4079EE5CDB86BDD8FAE650E2931D98:\ +0000000000000000000400000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C52E414FC84C978FAD8CFA103844C306:\ +0000000000000000000200000000000000000000000000000000000000000000 + +00000000000000000000000000000000:DF6291B74EF77E82A8FB7C207213125F:\ +0000000000000000000100000000000000000000000000000000000000000000 + +00000000000000000000000000000000:530424A0F23CD90074F2D672A4FF3A96:\ +0000000000000000000080000000000000000000000000000000000000000000 + +00000000000000000000000000000000:83ED777537F5EE3E5769B8A07476A6AB:\ +0000000000000000000040000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5357341784EAB13F104FBAEFC69B726B:\ +0000000000000000000020000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6DBACA4C68AD93373CBEB1DB0963F33F:\ +0000000000000000000010000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EFA128916DF70D852574EC8507625CC8:\ +0000000000000000000008000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0BD55284AC672E1A2F248FB89C22B514:\ +0000000000000000000004000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E3222E0E2770496C443ED562ECBFC368:\ +0000000000000000000002000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6B689B6DB9374E072B45A7807DAAB132:\ +0000000000000000000001000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3215A725BCFBB120926F8BBCE41FC3EC:\ +0000000000000000000000800000000000000000000000000000000000000000 + +00000000000000000000000000000000:F2475FE25BEF963862CF66C91DA0250B:\ +0000000000000000000000400000000000000000000000000000000000000000 + +00000000000000000000000000000000:5E1CC549BB39348529FD279DFE5E1FFC:\ +0000000000000000000000200000000000000000000000000000000000000000 + +00000000000000000000000000000000:1A8EDD22AA0FE906267DF710DE8DB007:\ +0000000000000000000000100000000000000000000000000000000000000000 + +00000000000000000000000000000000:EE139CE12F8205D4EECCE6D7FD23B01F:\ +0000000000000000000000080000000000000000000000000000000000000000 + +00000000000000000000000000000000:FD84D87207D7BE3A79272CC9DF65E1E6:\ +0000000000000000000000040000000000000000000000000000000000000000 + +00000000000000000000000000000000:CE01B0EEA6BF6D981AFFB07FE1DD164E:\ +0000000000000000000000020000000000000000000000000000000000000000 + +00000000000000000000000000000000:1BCCA9BD22179B1C941947643FB01F0F:\ +0000000000000000000000010000000000000000000000000000000000000000 + +00000000000000000000000000000000:87A581347DF02FF9973A0622DF673804:\ +0000000000000000000000008000000000000000000000000000000000000000 + +00000000000000000000000000000000:1EDEB75B65B365582AB5AA265037FA55:\ +0000000000000000000000004000000000000000000000000000000000000000 + +00000000000000000000000000000000:807DD7E0418803258EF677BA9345CF51:\ +0000000000000000000000002000000000000000000000000000000000000000 + +00000000000000000000000000000000:70CE90D345621481A99DC8EE1A62DCD5:\ +0000000000000000000000001000000000000000000000000000000000000000 + +00000000000000000000000000000000:BB51E835284E0F7B74C053151F07D207:\ +0000000000000000000000000800000000000000000000000000000000000000 + +00000000000000000000000000000000:0240317EC3AFA5D4610C545C0D507367:\ +0000000000000000000000000400000000000000000000000000000000000000 + +00000000000000000000000000000000:9B77B76CA91662A9CB067267F0560C65:\ +0000000000000000000000000200000000000000000000000000000000000000 + +00000000000000000000000000000000:2219ED37D533B05CDC20B16F45D3DBD9:\ +0000000000000000000000000100000000000000000000000000000000000000 + +00000000000000000000000000000000:BC5A33AF9E4591BD4CF53B20728C3F85:\ +0000000000000000000000000080000000000000000000000000000000000000 + +00000000000000000000000000000000:68628B89F58C20E5195DB795C0A41489:\ +0000000000000000000000000040000000000000000000000000000000000000 + +00000000000000000000000000000000:5D177DE234B6288510163F2351750215:\ +0000000000000000000000000020000000000000000000000000000000000000 + +00000000000000000000000000000000:6015D7BA2F33B88B2BE0016E022E05FE:\ +0000000000000000000000000010000000000000000000000000000000000000 + +00000000000000000000000000000000:2D203E35B97E3B315C17D9F0F80ACDA0:\ +0000000000000000000000000008000000000000000000000000000000000000 + +00000000000000000000000000000000:E5800AF9BF96D6B7ED3A2AED899CA456:\ +0000000000000000000000000004000000000000000000000000000000000000 + +00000000000000000000000000000000:1163E6F8F1DE919686C138089EFA7986:\ +0000000000000000000000000002000000000000000000000000000000000000 + +00000000000000000000000000000000:2180B46E9EAC63A165BE63DAE17889A4:\ +0000000000000000000000000001000000000000000000000000000000000000 + +00000000000000000000000000000000:3D751DC36B1046AC808D8275B48697AC:\ +0000000000000000000000000000800000000000000000000000000000000000 + +00000000000000000000000000000000:DF022C5EFCEB5D3FE7E72DDF11D16EA3:\ +0000000000000000000000000000400000000000000000000000000000000000 + +00000000000000000000000000000000:C706AB7A20E0D038143B78D9D12EC1A4:\ +0000000000000000000000000000200000000000000000000000000000000000 + +00000000000000000000000000000000:8AFB006F196B00DAE7F0B36C9E88A3B9:\ +0000000000000000000000000000100000000000000000000000000000000000 + +00000000000000000000000000000000:BED70262ED524A5C6A495092E2543993:\ +0000000000000000000000000000080000000000000000000000000000000000 + +00000000000000000000000000000000:088A58A7351C7A7AF594035514DE0757:\ +0000000000000000000000000000040000000000000000000000000000000000 + +00000000000000000000000000000000:F5DF0BB68AB377B12321365C05480EA8:\ +0000000000000000000000000000020000000000000000000000000000000000 + +00000000000000000000000000000000:512DC8D603A7E4C8031D3566F141B233:\ +0000000000000000000000000000010000000000000000000000000000000000 + +00000000000000000000000000000000:50342EA0E9E81EC53E3683C8C1471602:\ +0000000000000000000000000000008000000000000000000000000000000000 + +00000000000000000000000000000000:8AAB01E320B17FD9945D725F5EA904BA:\ +0000000000000000000000000000004000000000000000000000000000000000 + +00000000000000000000000000000000:76FB320065713C165DECBE5DAFDD79BD:\ +0000000000000000000000000000002000000000000000000000000000000000 + +00000000000000000000000000000000:A8AD014D22CD8FCC9557438B8228253A:\ +0000000000000000000000000000001000000000000000000000000000000000 + +00000000000000000000000000000000:6017A9EB6F3336882FCCEDEC746C62F6:\ +0000000000000000000000000000000800000000000000000000000000000000 + +00000000000000000000000000000000:2EDF94990EB0F4BAFE1F5903102FE874:\ +0000000000000000000000000000000400000000000000000000000000000000 + +00000000000000000000000000000000:4EC81B0FA8FAE0025AF09D26F1F200EA:\ +0000000000000000000000000000000200000000000000000000000000000000 + +00000000000000000000000000000000:AF7F474333E74691E5D01A3A841F8096:\ +0000000000000000000000000000000100000000000000000000000000000000 + +00000000000000000000000000000000:28FCE531836F2A255CA19DE6F53841E8:\ +0000000000000000000000000000000080000000000000000000000000000000 + +00000000000000000000000000000000:6282A41053316B1A4027488E6F747003:\ +0000000000000000000000000000000040000000000000000000000000000000 + +00000000000000000000000000000000:3668527987AC38A3F7C052A20B668F24:\ +0000000000000000000000000000000020000000000000000000000000000000 + +00000000000000000000000000000000:4C3473FE666072653E29354F07EF02B5:\ +0000000000000000000000000000000010000000000000000000000000000000 + +00000000000000000000000000000000:0A51D7A5B347225798EDE5663940F32F:\ +0000000000000000000000000000000008000000000000000000000000000000 + +00000000000000000000000000000000:D3CA3A8821A3D094CF63CF12136A1249:\ +0000000000000000000000000000000004000000000000000000000000000000 + +00000000000000000000000000000000:FBC5E4B37A69AD5F21E53F88E55AB95D:\ +0000000000000000000000000000000002000000000000000000000000000000 + +00000000000000000000000000000000:CCCAAA0A2DEFD357EE31C2CFEC9D0E8E:\ +0000000000000000000000000000000001000000000000000000000000000000 + +00000000000000000000000000000000:93348B5393560AA416C6E6F0C99A58F7:\ +0000000000000000000000000000000000800000000000000000000000000000 + +00000000000000000000000000000000:13AC66E49E23A8D3582AA7117F7A8F2F:\ +0000000000000000000000000000000000400000000000000000000000000000 + +00000000000000000000000000000000:C403AD02F23055CEE08281E7D0C7EB2A:\ +0000000000000000000000000000000000200000000000000000000000000000 + +00000000000000000000000000000000:65DFD53B699B191CE7A6610A405083DC:\ +0000000000000000000000000000000000100000000000000000000000000000 + +00000000000000000000000000000000:3D6F7E99F6512553BB983E8F75672B97:\ +0000000000000000000000000000000000080000000000000000000000000000 + +00000000000000000000000000000000:92BA0D580A954F8C8494A840F0252AEF:\ +0000000000000000000000000000000000040000000000000000000000000000 + +00000000000000000000000000000000:958D8C9141CE21DBD69E19BA1E4F67AA:\ +0000000000000000000000000000000000020000000000000000000000000000 + +00000000000000000000000000000000:E508796197F539FCDC917ECAB19507E0:\ +0000000000000000000000000000000000010000000000000000000000000000 + +00000000000000000000000000000000:2200A6914A2050E99A55FB3BF20315E4:\ +0000000000000000000000000000000000008000000000000000000000000000 + +00000000000000000000000000000000:627C0B2401EE6C095404CD7AA59EA67E:\ +0000000000000000000000000000000000004000000000000000000000000000 + +00000000000000000000000000000000:75159B707278DFE6FD8A024B9FF0D5A8:\ +0000000000000000000000000000000000002000000000000000000000000000 + +00000000000000000000000000000000:F47982BE40C39306ACF25A120BC1B4E0:\ +0000000000000000000000000000000000001000000000000000000000000000 + +00000000000000000000000000000000:01CAABEF85A1E081EA6983079A90EA34:\ +0000000000000000000000000000000000000800000000000000000000000000 + +00000000000000000000000000000000:7F473CD21A453BF74CC76184D6F5496F:\ +0000000000000000000000000000000000000400000000000000000000000000 + +00000000000000000000000000000000:659442FD57B94862529D3E4C530826FE:\ +0000000000000000000000000000000000000200000000000000000000000000 + +00000000000000000000000000000000:88A9140C094A695716A2966B1A8078A0:\ +0000000000000000000000000000000000000100000000000000000000000000 + +00000000000000000000000000000000:28CCFC1BB6180AA7373DA1F5A54E47EA:\ +0000000000000000000000000000000000000080000000000000000000000000 + +00000000000000000000000000000000:53DFD8CB845FD279B337B52DBBA3CF4C:\ +0000000000000000000000000000000000000040000000000000000000000000 + +00000000000000000000000000000000:1BB5B100DFE6BA16983AD4A0F09FD50B:\ +0000000000000000000000000000000000000020000000000000000000000000 + +00000000000000000000000000000000:A896AE30D529D4ACFFCF5B763309CD28:\ +0000000000000000000000000000000000000010000000000000000000000000 + +00000000000000000000000000000000:F40A1B359A9B6B1197276C71222371F4:\ +0000000000000000000000000000000000000008000000000000000000000000 + +00000000000000000000000000000000:9FDE11C9E6CF9A1E9089820FD928767C:\ +0000000000000000000000000000000000000004000000000000000000000000 + +00000000000000000000000000000000:7771A5A99B099A2C861D084E790958A2:\ +0000000000000000000000000000000000000002000000000000000000000000 + +00000000000000000000000000000000:BE1907AA5CA148A0282850401C48AF71:\ +0000000000000000000000000000000000000001000000000000000000000000 + +00000000000000000000000000000000:8E47D50827FD36B62C0D3BD36F863198:\ +0000000000000000000000000000000000000000800000000000000000000000 + +00000000000000000000000000000000:81AA1751209F9173258CD1625DB65E07:\ +0000000000000000000000000000000000000000400000000000000000000000 + +00000000000000000000000000000000:1EE8FE72574BD819C97A0DEA2A5E0B64:\ +0000000000000000000000000000000000000000200000000000000000000000 + +00000000000000000000000000000000:031BA0B3EFCAE9B08793C8107C277A27:\ +0000000000000000000000000000000000000000100000000000000000000000 + +00000000000000000000000000000000:34C8DFD0DC4BA5240CA21BF4959EEF6B:\ +0000000000000000000000000000000000000000080000000000000000000000 + +00000000000000000000000000000000:C7A4DA0D5892A185D35447DB904511B5:\ +0000000000000000000000000000000000000000040000000000000000000000 + +00000000000000000000000000000000:7A8B9982B6C8AE1B5DC02FC1D9AFA2E0:\ +0000000000000000000000000000000000000000020000000000000000000000 + +00000000000000000000000000000000:C77E0DFB29402C587C6DD97E0BD09ABA:\ +0000000000000000000000000000000000000000010000000000000000000000 + +00000000000000000000000000000000:1AA2FD990BD0B0715B18482088DE0844:\ +0000000000000000000000000000000000000000008000000000000000000000 + +00000000000000000000000000000000:31C2D486FDA54BAB4286A02D260918AC:\ +0000000000000000000000000000000000000000004000000000000000000000 + +00000000000000000000000000000000:545F5A95E159B5F0DDF544B60F9C28C3:\ +0000000000000000000000000000000000000000002000000000000000000000 + +00000000000000000000000000000000:45C84895AF0393588C67D9CDD5E4D7E2:\ +0000000000000000000000000000000000000000001000000000000000000000 + +00000000000000000000000000000000:745BF4AF94A92D32FFE44B41AEF39320:\ +0000000000000000000000000000000000000000000800000000000000000000 + +00000000000000000000000000000000:13C47C2F92F91D72F34381AC9A81473D:\ +0000000000000000000000000000000000000000000400000000000000000000 + +00000000000000000000000000000000:8836D5AA076110FCD5BD66F3BECB39F6:\ +0000000000000000000000000000000000000000000200000000000000000000 + +00000000000000000000000000000000:11EDE6F221E96C7515B1256DF055FBC3:\ +0000000000000000000000000000000000000000000100000000000000000000 + +00000000000000000000000000000000:4E3BE7D6830703A6185CF0BDBE7F5BE4:\ +0000000000000000000000000000000000000000000080000000000000000000 + +00000000000000000000000000000000:6A1ABDA47972CFF536946A1C7D380810:\ +0000000000000000000000000000000000000000000040000000000000000000 + +00000000000000000000000000000000:74031DB865D2FC8319A320FFAC4694D8:\ +0000000000000000000000000000000000000000000020000000000000000000 + +00000000000000000000000000000000:E1F751F11027548C057075E8D8F880EA:\ +0000000000000000000000000000000000000000000010000000000000000000 + +00000000000000000000000000000000:AF24FA74CA96D89088C9018AA60E1D53:\ +0000000000000000000000000000000000000000000008000000000000000000 + +00000000000000000000000000000000:0E5214D31B2C9219F6C9686A35F210FF:\ +0000000000000000000000000000000000000000000004000000000000000000 + +00000000000000000000000000000000:2A72E2E692463EE8846C94A483C27E25:\ +0000000000000000000000000000000000000000000002000000000000000000 + +00000000000000000000000000000000:2B9C3298626F11072D7B1D80B47A841F:\ +0000000000000000000000000000000000000000000001000000000000000000 + +00000000000000000000000000000000:7468CAA1A5FFC828BE5A752C33132E90:\ +0000000000000000000000000000000000000000000000800000000000000000 + +00000000000000000000000000000000:29C75ADD5EDE2680C169FF9FD9177331:\ +0000000000000000000000000000000000000000000000400000000000000000 + +00000000000000000000000000000000:9BA78930CDD3357A2D84A49725902E8F:\ +0000000000000000000000000000000000000000000000200000000000000000 + +00000000000000000000000000000000:F190AC4C43E202F925B5FD1E4CA62DD6:\ +0000000000000000000000000000000000000000000000100000000000000000 + +00000000000000000000000000000000:5716FB34A1A6B40C35B2BA860F12163E:\ +0000000000000000000000000000000000000000000000080000000000000000 + +00000000000000000000000000000000:43B90548889A171E85515AB05EC76856:\ +0000000000000000000000000000000000000000000000040000000000000000 + +00000000000000000000000000000000:B4DE6F86875147F5276D584CEC11AFB4:\ +0000000000000000000000000000000000000000000000020000000000000000 + +00000000000000000000000000000000:3DA6C1A8937583BF6491B2E9C52081E6:\ +0000000000000000000000000000000000000000000000010000000000000000 + +00000000000000000000000000000000:9A54FCD26D9754ADD5F8967EF551EAB0:\ +0000000000000000000000000000000000000000000000008000000000000000 + +00000000000000000000000000000000:F0DCFA56A7E41A859276A6F8927B561D:\ +0000000000000000000000000000000000000000000000004000000000000000 + +00000000000000000000000000000000:5881A8AE181F16B64CD0C455389F511C:\ +0000000000000000000000000000000000000000000000002000000000000000 + +00000000000000000000000000000000:E9F7AD45D9EA9AA4C830B89EEC61C1B5:\ +0000000000000000000000000000000000000000000000001000000000000000 + +00000000000000000000000000000000:9118B623A63BFC69A9AAB868D752460B:\ +0000000000000000000000000000000000000000000000000800000000000000 + +00000000000000000000000000000000:2D208D46FB2177C243C539FCCD4A1E9D:\ +0000000000000000000000000000000000000000000000000400000000000000 + +00000000000000000000000000000000:2A4F52A297F20E428222008D9BE4A23B:\ +0000000000000000000000000000000000000000000000000200000000000000 + +00000000000000000000000000000000:EBCFDD28550C9654374590EC4BFD1CDC:\ +0000000000000000000000000000000000000000000000000100000000000000 + +00000000000000000000000000000000:FABB99266FC741241F6CFC0CED776A11:\ +0000000000000000000000000000000000000000000000000080000000000000 + +00000000000000000000000000000000:FBDEC944B2303E3A08A964E24130D10D:\ +0000000000000000000000000000000000000000000000000040000000000000 + +00000000000000000000000000000000:9897E33E6052ABA1F07233BCEF531E32:\ +0000000000000000000000000000000000000000000000000020000000000000 + +00000000000000000000000000000000:509DCA41B038225B30D8B7880D52999D:\ +0000000000000000000000000000000000000000000000000010000000000000 + +00000000000000000000000000000000:3F70238F99F2AF394C31308D68F1707C:\ +0000000000000000000000000000000000000000000000000008000000000000 + +00000000000000000000000000000000:E6FF6426E9025DD6519837F71A6C3636:\ +0000000000000000000000000000000000000000000000000004000000000000 + +00000000000000000000000000000000:F222502AEF77C1F21DB79B08F7AB8CA2:\ +0000000000000000000000000000000000000000000000000002000000000000 + +00000000000000000000000000000000:C17D2C00477C1AA20B539BE8174E7202:\ +0000000000000000000000000000000000000000000000000001000000000000 + +00000000000000000000000000000000:0F7B12AE962AF9C0C8CDCAA288FC6E12:\ +0000000000000000000000000000000000000000000000000000800000000000 + +00000000000000000000000000000000:0E740EE58431521A622122AEFB163CE2:\ +0000000000000000000000000000000000000000000000000000400000000000 + +00000000000000000000000000000000:CF0B94FECAC6F67070306654FE198449:\ +0000000000000000000000000000000000000000000000000000200000000000 + +00000000000000000000000000000000:604EA1D0711ACB8E545C0A88976008F9:\ +0000000000000000000000000000000000000000000000000000100000000000 + +00000000000000000000000000000000:71D03D8F6F917FDF5B612180454F3699:\ +0000000000000000000000000000000000000000000000000000080000000000 + +00000000000000000000000000000000:A6BCFE7B73EDCE71DB36AF00B01C37EC:\ +0000000000000000000000000000000000000000000000000000040000000000 + +00000000000000000000000000000000:93D761851BB991221AE77968459787DD:\ +0000000000000000000000000000000000000000000000000000020000000000 + +00000000000000000000000000000000:F117E4D5C88CC1C067C88AE38A5BF1D5:\ +0000000000000000000000000000000000000000000000000000010000000000 + +00000000000000000000000000000000:B534328DA555A9B69AC2A5B08E3CE47E:\ +0000000000000000000000000000000000000000000000000000008000000000 + +00000000000000000000000000000000:7BDFB785D866B6487790B9F6164F5EBD:\ +0000000000000000000000000000000000000000000000000000004000000000 + +00000000000000000000000000000000:5B3BB41E43D02901F5A0231768347B38:\ +0000000000000000000000000000000000000000000000000000002000000000 + +00000000000000000000000000000000:917216669DB1600015F2FE7CBDDA0FF4:\ +0000000000000000000000000000000000000000000000000000001000000000 + +00000000000000000000000000000000:C79B582FC430C0187D7B1D7B1E79BDB9:\ +0000000000000000000000000000000000000000000000000000000800000000 + +00000000000000000000000000000000:B9A43998AED6BB7B79C91BB4C2530F4E:\ +0000000000000000000000000000000000000000000000000000000400000000 + +00000000000000000000000000000000:0B24EBDF9A1D129F5E8397AB7412BC74:\ +0000000000000000000000000000000000000000000000000000000200000000 + +00000000000000000000000000000000:96D523E4EF1C888C72460DEBA8D58B78:\ +0000000000000000000000000000000000000000000000000000000100000000 + +00000000000000000000000000000000:85708C4539C8B06DD787AFDD06A3FE24:\ +0000000000000000000000000000000000000000000000000000000080000000 + +00000000000000000000000000000000:67A106762D2F46B7880750BCF987054C:\ +0000000000000000000000000000000000000000000000000000000040000000 + +00000000000000000000000000000000:8F46E37371E81C389CA94A8272A14FC8:\ +0000000000000000000000000000000000000000000000000000000020000000 + +00000000000000000000000000000000:92DC700C11BBE46DA9559CAA7BA662F0:\ +0000000000000000000000000000000000000000000000000000000010000000 + +00000000000000000000000000000000:90D2B52984DA214F392EF4EAC26A04FE:\ +0000000000000000000000000000000000000000000000000000000008000000 + +00000000000000000000000000000000:832D440D62996C5BFCB7FAA08DEB4D2C:\ +0000000000000000000000000000000000000000000000000000000004000000 + +00000000000000000000000000000000:69B7F725BA2B0539F6B45F2C8495D571:\ +0000000000000000000000000000000000000000000000000000000002000000 + +00000000000000000000000000000000:CE78A2AA25F818D87C46367579FAE698:\ +0000000000000000000000000000000000000000000000000000000001000000 + +00000000000000000000000000000000:F5E3E4DA4FC90F25F7D6679F076CA32E:\ +0000000000000000000000000000000000000000000000000000000000800000 + +00000000000000000000000000000000:F7618B001BC19F0195BD21021D9545B6:\ +0000000000000000000000000000000000000000000000000000000000400000 + +00000000000000000000000000000000:D84E1E36E1100913C7AFDBFE5009EDEA:\ +0000000000000000000000000000000000000000000000000000000000200000 + +00000000000000000000000000000000:9DB2838E3903829913D2AEE6465202FD:\ +0000000000000000000000000000000000000000000000000000000000100000 + +00000000000000000000000000000000:361AFBF61BDB378CCF2B76C01469BAA2:\ +0000000000000000000000000000000000000000000000000000000000080000 + +00000000000000000000000000000000:DC4C998046574B4CC447154F663E8EBD:\ +0000000000000000000000000000000000000000000000000000000000040000 + +00000000000000000000000000000000:0D890EFA71666BE0A38B423BAD47C90F:\ +0000000000000000000000000000000000000000000000000000000000020000 + +00000000000000000000000000000000:F39C444538E646A2BD59B443F68C51D5:\ +0000000000000000000000000000000000000000000000000000000000010000 + +00000000000000000000000000000000:9C6D37340E8F5EA22213E17A9F720238:\ +0000000000000000000000000000000000000000000000000000000000008000 + +00000000000000000000000000000000:3A23813329F978C1C6C3BE1715011283:\ +0000000000000000000000000000000000000000000000000000000000004000 + +00000000000000000000000000000000:CE24D63AFA37E2A659A21CF770109BB4:\ +0000000000000000000000000000000000000000000000000000000000002000 + +00000000000000000000000000000000:DF329017478D86B2C360D55BC2B2ADCF:\ +0000000000000000000000000000000000000000000000000000000000001000 + +00000000000000000000000000000000:BC5EFA1FBF848776746FD7826656E25C:\ +0000000000000000000000000000000000000000000000000000000000000800 + +00000000000000000000000000000000:A3E4185241C566DD2CF8117D4D7699F4:\ +0000000000000000000000000000000000000000000000000000000000000400 + +00000000000000000000000000000000:EF7BBDEB18879C11E2979DCC601CB620:\ +0000000000000000000000000000000000000000000000000000000000000200 + +00000000000000000000000000000000:FDC76A95F9C87E394F82A787D7406D40:\ +0000000000000000000000000000000000000000000000000000000000000100 + +00000000000000000000000000000000:B224E2BECACF6773B9941516195ED06B:\ +0000000000000000000000000000000000000000000000000000000000000080 + +00000000000000000000000000000000:B3951D0CF640BB7BD8F3D9948745FF9E:\ +0000000000000000000000000000000000000000000000000000000000000040 + +00000000000000000000000000000000:F9C8966E2874F736765B89DA10EF4611:\ +0000000000000000000000000000000000000000000000000000000000000020 + +00000000000000000000000000000000:3750F26BAB98833AB30444C0821A594C:\ +0000000000000000000000000000000000000000000000000000000000000010 + +00000000000000000000000000000000:D369C2B7C2337D67A87CD5B4EB45D290:\ +0000000000000000000000000000000000000000000000000000000000000008 + +00000000000000000000000000000000:F3A44B0F53DCC9F79E1AFA8ABB022C84:\ +0000000000000000000000000000000000000000000000000000000000000004 + +00000000000000000000000000000000:6E47C47F3940D369EC703E974AB350B6:\ +0000000000000000000000000000000000000000000000000000000000000002 + +00000000000000000000000000000000:1100DE2A57C47C2EB63277537ADE5716:\ +0000000000000000000000000000000000000000000000000000000000000001 + +# From the NESSIE submission +01010101010101010101010101010101:EFB2C7DD69614683DAB0BC607036C425:\ +01010101010101010101010101010101 + +02020202020202020202020202020202:A1AE9D211867538B100BD121BA6A3ADC:\ +02020202020202020202020202020202 + +03030303030303030303030303030303:8E77797CEC40C34AD3A3230975AE760E:\ +03030303030303030303030303030303 + +04040404040404040404040404040404:91086B2221C3FC8E254A97B611D83239:\ +04040404040404040404040404040404 + +05050505050505050505050505050505:95CA7F3CA2269A73B4964BD7A6A3DEA0:\ +05050505050505050505050505050505 + +06060606060606060606060606060606:BD7EB1B707AA5F801070B9C94F64A5C6:\ +06060606060606060606060606060606 + +07070707070707070707070707070707:37CE0ADCFAA89DD737CB15193DCBA48E:\ +07070707070707070707070707070707 + +08080808080808080808080808080808:37B6051557E2E535EE8B4955AC5DCB82:\ +08080808080808080808080808080808 + +09090909090909090909090909090909:33D6A06EB3B16C0C6078BF56F2966AB2:\ +09090909090909090909090909090909 + +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A:521D3B74BA74D29362708CFE62E357AB:\ +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A + +0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B:CDD5D57C2ABED59CEACAA9352103751F:\ +0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B + +0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C:173D2D1CABD12095742C3045EC50899A:\ +0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C + +0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D:A85D680132CCF78F2918A9698D6431D6:\ +0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D + +0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E:C8137067650576081E34565121681374:\ +0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E + +0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F:EDC375FEF71B83B2BE5187F82D0180EA:\ +0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + +10101010101010101010101010101010:54FD2A83F505EE40F4F6F4F94198ED48:\ +10101010101010101010101010101010 + +11111111111111111111111111111111:10CC2D64A5306366D8D594B8CDB4FBD3:\ +11111111111111111111111111111111 + +12121212121212121212121212121212:13E3A82E121BC3CCA5C703FCAC451E22:\ +12121212121212121212121212121212 + +13131313131313131313131313131313:1D8753BFF6930FA77FD7819F5935C422:\ +13131313131313131313131313131313 + +14141414141414141414141414141414:A6FF617A5D0395407BEEC3A311A0CBCB:\ +14141414141414141414141414141414 + +15151515151515151515151515151515:034D4716AC68312E05C9497E9FC9430A:\ +15151515151515151515151515151515 + +16161616161616161616161616161616:690D68007F51E2E8C9516EF9EE64F85D:\ +16161616161616161616161616161616 + +17171717171717171717171717171717:EF1396B41E8AF9BD6B2EBDEB7CC1A91B:\ +17171717171717171717171717171717 + +18181818181818181818181818181818:9A20B52BFC5EB501F027978FBD684A1B:\ +18181818181818181818181818181818 + +19191919191919191919191919191919:7A1A35FAD281601D522188B546CE1800:\ +19191919191919191919191919191919 + +1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A:F715BBB8000B577E6EF5D698511E8D03:\ +1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A + +1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B:09E83FD6F11C656ACAA1D1FAAF02F086:\ +1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B + +1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C:41561B53A60A9FBB25304169789461BB:\ +1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C + +1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D:B47BB77008C75F854861994479DA3E7B:\ +1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D + +1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E:811CE0CFEB49117D6ED593FBFD5E6CD6:\ +1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E + +1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F:C9479F831ECEBCFCB91F99FD6379A962:\ +1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F + +20202020202020202020202020202020:FF2C70AB530B889BFF5F3C902DE6209A:\ +20202020202020202020202020202020 + +21212121212121212121212121212121:695A8754A7A6F18C4F3C6EE9CE0EA103:\ +21212121212121212121212121212121 + +22222222222222222222222222222222:2E2DFBB0C8BD286E87625F61A2F7D887:\ +22222222222222222222222222222222 + +23232323232323232323232323232323:CE8E66F871157B0182653B625074CB02:\ +23232323232323232323232323232323 + +24242424242424242424242424242424:C32823388E5ADBD6AA14186CE0400A4E:\ +24242424242424242424242424242424 + +25252525252525252525252525252525:EDEA3E4740736BC47A7891609B86CE9E:\ +25252525252525252525252525252525 + +26262626262626262626262626262626:2B2DDCA5AD969636475196D462F5B2A5:\ +26262626262626262626262626262626 + +27272727272727272727272727272727:5C46E5F8DD4E7DC61474CB8DFC3E04F0:\ +27272727272727272727272727272727 + +28282828282828282828282828282828:6670EBB8C7E041121C5C5E449B675FD2:\ +28282828282828282828282828282828 + +29292929292929292929292929292929:808DC7740040F39A6D3CBFAAC5228A23:\ +29292929292929292929292929292929 + +2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A:15ECD6020C001F45262A1256AF7B066D:\ +2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A + +2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B:C937773A54DC09B0CC52756A7EEEF178:\ +2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B + +2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C:B8AB07101FC58ED64BBE203F31F892D4:\ +2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C + +2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D:FC429A3B703812E0AAD1A325A23E33DE:\ +2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D + +2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E:C4FFFE21B89FFCC6EC721D49E870ECEC:\ +2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E + +2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F:D218CB13BC19296A50B5612A3721C1E2:\ +2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F + +30303030303030303030303030303030:573FF72784A1CEBD97FED191A3B979EF:\ +30303030303030303030303030303030 + +31313131313131313131313131313131:4D44F703C1E1C39C3A2EDF5639394702:\ +31313131313131313131313131313131 + +32323232323232323232323232323232:50F09502DB7FCF0095E5F8219DCA5A3C:\ +32323232323232323232323232323232 + +33333333333333333333333333333333:9533F79F724484B169CB32EB7FAD0168:\ +33333333333333333333333333333333 + +34343434343434343434343434343434:9EB8075BAB79DD8BBF7ECAD69C6B13CE:\ +34343434343434343434343434343434 + +35353535353535353535353535353535:E5450816410E771677D879F0A6ED86BD:\ +35353535353535353535353535353535 + +36363636363636363636363636363636:07B20FB465C2F4FABC042A07E3163DEA:\ +36363636363636363636363636363636 + +37373737373737373737373737373737:26B4CFBE7FDB3B3253E9F5D499DAD6C0:\ +37373737373737373737373737373737 + +38383838383838383838383838383838:4FD4E8956C0808613A5EA19A9D753800:\ +38383838383838383838383838383838 + +39393939393939393939393939393939:FA74B3A2F745D440E74851D1C0D8679B:\ +39393939393939393939393939393939 + +3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A:9D6FC40588769E07EC406A0CEBEC99F2:\ +3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A + +3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B:53602388866685FC37681EBC9BC46F73:\ +3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + +3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C:AB4532B652BDD0FC8ED4034CF3C11A24:\ +3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C + +3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D:66EFBCE5A3C3795A50C1A6B999CC3E71:\ +3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + +3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E:1CAC1DEB42C55E3A3FEB261ED2FB3F50:\ +3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + +3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F:31D98EA0E6B439432C3A6BB8E25D600D:\ +3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + +40404040404040404040404040404040:898FD889A6AA36447C89D8CCC8B4043A:\ +40404040404040404040404040404040 + +41414141414141414141414141414141:AA74AA28D307802D28EDF73B58BD3BA3:\ +41414141414141414141414141414141 + +42424242424242424242424242424242:57F1920F30A23C74DA3CD9CF78F4328C:\ +42424242424242424242424242424242 + +43434343434343434343434343434343:2C30C357FB5A8F9D531CE0F17E1286F3:\ +43434343434343434343434343434343 + +44444444444444444444444444444444:C6E5EB2B3F9A7744A0128B93A4145A7B:\ +44444444444444444444444444444444 + +45454545454545454545454545454545:0DBF0AD86C57F7D25A0CE61F6A6148EE:\ +45454545454545454545454545454545 + +46464646464646464646464646464646:5F64A9BC4359153FF2572195A12F52D3:\ +46464646464646464646464646464646 + +47474747474747474747474747474747:B6099EE04520977CB7B1DE88E2120FA1:\ +47474747474747474747474747474747 + +48484848484848484848484848484848:77AE144A7A3883038561F239C5312F09:\ +48484848484848484848484848484848 + +49494949494949494949494949494949:DF0FE7423AA1CF40C8FD45253817FE33:\ +49494949494949494949494949494949 + +4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A:CE4E05EC0EE20A8A4B27937B7B8ECED4:\ +4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + +4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B:BAB91404D49876BEE288311BA3C7456A:\ +4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + +4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C:9DC6BCB030F1FBC24ADBF6EA5238E507:\ +4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + +4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D:BFACD02D59B26640B80B1886CD6E7D03:\ +4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + +4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E:2076B2B836A8C545B3C103050E7AFF41:\ +4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + +4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F:653B5B9A9751451C89DF56D79CFD07EF:\ +4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + +50505050505050505050505050505050:7F4060C7776DEED87F7F9B26BEAFA428:\ +50505050505050505050505050505050 + +51515151515151515151515151515151:B7072058AEF8AA25604ACE1531C81C59:\ +51515151515151515151515151515151 + +52525252525252525252525252525252:40A0515E8F01E55C60F70E0DAE4A1D31:\ +52525252525252525252525252525252 + +53535353535353535353535353535353:9805BD832CBCBEE6B439D866F3ED53F9:\ +53535353535353535353535353535353 + +54545454545454545454545454545454:81334B63525932E8B9342094A8DBB917:\ +54545454545454545454545454545454 + +55555555555555555555555555555555:59670A6CBA2E729FEDD36389481541A4:\ +55555555555555555555555555555555 + +56565656565656565656565656565656:84B3279AE90EACB5BF863DC17AE9212E:\ +56565656565656565656565656565656 + +57575757575757575757575757575757:13F3BDFA7EF33A97F496692361AE6167:\ +57575757575757575757575757575757 + +58585858585858585858585858585858:080F06D07DC2B4D0B748FA9F28946B0C:\ +58585858585858585858585858585858 + +59595959595959595959595959595959:72B8521961C711E79AA30616F0B70687:\ +59595959595959595959595959595959 + +5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A:75082BB9C98676FBB964DBDCD25705A2:\ +5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + +5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B:C00D2666ED3FAF0F01FEEB01A9883B1B:\ +5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + +5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C:C70DBF746F722EBC18A4F4B115193ED4:\ +5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + +5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D:6283561914D3FABEE1FDD1747515C2D4:\ +5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + +5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E:7AAABB3AE21BBA557AE89A0D9B99816C:\ +5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E + +5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F:4010AB7D9F7237DE123450ECA31B0900:\ +5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F + +60606060606060606060606060606060:3E4B358F1A26A197BF3B65B0DB4FB7E5:\ +60606060606060606060606060606060 + +61616161616161616161616161616161:2E9D9D04453C0698FB444CFA3340E0B8:\ +61616161616161616161616161616161 + +62626262626262626262626262626262:99ABC39983649030A48BAEDA6E718E8A:\ +62626262626262626262626262626262 + +63636363636363636363636363636363:39478E48FACF3E28870082DFB51A817B:\ +63636363636363636363636363636363 + +64646464646464646464646464646464:1BCA5B87AFEB4D9090910E02E3040CFD:\ +64646464646464646464646464646464 + +65656565656565656565656565656565:30B0F7101370BB69E7B20D13050AB876:\ +65656565656565656565656565656565 + +66666666666666666666666666666666:CC000CAA9DEB82E9766CD98B9DE131DE:\ +66666666666666666666666666666666 + +67676767676767676767676767676767:AEDA25322DEA94FA8345FD467992B1D8:\ +67676767676767676767676767676767 + +68686868686868686868686868686868:14D0D8253551FC65B1DE9DB1C3F0AB6A:\ +68686868686868686868686868686868 + +69696969696969696969696969696969:67D32FDC0CD1AAC1F20E3F5FDFC986C0:\ +69696969696969696969696969696969 + +6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A:3D8101226BBB3F4FFD40E68EF5F93626:\ +6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A + +6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B:684F017186FCC8AC24342CC54BF2FA6C:\ +6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B + +6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C:4AD0F6751D4DE121269F0FCCD99EFE68:\ +6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C + +6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D:FDF357681BD91A83E2632698C1525CE0:\ +6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D + +6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E:AC2698CD31DE9AC9740F53D467902FCB:\ +6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E + +6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F:ED011F6CD9356CBA1E4715D60AB112A6:\ +6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F + +70707070707070707070707070707070:724926624439B1C8694571BC103CFCED:\ +70707070707070707070707070707070 + +71717171717171717171717171717171:C2725BBB0E4945AF08A6A7F1A9AF211A:\ +71717171717171717171717171717171 + +72727272727272727272727272727272:0ABD84E7FF8FD3F826B4AFBE3AF2B653:\ +72727272727272727272727272727272 + +73737373737373737373737373737373:404BEFC70C072CAEE758CC3E697E946D:\ +73737373737373737373737373737373 + +74747474747474747474747474747474:0106FFAEE3A63E7B80004B044F864032:\ +74747474747474747474747474747474 + +75757575757575757575757575757575:AE43C4368B1FC9B98DB952887C4316B1:\ +75757575757575757575757575757575 + +76767676767676767676767676767676:FAC2FD894C5AEBC38A45034F38D44075:\ +76767676767676767676767676767676 + +77777777777777777777777777777777:09831AB86A3DF171F1961A8E9F40BDD0:\ +77777777777777777777777777777777 + +78787878787878787878787878787878:DFC3FE2EC8C90B113BB11F76F3636E3D:\ +78787878787878787878787878787878 + +79797979797979797979797979797979:E9B9BB30C6D86061FA1812FF08CBC65A:\ +79797979797979797979797979797979 + +7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A:0FC606C92CCFE70FEDAAE3DB6C443762:\ +7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A + +7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B:85DEC6534601D8B6B11B9060C8A42DF2:\ +7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B + +7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C:1250BEB80BC3D145284DF9188CCA5C50:\ +7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C + +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D:318E30C9CCEBCA2A7F546A49052AF9A4:\ +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D + +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E:49FCFE05AEF655D83155DB617ED581BA:\ +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E + +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F:91EF1DED08B8BC59A916B5739195C758:\ +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F + +80808080808080808080808080808080:B5BCEC5D9EC2161530284CD96653C250:\ +80808080808080808080808080808080 + +81818181818181818181818181818181:3B26ABD6B5688159301921809DF64FB1:\ +81818181818181818181818181818181 + +82828282828282828282828282828282:DAEA518A364BC404EEDD6903474BB56D:\ +82828282828282828282828282828282 + +83838383838383838383838383838383:37C8EBDBCE1501AAD18A395AAADCB415:\ +83838383838383838383838383838383 + +84848484848484848484848484848484:399FB3321F29829924CE72FBE9ED2756:\ +84848484848484848484848484848484 + +85858585858585858585858585858585:A88E685E95E838E27AC3024370BFE12F:\ +85858585858585858585858585858585 + +86868686868686868686868686868686:4C56F71EC80909EC98673D808F42321E:\ +86868686868686868686868686868686 + +87878787878787878787878787878787:4EFA656E3F35C570C8DC4EA5524B436C:\ +87878787878787878787878787878787 + +88888888888888888888888888888888:808FA06393685AB9143C82CA4B954BE4:\ +88888888888888888888888888888888 + +89898989898989898989898989898989:D107696CCF562B2CC2901D50E1BFE320:\ +89898989898989898989898989898989 + +8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A:98CF296ACAFAF704D6C91D1997202E47:\ +8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A + +8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B:5A023E5B18861A1FFCCC26F487EBF80F:\ +8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B + +8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C:8570554F91C1D8366FF6EC2097F110C3:\ +8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C + +8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D:E1CE24B74C513C884992C98DFCF70BFB:\ +8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D + +8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E:23F536F1876F44FFB7727D0FAF9F2D70:\ +8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E + +8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F:D877DD242B0C7CC05D9600419385A3EF:\ +8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F + +90909090909090909090909090909090:2896226A5A298578E2C999AF4F382DE7:\ +90909090909090909090909090909090 + +91919191919191919191919191919191:B54F6E5FB8F33608A8DFAEAD8EF27B98:\ +91919191919191919191919191919191 + +92929292929292929292929292929292:45CF4F783116E562F104B107BD3D10F3:\ +92929292929292929292929292929292 + +93939393939393939393939393939393:93F404FF83D493315E2E9665AC2013C5:\ +93939393939393939393939393939393 + +94949494949494949494949494949494:1A5664813121482F4DBE1026104D84A8:\ +94949494949494949494949494949494 + +95959595959595959595959595959595:AEE4A82CE2FF23E91A497269B82530F6:\ +95959595959595959595959595959595 + +96969696969696969696969696969696:E001B8A93500C4D49F8A9A372A1E8A61:\ +96969696969696969696969696969696 + +97979797979797979797979797979797:FB23B31999D3D84AFD55600B9EA722CD:\ +97979797979797979797979797979797 + +98989898989898989898989898989898:9572170C51A1198373B6ADBAB87AE454:\ +98989898989898989898989898989898 + +99999999999999999999999999999999:65CCAA1321D8CB3CA18462C37DBBE4E1:\ +99999999999999999999999999999999 + +9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A:3E942B1978B989CAC106E4575E6729A7:\ +9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A + +9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B:3E9AA5B6EC22E250368E9806041F6AA2:\ +9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B + +9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C:717479032B7D79C5236436D8AE0F3AB5:\ +9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C + +9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D:2643B168C234D5E0205E212C5CF669F4:\ +9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D + +9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E:A79DE0F9F3BE54CF4B453A1836F7F491:\ +9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E + +9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F:CF0836AC18F99D130EE85DE0ACDBE063:\ +9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F + +A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0:F12ABC04BB0C7F6F794EF428E57F15FA:\ +A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 + +A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1:383E9B4B9D663B8527E6FAB4A7892832:\ +A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 + +A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2:432103C74F3C2D68315CDD2831EF8F71:\ +A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2 + +A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3:E06519949E2F6E8B00E15CD58054BB4A:\ +A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 + +A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4:34A14A8B9E5869C25A9C604300BEC911:\ +A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4 + +A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5:0FB01A7B7F093C400E2FB08E709F7675:\ +A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5 + +A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6:51D28B7FDD1C3EA5ED21EBD1D8B7499D:\ +A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6 + +A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7:3F6FCB543C8771ABFABDD72E0E788FD7:\ +A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7 + +A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8:045A187E0A7009AB426A78B251CA088E:\ +A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 + +A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9:BF28504290089DB7D289785147BD5D9A:\ +A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 + +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:1297E67DBA4B264248FCDAF3B9E3FE4B:\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + +ABABABABABABABABABABABABABABABAB:8177E1C48AB5578DBB3C4AA36EEEEF5C:\ +ABABABABABABABABABABABABABABABAB + +ACACACACACACACACACACACACACACACAC:97E785AED832ACF1D419DC01219704D4:\ +ACACACACACACACACACACACACACACACAC + +ADADADADADADADADADADADADADADADAD:23D059447EDB76B0F9B41006399CC087:\ +ADADADADADADADADADADADADADADADAD + +AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE:7320A4A66FE238B9E1A932F9942DCFAA:\ +AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE + +AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF:4D8D7376C26FE0AFAA27B61ED1882721:\ +AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF + +B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0:DEF37D094186DE7209801C7D2D93F61A:\ +B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 + +B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1:536A8AACDB1156AC2E2D7DD0499BFA5F:\ +B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1 + +B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2:F57A2E78B976A57642DC8BFAFB3480B2:\ +B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2 + +B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3:88177315699E7AE0D5B4B07046ED5990:\ +B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 + +B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4:02F65559B9AA547A5EA54EB6A8E48960:\ +B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4 + +B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5:F2F02BC7D56F7594E37DB7DF94C1B9C1:\ +B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5 + +B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6:2691BEACD805DC3C69B0295A7308CFD8:\ +B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 + +B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7:A3A67B09425720C8AAB79DA8F44A8E8A:\ +B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7 + +B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8:DBC7ABF1DD510B5D3A6BA898670B6361:\ +B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 + +B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9:FA1B51E10654E448C32EFCD7A986CAF0:\ +B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9 + +BABABABABABABABABABABABABABABABA:C63D856771FC45E5102B14B41A79CB7E:\ +BABABABABABABABABABABABABABABABA + +BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB:9030C8326D2B75D1979DC1C3B80796B9:\ +BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB + +BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC:B11A41E18A535F8F3B343135C73A4670:\ +BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC + +BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD:BC6F04C2D75634E0054CCE755DE717A7:\ +BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD + +BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE:AAFAD1353CD8C6469751190678362F03:\ +BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE + +BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF:9DD8ACCD8D2A504AAE205BAD997F20DE:\ +BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF + +C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0:0FCBA053A6E5DE5D0E6B9395BDE2BD18:\ +C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + +C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1:E3AD2507E0F6BCDCC3D50728E12BF962:\ +C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + +C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2:0AB51BDC22FFF1458CB4D3D08EDB164C:\ +C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 + +C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3:FBF3371047AB698FCFC81442B134AD26:\ +C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 + +C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4:D026FC11B7B1BB47B020D7A8320A174B:\ +C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 + +C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5:FAE26B00CAD7DD254EDBB84688A846E9:\ +C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5 + +C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6:91F547F8129DB5B465DF57F0A03E58FE:\ +C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 + +C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7:AECA4D2C88D33F6A0CEAE619259E3982:\ +C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7 + +C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8:32AAB72FE2809153140156909B52F414:\ +C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 + +C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9:91EDBD3465D1216B3564F094455F0ECC:\ +C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9 + +CACACACACACACACACACACACACACACACA:4D14F0124000E96F09938906B99415BA:\ +CACACACACACACACACACACACACACACACA + +CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB:297F6B5BF3A01B1D87B7B74DF4E9DC2F:\ +CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB + +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC:BCCE55DCAFF6BB7B4D0CAFD112E87FCD:\ +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + +CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD:D7A1E8E4624689000AD7AFB06982D8FE:\ +CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD + +CECECECECECECECECECECECECECECECE:D59DAF6299A27A5DE36F7090B777673F:\ +CECECECECECECECECECECECECECECECE + +CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF:A5ACE3553FB387187CCFF88C3DEE1ED7:\ +CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF + +D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0:2CCF6DD6EBEE7C4A4C5586EBF792AC57:\ +D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0 + +D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1:695849E45DE312A07C5E8A6C1C20D6B8:\ +D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 + +D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2:5E14D156D004D484E040C354F13A8F63:\ +D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2 + +D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3:E4CD1852605EDC0FF576A8310FED4883:\ +D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3 + +D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4:BC7EB0533C90715C314362B1FBDC3545:\ +D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4 + +D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5:AFBDF9336F9CAC06313181937FF1849E:\ +D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 + +D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6:B590131983C4E266BDE99D577C493B67:\ +D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6 + +D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7:90921A3641666DE025E42B1BDC891FBA:\ +D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 + +D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8:E3B79B1EC3FA41E7EB3C575ED197588D:\ +D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8 + +D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9:5D9B53924BFCB123BEF8F3C5431103F2:\ +D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 + +DADADADADADADADADADADADADADADADA:12BB6C3773F42D7AB2BD711C3DA6B1F9:\ +DADADADADADADADADADADADADADADADA + +DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB:A0D2449463DDB310E0D4D0B547043FA0:\ +DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB + +DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC:B1E70695E833951DA0C4B38CDA067ACD:\ +DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC + +DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD:19AA0D4A04DD8C93935FCB3F39A0D2CD:\ +DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD + +DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE:98E4BAC98E4B1559B07E3A323D352964:\ +DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE + +DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDF:4B88F29F1DCB339CEF6C80EF949272BA:\ +DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDF + +E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0:8F3C7931AC39D8B62C643BB3AC2C731B:\ +E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0 + +E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1:D620AC385CAA42FD228176995C7EEC61:\ +E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + +E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2:D99A20E342818B37A21C87F35C19D559:\ +E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 + +E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3:0817FC31D13725B3F64790470C883F22:\ +E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3 + +E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4:945FE4DAEEE2AAA1EFE80022311B1040:\ +E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4 + +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5:F5976BFF2CE360F3A75CACB10B1B26E6:\ +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 + +E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6:4D7118A0D1DE4AB7E43765B2E2AE0EE2:\ +E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 + +E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7:FC428DC79787BBAC03937C6C0FEDA673:\ +E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7 + +E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8:6DF3580C31F389C898CC905582BCD920:\ +E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8 + +E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9:6B74DC42605029718F4D0C060547CC8B:\ +E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9 + +EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA:B587D402AA54E60DB655B4164847ACA1:\ +EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA + +EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB:16313A473EFCB6D965C5F1426785B472:\ +EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB + +ECECECECECECECECECECECECECECECEC:734356F14E8A6C5775A4638BBDFCE111:\ +ECECECECECECECECECECECECECECECEC + +EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED:F66FFD7385B4A87A9E2865D70864DAA6:\ +EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED + +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE:FB7FA84127D218FDE6A24CA30379ECCC:\ +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE + +EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF:4FADBE831B78D6B3C59DCE8B4293BB79:\ +EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF + +F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0:DA219657EA1AB63EA46306C2D0B69186:\ +F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 + +F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1:34BE2E9CB3C4047884CB291416D037C7:\ +F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + +F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2:384BAAE4DB758555E2DB6E2995E0CAEC:\ +F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 + +F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3:7338107A3D9BF3E8C67936E1CB77A22A:\ +F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 + +F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4:217BC7820BB5A9183D95BF7E99180B87:\ +F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 + +F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5:56BA9C916AECDC51203CB6BA5FEE8D3B:\ +F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + +F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6:8CCA87B86BEB5CCD11A594F20AD5D1B8:\ +F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6 + +F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7:CD0230DBA2982BE4F126FB2E80AB2C24:\ +F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + +F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8:A3E46629CF9D1D6DD1A6DE82B86C5934:\ +F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + +F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9:AE18D7C35968E90CECA036CF586EB963:\ +F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 + +FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA:3B0261B9DA91346FAD84DD9CC9EC4A37:\ +FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA + +FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB:9F3E91301511409E1F997A080F9A9424:\ +FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB + +FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC:F1BF5CCE9A7D5FBE759A579640348692:\ +FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC + +FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD:D192CBC80E653C12C647C1EBEB56AE10:\ +FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD + +FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE:64F5B3E91B4CC3C35AFB6793FCEC836A:\ +FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE + +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:EFB109978422E50FDCB05335D050D0D7:\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + +# From "The RC6 Block Cipher" v1.1 - August 20, 1998 +00000000000000000000000000000000:6CD61BCB190B30384E8A3F168690AE82:\ +000000000000000000000000000000000000000000000000 + +02132435465768798A9BACBDCEDFE0F1:688329D019E505041E52E92AF95291D4:\ +0123456789ABCDEF0112233445566778899AABBCCDDEEFF0 + +00000000000000000000000000000000:8F5FBD0510D15FA893FA3FDA6E857EC2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +02132435465768798A9BACBDCEDFE0F1:C8241816F0D7E48920AD16A1674E5D48:\ +0123456789ABCDEF0112233445566778899AABBCCDDEEFF01032547698BADCFE + +[SAFER-SK(10)] +A0A1A2A3A4A5A6A7:41246B65F1DC6AFA:01020304050607080000000000000000 +A0A1A2A3A4A5A6A7:5CBD77B03626FE3B:00000000000000000102030405060708 +9091929394959697:9EAA4DF1E0EFF445:00000000000000010000000000000001 +98999A9B9C9D9E9F:4CC14838399E532D:00000000000000010000000000000001 +B9BA26C1B67F9692:75AF0AEF94E54122:053D79C5CFC7E2A3244F888CB0336DBF +382395FB04EA1FD6:8162DBDC5984CAD0:438C2106DD87C2A0741F66A28D75A962 +0C07884F2D4B7645:64C8047DEBBE6895:8A5CB47F29F8B1C79EFDDC95EAA8DA2A +FD8CD3214D56917A:3360F9F4A25D0D5A:885588FCDBDDF30BDD55D6AD097594A7 +D2A9B8F6A027F02A:D750587CC46CF3B7:D020D65E6FEF3C7FD60413E04C71F8B1 +18AC5F07FCF872E7:557368277E129BE6:228A5CFEF727066B2E682DC8E40CD629 +4438471711225573:B75E4C4155A67C4F:360495E7E4784CAA34E42C12F125B71A +5ED88B627B5C899D:B356A077F9DB11DC:850F94815381C03111F45EFEE704AB48 + +# From RFC 4269; the first vector also matches the one given in the +# PDF "Test Vectors for Modified SEED", from +# http://www.kisa.or.kr/seed/seed_eng.html +[SEED] +000102030405060708090A0B0C0D0E0F:5EBAC6E0054E166819AFF1CC6D346CDB:\ +00000000000000000000000000000000 + +00000000000000000000000000000000:C11F22F20140505084483597E4370F43:\ +000102030405060708090A0B0C0D0E0F + +83A2F8A288641FB9A4E9A5CC2F131C7D:EE54D13EBCAE706D226BC3142CD40D4A:\ +4706480851E61BE85D74BFB3FD956185 + +B41E6BE2EBA84A148E2EED84593C5EC7:9B9B7BFCD1813CB95D0B3618F40F5122:\ +28DBC3BC49FFD87DCFA509B11D422BE7 + +[Serpent] +D29D576FCEA3A3A7ED9099F29273D78E:B2288B968AE8B08648D1CE9606FD992D:\ +00000000000000000000000000000000 + +2D62A890CEA3A3A7ED9099F29273D78E:717EB02EB81A2E939D54ACA91087112D:\ +00000000000000000000000000000000 + +D29D576F315C5C58ED9099F29273D78E:0D809C5EE82F477EBA7B956DBB23463B:\ +00000000000000000000000000000000 + +2D62A890315C5C58ED9099F29273D78E:0F0190D616F5294112FFB7884E8B37F9:\ +00000000000000000000000000000000 + +D29D576FCEA3A3A7126F660D9273D78E:41BA1B505386B7428B88338188F7E718:\ +00000000000000000000000000000000 + +2D62A890CEA3A3A7126F660D9273D78E:A3348230BF5CFA552F88D22463D9703A:\ +00000000000000000000000000000000 + +D29D576F315C5C58126F660D9273D78E:115351622E016BCA26918D17E13225F6:\ +00000000000000000000000000000000 + +2D62A890315C5C58126F660D9273D78E:7EE4E3F2C46FE52ECBDA044C585717DC:\ +00000000000000000000000000000000 + +D29D576FCEA3A3A7ED9099F26D8C2871:563A8403FF5309D62370B1DCF5A11EDD:\ +00000000000000000000000000000000 + +2D62A890CEA3A3A7ED9099F26D8C2871:2F7D73602B70CD2553E44C1D3F170126:\ +00000000000000000000000000000000 + +D29D576F315C5C58ED9099F26D8C2871:155BBD9BE3A965B345E834718F651CEF:\ +00000000000000000000000000000000 + +2D62A890315C5C58ED9099F26D8C2871:6CC65E8C5C566E894817350F497816F1:\ +00000000000000000000000000000000 + +D29D576FCEA3A3A7126F660D6D8C2871:EEFA51FC91FEBB6E9F8CB141CC0EB6AF:\ +00000000000000000000000000000000 + +2D62A890CEA3A3A7126F660D6D8C2871:3C6F8380CBD3C996167F2F0E90E71B75:\ +00000000000000000000000000000000 + +D29D576F315C5C58126F660D6D8C2871:6C87EB62A4975356B28DCBF6A64A0BD1:\ +00000000000000000000000000000000 + +2D62A890315C5C58126F660D6D8C2871:07206D48FE6DBE19D50314B90AC87B83:\ +00000000000000000000000000000000 + +AA26D561F567520E8AE47528C24C18D7:35706F9B26007071AD8105CFAA1C1E2F:\ +00000000000000000000000000000000 + +31A2193D9A97FED6922B17AAA6372B74:F7FEAE5CEC4D11477F24E6B200906870:\ +00000000000000000000000000000000 + +BE5DEBD559E303C9C92B174A5107BBFE:3C0E29E2950F2AC2DACD63DEEB5C7EFA:\ +00000000000000000000000000000000 + +B626D8F65EDCCDF3AEE475C8A1837722:9FDB9F3B740563D5518287DC981FC9CB:\ +00000000000000000000000000000000 + +41DDE7C1F1631F5FDED4F42746471BD6:46D4B5A5A86FEC08FE70D18297DCF510:\ +00000000000000000000000000000000 + +51D238BA86176EFE39E4695AAEB73B52:72DDBE038DA040EBB12C509F5940A212:\ +00000000000000000000000000000000 + +EA5926CADAD8018962E469BA920CB8BF:DDEB59F02132BE4581FC23EABAA960D6:\ +00000000000000000000000000000000 + +1EA9062E4D9CEDD5FAD4F4C7990367A4:341D9352E36DFD6E4EAF0F6F439BC8CE:\ +00000000000000000000000000000000 + +B966E5C5D2277288C61B96A559CC84AF:73A9AB3164FF30350F2DC08E939A104D:\ +00000000000000000000000000000000 + +B6A6583C5AACFCD6212B0BD8AEF3C6A9:6DF0C2C28F8E2D44468A61278BB6B429:\ +00000000000000000000000000000000 + +A11DDBD175639341052B0B384678D8D9:4DAE45AE0CAA032FC97CD4D8C57FB83B:\ +00000000000000000000000000000000 + +352299B71DD880E29D1B96452DB86540:BA8AFCAE22070BC882D3A42B38A09E65:\ +00000000000000000000000000000000 + +6E5D67CBD2233FD96DD4E85519F8C8FF:BC787554E0C28FE2787025A98E0E09F0:\ +00000000000000000000000000000000 + +15E936EA422C6CFE751B8AD79DB36621:86B80E7CB3786BCA23C7124354EA541B:\ +00000000000000000000000000000000 + +CED9A660F5589101511B8A37464C94C9:27F18C72F85905209F5603255B3F4DDD:\ +00000000000000000000000000000000 + +5992083E0D98A0C436D4E8B529F8C568:EDD2E4CF5B93C4312E5ED4F052C37897:\ +00000000000000000000000000000000 + +C8069CA67710BEB0973E53F6CF83F5B8:BBAE1F0CD912C15C0D6D531272BE5CDC:\ +00000000000000000000000000000000 + +209715348597D7935E59FCCDF462573A:538D750947CCE6E77C30A12732210008:\ +00000000000000000000000000000000 + +F55F291D8B1A23EBBC59744F266F0AF0:DEF3EBA592B3C325CBE4422B28708AE9:\ +00000000000000000000000000000000 + +B5F454770B8E202D32B69CF3C519564C:8629BE92247614A971C111CBAAC07503:\ +00000000000000000000000000000000 + +91447D195D011E605F6AD3EDD4FC375F:D591160C54C6980F2FB1289A290FB8C5:\ +00000000000000000000000000000000 + +39D8DFB5BFAE1EFD70243FA5C3592FD2:DD4E7DF8A2D94C073CE393A5D8F3BCC3:\ +00000000000000000000000000000000 + +80ADA9A56ED30915F209FC358BD23B13:16EA9B34329DEC0DC264A89531096063:\ +00000000000000000000000000000000 + +B762E58E9BC97C5B493EF8528DF0817D:81DDE46038411A21D84C46437D655E3C:\ +00000000000000000000000000000000 + +4163A1972ED201DBF666AB3F1506F316:E3D84AE8D29F438C93FD6F09A7E93E9B:\ +00000000000000000000000000000000 + +A429DB53BB101C18DCC2E4A1E6CC9F76:EA5A252DFD300488151DFBF42E0E0BDC:\ +00000000000000000000000000000000 + +D9E13DD7B37EE0096808CC1D4222E646:BE5932C7D8D87A02A6638ADECCFC10B0:\ +00000000000000000000000000000000 + +4190EB60B88C95F231EC6D7E20CCD8BF:D511BB2C012F08F1DB69B6CEC7BEC9A7:\ +00000000000000000000000000000000 + +1591F916E4E78577C46B226D0BFF2D18:4FA2AE41F506315E9D47F1538CBBF7DC:\ +00000000000000000000000000000000 + +2A112D319CADD403DED8F45A858A5864:BA00755699ECBE4DE4F507C11495880A:\ +00000000000000000000000000000000 + +65A3B7F6A32DB892F14275DD6934953D:EB81259E6EEC5F63DD0B3A4D7A304369:\ +00000000000000000000000000000000 + +AFB47A94B46DD4070782C7778D0BCAEB:CBDF5E6AA6C4D2D2112C5DA41BF7A998:\ +00000000000000000000000000000000 + +040F6C0CCF32860A3659483242B7938A:B80F05173C3009141E435A54787D9B11:\ +00000000000000000000000000000000 + +783C76251AB9E2AF1A7AAE0C103F7022:A4B00C8DE27F64FAE825F68446414CFF:\ +00000000000000000000000000000000 + +B4CE06347BCC27D88D8F9517511489BA:9EC055EC16A197AAC35C42DAF73EFDC5:\ +00000000000000000000000000000000 + +1D5F46424382FC14A88D11101713EC27:6D6EAAAADDD78F048D5DE03ADF132344:\ +00000000000000000000000000000000 + +A7D01D3962F7EE0506ABB0CB05BE3CFD:A29C8E4D019EFD52F5B3A924F78283FB:\ +00000000000000000000000000000000 + +DF77E42579E404C59D1F2D6282742AA8:21CA94A86C4B89E7D6A31A47EF13153C:\ +00000000000000000000000000000000 + +7C94C333B3129977B82B602FC6C34DBE:54765313C008E10DE032EF1CAADBA78D:\ +00000000000000000000000000000000 + +65930D441118388F839C48E87B3E1BA7:52929868115B6062648DE05D79EB026F:\ +00000000000000000000000000000000 + +33CA3DE47EFBC84D7FE3F5232F61FECF:49CBD717BD816CC9875BBC3F53C47FEB:\ +00000000000000000000000000000000 + +B4FE9AA29F6DEE99AAA46C6570C7EE94:8F4F803A44EEFB7322536211C9345763:\ +00000000000000000000000000000000 + +68BE8C46506743BF1B3C8A8826A4A609:6695C1F06CD1B4F465741F4518024AAA:\ +00000000000000000000000000000000 + +1CC8D6A3BE440FE4405E60C5318EA5C9:BE03C9515368E75890EC686BFE2FF646:\ +00000000000000000000000000000000 + +D00215D6061EA7A71E11B75A1D26430D:C3E2D4D0E8D0B41C30C8D87C13A49AD3:\ +00000000000000000000000000000000 + +CDF77148A39069E3BCF653FCE49366C9:4DF17345CF351AA676DD7B49938F7A52:\ +00000000000000000000000000000000 + +0F99BD50EDF7302DD7856AB5D615ED28:0172427A635F7D98BE4918C5AE2CB716:\ +00000000000000000000000000000000 + +66B77651ECF45BA521AD382EF3924728:794179D58EA6DBE6C47789543EE4C942:\ +00000000000000000000000000000000 + +447D7F32776EBC002D2D5BF157B65831:96FFDD0C7A8B148E2A56D23613001F07:\ +00000000000000000000000000000000 + +2AAB6D16B7D60DCE7F04B82155F24D84:FA241459469101FB4BCEACE6B5400592:\ +00000000000000000000000000000000 + +E58BB7447F6D10E7A004FBBA0191E9F1:F3789C8F92D55B6F6AA2F15DA3E3360D:\ +00000000000000000000000000000000 + +DE491798D0F7C403EA23C5BE065ACA64:240734AB5298B82E77547C5598D78F9B:\ +00000000000000000000000000000000 + +B7E4DFC5707B8BD443C44E60CA4FB33A:C987AE5A52023829ADECAB587EEC9FF7:\ +00000000000000000000000000000000 + +0F697B4EBA007B17E87D34AA5820BABE:D4F00A5171634F670D9A66641FF418C3:\ +00000000000000000000000000000000 + +B202A50E105E4C16EFB7E3CEB213D8B9:CEDEA26248AD109772F8FA6CE6840C10:\ +00000000000000000000000000000000 + +E5F9ED7FE679B4BB49F6CAF8423F4847:BB0CCA155A25E4506AA2872023E3DD42:\ +00000000000000000000000000000000 + +0EF0B59EE379CF782DF0B241FA0A481C:1558C66C18CDD1BF7FEABC12CA775765:\ +00000000000000000000000000000000 + +01297B97E8BA8CC43663B8F0587515CF:B9126AD2C22415E0D1DD0C46DFF4FACA:\ +00000000000000000000000000000000 + +04489483EC2124D4CE0C0D3532104B7E:3EA18AB75E496036A5B39C799223A40C:\ +00000000000000000000000000000000 + +2CB4E6700F324861F2675CF83D3E46E4:2F2599FCE02040B2B6511E6E0CCC4FF6:\ +00000000000000000000000000000000 + +79A4343D86C34E6F7FEA9F653E9510E2:9790DFE1ACA13EC9AD806E92925AC60A:\ +00000000000000000000000000000000 + +C48B333E3A297E4F078917922EB4112C:789BE31FE49273B1B9D23F3266E4E3D4:\ +00000000000000000000000000000000 + +8972CCBADC5B0506545466096C1D681B:E6B883BF48E1D41DBD59C5A1A5CF0D37:\ +00000000000000000000000000000000 + +07237CA5F80AFE75C531A1AC3C1AB011:C01C0D59B22FAD158C64FB7D9EB947E2:\ +00000000000000000000000000000000 + +530FA49A50BEBC8DF5B6551AD9DEA834:4839197697C73DBFFE1EFFA41418F1A8:\ +00000000000000000000000000000000 + +A37E6DCFD78A9367E0FD779EADD0E662:AD630EB9AC6CEBB004DB1FD6F7498CA1:\ +00000000000000000000000000000000 + +39B126834F71A6094145AE2C544C99D5:CF5F4208B97871A91F63C34E008E515F:\ +00000000000000000000000000000000 + +21C00D004653C7C46A48DBD99C58D420:11F9C2167F6C6151B1BD5BE2FBF8F415:\ +00000000000000000000000000000000 + +1D18D1F2EA9B2175E26F4BBBC6482EC0:C239C8DA7E469B1B360DE30B20CA948C:\ +00000000000000000000000000000000 + +2248571B13111E356A35583A346B533A:813394500C7B0A98B09360729C4C8990:\ +00000000000000000000000000000000 + +AC4E8230E1608BC860D3B15CCC3368F6:4C6E93F6A3D8FB4A0B0A84BCABFBA324:\ +00000000000000000000000000000000 + +9ABFF385FB69343F3155F005D1596C9B:50F442C56402B11FD9D1FB3BD13363BA:\ +00000000000000000000000000000000 + +52BD6F4E00AF26D08C240999EE8FC068:348D5F27D16C2716257F3AAA15283D5C:\ +00000000000000000000000000000000 + +E13E6BEC7B8EF6A26CF9EEFFFCB4BB8D:80048BF39DBBCBC3E5F11B523AF6E0AD:\ +00000000000000000000000000000000 + +5D4DDF9DFD43D9F269875972C5FDCCFE:F68CF795EE3094B23F312CDF347C4024:\ +00000000000000000000000000000000 + +C921BF10C4CAB3382CE78D35AEF5F36E:89009C9DB4733E7141FDB3212A412A55:\ +00000000000000000000000000000000 + +0EE30D5BA455F2105A1383E5234B25D6:3A5732BFCACCA7BCAE28BA212E2AE4CA:\ +00000000000000000000000000000000 + +7F30A307539BAF2BFA49E502F5FDB8C8:4D5F7C864D5A976FE623661D16CBEB36:\ +00000000000000000000000000000000 + +53DC7D23C91E3A3A993DDA2812406581:C93A2A92366C3C68E968814ED86B9EB3:\ +00000000000000000000000000000000 + +DBED8AB859453434ACB9E9F00CC077F7:D57191D7507746469BE9F27BAF5341D9:\ +00000000000000000000000000000000 + +6EE7D04DE056DBEBF6F76D646F5DDDE9:09E07FD8F84AE4909724703908D45358:\ +00000000000000000000000000000000 + +FAEE35C526B6D55284C50EA16B64BE75:52B5F265E0896C74F9A56962DD186EBF:\ +00000000000000000000000000000000 + +D1705E0D4414A331C698D0B5E7989F36:3BC372D47BB6298CE06DFE595B21AA6C:\ +00000000000000000000000000000000 + +FB1B87236E1B410800F4DEE6ECD1B475:EA0BB90C4B1DCB1D3A558FDEB539094F:\ +00000000000000000000000000000000 + +4DAAE23B2D96FA15733F64DD467B7B0B:FF9A1304937373A6BA1281A6C98A68A2:\ +00000000000000000000000000000000 + +0F61F575FD7CB6AC4EBC7E71D0F829BC:296A56189308CC6225FE28975AFF009E:\ +00000000000000000000000000000000 + +6D982DF029336B52CE5366EA1F707506:DE7FF6D41A3E69D6C21237C11BF41744:\ +00000000000000000000000000000000 + +D5D957B00EF19E7AE697F7BCA7766EE3:FFB2D4E3F9E2EF13969C8C885499D568:\ +00000000000000000000000000000000 + +FD18E498687DFBEFB5067ECFF123767A:0DAE1FDF0C4BDD0C39F7B920AE9A5A5A:\ +00000000000000000000000000000000 + +2F147D418659A6B46C6720090BC853AF:EF325356C760D3469E780E8E9F1A4C44:\ +00000000000000000000000000000000 + +F5BD9A33B96599C94EFD295F22197D8E:D49C47B7CDEE3C8DA1FD9706B9FD1EC4:\ +00000000000000000000000000000000 + +7D1929516793AC62EB5667DF9230E7B7:916A025A18196132AEFF32BF23E56808:\ +00000000000000000000000000000000 + +F6F185D1D9E5EF5E681B4E184FC803F0:3DCECA80A345D536020E821D67A4C42F:\ +00000000000000000000000000000000 + +8DCF813E1D32B6A462980606D5DA6C25:FD658AD24B0381E823217B2CF21F41E4:\ +00000000000000000000000000000000 + +311E5045D5D9FB6A9D65BE54391CEE38:98A92CBF1276C729261107A77511A3B5:\ +00000000000000000000000000000000 + +DB40EFC568A20FF65ACB58D46A0089AE:DAE0F812A9360561FE22DC8AB7F308BF:\ +00000000000000000000000000000000 + +3FBAD200F06A92BAB275AA0FB972FDD5:D024879EC26117A5C5B46447F3462520:\ +00000000000000000000000000000000 + +20DC7FDC121EAFE9084B3B6A223DAFCC:578341CB5831659ACA48B684404B45A0:\ +00000000000000000000000000000000 + +3B07F74CD998A7CCE14E4FC9D427E7B3:6E776DF83149BE88CB7C3C3E85C52F1B:\ +00000000000000000000000000000000 + +6469947C896B34C73AED82A38EFD7F42:C29EC8D5E338F0F928A86D7BA58CFEA9:\ +00000000000000000000000000000000 + +D26A6C2DEC69974265FF4452ED78F9AC:2F9F52D492D6694BD8D660CD7EF25D08:\ +00000000000000000000000000000000 + +392B09B430F1BBEF1806301374D5491C:0D5DA605AA771221251247CE79A2170A:\ +00000000000000000000000000000000 + +51B13ED142E6753C3D22FBA60CD56D7A:CF1774242D11FD50D33651BA798DC586:\ +00000000000000000000000000000000 + +F2CE749AE7D2A8E88E74EC43F50A6D83:7BF824A096D89F306543AC012F041ED8:\ +00000000000000000000000000000000 + +48B1659A4894EF28ABD7A17E2BE14507:130F39B7C637E478E8D195DE909C98F9:\ +00000000000000000000000000000000 + +2055A572782886EDC765497F6EED3860:A2E4F4E46D105904CFCC86C42E961ACD:\ +00000000000000000000000000000000 + +BE4D786EA252B372FBEC796CA944218D:D252DAD9045BECD279C72E53CB32491E:\ +00000000000000000000000000000000 + +AB720985752D3CED567366A2D66B5135:14D0B9D509F67CC6808B7CFCB64A180C:\ +00000000000000000000000000000000 + +2990B16179DFF02E3BE5329204CCE071:941A767F37377743639DF4C048C28CC6:\ +00000000000000000000000000000000 + +4AF02F69409FFFC5CD3E85912C68E384:26B7C40C96737897958DD86100F3B94D:\ +00000000000000000000000000000000 + +D5D43ED9513ACC71CC0380B7394DF738:8693A664C7E7546C5A6E23EB2E71CF83:\ +00000000000000000000000000000000 + +3B9BBA2992308915335F3FA0A0E12A7E:90DD602148161FFDE08D4983310DE0F2:\ +00000000000000000000000000000000 + +3EABFE15DFA13C3AED5A235D9616573F:1ADFB865A7ED2B588BCD0C346AA75BCD:\ +00000000000000000000000000000000 + +5357004733F6764F2495D7F602FD022A:F58BBA768C585C74583A71C7ADCBC5F6:\ +00000000000000000000000000000000 + +C5A1B211FA6D99D16C222B19DBE89806:AFCDD53A8A91AB62D4CA3915C5564473:\ +00000000000000000000000000000000 + +3E0995AD461831F731F5B5E8FAD4A32D:5FB04B5BA62C0DCDF8267567A166DEAD:\ +00000000000000000000000000000000 + +AC411EBC593D98A7573F0B03D18AAC71:6FB6C6D44F2E2F8E8D0FE03E639CA510:\ +00000000000000000000000000000000 + +CDD08D46B811A65FC48C34CE53C59273:869346200E0172F2EBE0FE696CA3206E:\ +00000000000000000000000000000000 + +53DB8DD086EDC157FD32EAE98974E659:1CD6CF6FBFEB98FAC7DDCD894374B66B:\ +00000000000000000000000000000000 + +BB380D75D07B8BD9A28F64D3F28FE126:646258E3B266E237572F050B7DD3C021:\ +00000000000000000000000000000000 + +A8DA4DE3772765676DF3035C5A6834B8:E8B76AC77E9BFFAB29C56A12F57FE5E1:\ +00000000000000000000000000000000 + +611E145BE9A042495037D07CE05A9C9D:717F5F9EC522FD63B46DE9A1F6CD3DFF:\ +00000000000000000000000000000000 + +B9EDDBD7DF2571DE135FA8F59E6F5E89:7FB7A904184FC463C453BFF8BC72912C:\ +00000000000000000000000000000000 + +BC70C6C532A9D8244AD957961652413E:C4AC50B64A9481062AEEA13B014A8C62:\ +00000000000000000000000000000000 + +9A977CDD70FB7B78F3CA0075A7F310D5:E8EED73C37662A48C6CA2FE299C50CFD:\ +00000000000000000000000000000000 + +CB1BDEEAC3B70C36FA65C5DF048EC7D6:5118E27A48630ECE2595DCE5C44DB8C1:\ +00000000000000000000000000000000 + +17C72CA5E39979F512AB6011D12FFE7E:9C88B75ECB151EA0F1F4376C8B1B2897:\ +00000000000000000000000000000000 + +B27637FDEE19BAB2EF984C20BEE9DDA1:053AECA22ABC1BAD69DF4A41457B7460:\ +00000000000000000000000000000000 + +242243B52292ADDEEA14D6711A809279:EB1C28238D1B7612FDADC261D8456040:\ +00000000000000000000000000000000 + +BCB05C0C37CE62E13718A4DC5D621759:BD3E796894AF2B24A2899615B76CE2FF:\ +00000000000000000000000000000000 + +F1F023BA8CD1278324FDADDF3D445FB4:0339029B1DA61D7EE7B8B774163A3589:\ +00000000000000000000000000000000 + +89459F7AA6ADD48B6E06AAF1AC94B488:6E460FEC45A03803F3F355C9DF9BE119:\ +00000000000000000000000000000000 + +8C0EC9B97B507BEDC21F02E8618EF5D1:EA1C2DF3021D879FC96D43FD0E67D653:\ +00000000000000000000000000000000 + +730E499138F578E5DD6896CD2415E278:237947AF67F07E80E0D2F3657BF80EF6:\ +00000000000000000000000000000000 + +8747CD711F39542D3ECD9C3EF11EDFCC:F292F6D7289ABC04D56AB7EE165DADCF:\ +00000000000000000000000000000000 + +EFDBAE4C02A4107E9BF71D14B380ED18:E44920E63171DCC895A0D26073ABC120:\ +00000000000000000000000000000000 + +A32A5731115EBB36AB0EB2D0435B0CD2:DCE9D7EB5A29646CA29D017D84671F4C:\ +00000000000000000000000000000000 + +648B7ADA19C5771CCDDE7D7FD8506C02:8BC336B3F819C5B95B5AB298AA5853A5:\ +00000000000000000000000000000000 + +FDEFA249896CED942F1560A2AD3D139B:F2686F27FB99CCEF669DA54F90EB839D:\ +00000000000000000000000000000000 + +4CE7F6748F7392F1FFC41F850E6BEB39:8D2143F8CE3DAE97CB36F9297ED0FAAF:\ +00000000000000000000000000000000 + +289106867C6A9F0046AF56EA694382C2:CE37C384B398767AFA386F923116C295:\ +00000000000000000000000000000000 + +E8389ADF540B748F3E9C8C553A9163BC:3B6CB9999BD604C41A6B979AFA58DDD5:\ +00000000000000000000000000000000 + +90EBF973D07E55241F5D435A7582931D:EE539308E76F1F6202769E1BAE8105E3:\ +00000000000000000000000000000000 + +DA1A98DE32FD428D031A411929DB7504:EEFDB3E1F832574F234D8129A2A7BECE:\ +00000000000000000000000000000000 + +DB6E1AE2CA58D3BBE82C52BA78EB9132:FB0C6C046B6E469132FC1E6D6467D299:\ +00000000000000000000000000000000 + +E218EEBE311B476B257DAAC37CB19BF5:069A62FA5C38E1C3F599E1F1D977ACDB:\ +00000000000000000000000000000000 + +122E5E3D0F9787804FD260AED930EAAE:D62B5083A1A2B3E8B26D38E58875BC8B:\ +00000000000000000000000000000000 + +6DDF3961CC91F485601683CB28355E6E:9ED29AA0A1F244935003BAE7951F90D8:\ +00000000000000000000000000000000 + +4B5409AD15C3F64DDF4B4636E17C9EF0:E7E2B8F0E936B4A9C0749F814582D1F1:\ +00000000000000000000000000000000 + +370AB733167272FCC2D30497CBBD3B18:0FE76FCA68F0E3CA774DA899A3423A81:\ +00000000000000000000000000000000 + +51816B90928F39AE99B6B8E7158DBCF6:24C9CE99EDE5980D94CB0D93B3CE05DE:\ +00000000000000000000000000000000 + +FB8CA3CCA3D18BD6D57B94CEDE433940:E07C63764F102CF1E1FE98068B97DBC3:\ +00000000000000000000000000000000 + +9AA179B7064787F10A64C3CFC4ECE5FA:754FE2C1C97B5108164D0166CE7D71A8:\ +00000000000000000000000000000000 + +18A7119DBF80C5C4BEE14716D5E69F7B:9A843E069C5564C071A941331A002905:\ +00000000000000000000000000000000 + +0CF4DCA9009625FED6E6181CE2EE8612:1E1CA36CC5342007172C1261959768C4:\ +00000000000000000000000000000000 + +FD53D3A5CF0AE84E6CD4F53336903AEB:F39D64F848DF16A5E6F3D03DC459A4DB:\ +00000000000000000000000000000000 + +4190FAF3D1F5B836F34B6E0D786802B4:30243B37B0AA5D7143F3AEAB57BE46C2:\ +00000000000000000000000000000000 + +E62ECCCF59A672463BCFBB384B5535C6:4CC047EF63B6D3CD41A5E2E2462570D1:\ +00000000000000000000000000000000 + +AE41BD59502A0CC6DAE7E9421854F7C4:17892D8679C543B025EE84230BC8B8C2:\ +00000000000000000000000000000000 + +8F094A8E5134FB06CC1E77D0542AE5F6:CFCD1A77DA12D6C79622EE61C4994F2F:\ +00000000000000000000000000000000 + +B11E3D28143AF33E2151E20DC9EFDB23:A31237E0F2CB986413E3323557EA1C3A:\ +00000000000000000000000000000000 + +E9637CE7F9CE8B647E560EEE8249B679:37F2B64F5FAA034E5A80C36E3D0A7AC6:\ +00000000000000000000000000000000 + +D41B8500710948B58294F5A77391EC36:E12FB1156FCFF78FA862AAF199437E48:\ +00000000000000000000000000000000 + +0AD9BB60CA674E99F7451383605E6112:A03BC6579A199A2F2E4CDC3353CAD7DF:\ +00000000000000000000000000000000 + +87BA07D6AE903577E59674C3280D59B3:D2BF2C2DE6F8FD4F879D16F96948226B:\ +00000000000000000000000000000000 + +92CD3EF1DF2102592B7B934E30971274:3CDC2CEAF4AD7A0E9973117B724136C8:\ +00000000000000000000000000000000 + +CDC62C36124C52D43864CF072D664410:4B9581DAB0FA33AA0C458E0F33C8F641:\ +00000000000000000000000000000000 + +A264DEC31ADDA880DB44D3D71C56F947:249D99A653422A9A01E5D6FC627883C9:\ +00000000000000000000000000000000 + +683D38A1C9416EC1121A5B9853B80B07:0C576DEA6233A44810146E0ED3D91127:\ +00000000000000000000000000000000 + +02E07632B8E1501FBED252B7491109B5:0AD78847637AD074B143DBA3ABF6A369:\ +00000000000000000000000000000000 + +6075E57D9CF6038882173A7F1E0B6B3C:54470D4B79E9376E68202C84E7FFAA0E:\ +00000000000000000000000000000000 + +FC44FFC49644133BA8F38B6B413F9B29:86BE58BB56E46A838E665A087D0AD1F9:\ +00000000000000000000000000000000 + +51C42552F01FEFDA492F6AB73584850F:482DAB7D2E967D6C3311BB6EB2F31C81:\ +00000000000000000000000000000000 + +10944915AACC670E23F4ED5CD98060B7:7C5F56D22104F4C73DE80EEF912CD774:\ +00000000000000000000000000000000 + +2E712621DB2DE5988041135782E613AD:ECDA11FD5472CCB163AC8CA311A5DF73:\ +00000000000000000000000000000000 + +0E3424038BC7047EDDDF0F3CB39F67CA:53E0F05DF0D4982708585E87D0789DBD:\ +00000000000000000000000000000000 + +0D94BD2667DDF384170B7CC0B725AF75:996E17E32523578DFF2B760CB49FA31D:\ +00000000000000000000000000000000 + +DD3E7CBFA877D46641F36CE6119D7CFF:DA019370BCEB7F587FB078D59A948891:\ +00000000000000000000000000000000 + +42FE27B2956E244C76F1625F22A889B6:3117DFE6E8641573030640CB6F5A9556:\ +00000000000000000000000000000000 + +2911CCE1311117276FB3B7DF33B55108:F0CCEFB7E412E3C83CCB1C16B275D840:\ +00000000000000000000000000000000 + +07F139B45971C6A2840A87BC94715F51:44AC477F1E12DAC54F7D9F4AB4D597AE:\ +00000000000000000000000000000000 + +CDF9F06DEB9BEC8B7D3FCAFEAF215E1A:36BD74FE0E68C6E4D791A526EEE0AF07:\ +00000000000000000000000000000000 + +F9EDCF2F43AB9BF55BE12A50F1B96367:12E01CAE32687BFADAD694D2B52AAC7E:\ +00000000000000000000000000000000 + +440233A437679347D8D7E98FC967C278:81F7C43030989F9D5B41E4FAD422EE1C:\ +00000000000000000000000000000000 + +5BFD6EEDCA5FE8CD57348FFE1128E804:780F4FF8F6DBE3F2F48BC65F0E737831:\ +00000000000000000000000000000000 + +D59500075A5D6F3412A6F4D6E70421A5:E2317139E45C8A5CF542745B79EB1E98:\ +00000000000000000000000000000000 + +0B875ADEC58FBC95198C49C9F5FB1767:1CC7DBD69CFDF1108744C12D5B249684:\ +00000000000000000000000000000000 + +56A7FF028345172C4C2447674C662509:ED35240E15DBE9E0A2F13BAE0471BDB9:\ +00000000000000000000000000000000 + +A5612F7E740B3B66CEDD046F0A5A1A88:3E563E21742D0210553A9BBB356FAA24:\ +00000000000000000000000000000000 + +BF49727B6A2B10E7708CCCD4BF24EDD5:33D2A385C1E5C675FCCBCEE0E43F1329:\ +00000000000000000000000000000000 + +CECF03B03EBCFA19C00056E19495FFBF:F075312AA58C03DF583FA16E730FAF56:\ +00000000000000000000000000000000 + +A7AF5CBE81D125FF604D583A50B8C00D:C4A6996A7F826F0D7126ECE1CF01E615:\ +00000000000000000000000000000000 + +67F6C13577041F4BF64F47D4C87DD9B7:C1C4C033CBFAF73A2D0D477C2B32275E:\ +00000000000000000000000000000000 + +FFD59439BD6B6C022AAB2F40C7ABB76D:E41211B5585A2E17881643C80B2521A3:\ +00000000000000000000000000000000 + +489D934A474700C49AFA42309C44A29F:7E94137A70C5A5757ABB58977C753626:\ +00000000000000000000000000000000 + +CC9D4E7E3A40D3E7B82D52FE59C15A28:C2DF7A7DCB4FA5E1BEC3FA0EC9FC06E1:\ +00000000000000000000000000000000 + +5B94C5125C4DE35E5587A93708E2E748:CAF50E7CE7623CA7970473867D069C5C:\ +00000000000000000000000000000000 + +79257DD42E664E92177DEF817CF86C93:F162F9C2E0AE24F10ADA56C3AB72C918:\ +00000000000000000000000000000000 + +4C9FEFCBB009C651D19337B0DE1B71FF:8231DB207B117B719E2C18E35C8EDF61:\ +00000000000000000000000000000000 + +5C17514070A79F2298252F43EB95240F:D6E1035BB55EFE63DAE750E874122D08:\ +00000000000000000000000000000000 + +7587363E4FBAB6BAC0A96E2E301E2F9C:BF0E4C121F4D92ADC66A58850D87B336:\ +00000000000000000000000000000000 + +2F34D0857475621D88F67B4AC932F63F:DC26468C5DB40EB9B69E2B968B6C9BBD:\ +00000000000000000000000000000000 + +1CC86603D53675CCC0360A362D62AA13:C3C9DCCB758A317630FB54186BEBB710:\ +00000000000000000000000000000000 + +13E024CF1C4EC5EC12DDFBE451462E9A:DC386958E72F8F51BC13191A5B34F3B4:\ +00000000000000000000000000000000 + +C9537865387154E4FFA9600D3643ABDC:1305E15912CC66A2B376EAD51CC48648:\ +00000000000000000000000000000000 + +A0B4CEE79237877C1431AD4CEA5CAD1A:074F192AC9EE825F569FD1674554C3C3:\ +00000000000000000000000000000000 + +4CAE87180B737168FE61765A2C13F393:ACC37301367543AB4FBE6310858A68EE:\ +00000000000000000000000000000000 + +73F66077FF86A53A528B7443D15DE894:32AFF7B87AE33CEA4539800A700510AA:\ +00000000000000000000000000000000 + +CADC2699AB888BAA7C61ABF4CCDE097C:B4FBD33EA3006CCF44514E2DFD6E994D:\ +00000000000000000000000000000000 + +F9A02333EC078EC9386949BEAEE3E77D:BB3D1AB3F206FE54EA92C9F452735F7F:\ +00000000000000000000000000000000 + +592D7FC9A5D85637C46DC7A80EA0344B:AFBE7E97575E89299AFD84BB85AFA1DD:\ +00000000000000000000000000000000 + +27585AF5E51E71F754FE0065C109896F:C15BFBA06F1BE380A4DB959AF9810676:\ +00000000000000000000000000000000 + +B999BC62DE1F2703CDCCB873176B342C:DC91C862BB49B7D23A01A13C92E0F4BB:\ +00000000000000000000000000000000 + +990FE45A78668A51DD3A2198DC94E8E8:97C3D586BFD3F6DE6F8F839F3CC9F9DE:\ +00000000000000000000000000000000 + +E12074137236C60691EC10AE3AC3CEB8:787A51EA74E1060766D4728B07C3AE5E:\ +00000000000000000000000000000000 + +B1AFE403781D9C75D2D10623D913BC55:241CF4705AED389F6B46D0AC8E797FE9:\ +00000000000000000000000000000000 + +C25657A5D97B31F96BB7DE1442622248:D5811CC2D865EF53B64E5A7CF59C467C:\ +00000000000000000000000000000000 + +2E8ADB82E854873F66B1DFC087318433:A09F4AA2E0E51767D051C1FC114E9D30:\ +00000000000000000000000000000000 + +F68DA1B6489815BC440C3D897A0F853A:36AB29DB1A0E7B295D8F61A56526526A:\ +00000000000000000000000000000000 + +18ACD883A6BD96CA32C7579981CAF789:92DD5D2080CF51484C93ADE891361EF5:\ +00000000000000000000000000000000 + +B0C3AEA8F19EAFB8FD7E986EC6FA3266:4F207BFC5E10812C827B13777360E6AC:\ +00000000000000000000000000000000 + +5E2D15D529FCE2A605E7CA372BD1B33B:C5E89179B2D955D740866AEA628F9C27:\ +00000000000000000000000000000000 + +B6527DE3B567C10C10709CB44801789B:11E9B1353CCCDDFCCC63D14674F20709:\ +00000000000000000000000000000000 + +6C7C9922FE4E48A3DC85D4672A5064E5:44C1528E8555388AF8B21E74078E9C15:\ +00000000000000000000000000000000 + +BAA1457430B8D5D3BF7E12AE9BE3FDD0:3BB8312ACB386EC82150C59BE2CCED37:\ +00000000000000000000000000000000 + +C210ECB8699792F39E7CCCBDB9671A24:90543622D6642AB3A24D7B31AD96152F:\ +00000000000000000000000000000000 + +3DF1FF376D026324BB657FECA2A03AC5:CFA51C14006B922AAE044051BF4CC446:\ +00000000000000000000000000000000 + +7470247B84F34BFE5B9F388FF30C7649:78FA69F113F617A4EF68699C28B6514E:\ +00000000000000000000000000000000 + +E4413068106FE78F7C5BD3223AB22F9B:D8F8E4217C642BA8AE8A91D49DDD7A8E:\ +00000000000000000000000000000000 + +95DCCB623977758D63621B6D6F9EE9EE:46FD7A6DE88C7607D9F2B0DE2CD366DC:\ +00000000000000000000000000000000 + +92B11A8AE5474A5FA0969A4B205FF0FA:A4D66D791EE8D4894FDF61BEC36F9A77:\ +00000000000000000000000000000000 + +81F5CA98D085E7F3EEB8B7EC9A7587D5:26E14F3BFC53B8247C829E29AAF36978:\ +00000000000000000000000000000000 + +FCB53FCAFCD1B14ABBB8DDA290A295C4:B0DF814B15FB6F0AA321E44A322C8CDE:\ +00000000000000000000000000000000 + +DEA998B86C1AE2AC866DBAB93AEF5AD1:1DA3F40C119AF23D85E434ACD90BCE50:\ +00000000000000000000000000000000 + +0884D66B4E154E3CD5A13384A181F229:1DE817E7AFB8B87698C86285633027F6:\ +00000000000000000000000000000000 + +65512F9F2F937A058172B0B255A67B67:8308565021CE65DA96CBEFABAFDB03E2:\ +00000000000000000000000000000000 + +D166E04AB120B82AD72B63243F9857C3:C5D055C3792C34A2C0830F174EF60F4E:\ +00000000000000000000000000000000 + +81B86BCD54B212E09D94ED7A6053D136:697642EE1D288AD0E0004F7CDE0D11B9:\ +00000000000000000000000000000000 + +B27258323A5CB9997B729799B2DF709F:FC4F383D27CDA4AF3DE9962DE95A9C9A:\ +00000000000000000000000000000000 + +BC9E6A0F55ABB6AC49F8A41B8F2DFFA2:34CBAF03126E517DE3F851A505A2995F:\ +00000000000000000000000000000000 + +891E3708A695636C791A7954B2263075:08461134E1B40126FC24D3BF0DF1E743:\ +00000000000000000000000000000000 + +FC48B079D9649987B24A15F9E0A3E00F:2BDD51F61CDEB752E07A4AD3AE3D7FBD:\ +00000000000000000000000000000000 + +2034B9788B8AFAB21791389E1ABC01D9:658E89F1B0F1EC177855A8DA60EAE99F:\ +00000000000000000000000000000000 + +F974D4DEE825FE43C97ECE434B4D2885:A0FB5361050AF4D2236AF62C0BC73D78:\ +00000000000000000000000000000000 + +B611BBE6722CF09DB817A04B2E047909:FD6A9802E511A1C8D89447CBC18438D0:\ +00000000000000000000000000000000 + +27212C758C0A0DA224131CECF3FCDD37:C47C31032D5D6E5D81634367B4AD06BE:\ +00000000000000000000000000000000 + +595066C1FF549B917C318676A408DEDD:8FFAD5759EF79843A30BF236D3BC81E4:\ +00000000000000000000000000000000 + +91A284663826FE81E6D615B870BC5EC6:9D5AE4A39CAC235A5E732761F2C33B10:\ +00000000000000000000000000000000 + +BDA05A5C43C64FAD2F8D5D980AB8E682:9EEA78142CC9453D3589FDBABC2FDA68:\ +00000000000000000000000000000000 + +840D3899332A3089F213B71356AB50F0:F8DC249385A0AD72AA2D7E2BE22C088C:\ +00000000000000000000000000000000 + +6DDEAF850B8DE1D95B17538ED3B1257A:0D05DC4CF2879722AB30EC1C651F27CA:\ +00000000000000000000000000000000 + +433CBB6339EFEF9C73AF53A947AF1695:0DE8E406EECEC22E6319E164C71EF908:\ +00000000000000000000000000000000 + +1C437E29DCC4F4B06B7E3E35CB989CFC:B1661E31685AEC6E05A759E29BC8F221:\ +00000000000000000000000000000000 + +9C3B693D9826980B8512C357CFDF1B41:2558229759A3A835E99B60F457BD9C23:\ +00000000000000000000000000000000 + +C073EA45C292185CD446767F1E885C0B:BFB3FAA751C802F63A4E88D5B075EDFF:\ +00000000000000000000000000000000 + +517ABC892B0F7E341D31952AD76B4F0F:8362B9BE129084442BADAB1E1937C661:\ +00000000000000000000000000000000 + +BBC92940F2DAF0C3AEBF4187F57136A7:32A3B0F226F0442161FFFCE8B130EFFF:\ +00000000000000000000000000000000 + +4DF202C89337B3476B725B6EA0854046:D398608144210678B768791182ED5A93:\ +00000000000000000000000000000000 + +A53098F2C8BD8222D8D1B437344C5B30:263B4FFB812546C2547CF19EB0751289:\ +00000000000000000000000000000000 + +A470D019D0A22DC6AD220E4CCEFBB6BE:03D99CD24B403EBAF4D56BFF5BF180D7:\ +00000000000000000000000000000000 + +6E577625743EB0874AE21B8355CA0D81:0469204FD9B02B490E9B1CC4EFB4D83B:\ +00000000000000000000000000000000 + +395EF2B04C035E1E966003CFE6599B1B:BDB2A2C17E50B034777A04E107264F31:\ +00000000000000000000000000000000 + +7B07AC9AABE733D9865F2D1E586C40A4:2B0785EA30561102C79AF30C095ABE1D:\ +00000000000000000000000000000000 + +51ABD478A711854204F64B6881F76852:C771AAB5D264A1E6E8AE7CC19F00D4E6:\ +00000000000000000000000000000000 + +57DB85FDFA9DFD533A6987A3FAD322A7:CC388408802856093A6C11BE5290581F:\ +00000000000000000000000000000000 + +C4E5BFB3E17AD60B5A5829014820B5C5:2E3269861EA631CDB2383C29D4D506A2:\ +00000000000000000000000000000000 + +4829C08DBFB9059FF867E9DF9A703D27:D15BAB5E15235503A5D8C795C96CE704:\ +00000000000000000000000000000000 + +2C4CEC15D7F8C6A4B240F67A33BDA4BB:21567729EA6C8DD3EC43DC715167C6CD:\ +00000000000000000000000000000000 + +7AD911480D5819AC796825B394F59957:7822F4F8946068FFB9124EA563A8BF1F:\ +00000000000000000000000000000000 + +423B4B359B1FB480187686E67A236B5B:B846A438131E0B4C5D239CAA95064058:\ +00000000000000000000000000000000 + +7BC28B5D37150A879F378EF1BD7D1EA0:8469A91626AB6D5356BA6891919B61E3:\ +00000000000000000000000000000000 + +CFEB7408AD592ED2D6C5A697EF23EF66:BE31A1248B97A5ADFF4B66C555B50402:\ +00000000000000000000000000000000 + +EBDAB6F971A393F2F06DB086A48FA53F:7C729F296DBAC0EC710639A1B14D2222:\ +00000000000000000000000000000000 + +2565D77254F3627F767EFB1CF14269DA:F0CF793A693B57EBBEDC7ECBE6472444:\ +00000000000000000000000000000000 + +D1C2D5E6589B714A1945271DE12A81BA:B6DF513288A4DED5CE147BEF740FFAEF:\ +00000000000000000000000000000000 + +3A4583DE24164F317C5A1A93B9305402:491D13F5238037889DEE07B607E21DC9:\ +00000000000000000000000000000000 + +ACB28C12990D69408E6021499156CCF0:2156CCFA4FB525F384E4C73335189422:\ +00000000000000000000000000000000 + +AEB020A13AB7ED94FBF69BE0AB407678:B2E8D35C8C0AE750A343AC9E64D11287:\ +00000000000000000000000000000000 + +2D9F0E92AEBBA0117AD2C3287BA51187:DA6AD4DFE5884A1ECB2EB6BB95BD036F:\ +00000000000000000000000000000000 + +55306BD6170500DBF2732E3FACF7C698:862B27C7CDEF0373E27E924BAA8552AE:\ +00000000000000000000000000000000 + +79505474B2EDC21FCE061DA97167DC76:9E4193947309A7167ABE371B7051E049:\ +00000000000000000000000000000000 + +73A093E22E3CB8671BA64C0EE14AC3CB:CCEFE03CE2EA144E50976F18BAF1B354:\ +00000000000000000000000000000000 + +D0501BDB4D423F058D06D2105FEE293C:A4988B0B18EC938244DCB35C82BE3EED:\ +00000000000000000000000000000000 + +023E136719CB97F52CDBEE3089394F62:AFF56FC36889B2EB49035F1218CD847E:\ +00000000000000000000000000000000 + +48EC313A173DC1C99079251ADCE3B7D3:3ACB20C17A5FACAC7F1B1BBFAFAF3E30:\ +00000000000000000000000000000000 + +2352B804B425F689995BB40A6FB33A04:A1DC974297F042A6ED4403AA5A344BCD:\ +00000000000000000000000000000000 + +E61C4C2AE973E6D6AD1CFC376E369B98:BC67FEC8D78DBF170F5A646072911204:\ +00000000000000000000000000000000 + +0571F553FC3559FE0B72598DCA3C8684:79A7DAB3EEB1A4F8C70CAB9D8AEF16CA:\ +00000000000000000000000000000000 + +4B01043AE8459456522F50A67DBD752F:DDF39B3663B310031C90C5A8C366DD2F:\ +00000000000000000000000000000000 + +C0793DC7F42F64CEA0FA90B9F95A8B2B:45579EC1B6FB2121C1943547FB846ABB:\ +00000000000000000000000000000000 + +B8C74F4C943A9CAC6C9A78E1824EC318:F8A2465668526210660C10A140ADFBBE:\ +00000000000000000000000000000000 + +EAB4FCD6326E0391BBAAB3C29527CDD9:ED54FF83DEBD9D4E2B4B6580FAA9DE09:\ +00000000000000000000000000000000 + +470AFEF36697D24C06982FF4331AFF26:5EF558685DE9AA79856D7A7059FC48AF:\ +00000000000000000000000000000000 + +350CD1B0E4AB2B41DBEAD22397F9272C:ED71E97B759F9A361D5893FA91A66AFD:\ +00000000000000000000000000000000 + +B847B4B1DAC15B83B7E7CF4836742CB8:C7471FEAD8C9368076E47018C3033109:\ +00000000000000000000000000000000 + +785115A2B6F073597A37DA4F2031C94D:33A86ABE68E69A42BE5565104833B20A:\ +00000000000000000000000000000000 + +4B20B005906093B2C01D99473056A74B:5C7098151542379A4DE40DFC04C46D24:\ +00000000000000000000000000000000 + +DFC6D2C78186F1BDD8A54CB2515837E6:6347D893780909693882E89D5D79263D:\ +00000000000000000000000000000000 + +393A041CA6555C4A53AAE66B5AEA4200:14F25D790263B1364E9128E730ED5B1F:\ +00000000000000000000000000000000 + +14DD5281E350E0805853C94BD9016AAC:6A3F4B41E35727F7A50CAC5F55A6AA56:\ +00000000000000000000000000000000 + +21EC9D29F9CFCBD4981EF5C69A12F057:866EC808A008ABAACB5475763CA00AD7:\ +00000000000000000000000000000000 + +9F2D5E03E6B12849107717FB1BC16025:018BDA98D7601F0531607DE8BB4CCF1B:\ +00000000000000000000000000000000 + +160B4F410FF5EE520FC768FF484F21AA:C4B17C980D4D4718FAE5586B908D41D2:\ +00000000000000000000000000000000 + +82DE5A5F07149CFE150905E6F9786AC1:3E824827A39B6219CFF1C3ED52CDCDD9:\ +00000000000000000000000000000000 + +3E5DE770A898C7DD4120B0CE207CC089:50219CA05A510433481D6D12E36BD4D6:\ +00000000000000000000000000000000 + +4E13E9B2E1CCFCA49DA3A6D8D85D5245:D44E0C864E5E538C2D1FB62E63512F69:\ +00000000000000000000000000000000 + +B40580746E450E2E0EED4A9B7F104E83:D1EAA4CE78B40BEC8E505AFEB992B304:\ +00000000000000000000000000000000 + +C48EE7B9A0AFA7519BB606968869DF17:7CEE0F216823CFEB5087DEE426BCDDEE:\ +00000000000000000000000000000000 + +0E177D4B50286A120A5ECF0969AA069D:36011D7266887FD904C95921488512C8:\ +00000000000000000000000000000000 + +BD0431A51ECBCB80220B3BBDB13B5732:F826B9EF289CABEFE753E90346D727B7:\ +00000000000000000000000000000000 + +7D007D5A6A2F26680458BE5C345E08A8:E798CE8B9B0BDF637DB2D3162EA2D3AB:\ +00000000000000000000000000000000 + +891DDB587CEEAE3F6F5F6D470C9667BB:CB09FA09ADBB747CB29EA2FF5E5C9792:\ +00000000000000000000000000000000 + +AC95F9EBB80B0E5994E0BACEBDFFB56D:966D3A3B90FEDD37C2CD616304F90C81:\ +00000000000000000000000000000000 + +CD723A1E9EBA8A9FB1D0F6D544953AAE:17294A27F2DB0F6501C95B669CF726AF:\ +00000000000000000000000000000000 + +C3FF8EFA00F672EEFC63F752CBD7D136:1EC5F82A3F4F49A6E44557A9A8297EF6:\ +00000000000000000000000000000000 + +8B4A66F04202B64A112D733F79A91CEF:E4DB812D84FF9B6B4314A21AA756F7E0:\ +00000000000000000000000000000000 + +DA250D691E273D62227B024768962F1D:5886F7436189C242A9C422F0BB572EF1:\ +00000000000000000000000000000000 + +F0BAB5E01B892AC144743983F6E8D566:B9528FD6EA14018AA38AB00009D10226:\ +00000000000000000000000000000000 + +B89DC4BDB7D7F6757144960C86634754:0D19223B03ED7F99033160FF246C84E5:\ +00000000000000000000000000000000 + +EBE504EC3BC160485B7CE65EA2A19785:880C1B4FFFD70736E8BD518ECE5B17EA:\ +00000000000000000000000000000000 + +2FCD1A4986E31A98361B90B4E74E7475:930C22171DAD582B85CEED022AF43D16:\ +00000000000000000000000000000000 + +14873B831B719DB9901CAB9FF563A851:2313DA90A38D6C59FEF0894DA350CF58:\ +00000000000000000000000000000000 + +A473DA95CB0B4C244699D8DFB4C2DE8F:45DB7B9E5FCA9A440F530DFE85AF64BB:\ +00000000000000000000000000000000 + +027A8941207C3630ACCF39EFB26A80A3:52C9F6F83608D31015D10CC7EF7C144D:\ +00000000000000000000000000000000 + +33DE5CAC12F645367076B88306388990:7DAB9967790C06A87F33888372568FC7:\ +00000000000000000000000000000000 + +92D8177CD2FCB399FCA7452284FC7748:43DE770DCD53EFEE430C76428474CBAA:\ +00000000000000000000000000000000 + +DD201A0D1654D3483B8953F87D0E48C7:EF3E3A528E851DCD493DFD8F823E4364:\ +00000000000000000000000000000000 + +DAE0E891214688020D99E6CD00DE4C01:347E7C0C421FE54A8C8CD27B8665321E:\ +00000000000000000000000000000000 + +EA9BD3F71C846DCA01001F562E76989F:0B4E96149B5E626A93C975A402193846:\ +00000000000000000000000000000000 + +3295F4905FD6722814D2933E226CDE48:71DC22BE06655F3B953379E3FE2B377E:\ +00000000000000000000000000000000 + +5819F527AA6C571EE35EF99F05300881:97D6108F2679638278EF8C99C7A7FC06:\ +00000000000000000000000000000000 + +00B34FCC58B29046CB519EDCE34A5BCB:123ECFFED7975F1FEC75D6EDB904E663:\ +00000000000000000000000000000000 + +B6D79518E3D17CC84FA44C5F951834B7:A5950E42996C2C09567AF382325E23CC:\ +00000000000000000000000000000000 + +25FBFAF468DEA60D982F23C50E6FD9FE:248DB0FFBC9F4501C122007BF395427F:\ +00000000000000000000000000000000 + +21C0F5D729E9799FDDC7353568EC3FFD:4BD385DD0D2D3B9FA44AC799355355B7:\ +00000000000000000000000000000000 + +C273D81BA6A15FAE72C08FC06BF95C1E:A52497BF1F74F58FBAB8B64431E8C3BE:\ +00000000000000000000000000000000 + +395450944A685821818603DA1B9F1BC0:0E96C89302DC1981B90EA546DAD5FAA5:\ +00000000000000000000000000000000 + +14616A135522A7C35B2534580606A204:97A1547D2C4668B3598ABA7865DBD33A:\ +00000000000000000000000000000000 + +AE4F32993A77A53EA6687BFA3A83CFDA:817215D2F46916D13B5B6862CD13ECDD:\ +00000000000000000000000000000000 + +86BA6D9579C903BB160A7A4AC18DBF31:909DFD858826F1F00CB6EEEB1CAF9DA8:\ +00000000000000000000000000000000 + +6BE21799427582127E942B4D34461E04:5FFCD94BC401F32F827791EA980609F3:\ +00000000000000000000000000000000 + +8496B480BF89717FD1819B0AA53CC33C:95BE56001901C98C595393455399F0D8:\ +00000000000000000000000000000000 + +FA70BA75B820F851DF973160BFB07C9B:75259AA8E1AE7CDBF6AED6B3E068929D:\ +00000000000000000000000000000000 + +00DFB0623FE65356B04FDDC1B28289D1:B87A487B4ADD0222754510189DBFEE89:\ +00000000000000000000000000000000 + +AF4676B327402F8F6C61A047DCCD434F:852014F8BFC2BDD51F16CD8D083B0EF9:\ +00000000000000000000000000000000 + +C6C342C67C699603ED3CDC5A7DE9BA55:C442DE6F7FC76EBDF529D198DAA68509:\ +00000000000000000000000000000000 + +7902D25C9FA2A0A5932E4FC70BFC2C27:FC4326CAB1549370D95F9D4B0E8F85AD:\ +00000000000000000000000000000000 + +BD681CF631503024FD6241A1F3BAE7F0:1B9C959CDF8AD16245264F5E4A9E319D:\ +00000000000000000000000000000000 + +3503193D1F3252DFF9AC83311C763700:D07C6880E968DEBD2941C4FEF1D2251F:\ +00000000000000000000000000000000 + +0492643AC9969F4460C1FC0804A4619F:D4E92987DEFF3CCCDE33C8B590122B6E:\ +00000000000000000000000000000000 + +FA9A1D95EAEDB684909E9F683E69FCB9:108D34BC88CD8D59E8486FDF82FA62EF:\ +00000000000000000000000000000000 + +22564DFD262798164A2939BFFDCEB281:06B77B0D8FDCDCC3586C1CA2502626ED:\ +00000000000000000000000000000000 + +45F93E6EFA2EFD9A0C71EE9285EFA29D:2E2D5BB4037B2E2FDDA09D8BE9F4EAFB:\ +00000000000000000000000000000000 + +806873410FD9DD61A715E277F08BA4C0:83F7323F69379CC15B75C23BF236221B:\ +00000000000000000000000000000000 + +77F3A397DD6079EF077C2A8565AA980C:98EDDE96A3C905129A6D5E398AA9D73F:\ +00000000000000000000000000000000 + +44F8CFB955F7171EFB8DEF067E2D673A:EC80B9B03CBEFBB70F33D3170C606671:\ +00000000000000000000000000000000 + +AF94A4F2482B49FF677E75E559A3BC29:9B7F527280418569953F83AAA6D94800:\ +00000000000000000000000000000000 + +54FD46CC08BEA6D09F4F8CCB2FE62864:C0CEFD5BE629252F9CF37C0EC16C1755:\ +00000000000000000000000000000000 + +21BAC32D30F1DE944D1F5275FACEDF47:D0737904989C17ACD06A5F9A5DBD48EB:\ +00000000000000000000000000000000 + +B1D9D5644A5D66BC8E51E5BF6E90E338:D8F948251535FCD67A0CDFB2F0E0258F:\ +00000000000000000000000000000000 + +3B9C3639E11FAF597A40A8D13CCC27CB:5C144E59D0C09671EC3CAB5A0CE39392:\ +00000000000000000000000000000000 + +AAD39B21BD9C45D92DD8B03F8ADF8295:063A2EB89956EEF09BC4A57DD23D6A77:\ +00000000000000000000000000000000 + +198816B1AAC8BD77E416606A77DC6998:240AEA2F55274B8A80198B8758B733C1:\ +00000000000000000000000000000000 + +612083F9D31C0AE6CDDFDE9E7421F1E5:21986590C1F285694603769D3AF6D7E0:\ +00000000000000000000000000000000 + +C0EE1A1F02820CA8EBBFF11B78855C5C:77E8A31F8AA17DE52DA7CB0D1C0E61F2:\ +00000000000000000000000000000000 + +57167699F08E77A6B075EA4D9988D384:6A3F8EDEE484A2C4CF375ECA4F0ABE8A:\ +00000000000000000000000000000000 + +5C5B9F6DD482F121F6B7EDA76BC98D64:8043E71AAAB12504944BE7149558755A:\ +00000000000000000000000000000000 + +9F7051BF58E623116C3A9982140AEFB5:F838E64CD3C5A8578246D5B6665004E0:\ +00000000000000000000000000000000 + +EDE3AB4922717E465A2BB8BF98464CB0:863BDF8DB9344C685C6C25AF1D95537D:\ +00000000000000000000000000000000 + +1DD33935C51869A29D6DC8B7B62DB731:6639463A8E9FF3EC2988D64C2791242E:\ +00000000000000000000000000000000 + +181A77E8054E8180F503D0501B479A48:7A37ECBF8705A4D58576CAFFA4F4E7BB:\ +00000000000000000000000000000000 + +58246965C1554A72E20BA7C61A52E3BE:18509EB535EB4CBF20026872A4F6862F:\ +00000000000000000000000000000000 + +3FBC39E715EE2B54022D9FCB33E07995:3C80350C1EEE381E2069AC95ED8009A2:\ +00000000000000000000000000000000 + +FA5BE2C6C03C878B520502B6D24FC80D:E0E69BE51245C8EDD65CC4CF714C9446:\ +00000000000000000000000000000000 + +6C037028C56B4BA67FC37C32A8F9A80E:28B5349E4A4C92157BC0205A7F47C588:\ +00000000000000000000000000000000 + +E9BA61E5B601690936348FC4258AC830:4CA1FE7B0A3E84E71C54DCCDBC606367:\ +00000000000000000000000000000000 + +9435CBBF42A71716C4A74208CD0769D5:EA6043518C041C3AB12D14864D9B707B:\ +00000000000000000000000000000000 + +7FFD7CF31F0E4B34FA6622E8DA4C6EBD:EAFF664EDE5BFA29021E0DB91EE522CC:\ +00000000000000000000000000000000 + +5D995FEDC45CD61D83F1BB40DA911AB1:803BB0CDC8C8F63DF714BD906AFDCD10:\ +00000000000000000000000000000000 + +216018840FF6B12272E6E9ABC014B037:2662B6DE572DFC8E654F528BCDC25B96:\ +00000000000000000000000000000000 + +8A64E9D30422E7EB189885ABD947EB10:E41903DF1CC561A16EF2D1ACD8FC67DF:\ +00000000000000000000000000000000 + +E8A317FAF7BA8191E4AE5DF588EFB0A4:6848773A5F6A0CB4014EBDD7243C626C:\ +00000000000000000000000000000000 + +610A7A480A667E50ECC3921DC2487868:C353E8C4B8781BF0B38E5714F5D56D03:\ +00000000000000000000000000000000 + +4DD3385F15F88D8E1D9FD368F550C7DA:DAAADFC4A39AC95A2A63CB17E0BEC906:\ +00000000000000000000000000000000 + +6E5DD5F8B67658FC703EBC8048C8C99E:F5935C19F405DF2F9FC7FAFA93028DBE:\ +00000000000000000000000000000000 + +6DA0C2E3B1E9852AF9F7F19707CBBC23:3AEFA41D48FC7B0A75EC269C1D5EC39D:\ +00000000000000000000000000000000 + +DA49E4D68C12D599B55E9BF0DA4CB219:3AE5405F74A0A1BB9C587B535FA84068:\ +00000000000000000000000000000000 + +F928FFEBA72BEDB77511765BDA6CD09B:71AFC5F59B95266F50DC494937A12423:\ +00000000000000000000000000000000 + +2548AF21AEEF8DFE3FF04DDF8B5B405A:E5B7287515DE852442E24D983A492AFD:\ +00000000000000000000000000000000 + +0DF7A17E3291AA86F4402E4FEEA5C611:C95A329A8D0C765919D8AC2658374D72:\ +00000000000000000000000000000000 + +D82CD8AB2BCD70DAB76C334B62FD46DC:64042CE2997637FD2501FA2275D094E4:\ +00000000000000000000000000000000 + +4B3AAC33855B8C2B67F298A99550066D:265D7119DC9EB745253F62C5B71E4BFF:\ +00000000000000000000000000000000 + +EF4DFC627069CF6E4F90F6605B9D7A72:F1FCDB6D6922794847BD591B395A6803:\ +00000000000000000000000000000000 + +4F401C4E26E5A7EBAEEB7C0B47CF770F:3381E7818CB696D62A72D3709296419B:\ +00000000000000000000000000000000 + +CBCE84F167FC5EFB3E9FB589DA7DEA76:45B39802476C6AD971B70D6DEE9EC64E:\ +00000000000000000000000000000000 + +429887390F9849375EA60D25BC41B4A6:4E5542591DD991B333CA1FA550368AE0:\ +00000000000000000000000000000000 + +59CCBA357AED070D53E97C07432F3FF2:77DB690B1FD2149F4C61E6CEC1967FCB:\ +00000000000000000000000000000000 + +F8B071CB7617A7AC837632B2E0393B47:20704383926600B03B22647D311A48E5:\ +00000000000000000000000000000000 + +9C5E9C47A7DE9438906878A1969E556D:C9AD815DF2EE5D6705F53E5FB57C4A8B:\ +00000000000000000000000000000000 + +335B50784CFBCF5EC5592470D8779CEA:A8D4489612DFED5F1E06A057DAC16D4E:\ +00000000000000000000000000000000 + +D5D3BFD6E8DC346925D458768045E7FF:B8B48D5A3D41D025F4BB4D0590FD8AAD:\ +00000000000000000000000000000000 + +06CFD19EB8ACA85331941A4C7F3BBF49:CEA1EB1D90A4CC5333EFB7EC0985278A:\ +00000000000000000000000000000000 + +4BD937898ED831811FA7EFE0885E41F9:7FA882D5AB9253E40897D9A02F634B8B:\ +00000000000000000000000000000000 + +64CC47590F6288969950876FAB92B506:E56FC52CB8680995DFCAC872C03198EB:\ +00000000000000000000000000000000 + +6875E36276E349CFCB56DF8E8F3F3A77:831207645E69DCF55F2EB06E7920ACBA:\ +00000000000000000000000000000000 + +5AB3E0CD4A7CCD85EB017E01D2A9E41C:1487AE58CD0547B8CDAC543ABD7A167F:\ +00000000000000000000000000000000 + +D6194FB4E11083575F1A321B1DE7C36B:90FA45F0B592E717B7FE674FDEAFD09C:\ +00000000000000000000000000000000 + +6B44AF3816BB543D52A72C8419247EC7:B27A4DC5B007C97A34A5A71E3F9948AA:\ +00000000000000000000000000000000 + +0C34F5F71974696A870143913E300002:AD09BF00D24EE0B36CC244DD2BBD3416:\ +00000000000000000000000000000000 + +9714F33B633228BD25873FDD8A748687:468D78EC6C9DB6331996A7148D7B8D0E:\ +00000000000000000000000000000000 + +B655B88BDEE3C192CA7E94C115155400:E6FF459DABE888DF3B8E3B0A4E03CD1B:\ +00000000000000000000000000000000 + +2E10337DDCC5AB4D9A47A7E11EE28819:5523C37014F6663C466549508680AD2B:\ +00000000000000000000000000000000 + +91DC264E08F890E673DA508130B22132:1F5A4FBEE2294C1E9AD13226CA316C8B:\ +00000000000000000000000000000000 + +5A961589B16BB11F43228C265A41F4F0:C41F0C276AF8840C1E40F7CDE2C9E703:\ +00000000000000000000000000000000 + +9279B9E8010A5D5A636A690F480689C1:0C0FE02E45C512FCFBE86186077B880C:\ +00000000000000000000000000000000 + +588FBCF959D31348507A315577077299:DADDB24A58CE1913C7E050BFBD6DB060:\ +00000000000000000000000000000000 + +2B7D25F58492426C7ED9676A234DAA73:EC6F70F88767324589B114D49A3D0435:\ +00000000000000000000000000000000 + +86265091666FA3CB492A6D0B89134FA7:1132BD6B7C2E314329B8C41B3591088F:\ +00000000000000000000000000000000 + +1D930835D9E22CBB1DC2B32D760B5212:B0FDC9C797ADFC372A32C90E780A18AA:\ +00000000000000000000000000000000 + +99488407CD0E84B85BD54A4208D9E74A:2D702A81CA33FC44E78423F7CA3579CC:\ +00000000000000000000000000000000 + +2A2D29555BD65B655F4C351B6CA77F9F:AEAEA1C6D2752DEB743828BE4FD5164E:\ +00000000000000000000000000000000 + +4130B6271FF1AC8B2E80D7358BC0010A:4A93D8F4A10503D03B61D028142B7317:\ +00000000000000000000000000000000 + +78BBC849A8E335A3C50F03ACFDB40A0C:CFC2F763D9A43797D7B554B31818B00D:\ +00000000000000000000000000000000 + +15F7DD0F5AAB45D18CE3FC22E2E0D7A7:B53C28497405CC58DB87E5B036D7A09F:\ +00000000000000000000000000000000 + +B70975EBBFF142F85BF7A7C46FA969FD:B1F6FF9DA37954AC1CE21F87130DE8E9:\ +00000000000000000000000000000000 + +682F741F13133286E864170D3423F016:406918CEB508D45A0BF1DAE0936AB561:\ +00000000000000000000000000000000 + +3FA4581C08D59B03776031143357AC6B:27E92647DD1A9B830FACFB746A8EA4A3:\ +00000000000000000000000000000000 + +D8BAEF6AC40C0656D5E9D99AB7F422F0:3BBB779C4310EC11923976AC5ADA20F2:\ +00000000000000000000000000000000 + +18C8BFE83B9C5E73E17EA3CB0FFE35F3:31A3694FAA9166C155CF659E222B6CD8:\ +00000000000000000000000000000000 + +02178D030AA8FB92095B8D773750BB29:1B56685208E68A64CB98C2EB8FD269E6:\ +00000000000000000000000000000000 + +C4CFCF7F00A5890089F3E2E6D4A71B4A:33A0170AFE4B9054A68646C79D5F7E06:\ +00000000000000000000000000000000 + +7B3DAD4BEC66EBEAEA116A09F1C7810E:34FA87844A31FEE5E4BC5A45B2025FFA:\ +00000000000000000000000000000000 + +E6B59BD0BE313076624A7F27B431D394:A8FD8E9567EA205B33BA60B7FD3713F1:\ +00000000000000000000000000000000 + +C806EDD853EABF4ABA609D2302B5A4A4:9FCEE6BAAA491D95905D114A21EA0586:\ +00000000000000000000000000000000 + +530C29591F1EB65C53B66621D815294D:43C79D90E33D1D2B5790B515D202C79D:\ +00000000000000000000000000000000 + +45480830977917AD000A73B062730761:D8FCA5649A8DDF403409C7B20E49EF30:\ +00000000000000000000000000000000 + +3C73226C97B0B6A6F199C5B9EA4936F9:244CA0E37F5CA9ABAEF1E316016B0273:\ +00000000000000000000000000000000 + +759A68CB477B3C4677B591E4490F6F66:DADC95A4CF085B656FB8A247270C6CBD:\ +00000000000000000000000000000000 + +31295A526C3ABDEDA7CD2B4C4EAC18AF:D8FF5475210EB64CE418EBB062A2AC9C:\ +00000000000000000000000000000000 + +90E6839484DB6BAB6ABD1A1C4B3F5097:E0B100775EBE4EE6CDE976AF97F7E67C:\ +00000000000000000000000000000000 + +A77E0B16C5C8AC7DCAC28EF2A377C749:2326C55E35CB224F2916B76D25DAB006:\ +00000000000000000000000000000000 + +473DE39D6CBED119488590D147A050DE:D45FE4E35DD7E7E8F9C1BE95A3E9AB99:\ +00000000000000000000000000000000 + +8EDEBB741BE502D3D71F6EB76588D43D:6C85C0C1989880CD89519E5D0F24D2D4:\ +00000000000000000000000000000000 + +BD77E505D265E0694E18F0DD27614AFC:95345EADB67814C36CB333178F1E6385:\ +00000000000000000000000000000000 + +FFBDD477A86FA149AABF241A6875F2BF:F7978D6E572A04C5301B4784E96E85C5:\ +00000000000000000000000000000000 + +878FD448E7DD0A988F3E14BA24A873C7:F5D13F5045698167AC816AD85D08CB68:\ +00000000000000000000000000000000 + +4724D176D8301A560D9F629C43EF0631:CDCA92D92C0C13944D85AAF6342EE16C:\ +00000000000000000000000000000000 + +92DDE5DCCF0B92737200C96A7FC2980C:984340AE315F1E35ED7B4D64E7C2109C:\ +00000000000000000000000000000000 + +D0D5CDFD07003A970D866E9AEBCE49B2:D29523676BFF8722E8E7D4E27ECB7BDF:\ +00000000000000000000000000000000 + +16D71101E006335AE4EA841B01EDF8EC:9DC42A4574CF4689B1A579B6058A72B1:\ +00000000000000000000000000000000 + +57263798FAFFB2D1937ED13E9F75F6A6:63D7927C182B59693C7619502C7F09A6:\ +00000000000000000000000000000000 + +1E06BC75D5473C2E2E214B794722D8EB:FF4445966B84099830C2C4AF3D16C2B3:\ +00000000000000000000000000000000 + +5B0873294D3044BFC3547C58AA7EDFE4:293FE32A6E13E78417E60C2AC673E908:\ +00000000000000000000000000000000 + +48B51CD888F14526A701EA3B7686A926:C600CE6D9925A7F29CBDEA5F86EB3968:\ +00000000000000000000000000000000 + +54DD519813388689F773FA12DBF09E37:7988CC0311DB4DB779342F1CD9C69CB1:\ +00000000000000000000000000000000 + +7DFC43D180470BFAB6970E619CDF4489:1E2BF65651E3D2F4FC43E6B8E60C2EDB:\ +00000000000000000000000000000000 + +ED3A0A72AFD441AE48CA0E80F5CAFA99:BBC9EEC98F2F3EB38CE8C3A534AE08FC:\ +00000000000000000000000000000000 + +9AA5D6C7CFA410FB74D753D3C329D5F6:C90111B9CB525A91F9EAFD987357934B:\ +00000000000000000000000000000000 + +A254B55BE1A577D34CFAC4967C67E3EE:632D34BE39094B67B3A5CD0651294626:\ +00000000000000000000000000000000 + +9FBE68B5013190B559D8488D1D18EEC3:E564E92FC5724970CAFE238F39498DA2:\ +00000000000000000000000000000000 + +3D0E0B9BDC3613B8818CE559748EB180:E682F9AA990E90424FB62BEEB9A87669:\ +00000000000000000000000000000000 + +23504A5F517D06CFBD6A6CD35A7C6F53:7B95F58B6C101AC54526A1C844D2233C:\ +00000000000000000000000000000000 + +C3A79D45029979CAAE2B80944CB46381:1E067070C2DFE6FDA961250EBB0904DB:\ +00000000000000000000000000000000 + +C47FCAC34AD3B94C3C14B1B05E4C4E8C:A661F602ED2B08E4A67605608AFC8485:\ +00000000000000000000000000000000 + +30E235BBE9548847BC9FFFCB356DCAE5:B2E14131FF6A7043B944DD4C299F9AD6:\ +00000000000000000000000000000000 + +309CECD7E237BF2BDA45F780B2106414:A2B8FF6B6A4F6C8AD3E5ACEAACE028E4:\ +00000000000000000000000000000000 + +76D0AF5DF7E20CC6462A16826EB2A65C:58621016906E05D0644A1315F117707B:\ +00000000000000000000000000000000 + +FE8372E4F0E4E733B16F7284C9928C2C:CD96F8F422D51EFB6451D1C8BC039464:\ +00000000000000000000000000000000 + +B01E5DB74E62A0115812DD8CD93B8823:B2EAA3CA7F51B22456A9DA1DD31F63E4:\ +00000000000000000000000000000000 + +2EE4409B33787E6C88625E25C66B693F:103044B5227E28AA2C33D537D69165CC:\ +00000000000000000000000000000000 + +3F23DF226924DD9E3426035EFF30F285:4D9FDA109583D3611B560CBA61E4CC9B:\ +00000000000000000000000000000000 + +96F02851CC614DE4560AD8DB80237601:104B264BA70B885E1BA6A8150EA83B1B:\ +00000000000000000000000000000000 + +CA428A790029D7F4AD63E19CEAFABEB1:FF9D67EC4DD1ABB5ACD03567298F5A3D:\ +00000000000000000000000000000000 + +F461D29B4120E93DA0E59C89A01CDFC1:6F3C9F8E5DC2D724436F3236C6616D33:\ +00000000000000000000000000000000 + +654A6C8DC762FCA2B308F7CD8A8FB066:7ACAA703CDAA690F749A0BEB9E4B871B:\ +00000000000000000000000000000000 + +B037B6F04D8F2F9478AB4A206EAAE041:DD3410E458F7F7B58EB1E491C39CDF84:\ +00000000000000000000000000000000 + +641739E7AC8221F13A6430283CCA424D:279F7F9E6F090C5CAC5B17EAC662AD38:\ +00000000000000000000000000000000 + +2634969CE81073EF9A69FE3B71936057:8061C87922DD5CDBD3AC6E37391F52C2:\ +00000000000000000000000000000000 + +BBCFEC986F23B9697354BB39A8481DD5:EF453D6F902687D29B9C6AC8394F9229:\ +00000000000000000000000000000000 + +DB2C55A7BB7D0C67BEBACFA60239FF5E:054788911085F32DE12FE3C0D6A2A5C7:\ +00000000000000000000000000000000 + +4DDBE332134ECB725A9450E5BF5CB187:37F645A215E8350746108086F428F64A:\ +00000000000000000000000000000000 + +256FDA74A1F7DDC78A0735AC5BF4B8EC:37F645A215E83507B9EF7F790BD709B5:\ +00000000000000000000000000000000 + +496F0D60F09C3322F2AC1414CD32834C:37F645A2EA17CAF8B9EF7F790BD709B5:\ +00000000000000000000000000000000 + +4DEBBD2461C99EDD3BB3C3CBF415DA07:C809BA5D15E8350746108086F428F64A:\ +00000000000000000000000000000000 + +D1B3A0FCE628A7653B62E11724FF534F:C809BA5DEA17CAF8B9EF7F790BD709B5:\ +00000000000000000000000000000000 + +DC77BDEC8DB018A61688F61EC5DA3F72:C809BA5D15E83507461080860BD709B5:\ +00000000000000000000000000000000 + +6F878A0A25A34ADB37459BA9AA864169:C809BA5DEA17CAF846108086F428F64A:\ +00000000000000000000000000000000 + +C97D56C65C479B6A3C98032FCB30D327:37F645A2EA17CAF8461080860BD709B5:\ +00000000000000000000000000000000 + +CA7D368A299F613C8793C8B197C5B4AB:37F645A2EA17CAF8B9EF7F79F428F64A:\ +00000000000000000000000000000000 + +C81B7DDC7F57D9D5E4782FDB7FF24DC3:C809BA5D15E83507B9EF7F79F428F64A:\ +00000000000000000000000000000000 + +2ED61014612B71DED403559BAB7B3582:C809BA5D15E83507B9EF7F790BD709B5:\ +00000000000000000000000000000000 + +75E6A753077E01A99AE22C1641FFCE50:C809BA5DEA17CAF8461080860BD709B5:\ +00000000000000000000000000000000 + +B6405E813236600DC256134B92542CBE:37F645A215E83507461080860BD709B5:\ +00000000000000000000000000000000 + +2009F95CF623369018B643B06C8E3012:37F645A2EA17CAF846108086F428F64A:\ +00000000000000000000000000000000 + +7D03DB38DCE478EB8D3EF1E78C0388D5:37F645A215E83507B9EF7F79F428F64A:\ +00000000000000000000000000000000 + +F9165467CB794721F028CBE1ADAD3183:C809BA5DEA17CAF8B9EF7F79F428F64A:\ +00000000000000000000000000000000 + +D29D576FCEABA3A7ED9899F2927BD78E:130E353E1037C22405E8FAEFB2C3C3E9:\ +000000000000000000000000000000000000000000000000 + +2D62A890CEABA3A7ED9899F2927BD78E:AA2F3365C15EBDC02F2C4468BCB4E950:\ +000000000000000000000000000000000000000000000000 + +D29D576F31545C58ED9899F2927BD78E:1B4F0CF494AB7C5D850B8F88A025E5AF:\ +000000000000000000000000000000000000000000000000 + +2D62A89031545C58ED9899F2927BD78E:B98DD45724870D7B3B0532D9D07EE7AD:\ +000000000000000000000000000000000000000000000000 + +D29D576FCEABA3A71267660D927BD78E:CFFFA1BB54F8229F54E8B3D9E34710E1:\ +000000000000000000000000000000000000000000000000 + +2D62A890CEABA3A71267660D927BD78E:86C1ADC8B236AF043A118F13EBEEF15E:\ +000000000000000000000000000000000000000000000000 + +D29D576F31545C581267660D927BD78E:9064AA652AF016DD80AE3B3791502F63:\ +000000000000000000000000000000000000000000000000 + +2D62A89031545C581267660D927BD78E:131984E1FEEEBE8862E406E12B6D8CD9:\ +000000000000000000000000000000000000000000000000 + +D29D576FCEABA3A7ED9899F26D842871:D2E19BADECC2105CC8BF847075785184:\ +000000000000000000000000000000000000000000000000 + +2D62A890CEABA3A7ED9899F26D842871:9DD896881D2AA0A0B3F8D6C7BD057588:\ +000000000000000000000000000000000000000000000000 + +D29D576F31545C58ED9899F26D842871:416FC2C9B866CDC518476481F94D438A:\ +000000000000000000000000000000000000000000000000 + +2D62A89031545C58ED9899F26D842871:0AC42C6E7CB6A77F6F63A0660175C274:\ +000000000000000000000000000000000000000000000000 + +D29D576FCEABA3A71267660D6D842871:6E281CBD633696F0209E9C7326E49555:\ +000000000000000000000000000000000000000000000000 + +2D62A890CEABA3A71267660D6D842871:CB9B1CAD03C62AEDC359CC64CA0D8F85:\ +000000000000000000000000000000000000000000000000 + +D29D576F31545C581267660D6D842871:206369617D077201588ACF59463FC393:\ +000000000000000000000000000000000000000000000000 + +2D62A89031545C581267660D6D842871:7558A3AD44F85079E3FF9E60FE30D652:\ +000000000000000000000000000000000000000000000000 + +2AA28347376F4408FB7A29AEF0D05657:85B06641EF0DB99D153D9A9C9AEA1B24:\ +000000000000000000000000000000000000000000000000 + +C3364F3FA909A07410B75D8AE5BB65D0:BDB9EF83D8EB4ECB7C89FC7D491E5172:\ +000000000000000000000000000000000000000000000000 + +4CD9A151AAFB1BCB7BB75D6A9399FF7A:582C1174BA7B9FC276BF780A9A93567A:\ +000000000000000000000000000000000000000000000000 + +47B292F6AC508B53EF7A294E630D3322:FFF0E8A57D5FC4D34678DC62E95A226E:\ +000000000000000000000000000000000000000000000000 + +B3CDED6131EF45D99F48B827F4D95FD6:8C59577DC6B0C80FC97DD6E4D3DBFF88:\ +000000000000000000000000000000000000000000000000 + +D3447EBA470D665E8B7A33FC6FAF33F2:3DC9513EF47DC38E2154DA643544CC51:\ +000000000000000000000000000000000000000000000000 + +29493048AAD0130BE07A331C9390F63B:0FA6A8CF364435CC213F54F8773C87BE:\ +000000000000000000000000000000000000000000000000 + +DC3F5CACCC00BB778B48B8C79A196520:4826FD43F7F116D9201891F553FD556A:\ +000000000000000000000000000000000000000000000000 + +48F2A141203F740C7485CC0318D4982D:C20C38D1E7E25E25ED990326A1797488:\ +000000000000000000000000000000000000000000000000 + +C4B646BEA922A87460B747D86F6F802D:FE5C4361C70143F52C66A8E766692C87:\ +000000000000000000000000000000000000000000000000 + +2389837737FFDDC174B74738F662CEDF:3222B40C6BAC43150FC753F1E6EE3793:\ +000000000000000000000000000000000000000000000000 + +45329BB7AED08A421F85CCE36C2629E0:0F83C029C9B964789CA6668006F79DF8:\ +000000000000000000000000000000000000000000000000 + +2CC9394921BF75DDEF48A2751976987D:CD1702934609E17DE4DAE5188596E763:\ +000000000000000000000000000000000000000000000000 + +D66F7EEA40266E5E0485D6511F2F2021:DA6D2243BBBA3199169C51CA80B03BE6:\ +000000000000000000000000000000000000000000000000 + +BC4DE44037D4D5011085D6B1F4C0CE4F:30B9CDB6F185ED17DACAC0C4A377594B:\ +000000000000000000000000000000000000000000000000 + +DB145C3CCE80BA668448A295686689CC:B981920A5773E47347EAD2A82041F08A:\ +000000000000000000000000000000000000000000000000 + +251F428D867649A818246A6A5A89501C:15FF894626A6F8C6C9508A171BC1C661:\ +000000000000000000000000000000000000000000000000 + +A41144E37C63D88B89A8A4C961EAF166:A64D2728DD4CB4723C19326B293DEEBA:\ +000000000000000000000000000000000000000000000000 + +CFBD07846AFD2BA8E1AD63697DFAD335:7897147055D06DBA61866021D876D126:\ +000000000000000000000000000000000000000000000000 + +4D93A6438527BE295F94487DD084505E:F0363408AF7BF5BB057CC80E10954D2A:\ +000000000000000000000000000000000000000000000000 + +0855984A5B6C6C2E3ECEA329356575C3:161059A0D9DE6230B51EAA19BDC84CE9:\ +000000000000000000000000000000000000000000000000 + +7E979A12FBBFF7FBD96860F0FC64CE27:977C5DAFEA87FC36E92333151AB63C61:\ +000000000000000000000000000000000000000000000000 + +2088DC2D3E22E480ECFD9A6C76BA2AF7:E7DEF1020109FA00053579B665DDE397:\ +000000000000000000000000000000000000000000000000 + +B9A8E6AA4E2C99159690D6D204EBEFF0:9E9A02C1952FD2F4C2BE158C10718654:\ +000000000000000000000000000000000000000000000000 + +E8E06F34C44498900254EFD4F5C99D83:159A90193D7479E0203A929D701C421D:\ +000000000000000000000000000000000000000000000000 + +1ACE901C77B74E96ECE1462369D7F0B4:F2906FD2C3373B7F0FAC2213131067EF:\ +000000000000000000000000000000000000000000000000 + +4BF18736FB7021F610E4D7B76CF09F7C:D50E7103A0B29E33EB28D4C843F9557B:\ +000000000000000000000000000000000000000000000000 + +A76F8B6EB992AE14212A5C2C8809D314:76CC8905AE4B4BE31992E6CDD3F7EA81:\ +000000000000000000000000000000000000000000000000 + +10DC23B443D51E8F5B5D2F5CFEF9FBB3:A6E61F6CCFF0B2437B5BAB2688A73CEA:\ +000000000000000000000000000000000000000000000000 + +0F7FFE39F36C8983C922E3704005792F:0D9B7AC709073EDEB0B1A5FAD45DB084:\ +000000000000000000000000000000000000000000000000 + +8B564AA20FC6488302124D039EDA47BB:7FE01A5559DA077ABF385C8B4319B018:\ +000000000000000000000000000000000000000000000000 + +EA57D4B949E192A51D6414FCC8315C21:99450709D21B61589509EEE8A1C526E0:\ +000000000000000000000000000000000000000000000000 + +6108BC56C4CF3BFAEA642E8CCEDD31D2:3040BA7E08D60C8E771B97E250DA4413:\ +000000000000000000000000000000000000000000000000 + +F1D159B48C2F6C238CB3D003AB0A5415:4A347C9EEBBBB7E28E41005AD5BD24FC:\ +000000000000000000000000000000000000000000000000 + +DD99B08C18904D3811F2744AA644D76D:D7EBD7E0AA443E92279BA4E1192DD91D:\ +000000000000000000000000000000000000000000000000 + +F0BF4544145EFB3231E6E6F6CA175912:97F37A9A6FF5101A7FE95F2678DAB6BE:\ +000000000000000000000000000000000000000000000000 + +9F7B7744EEA8DF923366EE86AE497E69:50191B99DD8B691B2C17C26D98885E5B:\ +000000000000000000000000000000000000000000000000 + +6177CA790CC736AAF8251290C2E9E43A:1717E23B04BFC70516E37A850454418F:\ +000000000000000000000000000000000000000000000000 + +E2A7016FF930F70A8C8FDF25F762FD3D:D416724A7A3F4F81288D068797744CC7:\ +000000000000000000000000000000000000000000000000 + +DCA2BC2308B05927DC6AAED1026B3CEE:318C4B212A74330C9D61F4D852D5C593:\ +000000000000000000000000000000000000000000000000 + +B6379A7CE597E1295E4354D972B803E0:AF63C3F2FB2065A8C31A755038F2311B:\ +000000000000000000000000000000000000000000000000 + +20BB84964CEA329371C8D6C19B7BBB79:B63FA7A265E7C7E5140B486B424257B2:\ +000000000000000000000000000000000000000000000000 + +757D5E6A90375777C0592A1F16582FE0:87A64BABED1F66786FD3E56154FC6DDF:\ +000000000000000000000000000000000000000000000000 + +B6857322EEB6DCFDA73DE5D43084B7A7:00C805A381A39058F9D427B9DC8960D0:\ +000000000000000000000000000000000000000000000000 + +588AA36DDF8829787F5F0945D5A02C3D:1ABE11DC97F23734109997AF3849F545:\ +000000000000000000000000000000000000000000000000 + +CA831237C45F4E8B8A98BE757DC21106:BE727CDD9C8B5027079C75C6DD5D2011:\ +000000000000000000000000000000000000000000000000 + +C497A25D8F03792631E27277393126F9:A29DBEF99AB979FED40C265BF868EBA8:\ +000000000000000000000000000000000000000000000000 + +A2B91FE5763FF97A4E9499F53F451D78:19B56E4B04C7B06B96CB5ABD6627E469:\ +000000000000000000000000000000000000000000000000 + +ECA39A1D3B9D8EBC98EB34CDE71D03D7:D34A3718F58614D409633113C7739F18:\ +000000000000000000000000000000000000000000000000 + +440045B4B13351971BC409404163D96B:8DD3A711A1D3335A40F499461FFD1ECB:\ +000000000000000000000000000000000000000000000000 + +D631221F472CEF76BBA73CB2364EDD57:4AE664EE759660FD647AD11E2B5FF593:\ +000000000000000000000000000000000000000000000000 + +635066186DB6086FBF2A4D1C7CF85DB7:3E71A02D9C753FFD8C58928A4560ECE0:\ +000000000000000000000000000000000000000000000000 + +22924658C1BAC38B196F4852A1C35B1E:8FABCD731E720D0F464BFAF7313CC1D3:\ +000000000000000000000000000000000000000000000000 + +AECD1159645242EB40231C45299B02EE:779288EF5750161A8E9948110C27D783:\ +000000000000000000000000000000000000000000000000 + +AC622AAC79017DFDA35CF4602C049C7B:28A10079A7B447A0DE8894F37B1BDB51:\ +000000000000000000000000000000000000000000000000 + +AE75A80D6CE8CFFB41D50E09EE65C822:0FABA3FD30BE980728B74B2BE0FF3543:\ +000000000000000000000000000000000000000000000000 + +B507365EE27C856FF499D825F3DD57D1:494C5A82A6599FF269D028051D8E4677:\ +000000000000000000000000000000000000000000000000 + +268E8157AEFB28F3F5A402922A5B08B0:B2913443BF4AB448CE42C297ED78018F:\ +000000000000000000000000000000000000000000000000 + +B03EF1E97D2A85DEFE6E90EBDD13F37A:E3878C6C42A16C388E55C4732B038416:\ +000000000000000000000000000000000000000000000000 + +5279D8401CD4C4AB27EAA22BABDA41DA:721EDA4C877B3C3611A9DA63AF911187:\ +000000000000000000000000000000000000000000000000 + +F2DEAE70705494F49E30168A4EF5638A:461B74D6D552DF6DF118ACF76393FAE5:\ +000000000000000000000000000000000000000000000000 + +61A08772900C83DE53749BA15ADFF518:6C491853745F4DB0C60D22DDDA608C1D:\ +000000000000000000000000000000000000000000000000 + +9D3929D6A80F57E8117E5B48FEDCC826:BAF62E1A26F7C78A7CB9DAC0E13A30FE:\ +000000000000000000000000000000000000000000000000 + +F85E31DDB8119F09A45EC30DB408DF05:59F7FE1CF6A3D7970E86574A619C516B:\ +000000000000000000000000000000000000000000000000 + +20966FEB0CE93ABD78B24A971821FC88:87447915C9F4D8418B2A2CD727B2F8CD:\ +000000000000000000000000000000000000000000000000 + +811450001E41F56394B9396743E3AF5F:9A460C28AA950C3D051A1F4EC1395CFE:\ +000000000000000000000000000000000000000000000000 + +56E3EC3B5A911A0793244F86CA729575:BDBECBA37F3ED6B2D80CD257A498344F:\ +000000000000000000000000000000000000000000000000 + +E81CAD94E521E9587A2D34669DD6C1AE:2D3FDF1C7C9F289D9ABAF6ECAE097CD4:\ +000000000000000000000000000000000000000000000000 + +CF979E26135DF59109720CA19BF3B9E0:1A5A43E548E0AF0391BADDFB01B47491:\ +000000000000000000000000000000000000000000000000 + +988BB4391697D4E693CC56185111ECF2:4973A5292E8BD63B1ECEA06851E439E4:\ +000000000000000000000000000000000000000000000000 + +3DB27FFFA1DBF9E3E653B788D193EA35:A6FC7C9F947EA17AAE4AD69543134E18:\ +000000000000000000000000000000000000000000000000 + +8BEBAF0A458CFBA90DE4FD329CE63109:63371B4D2428C76F8AF15BFD9826926D:\ +000000000000000000000000000000000000000000000000 + +4FB2853762D073FE806557B78C43A7D1:F2D1D1382F2AD7E282E35EDB448E37C7:\ +000000000000000000000000000000000000000000000000 + +F20AFEFE0129D6F3BFDBD788607ED22C:E63EA278E9B563297E28FC4B7B9E9433:\ +000000000000000000000000000000000000000000000000 + +0039D613D42DD869852E44126EBF9E37:6BFC746FC94BDA3001563D9DFAFC8DF5:\ +000000000000000000000000000000000000000000000000 + +D56E96E8B632A136C0755ABBE4EB8BD5:FDBCAAF131A5B6BDCB44E5C0EBFAA95E:\ +000000000000000000000000000000000000000000000000 + +387B2F9C8170A96FBC39C799FBD10AD1:DB5A7AF7DFD5325816F179F3D4C3BB5E:\ +000000000000000000000000000000000000000000000000 + +A7D65BC6962E99557AE83A96D567CFE9:3697BCB9CA432CF0FBDF8D29828D4776:\ +000000000000000000000000000000000000000000000000 + +3DBA3171F0DA3FE61B8F8D8D816D5BC8:00FA60B941E72EE4ABD7EDA5383BAFED:\ +000000000000000000000000000000000000000000000000 + +7016B5A26F566A0CB68113E7A54BBBEB:FB2534D13C44CF6473951E2396BD58D6:\ +000000000000000000000000000000000000000000000000 + +7F7D76163F7950DB54F16AF542DECEDB:74D872081B6416D5B9ADF355BBC4E906:\ +000000000000000000000000000000000000000000000000 + +E01F64B3E818C3571FC763F021595967:C3936315C0A5FFF0AE1F1743CFB9E798:\ +000000000000000000000000000000000000000000000000 + +9F8A86DDE688776ED80FC3D6E027263B:06E080332D9615AC4B38436898467388:\ +000000000000000000000000000000000000000000000000 + +4E4E722951A5D8398E2B24F5AF54BD9E:2FA6664CA53746DA02BA0A19AC6C7D7F:\ +000000000000000000000000000000000000000000000000 + +54082FD1EFC1377E65C3584BFBAEBA17:C51BB0BD10E1D5525C8A301F7986CA40:\ +000000000000000000000000000000000000000000000000 + +D685123436C51E2F904585E72A558536:003BBBD56A684F05FAC588BEE6103107:\ +000000000000000000000000000000000000000000000000 + +CDBB0B021BD09745B6E3765DA81D7BB7:DF25CE6873E63365EC17B1E4F71713AB:\ +000000000000000000000000000000000000000000000000 + +D8BB6CB4C5EC462A7040D05761A821CF:1EF3FAF8757B5864A66392F43ED39C07:\ +000000000000000000000000000000000000000000000000 + +F2637A24ED6B1F3C6EF73083E4930011:39B487DE02F1603CE782716764699656:\ +000000000000000000000000000000000000000000000000 + +8EC4C1D2904C081A3B862C1515D0A283:2DB7FC96FA3D8A2B699FF9743E98B14B:\ +000000000000000000000000000000000000000000000000 + +CC976840C38ED63DEA1FB489261AB22D:28822ED55A22A29250F4A907A7773241:\ +000000000000000000000000000000000000000000000000 + +D10AA53F75B4D56E23E43543ACB2D3D9:73DB1D32049070D84F3292441541384C:\ +000000000000000000000000000000000000000000000000 + +42FAA774A6DB89F1422568D285750740:DE2D4B4F521C16F51D35B8E6C439890D:\ +000000000000000000000000000000000000000000000000 + +E8AE2A5BD6F41780D4B78F5A7415BA59:6B83483EFC57408D6208286C8AED37B1:\ +000000000000000000000000000000000000000000000000 + +0C6F220776A021AAFEDD1A5C1DB181CA:AD8FA2C34414A132F8073EBA3AE01C60:\ +000000000000000000000000000000000000000000000000 + +674367222CF0E6BFD42D6E904F713DC5:D3C5B5122DDA26BAC7060BF154FD60BE:\ +000000000000000000000000000000000000000000000000 + +F19CCE49F2AEA18319BAC29EAFC488CE:D73936AEF70D532E6C3270DB25058A4A:\ +000000000000000000000000000000000000000000000000 + +A02A4E2E535E32179BD3F4D688608736:A98D0271136AF568324BB8D0E92340C5:\ +000000000000000000000000000000000000000000000000 + +D4415FF1F2CD21C9CDCE175A238DA910:8124ACE84AB38E910FDED0F6752B5FAB:\ +000000000000000000000000000000000000000000000000 + +23FDE6972BD5D652976B1979D5E0D2D5:E43483B9CD70F3DCA6C839FEB194A087:\ +000000000000000000000000000000000000000000000000 + +6FC7112407890BEE9B1E58BBF5B19975:BACB0D14AF9E54B2A7C629AEFA64DD1C:\ +000000000000000000000000000000000000000000000000 + +B63A8BF5D34915873DD16A95AECAF26C:302FCA7B0EDB37847638E24CA5808A3D:\ +000000000000000000000000000000000000000000000000 + +D3FE2ACCDFFCDFF50165F67CC09A1D9A:2780C756862629A8C4E2629FD8E466D9:\ +000000000000000000000000000000000000000000000000 + +254E34BE13C63EE93A24883136AFC0C1:B960C333FB15DB2C6580553B13C23AD1:\ +000000000000000000000000000000000000000000000000 + +035302572B10D5C1B241C87F2D913DCA:9C0933C24C086E48DFD3F419590BBE92:\ +000000000000000000000000000000000000000000000000 + +3EC84DA124E166438536E49B5C267091:6150B4873F1CBC7A6E9056F9D95076A6:\ +000000000000000000000000000000000000000000000000 + +8D472DAA240C21E278E342DC3268E561:AC5C5E7CF34D7865C3851E663FCE23DC:\ +000000000000000000000000000000000000000000000000 + +1EAB4C77EC179FBF9886F9A6858BD9F1:BD0526FB9929EBFF0B573EB93A940D32:\ +000000000000000000000000000000000000000000000000 + +8F25610DE1E324C8C0B9A91124340FBF:94C5E9A383766B03C22D577741BADAE0:\ +000000000000000000000000000000000000000000000000 + +B881A04004053C745AEE2A972265F896:CD3AC08893681BC57374BF3B2F14886F:\ +000000000000000000000000000000000000000000000000 + +9B6E88AF654C8F52EB441B32813E0F67:6CA75A746D588111CDF5AA42860FD7A1:\ +000000000000000000000000000000000000000000000000 + +08F16B4A01B2B6E4D3FB678AF52944CA:ADFCF161051EDC05C3850A42DC4B8C0F:\ +000000000000000000000000000000000000000000000000 + +4B06EDC67571EA79C1186766AEA4539E:FD98A23A6A872F2C2FE88071536E4F41:\ +000000000000000000000000000000000000000000000000 + +12F8F459A9A93DCE3EB6216820CCA233:D87C6BDCC6489B73BC826A54D3ACD17F:\ +000000000000000000000000000000000000000000000000 + +848A797493A75023D7EE5D9C96E1D956:8A22AA964363CB8F63E42EC7B7A549D3:\ +000000000000000000000000000000000000000000000000 + +35315C163A9127E505462C6E1C1D7890:6D86A01BB28C174BB8A9E14BCCD1B0FE:\ +000000000000000000000000000000000000000000000000 + +695D6C7903BAE992AD6949AB85F5A65F:F93A2EF60CF4AC550C723E72644BDFAD:\ +000000000000000000000000000000000000000000000000 + +6032DC62A65400CB70CAC882A17B5E95:97EA0E405C1FCE63DF66BB3C23560A0E:\ +000000000000000000000000000000000000000000000000 + +5C94B77B9EF22A4F3DFB5407E8C381AD:2DEA5CBE120630FA88DA6D46D288635E:\ +000000000000000000000000000000000000000000000000 + +F95F347A4D7A5C292620B07318BFF803:B387D8D91C6478BCA022A658FF4DB0EB:\ +000000000000000000000000000000000000000000000000 + +9577B41BE7D1A8587E3E27A1389DC9FB:ED74B4EB542C5B3A0D760299E69E5EC3:\ +000000000000000000000000000000000000000000000000 + +3DF28E3798BD98984F6DB950D6A1F948:8052BA88E81C87D8CF2CA22550A63B02:\ +000000000000000000000000000000000000000000000000 + +AB2773E217A7A6A6859698D5D393B2DB:474A37DE739FFCCF31897B4B66B8C892:\ +000000000000000000000000000000000000000000000000 + +060203EFD452FE6E4B9D29861F9B4562:472C3FA987FBB35DF3AF43C75E721E51:\ +000000000000000000000000000000000000000000000000 + +31995CCFFE329932F121EF8BA410A4FD:436B187F3A7D51E2036DC53E517F1777:\ +000000000000000000000000000000000000000000000000 + +A53625472349DE047005DAF198953590:960F173B6EEA02CAC4EC3651B2FC47DB:\ +000000000000000000000000000000000000000000000000 + +8EACBB7BE93D3070B0FA7CABB3045DA8:EC276626BF1B0C436AB5276471372D14:\ +000000000000000000000000000000000000000000000000 + +A965390450D42F7B74316A1EB1FCC329:C1488FFBBAA5C85DE16E98BC343660DE:\ +000000000000000000000000000000000000000000000000 + +36E2AF37370B07EE5DB106B49D5C966B:86CC23C3B66ECDB59580BEE1853D61B8:\ +000000000000000000000000000000000000000000000000 + +BE36B7425D6D812A9D655320D09EC22E:74B4C41C28D26D9D1C0CF16403EDEFE2:\ +000000000000000000000000000000000000000000000000 + +67E19E7A5E0E26A0023DE95AF1B8B4BF:1BAA2706D5EE6C5BD1DF8291978C6EE7:\ +000000000000000000000000000000000000000000000000 + +0148F25E6860D5FD6DB4FF4A10C41920:EEC71F999D856B480FDC9524D4C298DB:\ +000000000000000000000000000000000000000000000000 + +8CC2AE04A5292E56074FB6AE2109DF46:6FF3AFEB3C79A2B2B19B7936A6B81600:\ +000000000000000000000000000000000000000000000000 + +20D8712AE3DA248760736A180B30BEC6:74E4C190E3BDCE13483FB05A6B8FF5C5:\ +000000000000000000000000000000000000000000000000 + +28291211012AF1AEA64D60E24A575673:849CC6B59E21442804A0E5ED1A01037D:\ +000000000000000000000000000000000000000000000000 + +C34EC4029E4F5E93439331CA923C2864:D1746E215BF29A66A432C5223C060D83:\ +000000000000000000000000000000000000000000000000 + +D7B54854F36F44DB71546494C405DEB8:C4D45430420585B661C4F43DFF5F0551:\ +000000000000000000000000000000000000000000000000 + +1225585CD18C7ED26A1CE1576A4283B4:7502910B1835ADC0A724DAF5516308D3:\ +000000000000000000000000000000000000000000000000 + +E3D02564C06455E162626EBCDBEC43EE:11DA0573D7D34A586DA61A7A5C10849F:\ +000000000000000000000000000000000000000000000000 + +A9ED28B26B20D83CF33A97ADB8D181E6:B47F3027D742CA4C9BCF77AA141BA2C3:\ +000000000000000000000000000000000000000000000000 + +D142B008C4764EAA88741D0DB54FEF8E:DDF748FD2373918FA25C4FE5D6E12656:\ +000000000000000000000000000000000000000000000000 + +E568167CDC7D3BEBB3807039E34E10E2:BDB5EAC47BE80B077ED50625611EBD18:\ +000000000000000000000000000000000000000000000000 + +7323AC95F39146CFDF6AA6BB8E9ACF90:F1E53F5E1B0AD9848DB4E3C3D3741263:\ +000000000000000000000000000000000000000000000000 + +BA541AA170450D7C45F8D23FD587E34F:19331E5217357CB4DEBAA80AA5B44D92:\ +000000000000000000000000000000000000000000000000 + +E603E348D083C0F0D0188E0E820BF797:2D691AEBFD51C5D26B13E33EAEE3B39A:\ +000000000000000000000000000000000000000000000000 + +5AD31409A42464B3F085A2DD5A6FC292:63E8E939E52066EC0E4E074FE60D90CC:\ +000000000000000000000000000000000000000000000000 + +D9C52B6DCC49BB59B9C3BD13FC88D018:A7563FD915814534A1963662BC900EC0:\ +000000000000000000000000000000000000000000000000 + +3014518A77A1D8F9D103327F2BCDBE6B:59D93945A6467D215044EC49945B78AF:\ +000000000000000000000000000000000000000000000000 + +5D4F53FCD6D41EA616F140C12B9E41CF:E8D7F3AA8DFC265001CEFB78733DF426:\ +000000000000000000000000000000000000000000000000 + +E30ACA76182B1334FE2A4F5AF0C30BA5:C868972B54F73779BF62CDFC25722AD2:\ +000000000000000000000000000000000000000000000000 + +A04A0A22C20E262C1B6485E406E65994:32A175FD6789524837157A176F40EFFB:\ +000000000000000000000000000000000000000000000000 + +B6110B7A92475C3B366C403450488061:88DAE0307CCE2C38EE584F7149BFEF73:\ +000000000000000000000000000000000000000000000000 + +8C5DF59EDDB12710BA47507F6768F113:D44C9FA99132D411EDE37ECC252588D8:\ +000000000000000000000000000000000000000000000000 + +17C385D013346587A677DD56DA0CDFED:C10C3EABB30C69F9CD9554936FDE40D2:\ +000000000000000000000000000000000000000000000000 + +6E43A132D96EC1F7DFEEBA445FE716D7:911BF5A6631536B39D1FA011F9FE1E73:\ +000000000000000000000000000000000000000000000000 + +EA2733E8A42B18E0E57A85ABFFECA103:1747BF3F04B97A431D63AB6130B7E344:\ +000000000000000000000000000000000000000000000000 + +57CD8F9A4ECCD9884243F834D9967BCF:8F33B6E4C39738C7D4FAC92D93D52228:\ +000000000000000000000000000000000000000000000000 + +6623207CF0803C1BFA605D269A003C64:8534BE7C6BCA0155FCF418CCCB5AC81E:\ +000000000000000000000000000000000000000000000000 + +76568B603BAC1CD646C34E61A638D7B7:53F6786EE1504317243EEA24CB5DA9E9:\ +000000000000000000000000000000000000000000000000 + +841E33C6C4F92AF4443A43EC49243068:FD32E3EC516B77437B4517778BE90D90:\ +000000000000000000000000000000000000000000000000 + +1097C11A9ECF04D2DE9F8F8994E0BAED:143401E20D3E6D97DFDDCA7A8DA456B0:\ +000000000000000000000000000000000000000000000000 + +8D520BE244CA4260ECF38B81C428E1ED:701B82F492B01FC3F56A102072A66FB6:\ +000000000000000000000000000000000000000000000000 + +A09BE54496E26257925A3F8B737A77C4:D2276D31749C2F4A79C1ADA50D242D2E:\ +000000000000000000000000000000000000000000000000 + +AE1463F6200666D99837D4C3458E29F7:4BEC3FE34560EE2F3FB88C1B19928D71:\ +000000000000000000000000000000000000000000000000 + +870AFEA6425FA0477F3758F9AC81B5BF:3B9A6B224CCD2A34B3CFFA8F20A32B33:\ +000000000000000000000000000000000000000000000000 + +452857F43E0EF30BBA8DF975B92C67CA:650B79ED8814D9D5B9F40DB20B6E54FF:\ +000000000000000000000000000000000000000000000000 + +3EA662143061F27044295712919D8CFF:3FF60CF2D0F12F3069959A17FD2FA52C:\ +000000000000000000000000000000000000000000000000 + +3710720E6BCC9D67B51A990020E50E9A:AB064628EAFEFD04B7D483507A3D5F27:\ +000000000000000000000000000000000000000000000000 + +CECD711FA3B66CEA1639E7DB0A36CB5B:219C9187FFD71770C717E3CC872A410F:\ +000000000000000000000000000000000000000000000000 + +1A06CF5B4E4D9C055D017DBBFFB17493:DB2B632CED6EF0CA69B0DBF90CFDEC3F:\ +000000000000000000000000000000000000000000000000 + +C9403D0FC547D44DB2A12BC26E549B12:34746770542734BD56CC54C3BA77DE05:\ +000000000000000000000000000000000000000000000000 + +69E6239629F6BAB3ACAA41D3CF63AE2F:68ABC2D6D0155ACF7398751A4263FFE1:\ +000000000000000000000000000000000000000000000000 + +CDF3A23AED45A5CC0977FC492D78D769:0155284B425712C5662BA85DD1AA9C00:\ +000000000000000000000000000000000000000000000000 + +38947A6BCB9EEB2349CC7982CC988A3B:487705205D9C054B278A1A77154DC444:\ +000000000000000000000000000000000000000000000000 + +D21A1763007D050CDDB3D3000CDA18DD:E4BDBAA0BD0799643147BE9A72C2C28E:\ +000000000000000000000000000000000000000000000000 + +D86E349D4F8BACC0CD204D86485AF372:690C9CD71586F0E707A6747CDCE14BD9:\ +000000000000000000000000000000000000000000000000 + +2F3A9E1E90111694A5D874B72A725627:485BB4E6C8EADCC1DC8F33CC83C56DF7:\ +000000000000000000000000000000000000000000000000 + +BF6397D9E8C5D0F7D537D17CDD094C56:5DC5509BE381271A892F73AD2B17459E:\ +000000000000000000000000000000000000000000000000 + +0C8EEF7E5C26A11E13F3B332C78240E9:FE7F7B03809161699B20C91AC71388F0:\ +000000000000000000000000000000000000000000000000 + +3708A3370D457D498BE3B36C6628C450:5ECD46E61E9EE1504928AF23DE58B417:\ +000000000000000000000000000000000000000000000000 + +7A984BD4A80E2495C7A64107DBD1E5D8:529EC6E2DF4B601050BDAB98466FCD47:\ +000000000000000000000000000000000000000000000000 + +E00C27A4F32C3C1FD220FD3B7B2E7251:DE00F2AA4BC9B34A187780D1D6998873:\ +000000000000000000000000000000000000000000000000 + +C9EED5E1F515E97E393E00476F291ECE:81369529646A657A4C6BF7BDAB9D2780:\ +000000000000000000000000000000000000000000000000 + +D91189059CAA6B0C4E95E7485D7A73AA:F6D1EC1368832C038AF24FF17C523D8E:\ +000000000000000000000000000000000000000000000000 + +B0824A7A86F5EFCEBFC3EFBAD4445FE2:E4122EA5B2375D306C7A86C5486F6AD5:\ +000000000000000000000000000000000000000000000000 + +7FEF47A756D245B1B5E1CC43EB9D961F:537822C6708654C63740F2EF1DFA1B57:\ +000000000000000000000000000000000000000000000000 + +714B564D133054E286CCF3F7B4DDA373:D611B6FA3C70454B618CE723D70DB96A:\ +000000000000000000000000000000000000000000000000 + +67EEC672093ECB5C0067565FF315B57D:BCDDB2993D6694EA14CBD3DBA5D72054:\ +000000000000000000000000000000000000000000000000 + +EB34AD41058C53C01C4F1357F7CA0540:C25E1CEF2DDDCD4C6E8CBD363BC7A49C:\ +000000000000000000000000000000000000000000000000 + +087BC6FC60B82B16F51BFC19F52DB265:406B498631B18D08880E75470D9D9356:\ +000000000000000000000000000000000000000000000000 + +7D505F278F68130DBDD769F310960455:0E4A4B6FB1DB995A4F38A8F91824CD14:\ +000000000000000000000000000000000000000000000000 + +53C5BBF9DDB235003D075E57FF1A1001:FE704DB9E2020E715AD69FF9E92F8786:\ +000000000000000000000000000000000000000000000000 + +43E15279B9CEEEAA90EAD7CD9D491D5E:7B4DC664B034F4FFFB324C1514702B35:\ +000000000000000000000000000000000000000000000000 + +0BC5E3D2B2D18CCBA1B122FAB906F4EA:54E1A5104006ECB27ACC0FC355A5C0E8:\ +000000000000000000000000000000000000000000000000 + +2A41F1E81307DE4FD56408A9C7865FE1:7D0B9B0FBA0CCFFE60DAE48078CE4DFF:\ +000000000000000000000000000000000000000000000000 + +7BF72B9F29F6738A149EEE9CC66042CA:B8C05E2EAEC1B4A3ABF9505BB4ACAA46:\ +000000000000000000000000000000000000000000000000 + +9907CA6C2944F659DD209F90797EB7C6:606D2B529277284D69232AE77B475024:\ +000000000000000000000000000000000000000000000000 + +478E732A754522C881C15883B0BBCDE9:B232CF742761574EA99453D7C9B54862:\ +000000000000000000000000000000000000000000000000 + +4A9EB2F326F83A0F93F41B21AE4F49A6:354E0630938D10ED31D9AA7F57440CA2:\ +000000000000000000000000000000000000000000000000 + +8C7B36A4E87368511D3D3C578CF95240:53F1C55253D2A5B7024C28E666A57FEA:\ +000000000000000000000000000000000000000000000000 + +EE2A1F5575784C3553DBB21540B7553B:8E8C8768B7E2D430CC2DAE11A2247D8A:\ +000000000000000000000000000000000000000000000000 + +BBE9A1EBB77CBCA4B5BA650CC8E1882A:A13BFC5603FA258281D8AC945F4314FB:\ +000000000000000000000000000000000000000000000000 + +0304ED5D3AE4E9AB51A67C14291B0E4C:17C0BB89D285E07C97640A8FE6027341:\ +000000000000000000000000000000000000000000000000 + +E8EE60340D4881CEE9870133578B723D:DAF1AB5368D5BD5F6B52EA89940605C4:\ +000000000000000000000000000000000000000000000000 + +15F20EB4BB374CF9FFD0ECF1379A6309:D3D5F60355EB5FFFA9216B6073C66FDF:\ +000000000000000000000000000000000000000000000000 + +03B59445DC995E511D14CB27B611D8F4:D34A2B72F1864FDEFF58425442A0A3D8:\ +000000000000000000000000000000000000000000000000 + +E5DE46FCC7ACA6EAFE41E83B8AEFB33B:52040C8FC70CE166EAF34CDCF654ED43:\ +000000000000000000000000000000000000000000000000 + +C6DEA79ECF12FD33EA7CA9C0AA3C2E59:9C5702F759F6C92836FA2C0490080A6B:\ +000000000000000000000000000000000000000000000000 + +CFDD2F3012EA2BF447FCCDD24FFA8869:C33F590E882873038349ED33E8F22B7D:\ +000000000000000000000000000000000000000000000000 + +8BFE4AF3B7D8DB7660514B9669F8D464:A8320F0F729C8A8DDCFDB5C208A6630D:\ +000000000000000000000000000000000000000000000000 + +301958CC9E63DEDDD5E7E1C3C8AC792E:9F5D597E1EA73AAE8F53E58CE4301030:\ +000000000000000000000000000000000000000000000000 + +EDD8C0F63717866059C1CE22F8D01F26:4CEEF2B0933EEABA49A102EEB6E4402B:\ +000000000000000000000000000000000000000000000000 + +5E8BC57A7204DD62C2BF28C9B4C37417:58C5773E59A396896ED815A6127F841A:\ +000000000000000000000000000000000000000000000000 + +256F18961916ED383CE6FA8BC6F2B7CB:7A803EBFE417C354BBFC308AEEB8FC95:\ +000000000000000000000000000000000000000000000000 + +754166EF6D6231A5CC838C394FFA6FF1:4B51C7505E98DE6C9DAE5843E589EDE6:\ +000000000000000000000000000000000000000000000000 + +569C792FCBB2ED89420A51A9289D7323:D450508E9143A3E14ED4D72CC12160F0:\ +000000000000000000000000000000000000000000000000 + +F74D7BCE63019F55E33D92C7FA132BA0:A8F126B576C79AE85A26303EC70ACDFA:\ +000000000000000000000000000000000000000000000000 + +1DEB7CF9F5FA1E3BC818BB54D9721D9D:9113F881F7474428BF23A8984219A4BD:\ +000000000000000000000000000000000000000000000000 + +2EF52D3CBEA2E2CB03D0B848E7C07D80:DA15834C6EF22C8958294E66E6196119:\ +000000000000000000000000000000000000000000000000 + +3B27817D9E57B4E70ADB97A43B005317:CE976989A33D1A02A0EEA2246997AFCE:\ +000000000000000000000000000000000000000000000000 + +5E28CE24DA41AA55156AAF4D0D4BDA42:32AE2CB879873928327488298B64F536:\ +000000000000000000000000000000000000000000000000 + +8D331AC09D25385F4490A7F3719863ED:9976380787393589CEAD1800FABFE078:\ +000000000000000000000000000000000000000000000000 + +D5B056B768B04D47359793DA9F0ACF1F:EAD5B4F1EFA30013B303ECD50493E54B:\ +000000000000000000000000000000000000000000000000 + +322B8A0EC75069EFF4EBA07CEEEB342F:1A94F65D67A6A435C5EA28F1D46BC0D9:\ +000000000000000000000000000000000000000000000000 + +4B4A22563C0A57DC4736D574190E1AFE:D84C3B70EF9D3B471C689BDE6D8EFE82:\ +000000000000000000000000000000000000000000000000 + +F1D917CB22016EE46F4219603DA737ED:4AD2B98E504299732EE814E93D69475A:\ +000000000000000000000000000000000000000000000000 + +74DA216E6125B35F68D710AAD1DD6775:7BBD944B232616BD9DE40A985BDAEA2E:\ +000000000000000000000000000000000000000000000000 + +292C602001EB4D371203B1E93227F836:8C4013B2AF75B3C155D7120DB0934428:\ +000000000000000000000000000000000000000000000000 + +734683C7FBC228A7EB1F1B67F29D5CF0:951DC7BB2239C3B830843FE3CDA7CA34:\ +000000000000000000000000000000000000000000000000 + +7847476D0ED3DDB46203EBDC73BB0FF7:60B5491007F5253FAD1BDCDFAAAC98BD:\ +000000000000000000000000000000000000000000000000 + +81CD86C3C82714205F4C06384878D4FB:585EBD953D2F584B82788287E99D263E:\ +000000000000000000000000000000000000000000000000 + +E65472A6D482655AD2A5B1D3B8B247F5:40D1910F18DA68DCCB577C0651573748:\ +000000000000000000000000000000000000000000000000 + +27706EE3BF8C5B11892AFE89FB77530F:80112C6A37C0DD301AACFC660B411099:\ +000000000000000000000000000000000000000000000000 + +99582047A954472C79F081EBD92AD60F:294B94E01056C6E1DECF70D3EC0A0B02:\ +000000000000000000000000000000000000000000000000 + +7ED1ED318F1942243580EA94C5E40C15:480986DE5D85BD9FEBA09F9D074C9BB1:\ +000000000000000000000000000000000000000000000000 + +C4399BB80B44FF8B9791B952262ABBF0:0BB435634EC3C4E63EA1D4AF3819D635:\ +000000000000000000000000000000000000000000000000 + +AA9774F621357C574956D06FA4FB0DFC:089670B247DAA022AF8E63CDCC252F3B:\ +000000000000000000000000000000000000000000000000 + +A2D7F2C0B96C888383470D746D8C3D72:71C6023943714AB97C4F66D6ADE4B5C5:\ +000000000000000000000000000000000000000000000000 + +60BBE793A6CBBF092ECF3F2DFF9C58E7:914B0150537160F4A49FCDE81AA32A5A:\ +000000000000000000000000000000000000000000000000 + +CDCA44CFB68D9397FB45692CFA7FE92A:01CD4B3A51B8542166478BC6535DA067:\ +000000000000000000000000000000000000000000000000 + +201D8598327C81D3C91B1894FA97DC2A:E4F60F8E55978A6792589FB4C58FD61E:\ +000000000000000000000000000000000000000000000000 + +3073CB477A05DC7305625B2D8B89F37C:750DCF9CC3B820A99226E27A67F0B9D4:\ +000000000000000000000000000000000000000000000000 + +8B0D43826ACA0F5ECD9AC42B24B23595:2BEA1CF96CA436FC33EA573260C56A29:\ +000000000000000000000000000000000000000000000000 + +CE1EF0456D99D285B8DB31EABDF12754:9A26AFECE78B58FD937B0CABF518350E:\ +000000000000000000000000000000000000000000000000 + +6A5F54938B1A3FD41C10C854C8E04A44:405DE78B8BA1013E025F0C66CD8DB322:\ +000000000000000000000000000000000000000000000000 + +925CCB833E2BB24C56DCD6971E50DA44:A7B1C50C8A1DE13694BE770DEFA447E0:\ +000000000000000000000000000000000000000000000000 + +72CE5E0A8D2EFEF16855E3F1844FD13C:53177B6A61F2C5B98F2ED3E6EC195629:\ +000000000000000000000000000000000000000000000000 + +A7A3974CE115F4D92CEDBDCB6C0850BC:3DC31176F7BFF544F98B50D1FF0EB338:\ +000000000000000000000000000000000000000000000000 + +6EB0181E23642427F498B5BBC87A0FF3:F7887B1A95F202918295D6DBA328DBE0:\ +000000000000000000000000000000000000000000000000 + +112DB5BFD7108A6E2D51B883F0C6700A:35EC6F1B98376F6CFD98B0DB3DB63295:\ +000000000000000000000000000000000000000000000000 + +EE9CB8FF31C6106F54468D56264B5A67:FA2A11C86EC2BD433BDC062294D5D479:\ +000000000000000000000000000000000000000000000000 + +9269DB3D3EB516D02452109D537511A0:70C709A5F6DA5E546AA42781D389BA4C:\ +000000000000000000000000000000000000000000000000 + +04797C87F169EED791FA03BC6529CCBC:DFBA39236536C7B33F5C186742897F44:\ +000000000000000000000000000000000000000000000000 + +30DCEEE9F96719F94CDA6D4447DDA5ED:6BE2E27BB85093A71E3208B22D9B4EB9:\ +000000000000000000000000000000000000000000000000 + +DEEC871FEDE7BEF4E5924A35F7C1473E:2D189653936AEB37F0222E96B205FD36:\ +000000000000000000000000000000000000000000000000 + +14D91B1E40E6EF6C0D47B18CF1820459:E428FBD6A451527D8E254B032A85ABD2:\ +000000000000000000000000000000000000000000000000 + +F50744F84E3C68FC80883F5F7CD4F473:12D9ADAC936643E44C75765EE860E156:\ +000000000000000000000000000000000000000000000000 + +BD37910AB3475FC22A6C5AC0277D6684:22EBADE6B7550CFAF53B369490420120:\ +000000000000000000000000000000000000000000000000 + +4A9EB13B7BBB14632B1FA37006139022:1B0568ECB78BF78E17891E99D3FF6685:\ +000000000000000000000000000000000000000000000000 + +A1F6367ECC2AD8DEC620DA653D6D4AC3:B72DC0A98DC7545798B9A09774127A7C:\ +000000000000000000000000000000000000000000000000 + +1FFCA2F556D07C7F0125B1E63811FBF6:620B4E671AC5ECA7780C114F8A3B5834:\ +000000000000000000000000000000000000000000000000 + +28EF3A37D33B9BBFB94DA9C27CD74C8F:8DFB3F06170CCF3FB628A1131B7C55D7:\ +000000000000000000000000000000000000000000000000 + +3504348BF82F0E8D12784206732B7EAB:9395207A7F3D76727E08650635A50E8D:\ +000000000000000000000000000000000000000000000000 + +649B9B03B4FA72E015C6318C78DBFE6C:1C7F7A1E78612D4B57AEE7A97E026D99:\ +000000000000000000000000000000000000000000000000 + +5E5D242061750A2E3AD7CF68A18F53E0:92BCA6EE74F863BD58AAE46966FF0195:\ +000000000000000000000000000000000000000000000000 + +0BEAC3380DE66C16C118E94A7E98632C:D707ECAF8DA45A032FD2B92EC02BF809:\ +000000000000000000000000000000000000000000000000 + +100C0B29ACBDC1DCE5BF94F647132C8E:D7D4BB2EE07EC7ABD29408BB29C3E52A:\ +000000000000000000000000000000000000000000000000 + +E4C40EABADEA4081D339B98217B89F4E:068477FE3113C4E706161C7BE173109F:\ +000000000000000000000000000000000000000000000000 + +79201EFA18BA2872F67DB637435DA21B:E73ED140C42FE2121BE039F36F24B353:\ +000000000000000000000000000000000000000000000000 + +F0AE4C2DC0FD756D97E9D4FE2F9F4CF2:2472A6AA7ED6F70D2179043A4E37C671:\ +000000000000000000000000000000000000000000000000 + +6C18AA9A75DCFCD80EE4490529461EA0:95818C326367FD55674DB6C721DCC315:\ +000000000000000000000000000000000000000000000000 + +73C0E36EDF00088CF693EAE05DE118B6:44BAE149894A3B8D680988B2441FDD1E:\ +000000000000000000000000000000000000000000000000 + +C20558F78C1E2D2AB5898C50B7C5B5CF:6631895DA9C9B985C8268CE75B8DBD35:\ +000000000000000000000000000000000000000000000000 + +7A2DBE3457C46A63ABBFE7E3C6AA00FD:A95F5D0F337851A3349D159E70EE958E:\ +000000000000000000000000000000000000000000000000 + +9FB3015058C61098BBC919A7DC369728:0B3EDDE3D3C9F33C98F2561C38A24AFE:\ +000000000000000000000000000000000000000000000000 + +8446AA6E305837711CB5B77589BE700E:9CF33FCA164676B2503F4EAA6DB82427:\ +000000000000000000000000000000000000000000000000 + +63ACC114B985F5E162E74C6A0D5489A4:4502AF98B2F3C453EB84DB4816CF86BA:\ +000000000000000000000000000000000000000000000000 + +1FB274A798A9DE040500989BD0DAA450:5122BAB4ADF7B99D018247C17EDE37B7:\ +000000000000000000000000000000000000000000000000 + +0B75B6E38F803AFA2E185825452E7CB9:8053D0C508ED36FDD78BE6A2E156C68B:\ +000000000000000000000000000000000000000000000000 + +502998BD920539E6C9457CEB7ABCC2B0:630A85FE40269FDE57BE0A91230F14F9:\ +000000000000000000000000000000000000000000000000 + +D15498EEC5A204E75ABD92296759B2E7:1DFBDF5987C38B34D70EC1F9F09DC244:\ +000000000000000000000000000000000000000000000000 + +74CE162AA4400EEFBE2F9452F190C925:89A0188B43870472AE7BD89F1DC9DE4D:\ +000000000000000000000000000000000000000000000000 + +9BF6D9402DAAA02EB0D70ED5686A2897:F080B9C597F6AE853556F9088765307F:\ +000000000000000000000000000000000000000000000000 + +66104EF16B83A3C24630AA15999CF795:465BED1DF34D70D6666BA9CAEF77E5F8:\ +000000000000000000000000000000000000000000000000 + +2C7518563817B2302055448AC1E236A4:29228B582D6C9BF2F5FD64AF68801645:\ +000000000000000000000000000000000000000000000000 + +B840A56E78F0CD9C491FBFC2A008C0B1:741E572D70820BF764DFC3EB64F58DB5:\ +000000000000000000000000000000000000000000000000 + +366C45C25B098271DE2BA33B761CA2DA:93730B17CF28E0B7FA833BE560433D26:\ +000000000000000000000000000000000000000000000000 + +DFC28B998E7D650ACE708662715DE551:070744AD0E21FBF5344EA22396FE3BFA:\ +000000000000000000000000000000000000000000000000 + +AB8D9F6AF9FC1B293D1EF3D4459C17F0:873A852D49296F2493CD56AC374FBD59:\ +000000000000000000000000000000000000000000000000 + +CF8A7D1F67264C8F0CBB81B7F22F5284:A0688DD48E462A1B75F34425536C270A:\ +000000000000000000000000000000000000000000000000 + +3911525195F0A35484618596EA0B23CD:9B1B36125ED888A57FAE5BDEB53ACFE5:\ +000000000000000000000000000000000000000000000000 + +5DB02CC6EEF7E128DAA849EEB1BE9A7F:95404D7CCA9EB1C2F720BF6CC74826A8:\ +000000000000000000000000000000000000000000000000 + +CBB260B85AB0E75F4396FC3F6C7B8DC9:2B702A4E613758D8EADD8E17DA9C0E68:\ +000000000000000000000000000000000000000000000000 + +73C7C371EE0D7EEBBDA62B2D8B47ED02:C6B9E0F5E943685FD1FD739E9EEF6747:\ +000000000000000000000000000000000000000000000000 + +928C48F1AB2E39BC0ED7395841AA55D5:6EE0B71022F864D82F177058C2AFD1F0:\ +000000000000000000000000000000000000000000000000 + +9B73A4CB141AE76D1A4AF02EE02F5623:11D9E2FA35491C034FC28D278F81C741:\ +000000000000000000000000000000000000000000000000 + +F98FF8E931078D572588D3A23BA9A65D:69408F1E703ECEF45C60B576DA8A8E93:\ +000000000000000000000000000000000000000000000000 + +D697E66D3E394658B477F5D94E9AC272:C3E21C1C90F1BFF4BA3BA1FC806C50C5:\ +000000000000000000000000000000000000000000000000 + +7B5D2AD95D1278790DE3E61EA79683C0:BAAD9EF7F34F2D09E4F24F8FFBDAD242:\ +000000000000000000000000000000000000000000000000 + +2FABE699379719F903C55B243E270154:88768EB6AEBB3221DEB456CB581672C8:\ +000000000000000000000000000000000000000000000000 + +A1D567D19DB1F8CDE682025AEAA99DE4:EA16B62DE42D02CD64AA5286D7058E2A:\ +000000000000000000000000000000000000000000000000 + +31B9406E90742402C18E4EFC6D49C43A:C33EAB3109805CC528E06CA92DF1CE82:\ +000000000000000000000000000000000000000000000000 + +DC5CC861CDB8565EA74C5B81D04E3FFF:95581016D9D878454F3B29BB72282CAA:\ +000000000000000000000000000000000000000000000000 + +92D735CAAA20120B2545530FBD841976:AF352F902D964BC93C52DDE45F36813B:\ +000000000000000000000000000000000000000000000000 + +81AC34A2E341F62C479FCDFBC85570D3:D35E2834DAEF034C122439AA75EDE6FD:\ +000000000000000000000000000000000000000000000000 + +DB6CA5A00935E081B0DE14F9489E56F5:C0B207F61BCC815E44671E76556BE222:\ +000000000000000000000000000000000000000000000000 + +6795C4731AB1B7A9BD1367C5FA6D24E0:F2F48C694E4D4C561237F2E446E48CD6:\ +000000000000000000000000000000000000000000000000 + +503D1E8C00F32DD24666B40AADF21635:6CAB8D56A573C231E4083E062509331F:\ +000000000000000000000000000000000000000000000000 + +9B34D2D7E4F84FDADCD221C818398D9D:3F6211A4F97C7D07DE3069A3AF0B2F7C:\ +000000000000000000000000000000000000000000000000 + +9A6AAA25CD55632A8D1364765F054228:FCEE710DB225421305683F6DA8A14498:\ +000000000000000000000000000000000000000000000000 + +51BB73F367B4789C50EE27A7FECDCAC4:89DC658FB152C89E533873028E82F386:\ +000000000000000000000000000000000000000000000000 + +38E2FB18AEF954A977CE17B61420AFE8:F2F090E1D924600B3F2852160F8FBFFA:\ +000000000000000000000000000000000000000000000000 + +40E1F27DC23EB87A38D33A9D7DEA6B57:0BA7974ADFABBC749AAB019F1FF0FA22:\ +000000000000000000000000000000000000000000000000 + +69237F4FA6B874C950F44E2ED8EDE5E2:E8BE1E5DF9FCF083C5C80F5C0C927350:\ +000000000000000000000000000000000000000000000000 + +E529151F5FEDB46E9F150E39FF9095F6:9516D575A3FA911065F308AA45957E61:\ +000000000000000000000000000000000000000000000000 + +3921C4781E145F4867D1E8F134DF7355:DEDAB21C05B199DA1E0C0E1D7CC17F61:\ +000000000000000000000000000000000000000000000000 + +AFFC9793843506A048E65104A559CFA4:43C466A47766F7AE27D9E8250B04D617:\ +000000000000000000000000000000000000000000000000 + +D7CC61BAB163D793C1C9A6C4266BF004:B0E2AB3CF69FD19EFA5BFA9587AEF29D:\ +000000000000000000000000000000000000000000000000 + +A0D64ECF3F000B7478C9FB6C20CD576C:2C0A893A4F331ED2D738446AF038ECCA:\ +000000000000000000000000000000000000000000000000 + +141964E6278C1ECB067DFF46B8D80C15:D89E32E065DA6FC65BDF38A15626CEC4:\ +000000000000000000000000000000000000000000000000 + +72568E2FAF72EFE69E5EEDDBD415F1CD:3A9DE9497BD9C0E8A7933581709C2F86:\ +000000000000000000000000000000000000000000000000 + +2309A9E1B063BEA563AE44FB1D11763E:2C68D638E01CC717CB3095F8769F6330:\ +000000000000000000000000000000000000000000000000 + +5B8786E22A5109D189F5155471148639:F54BDA0C2F70CA852BC5A9DC48E74DE3:\ +000000000000000000000000000000000000000000000000 + +14B31DFD7489D68488A8A2EC6A9B28C2:2E4110267CC09B86849976EC36FD9545:\ +000000000000000000000000000000000000000000000000 + +72D8F97A40E78FDBFB9DDE7D94694F3E:2C010E0A06A15338F76A37A5EDA6E7AE:\ +000000000000000000000000000000000000000000000000 + +7CFB6BEA9ABFE0B5C486504AB7AB7C7E:1495DDAA1CF53478613C5A7FBCC4D21A:\ +000000000000000000000000000000000000000000000000 + +8E22872352AFBE50799766FBD74672FE:DA8894CF60FB487AD2FA856049B4A339:\ +000000000000000000000000000000000000000000000000 + +9ADEC67160B3E7A54CBB3118CDB24016:ACD872C37F74E4D8C9DCB67560A2C626:\ +000000000000000000000000000000000000000000000000 + +AF35888791EA802A0DF92286893B6653:2E2D305D853B870400402D50B36AF1AA:\ +000000000000000000000000000000000000000000000000 + +30401704726D8B873D4D2435CB008F42:1744071A7A0B587AAFC7FB447D249B9C:\ +000000000000000000000000000000000000000000000000 + +2E60C63BF001FEA2FECC57D93E9FE7A6:83B5901B7B71025C8D0FE54EB35828C3:\ +000000000000000000000000000000000000000000000000 + +3950402C43051C4904DEEC57F504FC4D:9A9C91030126FB9F9F9AF1BEE01506C8:\ +000000000000000000000000000000000000000000000000 + +F5454A8EBE04708570F9B2317DBBA71C:170B64FD20891245085B8E1B21E73A83:\ +000000000000000000000000000000000000000000000000 + +3E03AF195C3829650043A0F643CAEC4F:A593253D4144356A93B77777BB062ED0:\ +000000000000000000000000000000000000000000000000 + +2FECCD73C296BB4E5D6D7FACF2F07663:A59DCF75D21391DAB42977618A30807D:\ +000000000000000000000000000000000000000000000000 + +E3A600FC8F0C9BB15DDFE8E4D36D0B6B:F2E3DA77CFDC4F914913D370AFC46475:\ +000000000000000000000000000000000000000000000000 + +65FAE4018301DF82E78273D60FA8BC1C:B48220811F1497381AC7ACF1FAE6A1C3:\ +000000000000000000000000000000000000000000000000 + +513F515D31466F0A01332F6D8D733E9F:056E78208EFDC0272956971EE29EAB50:\ +000000000000000000000000000000000000000000000000 + +281AD7F41EB19451BC978B6C125026B1:DF6D20D993094000464BDA7DA2AFEDB5:\ +000000000000000000000000000000000000000000000000 + +97A75E3919FBF5107E55E37B81FC45A0:CC052A8B64E199030F6D620427C379E4:\ +000000000000000000000000000000000000000000000000 + +B501F0B968BFF14070DFE2DF6298FF0C:0A53785F9A58D9FFB7A01C6E6DDA7BB1:\ +000000000000000000000000000000000000000000000000 + +672B7E9933053E6ABA4712214D1278D0:4CE10611AC92C9998E6044099E2BFBC0:\ +000000000000000000000000000000000000000000000000 + +C8EE21B9E260A72153A6938F31A127F8:7FEDF8389CC1F013F350B2BCCC6046EC:\ +000000000000000000000000000000000000000000000000 + +61F6FE223D11D88FBADA99ACACB7FA25:A834288BFD1FEB7432F94E97E7B69D89:\ +000000000000000000000000000000000000000000000000 + +F79DD7A31FB11644A38E8D006BAF4B62:9E949C299CDF820845FB3B06E85EFFD9:\ +000000000000000000000000000000000000000000000000 + +7328E5C1ABE226EB229AD784F26E299E:57E21FE31459A01DB1A05230C3DC75EA:\ +000000000000000000000000000000000000000000000000 + +9AD91A8354BCE0E632CF9C62C95AFF7E:F304CB96B9347492E5D70527C2B11ACB:\ +000000000000000000000000000000000000000000000000 + +606BF2DE00C40ABA8ED77992EFA05C1E:DE27FBAD11FCB0992CACDD7B6BCA810E:\ +000000000000000000000000000000000000000000000000 + +F81DFE4D27CFD077F105905D47D5BADF:E8F978AD0451B0A02DF946CBAB82EF5B:\ +000000000000000000000000000000000000000000000000 + +D7201D9F6407C9383CA4535D688C61EA:DC49220DB183147B3918ABA9CE72B834:\ +000000000000000000000000000000000000000000000000 + +AE34D39246875745FC00139CB4A564C6:83A946D5D727FFD83A6485D8E61E5CFB:\ +000000000000000000000000000000000000000000000000 + +6D3F60DB30BC83F0FDE7DD3E21E0CAC8:9EFC2DB219DC063E887A54F9B7B81DD9:\ +000000000000000000000000000000000000000000000000 + +5FA122F7957554393E97F89E98C7847C:E93AE44D82029938684ABE78DDBFB2D9:\ +000000000000000000000000000000000000000000000000 + +07F249A729186C8A0558A62188772C74:E0A8A1619EE653EAE22E41DEDB1E4553:\ +000000000000000000000000000000000000000000000000 + +244DF5F8502E3C12A37F28BB9F2CD24D:B189B0FFD6BC957D95A9A91B4E2E4BCB:\ +000000000000000000000000000000000000000000000000 + +2A0C5C6B721B1010C9FDBC02B053BED9:3D9E27A119B6693128AFAC171E46B926:\ +000000000000000000000000000000000000000000000000 + +AF6449E79628453F1DD77EB0857CADED:C150CF167A16F8F367D5D90E89C09DB1:\ +000000000000000000000000000000000000000000000000 + +36BF3D3D0A63CD8AE037FFE06889C29F:C708DAB79E5B99B97676A39EB1BC8C89:\ +000000000000000000000000000000000000000000000000 + +9DDDC7CB9B49B7075FE8D987F16AC153:DF01A9D14E08BF79F8C8B776F07F11AA:\ +000000000000000000000000000000000000000000000000 + +48CAB5B512E2AEBA252845F24DA62FFB:066BD47805684B25217AAE164E1B59B3:\ +000000000000000000000000000000000000000000000000 + +905FB46046C869B609C0C92943C1D22C:951A9225FA7A02680866539F73953A49:\ +000000000000000000000000000000000000000000000000 + +6C027C762F6C9B9C0C3EBDE341238154:D4CDDD6C60DB9CF0815D48EB8C4D1BB3:\ +000000000000000000000000000000000000000000000000 + +55488B44AF25E48F8002618985748EEB:C47006D8E3ABEF6DA6844C25C3DA8E5F:\ +000000000000000000000000000000000000000000000000 + +B6E76A99FB42AB0DEC2F64CA4119434C:1AC91773E3C74B1AD2CEE5C1B73FF762:\ +000000000000000000000000000000000000000000000000 + +FEE6CE4F8F3473E5D53ADC2514573DF1:C05EBE4CA1556875E88963737052A6A1:\ +000000000000000000000000000000000000000000000000 + +BB4404D0A1E08F698567D378D635ACFC:310D5B8AA72771FAEE774429A2E30D34:\ +000000000000000000000000000000000000000000000000 + +CBECDA615EE251D55D88AED51A7396C2:005F978045B1C78F2C9CA70BD740AFD3:\ +000000000000000000000000000000000000000000000000 + +216DDCBA6D7CFBDD704C88573AF3F539:CD5540951B363A8FBDF9E93C07C8B071:\ +000000000000000000000000000000000000000000000000 + +32DF83737E24CF91823B1F444111F6DC:0A79A5601F7FCAEC1DFEDD8C5D6517BD:\ +000000000000000000000000000000000000000000000000 + +75060574E3BD1829C1F7CF663CCA1519:404CD7A5AAE2AC614FBE46931040C028:\ +000000000000000000000000000000000000000000000000 + +793C8015C6E8E72E56C13561FD6E724A:6F8FC5142A5E63B38B3CCC1934284FE5:\ +000000000000000000000000000000000000000000000000 + +56417631D25FB77C8D31D1575FF069AC:11F8FE61E550FEB615970C2AB8ECCAC0:\ +000000000000000000000000000000000000000000000000 + +E99EFADE32414801A624E62C62C28FCC:C3C7D21CB5A94B8614DE00CE1B7A9DC2:\ +000000000000000000000000000000000000000000000000 + +EC4566488387F51E0B509476670E83D6:191E27160A8A8475ACFD683F80DF89C5:\ +000000000000000000000000000000000000000000000000 + +B2AB44DE9321FE39A4DCBDE624578893:54D0B5AAAE4629FE22EDAC6BE38B9B9E:\ +000000000000000000000000000000000000000000000000 + +063D84A689AABA4F20C38265401497E1:181EAFA411D7D022A5AFF1C1C212146F:\ +000000000000000000000000000000000000000000000000 + +745D52CC6B6724A03B1402D936BE3B7A:52624A4310A885F6F32BCE889812634A:\ +000000000000000000000000000000000000000000000000 + +DE9C438C39CFAF705449EBE35BCC589F:FAC2134E1485CB8C7ADD700772A7E5F0:\ +000000000000000000000000000000000000000000000000 + +67CAE47F0EAB98431E79565F6AD72FF9:1D77938B41CB3EBDCB2E972C23814361:\ +000000000000000000000000000000000000000000000000 + +190E8E93E5EAD47C94FB6D4410710A40:5E0495D4DBB66892CE35E4AD8080DDFE:\ +000000000000000000000000000000000000000000000000 + +1F4C0C3D81E34FC56D45D33A491C2AA8:B3356A3EC0C1D308CEA5B5973E78B7CD:\ +000000000000000000000000000000000000000000000000 + +16F1E59BBCF8322F6B0880C77E0B3AD6:42275296C51FCA8E244BB17C1EB2ACBC:\ +000000000000000000000000000000000000000000000000 + +95BF7A5EC2029FDB6C51C40407395862:E92D9E263F650E222E90F0E59B2AEFA8:\ +000000000000000000000000000000000000000000000000 + +F4B0AB203C3C741A527E6B25C0F89B8F:0B09F057772F30EB5F7C0C777CD14CE7:\ +000000000000000000000000000000000000000000000000 + +9422B9FFCA4204AD7DDC56DF5C80ED5E:B2835EECC60F78F7B14588A8FD6069F2:\ +000000000000000000000000000000000000000000000000 + +0756858E5C3829E8F3C328C6B4E3E1CC:7F56E94897ACC5D0F60CF899FC4A98F5:\ +000000000000000000000000000000000000000000000000 + +5C8E0338CE66CFB584307A626FA4527B:D3819C5E8A9B85C86281FB7D835B7503:\ +000000000000000000000000000000000000000000000000 + +524CAB3F0BCAE900B7DC16839B241B61:CD71C2A15B1A5B37DA95763CF68E05D8:\ +000000000000000000000000000000000000000000000000 + +74B3CC8FEEC75C97A94EEBDA55B8B16A:A2703E0DEC3649AFAB35157E7484A43C:\ +000000000000000000000000000000000000000000000000 + +33C6D143B8E9D1F06D1339B86CF61591:BA98BC1E73D8E0B7AFA5F2BDF5755B95:\ +000000000000000000000000000000000000000000000000 + +EC3DF67F0136BA492F33AE0DB8FCB598:F23C047EA741E9FE948A56D8CD3D050D:\ +000000000000000000000000000000000000000000000000 + +EAA6AA8AE56FD97D6BD6A22CA1250287:D0B414653510A3EC079E38806F87F643:\ +000000000000000000000000000000000000000000000000 + +52C3399AE7244A4A7C2F2CDB8F371753:819E2216C7E18C2557CBFD688C17305E:\ +000000000000000000000000000000000000000000000000 + +AB61C1BEC7E3B2790B43D64E53E48B18:A3E8D62480544EA1643BD7FF5404E40F:\ +000000000000000000000000000000000000000000000000 + +B08CB946F4201AC88F721B850A5B3CB5:ABAF89346ECE6F72C054C82D1D440C38:\ +000000000000000000000000000000000000000000000000 + +B5786F5DBA379E835224508F11E87B69:93BC3706B91E27EF0CFCBDE69C2559F1:\ +000000000000000000000000000000000000000000000000 + +40B89D11E03992DC28F90E0CA7949B75:6153A846AEF149D02F8D1EBD0D492F75:\ +000000000000000000000000000000000000000000000000 + +3371D59814185FB77AB6C990CAAB3BE6:9B4039BE6A0953CBCC1D7FF0C7E73BCC:\ +000000000000000000000000000000000000000000000000 + +8BE18C0E0C9C5A94948BE1F1C7353C46:283A4944BFA598A114B3BF601B68B823:\ +000000000000000000000000000000000000000000000000 + +3A55F569D34407976540A728FE4D7840:F3DC2926970112F59FE3A40A3F8FD470:\ +000000000000000000000000000000000000000000000000 + +92E46A94F8180683A850126F5857F4C6:E246163EBC3F740A288F6105F4F22B97:\ +000000000000000000000000000000000000000000000000 + +CBBE214BB2504BEA8BF54D4123465715:D5A46FACE3B1D97AC16DB73B3BE3EC3A:\ +000000000000000000000000000000000000000000000000 + +4B95E574D0BE514238BA4DFCC06535B2:055C146C457B2ECFAF18D244D5400D31:\ +000000000000000000000000000000000000000000000000 + +B89E3644479A3540073EF40E0F090019:F2C9DC621653315ABE6A627ABF40F24D:\ +000000000000000000000000000000000000000000000000 + +4A5D02C4799C8C26F1FA7F715EFBB800:B2F714BC4B21FEDBD79054A507775EF5:\ +000000000000000000000000000000000000000000000000 + +A9D5720391D7ED3B2A23094662FFDD5B:951C0FFF6981E9B1B4C792B4A81AAB7C:\ +000000000000000000000000000000000000000000000000 + +CF5B1C437A54DD6F29D6F589D26D13D6:6C9FB40B31372C1DA4468C0EE559257F:\ +000000000000000000000000000000000000000000000000 + +8F548C2248B76EB8CC4DD0272B93D532:56DEA9C72D8E2325A9AA42E29A3270DD:\ +000000000000000000000000000000000000000000000000 + +E09C2E4DF75ACFFC3B8E880AC1F01FCC:D1CD44336BCD0928C4A9616D16379B56:\ +000000000000000000000000000000000000000000000000 + +FB1C12B77C30E6DE6DE97CE8D8D913FC:6947499CC1C807290167A693560002AF:\ +000000000000000000000000000000000000000000000000 + +127D02E20E973573296A5C82CDC83404:410374320F1B4AC6FE745C5973FEC5A1:\ +000000000000000000000000000000000000000000000000 + +91D02F2862F596944FFB92C74EB07BF3:1A7B5A06628C5871E684A2080ED903DD:\ +000000000000000000000000000000000000000000000000 + +6A46FA0A795B4A9E7AA998526376127E:2186A2F79A90DB5601A4BDAC7F055A92:\ +000000000000000000000000000000000000000000000000 + +35C4EF822C59ECA05DE6CFF2780BD44A:3D6BC6771061B7D45C60335A9DB19E55:\ +000000000000000000000000000000000000000000000000 + +EA374673B5E6A56004A029F45137ADA7:C19D85F934D8AEFA589489736A76DFC5:\ +000000000000000000000000000000000000000000000000 + +4E3A751A0EB53250C90A572D39B30FCB:6AC263B51493303AD36284D872F3941B:\ +000000000000000000000000000000000000000000000000 + +E581C99FDE13BAC81780AD1BF416A2ED:6967E6479E599B1BC18645C961557BF1:\ +000000000000000000000000000000000000000000000000 + +288BD3489BFE7596F58218A0AB1A73E7:6AFC72E6A27C640F2E52528E9CD2591D:\ +000000000000000000000000000000000000000000000000 + +64B69B2977852C6BBAC03750900356C9:0AC56FF8773D5AF3420974B16AE2AF14:\ +000000000000000000000000000000000000000000000000 + +2F1B45AF1428E9742ABB21D019ECB5AC:ADEA58D721F2398FD4C06BF0F0727505:\ +000000000000000000000000000000000000000000000000 + +49320C39A1BC3BE5AD09E3E9E120513A:8CC627E3557D252B45D08DE6B6896E48:\ +000000000000000000000000000000000000000000000000 + +55D76389493096F7D6197B7F8B6DF193:9857385C7D044284A3219004666E0EA7:\ +000000000000000000000000000000000000000000000000 + +2A27D235903911F331DB639B75C0D712:9B98F50C0ECF24CC1D86C9673D8A083F:\ +000000000000000000000000000000000000000000000000 + +419D7555072CC127A4471A05CFB19CC0:67FF3F3267642FD12B4C2889078613D1:\ +000000000000000000000000000000000000000000000000 + +9FD6F61B1665F5AC5AAC2FFF89BF92FE:37866C10AF2D0594C42B936AD5266A4A:\ +000000000000000000000000000000000000000000000000 + +BB090A45B89E261664A6122AFF274007:82DE14AB89CDD323CADA9E38567E3089:\ +000000000000000000000000000000000000000000000000 + +157BB4035D9D9014CF88B9E934A7B8BD:19C07DD91509033BD3DD978781873EBA:\ +000000000000000000000000000000000000000000000000 + +A8870F1B8C1D5D85484117F4C6AC4530:2347879BF12456873B80EE906110B8B8:\ +000000000000000000000000000000000000000000000000 + +908C16F16AAAD352AE911C197192719C:2C2745EBE83EABB93D0A920D07BE0DB2:\ +000000000000000000000000000000000000000000000000 + +1653D7F835D83859EC694970707CC095:BCF6DF6D1EEAD65E05BBE987CFFD3702:\ +000000000000000000000000000000000000000000000000 + +0DE06413C85A15D5D8947AD534B2B696:7287E1CD26D1EE3CA342009AF49756EE:\ +000000000000000000000000000000000000000000000000 + +3B543E3D80D1EAF921CC68CA776239F6:BE313F5923BC9889B3860BCFAB775453:\ +000000000000000000000000000000000000000000000000 + +672218755E587021EF7B02B7BCC30A61:E1ED846BEA255A1AF1B92EAC79B9CC10:\ +000000000000000000000000000000000000000000000000 + +811D93DE4A4BBD9414820BC1AC1B1D15:18CE61828267E31A11F44B359F5137AE:\ +000000000000000000000000000000000000000000000000 + +66B96FBE50A59E0D613B86DE5017D5B1:BC46D6CC0344D2F8509C24B6BD961C7B:\ +000000000000000000000000000000000000000000000000 + +EEE81506AA7CC547B01464EC138A2243:717D1A1B155A403FFDF7CEF95A0F3704:\ +000000000000000000000000000000000000000000000000 + +A08B5A609A311639984749D2C3F17B66:0D9C67C97883478626649FD699984E37:\ +000000000000000000000000000000000000000000000000 + +64D1AAD4D2F48E1253CCB198DA194FBE:B4C733307E59EB660B0A6F8154ED99C0:\ +000000000000000000000000000000000000000000000000 + +4589C65EF87C151B68906023145F257A:80E66CD1BE95CB7352142568839F97B1:\ +000000000000000000000000000000000000000000000000 + +C8AC7D6611C15A08D8850A6409175296:C93BAB0F83F23EADE7A01C0C1C4B924A:\ +000000000000000000000000000000000000000000000000 + +68AA5E6050AF889A0489CAB2B21485E5:7AA6C6697016001A666928C97EEEE3F5:\ +000000000000000000000000000000000000000000000000 + +A1158411888B7ACF4BC31E9DD67D787A:2498B680478226FA74B2880E485DA409:\ +000000000000000000000000000000000000000000000000 + +214C17577623146613245C15C2B49493:4BA8DE835393DD25A42ED04F69B4C2C7:\ +000000000000000000000000000000000000000000000000 + +C9D85D545FB2F7D9AC22D8161178F590:163A9559BEAE1A2F3DD42672099F725F:\ +000000000000000000000000000000000000000000000000 + +ECD0DFF95F9AFAC0FE2C5A95543E6567:AEC277D9AA85F6221D9ECC3C55514020:\ +000000000000000000000000000000000000000000000000 + +81F92762F3C9A78E25202DEBD990B79D:EAB0B505DF3FD415181D2389B7E9CB7C:\ +000000000000000000000000000000000000000000000000 + +36B9CA495A26B676C5A73115E4FF2D1E:ED36B0A23E7A11F171A1FD6041901C0A:\ +000000000000000000000000000000000000000000000000 + +933836CD34DAE3CE8667A2C314ECBFD2:F52CC9AE0294245C5785FA75F7CD565F:\ +000000000000000000000000000000000000000000000000 + +547BE19FEAE346CD3C232B03CA1A5FE3:BB506E47BBD9BEEBE794A888D3CCA4B4:\ +000000000000000000000000000000000000000000000000 + +3224DA0BF7369941B581C1991B0434F4:83F1AEFE1874155EBEB71D3BF28196DA:\ +000000000000000000000000000000000000000000000000 + +BBF274F554349AC9464BD0701CBE3C01:08747CBB4CE827BB8D7125B51F7D6B51:\ +000000000000000000000000000000000000000000000000 + +0335215F4E7DE6C6844D5F4ABB08FF8E:753D67B79C27B62F66CAE343120FF8C8:\ +000000000000000000000000000000000000000000000000 + +0E798B0937AADC31E5F4B1059BE7317D:D28E3F2EE5CEA4AC47B479435CB879DB:\ +000000000000000000000000000000000000000000000000 + +B7C8F5010674F177A867996E62143129:803B810C554A684442737B08747A7B09:\ +000000000000000000000000000000000000000000000000 + +3C82EE0C8AA57B1A2809A653DFC34EE3:DDF2B574C748E259D0B60E2E7296F5B3:\ +000000000000000000000000000000000000000000000000 + +245EAFB34BF4A2DE65D2AE9E02282DA8:367A33838C4E1D75EF86882F13F456C3:\ +000000000000000000000000000000000000000000000000 + +82BBE96F7A512752B34873CE91BE3A12:D80CA3A1104B1BF33C78A4126CA44D5E:\ +000000000000000000000000000000000000000000000000 + +017359FCC78CDB959AF03170515DB2A0:30B7EE3A4EB1B90FB4F773004894A1C9:\ +000000000000000000000000000000000000000000000000 + +FBE1BA1C4C9E9266219E290CA482204A:23C853980380C75EE387D499EBDC704E:\ +000000000000000000000000000000000000000000000000 + +7A5D60B558F7BD79506EA361867D82DD:CEC694480EA0FE02FBCA486A38D2A28F:\ +000000000000000000000000000000000000000000000000 + +F6E1A13C90CB990C8F98044A14153C63:5DBA1D0AD1846EA0DF7572D9796EF6DE:\ +000000000000000000000000000000000000000000000000 + +BE618966B8BB4C5161F16E614BB0685E:50511C6F323AA75B27D26AF37C96AA44:\ +000000000000000000000000000000000000000000000000 + +3430CBCDD6B31EC832674C365313412A:2EC7B023DAB88616A4069732083ACB96:\ +000000000000000000000000000000000000000000000000 + +B736C160AAB874D2FEAA7CEFE95067FD:B7B0662681E21B41B0211A4C347410A1:\ +000000000000000000000000000000000000000000000000 + +E76003121CD25AF053388E29F5CA6F36:936E6955F7EF756AB1C6DC0510158338:\ +000000000000000000000000000000000000000000000000 + +895F077285060573E7E66A0C610E1A6D:A3B7E3A9424D60A1CB63B445A4EF0C4F:\ +000000000000000000000000000000000000000000000000 + +E6EE0CBF63758F0C58F7FE5B148BB755:68EC11D4896B18797DCD1BFBD91851B4:\ +000000000000000000000000000000000000000000000000 + +54077665477046E8886AD6E46DFEC14A:EC98D4903AD222137CD3C9449508940B:\ +000000000000000000000000000000000000000000000000 + +33DEC99C9A886FE526909F940883E559:9364AB8B76D6AF8E7EABE315EA9063ED:\ +000000000000000000000000000000000000000000000000 + +A1E7C5A9D7C2FFBE20CB4DC98727945B:113D49B50A78202134B0C13EEF987C86:\ +000000000000000000000000000000000000000000000000 + +9C1DE13B101A9B72BB5625717A02E6E5:6C93D650BD87DFEF03563CF268EFC950:\ +000000000000000000000000000000000000000000000000 + +41CA06F619236D40739E3200E2AB1387:11470B6E8E0BA5340322BC3F17273EB6:\ +000000000000000000000000000000000000000000000000 + +FD432B900CF8CC44492A491722D20F89:DE117E6E44548F9CB5D419C8100343F6:\ +000000000000000000000000000000000000000000000000 + +7EEC086D6EF264233130020BD4678FBD:6EB1B6AB75C0DFCE7AE826D8EFEC745F:\ +000000000000000000000000000000000000000000000000 + +243F6735A4F71D6B0161589E98367741:5B40A381C52F55424C1903E2A6C0A612:\ +000000000000000000000000000000000000000000000000 + +39B2D6E42C80C5A188540586F0065DCD:EDBF0C2671F1DADC8737F93FDB17FBE9:\ +000000000000000000000000000000000000000000000000 + +BC9838D89EE5D90B5FA7E5811B588D53:26967E5C460F2571B5DD1381EFE9B451:\ +000000000000000000000000000000000000000000000000 + +9CABC3BF9C9FA7E16C4632FF8A07209B:9069D1FB3BD87893CA2C66FA10174B8F:\ +000000000000000000000000000000000000000000000000 + +F6B613AC53E11B62FF73D1F15D946399:EECA346E8823823C821E6E8010418BE1:\ +000000000000000000000000000000000000000000000000 + +6212297702FA172A0B7C0F60D0536029:154A8C133987DAC7C829C62FEFADBC28:\ +000000000000000000000000000000000000000000000000 + +B06732B03AA1E215930EE18FE970CC8B:167D74C63CEB050B4F14B1CEDC25C642:\ +000000000000000000000000000000000000000000000000 + +E4D63CD417596F627FB4EE54E27FD338:167D74C63CEB050BB0EB4E3123DA39BD:\ +000000000000000000000000000000000000000000000000 + +473DBEF5C2FDE2774B2858166DDDF9FE:167D74C6C314FAF4B0EB4E3123DA39BD:\ +000000000000000000000000000000000000000000000000 + +62E1D3103459521F0F479B9115A6D66C:E9828B393CEB050B4F14B1CEDC25C642:\ +000000000000000000000000000000000000000000000000 + +E1341D2FBC279ABCD4EFF8898DADC3D7:E9828B39C314FAF4B0EB4E3123DA39BD:\ +000000000000000000000000000000000000000000000000 + +8B45F9AA3FC0589FA05364CE5F5D2F1B:E9828B393CEB050B4F14B1CE23DA39BD:\ +000000000000000000000000000000000000000000000000 + +BAC8FADDB63387F8927E816010E0C506:E9828B39C314FAF44F14B1CEDC25C642:\ +000000000000000000000000000000000000000000000000 + +02D554DE3674CCED1D337A873B77F5AE:167D74C6C314FAF44F14B1CE23DA39BD:\ +000000000000000000000000000000000000000000000000 + +A647F5EC14A07189E9F75F937669C276:167D74C6C314FAF4B0EB4E31DC25C642:\ +000000000000000000000000000000000000000000000000 + +4A6C0DBF87CDBDE1392E198E5F9C54F9:E9828B393CEB050BB0EB4E31DC25C642:\ +000000000000000000000000000000000000000000000000 + +FD812C0AFD3E15E40CFF9A6CBD0A0BAE:E9828B393CEB050BB0EB4E3123DA39BD:\ +000000000000000000000000000000000000000000000000 + +0E41AE2781D439F0671744D4A4BB6A9F:E9828B39C314FAF44F14B1CE23DA39BD:\ +000000000000000000000000000000000000000000000000 + +AC335553D40961A3387BD2D2BFA6EDB3:167D74C63CEB050B4F14B1CE23DA39BD:\ +000000000000000000000000000000000000000000000000 + +E39AC2845BBBE8EDD743205ED7DF1DB6:167D74C6C314FAF44F14B1CEDC25C642:\ +000000000000000000000000000000000000000000000000 + +AA7F44B5D845906C835C65AE12A044D9:167D74C63CEB050BB0EB4E31DC25C642:\ +000000000000000000000000000000000000000000000000 + +E3E1B65693171906DB775EC7E4CAE204:E9828B39C314FAF4B0EB4E31DC25C642:\ +000000000000000000000000000000000000000000000000 + +D095576FCEA3E3A7ED98D9F29073D78E:B90EE5862DE69168F2BDD5125B45472B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2F6AA890CEA3E3A7ED98D9F29073D78E:A3E17E2DF4EA6F41B2017E37023F202A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D095576F315C1C58ED98D9F29073D78E:FD2951E466110BC6F4816EBF968CDD01:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2F6AA890315C1C58ED98D9F29073D78E:C36EE750C51192B0C85D5BB2584AE062:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D095576FCEA3E3A71267260D9073D78E:86069E27F65F454C6E3F7E9097DCEFAA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2F6AA890CEA3E3A71267260D9073D78E:00FA885A8854844C970338841CA2E24D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D095576F315C1C581267260D9073D78E:A18A399A0AA2FD20EAA740A0CB6145B5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2F6AA890315C1C581267260D9073D78E:3D79E39A79CC14D97147F3D172F66BB1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D095576FCEA3E3A7ED98D9F26F8C2871:1D34FC93E24880F5AA52896494590502:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2F6AA890CEA3E3A7ED98D9F26F8C2871:9B9FE52195C3DF04ABF49E88AE46AA80:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D095576F315C1C58ED98D9F26F8C2871:439C0750227D7CA832DDB24102C7AFE6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2F6AA890315C1C58ED98D9F26F8C2871:498BDBB479E9AD3E0C9EFA977827A7E3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D095576FCEA3E3A71267260D6F8C2871:A276C04597DAFB6459A1483051B6A74C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2F6AA890CEA3E3A71267260D6F8C2871:4D4D78002EDB3AA6DEF37E114AAC4C9E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D095576F315C1C581267260D6F8C2871:3AB14921E0F755A63DB9F7DF82030E6F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2F6AA890315C1C581267260D6F8C2871:5984934E048E623F6F1F6E846F655CF2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +BCA391A780641EAADE755440D55B7C79:8A23D955A8EA12C9C49CB6C87772D56D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +66B9589D9B8BDA10A7B61F08F1BE4ABC:07D9508924FC120A8C9FA3298FEB102E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F95A83752C766787DCB61FE8029EDAFC:BF79657FE10E1D40DAB5107AEC3902A1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E4BFB5F01F5AE8D5DA7554A0E6841386:B0B5503E111AEBC1222FD6CE80FC95C0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3644C76F916C379DAA45F4C5455B5E3C:1B33D206D927E2E504E1E09A2913EBAA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +524C7C18D2890A182C794072D8AC1AB4:18F0F5819A31A3634925AFC4204A292B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9D422AA2BE5665A757794092849EF859:7ECB8B26799C72C688138B0303F5AE3D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +49B56E8A5D8FECD5AE45F425AE96438E:465911E4D18055AC9CBCB179AF8CF563:\ +0000000000000000000000000000000000000000000000000000000000000000 + +FB7281A7A7B11AAAD386BF8D0F51AC43:17AA2A72EFAE82D9E6DBA3F7ABDC5E1A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E1B971981BABD8D055BA0B3AEC65A383:1B97AEA16862EC3A8BFA2B6CDFF42C0A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B68B93750474B78F51BA0BDA506BF539:9A81D6B18847AABAB201BC773C9578E2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +63BF9C151852C102A886BF6D7BA005A6:F1F1EC24882931369E45DA6FBDC72944:\ +0000000000000000000000000000000000000000000000000000000000000000 + +19420367B3B9339D5849E0F70F79A5F1:D5E43C42C34FE1280CCDB69F1E73B1D2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +42647EEA57A908D8218AABBFAAA02783:4BB5A2BB9A00F6132F9301E068076067:\ +0000000000000000000000000000000000000000000000000000000000000000 + +BD44EEAA9454B5AF258AAB5F4143FC6B:3A379C7CAD8635724825D2D35DE4D95E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5E9D6C985887C5022349E0175B6581A6:D6CD8A324A74397331E7C7913BDDC40D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +FEA66253C13150CCA139B2A3914AF942:617F156CB641731508E0C2C24F30AF8B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +FC0B8D5D7C9744BA7954677CB0A27072:600DE4F0FA8EA6DE1BA1CAD12D91AD70:\ +0000000000000000000000000000000000000000000000000000000000000000 + +554233FE589683EB6DE4AF5360954967:14D887DDAC1D124186DF25110C618B63:\ +0000000000000000000000000000000000000000000000000000000000000000 + +445FD65B8A616351C18D5D9E94F86F96:B2A26A5E4540434277654B4FCC76CDB8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +47AA8DCFCF3FBA0684C89CAB9A2A92D4:2BD5D90CB296016CE9FECB90E454FDE1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +EDA94AEADC314960B491FA7245CEA146:0395D2ACE5006BE2DF6EDC521CFE6372:\ +0000000000000000000000000000000000000000000000000000000000000000 + +113106465C379FCE76477527E045D692:7972F08BD18D0B16D67BB3BF99DDD096:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3282ED3A1D687E195315A034F83C248C:BC778D51D757DD9DA5F5051824FD7159:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E30A22BC4986B7851ED0F915AAE95325:D913538943E1553B7A9F9D6C87B7FB26:\ +0000000000000000000000000000000000000000000000000000000000000000 + +07EED76219973E3CA5C48B1FAFDAF3FB:757F50123AE84DB0D11DFE21A61C606B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2D9D06E07874A97BDE16CF54856BA690:CFD9B00579D84963621B5169E70863A9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +843381809D9CB637FEC0A99486A13157:31E0FAB5DE7BE867A4272D12FC4F05EB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2F5F9C1F4B2C6E62BC6FE72AD03B0C93:F4349842DD05F5F81EA9302869793D73:\ +0000000000000000000000000000000000000000000000000000000000000000 + +294946180CF7EAB708840814BB2117D6:ABB6C4F719C839B0A35B24E2171BA15A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +BD61CF3CA72F7B0547D7C86606DAA046:2613987BA99FEF9315563EC460A2BDA4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +858989634E54409DD72739F6A270AC5E:A0190A0D109F01A0BE0D9C2AA2BA79EE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +41D4C7B9FA3BF27861B67D28CE795543:0A08FAD749BE5EAB5C3AB317951790DD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A753BFF7F4E43CAD48D7CCCEEFA69929:100AEF381EAF8A677EB25B59FE299357:\ +0000000000000000000000000000000000000000000000000000000000000000 + +23606A3D54D13B00F9C5C73B8986116C:CFD0988E16F3E2C00B95AA284EC61790:\ +0000000000000000000000000000000000000000000000000000000000000000 + +EC92B059C312D8552048541FA0C08D41:3D463933505FCA55D7D1DFCC70514247:\ +0000000000000000000000000000000000000000000000000000000000000000 + +911F32CDC4AB95BE21DBB26D02C85A39:6C6822C89035170C6550399D7611FA01:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8314AA08DF9729B0CADF46FF74804827:268F3DB80AA9D7216EB66738C4EF6F7A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E21A90DABBE27C02FB1B60A948401A2B:BF82462448C407E7180DD8150ECFD379:\ +0000000000000000000000000000000000000000000000000000000000000000 + +087CDE5529FAFB124E8595EEC504873B:7C80B7A4CFA1FFADCC6099AD6EABE246:\ +0000000000000000000000000000000000000000000000000000000000000000 + +625687201937916FCDA1BCD9F2A848C5:891E63EFA3554394459FCEFA252D182A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7EBA3AA477A029664D9E2E9B99F6140A:2483E89D964CF99B3FB0D1A3A45782FB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +DCCEE8E27ED8D75763F7524A63D215F0:028BC9E5F853A160F39A83803AF2A7B7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +19CFB7ABF48179C4851C2F25C92BA826:26221D701683AE54ED151ACA84DEB442:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5CBCC9B2BD2F1D3EC82642035A092467:8A5355C93A66CDFE21EF6842CF80E31E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +082504676AB8766CA4F738C7BBE124BB:2B9E10C57473AE627D43266970AE61E6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6C0344E7FA166C41B4199447B8320317:8271EFE5D0E0D6274B8A1C920086FE65:\ +0000000000000000000000000000000000000000000000000000000000000000 + +083C6A6AD16559D929D128016819210A:7DAE9CBFA76042FC9096F4A6A143AF9D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E234B590C30CE6F2A068598498FE14A8:3BFE3D4FE7B417DC0DF94EBD0AF57154:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8EBC8A9B40C2710981158294FC1524C0:3C6B2E08A25BB1C9D8E891CC19681A2E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A4A883B169B2C1EC1ADFBAB989779DF9:8D1D2E8B3E4B8869F1FEAA1AB2975170:\ +0000000000000000000000000000000000000000000000000000000000000000 + +BE11424787E04DDE5B6D87C327AE5D9F:CEFD8D50D4E917DC70849A1CB8CE3C2C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +32B6435915AF7E05F759494479E6B294:C4563E114E1EE39F46FB68ED092D7C27:\ +0000000000000000000000000000000000000000000000000000000000000000 + +07A09B044F080EE504D92A3DAC01D303:258AE473968C1DA8EFD1FA5E340A83D7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +1E4325EBF0CD71DDEA3C8B3B5FF23E29:073A7BD1ECEF25E0206C9042C00F6731:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E45CD56C95DE72CA3697FA647A0EEC54:57C8671286D9996FEAC834D3692CDABC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +58CC453047697A9D4855613C742F9688:4A56D387BD10C8F7A46C96C0E2F678C9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8F4B0DCF7323F12D2C6C3301E1A86CFF:59A2EE2B3F5D52A1354460582394F0DA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +60D7A7390C51292D63F8E13D94DB66D8:D347A65241A7BCF70F04A68A6BE2ECEE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +FFAD53B9D3B77B103BF9ED6F7A53DE31:3B16D9CF3680A56D4A23722949AA2FFB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E3913FC5766362632C0AEF411A2329BF:6C5D76419C71E3A34DC9457B990708CC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A6473B8402F5F57FC4BCADD69DA23F78:190CA4D0F4BC089B3F26F03E60290FC1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B714071EB4260C9A0BD650C7E19832B7:B730D4DFE3ED225B06B2A3BEF52DC790:\ +0000000000000000000000000000000000000000000000000000000000000000 + +388C8FC9F048D4CF103C43CB275179F7:E2FAADBDD818C6F4532758EC96C56A73:\ +0000000000000000000000000000000000000000000000000000000000000000 + +90934F3C5F5136B11EFE5FF9DF9DA0F1:9D593FF89F7EC95ABDC3B4F8D2B5B3E6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +DF2B2ACE7CBFC27887E5483DABDF837C:ED1D6AC5EE3935E6DB4CB7E34990AAA1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +BACCF7E913B35F887489C30258B7C2E2:0A9D724CFC816E5CB13A2147BC64D694:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D23A16EE588C5188610DEC181C6C7DCF:9084606C1FFA7A3B8C27977953C686C9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +75D6E08BE0C85693706F42390387F792:EEEA1012319432080499711FBBDAF413:\ +0000000000000000000000000000000000000000000000000000000000000000 + +EB7A15C21595522B52FFF012D5B98D5D:70EF833B23D8985C01B7F68BB732035B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +50BD484FE42B4A1C49F9F24D2A0BD279:50F7C8A8D280FED79EA137B19B6CBF63:\ +0000000000000000000000000000000000000000000000000000000000000000 + +65210A79205B1E90040B30205D60EC0F:CDCCED47818563F849FB6E2E03A536BE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6A6016462364EEF36CD86AFC407DF814:C003B86F7C550805EA2C4CBB0D18C3C7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +1354509926BD2A9D24C3E1C343E57685:084EFA18B92E39D6D5929B8A85EDEFA3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +69D5AB6AB54A51F89510DCF5CB929443:E267FCCBF14660B3283B79DAE067CDD5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +936F01C43C2AE4F6237A1198DC1B9A12:E181F5288869A4BBB5BD7B982DCE044D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +09EA3582964BF1C95FC528262D40419A:ACAD023D370F43350F141B95A7EB2B82:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4B4E58B375BDC9FCE5029C3015EAF890:95B8EABE9BC6783C4FF9A39A8188B6F1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8AF33FCAAD22AC2F30C1864E8CDC44C9:F7BE2FA21170A24902994FCE2753DF75:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8F2947144FDB524D6A7E4B8653079109:D7F8A1A155707CFFF493091126ACAF81:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4692BD551D478DB55B88577C51401C74:19CFCD975F915B1B91B52B0A3F0AA9DD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C9006CD66124A21A730EFCFE380EADDA:1C30408126876EB5352A751E29C7CE24:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6B77C29FB0D9236EE31FE1F8DE56B87E:0AFDAA45047280613BAD45D03DE88740:\ +0000000000000000000000000000000000000000000000000000000000000000 + +54AE286A42141274F79B54DFAC4CA6BC:C68A8E4FA3C13CF7479BF429FEDFE303:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F6FB23BCC18F091F9B8A0284BB112316:C3D26D89600BDA652A0666306BA5591C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +08F5A81FF672643FEB06241372C1A7EF:85FAF4EF8BBF9AC0680FB8C23475A52B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +50B8A6F3BA479442E47FF3DE5EEABD0E:6267A16EB828E472607915291BDB007C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8379BE367A37C3710331628CAED61D6F:28509647E60895C9E249CC82576465AB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +48D56A98749F23C5221B2BBED38D6B41:F98CE8293DD9DC8AB4661A44ED500908:\ +0000000000000000000000000000000000000000000000000000000000000000 + +81952B3F6E16345C8EB291532F8AA55D:2C8CF6EAE96494549847454E451F574F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5F98C90888EACDE82696B9F02CC845DB:BE3A8C77C84E12E8F8427DF0CC591681:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F079009892C0E82DF27E805CDD767EF8:810E8C7A31A49DE7A02F2744F490C0CB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3E1BE2C90DFFB9C7D858E23BDE70C3B3:A336A43F20501DE36D9C42DCC69B5C3B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +1D8C428C8F0D7262D2109B9D1E16EB51:B11FD9AE0D67CBDB7F990DE4FAAE2A61:\ +0000000000000000000000000000000000000000000000000000000000000000 + +801EF23541E6FB654C3884771578AE2E:8F1042F616351D5FDF929C50F3109169:\ +0000000000000000000000000000000000000000000000000000000000000000 + +40B14F285E32BDD61B29160C0C6BB610:4D5E33A7533E71FD3C4BFD7157FDDEC3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4226A372CEAAC4F1AA0BFA2588817D8F:D1E9CF5BCCC71CB62C0D57255CDBC2B0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F0353993A789A852FCEE7795E3DB8235:D0CB3CFEA6162C4DD7F8BC29E4702344:\ +0000000000000000000000000000000000000000000000000000000000000000 + +CEA8A3CE895CB4252905D6E8FC7FB8AF:BE8CC9E62A360AAF0F0C3B59F09D6509:\ +0000000000000000000000000000000000000000000000000000000000000000 + +FE7CC498A82A8DBEC2798FEE7F4B6BA5:31489535231BFFA6B300949589969866:\ +0000000000000000000000000000000000000000000000000000000000000000 + +80703279F021C9624D952AFAA3E1FCCD:EEF27A88328000A4CA3BAE8FE26D03F3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2926397A6E38A4EE7D1EF20F31BE8702:626B25E780F216EFCB33ACEAFF53D346:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F24B278B89128056E95D04412819031C:52A77408ACF9483F3360CAC1EEE7CB66:\ +0000000000000000000000000000000000000000000000000000000000000000 + +757846E9F24ACA7BBC53057D86F40DF7:D9909AAB2D47E73F5B2AC8B4D21C5152:\ +0000000000000000000000000000000000000000000000000000000000000000 + +69F036E5559B53AC0BE4D71933C9FA6D:B123F297E11321E138ED8B797E3935E3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +AE25363E7527BA574B336B3658043EC5:531265FFA27309E010682226D40FF301:\ +0000000000000000000000000000000000000000000000000000000000000000 + +261DFB2B0FC8058DE4F2BA0E9D07267F:73191403C7F106220730944CF664DBDD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F4F44EF26EEE2F214E55FFCFB67F747C:B27B0272C70703C163EFD2AE9B696D68:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6E7D61A090B1DDFA455A9334F71B1049:3F301BB140FE500EE6211F5EA8C475D9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9BA82C854F0602CF32A7A1FD454A244D:0D07EC51FD0EEA788F4F4118CED4F76C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4943602AA81A1B09F25924A115038BA6:5DB3CF4BA15D10B20FA1C16CD38AA48A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +BD655DC9F095901130F61D7461169429:3F1DA00A0B1113E731F09A18012FCAFF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +881C7EAB3D5485EF3001CF123AD232CD:7739D6C688AECA837B665E163D7807A5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +DB78BB44ED268A41D7BCC768F1C1DDD5:EC9954AD43C78B7F3E54437EADD41E45:\ +0000000000000000000000000000000000000000000000000000000000000000 + +EDA01E4405F7A5879C1D9DDC99E494E2:5714395272B96FBB8A4DDF3371D99285:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F43DDDEEEF8000C262E2CC8025E7F7D1:3A78EA14F436C82606F3EC036DEADB82:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F67BCA996B8F68C6178CF12B69942EF4:51982744D0D4441EDC22E9DB28148AE4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +1B2F9DC1D0081629E2D783BEDCFE556F:0142F890C1EC3B1324242A6266DD6E35:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7F697D4DCBE48A0E0C1B76905EC5387F:B5ABE383FE29DEBEAEEE1B1BA216617C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0087BA91A953F0AA37D906B4F83F539A:2DF146BCF57886EA715DEAB67FC919DA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8BA37531E5AC90DF7C274BA0F09F710F:683F0B9893990052F5002D12060F8737:\ +0000000000000000000000000000000000000000000000000000000000000000 + +31D0A790D8B5F52BE0B6AECC098FFEB6:709631DDFB876005986AACF3CDCE4309:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C582C293E55D228095BD51C634ABCC1F:EE5CB6D8B964B9D6D45DF97FE26C46E2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +82509552588B0707D8E972E34D34FB6B:A8BB6BC6E9044A7D4C0ABD1A63EEEAD5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +92DD30BE9D6FBD8CC3CD6AD5A02B9644:E743F0292626C7198388BB07B172E203:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F533132CEE021C1BE4E27610C7FE658B:EBB22F93A2709B4FCAB29DACC2B7CEBD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +821E2D8D0E1D8DF54F92B0872C26F647:B8AF4BE5223225DF4AA9629C6F3E5DB1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +CAC520ADB6D2116EFCAE1BA9CFC07A8C:CBEF84E5B8BDDEAA94FD63FB9C196B95:\ +0000000000000000000000000000000000000000000000000000000000000000 + +61370431D23B19C9919F90FA630650C5:C9B61AA02DB1164F68A5439133AD0CDA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +399E8C6EFA778B3B0D7414905FAB7FCB:144085908ABF7F86FF737DFF301F3408:\ +0000000000000000000000000000000000000000000000000000000000000000 + +14189BC9EE6D85C59A56EAF1897C8456:2BE6F430D40E3E43C9C0DBFBE68B2550:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F1E5C20447D785B4AEE92AAB76AADA7F:67E726A625DFDC0AA862F8BBA7097B7B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8FAAF9826481DE26DCA70C204A9060BC:488470EE1514C99C1CBBBF21D2205EF2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B6BD97EB4246524E123EAC300B208AF7:5BE2B23A54FB35FA83814A2BB9C402AB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0A78A42122FE13F849142522BEFAB9F9:04501EA5A82BCC7157832EEDE91381FF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +46E4EC66D3EA604F4F166259F8B31F04:6D2DE018B6024B5860C5F8A85D8BB034:\ +0000000000000000000000000000000000000000000000000000000000000000 + +20AB8FE133F07559C320D5B2C41FAD15:C13CADEF2B413DD1CBF3AB479BD2B9B6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7938DC46E7E3DF01F3A24D825BD86672:EB2B02D0A6908C51580D552330189C94:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7F7938F0A5BD91783AAB003AE1BB79AE:B54CA133FE06CDF7C37B421559F72849:\ +0000000000000000000000000000000000000000000000000000000000000000 + +91A8F9C577E2852E312DC4A5C1255EE1:0EAF829E6680344B639E5F45B0246598:\ +0000000000000000000000000000000000000000000000000000000000000000 + +ACE62912A71A4F34B672D9C80B73E12A:C91C23C725254124B118BD2DF16FA907:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5B3F25EAA264348B446EAC39C42AC7A4:6FBD63968E0B5E19C62D320FC59DFD42:\ +0000000000000000000000000000000000000000000000000000000000000000 + +63E2A7973C2A818F6D1F9F9640F703CD:94C9FC1FB22610AE0BA34B8E8AA4A980:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D8E72560E63A9C9F1115C3287ADDCE7E:CA01FB995BB46F6B0870F40D672FD0B6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +126FC05EB726CB731D90916A80BCF638:CBB52C3ED1DB3A4D60B4C205E167C6E1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +BF96CA36FD923F966113671E8C9D84F2:EB8710E2F753B46647915E9B6D1F4FDC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F0EF517FA3B3F8FA6DA04C401955BC47:90432E85F8FFFC8AC6198F14ED96E6B5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E5A4F0D39FDC96DBA5BD04FDB69A9439:52FC091A6D85216ED45716A06BF28F7E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5D484FF8D3B7071714D0CFAF400DADC1:8DE390FE597FF61A3CCF4443B0454940:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3146A7EB1564016886631C7AF1500C42:551CA9841792EF7991ACF162C8F257AF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2241AA352F3AD9FA379F7AE0C756239C:F121B24FDD91E6BB830D131880BFDA6D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D70CDF5BBA9D65227656CDC98C1FE3E9:7FE52C4C3315DEA7B5D9984D5EA4CEAC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +FA84B748F0B60B0BBAFCF5B49EFAEA49:F852BDDB729CBD20A2C439D1A659E1DC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +FF377F97E2A6125D6E1ED3C0F761A215:7AC46B10E7488936BA1EDA1745AB310B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +DEBF9FB92055ED91A1BD841D68F87EBE:85F83747E314AB1A65E42D6BD9F130D9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +CF6E048F8EAFD765DF1E1CF230138993:C4B603A7BCB0A5FB8FCE31B42A8CCE89:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4E377F3D81C2DF4850D3EEF175B39155:6C6D4021723B65644CE895CDF0EF2E76:\ +0000000000000000000000000000000000000000000000000000000000000000 + +08D1D0F7E188F57362457B0EE4596CB6:CF1EDB093B63D04AC6A043D69F1E6BD0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +67E55401208F491D5BB672E2F25B8F9C:47B1E80E65C74BD56312EFC18E16F01B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6CAE6670BB9E867784EFEC6E405BC90D:344F3BE8D68569097F9A4A5991D43551:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E4B8492F2D5F9B241855068746F09AFC:81277643B99DC768B898D381EBF55CE1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3888ABBDB9245E535F52C2A1C4E9AE82:B962C5F25FDF7684E52EC354208939CB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D0B06EA2EBA073B21628DBAC4FAC7656:75A33ED3B6B30B41421C3B251B76F82B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7387F80E53D5F5B68D262DA9B948C143:51717F47145BE37498A1F1A180B88D4D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +07078EF7871B2DF91526B731CD7EE98C:E8D32221991BB2861AB4F271C17AFEDB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +48CBB0CD929BAD37E3E09C07941A6A79:292268D201E5CEB4C27B9D860B3F0227:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F9FBCCBFE5B4B51DDB3F67B253A54618:4DABC3E8F80E9C72656AB2FFF26BE438:\ +0000000000000000000000000000000000000000000000000000000000000000 + +49CA02290571BB70BEEE06F07AA31502:B59EAD47674A0A4B59C318DF6378320A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3F407FF4785D3E2E47B66A3675302268:50AADE7CD8EF67BD643B86D4B3023D85:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3E4CE1EAED91968D4D67F804B4576A87:654D279050B241B87B9A511FAACF01D3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +847E63FB5437129DCF4FEE704809EE09:DD41EF5762AE57F0653D786BCBA70DF8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +720576733C67099529A17B6F4010FEDF:FEF594E990F7423A37F71963136A671D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +AEFEB7A92EAD088FCC30CD88129E22DA:C54F79A13C6F2835D694AFB48791836C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F3A4234B3A72361AE98322191BDDC35B:689FDFB1AF5CA1B55300A965702F3AB5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C899AEDF52BF6FB16B5F3DB7C47F0088:CAC32974F089ECE899D9AC85C612AFFD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8DD1993D1F9FA3850B2CCFFA7A42BB88:FC6F6AD5E8D1AC86EFB14240D1BC1EDA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6B7442B6328BF059D87828FDBFE35225:775ACCE20C7BFB08F20F8CB7CCA80C32:\ +0000000000000000000000000000000000000000000000000000000000000000 + +28C94A8AF7348B622A4C8F20434B54D8:CB8066BD149F368A04533E6893669674:\ +0000000000000000000000000000000000000000000000000000000000000000 + +42E049CBF52DD8A65906BC0ECDAF7D21:63C0F604FB661A4876AA5A806CDC618E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D1FB1FB7F21CBC0C88D05F13DFC35185:6FC61FC03C4D7E7DADCCD93A4DAB5219:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D382977D7754A6BFDAB545E9747B19B7:E97A4729AA40ACBBB409D5CC02A0A075:\ +0000000000000000000000000000000000000000000000000000000000000000 + +85090B82AFC0B9AC5273855778BBC3A6:F6A41B9AF291ED32F3ED14A2A7395253:\ +0000000000000000000000000000000000000000000000000000000000000000 + +08B463BABBB37A233F5F106C4D5F4129:F3952274AA0E8FBF2803A244A2ED3176:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C2197F028D57D6EA121C8914FE626BB2:BE43FD4AF749F24BEAE40F2DE31B8CB6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4642E392D2326401EF9FAE2B872B809E:950F995FF73976974E602D7C37B7D67A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +765D5C526AFDB0399E1B1DB8A89FAC98:98A8A7CB6C63BC034374D37AD21FAD96:\ +0000000000000000000000000000000000000000000000000000000000000000 + +39589154E13C7E7DD44AA5A416B19381:9D78017FCDE71C8FA53D6BE31F20F354:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9305802BD1628C12B81CA03A05C18644:80FEA18D5BA12EDB6D4B801C0A8B356D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3FF59332CF19765A310B432D8EC2E24C:90C697E4D23DFFDA31762C96A0314520:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F900F6092357CFC0D24F268F8BCE1849:06DB3FC23372A53D5ABD29D3AABA9784:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2AF78325BC7FF73893B672281C7A8A2C:FF9511236216D6AAB165512C862D1033:\ +0000000000000000000000000000000000000000000000000000000000000000 + +EF0813F05B70CEE98ECDCA10378E25C4:A55D68BC71C81D9803184D5890968A78:\ +0000000000000000000000000000000000000000000000000000000000000000 + +65D15161C93536E3B3D17D72DBF2C36D:64771CC3E89296E5B51D86DBE5C61697:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D4BF40C1DB6F6E30108AF6C99B379C74:39D03BB7059D1D4D56FFC0F51B46D1EE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +ABC44A5DF6BE71F0BFFFB7EDD43FF39F:114EBE72C55A45A353854EA02C3F5953:\ +0000000000000000000000000000000000000000000000000000000000000000 + +DFF5CF0EF3A729E2BDF5AAC15C47B482:F5CD1830D1E1C80676095F975AE9C4E2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +762A7EFCA64FC897E2AB73D7B1E4C55D:5FA9ABFF7A5A4F38C51ACDD1ABF7B1CC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A19C0EF84F3F1EE7671BD3BEAD9F5C4F:97CE27FB349A3E47501026CFB8A482F2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6D9BA177DC7ED78B677A2B777896D122:8CC60CBE26354E70920EE8A8DEFD8C45:\ +0000000000000000000000000000000000000000000000000000000000000000 + +84D38A4D2BD1603299B4D1268D5C04ED:1A5308CFEDE62DA3D4D250B5CCFC251D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +CCCABD652DF9E408311E359EB18F416D:71377B721483470253AFE3181F523921:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0222F3AAF0D213143635B63CFAC02032:72B50A920DABD365AB2C48E888B76377:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9BE224E2313DF5E93FEA7A9051ED8456:D8C83B81A2B73FD56538015C67C61EB5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0F92300EEC97547E6BC58E066A28FBBA:FB0D8CA9BB551B808B335879B98AFA90:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C9382AEC049FAF4CB75128D8A0FBBF10:56E669C32A3481FC05F5AF22473614B1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9F5BFB399A615408DF0BCBA6E43E2130:C5AB52A86EFD123BC5522A64035FECD3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9FBE5F1202FFD449F7833CDE44DCA62A:7320AEACFD518D39FF69068F64A6CBB4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +830408D6A8F161C0C2D058A2CBA5AAB0:FE7C48092F269CC1B9F10DD8DFD866B3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +46D86E657103B18078645E6AB0C24722:D7D1B7E2A137B75C89290162F16C6BA1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E7DC58F11BCE3C7D6B8AD2A5415EF3E5:2114D2BD30AF001BFC2655F832D81C81:\ +0000000000000000000000000000000000000000000000000000000000000000 + +07BB44ADA25B638C091D92B67015B703:087AA29983682867A4690287BCE3F0A0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4586E5A6EE3B908F08B7392B74B478A6:B92726E53E1596B88C53A82943895CD1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +ECBA6E02BF9C11D70A2C760EFCEE2A76:45C50D0211E804E1A75EA5F4CDD9D672:\ +0000000000000000000000000000000000000000000000000000000000000000 + +1F57C57183C32E7AA748E4E8D2E36966:E4DE4377C9ECB95A7ED81C63C34304AA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +1C655E258605EE91AE413C246894B354:3283FC8FFE25005AE6936FF3BD738CBC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +84743F37B54B7B8CF1D94053B0970599:3BE8FC8C5AC5F98592AE3F9B1A77E71D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E4350F6E48912239D635A92EDC5D8BE9:BD62C9A7863097A8E34C5E93461C6B5E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7C4ABA6DCC886B3046F32AF18F3ED0E4:1DD38A4D9730F51F83EC35B6CD0AAE93:\ +0000000000000000000000000000000000000000000000000000000000000000 + +168D7910C13DB8A372EA719D1D2D4499:445FE01A29E7A8D34CA8B4B2B2B79066:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6D35D9D0C309681F3B2E7663F940D67B:8F10F905C780709E2917AACFF5A6F4E0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F734EF63150021DAB7EA0B421F9DB7E7:833D03B9E53C1FA9E5C4E59C778527C3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2420531C90FA129E86D116BFBD4FBE1B:9660D979C78743F9E85683E58072C1AC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +CB6354286F89B58A88B711CC9C7E1316:2788DC343D4CB5CA7E9E702FD06244E2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7550AF569DE4F4659EB3589CF5812751:103F876C50095392E8CD90E153AC7932:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8D59F016346D94F4A051970F433E129B:5D6DBE294744555924D9A21ED0F97497:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3595D0C290ADC80AB52F260E54062D09:1189DDBB3FC2481F092A162DF999AD84:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9E34D36709DA00EDFD1828D3B049EC85:7E0F45E113BEBB4BC2E0768612E99B84:\ +0000000000000000000000000000000000000000000000000000000000000000 + +BD53751ACA579D2FBEF6AF264C1471B3:9F42747C49F414090AE7D3A370DDD89A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C5CFE4490F9EA125EA08E52B130DC452:0262E84E186D27A2AA3F11ED73560911:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7296903DFC97CE8911E6F69BA9D77C57:CD8717F55E29DA5E2AF4DEBEA34E6871:\ +0000000000000000000000000000000000000000000000000000000000000000 + +67D1D868081846C76CD5E7C805072AC8:5D36D35E48AFC010FC6AD5751A745FE7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C01ECC52B57ECA82268DC043421A9826:48D7F60A1E126F0F9185B8AD37CA77AF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +03160618AEB467F5D855CF636A96D188:7F5C9F5E608F3BCA661B9568EE89337F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +41075EE5796F93B79506F5E707E878B4:300C3B4DBE4FAF383C7F1CEECACE3BC6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A88BE4033A227A2B1C40EF6A1F65C7EF:112B723BA5AF2B8907B8A9AD4C3F5650:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E0D8C49C27057C8B74D6BC20D4C67D89:2116595D34B5D4F1EA1B0A6816930E14:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E6209F87D0DF56D163DE4167A120D541:88FA904B5A4B678567591BBB834A83F3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +98DBCA6051954B0F57F8FD14C0448F01:DA33BC0F7510CCF9A2CA4FA1C1538A76:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7B6C866DEB20E9EF998193BA14ABDF4D:717481414648473321CABC8093446C55:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D7351619C93520F9EDE823B1BE6B1525:D5ADEA8259D2E8B625EA2F02BEF19CB5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6BA35A4E937AAA186FEEE58CD252C383:FA2DE39C8A6944C280370D07CEBA6140:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4CA9DF4245FE3D5BC9BBCF0A77E5A6BD:42EC0E38C6BAC576A6C1BC7944F612F7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +AAB1E15C2BACD32DB1CAE51B78110D1A:CEDE8C8A7DF59EB235BA38BBA24BB911:\ +0000000000000000000000000000000000000000000000000000000000000000 + +CB457358E20488B258E360D678BED84A:D28FC92A52E631F0D8E8B343A4A3B203:\ +0000000000000000000000000000000000000000000000000000000000000000 + +41573D084090591302F86009ED66714A:8C42C71176414120A4BFAC5E712595BA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2376FCB2F9354E84204BF1FECFE37467:7BA7AFC5BE5D69600E68CCEDF780E1D4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0A35CDE7A69929A31C7205821EB5AC74:0B3776F3CAC22BCF870DDF10C1869A4A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +30AC1DF30D0933A1BE9A7885BD4D3C5D:94F0B2C509A8531C9A0AD81637C2DCE0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +139A78E630E49492D3A938D837049346:34579E1E82813F9747A5B132FE4E6964:\ +0000000000000000000000000000000000000000000000000000000000000000 + +AB6010C72E0A156057F8E14EFEDF98FB:0C7A02F13911D33BEAD1471C708987F3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3F0EA3AB608E5CF9814AFC56D7AE1B9D:3631C40610EEA661633CD7B8BEC865E2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C62A08EA0795752B072A06F4AEAB3ADB:CCB2F6767F50B6896B9244C09287C9FD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B73A62B4C9F994FC383EBD65DD4EA0B1:ADB0391D3F717FECEF62C07B22E31062:\ +0000000000000000000000000000000000000000000000000000000000000000 + +493270140AEEEA6D72F484B61C9C1825:6ADAF168DEA73E278F0CAC41907F5304:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5F25EC322C5AD4120F115248EB11FAF0:2B6539726858D7A043EFBAA0E33CD073:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C05012D7D2B5270433248793AF438843:AD8ADE6BE4C591A243B4CAE06A709DD4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B9B9D77A5E156DBCDA162DB3848AD95A:C14B99C00345CB680C482D31F8A0C4D9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8FC09B76BE675A5161338F4F73A21D6C:6B547FFB2B57F236A734BACD51BB7F80:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2859C8B12F4439DCC496C5F2BAD2C99E:84C397A83A9A76CF06818FF1534C45B9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +29CD3317ECE7A36106AFF008F7044D4C:07939F9C4DB6097191D90A84D9422F98:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9440D9285BC074FD402117EE963D7A8C:295A81D1FFB0D950B0DF0A61DD96BA84:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C405DE00BAE96D8C354839CFE1E4DA42:13BA97F2392A05E6A2B33C7C713DA088:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F5914DCABF0ACC9D1D58D0011A7AA462:6DB4ACAAD7FABC9CD78E87AC9B0091CB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +80BE9CC8DE81F11996F2EC48A55CA726:FBAA38B36394A2ED5EB7CD24BE8E0E55:\ +0000000000000000000000000000000000000000000000000000000000000000 + +58C8B08BBE5647F74F80FF7C1405DBA8:FB4C62485E9E63D73AA3032CA4387579:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7DA7507D0CA379E2D060D4E8486FC8F0:5135EFE72EEDA1CD3FD8BCD504208BE8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +760489E9ECBCD1B99D5F93659E723355:FF7B0E84D5AA95BF74975347B005E3C6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D8F26A78DC801CF94F42781677C28DA1:7D9C197C3F6A57D489D7D860F5E735D9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +631BBA38307F0F3D46EC6008549DB395:EFF9418718C2B458C7D2F9394080B2AB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +EB4455AC6D05F6D41907B363FCF19067:26611DB477E3C04BAD35582E9DD1D550:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B124E0C47CB5AD6BC70E6517C3BCADA3:99BFF5353A3CDBD7CC524D1397CDE280:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D96D6BE65B50965E1534F10C37B071C4:4520EC9BCB88E0DD255F62B8F58F8CB7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E20DA0529B468FD1F6CEA9E1DDA20D98:7D8EADF99C6DC653A896D3D9AC5AD532:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8FED053284ED49478577BB31C8719DDD:FB895CBFC4FE1B7F30E86B05CDAFE62A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5F30CAC7106D2FC0AEC7D0E6CF1C1B0B:555032BB249EC898CA18C5D212254D98:\ +0000000000000000000000000000000000000000000000000000000000000000 + +95E61BD1C1F5D208B84E2EEA39776A01:3B80F00821708B2473638EB7C234BDA9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2E13F661363EB00DF0F05D3A8B67A931:96B667807256288CBC343BBFFC951A6E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +BE50E7837771DC3782A7B2680AB6EEC8:48A091ED2C8796E030C78F73DEB7B9C3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +494E7D3074674BDB8959BD8C243AAAC7:CBD446EDF4C4E69A8BF57AD748BBAC18:\ +0000000000000000000000000000000000000000000000000000000000000000 + +98EFD397394D507346A9E3CCCD94B83D:1941D2C4E959190CB8B5BE59812FBCF5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A0E491A1C8B2C0441E896AA2006981FF:0D93B922EF541227948915A40F0EBFC9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9906A45DF7FA72CE1D93154FBEF8436F:200042EC80FED60378D724D023DF4490:\ +0000000000000000000000000000000000000000000000000000000000000000 + +934793FC4BDAE33A5BC62253C4BF21DC:E0BCCFAF07ED0FEC18746AE09A8915DB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B2C82F2FC55D78082818996C8B438D64:2CD7B209F7BD58D71753564D647D3716:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B73CB12EC2527CB24079BC91E7CFCA64:C744C2E0A2FB9B4C07143877CBC8C52A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +03BD985787971F4CA118007DEFC23B32:30569622169CC58B0D258E8466B5D579:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0F1B8AB985B4B63BC911AB0B989CC3F6:37326B366FE3CB33DBAC8C8884977144:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9F641156DAE8774283421494FEC92D6F:8043D5FEA980B3AED3330802B1B7A370:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2B14272CB87B86674EC6E848090BAD52:6A014D1249FDB4F83C784F2F957B1B9C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5174558BDE4E1E82A97A908688C1D932:ABBFCE8176303FDFAEAA8DE9988C6C64:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0C4576A319A31D84FCA00F13B173FD07:AF6E672701B09598056135C40ACFF4A4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2F58921AEDF792D28AC5EF3D89E6E5C3:166F24B5F7ACED72CEB47789FB3420A7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +18D4EC77C7545EB9BD18B4D6EE706154:8E4B8A41E09E9FAEB483F4AEED16D62F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +41CCEF6E389ED4819F2A3F0695E05FFD:1FA1311EB223F23085B0548ED3CB8E1F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6FCD11D8582065E40E45FFC8C236844F:7DD9DAF766CF5D5FED9E0CD379283311:\ +0000000000000000000000000000000000000000000000000000000000000000 + +84E954B3E51B616843CC9FCF87F56BAC:FC0504AE07BCB1E1D476EA24129FCAC0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C15FE4ABC0C4C3651D73A44BE8363E3F:23A1BE9DF35CBD354FA74DDEDB761EBB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3E590CE739E909499AE2BF2F081A8791:A1E3EF13407D27B6DB3FBA999430D93F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +843817CF22CB788A2E1AFD63B0E800A6:766369A95B5756584277117C7D80D6F0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +47890D85FC7E1F2F50BBADAE3CDDEA8E:38DF031DFD78DBD121875DBD27A65DE6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +1E49ECD466A95FFE545985D1CBF83570:D41EE3E2DD807C2664CC551BB4C60716:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0C24E139962730F8884348FC344BF257:333AFA1CC42D2B65B69E8F84DACED288:\ +0000000000000000000000000000000000000000000000000000000000000000 + +FBB395C0500A3C19A737A7C055722B22:F22AC1742C3F881CD2E807380C6EE933:\ +0000000000000000000000000000000000000000000000000000000000000000 + +47DFAAA0F3C33B25D10C2D1681778470:4E4437B28D253FAB30DEF9F81881107F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0A308E89BA785C02C4A9A356429175D4:954BC0204437536E81EB2981656018C4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9BCD04EE4515CEBE9417C4BA53F70628:350CCB77E4F7582397C8798977551BED:\ +0000000000000000000000000000000000000000000000000000000000000000 + +116CCAA1796894C546AD402AF21992E2:9B2B8AE3DE719F3B9EED784EE085D6AF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D0FA9A490CFF9AA8D310C9EE1214D22E:DE1DFB5E9A4FFFF1E159CA3D2415AB2A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +04F76480D664744295713B1B9B9A8E6D:21B1E562F5F0742871E15B3CAB25A770:\ +0000000000000000000000000000000000000000000000000000000000000000 + +DB3C71A92F5C8F9FC303DB11D12264AC:5EBE82662D295D950B489F790A611A76:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0800C09A9FB780F3E7C28A3FC9EEEC76:CCD61A1A7F4E08AF0033FBB874FAA57E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D0AD8BD5019D6C9A8DD4886E0A142C5D:C0348D858C4A12CC7B8BB9854781A463:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2888E9264256D1002A2EC2BBBA5E9617:9EC2135DC0461CE34B48B8BEB64AE3A4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +394CBB0EE6765EEB5F63108143D4891A:0C4B799D0E3B5388C9256B7CD822D2DD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6BCFAF34034E97142888923020205C88:534518BB353367DBEE27A4ACBFEAC109:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C30940B1DD0A3753F13279FDAE1D74BC:469E5717F92180BA73682767218EEFF0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C5E22C002C00FBA49991B806AA12D7A7:517571B9EC2F2BA2F4E65D399A2A9648:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C0FB5C0623B6FF6E6B98025FCAEF93AA:277D012742F53FF9E72090ACE0D858A6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00FD0D8AEB919F7ACAD97FCEB53B5239:AD23F1C09DAA2E22375E9E46D9C63916:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A281BBD26A06D1437EBF2D0D2D0E4908:DABA99F79DB7E0CECC494BBA3607D20B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8D356DF37371554CE5CA0507A6B7B2FC:12C0D42C2578FEEF42528360919BD833:\ +0000000000000000000000000000000000000000000000000000000000000000 + +719A3D3C27D8B4B58793E380CDF0EBA3:BBE7E042D9B823A0ABA4A373B1EA149B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9050232A0352DA77C36A4EBF8941E0DE:EEAABE37D6C42DB0A54AA4FABC12F872:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D894906DAB6F24402E0A769F9D6F5AC5:7E650D9CC9220F96BDED18A2ABAC99E8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8354BF3240A66515DCB3F5852FDA3352:F867C36D1BAD141D1C6BD6884E9BD5EE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +AB2EE66300CF3886FF32F94962C5F5AE:55F050D0F8160FBA6211AC804F7F9904:\ +0000000000000000000000000000000000000000000000000000000000000000 + +36C298362E647713C08B4D6B6EDE4E17:9D3AA6AAA9CB2834CD7BAA389EE6707C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +75B95E9CA0FEC03FC14717B4239FE737:9BF44624A4EE5AFCDDAE766F8A0CCBE5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +559EA4F0237D9EEF69264CF1DB7379BE:BFDC04B79E56A3A17096B7D667E29DD9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D5A45AA6B981792704726E4D8744CE28:18B9A46D1F9AC610D7FC93DED07B6F43:\ +0000000000000000000000000000000000000000000000000000000000000000 + +14B025CB6399B38439DFA3E1A0AB2A8C:AE7161320FD6B793C53AE82C486123FE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E61F5E00147A9072DD5C7C9C73BCA55E:D6614BC4918BFC57CA977B751CB63981:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C130A74BCF9E00080C81DAFBD4CB9C27:678779C91FBB09CCE59BFF0A52E664CD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7B33791FB384824FA4EACCC77DCA836D:DDB78361ED1E569E7D82DDB3446C6CBA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F312A6CE802BAECD8D320F48C230478A:BF376E8A67E0D4A6EACC93D7506CF12E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A312F31CDFC678B772F41D85F8960D81:C3278B947706D148D8495DCF7F940459:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B1E2215B44D517F8F3F4EC804AC7CE4C:3C5CF6F19631D11F1AE26CB8EFE06149:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2D18844BD670192026E39530CE16BE27:33E79315CD18B83CBEA1E45D823F9AA4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8B4DBD837AAFAF3BE297471737B4845D:2A30C8A395394CBDD2A970C4763F01C3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +AD20F1CFF0C4695F0808B4256C3E933E:2C062B870AAB8223454D85354AE69C6A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +64B3C2DC52B3FEAC5562AF4F8DA845EE:C3E4C1B7BCE83E68F75758FE33362CF9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +99807008533A8C8E851015F5719979C6:89265DA4FEA5FEAE14B3C71DBB7625D6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +94641E459342D3D007E15692F316D9E0:51481C83745ED2A0405172AF9B180E1B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +89644AE31F62B3B77C6ED9BEE5CDA55E:9D491E8E17E357D992800CD396668E9C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +74C22A64E12BF46EF00DBB12D2388675:852882DBF18419FABD698794A454F23E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2D8AB2CC4F59844D705917C3D1D1B220:30E77D5CCB70CA0ECB2D774890B72119:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3E3660703809BEE497D36875DFDC4D4A:7EDC11E9418DBB124183BFAFAE82F42F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D8E7BCE9B8551C59DC15AF0FEBD75C77:DC497415A0F3BC5538A36EC0EA35D878:\ +0000000000000000000000000000000000000000000000000000000000000000 + +615AFCBA98D0A5AFA089F4C506E95425:D7CE890C864704A2D90DC7B6E32283E4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +082A395DEA30823A8AB8CCA4851DB836:DB153480844804582364CE5381E15C37:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B10B5E124C741A67437730F8B1CA3F82:C7152116908D13A6D22337D7A7D3D795:\ +0000000000000000000000000000000000000000000000000000000000000000 + +112AD1550207C4583005C72188BF3511:41E79330C57AADFD089D8EC6B3569B4A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C1B9A37E9747E23BEF9B5C628E13A739:E9AA948C7329B74389E039168F7B8DCF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B2250C2A5CCE8D50C3F193358EF09A48:935D2A954C7EA28B265673279F6B4F61:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D125977E709F9324027A1CB656B8C1C2:7807796076E0BF2795094C36CF79900F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +649600BA81A113BC7722E878D5869004:C69C842CB5D42C4026244806E3270A00:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5718F3B4ED59D02DE5C40E9A826FFF30:9263BE9CA3CB9661695C1CCD1041F2E8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +AC56479B43617B1C7C804629E36E93F5:C35E27B56BAA1AF03542B3DA703BFEF7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +20027AB27AB4CCF48F9973CC052E0A35:22AAA7F89676ADAA2923903B2A3DB526:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C8DD678E5D5E8F67FAA0CB599C7886BD:734448F52EDB9316CAFA7F095C24B0E7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +93DFF0CC56BDBD950A9BAAD3DFF75B2F:EBD6A3487FEE478BB0EF8EC783E49C43:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7FEF68F9A691BDDD070DB91DF52798EF:4560A566844F1B2F92B35D762F7A2A82:\ +0000000000000000000000000000000000000000000000000000000000000000 + +86A06EBDB131546D77A4B81C3BED598E:37B9296307EA211F5D6E249E9753392D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5C467E141ECCF1B65B6DD86418F35CFD:409732CE286383F332C492E110F136DE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +35E9FAAFD45C1470EF2BE841B7CE9187:1BDB66804D80D832ABD97BDF145B316E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +72E77AA37ED81CB273582D24FAC4F797:19EFE53BFE7FAA6BFEFEBD4F79885F0E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +73A8FAD5559EE727CF006CEB0EC60D3D:81E197EF8F5B2AD7F0312B705AFB5F27:\ +0000000000000000000000000000000000000000000000000000000000000000 + +81B566F5EA6961C9241486A6E526E8A1:213F181798188378DD97935F019AE7C0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0DA282CB8796A24A161FC55ACFCAEC1F:72BF6ABC3AD01D3B7F5589BAC18499E1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +172482CA04A7549BAA12E55B0A2619FA:B40732603C7E9C2D373E12F9516E0426:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0E89B76BB98DF1ABA754504C08106755:1F38D616E20D3F0C4158517B162ED983:\ +0000000000000000000000000000000000000000000000000000000000000000 + +44FBD8823D9D06573CC304CCE5AEE6FD:A4576BC2CA8B8764B30D2DEDF461E455:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E6C9D81608C6B4B736913749E0E06FB0:83756C36B9664E2415D54835CFAA2540:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B03DEF269B39D69E0EB67B873CF2B80C:B226452F5E395B90E46E5CA8F72916DB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +144976F7A2170E86A68359F49C9BF7EF:2183068E0B42CF774DFF0280857F23E2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F86F15E91A74FCD149AC3B27229949D0:A88E509487D41897D882F8A1160F3465:\ +0000000000000000000000000000000000000000000000000000000000000000 + +65B8EBE1995C281D80E471F6B447C050:84EED5FC045BB4817057902699B81109:\ +0000000000000000000000000000000000000000000000000000000000000000 + +116AE65A8B432F02F95BF339DE5F1427:4FB98E68E52EDE677698126BFA06BA6F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7EDA6705CD1ED178F051188479BFEC21:66840CCF17A78DB4748D811B436D0041:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B3B2780D00D441B0641BF54660BC7624:6C24B364096089E615A8A657FEACF53E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +AEFCBE20965D096F631D7844F69D7D8B:0BB3B124E75FE222CBEFB2EB1BA84C57:\ +0000000000000000000000000000000000000000000000000000000000000000 + +94C8C0B27E7FA6B0C66EF69529280A10:7B0C86F6968BE22B3CF6740FA4E7683C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +866CD3970543E3224E756F301705081F:A0400EDBE1D6D08CA45419D39DF4E4BB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +AADB86BD88CD0B572DE6225896E694DA:AD4B42F7356A196EB29EAF62AAAC2DE4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +AD22711443BCBDF0DFB1AB96F3217F98:6B39765526E0D0F8E55606559193D760:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2C63EF91C5BA79AE9ACB9CCC9D0CBDD5:368BFC2EE7870480A53B887E0E0273D3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7952E98E82ADAE82305291AF31D82B78:481F3714C9112E522CAB717B00795542:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E0B61686A1648FC82AC0767A30E969BF:CA681F90975354B326F88DA6EE6CBC4A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2AF247328D18F510A4FCB1784979209D:C185B82815B15FD96A75FD0309567D09:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5D2064436576514B4C27365268C6B9BF:267AAC3880B12273AF2B5976AC51C157:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3D04280E15EB800B1ABD005ECC9A8B3F:EBE2628954016D7428DB4477A0641B49:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A55B35CF84CBDB510C38F24C6BF93B90:9641A161F9D60D76EF05888FD1E2A280:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F14320EEA11F6FC7336ADEEAB8E85B9B:7F42B86B1C943E7EB89FD91B439EEC9C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +81D4388A3B919D54311B3327A4643265:70DFE1A70E74F1A2974C81F073542863:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D1469D78D3F38BEC7EE57CEAC7F5393D:5DECB5541E8FB7C65CA8DBCB9A25D6CD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0028367D36C6989C053BD51781644393:28967FC1396040FB4A989A6A19A67930:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0DF379E3ED7A514D09CA440CD91A7A4B:B2405BFE9F872B5DBD87D520CAEF49EC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2E47CF7B14D03C6D89D950DE7EAD69A4:A6A1AE40FB2DBD1ACB43E9C027E877AC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +BD6F5ABA7C56CD8F7F94D9FD482FAF4B:1ED91FFAF9975638253641D2826A91B1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +BA634341B5A5D226000C04A5189AB13E:F5644F442E6D6B52BAFB7FCF020C5E11:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6E2AC15AFCA7504C209BFC8F9CCA2A2F:73B228B2BFE0B01A24AFE361309E84DA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +CE347B81F4984EEBC8C3EC7CBC5DCC18:5ECCDE0E778C02545B16916E67CC5E15:\ +0000000000000000000000000000000000000000000000000000000000000000 + +DCFFF804405504B5EFE75BF9D23480DE:66C04EC78FAFA8462E94A4A4F69D4D7A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +221352648EBA537DB994F93EA3527CC8:74E0DB0F5A47224A1437B7C519441C08:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C8458FEC89AF924CF81396E641D7DDBD:5C3BD04D99635363DAF7D281230FD600:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F47E1F7EF00B42F8F5A1219C42E0CC0A:6DDE19D02A217B2A5DD41A1454DC677D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +24CDF34C5EA6B37CED3B33178FD54C88:95DDDD7E4CD12EF44FA5CCAF6E093130:\ +0000000000000000000000000000000000000000000000000000000000000000 + +AC8023453190010FADA88C6E71174FCB:F123615073CFC4C5DA553F7758CE0937:\ +0000000000000000000000000000000000000000000000000000000000000000 + +023AE5AF03FD68B6432D84C218DFE0A7:4B8D617C5728EB7AA6B2D23960F235F0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +CAA35C45DF45601E5935C92B4F5F164F:7155D0E792B5279AD6057C48BC2CAA0D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +ED72D82596C24FCE85E066377C6F23C8:2343F7BD3ADC05B7F575DBFF8B490EAD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +818834EA9DD46525CED342FD8CDF03D6:F0AA5253E8871BFF04BCAAA9FD2DA3FC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +AE528D030A08F5697611F769864C7863:C40D67EB5D395B65F578B01F7FDD4D36:\ +0000000000000000000000000000000000000000000000000000000000000000 + +979BE56166651E23CD3156624B51C118:4D3FADFAEF95C81DB449741D830669FB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +23F2C6298D46CB7B66305B3272F14775:B21F5D9F8CFC630C0C9184B34335C19D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4C5E6E7EF12BFF242402CC42962DE420:0764165513CE56DE4BC8FB238CEFCF15:\ +0000000000000000000000000000000000000000000000000000000000000000 + +93FB53BF2128A23468870BB679B6CD46:6FEA32419061B0C70A1A098B34F6B008:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A5EB2A49B07960CCEA5C632640A4B8D3:148ACECDF96815DE338312D7E505FBA7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7CE5CA2B71BAD18D4722127C9B28CA20:65EAE71CF60B516EF15EB3C22958272C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6B3BD3BE30DEE6B7987FDA806C5C3805:9C9402BE33FE1EB856AB211CB6F92C3D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +FA36C8904B20DA558430AC1743B31515:90E562EFC0D04545190DD0142AC39A05:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6D159ABD062B35E8CE7F08F44F289040:3753E162B8361AACD59B20228221D6CA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F5099C6661352E4093618DCBE1CA977A:FDBE9F07CE5C2E99768DCBAD0B02E321:\ +0000000000000000000000000000000000000000000000000000000000000000 + +688A780BF7A5290BCAAC1B6132878C53:0629155B1D44909B4CD2A8B30E0E0907:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6021C98BB2665524A443D89A40DE9D06:58039733F59046C469323C29B77C3750:\ +0000000000000000000000000000000000000000000000000000000000000000 + +FBF76BDF9E6245840CA6BBA70055F563:94551B253A232BEAFDDEBFA5871CFFAD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A72FDD6F664169F03CC0CC554AF2B68A:0E01B11F9313E0745A5A6C93F65536F9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +65550E0E11ECE8C52F56D79B8779B631:060F7B1952C3A20740FC3AB3523A26B5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F6C89D40E53B72F349433B135193A2D2:549DD728A520D70C5BAE2F13728D1334:\ +0000000000000000000000000000000000000000000000000000000000000000 + +04F2E6F467102D0C7514ECFF1B74E61A:B9DE638D64DEEB61AEF4C787E9DD35F1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F4030612C03BB7E12CF52DE9368C2BF9:5F9276C06B5B4845634E53D97ED262AE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A28AD08C3334E4FB4D4968ACCB7F3F5F:82B8B3E572875119B1D125A2E0B6242C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B2DA025E287DF1D344E2C76AAD0C2C03:A25398F55C33DE587851C88C96DE321D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +496548B236963ED35F68F21ECF7DFAEA:209F82198BE7609F3C0E1B3291C306FC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D8017AD727DBB03A67BC9B6CEC08F82D:75940C2A866B99049E89E6D2FF00902E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6F961163C00C533DBF195BEE8714DE60:6A04C14D65DF615BC9D3817EE4FAB278:\ +0000000000000000000000000000000000000000000000000000000000000000 + +1393EEFECAC81F9F0684A141B37ACD79:03755C3939CCB1A295328C0116FBC40E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2D6F0FC6BF2DBB83EA5180D2B5F2D8ED:F965911478AD9B623B760844CC03327A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9033C3DE5FA49AFCC52A79E67F4D0736:5831046301BDA86CB50346CA1B66C4FB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D8B7C49D31802C02FD1CAE4401FD2D2B:08F7884E9885E1038B0C61F473EF70F8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +BA9678585636444430D8270E4D503540:421D1E481CAA8A08BBA48665CDCEC377:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9B61323D57ED9FFFE1918BD9CE8EA33C:79169AE974BAC0F7D922165BDC2CF445:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4CCBB469A1750A879B8A74FFB3FF8C61:4E839686B96659ABB8C5AB567941F7DC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D8F243A37C08D3BFBBEFE8F91E84323F:9A0367F4E414FB939A86047DC4A8EF1B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D3821E4D2C499F3426B9FCEFFA09356F:9B15BCD64E0A5B52A1B9C63A01A4650D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E67235D373FA498DE6F8AFE84B53D286:5FDA78B9580BE5587B564AF685F12A7D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F1FD811B4F6641BC14A703F8CA365DEB:660CF835E5D77B420EEF4EDD7FE3245C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +2B16C60FCAD353CE3CD64AC3FF889DAE:F78B14B08F30907961FF6B80F4C4F871:\ +0000000000000000000000000000000000000000000000000000000000000000 + +EB7FFD1623A99B9583875FE819004E0E:B454B72CB6B929CBDF3925451B6C37FE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +09E42C31C09D7AE29EE67127085A6806:46305BA66724716ADBFBA60604CFDECB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8A142724C41589A979AFFF93F7EFE596:AB8A4242F1E08F1254A106B65FF3AE81:\ +0000000000000000000000000000000000000000000000000000000000000000 + +87EBEEF10ABAC49D72376311C2A81533:033DD315A1E522BDADE84670B02F1BC5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B3BC2E9BB2511849EF7BDDA3C2CA6B89:0EDB4BC9961DD9D41AA7A25321ED0202:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A5E7D15571A0B04F499476A994B87C70:D8353E8A311FCAB4E34682DB5F2B7B00:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5DD35FEBA1E40E6DADE71DD3ED785464:58C5EBF33628DD343C822D91D21A4885:\ +0000000000000000000000000000000000000000000000000000000000000000 + +469EA4FAC76E88BCCBC2922E4076019C:A6910C818181CF1F4E69896E7FE0F4AB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5E4B9F5DC0FE8BAD9799C29F50AD5DF0:9555BA538C915517B8B8648B21E1295B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A8521AA3053C780A138D5D4552EEF9B9:58D09302FC7AEB722D0A16BD13406759:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E195D5EE9732CA9E20DE5DCD3DEBC856:60D314160FC2081AC73F48B62AA7C22D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +FACEDE9FF4706209912726B7EEB2D0A9:3D2284BCDDD3A0EB80812AF638843F43:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B444E404978F7F30AA486040F7843250:9ABAC5E96FB6F7D306AF9CF2E37E28CB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +9B54CB9AC90D968812FD1355B2779236:B444FBE174380450EE93D9BD6C2151C3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C29668C0A3FF22B1388281FE5A841DB8:4A3F6E376DDEA1791F84D4617CDE9B7C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +75AAFCB786C5A0702C133649B9B73F7C:CBD89BE37B0BA65E3867D8CA0F77C30C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +39C63789EF88E20ACF403262C42A89A7:FAAD0835AEA037ACC207FFCD2A10CD5F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +71583BA1CFABFFBFA412BE228322B297:DAF18FE82A072EC5B9239AEB8E6E52CB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D00297579A4B01649C237A176B86697F:212E6D57C1A46A790E082594D29A2F31:\ +0000000000000000000000000000000000000000000000000000000000000000 + +49D694199247A4290B8A1649D5C82F40:955995D2521F4D100E95E76ABE8BF7CB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +3C88595603173ED5762ABB970D019B13:DAA5CACD2E1BF1AA1DE9C1BDD1132C2E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +83AB295E4F15A8D5F65A723E0CE2D01F:69FA28D662336E4446F4E315C59B1262:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D8A9F3A761B1E45E384FCD205D5A8C61:35529731D5CC912C41153E7E626C8A11:\ +0000000000000000000000000000000000000000000000000000000000000000 + +1D54C56927178C14DA355CFB9ACCFB67:49826A29C640F65371619E940DA451F4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7D9574BDF07BC0A251B88A2B24F0DB68:9651120F3D1AD09EF61607002A040D92:\ +0000000000000000000000000000000000000000000000000000000000000000 + +75A94C5692A877903A4D43AA1071463F:2676F7CE1D8B91AB29A83970D5EF3698:\ +0000000000000000000000000000000000000000000000000000000000000000 + +A04C41ADFA612D80843B0569833A9AF8:1282CE00BDE016E61ED8000EBD42F414:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4D159F9CC6B4AA58F7FC2F905F5CB875:A5FD714739BB899FF577C6B3E19689EE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +0B1840E8B119B7C94A045459B61B28F6:5E5213FF0E467653C61A21EBD5EBF6B5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +8E4CCFE43811ABED23A41C33FD5F095B:E92DACB852960B91B9EE58153A102948:\ +0000000000000000000000000000000000000000000000000000000000000000 + +C9956C304D2BF87CA8564C3762CD762A:860D752AC16CEC79F1DF5C6A3A44E9A5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F4760FA1F8A17216BB95396057F8FB95:6D8EF0B071CE8966AAEAF8C3C5AFD26F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +7CB6538603BDA43BF71C12AB1241A862:7E3B14847526572F0D55A284D626B560:\ +0000000000000000000000000000000000000000000000000000000000000000 + +E945D4AA05A23561AF42466E1668A734:7E3B14847526572FF2AA5D7B29D94A9F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5FA0B49C4A1C2452B33C433383354B3E:7E3B14848AD9A8D0F2AA5D7B29D94A9F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +5CDC56C16559E0AB736D6A9AC72629C1:81C4EB7B7526572F0D55A284D626B560:\ +0000000000000000000000000000000000000000000000000000000000000000 + +4EC8D3AE8C51C84F4B65B82340364E4B:81C4EB7B8AD9A8D0F2AA5D7B29D94A9F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +F97F70581ECEB3E6F3F3D37BE9EE6A37:81C4EB7B7526572F0D55A28429D94A9F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +EECD2D9DCB49A297C458C948CAE0A513:81C4EB7B8AD9A8D00D55A284D626B560:\ +0000000000000000000000000000000000000000000000000000000000000000 + +1887BB24F5B28366010E7E0F132F936F:7E3B14848AD9A8D00D55A28429D94A9F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +EAD576FA649DE315401ECA6471B2C34A:7E3B14848AD9A8D0F2AA5D7BD626B560:\ +0000000000000000000000000000000000000000000000000000000000000000 + +540D1BA22F928A84C67EF5214F8BB88F:81C4EB7B7526572FF2AA5D7BD626B560:\ +0000000000000000000000000000000000000000000000000000000000000000 + +74D9CF212295D3670A92269E8D40939F:81C4EB7B7526572FF2AA5D7B29D94A9F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +6BEBBCF4AD01F7E3105D0888A0AD9E3E:81C4EB7B8AD9A8D00D55A28429D94A9F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +B4FF03EDC70BB97FAE21F21C3A459B28:7E3B14847526572F0D55A28429D94A9F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +93F87FBE4DD4206528BF83352452D58D:7E3B14848AD9A8D00D55A284D626B560:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D261D6041824D259290EABD3E9132DB8:7E3B14847526572FF2AA5D7BD626B560:\ +0000000000000000000000000000000000000000000000000000000000000000 + +92074732D84E1841A013A0034C52BF50:81C4EB7B8AD9A8D0F2AA5D7BD626B560:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:DDD26B98A5FFD82C05345A9DADBFAF49:\ +00000000000000000000000000000080 + +00000000000000000000000000000000:FA735E9BE7961050C202BD794E2E1E0C:\ +00000000000000000000000000000040 + +00000000000000000000000000000000:7B2D8D2348DC4CE112AEF4311BE769D7:\ +00000000000000000000000000000020 + +00000000000000000000000000000000:5F35BF3061423D0BC02C07BED67602BD:\ +00000000000000000000000000000010 + +00000000000000000000000000000000:8C9A19CEBB5709C38EA1AE1D12E291C1:\ +00000000000000000000000000000008 + +00000000000000000000000000000000:D69C8CCF5DEC9EFA90684C7B70FCDFAF:\ +00000000000000000000000000000004 + +00000000000000000000000000000000:39B65E77A4D26218E5ED7092AB64D07E:\ +00000000000000000000000000000002 + +00000000000000000000000000000000:F668C7091F81B2827DA77DD419B708E1:\ +00000000000000000000000000000001 + +00000000000000000000000000000000:7106BED662E6B6AE72FDC726C98AD746:\ +00000000000000000000000000008000 + +00000000000000000000000000000000:043AA312B19B6737C3CEBAF830DB6DB8:\ +00000000000000000000000000004000 + +00000000000000000000000000000000:F95E6F00854F17DBB68CC679570D5FD5:\ +00000000000000000000000000002000 + +00000000000000000000000000000000:D23FAE81FF497000583F2CFCE54FCE9C:\ +00000000000000000000000000001000 + +00000000000000000000000000000000:EF5C7DC4DBCE5A51F98011969693DBE8:\ +00000000000000000000000000000800 + +00000000000000000000000000000000:34D2F0546C260EA4002B4BCC2C12CCAB:\ +00000000000000000000000000000400 + +00000000000000000000000000000000:B3787BE95735A9581817C64D81F07E13:\ +00000000000000000000000000000200 + +00000000000000000000000000000000:EB31DC31E4016F7FD8901C5872DCED1A:\ +00000000000000000000000000000100 + +00000000000000000000000000000000:43D607D9D0009C01DBFB117126BC4395:\ +00000000000000000000000000800000 + +00000000000000000000000000000000:463B27CF0DA63219ED2CEBDBF5C16922:\ +00000000000000000000000000400000 + +00000000000000000000000000000000:90DF345556AB04CB12D0799B9C5049BB:\ +00000000000000000000000000200000 + +00000000000000000000000000000000:05C861F7F71591C8AECF8A26EB020F4D:\ +00000000000000000000000000100000 + +00000000000000000000000000000000:11DD97B8ADAF7F6B34EB3BBB9A438892:\ +00000000000000000000000000080000 + +00000000000000000000000000000000:7171E845509F8F4F134BE53EFD8A34DC:\ +00000000000000000000000000040000 + +00000000000000000000000000000000:864E7B400A96420A98765AF993AAD852:\ +00000000000000000000000000020000 + +00000000000000000000000000000000:B8F75A0553AA33DC30B3F2D0027F97EA:\ +00000000000000000000000000010000 + +00000000000000000000000000000000:573FB9B1E047670331D54E87F3BDD48D:\ +00000000000000000000000080000000 + +00000000000000000000000000000000:03CF30E2ED5C9311F6BF9964C8A7DBB8:\ +00000000000000000000000040000000 + +00000000000000000000000000000000:ED735C651F003ABCAFE1926472E0CC32:\ +00000000000000000000000020000000 + +00000000000000000000000000000000:970CDDD5BCCAE7F7BD0F7B67B6707580:\ +00000000000000000000000010000000 + +00000000000000000000000000000000:6D1C5788F69DC2E1EF928D9C831F3826:\ +00000000000000000000000008000000 + +00000000000000000000000000000000:8367C4564B707B6C0A4A92ECA38C6EDA:\ +00000000000000000000000004000000 + +00000000000000000000000000000000:F25D50BBA7FD6496CD70ACE570706ECC:\ +00000000000000000000000002000000 + +00000000000000000000000000000000:0C43854DF7DD96DC3323DCC311CD418C:\ +00000000000000000000000001000000 + +00000000000000000000000000000000:8F8827ED63EAFC702A4C7F855E6806A0:\ +00000000000000000000008000000000 + +00000000000000000000000000000000:DD4FF8498D45936888B48EEFD24CE9F6:\ +00000000000000000000004000000000 + +00000000000000000000000000000000:DE8BF1BCB7C106D93AA60C744240651F:\ +00000000000000000000002000000000 + +00000000000000000000000000000000:FC45CB6A1B9267A8B330FC1399BC0F34:\ +00000000000000000000001000000000 + +00000000000000000000000000000000:9EEC294CEBAEFC664DFA9D1C8B48B0B2:\ +00000000000000000000000800000000 + +00000000000000000000000000000000:CAFB5B1D66E147006DB2E4CFC8405DA3:\ +00000000000000000000000400000000 + +00000000000000000000000000000000:B9F43C559CCB8C1933FD323ED51AF997:\ +00000000000000000000000200000000 + +00000000000000000000000000000000:D11D4485EB7AAA6CB1A8F16E24ECDE7A:\ +00000000000000000000000100000000 + +00000000000000000000000000000000:A4F7B40448470061B7873A62072CE112:\ +00000000000000000000800000000000 + +00000000000000000000000000000000:80DF5AD31BF557F9C75701B1395C4AD2:\ +00000000000000000000400000000000 + +00000000000000000000000000000000:46CE4708ABA4835764EA9C4678335954:\ +00000000000000000000200000000000 + +00000000000000000000000000000000:72BABC19EE59F6F76F17DDFBE2FCC33A:\ +00000000000000000000100000000000 + +00000000000000000000000000000000:E76340173FDA4B6F1E2703A732C4C482:\ +00000000000000000000080000000000 + +00000000000000000000000000000000:79C577AC301DE5ED03AD6D0AACB1D958:\ +00000000000000000000040000000000 + +00000000000000000000000000000000:A2A8D78F3511B65EA03262314F0C8F8A:\ +00000000000000000000020000000000 + +00000000000000000000000000000000:6C87E4E87CB3773520F7B3EDB51DAEAF:\ +00000000000000000000010000000000 + +00000000000000000000000000000000:8D646E78DC20F616A859074DE82D1107:\ +00000000000000000080000000000000 + +00000000000000000000000000000000:E98DE4AAAC62C1E4251054B42D92F4C3:\ +00000000000000000040000000000000 + +00000000000000000000000000000000:B0FC458F4759641C6FA64FED926C8347:\ +00000000000000000020000000000000 + +00000000000000000000000000000000:61F381FA99E58E9B3CEBCBADDE6559D2:\ +00000000000000000010000000000000 + +00000000000000000000000000000000:2C7EAF752E2B02734A3C3506CDA4867D:\ +00000000000000000008000000000000 + +00000000000000000000000000000000:600F284E1AB1C8194D6FE065DBDF1BBF:\ +00000000000000000004000000000000 + +00000000000000000000000000000000:DB84C4BA65B89D0CD51BE73605084568:\ +00000000000000000002000000000000 + +00000000000000000000000000000000:4C75C41A4ABC17E0ADC00228394F0037:\ +00000000000000000001000000000000 + +00000000000000000000000000000000:230375EE7B65A2C948809B6DE69D1F50:\ +00000000000000008000000000000000 + +00000000000000000000000000000000:94EF7F345D1FF0DB4494D9DB56ADFFED:\ +00000000000000004000000000000000 + +00000000000000000000000000000000:CE277A5063C40BA1418A30721A0DE8AF:\ +00000000000000002000000000000000 + +00000000000000000000000000000000:BF4FE13163EA85E003EF8E9D4BAF48C8:\ +00000000000000001000000000000000 + +00000000000000000000000000000000:C8F9F9F1DB54EB0635C227CAE447055C:\ +00000000000000000800000000000000 + +00000000000000000000000000000000:6F31A90BCEEA0BC85843086C7258EA9E:\ +00000000000000000400000000000000 + +00000000000000000000000000000000:334EFC7C6930BC0B839C845E1B22F8C3:\ +00000000000000000200000000000000 + +00000000000000000000000000000000:1E92F9F2E576C864A24F36402F84107D:\ +00000000000000000100000000000000 + +00000000000000000000000000000000:A5B8DF0ABDBA5DA09B8D8383F06957E2:\ +00000000000000800000000000000000 + +00000000000000000000000000000000:344B6F348ADA08FF4E97C722463DCB08:\ +00000000000000400000000000000000 + +00000000000000000000000000000000:AAB52A0482E0A1B84EF07213F8BCF63F:\ +00000000000000200000000000000000 + +00000000000000000000000000000000:E477DDE4A88A17339157E4198DC39801:\ +00000000000000100000000000000000 + +00000000000000000000000000000000:33401CDFBECCF499B3226B4C6AD8FDDF:\ +00000000000000080000000000000000 + +00000000000000000000000000000000:2C06278683B5759C12B147DE2B0E0BB1:\ +00000000000000040000000000000000 + +00000000000000000000000000000000:B2B67CDC8371B5739F5E213FDD8B60EC:\ +00000000000000020000000000000000 + +00000000000000000000000000000000:83ACED5FB21035A41B858136D4797BEE:\ +00000000000000010000000000000000 + +00000000000000000000000000000000:1F6213DC933AEF4C582AAD041E140619:\ +00000000000080000000000000000000 + +00000000000000000000000000000000:32B7E10E04100FCDA94DC223BBC19075:\ +00000000000040000000000000000000 + +00000000000000000000000000000000:72FA9C8731E45CF575CFFEBD6F3981C5:\ +00000000000020000000000000000000 + +00000000000000000000000000000000:AEE9355B2FBD96A06F8F74DC8882E893:\ +00000000000010000000000000000000 + +00000000000000000000000000000000:B56126C52D0DD2B8FDC5C4A05091F2B1:\ +00000000000008000000000000000000 + +00000000000000000000000000000000:6FF5B6F133BEB75DDDD0385F9B3AEEE5:\ +00000000000004000000000000000000 + +00000000000000000000000000000000:6541C5BCE4B3F93F4EC1E7DFED0F98DB:\ +00000000000002000000000000000000 + +00000000000000000000000000000000:BF9ED60D8A243F1E010345537A5C081D:\ +00000000000001000000000000000000 + +00000000000000000000000000000000:77679D9E63DB7DF79C0484423FA18A57:\ +00000000008000000000000000000000 + +00000000000000000000000000000000:548091B07326BF829BA56C786053727F:\ +00000000004000000000000000000000 + +00000000000000000000000000000000:A8FA704EE06EEED6F7F71A598EF921FB:\ +00000000002000000000000000000000 + +00000000000000000000000000000000:627F14CA091AC156FB56302D6C3373DC:\ +00000000001000000000000000000000 + +00000000000000000000000000000000:BC2CAB97EB09919CBC0E6AFEC6581CF5:\ +00000000000800000000000000000000 + +00000000000000000000000000000000:CC7F5DF0CF522B2242163112E4421D08:\ +00000000000400000000000000000000 + +00000000000000000000000000000000:084AC3BF07F1E64F0093A014C2690CE5:\ +00000000000200000000000000000000 + +00000000000000000000000000000000:D3C6597474B740BA1053090A247AB5C5:\ +00000000000100000000000000000000 + +00000000000000000000000000000000:7435911B23F1DBACA5BF86C91B0D11B1:\ +00000000800000000000000000000000 + +00000000000000000000000000000000:79E59CE5B78A6D8259B2AD1B5F50F523:\ +00000000400000000000000000000000 + +00000000000000000000000000000000:72F3659183D9749128AE6CAFBEAADDE5:\ +00000000200000000000000000000000 + +00000000000000000000000000000000:77DD6EA2D669A36E4C409564A8604EC4:\ +00000000100000000000000000000000 + +00000000000000000000000000000000:27D4EC7E2AE30CBE54B7CE9F764E3D27:\ +00000000080000000000000000000000 + +00000000000000000000000000000000:0D68C4922498D08BFEFA450B85659D23:\ +00000000040000000000000000000000 + +00000000000000000000000000000000:6C4FCEEFF2768549EA590FC20310B95D:\ +00000000020000000000000000000000 + +00000000000000000000000000000000:FC46909BE47E944F4776956A98E9C43B:\ +00000000010000000000000000000000 + +00000000000000000000000000000000:50AA945A945A8BE43E4C137F0D7CA62A:\ +00000080000000000000000000000000 + +00000000000000000000000000000000:7511818C4C8408EB0AF22019DDF7F6F6:\ +00000040000000000000000000000000 + +00000000000000000000000000000000:D46BA09B00007974C24FC8C0CB13330D:\ +00000020000000000000000000000000 + +00000000000000000000000000000000:17E352C6C963F7DA5A1CB163ACCB8573:\ +00000010000000000000000000000000 + +00000000000000000000000000000000:6CED1C994D0F7B2862715D514840A780:\ +00000008000000000000000000000000 + +00000000000000000000000000000000:AD351E157AFC89A9C0D8CF15DDBF3A7D:\ +00000004000000000000000000000000 + +00000000000000000000000000000000:79AFB080BADC325DA8C5E88200743603:\ +00000002000000000000000000000000 + +00000000000000000000000000000000:D326FEA25FE2CA220CEC62DB9574AAFD:\ +00000001000000000000000000000000 + +00000000000000000000000000000000:A3C980B5DA0B8E3B32818AF08F5310DA:\ +00008000000000000000000000000000 + +00000000000000000000000000000000:12651FD76182C532CD03B36DD121A43A:\ +00004000000000000000000000000000 + +00000000000000000000000000000000:6D91A4600722340B8ECAE1055B8DF790:\ +00002000000000000000000000000000 + +00000000000000000000000000000000:2B1F49C97807430719A958271B5DA303:\ +00001000000000000000000000000000 + +00000000000000000000000000000000:9E29DADC12AA1ED228CDC78D70C829B7:\ +00000800000000000000000000000000 + +00000000000000000000000000000000:5B8FF678F88EB96FE73BCBF14AD9304B:\ +00000400000000000000000000000000 + +00000000000000000000000000000000:158B5F6CBB33E547735E45559CEF3E5B:\ +00000200000000000000000000000000 + +00000000000000000000000000000000:8EFA3AC040AC5235F2F4AC3A82B7018E:\ +00000100000000000000000000000000 + +00000000000000000000000000000000:97BACE474E820FDEEB1E66D06139D2F9:\ +00800000000000000000000000000000 + +00000000000000000000000000000000:114CB849EC2735AEECDB2E51A1C45A38:\ +00400000000000000000000000000000 + +00000000000000000000000000000000:1426ABD1FE61695A62B7A55AB5DA6145:\ +00200000000000000000000000000000 + +00000000000000000000000000000000:80C615975140248186BE3CD6FD8D7740:\ +00100000000000000000000000000000 + +00000000000000000000000000000000:CFBD333352A34ED7F73D3E569D78C693:\ +00080000000000000000000000000000 + +00000000000000000000000000000000:5F04350AB2EFB6075F381EE1DBB8477F:\ +00040000000000000000000000000000 + +00000000000000000000000000000000:CF5CE38D2033AD6E6891ED24DB39EA66:\ +00020000000000000000000000000000 + +00000000000000000000000000000000:3E63AF44877F258840B165CC3D47424C:\ +00010000000000000000000000000000 + +00000000000000000000000000000000:264E5481EFF42A4606ABDA06C0BFDA3D:\ +80000000000000000000000000000000 + +00000000000000000000000000000000:4A231B3BC727993407AC6EC8350E8524:\ +40000000000000000000000000000000 + +00000000000000000000000000000000:E03269F9E9FD853C7D8156DF14B98D56:\ +20000000000000000000000000000000 + +00000000000000000000000000000000:A798181C3081AC59D5BA89754DACC48F:\ +10000000000000000000000000000000 + +00000000000000000000000000000000:34B355520DF861F3F5C66A2379FBDA15:\ +08000000000000000000000000000000 + +00000000000000000000000000000000:5E86BB8F6B1175510C6B244281A0B04A:\ +04000000000000000000000000000000 + +00000000000000000000000000000000:B9213190C7A9C5F13764D29B6DE843A1:\ +02000000000000000000000000000000 + +00000000000000000000000000000000:4ECA55033294D1FF6F0204B2456046C8:\ +01000000000000000000000000000000 + +00000000000000000000000000000000:660CF6A3F77836AC685519C702548EE7:\ +000000000000000000000000000000000000000000000080 + +00000000000000000000000000000000:9EA538A95E21B6738B0F4BDD0D5A6423:\ +000000000000000000000000000000000000000000000040 + +00000000000000000000000000000000:19D13A0AC90F83E5B3CA943C6462D295:\ +000000000000000000000000000000000000000000000020 + +00000000000000000000000000000000:1B9DD629B9E11BCD27C4148887AE662A:\ +000000000000000000000000000000000000000000000010 + +00000000000000000000000000000000:14EF2BA201698B1185B4F45D3C4BF7C1:\ +000000000000000000000000000000000000000000000008 + +00000000000000000000000000000000:8AF1A83901D7DD153FF8D271B210E3AB:\ +000000000000000000000000000000000000000000000004 + +00000000000000000000000000000000:4209B9F47FE46DA7095E093698227280:\ +000000000000000000000000000000000000000000000002 + +00000000000000000000000000000000:5D058517AC7CC5AFD5C33253D4703B46:\ +000000000000000000000000000000000000000000000001 + +00000000000000000000000000000000:40520018C4AC2BBA285AEEB9BCB58755:\ +000000000000000000000000000000000000000000008000 + +00000000000000000000000000000000:FB12E82326B5B32A88C73962E6B15A73:\ +000000000000000000000000000000000000000000004000 + +00000000000000000000000000000000:10514AB50FB935D4DF8D36697E9A892C:\ +000000000000000000000000000000000000000000002000 + +00000000000000000000000000000000:23BA3FE846E2AE8CD99FC3FE58228A05:\ +000000000000000000000000000000000000000000001000 + +00000000000000000000000000000000:68E7992B17261F9F50693B291B40DE29:\ +000000000000000000000000000000000000000000000800 + +00000000000000000000000000000000:16F61AE21DEF7E6FF252F7A7C0A1FD33:\ +000000000000000000000000000000000000000000000400 + +00000000000000000000000000000000:79386D808CC081C0888E83C047411490:\ +000000000000000000000000000000000000000000000200 + +00000000000000000000000000000000:81421CDE68390C877C025D60D7578959:\ +000000000000000000000000000000000000000000000100 + +00000000000000000000000000000000:8BE4D123F250436A35AC1506BF462E25:\ +000000000000000000000000000000000000000000800000 + +00000000000000000000000000000000:FD007EFCBF67C125F8532A7FD54724CC:\ +000000000000000000000000000000000000000000400000 + +00000000000000000000000000000000:D6661DE82FD241500194134F40C30071:\ +000000000000000000000000000000000000000000200000 + +00000000000000000000000000000000:B03A391CCAAE863B0ED315B0CC4FF99D:\ +000000000000000000000000000000000000000000100000 + +00000000000000000000000000000000:B5142CABF118C8BA5DA8A201E7E04448:\ +000000000000000000000000000000000000000000080000 + +00000000000000000000000000000000:2B078B616E4802ECC0104510E3E7E44C:\ +000000000000000000000000000000000000000000040000 + +00000000000000000000000000000000:CE8A95407154E3B8DA3979FDA451F288:\ +000000000000000000000000000000000000000000020000 + +00000000000000000000000000000000:EF5D9D75A6A31712BAD7D332FCEF52D7:\ +000000000000000000000000000000000000000000010000 + +00000000000000000000000000000000:CE6430157E4EAEA967B972C35C78036C:\ +000000000000000000000000000000000000000080000000 + +00000000000000000000000000000000:7117137E956133BF65BCDA326A8156F3:\ +000000000000000000000000000000000000000040000000 + +00000000000000000000000000000000:7D0D165BDB56D794FAC1B1C5020270B1:\ +000000000000000000000000000000000000000020000000 + +00000000000000000000000000000000:2AE14DC8A1CD98E1BD20D4E01E32DDD2:\ +000000000000000000000000000000000000000010000000 + +00000000000000000000000000000000:AE266BE3BF863707C6AECE963D16530E:\ +000000000000000000000000000000000000000008000000 + +00000000000000000000000000000000:3A2612AF977665D4E8D05E3EA9947E60:\ +000000000000000000000000000000000000000004000000 + +00000000000000000000000000000000:95491F2AD7B48986522E3B1EA14DE24F:\ +000000000000000000000000000000000000000002000000 + +00000000000000000000000000000000:8A1E5D419E900C9FD046BA1F74C49DC8:\ +000000000000000000000000000000000000000001000000 + +00000000000000000000000000000000:E407985AF526A75AB42DB52D64987992:\ +000000000000000000000000000000000000008000000000 + +00000000000000000000000000000000:6C6EAD1E4101F16AD0FC4DE34DA19D8A:\ +000000000000000000000000000000000000004000000000 + +00000000000000000000000000000000:84E74236D365A90B6417221C0E5ED058:\ +000000000000000000000000000000000000002000000000 + +00000000000000000000000000000000:7DC0D45689A260233E52B56EE49F326B:\ +000000000000000000000000000000000000001000000000 + +00000000000000000000000000000000:E69EE6C58AE686AC193F4A118E5C7680:\ +000000000000000000000000000000000000000800000000 + +00000000000000000000000000000000:7FCF4D217B2A37C8D3A822C43B1A119E:\ +000000000000000000000000000000000000000400000000 + +00000000000000000000000000000000:6D37043BF5B8D45F1E44A7C0E792A343:\ +000000000000000000000000000000000000000200000000 + +00000000000000000000000000000000:ED46DEA31CAC83EE9F812C9006891C32:\ +000000000000000000000000000000000000000100000000 + +00000000000000000000000000000000:DABC07C4DFDDA34A8B61D1E1F0461196:\ +000000000000000000000000000000000000800000000000 + +00000000000000000000000000000000:E733109E82EEDEFBB02512F1C030FF35:\ +000000000000000000000000000000000000400000000000 + +00000000000000000000000000000000:9F3BF5E17F297B3B3F3D6311B2874FC1:\ +000000000000000000000000000000000000200000000000 + +00000000000000000000000000000000:CF2793EDA6299C358F79D0F15853E075:\ +000000000000000000000000000000000000100000000000 + +00000000000000000000000000000000:4CFCD92E08E82B0B3FC7C0CB8A2193CE:\ +000000000000000000000000000000000000080000000000 + +00000000000000000000000000000000:409F6D08C56C0129A485A2CD503AA754:\ +000000000000000000000000000000000000040000000000 + +00000000000000000000000000000000:4D80946E2267E0E485CDF4CBEA0BDE73:\ +000000000000000000000000000000000000020000000000 + +00000000000000000000000000000000:EAE07676A063EB5F7F99FAED7B065188:\ +000000000000000000000000000000000000010000000000 + +00000000000000000000000000000000:A783EB0A14B5212A9BC439F225F33834:\ +000000000000000000000000000000000080000000000000 + +00000000000000000000000000000000:524282FABF8B62D291AAAADA12423AE9:\ +000000000000000000000000000000000040000000000000 + +00000000000000000000000000000000:306D0E55364394631EC18BE972EF0B66:\ +000000000000000000000000000000000020000000000000 + +00000000000000000000000000000000:87D8BA08354745FE85BBB710FCF5EB39:\ +000000000000000000000000000000000010000000000000 + +00000000000000000000000000000000:894D2F50F43BA36B539DE43637927AC9:\ +000000000000000000000000000000000008000000000000 + +00000000000000000000000000000000:479C1979DDB0052BA7DF875314CB2A35:\ +000000000000000000000000000000000004000000000000 + +00000000000000000000000000000000:E0E5399FEF15563392741BC333246873:\ +000000000000000000000000000000000002000000000000 + +00000000000000000000000000000000:86F93C8B9552D8971367EAE2A366312F:\ +000000000000000000000000000000000001000000000000 + +00000000000000000000000000000000:9F18DF64A519FEC0581C0C27F805F484:\ +000000000000000000000000000000008000000000000000 + +00000000000000000000000000000000:53BD3E8475DB67F72910B945BF8C768E:\ +000000000000000000000000000000004000000000000000 + +00000000000000000000000000000000:456C1BE9ACEFA86AFB9742AB867692B1:\ +000000000000000000000000000000002000000000000000 + +00000000000000000000000000000000:89EE6EBDDCB44B7F17157C154BB99221:\ +000000000000000000000000000000001000000000000000 + +00000000000000000000000000000000:51ECA17E2C529F17592F9A117F6F592B:\ +000000000000000000000000000000000800000000000000 + +00000000000000000000000000000000:A51036D7D90699DDA88ED9A16EE6C556:\ +000000000000000000000000000000000400000000000000 + +00000000000000000000000000000000:07C856A3CE6F131D785BDE2E3DB3D36A:\ +000000000000000000000000000000000200000000000000 + +00000000000000000000000000000000:A06931BD2C6D9C3701E0286016AB8555:\ +000000000000000000000000000000000100000000000000 + +00000000000000000000000000000000:3A07686652A8F7E35FC9B3333EA97D16:\ +000000000000000000000000000000800000000000000000 + +00000000000000000000000000000000:FD008310340BA35239165FCA8F52B3DF:\ +000000000000000000000000000000400000000000000000 + +00000000000000000000000000000000:FC7E859D16DBF0F92FB8B3286C110315:\ +000000000000000000000000000000200000000000000000 + +00000000000000000000000000000000:86C0CBEB5633EF88ABD436BA54AC4D7B:\ +000000000000000000000000000000100000000000000000 + +00000000000000000000000000000000:CA66CEA4EAE07B83E1EEB737FE72EADC:\ +000000000000000000000000000000080000000000000000 + +00000000000000000000000000000000:019754956B6DC021D25731EF988BDAC9:\ +000000000000000000000000000000040000000000000000 + +00000000000000000000000000000000:786EC65CC6C717A171822F1DD1AB3CE8:\ +000000000000000000000000000000020000000000000000 + +00000000000000000000000000000000:DEAB7388A6F1C61D41E25A0D88F062C4:\ +000000000000000000000000000000010000000000000000 + +00000000000000000000000000000000:F08DF5D467F41CB7D157C6E6C78900FE:\ +000000000000000000000000000080000000000000000000 + +00000000000000000000000000000000:0225B99C3E40C8A5FD0156BD6A2B9349:\ +000000000000000000000000000040000000000000000000 + +00000000000000000000000000000000:6B8D89725A7AEB5AA433011ACF5B72EC:\ +000000000000000000000000000020000000000000000000 + +00000000000000000000000000000000:6A8B55F69923153ED6A95BF4B78CCE6E:\ +000000000000000000000000000010000000000000000000 + +00000000000000000000000000000000:199B86F903787EE3EDD60F8393F4A89A:\ +000000000000000000000000000008000000000000000000 + +00000000000000000000000000000000:BFE08316360801D0B929BBE1786A8570:\ +000000000000000000000000000004000000000000000000 + +00000000000000000000000000000000:887B6ECDBF12DEB314C50F07B870EC3B:\ +000000000000000000000000000002000000000000000000 + +00000000000000000000000000000000:C82FDE13839BD8BD8FC408131F559648:\ +000000000000000000000000000001000000000000000000 + +00000000000000000000000000000000:0482615608212073881C83A90A0B2721:\ +000000000000000000000000008000000000000000000000 + +00000000000000000000000000000000:CDFD5AF33A61EA9BA8C6E4DD3E84949D:\ +000000000000000000000000004000000000000000000000 + +00000000000000000000000000000000:A9EFF0A790FEB09727558C1FFB4247A4:\ +000000000000000000000000002000000000000000000000 + +00000000000000000000000000000000:EAF6266AC9F0A0E96ECF6E602DE61B73:\ +000000000000000000000000001000000000000000000000 + +00000000000000000000000000000000:59F44B4178A92AF2CA778BDA351247F1:\ +000000000000000000000000000800000000000000000000 + +00000000000000000000000000000000:87C3730E07C280D110EE11BBDB2C7BF6:\ +000000000000000000000000000400000000000000000000 + +00000000000000000000000000000000:5F6BF404C25C812FF2E814E4FEBAF636:\ +000000000000000000000000000200000000000000000000 + +00000000000000000000000000000000:92B8C78C75EE5BB1C27DAC75EF76D2E0:\ +000000000000000000000000000100000000000000000000 + +00000000000000000000000000000000:1E9F7474C984CC73B7F90F8EC01F547D:\ +000000000000000000000000800000000000000000000000 + +00000000000000000000000000000000:9CAAD32B4195E293A792CF2403839879:\ +000000000000000000000000400000000000000000000000 + +00000000000000000000000000000000:B384BE1E8CEAD9DE1E209FC92BA6A3D3:\ +000000000000000000000000200000000000000000000000 + +00000000000000000000000000000000:4E512E32F6B60CFE5660D7CFA21E13FC:\ +000000000000000000000000100000000000000000000000 + +00000000000000000000000000000000:832615D6654549BB930EC8DBACC5AE92:\ +000000000000000000000000080000000000000000000000 + +00000000000000000000000000000000:27549DC43C2DEEAFFB1C52AC37AD9728:\ +000000000000000000000000040000000000000000000000 + +00000000000000000000000000000000:804E4F4C6FD215D4300704142407020A:\ +000000000000000000000000020000000000000000000000 + +00000000000000000000000000000000:C52FECB8EDDA2D9BF3E5856231B87F6F:\ +000000000000000000000000010000000000000000000000 + +00000000000000000000000000000000:26474A9B6A125DA80A989286F1AADB77:\ +000000000000000000000080000000000000000000000000 + +00000000000000000000000000000000:15955CDA082E2278B2EAB498BAE90A5D:\ +000000000000000000000040000000000000000000000000 + +00000000000000000000000000000000:04191E4D8945BA1E9D02098EEFCD65DF:\ +000000000000000000000020000000000000000000000000 + +00000000000000000000000000000000:C1841B80C1E0E4608F0C261F8FF91199:\ +000000000000000000000010000000000000000000000000 + +00000000000000000000000000000000:7FF3E31C19BB193B4A2CCD488CB44F97:\ +000000000000000000000008000000000000000000000000 + +00000000000000000000000000000000:2FB402BFAAACCC4F55C9EBA37D2AA543:\ +000000000000000000000004000000000000000000000000 + +00000000000000000000000000000000:97289170C25CE1EC2011B27487DC8903:\ +000000000000000000000002000000000000000000000000 + +00000000000000000000000000000000:3BC60DC98B29BA75D7DBA12D78BED74D:\ +000000000000000000000001000000000000000000000000 + +00000000000000000000000000000000:21C3E9BDB411A2CF58ACFCDDA07CA06E:\ +000000000000000000008000000000000000000000000000 + +00000000000000000000000000000000:174FC71F855D61484B8C05DEB12988BA:\ +000000000000000000004000000000000000000000000000 + +00000000000000000000000000000000:337671C8D092C431778655358AE1A622:\ +000000000000000000002000000000000000000000000000 + +00000000000000000000000000000000:D671E381AE4CBFBC4D360ACE36538EB6:\ +000000000000000000001000000000000000000000000000 + +00000000000000000000000000000000:9915EB2B534C901AB3E208F0B8274438:\ +000000000000000000000800000000000000000000000000 + +00000000000000000000000000000000:CBB867073A139F7A39A5ABFB1F9B7084:\ +000000000000000000000400000000000000000000000000 + +00000000000000000000000000000000:487B9F02DF40531F6B1BD096A8E32377:\ +000000000000000000000200000000000000000000000000 + +00000000000000000000000000000000:871D4D57145444F7858A3A1727FEE068:\ +000000000000000000000100000000000000000000000000 + +00000000000000000000000000000000:56463A7AEB3D1B104868B5F0CB88479B:\ +000000000000000000800000000000000000000000000000 + +00000000000000000000000000000000:1A00009A7CAE8EF56B167F94F9932585:\ +000000000000000000400000000000000000000000000000 + +00000000000000000000000000000000:BA0BDE829631F63E14FE1995C57CBE29:\ +000000000000000000200000000000000000000000000000 + +00000000000000000000000000000000:A0625DDE21DF874E27751F460DB24939:\ +000000000000000000100000000000000000000000000000 + +00000000000000000000000000000000:3A850B3917B926B7C1861AA8557548DB:\ +000000000000000000080000000000000000000000000000 + +00000000000000000000000000000000:33FB35F2ED3A0F9A9C0D62868890B706:\ +000000000000000000040000000000000000000000000000 + +00000000000000000000000000000000:8EB519BF9B7F9841FC429C21930730AA:\ +000000000000000000020000000000000000000000000000 + +00000000000000000000000000000000:973672A4178DA471DB7C2CC9F3349DA4:\ +000000000000000000010000000000000000000000000000 + +00000000000000000000000000000000:EBC56A2AB4DC394C8409EBC529103C09:\ +000000000000000080000000000000000000000000000000 + +00000000000000000000000000000000:00300AD85514851A32376A583B99416A:\ +000000000000000040000000000000000000000000000000 + +00000000000000000000000000000000:47CB1114753A29FA68E83BF3754F5713:\ +000000000000000020000000000000000000000000000000 + +00000000000000000000000000000000:556424407058A1BF639387032BB4972B:\ +000000000000000010000000000000000000000000000000 + +00000000000000000000000000000000:C573C69439543B71A1EAF6A38D1DB977:\ +000000000000000008000000000000000000000000000000 + +00000000000000000000000000000000:570D68BC03C1AD3173316BB3484166DB:\ +000000000000000004000000000000000000000000000000 + +00000000000000000000000000000000:2ABE779A9A42BF593A2D20495C6F5A37:\ +000000000000000002000000000000000000000000000000 + +00000000000000000000000000000000:7D648B890DCE86ADAE607B24B17F7ADC:\ +000000000000000001000000000000000000000000000000 + +00000000000000000000000000000000:8AF02339AC04EEDDC5D29B1D8AB85E34:\ +000000000000008000000000000000000000000000000000 + +00000000000000000000000000000000:D11C7DCD0E9B857DDC1A8D73169BBA2D:\ +000000000000004000000000000000000000000000000000 + +00000000000000000000000000000000:7A960A521E193922ED2275B1FCEB484F:\ +000000000000002000000000000000000000000000000000 + +00000000000000000000000000000000:357E6FBCA32874FDCE99AD14BD10C4B8:\ +000000000000001000000000000000000000000000000000 + +00000000000000000000000000000000:1AC04248825E32B8E71C34875371F307:\ +000000000000000800000000000000000000000000000000 + +00000000000000000000000000000000:038A5BB1246BB8F0460ADC7826211268:\ +000000000000000400000000000000000000000000000000 + +00000000000000000000000000000000:EF923294B89B78F017C874FC4472762E:\ +000000000000000200000000000000000000000000000000 + +00000000000000000000000000000000:19A8882B0FDB10E143FF9DF9D32DA301:\ +000000000000000100000000000000000000000000000000 + +00000000000000000000000000000000:399800963634CD1B96D9FCEFE1D0815E:\ +000000000000800000000000000000000000000000000000 + +00000000000000000000000000000000:9B5B6DFFFCB2201390728372E1259012:\ +000000000000400000000000000000000000000000000000 + +00000000000000000000000000000000:0DB33144E4EB0FCAC271AB4D26F7B3B3:\ +000000000000200000000000000000000000000000000000 + +00000000000000000000000000000000:D7987CAA9C1CAB111984C2BA993F95B9:\ +000000000000100000000000000000000000000000000000 + +00000000000000000000000000000000:7F57B51D6B2E5E8C3DBEDF6B68A3ACDB:\ +000000000000080000000000000000000000000000000000 + +00000000000000000000000000000000:5DE80D7BF3FC0B05ACEB1311BE12E31B:\ +000000000000040000000000000000000000000000000000 + +00000000000000000000000000000000:BE2C16F62E116A472C43D526D582A2F2:\ +000000000000020000000000000000000000000000000000 + +00000000000000000000000000000000:0D9AED1721E71B09C7CF34650315ADD4:\ +000000000000010000000000000000000000000000000000 + +00000000000000000000000000000000:2B06E5A2CB8E141B6F194E7987D32E14:\ +000000000080000000000000000000000000000000000000 + +00000000000000000000000000000000:FE2893A03D01523DF7BCF0EC76A71E76:\ +000000000040000000000000000000000000000000000000 + +00000000000000000000000000000000:018056BEED112C1B11C6D58F383E51F3:\ +000000000020000000000000000000000000000000000000 + +00000000000000000000000000000000:20D29D2A08CAED608CEE792B82E9F900:\ +000000000010000000000000000000000000000000000000 + +00000000000000000000000000000000:FB4786827E61312B24889E8A75BFE0E8:\ +000000000008000000000000000000000000000000000000 + +00000000000000000000000000000000:81FC9F0C865FC970721180942F0DADDE:\ +000000000004000000000000000000000000000000000000 + +00000000000000000000000000000000:179BA8EFBE611F1358B2D7C8A14F6056:\ +000000000002000000000000000000000000000000000000 + +00000000000000000000000000000000:5509A6F21705DA67E685C1D2515FC40F:\ +000000000001000000000000000000000000000000000000 + +00000000000000000000000000000000:9EF148F4819E1AD53458FF7B97512719:\ +000000008000000000000000000000000000000000000000 + +00000000000000000000000000000000:8B992E1FD9026C14545D3B45BA12DD26:\ +000000004000000000000000000000000000000000000000 + +00000000000000000000000000000000:2A1A31C9F9EC3F0041E4981C14075C9B:\ +000000002000000000000000000000000000000000000000 + +00000000000000000000000000000000:668D25EAB49A68A353170FB9804C49E9:\ +000000001000000000000000000000000000000000000000 + +00000000000000000000000000000000:B0851073E77BEBADB5E4620A5ECAB48F:\ +000000000800000000000000000000000000000000000000 + +00000000000000000000000000000000:0D7DD474F2ADD4E616C2BDCB31AE295E:\ +000000000400000000000000000000000000000000000000 + +00000000000000000000000000000000:19E972ACB8159AF2BE06C2CEB13F17CB:\ +000000000200000000000000000000000000000000000000 + +00000000000000000000000000000000:D3181CAF92EB933472AB5D7D9A79359F:\ +000000000100000000000000000000000000000000000000 + +00000000000000000000000000000000:AA8B04CFD3F03D913981888D65F595F4:\ +000000800000000000000000000000000000000000000000 + +00000000000000000000000000000000:C972EAE644F542F2D61581105DAA2DE9:\ +000000400000000000000000000000000000000000000000 + +00000000000000000000000000000000:40288DA36DC4A581CFC6BF52768AEAC0:\ +000000200000000000000000000000000000000000000000 + +00000000000000000000000000000000:1460BD4CE7589DFC8CA2A341CEDE21A2:\ +000000100000000000000000000000000000000000000000 + +00000000000000000000000000000000:415E3D395E8AF9F0B367B18279EC9D36:\ +000000080000000000000000000000000000000000000000 + +00000000000000000000000000000000:52841B754B398E76A046A808D0254DB1:\ +000000040000000000000000000000000000000000000000 + +00000000000000000000000000000000:E28C2E20BF18DAD62ADA7B46D46C51AC:\ +000000020000000000000000000000000000000000000000 + +00000000000000000000000000000000:EACF9AD4EAC19266F886CB3AE50B2CA8:\ +000000010000000000000000000000000000000000000000 + +00000000000000000000000000000000:39057A7055ADC3DF052632BA75845405:\ +000080000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0637B291488FCBC39EA131C5D0393617:\ +000040000000000000000000000000000000000000000000 + +00000000000000000000000000000000:53A6EAA591C754B9AFB8E14B39BFFE79:\ +000020000000000000000000000000000000000000000000 + +00000000000000000000000000000000:AF9DD24F6FD3C9BAD97466F4E19D008E:\ +000010000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6F6C9FDBB84546B3BD98703730A71292:\ +000008000000000000000000000000000000000000000000 + +00000000000000000000000000000000:00DCD917419399ED52E2A528ECAB86C5:\ +000004000000000000000000000000000000000000000000 + +00000000000000000000000000000000:DC077DA2CBF96509A74980CE12786C41:\ +000002000000000000000000000000000000000000000000 + +00000000000000000000000000000000:AADD759F77507F990D3856F6EFC91978:\ +000001000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3948D1EF7CE021CEF9C6C1405BB5A6F9:\ +008000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5B8AC83847FDCD6006F7D59A04BE703C:\ +004000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7F6347B6A370FDBCD26C91E5F1BE4E77:\ +002000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3D8DC8CEF60F4F0F021BEA3B8A268740:\ +001000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C9BA9FC07BD7FAD3CBD56DBF9A7C5B00:\ +000800000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8B660D768B8E32F0C4E15386C5F3450D:\ +000400000000000000000000000000000000000000000000 + +00000000000000000000000000000000:9A15675F3631BD2AF387A7B69DCEB89E:\ +000200000000000000000000000000000000000000000000 + +00000000000000000000000000000000:893978E492FED5662D13AA2F759DC89A:\ +000100000000000000000000000000000000000000000000 + +00000000000000000000000000000000:9E274EAD9B737BB21EFCFCA548602689:\ +800000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:92FC8E510399E46A041BF365E7B3AE82:\ +400000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5E0DA386C46AD493DEA203FDC6F57D70:\ +200000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BEC1E37824CF721E5D87F6CB4EBFB9BE:\ +100000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:257A79F891BB8D0C13FEEF1ACC264214:\ +080000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8B3EDD5BA04CB6FF80A3874411C1B8B7:\ +040000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:73C83EA96AE151230B2DEE7110B15E2C:\ +020000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0ABD62FC8802C9BC86E2544909AC610F:\ +010000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1908EF821AD2EBC0CB28BF66E796EDAB:\ +0000000000000000000000000000000000000000000000000000000000000080 + +00000000000000000000000000000000:8D88B1E7BB45E0DD5603D8FCCD589695:\ +0000000000000000000000000000000000000000000000000000000000000040 + +00000000000000000000000000000000:284CDF6476175B6BB414E7FAC09CD404:\ +0000000000000000000000000000000000000000000000000000000000000020 + +00000000000000000000000000000000:66487D053A660BD840D7DE39A3B1F139:\ +0000000000000000000000000000000000000000000000000000000000000010 + +00000000000000000000000000000000:869A570998988F68819CCF301EB015DF:\ +0000000000000000000000000000000000000000000000000000000000000008 + +00000000000000000000000000000000:F6899D57F734AFD6473278DBDE8FB99D:\ +0000000000000000000000000000000000000000000000000000000000000004 + +00000000000000000000000000000000:A6726CE53BD62BC873F6C0463A5841FC:\ +0000000000000000000000000000000000000000000000000000000000000002 + +00000000000000000000000000000000:9858FD31C9C6B54AC0C99CC52324ED34:\ +0000000000000000000000000000000000000000000000000000000000000001 + +00000000000000000000000000000000:82EDDDC59E207131F1AE2A2A06A83284:\ +0000000000000000000000000000000000000000000000000000000000008000 + +00000000000000000000000000000000:1C17A9F76290FB6C0F0267BB1CE832C6:\ +0000000000000000000000000000000000000000000000000000000000004000 + +00000000000000000000000000000000:6DD6415CC9EFB2323FA78ED28EEE06C7:\ +0000000000000000000000000000000000000000000000000000000000002000 + +00000000000000000000000000000000:48FD01A424E995B0E0840353439B1A4B:\ +0000000000000000000000000000000000000000000000000000000000001000 + +00000000000000000000000000000000:2B139C4C4200A8DA4DAF8169F84A4089:\ +0000000000000000000000000000000000000000000000000000000000000800 + +00000000000000000000000000000000:0D7E0A00E181F592C1D75250AC940517:\ +0000000000000000000000000000000000000000000000000000000000000400 + +00000000000000000000000000000000:9250D327F678E8EDBC25CB40EA70391E:\ +0000000000000000000000000000000000000000000000000000000000000200 + +00000000000000000000000000000000:4D715D9421FCB51C7B4C94DEF2B5C210:\ +0000000000000000000000000000000000000000000000000000000000000100 + +00000000000000000000000000000000:19DD5DEC75CEE00003995BF2EA643E2F:\ +0000000000000000000000000000000000000000000000000000000000800000 + +00000000000000000000000000000000:BB75015A768AB1E9BC4AF49D2D156C4F:\ +0000000000000000000000000000000000000000000000000000000000400000 + +00000000000000000000000000000000:46EFE1B09EFB606CB11717415511862E:\ +0000000000000000000000000000000000000000000000000000000000200000 + +00000000000000000000000000000000:360D02F49944ECAE2EE2050E634904CE:\ +0000000000000000000000000000000000000000000000000000000000100000 + +00000000000000000000000000000000:93E207973539B6E2EF7D49C772E32D86:\ +0000000000000000000000000000000000000000000000000000000000080000 + +00000000000000000000000000000000:2E71481D28ED6BD01157F4D054F01961:\ +0000000000000000000000000000000000000000000000000000000000040000 + +00000000000000000000000000000000:AC06EB8186A501262CE9B06FC88F9774:\ +0000000000000000000000000000000000000000000000000000000000020000 + +00000000000000000000000000000000:A94CC5DCC946C9B4F38D1D46BF1C0335:\ +0000000000000000000000000000000000000000000000000000000000010000 + +00000000000000000000000000000000:17A457DA5304D77BD0BC4B5B8BB02FDD:\ +0000000000000000000000000000000000000000000000000000000080000000 + +00000000000000000000000000000000:B6DF6B6C45A38ECE7E940C45FE1E847E:\ +0000000000000000000000000000000000000000000000000000000040000000 + +00000000000000000000000000000000:83DB5E464D300A76EDA858E108902EBF:\ +0000000000000000000000000000000000000000000000000000000020000000 + +00000000000000000000000000000000:C7FB67AAA9F7417DC5977B57B723D278:\ +0000000000000000000000000000000000000000000000000000000010000000 + +00000000000000000000000000000000:1DD21FD2291C7419B5593EE8D6712198:\ +0000000000000000000000000000000000000000000000000000000008000000 + +00000000000000000000000000000000:A2E337EFDF4B888C2B94B86AE20FF8E8:\ +0000000000000000000000000000000000000000000000000000000004000000 + +00000000000000000000000000000000:61F70FEAB04DB61D959A69E9C1BAAA9D:\ +0000000000000000000000000000000000000000000000000000000002000000 + +00000000000000000000000000000000:6FC6C5718FD0B81194A198F873EDE7EA:\ +0000000000000000000000000000000000000000000000000000000001000000 + +00000000000000000000000000000000:DFDB243581A8D3DA8A3F268AA8E6207E:\ +0000000000000000000000000000000000000000000000000000008000000000 + +00000000000000000000000000000000:965A8653210830C831353A28CBBFD16C:\ +0000000000000000000000000000000000000000000000000000004000000000 + +00000000000000000000000000000000:E3442D2FC126CC50AB364E09A0872B18:\ +0000000000000000000000000000000000000000000000000000002000000000 + +00000000000000000000000000000000:B261BC4E7FAE6629FC5F5D588E417CAF:\ +0000000000000000000000000000000000000000000000000000001000000000 + +00000000000000000000000000000000:940218AC849FD119D89B0E15376213DD:\ +0000000000000000000000000000000000000000000000000000000800000000 + +00000000000000000000000000000000:C07DE68CB0ED8C8D398B87D6547BD15B:\ +0000000000000000000000000000000000000000000000000000000400000000 + +00000000000000000000000000000000:F14145E5DCB1EFA30A5A6CA08EC8F8FE:\ +0000000000000000000000000000000000000000000000000000000200000000 + +00000000000000000000000000000000:4D08CD60B971B10854A0912DAF5CC3A8:\ +0000000000000000000000000000000000000000000000000000000100000000 + +00000000000000000000000000000000:73C96C4F08BC5F9725CD2F719402DF4B:\ +0000000000000000000000000000000000000000000000000000800000000000 + +00000000000000000000000000000000:488AF3D7E9223041C2C26AB496BBF0E5:\ +0000000000000000000000000000000000000000000000000000400000000000 + +00000000000000000000000000000000:CD5038A80ECEC3424E1E9614CD3267DD:\ +0000000000000000000000000000000000000000000000000000200000000000 + +00000000000000000000000000000000:C38D3776A560BBC5453E96C1587B0E59:\ +0000000000000000000000000000000000000000000000000000100000000000 + +00000000000000000000000000000000:845416D12195B8FC18F299AD41D8F569:\ +0000000000000000000000000000000000000000000000000000080000000000 + +00000000000000000000000000000000:07B3D3BB79520764234D247A7A0036C2:\ +0000000000000000000000000000000000000000000000000000040000000000 + +00000000000000000000000000000000:BD6816944B3A1353229B02907CD0E87C:\ +0000000000000000000000000000000000000000000000000000020000000000 + +00000000000000000000000000000000:CC547CD2016122227D7CE3B4BFBE3EAF:\ +0000000000000000000000000000000000000000000000000000010000000000 + +00000000000000000000000000000000:3CF2E1206969ED3A85E28EFA16162E53:\ +0000000000000000000000000000000000000000000000000080000000000000 + +00000000000000000000000000000000:801DB46F97025BB099F7755595C532E3:\ +0000000000000000000000000000000000000000000000000040000000000000 + +00000000000000000000000000000000:4322F95A6D70B9D4F53B733505A11D79:\ +0000000000000000000000000000000000000000000000000020000000000000 + +00000000000000000000000000000000:D1A200ED8E473284B70EB16E93B55ECD:\ +0000000000000000000000000000000000000000000000000010000000000000 + +00000000000000000000000000000000:AAB1879D98592963B8F90C8F06804207:\ +0000000000000000000000000000000000000000000000000008000000000000 + +00000000000000000000000000000000:E221625345B6E73DD09235C7A3957CA3:\ +0000000000000000000000000000000000000000000000000004000000000000 + +00000000000000000000000000000000:02B055320E02DA991986BB53A1CC69B9:\ +0000000000000000000000000000000000000000000000000002000000000000 + +00000000000000000000000000000000:FCA1B117007B2C06165E3D773CCEB0C9:\ +0000000000000000000000000000000000000000000000000001000000000000 + +00000000000000000000000000000000:853E0E5DD1CA7C9C55388DDBA2F138FD:\ +0000000000000000000000000000000000000000000000008000000000000000 + +00000000000000000000000000000000:6991C5D5E1BD766597115C5A213F6CFB:\ +0000000000000000000000000000000000000000000000004000000000000000 + +00000000000000000000000000000000:4E0D7A3C6816CC844ABA4BB6AA0F3592:\ +0000000000000000000000000000000000000000000000002000000000000000 + +00000000000000000000000000000000:1A93F22F2E11AFC3CECA1FC17065ECEC:\ +0000000000000000000000000000000000000000000000001000000000000000 + +00000000000000000000000000000000:1519F9986E85E5B942A66DFE1D6ECBE7:\ +0000000000000000000000000000000000000000000000000800000000000000 + +00000000000000000000000000000000:2B583F2363F6C1D981BD2D0C3F965F3A:\ +0000000000000000000000000000000000000000000000000400000000000000 + +00000000000000000000000000000000:E92FEBFA44950BE01CE755EB4607563B:\ +0000000000000000000000000000000000000000000000000200000000000000 + +00000000000000000000000000000000:A583EF976A292B406BBD5DC8256B0442:\ +0000000000000000000000000000000000000000000000000100000000000000 + +00000000000000000000000000000000:08D8A40BCA6BC1C31BADCC9DDA387D9C:\ +0000000000000000000000000000000000000000000000800000000000000000 + +00000000000000000000000000000000:F502C9674BEBFAE010527C808CA03F5C:\ +0000000000000000000000000000000000000000000000400000000000000000 + +00000000000000000000000000000000:E85D57184DA2B982C18C8B13B1348838:\ +0000000000000000000000000000000000000000000000200000000000000000 + +00000000000000000000000000000000:6E71FFAC10EDBF08A6DC42BDA14AE1CE:\ +0000000000000000000000000000000000000000000000100000000000000000 + +00000000000000000000000000000000:0F2D7BEE48845D8A17ECF93F52F9036A:\ +0000000000000000000000000000000000000000000000080000000000000000 + +00000000000000000000000000000000:CBC811575660AF9F7E869631ED779F66:\ +0000000000000000000000000000000000000000000000040000000000000000 + +00000000000000000000000000000000:F7E405B065FB1A03EBD539CFCAD08E17:\ +0000000000000000000000000000000000000000000000020000000000000000 + +00000000000000000000000000000000:0872458B2E2C4725CE7DEC3FFFC47F4A:\ +0000000000000000000000000000000000000000000000010000000000000000 + +00000000000000000000000000000000:18DF0F25A865A0B6EC844D810D25FD87:\ +0000000000000000000000000000000000000000000080000000000000000000 + +00000000000000000000000000000000:35D6DB5996115E7E8C1BE200823E7C63:\ +0000000000000000000000000000000000000000000040000000000000000000 + +00000000000000000000000000000000:CDEA1849DE224D92034BEC826682AD47:\ +0000000000000000000000000000000000000000000020000000000000000000 + +00000000000000000000000000000000:7343B1923DB7C28C195660252857ABA3:\ +0000000000000000000000000000000000000000000010000000000000000000 + +00000000000000000000000000000000:F02FA74352855E5FC194F18476DC2916:\ +0000000000000000000000000000000000000000000008000000000000000000 + +00000000000000000000000000000000:ADCAFB490DD340784F084779CE182FFE:\ +0000000000000000000000000000000000000000000004000000000000000000 + +00000000000000000000000000000000:0CE37E34B01BAF724841EC58A6B90990:\ +0000000000000000000000000000000000000000000002000000000000000000 + +00000000000000000000000000000000:A577782DBA6EDE990B2A28FBF52899B0:\ +0000000000000000000000000000000000000000000001000000000000000000 + +00000000000000000000000000000000:E5BD5E55A80FE196A2AEBCDB6798614E:\ +0000000000000000000000000000000000000000008000000000000000000000 + +00000000000000000000000000000000:DAD3F4D3B96EF51C2D4D2869FAEA4C1D:\ +0000000000000000000000000000000000000000004000000000000000000000 + +00000000000000000000000000000000:28E64B7DC148055040950974E718B27A:\ +0000000000000000000000000000000000000000002000000000000000000000 + +00000000000000000000000000000000:08C9B5E67B8954FDFE74F391B7AFB754:\ +0000000000000000000000000000000000000000001000000000000000000000 + +00000000000000000000000000000000:9CA79528107403A7430CD50578029990:\ +0000000000000000000000000000000000000000000800000000000000000000 + +00000000000000000000000000000000:45A104CAE36E600B6EF91B91FC1C657C:\ +0000000000000000000000000000000000000000000400000000000000000000 + +00000000000000000000000000000000:D9CF9457265E7ACC57EFE25736A11FBE:\ +0000000000000000000000000000000000000000000200000000000000000000 + +00000000000000000000000000000000:D1DD8AE84D38D129A5FA0E9D9520ECF8:\ +0000000000000000000000000000000000000000000100000000000000000000 + +00000000000000000000000000000000:43FB732672D6243DDC9C547E46711FBE:\ +0000000000000000000000000000000000000000800000000000000000000000 + +00000000000000000000000000000000:A2622ED785815C12C949EBED89094FC3:\ +0000000000000000000000000000000000000000400000000000000000000000 + +00000000000000000000000000000000:FBB93B64CA5D94692B4E6EED934112D8:\ +0000000000000000000000000000000000000000200000000000000000000000 + +00000000000000000000000000000000:CD3681FF583D4BC4886D864CFA94EF97:\ +0000000000000000000000000000000000000000100000000000000000000000 + +00000000000000000000000000000000:37ED3CE092A1AE925264751DFFF6B50E:\ +0000000000000000000000000000000000000000080000000000000000000000 + +00000000000000000000000000000000:3CA305833473AC6990A41E37A7BE551A:\ +0000000000000000000000000000000000000000040000000000000000000000 + +00000000000000000000000000000000:CEF8EC0353A04B3DB1309F88265FDABF:\ +0000000000000000000000000000000000000000020000000000000000000000 + +00000000000000000000000000000000:51C23A4293BB9B963AD17E349B8A71C5:\ +0000000000000000000000000000000000000000010000000000000000000000 + +00000000000000000000000000000000:B324D96D901DB388CC1DF28092714335:\ +0000000000000000000000000000000000000080000000000000000000000000 + +00000000000000000000000000000000:E572F8132305A28A1E09BF5ED8ABAA8D:\ +0000000000000000000000000000000000000040000000000000000000000000 + +00000000000000000000000000000000:E4CBB63909992197E9654069BF4EE3EE:\ +0000000000000000000000000000000000000020000000000000000000000000 + +00000000000000000000000000000000:14B1DF955B3A20EADFF35C3869B0B624:\ +0000000000000000000000000000000000000010000000000000000000000000 + +00000000000000000000000000000000:4D9019A6223F39E2075C95C7724959FC:\ +0000000000000000000000000000000000000008000000000000000000000000 + +00000000000000000000000000000000:5352A5E6F316C51F0256B3A0BC283D47:\ +0000000000000000000000000000000000000004000000000000000000000000 + +00000000000000000000000000000000:9F570DD55188193525D0C0244CBA2CFD:\ +0000000000000000000000000000000000000002000000000000000000000000 + +00000000000000000000000000000000:1B206FEA626AD786255A3186AC5F5132:\ +0000000000000000000000000000000000000001000000000000000000000000 + +00000000000000000000000000000000:D7078E2A1CB16142851F7C5F86FF4E64:\ +0000000000000000000000000000000000008000000000000000000000000000 + +00000000000000000000000000000000:FED174EAC6701DAD5DF03DD8A438D99C:\ +0000000000000000000000000000000000004000000000000000000000000000 + +00000000000000000000000000000000:9112A5FEB40E3134C26303F379F29AF6:\ +0000000000000000000000000000000000002000000000000000000000000000 + +00000000000000000000000000000000:B190C3C5AC183F95F71495A93C679BDB:\ +0000000000000000000000000000000000001000000000000000000000000000 + +00000000000000000000000000000000:5777C456EEDBB7756AE316517C1072A8:\ +0000000000000000000000000000000000000800000000000000000000000000 + +00000000000000000000000000000000:5550900FAF11F9D2DDC6CF2F1D7AAEDB:\ +0000000000000000000000000000000000000400000000000000000000000000 + +00000000000000000000000000000000:BDE3013E16AFDF64A0F24991D7EE5752:\ +0000000000000000000000000000000000000200000000000000000000000000 + +00000000000000000000000000000000:71500F21B4145961271727E896C62F24:\ +0000000000000000000000000000000000000100000000000000000000000000 + +00000000000000000000000000000000:801CA8E44FB6BAB5DF7FB96AA5F39F8D:\ +0000000000000000000000000000000000800000000000000000000000000000 + +00000000000000000000000000000000:9EB5169E8F72673301D0ABF9E85422BF:\ +0000000000000000000000000000000000400000000000000000000000000000 + +00000000000000000000000000000000:CB377E74144F9E9405355F089CA3918B:\ +0000000000000000000000000000000000200000000000000000000000000000 + +00000000000000000000000000000000:1EE82E9E6E525DAEB21DF068DFF7AB09:\ +0000000000000000000000000000000000100000000000000000000000000000 + +00000000000000000000000000000000:6316DDDD174659C16CF3324A770225EB:\ +0000000000000000000000000000000000080000000000000000000000000000 + +00000000000000000000000000000000:E17C717EC7A1CF3492710D9FE53A26AD:\ +0000000000000000000000000000000000040000000000000000000000000000 + +00000000000000000000000000000000:675F1E9F7C895DD0B4E1F8D4EED1D2C9:\ +0000000000000000000000000000000000020000000000000000000000000000 + +00000000000000000000000000000000:446B5ADE1FE91D73511403B34F20FF16:\ +0000000000000000000000000000000000010000000000000000000000000000 + +00000000000000000000000000000000:C19171490B5595E8555C61B352935DEB:\ +0000000000000000000000000000000080000000000000000000000000000000 + +00000000000000000000000000000000:57159E7BE66463408FAE89C376318FA8:\ +0000000000000000000000000000000040000000000000000000000000000000 + +00000000000000000000000000000000:C2441BB36C7B7977B0E6EED5AED1BE09:\ +0000000000000000000000000000000020000000000000000000000000000000 + +00000000000000000000000000000000:63A33251E59FF5A6CE0482EB4B80E70B:\ +0000000000000000000000000000000010000000000000000000000000000000 + +00000000000000000000000000000000:4459D2EA77E8E8041DA46EB36705B054:\ +0000000000000000000000000000000008000000000000000000000000000000 + +00000000000000000000000000000000:E76A69F531CCC2C1A4C56AEE55B63C29:\ +0000000000000000000000000000000004000000000000000000000000000000 + +00000000000000000000000000000000:97E97C261C31046F115FEC15820E3822:\ +0000000000000000000000000000000002000000000000000000000000000000 + +00000000000000000000000000000000:3620B17AE6A993D09618B8768266BAE9:\ +0000000000000000000000000000000001000000000000000000000000000000 + +00000000000000000000000000000000:4172B0BEBBEF90672EB0623A709FC734:\ +0000000000000000000000000000008000000000000000000000000000000000 + +00000000000000000000000000000000:265829FC78FD18069B3631AE596DC9BF:\ +0000000000000000000000000000004000000000000000000000000000000000 + +00000000000000000000000000000000:E89B25E3E40E28D37BA6E78C55A611F8:\ +0000000000000000000000000000002000000000000000000000000000000000 + +00000000000000000000000000000000:8EBF95D561DD65F9BC66B82A6905828C:\ +0000000000000000000000000000001000000000000000000000000000000000 + +00000000000000000000000000000000:8C8F6AF8078C29D23B2958CAE6858A09:\ +0000000000000000000000000000000800000000000000000000000000000000 + +00000000000000000000000000000000:39FA2682ABFABA6A705780E72BDA0128:\ +0000000000000000000000000000000400000000000000000000000000000000 + +00000000000000000000000000000000:A812C9D68212B21A14E9CEBCA8960750:\ +0000000000000000000000000000000200000000000000000000000000000000 + +00000000000000000000000000000000:47BFD757C13ADA4001DF9B0989E7CB80:\ +0000000000000000000000000000000100000000000000000000000000000000 + +00000000000000000000000000000000:A95ADAA6A53D1BF0FA4E46EA5D1EE88C:\ +0000000000000000000000000000800000000000000000000000000000000000 + +00000000000000000000000000000000:D1031805010BBACD8BB316EFA437EC4A:\ +0000000000000000000000000000400000000000000000000000000000000000 + +00000000000000000000000000000000:7B6A4380AF9337C902AA691243F6A2E6:\ +0000000000000000000000000000200000000000000000000000000000000000 + +00000000000000000000000000000000:BDEF751D35F3B8BC6A9AB61F6B04A94A:\ +0000000000000000000000000000100000000000000000000000000000000000 + +00000000000000000000000000000000:51CFB9ED07D3628D0854C2E85FC4B866:\ +0000000000000000000000000000080000000000000000000000000000000000 + +00000000000000000000000000000000:0CDA37833BE087D8B997A54D5CFBDCFD:\ +0000000000000000000000000000040000000000000000000000000000000000 + +00000000000000000000000000000000:938D2E6F2149D1E0B6F8878D472F0469:\ +0000000000000000000000000000020000000000000000000000000000000000 + +00000000000000000000000000000000:3857B0C25F235A22F347E0ACCD008FAD:\ +0000000000000000000000000000010000000000000000000000000000000000 + +00000000000000000000000000000000:3BAADE8819E09549CDA6AA160F4C626A:\ +0000000000000000000000000080000000000000000000000000000000000000 + +00000000000000000000000000000000:0F5E7BF2A2590F7A65D17DAA4E828F7D:\ +0000000000000000000000000040000000000000000000000000000000000000 + +00000000000000000000000000000000:510B105E4809B4115C999AB346D21570:\ +0000000000000000000000000020000000000000000000000000000000000000 + +00000000000000000000000000000000:0FF47C9330A69D2B5C52434394A2D1CA:\ +0000000000000000000000000010000000000000000000000000000000000000 + +00000000000000000000000000000000:AB8301BFFFF3B24A3CE63F553443F2C7:\ +0000000000000000000000000008000000000000000000000000000000000000 + +00000000000000000000000000000000:49A3F4514E983616F55580EA4EA12DBF:\ +0000000000000000000000000004000000000000000000000000000000000000 + +00000000000000000000000000000000:C007AEA2279ED965AD5F037359DE24C4:\ +0000000000000000000000000002000000000000000000000000000000000000 + +00000000000000000000000000000000:BE5FCBE21961382305B6EDBC74B6D73E:\ +0000000000000000000000000001000000000000000000000000000000000000 + +00000000000000000000000000000000:5F3DB2DEE7074DAE2340174109D6BEF0:\ +0000000000000000000000008000000000000000000000000000000000000000 + +00000000000000000000000000000000:E530BC0CE5A24E03AD0D215A7E9D9A15:\ +0000000000000000000000004000000000000000000000000000000000000000 + +00000000000000000000000000000000:FFF5A17155933F6084EA4C1BE1245769:\ +0000000000000000000000002000000000000000000000000000000000000000 + +00000000000000000000000000000000:64CA3D5422833F7A4AD1FA5331C08A78:\ +0000000000000000000000001000000000000000000000000000000000000000 + +00000000000000000000000000000000:E42C18F2B56A0E536E4908F84DE06419:\ +0000000000000000000000000800000000000000000000000000000000000000 + +00000000000000000000000000000000:97823D74887FBE3E6B412407A256A018:\ +0000000000000000000000000400000000000000000000000000000000000000 + +00000000000000000000000000000000:8A1D4467260F12AB493334133D5928DD:\ +0000000000000000000000000200000000000000000000000000000000000000 + +00000000000000000000000000000000:735E7FB4B1B2D54C6D33E3D0C714BFA0:\ +0000000000000000000000000100000000000000000000000000000000000000 + +00000000000000000000000000000000:AD4B018D50E3A28124A0A1259DC667D4:\ +0000000000000000000000800000000000000000000000000000000000000000 + +00000000000000000000000000000000:C899A00A2585C1F654694700F1EC1531:\ +0000000000000000000000400000000000000000000000000000000000000000 + +00000000000000000000000000000000:BAE53DCFCF6D6E360A27755F9CE81B6D:\ +0000000000000000000000200000000000000000000000000000000000000000 + +00000000000000000000000000000000:6E181C731459C3360778BEA1BA86164D:\ +0000000000000000000000100000000000000000000000000000000000000000 + +00000000000000000000000000000000:97FD2DDD6045805A7B34879A6AB55D3C:\ +0000000000000000000000080000000000000000000000000000000000000000 + +00000000000000000000000000000000:547D61C02DEF0D9869DF43907D3B8124:\ +0000000000000000000000040000000000000000000000000000000000000000 + +00000000000000000000000000000000:9E457544FC14C723884DD15DEBC25157:\ +0000000000000000000000020000000000000000000000000000000000000000 + +00000000000000000000000000000000:E0767EC3934ECF169116B485ED0C755B:\ +0000000000000000000000010000000000000000000000000000000000000000 + +00000000000000000000000000000000:B4B30728F0DDBB28402E252DC6DDBA4E:\ +0000000000000000000080000000000000000000000000000000000000000000 + +00000000000000000000000000000000:DDB074D9E22B61FCDCB2323A52046221:\ +0000000000000000000040000000000000000000000000000000000000000000 + +00000000000000000000000000000000:91ABBBFECEC752159297B832055E99FE:\ +0000000000000000000020000000000000000000000000000000000000000000 + +00000000000000000000000000000000:25415EF8615CC222B1EC77046B094C35:\ +0000000000000000000010000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C11856EE23FA27F2F426844EE9C7B081:\ +0000000000000000000008000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5E6F28690F31CDC0DAD21D8E3E1BC985:\ +0000000000000000000004000000000000000000000000000000000000000000 + +00000000000000000000000000000000:712D271BAB597FF6728C0A55CE6C3CDB:\ +0000000000000000000002000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4A567C948597B47A1ABF5F8CCD77AE4F:\ +0000000000000000000001000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6ED568AD50C256B77945E19C04086D98:\ +0000000000000000008000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F2398F417C685FE664735E29DB29BBA9:\ +0000000000000000004000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:37D20B991D910044C6BEF068028125D4:\ +0000000000000000002000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:35721318ED63062B43D37C4F14101962:\ +0000000000000000001000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:74A004A5D483CCA7219EA12AD4AF5CA4:\ +0000000000000000000800000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BBCEA8A80619D2AC53037313E71AB56C:\ +0000000000000000000400000000000000000000000000000000000000000000 + +00000000000000000000000000000000:646E434C0FEF5CD6CD9C7A26BA972BB1:\ +0000000000000000000200000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8F2AD3F65E9716E611501D5B7AD81127:\ +0000000000000000000100000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BCC02339FCFFCAE0536FB5410AF91129:\ +0000000000000000800000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:DD6A02B2DC091212A746C8FC9967B8BE:\ +0000000000000000400000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4BB9FD26E225C913F9BE1B697D31B5B9:\ +0000000000000000200000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:2A3BAC4370DAA0D68CA90939F43E33CC:\ +0000000000000000100000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8576F1070E25B5FD944C366E08CC9102:\ +0000000000000000080000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E620C37AD1650DCEAEBEAE1F57BD8AD9:\ +0000000000000000040000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7761ECD209CB564EEACAB4E62DB26BDD:\ +0000000000000000020000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:67D23F0CF1A57BA0E43FE82A3F4FBBB6:\ +0000000000000000010000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D9732CE2055E7F935468A63A170B598C:\ +0000000000000080000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E9F396623AF12ADF24C0378F42F7B4BD:\ +0000000000000040000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:98D5AE45E15A836C141CF7F64DC7D551:\ +0000000000000020000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EEFBED56D7BD47D088B3AD657A6CB8B8:\ +0000000000000010000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A99342C96F331950D97AFBFC8C0D4E08:\ +0000000000000008000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:25C35298C0A1224F2BEE7EE8AAA86E51:\ +0000000000000004000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:66602FD71F84B2637B2283CD81DE3080:\ +0000000000000002000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D48E45670FD978FA4DB161C0E5D59FC0:\ +0000000000000001000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:ECE089620BF6866A66FB6070C491C74C:\ +0000000000008000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:36CD300072D4EC94A0FF3595F7A2C1FE:\ +0000000000004000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F939CB3D8316B59600F164234E78D228:\ +0000000000002000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:17C6258E6009E282661869D525F7D204:\ +0000000000001000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:45A32C5EA3E2E548A9E6313BEF957308:\ +0000000000000800000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C2105CC6264024EBEC6BA0F825FD5163:\ +0000000000000400000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:85F3D2169883A7CD54A67DA7C4AC613C:\ +0000000000000200000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B5FFC7D92EA2815C0F4DC9182DA160C6:\ +0000000000000100000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C9642C4E3F420CA73E8F1C15C6EB011F:\ +0000000000800000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1BD0EEF566BEFB4D57CE7120B731125E:\ +0000000000400000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CB0705AE3DB537AD1C202DD6635202DA:\ +0000000000200000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D88F55DAC599BEA8440B4BA9E3C50016:\ +0000000000100000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FF227EC8AF4640198173A79B124CEFDF:\ +0000000000080000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CC55A4F4086043F1E1ABA9CC91E4395A:\ +0000000000040000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8D2BAD986865A229601855B024D9A557:\ +0000000000020000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:343E1B000FEDAC000376EE138FD8F0F7:\ +0000000000010000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:765DF290B8D90C9169E6884A0D4D4B92:\ +0000000080000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F9EEBAB9F5CEBF94196FEF3872C46881:\ +0000000040000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:318B1983222E49F5B57E26E70890A5B6:\ +0000000020000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D8DF0A98604C987283ACF7F211D906C7:\ +0000000010000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:92697CF743A72D2D4D7864132A9ADE0B:\ +0000000008000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:2C450C8BCDAA9CB59F930DDAE88CBDB3:\ +0000000004000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4284A05C4A0AF59DFF15604ACBB82743:\ +0000000002000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:986A05E8447024C8468A1EBF7743F689:\ +0000000001000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4A7E5D441526F7D4D2987AEDF48F0231:\ +0000008000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F5D9875A70158C9C64136703D231E3F5:\ +0000004000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3BC82EC5FBE24B5AAF230895BBA9DCD1:\ +0000002000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EFF062AF33726C788D261FBFDDA15109:\ +0000001000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E2A342E2683D3F970983D941656823AA:\ +0000000800000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E16066A35F943A426FE47AD1A1FC69AD:\ +0000000400000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D89F891B578FF6B441E97849DD2F2798:\ +0000000200000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4A800443B44112493226E08BD9521912:\ +0000000100000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:2B504288F018B2A867597EB53EEA6DB1:\ +0000800000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B3FA8074A573A00B4897DF6CD0D99B5D:\ +0000400000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:38B56FD4C1FEDF5282208EF5F796A2C9:\ +0000200000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BFE421423C53A9942C78D04CB4B231D8:\ +0000100000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EF102196C479E513AE8B776D524631B9:\ +0000080000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:AC38F8F6DF320D4409BA6A1CD93A482E:\ +0000040000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FB5D6CD1B6EE155D6744E5BE62A650F6:\ +0000020000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:23A626E559D0B8E4E4AB3F7C38750D4A:\ +0000010000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:2CCA19AE45B976236D88E4E1AD3BACEA:\ +0080000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:052D166AA678A987C07256C582283986:\ +0040000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D30979DDC6C09B1158FA41EEB6F2A21B:\ +0020000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C36705BB2A9BAFCFCB64C4468964D568:\ +0010000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:97905460E140685960B561204ABC09A9:\ +0008000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B893B8766A12AAAD7691565C46651623:\ +0004000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7978DBD4794AF35DFB0403423B4E81A9:\ +0002000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4F990737145AAA9100BFEDCA53B69F6D:\ +0001000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A223AA1288463C0E2BE38EBD825616C0:\ +8000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EAE1D405570174DF7DF2F9966D509159:\ +4000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:65F37684471E921DC8A30F45B43C4499:\ +2000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0EE036D0BC32B89C1CEF987F5229E4A9:\ +1000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EC9D6557EED58E6CF89A746BBDB6C9B7:\ +0800000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:AD2314BF713CD796E8C7EC6E9C59CB8D:\ +0400000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:33D8944A2D2FACBBA555EC18543AFCF0:\ +0200000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E0885D4460373469D1FA6C36A6E1C52F:\ +0100000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000080:4AE9A20B2B14A10290CBB820B7FFB510:\ +00000000000000000000000000000000 + +00000000000000000000000000000040:2C6EE9F8F64B5B1B5587CDF17E84A791:\ +00000000000000000000000000000000 + +00000000000000000000000000000020:29141D06A6B42CE22EFB8383CEAE325D:\ +00000000000000000000000000000000 + +00000000000000000000000000000010:2AE6E19905D89A8E53A1DF26AD5C89B4:\ +00000000000000000000000000000000 + +00000000000000000000000000000008:1587FF28ABDF9DF5A3F4DAF7405D273B:\ +00000000000000000000000000000000 + +00000000000000000000000000000004:B598247AA82F5C79F9FF0E7EC61B83C4:\ +00000000000000000000000000000000 + +00000000000000000000000000000002:0C5DABB01245E3A3544E291F3B0F250F:\ +00000000000000000000000000000000 + +00000000000000000000000000000001:9BEDCEA16BDE863526A937208CBF0ABC:\ +00000000000000000000000000000000 + +00000000000000000000000000008000:A174B66C47C53B2C34AA9F06FECBB7B2:\ +00000000000000000000000000000000 + +00000000000000000000000000004000:333827335F88EBB93A0A7436E51398F0:\ +00000000000000000000000000000000 + +00000000000000000000000000002000:03A7D7D70F4F50AE96835F12B73F79D3:\ +00000000000000000000000000000000 + +00000000000000000000000000001000:B8B9F2029769952D9664A6FDE9706BBF:\ +00000000000000000000000000000000 + +00000000000000000000000000000800:A7DCE248EC5A060388CA14598B986454:\ +00000000000000000000000000000000 + +00000000000000000000000000000400:1A21EED739C6C39A56E0B4C6A17D3375:\ +00000000000000000000000000000000 + +00000000000000000000000000000200:9073DBCF760A0B9E0E84A2FD6DF164F9:\ +00000000000000000000000000000000 + +00000000000000000000000000000100:CEE83B85568AD8133D8842DC883052CE:\ +00000000000000000000000000000000 + +00000000000000000000000000800000:151940BA15A175FCD39CE2D3A0259EFF:\ +00000000000000000000000000000000 + +00000000000000000000000000400000:9F997F2AC950E52666207183DB935899:\ +00000000000000000000000000000000 + +00000000000000000000000000200000:015B7DF6BFB9367BF8F690FC0B77DEB0:\ +00000000000000000000000000000000 + +00000000000000000000000000100000:4A7D36598525699F49667AF4B46BB99B:\ +00000000000000000000000000000000 + +00000000000000000000000000080000:306248FD603DFC18E41CF0864D2C352C:\ +00000000000000000000000000000000 + +00000000000000000000000000040000:1367EC90627601E9C1BD1371454B772F:\ +00000000000000000000000000000000 + +00000000000000000000000000020000:85FE597694444D1A8D7F1CE219913F4F:\ +00000000000000000000000000000000 + +00000000000000000000000000010000:75BAF3E8194EA04577133509B50FF4C3:\ +00000000000000000000000000000000 + +00000000000000000000000080000000:3EB8325BCA6C583DC04019F01D4BC90D:\ +00000000000000000000000000000000 + +00000000000000000000000040000000:240A1E99A51C7EED2E9127DB7D86903E:\ +00000000000000000000000000000000 + +00000000000000000000000020000000:81B2AF04CC40E2E3DDFFBE3F6AEF8A33:\ +00000000000000000000000000000000 + +00000000000000000000000010000000:6970437809D0A34E5A76B22F88F5282B:\ +00000000000000000000000000000000 + +00000000000000000000000008000000:C12E44B3F253295CF742441FFA2712DB:\ +00000000000000000000000000000000 + +00000000000000000000000004000000:98E2FBF128A1E2F80CABF2DB3F9E62AF:\ +00000000000000000000000000000000 + +00000000000000000000000002000000:3F2B1D74B9D0D84C0B0DDAD31352E67A:\ +00000000000000000000000000000000 + +00000000000000000000000001000000:E51D907B84D877250D0BCEC17D292DFD:\ +00000000000000000000000000000000 + +00000000000000000000008000000000:19E6063C7529E5268E4A45703AFC8AC4:\ +00000000000000000000000000000000 + +00000000000000000000004000000000:6DDCBD01AC098B04AAA084D4C579DAC9:\ +00000000000000000000000000000000 + +00000000000000000000002000000000:AFC268DB7CD2A453EA87BA6A0E923DEC:\ +00000000000000000000000000000000 + +00000000000000000000001000000000:24B199E30672EF17362468CC8C0F4E46:\ +00000000000000000000000000000000 + +00000000000000000000000800000000:B30C571F161EF0DAC78816A4DC1339FF:\ +00000000000000000000000000000000 + +00000000000000000000000400000000:214CB9151303EDA5CD14E35E701DE887:\ +00000000000000000000000000000000 + +00000000000000000000000200000000:57A991425DC55325EB159A0274140EFA:\ +00000000000000000000000000000000 + +00000000000000000000000100000000:856CD3630F436DACD3FE27AB73F4A956:\ +00000000000000000000000000000000 + +00000000000000000000800000000000:E5D5DC0D6834E44697BDD5D8427A054F:\ +00000000000000000000000000000000 + +00000000000000000000400000000000:CAB879F5684241583F4900B2653D76C9:\ +00000000000000000000000000000000 + +00000000000000000000200000000000:43FE63C8C08E0CE5D1DAB79348F1B64E:\ +00000000000000000000000000000000 + +00000000000000000000100000000000:1D7850062F3F8B2415F22BC4D95A1367:\ +00000000000000000000000000000000 + +00000000000000000000080000000000:45D486C0AC551C76AA17E356404726F2:\ +00000000000000000000000000000000 + +00000000000000000000040000000000:900FEDE23DBB68E48BA9D9806E606F19:\ +00000000000000000000000000000000 + +00000000000000000000020000000000:F573C581080C5654A6C426DD8971E68B:\ +00000000000000000000000000000000 + +00000000000000000000010000000000:07AF806C0B6ECF9DD508C0D108572C37:\ +00000000000000000000000000000000 + +00000000000000000080000000000000:8C30672FF7F1DB4681BA36E48B3374A3:\ +00000000000000000000000000000000 + +00000000000000000040000000000000:0D56FA9193C8A6FBF653D75D3F61407E:\ +00000000000000000000000000000000 + +00000000000000000020000000000000:08C0C170A7B0F0C07E1CDEF95AEE8113:\ +00000000000000000000000000000000 + +00000000000000000010000000000000:F05F7E94EC7FECF973EF5732B565E016:\ +00000000000000000000000000000000 + +00000000000000000008000000000000:EB667F97B9D94B0C41C873C4B56B334C:\ +00000000000000000000000000000000 + +00000000000000000004000000000000:A065550C6371DEC580E16276E03F13D4:\ +00000000000000000000000000000000 + +00000000000000000002000000000000:CDAC7C0A0E363FE8BA16BC11D1F6DC57:\ +00000000000000000000000000000000 + +00000000000000000001000000000000:FF792A72BF23CABD13EA587C57D05D3F:\ +00000000000000000000000000000000 + +00000000000000008000000000000000:986EFA59113F5C8A66BBAA7EF978A125:\ +00000000000000000000000000000000 + +00000000000000004000000000000000:B8CB15A238CA60157C3CB3317021B92C:\ +00000000000000000000000000000000 + +00000000000000002000000000000000:F262212AC5485BA7D92CBF5A9C58D8AD:\ +00000000000000000000000000000000 + +00000000000000001000000000000000:DF54C6D917675E73A3659560D5813E56:\ +00000000000000000000000000000000 + +00000000000000000800000000000000:925D0E759AF1EB36CEEB0FB6D51FAB7A:\ +00000000000000000000000000000000 + +00000000000000000400000000000000:99BC9E5870190269C4FE5B6FC23C8D8C:\ +00000000000000000000000000000000 + +00000000000000000200000000000000:C0380B9660722514C1EA4322FE45955C:\ +00000000000000000000000000000000 + +00000000000000000100000000000000:66521E5F953F2D2E237A259BDEE9C400:\ +00000000000000000000000000000000 + +00000000000000800000000000000000:1EB43E99040A614F77361601A1806651:\ +00000000000000000000000000000000 + +00000000000000400000000000000000:A11495F4358A5FA63024A2DC02E20480:\ +00000000000000000000000000000000 + +00000000000000200000000000000000:CF4D5EAD4E69313709EA9399F5ABF8D9:\ +00000000000000000000000000000000 + +00000000000000100000000000000000:6CAC3A5E20E13162FB3A31804CB6C7AE:\ +00000000000000000000000000000000 + +00000000000000080000000000000000:BFEE053ED49F33F5A388359721FE20FA:\ +00000000000000000000000000000000 + +00000000000000040000000000000000:B2FFBF55E5E2E0CB0935504430E173F8:\ +00000000000000000000000000000000 + +00000000000000020000000000000000:E521E33E82289A176467E24CBAD5D92C:\ +00000000000000000000000000000000 + +00000000000000010000000000000000:9609C701F895754A623D3BF3EAC48334:\ +00000000000000000000000000000000 + +00000000000080000000000000000000:C80F1E35ED81AC45835129665CA5C0B5:\ +00000000000000000000000000000000 + +00000000000040000000000000000000:27FE1A77E6BF18887DBF7D48FC1EAB65:\ +00000000000000000000000000000000 + +00000000000020000000000000000000:8E2444DDF34F5320A150471E01AC2F85:\ +00000000000000000000000000000000 + +00000000000010000000000000000000:9CB3B00CA62767D7A1D45AF44D74957F:\ +00000000000000000000000000000000 + +00000000000008000000000000000000:A07252FB0F05EA2264F558BDDF162BBB:\ +00000000000000000000000000000000 + +00000000000004000000000000000000:4CCD47A10722175D4018709698E52881:\ +00000000000000000000000000000000 + +00000000000002000000000000000000:F9DED80456581D2E6F09BDB09B77C04A:\ +00000000000000000000000000000000 + +00000000000001000000000000000000:DCA8A545689A58F663B0B7A540F41E24:\ +00000000000000000000000000000000 + +00000000008000000000000000000000:6801BAF0FBAF3352F3950F0940173352:\ +00000000000000000000000000000000 + +00000000004000000000000000000000:B969F1B6F56E885025F12E58F87B4099:\ +00000000000000000000000000000000 + +00000000002000000000000000000000:AA9F1568B6D0F5AFAC34847E0D7152B2:\ +00000000000000000000000000000000 + +00000000001000000000000000000000:A96B20E51FCB48A0C58306086094154B:\ +00000000000000000000000000000000 + +00000000000800000000000000000000:C9F389C56576B8C74A687BC5AAB8D503:\ +00000000000000000000000000000000 + +00000000000400000000000000000000:3FB63882764779902321A2E594275C6B:\ +00000000000000000000000000000000 + +00000000000200000000000000000000:160C3C22EF0B0D3E4F2FDC914138C229:\ +00000000000000000000000000000000 + +00000000000100000000000000000000:265AC0BE8E47750E7CA22BAF01153B4D:\ +00000000000000000000000000000000 + +00000000800000000000000000000000:C1842F4CA2DDC78E55CD91E07AD23A12:\ +00000000000000000000000000000000 + +00000000400000000000000000000000:E47D5889218FF4CE45EA249EDC9B71C7:\ +00000000000000000000000000000000 + +00000000200000000000000000000000:FB7566732AB52FE99454CFB07A0F1F0A:\ +00000000000000000000000000000000 + +00000000100000000000000000000000:5FBF0927A8B293A04024B187AB1BF6C1:\ +00000000000000000000000000000000 + +00000000080000000000000000000000:CFFBC514515878E10E07556988D8E721:\ +00000000000000000000000000000000 + +00000000040000000000000000000000:CD3EEEBA162879FF20ABD158C236E3F3:\ +00000000000000000000000000000000 + +00000000020000000000000000000000:F96D1082131DAE899EBD32CC562F0BB9:\ +00000000000000000000000000000000 + +00000000010000000000000000000000:BDB475694748128D9959141682174CAF:\ +00000000000000000000000000000000 + +00000080000000000000000000000000:A5E0C2E39B9821F2CD42875B0EC0A65E:\ +00000000000000000000000000000000 + +00000040000000000000000000000000:A1397FFDA7C2A4E9A60E0AB48947B933:\ +00000000000000000000000000000000 + +00000020000000000000000000000000:F20B001C13A0F857FB89C64FFF4CDA83:\ +00000000000000000000000000000000 + +00000010000000000000000000000000:F38EE20A32B15A5B9129B67BA1FF3125:\ +00000000000000000000000000000000 + +00000008000000000000000000000000:41ED367E96E013C651AF3FAEA764FE40:\ +00000000000000000000000000000000 + +00000004000000000000000000000000:55C30FBD291D89E50A9DADCB48E52296:\ +00000000000000000000000000000000 + +00000002000000000000000000000000:3FE7F1A404C0E4395FCC985F369735D4:\ +00000000000000000000000000000000 + +00000001000000000000000000000000:6E131502B6A4F30B56AA52EB67989809:\ +00000000000000000000000000000000 + +00008000000000000000000000000000:3EA36D91871DFF568FBE623DC31EBCE5:\ +00000000000000000000000000000000 + +00004000000000000000000000000000:7C6DF10118A3AB6545A504790543C89E:\ +00000000000000000000000000000000 + +00002000000000000000000000000000:1DFF6937399E060342348C34E88B5985:\ +00000000000000000000000000000000 + +00001000000000000000000000000000:87DCE0F133442B7D4FAF7082F5489407:\ +00000000000000000000000000000000 + +00000800000000000000000000000000:CBEF868AE34C80C542766358534A148B:\ +00000000000000000000000000000000 + +00000400000000000000000000000000:DF23BC0E0C0B7F502E0210AF8B353165:\ +00000000000000000000000000000000 + +00000200000000000000000000000000:E9732D7A112DE03068EC10D10AF8D972:\ +00000000000000000000000000000000 + +00000100000000000000000000000000:1D17312BE6675B0797C5175DDCC1DE7E:\ +00000000000000000000000000000000 + +00800000000000000000000000000000:0DB0D17349C89E090C845CBEF963F225:\ +00000000000000000000000000000000 + +00400000000000000000000000000000:C7128FD1A5EF5202550873EA885551C5:\ +00000000000000000000000000000000 + +00200000000000000000000000000000:761D7F9855C95AB6148833503958F96E:\ +00000000000000000000000000000000 + +00100000000000000000000000000000:1D406059F0E1030FA66C52A46751D092:\ +00000000000000000000000000000000 + +00080000000000000000000000000000:DE2FCC081DF9B136EC62922351E18D94:\ +00000000000000000000000000000000 + +00040000000000000000000000000000:5F93FBFB11A527DFDFB5E4713E431E34:\ +00000000000000000000000000000000 + +00020000000000000000000000000000:6C2C4F22E738C56B5246971540E5E3A1:\ +00000000000000000000000000000000 + +00010000000000000000000000000000:BFF82E042A92224FBD3D41C22D07B610:\ +00000000000000000000000000000000 + +80000000000000000000000000000000:A3B35DE7C358DDD82644678C64B8BCBB:\ +00000000000000000000000000000000 + +40000000000000000000000000000000:04ABCFE4E0AF27FF92A2BB10949D7DD2:\ +00000000000000000000000000000000 + +20000000000000000000000000000000:8F773194B78EF2B2740237EF12D08608:\ +00000000000000000000000000000000 + +10000000000000000000000000000000:8B1EA69EE8D7C8D95B1DE4A670EC6997:\ +00000000000000000000000000000000 + +08000000000000000000000000000000:CEE3C6CE66A7AC0C1767923B263B2EBD:\ +00000000000000000000000000000000 + +04000000000000000000000000000000:88DE61FFC3AD277687626D5F7705DEF3:\ +00000000000000000000000000000000 + +02000000000000000000000000000000:69DD947EFADCD15A06A0D79E078B35AE:\ +00000000000000000000000000000000 + +01000000000000000000000000000000:32F1FA100E43561146DCA08D15B90636:\ +00000000000000000000000000000000 + +00000000000000000000000000000080:D9D076F0512B4F29E15752A21B270BB1:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000040:9668F388DD4F122A4D9DD8D6B8A322D5:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000020:D3F12A67FABEC165545D25F5E5FEAE6F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000010:97580203AACE7E6F0DEB71BC631D9E40:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000008:E11B01524EA1F465A2A20043EB9F7E8A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000004:9BAC7EE501F03D6DEBE0F9EE68FBB3C1:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000002:444E6201556F1C9D73299183B7ABCA9D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000001:497EA15A5AAB3CB115C3E0091C2E4047:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000008000:A306CFDAFE5C8C2A955956BB61FFE5CD:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000004000:4815634545F268ED3BF50021AC0265B2:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000002000:3B075AFF8F75956DC4BE7D5121BF07B6:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000001000:8EAA16AEA0535498D21245BAE97ED0D4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000800:AFFA71EA9A2F6C4A018CF2F5F22B9B13:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000400:93B8DD3F9A59DD9231B0885601A2354C:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000200:EE23DB4E914D12A53BE8428161F3DE24:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000100:E76E230F4BA91426325C16FA168CA44B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000800000:14148C222620E009AC51EE2321641D25:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000400000:319D430B55E2A2C942B089755D4C6035:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000200000:774D83990DCBAF6B9186DF250DC721A9:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000100000:81CA67898765727FFDEDBC7DC25EC8FF:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000080000:BEFC19FD8A41103B6892AD4A3CB08122:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000040000:CC2DE08FA80BE8A13C8860174AF9F55D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000020000:4935E35A180FEC382D3DCFD5ED572AFB:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000010000:D78FE49AB8E11EBA118687045D04A70F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000080000000:5DA9109BC3193E5D2ABA0CA577CBBCD4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000040000000:BC46C6FE8F7E549CCC402FC4633C670C:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000020000000:60A11AFFABBEE4D5D5564A74C7F94C91:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000010000000:84DD300A8FDE4AC126F41EA0692F3E07:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000008000000:3734062F8FCF37FBD1C48B5AAEF00C5F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000004000000:EA4491C7F5A9D671DA358C535965E1C3:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000002000000:D46899CC964A2A082C80AB7E0A4B153A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000001000000:45A5744C068AC6C7BC028C4D40885F20:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000008000000000:4FF5F65E2089279F1FFF7BF06EC6D527:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000004000000000:B0C818F70672EF5E6F20515214DDDF7A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000002000000000:2A4D0F00CA19EDCEEF86D7F283221A97:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000001000000000:F9E6A04D60D5C06994E196EEF788ED59:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000800000000:602BE82E95A1BEF5C2742099A6CB70D9:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000400000000:B53F1354FE1291679B6D418AC4A3E26D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000200000000:0F68F7C1FFB5FA997D8CC007CF4F5BA8:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000100000000:3B90014CDF2D614A339B48A6F374D1C4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000800000000000:3D8075B415AC9DEB6008B51597CE28F4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000400000000000:675A3322BCCCF4D78F3376ECC2C8A415:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000200000000000:B8CD6C76DAD863B3A2342265A42C7878:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000100000000000:E0F6B38346E3E0AE2C5763C25C01ACB9:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000080000000000:96E295724B3F296016A3F6853B679079:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000040000000000:305E7A77DC3B62F110688AB334002132:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000020000000000:324E96A82CE897DAB3850047C38E9B18:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000010000000000:23EB8F12867D39E24E5A71606E3B5C1E:\ +000000000000000000000000000000000000000000000000 + +00000000000000000080000000000000:EC74DC99FDB377E35EBA6E5C920C9E20:\ +000000000000000000000000000000000000000000000000 + +00000000000000000040000000000000:12F92E9FF675FFE132FEC127A61ED1D6:\ +000000000000000000000000000000000000000000000000 + +00000000000000000020000000000000:F8BFC6819A8F1683DD314AFEDAA80F33:\ +000000000000000000000000000000000000000000000000 + +00000000000000000010000000000000:28552459A3EB05AE69463C26F6413B73:\ +000000000000000000000000000000000000000000000000 + +00000000000000000008000000000000:E018CED8C1FC6FE1849E945550602D46:\ +000000000000000000000000000000000000000000000000 + +00000000000000000004000000000000:8A46B1349AE83730266EBFB1D62BA1EB:\ +000000000000000000000000000000000000000000000000 + +00000000000000000002000000000000:AEA0972033ACDA2FE228A3619511B0CF:\ +000000000000000000000000000000000000000000000000 + +00000000000000000001000000000000:6BCD123081CB4DA2197A9204947C4765:\ +000000000000000000000000000000000000000000000000 + +00000000000000008000000000000000:1CA839C433F49B9CAC257C7CBE38C571:\ +000000000000000000000000000000000000000000000000 + +00000000000000004000000000000000:E6D1727A0BC893BBE5A048B73296FF43:\ +000000000000000000000000000000000000000000000000 + +00000000000000002000000000000000:6B38158548081550B6931773C3348995:\ +000000000000000000000000000000000000000000000000 + +00000000000000001000000000000000:4159191656BAE5F059625051F329E674:\ +000000000000000000000000000000000000000000000000 + +00000000000000000800000000000000:5684B43817E24580EE373B54B57126C1:\ +000000000000000000000000000000000000000000000000 + +00000000000000000400000000000000:D31DC022A55A6CB7116D5AA79713EBEF:\ +000000000000000000000000000000000000000000000000 + +00000000000000000200000000000000:B9B7F96A83494D61C0D476E15CF9FC40:\ +000000000000000000000000000000000000000000000000 + +00000000000000000100000000000000:9F61E523005A37B71A589C35E2320580:\ +000000000000000000000000000000000000000000000000 + +00000000000000800000000000000000:2F19CFB18D4B538C688FF0FF73EEF402:\ +000000000000000000000000000000000000000000000000 + +00000000000000400000000000000000:2B2D1598BD1A57A6277D0F1182423E70:\ +000000000000000000000000000000000000000000000000 + +00000000000000200000000000000000:FB589E7803F8DEC257644DD8968B3BF9:\ +000000000000000000000000000000000000000000000000 + +00000000000000100000000000000000:4E8F6CD48030ABFB6BFAA8C79DF29132:\ +000000000000000000000000000000000000000000000000 + +00000000000000080000000000000000:594C7334C5C77F1F311743DBF880A848:\ +000000000000000000000000000000000000000000000000 + +00000000000000040000000000000000:8B9060A226A976B4D8701B61A0E16E05:\ +000000000000000000000000000000000000000000000000 + +00000000000000020000000000000000:9D5D7F82A45E543A28769767F0B4220B:\ +000000000000000000000000000000000000000000000000 + +00000000000000010000000000000000:7F60DD3212B5FD34A33E95B7CD3C98B4:\ +000000000000000000000000000000000000000000000000 + +00000000000080000000000000000000:67A133B6981D6CFFFB0894B5CD60C384:\ +000000000000000000000000000000000000000000000000 + +00000000000040000000000000000000:B9724EFA90EE77242862C6D107053799:\ +000000000000000000000000000000000000000000000000 + +00000000000020000000000000000000:6CC4B4806D82C681027375553BEEF871:\ +000000000000000000000000000000000000000000000000 + +00000000000010000000000000000000:D05EA01E7AE0768FFE5B499D4A0EA833:\ +000000000000000000000000000000000000000000000000 + +00000000000008000000000000000000:EB5259D268854E583B02C445F0DBB33D:\ +000000000000000000000000000000000000000000000000 + +00000000000004000000000000000000:273792A497CBE6058FB8CE518C05A9A7:\ +000000000000000000000000000000000000000000000000 + +00000000000002000000000000000000:629EE820F46138558FE7AA6D547F971E:\ +000000000000000000000000000000000000000000000000 + +00000000000001000000000000000000:F04FF6EC27F7412350CA62E6A3BE479F:\ +000000000000000000000000000000000000000000000000 + +00000000008000000000000000000000:CAF26B388D8A81C408FC3506CA523C72:\ +000000000000000000000000000000000000000000000000 + +00000000004000000000000000000000:79A075A5778E5BED4F0663FC86D92A56:\ +000000000000000000000000000000000000000000000000 + +00000000002000000000000000000000:90E59EE9F97DE1590D4C454169890932:\ +000000000000000000000000000000000000000000000000 + +00000000001000000000000000000000:30DF4AFE05F0D0EC4495C4A7A3D3A1AF:\ +000000000000000000000000000000000000000000000000 + +00000000000800000000000000000000:BF6D54D156EDE791A177F8A5BA5DC1D0:\ +000000000000000000000000000000000000000000000000 + +00000000000400000000000000000000:2C2286B2537AFDF52A7EF59D620E7E46:\ +000000000000000000000000000000000000000000000000 + +00000000000200000000000000000000:545F83ECF5366475A1867BF81DE59780:\ +000000000000000000000000000000000000000000000000 + +00000000000100000000000000000000:5E7648E3575B7A02BEA8C69A19ED06BC:\ +000000000000000000000000000000000000000000000000 + +00000000800000000000000000000000:99B0CC109580893A14B960F78C867DF7:\ +000000000000000000000000000000000000000000000000 + +00000000400000000000000000000000:4FBCBA60C491EFA9C5B8B8CC9471C26A:\ +000000000000000000000000000000000000000000000000 + +00000000200000000000000000000000:7A3B3E4FA8DF6DD964161EF9ADB7EC90:\ +000000000000000000000000000000000000000000000000 + +00000000100000000000000000000000:DBA5DD3EE2B0F03D402D5BADAE4E34C9:\ +000000000000000000000000000000000000000000000000 + +00000000080000000000000000000000:2334F78508F6259862FAA5842E6B1E7B:\ +000000000000000000000000000000000000000000000000 + +00000000040000000000000000000000:F15ED8B81B74BD35586E1594AB3B0F73:\ +000000000000000000000000000000000000000000000000 + +00000000020000000000000000000000:A654EE4634624A3593DCC272C0AB8566:\ +000000000000000000000000000000000000000000000000 + +00000000010000000000000000000000:E71506E96ADACE02580EA035601850C3:\ +000000000000000000000000000000000000000000000000 + +00000080000000000000000000000000:00D43BE69B9387B28A4234D2E5BEF038:\ +000000000000000000000000000000000000000000000000 + +00000040000000000000000000000000:BB828D0A587EA543A78A60B6F63CC159:\ +000000000000000000000000000000000000000000000000 + +00000020000000000000000000000000:427338CBFA6B652CDCE9C30F29F6E660:\ +000000000000000000000000000000000000000000000000 + +00000010000000000000000000000000:D26286844B1BE4D73B44B77A2C4449DD:\ +000000000000000000000000000000000000000000000000 + +00000008000000000000000000000000:28D9BEB7444B7801C510D74C90F3183A:\ +000000000000000000000000000000000000000000000000 + +00000004000000000000000000000000:9D8949E7F531F30FFD1C6891154FFB8A:\ +000000000000000000000000000000000000000000000000 + +00000002000000000000000000000000:B329A557C9BFED767B44CA25F43C0924:\ +000000000000000000000000000000000000000000000000 + +00000001000000000000000000000000:1909B5B407CB28E7050F8889104B73F5:\ +000000000000000000000000000000000000000000000000 + +00008000000000000000000000000000:DA51B1E831305D9E6AC7F0CDF49F3AE5:\ +000000000000000000000000000000000000000000000000 + +00004000000000000000000000000000:4A091855C4AA2436F3C61A11FA4B9DA5:\ +000000000000000000000000000000000000000000000000 + +00002000000000000000000000000000:DB8350915843684F18B4B358579A9446:\ +000000000000000000000000000000000000000000000000 + +00001000000000000000000000000000:13A1376760534FF5F7D5ED1B62D93D4B:\ +000000000000000000000000000000000000000000000000 + +00000800000000000000000000000000:C2613B1D8937C2B1C9D7B0249D938E95:\ +000000000000000000000000000000000000000000000000 + +00000400000000000000000000000000:3FB48878619B70DB717F410550B03069:\ +000000000000000000000000000000000000000000000000 + +00000200000000000000000000000000:0589BD5D8ECDAAE7ECABC8816EF3C7EB:\ +000000000000000000000000000000000000000000000000 + +00000100000000000000000000000000:5AC9C030789D810698AAB706BA6BCCA8:\ +000000000000000000000000000000000000000000000000 + +00800000000000000000000000000000:4BD66B7E897E76BF51F1F00671092169:\ +000000000000000000000000000000000000000000000000 + +00400000000000000000000000000000:4A72C588A0FA490D521640D1F245E4BC:\ +000000000000000000000000000000000000000000000000 + +00200000000000000000000000000000:32205DCCC1D7A129B934C6FABAADEB1C:\ +000000000000000000000000000000000000000000000000 + +00100000000000000000000000000000:74F79A4CF6F99359D7EC47DA87104658:\ +000000000000000000000000000000000000000000000000 + +00080000000000000000000000000000:2810428BA5177BB0D91C11683008E68D:\ +000000000000000000000000000000000000000000000000 + +00040000000000000000000000000000:3863C205AED373BB3EF9E6D85D0AD08F:\ +000000000000000000000000000000000000000000000000 + +00020000000000000000000000000000:DD207AA0894DFBEDD7D9802823C04D7B:\ +000000000000000000000000000000000000000000000000 + +00010000000000000000000000000000:A6EAC9ECAAE9CC8621198BA547E9B74F:\ +000000000000000000000000000000000000000000000000 + +80000000000000000000000000000000:23F5F432AD687E0D4574C16459618ABB:\ +000000000000000000000000000000000000000000000000 + +40000000000000000000000000000000:56CD894936F6E9A4A4304CAE06F97CE3:\ +000000000000000000000000000000000000000000000000 + +20000000000000000000000000000000:B604D94F461AF9F4771BC53F8E3C227B:\ +000000000000000000000000000000000000000000000000 + +10000000000000000000000000000000:BB852AC4756880630D6D63951D3D2602:\ +000000000000000000000000000000000000000000000000 + +08000000000000000000000000000000:319C206CD98D2C98993FC2CDAAB3259C:\ +000000000000000000000000000000000000000000000000 + +04000000000000000000000000000000:D271595956451E3B7D957A3485ADE9F7:\ +000000000000000000000000000000000000000000000000 + +02000000000000000000000000000000:D4257D927C7F2A6390DF198B573DD1BA:\ +000000000000000000000000000000000000000000000000 + +01000000000000000000000000000000:7610F6DBE8F3F19682DCC01AF57DCD79:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000080:2055DEA7C84B008C6FAEB4B192795ADA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000040:CB98F1C490F33B4F7A3D3E821B3551F3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000020:BB654CB6528C21D78E5CB79D5DA677A4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000010:E0B2836175A6808D61FEA4CB529401F8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000008:824C5F6FECE3E0FC4293821B987B3BD4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000004:9D9286D5E97CCDEC47E03CB12C34B339:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000002:BC2C09F0B3FC63CE17F1BE7F267E3E0A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000001:AD86DE83231C3203A86AE33B721EAA9F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000008000:AE042A69C879D524DC4BCC70B84B1B37:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000004000:6D03E3381991EDC800513D30BE07DE5A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000002000:576807DCB0F1A8D73904DBAA84BE818E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000001000:96DD8A88157832B7E45C639C25170333:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000800:9C1A7B580B29888F397743E76C4E7A39:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000400:B77FE10336DA7531E1BF2DC41C7E6E95:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000200:8658E3A6DBAC89EBA6E045881B172E9C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000100:D2FE26FC85AA40C3C6827B0DFF96AB0C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000800000:56C2530D97A43944BE7874E6FA9121FD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000400000:AAECA9394EF359D851CC9F244D4D1E54:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000200000:71BC0D1DEA15FE3BC4AA6DD829C8E957:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000100000:267FCBA295A670CB9EC18AFBB819CE91:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000080000:D18CC92248E209FF8C9AF4AC93588727:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000040000:63E94B466C955B7204285E418A156B29:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000020000:368A8D2610A773A477B924028DAD455F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000010000:B210E51F2C154205DA4A1D1B892DCC63:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000080000000:FFE1B843D7DC5F52852705221ED5EECA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000040000000:0E8B9ACE62AA90B258D8090EF2188BC4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000020000000:96961DBEC1C476AE00972E54DE621F19:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000010000000:A31A56562516BDAE02215CD5F0DF0569:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000008000000:A2316B6B9E6AD55D7013A24BDB1EAEB9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000004000000:709F715313E17EFB3ECAE3A5D9ED94AF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000002000000:BCA04C7CAB888EE6950B7696F5899502:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000001000000:6655B0542BE057664DE9B2733CA0E555:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000008000000000:7407623C54E38D13B48B84306DD8F244:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000004000000000:B3D6DC13CF612951F9ACB05EAEEDE7E3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000002000000000:301378F0D3D30AE6613A9E7CF113821F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000001000000000:9F227635FDAB7D31A7E1F08BBCC34371:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000800000000:F08620D46001C366FD6DCBEBC806C182:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000400000000:CF51A2A45F9CBFDE788D108B1B4D33A5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000200000000:3E70F946FB77C6841D9F001104347659:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000100000000:A3EB98B3BE360FAE3B8EC43D5B77FF7C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000800000000000:4F6E01D8A2437547B50E070498BCD4F9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000400000000000:4F80F4048084E1150AA6A36A6BB3D7EA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000200000000000:311471549CCBB1EC27BAA384EC32F30F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000100000000000:3C4DA8FF90590FB9FC529580DD40E7EF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000080000000000:60AE8E3F60A099EEF38EFF4ED27DE3EC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000040000000000:B33C4D6DF1259C4E5799D19B375420EA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000020000000000:4D1BA08EB1E30F2A3B3E5D1DAE9792A9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000010000000000:3CF54D30E493CDD7439E1F34FBB098F3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000080000000000000:F8958250D6D6772B20051E36666906BD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000040000000000000:B4ED85D72C04A357958D7045BE13C4FF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000020000000000000:294A16831BF660536203030B59DA20F3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000010000000000000:D189C5A12722ABFEBA16F155975068E6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000008000000000000:9A9248C1FEDF207CE64F68E73B22A77C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000004000000000000:CC668772F50D2ED7DF83FF85A0D76576:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000002000000000000:685CA45E48D087563E1886DBDD63342F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000001000000000000:FCE8BFBA1BB12F4990C6DF32C6D71EBD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000008000000000000000:645D7562E523058E7708FF03F1712BE8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000004000000000000000:FA9CAF3BBC2D52806EF9B3D01F5B8398:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000002000000000000000:0D2638505AAE1A5532D74C4F45C136D3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000001000000000000000:9721099476B1F963EF87DD29E82227F8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000800000000000000:237AE2CDD5D2819EDAE0947AFB9D040F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000400000000000000:8FA78734E057E8A9486862E00A9886D8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000200000000000000:983F654090C661264BE8F921063B7DE5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000100000000000000:645F0F938A2898A3869190A1D99A3078:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000800000000000000000:4DDBA0F24964591307AB909009BB41EF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000400000000000000000:5D9333754035534CEF4EEFA73EA3F8C9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000200000000000000000:F51234B609D397B1D6DA8BB625C0993C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000100000000000000000:0AF5205E41F184D0989A78BF149DB675:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000080000000000000000:0EBC3926D924F37BFD716F404CA8450D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000040000000000000000:53CADA57C7855AEB96B48F8C85915DE9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000020000000000000000:FD8E2C7604621D13E64B58315DCC65CD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000010000000000000000:A7126988773129D5F6CC330C1A0EF30B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000080000000000000000000:72C791409F94CE23F4CD61D714670B39:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000040000000000000000000:6AD3CCBC31E2ECF88C6B54F84E638AA2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000020000000000000000000:9FE143250D00E25696B01E0A2ED05DB3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000010000000000000000000:3ABBF724E6C7B2D05D93A2C6D058E5AC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000008000000000000000000:59300BA5323CF6D84A9FF12B042A5AFF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000004000000000000000000:4AE9F03EF61BAA670CE46F3A6C205BD5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000002000000000000000000:E33261C4E54AB7B117C3ABA1C9E11C1E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000001000000000000000000:B84E741AC92A42F37A77F05D6F464E10:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000008000000000000000000000:0F6D2E73CF929A92BADF0A372FFB31A5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000004000000000000000000000:2002487C2CFE5A223E3A3C19A6B23670:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000002000000000000000000000:A9E22B14D403C7F0FA9D95C064CBA9D3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000001000000000000000000000:CFD3A8EE62F68692A8917C814290E979:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000800000000000000000000:AECA2C8C0CA8B6F0EF594A13C85E83CF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000400000000000000000000:E74D77BB281F542A0A78C3D8436783F4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000200000000000000000000:B81755986C8B60A935F5D9169A2A7655:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000100000000000000000000:DE964C9FF34F5A79FF43C6AB148DC395:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000800000000000000000000000:0F7CE54A338AB05E2C38F1725DA8B127:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000400000000000000000000000:CAD8158D26EED67D4355BB66D0812ADE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000200000000000000000000000:5332616A057A657FD2FD6562AF33EFC9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000100000000000000000000000:308CD48EC851D7C1251174228B943B11:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000080000000000000000000000:29A5D9977C881DB067136B755BB68E54:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000040000000000000000000000:C0F6B4881776765507CF91DB0A32C70F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000020000000000000000000000:47E518209CB5533F9A7EE02C4F07391B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000010000000000000000000000:58D7E0D60E315EEBA97F0DFA2D7307B0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000080000000000000000000000000:C02ED6499331AF8C6CF30A63BB5E89CA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000040000000000000000000000000:B5F166B94EC31A17662E24757FBB3FC5:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000020000000000000000000000000:17D20FBDA96D4AD0D99DAE64DE5F317B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000010000000000000000000000000:320FA060BBB901F66A9E4CFF221E6A4A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000008000000000000000000000000:3A259B7AEE3155C0C4DF7A32EF40FB19:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000004000000000000000000000000:028EFD3B6E686C87B402151F414B13AD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000002000000000000000000000000:D4F61CC61FA1DBD68B8C48541AE77289:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000001000000000000000000000000:DFCCE96C8C244586A3BCF098306C6374:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00008000000000000000000000000000:BD5426FFD3CC9FC735EBAB7C72FD2D9B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00004000000000000000000000000000:EA3C7C9B02AE7297B4BE551C8C551440:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00002000000000000000000000000000:11BB660CF8431F2625AB9EF603975BB7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00001000000000000000000000000000:B666AA7C5BA5209CBCEDE07EB66064D3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000800000000000000000000000000:CAD843E927DDE8F92DBBB33C1B4E87F9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000400000000000000000000000000:ED29F7805804E2E95F664B2E36C20A67:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000200000000000000000000000000:980F61BF6EBDE1A30607A1D51FFFB8D6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000100000000000000000000000000:E47A19E8579807B5C44AC62619372673:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00800000000000000000000000000000:2B451B22A3EBAB1C7A7619551DDF149F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00400000000000000000000000000000:3ABE3CAEDA54E5583269803BE04CBB2C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00200000000000000000000000000000:DF581405DFBDEFACB35AD3BC510FE895:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00100000000000000000000000000000:45B3C3DAC439F884447567B282DE329C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00080000000000000000000000000000:4192DE2B562CDD43EC4358EA730250C3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00040000000000000000000000000000:27E310D8032E16CF970F635C517E7D2E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00020000000000000000000000000000:573CAE2A23968DE1D40036C24F9FEFA4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00010000000000000000000000000000:B4AD06B55E31DE8F1F77C2B7AE8B73FD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +80000000000000000000000000000000:8314675E8AD5C3ECD83D852BCF7F566E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +40000000000000000000000000000000:893BF67B1A845579C8FADC05BFDC0894:\ +0000000000000000000000000000000000000000000000000000000000000000 + +20000000000000000000000000000000:302F8325DEB1E1A0955D6273368A0DC4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +10000000000000000000000000000000:917B2F6A11DDDCEB53FEA01E194A6CC9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +08000000000000000000000000000000:8229E6539268BB39F3218E2903110C4F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +04000000000000000000000000000000:935A7835E2FAF9F7F20CE85662EE281F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +02000000000000000000000000000000:DF5E38BE0362C35E8AF472C6327987DA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +01000000000000000000000000000000:07E5E5AD7097B849BADC2D5D803B7F6A:\ +0000000000000000000000000000000000000000000000000000000000000000 + + + +# Corrected test vectors, based on NIST's clarification of May 9, 2002 +[Skipjack] +AABBCCDD00112233:00D3127AE2CA8725:11223344556677889900 +CE365D5D21C1A4CB:C00891C551C5E168:9C5F3F996E59C9543249 +CB758E2851482982:6C09A2825D32B67E:21A07C1CED3C2C0C1576 +7B402EA5E4B7A7C3:C6E32EA485F38324:F62D87056348C5D64071 +3AE159B52AE3FD1B:8AD85F68B89DFAD6:0E2B3B9AEEF001392C3C +3828786C48F705D2:9352B87091483003:51BAA0E8AADF4B8B6A60 +E060FCC7F7F16FD9:8C70B2C901339B1F:CE70B79AE70F7AA44778 +8F5FA719DE4B1D24:958816FE7FC5862B:91A8919EC9360CABB973 +0B55FD902BFECC99:CA7F517B383DA760:FB9F7F8B62E4996E49E7 +CA7F517B383DA760:278B665DB00CC924:FB9F7F8B62E4996E49E7 +6527AF09D0B01CB7:628A8AE67A87F464:90DDF1550EC7DCF4CAE5 +628A8AE67A87F464:CD01A638A878E7FE:90DDF1550EC7DCF4CAE5 +E7951155B748D347:EAEB4A1470307BF1:3516DABCD760F2BEE4CD +AD14EBC6D0261D94:8DAE0E5E2CD055A0:C9C5DAF7DFD17D902270 +9B0C81EDA6853253:DC354CB74F2FC2B4:EEEE6892DCD1ED868F56 +C76443A5B0652306:160DF886878D6908:03604B2D0D06A9AA9D68 +37F1C930714AA1CF:39DDEC7C8B84DBD6:6E8494476C89110F166C +1E71CDF5AB39DF1D:AE316B4C32222DC9:DF3A10F722776402DAF8 +9EE6838FCE6C6CDD:FF7F52D9C17728E3:E4EE21889437C10A7682 +111AA47F17CFAABE:1A86B8753F784547:C3C55FCACDD387163C84 +0AC61B6C219FC0C4:727AA5B83616105C:E5F795A933FFD70C87AE +56582400B014F8D3:918F72548E0FFCB4:9163BD738BEA13D9CB5C +9C323238D9C76E35:F801578F6050B793:C70CA4689C59CD745EF6 +6CD57A531CCF9E20:619E091055D423D8:DC934E7C08D7466E10AA +667DE1649DEA2E89:5FD975B231E25909:EA4FC33C0CA289973FA9 +1BC90F76FD901399:AE676788090270E7:9988881616D6CB63B188 +9E9CCADD47C9EBDA:22A3D66BA549CCE7:10DF61754870FFD16CFB +2E8FCDE2EFDD1964:FD42E226CF058AE4:2C005FEFE7C4C01ADC5E +128106BDEC982932:C1F24DB137E5C062:6A49942FA39AC190308E +CC93DA20EE2AAE3A:714D626B8AE5D154:92903F26A46FD43F6EB9 + +[Square] +00000000000000000000000000000000:3C00428F8ABBC0B84F057CC19C26F8CF:\ +00000000000000000000000000000000 +000102030405060708090A0B0C0D0E0F:7C3491D94994E70F0EC2E7A5CCB5A14F:\ +000102030405060708090A0B0C0D0E0F +C76C696289898137077A4A59FAEEEA4D:88C6FF4B92604C6E66656B02DDAF9F40:\ +000102030405060708090A0B0C0D0E0F +21A5DBEE154B8F6D6FF33B98F448E95A:3388801F66E7FCC0BCE522A23A4F0C7F:\ +915F4619BE41B2516355A50110A9CE91 +F7C013AC5B2B8952E5E554ABE9CED2D2:A1C0E9215141343DEC2B556942C92BDE:\ +783348E75AEB0F2FD7B169BB8DC16787 +2F42B3B70369FC929AE068313F343A7A:3FBE6811B998CDF3E50ABDE2F3C075E3:\ +DC49DB1375A5584F6485B413B5F12BAF +65C178B284D197CCD3F111A282F17F29:D7B7209E0879744C782809B6D2E0B1B0:\ +5269F149D41BA0152497574D7F153125 +00000000000000000000000000000000:05F8AAFDEFB4F5F9C751E5B36C8A37D8:\ +80000000000000000000000000000000 +0F1E2D3C4B5A69788796A5B4C3D2E1F0:1660060085C0E241F88462BFFBE67602:\ +00000000000000000000040000000000 +0F1E2D3C4B5A69788796A5B4C3D2E1F0:92BFBBFCD2BBF54FFF06AF097893E9A3:\ +00000000000000000000000000000080 +00000000000000000000000000000000:98CFB10F3ED70BB82CC90597B463A1F6:\ +00000000000000000000000000020000 +00000000000000000000000000000000:A643A0CA5154A7D10B251D562D58EA53:\ +00000000000000000000000000800000 + +[TEA] +0000000000000000:41EA3A0A94BAA940:00000000000000000000000000000000 +7C944D08DEF34C0C:195C0E8F49761539:271AD15192C4D1204A4A2561E3DB6FF7 +B9682750BB15CAAD:2B5F318FB66806B9:F04EBF798C193F199C1F532AF383555B +9706769A18A2D03D:8E17EEB5008DC0CB:200C0CE59717D5D9AF6813CD207FEE73 +EDB76C54847DA59E:DFA6C29BEB40F9AF:2828D51F98AE0B33F4DE2B7FBD18A529 +178A49BAFBA53F23:C3BBCE6715D90CE6:61AABA6BE48B0D0D14FE5D27FAB852A4 +DF4CDB61A5F38536:B4E6359C9D9458AA:2080E2409BA01C8532FC84403EE8C06A +7C944D08DEF34C0C:195C0E8F49761539:271AD15192C4D1204A4A2561E3DB6FF7 +F4C76C1D47FE568F:551CA67C7756FF56:C1E297C0C761777D8A76FFF02D22B859 +CAB16583E15D0074:DE472175D55372C9:23C807A2EF0A551F858FD52D125A47D8 +97B05C60774164AD:BC4BD30CB50DA39B:9FA5D4D8CBDFCECD559E3CE88BF78EE1 +7017A263985B735C:E47FDF06A51D8C24:24F4E91083139099D663647A7FFAC321 +15475A90DF04CD29:4DF54282EAAFA235:7CF8626DE76D8462218ED5C9DC8ACC26 +87CA0AACCF146CC8:F7360F57CFCC09AC:3C6AD7DF17332A3E1E3DE06007387357 +9268AF048ECBAE67:E98E428A9D1FEE9C:24237A762D8A89383A2949F5A0F5EC08 +AF0062CD77A84EBD:44CD624B87CBEE77:209A2833A39472D9720380FFB2F74761 +F922CA875B991A31:1E92C0C51185F7C7:22EBE7A30E8855B3B453A6E926D4F187 +B4ECC305C3DBD8E5:063D8F75A7A77501:1B5E23EBD915C1FEE59F57DD91AF7347 +A4C2F6DC597D13EA:BF8FFEC7550A496B:6C21D105515290DA29339F142685C135 +3AF7F1AE0F58AB1D:BBA581D07E51D8D6:01F728A7433A47B13DE34FCC08958449 +791D8DA8CBB0BC94:7D9A4F0363B6085F:9A2D4C50337D3EC337673782FD385601 +ABCDEF0198765432:58C7BA625ED42820:112233445566778899AABBCCDDEEFF01 +AAAAAAAAAAAAAAAA:423251D460AEBE8E:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB +6385ECC14C50C91F:D3A465910B0ECF46:88AD993684E3FE4C4D5DD8F1C0964D32 +99532D57CC7FC724:A846FE0F9A698E32:69F9181A726912C2DFD815081209F9F6 +A874F573DD7A8761:5055A546D119BFA7:79846B4ED899433C452EDED9D6925C7A +CD58533F9F18C3F3:F5E649326A32F7BD:B0BB57B0E243DC91143DA8F235DCF9DB +65B4628A8A4ACC33:E2FAC5AB9B301983:6CDF16B8E08604C93A4BC86E269BA2EF +21244B2AA3071823:14F62A42C4BDA3E6:2203D8EFC29D3421981E0C2FAF90EA8C +C6BBAD2319111D81:F4068832803914F7:86B435D9BF689FD450352308EDDA200A +38CD92C3E6882185:A3C3CE70D4A097E8:279243E8F5759FD3D29EF824D65B163B +56D1B5CB68ADBD3F:4E57696CAC39676C:95ADBC7D2F67A15C395605250AC1275F +1936713432D87C16:3D3E59CA7EDED044:4E760AF9B46E2C9EF75B7F5721EAFD60 +A9AF22BFEA5639F1:D478E142344FCFAC:2C98241CD08DF0B269C8669E55F61227 +8DEC08977A7F6D02:23F4A36A9D475299:B28F6B02B950BC924B03C39C672A8216 +8535D9E669C2A7B8:30284672AF8877F1:F7A7B83FC8DF8868AB753F435B6E46DE +03682AB977DDDCD9:9F678A05F82E9326:1BC9B0A578D89DAE5A47F5704640CA4A +3A1A041F2F1B0FC7:A40CBAE926F0F13B:15C140E81E98AE10443AA43C89E5D52C + +[Twofish] +00000000000000000000000000000000:9F589F5CF6122C32B6BFEC2F2AE8C35A:\ +00000000000000000000000000000000 + +9F589F5CF6122C32B6BFEC2F2AE8C35A:D491DB16E7B1C39E86CB086B789F5419:\ +00000000000000000000000000000000 + +D491DB16E7B1C39E86CB086B789F5419:019F9809DE1711858FAAC3A3BA20FBC3:\ +9F589F5CF6122C32B6BFEC2F2AE8C35A + +019F9809DE1711858FAAC3A3BA20FBC3:6363977DE839486297E661C6C9D668EB:\ +D491DB16E7B1C39E86CB086B789F5419 + +6363977DE839486297E661C6C9D668EB:816D5BD0FAE35342BF2A7412C246F752:\ +019F9809DE1711858FAAC3A3BA20FBC3 + +816D5BD0FAE35342BF2A7412C246F752:5449ECA008FF5921155F598AF4CED4D0:\ +6363977DE839486297E661C6C9D668EB + +5449ECA008FF5921155F598AF4CED4D0:6600522E97AEB3094ED5F92AFCBCDD10:\ +816D5BD0FAE35342BF2A7412C246F752 + +6600522E97AEB3094ED5F92AFCBCDD10:34C8A5FB2D3D08A170D120AC6D26DBFA:\ +5449ECA008FF5921155F598AF4CED4D0 + +34C8A5FB2D3D08A170D120AC6D26DBFA:28530B358C1B42EF277DE6D4407FC591:\ +6600522E97AEB3094ED5F92AFCBCDD10 + +28530B358C1B42EF277DE6D4407FC591:8A8AB983310ED78C8C0ECDE030B8DCA4:\ +34C8A5FB2D3D08A170D120AC6D26DBFA + +8A8AB983310ED78C8C0ECDE030B8DCA4:48C758A6DFC1DD8B259FA165E1CE2B3C:\ +28530B358C1B42EF277DE6D4407FC591 + +48C758A6DFC1DD8B259FA165E1CE2B3C:CE73C65C101680BBC251C5C16ABCF214:\ +8A8AB983310ED78C8C0ECDE030B8DCA4 + +CE73C65C101680BBC251C5C16ABCF214:C7ABD74AA060F78B244E24C71342BA89:\ +48C758A6DFC1DD8B259FA165E1CE2B3C + +C7ABD74AA060F78B244E24C71342BA89:D0F8B3B6409EBCB666D29C916565ABFC:\ +CE73C65C101680BBC251C5C16ABCF214 + +D0F8B3B6409EBCB666D29C916565ABFC:DD42662908070054544FE09DA4263130:\ +C7ABD74AA060F78B244E24C71342BA89 + +DD42662908070054544FE09DA4263130:7007BACB42F7BF989CF30F78BC50EDCA:\ +D0F8B3B6409EBCB666D29C916565ABFC + +7007BACB42F7BF989CF30F78BC50EDCA:57B9A18EE97D90F435A16F69F0AC6F16:\ +DD42662908070054544FE09DA4263130 + +57B9A18EE97D90F435A16F69F0AC6F16:06181F0D53267ABD8F3BB28455B198AD:\ +7007BACB42F7BF989CF30F78BC50EDCA + +06181F0D53267ABD8F3BB28455B198AD:81A12D8449E9040BAAE7196338D8C8F2:\ +57B9A18EE97D90F435A16F69F0AC6F16 + +81A12D8449E9040BAAE7196338D8C8F2:BE422651C56F2622DA0201815A95A820:\ +06181F0D53267ABD8F3BB28455B198AD + +BE422651C56F2622DA0201815A95A820:113B19F2D778473990480CEE4DA238D1:\ +81A12D8449E9040BAAE7196338D8C8F2 + +113B19F2D778473990480CEE4DA238D1:E6942E9A86E544CF3E3364F20BE011DF:\ +BE422651C56F2622DA0201815A95A820 + +E6942E9A86E544CF3E3364F20BE011DF:87CDC6AA487BFD0EA70188257D9B3859:\ +113B19F2D778473990480CEE4DA238D1 + +87CDC6AA487BFD0EA70188257D9B3859:D5E2701253DD75A11A4CFB243714BD14:\ +E6942E9A86E544CF3E3364F20BE011DF + +D5E2701253DD75A11A4CFB243714BD14:FD24812EEA107A9E6FAB8EABE0F0F48C:\ +87CDC6AA487BFD0EA70188257D9B3859 + +FD24812EEA107A9E6FAB8EABE0F0F48C:DAFA84E31A297F372C3A807100CD783D:\ +D5E2701253DD75A11A4CFB243714BD14 + +DAFA84E31A297F372C3A807100CD783D:A55ED2D955EC8950FC0CC93B76ACBF91:\ +FD24812EEA107A9E6FAB8EABE0F0F48C + +A55ED2D955EC8950FC0CC93B76ACBF91:2ABEA2A4BF27ABDC6B6F278993264744:\ +DAFA84E31A297F372C3A807100CD783D + +2ABEA2A4BF27ABDC6B6F278993264744:045383E219321D5A4435C0E491E7DE10:\ +A55ED2D955EC8950FC0CC93B76ACBF91 + +045383E219321D5A4435C0E491E7DE10:7460A4CD4F312F32B1C7A94FA004E934:\ +2ABEA2A4BF27ABDC6B6F278993264744 + +7460A4CD4F312F32B1C7A94FA004E934:6BBF9186D32C2C5895649D746566050A:\ +045383E219321D5A4435C0E491E7DE10 + +6BBF9186D32C2C5895649D746566050A:CDBDD19ACF40B8AC0328C80054266068:\ +7460A4CD4F312F32B1C7A94FA004E934 + +CDBDD19ACF40B8AC0328C80054266068:1D2836CAE4223EAB5066867A71B1A1C3:\ +6BBF9186D32C2C5895649D746566050A + +1D2836CAE4223EAB5066867A71B1A1C3:2D7F37121D0D2416D5E2767FF202061B:\ +CDBDD19ACF40B8AC0328C80054266068 + +2D7F37121D0D2416D5E2767FF202061B:D70736D1ABC7427A121CC816CD66D7FF:\ +1D2836CAE4223EAB5066867A71B1A1C3 + +D70736D1ABC7427A121CC816CD66D7FF:AC6CA71CBCBEDCC0EA849FB2E9377865:\ +2D7F37121D0D2416D5E2767FF202061B + +AC6CA71CBCBEDCC0EA849FB2E9377865:307265FF145CBBC7104B3E51C6C1D6B4:\ +D70736D1ABC7427A121CC816CD66D7FF + +307265FF145CBBC7104B3E51C6C1D6B4:934B7DB4B3544854DBCA81C4C5DE4EB1:\ +AC6CA71CBCBEDCC0EA849FB2E9377865 + +934B7DB4B3544854DBCA81C4C5DE4EB1:18759824AD9823D5961F84377D7EAEBF:\ +307265FF145CBBC7104B3E51C6C1D6B4 + +18759824AD9823D5961F84377D7EAEBF:DEDDAC6029B01574D9BABB099DC6CA6C:\ +934B7DB4B3544854DBCA81C4C5DE4EB1 + +DEDDAC6029B01574D9BABB099DC6CA6C:5EA82EEA2244DED42CCA2F835D5615DF:\ +18759824AD9823D5961F84377D7EAEBF + +5EA82EEA2244DED42CCA2F835D5615DF:1E3853F7FFA57091771DD8CDEE9414DE:\ +DEDDAC6029B01574D9BABB099DC6CA6C + +1E3853F7FFA57091771DD8CDEE9414DE:5C2EBBF75D31F30B5EA26EAC8782D8D1:\ +5EA82EEA2244DED42CCA2F835D5615DF + +5C2EBBF75D31F30B5EA26EAC8782D8D1:3A3CFA1F13A136C94D76E5FA4A1109FF:\ +1E3853F7FFA57091771DD8CDEE9414DE + +3A3CFA1F13A136C94D76E5FA4A1109FF:91630CF96003B8032E695797E313A553:\ +5C2EBBF75D31F30B5EA26EAC8782D8D1 + +91630CF96003B8032E695797E313A553:137A24CA47CD12BE818DF4D2F4355960:\ +3A3CFA1F13A136C94D76E5FA4A1109FF + +137A24CA47CD12BE818DF4D2F4355960:BCA724A54533C6987E14AA827952F921:\ +91630CF96003B8032E695797E313A553 + +BCA724A54533C6987E14AA827952F921:6B459286F3FFD28D49F15B1581B08E42:\ +137A24CA47CD12BE818DF4D2F4355960 + +6B459286F3FFD28D49F15B1581B08E42:5D9D4EEFFA9151575524F115815A12E0:\ +BCA724A54533C6987E14AA827952F921 + +00000000000000000000000000000000:EFA71F788965BD4453F860178FC19101:\ +000000000000000000000000000000000000000000000000 + +EFA71F788965BD4453F860178FC19101:88B2B2706B105E36B446BB6D731A1E88:\ +000000000000000000000000000000000000000000000000 + +88B2B2706B105E36B446BB6D731A1E88:39DA69D6BA4997D585B6DC073CA341B2:\ +EFA71F788965BD4453F860178FC191010000000000000000 + +39DA69D6BA4997D585B6DC073CA341B2:182B02D81497EA45F9DAACDC29193A65:\ +88B2B2706B105E36B446BB6D731A1E88EFA71F788965BD44 + +182B02D81497EA45F9DAACDC29193A65:7AFF7A70CA2FF28AC31DD8AE5DAAAB63:\ +39DA69D6BA4997D585B6DC073CA341B288B2B2706B105E36 + +7AFF7A70CA2FF28AC31DD8AE5DAAAB63:D1079B789F666649B6BD7D1629F1F77E:\ +182B02D81497EA45F9DAACDC29193A6539DA69D6BA4997D5 + +D1079B789F666649B6BD7D1629F1F77E:3AF6F7CE5BD35EF18BEC6FA787AB506B:\ +7AFF7A70CA2FF28AC31DD8AE5DAAAB63182B02D81497EA45 + +3AF6F7CE5BD35EF18BEC6FA787AB506B:AE8109BFDA85C1F2C5038B34ED691BFF:\ +D1079B789F666649B6BD7D1629F1F77E7AFF7A70CA2FF28A + +AE8109BFDA85C1F2C5038B34ED691BFF:893FD67B98C550073571BD631263FC78:\ +3AF6F7CE5BD35EF18BEC6FA787AB506BD1079B789F666649 + +893FD67B98C550073571BD631263FC78:16434FC9C8841A63D58700B5578E8F67:\ +AE8109BFDA85C1F2C5038B34ED691BFF3AF6F7CE5BD35EF1 + +16434FC9C8841A63D58700B5578E8F67:9594CF62D48ACD347A68A3161F0F3EE7:\ +893FD67B98C550073571BD631263FC78AE8109BFDA85C1F2 + +9594CF62D48ACD347A68A3161F0F3EE7:B23E8C2C731C514017D1F2B88D77D208:\ +16434FC9C8841A63D58700B5578E8F67893FD67B98C55007 + +B23E8C2C731C514017D1F2B88D77D208:93CC592BC96D95FA8AC32DA894F6AB89:\ +9594CF62D48ACD347A68A3161F0F3EE716434FC9C8841A63 + +93CC592BC96D95FA8AC32DA894F6AB89:26516E6BD4AEF86AF4F4AD58FA41A14C:\ +B23E8C2C731C514017D1F2B88D77D2089594CF62D48ACD34 + +26516E6BD4AEF86AF4F4AD58FA41A14C:00A8FFFAB8616BE710A6592438FC40BE:\ +93CC592BC96D95FA8AC32DA894F6AB89B23E8C2C731C5140 + +00A8FFFAB8616BE710A6592438FC40BE:A19B811C77482D97C842EC62DB2EDCCE:\ +26516E6BD4AEF86AF4F4AD58FA41A14C93CC592BC96D95FA + +A19B811C77482D97C842EC62DB2EDCCE:D7FF438678D818CAA26A676342F98E8B:\ +00A8FFFAB8616BE710A6592438FC40BE26516E6BD4AEF86A + +D7FF438678D818CAA26A676342F98E8B:84EAFFC0C091582ABB717086E0807A5F:\ +A19B811C77482D97C842EC62DB2EDCCE00A8FFFAB8616BE7 + +84EAFFC0C091582ABB717086E0807A5F:5500AF1C79503FEF1BACF35A81DC2865:\ +D7FF438678D818CAA26A676342F98E8BA19B811C77482D97 + +5500AF1C79503FEF1BACF35A81DC2865:7282B2F3E766C83664930A19D201D7E7:\ +84EAFFC0C091582ABB717086E0807A5FD7FF438678D818CA + +7282B2F3E766C83664930A19D201D7E7:6796085C32FBDD2AB43E81EAC1262743:\ +5500AF1C79503FEF1BACF35A81DC286584EAFFC0C091582A + +6796085C32FBDD2AB43E81EAC1262743:5839F9E148B9FD2B5A52751D4F178FDC:\ +7282B2F3E766C83664930A19D201D7E75500AF1C79503FEF + +5839F9E148B9FD2B5A52751D4F178FDC:A88F34056742E55408A7A9E7B6D4C8C0:\ +6796085C32FBDD2AB43E81EAC12627437282B2F3E766C836 + +A88F34056742E55408A7A9E7B6D4C8C0:9C8C304CB1F937C6E42528459FA8872F:\ +5839F9E148B9FD2B5A52751D4F178FDC6796085C32FBDD2A + +9C8C304CB1F937C6E42528459FA8872F:EA3668C0D96529A7F3BF0F7C2B5C5BE2:\ +A88F34056742E55408A7A9E7B6D4C8C05839F9E148B9FD2B + +EA3668C0D96529A7F3BF0F7C2B5C5BE2:A8FB6EEFCAAF9C4041072D570984CED2:\ +9C8C304CB1F937C6E42528459FA8872FA88F34056742E554 + +A8FB6EEFCAAF9C4041072D570984CED2:ABF4662E5D50F71B15FE3B428AFE3500:\ +EA3668C0D96529A7F3BF0F7C2B5C5BE29C8C304CB1F937C6 + +ABF4662E5D50F71B15FE3B428AFE3500:3B3AED23958DA6E2FA4493BCBE59A806:\ +A8FB6EEFCAAF9C4041072D570984CED2EA3668C0D96529A7 + +3B3AED23958DA6E2FA4493BCBE59A806:CFBF446E33C3DCD4DD5161CA00D4BA8F:\ +ABF4662E5D50F71B15FE3B428AFE3500A8FB6EEFCAAF9C40 + +CFBF446E33C3DCD4DD5161CA00D4BA8F:072ADBFA7EB962BA199AFC720339FF29:\ +3B3AED23958DA6E2FA4493BCBE59A806ABF4662E5D50F71B + +072ADBFA7EB962BA199AFC720339FF29:AAB346D9123A8140AC563EF17E7054C8:\ +CFBF446E33C3DCD4DD5161CA00D4BA8F3B3AED23958DA6E2 + +AAB346D9123A8140AC563EF17E7054C8:3C7DDC5FE6E5888FE61DEDA0C69CD320:\ +072ADBFA7EB962BA199AFC720339FF29CFBF446E33C3DCD4 + +3C7DDC5FE6E5888FE61DEDA0C69CD320:34AA645C7E3532098ADA91BB128ED821:\ +AAB346D9123A8140AC563EF17E7054C8072ADBFA7EB962BA + +34AA645C7E3532098ADA91BB128ED821:7A5D12E315038522DA01EC0834B1322C:\ +3C7DDC5FE6E5888FE61DEDA0C69CD320AAB346D9123A8140 + +7A5D12E315038522DA01EC0834B1322C:86E235A1CB091FF7FE6FBBCA0D73BE58:\ +34AA645C7E3532098ADA91BB128ED8213C7DDC5FE6E5888F + +86E235A1CB091FF7FE6FBBCA0D73BE58:F3CE81CACE5D6BA9C558111DCDB22F5D:\ +7A5D12E315038522DA01EC0834B1322C34AA645C7E353209 + +F3CE81CACE5D6BA9C558111DCDB22F5D:FB30A5D67D5F5BE4048C77E2AD3BC9D1:\ +86E235A1CB091FF7FE6FBBCA0D73BE587A5D12E315038522 + +FB30A5D67D5F5BE4048C77E2AD3BC9D1:31E69DD3D2D90E81C9EBFAC257E9823D:\ +F3CE81CACE5D6BA9C558111DCDB22F5D86E235A1CB091FF7 + +31E69DD3D2D90E81C9EBFAC257E9823D:87579B3F19A9CDE12BB882FFEAF665AE:\ +FB30A5D67D5F5BE4048C77E2AD3BC9D1F3CE81CACE5D6BA9 + +87579B3F19A9CDE12BB882FFEAF665AE:24A8572AA844FEF25F7670FAE30F1CD2:\ +31E69DD3D2D90E81C9EBFAC257E9823DFB30A5D67D5F5BE4 + +24A8572AA844FEF25F7670FAE30F1CD2:0CFA32E5E33F3B2DAC9F34D25979319A:\ +87579B3F19A9CDE12BB882FFEAF665AE31E69DD3D2D90E81 + +0CFA32E5E33F3B2DAC9F34D25979319A:3C64D7FC881B9B82ABA21FF122B98F54:\ +24A8572AA844FEF25F7670FAE30F1CD287579B3F19A9CDE1 + +3C64D7FC881B9B82ABA21FF122B98F54:A794CAEE6756281B7A64894E4E4F70A8:\ +0CFA32E5E33F3B2DAC9F34D25979319A24A8572AA844FEF2 + +A794CAEE6756281B7A64894E4E4F70A8:89A9BF6B893BC5E6FEF4C77F3D0F29A6:\ +3C64D7FC881B9B82ABA21FF122B98F540CFA32E5E33F3B2D + +89A9BF6B893BC5E6FEF4C77F3D0F29A6:5DBE44032769DF543EAD7AD13A5F3310:\ +A794CAEE6756281B7A64894E4E4F70A83C64D7FC881B9B82 + +5DBE44032769DF543EAD7AD13A5F3310:DEA4F3DA75EC7A8EAC3861A9912402CD:\ +89A9BF6B893BC5E6FEF4C77F3D0F29A6A794CAEE6756281B + +DEA4F3DA75EC7A8EAC3861A9912402CD:FB66522C332FCC4C042ABE32FA9E902F:\ +5DBE44032769DF543EAD7AD13A5F331089A9BF6B893BC5E6 + +FB66522C332FCC4C042ABE32FA9E902F:F0AB73301125FA21EF70BE5385FB76B6:\ +DEA4F3DA75EC7A8EAC3861A9912402CD5DBE44032769DF54 + +F0AB73301125FA21EF70BE5385FB76B6:E75449212BEEF9F4A390BD860A640941:\ +FB66522C332FCC4C042ABE32FA9E902FDEA4F3DA75EC7A8E + +00000000000000000000000000000000:57FF739D4DC92C1BD7FC01700CC8216F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +57FF739D4DC92C1BD7FC01700CC8216F:D43BB7556EA32E46F2A282B7D45B4E0D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +D43BB7556EA32E46F2A282B7D45B4E0D:90AFE91BB288544F2C32DC239B2635E6:\ +57FF739D4DC92C1BD7FC01700CC8216F00000000000000000000000000000000 + +90AFE91BB288544F2C32DC239B2635E6:6CB4561C40BF0A9705931CB6D408E7FA:\ +D43BB7556EA32E46F2A282B7D45B4E0D57FF739D4DC92C1BD7FC01700CC8216F + +6CB4561C40BF0A9705931CB6D408E7FA:3059D6D61753B958D92F4781C8640E58:\ +90AFE91BB288544F2C32DC239B2635E6D43BB7556EA32E46F2A282B7D45B4E0D + +3059D6D61753B958D92F4781C8640E58:E69465770505D7F80EF68CA38AB3A3D6:\ +6CB4561C40BF0A9705931CB6D408E7FA90AFE91BB288544F2C32DC239B2635E6 + +E69465770505D7F80EF68CA38AB3A3D6:5AB67A5F8539A4A5FD9F0373BA463466:\ +3059D6D61753B958D92F4781C8640E586CB4561C40BF0A9705931CB6D408E7FA + +5AB67A5F8539A4A5FD9F0373BA463466:DC096BCD99FC72F79936D4C748E75AF7:\ +E69465770505D7F80EF68CA38AB3A3D63059D6D61753B958D92F4781C8640E58 + +DC096BCD99FC72F79936D4C748E75AF7:C5A3E7CEE0F1B7260528A68FB4EA05F2:\ +5AB67A5F8539A4A5FD9F0373BA463466E69465770505D7F80EF68CA38AB3A3D6 + +C5A3E7CEE0F1B7260528A68FB4EA05F2:43D5CEC327B24AB90AD34A79D0469151:\ +DC096BCD99FC72F79936D4C748E75AF75AB67A5F8539A4A5FD9F0373BA463466 + +43D5CEC327B24AB90AD34A79D0469151:05BA7BE9BE5274FBEB4AC5FD5FAAFA10:\ +C5A3E7CEE0F1B7260528A68FB4EA05F2DC096BCD99FC72F79936D4C748E75AF7 + +05BA7BE9BE5274FBEB4AC5FD5FAAFA10:89D513B989E3CECE4D2E3E4C15D4E01C:\ +43D5CEC327B24AB90AD34A79D0469151C5A3E7CEE0F1B7260528A68FB4EA05F2 + +89D513B989E3CECE4D2E3E4C15D4E01C:E56E462AE2E66F800CE2224C4CAFACBE:\ +05BA7BE9BE5274FBEB4AC5FD5FAAFA1043D5CEC327B24AB90AD34A79D0469151 + +E56E462AE2E66F800CE2224C4CAFACBE:F5DBEE5414D79CA46BE17346FDC72BF5:\ +89D513B989E3CECE4D2E3E4C15D4E01C05BA7BE9BE5274FBEB4AC5FD5FAAFA10 + +F5DBEE5414D79CA46BE17346FDC72BF5:C780FC28815E667B3D224ECF1F4A7D65:\ +E56E462AE2E66F800CE2224C4CAFACBE89D513B989E3CECE4D2E3E4C15D4E01C + +C780FC28815E667B3D224ECF1F4A7D65:2EF17A0D75440ECEC9AF18D29ABA3CDA:\ +F5DBEE5414D79CA46BE17346FDC72BF5E56E462AE2E66F800CE2224C4CAFACBE + +2EF17A0D75440ECEC9AF18D29ABA3CDA:D653FDFF96BCF89A929F6377AB41967A:\ +C780FC28815E667B3D224ECF1F4A7D65F5DBEE5414D79CA46BE17346FDC72BF5 + +D653FDFF96BCF89A929F6377AB41967A:36BBAD8838380C8793A7AEA0A11D04D2:\ +2EF17A0D75440ECEC9AF18D29ABA3CDAC780FC28815E667B3D224ECF1F4A7D65 + +36BBAD8838380C8793A7AEA0A11D04D2:034EFECFC0EFC00D82C3345A8708AE78:\ +D653FDFF96BCF89A929F6377AB41967A2EF17A0D75440ECEC9AF18D29ABA3CDA + +034EFECFC0EFC00D82C3345A8708AE78:EA38887307337A2934A9EB802F6CFDDD:\ +36BBAD8838380C8793A7AEA0A11D04D2D653FDFF96BCF89A929F6377AB41967A + +EA38887307337A2934A9EB802F6CFDDD:7C279D47775AB4C26442E8A117943DD8:\ +034EFECFC0EFC00D82C3345A8708AE7836BBAD8838380C8793A7AEA0A11D04D2 + +7C279D47775AB4C26442E8A117943DD8:E3CF581056EBC1169CF451E930308726:\ +EA38887307337A2934A9EB802F6CFDDD034EFECFC0EFC00D82C3345A8708AE78 + +E3CF581056EBC1169CF451E930308726:65527B29D489C8CDDC62E5E7FFC4E924:\ +7C279D47775AB4C26442E8A117943DD8EA38887307337A2934A9EB802F6CFDDD + +65527B29D489C8CDDC62E5E7FFC4E924:3B491F930230A0170819CACB48F9030C:\ +E3CF581056EBC1169CF451E9303087267C279D47775AB4C26442E8A117943DD8 + +3B491F930230A0170819CACB48F9030C:A7C8193F35AF63B51D7F9DEDCEC85866:\ +65527B29D489C8CDDC62E5E7FFC4E924E3CF581056EBC1169CF451E930308726 + +A7C8193F35AF63B51D7F9DEDCEC85866:009A48F9A1C27F9AA5F9BD909C848B60:\ +3B491F930230A0170819CACB48F9030C65527B29D489C8CDDC62E5E7FFC4E924 + +009A48F9A1C27F9AA5F9BD909C848B60:3B507E987B3F827A093B26C85CDFF6C6:\ +A7C8193F35AF63B51D7F9DEDCEC858663B491F930230A0170819CACB48F9030C + +3B507E987B3F827A093B26C85CDFF6C6:EAFB3BA6C78E37214FE908669BC24F6F:\ +009A48F9A1C27F9AA5F9BD909C848B60A7C8193F35AF63B51D7F9DEDCEC85866 + +EAFB3BA6C78E37214FE908669BC24F6F:2B09F10D7F2B62A4D0DAFFB9F882B980:\ +3B507E987B3F827A093B26C85CDFF6C6009A48F9A1C27F9AA5F9BD909C848B60 + +2B09F10D7F2B62A4D0DAFFB9F882B980:E6B9FE907009B2DC649412DD630AE576:\ +EAFB3BA6C78E37214FE908669BC24F6F3B507E987B3F827A093B26C85CDFF6C6 + +E6B9FE907009B2DC649412DD630AE576:F2E4DC89724CD58F85847BD09ED4500F:\ +2B09F10D7F2B62A4D0DAFFB9F882B980EAFB3BA6C78E37214FE908669BC24F6F + +F2E4DC89724CD58F85847BD09ED4500F:DC650444FCEBC2BD6E450EF4605FCABE:\ +E6B9FE907009B2DC649412DD630AE5762B09F10D7F2B62A4D0DAFFB9F882B980 + +DC650444FCEBC2BD6E450EF4605FCABE:B7CFB31755FDA2AB0A67FBA09901A73E:\ +F2E4DC89724CD58F85847BD09ED4500FE6B9FE907009B2DC649412DD630AE576 + +B7CFB31755FDA2AB0A67FBA09901A73E:9C7E7578F3D2923DCDABFED0A5EF86EE:\ +DC650444FCEBC2BD6E450EF4605FCABEF2E4DC89724CD58F85847BD09ED4500F + +9C7E7578F3D2923DCDABFED0A5EF86EE:9465E9AE176483BD398C8033AA136F68:\ +B7CFB31755FDA2AB0A67FBA09901A73EDC650444FCEBC2BD6E450EF4605FCABE + +9465E9AE176483BD398C8033AA136F68:8551279DE9991805FCFC1937C52AE9D4:\ +9C7E7578F3D2923DCDABFED0A5EF86EEB7CFB31755FDA2AB0A67FBA09901A73E + +8551279DE9991805FCFC1937C52AE9D4:A830EB8DA52ECFF7F93B7627322CF9D7:\ +9465E9AE176483BD398C8033AA136F689C7E7578F3D2923DCDABFED0A5EF86EE + +A830EB8DA52ECFF7F93B7627322CF9D7:EC89F0E5155425D4B92BD4B200C1A6E0:\ +8551279DE9991805FCFC1937C52AE9D49465E9AE176483BD398C8033AA136F68 + +EC89F0E5155425D4B92BD4B200C1A6E0:8AF76A782061D38360C6C3CDDCBE1516:\ +A830EB8DA52ECFF7F93B7627322CF9D78551279DE9991805FCFC1937C52AE9D4 + +8AF76A782061D38360C6C3CDDCBE1516:D4EEAA6A069659D5D88590DE75515631:\ +EC89F0E5155425D4B92BD4B200C1A6E0A830EB8DA52ECFF7F93B7627322CF9D7 + +D4EEAA6A069659D5D88590DE75515631:259C021D37B077197B80FCDB07EA1AF2:\ +8AF76A782061D38360C6C3CDDCBE1516EC89F0E5155425D4B92BD4B200C1A6E0 + +259C021D37B077197B80FCDB07EA1AF2:300CC8B4171F0E9BD75710FAD033C570:\ +D4EEAA6A069659D5D88590DE755156318AF76A782061D38360C6C3CDDCBE1516 + +300CC8B4171F0E9BD75710FAD033C570:5CFA5BD213A74F02E65390A4C14A1DF6:\ +259C021D37B077197B80FCDB07EA1AF2D4EEAA6A069659D5D88590DE75515631 + +5CFA5BD213A74F02E65390A4C14A1DF6:A443EA1B2C5747CE7EC5F21D4FE0C147:\ +300CC8B4171F0E9BD75710FAD033C570259C021D37B077197B80FCDB07EA1AF2 + +A443EA1B2C5747CE7EC5F21D4FE0C147:D2DED73E59319A8138E0331F0EA149EA:\ +5CFA5BD213A74F02E65390A4C14A1DF6300CC8B4171F0E9BD75710FAD033C570 + +D2DED73E59319A8138E0331F0EA149EA:2E2158BC3E5FC714C1EEECA0EA696D48:\ +A443EA1B2C5747CE7EC5F21D4FE0C1475CFA5BD213A74F02E65390A4C14A1DF6 + +2E2158BC3E5FC714C1EEECA0EA696D48:248A7F3528B168ACFDD1386E3F51E30C:\ +D2DED73E59319A8138E0331F0EA149EAA443EA1B2C5747CE7EC5F21D4FE0C147 + +248A7F3528B168ACFDD1386E3F51E30C:431058F4DBC7F734DA4F02F04CC4F459:\ +2E2158BC3E5FC714C1EEECA0EA696D48D2DED73E59319A8138E0331F0EA149EA + +431058F4DBC7F734DA4F02F04CC4F459:37FE26FF1CF66175F5DDF4C33B97A205:\ +248A7F3528B168ACFDD1386E3F51E30C2E2158BC3E5FC714C1EEECA0EA696D48 + +00000000000000000000000000000000:6BFD32804A1C3206C4BF85EB11241F89:\ +80000000000000000000000000000000 + +00000000000000000000000000000000:F097147AE851845984DC97D5FAE40CF9:\ +40000000000000000000000000000000 + +00000000000000000000000000000000:6117F1977C5ABD9647C56544D9458444:\ +20000000000000000000000000000000 + +00000000000000000000000000000000:75A6240AAE357DEDDF99936705618284:\ +10000000000000000000000000000000 + +00000000000000000000000000000000:F026BFDF6BFBC7E50C46C533BD271C24:\ +08000000000000000000000000000000 + +00000000000000000000000000000000:F3023228D77045D37D1B9CD77437395A:\ +04000000000000000000000000000000 + +00000000000000000000000000000000:F67467BF6B490209809714D50679B2D7:\ +02000000000000000000000000000000 + +00000000000000000000000000000000:2C8431B922C5F560095E9867B1A41256:\ +01000000000000000000000000000000 + +00000000000000000000000000000000:1FB76E90D207BA4C770F67284D6B1359:\ +00800000000000000000000000000000 + +00000000000000000000000000000000:A70AECE1D41DCA9F24BCE8393F6D54BF:\ +00400000000000000000000000000000 + +00000000000000000000000000000000:D4580FC395979689221C57A23598358B:\ +00200000000000000000000000000000 + +00000000000000000000000000000000:35CA62BA8126F015FABFEF8F9119AE6B:\ +00100000000000000000000000000000 + +00000000000000000000000000000000:C81FACB16E087EEFA823CF34E02FE482:\ +00080000000000000000000000000000 + +00000000000000000000000000000000:07400F04E4CC6625AE3FB41ECC863F2A:\ +00040000000000000000000000000000 + +00000000000000000000000000000000:A0941008068D401DEAB6400C86CA53AD:\ +00020000000000000000000000000000 + +00000000000000000000000000000000:2B63BEF50BA87A58BFFCA4CF44C22927:\ +00010000000000000000000000000000 + +00000000000000000000000000000000:FD49069AE9F1874A264A7BFD894ED886:\ +00008000000000000000000000000000 + +00000000000000000000000000000000:232755C754075BB5CC5B85ABFEA38779:\ +00004000000000000000000000000000 + +00000000000000000000000000000000:41358B9C76E959037E13F7E5050E0B42:\ +00002000000000000000000000000000 + +00000000000000000000000000000000:8978CD09C054BB1ABDFFBED09D1CF7EC:\ +00001000000000000000000000000000 + +00000000000000000000000000000000:9F2A7CE5FD51FD5D7E2D42407EEF8F6A:\ +00000800000000000000000000000000 + +00000000000000000000000000000000:6AA2F0627F312A77C68D1F15DF0E1379:\ +00000400000000000000000000000000 + +00000000000000000000000000000000:BCD56984E45DBF087BAC8757FC4EFF5A:\ +00000200000000000000000000000000 + +00000000000000000000000000000000:9D3C6C8ED48C9DE7A64CD05D8BF41D54:\ +00000100000000000000000000000000 + +00000000000000000000000000000000:FCD577A23F455ACDE3732C262EBD2D86:\ +00000080000000000000000000000000 + +00000000000000000000000000000000:022E2430D81858888C9E575411D4064F:\ +00000040000000000000000000000000 + +00000000000000000000000000000000:5742CA8CF1193491C1FBC148627D856E:\ +00000020000000000000000000000000 + +00000000000000000000000000000000:88BD93610040DFE248C2FE05EF9F4FE0:\ +00000010000000000000000000000000 + +00000000000000000000000000000000:29A9D577BB3824209FEA64128247CE6C:\ +00000008000000000000000000000000 + +00000000000000000000000000000000:AC4CDB534844EA86000B845FCDAD605F:\ +00000004000000000000000000000000 + +00000000000000000000000000000000:AAC6098597D46B8145A60F40D4EC5308:\ +00000002000000000000000000000000 + +00000000000000000000000000000000:3A7DFD0855A5BE0B16CACBD685FACEF5:\ +00000001000000000000000000000000 + +00000000000000000000000000000000:ACEBA627EBA87AD051C3E0CA0DEF6CD7:\ +00000000800000000000000000000000 + +00000000000000000000000000000000:F0A55DCDBC513EFDD603EA455EB9228C:\ +00000000400000000000000000000000 + +00000000000000000000000000000000:2176DEBC78D6B4A6D0FB37AFA6B51081:\ +00000000200000000000000000000000 + +00000000000000000000000000000000:FDB1B57379B85A85392613E8B4597B63:\ +00000000100000000000000000000000 + +00000000000000000000000000000000:58AB1112E0598586E07FC8359DDFC7EC:\ +00000000080000000000000000000000 + +00000000000000000000000000000000:DD6D1D2629F333528CB66869453BC273:\ +00000000040000000000000000000000 + +00000000000000000000000000000000:932218D99553BB2D4BFC69F1EA67CAAE:\ +00000000020000000000000000000000 + +00000000000000000000000000000000:399D066426F7FEF66F8983086DC044D8:\ +00000000010000000000000000000000 + +00000000000000000000000000000000:3E1BC58269B6B8C8C8D00806975F8337:\ +00000000008000000000000000000000 + +00000000000000000000000000000000:D50A1F966058C6D702D1AFCD700DA0E8:\ +00000000004000000000000000000000 + +00000000000000000000000000000000:6E7A6BB3554F12AD1F88C289D621CD0F:\ +00000000002000000000000000000000 + +00000000000000000000000000000000:9ED4EA506A0CBA89B246C14D1B5B96A9:\ +00000000001000000000000000000000 + +00000000000000000000000000000000:C395A92C1A6884857B263F01F43542DB:\ +00000000000800000000000000000000 + +00000000000000000000000000000000:06562AC497C60F802B68B47DB5B86B6A:\ +00000000000400000000000000000000 + +00000000000000000000000000000000:255A726F2106177FEFA7006BDE05D059:\ +00000000000200000000000000000000 + +00000000000000000000000000000000:B8FD6A8227D0565A4C174AD270EC1205:\ +00000000000100000000000000000000 + +00000000000000000000000000000000:C2652FDB48B9DDBFC43B3F7CDD831D6F:\ +00000000000080000000000000000000 + +00000000000000000000000000000000:913EB9205DB2E17A96A23A724EDF4C84:\ +00000000000040000000000000000000 + +00000000000000000000000000000000:9A6694FEB5EA44FF0572124FDB265658:\ +00000000000020000000000000000000 + +00000000000000000000000000000000:E347498DECA6B211C30E21FD0B47A333:\ +00000000000010000000000000000000 + +00000000000000000000000000000000:E70F0D4ED829A81E05D42E511EDE9376:\ +00000000000008000000000000000000 + +00000000000000000000000000000000:140BB7CAD8D6A3553BEF7A3D52347BD8:\ +00000000000004000000000000000000 + +00000000000000000000000000000000:5FA55360F440DCCA20925A3E15B42764:\ +00000000000002000000000000000000 + +00000000000000000000000000000000:6D5B969DFC3EA0A6682CC66488D221DA:\ +00000000000001000000000000000000 + +00000000000000000000000000000000:E2799D5C380B49D2F6997009079D03D3:\ +00000000000000800000000000000000 + +00000000000000000000000000000000:06AFBD8077909E847AF467BB2D47E893:\ +00000000000000400000000000000000 + +00000000000000000000000000000000:46B1EB96EC9EB10897F1562E59287253:\ +00000000000000200000000000000000 + +00000000000000000000000000000000:1793F1D4E1A1606F99C7019C19E85129:\ +00000000000000100000000000000000 + +00000000000000000000000000000000:ED785D0BA19553CE73B69F4D570C3A9D:\ +00000000000000080000000000000000 + +00000000000000000000000000000000:298DF7334670B7391BE203DF7E8890C7:\ +00000000000000040000000000000000 + +00000000000000000000000000000000:150C12DEF6EDC844B0B45361C2B3AECE:\ +00000000000000020000000000000000 + +00000000000000000000000000000000:06FFB5E13438BA8DBD8A3EDADFAC73A1:\ +00000000000000010000000000000000 + +00000000000000000000000000000000:6C5E5719D5F31E929FF9C44F086EFADB:\ +00000000000000008000000000000000 + +00000000000000000000000000000000:4C8D0E13996F4D32CB7984B7BB1B34FB:\ +00000000000000004000000000000000 + +00000000000000000000000000000000:C9BDCFFD4B9F3BBBB33A2D2C51BA83F6:\ +00000000000000002000000000000000 + +00000000000000000000000000000000:929B29DD0D952161FFDA8CB417B166EC:\ +00000000000000001000000000000000 + +00000000000000000000000000000000:87F9DFCB07275916E7A446D3DCE74232:\ +00000000000000000800000000000000 + +00000000000000000000000000000000:6FDFD0BC8F49BE420CD68A894C7CA4E9:\ +00000000000000000400000000000000 + +00000000000000000000000000000000:CDDC09DE42DC2CBCD9287A2072A30D23:\ +00000000000000000200000000000000 + +00000000000000000000000000000000:9B2FF668BA9D77AD1E9F30BA0173EBD4:\ +00000000000000000100000000000000 + +00000000000000000000000000000000:DEF29890D59A511B32A30322D7471E38:\ +00000000000000000080000000000000 + +00000000000000000000000000000000:5094EAEC9F23D0DBFAB8240A42ED5BF1:\ +00000000000000000040000000000000 + +00000000000000000000000000000000:79CB87BC375F58DE8DA780B9BAD3DEA3:\ +00000000000000000020000000000000 + +00000000000000000000000000000000:7139B3D980B85D3B77A3BBDB6CB79756:\ +00000000000000000010000000000000 + +00000000000000000000000000000000:148ED6E8FEC02168377C96956AE18D93:\ +00000000000000000008000000000000 + +00000000000000000000000000000000:0AFED5A710F2BF11C77F152951AE32CB:\ +00000000000000000004000000000000 + +00000000000000000000000000000000:C265AC354817550FAE12A51C2DCD749C:\ +00000000000000000002000000000000 + +00000000000000000000000000000000:A3B089F79D0A07EA0893BB48D508B35B:\ +00000000000000000001000000000000 + +00000000000000000000000000000000:C0A7B6BCE0675A48E95D39A7659CB20A:\ +00000000000000000000800000000000 + +00000000000000000000000000000000:6CE0A0BA02041CB5E6C0A46DE1B71A43:\ +00000000000000000000400000000000 + +00000000000000000000000000000000:E54045C33A386555C5754ADB0A181244:\ +00000000000000000000200000000000 + +00000000000000000000000000000000:BB652196955BB7BE7E8CB8E2E992A750:\ +00000000000000000000100000000000 + +00000000000000000000000000000000:594B2917DE6119B62BE3DDF10A1A47E0:\ +00000000000000000000080000000000 + +00000000000000000000000000000000:E8B4F95053617F6A10120DB196AAC4D1:\ +00000000000000000000040000000000 + +00000000000000000000000000000000:79646B1CC19708973215B9891A2C1019:\ +00000000000000000000020000000000 + +00000000000000000000000000000000:5E7E6175F6B548E5389C1B1C391CBEE2:\ +00000000000000000000010000000000 + +00000000000000000000000000000000:C0860A7B47544872B9DB5C220088DE5C:\ +00000000000000000000008000000000 + +00000000000000000000000000000000:325163F073E5A27EBAF339B1FA53682D:\ +00000000000000000000004000000000 + +00000000000000000000000000000000:1A0C4583CEFF5810F3AB42A471415A1D:\ +00000000000000000000002000000000 + +00000000000000000000000000000000:F8DDF239D19363957C7C8C9B537893FA:\ +00000000000000000000001000000000 + +00000000000000000000000000000000:D3B9999669509564741F236EEF2401F3:\ +00000000000000000000000800000000 + +00000000000000000000000000000000:3376DA406D82B76591B610C6C9FC3F9E:\ +00000000000000000000000400000000 + +00000000000000000000000000000000:B6AD728D2970637642723FF06204EEAD:\ +00000000000000000000000200000000 + +00000000000000000000000000000000:0ADF4A82FFE602BC13002AA8AB24EA71:\ +00000000000000000000000100000000 + +00000000000000000000000000000000:D80D1378E30036D92B4A359F68D0CBFE:\ +00000000000000000000000080000000 + +00000000000000000000000000000000:EDA13B315897290E4ACEB4B513E9749B:\ +00000000000000000000000040000000 + +00000000000000000000000000000000:34589936B79E4F43260DC6CCD1820D6D:\ +00000000000000000000000020000000 + +00000000000000000000000000000000:C7A8FF65CD38D008EC6745897E010122:\ +00000000000000000000000010000000 + +00000000000000000000000000000000:3AFE23D89E79E9F8A54F103ED51EB14D:\ +00000000000000000000000008000000 + +00000000000000000000000000000000:27994D1AA909806C7CC8E4AC4CD5479B:\ +00000000000000000000000004000000 + +00000000000000000000000000000000:610D5528725B34FD70ADC66E83BAE266:\ +00000000000000000000000002000000 + +00000000000000000000000000000000:3A3064DFF6E0B54D864E81FA76270065:\ +00000000000000000000000001000000 + +00000000000000000000000000000000:5E9B5966ED3A2358005C9773F8690AD9:\ +00000000000000000000000000800000 + +00000000000000000000000000000000:713738F580CED6E358D2CDCEDA64F99F:\ +00000000000000000000000000400000 + +00000000000000000000000000000000:EC7FE3578906291B2DCF0AD7FF8B5358:\ +00000000000000000000000000200000 + +00000000000000000000000000000000:0F714C096C244BED865A9E064576FE5D:\ +00000000000000000000000000100000 + +00000000000000000000000000000000:B7C226C60B6F3031A1E2160823A62679:\ +00000000000000000000000000080000 + +00000000000000000000000000000000:5C78C4BC8F15DC964FE9EC75203AD7D8:\ +00000000000000000000000000040000 + +00000000000000000000000000000000:178FB7443FBD17DCF1AF122D4D117239:\ +00000000000000000000000000020000 + +00000000000000000000000000000000:C55C99851BD135155A080A9C4E54B919:\ +00000000000000000000000000010000 + +00000000000000000000000000000000:AD75C80D72EA278B3EDE380DAAB1F708:\ +00000000000000000000000000008000 + +00000000000000000000000000000000:95054D1ECA74F75515AE8C17941D3A54:\ +00000000000000000000000000004000 + +00000000000000000000000000000000:8E0B0D4F95C9C9D65420B4B1869A1D3E:\ +00000000000000000000000000002000 + +00000000000000000000000000000000:7712EA2F0598CC8CFB9A934DEC848B5F:\ +00000000000000000000000000001000 + +00000000000000000000000000000000:9D730E0F7450183C0804D6817CBE058E:\ +00000000000000000000000000000800 + +00000000000000000000000000000000:3FA52E9B242F9AF61322FBB6BA583A01:\ +00000000000000000000000000000400 + +00000000000000000000000000000000:3D47D74F667D60458188922EE8D8A7A0:\ +00000000000000000000000000000200 + +00000000000000000000000000000000:036B4E4E02D84C56AC61007DAC33EC33:\ +00000000000000000000000000000100 + +00000000000000000000000000000000:4E171141E51234DE6E4B236643A6DC85:\ +00000000000000000000000000000080 + +00000000000000000000000000000000:DB720E7B04462829DFA258ED9E7C7F2F:\ +00000000000000000000000000000040 + +00000000000000000000000000000000:8B10E11115FF4336DE57F2EA13AABBFA:\ +00000000000000000000000000000020 + +00000000000000000000000000000000:F0E35BFF226C064E08368AF440298DB9:\ +00000000000000000000000000000010 + +00000000000000000000000000000000:6C4C8811B4DF74F2A7D7F79A6253CEA7:\ +00000000000000000000000000000008 + +00000000000000000000000000000000:7DD12AD3BC7A419F92753D8CC39637F0:\ +00000000000000000000000000000004 + +00000000000000000000000000000000:A465B01EA32B2F4F87C85FD06F9B0A02:\ +00000000000000000000000000000002 + +00000000000000000000000000000000:8DC902DDAE09F52B1A3A77EE89C1441E:\ +00000000000000000000000000000001 + +00000000000000000000000000000000:B5AED133641004F4121B66E7DB8F2FF0:\ +800000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:998110F200555A32C6C123E66CF87DE9:\ +400000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:2DBAEEEC682DCC957C2D51B0990E123A:\ +200000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BAEC0A31F6557D6D13B888A94F63058C:\ +100000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E51ADC9773E785730586E6812A0F0FA5:\ +080000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:97067E60FE010AEEA48C0D3224AD0941:\ +040000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BB73A7C859E6377A5E42EFCD55CD2C5B:\ +020000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:914BFE25D7FDEE49B46FB5C2B60DACA5:\ +010000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EFEF0047892A043A1D594118477CA513:\ +008000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BE59CF7C4E4B482843E67B4EB65B3038:\ +004000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:35FFC8038CB124B8078EC5C7C7928F14:\ +002000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:086025FC1CC6056367304C51DE871DEA:\ +001000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:950F0B7BDFFC78AE3AFF022F78E1670E:\ +000800000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CADF4568B43C950FB688C6608AAF5FAE:\ +000400000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E2313E3CFCB5E745EBAB983BF2867579:\ +000200000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B4394412F7B4A1A4A22B73C93BAFD85D:\ +000100000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C014C9A992E6366B3BD2EABDF1508187:\ +000080000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4344D702AC78A5808F4AB566D5509B75:\ +000040000000000000000000000000000000000000000000 + +00000000000000000000000000000000:937893DA40E9D7F2ECE9028FAA4DE6A4:\ +000020000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E77874759C6AACB611B715A52A37234A:\ +000010000000000000000000000000000000000000000000 + +00000000000000000000000000000000:841FC7FC0EF6CE08CFC6056B3C557F23:\ +000008000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6AC04A6988F1CE601E4C48241D42C1CF:\ +000004000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5254F42B5DD207461693C278B6ABC855:\ +000002000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F58B1AE230B417541649CB035FB5231C:\ +000001000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5F015060D28C6CCB2E5FDCB5AFDCF309:\ +000000800000000000000000000000000000000000000000 + +00000000000000000000000000000000:B0DBAA257FEFFE48A688FE247D0460B7:\ +000000400000000000000000000000000000000000000000 + +00000000000000000000000000000000:1235DF200338F96E39E881484B6B11EE:\ +000000200000000000000000000000000000000000000000 + +00000000000000000000000000000000:671D87102E35609B32F40A91A7E29E04:\ +000000100000000000000000000000000000000000000000 + +00000000000000000000000000000000:F01FB3FA3E84DEA6057F3D88CD651876:\ +000000080000000000000000000000000000000000000000 + +00000000000000000000000000000000:B96C1E40D0D407ED90D11892503A296F:\ +000000040000000000000000000000000000000000000000 + +00000000000000000000000000000000:2E27350191DE6C2E9DCC51022A3C96CB:\ +000000020000000000000000000000000000000000000000 + +00000000000000000000000000000000:BDD6CFE5D00E7F8D698143E653A0163B:\ +000000010000000000000000000000000000000000000000 + +00000000000000000000000000000000:FEDABEF20F51910E57CF5ECEF878A8E1:\ +000000008000000000000000000000000000000000000000 + +00000000000000000000000000000000:EEBF9FE247A78C6FF2A91428C54D70DA:\ +000000004000000000000000000000000000000000000000 + +00000000000000000000000000000000:41714E55E90E0E154802FBBFC0BF58C5:\ +000000002000000000000000000000000000000000000000 + +00000000000000000000000000000000:69480F26BC5DFF8F6D8A0F10E0959BF1:\ +000000001000000000000000000000000000000000000000 + +00000000000000000000000000000000:A39E4BE5A7E13BA3C48CFD98A52CFA70:\ +000000000800000000000000000000000000000000000000 + +00000000000000000000000000000000:95809A16888FB49F5053375A6533CD58:\ +000000000400000000000000000000000000000000000000 + +00000000000000000000000000000000:5F0DEF37FB14F956BB31703F1FC968EB:\ +000000000200000000000000000000000000000000000000 + +00000000000000000000000000000000:CF0A28C9598D7BBCA6992238B03EF4EB:\ +000000000100000000000000000000000000000000000000 + +00000000000000000000000000000000:7FF241BA32E6878542978957F137856F:\ +000000000080000000000000000000000000000000000000 + +00000000000000000000000000000000:8D489E0496B54F91A0254E4103804145:\ +000000000040000000000000000000000000000000000000 + +00000000000000000000000000000000:9925949BE93F4A0BF4114CCA2E05B566:\ +000000000020000000000000000000000000000000000000 + +00000000000000000000000000000000:6ED9A5F014FAFAE3D05C4AE027066873:\ +000000000010000000000000000000000000000000000000 + +00000000000000000000000000000000:958453307A371EE2D3DA8DD327D9B51B:\ +000000000008000000000000000000000000000000000000 + +00000000000000000000000000000000:1EE0680BF9A798A1C63636EA917B17B5:\ +000000000004000000000000000000000000000000000000 + +00000000000000000000000000000000:C0CEFB2475B21AA8937E3048604D9928:\ +000000000002000000000000000000000000000000000000 + +00000000000000000000000000000000:9034DDEFF43C9CC82FADE8DE0A2476BB:\ +000000000001000000000000000000000000000000000000 + +00000000000000000000000000000000:09D32779D0C8D02E0670F377187756FC:\ +000000000000800000000000000000000000000000000000 + +00000000000000000000000000000000:6557BDB19F03E62D823C0613BEA0FAFB:\ +000000000000400000000000000000000000000000000000 + +00000000000000000000000000000000:83505664DED694967F2D9E7853BC4B43:\ +000000000000200000000000000000000000000000000000 + +00000000000000000000000000000000:0BBABE3B7F381C3B3D8A9D846D8CCEAC:\ +000000000000100000000000000000000000000000000000 + +00000000000000000000000000000000:E3AA0A67CDF79DBAB013103E39E8C822:\ +000000000000080000000000000000000000000000000000 + +00000000000000000000000000000000:AF3D0C9B673C322355480E8681237D13:\ +000000000000040000000000000000000000000000000000 + +00000000000000000000000000000000:60D325226EC8DFB9E08DFADB479649A0:\ +000000000000020000000000000000000000000000000000 + +00000000000000000000000000000000:845B92A3C56880E8007B452B57B73B75:\ +000000000000010000000000000000000000000000000000 + +00000000000000000000000000000000:76C59CD9185C518D65EC641EB73C6387:\ +000000000000008000000000000000000000000000000000 + +00000000000000000000000000000000:735567D0B8A52203492220804F3D62E6:\ +000000000000004000000000000000000000000000000000 + +00000000000000000000000000000000:E74FB07622191A053368131DA36FC299:\ +000000000000002000000000000000000000000000000000 + +00000000000000000000000000000000:3CFF40E0E9A86F67D938D2483BDD08F0:\ +000000000000001000000000000000000000000000000000 + +00000000000000000000000000000000:7C502AE730F5A9ABEACB15240EA1E8F6:\ +000000000000000800000000000000000000000000000000 + +00000000000000000000000000000000:0B3CA10C02E24BA82261E65BE4413512:\ +000000000000000400000000000000000000000000000000 + +00000000000000000000000000000000:F7D50E95931755A98B143AE254090F9D:\ +000000000000000200000000000000000000000000000000 + +00000000000000000000000000000000:A4E84B8A7B8CC3766307D66A9C6AECB9:\ +000000000000000100000000000000000000000000000000 + +00000000000000000000000000000000:5298367E93E9B9CB5CF402A8BA9EFC62:\ +000000000000000080000000000000000000000000000000 + +00000000000000000000000000000000:03D44830C40510CE7866FB86FAC6E1DC:\ +000000000000000040000000000000000000000000000000 + +00000000000000000000000000000000:978E4BA4EEA6739B1769FF4389F0367E:\ +000000000000000020000000000000000000000000000000 + +00000000000000000000000000000000:707EF1166D2F11FD1519B37FB00D23EB:\ +000000000000000010000000000000000000000000000000 + +00000000000000000000000000000000:435088DBDD8646A7FCA8851CA2FA1FB5:\ +000000000000000008000000000000000000000000000000 + +00000000000000000000000000000000:F3DC32DD6931A302391F9B992A5B6122:\ +000000000000000004000000000000000000000000000000 + +00000000000000000000000000000000:D93286DD8A05432614FD03169F36ED15:\ +000000000000000002000000000000000000000000000000 + +00000000000000000000000000000000:59F83FEA4BC9B24BF69A98CA3959CEFC:\ +000000000000000001000000000000000000000000000000 + +00000000000000000000000000000000:A689BC3A8DB36A22763E911370C9DE2B:\ +000000000000000000800000000000000000000000000000 + +00000000000000000000000000000000:04EB5BA604BA64DD112BCAE830C27966:\ +000000000000000000400000000000000000000000000000 + +00000000000000000000000000000000:7EF653E2D804E80BD678C3A6CB222625:\ +000000000000000000200000000000000000000000000000 + +00000000000000000000000000000000:A94EC287E7F70C6503DC0B891920C622:\ +000000000000000000100000000000000000000000000000 + +00000000000000000000000000000000:8A78497E9D18A365599444C972359F0D:\ +000000000000000000080000000000000000000000000000 + +00000000000000000000000000000000:2F1832E285C8D24F226B50CCD71FE46A:\ +000000000000000000040000000000000000000000000000 + +00000000000000000000000000000000:0B6675F4BD4BD6951BB96AF62D3C9B96:\ +000000000000000000020000000000000000000000000000 + +00000000000000000000000000000000:D6DEDAAAECE52984A261155ED7AF5290:\ +000000000000000000010000000000000000000000000000 + +00000000000000000000000000000000:7600A0FCF96F24A21419103466B937B5:\ +000000000000000000008000000000000000000000000000 + +00000000000000000000000000000000:C3E359420C4C4AF445C470AB347B3667:\ +000000000000000000004000000000000000000000000000 + +00000000000000000000000000000000:D915133DAA11BECB43E020266B709BEC:\ +000000000000000000002000000000000000000000000000 + +00000000000000000000000000000000:A0001FC4E31664ED8C375644D02717AE:\ +000000000000000000001000000000000000000000000000 + +00000000000000000000000000000000:D8E96A3F240666FC02F31E84CD1CEEF1:\ +000000000000000000000800000000000000000000000000 + +00000000000000000000000000000000:DE0B6B80C40ED4447E36A84A62EB235D:\ +000000000000000000000400000000000000000000000000 + +00000000000000000000000000000000:8B15F04C34FC0F35F96C86837665CB38:\ +000000000000000000000200000000000000000000000000 + +00000000000000000000000000000000:02DAE104DA462934D87FDC73EB4011A9:\ +000000000000000000000100000000000000000000000000 + +00000000000000000000000000000000:B1ECC134EB7221CE00EBB977E08020E2:\ +000000000000000000000080000000000000000000000000 + +00000000000000000000000000000000:9F13CC1BF91C1B49AB6DDD7AF7A05ABA:\ +000000000000000000000040000000000000000000000000 + +00000000000000000000000000000000:414D1178475679525B5EE7ED373E2A0A:\ +000000000000000000000020000000000000000000000000 + +00000000000000000000000000000000:E69F2CC70EF18DBD360DFDD5C6573EBD:\ +000000000000000000000010000000000000000000000000 + +00000000000000000000000000000000:FA45D9E00E4C221A14C359742AC25C35:\ +000000000000000000000008000000000000000000000000 + +00000000000000000000000000000000:BC2AC98007820862150CC1B1E3E11ED1:\ +000000000000000000000004000000000000000000000000 + +00000000000000000000000000000000:C7CABAB4D7DFFD44C5943EB8E9441C3D:\ +000000000000000000000002000000000000000000000000 + +00000000000000000000000000000000:6DA6716020FDE292E8ADFB2A31BC6B24:\ +000000000000000000000001000000000000000000000000 + +00000000000000000000000000000000:9516AE03F102950795E1869E07BE0AFB:\ +000000000000000000000000800000000000000000000000 + +00000000000000000000000000000000:4748E60F70C6172E5D5B0C21E67F366C:\ +000000000000000000000000400000000000000000000000 + +00000000000000000000000000000000:40C7CC6385BB634FB68F73CCB5C446C2:\ +000000000000000000000000200000000000000000000000 + +00000000000000000000000000000000:7F0CE574F643711ECFC5011C0BCCD49A:\ +000000000000000000000000100000000000000000000000 + +00000000000000000000000000000000:2628849CC2C62FEB305A1287F24B9693:\ +000000000000000000000000080000000000000000000000 + +00000000000000000000000000000000:6E8C11B5EA12D40CE9F83693314BD836:\ +000000000000000000000000040000000000000000000000 + +00000000000000000000000000000000:503FCDFCCB2AEBEEE6FB59326D06745E:\ +000000000000000000000000020000000000000000000000 + +00000000000000000000000000000000:69698FE789F29872F0A4116CD8714255:\ +000000000000000000000000010000000000000000000000 + +00000000000000000000000000000000:3072C09636828285E7135E92B04C3601:\ +000000000000000000000000008000000000000000000000 + +00000000000000000000000000000000:00C19303036D6D3227B9C7AF806BEBDD:\ +000000000000000000000000004000000000000000000000 + +00000000000000000000000000000000:E6B06BC172CA8892C8A04D6717AB08CE:\ +000000000000000000000000002000000000000000000000 + +00000000000000000000000000000000:F7F08E268646EF8B9D728D422195A88B:\ +000000000000000000000000001000000000000000000000 + +00000000000000000000000000000000:E6C0BEE988E017E708FF1A1DCFE38FC8:\ +000000000000000000000000000800000000000000000000 + +00000000000000000000000000000000:33D0841FC04A6394056AC82D68DBFA02:\ +000000000000000000000000000400000000000000000000 + +00000000000000000000000000000000:066AF29F6138FE67D676925DBC375ED1:\ +000000000000000000000000000200000000000000000000 + +00000000000000000000000000000000:60E1109A80F56DBCBCAC75AF9EE3A982:\ +000000000000000000000000000100000000000000000000 + +00000000000000000000000000000000:84E692562A2DBE9452CDC7F5F7DCD4E6:\ +000000000000000000000000000080000000000000000000 + +00000000000000000000000000000000:DA5C0CB7DE7C2A9DEFC76348955FB51B:\ +000000000000000000000000000040000000000000000000 + +00000000000000000000000000000000:26AC1CB6870A598585E211852F9C980A:\ +000000000000000000000000000020000000000000000000 + +00000000000000000000000000000000:49776D30C4A10352FF0FBA170F09F275:\ +000000000000000000000000000010000000000000000000 + +00000000000000000000000000000000:D02E72C408A05C89F80C9EC450419FBF:\ +000000000000000000000000000008000000000000000000 + +00000000000000000000000000000000:993D122B38640477385BBFC79177C212:\ +000000000000000000000000000004000000000000000000 + +00000000000000000000000000000000:1482C5D53BE2F16634C22B9294D6E10B:\ +000000000000000000000000000002000000000000000000 + +00000000000000000000000000000000:4B9518E3188D68E20266DCAA5B26337F:\ +000000000000000000000000000001000000000000000000 + +00000000000000000000000000000000:7D6C9C9F375EDDE4A23D83B8B62E198F:\ +000000000000000000000000000000800000000000000000 + +00000000000000000000000000000000:FCCE30A6961099AD269080FF07A24E1E:\ +000000000000000000000000000000400000000000000000 + +00000000000000000000000000000000:C822629D39268498E02E6E4D642E7921:\ +000000000000000000000000000000200000000000000000 + +00000000000000000000000000000000:B96890D4CC0BD3C41A14D0547F98E077:\ +000000000000000000000000000000100000000000000000 + +00000000000000000000000000000000:78665BAC269A5DB3FFE165526A42F688:\ +000000000000000000000000000000080000000000000000 + +00000000000000000000000000000000:5EB1E7293616CD444011950212E53E78:\ +000000000000000000000000000000040000000000000000 + +00000000000000000000000000000000:FD682F200B2D5D17D177E785EBCE6C08:\ +000000000000000000000000000000020000000000000000 + +00000000000000000000000000000000:EAAEEA26A8AE037C288DDA6791580418:\ +000000000000000000000000000000010000000000000000 + +00000000000000000000000000000000:AA525000B28A88169212096B6D5FF58D:\ +000000000000000000000000000000008000000000000000 + +00000000000000000000000000000000:09C8F1F28B94167498D9377CB9909458:\ +000000000000000000000000000000004000000000000000 + +00000000000000000000000000000000:847E4FFAD40194940A0F7FA0E34739B4:\ +000000000000000000000000000000002000000000000000 + +00000000000000000000000000000000:50DCE06E775C1A6DDA24B2A926C9EF8E:\ +000000000000000000000000000000001000000000000000 + +00000000000000000000000000000000:3896FB03AF06F69CFDDDFBFCDF8E10A7:\ +000000000000000000000000000000000800000000000000 + +00000000000000000000000000000000:FED04C2F49DB4BE1D7BC5E187FB1612B:\ +000000000000000000000000000000000400000000000000 + +00000000000000000000000000000000:69E749DFCA9AC8A990444E9FFB6CBA09:\ +000000000000000000000000000000000200000000000000 + +00000000000000000000000000000000:9B2262EBF59AB552E04D57A72FE6F013:\ +000000000000000000000000000000000100000000000000 + +00000000000000000000000000000000:8FF0BF7F0088916764CF9FF21E1BDA67:\ +000000000000000000000000000000000080000000000000 + +00000000000000000000000000000000:5DE1FF41440B4CA0EEF22C8C3F96F23F:\ +000000000000000000000000000000000040000000000000 + +00000000000000000000000000000000:FEBE3209C8D61E85024DEF2122AF0268:\ +000000000000000000000000000000000020000000000000 + +00000000000000000000000000000000:DB63B702C6E39A283B64B90F36FBD426:\ +000000000000000000000000000000000010000000000000 + +00000000000000000000000000000000:BB364F05F769FFBFE18288BD782D20EB:\ +000000000000000000000000000000000008000000000000 + +00000000000000000000000000000000:8A929CBDE0CD9A9545A08DA2D16BA838:\ +000000000000000000000000000000000004000000000000 + +00000000000000000000000000000000:C5AE232EB4F293497E79E20E436B5A4C:\ +000000000000000000000000000000000002000000000000 + +00000000000000000000000000000000:3979A57AB9EB520E1475D745F897A9A9:\ +000000000000000000000000000000000001000000000000 + +00000000000000000000000000000000:469B440BBD0711C31B9AAA2564ECB68A:\ +000000000000000000000000000000000000800000000000 + +00000000000000000000000000000000:260AC31933A32B75C13364E868FD84DB:\ +000000000000000000000000000000000000400000000000 + +00000000000000000000000000000000:D5A76D2E0D00BE53B401ACB0EE70F8FB:\ +000000000000000000000000000000000000200000000000 + +00000000000000000000000000000000:C3475809C89275DE82F9F22D59A3DA37:\ +000000000000000000000000000000000000100000000000 + +00000000000000000000000000000000:C9B8FBFBF1A120BF47D0F2F48DD23661:\ +000000000000000000000000000000000000080000000000 + +00000000000000000000000000000000:C662358CCCD46730D243DEE03B871DC3:\ +000000000000000000000000000000000000040000000000 + +00000000000000000000000000000000:F5BA874DAE43AD835B3F1344653411B6:\ +000000000000000000000000000000000000020000000000 + +00000000000000000000000000000000:F0185396A6A69D48BBEADFE5B644EED4:\ +000000000000000000000000000000000000010000000000 + +00000000000000000000000000000000:DA0DEC6F13B5AEFC056F5D040C5DA310:\ +000000000000000000000000000000000000008000000000 + +00000000000000000000000000000000:7E1DBDE7B45F9C3E01A285EA575AD5ED:\ +000000000000000000000000000000000000004000000000 + +00000000000000000000000000000000:7A814893FBF78A6F5345F4E250DA454C:\ +000000000000000000000000000000000000002000000000 + +00000000000000000000000000000000:8C8B9E24399A6DF8293B0117307D6084:\ +000000000000000000000000000000000000001000000000 + +00000000000000000000000000000000:11BB87A542E9135ECEB6143A07E0B65E:\ +000000000000000000000000000000000000000800000000 + +00000000000000000000000000000000:495A92DB6E242E0A878EB4AC4C886802:\ +000000000000000000000000000000000000000400000000 + +00000000000000000000000000000000:97A5A7E3DAB800B3D4E7D468B4CCB951:\ +000000000000000000000000000000000000000200000000 + +00000000000000000000000000000000:C74D778D3F0440EB91981C23CC4F5669:\ +000000000000000000000000000000000000000100000000 + +00000000000000000000000000000000:1B485B0E4A063B844BC2AE8B722D0757:\ +000000000000000000000000000000000000000080000000 + +00000000000000000000000000000000:BF9D54F977A978797A4268CFC84132C4:\ +000000000000000000000000000000000000000040000000 + +00000000000000000000000000000000:90C50CB6D84B6A74F3D64A419B0419EA:\ +000000000000000000000000000000000000000020000000 + +00000000000000000000000000000000:776EED1A9849173A7AC46E94C9B2681B:\ +000000000000000000000000000000000000000010000000 + +00000000000000000000000000000000:A42F612CBF53529173E148ABA2B55D63:\ +000000000000000000000000000000000000000008000000 + +00000000000000000000000000000000:6F8B5F268B3DBEA72BF0D1F92B13684E:\ +000000000000000000000000000000000000000004000000 + +00000000000000000000000000000000:9379DA858CEC7AC58856E7DBF79C4757:\ +000000000000000000000000000000000000000002000000 + +00000000000000000000000000000000:17FE109D4638A9E1FAF130D621C160CB:\ +000000000000000000000000000000000000000001000000 + +00000000000000000000000000000000:2BCFAD82613FFD8D9BCBC539C1158BC9:\ +000000000000000000000000000000000000000000800000 + +00000000000000000000000000000000:8EA212BFBBF476CE35939066A7F1757D:\ +000000000000000000000000000000000000000000400000 + +00000000000000000000000000000000:1BFAC7B1B8EB14C26ADA2055E0C9CD36:\ +000000000000000000000000000000000000000000200000 + +00000000000000000000000000000000:9FCA8C1340C47C586D6A2FAD9FAA6833:\ +000000000000000000000000000000000000000000100000 + +00000000000000000000000000000000:D22D10708CBA6566DC096B8ABE3F9679:\ +000000000000000000000000000000000000000000080000 + +00000000000000000000000000000000:1FFC5754FC94465A073B714267DEC18C:\ +000000000000000000000000000000000000000000040000 + +00000000000000000000000000000000:FDED0173236B23DF4DFC1953355AA78E:\ +000000000000000000000000000000000000000000020000 + +00000000000000000000000000000000:FBE9178C4B27E51E24BF17053724AA2F:\ +000000000000000000000000000000000000000000010000 + +00000000000000000000000000000000:F02818D3D58D1F3345594670D3009DF4:\ +000000000000000000000000000000000000000000008000 + +00000000000000000000000000000000:6E148020BAB1DD04492299F6A9D9BA22:\ +000000000000000000000000000000000000000000004000 + +00000000000000000000000000000000:8E045AE3022AF7562106681B2B8CB70E:\ +000000000000000000000000000000000000000000002000 + +00000000000000000000000000000000:2C73832593114BF299424E30C5848625:\ +000000000000000000000000000000000000000000001000 + +00000000000000000000000000000000:127FC7BCF85F44F5041158A5EB3D040C:\ +000000000000000000000000000000000000000000000800 + +00000000000000000000000000000000:B25FABDA9D6E6704F23F33B0D907B762:\ +000000000000000000000000000000000000000000000400 + +00000000000000000000000000000000:21B968BF3EFFC638F54BC1524D8D378F:\ +000000000000000000000000000000000000000000000200 + +00000000000000000000000000000000:18F3BEB5D5A6B6AC512752AAA65EA3BD:\ +000000000000000000000000000000000000000000000100 + +00000000000000000000000000000000:5588729059256CE49AF2DA14EE4C9D00:\ +000000000000000000000000000000000000000000000080 + +00000000000000000000000000000000:A6EBD68D0A6F46DA22CD17D4B55BC4FE:\ +000000000000000000000000000000000000000000000040 + +00000000000000000000000000000000:50434829C09BFB7C174E1BE33642FEFB:\ +000000000000000000000000000000000000000000000020 + +00000000000000000000000000000000:682C20B72DDFE4F678B2379FA25715CA:\ +000000000000000000000000000000000000000000000010 + +00000000000000000000000000000000:925721E954372C9EA115BFF97BBE9A12:\ +000000000000000000000000000000000000000000000008 + +00000000000000000000000000000000:32929E53C8E8D85657B9B55A4911028C:\ +000000000000000000000000000000000000000000000004 + +00000000000000000000000000000000:8EE624F18BF5AA25ACE8667643D0D80D:\ +000000000000000000000000000000000000000000000002 + +00000000000000000000000000000000:30A61DCEB9A951B829DE01414A801807:\ +000000000000000000000000000000000000000000000001 + +00000000000000000000000000000000:785229B51B515F30A1FCC88B969A4E47:\ +8000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B095E0619E70CDF5F4BC6E88079CF22F:\ +4000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:44F32AEAE82516AC8857C1985B7109EC:\ +2000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B2BBE93B433C8F0415B90282E788C071:\ +1000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:9E953EBAA3B13F43F90908B53DAA0C09:\ +0800000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4579140290095FB25B3144444505D203:\ +0400000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5FD5F687596A9AA9EA105A2F7CF59A94:\ +0200000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:005EA3AF8AFF3DDA323148690537853C:\ +0100000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CD8E33C4F06FC0586E821522B2FEB08D:\ +0080000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CABEC07E46D11086778C3E1937CD0797:\ +0040000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:56BA650835E125201400380C4D2D5D99:\ +0020000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:EB48A1B279E95EBF8FAAC13D70F8F452:\ +0010000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E52435C29F7C9687B268C539BF6598B1:\ +0008000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:27785BDF6F6258EAC396BFD0F56BEE82:\ +0004000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CA16B1969FA373F43EF09D19B3379F3F:\ +0002000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6D1B6F14090368034E10CF0C1E4F5744:\ +0001000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:5AE3ABA331C5D765E3D112B1DA09E7BC:\ +0000800000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:767F9CBDA1BA9914EBA40D7A172A4077:\ +0000400000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8FAE713F677A82075D773DB73D58763E:\ +0000200000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:616CA9A15D710CA38FCA9A8E0B16A21C:\ +0000100000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D36754729DB34ECA1ECAC2CE2B381713:\ +0000080000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E68E3A421462A49AF8D7E544F7789301:\ +0000040000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:69B24511DF9BE48CFDB416F08908315F:\ +0000020000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:1329EA7551CE6C335DB924D563694058:\ +0000010000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:74DA788FB7A6172B65FBB62C7ED4FECC:\ +0000008000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:862703854F75F433135601000CD9363B:\ +0000004000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:824D4C002C401677D5785D6C6DA96C68:\ +0000002000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7F9F21E8C45D1E8A843060B963CC628B:\ +0000001000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3F6F7B1157906913B09BD2AE2627C6B0:\ +0000000800000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A1B7E0CC8B69B3C0C6F635F962D0A22F:\ +0000000400000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6FC34DDFF0C74674CE124D85E8A3447F:\ +0000000200000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:436A5D315AF443DEA9BEF8D1E817E7E0:\ +0000000100000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8B0434C9C98CDA4B313DAD6F1E64A943:\ +0000000080000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:AF9BD15EF1535259C63D688BF67119C4:\ +0000000040000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F61EF2509D173E348E01839A26D033FF:\ +0000000020000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:9D37D036C8568D2173654423CC7AAB39:\ +0000000010000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A93D98C055DDAA592390CADB0F0C468D:\ +0000000008000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F19CB2A5067E9FBADBD4F0D103007A54:\ +0000000004000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:83C5D584511836263D8B0DE7CEF0AD16:\ +0000000002000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E09206EB6A5E8AC933BAAB46547E4CD9:\ +0000000001000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0A0EBA6ACED7899AA633CE67E8923936:\ +0000000000800000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C93968EC0EE02DACD3F3EE9AC2320B88:\ +0000000000400000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:64D62934D409F36505EEC3B925BE914D:\ +0000000000200000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BBADB03D5F0FCF375E671F8B009F3AF1:\ +0000000000100000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:DAC60B05A1C3A203C6B4FE882E780079:\ +0000000000080000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8B650EC280BE261CCED5B5FC7F8A9BA7:\ +0000000000040000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:35EB82F0BB6735E2DE661AE4E9E9EE57:\ +0000000000020000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:40B1042CBE87D64DDBEA4BAC8CF1F08C:\ +0000000000010000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:13D46AE35D868401D23C891ED92621EE:\ +0000000000008000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D2C6E9C239B4FA5A1E76D038EA4660F3:\ +0000000000004000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:DE3BC7CDFAF9AB7143E255DC87645F3E:\ +0000000000002000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:8FB6CA966B5ACFB180A296EA5D93711F:\ +0000000000001000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:59F622ACBBA15E522717A9EAF7047949:\ +0000000000000800000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:BB2939FFBD77B308DA93220AD68A21AC:\ +0000000000000400000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:CEBE5EDD9BACF0A0FB75B259DE7097CD:\ +0000000000000200000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3448844E63AC2BD809E254AC3BAA6B3B:\ +0000000000000100000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:49C27499EEC1989626B1E50435BA0273:\ +0000000000000080000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:39E97018F547A8A802578B80952F2457:\ +0000000000000040000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:9934453FBAAE1CB362A0012204967AE8:\ +0000000000000020000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E9C98A03713835EB4497346866791190:\ +0000000000000010000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:E026C858938B47D28A8758CCFAEF0FA8:\ +0000000000000008000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:3A84B0A26CEA6A8D8A94D5B791A0D3E8:\ +0000000000000004000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B054259980B45B9D2D7CD6C13200BAFC:\ +0000000000000002000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:13645DBEDE21FF7C79C06141AD9E4CD1:\ +0000000000000001000000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F29B1370BA8D8CC19AC8DF5DF77F7319:\ +0000000000000000800000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:6A2C94C488D5BD32742F143B2E8D0659:\ +0000000000000000400000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:27A0BF748F513F18D4F7831527A3608F:\ +0000000000000000200000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0B0D61E162A88E04C38C19CA668C2DDC:\ +0000000000000000100000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:4055BA24216EF49FE36E6145A5CD31D4:\ +0000000000000000080000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:99699B31EBBE6ABE1F7B2AFEC86DC7E2:\ +0000000000000000040000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:C8D70448CBA770CD94088F60CBF8C5AC:\ +0000000000000000020000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:56C89F1BA6D3AB20465F01F81D00A894:\ +0000000000000000010000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:919FC5BBFAB8C31F8B2A346FBC2AB282:\ +0000000000000000008000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:FF57E3AB8751DAA252DD0DD917BEAD8B:\ +0000000000000000004000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:90B94853B317FFA8D41F2A32A3A061AB:\ +0000000000000000002000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F4A0257D0CF6C8C87D154746C2C94B52:\ +0000000000000000001000000000000000000000000000000000000000000000 + +00000000000000000000000000000000:03666F848F252B501754773CB68CF3B2:\ +0000000000000000000800000000000000000000000000000000000000000000 + +00000000000000000000000000000000:F3D0941DDC7412A981C5F6CCAB082DC2:\ +0000000000000000000400000000000000000000000000000000000000000000 + +00000000000000000000000000000000:21EDD2A11C57EE97AEADFACEC20A8691:\ +0000000000000000000200000000000000000000000000000000000000000000 + +00000000000000000000000000000000:577CF09B5606F1443E8B57952004C68D:\ +0000000000000000000100000000000000000000000000000000000000000000 + +00000000000000000000000000000000:0CF408A2FBDA07068BDB13A371867FCC:\ +0000000000000000000080000000000000000000000000000000000000000000 + +00000000000000000000000000000000:88542C9E680C27FE8FBE090AD73410B9:\ +0000000000000000000040000000000000000000000000000000000000000000 + +00000000000000000000000000000000:7A8BA6DC89A1AD4385D0696AFDD89496:\ +0000000000000000000020000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B84FA0FA046D5D77EA94CF3E8FDED147:\ +0000000000000000000010000000000000000000000000000000000000000000 + +00000000000000000000000000000000:D73CB079FB7101C933176352A93BB028:\ +0000000000000000000008000000000000000000000000000000000000000000 + +00000000000000000000000000000000:A7C8C1A59E141D608BC91BB69E7B2859:\ +0000000000000000000004000000000000000000000000000000000000000000 + +00000000000000000000000000000000:B2DA67AFE49B33E5EDFAF148A17BF06B:\ +0000000000000000000002000000000000000000000000000000000000000000 + +00000000000000000000000000000000:AC2DB35ED86D358616648D22B52DF012:\ +0000000000000000000001000000000000000000000000000000000000000000 + +00000000000000000000000000000000:662EA9D88A9A2C89581502EAAAD074D5:\ +0000000000000000000000800000000000000000000000000000000000000000 + +00000000000000000000000000000000:773A30DFDA8EBCE50EDFB925343C9ECC:\ +0000000000000000000000400000000000000000000000000000000000000000 + +00000000000000000000000000000000:10B7242D9C7CA610C20F1183BB949514:\ +0000000000000000000000200000000000000000000000000000000000000000 + +00000000000000000000000000000000:B7DF971F9C3444EFCC13210292126942:\ +0000000000000000000000100000000000000000000000000000000000000000 + +00000000000000000000000000000000:13F7406746C6E0CD5666EC04C0E540E2:\ +0000000000000000000000080000000000000000000000000000000000000000 + +00000000000000000000000000000000:9382384DCAF80CF537E24FC5F2F71A8A:\ +0000000000000000000000040000000000000000000000000000000000000000 + +00000000000000000000000000000000:3D5819934619E09F10E90C4EA7F30F40:\ +0000000000000000000000020000000000000000000000000000000000000000 + +00000000000000000000000000000000:710446D0A254F68975CD6AAAE92212FD:\ +0000000000000000000000010000000000000000000000000000000000000000 + +00000000000000000000000000000000:0A44FDEAA17E5F3E536A08D7A5B3267B:\ +0000000000000000000000008000000000000000000000000000000000000000 + +00000000000000000000000000000000:BAC72F53EE39296D3A23B126F8D8B20B:\ +0000000000000000000000004000000000000000000000000000000000000000 + +00000000000000000000000000000000:88C342961D0EE83902CB78C29539923D:\ +0000000000000000000000002000000000000000000000000000000000000000 + +00000000000000000000000000000000:CF3B48A6351C4561752D6A209F93A30F:\ +0000000000000000000000001000000000000000000000000000000000000000 + +00000000000000000000000000000000:957B107D23F3694F3FFD9957BBE13168:\ +0000000000000000000000000800000000000000000000000000000000000000 + +00000000000000000000000000000000:23675E18C1C66B483D55E14AC7F9CC80:\ +0000000000000000000000000400000000000000000000000000000000000000 + +00000000000000000000000000000000:955B8619F99F7609201CEEB338F32795:\ +0000000000000000000000000200000000000000000000000000000000000000 + +00000000000000000000000000000000:9F2BCB0C28768DA3B76206979B14EBC2:\ +0000000000000000000000000100000000000000000000000000000000000000 + +00000000000000000000000000000000:258F95A0E86EE0EE8FC020B4A01900F2:\ +0000000000000000000000000080000000000000000000000000000000000000 + +00000000000000000000000000000000:FD7B1DD7C7FE279E6A5E2926DD890B5E:\ +0000000000000000000000000040000000000000000000000000000000000000 + +00000000000000000000000000000000:59CF38A7C863C623991B5392944CB43C:\ +0000000000000000000000000020000000000000000000000000000000000000 + +00000000000000000000000000000000:27BCC9206AEC78DA48C1E9AB8D1A7A07:\ +0000000000000000000000000010000000000000000000000000000000000000 + +00000000000000000000000000000000:62D8460820B18811DEBB617DE7B8EC8C:\ +0000000000000000000000000008000000000000000000000000000000000000 + +00000000000000000000000000000000:782D8A4D30EE841EDB2E7E88C63B851A:\ +0000000000000000000000000004000000000000000000000000000000000000 + +00000000000000000000000000000000:4D10D177334397F49211BCB10F207905:\ +0000000000000000000000000002000000000000000000000000000000000000 + +00000000000000000000000000000000:C8E608BAFE61254A0DDF866BB4D063DD:\ +0000000000000000000000000001000000000000000000000000000000000000 + +00000000000000000000000000000000:05DDAB3DAEA0C64C1077BE22DA7ACDD4:\ +0000000000000000000000000000800000000000000000000000000000000000 + +00000000000000000000000000000000:951388F2BE1DD7013A00327FC6DB7905:\ +0000000000000000000000000000400000000000000000000000000000000000 + +00000000000000000000000000000000:62F8283651EFDF475DE8511EA7256AD6:\ +0000000000000000000000000000200000000000000000000000000000000000 + +00000000000000000000000000000000:5B259EEE6B19EE12D4CE20D2F38D4BCF:\ +0000000000000000000000000000100000000000000000000000000000000000 + +00000000000000000000000000000000:704414E13DCAD9DF7F593F630E68E13C:\ +0000000000000000000000000000080000000000000000000000000000000000 + +00000000000000000000000000000000:41AD9DAAC24ECCBB454DBAF75D5B9989:\ +0000000000000000000000000000040000000000000000000000000000000000 + +00000000000000000000000000000000:919C54C126B54D7A570D8ABA9FCE5D08:\ +0000000000000000000000000000020000000000000000000000000000000000 + +00000000000000000000000000000000:BC665541FF0F2E86DBDF4444C01AC0EA:\ +0000000000000000000000000000010000000000000000000000000000000000 + +00000000000000000000000000000000:FD30E2D851211506C112D5701B859BC6:\ +0000000000000000000000000000008000000000000000000000000000000000 + +00000000000000000000000000000000:7DB7B15E4ACBDBB0BFF4C4EAEDC2231E:\ +0000000000000000000000000000004000000000000000000000000000000000 + +00000000000000000000000000000000:F0AFDED56AD72D4C1E57A66EEDF4816E:\ +0000000000000000000000000000002000000000000000000000000000000000 + +00000000000000000000000000000000:E53B053D9B2E06656138D4A1EFA58888:\ +0000000000000000000000000000001000000000000000000000000000000000 + +00000000000000000000000000000000:4DABE13A3E656E95150440F81DD92666:\ +0000000000000000000000000000000800000000000000000000000000000000 + +00000000000000000000000000000000:175D44DFDE1EAD6E0E6862B511AA7007:\ +0000000000000000000000000000000400000000000000000000000000000000 + +00000000000000000000000000000000:09B690F493F5C779E8B6ACD09667A997:\ +0000000000000000000000000000000200000000000000000000000000000000 + +00000000000000000000000000000000:68D0E4CCA0119EED57ABF3C7574BDA8B:\ +0000000000000000000000000000000100000000000000000000000000000000 + +00000000000000000000000000000000:12C00618DA7EBA5EFA5E58D2696D891F:\ +0000000000000000000000000000000080000000000000000000000000000000 + +00000000000000000000000000000000:5DCE21AF0D23BC5AEFD4EA331B16219A:\ +0000000000000000000000000000000040000000000000000000000000000000 + +00000000000000000000000000000000:A5D7135A053B904D44B40E4E21693751:\ +0000000000000000000000000000000020000000000000000000000000000000 + +00000000000000000000000000000000:3257CEC675BF755FEE67A44D7EDF2731:\ +0000000000000000000000000000000010000000000000000000000000000000 + +00000000000000000000000000000000:324D30DDC6979F17A3BEAEA3A76AD44C:\ +0000000000000000000000000000000008000000000000000000000000000000 + +00000000000000000000000000000000:A1AA0E04E2B61861796FD2AA30FBEB05:\ +0000000000000000000000000000000004000000000000000000000000000000 + +00000000000000000000000000000000:90CA81DF4000404B567F5CFA9D193CB3:\ +0000000000000000000000000000000002000000000000000000000000000000 + +00000000000000000000000000000000:A2E6864259483D059B57BB921B7FBD99:\ +0000000000000000000000000000000001000000000000000000000000000000 + +00000000000000000000000000000000:545690C09C8C396F1273510DA9065C12:\ +0000000000000000000000000000000000800000000000000000000000000000 + +00000000000000000000000000000000:16D86FCC5910E2DD0CEA4DD5219B2D03:\ +0000000000000000000000000000000000400000000000000000000000000000 + +00000000000000000000000000000000:EC4114C19DD5711CD927B0DBE34AAB4B:\ +0000000000000000000000000000000000200000000000000000000000000000 + +00000000000000000000000000000000:A78C62D8FD439E5B10A7EF436714AC22:\ +0000000000000000000000000000000000100000000000000000000000000000 + +00000000000000000000000000000000:BA5D708CBA34F782DA00C7643C971DB9:\ +0000000000000000000000000000000000080000000000000000000000000000 + +00000000000000000000000000000000:7DB9ADCFA26C1E784E7F485BD0A0A52C:\ +0000000000000000000000000000000000040000000000000000000000000000 + +00000000000000000000000000000000:8A025CED99AF1047C5345358A291CDBB:\ +0000000000000000000000000000000000020000000000000000000000000000 + +00000000000000000000000000000000:187A1824D390AD2798E4F2264E5F1F21:\ +0000000000000000000000000000000000010000000000000000000000000000 + +00000000000000000000000000000000:BA28DE5C32353C65B97A59889E7A7A40:\ +0000000000000000000000000000000000008000000000000000000000000000 + +00000000000000000000000000000000:5D486AB86A883029EC74916851FFFA11:\ +0000000000000000000000000000000000004000000000000000000000000000 + +00000000000000000000000000000000:F9C79D54CEEE6170B195F4D30FA63FE0:\ +0000000000000000000000000000000000002000000000000000000000000000 + +00000000000000000000000000000000:96B8429F476485F8CC2E204534A8B64E:\ +0000000000000000000000000000000000001000000000000000000000000000 + +00000000000000000000000000000000:13061D65FEF26F5ACAAF3B55FDB98C36:\ +0000000000000000000000000000000000000800000000000000000000000000 + +00000000000000000000000000000000:C72DC86F70B40169B3456783A611DAE9:\ +0000000000000000000000000000000000000400000000000000000000000000 + +00000000000000000000000000000000:82AA2DB6FEE9212968D8282A1BF3242B:\ +0000000000000000000000000000000000000200000000000000000000000000 + +00000000000000000000000000000000:220C8B197F54F8E86DAE575B07A570EF:\ +0000000000000000000000000000000000000100000000000000000000000000 + +00000000000000000000000000000000:873C47F6F75BE9F710F91F2C54A69A7A:\ +0000000000000000000000000000000000000080000000000000000000000000 + +00000000000000000000000000000000:0392FA7BB908FEF23774772F74AC968D:\ +0000000000000000000000000000000000000040000000000000000000000000 + +00000000000000000000000000000000:A94203746A266C5744C16BF4E8DFA6D7:\ +0000000000000000000000000000000000000020000000000000000000000000 + +00000000000000000000000000000000:D3BA78AD6B01CC7221FA7778699C8316:\ +0000000000000000000000000000000000000010000000000000000000000000 + +00000000000000000000000000000000:994FDCC09C25400D14C05117B936EECD:\ +0000000000000000000000000000000000000008000000000000000000000000 + +00000000000000000000000000000000:4012F67B2A0BEF2623CA6AC5B054BE62:\ +0000000000000000000000000000000000000004000000000000000000000000 + +00000000000000000000000000000000:1134AF65E6D3D5E3D3C23A499EE2F677:\ +0000000000000000000000000000000000000002000000000000000000000000 + +00000000000000000000000000000000:6B35A344BD8DFD4002F5F22EA288F8E6:\ +0000000000000000000000000000000000000001000000000000000000000000 + +00000000000000000000000000000000:D293D438C563B8EB3FF26E23A7323B74:\ +0000000000000000000000000000000000000000800000000000000000000000 + +00000000000000000000000000000000:8085B7A7B939FA37BC4E1D746E9F9B37:\ +0000000000000000000000000000000000000000400000000000000000000000 + +00000000000000000000000000000000:D628AD150E15F413010BE15E391D3F48:\ +0000000000000000000000000000000000000000200000000000000000000000 + +00000000000000000000000000000000:A5C2AC88B6FD4C57CB4F2C2920A584EF:\ +0000000000000000000000000000000000000000100000000000000000000000 + +00000000000000000000000000000000:D7F5183F6BAB04B87A1ABAA3914DA848:\ +0000000000000000000000000000000000000000080000000000000000000000 + +00000000000000000000000000000000:3B2116BD2E362FC8985A0F0C618DF58A:\ +0000000000000000000000000000000000000000040000000000000000000000 + +00000000000000000000000000000000:BF31E8DE8342A32BBD80A8F91507BADA:\ +0000000000000000000000000000000000000000020000000000000000000000 + +00000000000000000000000000000000:AA04A56C13507AE5137657546766AE2D:\ +0000000000000000000000000000000000000000010000000000000000000000 + +00000000000000000000000000000000:72B9D7628AB21DF89666E50517C50574:\ +0000000000000000000000000000000000000000008000000000000000000000 + +00000000000000000000000000000000:2B8DE8D2D3332E6A30215ACC10A69847:\ +0000000000000000000000000000000000000000004000000000000000000000 + +00000000000000000000000000000000:AC421C73A789D79B452623DAFD3D6D0B:\ +0000000000000000000000000000000000000000002000000000000000000000 + +00000000000000000000000000000000:995207D8CF8C10904C0F47652C9C4287:\ +0000000000000000000000000000000000000000001000000000000000000000 + +00000000000000000000000000000000:F83BD19A357BD7901C0E8FBEFCF857ED:\ +0000000000000000000000000000000000000000000800000000000000000000 + +00000000000000000000000000000000:F42BB427C894A072C861C1425CBD71BC:\ +0000000000000000000000000000000000000000000400000000000000000000 + +00000000000000000000000000000000:3D1EC73B166DC0120DDF24267907C0F9:\ +0000000000000000000000000000000000000000000200000000000000000000 + +00000000000000000000000000000000:8EF136AF5D7D1B513FB59FA21F7837A1:\ +0000000000000000000000000000000000000000000100000000000000000000 + +00000000000000000000000000000000:EB4BBA7F94CE9429255A583D2F9810CD:\ +0000000000000000000000000000000000000000000080000000000000000000 + +00000000000000000000000000000000:5FE1C3BCD24818948514CB5A32FFD0A1:\ +0000000000000000000000000000000000000000000040000000000000000000 + +00000000000000000000000000000000:A990117E78D1C5BD7833B96A4A180744:\ +0000000000000000000000000000000000000000000020000000000000000000 + +00000000000000000000000000000000:E63684CDC37E6768C45012EA00D008E4:\ +0000000000000000000000000000000000000000000010000000000000000000 + +00000000000000000000000000000000:78B711F290DA924CAF1E4F1E11A08F4F:\ +0000000000000000000000000000000000000000000008000000000000000000 + +00000000000000000000000000000000:85B7F0D391AF9268643D9C0B72433A99:\ +0000000000000000000000000000000000000000000004000000000000000000 + +00000000000000000000000000000000:F51410475B33FBD3DB2117B5C17C82D4:\ +0000000000000000000000000000000000000000000002000000000000000000 + +00000000000000000000000000000000:A3C5BF72F39940DC7DAFB474A77A6114:\ +0000000000000000000000000000000000000000000001000000000000000000 + +00000000000000000000000000000000:4EFB0E18FB2F96FB6F81514BCE0A7BBD:\ +0000000000000000000000000000000000000000000000800000000000000000 + +00000000000000000000000000000000:10112F5ABBF246996860B843FC7159F5:\ +0000000000000000000000000000000000000000000000400000000000000000 + +00000000000000000000000000000000:94A91373701569B8C21487A7BDB164B6:\ +0000000000000000000000000000000000000000000000200000000000000000 + +00000000000000000000000000000000:A466821BD64F552C0610ADB737C562CD:\ +0000000000000000000000000000000000000000000000100000000000000000 + +00000000000000000000000000000000:511BE2BA9F2A272CA2F5C1D0F3E249C1:\ +0000000000000000000000000000000000000000000000080000000000000000 + +00000000000000000000000000000000:5578CCF8B92D48363EED4601661EB56E:\ +0000000000000000000000000000000000000000000000040000000000000000 + +00000000000000000000000000000000:BF90E87173A45115C811B6319C24FC4A:\ +0000000000000000000000000000000000000000000000020000000000000000 + +00000000000000000000000000000000:8029EE840D130319330B432D95DB9AA7:\ +0000000000000000000000000000000000000000000000010000000000000000 + +00000000000000000000000000000000:19D6D9F45582481A573D77917E778F3C:\ +0000000000000000000000000000000000000000000000008000000000000000 + +00000000000000000000000000000000:556D552FDE7C64227E2B72776488D6C1:\ +0000000000000000000000000000000000000000000000004000000000000000 + +00000000000000000000000000000000:3E81B51A214CC1F1CF6F35F9106A84BC:\ +0000000000000000000000000000000000000000000000002000000000000000 + +00000000000000000000000000000000:4E48243857ECB700F8F16872E0BB4FA9:\ +0000000000000000000000000000000000000000000000001000000000000000 + +00000000000000000000000000000000:681654DF6668CDDF1D3D604483AB483B:\ +0000000000000000000000000000000000000000000000000800000000000000 + +00000000000000000000000000000000:BD6CEEFD85A336E4F12D42076573ECA2:\ +0000000000000000000000000000000000000000000000000400000000000000 + +00000000000000000000000000000000:7488F9790FEC8AAE2AADDF6A600629B3:\ +0000000000000000000000000000000000000000000000000200000000000000 + +00000000000000000000000000000000:669C36695C33B63F16077CAE9AA940AA:\ +0000000000000000000000000000000000000000000000000100000000000000 + +00000000000000000000000000000000:7CE998A357384159C9B34A9A8AC7DF78:\ +0000000000000000000000000000000000000000000000000080000000000000 + +00000000000000000000000000000000:51BE07BA8106A19CCC2005B8B3932FBF:\ +0000000000000000000000000000000000000000000000000040000000000000 + +00000000000000000000000000000000:2634245A6EC3F17A35B7FE1D3E17F769:\ +0000000000000000000000000000000000000000000000000020000000000000 + +00000000000000000000000000000000:24D4114760BCE04C0109C06CCE199F6C:\ +0000000000000000000000000000000000000000000000000010000000000000 + +00000000000000000000000000000000:3F055452FCD596C6D588BD48BB5D5080:\ +0000000000000000000000000000000000000000000000000008000000000000 + +00000000000000000000000000000000:A1D97F66DEF90DE14CC2BFAFF09286BB:\ +0000000000000000000000000000000000000000000000000004000000000000 + +00000000000000000000000000000000:80442DC4EBFB53B86E232D886CA166B9:\ +0000000000000000000000000000000000000000000000000002000000000000 + +00000000000000000000000000000000:76A593802C6A691152E8A04E5DE2D05A:\ +0000000000000000000000000000000000000000000000000001000000000000 + +00000000000000000000000000000000:F923A147E00807D58FB9C686E01F7E07:\ +0000000000000000000000000000000000000000000000000000800000000000 + +00000000000000000000000000000000:8EA3B396D561A3CFCE729A0B59647760:\ +0000000000000000000000000000000000000000000000000000400000000000 + +00000000000000000000000000000000:4AA735D710704790C060BAD696DACABE:\ +0000000000000000000000000000000000000000000000000000200000000000 + +00000000000000000000000000000000:7F7C322D82557737F5407A797069B711:\ +0000000000000000000000000000000000000000000000000000100000000000 + +00000000000000000000000000000000:5094418C55B7D591EFDB7097CB95B16D:\ +0000000000000000000000000000000000000000000000000000080000000000 + +00000000000000000000000000000000:CC014984ABDFB760A835846668340929:\ +0000000000000000000000000000000000000000000000000000040000000000 + +00000000000000000000000000000000:18F86EA6C633228579C5728FF070AC21:\ +0000000000000000000000000000000000000000000000000000020000000000 + +00000000000000000000000000000000:AFCF921E4FA24FDEF85EDAC12CD479F1:\ +0000000000000000000000000000000000000000000000000000010000000000 + +00000000000000000000000000000000:684085D0BE8AE0D617B2EFEF62CAAC93:\ +0000000000000000000000000000000000000000000000000000008000000000 + +00000000000000000000000000000000:04C7B0268EAEFED098C815935D868CF9:\ +0000000000000000000000000000000000000000000000000000004000000000 + +00000000000000000000000000000000:39AE859D255487A68093A376D358BBC2:\ +0000000000000000000000000000000000000000000000000000002000000000 + +00000000000000000000000000000000:F1218B59E947816041B21AC28685EF36:\ +0000000000000000000000000000000000000000000000000000001000000000 + +00000000000000000000000000000000:B9BE024D06447F8965E480B33975E36F:\ +0000000000000000000000000000000000000000000000000000000800000000 + +00000000000000000000000000000000:24ECD5B3178150233BD38A4B9F8EBC86:\ +0000000000000000000000000000000000000000000000000000000400000000 + +00000000000000000000000000000000:7AD12485E896037A8D1A4ABE8A80B9BB:\ +0000000000000000000000000000000000000000000000000000000200000000 + +00000000000000000000000000000000:CEC561C6F4C45CC944371E5D1C18EDF1:\ +0000000000000000000000000000000000000000000000000000000100000000 + +00000000000000000000000000000000:F4B1088B0858A3737DF2C90FD919D1D4:\ +0000000000000000000000000000000000000000000000000000000080000000 + +00000000000000000000000000000000:5EA6D1B9881CE230B8EABAC59B7F5393:\ +0000000000000000000000000000000000000000000000000000000040000000 + +00000000000000000000000000000000:8023134FAC8BF5FDA86368BDA618AEF7:\ +0000000000000000000000000000000000000000000000000000000020000000 + +00000000000000000000000000000000:D37285234A927061BEC9F8AAE0E796C8:\ +0000000000000000000000000000000000000000000000000000000010000000 + +00000000000000000000000000000000:68AC18DB2FBF0A4A095A4B3344BF035D:\ +0000000000000000000000000000000000000000000000000000000008000000 + +00000000000000000000000000000000:563868079C5DF91E3B47B370B0BBB820:\ +0000000000000000000000000000000000000000000000000000000004000000 + +00000000000000000000000000000000:86C3BB221834F7507505434E4F98DC92:\ +0000000000000000000000000000000000000000000000000000000002000000 + +00000000000000000000000000000000:FD8220818731607D8B69AC5963D0FAC9:\ +0000000000000000000000000000000000000000000000000000000001000000 + +00000000000000000000000000000000:550726375ABB0F9A7C010DC4E47833F9:\ +0000000000000000000000000000000000000000000000000000000000800000 + +00000000000000000000000000000000:8AB5E8973A5D6648517D151295091C0E:\ +0000000000000000000000000000000000000000000000000000000000400000 + +00000000000000000000000000000000:338BB4B5569AA06411B9911381F350B2:\ +0000000000000000000000000000000000000000000000000000000000200000 + +00000000000000000000000000000000:332D696EC49DF4B58C5FA9CC84773F47:\ +0000000000000000000000000000000000000000000000000000000000100000 + +00000000000000000000000000000000:DEB5AC8F895AFF45BA5815D4912D8371:\ +0000000000000000000000000000000000000000000000000000000000080000 + +00000000000000000000000000000000:89A49D3AB772D0FDAE05FC692EAF6C7B:\ +0000000000000000000000000000000000000000000000000000000000040000 + +00000000000000000000000000000000:02116E6AEFC21A4D4D64CA27AB7AF31E:\ +0000000000000000000000000000000000000000000000000000000000020000 + +00000000000000000000000000000000:58F79FF1810CA4B0E0178F7D9C24A581:\ +0000000000000000000000000000000000000000000000000000000000010000 + +00000000000000000000000000000000:686FB1ED659D9BF17DA2BB79AC636C93:\ +0000000000000000000000000000000000000000000000000000000000008000 + +00000000000000000000000000000000:1C5C176C4F5796B2C34D2A12858EB511:\ +0000000000000000000000000000000000000000000000000000000000004000 + +00000000000000000000000000000000:2A94B92CC9C4776817C0A77D49E24F22:\ +0000000000000000000000000000000000000000000000000000000000002000 + +00000000000000000000000000000000:890583A6C9549A3DCAFBD54BF391BC8F:\ +0000000000000000000000000000000000000000000000000000000000001000 + +00000000000000000000000000000000:EA88A883197E483B4AA16316EA97CCBB:\ +0000000000000000000000000000000000000000000000000000000000000800 + +00000000000000000000000000000000:CC5732CEB99A0A0353BABA6432BCBE9F:\ +0000000000000000000000000000000000000000000000000000000000000400 + +00000000000000000000000000000000:88811B506D565779F09DE9BDF8702BD8:\ +0000000000000000000000000000000000000000000000000000000000000200 + +00000000000000000000000000000000:E11FEE3AD4A9A03956704B58720C92DD:\ +0000000000000000000000000000000000000000000000000000000000000100 + +00000000000000000000000000000000:644555DFB9CE8EDAF888EE142B5577F1:\ +0000000000000000000000000000000000000000000000000000000000000080 + +00000000000000000000000000000000:716E2BBCBD8FF7E7335784B767F27CA9:\ +0000000000000000000000000000000000000000000000000000000000000040 + +00000000000000000000000000000000:83588863F183ECE04E95629A322F9A09:\ +0000000000000000000000000000000000000000000000000000000000000020 + +00000000000000000000000000000000:5E2833EC95ACE6B93AF28C6FCDBCE5D5:\ +0000000000000000000000000000000000000000000000000000000000000010 + +00000000000000000000000000000000:B3EFCF17F0E1B275D413DD4D3A5CAE68:\ +0000000000000000000000000000000000000000000000000000000000000008 + +00000000000000000000000000000000:3C943E1A2E7E56E4B185302D2D5C5DBD:\ +0000000000000000000000000000000000000000000000000000000000000004 + +00000000000000000000000000000000:8CB4E2498382B523DCE6F7C17C91400B:\ +0000000000000000000000000000000000000000000000000000000000000002 + +00000000000000000000000000000000:85F345366155D13F8F257734D2CBD6D9:\ +0000000000000000000000000000000000000000000000000000000000000001 + +80000000000000000000000000000000:73B9FF14CF2589901FF52A0D6F4B7EDE:\ +00000000000000000000000000000000 + +40000000000000000000000000000000:F5A9150BAB6D6AEBD6B4F97D9E93B28B:\ +00000000000000000000000000000000 + +20000000000000000000000000000000:C30F8B221FD6D3996F973CDCDC6E305C:\ +00000000000000000000000000000000 + +10000000000000000000000000000000:D6A531FE826CB0454F2D567A20018CB7:\ +00000000000000000000000000000000 + +08000000000000000000000000000000:B62324BE427332A6089C7BE40D40292E:\ +00000000000000000000000000000000 + +04000000000000000000000000000000:929B4789E9D6940C9A158880CA21C0E2:\ +00000000000000000000000000000000 + +02000000000000000000000000000000:C14830DB50BA7221B27DC033B0D8D331:\ +00000000000000000000000000000000 + +01000000000000000000000000000000:743342B02EBE647AE47092D435FA60F6:\ +00000000000000000000000000000000 + +00800000000000000000000000000000:4F02AF45C09373D879CD01506A4E7D14:\ +00000000000000000000000000000000 + +00400000000000000000000000000000:92BC9085AB0BA8FFEC2EA6D360864817:\ +00000000000000000000000000000000 + +00200000000000000000000000000000:670A4ED16EA1BDE23E16CB52DBD31CB0:\ +00000000000000000000000000000000 + +00100000000000000000000000000000:A52335AA9F42886084E21400DE48B62F:\ +00000000000000000000000000000000 + +00080000000000000000000000000000:A5A240EBFED79F38F31497EA4C9CFCDA:\ +00000000000000000000000000000000 + +00040000000000000000000000000000:46A64A07123E1212FE9E2F30EDFD80FF:\ +00000000000000000000000000000000 + +00020000000000000000000000000000:20C9F20A8045AEDEE9D6E1CDA948339A:\ +00000000000000000000000000000000 + +00010000000000000000000000000000:DF1606EEF4FEE3F4FC9EC26E2AB388AB:\ +00000000000000000000000000000000 + +00008000000000000000000000000000:6758972B3171F0EA46304542776337FC:\ +00000000000000000000000000000000 + +00004000000000000000000000000000:EC9B591DB8476C26C3CFDA618C1DBBD8:\ +00000000000000000000000000000000 + +00002000000000000000000000000000:651551E741359E0A10BB4EE6A1C07C02:\ +00000000000000000000000000000000 + +00001000000000000000000000000000:88BC2BF1F8A55562B95F8547C9A19E56:\ +00000000000000000000000000000000 + +00000800000000000000000000000000:1A6CCCBD8D40AA14810ED615A6A6E24D:\ +00000000000000000000000000000000 + +00000400000000000000000000000000:7B68DA568ABA5AE69D93C915E37DEE91:\ +00000000000000000000000000000000 + +00000200000000000000000000000000:EC3922A728DA9E4C212D910E5C4AE632:\ +00000000000000000000000000000000 + +00000100000000000000000000000000:5BAC94C97A4069400875A5ABC07BCB17:\ +00000000000000000000000000000000 + +00000080000000000000000000000000:F3B4662918864BA94C1CF79C73B1F259:\ +00000000000000000000000000000000 + +00000040000000000000000000000000:6FBF5A9A93EFA6640AFB80D9A2D22CF7:\ +00000000000000000000000000000000 + +00000020000000000000000000000000:74139BD645DED7690F606490CCA44DD2:\ +00000000000000000000000000000000 + +00000010000000000000000000000000:B20F456519D353AF91C012793576F9B8:\ +00000000000000000000000000000000 + +00000008000000000000000000000000:C0AD52D4B4F67A9333A5E4B1B1176EEC:\ +00000000000000000000000000000000 + +00000004000000000000000000000000:797224710FD09F9830B0F160AE9051E8:\ +00000000000000000000000000000000 + +00000002000000000000000000000000:73669B64C292F4461FAA3A3D091D08DA:\ +00000000000000000000000000000000 + +00000001000000000000000000000000:EFE0E893CE04008935CB7D43A7DC9ADD:\ +00000000000000000000000000000000 + +00000000800000000000000000000000:3B0A2D3B236324221F81BFCAE45217D8:\ +00000000000000000000000000000000 + +00000000400000000000000000000000:CE6F569FC89127B1AE19466FA36DD6E4:\ +00000000000000000000000000000000 + +00000000200000000000000000000000:6037FE38896C05745C58C28CDF7FF386:\ +00000000000000000000000000000000 + +00000000100000000000000000000000:92F5817D0BE37241F9292F6FF918A8E5:\ +00000000000000000000000000000000 + +00000000080000000000000000000000:20C9A2A684563495C255A5751C1AC01E:\ +00000000000000000000000000000000 + +00000000040000000000000000000000:AC6B6DB6D069B6895F2283435D33BD43:\ +00000000000000000000000000000000 + +00000000020000000000000000000000:F9354B12C2366F1CE10F9A0550281267:\ +00000000000000000000000000000000 + +00000000010000000000000000000000:684FDA9FCF3B3B5648A452CDA07CF002:\ +00000000000000000000000000000000 + +00000000008000000000000000000000:9BE294C97C2A963006A2BD4541DC7DB5:\ +00000000000000000000000000000000 + +00000000004000000000000000000000:A984F6F70E93FE65C8798C01D4E5D30C:\ +00000000000000000000000000000000 + +00000000002000000000000000000000:E06A6CE2D74DB3D78E8F5D991C322B87:\ +00000000000000000000000000000000 + +00000000001000000000000000000000:646771D16BAEDAC3F8E9D00C212518A2:\ +00000000000000000000000000000000 + +00000000000800000000000000000000:9D2D410DC6F3BEC913D64BDBDEF3285E:\ +00000000000000000000000000000000 + +00000000000400000000000000000000:6850AFECD8064E77F4F6944BDF5B324D:\ +00000000000000000000000000000000 + +00000000000200000000000000000000:2E341142550F73F4C8E9DCCC5931A158:\ +00000000000000000000000000000000 + +00000000000100000000000000000000:0CA58E149C2120A8EBF9A7885A89ACBC:\ +00000000000000000000000000000000 + +00000000000080000000000000000000:41EACB7F6B5F9E3E3D299CA416EA2C59:\ +00000000000000000000000000000000 + +00000000000040000000000000000000:C4D45503484DBC83CB52D3DB4AD0A7CC:\ +00000000000000000000000000000000 + +00000000000020000000000000000000:CC52B159C2BCF87EE5F4926C6E7B7744:\ +00000000000000000000000000000000 + +00000000000010000000000000000000:7E8A4023B8890A2DBF0D54E330FDF2A2:\ +00000000000000000000000000000000 + +00000000000008000000000000000000:B05E771660493DCE3A275B0252D343A7:\ +00000000000000000000000000000000 + +00000000000004000000000000000000:83D0034D231E179207F6A97FB1457FEB:\ +00000000000000000000000000000000 + +00000000000002000000000000000000:7132BF130E8732C41F68107F49153FF2:\ +00000000000000000000000000000000 + +00000000000001000000000000000000:B93021593B9EA2588F16E87D3C5DE0EC:\ +00000000000000000000000000000000 + +00000000000000800000000000000000:26031449FBD6C84201B0BFB53B2C23CA:\ +00000000000000000000000000000000 + +00000000000000400000000000000000:AFC8E9D2B9BFED9CE0B898F28607DF4C:\ +00000000000000000000000000000000 + +00000000000000200000000000000000:C5094DE7E36CAEBE1B76EC3AC2C875F5:\ +00000000000000000000000000000000 + +00000000000000100000000000000000:7DF8910A2D256FFB5D56FD1358F131FE:\ +00000000000000000000000000000000 + +00000000000000080000000000000000:D93F84C1519D6627465E984675AA800B:\ +00000000000000000000000000000000 + +00000000000000040000000000000000:5F1861F1523CDA0C95644B0C4F2EE6D1:\ +00000000000000000000000000000000 + +00000000000000020000000000000000:FC5C4893AD148E4134EAEB3B1B190E29:\ +00000000000000000000000000000000 + +00000000000000010000000000000000:80D1463F9E9416A143B2FF69DE629510:\ +00000000000000000000000000000000 + +00000000000000008000000000000000:F16305404AE6266C619DC8ACA2D492E1:\ +00000000000000000000000000000000 + +00000000000000004000000000000000:3B2554E422F9CEBB8271D7A48C94E03F:\ +00000000000000000000000000000000 + +00000000000000002000000000000000:18B039EECB68A05CBF8C65EE85BDC4BC:\ +00000000000000000000000000000000 + +00000000000000001000000000000000:BB26ABB17AD5482B1DCC4018E7DB0950:\ +00000000000000000000000000000000 + +00000000000000000800000000000000:7E7AC0FD5B98157CEAD4BBAB643BE4CA:\ +00000000000000000000000000000000 + +00000000000000000400000000000000:BD8A3B64849E54CC2D8379DCA9E42FDD:\ +00000000000000000000000000000000 + +00000000000000000200000000000000:58C388DFB41FF3E14394C73FD8AAC56A:\ +00000000000000000000000000000000 + +00000000000000000100000000000000:944B295E23C5B2542DED57A155D33EF8:\ +00000000000000000000000000000000 + +00000000000000000080000000000000:067B4DD07DCA1292CFF0D80D75BDACA5:\ +00000000000000000000000000000000 + +00000000000000000040000000000000:7D7344373196C5B30676F270BFC90B07:\ +00000000000000000000000000000000 + +00000000000000000020000000000000:988C5164A82254B29326C98812A716CE:\ +00000000000000000000000000000000 + +00000000000000000010000000000000:8FFD48787C28542E0450FAD4CBAD34D0:\ +00000000000000000000000000000000 + +00000000000000000008000000000000:C50E7CD771628964E708425160FFB02C:\ +00000000000000000000000000000000 + +00000000000000000004000000000000:B293B07F92D68C18FEC1466996B78020:\ +00000000000000000000000000000000 + +00000000000000000002000000000000:DE21B2A6C8D7B90A7714DB3EF5209A6B:\ +00000000000000000000000000000000 + +00000000000000000001000000000000:4700E22C08FE953CABAC7E78A3F747A7:\ +00000000000000000000000000000000 + +00000000000000000000800000000000:504C1D7FAE3AB9A62323F21BF9A80A67:\ +00000000000000000000000000000000 + +00000000000000000000400000000000:064BA0E8ADDD8E9DF4496E6931AD25F4:\ +00000000000000000000000000000000 + +00000000000000000000200000000000:51D0B15C08FF32F1DCE7B28320875566:\ +00000000000000000000000000000000 + +00000000000000000000100000000000:1A20EA3DB071121460244EDE27DA7A39:\ +00000000000000000000000000000000 + +00000000000000000000080000000000:0035A5F7557B1B009327109D0C62F25C:\ +00000000000000000000000000000000 + +00000000000000000000040000000000:803939C10EE11BB254A7768FAD053DA4:\ +00000000000000000000000000000000 + +00000000000000000000020000000000:35D493255A870959C12F26170E6A1B64:\ +00000000000000000000000000000000 + +00000000000000000000010000000000:DE8381198215D45B1BE787E4E8438500:\ +00000000000000000000000000000000 + +00000000000000000000008000000000:B22E9707E738F723CD9B99386CE0162E:\ +00000000000000000000000000000000 + +00000000000000000000004000000000:24C65ADDE5C3CD24B75C343782E87F6E:\ +00000000000000000000000000000000 + +00000000000000000000002000000000:0050FF2C1A3C2AA68207D333F9956A72:\ +00000000000000000000000000000000 + +00000000000000000000001000000000:162F7B8D35C1A98305BA0FE2A91FF27A:\ +00000000000000000000000000000000 + +00000000000000000000000800000000:223D6117FE4864C2B3C513EAC2A5266A:\ +00000000000000000000000000000000 + +00000000000000000000000400000000:3DBF645715ED7AD1964E2DCDE2F8806A:\ +00000000000000000000000000000000 + +00000000000000000000000200000000:3DBB85509557BB00FE0F2013A90A5753:\ +00000000000000000000000000000000 + +00000000000000000000000100000000:F2D75E45A62D1758C7A542BC805AC482:\ +00000000000000000000000000000000 + +00000000000000000000000080000000:77628153A62DFD455B1C0E5B6CE9688C:\ +00000000000000000000000000000000 + +00000000000000000000000040000000:8AE9DF2D94F6E85C86459132130E1BF5:\ +00000000000000000000000000000000 + +00000000000000000000000020000000:BB610990F42303F4ECCD795E16780A13:\ +00000000000000000000000000000000 + +00000000000000000000000010000000:A38330C5C0B464FFD6983972CF9541CC:\ +00000000000000000000000000000000 + +00000000000000000000000008000000:EFD11CA98FEBB6F1ECBEBBCB8BD5E35B:\ +00000000000000000000000000000000 + +00000000000000000000000004000000:3BC6740BF141DD33D65FDEAA10BF1655:\ +00000000000000000000000000000000 + +00000000000000000000000002000000:FCF7BE4B89B54547C0BEF84EB85734F6:\ +00000000000000000000000000000000 + +00000000000000000000000001000000:CBF5EF38DDEBCA39F2F6BEB2F3042D96:\ +00000000000000000000000000000000 + +00000000000000000000000000800000:1119C20F08D4EA77A13C331678D4D71F:\ +00000000000000000000000000000000 + +00000000000000000000000000400000:5C8241DA3FB0DC7328271B9FF72C91BA:\ +00000000000000000000000000000000 + +00000000000000000000000000200000:337FCEE0AD0BDCA24AF5411B69D39B37:\ +00000000000000000000000000000000 + +00000000000000000000000000100000:F6C56A841A31D58A90F5693F87380A3F:\ +00000000000000000000000000000000 + +00000000000000000000000000080000:DD8C11B46F768B7CB2EAEE7E3448DD37:\ +00000000000000000000000000000000 + +00000000000000000000000000040000:B8EE7182E563888E4F99335CF0372598:\ +00000000000000000000000000000000 + +00000000000000000000000000020000:FCA9BAD58DD9C77B0BC0E616E7DE7F2D:\ +00000000000000000000000000000000 + +00000000000000000000000000010000:798DA99BEFFBF99B23A3C15A31F60CB1:\ +00000000000000000000000000000000 + +00000000000000000000000000008000:015CD86F000C87948BF3591C3DE4391F:\ +00000000000000000000000000000000 + +00000000000000000000000000004000:B40B9945EEF7BC52E0B244ED71FAD3D3:\ +00000000000000000000000000000000 + +00000000000000000000000000002000:D9BBB27B7D8AB20241E60F04108F1E12:\ +00000000000000000000000000000000 + +00000000000000000000000000001000:6EC3F259B3FA960505CDE9D20F9EB905:\ +00000000000000000000000000000000 + +00000000000000000000000000000800:01C1772AD104A988B2978447B91199F0:\ +00000000000000000000000000000000 + +00000000000000000000000000000400:F8D5E997A8DD1B5BBE79C9F36B94C73C:\ +00000000000000000000000000000000 + +00000000000000000000000000000200:4040058B08B27B6A585F18BFDBAE3E29:\ +00000000000000000000000000000000 + +00000000000000000000000000000100:55547D09ACAF0C915B24E15ABAB0C827:\ +00000000000000000000000000000000 + +00000000000000000000000000000080:FD7A0B33D397DA035D146DD56C869960:\ +00000000000000000000000000000000 + +00000000000000000000000000000040:80C38900313E9350219EAE9AA7DA5E1B:\ +00000000000000000000000000000000 + +00000000000000000000000000000020:F50D8495C3DCBFF4DFED0736F92475BB:\ +00000000000000000000000000000000 + +00000000000000000000000000000010:58A06DC5AD2D7C0550771D6E9D59D58B:\ +00000000000000000000000000000000 + +00000000000000000000000000000008:EEE324733E6409500FC9F9D6DCA185E0:\ +00000000000000000000000000000000 + +00000000000000000000000000000004:F97C415886D05C12598F2C95F6B3EB16:\ +00000000000000000000000000000000 + +00000000000000000000000000000002:F0FC7D86D814589A09D8EC136F95A124:\ +00000000000000000000000000000000 + +00000000000000000000000000000001:CA737FF1FD0FE5B8E41E90358A5F2CB1:\ +00000000000000000000000000000000 + +80000000000000000000000000000000:62EF193EDB7D399ACA50EC1CBE5398D8:\ +000000000000000000000000000000000000000000000000 + +40000000000000000000000000000000:E7A58D547688BA8B69DA949E38AA6FAD:\ +000000000000000000000000000000000000000000000000 + +20000000000000000000000000000000:71579F70A8EDB2BA5C00C513E2D7DEEB:\ +000000000000000000000000000000000000000000000000 + +10000000000000000000000000000000:C6171EF892F8224DC5FAE230AF629F52:\ +000000000000000000000000000000000000000000000000 + +08000000000000000000000000000000:C6A61053C48D7ECD7DDD12DB0F316AD7:\ +000000000000000000000000000000000000000000000000 + +04000000000000000000000000000000:EA5833714F1324DAB7F53CACC63F784F:\ +000000000000000000000000000000000000000000000000 + +02000000000000000000000000000000:450BCB0C7351CB1CDAC5D02E80D13C64:\ +000000000000000000000000000000000000000000000000 + +01000000000000000000000000000000:C267D3634F84215FB7B4635AFA385E52:\ +000000000000000000000000000000000000000000000000 + +00800000000000000000000000000000:6DB5B1B156DA1C36B9AB5AB59B063C29:\ +000000000000000000000000000000000000000000000000 + +00400000000000000000000000000000:EDF2D9B19FF75561E8FA6F411C4A0431:\ +000000000000000000000000000000000000000000000000 + +00200000000000000000000000000000:A11AE84E6D2C56DED2B9497FEC7504A7:\ +000000000000000000000000000000000000000000000000 + +00100000000000000000000000000000:B3A1A1E271BF94DA3A5ECFF1D4293A56:\ +000000000000000000000000000000000000000000000000 + +00080000000000000000000000000000:5577374ADCF2F58EEEFFC432C42AEB76:\ +000000000000000000000000000000000000000000000000 + +00040000000000000000000000000000:CD9D355C3574343BC7FBE645CE7EA721:\ +000000000000000000000000000000000000000000000000 + +00020000000000000000000000000000:76EB4C046F052AE4ED41060BF60067FB:\ +000000000000000000000000000000000000000000000000 + +00010000000000000000000000000000:1273A4BC420BCC9E29619567B1E61762:\ +000000000000000000000000000000000000000000000000 + +00008000000000000000000000000000:1F80E1CE3F12C96F2E647BACB6DA78D8:\ +000000000000000000000000000000000000000000000000 + +00004000000000000000000000000000:12D34A7875E716B37A7E250D37AFFDEA:\ +000000000000000000000000000000000000000000000000 + +00002000000000000000000000000000:5A54D764EEFFC4B64143A58B071514B4:\ +000000000000000000000000000000000000000000000000 + +00001000000000000000000000000000:F4F1567BDC5B1F938D5A214419090FE0:\ +000000000000000000000000000000000000000000000000 + +00000800000000000000000000000000:6CB91B935A0FBF49636CDF64A12955B7:\ +000000000000000000000000000000000000000000000000 + +00000400000000000000000000000000:C082154A07AF64FF6ECA811B0E3302E6:\ +000000000000000000000000000000000000000000000000 + +00000200000000000000000000000000:49A746CC225C1B6009A93649CDD9EDCD:\ +000000000000000000000000000000000000000000000000 + +00000100000000000000000000000000:1CAD0512E3CC51210B411EE452DF62E4:\ +000000000000000000000000000000000000000000000000 + +00000080000000000000000000000000:4FE9A0CF34BBCFFF906D8450197CC9D1:\ +000000000000000000000000000000000000000000000000 + +00000040000000000000000000000000:38DB8EF6C8993F17BB4D1614B9DE15D4:\ +000000000000000000000000000000000000000000000000 + +00000020000000000000000000000000:08DB3F476F551D19D9643A9E139E0553:\ +000000000000000000000000000000000000000000000000 + +00000010000000000000000000000000:F0F518F73795AB51BFB6E0AA99A0DAC7:\ +000000000000000000000000000000000000000000000000 + +00000008000000000000000000000000:91544D597F679E7DFE6D16D475809851:\ +000000000000000000000000000000000000000000000000 + +00000004000000000000000000000000:B1F92601B6D8C6B81176A46EE7341D28:\ +000000000000000000000000000000000000000000000000 + +00000002000000000000000000000000:796C3A8CBC6450E51FA6F8765ACD0F10:\ +000000000000000000000000000000000000000000000000 + +00000001000000000000000000000000:5F7BFE71BD2E81599DDA3411BC1CA579:\ +000000000000000000000000000000000000000000000000 + +00000000800000000000000000000000:2DF7D576EC6296101CAB16012092C12C:\ +000000000000000000000000000000000000000000000000 + +00000000400000000000000000000000:20769DE071FBE22AE49E7B3F5D646418:\ +000000000000000000000000000000000000000000000000 + +00000000200000000000000000000000:B6F5C012E4BA15DC86536F328B137FC0:\ +000000000000000000000000000000000000000000000000 + +00000000100000000000000000000000:1C3031DD05EAA4C278B55EF0E7E4C1F9:\ +000000000000000000000000000000000000000000000000 + +00000000080000000000000000000000:3D72A53BD537D04AC59E0AF36D105ED9:\ +000000000000000000000000000000000000000000000000 + +00000000040000000000000000000000:A6FFE499A2050C38F4E89DBF12B27430:\ +000000000000000000000000000000000000000000000000 + +00000000020000000000000000000000:BFBB2A537B2C1339D6230F35A256F289:\ +000000000000000000000000000000000000000000000000 + +00000000010000000000000000000000:70E79718C97DDB187411436AC072B148:\ +000000000000000000000000000000000000000000000000 + +00000000008000000000000000000000:13BB56699085842B81DBE8FAA8B26269:\ +000000000000000000000000000000000000000000000000 + +00000000004000000000000000000000:3E4DB71B9C737C7F8AEF632A5ADEF61D:\ +000000000000000000000000000000000000000000000000 + +00000000002000000000000000000000:D7A254B7341C7677C72F9DE729A3BB78:\ +000000000000000000000000000000000000000000000000 + +00000000001000000000000000000000:527D14E58B74224622DF7F3FD65932F5:\ +000000000000000000000000000000000000000000000000 + +00000000000800000000000000000000:708703993AD1DDE5C7F8714686F3AF32:\ +000000000000000000000000000000000000000000000000 + +00000000000400000000000000000000:C57D3ECB71A7DA4708DE6F338BC13E09:\ +000000000000000000000000000000000000000000000000 + +00000000000200000000000000000000:B31FF60BE0FDC17001CAF87FC7FC0B2D:\ +000000000000000000000000000000000000000000000000 + +00000000000100000000000000000000:01877AC646A283472DA74182FDC1E2B5:\ +000000000000000000000000000000000000000000000000 + +00000000000080000000000000000000:3C678BADA3FB1B872C018DC035AE16E8:\ +000000000000000000000000000000000000000000000000 + +00000000000040000000000000000000:A2CB209DA6AA40E043E6FB9DD2476100:\ +000000000000000000000000000000000000000000000000 + +00000000000020000000000000000000:4F9402FF56D04C8FB37DBE1A3109D2DE:\ +000000000000000000000000000000000000000000000000 + +00000000000010000000000000000000:342DAAD90F0F1699048D5CD16FDA2EC7:\ +000000000000000000000000000000000000000000000000 + +00000000000008000000000000000000:E68CC86CA4D952BC3890AEC0A7AAA4B5:\ +000000000000000000000000000000000000000000000000 + +00000000000004000000000000000000:02A88364BF94A677124F670A566E3F0D:\ +000000000000000000000000000000000000000000000000 + +00000000000002000000000000000000:C961EF325E2A32A4359CC63BE1EE2C77:\ +000000000000000000000000000000000000000000000000 + +00000000000001000000000000000000:03BF43C9083E4D9919D12FE5C0315E67:\ +000000000000000000000000000000000000000000000000 + +00000000000000800000000000000000:B27063442470BE07DCC2256EC71A4F1A:\ +000000000000000000000000000000000000000000000000 + +00000000000000400000000000000000:222CC5A29084A4BDB05D4C2FD95648DF:\ +000000000000000000000000000000000000000000000000 + +00000000000000200000000000000000:E08686BFAA936E1890AEEC834E3B474A:\ +000000000000000000000000000000000000000000000000 + +00000000000000100000000000000000:10DC4FFCAC5F5A1FB668277E8E75BEAB:\ +000000000000000000000000000000000000000000000000 + +00000000000000080000000000000000:03A9199978F9D652A4C528FF86C39CE9:\ +000000000000000000000000000000000000000000000000 + +00000000000000040000000000000000:DDF718A1BEB37CC1B0905520DB7C1611:\ +000000000000000000000000000000000000000000000000 + +00000000000000020000000000000000:2072191C277EE40FD557FF5F67A2A546:\ +000000000000000000000000000000000000000000000000 + +00000000000000010000000000000000:96B3608C06112F619B156105EB082BBE:\ +000000000000000000000000000000000000000000000000 + +00000000000000008000000000000000:B5D919DFD9828C4FF4427E72ABFC77B2:\ +000000000000000000000000000000000000000000000000 + +00000000000000004000000000000000:9570E7A96D4674C800AF8DCD01DEFF64:\ +000000000000000000000000000000000000000000000000 + +00000000000000002000000000000000:59723DB66EDB29A9C81175668903777F:\ +000000000000000000000000000000000000000000000000 + +00000000000000001000000000000000:1779BDFAC6DB722BCAF4D3A8D9D2E725:\ +000000000000000000000000000000000000000000000000 + +00000000000000000800000000000000:5107B50A150998C6EA01C14697FC0E53:\ +000000000000000000000000000000000000000000000000 + +00000000000000000400000000000000:36A6CAA08BD5D2B332E9323F7C2E76CA:\ +000000000000000000000000000000000000000000000000 + +00000000000000000200000000000000:D1CF37451667EDB8D2E9934D39A27A92:\ +000000000000000000000000000000000000000000000000 + +00000000000000000100000000000000:4E96227B0A018755FBE8AD5BF0E421B0:\ +000000000000000000000000000000000000000000000000 + +00000000000000000080000000000000:3221B3D3A24745B483BBF99509B330A0:\ +000000000000000000000000000000000000000000000000 + +00000000000000000040000000000000:98A4AB39B84D21D36A5DDC2660BD68C5:\ +000000000000000000000000000000000000000000000000 + +00000000000000000020000000000000:E5C351E1783465EDBA5CE0592BC77E8E:\ +000000000000000000000000000000000000000000000000 + +00000000000000000010000000000000:35489488EE33D0344C1BDB6263D28286:\ +000000000000000000000000000000000000000000000000 + +00000000000000000008000000000000:97EA899F53C60536DAFEB18123FD6C5B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000004000000000000:8511B11C7D2D8FBF63702A7E3AACA08A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000002000000000000:FE0C90596E4F47FD8A9927D83F4DCA52:\ +000000000000000000000000000000000000000000000000 + +00000000000000000001000000000000:186FE000683CC19F621BC6C2DA300B71:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000800000000000:8291F94EDF578E8A70CD0CF8F3FB3558:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000400000000000:2891C81846949C917E757EBAE20D34EE:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000200000000000:762D85A32DAF0C9F3CFB3388E808FEC2:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000100000000000:CC6807D209B728C559C32336FD8FB71D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000080000000000:FCD07057EF4820154075A0DDCBFC0BBD:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000040000000000:FDBFE2C3FFC82792D338388A1FC6D22E:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000020000000000:04D5F7CD68FC2352BDDBC82CFE35DA80:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000010000000000:B1784A7BF395FB525471EE3DC8972FED:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000008000000000:CB5D8A62D16220123EF0005876E35B19:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000004000000000:311292EDE1F30E9F22F1EEF8FD19BD80:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000002000000000:382BC583EC9B6E16E3DF2188CF0BF1E8:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000001000000000:632C9AD674BD1B8A15827A789BD133A7:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000800000000:0EE175DF45B889CED6974E9C2B8F8A78:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000400000000:6131A1A18F00CFDA5B4AF4FBE5487445:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000200000000:0C8746747460A540E2304B55C12EA672:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000100000000:DD6D4D2AA3EB702C597E4E2DE59BF4C9:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000080000000:774EDF219459A4744AA1CCDE7D969A60:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000040000000:1D7B340C4CE68AC97369FFF0FF9980C8:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000020000000:D18104617258AB02AAE02ECCF552A891:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000010000000:8DC66F1D7648EB62F1DCBEB3CD237985:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000008000000:ABF090054ABE052ECE0B07BE6B6CC6DB:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000004000000:89239AAFE9BA86E5EC794397E0180111:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000002000000:6E1CDC049333211B4D7533E21504D200:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000001000000:EFE662AF24D9997FAE45CAD4F92F3091:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000800000:16F53F3A6CC3B4F86DDA1B8792244901:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000400000:047CBACDC5EA84771A61FE1204813D46:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000200000:B442FF3318822EA7F60E2A8A082A043A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000100000:971D07AEEDBCA5B7BDCD033F708C97DB:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000080000:D307263273E250C0B9E08FF23003B0D1:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000040000:75F7005CA9C6EE5A1F9A4897FA67C661:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000020000:9B421C68873D49F07E3B9025AD609787:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000010000:5B182593B47DC674D8B1942CB97224B2:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000008000:A896871A3157CCD1F5A788E253A6B0FD:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000004000:789A3D2B2A70181EFCCE5529F200DC44:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000002000:7F9462D23DB6E99AD0A54EA84DBD94E2:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000001000:23EAFE1F7CCE96B6BFE2484E1DFC4AB9:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000800:A76C323805F9C252C8B86C83294B9987:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000400:D8CA1075B7A3F2CF2DAC0980B1B66CC1:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000200:8206D89F2A07BA6403647FB85A2F4D7D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000100:3DE7573CD46D85488364472B038869F9:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000080:31C62401D6E9E4995C0913747BFE7C7E:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000040:C464728025916B4E8D56E4A9F98C1A25:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000020:0D4643EE09ABD6D6062187789AE9A77D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000010:0C06EAC3043ABE6554C2DA42F21E7B05:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000008:E26C6B2CBE2130729A5BF96E7CD29912:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000004:4DE2B8FFF3588A5D4E62CADB720E5BCC:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000002:B96DD46C6A286BFF721693A98491F529:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000001:64F1DBD3C79EE69AC9E0ED5F554F4AB6:\ +000000000000000000000000000000000000000000000000 + +80000000000000000000000000000000:23A385F617F313DAC05BCB7EABD61807:\ +0000000000000000000000000000000000000000000000000000000000000000 + +40000000000000000000000000000000:35BE2B4738602A1DA3DE5C9E7E871923:\ +0000000000000000000000000000000000000000000000000000000000000000 + +20000000000000000000000000000000:03E8BB7A568E95BA792DCE77D5523C2B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +10000000000000000000000000000000:D3ACBE92C482D2E806FD837E41DBB288:\ +0000000000000000000000000000000000000000000000000000000000000000 + +08000000000000000000000000000000:DC3B1C37C69B4059EAADF03FCD016EB4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +04000000000000000000000000000000:3C9D9BD904E0E6916089A4BAC35E5368:\ +0000000000000000000000000000000000000000000000000000000000000000 + +02000000000000000000000000000000:C47DA045701B93A388E76FCBCD349F22:\ +0000000000000000000000000000000000000000000000000000000000000000 + +01000000000000000000000000000000:52F264B196925A345CA5ADC57C234B96:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00800000000000000000000000000000:C923754C5AD2E3F842D01705A716BE8A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00400000000000000000000000000000:630075C7563CDBACDFEADB781CC9467C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00200000000000000000000000000000:CB4F69BCC76A2499C6FCFBBE4CEB8CFB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00100000000000000000000000000000:0442F15EA2BD6D9EB773F9B99804DF56:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00080000000000000000000000000000:9CE6896C15C3CC00E2AA1944D7117B98:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00040000000000000000000000000000:E934066740023616B349F45582442647:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00020000000000000000000000000000:D08EF37A59D94ED645B1D1B160E3E816:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00010000000000000000000000000000:E91891CAC17FE493C7167C6CB59DCB69:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00008000000000000000000000000000:B27A42D2C870DC96BC6C551218C44CC4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00004000000000000000000000000000:CE8D23E64E6BC18208CEEB282E387326:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00002000000000000000000000000000:36F76678A27F2F5A436073D5ADA4AB3B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00001000000000000000000000000000:D0EAA36F9A648905B277F0BD24B1A339:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000800000000000000000000000000:82BE0E3673E7872BF79BBE2A45F4BD93:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000400000000000000000000000000:013CAE3986083F8D321273D68CA9784D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000200000000000000000000000000:0A7FCF71DAC023718153FFB761BAEBEF:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000100000000000000000000000000:C784C5EA8CE3897F153336047D2FE3E0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000080000000000000000000000000:FE776B4476A4F029E5EA9293E3C1BCA1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000040000000000000000000000000:302A5F9A73B07D83699EB9DE1D86DB7B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000020000000000000000000000000:E6C43F6F62F1EEE0BDB3484F325053B6:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000010000000000000000000000000:C5579556F710EACFAD9319AA85B89F6F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000008000000000000000000000000:96C88E46C1C2BA0B583F30FE0248A794:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000004000000000000000000000000:287D27FB1CA40821294B1AFC868F3A6F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000002000000000000000000000000:F4602DF76A24010DE5A1353043CF178E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000001000000000000000000000000:47F98AA9DF5E7314D3D5571EF6B95284:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000800000000000000000000000:77CBF7DCA60F913FD9C82AC65212EBB2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000400000000000000000000000:BEB1C2BC4B5C363FCF5A0466883079A9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000200000000000000000000000:2AB8B9254ADBDCE17F0A719815DEFF7E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000100000000000000000000000:75A30CEAA03AF66E44A85DC66DEB20C9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000080000000000000000000000:C37E64CE86B615573C4C42BBE71DACD8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000040000000000000000000000:284CB50259A96CCED1C1C64D8B603024:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000020000000000000000000000:BE346B07869425CBCA54F93D7A1F4035:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000010000000000000000000000:60EE2023B03033A972E28E4A21C7005F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000008000000000000000000000:4E1FD4BC99AEA3BCC6B9066EC6329D43:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000004000000000000000000000:079BDF2DAD2CE6FB7D21BBD76A7ABF48:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000002000000000000000000000:6B933D9914169C2A704E52EC6D7E4E1D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000001000000000000000000000:FD854A50372E5D301367D8E98CC88028:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000800000000000000000000:8CE94A2C43B01825CE5F271135481BB2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000400000000000000000000:73A43C713898BA7D7D2B6BC8673A7AAA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000200000000000000000000:13873CFBDED482C0B7B435025A9F1CF4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000100000000000000000000:3F168CD782896F22C56A92A09EA7E162:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000080000000000000000000:BCDF1C8686E68810FE90B16ECAB46147:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000040000000000000000000:95C18EBA59E3CB6359DE7CCE9E8751F9:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000020000000000000000000:03CFEA7D36D56552CDEF806215EA7596:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000010000000000000000000:CC189A2E8F529EB139DCA2033109F40B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000008000000000000000000:453912532144CED54B7D4049BC8B8CF2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000004000000000000000000:C6DBBF405A056A80CA788267538FE8F0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000002000000000000000000:2EB5E272874CE244A328BA6410480B4C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000001000000000000000000:263BFB611CBD9D9C7FF6B1A9E3276696:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000800000000000000000:9CC3EB61A9907F5F22251239A9EB38ED:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000400000000000000000:726A3EE922EDFE52206C2191E1F045F4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000200000000000000000:1344C1E04A9D97668A240D82396AC021:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000100000000000000000:9067BAA44C264E9A2AEC292390A6F492:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000080000000000000000:1176621BD24D35670B08D6A065806B02:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000040000000000000000:DF0D31D14D81FD086E8E32479919FDBC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000020000000000000000:44BAD80B0BA01E971ADC4139D6DE0C36:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000010000000000000000:76C59131EFFAE14058D99E22698B602D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000008000000000000000:7604D9F3110F8440917ABCEA49710ADA:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000004000000000000000:4584FCBB487171176C4318082EFEFDF7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000002000000000000000:019D3B42FA31A9F9175759E6C3193A07:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000001000000000000000:C324FF5F71A974F13F5D83226441E3BD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000800000000000000:D9DF41408DFF80DE7C9571706B39038F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000400000000000000:FBB99A524AC23D74047D814EC0AEDBE2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000200000000000000:877C855E25345F6C7DB4237ECF64C874:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000100000000000000:206500F822C1305F9D61F49FC57AFBF2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000080000000000000:C7538D97A78844C3C00740865E26755B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000040000000000000:FADBC4A6E4564041ADA094C603CABAA4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000020000000000000:04C482E0707DE6DC1917727D00C4FA6B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000010000000000000:EE36B8996AFF98BEA6E2115B9D173321:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000008000000000000:DBA4A5F38B104985D796ECDDD812B605:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000004000000000000:1DC0F910CD5AF1E5734169459E170192:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000002000000000000:C3B7D6914052503D377B01DB4E3A630D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000001000000000000:54D807506602ECF7D6B8C4D923317738:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000800000000000:ACE4949143D4D1441AA854331E7F511B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000400000000000:F7BA140AED4756B26789498A17EBF62D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000200000000000:F23E08B81ACB75FE2326A94ECC5968AC:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000100000000000:4CF26F088604368B17DDC09FF9D0146D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000080000000000:E93AEB7AD76A6AD0AF4092F363421F1B:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000040000000000:3D234C0F78ECBEFCCDCE1EA6EC98C145:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000020000000000:BA300B0234F0C96125D33123CDD7D6A4:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000010000000000:1CF1A160FAD7E744F08BA1454A999211:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000008000000000:59A9E8C14ACBCEC235529425CF86998E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000004000000000:22D29CFEF3A6DC0EC67A9EA8523D6158:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000002000000000:513971F979FC906FADD982D7F08E4F05:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000001000000000:6A95C07D7FACF2CD36DF362116A2DD5F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000800000000:CD62AD57393A38607436FAF0985C2D50:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000400000000:5209ADE137B93BA0963528E3E1A40F2A:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000200000000:545BDE9D1C11239ED70D93060F24E397:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000100000000:720622F5194578B3C24B5DDDC7E30327:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000080000000:9E12338BF484106249754EAA6C441192:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000040000000:F13303DC759CA65097EC87F8D854163C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000020000000:4A2A6EB6845723C1C790D693B596CDE3:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000010000000:EF3D7C67417CA1FEEF03EF71441BDDFE:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000008000000:214FB38A7511A87CF160F59CCA2B8E33:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000004000000:DCFFDB5E44574D0D593A70ADA4C79474:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000002000000:AC9D55D4A4FBB80C9B79C9077BA381B1:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000001000000:05C6D61B75312924E0BCEDCB4B8D55DD:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000800000:E650CB445AF48A77E8DB6E2EFBCE6FA7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000400000:4C9902E89253D7A172BABFA87DB94816:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000200000:5AF4F5E8491EE7F87EB809D82AEC12DB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000100000:1C11730D62BCA6F847B1457B5287BD12:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000080000:BEF65A32FF7383CFDB5A90C2F3B93837:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000040000:2F3AA68FFE3B99DC92621782F3F9ED67:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000020000:18BD598BFA2C77E21DBD594EE0E5CDCB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000010000:248CF533016A6AB1F84F85B2C5CD41A7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000008000:A3B12F578353514CCC500ADD6C495A6C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000004000:EE2DC099B37D200B4D3930A6DE07208E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000002000:412C9F198D58A0F01F66DF07CF211636:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000001000:5B3532BA46716B02E761339DBAFBAAB0:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000800:0148187CA72EC46B522E4FE7E1261522:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000400:84C529CC4E23683AB90A24A6690662ED:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000200:0D1EF0481593A3D95F0361C776D9A4D2:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000100:D622171C73726DB6620FFDA6540D510E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000080:F218D92AED363C6829F7FA3BA346E0FB:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000040:40CD83A5F0BFD0E1D7FE14299CECFB7C:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000020:512F022157AEF0015E93F3737911A35E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000010:C7A5A88356152E95F36739AB5EF9F63F:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000008:8FD0F15E2504A8F4FD751CA7799FFB1D:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000004:0137C87257A8CBD18C218A867B3AB5F8:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000002:3DB0F1674F187DF1CB036DB33A05A0D7:\ +0000000000000000000000000000000000000000000000000000000000000000 + +00000000000000000000000000000001:23D1247EFF4CA8CBB378DF118369821E:\ +0000000000000000000000000000000000000000000000000000000000000000 + +[XTEA] +0123456789ABCDEF:B8BF2821622B5B30:00112233445566778899AABBCCDDEEFF +D51399607F7AA9D7:782E4E131C5BA746:D94576CD1A5F99E4155DC7BEC5D33DF2 +10B233473624CCD3:57733A1DEECE283E:07EF12BC9D06D7DA20131116B665E335 +3B905E951E4FAFE7:776F4965DEB65775:C6462B48AFD604B75FCC455506FFD411 +15B623D1FA2DF9DF:3BD5AD5C9ED6101E:BE195F703D6FEC2232CD0890C981B27D +7C1035940696D91D:5F93FA1D06991415:5B8410F7A9EB92DA120810C56FCAF8C9 +90B245144895F3AD:6105BFB0947828B7:B85C9E26661889D0FF1054C6BE27FDEB +4EF2CFD120B8D4DC:51FAE58A10F7C3DD:A8A1E956D54D238F6CEAB186E7EC99ED +F6CB5353F4A1C432:550AD71BA8A34568:8BC4879201A96368927ECCEEE67024EE +215C080CF158A09B:13D1E24BA9FF7B63:F1372D85D8C3D1A60DF57EEDF317AB81 +568583061DA98D0D:6439B1DFE2ECB541:017F01683F5E009D196FEEAAD385C5A9 +0558B306316B0823:C8F82FE4491A8917:281C932DDD3C364B09F1896007FFAB03 +FDCB2764303222C7:244DBFA1D2C914E4:C1E95465C7EF8EB04254D1A5463C6A43 +EADDBA89070EC46C:5A4909646763454F:0F86DD6C96DD31164B656B0F25E4B411 +C6507BCF99B9C2A1:6F08EC714E8A7C18:FBACFB479AE21194C35B8184E58DD66E +C380B0F1C21D4D37:72D4D4BDF5C00585:2EB36C4A9598D471700A1330070FFFC9 +E5B7C1517F24F298:64374B40BB732354:0A7F48127091780617A1F534B3271BC9 +D14DDF77FDDA17BF:014F1E707D02C8D8:303FB24822A1B8A84D0ECE77B86380FF +B9682750BB15CAAD:9001D21B57AB5360:F04EBF798C193F199C1F532AF383555B +9706769A18A2D03D:835FD788C089FD45:200C0CE59717D5D9AF6813CD207FEE73 +EDB76C54847DA59E:B0C0125494D39CE9:2828D51F98AE0B33F4DE2B7FBD18A529 +178A49BAFBA53F23:ADE26742F25EFBE1:61AABA6BE48B0D0D14FE5D27FAB852A4 +DF4CDB61A5F38536:9C895E72168B409E:2080E2409BA01C8532FC84403EE8C06A +7C944D08DEF34C0C:B784E23E00B3B498:271AD15192C4D1204A4A2561E3DB6FF7 +F4C76C1D47FE568F:62F9E58B0364B0B6:C1E297C0C761777D8A76FFF02D22B859 +CAB16583E15D0074:4563BE765E74653A:23C807A2EF0A551F858FD52D125A47D8 +97B05C60774164AD:714807767366854B:9FA5D4D8CBDFCECD559E3CE88BF78EE1 +7017A263985B735C:CC68E1ED7F7C7832:24F4E91083139099D663647A7FFAC321 +15475A90DF04CD29:416EAB1EBC155782:7CF8626DE76D8462218ED5C9DC8ACC26 +87CA0AACCF146CC8:DED575554058EF42:3C6AD7DF17332A3E1E3DE06007387357 +9268AF048ECBAE67:899B9B877106C764:24237A762D8A89383A2949F5A0F5EC08 +AF0062CD77A84EBD:26DB40C151B74530:209A2833A39472D9720380FFB2F74761 +F922CA875B991A31:2763F255636A34C1:22EBE7A30E8855B3B453A6E926D4F187 +B4ECC305C3DBD8E5:FBBEC8F5DBF4CEFD:1B5E23EBD915C1FEE59F57DD91AF7347 +3DAADD7A9633E19B:4DE5C07EA1564A64:A6BFB85FA91B8CA4197C8B502A62F972 + +# MARKER: Cipher Modes (Encryption) + +# Cipher mode format is plaintext:ciphertext:key:iv + +# The block cipher tests above are distinct from these ECB mode tests +# for testing reasons. They could otherwise easily be CIPHER/ECB/NoPadding +[DES/ECB/NoPadding] +059B5E0851CF143A:86A560F10EC6D85B:0113B970FD34F2CE +4E6F772069732074:3FA40E8A984D4815:0123456789ABCDEF + +[DES/ECB/PKCS7] +:705FDF4DC7ABFBFC:02D863A4885D417A +FA:2281AC7CFA703BA9:05ADD235B01BBDA7 +B895:8C3BF9AB9D16C8CF:93F04843AFC3A191 +8E97DE:BE38BD2AFE108D2A:1F4E2C013314B55A +C1DAE88E:998341E8B0CCE82E:0F59C05186431E13 +A6E0360E88:F5E88FCC387B8883:E68BF7B98D61FED0 +55E67A79F043:A868B107BD96F35C:AE3AB00A0BA38BE0 +D77C93B63D6D5B:19DA07A34FA683C4:9B661C7A536AFC6D +328D09508E747AE1:9C75845C6BFF94438EB7E7E4C77342F0:8E1C689280575F05 +421D4BDC3869E59F07:8DF60DC27A2E2EE23360BE31343FCBDB:EB4A6B437572E1E7 +160E525583C3E4FBC4FE:9B649660DFE5B875CD81180AD627943F:FFE58726B90C9F97 +E873B3C2B31130719E6469:6E33AE2AF48CC39697800A3AA357CC5E:560EE1ED2CC2BFFB +405915ADC0111EB8AF225612:569BE1F2AE91785B0634F8DD4EC1DFF2:012A7DE9CBFBD230 +E923C535186730F309CDEA6DEA:846D7314F76E00902054BD2B2AE1F580:3D5D56CA2E8E359C +116053A5820F9D36650EEF49A05B:\ +9BD56C43036485B648EFE6D31E69F0C6:2AD63A5312BF4259 +B6DCD40077FE89138B5A2ED35E1B3D:\ +2FBE419BADA6D4BF3F6C7BB2A1AAC329:7FF12D4D8A9EF138 +08F0AA208F8A06C6292838A8CEE9104E:\ +44BFCA2722D274504AF482E9261CDB7B16918BE77A461B3B:F71A3B1AABD660BD +878412F6255FF4360A22772711289FD351:\ +9C92FDDE178D3B6C895AAD1B8DC886176910B021D5B3AA77:1ED8B08898872631 +1399A0CD9F2778BCFBA9C0F7E7C89CA069E3:\ +5972F89D8C161DD30A409BCDBF43B20BB104E8A293C48FDD:0DCB3527035253A5 +EA1CC272D3725E4C5DC56079FA3C9F26A1373A:\ +D1B2FCC83CBF11E022C058FCB988CBBBC3843517F5E9D900:BF4B260909243B2F +098DD47EA5784D307C115824CFC3443983FDF58B:\ +77DFAE7F46AF6DB0D0E5775859943E2875854A680B54B59B:5D869F3486DFE1A1 + +[DES/ECB/OneAndZeros] +:09B0A56E79B07C38:E7BADA575103632A +96:C602F30C18C2B878:06779EACFBA84CFC +6EE7:5E9FCE6A89418AEA:09EEAA55C12DBFED +665672:85589647B376B1D1:79C5B2870123FA92 +7F862990:ABCEF68C99607B22:37EC3B88DF82E1F3 +39E551A9F1:04F6D20B0A25B97C:0BD2E04EC57814A1 +52BD5DAD29B0:0828E5AF2A1E1157:8900F77C54E909C3 +49EF95ABD932F8:A3325FBF67FE8F22:D5E02CC281CD647B +B0F0218A6C30542F:E8045C90741ECCE8F90B5469B2E3B359:C4E91F2F3EEC7639 +80EE077361737B995C:F2E9AD2163C0665263CD11C7D976260F:AF593C04EDE5F7E2 +3BE81FFC61B21BFC81D6:59EBA86DB5734577B9E665C3D8BF65AF:77B77F440177BF65 +3EC3AF047C2817138C818A:B8C17B79CB5160EE4612CB5639D72AC8:B1E69181A32E7CB1 +0133FFE3ECDE48F98D3BDBD4:8CBFF36A7B691F168AA2D93A9360DFA5:D6492B1E5A936965 +638A220840B1ACBC24CE4F8B5A:F7A3E8DF04252727E4056A5AF9392DEB:404B2DC43EBF706D +70197E5EE1D774B11005E8700740:\ +8A8A81862C313C7F904D86B953A6E5FB:8188847D3F21BB71 +9EB11AB4E97D026703BFD0645108E9:\ +D7D02FEC752ACD59B235441A4D6682E7:EE97A705E4E375C8 +87F1A7ED6D8C4AD56AB716BC8E02D8DB:\ +A6BEBCDEB9285A54EBCEF6F94142A60C0E5D90CCA6D256E3:A1B692CE93547EC4 +5448723839EA0910C29931F5AE6BA9423B:\ +AA328F5083DBED23B18CD35C4B4B185714DDDB02E81214AE:824BE4D31F8FF51A +F454E24EFF899FA825534965855D2B1D03E5:\ +27D077F2B382CD8C6520346DB77D83D91BD5B08882203858:91B2A69AE61A53A7 +8C4BCB186170411186D2A0496051E0988FC83B:\ +E1C1D7EF18964E2EAFF84169252F94EE315209D5BC151241:E43579BA4E10BD39 +90CBEFA6E4F3D57BE288197E3E1C2055CE07979B:\ +37860F65AED6EE5312E3FEC4F2CF948A3CFCB27092A7B3C8:346ADDF6AE9E62D5 +9A5476706A45500C9AD6AFBA73E68E0355C11DFABD:\ +ADC2FACDD08D2AF9CB00E22209C109D0D39BDF9EBC1200E3:3C6A1A7DEE4FF813 +9EFBCC5E45E15F83D4A62995F4F8CAB036A63F1B18CD:\ +2D9C371F7CD55E7A95B2042A91C9B10025078FF0070EBC62:D584B755C7F2E8F3 +3758CF70B2A1A36BEB273545809B35C92202124A30A113:\ +C728B4B0F49233489B0453CD81FE8C07C68BD17661F75523:35732A4D581F153B +00E0D8C19605363653DFA5F778DAF9E959CBF9BB7E4D3245:\ +BB44D4E603A6CD1EBB27E47FF7AD9F163420E58B97F1C7FF975B521917E7879B:\ +58780533BD9EEDBD + +[DES/CBC/NoPadding] +4E6F77206973207468652074696D6520666F7220616C6C20:\ +E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F6:\ +0123456789ABCDEF:1234567890ABCDEF + +[DES/CBC/PKCS7] +4E6F77206973207468652074696D6520666F7220616C6C20:\ +E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F662C16A27E4FCF277:\ +0123456789ABCDEF:1234567890ABCDEF + +:FF4903E653AF83C4:46B534FBFFDAE457:297873B948A44B5F +69:60FA7B46523AA51F:D581A1D0C70F94A1:C1DDD7447249EF80 +02B7:63C1C1EF79555ED8:A415B62E7E94CAF2:57FA9B2F95F57401 +568960:D0321483090F524D:5DCBE42DB374090E:B6215A095582763F +B6EAF23C:88E289E1DE3E6451:8FE92291C654EC9B:0C054BBD31A9F623 +60A658CBBD:89BFFA9E36FF1780:DBCEE35E86088501:11A8928BC6D0D117 +7E10CBD9E95C:AFC5CDF559ABC6D3:72338F946012CED5:EAAA48B0C2EE2F3F +D907CE88F077FA:3476402272856EA8:837FBB3167F0CCAA:CD399DD3E402F8F2 +9476E85B198C9AEE:1AF298A150514CA70D252F88271B3CA7:\ +308D1C02E7A4E09D:6BAA74F7F1A72E1F +5C11285270E9606CDF:78665ABFE3DEF34F8BD55796825EE915:\ +126AFF39882542EA:51BADB479DE66A73 +D1D3D8675E42A4242FBA:E77BB4A24B4EE8C9EBDA4971C2E60D10:\ +0AE8510BB0FB3994:6C7293A8427BCB3B +65026A8A41EDC1D880F6C9:45A6EF4ACD49F9F1D892A808FA7B6F28:\ +0BE9277B3504D524:E47EC7A77DB94755 +D72E81F4130107E396D5FB27:A88EFF91876A1B6958D52F99FE9B18FB:\ +2F03C36DE4F78E13:99FD2E8848F33FE7 +C8A3971EFDA18AF1B18BFAD98F:54FF90BD90F6213D761F4B3FF89A8DED:\ +69329672E546C969:294922CBE7E12341 +BB9A90F11551531DE512DD48270E:9BA7908E56EDB1BEF992FAEE40F5B1CA:\ +3007D71E86D8EAF2:D7E300E168F60063 +77D6C182E4DDD444D614BCFF98FB13:CB50DEC4728FC2F1A1A5DFB84FA1BD25:\ +F73C8C3355092EB6:2E0DB2552BB83AD3 +40AED22F93DCFCB1D734B7E4657DD31A:\ +66D17A6E9D5BE3281E857B4C7E497988CA684524FD994882:\ +DD006F15E727CB62:B256DC4FDB58451B + +BB25564C7EA1E5BD22016915805C27B51B:\ +B7CEB5F5ED2945F131064BBB9213694B19A04FBD1F138866:\ +DF70FF987582CCFE:88BB3B9BB2EA56D7 +49DAB8D85EA753CF4AE2ECE7A80F0784E42B:\ +D7FCE9E5BED161AD7D950E453677E5BEE422B7542AFC0BD3:\ +747E09FA9BA257DC:F1BBD406191DE0D1 +DC13A6ABAA35CEB3E6650F825A67942114AF2E:\ +BAFDB50E16C9FF4449BF336D410441D56E1E5335B54C9F11:\ +CDAD411D0FA80E9D:C83D55B1196958C4 +A8896D88907AD77AE790828C0A3384C1614E07D9:\ +70A9EB1C11BFD1B1D68C20A6B72C869DAC5372A8ED46AA07:\ +642D12C591F6A4F4:C17D0C69067AF296 +B3FEC4CC29DC1ABBCF7D86F01D2C02C2A723E7C2F8:\ +48ED5583A04D333FFAC9D6462FD96BF79222EEEC70A6AE70:\ +62C62F54C426C59F:CB6252CA271FF303 +AC0B4D5752D2009BDCD42314D9723716294146424542:\ +8A284713F8C9873AD5F558B995C5A67A66557A52601975D1:\ +386DCAD5EAE86830:48153B966C8D686D +EA331F6E518A8AEAB2EF0A4E92E0D198DF5DD0CC74369E:\ +6D3D7DE9938935F9FB9AF839E416EF6F842F2ED827334BFB:\ +782545EA65D89B01:C2CE203020AABB0A +B292D3A3FDC5D709709C87EF91122761847871F9B4E33426:\ +21DAE17D157192146B52C49D90F898B25D0D1DFE677E8CD5B568814E9C6BB6A8:\ +ECC650E1ED1CE8A0:AEBC43AB811AB5F1 +65026A8A41EDC1D880F6C90BE9277B3504D524E47EC7A77DB9:\ +A3B6404C4D87F72D5E0995D7CC20ECE742D9705D48524CFA2820317087FAF578:\ +4755B8639FD7C8A1:4152E22F14BAAF0A +D1D3D8675E42A4242FBA0AE8510BB0FB39946C7293A8427BCB3B:\ +DB621F2FAC9A924C83ED0B9E8ACEC9F1E23BF3FF2AD6EFA814903F2CE293107B:\ +92A18B78A25C4B7A:C3AABC68CEEB22D9 +C8A3971EFDA18AF1B18BFAD98F69329672E546C969294922CBE7E1:\ +940C610A41F04E7D9BE0A74D5D00FE97A2647D3D16E9B76FF0DB5BBDC197C82A:\ +2341239C09C73427:C4D5B2B6863DB060 +D72E81F4130107E396D5FB272F03C36DE4F78E1399FD2E8848F33FE7:\ +7D495CBA50C4127347E3AD29E3B8C098A3312782E3D45ABFA1621F64BF8B8A06:\ +166EA8ED9D29E1B0:2BE993C1BE8FE9ED +77D6C182E4DDD444D614BCFF98FB13F73C8C3355092EB62E0DB2552BB8:\ +9D926142271E814BA4603509187C9020DAA0D50F15AF6E698E384644E9468C11:\ +3AD3301094B2F471:8638489AF44732F0 +BB9A90F11551531DE512DD48270E3007D71E86D8EAF2D7E300E168F60063:\ +44858416F946C7FBDFFD720282881630803803AB91CEAB1AF4F68F50E9C16DCE:\ +04BBFD95AC12E6FF:30CB120D13391C44 +8EB8FAF49126AD5B8A0AA6DF8B52DBE50DD5AED271641EF983BD650DA69816:\ +5B4622F1C4FAA817EE3AC181B969A7AFED7117E23F68BC6017519A7D1399CFE9:\ +35501029E137D63D:C1E0E3A06B357B51 + +[RC5(8)/CBC/PKCS7] +FFFFFFFFFFFFFFFF:7875DBF6738C64788F34C3C681C99695:0102030405:0000000000000000 +FFFFFFFFFFFFFFFF7875DBF6738C647811223344556677:\ +7875DBF6738C64787CB3F1DF34F948117FD1A023A5BBA217:0102030405:0000000000000000 + +[DES/CBC/OneAndZeros] +:79FCDEE6F5A94E74:0741219814F4369E:DEFD8C15FEB10458 +61:AFE5BE1DF47E6958:3FAD1BFA365F515F:587FBFB91B510842 +6162:FB193EF114B131AD:C6DDD3B4CFB3BE35:3397BADCFFA5CD9E +616263:DED4DF8449FA9AF1:39CD739C5FD324F9:7BA9456759F9D9F4 +61626364:90D644584B46BD60:0CE7C79E562BB380:FBFE8D32A056DF18 +6162636465:2A70B1E3D641EDA8:1FC96BC8537C2BF5:7D14C2BBF4FEBFFA +616263646566:D46AEE73FFF0871A:3EA0FEB6F73FA584:F7EB4F725333CFE0 +61626364656667:98FF67221E6870D6:938DE716B9569292:78C186E4F57CFCBD + +:4543FC96F4B8B122:819B1D2932657450:BDB02A5EE4B87D94 +47:CC6E8C070695E305:0D41339A489D8364:BFB7F817CDEE3C12 +4749:6FB34EA238CD511A:855595B620EA4AB0:39E6CDE9483737E0 +94A320:C2D8EFE2B7E89888:8DF23DFB014D257B:4C3D7238A857AD45 +621F374B:709D24FE90B62702:E6700FB699FDA882:3BBB4962D510E0B4 +A8A6EBFA30:9BA4AAEBF47F2934:33154E7A3744B1F8:9A7CFF1E07BE5EE0 +3F15A3A21DE5:32857A77CD5F0837:D5B9736A8BF39C52:9F9C1DDF2E81D3B9 +13B01FB8554A61:42F700714759E23A:AB8AD1DC2B5E59B5:AAC43EEA7CB833C6 +875F37E530711B59:8A46DA643B1D2782D0DFB5210AD2745E:\ +AB36FE234780AECB:E573C3E555078997 +3C6D4C4C7D419EBC5C:A51F4FCD2EC5EA235610B21F77035E0C:\ +9BA56B459BB4EC9A:0F779E7C90490B73 +D6EAC1E0BB495865632A:E7295D7EBF14D4401639A62B1A59B963:\ +5E5CEF1045C62E7B:1B4CCFB80E497471 +AC0B3DBE737AB8DB9ECC26:26C9D2560D7E1B8247EF2B13217E1A8F:\ +4AA17F4FE7CA759D:7BE44B5716CC3883 +97032F592A72724D4B6BDA35:66F27FB8B1A5E3AC7EAFCE2266D6C694:\ +C6913279B07861CB:ED65E32206546915 +F8B7D69BAB9A491010D7B41C7C:9F86FD8E20FA43F370B4BFE50735B62F:\ +267267DD1B7F94F5:F6B7788B39D47060 +D87C1E74D45EC6906392F3DA14E6:75F8450FE5EB0294533ABE2464248209:\ +6F5F0F3DB8D7218B:2BFF759EBBB0F0BD +BB6A3D9A99965DF79B4CE7697A281E:16B73C7FBA6F359B582921165E988021:\ +6C6FAEC81E8976BB:9519212C97D4283D +324A67F9D21E72BFA9B47B6D44F0A5A2:\ +08E30F789193EBCBE48D85AA29C9CBBA77DE5065FFD7E1CA:\ +EDC12C2E333DA4D6:4D2B65F5A40434D6 +BF0640B94C6208A3DA03C7EFF219086590:\ +2DB26514369B9A739631BE6B63E928D437EB39C3641E7C8D:\ +AFC1F8670347B23E:CF7643DE09109D0F +6796890753E748AF37ECE642392E6F4DF6D7:\ +1157FCDC653E1644319CF7933D05D60E81FB2F85A6503BC5:\ +FB90A71C36341FC0:E2854536F1ACCC7A +3E13EE1BCDB631B81D58505B471278FF1127D3:\ +E8A9BCFF29B6C0C5CB60A73C91E480AB98EECD3BB8E9A503:\ +352C22EE6D1ACB80:2FA6DDA5E4F094FF +CB286DE6105AD73D734A7E03F256556C9BEAA513:\ +423EAFEEC86ACD6807D575386F65B9B6488B51306D762E7A:\ +D2C4D489B222155D:FAB0A2C5D80FABE9 +5D047DF0F33352B1CBE1C0C6F48EE8DE30A4AC4E5A:\ +4A73158C12322376A5CB9F6A88BA8A4BB36C5D516D3112A9:\ +041B7EE6A1C92B4C:FF04A9048299F7B5 +CF0791C7717083D47546AF26317647F3E9FCA95E7228:\ +53CCEF2E488E717B0BCFF30C99E257C36B57DE139778CD3E:\ +D7D6ABBC6B3F0D51:6CDD58FDA4C96D27 +F51232D422749E5835E694EFE010190AAB2B8DDAF5E7A0:\ +5D35E1E183A8D3C3305DCB01C1751CCCF6FF6D7BE9A53C8F:\ +EABE42DC124A4526:3F57581479CDB2D1 +E0184489D98899102B9053D27B87C6F6C5D836BBFF93029F:\ +C10EB94F783DED8DF7AD46C605042CB610948CBED32E5E28924A998A1490AEE2:\ +4E6B9FC17A58A95A:70EDE349767C59A1 + +435255534820414C4C2048554D414E5A:\ +69E0288D17900DA45557053EE79CA771E90CCB8D28198E0D:\ +E3BB33E82BDB2B84:593A08135216F478 + +7777772E6D656761746F6B796F2E636F6D:\ +14D752E45A8D28EAB2A5C8E0A12E8A88E804451282F62CA5:\ +458FD140271920A6:605C41F0790BE4EA + +[DES/CBC/CTS] +9F8789F30E3ED72800:48C597491E0C3C1706:9076D5A743FC9721:A9A6C2AD38E682C1 +CD8254CBE545A5E9C714:2D6FEEC8BA6070172D37:0CDE4B75FE1C60B2:23034593F143AC0C + +AFF70EB1F349CCC1584D88:F22A14BB906DEA068689E3:\ +911DBDA323F5B30E:51D47FBBEC9C4204 + +A0CDAF182FFB93314FE439F7:762C34D15E861502E7D5C77B:\ +27399EAD16C76FEE:DEFE481F6C7333C4 + +3AA32EFC2AD3E7A81879C38905:95D71FD889E597A3F52EC664AE:\ +B221AC0CEB5AA606:1C01DA1D9AECA0AD + +58FB7BF8F6A8C26398053B5AD1EF:4B3BDD1C187FDE4EAF0EE05B2A60:\ +710931E0736D16F3:378013D6D8779222 + +1E73E7D1B82FC519E7D6778CBD9E6B:A532BC6B9C5686C563B59E6EF47F8B:\ +BAFDA9C3208592C5:1FBA498F337A06CF + +63B0ECA8495901988D536A8764EF4DE0:C9E597C818E5D2E8D525744D1E58BAE0:\ +7C92F7577E9E5821:85AD46CB62C42A4B + +3B0692000B6FFF4622977B62358615D8B5:8110C505835BFE6AEEA9D8877469F677C5:\ +EAD7E457662B61A6:9BE7F359CFD116D0 + +04AC84288F0BE9BBF06A04E2DD6DE213734C:17679CD3AD54BAF73FCD7F72C518F0B4313B:\ +31924C5C146EC54F:DBAF3718A8B17FB2 + +5D8B2B8476827B801B08098CE6F5E690FCE32C:9461193572872EDF01E2266E56CB72A78A19C7:\ +09CA9A9F64DD9CDB:6B31656961B96C3C + +F21DBD30623DDD0C3137578B1ACA3D048C075FB8:\ +24657394EC233B6C7076CF6A33FA53B86C98CE74:3B1E7CEB3483A31E:B3247C1AAE6F97DA + +A60CB3ABB1A52085A334641E9C26FEF09156E7CFC5:\ +FA9F81191286962E5B710C20C99983916AF173C8E2:\ +0C133B1D431666B2:9D01A2A546DCDD89 + +800301AAD00F8F895B84218BBA09246DB23230AF3CC3:\ +11ECD036643726BE0924C4C401058D15B63E539F773D:\ +9C6C9BC335380837:EEC9907B66BF8F8F + +5467CC7DFFCC6E60807E09AC80CC0F323AFBCF3F49B65C:\ +24788ECBB92BC763FE238037EFFEB0AACAFBF106DB081A:\ +AFBD3EC2FFFB2855:021A20C31816F20D + +B1F5B889B9D1E78BA612BD7941D5812444D3510AA83D0B72:\ +3266DA8CAB200E3C171CADE8AC651D44CDE2902EEBCF0F5B:\ +22612A76D074686F:6435B2BB76583F97 + +9C8D3469E24F2855E477222E3342136CF67673484603EDC5FD:\ +8B4405DC91225416A4A3F6838C72CD0F9743E5F1158AFF7DCD:\ +8DB74F62C79A83B7:C4422D5E3E95C4BA + +41B52662B96E82080D704718332453E8A3FFE3160C48A954244A:\ +1AC7CF83548D910658FF048174904A465D5F401FC585F69E96A0:\ +DF38AD749B054C2A:62DF2A547372237B + +BBEF9A510A56A5595612AAE5102CA399C2954E5C0A6507B7E30137:\ +525AB2A4FDC61E88D17263F7726807D66719D0E33C8D97968FB00C:\ +D7332D48E4A08E73:BF57A1ADA757E6D1 + +52407DC79E76D93EAA0AF19D9910EA4B101475972530E5DE6AADE1B8:\ +22FD7F774A84EC5B194B9B3159342F6DFC0EE7F3A82BD2DBC4551BD6:\ +BB99706196E706BE:2CB49529735604FB + +E69039A548D7C922BE551BE70A404D8BC347B5840EE4472E319C7F9430:\ +1D69B5C8EB2BA0CC8E418A24E7F397C54CE69419048E0EE7ADD6142B2F:\ +4F9BF676A7F95396:64DE012EA4EF1853 + +20081F83FD34060842DF4073EA8F5B3CAF0B289EB25FBD807050EAE314CE:\ +FFDD0C2735740CB998DF8ACFDFB2C80AF3FEDB07E01A8795FAFF51098730:\ +817F84ADC89EC13F:E166F32F3549057F + +6045C8B00A0D1349C6576AFCBD95435F90068C3949CF32FBD2190C3F906919:\ +C99CEF2CC47F6A3CF8588501D20B91F99CAC725EB2D35DC8EC9B1BFF3FC193:\ +F67E4196CC6DF276:EAA8CAD5C86EC7C6 + +A1FA682C81629A841AC8D1B371053997F4BABEF1D83D236AE4C77086DA24DBF9:\ +2074FB01FD3D750EFE0548BD2C51B127188257F76431B71AE3A3A6AFE7103822:\ +42CE0D2CE01F9ECA:71CF9AEB127BF362 + +541DA0919992A383F739B2B601B92DABD3F4AE1583D607EF692C010E7E00C21967:\ +92B790B103A7664D2508D08E21994EF3705E6F8109D83E087878085A2B5DF354A7:\ +4466C9BF5B474B21:0DF3DB1AD76656D6 + +C909604CE459AEE764AADA4203EC6AD3B34D2720890CEB8DBE38CDD955D1BED744F4:\ +602D9A17F224434CA5257433E395A8EBF714DA7A41654063F7791051786C21C6B2C5:\ +EEB3132A403F49D5:18BB520F687B1841 + +2D15B7F8554FCFA780172E27C7658A2035CDDC09DB71D10B9480C5345B250DAD722C65:\ +2ABA254E087A44939B17C0B013FD0D2515A81F552CB833F83E497B0894DDC9B66DDAE7:\ +6208B08A597F770A:4A71971DFED24F2B + +559C03E98875616C541C1FC689D006ADE4FA75C79DE33DBFA5CE7829106A6EF2199D9496:\ +8D1C902E4DDAB97D67508E13538675BD45E59E21D40432A2D2A5E9243AD30158AFD5AA69:\ +A25EEE00A0B616AF:DF78562B7DAF5D2B + +575CB34C5B252FC26D750583111B2F0440B93317119BE9ED482A0FBFBF0B6965C8BD672B6D:\ +BAD166C1EB916C9C12DD3134E4F2A85F59109032E85A6989E581AB8834C6CCDBDC5A47E7FD:\ +9BE282204F105A61:F7F2247110CE2237 + +82EFEFFC150758BF33700D7E54FDD0660D80B023B66DD10597A08BE9A5F26C9F71A00FE72CD7:\ +95EF6D44507187386142436237DFCD9F5BAA7376B71CE10D6D47DA1D7645F790D1C30FA84131:\ +86543EB8BE5D6E63:988C92F9C6E7F0A9 + +E3411B122E35669226D9A9676C5A735A645C258\ +8911B5DF3F00AE88C48FCF91CBED0EAD776511D:\ +D9DA0C4ED498214DE38DFC8B6663DC231AB17E8\ +39819761952446E7BD4F3A4D5996D843B1A080C:\ +61091390D89E195E:55F954DA491D0487 + +82905227D786AA54224A9A98EA663F11765606E3\ +7449774301E9229AACA08D8AAF88CFA055EACF46:\ +F46290E04EF671B0F1B40B6A3C957E416EC02401\ +49D8E2DA20A936E9B65DF371BE6E3507C1075823:\ +46656F1BAC4034F3:B0AE27B323665888 + +0132501B732D145D7B44D0CF92493B3FD7A56DD5E\ +8762DB54BCECFBDD68E9843A1D0BD0F20849A3756:\ +F6253C8998EB2E8A898661336F398E555241736B9\ +C0B5B83500121F96A3C85EE5BB6FC3489BBBAF3B1:\ +1C70A4D7A305675B:05131A93D393B7BC + +374A3C384D246E0703BC69704DCC2EC8E8B4B6249B\ +B9690A13F50D1723CE2638330B61D8F7328A8FA0E6:\ +6BC4D82EF7CD9780FDAA3FEF10E2C786AAA81FD28B\ +62F9EB47A2F25752A0E262554976A3BA619A02462E:\ +27B33E69D3BCC393:7166FB734C6E9095 + +BF720B89414128080AE8A26CA4429BE5BC0C2C3FF51\ +E29A13A8DF38B836817EDF289189948D9D8699DB418:\ +4717A106215F960253C5CE8B091703C4235078F444E\ +52B85E64CBDB4B1F76C7AB07346112FE05AF4356BBC:\ +593C3910E6A31016:B4F04B72B87551FF + +3B7AE22299A6A9C4CE1E553821272605ADC48B7D8BEB\ +B81E1C81F3C45CCFDCB6452989C314E1563F79D29824:\ +A48524FBFF6C0102E72A7756C488C8B317B33F7C3A5B\ +7DBAC9B5B2F3D0245837CB6E4622407ABE3E6F9E6947:\ +201DE422F64787D2:1ABB95D29DC719B7 + +D52C0A8CB50DA55BCD2DF81FD7FDE278862A60417FA2E\ +3805B99844CBE4B0DBCD062B233397CD3FDB7B05075D4:\ +92377CBF81BB2682ADCD32DF7054517FA3E3589A51042\ +0F6BE4A20E64FAB3D3F5053F8A2FDA8DCFE81BCDDB9D0:\ +656F047010D196EC:57008D1C6490B4DE + +282651F1695450455B6524AF1E2FD0C37BFEC3C37394E0\ +996CE31E46C198B24949E7DA0D33D2388B865A946EA2BF:\ +B76BE4E8CFE9B2056E2295CC3883CDA8F17DF535A51EDB\ +480931AA5BE0DC2AB2101BDE55BC8E904EF6DA53AE525C:\ +113094CFD2CC5B7E:659806A7F5D7EA7D + +9ADC8F91CEABEA3DF51FE620533E848233BAEC6DEE4DC0F\ +C6F83843491AC8F614DD036616EC8A07CE5C87A13422E88:\ +2AC49B69F5F2798FAA2726A26C4444EA6ECFE9C632FDCE9\ +D15C7A9149FC1FCE7E9D52AD5844A04F504414B5D650771:\ +58077FC3CC4757F3:6E459E39F0AB37E1 + +B6D6A97A8F856E1F1652A0C0C5B4F0CF65A98BE4B8CE2775\ +4514A2104A97775326312680F5F0D209ADB2239BF8C6CD08:\ +30DD92C5768A88EB8A8FF3FF3A4E0A2DB9BE7C9C3E358591\ +DF5807A1D4C2EEB46408CF1329A20A2A0D9D810F89CA87C3:\ +84270A179A8FCBFB:230750471B258152 + +F630D0A6CD851E68D6779C8D493BA6A3C86618A97317E3CB6\ +9CFDFD8E792E1C7E8CD786F0FBDAF0169C430001A6C8504CE:\ +F9C32B13EA6A1C1D2BE47A89CA46827840A8D5676B658D74C\ +00F36F19E7285CC5BED7A81450C70DDC9D30642EDC266AE4D:\ +2360554BF329A8D7:B58908438B0169B6 + +023A29F413E2008EFA90CFEEA4C5E95D05FC24AA151B897662\ +476C23C88928A50D28BC3A5A77A2DA6EC8AE91B579993AB509:\ +84D24A62307BAE86B50E5C3584F3648D64CCF3B60C0C74F947\ +116A2B54DE75646CADC8289F78161A1EAE8880AFB83248A57F:\ +7DA9A637BF1880B7:E1B8D1DD907D13D5 + +# Aka DES/CFB(64) +[DES/CFB] +5EEF8199471C2A7EF97509623CAE32C35A90245B70A21CE36E:\ +658B25E25DF23948847AFA4C9FFDD5B3DDF35D801CBE945168:\ +ADD9CE7BCF48C44B:0F90E78835BA3183 + +4E6F77206973207468652074696D6520666F7220616C6C20:\ +F3096249C7F46E51A69E839B1A92F78403467133898EA622:\ +0123456789ABCDEF:1234567890ABCDEF + +D14FD67A9B4D7B0F65B7CA3DA91741603DA446:\ +0CB8929A854E61AB3BEB72CE0F13BA328BA73A:\ +7132D895529A7AFF:FA1FE8F921706C75 + +# Random tests, 1...17 byte inputs +16:E1:F51CF13FD55F33B8:10E61C7F8276132E +B8F7:9F09:6A2306397E6399AF:6791874E16642DD8 +914AA4:1CDDAD:08D3B08CB02E2547:B35072A53FA36190 +252F0616:E22A706A:454A9ACA108AD24C:64DADB33CCF1DEBD +F06F376C6E:C2F054E435:087FC9F0B8BE08F3:5E511251C063B3C7 +9A181AFEC04C:C49218C8A25B:FE1EA0F0AC5F2C02:A247E69CED4A2BF1 +AC465CBD745341:768B6F5BFA9C24:1E7C7274307EDB90:AFB634941C366C1D +52BDFD51E3434E94:C5D84483756AC360:53E241E43AAD03E7:BE0A4AE59056D8FE +A62C02059AFE67CD7F:032A99BE4DF6B63F97:487C9FBD140EF278:43F88DE155E98523 +32D3C8A283257F6276C3:BCFA26EFE2D93A4B1364:8B068595D5B79177:7129287761D94D9F +17CB11A60F880C16D6CC3A:3DC099D927B8AA66B2A5C8:750C87995AFD65EE:A61398FFF559FAAD +EAA91CEDE4EFC60F02B1E0EE:75614EA2FD5474FDFE3A5612:\ +08A5F56200AC9300:9F9ED0928B8CD2DD +68DB8992E91D759256AB373748:9D0E14F0B2BE2D3B47103DA75F:\ +B11DFA915AD86FF9:3885ECF48A611DC5 +D75ACDD3E4040DFDA924CE09E627:A878CE766412A9C387AD61642FB7:\ +FBF9E6D9344B0F2C:6917F8FE1AC12101 +38B667A6E4458C8732AAE6F4D0AC36:5BCFD93D6B4B45D9D0D03162FA8FB9:\ +8616D2EA6E6106B3:CFE4DFA7044F56AB +0B439A72A4430B3D15E234034BA2C066:1ADAE0A4A0D582B70B60ED1C859A07B3:\ +E255E4A4C3606081:3F160DFF918C3F78 +82E27182FC22CD8918DDDBDB850034A4F2:9767881B1909DB5E146CAAF5FC6A118814:\ +B9CDD5442E1C7FD7:5D1B1ECEB7335274 + +[DES/CFB(32)] +BF28A5B2F3FC788F:13799E52F0BF6B0E:44FD92D1AF17DA22:5EF2AB4DE2C32258 + +083F1997FF19246C41ACC1EE3A18B489:31C4C90B034B75B21280B60751E60821:\ +75E1E4E29E6C9205:40D4F3DEF6222186 +5B38FD10CAFF5611114CAC8033DE01DE:6434BCA36287C8FB3FD0BAF32874C740:\ +875D1C19A20E6740:E2912582ACE9830A +44D4480CE326D9583E6BC13A78D7DE03:7D52C87B2A0D33B3A48631EF3184397A:\ +79FE005333D6437E:BDBED60C0E069960 +81BE542AD00FCAEB34945D89B4F29EAD:DB0DBCD722960D54B531D8AEFE1B26FB:\ +FFF6D6B146354428:2EDB634B4C7CF4EB +E0A787DA56534F407586ABA1736C9DDF:34FFCFE532186F84EF57E0CB5AFE654D:\ +330AAD15FFEB8E78:826F429D0F342F43 +302C49BF921E0516261F00B2FA2E96A6:19D49D5A54C8FD15EF317AFD5A87EBDE:\ +F15BD42AEA7F38FD:5E10F9CAF0730C4E + +[DES/CFB(16)] +6BFE8F2BF363D3DA0A2CDAAF2D7E1D44:8D407E5A8B5217C56B8A88E3CE478B85:\ +302A7B0BDB8669FF:47C89DD706739D23 + +A1A3ABFEB7BD450F:D67A4F0C8DD67769:4243AF4851BF8400:BE0C9A3B77C26C9F +D316B78F0C25C56E:E8BEBBADFFE18E2A:4F05484FAB8D47E7:CA6129BC11056056 +09BD5550EDD99666:69C4AA4C8B88370D:04ADC5D1401848D3:5DE8A3519C477771 +7C1BCEF78CA58DAD:D14FF21AFF121E8B:B045BACEC002FAAA:1716B53D7A87854E +2671E5DC0341CCF4:D618365EA3287474:8053149DC51A7F4E:E18A7936211291CC + +[DES/CFB(8)] +CDD4BAAD59214E97:DFD8C7EE7485E30C:3400AA949E053449:2ABF031C3DD08BA5 +0BE8FF9BE975CE5A:FF834A9315DE58C0:CA2CC8DCAE150ADD:2AE7960241E5ECD0 +772AEBCE3E9DB532:E31732388E069526:9D2A486812B8BBD3:AAF8C0A145A00319 +B6DD299F4D45C378:1A5DE72F6BCEDD33:CA9CEA52658150EF:4DF0F3A7B49AF71E +A5107583CA3CAC3B:D5541A94B73C2DDB:139D5249F1CEE0F9:1B3212F80A91A42E +24E224330C88791C:177AA6BD3D885167:D8D3F1611C2AD43C:7B4CDFC2344DDABF +92C51FE490D57CE8:A6ADC1AA622BAB1D:DC24F740905DDA96:5C307E5CF2C73D46 +E85D092290F3A53F:A1A2A831C55F1454:3739A5D446E8CEA5:BECAFE19A645F489 +CDE5CDDDFABED42E:4AD6E96CFBF9443E:98ABE3C8857BE8A8:B4A9E4A90C4D08D0 +6614A9AB1E3EC578:32B6733A61D38CD0:51668D4A64FB31DE:31E42E3EFE3ECD65 + +[DES/OFB] +4E6F77206973207468652074696D6520666F7220616C6C20:\ +F3096249C7F46E5135F24A242EEB3D3F3D6D5BE3255AF8C3:\ +0123456789ABCDEF:1234567890ABCDEF + +B25330D1CAB11FDDFF278192AA2C935A9C7745733E6DA8:\ +39B9BF284D6DA6E639B8040B8DA01E469DBA4C6E50B1AB:\ +F871822C7FD1D6A3:B311792C8BC02EE8 + +73AD356623A1D6E0717E838B9344B4FFF21BDA:\ +0C06E63E9E81D9976E16D2009255F917797D51:\ +5860F4A413DE6C68:527A1E050A9D71F0 + +08A6091FA2987FDC682A8199A6D6BD1F:640B5033DCF26873FA8A34DB644F2BF2:\ +3307042DC775035E:99DE32FF0351509B + +[DES/CTR-BE] +4E6F77206973207468652074696D6520666F7220616C6C20:\ +F3096249C7F46E51163A8CA0FFC94C27FA2F80F480B86F75:\ +0123456789ABCDEF:1234567890ABCDEF + +11919B328564DA68D9F4216AE1B4FA7C46AFC7AD5BB867DF1834D77A3023ECAB940725AB:\ +F40235A0B8B2EC0B53F3C0D8799497463638AD0CC3E07F0E8B8B0DC7605AE6AEAFBA2A88:\ +A67ABE525A0E5AB2:727BECDE9FCEA20A +168A502D21D71F3BEB702BBF02D3F6D04B72EFF2F19EF01D217CC7AA739A67466AF3B14E:\ +3A73770D157C23EF8913D874CD92DD36C465679B2BC691DAA0DC6CD4591C4CA44D5D69D8:\ +CDB366CCD621D62B:1ACAAC3F760C674B +24889A268E11AEF80852C4FC4893DBEBDF4CB06115FD533650CA39A639C659F47C3D5556:\ +782B24067A2C5D61BF6ED2E980F6BB16A0A6E0B5639B4208AE273C0BDC0311D65464F217:\ +EF510AA740BE98CB:74E74E01E5C72084 +3078866926F75D18239A3DA92EC9EB88D18393440B47D46A49D003F2C3B5D51C1CFE3FF4:\ +DE4D9632BE88235D717B36DE4C67B81CF3331E8925726CAD1BCC05126B87A6CD5D5DE3B6:\ +E8CBB756DE4FDEB0:AEE751205CABA9BE +4602C97A25AFB1746DE8BC1A65AE0B635ADDAB9547A99421AD86AFB087997ABC1458F0CC:\ +754BD27902EE4248BEEE65D2BB035C9139F98735C85603BA9565EDAADE37A7FE29833DD9:\ +B050B286E47C6E6A:701F72AE37D31F2B +E344E0C2E45990C451C75BF74406821B99D4EA5F56F67BB2F9B0EA52FF5D1BB25D82A181:\ +1A23AD101A776F902B8DB40E273A1F5EAE8AA1E43CBA52546F2EC50EF32960BDD05101D3:\ +445A14B76AFEFBC0:EE2DD8860B75788A +2C3A117378B8DB1287CE8FE084EAA08EFCEB253DD4A92509EAD154E6AE483E25D2B790B5:\ +75235CB3E2BF7DD3ED893DA93AE25D7A34D43521DB620E2BC9072159357010E6D81E5884:\ +4B1B62B9D6B8F54F:036CC5145BCE2A01 +FBC7E48930ADF4A36DE18CABDE25ACDAC8F9AB727E3AA69FE8EC6F965C6E14EBE9AE437D:\ +B271913A8A58ADDF3C89132A15DF1263B63018CC8EE6763E6FCFB4DD5D4AA8EC4B3E2D78:\ +2E0F06AE7B1C30D7:05E144D6DB9E7939 +940C3FE78C56A0F922FBEDE7ADE31914C993BB84F5BC1557E5F8004CB75D7D339801FBBF:\ +9615A71536135E50946A8517E72A980CBB2378A3286F08E76E85E5FB62140C9B3720C7C4:\ +E6E85EABE538195C:B86615CDA5C9E9A2 +256ABA748AE0005A5F99F1C96F8A197E3867B8455A4D6BFD6795BBDB89062B222E6B0DD7:\ +2A6B043F07ACD99141C7AC616B7F89AB7E52174A41AFC1FD0C56BC77B9C2EC9CEC87A0A6:\ +9985CE7E0D79CFEF:25D1D57C3A6936F9 +44AC3E1333DE5CD00475317CBAD26AB4A812180DAA7405556C41335572F5A236C37CD36F:\ +155E5B86FC06AD433DAEFA05C329BC1407966220BA91EAC2FD32B35C5AD973D94A0B8792:\ +47550AB0F346ECB0:1C42F4559385E11B +9DEDC376CFD97AE823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD:\ +EDE3E69EE5B55AC758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D:\ +098EFEE0D594C332:88D9C46E992B27AE + +# From NIST Special Publication 800-XX (prerelease): "Recommendation for Block +# Cipher Modes of Operation" +[AES/CBC/NoPadding] +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +7649ABAC8119B246CEE98E9B12E9197D5086CB9B507219EE95DB113A917678B2\ +73BED6B8E3C1743B7116E69E222295163FF1CAA1681FAC09120ECA307586E1A7:\ +2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +4F021DB243BC633D7178183A9FA071E8B4D9ADA9AD7DEDF4E5E738763F69145A\ +571B242012FB7AE07FA9BAAC3DF102E008B0E27988598881D920A9E64F5615CD:\ +8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:\ +000102030405060708090A0B0C0D0E0F + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +F58C4C04D6E5F1BA779EABFB5F7BFBD69CFC4E967EDB808D679F777BC6702C7D\ +39F23369A9D9BACFA530E26304231461B2EB05E2C39BE9FCDA6C19078C6A9D1B:\ +603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:\ +000102030405060708090A0B0C0D0E0F + +[AES/CFB(8)] +6BC1BEE22E409F96E93D7E117393172AAE2D:3B79424C9C0DD436BACE9E0ED4586A4F32B9:\ +2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F + +6BC1BEE22E409F96E93D7E117393172AAE2D:CDA2521EF0A905CA44CD057CBF0D47A0678A:\ +8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:\ +000102030405060708090A0B0C0D0E0F + +6BC1BEE22E409F96E93D7E117393172AAE2D:DC1F1A8520A64DB55FCC8AC554844E889700:\ +603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:\ +000102030405060708090A0B0C0D0E0F + +[AES/CFB] +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +3B3FD92EB72DAD20333449F8E83CFB4AC8A64537A0B3A93FCDE3CDAD9F1CE58B\ +26751F67A3CBB140B1808CF187A4F4DFC04B05357C5D1C0EEAC4C66F9FF7F2E6:\ +2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +CDC80D6FDDF18CAB34C25909C99A417467CE7F7F81173621961A2B70171D3D7A\ +2E1E8A1DD59B88B1C8E60FED1EFAC4C9C05F9F9CA9834FA042AE8FBA584B09FF:\ +8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:\ +000102030405060708090A0B0C0D0E0F + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +DC7E84BFDA79164B7ECD8486985D386039FFED143B28B1C832113C6331E5407B\ +DF10132415E54B92A13ED0A8267AE2F975A385741AB9CEF82031623D55B1E471:\ +603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:\ +000102030405060708090A0B0C0D0E0F + +[AES/OFB] +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +3B3FD92EB72DAD20333449F8E83CFB4A7789508D16918F03F53C52DAC54ED825\ +9740051E9C5FECF64344F7A82260EDCC304C6528F659C77866A510D9C1D6AE5E:\ +2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +CDC80D6FDDF18CAB34C25909C99A4174FCC28B8D4C63837C09E81700C1100401\ +8D9A9AEAC0F6596F559C6D4DAF59A5F26D9F200857CA6C3E9CAC524BD9ACC92A:\ +8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:\ +000102030405060708090A0B0C0D0E0F + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +DC7E84BFDA79164B7ECD8486985D38604FEBDC6740D20B3AC88F6AD82A4FB08D\ +71AB47A086E86EEDF39D1C5BBA97C4080126141D67F37BE8538F5A8BE740E484:\ +603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:\ +000102030405060708090A0B0C0D0E0F + +# From NIST Special Publication 800-XX (prerelease): "Recommendation for Block +# Cipher Modes of Operation" +[AES/CTR-BE] +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +874D6191B620E3261BEF6864990DB6CE9806F66B7970FDFF8617187BB9FFFDFF\ +5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE:\ +2B7E151628AED2A6ABF7158809CF4F3C:F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +1ABC932417521CA24F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E94\ +1E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050:\ +8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:\ +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +601EC313775789A5B7A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C5\ +2B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6:\ +603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:\ +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF + +[AES/EAX] +:32E55CE0C3FAEA48164B122C1BE22D85:\ +C61A0851AB4E515D11525B92E2B9D850:C825FC7C4D539DC74887CECC70884F37 + +60:710DABD24D400F3B6B284EA47F81EBBD26:\ +F956B879EC7F807F1FCB482B53623671:E64F90B4619D93137E6237929EABF297 + +A62B:C91C09BDD89CFC81AA4427FE8CD841B5BCAC:\ +8A554F339FC29E76EAC079676463722F:86B95FEDD6827A6EF8B17E6C4B2498D5 + +E67238:B0DC7388ADF2785A4B898443655C356695BACE:\ +A3EADDED8E4A7476DC783312CC70F878:8559F44BACCAE49D39DB6A77C1DCB065 + +29D564D8:A11BF86AB2881AFBAAD85D2B8313203262BB0ADB:\ +C1F38AD3298EA3DE3204BEC244866534:43D1D9EF0769CE901A7F0943556D1B16 + +37863FC2F1:89296DEB6C1C3CEFD643926F474568D71C4D52305C:\ +E9C35F70B9D294E9D78D904AEC528E99:EE28B45B0F136E06B7CD3D3D0D002EF6 + +9678A48724FF:2013CC564BF1077B300341089DCC23F4B20CA9B1B24F:\ +84298DDF4FAB1B8C2608453F0FEB0BAD:3035DB091BE6C0C3E3563B87DD5F8761 + +C6D04D01D2F78F:67BF2D417058C7A26F446E13BA65171CA34AFEC3F842B1:\ +C3D1651AB7A5DDB1E815FA3B91A2EF14:C49440F324F5F31DBBC46ABC96624B5A + +26C63A9C769DB4E7:7A1BC9EEC765B7525AF601B682DF05B681818F6637A64EAA:\ +A342F5559FB3E861BBB3DAD8CBC14964:489EB99930FF1057C54AF33CE7A7238A + +A6C0CD7D8555AC3C49:1A75242A16FE656C43CE8F737F60FA78F95AD18BDCDD2B0E9C:\ +D88CD2104394ECBE9AAA9F101B578DC6:0CB244FA0D43A0CD101D5266C98EAFA1 + +4215211D6CEC517F8925:FB8E6E2DFB3C7FD71DA2CE7041FA36E4357D81471DFB8754FBED:\ +773704610639CFEFA6E1B30F589D7F14:92BCF960D83B76F958E2E5AA616ECFD9 + +EC23DAB61590F6E1FB49F4:80F5426BE96A6F7076BFB5A24F080D1FCD687FB4CE1E911A532DAE:\ +33C0B5F4D5355A351E0C3D835E468705:D481CAAE6DED8823021919E31463D848 + +168A348A554CC29EC53D4AB0:\ +65397D2E8EA7E82E954EB36E0E3495781189FF5D2567EC7D3CA57225:\ +D7DF4487FAA7AA9FD485E16F25AA27EE:266C313CF766C74CB289EA78C735289E + +CF635CE20D305584C11537C1E7:\ +023D683A14128FD01704F6A97ABE231B77C30D1209EA139EC60F0FAC6E:\ +5DE8E05E68E4C3E8DDAFB5A2E0A6A92F:400DFEA369E0B09935355A4B6C1B32CA + +82287737559AC1EF31FDD382D4F2:\ +D0B1B5C3C2339BAB6C4FE1E899613C70460E825515A4C12259D9ACAFAD0C:\ +19B889E617FADA6EBB6E264FFD6AF0D1:1B72FA92A94F2C6B3F5D6812DF3D04F9 + +09C05A1D6AB2961AFB06BD429012AB:\ +14FC9EA106FC2B59595D02C746B59819D3A914D532402389CC4FD9D0573926:\ +2B488ECF950B2A8716FED085EA768A22:7F4A7C9CB42F32CE2A388B6DC99D18F4 + +2168CAC31CCF37DD4BFEDD800FE4C532:\ +4F5777260F776D716DDF5BD445BF330E55B840842EEE4838D7057EC3E95F59E4:\ +B5A870393560724B10918A377F7C28A0:E5F26301C19BDE0C99BC8DA8A052DA56 + +A1A540CED8942569B2F5FA365942442CCF:\ +DB409FE74B6CB54A7FCB00ECC6926D3CF8599767451E634D425C9C7C253CBD8DEA:\ +485BAFDED6CFE581B4BDEC8ECE072F74:48FE4CDC23B58E19B0C472F2099EC251 + +81E320373A0E35360990AB4070678E6CE72F:\ +97659AC60D8B8EE21B98F954E9C56B72C088AE5F4CA39721797D1C053E8D69E21C4F:\ +38704FDF0CF20334F749860D1F07F13F:3E2B4E746157040C97757425E15B5419 + +97D8CF240D88F651EEAFBF162BF082CF9B96AD:\ +0EAC8A7289E6B9E5C345BCBFC5A3084D0AE6CF14C9D6B0760A1DFFF31F71AB6C3CC88C:\ +93C41CA3886983F5C6F8FDF18FD5C0B3:E248A9343658F34C84E3CF537F650012 + +AC817C3EC75DBDBCDF03D6FB4ACF9A40340D8F9E:\ +E26112BE7A99FECC557C3D53674E6E670F824FE7784EFCCFA40BC88D4F88B5A29902171D:\ +3779FE6CCC7B03D2F7FDE0A37E5DE146:BA9F029AA2D995ECA82F2DDC3CBC7A73 + +8F7DB0EE7F6D12F29637694950206B5CE9424EED07:\ +70EA3A6F5DFA46723E4ED47BA1EE5E784DA0971146F0B532D28630453AC7CA713F1BE92923:\ +05E2FE7CE92A97444451D3C101C1406E:D333040B9C4D5BBCB8B7A6FA0593020A + +4EDEF8A9C660D2BECBA2B49CE509EBB6E567A47FA367:\ +FB18B846F801571026BD501FFFE67E8D51D6AE9B8379A8676F65E2C7EE0D02E9FF9BBB23482C:\ +30B6CF4FA2DDAE8CD2FC6ACAA5302B77:EEF619A392FEAC7DB491E4591088C041 + +814C87C4E33C797A93A77DB1F045996667A1C10D78123A:\ +F5526447A82E275E9CAC44EDB940171F9123C3FDA7F55D\ +8586CB574A00AFC12381F40964D096CD:\ +6EF35F1EDB02E4C384314A481487C28E:1A690BCB595164BFB80580C57D93FFEC + +7FD5E1A1547E1628F736DC7CFEFA9A00E586E02AA98FA394:\ +2EF4299CF27B80976CE57AE89DD2FE554EB7F00D38345C60\ +DB67CB9C88E078D581FB5A9F66D30688:\ +D89BD6AD540771D3DD537431D18A59C8:C13544BF30DEC01564A03F0E2FE2A208 + +B234C341F0D5552F75A1C0C917B642B0F8E08C297B92BD31EA:\ +26B7CA59E71E9B7F866C2F04A0A3829E879E59E9232073E320\ +1C3BFAE519F23654B17F07EDC8A20344:\ +960065D92C1A8B61DDCC51B2218127C2:41F0DAF7338AEF1317188EA9D6BF946C + +F67477FC490F530BC502AF52FD9D1BA4C49176EBE194B37249CB:\ +36B043B8C7B08E5B16A73F60C09EF517C14373919C028FE3B430\ +FB61CCCDE8CC4B3266FA1AAA00B25D19:\ +F982385DE22ED1592B1B697E262E81D5:807E739C22372D98220E2CD58175A07A + +488E90C2F8642F621A615B362F67EB21BCD4963151D4B255F2325B:\ +39157652A4D31EF499708E065889FD3FAF9BB5C1D8CE98CAA4F629\ +05D7070962979F403E1514CCE6BA8FB2:\ +FFE4B7162C45A6EE3E0B1DA0257FFB5C:AE6247CF1E1B65506D3A02C22C341E2B + +638B8AF02A05F6E3A8535AD5B7AF2C5FB83EDFAC7F8DF0820C895131:\ +ACBA840ABC4086D65C676AD70F19532035DD4A724454518391BAF2CD\ +1330BF920BCD19D470C5578D5004F9D1:\ +739B15D6279FC651A4BC344C108E21C7:3D4E26F58C06A10C93928E9F1BE0D08E + +9ED609612B72B5E2F04E6D377F436DCFE45B5163486EEB94A31487E1CC:\ +A0C71029D7DC4FDA90B823AB12085ECE8592CD27B61743D5C6AF02663D\ +CB3CB27958E4819DE2BEF9893EC06B7F:\ +D3396BA942CCD4B481B6A5CF23DC4E67:491D4BA46EAEECDC998080AE07617ADA + +20EC7BE8711CB24261B375FD713002517B6ADF41D8EF3BA8EA3ED7B84C0B:\ +8F969FA4F9FBF293A6FDD11906DC4296EFB87EAD619CE701CBF60487F2\ +C66BA6C281D2A8598E3AB405D1C5D0D725:\ +586DF8D45569F007AB52BB204F2C5051:7DCBBB5D0C934C483C378613EFD31F47 + +BDE3424FB4BF46067A5B09F76BE6F91203ABA18B3BB8C595C9071FE36AF048:\ +D9F1D76E17891B94CACADD217C9D37F58EDC782CC5FB539F59F965A5C4\ +43F3965DB7E399467CEB05FB59AB1AD01804:\ +28D38A778749BE8DC41996BB847DB497:805F380C9AF0D12FB9D94F9C433FE56B + +836569924C3AC998F64F43C5292C899A8A498CDDA350A1AA9F329E0EA5CB4A28:\ +869B404A038ECF556D4251C871EDA3F157983BA4D40974921D44D58AF9\ +51F007A5119534C399DA8593FBEABE60BD074F:\ +30B4BA7DEE8315E5D258AAFC8533960F:7C23EC1F738DC912BF682164336B8D63 + +6C89219F127DC76D45896C6A3B527890B5BD95473ED55D8026ADC6546A26B2D6B0:\ +392E84D3857017287A0A62701D45C2FB9A9949A1292A9C159443297A562CB89A36\ +4F85F422EAA7BF0C046D60B5F02B675A:\ +D375C2513D2F96C69B0101ED7991A336:26EA74FC47F422F5BA765FE1283591FC + +3997AA01FBF84919CD76B0DF279077ACC79D495042B89F4E3FAD42AAC9F6C9028D73:\ +6621F16BA0DAA99B85C34080B73A09B81A64DBC6EB9E237FDC3C773D41BBD2514CAD\ +E62633D626881F8685331B5A0A656711:\ +04886B4DA138C35117EAE18F96A82CDF:F96E9898BCD745FE810EF44A1181BD15 + +50B5DA3F355434BE51D36199C8834F4193CAAAED89103664ED20A9A4F481F244\ +36CC836B20B829728B8A0B530E5A94A1243E8EAD4FC4123CE4BBE0D83CD21C72\ +9EA0DDBE580630E3913B379F95CB40BA0ACE67599279957735754F71476CE4E5\ +0CC1A364C8D447590F7EF8A54A385F:\ +B08CEE141F8B1822F2C1EE4E0651F8CDBCFC095768EAF76A5EF2F7F012DAA30E\ +F7176B74264A92FBDD0E4E9CB475DBA651E1B51992716F059005C3F75022DC92\ +093ADE8A275A796D387C13C11328F1F0031A36757CF5986002F27E537367A290\ +365C026D58CA21413390E58B312F264D25E87B6CD94D13E048B694A19F8416:\ +5406C6AD9840420F75B75FE6FECBCAE3:D78C863B545A82AD6A01A50F4BDD6E9F + +AF47A39628206AA2A9A4CC539AEF077B31DC9AE5437D4021F279441333ECE8E2\ +338B785BABE2FE5587CAA821B9AF9DEA8C37CFCFB40FF0A6:\ +5E967714597273C7A8AA4F69314D2A1F75054F1110847DD421674F07FEA712BB\ +B67BB45DFF9EE7264354D750D73E3C6A773DC7AFC2B88737CE4C215EC87FD4AB\ +064707DD9B624436:\ +8935B9BC21A19E542C16B0D8F8AE2D7F:78D5A132853E1C1175ECE02AFBD1D084 + +2ED861F5F11D7D517C138AA01F61D0A007D000DB97CF5B2FD6AFE5E18558F4B3\ +3155A922722673EE3AFE8E595F5FFA672FFA42C6CA9DF6A04C:\ +147FDA2A8847B0265EF27976DF944F11BD0272021BB0269B787B6C8BE6782B21\ +4DF59BD16F569142460EE80B9B6F38C980F81098D5A4C018EF6A5CD84E4DBF93\ +1E623D74D3DDD8737B:\ +DB82D133768464CB2D873E54FA2C8EF8:BBE7581AE1BF49DC010FA69E0546EAE0 + +AFE2204DAC92FEF378DDB89A917B5A2AC94C22AD19E1EFD71EB97E4A87791037\ +5C308408C283FC3B60B4D5F12F2F1BF87B3DA6941F956B3D4FE9:\ +7AB5CAEC2D40209B3E4302BEA036D8536DC8D7E9D8FD23607421D122914B4E13\ +E1658B9924916C3D0C6B39F4B0822A98A7A7789A4E59CDDD350BFE3E3193EBAC\ +56303350B1D061910A9B:\ +87D663970DBFC792C78915C3C4757899:66A7C881A043BE46D7DDDB421A2A2CA1 + +638BC9B9EB565BFD0BFFC256464CD23F0035CC25E5FF8DA305A60C8E3C4D9F9F\ +D86959C3BFB4C0CAB48320FACFF239CF:\ +22EC2594915889C9910FF444008035D42E90F31624F6D6790B1399FCED092BCB\ +A4C68CB9F648D816A9391D8A292E4AFE20096D856F36A23D9F18D732E1645BDC:\ +2805F50D0582B00A28BD99650A3804E2:A15DA66012662AC6E94BC0B93DFA8865 + +E6CB34ACA3A0D94429AFEA82BAB4FD9541A2ADCF5D053029FD70C7BE4D088233\ +D4B6DF7757B9BB8068A502225AFFB89BA2:\ +824E5010A54C9DD6E08E0DB38A1B1DE2DD2197A00D094A0AD1F49A8D9ED6A01F\ +D1DEDC021D595FC87B54CC74665FE75A2D873241D81F1163E6EBB948DE7A18438E:\ +656AFF6B9A28680BEF2658F7A88BCB5F:6A43B623FE368BA438AEFE376699D9CB + +273DD7B96BB7A1CC9552E0EFAC43E5E58707BDF5D3CA309F7B313132F838E91F\ +75C0D8E17779AD0CCC8DFB78D1E15D58E81A4EBBE47E5B60AF8C92A8C47BC739\ +3BA01AB219C7BEE555BA5E269BBB7E83D6CC3FBA4B9A1AFA26ACA2EA276A2362\ +0A3E142305D3095A8D67802822FFABF8CBEAB31684CD11AA7AB394A11DB80427\ +F6184BFBEB545678BBD6A0DDD54CD6A13689B7BB56C865D07CFA7299B276C1A8\ +8E0CA37A60F9F21BD093F8A5DFCE461557FED0AEC6367E4230F0DCE2669D8AF5\ +A92D6F09276124F7F41C9CD3EBE3E942E1B9F0A7EF6FEA1F5FC601C6638BBB0C\ +B92A15E08B39D78055735340563C8337F673DFE5:\ +4A0F85EDD82B4E39F9185ED4E585187B51D3326DBA5FCB83CB3ACD36327109F8\ +CCE17CF5CD152DB941E3480AA22AFDC51562246CD99DE0423F6E9505349D547B\ +C39343B06025EF76F4C6C301FE1917F391433BC8A7F67A007BB7E8A238D59F5A\ +29C6B5519165B2E05E3D04493F5342E9E917C65088EF56E7C0A0A0703E3AB949\ +F86D3ACDFF9EE70815CBBFB1ADBED7F2A2C565DECA76D99FA3941719236D7B57\ +2248D8A4B2FE8DEA33C7E909C132E3D107A625FCB2E088201F3AD33A37FB4411\ +4316FD7FF1B161777FEA4391E51D102D1884671B0AB994B8BDFA91AEE09105FB\ +6BFE881FC4A67B8CEFE2E7E4DBAF844E896DFD1C4164243CB888765C58C19611\ +17A6F062:\ +E2C905428F0608F292C3FE4BED132B78:4C02F8A1754CE2CC8865037ED8E264BB + +956B7E15A1BF4DC6A9CE6DE460513D43F45191E0D1997ECA88327B01487291DD\ +DE10F27FCF3F45780EB35C6E0499B1F9EA43D9BBDC5785648A0066D273F7B051\ +07A2D0D6E2154EF0C8AA5ECD430FC62E529FE92EF76F93816FF953E2F00333F8\ +A603CE88191D78E1C7D6AE0BE57439381422660B91F98C01F2DFE3E3E317DB89\ +1AA91133C689158E5FC3994438D27C4CF4E35786DCE387CFC26AB2A5818D2E9C\ +363FCFFDC8E48B27A8246CE0F6E82CEACB8370A866F777286229CEE3B6FC7FEC\ +3C4FE90433742CDB9898BB8E80E7794C6AE9F4D0E16BF94394C7264AC3A636FF\ +F52004289430042DC8BFBB48A73494111E88E2FFF3DB42:\ +308B1A08871C3FF57397A79639FD87A99EC36711A83FD2B3250247FD3125C7FC\ +1681F6AD15B0230ADB4ACB9B3C735C287A2C530532BA1BF62DCC369D110B31C2\ +DB627A75B5419B5177956E64FFCAD6C83A391B0C2023F11FB13066E6D49BFFE2\ +FF12EE0FC05706C001401204FE70C739F0836F0175DD77AA37BC308737F7FD33\ +96FF25C6D5E6BBC9487D79D4C3F69817940A9EFC4FDB3FF3BA85BD36B4F57888\ +18B29530D3F0BE533FBFB9F175DAFBC920D5B5EEB62BA02F339A7501404E52BC\ +9DE4BBF27702189731CBBB49BE2FBAFA43F3A79BF2DE147AF3C12CCBF2FC15CF\ +A135F5EB4603A9C8158B78E600658C102EE637F77471E0F621F2EF8BDE7BB113\ +1164DBFACB1C23:\ +87A268D1650E08650328692CBC9930E9:61EFA5A996D93EA8F7C68AF6BA653841 + +169C8E816CAB0C159AEBF19C954B87089D29C5386B761D27A028DBBC2518F33B\ +B481BC202DC836C7B327634872EB500F1415477F8B64A72B8D82E8B29BDBED4F\ +5CAA708972A65026CDB46E3F9FBF4FB3D4963360FBDA8B885C733AF74E2747AB\ +D1B734445D856A2A39D869D897B88B6C4FBECC4A9857D2F5CB0CEC193333C405\ +EAF949477EB371B78BDB8F23931A8FE2D95B2C71B2FE667D0A53973E865B4371\ +548CB8D23F2A89CA0518ED98337C7B0CD7A77D8AA6E407B0379EEEBDFA312E4E\ +BDE721FC11AAC716C3B4AEF631290208D17F9277639A279A3816583247868105\ +6DA2017E4CC8940F7D4305AE6C07B63D8749B4EAE3:\ +93550CACF92B81F03129D4DA45D0B6A217202517FF34CACFF291D9FA51793F06\ +D020E63F9E54042D0E1180E131C805D3C392603316D8B990006379C54F51506F\ +8238D4EBF4F78AE95753D852AB7F0D974A16F374E20424B4E79EF83D3BF78A83\ +DE23F50078CCEEB7C8CFD887AA6EF3ED004C4F1048A608C0EDFB8FE56862E533\ +FB0BC90BB19175BA99CD747050F6DCBB229C3B11F89054B9A78A80FAECFF6821\ +1F1BDE2EEFFB2D690602478184E5C51B902C246DE285E15FEBD6AC0B7ECADFA9\ +153F982434397AD0FB4DBE4DD5A1803234F00B0894C8019741F89665D3D51587\ +792F5BD7142C739221A1C2D4A2C86BB8782F1CF7912C32C8D3A10BECB4C7AAF0\ +1DF64C2F90:\ +DC851BF2DD4E3963CF3ED171404FBD08:E4CD8527D23393DAEAD16133854B1661 + +E4BF7D594228D3CB4D7E9EC6397DB3325B61D7C1437D0634C62FC33D9B932B7F\ +52A8D894D0AB601E29FEE4637B9795D7F96D983CEA9E70B0CD33EE68C619E718\ +C1C0AD916B0DAF950B93F8872B8D5E24FAF660E494D095610483CACA9CB1E35D\ +7190EEDD9D9E72A8316A2F5CF78D80F283E0D617B16B79B5EE437F8AF462E766\ +F2D6438F74B538A51F670216F582087863DF90144A09C9394C48C340ABABA69D\ +81E92DF59E659ABDCC9CD4C11FDC3A82BBCA9606D35F3F1FA7025F52AD06F02E\ +EF1D238E82BE4B4E5A1F1079FC4AFBB71491BDE7F0FC0698FF65EAAC6BDADB5B\ +F7FEE979BC34C81754D89050228C07361DC51D0EC123A6C088906DF46B484F62\ +4638DC036CA41AC07CAA109E3618D454DDF1629E14085F9C98CC900314DF665A\ +17425D84E6774462225500586DD4AC4AC50EE8D9164775AF1306B227E51882FD\ +5ADF814057C5A2791AA2D187767ED13B8CBA14A3018A521590043C751DBE7277\ +9EF3B8F5B95A6ED3FD3F5B73BD2CAF4AE6C3EDE84D3FFDDD43395360F8C5D896\ +B9908B72EAF945E738A05BF6CD0A40B3CD2D9B1B6C98F8AFD24B10CA11E860CA\ +78EB3C62E4814A1C22A512EFAF52A27C7F3E97EBD6909BA8DBAB72EC93D2B60B\ +BDF26DA174B7BE965CD0850B232788A2651F8E3CAF29E48BD4577767292E72E7\ +20DF889497462AF317AFFF3AD787DC3CA66A7856935DE167B458CEDD8640C4A7\ +204D3BB79366AAAA15A9E4EC30C129D72BA12DBFFE0E26B266F590ED35549455\ +A1CF0C3535B7DF4B60C43791856068B002956F00A396B3098B43F6C0978A1639\ +5A226E8FD94DDA3A1112CB9672334774C8B6756B4C2874D76B6B9802F5AE3B4F\ +D0A9DFAAF7B9E408CBAF9F3EE2E6B2AA9C2715E94F89C0BAF458BDEA06F839D7\ +A2188199D265A19D1440DBF6268EA0C3B5B5AC053E6CBF33C57C1DCB7556A217\ +6F23B0418851DE9C92BA92B848327BFDE727022694C259593E7624B3CCC7CA3B\ +EA7A7C73CC5B0F5E15A2165DD4925ABCB95DE24D1F3BA65DB1CB117D92DBB97C\ +5635EF2290FF80A5A1960275285D31E2BA132FD94ED636FFA1477D332336AF79\ +6B9F9BFC9E1BA13FB1A4B4DA01E6BCBBF9EB9448C1CA476212C49535FA45AE66\ +E44962826403C115A775EFA85BAB635597F79D58C2E4BBD4A95009A395B70979\ +006BFB646FBC79163269BF8D1422E2AB1A7F04DC64BFB00D0FB9B0A570BA1E70:\ +C437723C80E3B32AEEBD6DDE08D614312CD3176E8BFA8650EAF3A34DAE3B7276\ +9F823BC48F88F42AFCBBBDDA0534E8D2C9BAB65A83939668C982A1CBC1B826B2\ +59D83FD6505381BA99B1C850D5EFB5D0DBB077F4AB021246366292971BE121C2\ +65BCAB722A6AB5B7CB7D55C91F9FD5B3BD59A8436250F17D110B5B2588F2DACC\ +98EE60884436810570A61AF2D7A424D4D597004D175B650F9EDE8D2544974909\ +05E5AFFD31DBC4FAE7EEF180B07B7D9D2579C1A140F63F31B0A2847043FE6F98\ +556A3F90DE4C28F858581F699ED3B6E3E554DD0FE91954FC067BABC6AC62E314\ +57B299B9CF5E061A9B6ED628DFBDC164AFB6560847389EE0257A7CDE811292BC\ +761E4D66D2CDEDD2C6DE0333CF8ED6682185AD5B6B1B05526338C6EF72D02A03\ +46C4527CCB3B1E3484B83FC7AFC7BFA69B111980FDC53C70BE72F3BA7F8B51A3\ +63CD590A988AEECA67265C9BB813142F34D0B2FD20B06F39C4DE7A00D763E2B2\ +01D90A8FFCD199EDE60EFFFC0CABB648C1D7F15323F0E9BC13EABD1EBE99BCBF\ +970D0AF2501826E37D222EF4D9AFAB22EE99972F2A97C84175AAA49ED2CEAF34\ +0213E29C7A88AF38F2CAD42C2AF49937262F3281B806E343AF3ED0C7535725A5\ +AD0CACBEDF519F69CF820980169FD6DB67A165F3883216E227B07E3FACB1E279\ +54FD1D08A2EC6472B0B1F7B0D6AFA2C616F6207E7A2C4444C6F952268BF73EDB\ +EB4657AF472D08BAEAFB237F118EED6CACD80E24ABEAED97D1634367000778C0\ +E095994798006D874999E542F5F479E08AD481D211A7A4D51D58CFDC374414F6\ +810A5AE08573A34D914BE3176CE7C3699D83A06FB9D8585A03854CC38B8CFDF5\ +CDD7C888790A04D2E7F2D22099A9120CE0C37390B9AD918AD0B41C4239D2BBBA\ +B82B98E59920B173BCCDE0D48FF860F91216C4A7E68E05DAF7F53EB7641171D1\ +83C976C6B9CF1F57B2E48F88BD5E8F5558934245CBFBEE365A2D457B2EA5E6CD\ +0F39AAA154692EB604B2A366B53C5893C04568BA98B4A0AFA8B6DB80C6D66E9C\ +93DFFB1BE584ED1CC111D315823F25D6BFF9367EA584A3A0FC62788D7D385D08\ +14E984E6EE556F83D01584C8DE0656DC2A89A08BBD268F0644C63B80A5BE57DE\ +F71566B677596557D4C218DEC8A7D2611FE6FA07633C558FF372308F5D680C0F\ +9858362C2B2B8C2989F19FD8411C10B6E37A647A07D0B1D5E681E25902C36231\ +E9E5E812B623D9E72C23518F082EA48C:\ +251AD494D64DAB08B66A96CB8C7876A6:F87A825C39326949EB19EE5BD30CCBF9 + +[AES/EAX(64)] +:32E55CE0C3FAEA48:\ +C61A0851AB4E515D11525B92E2B9D850:C825FC7C4D539DC74887CECC70884F37 + +60:710DABD24D400F3B6B:\ +F956B879EC7F807F1FCB482B53623671:E64F90B4619D93137E6237929EABF297 + +[AES/XTS] +# Vectors are from IEEE P1619 D11 + +0000000000000000000000000000000000000000000000000000000000000000:\ +917CF69EBD68B2EC9B9FE9A3EADDA692CD43D2F59598ED858C02C2652FBF922E:\ +0000000000000000000000000000000000000000000000000000000000000000:\ +00000000000000000000000000000000 + +4444444444444444444444444444444444444444444444444444444444444444:\ +C454185E6A16936E39334038ACEF838BFB186FFF7480ADC4289382ECD6D394F0:\ +1111111111111111111111111111111122222222222222222222222222222222:\ +33333333330000000000000000000000 + +4444444444444444444444444444444444444444444444444444444444444444:\ +B01F86F8EDC1863706FA8A4253E34F28AF319DE38334870F4DD1F94CBE9832F1:\ +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ +9A785634120000000000000000000000 + +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ +202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ +404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ +606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ +808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ +C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ +E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ +202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ +404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ +606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ +808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ +C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ +E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF:\ +27A7479BEFA1D476489F308CD4CFA6E2A96E4BBE3208FF25287DD3819616E89C\ +C78CF7F5E543445F8333D8FA7F56000005279FA5D8B5E4AD40E736DDB4D35412\ +328063FD2AAB53E5EA1E0A9F332500A5DF9487D07A5C92CC512C8866C7E860CE\ +93FDF166A24912B422976146AE20CE846BB7DC9BA94A767AAEF20C0D61AD0265\ +5EA92DC4C4E41A8952C651D33174BE51A10C421110E6D81588EDE82103A252D8\ +A750E8768DEFFFED9122810AAEB99F9172AF82B604DC4B8E51BCB08235A6F434\ +1332E4CA60482A4BA1A03B3E65008FC5DA76B70BF1690DB4EAE29C5F1BADD03C\ +5CCF2A55D705DDCD86D449511CEB7EC30BF12B1FA35B913F9F747A8AFD1B130E\ +94BFF94EFFD01A91735CA1726ACD0B197C4E5B03393697E126826FB6BBDE8ECC\ +1E08298516E2C9ED03FF3C1B7860F6DE76D4CECD94C8119855EF5297CA67E9F3\ +E7FF72B1E99785CA0A7E7720C5B36DC6D72CAC9574C8CBBC2F801E23E56FD344\ +B07F22154BEBA0F08CE8891E643ED995C94D9A69C9F1B5F499027A78572AEEBD\ +74D20CC39881C213EE770B1010E4BEA718846977AE119F7A023AB58CCA0AD752\ +AFE656BB3C17256A9F6E9BF19FDD5A38FC82BBE872C5539EDB609EF4F79C203E\ +BB140F2E583CB2AD15B4AA5B655016A8449277DBD477EF2C8D6C017DB738B18D\ +EB4A427D1923CE3FF262735779A418F20A282DF920147BEABE421EE5319D0568:\ +2718281828459045235360287471352631415926535897932384626433832795:\ +00000000000000000000000000000000 + +27A7479BEFA1D476489F308CD4CFA6E2A96E4BBE3208FF25287DD3819616E89C\ +C78CF7F5E543445F8333D8FA7F56000005279FA5D8B5E4AD40E736DDB4D35412\ +328063FD2AAB53E5EA1E0A9F332500A5DF9487D07A5C92CC512C8866C7E860CE\ +93FDF166A24912B422976146AE20CE846BB7DC9BA94A767AAEF20C0D61AD0265\ +5EA92DC4C4E41A8952C651D33174BE51A10C421110E6D81588EDE82103A252D8\ +A750E8768DEFFFED9122810AAEB99F9172AF82B604DC4B8E51BCB08235A6F434\ +1332E4CA60482A4BA1A03B3E65008FC5DA76B70BF1690DB4EAE29C5F1BADD03C\ +5CCF2A55D705DDCD86D449511CEB7EC30BF12B1FA35B913F9F747A8AFD1B130E\ +94BFF94EFFD01A91735CA1726ACD0B197C4E5B03393697E126826FB6BBDE8ECC\ +1E08298516E2C9ED03FF3C1B7860F6DE76D4CECD94C8119855EF5297CA67E9F3\ +E7FF72B1E99785CA0A7E7720C5B36DC6D72CAC9574C8CBBC2F801E23E56FD344\ +B07F22154BEBA0F08CE8891E643ED995C94D9A69C9F1B5F499027A78572AEEBD\ +74D20CC39881C213EE770B1010E4BEA718846977AE119F7A023AB58CCA0AD752\ +AFE656BB3C17256A9F6E9BF19FDD5A38FC82BBE872C5539EDB609EF4F79C203E\ +BB140F2E583CB2AD15B4AA5B655016A8449277DBD477EF2C8D6C017DB738B18D\ +EB4A427D1923CE3FF262735779A418F20A282DF920147BEABE421EE5319D0568:\ +264D3CA8512194FEC312C8C9891F279FEFDD608D0C027B60483A3FA811D65EE5\ +9D52D9E40EC5672D81532B38B6B089CE951F0F9C35590B8B978D175213F329BB\ +1C2FD30F2F7F30492A61A532A79F51D36F5E31A7C9A12C286082FF7D2394D18F\ +783E1A8E72C722CAAAA52D8F065657D2631FD25BFD8E5BAAD6E527D763517501\ +C68C5EDC3CDD55435C532D7125C8614DEED9ADAA3ACADE5888B87BEF641C4C99\ +4C8091B5BCD387F3963FB5BC37AA922FBFE3DF4E5B915E6EB514717BDD2A7407\ +9A5073F5C4BFD46ADF7D282E7A393A52579D11A028DA4D9CD9C77124F9648EE3\ +83B1AC763930E7162A8D37F350B2F74B8472CF09902063C6B32E8C2D9290CEFB\ +D7346D1C779A0DF50EDCDE4531DA07B099C638E83A755944DF2AEF1AA31752FD\ +323DCB710FB4BFBB9D22B925BC3577E1B8949E729A90BBAFEACF7F7879E7B114\ +7E28BA0BAE940DB795A61B15ECF4DF8DB07B824BB062802CC98A9545BB2AAEED\ +77CB3FC6DB15DCD7D80D7D5BC406C4970A3478ADA8899B329198EB61C193FB62\ +75AA8CA340344A75A862AEBE92EEE1CE032FD950B47D7704A3876923B4AD6284\ +4BF4A09C4DBE8B4397184B7471360C9564880AEDDDB9BAA4AF2E75394B08CD32\ +FF479C57A07D3EAB5D54DE5F9738B8D27F27A9F0AB11799D7B7FFEFB2704C95C\ +6AD12C39F1E867A4B7B1D7818A4B753DFD2A89CCB45E001A03A867B187F225DD:\ +2718281828459045235360287471352631415926535897932384626433832795:\ +01000000000000000000000000000000 + +264D3CA8512194FEC312C8C9891F279FEFDD608D0C027B60483A3FA811D65EE5\ +9D52D9E40EC5672D81532B38B6B089CE951F0F9C35590B8B978D175213F329BB\ +1C2FD30F2F7F30492A61A532A79F51D36F5E31A7C9A12C286082FF7D2394D18F\ +783E1A8E72C722CAAAA52D8F065657D2631FD25BFD8E5BAAD6E527D763517501\ +C68C5EDC3CDD55435C532D7125C8614DEED9ADAA3ACADE5888B87BEF641C4C99\ +4C8091B5BCD387F3963FB5BC37AA922FBFE3DF4E5B915E6EB514717BDD2A7407\ +9A5073F5C4BFD46ADF7D282E7A393A52579D11A028DA4D9CD9C77124F9648EE3\ +83B1AC763930E7162A8D37F350B2F74B8472CF09902063C6B32E8C2D9290CEFB\ +D7346D1C779A0DF50EDCDE4531DA07B099C638E83A755944DF2AEF1AA31752FD\ +323DCB710FB4BFBB9D22B925BC3577E1B8949E729A90BBAFEACF7F7879E7B114\ +7E28BA0BAE940DB795A61B15ECF4DF8DB07B824BB062802CC98A9545BB2AAEED\ +77CB3FC6DB15DCD7D80D7D5BC406C4970A3478ADA8899B329198EB61C193FB62\ +75AA8CA340344A75A862AEBE92EEE1CE032FD950B47D7704A3876923B4AD6284\ +4BF4A09C4DBE8B4397184B7471360C9564880AEDDDB9BAA4AF2E75394B08CD32\ +FF479C57A07D3EAB5D54DE5F9738B8D27F27A9F0AB11799D7B7FFEFB2704C95C\ +6AD12C39F1E867A4B7B1D7818A4B753DFD2A89CCB45E001A03A867B187F225DD:\ +FA762A3680B76007928ED4A4F49A9456031B704782E65E16CECB54ED7D017B5E\ +18ABD67B338E81078F21EDB7868D901EBE9C731A7C18B5E6DEC1D6A72E078AC9\ +A4262F860BEEFA14F4E821018272E411A951502B6E79066E84252C3346F3AA62\ +344351A291D4BEDC7A07618BDEA2AF63145CC7A4B8D4070691AE890CD65733E7\ +946E9021A1DFFC4C59F159425EE6D50CA9B135FA6162CEA18A939838DC000FB3\ +86FAD086ACCE5AC07CB2ECE7FD580B00CFA5E98589631DC25E8E2A3DAF2FFDEC\ +26531659912C9D8F7A15E5865EA8FB5816D6207052BD7128CD743C12C8118791\ +A4736811935EB982A532349E31DD401E0B660A568CB1A4711F552F55DED59F1F\ +15BF7196B3CA12A91E488EF59D64F3A02BF45239499AC6176AE321C4A211EC54\ +5365971C5D3F4F09D4EB139BFDF2073D33180B21002B65CC9865E76CB24CD92C\ +874C24C18350399A936AB3637079295D76C417776B94EFCE3A0EF7206B151105\ +19655C956CBD8B2489405EE2B09A6B6EEBE0C53790A12A8998378B33A5B71159\ +625F4BA49D2A2FDBA59FBF0897BC7AABD8D707DC140A80F0F309F835D3DA54AB\ +584E501DFA0EE977FEC543F74186A802B9A37ADB3E8291ECA04D66520D229E60\ +401E7282BEF486AE059AA70696E0E305D777140A7A883ECDCB69B9FF938E8A42\ +31864C69CA2C2043BED007FF3E605E014BCF518138DC3A25C5E236171A2D01D6:\ +2718281828459045235360287471352631415926535897932384626433832795:\ +02000000000000000000000000000000 + +8E41B78C390B5AF9D758BB214A67E9F6BF7727B09AC6124084C37611398FA45D\ +AAD94868600ED391FB1ACD4857A95B466E62EF9F4B377244D1C152E7B30D731A\ +AD30C716D214B707AED99EB5B5E580B3E887CF7497465651D4B60E6042051DA3\ +693C3B78C14489543BE8B6AD0BA629565BBA202313BA7B0D0C94A3252B676F46\ +CC02CE0F8A7D34C0ED229129673C1F61AED579D08A9203A25AAC3A77E9DB6026\ +7996DB38DF637356D9DCD1632E369939F2A29D89345C66E05066F1A3677AEF18\ +DEA4113FAEB629E46721A66D0A7E785D3E29AF2594EB67DFA982AFFE0AAC058F\ +6E15864269B135418261FC3AFB089472CF68C45DD7F231C6249BA0255E1E0338\ +33FC4D00A3FE02132D7BC3873614B8AEE34273581EA0325C81F0270AFFA13641\ +D052D36F0757D484014354D02D6883CA15C24D8C3956B1BD027BCF41F151FD80\ +23C5340E5606F37E90FDB87C86FB4FA634B3718A30BACE06A66EAF8F63C4AA3B\ +637826A87FE8CFA44282E92CB1615AF3A28E53BC74C7CBA1A0977BE9065D0C1A\ +5DEC6C54AE38D37F37AA35283E048E5530A85C4E7A29D7B92EC0C3169CDF2A80\ +5C7604BCE60049B9FB7B8EAAC10F51AE23794CEBA68BB58112E293B9B692CA72\ +1B37C662F8574ED4DBA6F88E170881C82CDDC1034A0CA7E284BF0962B6B26292\ +D836FA9F73C1AC770EEF0F2D3A1EAF61D3E03555FD424EEDD67E18A18094F888:\ +D55F684F81F4426E9FDE92A5FF02DF2AC896AF63962888A97910C1379E20B0A3\ +B1DB613FB7FE2E07004329EA5C22BFD33E3DBE4CF58CC608C2C26C19A2E2FE22\ +F98732C2B5CB844CC6C0702D91E1D50FC4382A7EBA5635CD602432A2306AC4CE\ +82F8D70C8D9BC15F918FE71E74C622D5CF71178BF6E0B9CC9F2B41DD8DBE441C\ +41CD0C73A6DC47A348F6702F9D0E9B1B1431E948E299B9EC2272AB2C5F0C7BE8\ +6AFFA5DEC87A0BEE81D3D50007EDAA2BCFCCB35605155FF36ED8EDD4A40DCD4B\ +243ACD11B2B987BDBFAF91A7CAC27E9C5AEA525EE53DE7B2D3332C8644402B82\ +3E94A7DB26276D2D23AA07180F76B4FD29B9C0823099C9D62C519880AEE7E969\ +7617C1497D47BF3E571950311421B6B734D38B0DB91EB85331B91EA9F61530F5\ +4512A5A52A4BAD589EB69781D537F23297BB459BDAD2948A29E1550BF4787E0B\ +E95BB173CF5FAB17DAB7A13A052A63453D97CCEC1A321954886B7A1299FAAEEC\ +AE35C6EAACA753B041B5E5F093BF83397FD21DD6B3012066FCC058CC32C3B09D\ +7562DEE29509B5839392C9FF05F51F3166AAAC4AC5F238038A3045E6F72E48EF\ +0FE8BC675E82C318A268E43970271BF119B81BF6A982746554F84E72B9F00280\ +A320A08142923C23C883423FF949827F29BBACDC1CCDB04938CE6098C95BA6B3\ +2528F4EF78EED778B2E122DDFD1CBDD11D1C0A6783E011FC536D63D053260637:\ +2718281828459045235360287471352631415926535897932384626433832795:\ +FD000000000000000000000000000000 + +D55F684F81F4426E9FDE92A5FF02DF2AC896AF63962888A97910C1379E20B0A3\ +B1DB613FB7FE2E07004329EA5C22BFD33E3DBE4CF58CC608C2C26C19A2E2FE22\ +F98732C2B5CB844CC6C0702D91E1D50FC4382A7EBA5635CD602432A2306AC4CE\ +82F8D70C8D9BC15F918FE71E74C622D5CF71178BF6E0B9CC9F2B41DD8DBE441C\ +41CD0C73A6DC47A348F6702F9D0E9B1B1431E948E299B9EC2272AB2C5F0C7BE8\ +6AFFA5DEC87A0BEE81D3D50007EDAA2BCFCCB35605155FF36ED8EDD4A40DCD4B\ +243ACD11B2B987BDBFAF91A7CAC27E9C5AEA525EE53DE7B2D3332C8644402B82\ +3E94A7DB26276D2D23AA07180F76B4FD29B9C0823099C9D62C519880AEE7E969\ +7617C1497D47BF3E571950311421B6B734D38B0DB91EB85331B91EA9F61530F5\ +4512A5A52A4BAD589EB69781D537F23297BB459BDAD2948A29E1550BF4787E0B\ +E95BB173CF5FAB17DAB7A13A052A63453D97CCEC1A321954886B7A1299FAAEEC\ +AE35C6EAACA753B041B5E5F093BF83397FD21DD6B3012066FCC058CC32C3B09D\ +7562DEE29509B5839392C9FF05F51F3166AAAC4AC5F238038A3045E6F72E48EF\ +0FE8BC675E82C318A268E43970271BF119B81BF6A982746554F84E72B9F00280\ +A320A08142923C23C883423FF949827F29BBACDC1CCDB04938CE6098C95BA6B3\ +2528F4EF78EED778B2E122DDFD1CBDD11D1C0A6783E011FC536D63D053260637:\ +72EFC1EBFE1EE25975A6EB3AA8589DDA2B261F1C85BDAB442A9E5B2DD1D7C395\ +7A16FC08E526D4B1223F1B1232A11AF274C3D70DAC57F83E0983C498F1A6F1AE\ +CB021C3E70085A1E527F1CE41EE5911A82020161529CD82773762DAF5459DE94\ +A0A82ADAE7E1703C808543C29ED6FB32D9E004327C1355180C995A07741493A0\ +9C21BA01A387882DA4F62534B87BB15D60D197201C0FD3BF30C1500A3ECFECDD\ +66D8721F90BCC4C17EE925C61B0A03727A9C0D5F5CA462FBFA0AF1C2513A9D9D\ +4B5345BD27A5F6E653F751693E6B6A2B8EAD57D511E00E58C45B7B8D005AF792\ +88F5C7C22FD4F1BF7A898B03A5634C6A1AE3F9FAE5DE4F296A2896B23E7ED43E\ +D14FA5A2803F4D28F0D3FFCF24757677AEBDB47BB388378708948A8D4126ED18\ +39E0DA29A537A8C198B3C66AB00712DD261674BF45A73D67F76914F830CA014B\ +65596F27E4CF62DE66125A5566DF9975155628B400FBFB3A29040ED50FAFFDBB\ +18AECE7C5C44693260AAB386C0A37B11B114F1C415AEBB653BE468179428D43A\ +4D8BC3EC38813ECA30A13CF1BB18D524F1992D44D8B1A42EA30B22E6C95B199D\ +8D182F8840B09D059585C31AD691FA0619FF038ACA2C39A943421157361717C4\ +9D322028A74648113BD8C9D7EC77CF3C89C1EC8718CEFF8516D96B34C3C614F1\ +0699C9ABC4ED0411506223BEA16AF35C883ACCDBE1104EEF0CFDB54E12FB230A:\ +2718281828459045235360287471352631415926535897932384626433832795:\ +FE000000000000000000000000000000 + +72EFC1EBFE1EE25975A6EB3AA8589DDA2B261F1C85BDAB442A9E5B2DD1D7C395\ +7A16FC08E526D4B1223F1B1232A11AF274C3D70DAC57F83E0983C498F1A6F1AE\ +CB021C3E70085A1E527F1CE41EE5911A82020161529CD82773762DAF5459DE94\ +A0A82ADAE7E1703C808543C29ED6FB32D9E004327C1355180C995A07741493A0\ +9C21BA01A387882DA4F62534B87BB15D60D197201C0FD3BF30C1500A3ECFECDD\ +66D8721F90BCC4C17EE925C61B0A03727A9C0D5F5CA462FBFA0AF1C2513A9D9D\ +4B5345BD27A5F6E653F751693E6B6A2B8EAD57D511E00E58C45B7B8D005AF792\ +88F5C7C22FD4F1BF7A898B03A5634C6A1AE3F9FAE5DE4F296A2896B23E7ED43E\ +D14FA5A2803F4D28F0D3FFCF24757677AEBDB47BB388378708948A8D4126ED18\ +39E0DA29A537A8C198B3C66AB00712DD261674BF45A73D67F76914F830CA014B\ +65596F27E4CF62DE66125A5566DF9975155628B400FBFB3A29040ED50FAFFDBB\ +18AECE7C5C44693260AAB386C0A37B11B114F1C415AEBB653BE468179428D43A\ +4D8BC3EC38813ECA30A13CF1BB18D524F1992D44D8B1A42EA30B22E6C95B199D\ +8D182F8840B09D059585C31AD691FA0619FF038ACA2C39A943421157361717C4\ +9D322028A74648113BD8C9D7EC77CF3C89C1EC8718CEFF8516D96B34C3C614F1\ +0699C9ABC4ED0411506223BEA16AF35C883ACCDBE1104EEF0CFDB54E12FB230A:\ +3260AE8DAD1F4A32C5CAFE3AB0EB95549D461A67CEB9E5AA2D3AFB62DECE0553\ +193BA50C75BE251E08D1D08F1088576C7EFDFAAF3F459559571E12511753B07A\ +F073F35DA06AF0CE0BBF6B8F5CCC5CEA500EC1B211BD51F63B606BF6528796CA\ +12173BA39B8935EE44CCCE646F90A45BF9CCC567F0ACE13DC2D53EBEEDC81F58\ +B2E41179DDDF0D5A5C42F5D8506C1A5D2F8F59F3EA873CBCD0EEC19ACBF32542\ +3BD3DCB8C2B1BF1D1EAED0EBA7F0698E4314FBEB2F1566D1B9253008CBCCF45A\ +2B0D9C5C9C21474F4076E02BE26050B99DEE4FD68A4CF890E496E4FCAE7B70F9\ +4EA5A9062DA0DAEBA1993D2CCD1DD3C244B8428801495A58B216547E7E847C46\ +D1D756377B6242D2E5FB83BF752B54E0DF71E889F3A2BB0F4C10805BF3C59037\ +6E3C24E22FF57F7FA965577375325CEA5D920DB94B9C336B455F6E894C01866F\ +E9FBB8C8D3F70A2957285F6DFB5DCD8CBF54782F8FE7766D4723819913AC7734\ +21E3A31095866BAD22C86A6036B2518B2059B4229D18C8C2CCBDF906C6CC6E82\ +464EE57BDDB0BEBCB1DC645325BFB3E665EF7251082C88EBB1CF203BD779FDD3\ +8675713C8DAADD17E1CABEE432B09787B6DDF3304E38B731B45DF5DF51B78FCF\ +B3D32466028D0BA36555E7E11AB0EE0666061D1645D962444BC47A38188930A8\ +4B4D561395C73C087021927CA638B7AFC8A8679CCB84C26555440EC7F10445CD:\ +2718281828459045235360287471352631415926535897932384626433832795:\ +FF000000000000000000000000000000 + +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ +202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ +404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ +606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ +808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ +C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ +E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ +202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ +404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ +606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ +808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ +C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ +E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF:\ +1C3B3A102F770386E4836C99E370CF9BEA00803F5E482357A4AE12D414A3E63B\ +5D31E276F8FE4A8D66B317F9AC683F44680A86AC35ADFC3345BEFECB4BB188FD\ +5776926C49A3095EB108FD1098BAEC70AAA66999A72A82F27D848B21D4A741B0\ +C5CD4D5FFF9DAC89AEBA122961D03A757123E9870F8ACF1000020887891429CA\ +2A3E7A7D7DF7B10355165C8B9A6D0A7DE8B062C4500DC4CD120C0F7418DAE3D0\ +B5781C34803FA75421C790DFE1DE1834F280D7667B327F6C8CD7557E12AC3A0F\ +93EC05C52E0493EF31A12D3D9260F79A289D6A379BC70C50841473D1A8CC81EC\ +583E9645E07B8D9670655BA5BBCFECC6DC3966380AD8FECB17B6BA02469A020A\ +84E18E8F84252070C13E9F1F289BE54FBC481457778F616015E1327A02B140F1\ +505EB309326D68378F8374595C849D84F4C333EC4423885143CB47BD71C5EDAE\ +9BE69A2FFECEB1BEC9DE244FBE15992B11B77C040F12BD8F6A975A44A0F90C29\ +A9ABC3D4D893927284C58754CCE294529F8614DCD2ABA991925FEDC4AE74FFAC\ +6E333B93EB4AFF0479DA9A410E4450E0DD7AE4C6E2910900575DA401FC07059F\ +645E8B7E9BFDEF33943054FF84011493C27B3429EAEDB4ED5376441A77ED4385\ +1AD77F16F541DFD269D50D6A5F14FB0AAB1CBB4C1550BE97F7AB4066193C4CAA\ +773DAD38014BD2092FA755C824BB5E54C4F36FFDA9FCEA70B9C6E693E148C151:\ +2718281828459045235360287471352662497757247093699959574966967627\ +3141592653589793238462643383279502884197169399375105820974944592:\ +FF000000000000000000000000000000 + +000102030405060708090A0B0C0D0E0F10:\ +6C1625DB4671522D3D7599601DE7CA09ED:\ +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ +9A785634120000000000000000000000 + +000102030405060708090A0B0C0D0E0F1011:\ +D069444B7A7E0CAB09E24447D24DEB1FEDBF:\ +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ +9A785634120000000000000000000000 + +000102030405060708090A0B0C0D0E0F101112:\ +E5DF1351C0544BA1350B3363CD8EF4BEEDBF9D:\ +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ +9A785634120000000000000000000000 + +000102030405060708090A0B0C0D0E0F10111213:\ +9D84C813F719AA2C7BE3F66171C7C5C2EDBF9DAC:\ +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ +9A785634120000000000000000000000 + +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ +202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ +404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ +606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ +808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ +C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ +E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ +202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ +404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ +606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ +808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ +C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ +E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF:\ +38B45812EF43A05BD957E545907E223B954AB4AAF088303AD910EADF14B42BE6\ +8B2461149D8C8BA85F992BE970BC621F1B06573F63E867BF5875ACAFA04E42CC\ +BD7BD3C2A0FB1FFF791EC5EC36C66AE4AC1E806D81FBF709DBE29E471FAD3854\ +9C8E66F5345D7C1EB94F405D1EC785CC6F6A68F6254DD8339F9D84057E01A177\ +41990482999516B5611A38F41BB6478E6F173F320805DD71B1932FC333CB9EE3\ +9936BEEA9AD96FA10FB4112B901734DDAD40BC1878995F8E11AEE7D141A2F5D4\ +8B7A4E1E7F0B2C04830E69A4FD1378411C2F287EDF48C6C4E5C247A19680F7FE\ +41CEFBD49B582106E3616CBBE4DFB2344B2AE9519391F3E0FB4922254B1D6D2D\ +19C6D4D537B3A26F3BCC51588B32F3ECA0829B6A5AC72578FB814FB43CF80D64\ +A233E3F997A3F02683342F2B33D25B492536B93BECB2F5E1A8B82F5B88334272\ +9E8AE09D16938841A21A97FB543EEA3BBFF59F13C1A18449E398701C1AD51648\ +346CBC04C27BB2DA3B93A1372CCAE548FB53BEE476F9E9C91773B1BB19828394\ +D55D3E1A20ED69113A860B6829FFA847224604435070221B257E8DFF783615D2\ +CAE4803A93AA4334AB482A0AFAC9C0AEDA70B45A481DF5DEC5DF8CC0F423C77A\ +5FD46CD312021D4B438862419A791BE03BB4D97C0E59578542531BA466A83BAF\ +92CEFC151B5CC1611A167893819B63FB8A6B18E86DE60290FA72B797B0CE59F3:\ +E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF:\ +21436587A90000000000000000000000 + +# Generated by Botan + +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E:\ +D05BC090A8E04F1B3D3ECDD5BAEC0FD4EDBF9DACE45D6F6A7306E64BE5DD82:\ +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ +9A785634120000000000000000000000 + +[Serpent/CTR-BE] +F3:3A:\ +740614949B42870F0851A0D639A37AC8288898B0F9CC3B326B983ADA69BDBB76:\ +3377FFD0C8093067A0E33B8700E2C2E1 + +3018:053E:\ +872BCAEFB1985B9C10B1F2DE2790E22CF31C362AC7276D437D0DD697F1682BC4:\ +53C8B7C9BA119E81AC5474FB70BF82FB + +C503C6:DC4178:\ +DE3317D05233577D476509E638486ED2ABE26ABFD847C13A8AAB189F322F46B8:\ +47D690C680A567B9942BBD0A2700B884 + +FC9B1F9C:89FC80B9:\ +A2B4D60F8F9B35C56168D80E8828F3931A5BDA190E65B9B06A814277DB2B4F63:\ +B3B98D928D3EBE1B9E07B291ACF9CD2A + +F1CDFB642B:2BEBCA6F33:\ +E39D7D09F410CDC21333D8EBE5E33E7A2E24872A99254AEDAFFC633061C32EE6:\ +107FA9631083DE98F5C72A383F541F3E + +9C3BACCD6154:DE9920471C92:\ +9F7268895714AFE229162D50CA59F1273744BDC28B198E1685F4323AFAE1243D:\ +68C5EEB64FC3DE106B99C0896CC0689E + +B5602241E6ACAF:2FD52D0292019C:\ +27757554DD1B5BE2E660576FBAEB238A0F7642F9A65771B69AF276A57FC04354:\ +9BB3DB1661C90DE853294D20A369B999 + +8E27C11E30E23C5F:0294FE7CC3F020FB:\ +84688112BE481C65B282D4DF9A953526AEBF05FDD2F3D84E7C32830E3BC185C8:\ +3ABFC6E1B2358A3B968E416B9087BBD9 + +A4CC3F182076E93409:00EE68EB6CC635BCFB:\ +967BA8A79CCD302B294E519813B72EB5C4D24BD86322FBDE08C292C2DC4723E8:\ +D7DB3A2BC532D1F1685CB612FBCF33A1 + +25B63E2B38DFF81FA490:E75F1A6DF39CC7A76D12:\ +6757B7CA6D7EEBFD0E679E18CB30D16ACC71D0B1A149DA27E439DA1BA0BA37C9:\ +3199830075CB5E87016EEAE5B0B26F13 + +310605508E614C101E829B:366A5DCEB8E76183C95CFC:\ +F92107A1778C99C45B4E229567BF5CCAB2C5B1204052B8720161AEDCCF57E36F:\ +378D5BF003FB48A4D183D5227151FE11 + +6A706D5F6526ED4AAEE00D7D:8145258ED5FE88C34E671101:\ +F892DD670B66CCF6B8E458A6F068FBA79F4A69AE3A028E43D8E219BE940BB826:\ +08BA9435AF764BE0E44515FF72D6DCBD + +FE62E34899D4115DF7FFF51A8A:66F68C5AEC9A4BB123056667D9:\ +BCE52007E10A2CF3077D00225C95F2D68FCDF380AC17304553FBC1DA10117B15:\ +3FFED78824BEB8D6D655CC80190124BE + +191D3CFE172BEFAC1A8A428DF951:7CE0D419C43342FD2CD8D56685BF:\ +534A1F49FCD2D99E2ED2F094E170809091195EDEA2ED94EA4DEE64F9A6F89E05:\ +D98E8D86E9BE95318429FD7286D528E5 + +2C92024B2587851C0F58C91B822DF6:36FAB117335A5F0C619826ED801670:\ +41422F58E73BE8C494D750910CA612B2FDA0A41D041ADDDAB4144DF30CE7B26B:\ +DF0771CEB11F1BAF934289FA42F54319 + +0CC08B6ED36673C0591901E14AEF4792:250C9E812F38A9192CC65C6EE5B9DB60:\ +EDA2AFF3C4923D3CE745EB78655B0D27DBDB5C584AFE56564C7B625903CED927:\ +95C67856E6EB7B0E98F0934A47DF6485 + +C6B6E1F1BC46E8377F6C397C136461973F:AA0C36B960BFC811185F74D22356686414:\ +D4FBFD37C5B9D12E5E43D1867E1692A2B331CAC9E6C46C228A45E95AFA303185:\ +30B9693B12B7F48C1C07F1441706821D + +CF1DAFB2581C47D06D8F178787729F8FF457:\ +10510051990A826CFFDF9014CA0B49481E39:\ +47E9CA81E014F6AA4F94A7C0B8A533B7A636FF14E76935D9C7A3CB01E3AD64E9:\ +DEE733BD4644E258CF98F7FE87AD8E5A + +EB95043E36EFDF2B5FB8F17B6806B2B021D1DD:\ +A739171DAE7EC95CEB492183803D37165D1A79:\ +6BBA2F42B85C58A4916F618A294553E084E223739F575159DE9EC4F5A63F3AAB:\ +0DCA755F625F78C363AC7EAB801DD471 + +3277ADC7055990FDA21C89F183F0A380E71B696D:\ +610369449E344D609EEB89210AFFD1C90B05C197:\ +F3702792DEFB775F10B142CAA78D05DB26A4A8061CEB39FA2B4A27106DE8D9DF:\ +5C8EF39AE0EDAEB76CF3C10B94D1A002 + +43733C60414C054EACF68F85C67D547AFD0003AABA:\ +E8F7CCA960B713991BEF20DEB3DF284ECFE912B479:\ +AAE83136AB1EC19B3BC892B0B5E8EC7A6E20FF5AC6C126DAF6189A7E2E344AF0:\ +C99EBDE92D57326A37B4B6F2C19363FD + +E2ACCDA4075886B085C7A7B71E39BD23F71DD16BC4E1:\ +7A0552BA9DBCE00A60AB31F8D0E590D79E2EBFC49713:\ +222373452D105C2F58E87F5DDDF07FE464E47BC8309718FB30674770CA24FD34:\ +A03B629DB1C399F8EE32A7C08C0FDDB3 + +33CF3C69194FBBD03B0496F1982C570B363DDE621303AE:\ +8D2763FAD25E2A3BA7F4EE3ADA3CC05310B453734EEC56:\ +CCD9F95EB29B2609CB35C959009B56FD43A60B4353A2F3D60FE78F2219074330:\ +884C24E8368B3DB123F47D03F3812F12 + +32DE0A03F6D52AA26BEECF4AB22ABF3A49768683F86EA983:\ +D4EE5E9BD04A09D73DFA9752A8DFAD00F151E822052B500B:\ +F7C88B964D55E40A04D8016900A3449015D6324DE16A024C0F9FBB1DE505C1AC:\ +308E6F85EE34ECE3C70C1EE2CB7E6777 + +52F14AAE8ADB041BAC458EF07FA247FE50B868888089587933:\ +BE61DB06D28CA4D3B418F10F463FC42EA254929C5C87D35418:\ +972C448AA251ACA8F589BE0F5793100D14EE3282DFB321CE5943FDE99D1F31AE:\ +11C202F46DC54AEDFBB543C3A55E7DB8 + +E56DFAD59ECA41C38A68C64388CA4D2CF94B319C65E033C26A8C:\ +DC4A5B96090CC569B623D54BB1DAA4A7B6D879F21BA420D80637:\ +DFFBD3EA5DB1F4D7D9613F069BAF8737F0E37A33BAC9A9AE2EC67FF20E37442D:\ +17E670BC9C590D7B320A233232D43311 + +A89CF708448D7D4B1BD8C252F9EF7A0A7D978A1E862713F807E0FD:\ +A244860FB2E83D608B25D77ED4EBBCAA7C2AF886708002C77EB5F5:\ +A14BB231478EBDBD7B6A7D7039559099AAA281D25D095F286B8104DF77DE0C8A:\ +5410153016A90F03A3863EC58BD66004 + +BA6C11D80E304AFD1D922E2B35A47C3ACB34F7DCB7826F76A3C469EA:\ +CE19CF171B181B3CC5261B5A38E9142DA7479F88A9B0F7F63E98BD7A:\ +B5C0F5A46D855F6CE47CAC0198FCAFB7432AF8810A3746A90CB440DC2AA1CC9C:\ +A1A57176001EF2B0417FB7DE1630AB54 + +90D97D574AFA947AD194F3B94D17D83073D6ECF2FDBDD5CEE09D3D553C:\ +5139448ECB4D8B454563FF5BC6CA47D9BD23329E772F03E4C661E4CFA7:\ +D684575372F4EC2F0131D786EF6B9666C38D2E99C2DAB7ADBD1C9FC805DA4229:\ +81301A434C73C64DDB94440FC887542E + +F4C312864C4FF38BA8D285608FC924DE8E60F4FF0E603AC7D3548CBCE1AA:\ +04823EE2C43AE04312C6F538F03DB4635D13026D546254A1E0BF5AF97B58:\ +7C3F63710A6B10B0131C5BF96BCEEF6AD226FC25880A975E355CC2547435D861:\ +B3F1E356BDCB368C8F1D306DAFF59684 + +9F188A9CC6957F8408FF2A93AECEABEC0D6484AAD13C88060CFA7C52F55130:\ +FA96B9A0FAA199FF22357287FA8DB515ED3D522039C3FA649E5BBFDE5D0D79:\ +8C263F3C683F2C78E8607AC7E79C703F0F1D872BFFADB07CBB9E07C62624291E:\ +1BED13CCADDA5A02EE6F3F529A7A97A0 + +6F129CDB56D48914EFAE7A534C33D03280CF30D12389EB5119106790B84BD73D:\ +29ED54DFD26F097312C42848BD496B78436F907238EC8DBDB5A22FFD76CE76D2:\ +69F48BB5EAA67974713FA974EE645B5DA6B8E5665CE0E40347575D050755EA6A:\ +CD6E4DDE0DEDEB87B7BCE9998F41218F + +49407E33C46EAFB24B01BDF5300DEA35AA5BB5AEDAAA2B5E47B2B63753A44F71127F:\ +DC0A9F56FB2F440305B288C1C0CCB896B21D89FC3F741034DD76B6887740C5CD4A20:\ +3AE57D49BAE4C54AFCA650206B3FCBA71306286F1B9A51624CE3CF08B5791CB3:\ +75D84A34073AA6331A8990572C5FF55B + +C34EF208CBE5F148CCF3E005BD2168C8D8346B18464EC8A6C8DD156A3ED34CE35C2A16F2:\ +878A83F17390490E68D50937BEC73D4A5BD4183ACCEB0D582464DD9D3ADE683E830E8C24:\ +F39D1CF76592D48DE487808FBCA14585C15F29FFB7C9EF9A4AF74B1DC29459BF:\ +50FE7E7F598B4FC4D0FF6D256135861A + +6732BDCFAF3C9681E5684208D5C49354C8C221FBB584080639E3A66C0CEFEE4662BCB787\ +FFD2:\ +2B40579DD8E87440DCBC664920573309D3342DB52463F76FC7BDDA45861F8775553129F9\ +48D6:\ +8B387194C2E79916F5D2B5E3145B4F7CBDF8190EEBD05B598A3F44D1480FE045:\ +6C7EAE05E72898C271A3D7F1668532FA + +3CC7B907609C374805F3E0625C2A8B77BBFE8C22860F749E4871541D27BE589B21773489\ +E08EBFC5:\ +FCE9006F2073F1C64AE42908C2E7F21EF88422526423ED8E341F869B2EC8E9BA679E9028\ +102C9BFC:\ +60FC4F62E03E3C0ED6DD21259BBF3D4C24031DFF6A20ADA2E2D637CD0FDA2351:\ +6BC92664DBE433FC2580850BCF0E08DA + +741C912167AB5A5AEE918FB21480A2EAE39C0038A458A34D4AF86F6968A97A945B4EBCD8\ +D74E5C1D7388:\ +116F94F7C970083C2F918454F7C5740F3F92FF83BD5A0C5F8DE592FF115171711879C6FA\ +739E14D0AFD7:\ +DCD3F3A96FEF4C6DAD109A65D574842D04029B155BEA7AD54D25D3FF8FBE5A2C:\ +DB7728ACBA219FE1AA8259448BE3D6DB + +CAD05D525C37CA43C187403F3357EBFB580ABB2F782CFA7B9661B1F71B1809920EF0D897\ +13598CA4749763DD:\ +C17D53A4B37EF4AF33DF4E0F317BCF8541ED66DFACDA662289B261ADACCA3D4C0066159A\ +BDCB108BBF5C707E:\ +0CBD7326ADF581A058CACF74A3404D3CF9EEDFAEC8E47BB30BC1AF1D3660E0E4:\ +C4DB5DDFAEE532C12B7313A9258CE63D + +6032DDB7CAAC7CE2CCFFF53592FE2F40280F8C79E312F4DDE307E90863A9CA18E320E0EF\ +27B21216216FFA8EA570:\ +5497807495FF72FFC8C994E00CB5E7F5C521C86965FB17AD3578EE6240233A7E2C9FCEDB\ +FF7F1B05FC6DACF4A0C5:\ +567AF81216E5B25179143BC1C3AC52D940F93EB4EAAD54AE0A6F33661CBE0EB6:\ +EBF6B3BFE42C2AC5AD0B02B7D294DFBF + +F3DB2D14DDC5CC45CEF2986CE9775A64C435B36D305DB04A75FFD3BC83ADB8595397EE9E\ +1B8137A8227535B3984A7267:\ +7BCED3DCD661CE1BFF9A6D1B52D957D12E657DD6241F64528C496B6D5A729783FA011AD5\ +788BE7DFF57D892A0ECE7A92:\ +818DD281DE7C051FE22A5CD1FF0154293556D693427EF49CB72D31E05B91FDDB:\ +4A3F1F5AC035B0D18543BC763D42D61A + +83EF6209E5EC332E9CB0A2F73EEFA34EDCA0DE7148188A5A5E8AF5812EC9F272147901F3\ +8B811FB759DA8060A1F93E972204:\ +C4D6D68DF04F55151A46D291F188C71E3C59C06319D4A6B40B86312E93ADA7EE4CCF495C\ +D56E0610ADA4EE49EB4982601DA0:\ +06ADD322678535E83B950851EC12D6DCA818D19F1041F69919A1E0A16D868ECE:\ +8842C25CB6F1E93F2485204B8DF65A61 + +14D9C539288AF393FD3552DCFCFAA4EF497514E7101ECDC92E875BE2D958D296FF1BE307\ +DC5AFD29F71460DD7F093A392C8210AB:\ +792DBAD92AF1F5F5E5AB14060E6245D4175A6D73910FBDBFF76A08493464827A108141E3\ +83E3104E3F4B7EC645FEB7740A426AF5:\ +2638477FF92C0A140CA99B62CDF46452AD58B01A2DA667BD5EB3D425E9EFB5C6:\ +FC9E9308891984AD0B305CF160A64B45 + +C4E76E643B92D878A7BC2693EA1D0E1E86A06FCCFEFBD91506D2B8C6024490FC965F037C\ +EBA97C607F808E48C9D86E40AAEA079FA7B6:\ +66BBC945447CD9FC87CB47AE7F72FCA83696BE3BE6396ADD9EFAB87A3BE17718CA2E49AE\ +00758AB922A2F2049BE84577DDFA228918C7:\ +ABB8BC67A8299C34C4B97105230E203F1BF8032C876E908E6024F31F0778C2DE:\ +03C8C55A12AFBE4B5930A8D8FF80F1C9 + +C8A5C5A939F5872E56BE199D24422A7B99F797617B5E39E02729AC05ECB1990CF8D287B0\ +8A718495D9F261E9110E4EAD62AC789918CF1CEF:\ +23D2A8B6508552F2075D340707541547F37E622DF4DF55EE3E0F4E0E610216B7E4218358\ +ABFD86EF3A6A5739A0EEA49267AAAFD89B28D5A4:\ +5DBF7CE56C2C431FC9B69EB80635D0B7BF58C7860A1EBC876914BD040978391C:\ +9E2DC1FD8EC1C9E1FD0D5273F1379D46 + +37B26B33453BC31C69BD09D5778E04AA8F5FFD7F367727B30246C81BB92F9ABC3DC9EF72\ +171C3F38B76CE887F647AE42D87319D4209857EBAC0F:\ +8F85405DF5DEA595B58FCE86713593BEAECD39B4F4BD11B43024A5FFBBAFA0F4817AD6F9\ +2C111C08506056654E003CFF9A60162147ABD56BB4D4:\ +6A3CD1AC06DC7198EB08F439CFED766EF40551B1361048BD17B1A88E9447EA27:\ +23783203B030B2AC2AF81621781FB946 + +44DE8E16D60C2CCB0E804ABE95CCF7CC597B1A9D0B3FD15BA2CE321273006322B4EBC4B5\ +BB90E1456947B3B289A9F6DF266FEA780FA13A2CF50A0882:\ +03BEF28AED188F7AA6128016647546160DDDBE80BA403CC4F29D9D90A5761075B170D1E2\ +7EC6ED96E7A329ABF59F7016F4BCF39F61FD82C010B4F7A0:\ +1CA7FD4782991006FF0246581729BE4341A6556C61FEED749EE9F48DE8037874:\ +7DD54BCD7665BD84E8DBC84F367AA008 + +8136A889B8105FBAB44325DC6114F395CEEA87EB6E69D35C6020AAE00B47942B262157FA\ +273B2317CE08255AF899CFAC6A83AAB7D4C5FE5729A64AD9F8B7:\ +2D6B1B438E8F7A70555902ED6FBFE2ACFC371DE250F32C9D5B75321913837E36646DAABC\ +E5B69AA971A0C6FFB5928E0A75A13E004BF241E73754B74F3947:\ +9E8BFDA871A63F32DC05F53D1859291E6B099E2B4474A43E570D6D167A2E99A9:\ +51027A0552EBF97D8372668BDF106F46 + +80E71459F0F7DD4E490FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4\ +CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D:\ +AD68A517A73C9485AE996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C\ +674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8:\ +9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F:\ +0EB87233AFD4C552D9D5ED5C415F03E7 + +0EFC9979CFC65020583D4141A6422CECFC1E816B8682A1BF73D05175E8A2E83DAB239DB1\ +5DC57C4ED427EED3C73491285767EBBFA20CCF1CCBA594FC45980A34C659:\ +ADECCA8B5879B64CF35C8AED809570D12BA0C0EB19C319C0B9FB1A0A33C04F48E2B755D2\ +CDEA8C0582019F7847DBCEC023A4AD27CF4879C07CC33CAC9DCE9C47A491:\ +B0B664A621FDA57B3DF93323B61DA43CD55EFE1B1954A8B86CDEF4963E082B5A:\ +63DE5E4E1401030D736BC327D9DB2BB8 + +FD8A05EA9F872847A37F33D66906C085D10DD980435028CC0F7FA168CE8363A8A5420E33\ +67DC06AB69C2DDB49C1BC0E32E1F1316EEF18C01A95C23B3342ADA89C131E42D:\ +B0A2C09A27F4128353DA11A0797B63AB54E2CE00BA58BB765C8F6F65930E69258F2C3F30\ +914FA964AADEC9B8DAFE39C58757D65CFF6702B955550C8A494B64056B906FE0:\ +6C62EF4976E50622F623337E32D70DBCE1E423B4CFF652C2ECB1D3DD194B8722:\ +B7F60B3D94FEE7768CD92148FAFEADC2 + +A592978733D8647858659889303CAC080E95C2B2B26642520CC6B8598C146DDEFBE1E4C0\ +68F3FC0BE9CB0EF3D61000F2E688AB2D9DE7B7A28C3B32AA3F8B872F91D2CCF9C927:\ +2B3D0D935877281412DF2AD20602D0AEB7E375826BECF964E5EE29A8EA1B20529943BE59\ +5C099BD2EA0F70ED95BFF11FDD52069274E8D21B00AC5EA11369BCA9E6052F1ECE13:\ +85357F480C3AC5C8E412523D2C6D45862CBC91394DAAE40BC20C58DC7FDC113E:\ +CB11FF4AC49C513BD56A79104FE48F89 + +60C42D6EF79C6FD920FEB2A9EE00EDDF34B3339F99BF13ED42FC65247166B19C42099DA9\ +089F8131856FAC9CF0703AB9C73DADDDF700290479146F67B49770CA9B53511D94F6D7A7:\ +35409AEBFB98BC6CC70BE661EADF99C7E1133F912D8FBB957A5A61AFC01E622864C1AD2D\ +B0898B0D3682042A510D65584C7EFE9517D0CEA31D3385C857AA334478BE651DC48E81DC:\ +53286FB5B6E08E9177CA17919D845A958B7D55361DDE5E9B09B40138BE3F68FA:\ +D7FDD75B3F672908845354CDA2EC33C2 + +55204AF292A15EF0907E3A05FEF0BAB2FC199A874FA3B72B1959CCF5CE59B1A63BC7D0C5\ +709A1EE8152A11423FF3D021726C9B914283610530B80114A6AB16F1821434CA0B5B66C5\ +1181:\ +790F49950B195EFFE12FEE3DEE248147793869ADE0B46B412F702C4AFDFDC92A95889D45\ +F1828CAD935CF281BFDEFEE68057906564E63509A464206A3939C9787AF559C2F18E857F\ +9794:\ +CA1AA91974D69777335BD4CDE41584FE09A0F90B4EFC1DAB01F5F6EE475C5B26:\ +A753ADB21556F5166B8D0EEA24AF4D20 + +F1B63FFD3C223E65972E716872206B656F036AB58CDC6BECF814B4372828651A28FEB0BC\ +6F7D5E008A0C9D069C5765D9613F75AE3CA564089840C2E5326AFCBB73E9677D60261C1D\ +11DDA8D6:\ +05C44E476B45156EFD1A73CAAE0CCB4A02E7A3BF461377AC5573624F3CDBB03E5F040EE0\ +0A628EAA819B84461B8F39D63308C5FCE21B823AF0508384E0A5784B99FA47AE0A15F8A6\ +31CADD11:\ +67EEEFDABDB4E221A3F5D331E021861D80B3E52EFD3662FBE4B7F96CEC220668:\ +ED8A0E2821ED9E46D9E47973CCF4FD25 + +415E13F78C19D639C7E2A262D03D17C33648D7852706B0787C5DBCA2F7BC09FCEB3C570F\ +CF3E121AD6B9E467515998EA53B59532A5D0C86125928ADA505D07E9C0683F0F2862A0A7\ +09B76B9F3E5A:\ +96D6DA75EDA6029E162A70667227790B28DD1D08731D08024FA175861A30D321CF95FA07\ +A96077F5F9F3BD0EF809CBA394726CDFCED17507C89295954F7AF19E7CD513D18869E7B3\ +418E193DE7E8:\ +BA8A42A5079A1211FF373CADEDDFEBE4230384AE50C0CADB777689E9FCE03021:\ +F2CAE7EFFDDCCC54DB0DE734347ABA8D + +5ECB18F27BDBC1469A4EE7273423D51CF53DA0BBCB3773C04F90934DF1A4E686B76A2CA1\ +9B325F91CBC13CDE9FBE0E7FB1D205D78EB92DF19A5AD39D9E5CC07A4329EF14115D5A89\ +4F4669D6B6C3E920:\ +47D37261C8ECBB954E6980BE6EE8A89CC31E83CD8703AF97B40308FC71FD5C204C9FFF43\ +B35BC9709CF9089BE6EDA572EC4B580F74A3C25741B147D3F2D06A7C5BE8AA35DF232546\ +F93B603A91A4D4AD:\ +00B1CFC598BCD9B708AC9CC600AD951E95228C4941FEA43D3E9F9C4C4DDA9F57:\ +AAA2D1218D7E5586150602486330D79D + +ADCBCF6C2797D693DAECD8B395FF2D8951D9D58748398E1886146CF39B6BBE94AE5725B0\ +8DAE80061365508ADEA2F7E27006BC2EB8296E441D9ECF3A1F105AEB72A7B7ED65C0ADAB\ +96DDB4C56D3E6CE7EF9B:\ +204B284617F9E475636543C231788FFF1566DAA35B7188BA5502116479D8CFA3571726F2\ +3F83EE62960DE1C5512364AD31BEBD71778926B4DBA86C69C87BF62D590FF01D43A7FCCD\ +9DF526738DA3ECC07313:\ +D9E06DC86E89570392B95234B2B4DD1D424FB5D96D8E5EE6522EC023247240CE:\ +555BBC29444DF1C9B19DCC36E8F526E7 + +D1E3667AE3F908CA70E42ADB571765C2977A7597AF1E93568BF144FE6B8774AEC889EBE1\ +C55EB673F2E05C9049FD38FA112413C1F5DAD6400104493225B2A1FA2EF314267671682A\ +96A15FED5A0920BEB7915759:\ +0D8B1A4D0B4BBA07DC3D66FEA6C79EB79845A303A99D0CA6A1363494FED39D9B2028323E\ +A66F48420620AE16522CA5C036984E431645D55BB71C9729786A2942D246763AE14D4D7B\ +E8182F4412706F88D745D29A:\ +8FA2C547E80F8370524EC80BE768591403BC8B84A31E823E1EA7B58D13C2C1A2:\ +FC552663E080DE3AF70F1843B20C2321 + +9E66CD55C5F5ABE2D9F479572D1867AE07654DDFC4B09603A7268BDB98CF22A15EB207C0\ +5946957927BF3442FB92CDF2BC64CB1AAB4267884C65AB29F7C7F1AAA0C797DA1BDC2FD4\ +7E02566998933F0371F054AF75F7:\ +4998F91D12BD0CD7C9C3E4D7E4AFF383D87555C75523452F7764B8CB017DE1C9775DEA51\ +AC4A84CBC77FEA7CF4D4ADB3F79279E73EB443513AC9FBFEF3F210F80C553C758149CEAB\ +515578E988A8F49D4B87CFC7C3CB:\ +EA2BA62A693024D30A6F86F92534B011D6D8ADC81E6DF43A15F1A38B077B47C7:\ +B09F47C60D4A913E80DBEB9572CDDA2F + +0B515541E94644E05C6D33B0DEC22322A23EC8666C40697D58B0D7E28FE278DC8C6747E6\ +0924A09442A04C167D48CAB29D095BDCC0EACEED2C841FBFF1010769D8829EC1CABB235D\ +CEE28CC09C4D905CA1CC8BE624298D76:\ +0FAD0D901C43395C015B252EBF61F66FF41713C2DF9AD2245E1EC1ACBADD2007412DE768\ +E5C986AF3F26FC489676AE5F7507AF559A8A23B56C417FA1452D92CC6671F6E4BA5C1F60\ +819811F9704953BF349CA5C4D3A0631A:\ +E659BCA785C4BB8BB49DD36F132EC4984397B2665B97689FFFE7509F1A1D7551:\ +069C61C342C4DBEC240C709C3CDB361A + +D2C5A20331AFA2FC82F0A0D64160B4EC447FA5572A26EC3C64C9F736E43B0915AA7C3E1A\ +B6A9D36BE4A15CB26820E29AACFE83024959676FF05376C1AE788D276079F199936AED0F\ +0F688E42E337329BEF9336FFA36FA4005399:\ +7DB91F84F3477868CDC873EE908DDCAB90CBCAF18C0A70791A120AEC86CDB215E6221A70\ +14482F9E3802EA3467001D3601A63C92C6AEDFB4946845F13A52351CDCC6D5F922D19DD5\ +B1EC236E822F62655427E62A4D0E84914622:\ +FA7AEFC8F4B784C193C785B93E90D08F8523FF065E19B2F8CE817FB401A21FCA:\ +A66594B33C8A53C811C2D97CA6D14303 + +7255CF6B4E647EBC0AC95A5695F0AF0E9AAF91E3D95749D6A49719093B1200B9C6BE09B2\ +6554E36EB6652041744605EB051062C0B6D1CC01257709F751EB7B9667AE7E329E43EFD7\ +44D96300958FADCA3C106AF1733CBCA1AAAF823E:\ +E3D3CF5237D3A038F5F6C89EA9FCA960FFF212211D3C2CB3490607C9957B553335B18C55\ +1BA25506EB2CC3BFE9F3EA6CF0AA9EC434AA592FF77B61BC06F0B2B95AFA8FF5FA494E94\ +DB731F57DE8529ED53A50C42F986C16EF7C7A940:\ +A26E2B0A05D0283D38D7169BC2BA47226EDD259B8D57B381FFEE069F1B98046E:\ +C4E7CE77538E9914BEEFD56DCFB571B9 + +AAD33FEFE3F84DF826588A512B14CFCC1D853F2AB84203C1D4D8F8B86D6AF3F7173F6A6A\ +A73843D5658489507104DA3D7BFCF5168D986464C3448F234CA69BE3DCBB6672575564B0\ +2ED92FA0F3877DDCC06D502A33D6957A0E33F2DAFFC9:\ +CD0C9764841179AC19328315A39CD34BAC626AB5DB485D0F9B46059F54E08C5492B908DE\ +07B85E7A44EF9462BA8E0A81FD1220C558295A948DA4DAE908535719C1F88B1560673BD8\ +07F5262483B40AB9BB0C64926FDCD1061E504B4EBD76:\ +6EDD7092DA78BAC7E1AC92E3770134A03D2739FF5D34430F7F4D4D6E9764B319:\ +8AEEDB0DE46407E08707969C750E38DC + +8168FC2661FBA3600E59774138459C2961176EFC931CBD6B5C33560078EF7518635D6939\ +A98B0767639E0E93074057CCA6883F7964A1668FF9F8210E95D0368F6FAEE9FA8D7D7779\ +2AC00EA2BE1146BF56204FE906FB865AD039577C01234AE2:\ +51A47CF78D2484F3451F0C2A43EB428379D1F6893C1B8A39FE3E60F685DC87C0B840E9B9\ +6FF58B5D5FF56AF2D9E6DD1B2701C68A0E845D4D5976BD315A353D67347BC8730CA8EFF3\ +AA0DF4BD6DC8E05F7EA07EAF2C39D7D47D9D84B474E7ACE7:\ +BBF6DF7DBF4037FB25B611E6A2930DABF072F65AF0A6457CB9DC93972E9ABE7F:\ +501092F826689BCDFE80F092C26B5EF4 + +81EFF330211A83455CB238BAB684E0067FE4067B8C991BC1AC8E7633D080339190E5D94D\ +B793154FC74FB0AFDAED0804E3C1CB51D2C1E13041FB81B2157BC60C1FF633D16CB4B9BD\ +331420AA12B95CC7AF57C713C24B727846B0C7227961F2C2D36C:\ +6886E3F70FD5F90852F3CE559925D769036D93CE8D9476835D517E0FB32E9C96D0388391\ +30C1C25E1B169ABE4BABA9B82C4ED74DD45F597867C5D53A0506AD37542F25CF58F4A362\ +BA222FA1DE9038A8FE543BBB44D85B2E0E4738067BDAE5DF7060:\ +432FFA626DF2A52CB0571B6E90C61ACED99991FCE9C16BE3B63F32BE944E2E56:\ +5C8A73A4AFFAD697BA8B1BCD810D8F11 + +EE2EEF94470FA795A889D2669CB2B80D3155C8B61BA73019CCEEF203FA4EB1D9AF6C1AD3\ +B2954F7315935535333C758A4EB3247E19B07308569400B897322A4752612F0FF13FF3A5\ +361DFE0DAA88394F3642B1C6270718F28BE8C76C89ED29B6A6B0BF94:\ +BA17AF1457C42E6E6FDF4F98C8E45C0FF78D4849039ADCE1A168A6ACEEB9F419F49125BD\ +F26E443EB783108219A2841F82499FCF6870724044D9CBD95AE1F4E2A3D4A4C44C54B2D9\ +90E0DEFA120414ADC438E66B298B72EBBFDD7BF38EBDC44143E16B69:\ +A249D7A363F984C302E92C5F94F8896DF3F776225C022878944FE2C2CC5B4C19:\ +5EE7A0639A58783D7E82D1FE5AE0DE2D + +577B77E72EFE7CADFD281160BEB544AF2F28B41CFE4B92C5D770B322D40DE7590090833A\ +12EF4FDFB0EE57CE0A4A36AA71C0C39B33E78EC4CE15CA6400936E1561FC6206916DE9B0\ +3BEB08F90930048F493C05BED453ACC98FE7AB2256B5271A1E8958D07AD3:\ +A34F475248B72AD9BA2F461A690921544CAD263EC739AB3ADB4E42652A547553B3A303BE\ +29F23BD9BE7977D6750E50A2106ECF52C0A6724AED2EE8D482D09D0D2B9AFADB78B357EF\ +0F52E027243D445B5066572B0CF8812F3E19475650FE85DE610EEC640091:\ +AFCEECF27458C2A9B8F34603C639A5FF1250F1D6DEC2849F0D74BFDFAAE36660:\ +5C453B6546216E318A6036E803322401 + +4A0F51F3716D41FC3E5264557D19CA35FE3B70E215AE6DA3990D1EFE383B9DE7E50DD085\ +5F751F95BC093EA76843089F284CA6176D2F25999230F6A5B9670059736CE084CC167274\ +9504BEC04B22F26045366030599337D1DCE783ACD0BDECB76DD4E9E8D4BE9421:\ +D747558707BE24371EB6DDA6B5FF138987CDC42BFD71D75BF1D6DA35591E4B35C32F9F07\ +A1C0B82A55AD28E4DFFE43764A814CA13D60EEFBDE3345BA454D49179662ED53A9F3FFE0\ +92D8DABE481E3DB0D7E34D6296102BC45D61E1719C864FD26FCACFDBA986A6F1:\ +EAA4738DE7B609D36A756B5DCEA1CF8F4359248FD8A423BAA925F0B6BCA7DBF7:\ +7DDE259B3EC5CD93A2734626A9B99FF9 + +D8D191D620CA6DC8AE66658AC39D87B8465D32BB2637128191F0F92E47C7E99E01FD4B8A\ +8BAF767C8D66EC280C77E877EA06435A7EB72EB477CC2BB6DE52160E7B66F305DF97AC35\ +C821F418E1FC56FF8617B9B595CE824207099A8D9CFE24B616F14EBCFAC508C37127:\ +6A320C22C68E984F0308A5D626C16343D268693F283FD71885860FBEF767B02E16834BFE\ +FAA78B6A806D2E0D1B54451532B4F77365989259B8B48AC65C0B730951DE373B4D51276B\ +0D364BED18782613DB2057C4EE9AACB56CEB2D0857BAD4CEB9A190AF7B9E04B8267B:\ +EA42B4BBDAB135C2B0BC54A539D5C9A3D9B6EDF21C92763CC8F468BCA9CE5D2C:\ +013847F7E5082E4F5FD6DC16D754A80D + +A7033720AE2A602FDA4BA5127C4EE042858D0376774704D582986A848B2A0DBA6DF135CF\ +3F1E5D65F68E8940858A35E9C61E7AE2469CD7B08BE72069354A2A13955FA21FF3B4DBC2\ +712647AA20D73428D426F9B279B5A0C82E2A2620F836B28B03BDDEF45FF3366DD9AAE66E:\ +7FA21E16C5213010DB8F3DDBBDFE1E5AA16696875F632EDE3CB31B4325C4E2135B9D2C30\ +42CEB5415306D0FD7AE237F26E3F135732BDE6C753D0D844AB8270A094D5B24F6C753EE8\ +6455B2E936F2F5EC5AA4058099F6929C95AA2AA6CF70CB2C519D6854579CA23192AD83BC:\ +AB8512537C3519628BDABF83E005E8685A180AAC1988E48E39A95030BD4FA6AF:\ +693E3B87BEBD7D144FDFC1796922F843 + +E84897FACE6ABD7B897B935DB435C22299FB4346BEE1C4381948622ECF3328172D0C3A48\ +A30EA2411201A5907778C994EBE29637A290EE6DD503B6EF1D53D368811D5DD731E7E44E\ +27EBB7382E6AD4C74F49FFB62CCF996FDC7710B943334284A38957EC822B4F448B7482CC\ +B972:\ +C5B740D2E9AE85FC5CFB4ECD1E375C05AD9E5040A8FBB149320C263150A83F2DDC3FBCDB\ +DAEE0BEB6C1CE6EBD3713DCA848F87200922C1879238E49DDCA5F931F1EA2CBC586402AE\ +B83F1BF2175341D4937CAA2B97F4BB51BDDA63C1F50686F2C40AACA7F1F049F08D43C6F8\ +7E06:\ +69BE0E539EE3C48F260249A10B2DCD3A63BBFBB5AFC85D9AF388B79240674A6B:\ +9A1C7753E6140825999B5695A2CAA7BF + +54D9C7F322D68ABB78ADA56EC4B23C1478DA181F30C32732C9ED38BBDCED81F063255395\ +C52E8EF6BCA23CD23A70BDE242DB86265C11777A13CBC9752F2ED55CF9D816C2F83AF85B\ +25001D486F5812E39F4F661044091E10C3429894E92EA4F87CC998E22ACBBF867D3B5B20\ +C97857C9:\ +1C4D79F2EABBF97E147FB8369933B4C7E7BA77C6A539F571AC2AA8E37C5D8BBAA1308DFB\ +BEB2F892BAE9064692A20B8A2CE2A1DD8879160C7E46E2E5039D5C32E50BDC961F3A7DBD\ +A36AD5043A87C9F0583EEAF9995994E764E19B62CA4410A87F33DEE40747EC23CE6E41F2\ +80858149:\ +B66821FAD6EA6320F3B5025EF909411DC68120198DB4B2A7BC148EA922F64DCC:\ +3A875E75096B58800EE21B31E39BF38B + +0EDFD9C739C9F72766EF8962032C1003669F5A648B0D21943E99DC5BF7A2507985223324\ +2187574B279FCFB57182F8F9832AA9E44D15ED2D8386AE4572986FBBE0E6E0D5D3AA4DEE\ +E2188614F7A8A381B335FCF9B899B86685320D457D85C9F761EAF43F49B9C9061AA606EC\ +A4750FE198D2:\ +87CB631FA8E039C050740F72698E74A93D758BF0D090B1993D6F7042E4E3A6360D0BDFE4\ +5EA8423B1C0FB9ECB9514769890BF994BE04E7A17874866FE1A15CB9C785B0A103F39384\ +A54AC746673A7A98D9F9E20D409F7E172592CE58EAAD74ECB2BB56C95C6CFAA6309887D8\ +956087009252:\ +33B871FD2A012F18E3914F1702AF7485BB793B7DA154804EAA715136B568BD6E:\ +596028337CAFA821457B88131F5E644A + +00FB363E56B460D690672DDFC0B71DF6E19F5A5E74E6E85E936937A054E8F7D87511FBEE\ +4A982792196FE8456A849AA1C2E8310E66D6C4BFFE084E791A5EDBFFCE270A4A50E5E238\ +2A18C3B9DDB1B71EF1E51B3568B75F423263E025D4E36012BD4350C226DC9805681D6F74\ +52591921AF631F6B:\ +33B7C9F0C16B82C6D6B08A42E1467592FC9F4D51DF70BFE52139614AAB3FDA3FDC97FA0A\ +235A2AF801134B58CD643E325A020AE796E333C9B3C3DF1208AA7CA5185B3FB1A7FC3B79\ +E717FE1A8B4AF71C96C2A58576CF14906E0CD7A8C4FADCDCF28145D26131DBD656ABF6BA\ +7D522FF9FF23AF29:\ +51D9223DE781C2931F7E2C08CBFE7FCE5CC2AEAE58D22819A60BD9D4A688C5DF:\ +0A55917388EC7A7648973240F8C2EEA4 + +85F25B5F5D3E68479A0F84CB9F1D92DFFE17975C864C8A974AE1E2DE60292D281712952C\ +AF99C570CED2854B6C98BDF025DED8D8A873AEC8276AA9A1A6711C49FA842C4B446EA596\ +3994F33C74F7C9074B4576750770BD5E5BD9CFA01EC26440A122A6BA0E9A5E4B490581FA\ +BEDC940EAC9D6BE86524:\ +E4BDC3821AB65D06994979873EAEB03796A2A8F5B4507411F6E96EE5A246118EBCE8BD66\ +9514E234A991D708FF1704CB811ADDE53BAE3A147EDF0CAD867ED1547F4C4CF7199B35B8\ +C548D037E494E9DB52ADCDA17129563FB928D13F8EB153A4BA85F330F263FED7B14E66B0\ +C37CDA03133158D1A0FA:\ +FA54E69192980C674DC51DF702B94A43311661E98AAC776DD7F09FEEFF530B6F:\ +DEE6D2C5DB36158D964F28370B147CB5 + +54E53C0739F2BA49B5A2080E324089051EBC24783771981AA4EBD0E63ACC86BDADCC32AE\ +88099729B4A72D8969D2EB1540F8A7FB3B79C5A0A7F769054EF2EFDDCE4BCA0294AD2B02\ +ECA48840A2A0AB20437D9085E905AA2074FC8C3561C564F1E992FBFB15877B7CB54DCDD2\ +7BECDDF9AB3A58699D4B901F:\ +6D4B53FC1B7FC8B97BA8E1D1526944490B415D3D59887437A24F8384CE850F8005512A8A\ +4BF1E79D03AC1245600DCC83EA21195835582B041B5AB2588DA8BD956D2FB69465485452\ +85C2DF36D26CD09B082F1CDB278F86FFB6FEF9DCC3C71E9CE6B629D7B2897B69CFFC2E14\ +510B4DEE8B9D957FC5AFA769:\ +D22A6E996F80C4AD83209F4E47A17D78EC0F1343CDA8890404FCA4103D038056:\ +3E4EDE2C0488BB09BC4ADFB3D1122E99 + +2A365C1E10368C49339B3F64A7F25D6682E34A3BB273DEE16D6679B7DEA80FEFCE351964\ +587CB68A939B36D705A32F1760995CB3B9276BCB06AFF5F68CCAD25ABB7CC702D6DFEF85\ +722303C4D27BD81B2D42D2C6A47A9BC4706CEE256B5CF3110705753929B95248761234DB\ +E773C05E79EC9FF958DFB728F8B5:\ +75BD73BB09EE09FF5B8E138D84D776BB8D9B26274D42B012B1D252C22A0E29C66B2C6988\ +0EEDEB0F02376EFDE6F02C85ACDC24BF7AAB725D1CE86688ACB31C5C91DFFB290968B415\ +F7342AC9D60A49F7CFFD35D350D4B63DE597127C5614D609CA27EDD1CCD869D3C4554C30\ +81450A67A2495BAE987239937DED:\ +7B7E24D8792EAECBD7CDD6A43A1D0DB9681C8964D1A55332103C3ED167B2CAD7:\ +8EB77D48DE2CB3E862CBCD9D53234A46 + +BB6817631F1F0A703F4D5896FF5C3CD94187A82F8287347B80924856B84CAAA3A05B892C\ +C8D8CAFA85F65DD1922F017728CE2E0ED7D4FC9CE844AC9FEFC79FE1EE7181939F4B7A91\ +213880D6B725FCB8348A4879641A628B7BEAB77673E4CAE70CDF36CC92D3784EF7D529E9\ +404C1E54A9086D0C33A50661295ABB24:\ +A2875C6E81960A33F8EC626B9E649747E956690DC4DE11801AE67EFD2B563695CC8C999C\ +1784FBEF30B753AF38C413E361D523C42521A4DA656BA0A1076E8773A335C854037DA8F6\ +E84EB48AAFBEDEF12D4451E9FF1636DBE938960753D3E0FE96165474298512792B8C457F\ +83A8664A4D679D06C22FAE43465F9549:\ +93C474796CFDA89D8FAC562ABFD5426E1611582D0FE40511A503119A48A07202:\ +81DB28BB02B082FE9F40675F752B9F7C + +AE29C830ED344F0072FCBDFEC9B9C634703819B24397D59C3D5418B47DD3861B5CCD2119\ +66B4DCB3FFC5E97F6B171F5C51D75B18AC13A78E2CDDEC9D4B23ED26CBCEAAE29FF78F01\ +C5B4201FCEBF7BC029C7730F7603EB456D2AFBD27581BD15941F85E816AA6EFB0D7408D8\ +5F83AF88AF157D3C90BC849031CB9B410819:\ +835993AD13882518F2A1662CA9B4160BEDC60E53083E1F8D72CA3AE2F890856E4B52832D\ +A83B341D9D992C0D9E489BB04C75149624C6D645BB9909E12711FC087C56E1210BEBA66B\ +DBCFC865520E4DEFAD4000CE0EC528916A415C4661E1ED7095E5777BF375DC31CED5F966\ +4C79CB3FB80C5EECC2067B4313CA27AF4F8E:\ +11C63D070095FCD408DC7E7596C177C0A09961B2BDCB6E7C0F300C918E7E830B:\ +41EF5DF5CF14D6D2C14CC4CBC4EADAB7 + +# MARKER: Cipher Modes (Decryption) + +# Cipher mode format is plaintext:ciphertext:key:iv + +[DES/ECB/NoPadding] +86A560F10EC6D85B:059B5E0851CF143A:0113B970FD34F2CE +3FA40E8A984D4815:4E6F772069732074:0123456789ABCDEF + +[DES/ECB/PKCS7] +17AE296967C5D076::AD37078F3EA426EF +A9E2BD3B74E7F3CE:E7:9CBEDD92FF2A5B73 +059CF1BEEADC62C2:896D:2FDB746F903CAD45 +784F42BF01754613:C1B1C1:64EA8FC0D24CA010 +9F4559AC8F287060:0888EC54:4C836F4563DF32BC +9553EAE17C9554C7:5B0E9EFF57:C6B1BAA1CE9585AC +3ECDE9A96CC20C64:3D0B96172D78:D75487A2708B6667 +05CE6E5D61EF4C58:90628E099303AE:3B7C17F8189C21EF +DC9D7EEDF77F3B4685EF88B5E3736DF0:3216ACECC41D0D6B:D53C39F84A7E53A4 +EAFA4A1BEB450770265C5AF8A87B807D:8C04066386282D98D5:4637A64E19D8C59A +91A2C846731747F490596CC2C1354E2C:D2802A5A871F246AB192:0971FEDA66F7DD2E +8763EEF91B589B6706EE96108DDB9A70:D3E87AF21F0313835ADAC3:8E8F17C42B91EADB +C75CC89A8B528B1CFA9725A4F6F22C9F:D6FBF31C50BEF03DB36D9CFA:A87F5FF0B3545400 +3888F955A7079C88ADDFEE8C5DDDDE85:40C86D519650F7506BAE823B89:6DA82D72B5948390 +FACCCE40C05A410B329340EEE8E63E89:\ +0780C2ABA3516BDE2A2F8970EB75:040128669CE30F4C +7AFE6045F807102D354B17B45F3D9D70:\ +BEAFD7CBD536B9800B10F9CEE81E72:A25AA7C651B67CB2 +2985CE350364A85067F32C4E5D340F1658E77714063EA91C:\ +3D8DDC8C215EC27AE07C428D093DBEBB:E4E5E82C29060303 +C78110FF4EBD0FCC3EA2A8F1B3CFECDAC527FF08EE874167:\ +BD6FC0629E56D7E151AD3BC303B02852E4:587033C361C2413E +02F8DC588D26A55A5B8E441FC66804CAA198A38CF5837A96:\ +8AA4B5C93DB2727D4997927B4570DFDF630E:9A65A821B5FB59D9 +FDBFEBDE42AD8228D33B0032ED35B4AB687BB44CDDFBFC78:\ +13B6ED27218594D16AB5A8475BADA80C03E36E:ADFA49E8BD20F49A +43391357D31B758921A07ACABEDA50025421B9A15CFFD863:\ +4FAFFCA861CDD5B7393C2F1171E3EAFCFF1BBF09:7C4C08429BBC99D4 +1BEF25251A46159EDC6E7410E9A3804E4DE32A202E2D3FFA:\ +4F246C4C3F679CAE3D659820ADF948B04DA101AAC7:C4D15330927DB0D5 +BAB47B7AFAFD30234BC4E69F1A602788B294438296F6E046:\ +C00AFB680484638EE4BC8999CAAA7EDBF32ADD6A32CF:DBDEDFA4B3BCB30B +006EE0B1E90468292B72A70426DCD3975A6A4F21D6F6DC8A:\ +94CFEC7A15A35441AC72222DC4BE7508CE12B1D9690E86:95C9471D839AC3A0 +7DA18BB325DABC8F5DDFBAF9B41F4389C0FF9E37A86A1E318C9065FC7F3D654B:\ +95F6A941BBA9BA711BF1962D668996A315157A49EE32993B:F22460847CD66211 + +[DES/ECB/OneAndZeros] +D573EBC3919CB0FB::9EAEF4F67688739C +96205FA42306698E:56:FCC8C062DAAF3A6E +C2A09626D3200B09:7106:F4FA38ACB1D2A9C9 +64850779AD424E5B:9B5D19:FFAE7E198369326C +5A4D009F2ACFD643:30A671C3:585B8E1A64E346FA +BD29AF6B945A8413:371415B9FD:4B6C26F53E7317AE +6904EF148ECF10B4:1F5E2F5D845C:361DF31C6F8E772A +4A749E5874DC2FDE:FFCB40A7CDB5B6:050025D50D9773E9 +72EEC4B5CCB537C1AA223E5DF3368139:610F58A0A16D1303:D4F1D443093CF941 +25259E1C4C1E65966D933ED350668BC3:171A5D4E209F133F3B:CA2BD0CF16C9D7BD +70C87505241FAA9BE93633B16880856D:927D2B314B4CCD1F3D04:C64374B9C7E2A06E +393C836014C3A65EC36E6165CE192CE4:2CCC4DA982CF67BE929C4A:E30F4BDF1B96967E +858A4172FAFD4614B5263F418EB9EC56:4E92F895CAEA28B7208236F9:308DE63A2E3A5BCE +2716D7195AC4D979C3F81D3D08897E8E:E306358941C2BAFE286043A113:33482C296BD8D44F +5217205AC00B31FE8D7CDB916AD49773:\ +5ABDB2059249D0672AC52085985E:C893C0B250AAD5F9 +1651D5785652365C03541F62BDB343B8:\ +D9E343F4A600D4C5467FBBB923BFDF:9490B296D0EA218D +90C4F548C806B6B86EC2BAF6A96CEC5D9748FCA16CA51F44:\ +D3DCA72E82C0572ECC7C0DF2BE150C00:F5A1291B1A39F5E9 +39EBA35BF86A2926B0A489599B4BF94C31A9F7FEC351ECE2:\ +5E3786F3E7B3D91AFEE1295C314AFBAFC5:83B78C6CEB56CE78 +B32E06E80854E4B815E12F61A2431B7E9F378ED825168C33:\ +6DAFF95A4C3E781594AC22BE9E9E3067CBC5:1B5E0FD12573752C +BB8FE34DE658F8E9D7CBFCA9EF0D5AC7CC48949FD419663A:\ +8340DED8A3C5DFB4C59857E5C7B066D5FFEA84:D78448EA1E73DFF9 +A6CC24FE20B8D417592A12E4912A131BCCF69B71EE25B420:\ +5EFAB4221460C884D8E84FEF593E7AD2FC065AB5:A960C2DF2037A814 +4373F2160343E9E626A13A3D28B5D9A1A6E19455374A7070:\ +BB2EEC90C104A60DA2CF1C31A1D06B84C58C55B396:001247D9B6B26506 +F92FA72F2295337D949F8F2C34A0CCA63D0A2057CB2E6F5B:\ +A3F7B5142BE18B4F54F828F42D1BC5A3643016974399:E6FF6AD89409898A +06C29E86F4CE77256D64E320F6A6A9CA8A72336469DD1EBC:\ +249986A41700E34D49F01D21CC84059D824E9DA320FB6C:761B7C6F0F783305 +75190AC0CF194DD8620D6E6A664E5F7FFFCB615AAFBB098EF54F8430616767B6:\ +3234B4AF6F4B7CC0527C4D23DC7F22BDBE84E7BE010C2F39:F4399D05D289A404 + +[DES/CBC/NoPadding] +E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F6:\ +4E6F77206973207468652074696D6520666F7220616C6C20:\ +0123456789ABCDEF:1234567890ABCDEF + +[DES/CBC/PKCS7] +07E8E4E137A70F64::FE4BA85E69877F56:C5C7186B1F9CD61C +D452289D1ECBFB88:DD:23FB4CBFC76F9906:550DF2EE0D0ECC39 +5270ADDA7C33A133:0AC3:4DC779C79E31D084:B6B763B034D4921A +215580AAAA09884F:5CA7BE:07AD83CA822CBB58:2FCDEC1E5CCC7DCA +1E89C0730B3ED0BC:7AD95A87:4C66AC5320597311:378EF56C445206CF +4D0B351457FB1D19:F1ED735A21:ACDA801121815F40:4254636AAF235A60 +4FBCCA8DBCE392AF:C284BFF3333A:66105A77286C96F9:4F4BAC49BFEE1523 +101115733330ECE5:3E918010C3A311:FA43D72CDD6A4F04:D8773D690E7EF671 +8996ADE0774169D11A1EF78E157AB3C9:3A913A52D35F6D41:\ +82BD7722A5704C2C:7D59C67162592989 +A0B1C44602858AFC9DF4FF3703561CF6:C4E77206DE7FBEC001:\ +C4FB35FB4CECCA1B:91C5204B300E9C8E +5EEC6084E8EA4CBD226B1CE9D03760D7:C2FFAB037354BBF6681A:\ +6462FEF31CD53A14:15F7C886C55B8C80 +635F4DA9940E6BFF3475718EC80A6032:B38993F0421A9482256C3E:\ +B1F09583E9F4332E:6B3A296CE234FFE4 +6C427B05365CE2C1CD7272F4580FF4E7:FC39AFC5C58A746797C64540:\ +C2509FECD82996B6:FCB3F5AC6122AAE6 +C48B1AED56789C2ABF1DC0A3F0F09D95:006F3067DA4F4EF4294925551F:\ +83FC0D025C2B27D4:8A9424DB9F60DB23 +ED198040B7F952B3B2C7B550B8D3E207:8953C0470CC17BEFDCFD7A178941:\ +B29FD310B15FF558:0D832323132E79B4 +F562D640B39DA7BBC5F7FBD0B84EC880:673D81110782DEB537CE33A0DD8F96:\ +E5F2856E63C54113:EEF1601F3C40CD8D +492862C0FA48CDBDE714A0B8881BC1CE6F9F17E9A2754D65:\ +8F4169CC8771200D0BF3D8F7140AA811:\ +5DE9685DEAE62242:3835A7308345E312 +F5B8D08D269EC0F196BA8BA6BB98273F8D90325CEC83424F:\ +8DC4099DC33743F0E6B903CBE8FFCB7C68:\ +1A99B0DAF28CC879:2AFF0DB963454727 +C2DC32BDDA790DADF329874B09727A14BE6F01E097AE5B1A:\ +6EE8C6C2C73E58C82D58105B005149DEAEC7:\ +5ED0CB977CA524B1:4F45E91DE65705AD +920184D9311F88F5D0725F4F40B066DB6FFD1CE2AA86F933:\ +968F75526E091CAC8BD85DD75AD15D49E38ED9:\ +6C9E8BCC4C9F7B91:21728BE0081A555B +A6744F04F97363A5EB120F09DFF42275092E587B14D12492:\ +CD4CBDDA85C9B9E7DE97209472BD2BCF9182150C:\ +9908A488E9ABB414:958C9C62D9593C5E +60B161ACFDEAB66C476EA55D13116F865687F06CFFD13CB3:\ +F58720F8B80AA229BD7642AD9807C647839D853033:\ +61F2CCFC031ECEFF:9F94F426B4ECDEBE +8751AA8954A97684A06B2BFBB85133B33D3DFCE1B8562156:\ +A95527CFC36EFDE34B771A0370ADB1E49879AC424D66:\ +F8A2DB331D17C3BE:AF6D13D63CD74439 +FC16DDB93CAB78299B5A18D9417DFC5A84565BE49057C394:\ +604570CF9BCCCC86FF411D0774AC6559F8D293BEBAB80D:\ +B8D057BA9652F60E:B23B7F81D64B4E5D +C3BF0218E9F75F284871BBD4D4CC6664D964EA0571FC40B1CA54BDB04105DD65:\ +4149D929BC228216A0D58E880112BE987BC1BFEA70D7D9FE:\ +283320F2BDBCECFF:06C528C2E7AAD887 + +E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F662C16A27E4FCF277:\ +4E6F77206973207468652074696D6520666F7220616C6C20:\ +0123456789ABCDEF:1234567890ABCDEF + +[RC5(8)/CBC/PKCS7] +7875DBF6738C64788F34C3C681C99695:FFFFFFFFFFFFFFFF:0102030405:0000000000000000 +7875DBF6738C64787CB3F1DF34F948117FD1A023A5BBA217:\ +FFFFFFFFFFFFFFFF7875DBF6738C647811223344556677:0102030405:0000000000000000 + +[DES/CBC/OneAndZeros] +79FCDEE6F5A94E74::0741219814F4369E:DEFD8C15FEB10458 +54EC08B8ADBBCA8F:61:113F04B28F2A9B7E:46A8D61A1D40091E +7F5C2A6A9F539AD3:6162:7A1771070C736156:5DB9B23CCE795B60 +F0103B237AC98CE5:616263:C4FCD43F56E0AE9B:23A3C25145BE0D20 +65997360ABB15119:61626364:C4FCD43F56E0AE9B:23A3C25145BE0D20 +34D30333EFB7979B:6162636465:F0C27E2EA299D6B9:933CB62A4B934A86 +875E07E80AD49DA0:616263646566:32B6417E7DC574F4:7B42506B38E4A6E1 +994B8B68EE1B0599:61626364656667:3F269D9FF30313AD:DC044A49A694D3B1 + +C224E73B1564AD1FC49353481E6F5E1D:FE21E07064BE5336:\ +80A21AB24ED705D6:ED03EB0F3FB37D02 +55E901FB4BADDBDF1EAE173AFC8D7099:BBAC475C9BF8287A77:\ +CDCC24E1F5D9947C:EAF397A30C64F5FF +6105DF0EE9CF1EBDE42935D364D6C9FB:8C5350033553101EC583:\ +94DB8915D14857F3:91499DE2964505D3 +690EDC0411344EC2B0C7B41A31D2F1BA:F3DD004162E851F63D2340:\ +E32708EEC7FF69DA:5782AB9B02BBE4B6 +CC613B80C91901B3216AD10F6596D8F8:4C609BE7D7F14EA806AAFB56:\ +4F6A0EEDF83718D3:FCE76482531A27B5 +63AF78D1B2A15AECDA6897AD6007E5AE:CA17CCA6AF2B27A30B5F92A2B0:\ +C26991460E22605C:126CBBC4A9FC3EA5 +A096512FB2DA7D0A75A1DA41F234A83E:C2DFEE0749C5A21378D4506AB8A3:\ +07D0D1AF072F0737:B66510CA43FF801E +E641C41182D543E18932FC306FD30726:5A9450CF73A49F570860727C070012:\ +533571A680807F5E:D0FB32F8A2CB7D8E +9C1AD6A9705F9A72069BB0E4D51A968C2399686815F8DCDE:\ +04184EF5DD2105CC02AFA58B68C2C7F4:ED8250E6E97FA6E4:5CE0CB36A781C6AB + +EC41D8E3AA50FC221295274F65A76330:\ +6162636465666768:9F853348B078828A:1DA8B83A9ECB0F6D + +69E0288D17900DA45557053EE79CA771E90CCB8D28198E0D:\ +435255534820414C4C2048554D414E5A:\ +E3BB33E82BDB2B84:593A08135216F478 + +14D752E45A8D28EAB2A5C8E0A12E8A88E804451282F62CA5:\ +7777772E6D656761746F6B796F2E636F6D:\ +458FD140271920A6:605C41F0790BE4EA + +[DES/CBC/CTS] +1F807F8FB9678124B9:9E1CA14BE6538A35DB:88B23AFD0683D337:BAC170D943D262CE +C6FBE4158F2939D81685:673E242016F6BBA293C0:FFFFCD5B8461A7DB:6D688D63D006AFCB +F09F7DEA21F678D8FDF997:\ +15FC19F91682B6DD84E60E:4520E59F0868DA60:D572977CA711487C +80D4E9906F5E093CAB19C835:\ +07F07F2E6E08B791641A95F9:E6A1584C2D9B0F7B:CFDCEFA5DC5CEC3F +1D7DFB8D1670FFA2FDD99872E2:\ +CC5B006B635A022707AE5674A2:3F2B64EC09DB383A:CC26B1221547BBF3 +DEF7C893EFA8282FC430D92DEC8A:\ +25D30B3604955F5D9AB140C0CA08:41899DF2C47BB49D:E92788E786D65178 +4B0DA5D1E34EBC1AFD0EE115F6D6EB:\ +3736F5354719478759C0AE03FBA044:E15683D9B9731171:6055901E02CC51AA +13EBA3C09DA9A92CE12FB67D8D0EDED1:\ +121BE08F10A108CF04F6BD59F8A80EA2:EB1A14148700BE54:93AE09E97D6068AC +A3F29A3DE6B3D52054CDC85FEAEAD5440E:\ +B394FBF91C772ECF3964975819DDE9380C:166B1D73EC15EE53:477A1026883D68F8 +DF6B5B1591C712562A19631E8DAD95153F49:\ +E2416356E94211935EC4448BE0AB43EE1A80:2F01F85201D1B010:5066B27BF6719D41 +FB7FDF98254DA02C2FF2A7801EEC8CD4B5DE03:\ +50FD46F08A0EBC980F24C9484799EBC2028F75:2CA90BF9C26CCEB4:50446BBB5961F03C +DAF13C5B1DBB958869C0633E8F7EB75646A17647:\ +CF81978920DB7182CF7CA7B5D1177DA83C372C4A:29B6B35BBD8575B3:76EC8D7FA07B8BE5 +87F9684E940E9C410327370A9F10270081B0A5B431:\ +FFE5FC92FBBA432A381F0CA62691AFAD668A0AC192:54ACB83F531EE8EA:9CC628CC5BDEE576 +E2BBA60098114B85838CCA4F1FC8D22A3D8234E0D796:\ +F84EE66897F4D44F882304C3C7D5F630BFD47250B6BD:C562A007017EFC2E:9E4C18CAC2C60138 + +2DC5DBB9A4F55CEB1A65871417FB293A9726642DD02171:\ +3B4EB0E3405E17EDD17856D29AC97E7B6E3BC196802A24:\ +4A403657C2102B99:90474AFC765346AC + +B902D393A62F51E99CBC97B1310830767557835CC56BF88F:\ +506C86A1D0E325684DD23BE8445CDB08D734D6FAA48BC1F8:\ +CAC16F52CA80B183:CFF070594D1A8020 + +BE082E12FA28CEE1F24328D50FEF71C055D61A6B71466EE56C:\ +B03B09966AC8261CBD17E6CE218B4A826B3D0D36C735BE1CB6:\ +2FDF8948B7AD54C3:8CBDBEF17F1B1328 + +C9C4702752294E5C3410071A0BF19549AF90213619754EADA1F7:\ +4D790FAB1374E5387CFC5AE9E7FBE0ABD57F634024BB32FA6D95:\ +6A277A4D5B27FECA:6007E397C5E1B6B2 + +C91A1979FA1A4F93FB8FDA30BD82C26EDD397D91146C044D3C9AB5:\ +01FADB9D549F559E4BD4AABEA073166D76ACB68B3BC7C38E758CE2:\ +E554075663480335:287B947D8D85E403 + +ECAE28210D616F758CA9111276A10D2151E3F7D0BC567D88944FD697:\ +4DF4CF96C82CAFCCF4791A26DB3A55E8FFF1F374020B1495AFAC8B10:\ +81CCB226258A2BD9:48CEEAED7E7D2B60 + +DA5A434A5416AEDE9AD557F48183C32406EA78FF5B3B37D5069A8077F8:\ +EB80E96A60CBE0E7E430BCC748F4CBCD61382FEA8787AD11DD598A202F:\ +BAF7BA1C4F38A3FC:13D4AED7365948F1 + +243B2A015703ECD61FE8DCCC3B216389AE437C0582F5B96493BBEC9B4C68:\ +8FB383275E6F93391E97B13EFC3F7C99F731CB1B346EB15BB5F8DA6248A2:\ +24EC41340744EE04:811219783983A9A0 + +7CF27928B68E2A4CF007F5C740EF3D42E3C86AD0A768C50F65A92F7EF76CC3:\ +A3165F6001A3C69BDACEF31D924F4CE8AC9CC6CD10BE9948742A2E98DBFDF0:\ +A9A60A3BE162FA91:771A271B54C3DBDF + +0190C2294922A17D6E40B2595C9552F0D460F1552315D964818F01CFC7836E74:\ +E6DD056E42D117095F389321E259A004D467096DA28EEA534DC6568C3485B9D5:\ +47B469F51A41EC35:623A5F40A498554B + +BAEFF9B09693512CAE7CDEE14628C39898360AE20BAE66C845D920FE16F6D626DF:\ +4D0E59994E070D66F913698947E4AAE1F3044928F29D4ED59CAD18D24E134C52F8:\ +E8C7568DD459A5D9:F82C3042C634B503 + +B60D0279220B5AC636A861AEE3867B21533A579ABADD3EC5CCB7DD84B23AF3794CC6:\ +4786F439927802927B1AFB3B0DB3C059CA36E4E9D8851C304ABF12438A5F1D7C15E8:\ +5F4379FC61646FCB:8FFD75FA48D32230 + +245DD4A56151DCDBD0000DF64239D4E64CBC9E82878E3465BBEB86F8DB4782565DC96F:\ +12B6CCB90894783FEC5A375C1744BC7E276DF3D21433EC842373FDDEAAF4D2FCB4229C:\ +1B9F7251AF742AF2:61E984D8B88552DC + +3B7598C46993B7046BADB4240143B112CAD1955913073B61E1F77871300A3A4933CE98CC:\ +B84AA9F532EB1DAEEA5332BCAF2402E4CAC762CEB614A686A7A5483AC968FFE6FA84282E:\ +CDE1C86F35672CE4:4B1A4FD4B170196C + +5EF4F1E99D2B142769C82590356C5C69C0B3524FC5F849A583464F6448420A7E1FC3563BE0:\ +16064D069A02CF2F8E05953D3B94764568A1C9A1B12AB56CF1032BEE90DA83A807ED5B9670:\ +D427CDE3D72512B0:DC0C33ED870E2BFD + +BB8ACFD2BDCD37D952FCFB3C4E668AA5A4EAD2273BD6C84DFC0E8E55AF2DC54D7E3C908FADF7:\ +2E682E802242ACD731E439A7392A5F8701256FD23BA03A65A723671920228B34EC6484E53AB4:\ +57EEEBF7FD0D4E18:B88F867E5276A8CF + +[DES/CFB(64)] +F3096249C7F46E51A69E839B1A92F78403467133898EA622:\ +4E6F77206973207468652074696D6520666F7220616C6C20:\ +0123456789ABCDEF:1234567890ABCDEF + +F3096249C7F46E51A69E839B1A92F78403467133898EA622:\ +4E6F77206973207468652074696D6520666F7220616C6C20:\ +0123456789ABCDEF:1234567890ABCDEF + +0CB8929A854E61AB3BEB72CE0F13BA328BA73A:\ +D14FD67A9B4D7B0F65B7CA3DA91741603DA446:\ +7132D895529A7AFF:FA1FE8F921706C75 + +# Random tests, 1...17 byte inputs +8C:14:FC32B875389C53C0:6CAD29F658A72118 +4045:20A8:89D26DA778B3BA96:C6727E943ECFD50D +3C17ED:E13C5B:A9F4D6E479BDE314:271C258E90098CC9 +4B465AAD:DDFB818A:C0DF30CA0DC7B5A7:0F141E7F0EDD71DB +EA6E62D9AA:F70A23F77F:EB26600BD965DE91:6F700666CF4EDEAE +C486B45156B6:73B635137A36:C56CDC1349657886:5883CBD2A332FD55 +3030B2F0CF44EC:2160B2C75B616F:0DDBF5FF8489B870:F9E9C856200036D3 +C6D70FF570F90870:260C393389E6489A:4E96BA675101F1EE:4DFCB5C3570E2235 +966F556D1AB16D9A84:86083459660733A6EC:16ABBC1F03F13DCC:571EF2769E6DBDFE +42CD5A8DA77110EB8E56:300AB25A182F798D2195:DB2807197F31E79C:465C5C1BE8DC2699 +1A6829A79F40DBEA451043:2DFD811615ED4490B9AA6C:97D3995360F10777:B4D324EC37BC140B +D4736432091A2DBA9E7624D5:6BC6540B34674448AF311283:\ +6C7E65D7EECBDC07:2E41B63F4381C5AD +ACDDA761DDE4D7D23065726194:E7FE3DDC6257543EB319DD565E:\ +B55CB5A2BFED0E0C:C290747BAE6C2651 +E9CD9B31E903C3219D3D83D3B01F:1A17ADEB075B2A94777C8EF0ED11:\ +36982D604982EB26:B4AD47CB63991A37 +5501CAF4CB8843D460CE4D64AC9F3B:168583B6B5A1B5E8246EA11E1D5B25:\ +BD51A1B281929DC7:C5AAD3504E6C4BBD +D4FE93AD0BA52E4919308E1273714C52:CF0C5D133700651565A8C1885C1576B2:\ +A8C2FAA4B9EE7986:9B733E3380066255 +E4D2F1241759BDC21164DD17CEF53043E7:DB72BF34A34159D488F9C6537D062C8E56:\ +B90CAF95123094D8:48E6D697471B2639 + +[DES/CFB(32)] +13799E52F0BF6B0E:BF28A5B2F3FC788F:44FD92D1AF17DA22:5EF2AB4DE2C32258 + +BA696D0FEFF0882ABEF2E0BCC543CBE2:A6D36D854511809856A9911919FCF070:\ +5046A6A7584E015A:D006FDD64A63FFF5 +6A837A170812A9E6E1A5DC69AA6FBCE2:19359DAB792F0D020115A7722C171532:\ +B992C4C6A2320278:5AEF500DDD6608E5 +77672D81E388902A764B427DAC586F20:B4EABA09CC71CB3CFD191F20065A1B70:\ +E6862A4F40A85BE4:E743B2DD825BF2C0 +EF7DA9BCA94489CE200530EAFE1CD7E7:244273B4BD388B9099669BBEFDC4454A:\ +C4438F020753FE17:36AF1E8E06E278FB +9B51C216FBAD699636400C962F2E3405:3B9834AB792F727E788C7D32625455D3:\ +465537A2E2167EEB:CCFDB7E38ABF99D9 +19D49D5A54C8FD15EF317AFD5A87EBDE:302C49BF921E0516261F00B2FA2E96A6:\ +F15BD42AEA7F38FD:5E10F9CAF0730C4E + +[DES/CFB(16)] +D6522C5DEF57233BD3A6A30F457A079A:769DE609244B94A8B4E4727736DEA7BA:\ +E1D28FFDD5036622:7A3E915CE8A03836 + +E8E4A04E0F07E2D9:BD4E5489C5CC01C5:BFCA0E11D1ECFBA7:E115ACDCE0EADA59 +7DDE9ACFB699E9B4:CD42413995D601FE:EDFE86AC2EF8ADFE:4ABE7D04F174CA97 +5F803D644DE8B9E5:5D4B3F430AB38F6E:B94861B7AAB541D8:9EE77D9E68A0968A +3421750B8D2F984B:2230CF77A827A379:DCA93094B06CB02B:B7D1CF1634AC7D72 +4FBEFCBE20691E11:AA9DCA8BD9C31D51:6F4C469A7710EA31:D091690C4D0203A1 + +[DES/CFB(8)] +205EFAA6251E7659:C5A1343F4AC4DD7B:C42B0F47482DABA0:48848E073CF89946 +7B0CEB1D343B181B:BABB3F2ECEE17044:01E4B49A4C327C83:7837CB9035139E36 +FC48CB21644AA6A6:35BD7CBB4F42FE66:DF6B71F274CEAE61:8365BDF506BD2382 +7423BC2D230FF167:75648C39AF4DE0DC:2E1BAA1165A460A4:35E0A0149D95735E +8E511E034A21F8D4:6FFC4455799C1A52:FB029C10575CC9EF:DCC44B7A2C4912E0 +6AF4AA1647F5D301:BCFB89E0F3FEF946:468B7763A174FB3F:99057856B861F898 +8BCF14590ECECAB3:8A8907B5BAA3C332:60E50468766A6688:ADC6C30CDD00F54E +FB5984B0442353C5:59A6F97571EFBAAD:23A9AEAF310E7134:809E47BF2565701F +52ED7FC58FCD4DCF:B9B761F8C8AFD67C:E9480E1E6AFBA1D5:23D1BA6B06632D52 +7DFEED75F6A1306E:DB7A16136E5B71B7:C82593A34F75DF42:B6D33655396C925A + +[DES/OFB] +4E6F77206973207468652074696D6520666F7220616C6C20:\ +F3096249C7F46E5135F24A242EEB3D3F3D6D5BE3255AF8C3:\ +0123456789ABCDEF:1234567890ABCDEF + +B25330D1CAB11FDDFF278192AA2C935A9C7745733E6DA8:\ +39B9BF284D6DA6E639B8040B8DA01E469DBA4C6E50B1AB:\ +F871822C7FD1D6A3:B311792C8BC02EE8 + +73AD356623A1D6E0717E838B9344B4FFF21BDA:\ +0C06E63E9E81D9976E16D2009255F917797D51:\ +5860F4A413DE6C68:527A1E050A9D71F0 + +08A6091FA2987FDC682A8199A6D6BD1F:640B5033DCF26873FA8A34DB644F2BF2:\ +3307042DC775035E:99DE32FF0351509B + +[DES/CTR-BE] +4E6F77206973207468652074696D6520666F7220616C6C20:\ +F3096249C7F46E51163A8CA0FFC94C27FA2F80F480B86F75:\ +0123456789ABCDEF:1234567890ABCDEF + +11919B328564DA68D9F4216AE1B4FA7C46AFC7AD5BB867DF1834D77A3023ECAB940725AB:\ +F40235A0B8B2EC0B53F3C0D8799497463638AD0CC3E07F0E8B8B0DC7605AE6AEAFBA2A88:\ +A67ABE525A0E5AB2:727BECDE9FCEA20A +168A502D21D71F3BEB702BBF02D3F6D04B72EFF2F19EF01D217CC7AA739A67466AF3B14E:\ +3A73770D157C23EF8913D874CD92DD36C465679B2BC691DAA0DC6CD4591C4CA44D5D69D8:\ +CDB366CCD621D62B:1ACAAC3F760C674B +24889A268E11AEF80852C4FC4893DBEBDF4CB06115FD533650CA39A639C659F47C3D5556:\ +782B24067A2C5D61BF6ED2E980F6BB16A0A6E0B5639B4208AE273C0BDC0311D65464F217:\ +EF510AA740BE98CB:74E74E01E5C72084 +3078866926F75D18239A3DA92EC9EB88D18393440B47D46A49D003F2C3B5D51C1CFE3FF4:\ +DE4D9632BE88235D717B36DE4C67B81CF3331E8925726CAD1BCC05126B87A6CD5D5DE3B6:\ +E8CBB756DE4FDEB0:AEE751205CABA9BE +4602C97A25AFB1746DE8BC1A65AE0B635ADDAB9547A99421AD86AFB087997ABC1458F0CC:\ +754BD27902EE4248BEEE65D2BB035C9139F98735C85603BA9565EDAADE37A7FE29833DD9:\ +B050B286E47C6E6A:701F72AE37D31F2B +E344E0C2E45990C451C75BF74406821B99D4EA5F56F67BB2F9B0EA52FF5D1BB25D82A181:\ +1A23AD101A776F902B8DB40E273A1F5EAE8AA1E43CBA52546F2EC50EF32960BDD05101D3:\ +445A14B76AFEFBC0:EE2DD8860B75788A +2C3A117378B8DB1287CE8FE084EAA08EFCEB253DD4A92509EAD154E6AE483E25D2B790B5:\ +75235CB3E2BF7DD3ED893DA93AE25D7A34D43521DB620E2BC9072159357010E6D81E5884:\ +4B1B62B9D6B8F54F:036CC5145BCE2A01 +FBC7E48930ADF4A36DE18CABDE25ACDAC8F9AB727E3AA69FE8EC6F965C6E14EBE9AE437D:\ +B271913A8A58ADDF3C89132A15DF1263B63018CC8EE6763E6FCFB4DD5D4AA8EC4B3E2D78:\ +2E0F06AE7B1C30D7:05E144D6DB9E7939 +940C3FE78C56A0F922FBEDE7ADE31914C993BB84F5BC1557E5F8004CB75D7D339801FBBF:\ +9615A71536135E50946A8517E72A980CBB2378A3286F08E76E85E5FB62140C9B3720C7C4:\ +E6E85EABE538195C:B86615CDA5C9E9A2 +256ABA748AE0005A5F99F1C96F8A197E3867B8455A4D6BFD6795BBDB89062B222E6B0DD7:\ +2A6B043F07ACD99141C7AC616B7F89AB7E52174A41AFC1FD0C56BC77B9C2EC9CEC87A0A6:\ +9985CE7E0D79CFEF:25D1D57C3A6936F9 +44AC3E1333DE5CD00475317CBAD26AB4A812180DAA7405556C41335572F5A236C37CD36F:\ +155E5B86FC06AD433DAEFA05C329BC1407966220BA91EAC2FD32B35C5AD973D94A0B8792:\ +47550AB0F346ECB0:1C42F4559385E11B +9DEDC376CFD97AE823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD:\ +EDE3E69EE5B55AC758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D:\ +098EFEE0D594C332:88D9C46E992B27AE + +[AES/EAX] +B39AB9280E8E75FFB9A6C0423D94237757:A1:\ +32942F082B82885F3965397EC13315D8:79E2ABF57EAB5DCBB887FC38069FDA38 + +F28FF0575837BBF9B18E1AF21F086271224BDC:DFA72B:\ +16EBB23CE362FE4F9D75D7FD330C57AE:13A112FDD1A803DADD153FCFF5E6FA0B + +79B15D05BD1198BCAFDC4E5479C94479EED48273:8EDCC43E:\ +5D83726C0764B9DE12E97C81D925BD12:E2614B57C71FC5DDE11AB56FF67AAD53 + +6CF9258B79066C6D1D3CEF7DFDC07F1CD3A2C456:2CCE2B48:\ +898EEA34047E0896A49BD8EC9E5FEF10:86B46B759E771F7DD2F5D6FEC401474D + +2B098DF40219F5378FE910750AA62597BCE7F2BF91ADF6AB8933C113F81E9488:\ +C202A2C43538DFBED961D4C6B9628E3D:D41C09CE65EB3924456360D76B78C42D:\ +7A67F1AF9FD16E7832423FEBA5CD2879 + +3592BF54500CAEA6CBB6AAAB7CB3BFBE::\ +CA0F81BA5479F3B8AC847B7EF116C2A1:29D2ECC2C99C3676E7B9F85AB3B1E57D + +4DA9BE08E753EA123DEAB8DFFBA315DB50:B9:\ +D71D44511C92B390AC9C7961506D9E5B:032E8F2C3E7E0B152DC087E20FB59CE6 + +178CFF2FAA32FF902EC92AEB5B30834B5758:0ADA:\ +39F797C50D5BC13FE895367BF2ABB56C:58399D9AA144C8236655F51D81FFF7BA + +37ECF2F5E41D4DFDDA3DA85F1D82A3767E8360:3CD5B1:\ +DEC57BD1A4D6B9C0160E53492DEC88C5:3D60B53B4A64D1F9B6802AF9BD00AB9B + +3165D9ADB4E3CEC0831B85AF88C5787C0D145A92:09FEC8F9:\ +7A09C4F9265809EDF4BB32E3270D6F46:EEF79DD485F69FA5D0457DD94345D2BD + +05B76D5CBE49DE233B6F62E4D87763FDD0A210A84B:F3C0EAE690:\ +9FBD4E3CC8B0B54454788C5B68AAC81C:2F0269EAF6708D3B1B332EDB1E146BBD + +FF9CAF05A8107C410BFCDD14E3852C5A76F8EB5C116B:1F31923D5518:\ +85ABF08534075B6EE35AD7C550794BEB:AC962D0FE55AA2972BC2C8BDFF1ED584 + +81655A74F4F64E21B004F3D04D56512A7D1EDCB9B20200:C7C8F67C72E962:\ +170247F224B15FE3D501DFDB21EEA1AA:46FB86732B98C18460897ADCFB643E12 + +D81940ACDFB353AF804BB411C6950BD8FF9E15067B406830:06C456B3B74175FB:\ +CDC09E48511B3E38B75D14EA069BC885:CBF80EE76101BA67C5111A7C528F781F + +DE25F7B65F16113841D5AE12F80A1744A5F81B09EE5D29240C:0B2FC9C8FA81E7198E:\ +165372615FB7963B7A6E59364ADAE29D:401A0B4312344F41FD173B7FFF540D15 + +BB873E2B7A879E53F513F1834C54853FC2037D9893F65824CCB9:DA2057C6401125A5808F:\ +2F32841E15A6A883EC5CE8032E563BB0:B33743A1061DC15DE3026E09A7EF98D7 + +304864E3B8DA2359BAF5ED60C76DB298E2C12E94D18FC615F934BC:20DA4B54F8EDC93EE5DF91:\ +AD94D86D3D05ACCE0FED495B6FF5F23D:4DE497550471A059698E22A773013821 + +8CBAFB5678D47121DC5F0CABA76F0A1A306B22C19B86C883CCA36F39:\ +26C2C7533B8481560FA3F226:\ +9D59713C92F96FA1CB0469662541540E:B4AEC9DB70912EAB15AF012552F44BF0 + +7AEE2EA671EA8B5F25E99F000D181CBEDD36BEE605D35BB4AFE833CACA:\ +C0C7FF94C3588CEB45619BBA5C:\ +B98A22543794F9DA5C3419BD9A1FBFA3:CE98649597F858EF844335E5DFEF4198 + +D0FE64F8842CF1A4C0750C6F11F8364E72A23D80D139900C9883CCB64090:\ +924A4112C3B76FF98D45355A60A4:\ +4AFC52C6B9C20C594DDA2CDD347E72C7:CF05111017D4C887CD55CC02B02DA6FA + +CB869382EB0644E9D00736793D5E19A56799CBF313F87EEAF28B7D997FD34B:\ +B545B07CAC05C6ABA080EFE09F1B58:\ +4AD8D6A4A2E9A16C690EF49ED125F92E:DA3EDE56EAE31D96839D85633DA0BC87 + +E267E3C9701672235AA5B69C6491BB54CD490FE8F99A6668A94AE6DCD94035AE:\ +DB210878188D2D0A9E72BD7C674D3F5B:\ +4D3E720750529D0F513E92763E59A31A:7BAB929338BF9DD7315B5398A892F3F5 + +861567E2AD28833FE5B6F4D1A37D2D0D5984FB4EE2FA0AA91F7AE9BD7D24231BE5:\ +C1DE878D368F80A87C15BDF8A40026FAA9:\ +42353F4A310C9A8AC8C8514C792E0D58:B69A8E451A37C12FF4B9D3F4E0CD9D22 + +AB6C088C4E0C0EBEC2BCBBC9A98514B05A445D563FDB50BD62EB2B9C26958803A297:\ +9ABE34A69F182DCEBB766EC9181F2E083382:\ +2D35319C7307ED58372CFB6712952547:3BC55F69931ADF01E3F72111FF54942C + +C3B6CD7D76EFA2E354C4E8F7304C7075E18768F4289D7F3836FC8DE15474C7E29C58E5:\ +65CD9E4A150319445A8C66F02CC3BF651E9FE1:\ +3D837364406414252F703E8CD50B2A1F:212D386588C4CB78F08E3756ACD637E9 + +670B848D3BBB52E923AC9BCE4317E68D7962C73F3D467FCF5924EA7A3C6A49C815D7265D:\ +B3DEB5D5B958DFF8A64ECC1D146E33BA0A261A89:\ +CBA99B5D4C96D127F5C5B4A8A3697E5C:C25D5468AB2185C08FB97A99DF9522AA + +7682A2E42D701828D7DE633AC10F944CE42E00EAF52316AB023662E4D8A7FC16C1D06F7ABE:\ +D1B17D59C7BFD0F0E77B8EC21AFA78018B2ACD11A7:\ +CCE8F486487E7A451DAD16CE2B6F96EA:4086D1BB1594D50F0CD79A36A4ABDD70 + +F083A6CD239631E8CF3055108CE5BC491F57DDB5F57C3BAA188A12DBE43F1670BE36BE92241F:\ +A7AD209830FFCB8A89F2E90A5C4F57E3AB63559A0FEA:\ +C4EC64DD6D082CB6B2D363D26B94D136:1E5B2907658557BC690220BE9C2FA860 + +57FDB6E005621F3F5A23049803817D8B2982C20C3504B0\ +BAC825269431C3CF68D51A0E349E5DCF:\ +F6C8C495B93A0AE6F61EBA1773F05D7C2ED4B9F17E5E16:\ +76A0D567CE9CECED93B5B1286EEB3354:E1510EF8C5FF55412D29FA1EA758341D + +8BC73BB8EEFB46E742DE9EA40226DD48755B1049C0D01E75\ +47FC1A6537B61CE2F3573496F291D016:\ +F7012F6E6E938F7529E7905ED045D0558A5B168B3C6C815E:\ +E8280E1F06468BFD47BA6CB54EFB2A77:E3BAD5B3FFA50889001F143D8B959B73 + +AA1B16CDA20C35A84D0B7F89C4D6E9C061FC2469080F1AC929\ +8590EFDE1B39474005CB319B19EF3CB9:\ +8B8631197B30C7370B7FE540567D2CAE5C8E6053DBCCF75162:\ +7F52829F60F32AE6244462540B99608A:7EA0E1FCCC8F585BF0AB36BCA3871F22 + +6B2F99D7840808EECC6CC70DD6EE11038906EF6EC8C8B49BD121\ +B5199B440625D00CB38C327597AD9573:\ +F650F5F428CC5BF6B755CE90DC86F46A7DAB41B1CC9E8243A731:\ +A42FB43E3BAA8E309EB6FCF9ACB34F7A:432B0037957DE2D72FAF75B1F21CE296 + +FD24E4137BFB0BAA260C5263FBA35BE28E1ABE1928F2AA55C192DE\ +C841A8D08639F4721712E1CF737E9BF6:\ +0146825F3EB53904628D652D59F003EE604971226BA3BA2E8F3DD1:\ +552308A6244E28838DDDBD913F4AF76C:A3E7709248B9036A25A724533661258C + +52F6DC00BA21BF0A0718F5F931822EF23C94ACFFEDE0A7BE28E4DA74\ +6246F6B89B5899001060A42D0543DE26:\ +CCF9C55515CA3C5162D3847DF2C6B318314444CDB8AF9C34E985E351:\ +D209AE9F0273F4173E3069A004ED1DF6:B3D10EE41552B1CD024E02EBD3E53CA5 + +4A87AE20CDD8058A3507B1BDCF4AF6737D38C40F8AEF647DB8158D503B\ +E3A1C394C7438B171AB4E57CAC2FE274:\ +CEBE04BEE25C79D6167B220733336A5E2D7C27E888359C3D6F1F01E981:\ +FE034FBC070D9E6386757A01978134CA:EC92F768B9E0F0EF7C2D5E9B2E471C2D + +1D8B38719B5032629F5AB5B6EE59C3DD22F7A48735C5710802DF28704836\ +F8244F62E56E0E12479AE6C6EE0BBA0C:\ +C3D1992FB96CD9A6F3668EB54276600EA7DA9E9D3639C7CDFAE556D851D8:\ +9115AA2A4463971D0A8A84983FC60EA0:D4B67A7253B0AB1A7EA5FFD47D51AD0E + +6D030D5AECA8239E4BE536F5B9886AC6F38FF34B77909FDFA81C030348B701\ +3AEBE5C0889189A4B2F3F2B3E06A5DC8:\ +5BB719AAC1999824AD9AE817491AE0924A56628A895DA88EAFCDDBF5F32CB0:\ +4FE3C9F9A56391C9102BB12774CB0707:165E69A0E7C648767516516A097E1A58 + +C932628CBB4E53FCEE5C585F04BC9C08::\ +6ABE1356E6A4B484E454BC488E108979:B29D87C2BD94CDFD94DBD318309CDE9A + +C712CDA7CB6CAE9C067FB1006B33A740B7:61:\ +AC7A66CC944A177467DD30EBFFE24344:4034E0C5EF7B49AF710B8B86BABAE767 + +4BD4FB492AF9296BD50B0338A4D80BFCBFAE:5EAF:\ +C41CB4E2208A2AE49D59313AA3852A50:B23B3A8E850C41DC30448304C9E2B38D + +944500DA2B82C64DB63101760FAD9B04B7B5AE:8D2848:\ +CB5972D3FD65E49F000D5754664E4209:69C9F9FC392CB8055E4C52BDD97A05A4 + +EFAF16EABE3320C8C650AD585DFCBDB537E4E5A1:B29B9A22:\ +F57E5FA4371F40528911EB3168011F36:ED4B8BB9B6635CA38F871E4122B96318 + +F48C1026C094968A52983AEF848644390EF0AD887D:1D74EA6C4C:\ +13EBD6907963AFA2A38725D1C584C40F:809E32023528D14D9C626A114CD65D5F + +8A60BBDF08C42353DDB7932AECEFB220D692A8E8DA2B:44C3EA4929A1:\ +D5E9FD2260051E900851974AFF447B15:467F03F57C4A071F4D4CE237950CD86A + +BD6CFB5269FEFEA13CF4E32FF4CCD483A27B8A7A1D1B79:4928D4FE0CA3B9:\ +8B5E6F2B0EE6F1239D9BBDB7AAC91B00:7F9E64B73FBD80AE06A88205B425BE3F + +F9A4A1646EBB784A59D7CFCA193B3E9C2527FD92542D0006:44F885030002B7E4:\ +7065E368FFBDA1905BDEEEA754C0D5F5:35E4CDE820A334649BB9679CBB1E802B + +6896B0857D444F64787D6C61B71AFD5DCE6B9B143A1DF9DADC:5EF4B47926F72F4C43:\ +E6619897C6063BA60CC799EB1A05729A:D8F3B9E8F6A746EA5BBF1053EE5D96D5 + +9F75767C335CC510E6C814189ECD49E8841F84558AA47D491263:\ +90E00F618EB235500F89:\ +B64A720D683731BAAF132D6DF42600CD:98CE0D42969D23A5FEB158330167BDB7 + +29CCA4206E1C37A5BBF518BADCA66A13C0EF15C354C63CDFBBBC1F:\ +4F332A5B8C25A9113EB2DC:\ +FCC2E4AFFA189E41FCF0459C26DFF44D:CF12F4E161270BBCB33065C56F17A16B + +1BE9151414493D890F745B9C9810C915C679A03EC472007E07FFCBCA:\ +8A000D4EE11C4E34F75745A1:\ +29A10586F8D97606B9E41A679C348050:1709BBA10AC8EFEBE43E20DB95657CBE + +DF3DAF8B27B621FE4A580417174129C2DEDCD57170522DCF082B122707:\ +F5E09BB8E5DBD03E11BCB8D472:\ +CC41B73738199B467196B9A5D6D39682:2904770A9F30EF7A002D8CBCE5602FB1 + +F9A7C4844697FB986EC79D855EEBC2EFCBC7720F2A9FB9CF74213A49FDA2:\ +FF6503CEBD39F306CCA42EEE8508:\ +9BCD3AF2077CECB7A2FFD54AC8082C23:0A2B880DF94646EC4C12907B0016839B + +8ED7662492F58987CE4FDE4229EDC77BF0D32EC9D8F9B048F7846A34D85A3F:\ +449CCDB5F645CD9637511D12F0A3F0:\ +506B94A8633D7873D6C4AF0C6908AEFD:4D4ACB024110D0D74721F45A11974A61 + +BDA3847797F2B5D97A2E4B1F307B865E4F56543BF56C50BBA1F6020E91F592F0:\ +A66868B66D2467C7216A6338DE8FC825:\ +ECBBA42D11A978A354AE97A093300139:9869EF068E56CDAFC131E79FC0B0C5AC + +532AA827573A33F5B81E62BC9DEE898537A8ED67239B80CA3453B71020D864D90F:\ +037B870E75AC9115506E09A0230BCA03AC:\ +B72999FCFBA184A8B895A9B1FD3DB478:C5C2ED715403C2C20C62E5172DE9C3E4 + +FC2B9B937B6A7F4C9A0DB15278C5CB8A7BA136430DE5D201C66C50689351FC237BDC:\ +E71ED7DFF82A2797EC693B182D313B08C6B8:\ +3DA9289752DF9B669A9D8AB66A71D441:50CC6B776357E19F700ED0AB17966354 + +56CBFFC676262403ECAF1BC51C3D65E5E1CD293BB5B12546C264C79891160300842334:\ +3D4300526204967051D76410E3143B9C17CD80:\ +37AA0C11E0EB1F53AAC3EE8500318553:9489E904DAC168EBA47C264093F3C0CB + +B24D05663B3C762D59AE8B164047EAACE87695B82AE57520E0C87A2E6D1DCBD4407F4090:\ +0A22454378AAD07A5A541ADF20D54664BB7310BB:\ +8ADF49FC3784012C38A95042CC968544:4056BE9AAAD879CAADBF2E68323F24BC + +C79E13FADF1F05C15D7953D016FBAAAC7969DE1AD696F802231D449176C2DBB6BA56467B27:\ +FC30113613A67D7C64C63A8F8B664650ACB6DCD00A:\ +6D5300B815CB728A792086AA32BCBDD8:39393D0074CC8BDA12DB86C8B756D224 + +FAF932FE8F4422C8BECCB00EC76DA79257C56E1EE4ED314A0A1075D952CFB97621D4CF7CFE14:\ +0F1A561E0B0F7C0FD152926D0F90D57384D7FFC38D4B:\ +D64CA6972E6F91E7B2A00108BF0C183B:1BE98EAE579D3E2C10C2030F85905A5B + +1F09C21297176C1788562A8126B83E0F0CE3FC15309E6C5B46EF97E56AD125:\ +966B82E2C328FDBB167D085DC029A6:\ +274BAD60A536DE7D916F95CB2175AF9E:0B1B20EDDE48EB9A5E68A2BB28CC614F + +23DDEDDEF95C0B28FE8D5B305FD83D52F442D97D465CE637A648EE04578106C0:\ +5A899A3B0AEC81C95D7AA595E2FD72AB:\ +A7B1C1626B3ACA26D2C216EBD618B630:A1506BAB3DED749A67192F4A16A1F5BD + +7985DBCD7922D326F9C06DC90E0FC7F518A5B7B11C155EAFBB9A708D6E10CF9440:\ +A73151592F0952CCB9723ABF53269882A7:\ +F3D05C6CFF898C80E2FEC0CF063A7737:8CD0669522324E946D0EE793A6693A9A + +C843A2352EC2F9E40094A80D3C7B00D56F0F266128D4EE4CD2AA0EBA9FE98A21D4CD:\ +543D2E144B36DF48A1083735244C91FCC30D:\ +79DAE3A9A8D44798ADC660173CB4556A:C9A0A0A8E941B02077D56C08D130154A + +5EC8F04849BF9E61A2145BED2003B1784694AD418CD2944888848D03B16D717346359A:\ +3F5C581B378124D866EE6046CA54DB45993CB5:\ +5487234213607058995B0E949A6BECB6:A26DDA7AD3C8DA19922EF4D8C7308D1B + +7EE5D87A59A6B11072123E7B728EA99A0C89E3F4EC9D9E6D088D09C57F77ACA82B6B36D9:\ +0C1AABA9072AF4CA02D6AC2AD5B2329523AD8C7A:\ +8E9A279E45508D14A43293B14D3F5A54:694E1F6B24CB95F97EC78EA1751B1B03 + +83765858587AEA004B2D98A3E1841DAB06E251E5AB455B6E7434889B014BA4586ECD354880:\ +829F5237301335F035CC410BCE75C4C2E89E8109A4:\ +D96E6D0D53061BAD69902F08E26638F5:9C292B686A3637DFFAF9C7987AD03D54 + +15674158151BA6A84F7C8937712D65A5B4F61325685A19EEED471E2CA7E2EB43F15CC2DC1D36:\ +B9D5B9BD05F145CD977E358D799D637F093D797D8378:\ +AE3F3D269BC1B851DC7126952E2C8774:F91EF22FAB6BCC0EEAD54B6353CFDB01 + +4EC14FA09C85395DC42D807C64B052203FD889907B40E8\ +DBEC0AB58A1C92882CE226770FC4F5D5:\ +339431576AEE57FE6091D148E5F6CF7827F25C131F2CE0:\ +7CDA2113620FC51042594199C32FF1C2:8F8293D76789A6DFB1983BC4B868A434 + +3A1AFFDBF58441C6CF36D4E40A7D2DF0170D1EA2B99F53B7\ +37814376AA1BFE8B4E09363225EBFF25:\ +0ABA7C2506C0C304711B50BCC699B7C45F3DED61A794ACE5:\ +ECF144123590C83F4A44655005285576:43A532093EE9CE9E26BBFFCE4FABB33B + +7F3D6219C09BD6ADA2C02A8E7A6218E070A2D065F68BBDE76E\ +8CFDC872AEFCBFCDF237D789371BDBEA:\ +404C55DA8B61CAEA5ECDD03602058A07F28499944B86692B8C:\ +DFA17F19D8CA59241F34AF81FE99DFCB:6A15CD6F9FD462236DF66FF4609A803F + +A4140A86D0BC3A9383C19709D2C4E833F3474C8AF0C3DA63CA\ +6ADBDE7BCBE8EC0F11141C4D0E4415FBE1:\ +54B2BCC0182145BC510319425F6AD3B10A1A9BEB65C04B32DF65:\ +3B0E2A90CD7E438A3F5BAB8417FC8730:3EE79A1198A52B339091F3DBC3D340FF + +2718AB1822C8BD9DA39B479402449CE0834BC1616ECC3F1308A24D\ +EFA73CB7D1FBCC310686AECBE95F7532:\ +1A392F066BECDF3F15D95B92098028FEE4310A283094A3A81CFACF:\ +C4D21881ED51B0F3BD9DD2FCB2AB5744:B5D76DB3BB9EBDE3CE5287776E814632 + +1A6C33093FB3931CEBB1E7CCA95FE93B135F8D3768AEE395FDDF81A1\ +C60D528B0BF40326DD56FE8ED50F158A:\ +15E86BA59F0E3D5AE3A664967C1BC3F6022B8DC12986DB779273BBB0:\ +ABC25FC0AACA664AD9A3A4BC490952C6:2415BC27414AE86AD0C3E163369C13E1 + +585F73C77639D0DA807CFCEF82DD595E5F57866BBC2F619F49612792A9\ +6C2E4C739BAA2220F986801C95FE12DA:\ +7C9C82DEEC159CEB4E9890F0FCFF5010F9E574362A3D6D06B2147BD18F:\ +14440CB0C6EA9CDB8687291E181A1B17:6A2B104F9F4779DCB47F8FC8FB60580F + +F942097AE0852BFC7E5E4034BA987782575056C6340177427F61E313BC2C\ +A2CD299779B29E8D500D5B8F84D6CA5D:\ +7D4A2EE3D0CAEBC205B91F090E6195C472AB3C8F56587625ABA45EC236B6:\ +2FB3005D96D02881922D3BB1364912CB:0D84764913CCA18AF14C2E4F0E64053E + +3EAE2A7691FF14A55BF3364AC597A121FDA3816505447F6E656E6F90DE370A\ +B2F5301C67E32A4791273DC653CB9062:\ +8B64BB53067C0A54A3CE6747467225AD9E3C853FEC39257D37A9DDADAB277C:\ +368B378A91B494E657624D9FA8BFC456:5E00DB9DEC14C2694C6C46F9176D764E + +EEE5FB0FD6F649C34C45F27D661EF1148620351502B170EC1B0C677569FD210F\ +59C137EA5A5C0A:642F4682F88B96C3CF59B2E6FCD637AE208CF5C909ED77:\ +1F9CEB36B1C443E828722EAA6ABA412E:899AE06F96B7A644D73239A03B27185A + +A75638B27A2F4FE3582D82415D92D25C0B1619CCF369A212\ +D3821CD8268A2861E684DBF033DEA847:\ +9B20A4045D8350AED236E92ACCFD43608017D7CE19ED43C8:\ +923874D1FCA7C997C86D9C25F1ECD3C3:22BCEDEEB9304E3A48250861124B2AA5 + +DBE84456BCB905B3637422CA28EC7A35AC31EEFA1BF37A7487\ +8755F2FE39C2D2B2DCDCB2F31450E800:\ +EE45AD121C59A97B8CEBCFFF2BDF5DE934F0380DABC2BC109C:\ +F65DAEF41041E256EEF472479EEDD489:BCD3B49B309DD021D6DDCC989ADC3490 + +690F6EE8335B14038CE0C4503C2BB83B7A0198BB4CBEC743D187\ +F18DFD6D02E879B2FE69CD0EADDDB3A2:\ +40765E67929DE7BA3ADCFAD278046E20484408B14FCBF9CEF874:\ +6D3FD9D7C1194E1F80E0BD679AF74494:C9BC9838DCE17CE592CBB08B99A80007 + +D9A4B214F4E32DFCE30964284BBDCCD6BE6EE0189982ED45BD6CD0\ +64A073D0E97D1B750008C05466EF09AA:\ +45FF5A1365893BBEE1B34E6A127E4A73F8AD5BF102B15B346F23BD:\ +9CC43DB3093D0D1CA2965760780AAFE2:1D2D2C9025D9EC16DC9D72100D95CDA9 + +1978FD1154D9855E614E6916EE875ED1C938F9CB92D57E582D74018C\ +EFCF84BA0767344E0F4AE7D283DB8D89:\ +B81D674F959354838BED29ABDC7E3F7D8481C96CE99D67E0E4DE000C:\ +EBC521A3E388F3781C47FBA734245210:A2918D26125692FBF3FADBD7D8DCE4C3 + +43BAF08789367FCE02931A495923920B1220B3D5C80FAE8AE5D971C7\ +C325A84838578241E52E76B684EDD3DE73:\ +69786524F6287A494B81812425603368DE8E50EB1E437EB6EB478B163F:\ +4D5CA9C6C1CDBCE9480534C98659EFE6:8C57C41BA7AF39EA2DEFD6757BECB4C8 + +47D494E426676CE2F7008D773DECA0F70690502D89853406C6D7D2CCBA89\ +6CC0E0AA8E3F23E7F7DE8470305BAACF:\ +15C0756699C707CE22491F8EE3798CEB43F07A9C654CC5B0F6B1533BD430:\ +47E9F0BC4F89835757A6A0773483F0C0:6E33B1E8D0163595C62B4719661B49AD + +8F3E66BC1A646352B7F4CFF7D001CD9B86BB808E3A87DEEDA3E8B68C7B8315\ +D03ABB22AB91A9168498263FBEA483A2:\ +EA377982769604FE3A32422CBAD2D886D39B523DB489319FAFF15937C21E13:\ +AC558C2ECB2332C95D640B8A1FDE62A5:B1FDF8EEB1811F513010AA67D2C87B7E + +40310341FF81EA8A88D7E4A56587AF7C::\ +59A8A96ED2E623F4E9D947CAC18DC990:79674D1D63FCA5D519FFDB6C296F7082 + +8062337F189B40867709312776BF2EAB16:E8:\ +15BF347878D67E708238EDA55C887885:203E5B72637E6FA8A1073FDF3B20C750 + +01EB7399A21FCDB387D25DF865AA6BC1C267:72A9:\ +B896C67E8B41B87260D02A552F6308EC:5246679BC7FBC5624A8DB7CDE1297699 + +5F88883DDBE73A2F42C189785ECEF40C2840C2:015060:\ +099DEB942571FF3B10A92A6E906FC2C1:C2CF13025EC6D16B82C6284DC779ADD0 + +71EFC1445B39BDA3653BC6782E63CCC3972BF760:D82B67F4:\ +29C312A40B053890C346F9D28115EF8B:1962F49E4AF7703CD8470CB07373A49C + +8D3954997ED9F3520F6ECD1C9BC47DBF1C6CC57D26:504F42CE2D:\ +2988D5019BD60E616400FAB5477952A0:5B4054DF62AF337A438CCB93CE99C0F7 + +24EC9189DDB36C88F3FB33DE3ABCE099E43AF40EB1D8:611330C7AEBE:\ +561DDE748B1FCAE57C3DEFCFDE0271A6:83737F42C2AA4BCF18ACE248749007CA + +2A9BA364F8E7F57EFAC8109B1E03227934B549A3A0078A:298A24AD7D6DBF:\ +7BD999B1F33A36193E4EE6F028299388:BB9687C2176C6A4595F56A4272D701ED + +F6B6A2F6E1510711ECFC957C93C68919A5A45EE3D0B2AFD6:75FD2D40877B8432:\ +6D74EA617E714D793C8DB9395A49C63E:F42A025EC9BF043EBC317E44AC02761A + +0341E6D787948E8BC9A17F8B9A59590964FE0AB06987334169:0FB90FB34C5B9BD476:\ +2FCA567702AF585D40A48AF2DB191901:94FBCA24E072339981E6E6DD82BA53B1 + +2456A0634E033EB2C782A76127638297E61DA31BDA1F54909D3B:B3990AA14BEDA81F703E:\ +4A15134D809FBBC80CF4B079EFC6D4E9:E27795C82349622DEAAD1A92CC8AD116 + +6ACDCF1AF0A6C75858C37CB6320AB22BE515CA582A1F72DFAC1097:39829DB0BA6AD872DCAE5F:\ +B8457C4211064A0C8B73983C6EDBAFE6:883F1918789BB528561F00C8FCAE27B4 + +A215B0BD9C58AB3331F78C0EB238167F27B1AFE1EA4BD87CACC5B300:\ +F6C41B2D43AAC7F4F0DB482C:\ +1827B62D763ACFA140874AB706C80FF7:7BFB0171BF1C9E02C666F7B7413FE359 + +C2AE1B5AF7059EA891A6D1D467AE9817290A893586356F79C7381BF177:\ +9E10318744C56A3008A5EC8515:\ +1649066C2B19B5E549F90C0E0C0BEC53:AF08F2BF3A7904FFE4340889208D9E36 + +4F26AC6346CB5D7A8F8AA5FE8A3F721ECC63A3DA914B1AD48B1B93D22635:\ +60F4F38483E7AD0025500B8B437C:\ +FFFA2092F276F4B3FB5961F4E8059C6A:91FC5F8480E26C2DE2917EEE1CC16A1C + +EE5529B4F23A6D8B6D4A6116F512D755E38F05295A21E9C6B5239558FE06BF:\ +1589266048285014F882E3BAD57831:\ +94A5B81B06729AED640D236929A28F13:B7183917606167755AEA5814BFD04554 + +F801A572F43609E21B1B2CFC480CC255B6B3927C2B14205DCBF0930E388EA229:\ +EB0E42B7343D3A6EBEDBA8A6A049CE77:\ +95B69A2A04B2F33C552E7960EA802CD6:8E6E8DC2ACC7316AA2D9104322DEBAB7 + +F880860816D3A071426469345BA44BB27D070DF896D9AA2581A1D89689B56B9668:\ +D8DCB87E15D3BEAA03F05B2C77AAF23535:\ +78D92F1F74591CF5628909EC20E2C4FD:9B43126E01BD71F1189E68C2909EF708 + +F25661B5CB948FD1B2CCA4A7B124DAE53BBBA8FEE464FF95109DF4D1E02E4604426F:\ +AFB23921379CCB087180CD8A614FB6FDB2B4:\ +B16386FE78B6316264C22DF9DDDCAB17:FDE3B3C8EB2448B8AEA90764A6B91858 + +A900370A2EC7AC2CEDCEAA2C255294C9CB46D6D97131D8E1505F7B1C4340F843BD1CD3:\ +71F1F9A2A4A33361417CB1A99ECCD83BEE148D:\ +77A9689AB5DDF5645E678C57D87D507A:21F3AD82342933DEC7FFB603EDCB9064 + +BD005D094AC438EDE11B7D98482155DC8E86C614CB13D2FA0CABF8D2631988444A3E5D97:\ +AA6AD3EB14DA4E60BA09A9638DCE91CC31A66830:\ +CBC59EFCEBEB74619CF0AD465B81326F:5B80D015897978164709E279AF4AA97B + +57FCB6852E72126F5DB7B311D1CFFD5D879EE6E2013A1FB568CE1FE61A82F712256CE617C6:\ +A5E672D7BFFCADF0F12C81B2D06DA016C252D54522:\ +FF38036E82ADCD2EDBBCD4C12EAB802A:58701C85F1CE555E6F6B21C14066E33F + +A11936A7930617BFD935B7B380E052AB245B5EBAF26C8E7E55F28B9B1FFEA3BBCD3224F037CD:\ +A80EC62DA758DC5378B0F4E98DD8321C1D7E59FE55F4:\ +CA603873A7C460A7C409B58A365CE212:B05AC2A4444F7C766B9AF4C49849B862 + +9DA94E8A4F0D70643357D8D8C9B31D85::\ +69A8B04FB205D3FFD56C34E2C76E0D35:11262418D091320D2C04C8D0E810F751 + +7AE167B307C2F4DF79F63CF916B9BF1A58:25:\ +A3E94A0B4499F368B968B7C6FCACC234:025F7513BEC5B9744723A9FD4B7522EE + +C02B328AC966D363578406EC6781732A0441:E954:\ +FA133478073A08E890B4E159B4920BBB:901D53BCFFF7DD75AC0F1E3559078953 + +250BCF631D446250F8837F8FA83A6BF5386C84:E2FB3E:\ +E4F79E765765409D324E1B1EA414D227:FBDA962D22F40DD772DD774DBF728CA3 + +203D92FC604EA0896CE956A5DAF9EFB62714D238:373F1A06:\ +50070DC0D5244E49CB9C66AC7057CED5:7ADC4F5C39F9A000EF14B52653CF2CA4 + +757293841970FADFE86782CA41EAD6CEAA2EC957C2:EC3B7CC743:\ +103B1080C15BE0AC6124A0264938A10C:882023A6D7A67CB1FE759D39F2647C02 + +59C5C5C3EAA2D728B32BCF1B49E4C18870AE4C2F7098:BF1B83377790:\ +CF665E60D491E84EE5874AB04FA9D38B:A8021B4DDF9C63E58A23000D5A779E29 + +93C5B53F5C534BC3ADEFB928D3470DCFC8852C5E24BEA6:70CE6AB07A9A8C:\ +BDA78F4BE0174F8A04C5DCF1865E307F:6020C7248A4FE110BFAF7A702915FCE6 + +61D5E9CCB1E8A2F1458ADD75AE1BEB7800D6A37244109E83:C5814686F6429BF5:\ +55A89D0EAE5316F685F890E297E62AA7:FD97541DD6D93C9B5B822151C4BC4619 + +C818A94252A8257FC51501B6A67D4D008ACCE6A3B09E1B84AE:3D8F73596B10934BD7:\ +C9F99830A1E6B5BA8D8A1A48E7C2060B:5A1811DA7C2C170B9F7177AF04C287CD + +D987E31D050BCCD469D18C44A28640371A867DF44373D517DBAE:B8AFCF7A49212AD45FCF:\ +40E64886878D1D3ADFEC046F61D3E81F:FEA453D7F80C87C786D0E9B1A44880E5 + +5F2827FEDF63228EA08BFCDEA50C9D5D904D71618E6DAA63EB9C22:A3CF005672C1F2E6E1983C:\ +1B3A82403AF3B423CD1FDCC2E6714A28:8670E19913B19969235A5C093BF44657 + +E032CBD49F0D644C67A352AB9FB1107242BE2579D1C7A45D08B44DA7095E577D\ +9A897967CD41602B8608C8670914C13A009EC1AB9857143FF6E6A0681D24A75A\ +C222FA89CA68E7994A969D5974B4755C66FA404362F336B3D4DA9AF4AFEBB077\ +F9907F9FD674B8F80470819A0C09993B768F9F5A22D8057C416712E22E9B31C8\ +62626881CD3229D5364A5C949985177F0D8A3D1583571931CF2DF2D20D893E61\ +119313BA902831:\ +7F4E62DFB140ED5C948D666A2919BDB42905A549A8B6B97259A273C9E974AA68\ +C30C48744C35D0E1C2364BEC5008A0790D45C3B6FC7C28551F9B1E0810C871D3\ +D5B94721EE1702B04D4D9C9D563C176382DA197E5641D375DDF17EEDBAEFC08F\ +A807B0961EB3466B00E309561F20BAA1FAD31F5015F2C6F2E444DF9E339F2DDB\ +A6DD71C490B72F919A38E7BA58A15B52757BA38A6D697C:\ +51AD5BEFE0FA1CBBA0FA2C648AE3931B:7ECC033824A49377190E1AA37C831FCD + +E5CC4E45013E62EE928B519F369BBC2C49FA0F4A7E99419E2D67721DE413710B\ +2BF0D011EC4483BFA796635544016321C284DCE6EABB25D0DC72B52DE5F6C48C\ +384F516F96A2EBFAC4FA005C8DA36DFAC06BDC133A3BBDB64C51C3904E8CB149\ +272AAD85852F60F3673C8B14C1EA06F8C45ECCF898531547A5B928F893874BB6\ +51599DF89B31B158DA2DF6FB811E059F15DD49569BF3CC8103322A21F089FB80\ +41B026695E09E872D82F1533E9FB88B6C6E8A237C7294F6F72751F06CE9FFE85\ +74856C7006F9592FAA80332E74F7AAB78F:\ +D4B2954F1C16268C7C64BCC8066668635AD9CECE9E811018F948DF1560D6D734\ +886C83A582AA31FF0EEDC714532F78AD08467BA7C88BBFC1D39ED73375AE67FD\ +1AEBA29D95D39CA3C163B714932FC29B763D423EC902FF9CA0D6D0158437139F\ +22B53CB789D85A4A3B125ECE41206AB75EACF527AEF5C34FCB936450CB77EFED\ +2D2BA5B603FF003E115E0D537F770ADD230004D2F5C721C05B851026FDFF132A\ +2AB8E02DB8E06CC93E791CBDF0279A13279EE51C6606DCC18CEDE789ECFAB317\ +B3:\ +93446B73B034B129516F1978092D9FA8:12BB0E1997CFA584B62E71B0E1886374 + +17355698DF0456602166D82D5399F159D9BD771D3D23EDCD6364A855067E2CE4\ +AAC59A671D0C223B9D144B67DEFBCBB2025580F83EB5BF4C0AEC626C7297001C\ +A1A9A0EB46505265C591B1514F75B17EADC5667E991D3871F6EA8BCC1183601D\ +8D80E24CB6A2C22E27AD9A22F5B745033DF0960722D1176E9A162DFF184D8011\ +7DFCE09B8F97ADD449C3ADE8F7F0B45C2AAF447536EBCBC610BA543C3D3D91E7\ +37558D54C9F724B3501A5AA24B2DCBBA9CF2FC17D8700B356F5733A64535ACF9\ +325B48F40E28BF57649B73C63461B4EC9D7163:\ +407B43EE14D1B3CFD48F4FD112CD92E4DF5BC3A9AD29C4A5DB5A0C4E6151E4A2\ +CC2890E1F943B0CDD3FF9FE5CC31CAAC8C8D5539B61ADE9274EBE0D53CC57709\ +ED08EAE64B9AB31E9952046683CE120F5B6749128127A4F51284CB4F49425836\ +4A421C96DCD0B47522B8DBA686EDB5E255FEF4D62698CC381C978766D9DF9C24\ +21B9BAFD896E73AB274E51AD3C078F910583672B1B336438CAEB9EA4CB3AC8EC\ +F382EA7CF05D2817AB79C5E780547886D8E0B1F313152BDE01C982CC044AB8F7\ +CCA274:\ +BCFF9CD4AB15999296ED0B1CC5EBCDB9:FEE3E4DCE4AE5EB0B2A868A9740B1D31 + +8571D4B7665B32DF2A17849408AEBC9FFFE73BB7AD18FF8BB037227C54583C5D\ +B7A28B87193F94DA28F45C8D2EEFE4F765B3C0EFB5A3C09DEB3EEEABC7C78CBB\ +120C68C13129E4609B05CE484F5DA5BF07C3ADD4996DD14CD7F2D34420CF9E96\ +B529B573A8376317CA02B47A55156AB51FE0C713831C3FFB5E0ED8575FB3FC69\ +24996E6FC9BF0E20F5E58A137347A7532C75F2ED45C33061D0D3455A473FCFF3\ +41C0DBB260E583D4F499ACBE4DA22A19CE8D2BE53541BEEFCDFEB028793A60F7\ +156ACD1ABE5EC842B3B1F8B8A6A8DC028A5B15EF:\ +4DC29DC34D600238E38882EF62C982CDC34DED3A7EEBC36D99E11FDD3D523A8A\ +14D74D61374F991AD71B0939E48C06A8D9F4E257DFA5C47887E355C435904E49\ +679BAB9FEA44B9C160C3FA444F00EC28F4CE80D374444CFB28A1BF5D310DA799\ +A852389296F153F6B44D3B034D272C42F6AC156AF061651803247634311DCDD9\ +6F056B05F7BEFCAB0B37AF585EDB9A5487B0BE77112390144706497823165192\ +1CBC97137A93BE85CA6DDE2948787DCF283C473A5FD74EA7DD971F00AE7192CA\ +2D29DDA8:\ +BD9B2D87090BB051842E21AC6A68E6C9:3F35701CCC901C7A01AE442ED721D694 + +CDCC757B0721890851AF53EAB7DE0BC2C0BABDFCCAE5ED76E01B1351E7DC7C4D\ +882AC19EDC147C7B04B6203B1F4AE98251E13D7336B80B35BD42D5549951E2F9\ +F0CB913E3999527888D6B40737AE5EB9AB41B0051612D08F956B157D409EED5E\ +BB62BECD72B92A553DFA52B185357BB96F74E04D63EFB0AA7B239154698D4241\ +DE34ADC79D944FD8B0C0DB24826C57CBB4847CEFAE328418925FF3D6FC6EF3E0\ +2CC580A2D18DA0F6FA0E3E5BB44A7B7D058DF60024BA4F9866E804E05DA6FA77\ +453DCD3008430F314BF10E70FAB7BBEBC69B07CB60634F3D251FCE93AAE69702\ +010E5384D395CB82967BD606F9E686D3832C39497F1A9DF2DE621C2F92C785C7\ +CB0BDEBEBA5C4F1C7436B0FD931C9B245B8D0991215DD63F32CA48345EC64A89\ +68927310CCAB1E4B48813342EF6C24F92595763D2E5969F960C23D682A38AA4E\ +BA7C5E730FF289A58DC28762D79C15B249A0D31C7F6A7B07A41FB78A418429F8\ +5F58314D5D65F58C7C21B5657807FD8907CE47B5324C94D391676E86BAC4B9F6\ +CF870B2E1F7703BE8FCDF4E82C848712315C8C61BA10752AC59F90665C7C4830\ +CBA53E602292634422CBCA81D3C7CACA33F00FBF136358A921A0A7267D683A7D\ +2CFF3F35553CBE486BD7A4423E6F167D998930246EFF28CB33B042FC8AC78BAE\ +D594B5487D4FA8BC2F32712FEFDAA5B4A91085A5C75B43AAE3F5E753F0CDC68C\ +113C94C2030BA2C7E1C9C580592C8D4A08D0C46A0A45FE486369D72AC0AFFF21\ +5AA6CEECD32A781BC52566FFB25BE7975D724A825D2A74113A0840A00CEFA835\ +04C8DE918967EE89DCA99BDFEFF8C359FEC0023104BEBD00398E6EC01D38975F\ +4AB4027025ADE93B0BB7EF3FD24A9400DC304068221323CC87DF4A6AB69160F4\ +F683C6005BD32998B323750A58FC532C437BC40F0D453118D813178F332AD789\ +C2875EB6C3249C93EBD2CAAE6733093678F5A975A00D29D5931A1CA8FC07918C\ +5F232359F044558ABCC36520E75668886E9A8D33D088AB6F2B15FD571B220B71\ +4AA8D9B9014EE6EEAA0BC6F36EEB508B5914C1C13FAA9351C616221A7A880271\ +F84CE54FA9F377DAEFB738636C6D8C563F6D14362306D89F8EE8C9C3A13E04D0\ +01156654A41FF5405A6F8BDAC1FEA59EA0B6206E3E9364244E9C9DBB00836993\ +F7E19605E3D09B2918744DA5BDA9F396FA8D008A27DFCF63ACF7AAB37593BF3D\ +183146A59EA92D:\ +FCA1346D6430C5A6DF980E7E456D9296BEAA203C3A63704FADD47299AAC26FA6\ +63A313C7D4D86DB3717B31B6E9C44CA76E6DE3A8D053F77D276917D12B86778F\ +2A8A56FE63C4B1D43FE38A28A7D6CF1543B2BD1406B4912D1DA8FF492F76D859\ +012E5764F2083832EBC25A92982AA7DCDC64F0E2188110362A0F7F598557B286\ +8509EA781122AAFDE4048F7D2E37590B9B49EDB4CAFDEAF40C694D92C0FF1845\ +0803BD1A2567170A6CA6879ADDE0A57929932DF39017E89D80352F403547853D\ +4A435770AA6E7A161501B1F2E1566B0AE998FD7AAFE5172F1B466F508DF58DD8\ +38E548E253C2F968C3AA5BA400C6AEEA5FAB640E917B3EACC1ADFC4EA28926DA\ +6E6EBDC230B62AF3608597604C454AABF1AEB98229F72EEAA52A3947B35F2222\ +CEDFE4FE950EF2F5948955E0CFA08BC04E4442783C7062E19A9B284DFB4A6FC9\ +2953C7BE62B9B3F64309D612A961D2F7A5146FE184D2C21E6DEB6B6835DB315F\ +2EF91D90B2D186F5DA5C0783BDD97A63EDEA4471BC078F29F2FB9227D6C38604\ +BCA4956F751B644F786CD235454C983336DDA4F2E4341CD62FAEFD057184092E\ +289E9D9DBA01EC326DBE67B30A00E641DD8A33C1BE4F97EDFD94F26F18FC9D40\ +9A3ADD543BC986A987EE5C92EE42D3CBCC068C8B56237853B76BC2D0675F1001\ +99EE56D5B7DC7E3FCADAD1B81CA483E8AA0F730032EC54EA5716BABE76CABF0F\ +B815E470F262AFBC3C80755824F841CE08B4CF3AA02324F739DEB5AFA975BF61\ +8AA3D17C0680394200AE9B24A6DCF3AE90C2E931E50D281EECDECE95538DF6DD\ +30C85A364893794941146DE7F0609680227FB1078CDA2678B8F40D0B8104E8B1\ +CC42E814D5615D1675CBFE652B94E54E1397559F717B18296F2534F0291CA2F5\ +5F8A0A34EB674B603249C55EDDAAACF041018FB27DA7DBECCD0FDDF62C7FEC8B\ +09F6BFF45D0A54905319EE30C39A20059BB0B71857930524A2E21BCE6107596A\ +FD195E5A23B2EA77CBD8A78E72C8930E784B26CFDE2BF4800D0F4F6E16A8D813\ +C1366DE5E8585CB3300342A3CBD5B14320D713FE03077F1016CE7F2C76573F38\ +8EAC1D7604792A357C6CD84841898B62609E6063A5DF74BBADF3E7244A265CD8\ +D3794FD7F2790C6EE5E4B6266D4288CEE0E93186C8A5417698299AE34FF6BB22\ +6F0AFA618306CF68EB868F58C81726A800582EC9FD703F:\ +9699D979E8CF340B3E3F059FC20B6E2B:F6F4BA4FBCD17565D2CD939BCB03DA61 + +[AES/EAX(64)] +32E55CE0C3FAEA48::\ +C61A0851AB4E515D11525B92E2B9D850:C825FC7C4D539DC74887CECC70884F37 + +710DABD24D400F3B6B:60:\ +F956B879EC7F807F1FCB482B53623671:E64F90B4619D93137E6237929EABF297 + +[AES/XTS] +917CF69EBD68B2EC9B9FE9A3EADDA692CD43D2F59598ED858C02C2652FBF922E:\ +0000000000000000000000000000000000000000000000000000000000000000:\ +0000000000000000000000000000000000000000000000000000000000000000:\ +00000000000000000000000000000000 + +C454185E6A16936E39334038ACEF838BFB186FFF7480ADC4289382ECD6D394F0:\ +4444444444444444444444444444444444444444444444444444444444444444:\ +1111111111111111111111111111111122222222222222222222222222222222:\ +33333333330000000000000000000000 + +B01F86F8EDC1863706FA8A4253E34F28AF319DE38334870F4DD1F94CBE9832F1:\ +4444444444444444444444444444444444444444444444444444444444444444:\ +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ +9A785634120000000000000000000000 + +6C1625DB4671522D3D7599601DE7CA09ED:\ +000102030405060708090A0B0C0D0E0F10:\ +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ +9A785634120000000000000000000000 + +D069444B7A7E0CAB09E24447D24DEB1FEDBF:\ +000102030405060708090A0B0C0D0E0F1011:\ +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ +9A785634120000000000000000000000 + +E5DF1351C0544BA1350B3363CD8EF4BEEDBF9D:\ +000102030405060708090A0B0C0D0E0F101112:\ +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ +9A785634120000000000000000000000 + +9D84C813F719AA2C7BE3F66171C7C5C2EDBF9DAC:\ +000102030405060708090A0B0C0D0E0F10111213:\ +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ +9A785634120000000000000000000000 + +D05BC090A8E04F1B3D3ECDD5BAEC0FD4EDBF9DACE45D6F6A7306E64BE5DD82:\ +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E:\ +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ +9A785634120000000000000000000000 + +# MARKER: Stream Ciphers + +# Stream cipher format is plaintext:ciphertext:key + +# A few tests from somewhere (maybe the original reverse engineered code, or +# the BSAFE vectors that were published soon after? I don't have those posts +# anymore...), followed by a load of randomly generated vectors by OpenSSL. +[ARC4] +0000000000000000:7494C2E7104B0879:0123456789ABCDEF +0000000000000000:DE188941A3375D3A:0000000000000000 +00000000000000000000:D6A141A7EC3C38DFBD61:EF012345 +0123456789ABCDEF:75B7878099E0C596:0123456789ABCDEF + +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +010101010101010101010101010101010101010101010101010101010101010101010101010101\ +0101010101:\ +7595C3E6114A09780C4AD452338E1FFD9A1BE9498F813D76533449B6778DCAD8C78A8D2BA9AC66\ +085D0E53D59C26C2D1C490C1EBBE0CE66D1B6B1B13B6B919B847C25A91447A95E75E4EF16779CD\ +E8BF0A95850E32AF9689444FD377108F98FDCBD4E726567500990BCC7E0CA3C4AAA304A387D20F\ +3B8FBBCD42A1BD311D7A4303DDA5AB078896AE80C18B0AF66DFF319616EB784E495AD2CE90D7F7\ +72A81747B65F62093B1E0DB9E5BA532FAFEC47508323E671327DF9444432CB7367CEC82F5D44C0\ +D00B67D650A075CD4B70DEDD77EB9B10231B6B5B741347396D62897421D43DF9B42E446E358E9C\ +11A9B2184ECBEF0CD8E7A877EF968F1390EC9B3D35A5585CB009290E2FCDE7B5EC66D9084BE440\ +55A619D9DD7FC3166F9487F7CB272912426445998514C15D53A18C864CE3A2B755579398812652\ +0EACF2E3066E230C91BEE4DD5304F5FD0405B35BD99C73135D3D9BC335EE049EF69B3867BF2D7B\ +D1EAA595D8BFC0066FF8D31509EB0C6CAA006C807A623EF84C3D33C195D23EE320C40DE0558157\ +C822D4B8C569D849AED59D4E0FD7F379586B4B7FF684ED6A189F7486D49B9C4BAD9BA24B96ABF9\ +24372C8A8FFFB10D55354900A77A3DB5F205E1B99FCD8660863A159AD4ABE40FA48934163DDDE5\ +42A6585540FD683CBFD8C00F12129A284DEACC4CDEFE58BE7137541C047126C8D49E2755AB181A\ +B7E940B0C0:0123456789ABCDEF + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +7D0EBD8586251EBA5612E7F0AE1461B85E7D6D01870ED72CAE875737359780097099D507F3F9:\ +2E +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +9E10A6E1E7C66081EE6B06A86F27B31528029DB35C156E571A7A39E09CD7FDF706DE80056CFE:\ +395C +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +193FBAE8145757A70ABF7E4B5DA4BAD3C8208916085ED2462C901EF01FE42818B027A6E0EB2B:\ +FEF6A9 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +EB75D7A79E5F7C25156A5A63FECD9A6A67F48B97448EE49C3E3311C940ECE6D317F7CADDAEB6:\ +547BD96F +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +39979C6BC7B8DC7243AD1148C1AC76899922F9759DF1988CE2FEFE0FF91CF7E908F30777BBC6:\ +284CD53FE9 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +309D05E88D1A980CDBB341930F0086CB0672C85F37BDFC2CDC36D80044AF6B02E3475E3D2712:\ +DE8C6ABE0052 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +F409D463A1293AD11F4021982B7397D554F504E80C3AC0A6DC5C54CDDD090309BE00F9213E5E:\ +B4D915156C6488 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +F76241985FDD3668E0860D9396012F61F338EC7E41CC23BFD0B62869119560DC2A0604CB3C6A:\ +68B5FEF1FBC10AB4 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +61FDF65602F7A63ADF57B05792F6C3642241EF46B97CD86171AED28D26D67BFD6E1E66C7ECF8:\ +EC498E2BCA7AC2BB9D +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +75258D597494A88866F4FE45B09ED2BE41D49B7D653539508B4BA1A3B6F9A08C3C103267D820:\ +169D98FB855CDD15E205 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +9FD90A643014F30D5D2BDCCBC37212904F0AD69FB23637B0FBCFA2B6E61A2A7B8DD9B6B3A344:\ +0C5710A5843C9AA2C675BB +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +3E04F9E7804F3F8267B2F5EABF4722183BCB17266F81EBE3A3EE8B00D5C9A727105F43131667:\ +837C0042EEA1A15CA24AD014 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +FA9B2426AF83EC289356B58006370907DD5D8A7C1BA887F188B7F695DEB96F3DE94E5AF4DEA0:\ +4B5509356362D35FA63C5B8C44 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +80ABD7170971295FA8D525B1EBB8CE95829CBC9C81AAD2472DEBED0F087558433B84E11CE574:\ +3F6CEBC8C94447FAAF9CEC4E778A +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +0C3E9A53C6862E2121F3D089737FF54F96916E469BDE5A645FA134ED4DDF76AB41B569649A98:\ +E0A97B4D129FB0BFDCAB24076DD5C2 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +A68686B04D686AA107BD8D4CAB191A3EEC0A6294BC78B60F65C25CB47BD7BB3A48EFC4D26BE4:\ +97CD440324DA5FD1F7955C1C13B6B466 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +07001BC046443693F173F723638A685CEB7DF1CD61D4E93A52E44B914063903A578138EA0FD8:\ +31DE7ED3BEB6EAF9131922D06201A19366 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +8C68C80B6A01A6571642966D601BABA39B1644177C7C3B35A9D91669F7AE8D22A57308D05F1A:\ +368C7A9662385B308F696A0C58E5E57E768E +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +2A0BDB20E12B4BAA2E8C3D40B333B55ABBD0A156826BFBFDDE066F9D73398841E4A38CB78B5D:\ +F745ADBD90EF249FFC14183A9E20F69BC68214 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +64ED1979AA8B458EE96EEC995E4EF2894DE0D029B1C0DA497A9BD7A81ECE4A408C253E9DA074:\ +872DE53D5116911D916A947041D22A0D50B7A5C1 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +DE31449883D5E651E6F889E2F18C453F06276D13999607FADC393A2619DAF7E2182C214872C5:\ +27FBBBE2EEC453C3D5970A6BAF03FFE299EED3FEFF +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +81570047B8BB9E5968B15F9C286F3F2B6264F8BCEE5C64A698BB2F35B697E32FAE6372BD07A7:\ +1BCEBC37EF602F758CDFBFA1F1BCA61AEBEFDD79B179 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +0D8BBBA8FEE3CCEE8CBB3548F52AA85D9FFA58E50655E19FFA31DFCC97F65116DA34BA775559:\ +6FBC9F1E72F7E6EE8D233C4B27EFB98351B5FEAE803732 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +FA087B45D61566E102A2B099CCA04A499191C54BE21C67C17D40A2EE81B0AE1F525AD7E61BEE:\ +852F2F3CA64B0C256B080A577E135A54B01D9079A8785EF6 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +0E79E4BD49A8CFC6BD1031FDB6DF4BBCDB96D64967AD1710C3BD96A8287064B211A984C82C4D:\ +8EB43FD27CF769A39BBF2FE02B9E4C6ABEE996DE591E5FC521 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +B420CB807A85D5EF897AE3EC7C7CA53EB2580F11B9C815DC6870FD3D0DAEB8EFE5AA28DF2E9C:\ +C3CB4048B42619DBB1A16373749B8264960CF7CBB1EB6D3565BD +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +92762FCEB9FC304D2FF7994AA435E4774FFC1D97C9CB36F89722AED507310EBF028EDB0F6323:\ +A7F0BD928BBA925A49B117ACDAA68702B4D4342F8FD62503319BF8 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +978D46FC073896B8875C7D4EB2F7EA35F58877550071F056584DC59E722E850E4E0DE75ECFF9:\ +3BC2C34F2653E210A1E15282FFA01149DF53AA6BFAF5FE04523DB614 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +AE6AFEAF83A30B85D865FDC86362F95642E7A9CD157DA2F12ACFE9A718F3FB996C1C222B2432:\ +6538CBE80D306CD6AB1F027E4EFCAB804D407B00B281240B33A8C7F40D +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +D4192C0818E7E4CA10AD05FBB3181C41C4D0BEA1805A883708FDE321B70D6C7D8B5601079D7C:\ +B7793A33C33FE1C3EE024A7EE40BBD13ACEB02049159717F35279D67F730 +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +65029B1DD806694E4AEF4B63016D0685A8EEB682E86353C049378EC540BC0F4BB682740E3534:\ +0C9856E6B845A33EECC0F30BF1974DB4DB088BF02314EE48FC369B6515994F +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +F33562228D9339F23EFE694E45A6A5B4457F2865061384B064DD45321D399FD1DB1C3CCBE64B:\ +CC26F0F11FF7759081CC87B0296E46E1A29611FA042C0F09033F12FD06468624 + +5EF2DE98C92BAE4C15CC2194D37ED3558A44B6FBC7EEF695E85E33DCE1C2CB8CE0779A73D6DC\ +CD1B906CE940A4FD19C4436A7832D4BDF5EC87AC472BB281DE038D3A20DDB8791B2E12EE0B2B\ +3D273F14D90EDF7F07D32E03D74B261F5E501C0D6DAAAEA6E2474379AA983A54BBCFBCE08E6F\ +E0E48959F7DEEFC0CF9FF10FB67DEB51F78248D650D2432BB1FECBAC3347C541BAFFDF0E7072\ +89EB0CDD8C5FE960C5C8206D3DA9D4A2B43A9A3D2F449A7C2834C152E1A07DABF6BBD7BCF931\ +E238BB759D4005E540612A8F7921D368B906586A06AE9ED078C509E4AE7678F01F8ACB681AAB\ +ACD3D644D9579AE28937405F59161E45123CC61385B1BFC75B738D21CDF690B5D041AE425D1E\ +D7C9CA20583B79AC7BD28135CE4B9C1012A8FB7A7791F3B016AE27872CFA7F7BA29D5E1C267C\ +B30E2E7238CDA5FD6BCC1C904AF236EF9E7A88EC71DB8700A7FF0BDF09FB24110B121DB825FA\ +F79FC7587F0D8853AE90CAA6F479F5D3E221E4C832E27B6DE7340850F2231AE13AFC8E9C94E7\ +3BE0F631EE0549622A3BCB2C79C7D6440F694C77DD66E9F98A5CF1ECC80EC3F7D0D0A14B6D4B\ +FC1BFA5DEC3743743F7893E94AE563217546653E2F75271B1CE5B3DFDC01B0A3A5AE6E4796B2\ +6F8059B1B35BBD760A08B48BC60323BA42C8224E7EBEF5C3364544AB3D4C8D93A7805429F787\ +EE5B57D85A570F05268B8FCADB24F16FD4BB95BEFDEAC40C50C55EE32988E7B15334449F78EC\ +A703A61260FAAE9F695715637732837FA0559B6B6BB602D55915B7E401E2B53151D3633A933B\ +786210794111073B3238D16CA7B14D0993CEB7F04A7EC1515B1E79F4BF518B2195A29A5F59F7\ +595CCBB04314535BA452351D23811E01CED3E086F2A6132294541DFBBB6352D0D58AC70AFE2C\ +187842CC606C59527F3EEF330FE4923DA3D0CB838C7DBEEA26EAFC032F3C15C80FFA09C9342A\ +8910A968412DC31247831F1C2CE9B5ECF365A84880DABEB08213F6EBEF78D42899DF0A21349B\ +B01ADEB9AB51B1C312EF0F5E80E03BDC84CA28AA4F662F7FEF874F8572956F44F49477092F45\ +E0254CD941B70964706677C50E9D0B98A6CF838FF4FF81E60E0CC4706F0701AD520DA6D6123B\ +F6983EFCA5F081AE9E548464BC049BB66C28551D79F8FF465E406A12E5605FD236C57BB7000B\ +DBCB52429F2C2CA5B257BF065CABD0B19D4F1AFB91985FA20248BEAB707527B40ED4B79CFA28\ +329B4A2A83018DD00665EBA2E4F7304D665BBF4E05A179A0C0D78449A4A72493390B7DA66F2A\ +0206B8655714BCFF0E5804CE02EF3B718A14F7A1882EB763701CD6064409B545303F54736599\ +59F9219D5AE51E978525D1D564DDD6A4408D3E47AADF8870DF2B1AE657B1C077BCC231F70422\ +FE0BA5E86A7C82AE64A6D8739A57EF629C7D4BE277E6F5BE859F17AC4D960CBD09B13856:\ +FCDD62469810ECE85ADBE33A4D967BAE4FF6B63C6F0D7CD6116228D7DEFF2F741D7FDE4DFEFE\ +48DC89046222B23EA184B1E15BB70C2293CD25AC3C047BD0B53A246A78DCA3482E752FBDECC1\ +6104C9067ACDFE811D3537AA7AA750C10050A6746DE68F6B543BAC92C42E5F8A946A2CC843D6\ +79508A8FEB5D1904C5E61C151E5899849C3FE54700BCBBD009E10824953C41D367470690959E\ +951AD644D05999FC8ACC64A61F2889794235403EFE4B55AECF2DCE5EC6ACE52AB1ECD8B8E931\ +DD8F05E783CE446DFD41D7B4456CFED0E54838E38F4CADF51E33DED230D42300192F8E1B6D8C\ +7E78E5C94AD4C0227EB8AAC759CE436DBD22025D0B1D014898AD77902BC77DF45F137F51277A\ +C6AA476AAB193EFDFE0ADC781DE75050409A94B9B41C6EBC99CA065D99C5E6DDE5EFA43BF3F7\ +A011DB66713D44DBE5C818C29B89B37F2A17108D53DE0CE4D9FE3BF7480BB65E18B5531A410C\ +5060B0F16715D499C2FCB6B6C3506F1E6193B629572843888C18D796DD5D5F7C4A62C658869B\ +00EF502C620E110E5D9E2DB8729E4CE731925FE2F41D16A3B5A9B7B9A2062E96AC93A0F4A3C1\ +7988E46002EC10556DD0936444BFD2ED9C1F7D64FACB3439842763EA0D6554ECAE5515ACE038\ +7B1A96999D218C8F97151B0C9CEAC62AF1D05E7553909D789F9C6FBF0C8CB0921168675DF8A2\ +8A7A4A6125324BA9B5C5BACE51DBA568C25D77947D8781538A9BC667129C25DA915C70F2E0BE\ +E3823986BE2C3B0D84667BD0DE153EACF7A34AF495AF62452A2C3999886AA2F032C212DB60E6\ +E85A9ECEF1FC7EAC3AF28E4F56B0A432AE32A2F239EDD233375CE3C62F77D976FF44B4132779\ +189C0B2AB6316E057353ECE809188EFD7BFE1D1F845789386A860705BA66A9AFF09D1F05A542\ +C86C96083D1317C9053467621F6CC34469A0F61220E5CCD460F9144710571D5D920D70CE7687\ +CA0CC3838C1B7A27D915BFB071036962F7D3672D2FBD13E360980CB484CF9155ED528489A684\ +E4C69262021C9E77F094D1449E8D8F9D358B4DD8B4F7E4148AED8FC6265C1975675C67E5674E\ +4976A64BE3231191EBA7D379451176A02052D0A7AF4676B044414C0ECC075E9D67B117E225D0\ +669F5676ECCF3F2E3EE1A30AB100FF777CE9C51C78396051BD4D747B7B167D8D897FFA0DE5F3\ +1862FA55741CFA45E1C8AD935EDC6F734989CA9072F1F6148D133C09E6EB797A723DF2B45DB4\ +475AA127273A3977C1913860BACD285741E261750B2B7921DF53AE1F51538C328F94A3FB04C7\ +EAE66E1AAEFF01C02CF4EB6EAAA0D5EF2784414D2E3FDC6285B9F4713ED629F100AFBAAEFF74\ +E9F9C35ADE18142C4DDDBEC330AF3FCB6F3E77F05F2D773B6BA545DBD4BD13AC2E1D2B300BA4\ +C1614E779E761A9765D5C6F15EBB6A769290B3ACC8074761189F3DA0F3A4A804C2C3472E:\ +51 + +4F3657558B507F48C7E1C7D78C396B6ECCCD236154C94EC67D72A17E02AD38EB5719E50B558E\ +5AAA4A6364670A195AD3B932B1994BAA9ED914E11B939D92EC42DD4EA4F4D117FB286C3434EE\ +551884EA3CB4E6C83320AFD10A4BEED39E96E5D04257934E33E13296A18674393A3A5F23B6AB\ +EE2044322ABA0A4211F604B698FAB9296D86D2FFB41AA0AF73BE170193B486A37797819E2180\ +3851947EB4EED45AA56F0E9B1189A72DFA2690355220C122FF3AAA584849C65090DAD778E387\ +6D0E7461A459BC80CB334B3D9DF4984ADA808137DFD32BCDFFB7C59D7F15F239367B0C883994\ +FA4EBCBE89FE18BFBDAB6924F03FFE95C621C71D956809734B33398460DB4ADCDC0598BDCFFA\ +0311B4E35E570F89FEF167861CD57BB1A48764AE557CA475DA66021BF503E5EF5EB6F40260EF\ +2B8018916314459DDC1FAE820C492545F20F9A5F284A465DC1675150E7707F38C690E8FF0501\ +68EE5EEACD67DD48174A80144A057F5EBBB0B3A1D65D61AEF93532CC008DA66196D5B1200FCE\ +D7ACD48F2E9535A3F08D6CCB2F6E20983676244BF3F0C97CF22E496C99A9DCB8C76140C7924B\ +54F95A859C088CCAA8B3B925AFF6393BDAA9333346D1F3D18E6525C5C5584C6BA634AC465854\ +3CEE45121B5663FD99C106AB4479D844442C6577A28CA84C8D41AC3D05210E3994A793E238EF\ +A2797474D770CA030B092E835524B843970FBBA98B01C5FD64844EC271C2924B20AE17EF7EBB\ +472418FB9D31E6F7F065B40950536B697DD773F2C0C1E0FECCDEEF17AFCEFB8297219BB25887\ +0D32AABC8A91E4710B37723228113D5C9504005014D0358B133217CDCDEB164E02F57F30F7F6\ +316B5BD82255D7EADF98E27007E834E98A4AAE8EA0B42AA51B316C4D5201EB3F2CDC70A35D71\ +9A99DDBF0F4078598E1B5233387E20384932E4A59D9FAE8D3A4AF93D25BD5C18199353FBB488\ +D9996D44F0889C572DD74AC545BE159862352D3948EDF79085D812FA9CB1CB2A42A1AAC3E9D4\ +90DE90BABAB42B66C13618C18BB6606DB69FF9A737129F70C27828E95A8450ABF1F18B5C271C\ +0A48A63490BA622976FB7EA3BEF37A4AE7C6350E39A1ADAE2018F6003A7C5CFEBC7E0D934D01\ +9FC9E1F1187CAE86FD50CF003F08EB7F139078EDAD295FA175FF3F6E79FC015B37000DEA64AE\ +D28598FA4DE06EB62163B18FEC329C702F9EDB7561645143ED8027BD7863396F4164C632827E\ +90724298A24DEE1450A11F737C7B7DE56666DFDDADE45345961FE7DD9F95DCC7A5DBA76309F6\ +594E169B8706C21B19AFA85E312BA656078E7C072C125B3233C66A130249BEA9B8C33D501ADE\ +4F1A03747B1BA0C7BA9240C9D2DCD339158C52CB46238D09DCDB6B9090B797ACAACDA233AC4F\ +D5C796AA722F352BF3766C673060DBC7901EA9827FA7ACDB32C64E7D58966306E8959A27:\ +FD33B57D9ABE946FD81156CF3F6475849F742B7FFA9250B1E1A4546416A479A20C959E45E7D6\ +23279E762C85986D22B42F6E64C0F118994A540304E94FAE195691F858F77C2B12772B888D23\ +80344DB66003BAD5D0E305396255004C468A7290852B02C6E4A920C7EFB3B448E6334191A8A1\ +CF19BC3A70851FFF422C45B133555BA01BBE9D06D685665FC58A7CBCA76EF2B22C14504A5AC9\ +DD8BE5B4DC317B1E70E65194C04DB27600929221DE48D4B90F1A28F05B801580DC23BB79CA62\ +AE7B2FD9CE99D195A05776A7C779AF8ACFFA9B78F3C09B0036A875F7C837776EDC0DB1997C98\ +B8905896BE04A6FD1B408DC26926513D91A5E32BDD1E51D9E99284A2F32959E3282D4B8858EA\ +237DF3B4AA3A493D196734DC11362B67CF20276C48BB1CAA07CEB2FA37927773A0EE3F8C18D7\ +760907A1677A3C75B6FB07E98809C56E9D7AB64997CF6F54B292E56759E54A33132BFAFA5FFA\ +7183638A66D436E70616CC4A5724103A7FD3D5B61924A6B6DEFBE6200124EBEC929F61FCFF58\ +2766C2B5F78AB953835BC1FF7DA76701A0933A91DF9F2ED680E60EF410C96DD9C7E72C773DA3\ +CC610F80E9134A8075375B921A03FFA555C3C26A027543DC6DA55ED6F6FB6DB10B34075E4057\ +F74C01A97B9BC5A5B05B83A112FAAB2B975D3062A63534E38C9969E5374698BB585B0C470FA1\ +F74561C1CDF939C7E77CEC8A49F5667B08A6DE363D36B93FD2F719DDC27112DDF10DBA73CFB8\ +86834510E833A45C8835EBC19904D911FCFB10112D0E6E4F636DF88D9FE028E79F5A0818CA52\ +0AB3E9D4E049BF574B8B2F1C196E8A69137B497E11F3EFEFB750315254FB218411F5A7604FB6\ +BE3F2FC63F1ED170A1C53AF8273CAC3780C23974C98BAC1902754A672ACD09FDFBA2DD1B72B3\ +01A80B7F1EF004A08DA13AFF02F4AA8DF711480925C322D43EC25242D0FDD4420E200DF964F6\ +CCB4CE2FA5CD9071E2DA17B6A06492D99AB4E24810BF4132C1B73AE746D3864AF44D88B08AC3\ +CAE02E1DC44BA8AF450537B7C2642B7BD4731E14D3927729A65411851B76823324457A3A16DD\ +EC2D3B304E5F8CF9823E5A062439B5953F6ED9A7EF0FAF93F629FED8E71D024521C6AA922B03\ +C4267B964C65E83D9C2CF16067ED6EEAE9EFD3A3843085597A683CD80E91858DCF5C04AF5E1A\ +D937C4B4DB4EF30B495E873D0A92636AC2EF4F6A1F9A26A99620E6803C1BA230C50D339039D4\ +DF0E3C718AF32F24D80EFB446C160F8F5D3030172F924B8CC3996D454BDA5E958498823D86AE\ +9E55292D33E6E7ECC0CBEA239ABD10334AB9A3FB1763AE997F5F4764637C7D6137531E4D8EAD\ +4D05C39D825CFC3FB16FA17A760C9BEB4516563AD0C40AC607FB616E9845DF833B989207579F\ +5A32A29FB54E6D5D7FFB90FBEF64128957BEDEBE936293268BCE7FE0E8C455218B1DB7EF:\ +257F + +8554C25CEA8F0E19357FABADD66C519E97622F36CBE09828CB271DA5EE14DD3451CC8FD25421\ +45EAF13D7AD49A42B7092ABABF1C8796CE4B3C4A16BDA80FEC5F69049F2B94550283E5626B04\ +43F32FEDAA5C5BED3AD64E8D6C1DCD3C7C2C5CD3B38907653CED0D7E6BBB25686654DC0167C0\ +B0994C274F645F2AB1947C56CC64AE8E920C24690ECC1AC67DC4B95E69F321232E71A6B859FF\ +EE32657FAFE512B4BD33303C0838EF3E275562E09373A7E431E552489DE6284B58299058993A\ +44509F2E10B07B3DFA7B20103FB9497E6BFA6353C930A0F9D565A12F241697637E7ED81D1BD5\ +E609787F79A0C95C1B18422A42D7690DE2288F5E5C8E0AA8BEB5B3A68ED358E3196CA20AF163\ +C20316B8E64216581DDBE553EF330A717DABBE0AD1209B9A541A7BDBE70A22D77995BE26D99E\ +3903C0E251CBC7990AD08489431C8BD80AB62D63179EC93E5EDA73E46B22B4D518B8765C2C0B\ +3736817A9EA60C86A86A1A69BB7C3E2D05AE0AE4313B2C766DEA92481C7A7786EA82EDA96EA5\ +0964765A171D552037415A3D7F20B19104C7565265BCF660B4685B66707EB778E39B5B34D551\ +729CB39C8C4AD50E68FE2B988EA8F770749A336F79189D6B157E9F64D17BFE477F7ED5997918\ +C18E0CAFB2C7652CE554FAE70C52CD7A7319F768AC001C7C2D60C567D9D9A6501640544004A3\ +8243B4EFC37425A46ABA7BA98BDBC2CD7F106F69485819DA79FB483C2B50FFAF67EE27A4D0C1\ +84B20E98D9CD859FF2A336C1544745EF4EFD79A9906BC3B9D5B5E358BA1FDE3101D0B27E9F02\ +51EBE26EAE239EE8393E1DFF8947E6036FE4293253D223E89E7F6B439E1FA8C67A9440DCF5C4\ +0BD7744275E66EEC2175706046F67A55B8580A8D902F342E24A76509077AB3C2272AC4874E52\ +E15644A35A78D57C650692B297EBB6C9DA215357567EFDD6D2A64634C2F0FBDC39BFB6EF1707\ +9805A0D9C2506DCCF9C858441E2478B49030F0A741EE8303D3EDA6FE0D82EDFD38D5F66AEC10\ +AAB25AC72E39A46E0EDDA0AAFBA16F9CCDE84316195655569EAF463D2E046E3E9A2D56E78E8D\ +495BA69BF997BD972BB724901CCDDBA065491D7595211995C6F44644C63E275FE1EE3F2A6C61\ +BDB05E7223CAF113EBD060D9740344BF8FD878E820331427DB67DDF921DCD27C08C5B176B864\ +07578907ECD6A561AA6CC206CA6CE5F8BBCDB7CE3797D0111BC52DD1FF4082D6AF0D65001C9A\ +13F42F4F66CCC9079FCE07AE288EBA8735B7D983D8E3038B4A774DDA3A162AC943D27F8BB41C\ +90E14422E69E2DDD726819F613F08B1D2D7DC25634035B5BAF6CC0AAD642160DFDBF3B3862EC\ +AA88493F9153A5371469212FE7A223FF11A85C08D4D8834F2D3744F6975D06C9522505B0D107\ +44FA476690E9885D995777C6DCD79A0F49FDBB44ED03936A0F2629E4BD4483F94CA76DBC:\ +4BB0E901B9BE38A39A8E116C77C05704C8293F44D394ADB23B0E87AE8C66D9A9BDFD51BD5CFD\ +6ED04FF5366723074327E923BB63E200698184BBC24A47DEAEA92CFE39A9AC48F22A1E0B76A3\ +5B9729F8A14AC41B430FD4373B2C4D2AAA7560E3D60FF4EB63D1AE440C8271E3339C716B592F\ +1857BD63D9951FC38D334F75987FA381DDDD324D62DC9D1564EA417BEAE82B0F8D5D138419BE\ +02E69FCED4DAD1D4991DF70B701896E180ABFACCBD4CFC07E07D23625371EE0199D6C7BF146E\ +2987CFCE31EFEF4D6305682DE92015362FB1926822C672920359932AEA49C9969CD958742BF7\ +B436F03734B3E0B899A513D3B6DAC6A715633BFA7B30DB6988EA2E14EDE3095267BB5407CF7C\ +8B693A06227E990B256A3CF18D64FE3D2EA8D4D168B0DE71876F3A77F3563739C5A0754823B9\ +7BEB1B16B32804DF7623888D57E6877B2040E68BD1328A69A3F6F9F3796EB8300D53C68F8189\ +D93A11EDBE4608175C3D2522CB0CA8BEF0D0FB752EC50CCC7ED709EE5CE90CF44F788DB78613\ +692ACE14A617973914D9916D4FFDAA07D50673A5F0A60AC73031D3A96E89320C7A81A42D3246\ +D95099219F85FE5BA00631D833DCFDA19A029A7670F848CF16BBD271E64C8BD741DEEF9871AA\ +A68B10C08A64A3BFE2F99D7D04CB86A1F0CABE561654553131B3F903D420F2CE748068A81AA8\ +33609693C633F04BC1DF7BC391B2DF083B84CC9D4E14F3803E704720D7C884E5026861033582\ +D0E854D61C766274FCFB8C8ED428C5B9F2C8FAE0111611EE0A0278B72DC305033F51545744AF\ +98C6DC2F721CC42F71531D3FC8C0E003B6C9E65BA3588C42669BA65D3662160A8A6CD0B652F8\ +7FBEBA6F4FBD0499AA4D8B06B9B67F4F0144CFD8AB517C86B68F2D648E161029EED96979C24F\ +0C64D232D4E162C5EC93E2F5C8483920DE7FF0B23CE3FCB6E8675435D579031B36A10B08A4AA\ +F16B563DDC94C8C5C922D7AD8C72FB15070E00D1B9AA09C8F693CD179E8C3CDAAC20FE4CEC4F\ +14DE10478C419359A8543AAE601DF2C1205BE051A1BBF572E257DB5EF8C8659B6BA93683C76A\ +6979BCE9AD27C3DC4BDAC4122EC8FF7FE53FC651EE4B68AD38502157027F7741B30F013F0DF3\ +D2BB14764355FD6CFCFC855B838A18F06896817E9E1252E1F466408FE09184601DCF3B0EA47C\ +62AF09B84F890E5F94A8A6F94614E9BFC5A6EDFD2E7F2869ECEB8F03BDA424E2FCEB9FBD676A\ +3C051690E555DCEA6C124681D1255C2E0661B1023C15BF071B3EE3A8E8E6DA8DE8AEC78EC3CF\ +9C7A1C9EB23B8B706FD5E8703EA10A1F6FB29A0D42139D1D6EBD7EB145EA565ECE19A4485474\ +8908BDA769E9634DE30E3F06F3216D121A92323CA73374371012BE9BE82B158BCF9B634192A6\ +D58538C3208DC6DEC7A9BFA83905A69E9D6F78E2885499885B5FD8E88305BBCD2192216F:\ +D746FC + +72DA33B988192326A043A7B70419ABD6B89BF899D19E0AF5C1ABF6B3A2842492BA6D4F254E7B\ +ACCD74646BD6560FC87AD5E59B77750437045BDF17CAEFCEF0B07983BFC470A9F034BEC6218A\ +012EE7E6109E83849B5890833B5D2EC79A5D3570C7AF5DC8ECA37F4475A352FEEF4BD0C33F31\ +958D2E99113467D30CBCB9F6DABFA01D3728FDCB13B6ABC5DA6C7F470DCB2055DBAA0E779893\ +99AC345739674F4F4AB66C4D7B2D9F04DA0808848108DDCF1C6D70190A66FDF84D5B5F19FFFB\ +0CB28D47731EADBF183740E0E06CB33CBA47ADE2781EEE9A7B13335F4A7C629B2A1E808D92AE\ +ECBDB969659E67F93FE25E6A86EA9D471E5361FA961C35768AD89D8DA6AB16B9C1C4690C8AF2\ +3798AC217DCD23F77DA4F531CA9C25FD73C6EEDC174AC61B1D38BAAB4238AAF93A336DDA9C21\ +981EB80957059FFFA939D1A5FD2F6FA6131880E59C5CCB6A6FB73B077172AE85E6EB0700A3BA\ +09C9DBB0699628B24C8A50D57C5C6C8C9CFC6ED3B8FC8213BFB0D2277BE162E390DA561A1787\ +B6029A6908718A180046CC777087E271859C190C1B6F517EAE660FF7CB950BFC3B8E572BAADB\ +121B6E68077632AD28D27866D7A76F854808C68E69F3620E079A99839CAC76E31F259CCB1A9C\ +C04C05E2E74AB9323C619C0EC6E5744EBC1A22F951544D5B4AEC306D8921BF6FAD4E749A3FE2\ +5B7B8F206B558F14BFEDA34D29793AC53A4ACB9E519C05D0EEB9C22F785ADCA395EB0E7C2F6D\ +19D1C10FEC2A3EBA50A47990B64C108294AE6B26A7E3805E5599596DB55D2D820BFC27DDFAAE\ +C08970144DEACCA2544CB758EAAEA728B10ADC70686A07F4AE77B14F2D58BE107160D738FD53\ +A5BA74A1ACCFC1A7E90B888F397C4807BD347BA9739F2EA7421016EE9520E217CC7390A2C686\ +55F7645D1B8B44FA61AADC92FCA2DFAD3954E41DB3A15E1C7E529A32D6ABB68A636BE5538460\ +3CB605F6A42F8B4FFBE795F8F644588A27A7C3C406179C8E4128585D2980D51DDB831D3BE643\ +D180CA129C183337E08E3257201D77D56F84A8DB60582DE8941F70618DADA81C33AAEB0D9D0F\ +2A3C5E60A8042C329668EFAF8E50F72C806E2F17B785B355F2CDAB7E5FC75F86BE10ED77C982\ +34CE7881311A9639CFE5BE4373348922B0B4F368C376B8A20E04E154FB6F2AD6954A7B8FED2D\ +B2FFC94EFDDEB0BDE09EA6D64BAE5D670F4DD245E253F99341C1F80117598F9A5C404AAE1EF5\ +C8B225326A5F1E4B37315A328D635FFA212BAD1495AB583D1286439024C6C0C9BCA7AEBD4607\ +CA2AB18069B216E289812B847B33EF52F0ADE59A5A44AC63174DAA82CE6C1B80BC8440A814C1\ +8E5811FF086188C4EFEFB2692BD3C6B7B4A6438C61B29093E62666F5B760354DA1927D97E0E8\ +07D6885F44FEFC453A6397BAAE5A9F8BA53E8FE56895831D6B1A2DA44DFD3046881BCCEF:\ +E2B67D05FAE6CECFECDE72E33A41696FCDB48CC035033C1F53A8F6B4C1BA0824D7D553197FBC\ +22859B2B32BF2A636DE8F1999D54CB973CFF9D633D39F8F7C32E4D6248CECEA4222ABC898FEB\ +6764D4FD192758D14CB0EF7881C50E1FA07C0705AC4533B6536EB7FF6A430D8CD4A145E15679\ +6B5D280C5933F69E813E642ABD145E43A03CC1ABD26FD5F0C6430C5656998BCC126D522D5656\ +2DA04C6AE0B19293CB11E2A06765C64C18B20E5BBAED65E46807C0513E6BA36E3231A28B426D\ +62720278CC4986E1CF3F71C42D4F1CD45D7477475E7919E353FB498CF32BD81CFA4084BE21D8\ +698F2040BA110A32DAF535E1B1F4D6FD3A7278E55EB5314CD460B39704FFB019F1004176451F\ +029D473458CE705E62F2A461DC2EAE9DBA2BBEE77ABB320C6FAF2FCC5CE8DAEF599E3D379155\ +45332EF305D8386F34C5D9A2DCE8FCDA1A3517821B761856D777E311F918761C873DFF638D80\ +6967DFA28D5213A2C17DBFA0BAB947B7FDEEB4F6648F2F415FF09947E6E3EC01EAA96AE03C6D\ +07BEA5FF5599A47E23389A2D00577175FDA3620B4A3AC3C22092E8829CC12814976E38A5412D\ +8C8795C3EE89B76C8678FA6273C06F12AB9121BDA619948E1F2EB6D6C46844642C532E03E449\ +4CD7D89E7479F2B75CF3D1B072FAEC4E293B50E45DDE6936485EDFD091999899AB44059E192A\ +B81F6661FF98C5DA37C545980721C6741FD0CD84F65AD04DAA49CE4F494BE674CCE1212FB868\ +F22E81097E1B3D16C9EB43035979DE7FF557A5540A36E42A0BE4940280D3837C46115AF90F88\ +73AC0F26FC265DC0250FA0DC894B16CB77E0A5C80F4E86EF503DB8A42DCD9F800AB108EFB8CA\ +C4C3CB2683D73C1B4EEDBC3F80547C167F7B72DD0AED7E5980174124812AA97FF26F1AB6242A\ +387F8C5C921A93BBF6B132D20C3797035A131408561E5E2C51D7629DB47684D76672A5B508E9\ +A59AAB30C2E2E207689DB69F8F3D8F79A2142A8CDFD8D251DA941FE8BAFA507E9E8A7C69D6D1\ +6A272594CF0218052B981C0080676DD245F419276E9E07D8983F9688FC8CD9AB9B16756CABD2\ +1DD320A6A435EF40C4C88CCE50A98D79FC0EA58BDB4F11431AF00D4921B0A49995A9CAD78CB2\ +28A8274B7272E3F82671258418592D03008715A1216DF499197946B661293729DFAFA6239482\ +EBEC503B7836E4B7B20E47C2FE6BF62C845B9227069742B654056A4F31A0B4937F1056083921\ +25E63E82F9045A54799E4DE18D8010AB5E3E3B9FF008D494DFB5A2041A6A5B89CE72F68F777A\ +8DA398ED66ED6637AD105871A1BCD7679F55AF3989CD3603836E9636C8A1ABEF86D4AD3F6AFE\ +CB1D6417C7030CA8AC09E3C15E9C275477097D77FD32509B7643C5B96DD9F9213DE07A083B5A\ +8E5FDCBF4A41890D4D1B854604BBEFAB06B598D3193E57570FD137372DFBF983819CE35A:\ +48B842FA + +F3F1796F6C00243B96CF802443D16F213BE4D527551102892AA6BFED3FE95B1A4B3E0E3C52B1\ +D32595B83D7575379B34C36F4ACA0CF3D9CCBA91AC0DF206D9A98B39B48EC8F168FEE924E14C\ +D9DB1700333EE88992667774D31B42FCCA673A3C1A0F72473FACF463578619C8828604F056EC\ +6948DD3B6A12F7C92AF902F3F6C8DD2309D9B1DE9A2B83AAA8F3DC15B5D2B1ADD86077CEF344\ +6538F7CFD4469A031F91717A87C23473B8B6D2961484D675C0AA938207C326C1A98691809228\ +64D9E5B57361CF9004B613EBB2F75CAE2CA11D6EDE4944F54CD8CFDDA923BE42908EE94E8AF6\ +64CB9E4CCC86B31605C0FBEA52DCD22DD1827BB361F13C8558AA6087A420C3E2D6D7A67CD1DA\ +849456EF7CBF827BF856FC397B8F921819F6FACF26240D89D7B9365589240CA03C30B2FE3D29\ +B2E5889C683D6EFFF09F90385AA6B518AD5C0F581788D9D6F0B20FF8D2C05F16BC766C107753\ +07FD80FF2DEDBC64202527149547D784C7A97FF8AAF03820E8D3CE6D94FE8F4F09961BAB6ECE\ +873A099F49511A4F1AA527A0294F9D4C2C7CC13B66BFF754CA60EF76D0678AB6C247027C5658\ +506EA706784543083F83E6F11B3310C0375BA203A857C87F846727DCED355AE64773262F8632\ +58C77B8A3A8466283B5702C45FF6BEC024DF5E0D72BA36D81482A0B4E15EF0FE18609F925B94\ +BD8D42A9CED97E32DE17D90B8ACC07233F0A684FB85EEA4EB25A5F9F29B3B8897C8E735114BB\ +E4162869C1CC53908894A392F15B49CB1684A03822D0E02F1C89AF37BD4A22451145A97D28DB\ +88E3E85E9D17AC0BFAA8575676F4E132B20CC91C946FC973DB2B2E8EA35EF7B8CD1AE83951CD\ +62AE825F5209B1705A6FF0DBEF9D3D350426E5849A26CF767E44E9527D9DB39C7E19B79876CF\ +B38B26FBF3F3017671ED423FE20DF87A39BBA1463E894FC1B713D01E79488B4B751856D8AE26\ +75B136FCADFC0251C30FC472302368419452CE227BE74A3E167A76BF8B9B225A57781CAAF79E\ +FB924E4A050D1FCD723550205D04C17E4C865302F8C09CA68903D271C4A3AB420255B69A7C78\ +79C7411D6F2BFBC1E3EC555DB70D8536ABBC9CA80E620ADFCC00C088A910E686161DC9D6E383\ +C74283A0348D7D3C49EF028A549A5D9849CCED60064C25ABDBDAD3578013B4CFC4939A30FE1F\ +5D043E119CE8BA1B8CC67F23EEBF06C08DDB254693C3F66DA3E45739D284E2D797C3FDBD3517\ +830674EBBCD92E1C87BDDFF9C477C061BE575866AD1D6D81C5CDE36F32204A6ADC96CFB0019E\ +2A74742FA541BE8FB5F6A73928E5AB1A21489F8E385391261392A04241140D7EE97C57391B85\ +7C6D8599DA250270A2C07F3F05D64495F2E4FDFE7336022443343E7BFA9FC10077B2357406B9\ +68208775A2B0E07F657153B4AB3206EA83984EE3A5D03DAF44BF30AFF2F181BD2A1F02B4:\ +12E5CF2EEF42624BC53D8A0FEA029E604CC6D20FA927ABC186E00771A634C5002012D6AADD89\ +C5192C56B8E3E4B54DCF041056188A5671CCE981D4A02137DF7F40533A760D200648F24D5C18\ +BB08E3A694730EF165A1AAD4A117B8D800D0B8ED9F6AAC1D9850A0E12CE815796D5220376226\ +A5F29232810EE969E537459546110B9B747C1F0E441E59682216F27192E69C7034EDA3FD3BF7\ +B9F4D2EE0688A5FA20607FE37C5BE1051F5AC439903794F7C4F34C97E88CA61FFB46D948E5C7\ +8937DD683F5EFF633AD94015B51B9244C0B83313CCE16FECE79FD5BD26DCBAFC05E1A34DF5AF\ +398E09599E9CE94158D2FEA6F0E86C7B054DAEB531A1E836E05B1CCCF2E9F8AF048C94CA1EBA\ +E9FE7503F367FAA363DF74AA9E7E1C3D2A22E0C342DCA5A5266387F86A02A8F5B848D56B0F2A\ +5C119FD930B8408FBC801914295B0FB7797C0F214F8942AF336AEA5F24BEEB021994EF75A15C\ +29CE5B3FAD12886F934746CFD8E12CA0EDADEB86F89396D17FA0D7C992F24AD06A5045463345\ +C5613DB25967D87B9A72CBFF8E2B008DE3004F45CB6028EFD0AFF07602AC624E11A2B4F908FB\ +8B28605AD0B27A2F4F96DA80E5A4AD1247EC6F5F0F9702BA60845E5AD8E15F12F2A74F8E2D18\ +568AAD6753C2C0A91D6823C412A48053C877C6B21240941F14AB921911424F4DBADE8B02F20A\ +C65E68170F9FB64CDCA5288059C08D39BCEB78606693D17498D892E0C058AFD44A7269A8B2F0\ +A3C036A4B53B2218CD54B0DB5E2CE2F59B923124C304273F39365973151AC85244B054980588\ +CE632026B05EE656357D1D7DCCAC80256DC59CAE11FFE5C9C03742D192963802BF27351DA535\ +B087296A85658481054FE5E04CD072A5F77770C391742CCE3DF8FA3ED45CB29375F7F7D25A60\ +35264BC677CC116F27C58A61696C8FF4BB117C9F452A441E543FB95E8BB857E071EA4061118E\ +137C67E90F8F82134E477F1266BCA6C998D9EC25EECB1FDB19F0B11B3D58D2594DBB943D019D\ +4174ECB4A18D42681CE823CE33CD803CC68A00A89E9DA7D8D3441D5D6BCA1CD8B915E0B814B2\ +0C0D5526E67B0ECFAE0B318BC63318846620E9EEED3D981FEB6E2CC2A9AD1E115E1E29C1377B\ +8A173B166C579C7DF0713C88A8E75EE73149C2DD187EC6165E30B92F90C62F963531CA593602\ +DA6A2DCFC2524CCE80BC764AE1B24EA2D903EE25B7DDD545AE3D3FDBDB97987DDBA315788542\ +6EB2BE46612F9362BDD0E65BAC163B0BDDC1FC171BC91D3191243FE0851BC36E95F928342879\ +1C122BAC07B2F6BFE9362139854CD114B249F5F6413121F1D7F2A63318DA26F8E9717E1AB99F\ +D7F894610375B71A04A8E066140CDC42349D5B25128D401C784F2A5DAA7E6B6B331C8D2221A4\ +0EAD0357E72AC5346DA1712FC85D42C2E1BEB0569FC6FC31641D9785E1ACA85A67B69077:\ +B2771B8F57 + +190D0B444816CFE9A58BD72DF9C8257F5036A75386F85F20344E8094CC6A1445E7475CE75D3A\ +3F645084D9481382CD8F33AE9957BB977A49FAEBAE48F889ABDFF73C8CE67D3BDB99D6C7F764\ +1362A75D7BD1FDB2522E1CDD246F044E482FF989834C7C4CA7CFAB83F75675DF9EC88AE7FA04\ +FF16D1415DAF85B119DFA9A740A745FA632BF3662671ED20198CCC61549F63AD75B04C313091\ +F301CE2F9E9E7323677FC926ABF881E1EB1ED92EA0D4E6C9B2E2B74DE021CA73C651E93758FA\ +036CADB304CDCC3E685F7DB07CB275BFEE14B005A21899D3FBC79EE80BEDEB579F163C60FC52\ +5A231FC33650FCE48F798B6915D0D85B7551E93D99B8E053CCC2F81A808F73D2A5E7B184739E\ +FFE57F33536107457740FC3483E28CECC770D083BFB935DA436D19FC65DECF57C94896ACAC4D\ +C0C53A41B9B270853B10AE3D31EB205086D4AA8AC6E488BD82B39DF844B782591CF7943D78DE\ +06E189AAC9EAA1ADE0811D5CE37805FA53C76B2D8A1D4CA7E8D9C700F77300DFFC17818EE1F3\ +675AF79BF797DB6ECF3E60F34C0629A52D0F5C9389155EED7D4D9EE397BA77753C584900CCAA\ +F3C4EE0823644DAFBCB0DFBCE1E1516EE62128EDAC32D2B1463E4CFC98F0268AE4C2BFB12C45\ +0FFBE84D3601A0F62C30039628F66B779DA3984784122784CA667277FA504A1FE731DFB70479\ +0B7265C6EFFB40A3515D1E370BC879C74E77F7765E7F473E3E44397026AEA2F6B0E0C23089D4\ +9D7E6E218EBA7A1FD841A90301EB4C3782A6AC5C52DF861C6F495F6CEFDC1A597956F32170DB\ +C01CDD5F431ABE5229440EC56265490869F9E0B82D7847A40EB6E18CFDEC0483DA195A61EE45\ +BBD9B3098DC2EDFB19590EAC0225D10E2F4654C7EADD240E535785BDBC0A4FBE5BCE491AB773\ +B717516E369A95B7135E77EE18BE2387BCF450E18FB205A46CB2041B846269328A7C161D6A70\ +BF0C84BE33542045F837C31FDF12495444009DA082C5B1ACAAE10445B5CFC29294A19F81A749\ +2E05C04BBC6A7D47CE681E7978025ECA19B01B1D7A7D8F03CEDC9E651D9A0F0D2D3CEA75C0A8\ +00D88E79D550AA1A306839F080C7D9EBE010B6523141D9FD06B5AB40099B37B31DC592CF967F\ +C055027FC93BF4631454F5E0B4940EB2AC81BBFB3BF088CC00C84E5733F5B7620FAECFCCDF23\ +6DC9E25D2A07EBE9619438CA8EA09B03BDE999AF5F163B2048993418A47EB3D3B87CD96D5C5E\ +94F169E05BF998022D41C1C494D0538A49B47DB7BA9D4339079872421895941AD12946D74BCB\ +FD741DA2E18A268803FFFBABBCE8FF4DF0563ABBC4AB0F4C426561AC10CEFD47D1369439DB50\ +33EBBB048397BE3595E79A11420153FA157371388FFEF1D1525C4F5DB8247E048C8292ADBF45\ +511CFE147B2B374EA9D0D776F66C1312E13FEED497723B1EE445778EAF1B7FC0F419DA1F:\ +8F6EA7B4AF404A493EC11A2E3869D46B71CFC47E26537804E0CE258B6EE6A85164C35C547DA7\ +80653AE8D290CB34F3FA4E17528E5938E237EDCCAB9385EF5501BB0DB7AEDE91A32AEB7BE0D3\ +6477AEA80FE7D0714CC8056B8651394C1AC88A230721AC8A3415908A321B79003F42DC783453\ +898A47D5E3FD0A24F839D5CEEF4A9BB51C1DA54EF0481297B5293278985275723D2395C7BF28\ +A7F78618CF2E841AED31FD98C7DEDC3C821B92CC731714054B1A51FEA829470B32D83B63F087\ +686BBFE3E3B56FD6332695FFB8C7F24B243FED3E314EDDA8B3CC5E2D0F6B968092A4CB44E52F\ +AAF9A5D37866EBAC3358AAA4A1F725391D226D30D7561A8F88894416F0B055FCADCC55F19FC5\ +29D748828F2E3BF78CDAE9AD826067D266E4ADD86AB680F3DC5E8AFCDCFFFA1971B9A1B9A21E\ +0DEA1F3339F54D19973D75C812DCE634B792932B99724B1750FF95759EBF9B33DC92DBB3CC16\ +81E56F9B1AC1CC91E863735A96C9709166A5835B81862E0514D557F1748F3EC77B6A35204D68\ +7028F9597E35BC28AE8DC60029945AA216C2979BB9D87EA6CDC49CB43F48B5181C2CB9102005\ +5D7A33513D8C8F34A27CA058AE98D03BEC7AB1806010743C55F7351C9B6C552B8936F5F092DA\ +FFD9DA4B836EFC280097895A9C655E5CDD3BB1126F92528A94C1E8BE5B65F188FBF7D198F480\ +C26713C9D881FB760383039FB926AB578EF5EF7746CD531B9D8EEC55325C4CEC543C832A781E\ +AE64E06604A6342BF886B038DC672305925D72C8B8CFFF9DD99311A80F3BFBF6F5AA94059B30\ +F7ED70F65C022E9C148C338FECE35AD3147A0AFBC3034C9C4D876D0FF1CEC97C35AC3E5A9D7F\ +CB02ECC02D8F01550E961B283765EA7BEED4C3194CD054E14E2127280D117DDE0710D706FD65\ +1761FDB2AD33979CA5E44344BD615B1AD45E9ACB55F8562D18D7D15CEE6AD07EF245F7B07A23\ +E7F20C0E25D4C274A54CC030A6D21A12BA65F7D530D897435AF9162A609F91E7EF9F923BB5B9\ +A075DCCFFA99F075EC96155549027950F3DDF6B35D4E053B9E255EF4EB8B9A1DE30EE7BD516D\ +24D607ADF658BBD7DBD1F58FBA34C0A6FD81AACE142ECADF63FD763A03CA13FA4032CD10CEFD\ +D759AA1E34484625CAAC69939E796C1E8E4817E0EC17E8D3C456283C162183E6796EAB5D4613\ +D3ED080808DAAA70DA3A945CC0ABECA5B44649F234F0207C3811A9E4A0CA173096CAEEBF3DE7\ +A2136B5F48516DFB4051D9DC98D90C3A011310339947F1A40493FDAD6098B17AF61AAA9C610E\ +21131B97A33F94D8A11F7A33FFBAB4F85973A2CEFFAD0E7FC555FE5816D67FEB78E696FF34F9\ +EB76EADD09224EDAF9FF2B0C44E8346419D1100C223AF42976B031C10AD1A57D44A0A042459E\ +88D4265DA5A3017C31209411E67F468A5912457E8670D96BE6D460741866F5DE24BD45DB:\ +AADAD8921C1E + +239CF518A7A49CB68A264F57C1B9776D26D0E21264BBB25C552FA15915FCE66C2006D8AE6B5F\ +CF9F0D4F780C94925EDF2CF9193C2F0857C050E522F72D873EB3698CE789FFCBC7268EDE838C\ +C0277C6CF4135522E1B32BAF00DA4A63492D733222D451A3335892F83C560BB0C074157659BF\ +280198698261631794BBA5440FC2E624BD6CF0F9A3C014D3046E891D06AAD67C123D52373003\ +C9E9FF370B8D0F6F18E5D425B71F4F90110E3B9683B6A1162A0571B695C6D2C4269B1114DEDC\ +B345AD5C7687F889835D374683EE01CD3B290F70A66C3731981573A4B7FF0729E42801E94E29\ +BA0D3CFF7D5CCD6AEBA27A44C84B6F0A28F27ADD6277AE5A2ABF9738A9AE473DE4937093AB72\ +646B67839752E048C00C2EF7607C7863CE5DD7C761258013B176494C7AC826A19ADA853A87C7\ +F10F8D148627CF69D3755C77181847C469C8721A5F92FCBBDBA729DB34AF27C7FE37FF3F28CA\ +56587E22596378664EAE0E8BC1F76DD7F4D28717A4550E7D668C143215646BCF3BD759BBF03E\ +2671A1D01C071AA8F9E45638072FDDE82DA96617953DBAF76C22DF09F0C827B3A0439F1F86E2\ +E1873F3DC854C8F1C49768153B2091941ED2361528D7BFFC3158B548F9EEC81677EA1D1A4AB4\ +B24DCB221DFB055608BDCF25FE92DA59F87965F5B5C60363518BC0392C5F1FDCC5D2AEFE282F\ +B20587D0F609594F5A1FB5A0B9DBDC3227C59EB4174D0EBF1A5BB17E52E489825CD50C604D34\ +671C0224427E0DA9E6DA00C41465FCD836895215C14CE15BC4B304E3A06FA984094A887EDED8\ +AFF731FD07DB8F5CF871B2C27586C427A8E75BA1FB9D7A422E99F48F81E013257D2F580798D0\ +400BA3EFA12720F497946478C4AF612B280F18677F39EEFD539B66574F35B7ED8A918A8B0EBA\ +8870121DB7B55F3016AD93E865319A95C83BAD41266699F2F4D8DEDE59F181F6FD4AA179FD3F\ +16A9270CE16810F99E6F2AC5F54C7598E86534BECBA5D083E6B3B9C67D9F2B83EA704803EFE9\ +148E72096DCA3C97B296B1D86950607F5D17153C9050AC6AE97FD4C9CA448BA98E671BA92264\ +E2F87B9CAF1D63506739DC62FE4FD97CF6D1105E156FC4DC1B4F034D5C3AF8C9F675EAA460A4\ +DED2C847135A64A3B1980BD4625A29912415A3A947C0B4FCC9A2B8D3DCC6F3261B89E9898A43\ +AA60B8B274F01FAC72438D5B5581A05D6CA300B06BB5805CF0E86189DCBB8A60587DB1F19043\ +6786374F6A2ECD23FF8E460782A2E4D8EA98E167FA330F336CA7E4C7F94C03DCFA55AA57B6BE\ +D032C484EAAE0501F04B018901DA071E519009E0B26542822DC3E7B9799B34AA9EB69277FEE1\ +BAC2E98E80296F6554CB3D60B6DB62811EA97BE3BEFC12F156881540509988B92F42249FB4AB\ +8F39A21232E2ECBC30907F8EC123B0D773B1C8B67A8DB0B0770DB559F6EBC63B23CF806E:\ +3D1D43BCA6010739D96D16DF036C6B04047BF3EBE1CED4DAC2490559EFF84120E194923FE454\ +DCBDFC7F2FF02B8F3E70AF354D333D826DE8C4DECC83ECA6BCA35A42E7F16C088B970205C119\ +4A21F6A5B41CA13097E93098878EC5FB52D67CBCB36E3BD6643D407C2CE10F071A7EEB44D9C8\ +3DC579DF0ED3434B65A6C5606022A134674E714D02444D5BE22ABB4DE8DA93D928B2E6A02F22\ +07197A730BAD7C43A75BE382C495890631CFD4C943BDA20DBCABDB5BD5BBA0DB6B7A2A8CC985\ +A04D4732DE32536087259B73023A0994915884AE9A14222C5A7A57F838B15091FBE3A39B39AD\ +B962B36F03F3A81D52DEB13EF79487D58AD6F9591EACD2EC7BC256126D2EE696C611AC050637\ +F88594718D6FF391A794099963C9EE7E094048F36D605165BC7DFB8DCC57B59115AFDDD2C66F\ +EB4C289A00E85BDD6B08EA290D6788022A9D52BE4E87D2F433A52AC998109584E1AB7F8D414D\ +10728C58D50F8C4407FB9701868F3957BBDF48861905F3CEFED2AA6488A03B84E37F6848642E\ +CC0193FCA1841A44DC6E6BF30BD17E1FEF02ABA77492CA5525FDE471D070C5B2A3AB0E1383D3\ +E9C7AD274C2534E17741A4628EE9731CF69449796134F523F76C0934D88F0DEC7CDC67C45F4E\ +28D056B9E46F97DA29528AC6EA55662F3ADB6B5112B04EA807B40AADB0CE0B8D1B2149381EC2\ +7DD75513FBF8B271136E1CA59D87B0EAB956C37AE0BF57E099738074740E7B10D66CB01678D2\ +488C4F1F8D9011A717F68750902BCE93D9C389F29A53568E60E5B735431050469207E8720127\ +F18E4553329404289E15B1292B8DF3FD88562B981A9202E0D92E3A83710ED49AB83BBFBF4322\ +3584DFC9C47D7B5DA45D199F81F40E94DC4FF4C5AB7A92D9D246E690E053C2BFF4307AA5C212\ +48A2D1FA5BAAD7BE81A6F07C61509FC625121184D73A0AC1630C345662EB6030C660C911FE5F\ +658181B7555EC35DA7F8FA00EBD2BFD9BC809AF4C125F1B5CA88B65FF8B93EA758489B481BB0\ +D4DE2CCC0E68381D8F91C66815FC08A0546C0BCEBF52E0D918A61A597DF46A8817D8D5265DD5\ +59FCC426A9D7486D325F6650C5A078FF1E2BC11F27E298960A9A97007F173483C83EEE55159E\ +01370868C8C5C0FC139A9BD54F46F8A9DE0B7B82B80FE08DA0D34EB531D9CC2C46BC15F9CC23\ +814B98D38A39BB2E2E6DD9C7BC98C44BF822175610F78E034C5311432161B29A7A6653DE0040\ +A99EE878E8BB9B30F004B31ED464BADCCA96596F6568B508E04D82BF5D2D836CE4FF3613C529\ +B8A25DC5B8AB96C541C74E2C9B40880979ED2D60783089275CA75610FC2868F6BD1B5880D0CE\ +FF0A8E4DDFC233111267DF38535841E42231C3AED60BC89B965DBA6E805B429F5A15FE0F54BF\ +5ECC3207156A5DD019F18699090E8BC3A6E80FE9213C2F0B59DE9AFE60F1646382F7D04D:\ +633768D40512B8 + +24CF445438C0D1EE449DE2AD694CBD75526DCDC1D19EB4F67D679C87F5BA69FB70BB6903CCFC\ +332D4C6744F617DA3C61FDC45EA5731BE4C141030659CCD7C6A2120AF422CF31FE39806BC536\ +1172948D12D937A67E7FADA2A49F91A5EF107B1BC2C314732A64AA49198208466A873EB04F8F\ +F832BB4813384E0F9E395D51D1908C34488EE81EEF5754103907D8850FD3B013BC8B6BB1AA65\ +2683C46F7AACB7754C0AF944DDD2A94E7A4D5F8BFB4B134F2F834068096EF5DD82C198E101CC\ +7AEC73AE88F0E0E35FED59E7A53A959D8544875BCEF200135D309C27A2D74EA95F2645C3E2EE\ +82E2162057E4E47AE26AB1F3637DDE57023C4E97B83726CD47F2ABB1C6C7B880BB14F0C7FE42\ +A52550B282961BEDFCABD97B5BEAB51333E90637B29F6041A9CF0A3EC65318FC013E583A2E56\ +C89525BDB118FFAFD46BDE45CB3EF582647CCB40EBD6EF1C4EC7AAA9F79391F1A38B418D8810\ +5C24E49EA226766496EBF19983AB76C6C4EF3C9D1BC6DE59C2B975CD0E3F41BACD5E091977E7\ +C40F974FEE8919F6C0F58E126375B697BBCE04A584A64BDBC1343774D9F0146FFF543A0CF0B2\ +28C30B231693C98E7A67A8EE4294D136F64F7C150BFD06C989711AC42A35A78D96E04F98A4EA\ +2111A4FE5831E30A6EF96300F14875B217D1E94D12B41BE2D112BF81B30961BBC028BCA2B105\ +C97E841D1C7B02FB360ABB442217366F90F469A1AF64FDB5D95B9E50F85591F3CF499B440E02\ +9EC31A49CEF6EED2D7B6F15A49B6515539F9C3F5C5C4651A9B0442ED9534A863D15B035D581A\ +FC705DC598174DAD2B8E4B012AD4C4E5AB965B778B5382EF8BE6AE93108290B9905ED5A37EB8\ +5E819447A48113F61B9E004F42F3893808E2240E6355C69B007C42A33549F2AB08BD2C6A012A\ +BF27CBC4774002FFD1AEF10F971331B4413E632E020848C9E9972EB4FCFF9D7C0EF898F29931\ +3745247CA3F22A699F7D31DF7D7A908A64AECF10B9A9A7EE0ABA37910AB7C7187C4F5F028264\ +83CE39134A54D1DDFA183CB97C3A940A88159DE9F3390031219D3218B7166891171A7CE3D7F8\ +7CB701B9527280FBCDC429E285D645D01E668887F8462E2D21040928A06FA8F1F302C6CECDCC\ +7E97572AD1B46C2AF8DD02BC9701DFBC7B8D5A973A100CF332F780324BCCE3E8080EBE251573\ +FCCA30EDA25360F1618F25076289A92CA4AE2ABE59FBBDA609568EE283F747F255DB20074944\ +5022B78C0AF186AD7D8B599CF18EE9E78E84E81B8CDBEB8CFACA1886937D6262486DA8DFE9F7\ +E2C28921A09AB1C3BA7AD57BC7200AB49C12D562FFAC9F7C529A0067ADFD2FFB865B9EAC9C02\ +33C24D467C2B2267B36CD342EC88CAA672F77FF4359E1DC597FE50E82F29A2D973AB1DFBCDC8\ +68C373D4D6660FEFD160819F71A4AD464A9EC67A214562DB24472D5B278C5B2AEB3C1A79:\ +4917B75D7DD10C7DAAC6922C3807DC446A8AFFBE5B2007DFAAC632EE14AB8809D426B6C31A47\ +51F5AC0AD459AD4BEDB81E4E9A26A47A2E420D529F2D598F0D1597D21E36806386F142C00A2A\ +B18DBE21820206EFF2283082FBDF19B8CE53C324D5FAE648C1E67CF44AAA2F850E21E9A978CD\ +D5FC0F98A7F153BFB1C69A0982E357841BE6BBBDB0B994638BF7651CF0986F508BD69A21A4FA\ +1607B5054745D2EE18F2D11E115A1F7B6686C5E2E84CEC92BFE4A9525CE7573F31849B3AFD55\ +1A0A12387E3658B03730242318AAF5C8253265C116809936C0E0FC52C665F518DA04A78080EA\ +B0693240C3AD5BE4E9F08771F5D6A31B8EBC68708CD8188A44D9E22D67F9D839B27F4F91BDDF\ +7AAE3F5141A3FF4EACA4E2D6FF788E2B5B2E5F3BA296D55C62671E4F1CFDE3123C4ECDB2640E\ +CD477E0AAC5461D5A79AB67184BE38547C08ECEE1C51B45F2CF1E9B407EFF3B6A3BC14AAC5E8\ +3387CCE406B115C0EF7BB0FB7BFD563481A707434ADD742918DF8C711A7CEDCE355D34B5D08B\ +F07DF9630FBA1B712BAFBC784F3C914ADA7B28F9CE1359C951992627677A70C5171A63408A49\ +4C097A1C3AF7113AD5E2DBA66DA11876487BBF998B024AE60D270E57B89ED1C86BF0396F836A\ +B8940BAD499B20DB8F9631A7D104DC912BA1C0ED22FA0B1762011EE84183AE19F87615352C87\ +240FAABCC5F6B8D970B5A7544655B352DA64910C81E1C57B4FA410147EC16744DB0F7BDC5E91\ +8FC90CE7420EE31ACAEC353EDF5067B24BEFDA4A3C773C73876BFA2470405F44F683C6C54254\ +BF9613E2226A40DAA7A703A15C582FD8CEFA9CEC0AB2B8F28EB7C3D97E2FD44B6E6934E44997\ +4C5DF97F69E377E80BF02E81115F43A5C057D4AA68A111F9E7B5A4F87A7193C4AD026F06A85F\ +4D6C8C86B378F40F8860A246419F0B4036C6CCA20891F5AF3C804F05D32292121DE0FE7431AB\ +B29587F9E38BB3754CE18D1DA91589F4BDD28C472FF4FF6010391EFE83834A2E61AD7059CA60\ +241DDDE5412C67BBED50AEA0789911BCD56EF0612DD00F82C3EDF4E39151B9CE5EB12D4983F4\ +1EF9D756311083AD080A64CBA8518855A2E7BB50B2662FDA413469F7B906F6E7E72FE778A95D\ +3689553F7C7AF367E47BB47A7C052C3506D976FEF9F3F3389C456F84ACFE21A28CD3EF275CFF\ +A495E1577DA1B95E867D0050B27CEE11F3332E66E04586974E815B13C34E0704EC151EE0A9C5\ +85D7F6259C6241E7D50A78DFB83E6D45C0F988DF270E65175FA688741F0800E106C14068FE70\ +F03E3989B6AABBAAF4929B5DBB080BB559D1153735E28FAD7F32699382CC8AE5BB8F72AC5392\ +EEC4F92FEC0CFCCE3CF36F0AADB781D0E7CCBB43977BE203BD4A92336C4ADB4DD28770D39447\ +06E93360B54965DD846F4E17A96D301DC7DFF7073644F4C630B3924377E43BFBBFFFBD8B:\ +60B01F1603339963 + +C9C8A2527DED20D6CBEC16939C7012335A7E0BFC8D23D7CB7A819E63FB3FC39175D2F1964557\ +4D9DEFA9DD9096A00CBF062AB5A30F99CC110C5F67BBA32526C96B0A62DAA9A38BCE99F67DF7\ +3CF4C424C4EF673EA3B1EB32CFC0C44254566A74A9EA8610FF9FBF1BC8957E54E91A169AA98F\ +CBD119B24E3EC19E0E6E23FE9288D02A230BADA7A77391A691021F0565AFB0ED5BAAD85697B6\ +8A42BB71C1EC0ECC99B227BFF334F2F218922B56BC6BA15CE9EEFA0B3536465CB7D81AF4CDFC\ +59811C99B499A38A8CF945D9A83E1A15C4085AB27B2C413031CB54D818382C626FCB4996D738\ +CCC697A33A8ECDAD86B1082CB97B38DD8FE47188FD9D9D773A8F72D5EA74ABD533AF7C2300A8\ +F5C881277F274734D14279A08D90FAEBB4D6AED98C94299DD411EC1412CF34004DD2E7BF812A\ +8073E586800E0DFD62159F754FD01C3D89756DFC50D468D1647A4C77D0151727ECAF60257851\ +C06008D3A0BA6B74BA815456A789C3965102F5D5F1277B873792CCB0E40B44B373DBD2FFCAC9\ +BD674256BE1DFEDC78D7909FB375B607934921F3851C90BF8B82DCDDD91C42810143807C62DF\ +EE6183E59701AE53EC4D0347B127C0D609EF4D951FACA3667D29FE914AA449C941682D7A17D2\ +42B4A333DC970CDFD931D35288EA7076A7D4054AC233A6AC17E612FE32570A9ECAB968DB5B39\ +964E6E301E63B815F13DCB99793312C6D1AB998A1E87D6ADE96B497931FCC0FCD3D0ECF79C23\ +D44BE879ACAF1206856A4F12B948548BCDABB07664199E1291ED4B2C6CB0895FA7DA30486F26\ +C5C7BACF8C5A2ECD9EA43DA809067E1EF29F92A0DDCBB495AE07CF77A0D3E3973848CEEDE377\ +4BDFA19F802313665A64E7B9291B2153080F7BBD28E727624D5DB27561FB8CC4D45BB66F9A16\ +20BE69A759265CC089DCEA331508E495F770433966582058337C0D8CEBDDA660DC74E9FF1791\ +06E0831F9BAEA68839D98CFD2C2507F85942E7E0178581BC5185440C6E8470AE31794F422823\ +F80B4A424866918F7146235AEB6D69DAA7718A18EACCFCB05A6BD6CC8B656CB03FE0D8FF5AAF\ +936417827FD51D811E1182E4B726E0AAC3252FECE247CF120A0985D8FAC1A9574FC8882A5830\ +32BD4778997825D84A96CF7C939544BB358928D2BB64D695B6F5B002889505B3D8B98FFFCE5A\ +48F9A05E05461C462E8B30E566B95CABECA00ABE7385B65B5B9749DF238EFF814F5F0F0C378A\ +366179CAD80153A9F5172BEA4EE42CA2963778D70D4953907935BCC09C899EE3D8FD5EAD0922\ +F71576442A760522C4D0118C9AFB867C338131EA0ECE114AC44DCE202D4D998D585A9E37987F\ +0057556B526D39A472D66425580AE3AE64FD24B663B1B56C7EB14F543E3611BE367D31167B99\ +037AFB25A049E80DE1B4CDF8EC69CA049BA9B51101369938995D2A8F82244FC4E8D92A71:\ +DCC0C301B6C08825CEFA3555DEC86A5BBB7B86B015699C2CB7586E7D5B27B85237D0993B9E67\ +E77BD06C357F274781C52AE5F0AC9AFE42E8343E0CE46B77C639C18A1859A007F7B6C5F8F90B\ +13D88B7C041383FF4E6D5457AC473370331073684F248B998C0ACF1F5EC1B32B749C012E68F3\ +CB8F35368171AA4735A3B7DD988205E9662520D0916A425628F48A4A1AF94369835C2E042512\ +89F1550C7AA99AEE184152A86E00D121FA5026763DD8B106BF9ECAC68366362464A58335386D\ +E0AC155E344B5C687B3CBE126E18F4A237A20F8041831289D79F12D2F53CD1EF0163614BC2E8\ +2DFCC2714C02280113EF1908FD40D3763ACC6AEC03128CBD3469E152E81C2252DB94A972B189\ +1FD62D774AF979EE53BBFF7A4B6EFD30B28DA1FD5B8618CB6CE82B3D408CB165FA55FB8C2A55\ +3C3EBC448426F3691ECD20EE48F9F06607A4F10A16C2E9A186C1AADDD35908A34620C3AB189B\ +F8C666B9BBA5A9787D751550196569E7B5231DEBD02283B5B6EFF002FF33941E755731A1E2ED\ +27EDB322284716960E0E421F6C00D96E872474C6C18F6ADF6DB307549FE6FA29CEE34EBEAA1A\ +3B5EC7927CCCD5ED29FF0AFE7478F78D461FE000623775A010F9319E22D0417E9014CFD944B5\ +165E0A3A71758E7C15E4C64F26F455862B6A806ABCD8D542FC07358BDEDB48E06E07942BC335\ +92D44269009A079C6B5067B32C083277B43CD245BDCC9F32AF924A69B8FD6203E147E4F24D98\ +6462B4FCC19895DEDD69CF631D9362C21744004722B419ECEDC53266A419623188E9234BD0ED\ +D0B6B434A747050EEBCA6485CA81893BE4D488D181211161A7D1BA0D91BC2EE94EDCB99A45ED\ +F8160A9120E477913A225C336A24E08A7640A8329C9D4277FAB518B67EC41ADEE3E6845EBE8C\ +53C6F7273B0891E237A3939AB9CEA6839EAB641734AFA5206CED08100DEA1031CAD6DF653926\ +30A33B791A2B10036948CD441D20D013A1BFB2730A0D265FC7AF87FA58EB42CCAA6F954936DE\ +EADCE4A160045258A6B65771C8916396751C0B39D804FB642A7FC071887548268B6DDD38DFE4\ +22720BEB1BA13278C284321953F2CEEFCFFCDD051A0B847238ADDAD359720054869202346BC0\ +C0D2CF83408A68CA1657754C19BBAB2F1A302FA988B73CE061DC7C98E8EDF3918360FFA4214A\ +7F7AA75567A2A0E077661CB379B40743E719178D55B2132697E3D73C924C15F99925559E2D48\ +879C1A798FE2E18CF15A5B3819F36CA5A1DEA0F257EFFA7C9F1EED365801CFCEB2EC1798A543\ +4B0702E7339E4785AF3F558A7EC6CF8D9EF7BC5A57DBE2E3CD148A210F86DD59C9D75D949870\ +FC7656972118585DEB702E02B8EEB2A2C291F46078812A09FBA07BD5473F2415444540C615BF\ +D49F9635BA7E4BC935C27416509FA81B6787767CD67F296253F55F0B55B293B399E316AA:\ +9FB8C092B2A0DFDE70 + +A946842004EB370887F8E43D082718924A419A24F3FFBDA01CFEE2A57E061B5E939B2A38C798\ +F62EE5C62F46711D980A9CF38057E73F6ADB9DBAD2A1B4CBA828E79E5A587760D6DDB3B04AD9\ +F61CD53E501668DCAA42CFB5DE0769AA8688060CC7D2C9D845E181C18A842D9E3C45FA1FAC06\ +0CBE4E9D3F2C168B3584AC87269DD455112BE67218D5D4C027A1BE4ACF7C68FB33100E8DFB1E\ +A8DA8F63B7D89A5C972B2D4DD0B2627149759674CFD8C7C91FBAE6C6DC156D8F2D58F45252BE\ +A15B0EE577230386F6ABDA8B40579F216166C8492E1F9ADA792C42A987B270A2DD4ED6E21B8F\ +B5AB98A8D56A782F8039474D0233DB9CE6A0A2B8B28D16C2B7E69B8834D3E2579A8038CDA9D7\ +BC37D2E4E8E674DF39B6B62AC55BC76A83738EE0BEA1F236B938E0F2CA63D1C97362E00364D7\ +8BBA094AFA3546954461138F2012B04144E8C95046E4C1C5E8AD6D17C5C9F74721CE68F84000\ +D101FD25182AAF2888E3E75052EDE707D2E16FF382A04FA30488FAFCBB2D70E5B4C0294B8C8E\ +E04CA6C6A8624E476C25451BA7E1FF956FC0CDF4E8207E6961B1A017751E40A3888966644022\ +7613AD3C3A3BD853816C4B0E17A7D1267B2615A1482CB304EFCE54901A35F3A56E8A392F6EA5\ +F8B79309F69EE8A936FCAA6B1DE2D5C6108043DA1C11CD0E199EAB241385646F4ABB81315268\ +AA77404EFD3E2070E8342251C9D433E474C5FDE3546A2735C406194220CE42B830E6A483390A\ +2BA772BB36C9671068CF6E7BA70EA29AF7BAD1F9362D368E69E01E29566C27C6D3B926F7378D\ +0BD7195202D052B3148F7C5D5BE19C0772960B9D08EB31CF2AC357C2A98E4594AAABCA37221B\ +09529DB5EEFC26CFFA57F973AF90813FEE0D8E25CD49C7634B033E4A3AC8E370348EF6B76AFA\ +DE6DD823CFAC381AE795852F95763EADE551F65A729E3366538E8723BA2A7931F217C0E7554E\ +5C7F9E02CC2923717D6F285AC12E4E126006E99EA0393356A3DF5EDF1CE578B9A5242A8D3526\ +BEEE473B2EAEBAA89B593D93398250AC62A5B111E8FC473E77C4F64C61128AAD86887EA35362\ +E1F1AA1B72126846E7C00585EFD36D3C350BC9F2E6C99DBDC4CDFB18EBED3F9AB9324A58C944\ +ACF030FF70A196A6C125DD2C79E698C9995C9160095534B104D5859FE5546FFE5EA14FA398A1\ +2E15DCB0106E8D1962A41D229694F24F858744BC09C0BD303572CADBF0E389822BFAE830C71E\ +C5EED78C5F5903A30308331F8DE92E20F1F94561D74344049419C6158E533F3B29F6C8F0242E\ +832475DAC711D5F1A3AFBD853E4F48905F0E1B90E6C3EB4560A7F5265A10601C8B9EB7706B5A\ +A9C654366D4894BC88DEDFCD7E75AEE80476D5C7FBE5DB7F82152D98B0B27AE01161A4037E69\ +A96CBD11EB512259E178284FB41FF4A5F16A37053F7587C2F237F10059FC38699B86ADDB:\ +3B6BD8169D4643AF7E792FDBC9A2ED78BCECBBDF7EFD7B7C86FC7B96C4A1E089888BCBE572D7\ +15C2ADE3367E948E02C723DD7B4CB2789BDE1664375529E183C061E263A319ED240DA7193A9C\ +C7CCDCC188F651E1C2A875B06D6A27EDC6F7D7B4AAD7D725AAC9983E150F7B54A1DD8D36068F\ +65A505CE401474AD2C79CEDD0895E64AF67907D2867845D13286712FD294C4F1604582C2BA78\ +B540614A7FE2D72B4C943305D8AE39EC416E6D1FD9FC6BA6A6093BAEF7D29BF04F879166968B\ +3067228069FA0D1CC1EF70B870EF4FDC2484542CA88FEB946C8169F8E786DEA68D654986AFE6\ +493866943BF065ABA7DA02E9B225E1F9428B3466212C733E9CC293189E54B703C0C6F3DFA17C\ +A183F4F752CBB1E4803715B2B49B00D70EB36816CBDD856065BE5F86A5DE04A3FDF0FC5AF5C0\ +3E95895A28A806123559E642298CDF940912C7B58A1B0A536FE6AA9DE8A5F98C02FFA7C8A99F\ +1ABF7129BD0EB678F21B3273BA5CA047188F303E6F8A32A7EF864E49470478EBD7187C71EFF5\ +7EEA68147AD3D5C87CAC6133E3B8F71221E8B742BD60A4E73137978FBA51F459C22EFBE66D8B\ +496D9385A8BB9962071F997A2AB3E730A529269213F121583E1A02F7B1F15F754BF6BAFEA740\ +BEAE9DE0CC3103F9A9A61373956AA02A5D072CF658A2BB250557723F64BFCB7DBEAD7441F25D\ +2EB1A54AF9883B9BB25653539D5CA8289B8CA9C3DAA69486958D6B190183D677598CD9A4CF27\ +9DBCA1E323FF83B82DBDA3F416AAF6FF2C14DB6CE5052E5657DEAD8DE3C7F14C74A4EACA1C97\ +4DB989625E0B9548245A3D7857DF36A7066242261336E72347A3D9B765861DB6D9BF843F2274\ +6C063AFA1F724D83204E5CB3A9E8F1AC86C8AB62A83B323B48D52CEAC0C3CDF4630B35F26749\ +800DC95AAD88EF7F83844413E04A17136618E9CB799DFF24432798BA5777966A07C0A3F24159\ +963B9EA803DA5562D544A6CDE1FF21D6D5AA7CAF38D436B706F2706AEF6EC02F003A023D7476\ +D0FAAA3B5DC397524960DF83616EC5D5B11D2CB148BD1D2D6AF388AA4B978F1A2C2A2E6AD548\ +F5F7D12B9BB28C96C062FD13EADEAC01CBB32ED06B75A5DB7AF0DDC56DED1EE5CD509003C211\ +E3B5E673B7CBAEE0A2281B156BA5264CFA602080CEB2626A038BAAF69FF2C3778F06277F71E6\ +2375C78683B4809D2017725D9A4AC03FFF0D3474AE23AD183C012B201DE91ABF005944CF60F0\ +96667E506C6879771172EFDDCA4BAC2AC65EBA86BDE7E78E6F6970D59861708A01EAB138F33C\ +197997B98507E5D016D7B3AAF9F774A93F3A7152C22279D2DB55966F387118A0A23C36A539CC\ +D75DEF4367017EB0502F7E5E08CC7541074280A90A6CBE0E4D881154DD3836E6E50BAA61BFC3\ +BC4E4427BE0519D74ECADFC57A3D3CC3B3288A6195A4E1E91ACB74F7CFE2F4ED917BD7FA:\ +E8547EC6BB8CE2F8D4C8 + +18D660AF6D52144C394F285EC02FEE9AA28F11EA732D393CA23B6C68A1751EF3BE0F28159E00\ +55FE925E3EAA77308D9FED109C764405266781B890836069A817C8CC2F33476F02480ECA4F6D\ +389B2F44A7207F17AE94EDE443064A1C6DFEE28086033DD69C4AB8622A9BB65D1032E14C4F36\ +F753E70F9E399EDB92092FAC60F9540A2F8E6D2DFC418BCE35F56B1FB7ACB6128829B27326D4\ +A4CE6DE1ADD9755BB6429F5BFCF9779CE46A041466C3CE353534DC114F07A62AF0BF7472BB0E\ +760098E920F77D3F3F48145C9501C699ACB53B9821DC56875662E524C90EC65C3BAD9A2D2D15\ +2D504EEEE8C64CF87278F964EDB34A2B89889979C71E02581A4B87C3B6377287AE1FBDF2D777\ +900E318201B257A1818349EE5A247B755D4173A9A6E9393B136D92AED9D8420D40C91CC095DA\ +913FBC8C8976D61A2D1AB5191DFD0ACF9B9A694CDEE2BBE42DD8B600616F40B97E6399068FF5\ +A5FFF39456202427938AEF8D4DB27D8460FCBD4D91E8F2C16C1E9704479CF48AB364A26C85C5\ +C2531A7D624EB8A3FBFD5591E91FAB465EEA54296C0314E944588FC8B74D6BDC68363037C8CE\ +EF9EA7D97792F25266AFD6B2328E53E8AF6FA5D8D8DF625621FA21E29D809CFBB86C8CF7B018\ +6A8B90159724A57C5E6892161E6802BBDB36141DC5909D4BA3CFB59DBFE8A5833F3228A9AD92\ +54815D69D09C1BA3FD21CE5DA19B277D46B2EAFAB171DFFD7504A71FFB96AD17422E7DC9541C\ +FF16BD5AFBC498BFACAF7E5D5D79EB9072CEC455BEC783F0935ACFE8E2594DDF5252B598AC3B\ +B6F7F8DA99AB326B8C914DE01E4FFC0D174803CD4B69787726D9324FAE54CFC17C0E8A08692F\ +3E9854630A6EEE746864E0FD2D9785B426BAE60901C9E7478394159B4E7539869398282F7998\ +FDBDD29FA5D3218F05C623AF3B0EFE1D98AEF1B05DE593906A6BEC93CEAD1EBFC743E7D96832\ +45CFB6DD3D05A456868DC0730FD426066A261F27776B910244AE61111E4CABE88A0B75E97B66\ +4CA5B3E896FBAF5550948DE7E6A695C413021C702FA31988D734E4E2FB3B71CB33DE3E942035\ +A9D6D0D0C9FCD554C3BE6797173CA5BD7E2B0C7AAAEDA585BAFFB630BBEBA0AF1AAA95C67915\ +2248BCCB76470C2896FEE0821435F466B788AD81291B9BEAA98AE92731ABACFC67FF5CEDC3D2\ +F528243346CFE6A1113C71DC8E0E8F9F88637937B70863ACD5F413ACA4FD0916E9173A8ED8C3\ +0D14A2A3D017766353EB0A89762678A11D3AD47FB961E5DE31D9B24F98128A273E3C1F282A1E\ +214DEFB324D162F9025CE8CED03CCC1B140131CF0E17EDFF2EF1F53CFB3BEA8D7ADF14D84FC9\ +8D43CF9F5F771423703FCC3D034D108AE32904975D758C8234A2261ED6DB23B0C04212166DED\ +54B0BC15F62E6E1ED9B020D79192271A6A2714A9998B3DFD08A19E8E2BE334DAF2BA6626:\ +024CF54DA77692C014693C6FACABA08C52F75332A7D5084E2D12F3547CA2B166FDD6B71EC89C\ +F9FF02CC4A289B133DBE6AFC9E87A7A28D62E7C4B636E4ACC9370E77D900F089163961BB6277\ +64F444F013501BAFEC9F80F753C9FD0055D4BAB050FF1C1DB22C95517AD76E5686DCC7DE0D1F\ +08DC2EFB287C41E279DB75CF4F67E43C452D10537E8AA653D284039909D33C4EFBBB47FF0939\ +830CEA000B447FEF774BFBBC378008D0B212087A73D572C54BD9E665A7A4D2D533C7BDE9B976\ +B65FC7BD540F4E9C81B2D26DBCCE5EC12739863C8C76071AB93C2D18F84C9198E6C70976414F\ +CC1DE005251B308009912D6D2757AA9359BC20FF60130E12F4BE75725B69D5F29A4177DF104B\ +78CBD08F735E1DBDD51C0443268143CDCACD180726EA081A9B252B26A4A6C16CA6225CDA357B\ +E3CF4F72D7171C853DE6391944CA2065A32298EA17EE0CFDEEF2BF46A6A83BE4E06F076DBAA3\ +74ABF450B78CDCC3E5F3976EA2D9248CFAA75B292542C55497339A149268E895465B44AA16AA\ +A91021CBC32B761D1ADE1E5CEDD5403385C23A2DC36B468A2EB54DDD3A78A7B0491F2ED546F5\ +034A9D4A7BA067C10B920045A04A6D27629701F92EF442DDD3B81FD992C61D17D81625727516\ +F3163E9E2FC538486D5AF1C0F09226143E79661E6C52449DB9518E1DB541E0C0F862A7E783A4\ +EB78E916E9C9CCFFE358D139369D416E15B361740530E525FAC7FE1A5897C658A66C6E8C541C\ +B1C5B0DF7FDF1818341AE975E1CC0517CBD55F8166E499F48C78DC017FFD4A2FEE2318FAF150\ +34EC62D451F559DD47B09F4ACB5536F593194B43ABBB5B88C8AF87699F38C2987B4D212190E0\ +EDE8BE80E97B0E8FC7C5A71C694D2FC7CAC8470440D6E6225B415E6A6DA4BA879468DB40D765\ +9971A38DE502253EFD724AF9DC2C702B9F45D6613181877A2E3E7957D0CB6849101AAF3787BF\ +FB188264EEE9337DDFFC7405E80ADB30DC5CB367EA438D502E3B1DE303D5755A46A46D8B46AA\ +DA4E363CE08AC181A9E4EA6B1DB9B3AB551085DACF99849624DBD7933F1723B7AB4190CB429F\ +696D8DA5DDC92618BEA7E235E3D8CB423DA90E90A8540561FE3B27ACA309FB9F1D4373AEAB4A\ +C6C45D90E1D95C0B2F2B7A9A9DC468C8654779361CB4DA6D6713C7218328707DB6F8382A3B8F\ +274712FE3E70B439001E80CECF6A7385F91B720F815211CD9533764CF8245FCAB3ABF7FF7271\ +E93D25DAB94D6C75CFFDCBEA6199E5A6069FC13892085E713EAC8396988CD6554E0ADF4FDE2D\ +8C4CE6FAD62FB2A0C54D3DD6E55610E14F6DEBF5126FC552DF942F06651AA8E4AD9D4A35C10F\ +611822FDE83ADFCA8ABB678F9465FFDA3D5AE38CF0EA04DABF0763C68E95519ABBED916AFA17\ +1A487E72F54B6C88794DFD6F80660A23E2F26BB6E844FE27DE41B062910228FD1030583A:\ +2F2758E4C63F9C698C6503 + +F6F77F1E437560515CED6B16CE05A52D89B68DD10EE26E826F0E6C54264619B71A4AC1F4D56E\ +204947DC46804E29689E8EFC3950CE25482C4ABF907798691A3282374A822289F24E0253346C\ +0DA48BCD2D28EF6CA9485221612ED197A3E602810C97B644ABC1A43C40B29BB99C5DBAD8D641\ +146CD621EE1149A3E74C51B460A4AD695E77A574E23F4E74FEA26EFE64FCEF59844EAD15B28D\ +AF3FA97FD49DBCA5AFF113289E616B4E898CBE2C7073215C02C3E33D1D67261075D077414DFB\ +32BE4DE414A21DF902AD16AA76A176ED1B7A9AB8F6AD35635A38034757CB52C48B3F7BDAF5C6\ +87DF0836AE7D11E91A41733C721F68CA8D882F2B0A6B00C133B230422A9E9A476BF016082036\ +876D7607A34BC9021E867A24C33E1130589E3F6FB2C75273BC0271E849D6DDB84F430F6548CA\ +BC9227EAE780379BF9657FE9569460036A7C1CD8B4C63B3587F0ECFE522128A286CD8CF0F2B2\ +52D433B6A4BB4445AD845F9E56C35934B90AFEA01DD6D5671754C0B2132D4FA6562B9DB9488A\ +607BC6607197FD93F7EC345A0F0239514F1DCCAB1DD67A2A12B2DC2511FC789EE8257402BB64\ +A02C703D70EDEA45D64DEFD9209F9172C3DEB8948C0CDFA05E3B33AF4CEF56F5ADE10D8BE406\ +61742249F6FFE71E49031AA605054719B59B1667695E1A07C0D126CB477BC005C44E6FCB47F3\ +D08A7A39DB4A7B446A810EE60E71BBB3951890CCC182D0613119A65BB08309BF87214DB179A1\ +CE2D3F21C3F2132047F8EB5F4BEE3198F316C669E007A435921DBA101CE40A07DEADEB308D2D\ +C2B27EEEA201B75633476DD8EF2091FA1F0950FE713BA1BF06F1B55168CB416C181EEB0374AA\ +728531BFE226CB67D7B2F5F283EBA5D1F87F3FF90AAE06130F34EF44A8D2CFFD7E8A5CF9AF42\ +D3A7AC0FD4FF2DB47A38DAAEB3A7C22280205879415418B429800762F597CF5C4A4B07BE8273\ +827038F83D805A4E6ED95D415E9FA13EB8F5E401241ECDFA71DDE6BAC2F397155948770925A1\ +BA9AC1BF5A65B51C26381A09E8259D4AA8B62AA97454D3F257C0E5FBC9145A4F4A47BC743B3D\ +E964C2FC8E273DFB21B78B6FB42F8B6A66DC766F5729F1BA68426D4EF7D5BDF9E28BF39B964E\ +EEF5A880E2F67B8393A57A5DA788B51C181EFD35D919C20518D32425A4050022EC73C080D404\ +F1400D1EFA7FD2DFD8AE759ED20D3657795A4DA020D1890830FCD80093AE746DF9250F2749BE\ +C1143B8C7E20DBEC9E94F69B768DF054C202E17A0756C02D32A008AADC2F009D057AD556081C\ +68832EE240EFBA8F46D6D99F96F66B508360A42B38F0EEB367DF2AE78FAFF7C30B0A22CEB9EC\ +B05D683E3963E7B06EDCA94BEE20C8D991B1931D0C4A1321569679CBA497406F6E2F74B36F93\ +2DF3134B77747D321CF4A19C05ACDC25C548AE81F1676AA2C18B7C14E6465569AC436D46:\ +6F2A05211F8D2800394D5FEB91B7740DCBD71033C4395845528B814C495B9CC7E242905B5C6F\ +30F024532A50D8A1A4AA3E67ADB9B33159767DA566E5E50E7844C503F48BB9647B24ADB996E2\ +EDE2208521DA9B5BF15B344F748E215EA3063A3E5ABCB592F2C04FBE841BCF53A731DC1322BD\ +EE3F3E91310FAB216ADDAEBD5E226AEE12FE00ACA9022137478C2CF93DEA82B302AF5238EAFE\ +873FEBD1F222377DFAA177D8E1E313085AA5B1A28E473C7303BF0D131C5F8188896F2304FA95\ +83ADD474E92924FE1782740CFAC20AB4C2728CA3D0C41F6C369EC1662D166723E0262A7E4100\ +4F41A795EFF54585AD8F8D1137EFAE0F158F9B373ED73DC73DFFDFA00730AE381A71794D48D4\ +2C90BA49AF77EAC887AF0E01AF68665F081AE40757C6CFE430C3996EA4BB2F1EAE8E97413DD5\ +C04F1B1B64122C448F40701C60DAC75E34909B9B8B61895D819EA5F55B2FC6CA5492AF520E81\ +6AC2EC14498891D073FB65E3D33272CB5771A479188CDE2FF818881481A4747BDB20F0A60155\ +7E016C564B8F5FEA42694F12681A7D2906B2EB0DC0DCD8B98E763C5E3334D65B84AD23AB7C5E\ +7CF8CE1EBB34494E23FBDA3D34994BB20207AE5E12BFC95A217F3907565E742FED414060B86A\ +14C710F5F5DC79F0611F2B2532ACF37E210B123C15B51E03936D8C5362B2BCA153B19F7F255B\ +0BCDDD9FE6FFC5DAE45C42FB0277A56FC5F6B56CE49FBFA7B1C8C249E6A5EF497CC7C8D7CE32\ +0BEDC0D6EE2ABD5FD67F6E953F5D9BB025F7853B04E304C382E3BC80D6E5C87FE637E38A8293\ +05348CAB5BE542A7DA8A6B47A1186B6590934AA86356E58D6FD059D333D8AC6ACFD1315EF3CE\ +A933EACD22933C9F29A7455D83BA1A8DD9B69189A181038542026ACD15085129F824475E1EBF\ +76B591422951D96498F1FD5CF93701D2CEB12F466E701B1FEA1D38C6F57DA33A69D0CA041BE7\ +86A045BFC27451A76B0105F00F9640180A97A39D6BDA768D330E7DD5CEC42A78E12D518D7742\ +485717A383B983C8749315037D39A100248087F4FC40143873B11ED80FE496532DA3CD09C5FC\ +1E22311922A3445E07FB84F9924063503ED11369F70CAC8B6CF7D8367658C333A2C421447FEF\ +A05FDB39055F4A46BEC4AC90A2868664E47AED74AE0B0B5604C06CE8C33BD2DA41E8714AA852\ +8C68A84BE11CCFA67BE6F74AB4ED104342D76BDB9DDB8F38CCBF28E118888ADB1D7626122FB1\ +D265ADD42DFBE823E93AAD3EEDE4D472AB139A7DEFD026B758F3669EAFA7A1D99386A5E87056\ +0DB879884906C0CA9805290FB19187AD24E7C2BEC4DD3D4025E7B29667ED94599751378DC4D2\ +E0A5A916DD35D46518451328BC7187D60FAD9CF47CB13B8B4BBC9AD71C064BDCFA9A1F674AAE\ +15015B5EE1BC46B1FE3C4FA2A83DAD03239953B55316F49B5CE605AC9CBE41B02DB59965:\ +195CAE9B4ECBCB8DEBDC6C48 + +EAB25B3642470318B8DF509B4B1939289B9EC9CCF3A12181C8AABC6A72747AEB41A68F69AD8A\ +BFC1164765EEF06961714B7F49D8098088B245E05DCA8E52CC7AC8A5E97C6DDCCFEED8B6FFA6\ +1EE8DD8644BD31888D27F81D1A21C1681771B732747FAD3A238381C80B004244B0A1EAF51425\ +957D2380E7BD777F74833DE0A3E3CEE8953A921F9DB5B6B8B8BA19982C7CC2F8C2005D1BD8B2\ +022FB01A687D9E0DB6298BD42630A9660B25EC35B2CE6385C8C15A79670A23ABDD74ECC9CC79\ +14055063BD762659F41DDD1AE6F7912428A55EF0EE4EDFB257F05BC04C90EB67196608108599\ +887B5FDCFC265FE811ED1A21E71DA52EED2F1B37884BB888A23CA74752E1D612E3575B54F556\ +85FB6BA51743FF5BFE44384FED0832819BA014F613D7B19A046AAAC4C8902212C6F54BFA57B8\ +E9E5C50BED0E0A1F56AF878A323791DA52F173BC284F3BC38DE23D27E06CCCCBB4C1B7E0D6B3\ +F594FFB71E39120076D78EB85722A7EC25EFD39FAF7EE4D020B3D05D6ABDEC9318075EA81995\ +97E9056DCEC1678CCFB0907977BEC59338AF03D28A80669A629A70D6C7882484E2E4A43B9C01\ +EB5FB0E034D8A6E5B54238F3EDC82DF6741055D093F4E43C6AC4978A4F7D00DBCF4110E6266B\ +70F7AE7DD2A93A74B16A3FD7AA249F6182E84094611EAB686DDA57D091CC2E156026D72B7D8D\ +29965F9CF1583CD921DCFBD57BB0532B0B502F4F4FF6FB19DFD858AFC912BA411310122987E2\ +84D9463112C879E9B0DD686F9DB45923A69B3BD200ACDB83FF41366A2C417CA841D9B85B7CAD\ +21681B8992D0243A6C30476B85AC2B3024A6331C160CDEE694D09416300FE4C7FA1B76F05BF7\ +9E5FB6880ADB3A1DB894ECC980A10895163BA57D36060C5596ED1AD1621161EE6068184EBF42\ +719E9A9918A819B77394D25D26481BBE51858A4BB0EB3C693CA99DF8A504E3B1FDC84A497312\ +CC4396F7C4EF1043B70484499CC24002737DEBA24D9AE4C538410887830AAD0E5C15498C5AF3\ +A24597306DD953E6B342DDB22496A66E156BD753F4876C26421CE720E2C3C864982433374351\ +3617A426374D0DC812C9C1568950B68F8A8EA1AFEB581C4F2D53C48654E19E4AB76BEC7C8D38\ +4366F207EAD9D044F8E5C5652A6A73626F5AD08A0C3AFB50DC9E6541E24B9246370F834D6E45\ +B4C8EC8D7F4C64F01EB97D11E8DB1C1EE7A489926732E8C8CBF6873B7B947D98F96698D2F2B5\ +513F2AAD60F481B39D6CB49485633CC81D1B98F6A7ACD09CDC001D13F059C1921B7AA5F7E760\ +05C51291F902E6F566439B9D2AE60A4AF32E939714B55BAC5E5A8E2053AD063E05738D03A704\ +441BCA926D069CA0910BF5D4EE3F81B4D8940E1B5980038339362F08C293A2F28CD0385C28E9\ +0D542C36BDF80172504110A03B3F57EC6F700D38CE039E7227FE6BBC8463057D92ECA65D:\ +7D681C0CA45B1919BB9DB6102FABF4FBB21CEF49BBFF6744D4779533839A414C06FEAC76C278\ +20EC237A08EB003D46AF81CB4354B701A8D0C8CDD6BBDAEBA2C5D7D1D089B6D530B787BB25C2\ +9291239FC3DD2F7FA1BEF55D84E569C40308D792EF44BDBD9FC557CD618B6626157567C45481\ +4009A611698576378B094988D2AA04BDE298B96AF7942A1DDA481546F080BB0D3B093B288152\ +C1DE21C7A6429A6C794AF36D387391A5C71A388EE30D9A887268FA4FF2E8D249FFD62BB6905E\ +7FA605EA81AA0E21BC895B333CB7EC253693A6A035632DF8FB6AFC8DB3A59D05BBAE5A5C49C2\ +0E24235082C55F7EB8573F18B3D379DA4188DDA7DC6751C5F20DE416DEE4C09E8A43D60EFE26\ +6F0048A127617255653B3AF4DA277A11D3391C4C4DDF9088A7B7880F8CFBFAD185FD436363C6\ +B36E9FC45FFDD896E502061A7B154B67D5A0B715AC4B970D27645CEFF88770290A3B9ED84E18\ +F306FF39A9C70E9EEA4DE6E661BF81D6178336E556A36A87024D7C2EBF04C10E19B8E5F6BDB5\ +6C7351B51345F2D6C29D5D1BB28B10357818D482A2015221DEE8798F326C223D8E382EE38B3F\ +2B68EEEDEB726F94BB1A33C5893AC6EDF050A90B7DABEDD734E269B70C5E3ED5300C370E8EF0\ +DE215A69799145B11918D2DFBFF65F80C00BDAEC88153886BAA2219EBA027B6B93B6DD6D27E8\ +A70F7318326E3A0F2937C6C25301A33A521C5AA47E609980C4DC03EE018A128F7A0EE614CFFB\ +F6081A89C0CE27E097EA6C639FECC0B2241B18651177B3FE4EBEEFA15DC588562D08D4F63938\ +2C86C15B99BB96AAE55F841F14ED67C435BDCF48595C0EC4D2929D75B1C4A1833C9AED228DB2\ +0FA1AAC9EAF5ED8664E56C586B7E5A01C2308BA61DF95FA3FCE90FB91B049C51DF7E58141EE3\ +1744FA1536A9516E16BDAC93E223C616ACD2EF48CE973B6D6A123944DD0B3EE161007F3272C0\ +92E953A008B0F1DA7FB8E2B8A2506D762A82D89AB1A60E33D1D96AA189A23F6D475D03F7C19E\ +F77A6290C8456EAC591C40E92CCB5B60A5C5248EA04E6037AC206232F3EA830661A344B82517\ +3426B31A8EFE80CB6C4B9BE4144B48162C63A1B95CA6E3D173D9EDDDFD712D56D9D6215102F3\ +43B35F9B36ACB7566A3BFBDB376F48CDF0F0365330EC35BF414CA33C2919410E429699B97B57\ +AEA59FCF3F21C261286276E9E2CCBB1E50A970493BB1211324473EAD9360C98703259BAFC93D\ +424FD2CFA0DE257BCC90C328F7EA2890AB3398D173E19CFBF3F43902B43C080612A81DB02FF4\ +8D65C214727A81F9F19C8C4E4C6D40EFD03B0F5084A9595A5C5B330652036E611452EF24516C\ +A8AC71CA5B7874C209861A12DD5CAB8E310784E82058E5B574116D6CD88D7CB4C228E5C44599\ +6703C93E73460023CAB06462C9858B19DF2329214ACFFD82EBF2F9ABED4D1E62B38FC2C9:\ +18B309BB8EC6931F8C1F224D9A + +2549472387BADE846341B6E3BE1938D72EEC5E11805ABD34DAFF0E8C1226D5BB797FB149795B\ +1A1FA79D5F24D91A60D7C664D82ECD90803EE9E941AA5DECF159698727A984522CCB02B024E1\ +EEA19AA163A6886175AEAEF0259D1103AA35D44B3D64537992BC1452DA51C9C133F118A88659\ +42FFD9BD48DEE841294BB59308BC6173A4CB9840D4B118E31C479ADE52D9D281A9B97ACD9CFF\ +85504C2FD4859AC73653B2F08C1C9FE2712E0BBB26EBFAAE8D5FF3261DF6C1AA330FECDA2459\ +82D406E607602AE5058242D7040B8A0A0F8FE07131912FFC80895B0A3AA9E3E8E932A5083A4C\ +987D4DB0FD651DE6E00FA13B6454237C7C03D069C57ABE94F2CC23E23E648CA81DD010D06406\ +5CC225D70657A5145F947D4C8EA3DA0695D7DA7569FAC76033E01AA3C2770385E8633327AFF7\ +BFE3B36FED73CCF8323AA2949A3EF3AC72F2D2046DB3B98FEA69FE98B3B9FB9CEE71ECF90DB9\ +0B65B27417A8E1656E8444D5EB6DBDA3AFB8BB527A26C51BDDCC47938254E38D58853BAA1717\ +4CE36ABE1F4708871D41E77F240795CDDBF5115654CF724E0A68C776F705CF1623989B8D2E04\ +7EC25662CBD1075FA6CAAFE7D911C61E30604E3361925B922D1481A071918F0F2F28A4EEE8CC\ +BA7FBC6FFE2C0EDC102B0BE7361761E6C75B1441B9D8D22898238CEA6204B060BA4CAC3F174F\ +B103947C08DE40753F3CC319E0EF163193173560BC94C0A24646F298A3F24FF1C4E6D322399C\ +6F92201B288218D443EA102CF2BDCB016FB7F4E1EED7D48D4316081484109C4F9588F8D909D9\ +EAEB0725F6EB487E3F12A1E653A70F3EA5542F68983018F5E9907BA9B3AA86335FC55202937D\ +0F45D43389846C51A121346AF692A00F8C4627A3BF58451EA0E8EC047A5D2275F944F67305F9\ +F46E58B218360810C94CA8295BCA1A3F4997133360683E8F83EFEFB8D27EA6448AEA02F5507B\ +5C1ADDB848B5FC185A934FBAA03E6FB058C164FF4E0304E388487E1C37BB83D3FA64E713565C\ +E976F9D1C6C69BE7EB6519E67CAD95E90D4FCAA8AC90D43A2074B41E0A6F7773B618DAAA1607\ +5104D9BBBBD97DD219530EE47AB277AB0F5A8378F6345E045CEF9D9C625D82F568912C131140\ +B98FC8FD5DE20D5F2F33A542129EE85D8139D1D49FFE7C49C412439F9B62528A1D1FDFF6B7E2\ +FD645E63814F597BD52AAE1D90E0054B6B1A7D11D3A361A46D0F12FBE93D236911D2A2D06DCA\ +1C9E71B6A439B75A5513077D568EF9CCCED07181629277AEBCBDD6547E0163BAD4CCECCF5CB4\ +2A87FC1764AD39F289135557B5F3448C8903C75078D05A8AE2F77E60D5FC2BEEB2749EF604F0\ +5442E1DD139C97545456351E0CF51248E9DDB5C18E5FA8D66F8BAD3F87EBE09D0BFC51402096\ +0A4EF76D357EA5B7338898AC6F27C1259A52B1687900BA66C665D8351777298881A7917A:\ +CCCF1A77029D9C52B4C36FB1C15EDC2539FE0A4D6F51CD45E613AFF6D4D71427F104DF270B74\ +CB9370FB847CE64DF227D9CEEAE19EBDCE1C1A281B5D67EF617528B86BC5142E4AB877236AC2\ +9B8E290B941134B8C6F7FFE8C4AEFF033543E30B0811624C77E0B5AA06988B46EDF62AF7EFA7\ +1749BB1E18C302B5254AE3469BC14C640E01F38B608E5311C62A47D2FF307A7C5BEDECE1B8B0\ +1A56165FF8F6D68E979B5C35DF532933635E4D2A9E4127D2B7CBC84DA74FA6E7FB88A923D794\ +ECA14E45C33F728D5FE66A43965E13F535060CBB2941979F934DF418A5105F2AF9C587B0260C\ +E7917A06C03FE5F345D3059FC783DFB513378B215D17849A671089A3A5A136B79438320FC79F\ +05D03F96910BEB415B744B28B80438319BCBF2681DA358387201E74D68FC65DDE18F7A7CE9C3\ +8342E8156D685CEA43087B5811ADD784413F4A4898372522B341D40EFB7A4F37BE9A9AC48217\ +7075E0CBBC95A4616724A2697566A827F18789F4A788B6FC5B98EA8C52D4E5F57E89CB4F56A2\ +975017B39C23C7CE80DDEDEB0D4B008CFECE71043EDC59AFCFD7B880C246F4F4370D733D7671\ +B417A39CB1AAAFE237EEB78A84F3DCC396E12694FBB841C8625D68FC3289F56E99D0BB17579F\ +8419E0676C8D4067DA5B4E0588D0B0F9F2A0568740475CCCD9E1598E905F5D6E8D2B3FDA6126\ +CF3C954CCEE4997BA4BD27EE1486156362B19287AEBF1F6965796FDFE2EFE976007510C0B452\ +A97035A913999F690E43D23EFF7F97209E6FE6FEB3031C5D59D2E03CA437A5318F9AE8359045\ +8F64D39ACEDDA1457BC9B7E87AC666773580EB2C2B6763D98DF65B6CEA506CDE22513090F35E\ +E5EEC1511D707E271BD8B279B0FA06487F9ED4E462282BDF4E532231F9465D5084772A152E50\ +203F185335C02CB65E29F6FF02AD2C0069DA80ECF10C8A8794E98754929CB2305E2830B457D9\ +DDFC7C8589A91959373279A170C7D39B25EAAF3C0A9CD4B5FBC09915C9ABD9B3BE52B1A645CF\ +E72ECC29D86BEFE3FD4EA60858C674F4B80514FC223C9551BC5080DCB55BD3FF5C7D6E506824\ +236E9168B43D038EA0899925318CE4AC85BDF007B5586DCBC226D18B33D17D6A2B66F478827B\ +CED487D62AC73AC4A1DC503045DF98B3C5C60ED32B769E2464EE09D212A8D02A30CD0841AAA8\ +EC3F21EDA30B2D6A2B87F3BAAB38AF5B5478E004A9F3B1EFDA02C5024E8C83FBBDD780E7203D\ +81F08FB024EEA7508BB554E98A0270B732445E2F57D50B82A943BADD2729CB728E356F8F6456\ +4CA55B545332BFC24FE5C4FD6613E5F82AD6163A9D45E22E3F871F7C7FEC2C784E2A886E781C\ +3B45CA32863C729149714EFE9D345E3758F9BA83E25677DB261BED30EA50689FFE39862C225A\ +605897779FDA656B12DADAAC515B4D05453B4DB307D5D441BA48590D0215547A024A6654:\ +00C03EF75295806B9C351F89FCD6 + +40B8DA2DBCBB6C202250FABB2FEA9315D78BE5208437616A16646CADD9D0B0AA2239BEB7E698\ +A7C764CF33BE1F3A783F0FEF0746253DAA0DB5C912440C58A8B4D17A4289FBC819E1EDDF2639\ +5C7547231CFDD2ACF6D2CDB9DB04AC73BBA3841E5BB476AC18E39E010DCA432C171D18CFA150\ +A2F8C913B0F00BCF61A976480183A777A1EE9280075319DC3FE8BF35113AD2AF6A8869CC6372\ +89D8845E2DEAECE42244DF5F8C3610E0BB3A16089D32A41887DAEB15534259A0852555AEA52D\ +7BC7F4DA9E8E93D236151742522873153BA0E3F083F473C0F51BBEFDB322B34BDE7E9E3B2CC9\ +729C48AA3C6A27C54550FAB48F805FE4C073E1EE4B593CA15D6E702154B3825DF5936E97238F\ +6184A7FAEB6B33C25F9C5E92009A0A5684F299AE7DA60B84653B4233EF0254726FC4D2319EE7\ +3644E510625F80D02FB4D18D210F019013C9B76421BB833DF3A852548F7DFEB8FFFF3168B326\ +96852B85B7CC62EAE28D3B4BEFE4591BBFAAABB5A42B7B600F48FBC8A56555499292DBAB37BC\ +69D93BEAEE417580EBB8120BC6016E1031C9FFEE3BB793927B632D35E2573C067D3200377284\ +395F995FC6FF47FE26539A55D6697C5B8C52FB1836B7A8C0A691DEBCFF4F9DFC32DB43B3DB58\ +26D4DAC23A1332D2F8EB52DDC4D0CD1D48A59D89A168EC5DD80D3389F88694DD53464BD5BEE3\ +D60BB0C20805CB1D62BF86F232B0CF9CAF75D2162AF79980CC4989B6F0FBB505650EEDB31102\ +0FB8F3844C4EEE994274E190A42B783D01C7DB90DBB237713E38343E48D53D923426EC428491\ +C446421BA13DA837FDF7BB1A3810FB05670760F9009C117CB02E2FBB51E1184402FF351EAFD2\ +ADB05BD0B319E481B234B0F1512308E13C91411F9C2D983B615C48055CEFB1003562C1D0B29E\ +88903A6DB2815C8B5BF146075CFA14CD8CDF59DEA035A7624697B1ADFE64A8BE8980D26AE531\ +AD9139B1F9E724A2E431D4B170F46C42E84186747B163C39A1D3BB3C2AD0D73E2FC19C7E1185\ +E40F8BC81D8931B2A86CC56A4A4B0C422031F8B93D5BEB68E3A26BE266F737DF729FE815B08A\ +2877A6518DE1B753F4DF16CB655C0A27B420BBFE0DC997FDD7EDE4F95F04F5D53701C9FAC435\ +3D4D9370C9438F418231C593FBA37777BEE9F42A912A70FAA1B82B711300E84B2DB12E872648\ +EFB2D91B4DD25F5A0B9EC113F76C9410C0A43B48E70D7D37DE6F505654BC209A42074E3BBDB0\ +4B57C1DC2C15033D60666C49D97EDB5649D6265238B21EAB2C84E0B5205BC671D457BBD1BCED\ +41D57E07304A72830E26DBEAE598447AB16A767DEFC3487487880A81DE64DE84CCDB06754444\ +5DABCAFC048CCEE7E5AEB6782EA6F1E67609635676A0F13830C3D5291345090C822513FEDE4C\ +DA4D00137BDE30683DA84F58324413151D33099C1869FCE3660BB6A30E11EEFBAC191AF5:\ +43BE6EBB5571E9AE73D0A4F11405E5A09A248DBCEE76D9FFF09318E5FDA50B86CCE4334E6F0C\ +F79AA44083AA896488ADEBA02C038543F7ECA4DA5B5110EB3AD4D70DE2A21A32B568F05067B0\ +93697A1C715FBB4685E622ACB8F3E6FE2C9AEB11897969395C387B25791A648C7A697110D578\ +7F32DB5EAAC8B04B24A1DBEE72983054ECD00A57E37A5C2169D19B2EBE8E76F1A99312C6D119\ +11239578C1F2009DBC09EA9F38F706AC5E59BF1DD489AE38F7EEBA9692471B2F342E87A4E794\ +BE9BB0497546B9D4D45E381FF3D45500EA202DC2A680C16BDCA210335BAC87D274897CCF48E6\ +E813766AF5461084289CA27FD283561E82F144CBB08A704647E980C3795200C465D16A7668B2\ +238E70DA6A81D93DF64609037D22CA744E7562C0F58506B899FF1339B93371BFA5F0230DA588\ +3634DE5C5623C67232358D3D38379B82EF5A3B08BDAFC618E92F3E8E65B179822B2421A6FEA8\ +E385184F17FE136CC4D9288E2AED7F4BC8D9C26106E40F8AD7C8F158906A0579DED7181B04E6\ +EAB501DAD016A098A8C75D159CC2898AAE7E67E2F0D3422433C4688C566FC0FC214628F6BF01\ +26C354ECB7A626BAD22878764A370F20901B39A3D16E9E6AAF9FF74A532712DD9A4CE8E24B53\ +CBC58DDCD96B41ABD04A2BCB4A6B968A053D31EA7D8F8D656AB9466FD46374E452ADCBC69103\ +98441669A1A51E1F80514FBA635B807BAD7A18D00F0BF39E44C7FFFD97B2083C7361239A6773\ +1A1A68B53829CA92B0836F94B76DF5CED8A30DCED3F6D231C2C386D6FFC86B9F556EF871E0AD\ +C52D66AFEB91CA512494BA5ADC302B5D30F7F84205F593BABB81F07C3C5AEBA649E40CF6EC90\ +3350A01E30D1C24096D4AD06462E914492C0E342CE333D1D05D0089125C04B82676ADEFA258B\ +A8C925E57C221C5FD169BDB26210F147E56A1DFB1697E7C21F8131B9C2C4DC5D5579B8E7DAD0\ +4AD45B1E1B8E2EA6A1594DB7034995653C9740D05C13EE79FA642448F1005B3DC1FB2AFBD2FD\ +4B7C5D2CA9D96A3F22286C26852CEBA0765AE8C11E189D8E979B385A2DD77AE9DFBEE9EAE48B\ +A0A068F9689099D360EB4C8F99C1978D6DF0F2F3DD2B721A9079D475E0CD066E287D6708B924\ +B78B8619E7154571B055E6D9BEC0EBCEB74EF927E730A962764B09D8CFFE90EDBA0A782376B2\ +C0E9B840F7AAD85F8374C741A8D65D3D8FD2A4CE9848BC6F259CA5D01151C11E137D539991F0\ +BEF86854077180285813C8FDB5E65850EDC53A4238005191D798A0876BE174980E1C8FEEA43E\ +53EAEB2CBF02BC69862D6B9771F79BD3FE544835D9AAB1380069246C930BF019FC0138B6ACB2\ +BB330238DF7848B423964C8476A8E5A53E0CC259D4D58971E0889FF10A04357BCE979C640FDE\ +60ACFA9FDC8160E78490CC6884A637BBEC35D47F3C5E1E93A3198EB398C47850FDBB3600:\ +1FF724B44BFA454A160460164B97E4 + +92F94DFA72C653A73AC33A740CD9C917466C163873B9D90F4F4D6C8FF427BFD0F24350EA3491\ +783D175F73437D8EC634AB63AB445F5B30BCCBE09FA9825AB28E326FC52CC33EDB529E92E75B\ +9D5E447BBDBF9BA7D6F04967E90A56C144B5894D3A3C4EA2FD61CC59160E656B7AF60D6510A3\ +19F043F0FACE3E9E8CB195DF5D2FAE6D45C3300092E26EE90E1E714F41F165DD22D27026A3D6\ +8E150AB7C6A81484E2A39458849BDE93F2654A35333DF2DE42291235E2462647AEB37000118A\ +358B9A3E1CA8130F7B48DB7BC2AAF7B5279B6995DA28D8942EB41470E30F9885ED5278DDA22A\ +69088BBA20772AEDB1925261B7480F73CE7837AE3FB198E39364AC30BFA6C20E7A8F95D0A456\ +A20AE83C028434545EDC952E091B12537625B9EB8487FF705478A34F587F17DA64EEC9B0E9CB\ +B609B9AD290A6553709EAC85D50CA733B35914FFA3A39FA4E0A0F53D8E2AE80D13401C328F0C\ +51C45EBD0EEA1E73F1CE5DFAC5F04BA4D6FC92CDCE759B73A30515F7EFBC206FF5D2D5F1E638\ +FC827349FECB9221DCBEF64DB66387CF2BAACB9E97ED6966DCAC0919F1FB2E0A0044E48623C3\ +1E47B40DE61AA82D703E5ED5CC7984FB73F3EFCEF355ABBC5A75C4CEEAF34D41139A1DEACFC8\ +416150A231729C3A609D2976C2482D7B77C73B27D8B20369426F525E8D0A32D500A155BB4E2B\ +839BD10556CEF79EDD1549EDC8C78FA6718836AEBCF2DA9D5D182A543C76A37168C7B1CC201A\ +FE0559D2995449EDC7E11EEAC81577351684871FE7CFF80642C238C4E376A7C61E8ECE2E9B80\ +97AF9ADE84114B8FCD4337FB0832FF59E9B6EE2974F5659F8401908300FC99B93B5703B773CA\ +EA586413009982BBFA293F523F3981E80712F471123A7235458CCC242F4CFBFA2DDDF55084CA\ +62819D4CF4F01020BB2586701AB99EF0E40CFF2AB948A9AAFA44C1FC1EFA3D9F2F47F91BB8D6\ +45EA0699051B83A61187B48F1DA5FF1E9347F8AFDD042BA30A193E06636BD8D6AFED22A8E67A\ +2E9B4BDD7FBCC80492F9D37FECB107F44D93F4C352A5CDF6A603F3AB39E78062B046F679D6CC\ +80D87CEE0F9F718CE8EDAAA6C8B2D6C70AED59F58C02E1279F18D68928C4AAF2688E8D283002\ +15531C08C8E8FD91DF26C06355364684B27826322A0D247E5866EAEC66AA54A30C97E71AF538\ +B83DB2F89168B0FB6737F9E56617DDCC84CF7CDB9910CAAA582B2D18CE103D1466F554287CBA\ +C753FABDB92D4B3500D14CFB5DAB5BDA49FCDDA541569DB38B046C063B2D1DF35CAEFC183C71\ +42B4A8FEBFBEEB25671E4B7844E82D7B11ED990AB4CEAB28C876764C1B3510FC50D4E4DAD614\ +F8928592ECEB38FCA604C3ED3888A45A8AB951FADAA962BEB81F5A517821DE7B319DA9C6B297\ +D52112F5BA0FBE0242237082BA2B0081F21A3AC1EDF48DDD41FEE7A227D0A3B26FF0DD73:\ +598BFC4E02D49D5D82FF1031F230B1E9D289648EFB03F8D9E7818EB5023066F4E5FD2A1E401E\ +B20581A69C2A084E0DE4436AEAEDBEF9504C7C0560FD2AC6E94BFCEFD9703C8B959BB9EED253\ +F4AD7B6BF476E7F122B5196A45410C0D8D53FFCF7CA72DCAD7E3359ADD694EAFFC5BCC4D062E\ +129595490147C070FC21BB903F8964F234D69B890527985CF28E003B0E82143F87F91B7042F1\ +15AEA2CE15B49F1E8A2A9A6DB2B0F0478847880418B2FACCED2F54E7BD30BF766360871EAEF8\ +1758C750E8D1B032F299152ECFFACF43E726AA158E26EDF352B185DFEA6A452E0EE95DB05CE5\ +6E5FE2F75C1EAC692BFEB433B17203118BDEC883591EE735B889DFFEE6880721D11959910A3C\ +0008D0B148FD73F8C211AA4CCD86E1BFF6C4C02B87AB5DFD911C00841289B5969D481B798BC9\ +E0E91BF409C6C1F84299CC31EC2B7ED0A84FD1D4A26244EAD85F81121949CCE7973D1A333F30\ +1269A1C437CA998A225AFA8394027381D37E598FC00B62E58CD062E415CC2D6CCF325CF44FD9\ +B56EEBB1F9BEFF521710496C63CAC94FA1095B41745DD697138DBCD71C096915874615DA84CB\ +97FAF5269566B4530744726C911AD5D6F078F9812091C5E6B0523FC9070AAE823B9226CEC9B7\ +0A36465779D6766A9C4711B403B207C9170E1739E56443FDDB401E1937F86E8319C8E093D01B\ +AF7A9EFC41D84DE3D20B60A69A9D92591E1D91D4209E987E5DC413A65994EFC6DACA40E6BAF1\ +5E61495043FFD03E94A7DEC7E98004B93822FE56E4FE51392E24DA1F401EE1FDA7AED2EAB149\ +7459209FDA614B3A69DE3F3B6E8222962A5B29F0A28859254AA3200A1F59DB7F36AFE39E0F7F\ +2B89011725672FB8B3F282186881476F69C782689D6D7ED426B1D58F36B3F2E6372BFBCC89B4\ +017DB81D350A23F59FAEDDD3C3A125A6AB46FDF3E8C12CF60F850BF651FDF60943AF01FA55E4\ +0B4D9DFD31442892B1FECFD0C7402DFE97F15F33AF0A1FE70EDB72F555594E67C22304169913\ +6F9D011231AE19CF6F25F5B400683D07B2C5E91BAB306EA3D7BEEF47F10A951BA2FD7022AF66\ +8117BA672D9A3183F908EEA212F5FBE3D7BA26BB0DF0E1DDA4FE80989659FF10CF5EC682E431\ +D7D9F0F232C39059AAAFA376584BBFC7AFED07FAE0CBC9B241BE0CE4A61649D97536A47CBD2C\ +875B9AB51D255684CF74A99687E7DB759056C46ED1F826ACA2BD9B0763340FDE52236388FC68\ +DBA8F620F07D2452E7A8C67177B1A51C74CF8C142E33D89B78792A9AD20A7402C963ADCE6AFB\ +C5D36592AB284BA52C11365E256FF4E9309F00AFF74629DE4BADD779E1776A7D797256FC667D\ +E3C2D11E27127FD24020C84FBEC99BD8AFCA2BA1A3641B97DCF4594CA0DA9BA814D4F73349D7\ +E04D3379C548245241CD5EFFFEAA0CEA8AF3A88162B9B83B743DA7E5998D8F00E3955F2F:\ +9503468A21F5695D3D070FFC76E14A5A + +19B7000075DF02A525965B3F59A35D09F38FC2FEF8564F7DD39C34D875C692833BB9547E1606\ +5EF7238AE95F3A39175BE680C63B91AA592C9DA6D6AA31372F25A3B95FE40DFC0E9B4F45C703\ +CE60E7A2F3700D81D7FB70CB958F58A841E0E13D431FED62A4298D73BC4D0935E921B3EC670A\ +1260C20FF7557609166D40D32A59AA67682173EA2FF7B21589A37E05054C413E78CB3B4CA675\ +A32B32CF92A63C3CB115340DC75C3C8E45F33AF4B31D8B4AF466E7E054AE8D447BF359E5BE94\ +A34B52D1FF16DEA89AD84811159D7A48967A29BD8840AF80677A15DBE3912D2BF2DB8F998B20\ +516B2197B7350967A5C2185CD6A0AFAB165CDE4C3D9CE0DE066B25EA297FC710B3CC21CFF4D3\ +2A7F7A0529DA626AA0A3B17E890D6BD1CD6E9FECABD07B8DC7D0860E45E5F3A071A1AF0D461B\ +0D9C94A54EBD84EE1B6D8F0FBB432C0A73212ED19B16461A5B30F3257C93060390C1D5A81165\ +F8B341BAD0057034BEFD47025024E04342099F78973E46F6E3946E7AF975856D28EAF281D230\ +77BDA73F1B908B6B88FB40FAA0164B3D6C8A32BDB61BF081C2C043045D2B2126E34685C87721\ +126DBCF2D226E2584A2C1CB67676C06EB19C9BDD7F4DAEB02289E748C0812723FE99BB09CF48\ +37831B59420363A5FA7E7877715273F7C48AF2CF03050C0AB2AFB8888CAE62F5DC8B705DDD85\ +1B8354A30D9323B77D9BC4167D2715AA21AA6D566F1392F574B5A23229F9FEA21EACE9736F32\ +3553C2A6F294A4060C7724C5D2F8DEBB5FC7BE61AB25752881ADE4A6C1C1B9230EC89D181C2E\ +DCD9C0393BB0E5C22CE3279B918D990368B95F9D84F98A7ADF09C4C8DA5CCA026D10A4635131\ +0F63913EF23831BC66F7B405EA97BBFA8D74C049C328FFBAE1BEF8AFB5CE8FB7EFDFCA514D45\ +036BDFF84045A911814E5B28CC44CEACC7484BE3C399028E31A585ECA083EF18182DDF5E95A6\ +8C86BB8249FE534EB66625CD7367B032234CBB52CC5CA4C49E233148156D45BA7A80BEBE4DC4\ +BD412777FF38A6A9CA268ED707C86F1C9178F1C51B69F3BBA9A751758AA2A66240ADFFC178B4\ +428830B0D6FF04A2183224B627DE686526D460A4ACF890DAED0E4D2F181F692AE66336AD4B40\ +CA11302F0D4FF97AA219B60477E2FAE0A8682F4B87D4507AA2EE2DBF61F76E8A289030959812\ +D5BF2248271E10BA6D83BDB71FA6BFF16694EC5F8EEFAA2642B3C1C661BD3C60035AB7E4AFE8\ +A1361D2EB0845F6DD37CD5F8EF5AE403D9436DAB73F0D3DD408F9AC933442405B3A4C2156EEE\ +E9E4FEBCB41774A96259B7C45F513AC24A8B8AF555355FACA9732A8B95062BCDF1A18E09F75F\ +4B3D7538117E8E8B449A212A4ADCA3C6724799E3B2AEE646F31A3EA29A211A4209F93161E876\ +E9138C4B6A4B654A08184A4C2330F2D7FDA7F9C61784E4FF04F87ED6F30D95B857B022A9:\ +4D8DB26DD443C4495849B1A9F05D59A64B88C3BC7C6A8208E02571799891D1BB268DF842E162\ +43738DC811CFF37E10E0279C828AC5922191D2282E94B551896B6C86EAD7C05A7E25CB5854B2\ +7D1A3680EE75FF75E5F5C2E421BD7F3996B19F5074A2DDC87326F7CDCD0CA4E56112C6242496\ +1FE8A8FC85CA6E56006E5D9BDD1A29CB831B9421E89C2038BA958BD00D596CC7F6440C61E922\ +1F3642920ED9E1634924986D9AC1F889A8B02819182E1EDCCD96F71244A9BFAA2097EBE53B18\ +222FC15B219AB3E410D7272C8BC8CFEE1696A8B90E2B0F9D4044728DF3BD8CCFF988D5C1FA67\ +9BD78D51453F796022E7CF1AF96619E999C3A574EC2C2822D93B4E0E9FA31C26429019F59D36\ +2CB996764D2246A8DE9398043BCD292A1E492C794F7E1DBD02E3E0E73E7CD381257C4402A8FC\ +6AE3E686AE844241F191DD557EE254E1E8AAC99A3E946682D317563C473D653DF8CD5818F615\ +651EBEEBFDB2E8E27F744D4B830C72B69B235EEC4AA2431F8F35B8C73C359B718161444425EE\ +5A70F8D965FEACD187ED4557B56260AFF9632E75E0609090B9F130A9A9B81E53C83AE23B36AA\ +78ABB50AD0CEF64262D7B106AFA9CC1EE9D5F61A6EDB232F2152902BF0AD86101CB7DECAE8E3\ +CB63A515468AFB873D8AB5C3D3F132C2BCF29C8EE9C98E7FE3037DCE5E1E365D0F5BC3319089\ +2FBDCDCDB1B9C49315319DD3F508764EE6CF68394D46A9AEA9DFCBB03E3C60E70989C5CB645C\ +E060445D2FB569F8A7176B067423EF657396CBF0475F2A79BDF714499F642A064210A538EB16\ +2C16F505AB6B2C101DB317DC9907BD8FC42CAACA246E8A95A2DA8270E2F32299039E36CF1AD0\ +AA880707318D3D998C5DAEA87A5746C754E3B64D121E3D22F2359FFACF08D9C5EA0AD2D6AB97\ +60B4189CF532686C8E137255C220BED27969D24AE1DB6785355E7C789FD8021075E243FA9641\ +2D087010B9FB20B10479D055F7B7D631F4B8DACC3EB5DB5338A94775F9191D8361D095E8B29C\ +56A8206E04CDFBCFDEB8AC953D3425F41E1A6E313FDE132EA0425BE42BE8F4903D3091B894F0\ +8243F59760CD9F3FAF8D7ABF567A927A99C8660AC55C37D2E0BE845A91A47AB971C684A28889\ +BA53A2CB81072FEFCDEC751E7D5A0AFBA49E31A110B533335ABE1A7DD479E20BB84B73E87BE0\ +C6255F9A961C68BB3648309D2F8BEE5F24D4A30B8690890F0BDF36980981FCC7BD98889B8DB4\ +087C1D0C20022018BCFB0A1B22F330F0AEE6AB795C099C214215003087F337F574DE917E8595\ +745DAE00494E4339F634F3A2E98F80380A05F9FB871C1D14719D7E95241ADBD9E60D96EA5097\ +8234BF71BDF5330B2793B8E546E075527A0965E60064C8AA0B2CF5D2EFFC063241D4363B1893\ +271C6B3DBDC266FFC7B9D6644003C1BE5CE1C0F78A7FEC3346E31CE674EB59046327070E:\ +165013851816370C99C2B47DEAE6F41DFB + +6ADECF136BF4135FB584DC375E92B88C14F8EC184BBE9371A97045A7C3FD0825AABD14A4FDC7\ +F587BB5C0A7695F738DCA4A3CF362058700F4DCDD4420B6C236B5B527FC66CC6A13543A51CEB\ +9B42B21C9EF4B368B541EB880A2AE8A7C3D9A94AAB6C34739180F07645B7B523B3C05A97AD09\ +3B0EB7010433BA92CA744DC5190C05F96100E79A3C264A4B81D114CE98AA84F6B1935EC21C5E\ +A5035756C10399BAFDC1AC3A42BE5611713F5FD764F7A6CF3DAA97B36733C1AC71F4B4C3E078\ +D95A05D87424689E70CA8536233D733FB9C9AF9813AF8670CEBFD81DA31D3F0233E0B8AC6CF6\ +5F720E5A8EC0447CCF961A25A68A1E50D2D1D0F87E0089EAC17D5E778243408A9CA33AA73426\ +BED6EF146FE083197DAFEE1E7E08080A82A61ADFA9E2B69725618C3507215A9F599B29E43E89\ +800ECC4AB9D6050B094D4E22B4528F9874384CCB2B87D91875897544806A1BE8E141EC84B9B3\ +410DD33A1DAB0FEF1F65ED0B8CF2C43307D86F210B652E6684E6AD5A5CDF581AC46E5E7CFF68\ +E80252F1CD6A8A73D13855D5C338B8F24C8A52AB4C635A7C895B365D296AE3B80AA73A514299\ +F996A574D7FCED7C249CF14E3DA02F36810AA148FB2FE42BA08104FA3C04B2D363D17FF53363\ +D2D33FBE9DBA4777BECB70692BE9DF4A110327E89B1E322B9384655E941A12E16BEB88EA1600\ +A5657F5C699407E132E7D9AE03D3F39D3F0E3A0FB459761361DF949020CE3B75AC49B58047D1\ +D818F3443015DA8316B10DBEE7F8629E901F63AA8D2EDE58E77CEB5C0A94B05C4D87ACDD3B97\ +6EABFA39C4A5862A4528166364CF43C608AE1862158FDFDBD599F8DC1B67A3B6B6FBC296D538\ +78F5A01F5DD6C5CE02AB9D4BC7563929BBF3BFB8C7A8F603925E99F98E02C3CEC3130959F6CB\ +9FB0CDE693A3FACDDF06A33E4D766FC7E01B3C67BA4826B0656BD7BA9E7CEE5504524F47EDC0\ +642B707BE5E11ECB84908B95488848871FFD96DA278AE7176BD8704836E248CF9F00CBFCA2EB\ +EA155D240F1708112AB0F31904FA684C3AEBE5B9F5486D8EC0ADD1C9A877F3B49E5DC7305F99\ +B0DA97D453EB9D1ED41DB5CF025100D048404951DBC804F9152B976C0B08F02D0117DE4FF023\ +1158697E4DF098D3BE1395CA873BAEE64C36FE3138937EF55D5F098276D20EB4F5D19F99DBC5\ +FB88D57890DB2728EC97D1FEDCD38F1CB2D05FA103B66F591D37F4DFDA80D7F11378956012CA\ +2F5E32FAA082565420EB91476A337CD813665DCAC92FFEA96B4300583C6461C231C7654C8CEE\ +DEB775FD968E5B6F2BE3A3A29EBD82AFC4E475FC4F71ED41C6FD825596A3E1D653F09DF2E117\ +1ABFDBBC70F69A7AB8712A03A807EE56CF0A2E2C1077F8C7C5C25FB1E981A1F837720742D5F1\ +91D5F0B8C6FAD60D4046794F932A03956CC5436C74E9400C6F40E0F35CF54939C7851B5D:\ +3142889174F9F5FD84846155E4A752B91E7A9E549EC7EB806A046E3ADB941AB1A188C1BD0EC9\ +E93D60A1164F440D0AF639CFD40C6E17A20B24D2012479FA01819EF6DA4306C0E642A0EBC866\ +E0BD1006643D120D90C50B224BDB742BC398351FF3D64BB7CAC968615CEDAD679F64C304B49B\ +FC7E275DC66C0B56817F810DBA4BF8CC0F9A71A26AD4E784918F70597474C3C2D7C526F4856F\ +5BC7A939B5F129118DD1980C2044C8C843312C0DD803E9618EC77731F0E601DBD62FB0A4B2F0\ +9DF129E054448F59C965DEEC1B04E1865662FA4BFCDB9DDED13A8FA7A6D594F2ADBAF45BCEEB\ +EE017D04FD1CFE071012EC258647FA98BAAA9628F37460289AC598962C1080A33E31F2ED07E5\ +10A15092E0374BE6520D892F0621E95D4C7385D874DC8D6A5B79B18E942DAD742073B67AAD20\ +7FF9C7F61CA858157C9164592DD268C6627E7873C13831BE7FD0666FE8BCB7D2BEAF2FAEF2C1\ +FAB74A8F2B8E8964BEEE7B7CA9F4C3F58DC3242AA6E40991AE32B082BDAB5E784AA9BE0C69CC\ +386D4074D4125CBDA87C40FF4B6B563FFD8431EC4AF544DA3232D78CB944592BF3B48F912F2C\ +E5B8872631CB34FDE7B204C0E661FC9D5EF02070BCFDDD4EDEFCAEE5DE676740255BEE02087B\ +8DA08A6242679838DF4263EA73C61FB73B5423427DECDC131E1AB0A485C87ADE2A3E6A413059\ +48010B49D03F1AB428243CC98C43407BE41B715752E9A7B4342C21B16EB9BD740511C75646C3\ +C5BEB0A8A66D2A640BAD624387D8B0889EFB7193642EB0E8A7287EDEADA7DB365202C1645B62\ +2B0EAD1A8BF2290CBA6EBE9937428A61F3C5C843997A72C4E1AA71622394533630EA54436061\ +EA3F34FD4259CBB3694BE5E5303718FEE8D548F6C9BF03EB82F5693F4152638A66116249E32D\ +68F02973258D516B9DA2ABE8D13C5F189D79A61284B6C0F4204E6FA9B8B7F0401E95B569C460\ +6F3E5D8619311129BE3D63489DBE29F47F4116E786A1312EC53540FDA97F8B2C118541D8660D\ +33BA282B7BB43AE1993DADF500394C519F32D2EC5BBA04A1BD02E9AAA084E127736C7486C878\ +C1DA4D82CF94CA06732723197A0718B99FEB0504F01C8B7BAA2F09BE0DF739658A703ECA0098\ +9A0B608F9FB4627D56FF08009DAC83876AE0856E42B24B3A5DD6DFF8D83CE07EBA0F21B570C0\ +F206238D44E966D63DC94A2D715C9A56A7F99309F8A512801D57000BC59E57D2A856CCEF243A\ +C153822FCBACEE87C41A75153B71ADA7B884B75AD7E5010FD3C9230230A2545E784FD029C0B8\ +6F81DC4E6DA708F03F6A5167C5C793EB8FC29F51A3263D67457A631B37D65769BC9A252B761C\ +2F3E982C4E9F1CEDE6A7E3736DB8A7433FC58136560AABFB36A2C3495AA8C1E0EFE79BE95CA1\ +C93F3857A9D8E8AF64978D4B0814C480906A3CAD1F34FE90003B2C7CA883977ACC62D148:\ +BE6281335EA5230E73E784D383537496C36B + +4B5B723AA28E9E0E919A276F20AA4375FC4FE86BA5E9A3C62BE3A5CCEAFA5D9245D4840F5CB5\ +0B75312CCA8A65BC43B4138379EFFDFEDBCC90E6DAEA4BE65ADD65C765AFBD0D4D76CEE405C1\ +2C56DFACD8B17A1F4C1F91E108C30E529B8EE8544A8B7130AECBD2C208BB841F5D50BFE6ECA6\ +D262BC2912A1FB4EFE644C9E64FAE643A9C8D554B6DEA630D4BC2112E898CD8C2F9BE95FAF38\ +F7263113336A2FD99D2FB5F3C1D0F977CFE561019C51C92A171D7E271FEC0EB225B55A776414\ +2754DE8A2F9145BD5B9FA8CB9847D3813FB5358043799C7E3A78FB7DD8938FCF4E064D79782E\ +01DEB5CFF083954A687EAA095169E02F1C8CC3B5084617BA9B89D542EF9B93F213DBA1B4ADF4\ +5B87B14394E6AF7C17C6D79F136DCBF909DF8FAF62AA70726998CCDAEC519AEF238D71FC031D\ +CDAB3E79DCEBE2A7A6241207FDF5B66916CE31DBADE4093222B0D1ABF69A9FA90F9BADA3373A\ +75F18625FBCCC20318B7B7C1339CFAE3122A7AEAECBDBF807D0C4C2BA882467E1FB72458B70B\ +31BFB10451202CD10AA31E12587493E66B5282B2D8FBFAD823472BEE1A66F63F0471E985F10D\ +A9FD43B7ACD6EAF23C56AFFC83192A383D9B69ACF3033A1216EB9732F88944334EFC31F81892\ +588F1D197ED9BCF0DD40F7EB3CC5A9C22CFDAB86CA0C89C638D1035C978A54E3BA544EEC2AD4\ +6A8D57AEC61E534139EAB0ED4095EA8CD5EB132DCA6CB7F988C7A6E0B9DC9D28F61781415666\ +036C39304A62C6482B851819F2E0A513DAFD2CDFF8C8EDC8B6A3966A2F2A9E7BE68655CCCFC7\ +68FD92DFB3565A28AB967CB569F940E09FED962BB21515D5C753ACAA3AB2F76C1FAD84F30CA9\ +5809772032E23E2FDE043D563FC07D1289989E9859CDB8074B361D06384C295B2943182D7C46\ +2E88E8E0C599D1377389602CE931142C5CB30AD4DB3AA6D01BAF616EEE1922379B30127C643D\ +59C134298BFAA172376BDEBDF0DD47B52879172F96B766E30F669252D126E5C0837FECE300B0\ +7EA6926BDECBDA66C8EA66B636EEDA74814486E1B3D20FBCB1B4F5DB0A915E3E4D2B1AE7C7A9\ +F13557110CDCC0E71AD28CDF566D97232458F01A803AF9BE6DA0313979D66791130A8E3CB111\ +101F8A2710D0404F32B0CA2F4677B5DCC34542B651491DD5D173C93247657C181074F68223E5\ +440D5386217899F939835BF19889AA6FFE59027A75A38B32CD6975C3A543B37FE3FC52F4DB66\ +BC012A14EA0E2EFA6CABCB6DE0BCA100E60BC25BFB54FD5B23DD0C1A8229CD0BE80B7CEE710C\ +A8598F6B6B5CBFE3F5566B8B15CDFAFD928851E07D6A6FBE26439F1719CA648ED6F4396310B3\ +E128A34C4D5A17CBED908A2394D17186ACF6F46848A6D32FBD5FD8BD14D320E5346CBB73D2A2\ +FDC323F5A6216559D7D0C177803FC1D9EBC9859F71E85E34D3C00A4C364068088609A5F7:\ +251E008BB0445ABD75C166586B0AFC536ABF124C9C7A5FB568EA647330B5D7EC79DFB57048AE\ +CDCAC37400DD26BE375884DDD8F7B6EFDC93DB9F62F393C1987C45B7857ED49747F7FA57244F\ +63F273F3B51D86FD2AF9CA6755568BBA9FA528E0FB43798EB0315653F495727914FCDABC0FE4\ +3EA93AEA5893A1E1A9488D5889D7D3ED05584174CB3CD206D7CD4C117933487768A3670E283B\ +295807C6B1E15AC03F46782D70DF796F3A9ABD41D8F1928502F7197A99AA6112919D7B6CE336\ +2787A6A770CABFD4650EF223D1B566B1A86EDC96DC294669161AF5FB414D6EB0912ABFC11436\ +9815BF5B9805EFDFA17BD57C8C28CD22A34EB7FA23A1ACDD32A66BEA2B382FBB29FD1DB18B8C\ +3E539B42A2BEC7A14EB06907BAADC0E003FDD9689E26712B3D99261B4714FFE846E5425B1BDD\ +90039FD225EE93C0310583B7D7FACD3CB9644C9219DD9EF05BB58394C6C3C2FAF455AD50558A\ +80B7C6D7C9F4DC2B7086C6E31EBBF9446665F8727FE0AAFF7C483DCD3AAB34EDD181CE00393C\ +93A28C280EC9F6513F0787689C3EF4B98408C110067BF3990553E902D5D3CE1F7C4473E7C9AF\ +84CAF731B5A31D5994E5DC9D7820820EFB514C8BECD773CBDF6E818DE24AA4E461613F7859DC\ +0BFAFF61375BDF20956F66EB534694D14DF29A78A0488CE3766BC85C1FBD3999765572889BDC\ +A13897C09FA11C10E2FC2B24C591B3E3DEFE7E0382166CB2551606876D98B2C77B01B84634BF\ +34C26EFE2C8B4C360DD248D63734ED6B7C9FE0487321E0AB25D428A0486404DABD837884572A\ +0B0E9F343562D7B767F2A5C94856E6B9E3832CBF063B525352DD472275103CBBFA032CE5D952\ +911F00BA5A6F33461D2D536E341D09C3C1F1B5C1BB9BC1014AD9BB25F2F19D4AC04347DC5440\ +581D4BACF25DAFE6B82F526736875EFCC056FD89A01DCDF72FEB0DC70E12C2243AB8A28F9637\ +8B1633C9BB08625584F10E80CFF77D050A81A2925231D08F215E381ACDBCF11AF61964185611\ +435EB7C70CC18A2810EDA5B55EF5A622F6484D8E579C7315E78F0EFEEF6E4C85A7712259682D\ +E4003FECE559542554B36AB37CBA4B8BCF07F88241665D806A0A213FBE1F98BCE2895D3BF642\ +0AC591A8FB947E6EF53780E2729F45677E06E425DDF65D545A9177FD99B53BA47B46AFD200CB\ +9301001B309FCDEA4CBF2E8EB9427C84EC9E560CA4748061BAEC60D6FEEF6E3A70679C77066A\ +428386050D6AF7A358A92E3357804DA0C61DAF3335EFB18750519B9B7AD2F3677462C5562461\ +1B8F0B4278388422AB646A90705AB52D65B2C6FC4BF295E59EE88CBF8624F1B03BE99513F1A3\ +C922F129ACF665797D56877283F60B89BE4DC0F803762F6072EDA1212C9A6E3046942BF97933\ +2386F83F4E6938A2FA6B951C4D419594A37C6016253B88DECBC7C9DD39E1164A9CE64BAE:\ +99972572DC537442E8C105AC248DFD511470CE + +A29E49FE59317DB85DF4CAFF962DA6D4DC94594BB7B195DAE82B7E32ECD55854762C857CFEBA\ +610B39D2F9D8091B38D6A225AD2A2CC2195DCD5A80ABD06CFD12BE30E914C1FDDAE3BDF398E2\ +3E994F6877095BD1EC8E48105804650D6F872229C7F0B17C8C9BB9199A1E137BA50A34D8A626\ +C0DFD6AF1875DB00A498CA6F36DCDA712B2A0EB8FEE3AE69F2B6BABB9D779798234165886033\ +D91F5B74E86A91E03513817FE24CBB71D4DCDB3D0AA421E7256E3F1D7F332FFD974403EAC2D3\ +DF374881F9D95258B29E46315D326F08EF18909B2CA4DB8526BCA9B06672940423D9B039362E\ +1CD8EEE68296584D94EEB2162C3735E099519F694D94EC732D59F4E1413601E8177D379CD4CC\ +788DF64CF234A8B1FCE575A803DF5FB44014484D7C9A527B95EDDE983A072DF17D042026DAFA\ +0E3B2328626AA8F84C8FCCD98E321C8012B896C32762FD7BED3F0636C6B9DBEE15EDE2AD9634\ +477F9D9F0C7F8287A1D1C77893E08A2F5C2590A6B8260862DC4AEF39E7A0A4993605064BE04F\ +F8E47E5659EDCD0AE97F800A520E587674F423728EE3A70DE8681B929CF6046551A6B90D13D4\ +9A8855A17EAB3F4C3BC4ABFC09A5D3A1876FF119CC8A75623DF7A8731AE551687FBC8E93468C\ +9E3FACC033A254E46A20AB8D0B9FD4EDE15AC81DE9056145339FFBB450F01CC801E5443229DA\ +BD75E391EE7C2A62678F851F5F1D6C4AE6FDC878B12608A218BAA1CB258D42C16A84DA809A66\ +772B5EDC39D0AFAD4EC22653FC98C15A033698F1B4671B8EC331A277B489D1B166759A0CDFB9\ +97C19CBE2A500F474E0C856B1583AC5C86A655208D2715E3D47A553BE7000C8286B749C850F7\ +15F99A971C51CD21AA58FC37ED1E7F2857B21E1FBD183AB8C5C29457C9F5072D5B94A45A5391\ +796ACDF93431E494D18958C79AD5FD9BE02D42C1FA05BFD360A62D43A4F07406A8AD0C677936\ +35C3EAFF28F24FC01360E4598AA651C35E9944CDF1A5A4ABDB0F925C03CA2ED9F3B0C4C76114\ +80023BD8812C47BD61622CC01FB7DD8255279C6B17A57CA938329B80604C36AE7E847D7624D8\ +D296656573A24970EEBA52BBE8420AD06E9D312F05B6FB5D1D45689A072701B0F39AA226A4D1\ +78876821B54430F96D480693E5269B551AC45D5E48007D026C451FB9FB9106AF072E7591C6D2\ +9803C75D5345A6BA0AA27A9DF7C7E15FFA47EA7AC241304B6D3D511ABD0E4ED9D56502204009\ +0ADA249C10EBBB9FE0F7E02922005234428561C7D4A96414443FFBC3144D4B354B50EE52DD31\ +DADDF3DDC8B7B2C221F631279D5055CE38FC5ED54D5D811D84EFD1413EF352B17C94CA7DA223\ +9398896B1559B1EF78C657AD8D6E968CAEC86CA22BF4706FC8CC1D419C6FD40F502C010C65BA\ +AC9394460AA133332E342904C7B4106D1B84A7F6C73599F7F3FA2BB0255E06C133556CA5:\ +C107C43BCCD34DB295D0C6C64ECAA5E37D50DC0A88275976E4C82D93527BBA3F038FAB94F84E\ +F875F0E8357E5459AB23BFAFB1DFF7926C7F17B11B47E93EA1D5E8DA1295C0378DD812A9C87B\ +7F52C21E546462063EB11767774C83D95730EB5FCD1A8DEEE223B95D6F4F5BF16C6A00B5BF84\ +F2DEF735FDA064DE08F192E2D240FE7A77CF4912DF51BEE784A36680F5CBDEF5B85BB912104D\ +6B0B888FDB40B4B90456662E1FBEDA2BEEF8B19E171C0B70B454E10A847ADA2C0760331ACBC2\ +3EDE26010ABB1D8166165A88D3F3A6D629695CC614048529CA98DFF0D801687587A4857DA083\ +2D14BC954ACA4E1FE5000B9D37D2DDFE89115F43811F2DF4E73A31B7A0752CC80ED33C53ED53\ +B1E333C2C9EB63843A46B2C40D81315321B657A2426711DF4652CA64EB671E1365C3F32AA90A\ +29441709B77E7D18D9F2206B70BD91ECD39A2B17240508BFCBB2C2EA04EADBEAE814DFA98EE6\ +CDDF7F8023CDAAA12B5E0B6219EFBAC1E4E4D108AF25ED9CCCFF52859CEC02FAF3E809413859\ +EEDD622BBB2B45570364E8205ECFFA530BC98F464093F5A4473FB6C3868CC1691A36CA4F4AE7\ +65312DA992E74135EFEAC2F5FF8F8EBA3B17B88247293D6C183418A50E5C06722E0721FE105C\ +EBDBD404714E23355EE78116FE3D0A561EA5C6DD06F509EF38B31EE88B941E13682A3A54648E\ +D7ACAF6DDAFF80746363E7F0550B7A306760480894F6D4B9C449C714F9DCCAC680A494E07336\ +8C04450FCDE296960C0021F05774C2E53308668A2828BAA39CB4D98809BD852A3A3864ED1370\ +48AD86E121953199C35D955F606CCCF2AA11FC873EE4532F884D9C5E72DBB48FC220D2FB3E53\ +F78BC1DFC39F8631254800A47C83D85953DF95A58FFB94DBD5EF36B456E42C513D083CAF5A5B\ +DA7014759CE8646EBBB99E5AA6F8B996B5389DEE8D4FE2F945EE68A6FEEEA1DCE81CB55478BB\ +87C60EAA1F2D5D7E4F0380FCE0ED00FFFC05F60BB1B685F1E9AD0AD42A7330A9A70F63D54BAF\ +837136FB53203458919882F2F67EDCFBD631D0EFAF6AE2DCF75193C6891A164BAE455E1BE35E\ +93FF1F907B049D56501EA27DA959792E9716F7357182C87E5E68A78A92E603EB82EF4D175445\ +7504D07EAD8F6C13A855A2A458FCFB3D6264BF0C8C79BF7613A1E703E44EDBA5FC4424F86556\ +BC98D89CBF9CA2280F4614AE53AFD3B31BC0A45AAE6FF0744ACCC3579EC6BDA9EFF4332F2EAE\ +C9EC99024D8255C72AD5CA75B2E97004717D04ED6484B9B13B1F3BD1E9B39B0762A5560E8F02\ +DBDAB9BEC8972B1283F4267E55885DDEBF764E26D050D9A148AE386850DD857BD5A3568A0FF8\ +F172F5B9754CCF16D1BF4BBC6FDFE79A51466E9DEAA38C5EB9144AAEDADF7867D7B866A7D76B\ +5BCBD25165BBC7392A3E51ACD40F71919957FC23E19ACF21C5B62DF36337249CAE5FB22A:\ +388E2850F2A8DE89492204876A7DD8A3DF568F58 + +40F2EF525F91C2B7A8DB54A86E4CF21B08EF3C7C34450374A358FDE05B75C166B02ABBA087ED\ +9DEFCAC5C38F970EE7B83E932FF490B7DB64C8FE3DCDFA7105C5CF67A159F3DB52A6093147E8\ +C8B7E066723912A8E1D8B9618BBEF57B1696B7DADD547C246F74912282711303E22FCB202171\ +F5357BA41C6D5B5FC32D1FBCCEF5B0A090670AD75C15A7469717FFAEAC7BC588A8D9DFD5ECED\ +D786BDE5EA70762CAF3F2A159CB1FF8DCA307D2DB822C2DF5B1C3D81FC9D992781B6D5215B3F\ +4442537E1DB75F3CB1DD53E2F26765F9172DF5ECF9A0E572774E8448ABCBAB3A63176B7A8090\ +984C5EBA6AE2CFC0872AA364A5A90F0FE6C72AC3EC5873FB84B908487438242C8324CCAD23C7\ +9D03928832C3153DA6D5D5EBE50D00F844B85928F04DA60B3D4C2A81C9DEA01EFBCB94FC7FF0\ +B66AE81E2A85D1C28C5387CC2B6549AA7B6A5FD940E57057EE2B9A98D490DE3A40FBD493CFFB\ +B71D0FE44F58110C2830DD18AA017C0F45480C7B404C73A3FA756C807C8C569C29339933321A\ +74EB2D1001754C5CDCDCF80C8CD3DDDC5E64BA3736FECA5FD9801B54EF8F6F780FA4AD09BBBD\ +B87DF9A07D88B005E803AC7670B236F0C508CC874D120BE45BC9997CE2D56B55F94A547172E0\ +46A01C18A63BFF3BFA7D60FA49D1856E002B36EF6D38DF71CD1E45CD6FAB59264F6550DF8459\ +1FB7145BE757993AE5B9327CCB5FA23C2AF8B35D50F17662C6A8CFDC0F0B47270D84F4CA8FD3\ +5597D18C757D4D474E788098B759705567A1740818D508E9CE6593191820F1735A48B7C43806\ +28F725D86BF1324843A4D85C2DDDDABAFD0EEC45265D95FEBE3F9FF87363F073F1C96E569861\ +5E9C841BAB30EEE72D2C559CFEDBCBD21AFEEB6391EF578B8E6F393577D9B3A36D269E65E673\ +FAFB0FC582DC899C8145DF1DCBBA1689E3819DCD784106EE6642945ACC8C9DC44E45015C02C4\ +084416CE7E19322DBBD5FDD55B35385AEC50308A4CF06EB4261A638D681344F48DA7CB2E0EAE\ +5326F54DE4589E8951B7BC42BE7994FB64AEFEBDB7FBF8949E6D7FC360EE722883A3D06ED3C3\ +C2D0EBC6AEAA0606543888C600EF69C444F08C1DFDAB3671F44C85B0BAB0FC91712D50C1AD97\ +9F32C25F3C9CAFCBA9E8C82817D4A1180EB4766CF7844A27D47067ED7376E071BC7DEFCFAD0B\ +8C138324D77F54E3E41D4BB8C33892B84860F97468223D3F155B04698019256A11B2A20E1720\ +E6F40BA100B2D887240F78EF499A5C253385EE2D4A491CAE743FCEDA6C1A0C585992167B6039\ +954774262A9F604A972438AA52C4228A4A30C7830272AB66E23458BBF3CF055EBD6566832951\ +51B7C60979A87D806432FCC107C5F533C32BEB0D4C412A0EB7932840B1B1414A3B091BB69201\ +589E2BE699029E09720285581958F71A350A24438541F3D05CD921FDA0FAD525BFFC30F2:\ +59CFBDC7D164AA6051360ACD53540489ED573B013B52305E530F3D51BCF8FDDBD35DA519C9A0\ +66AFA8E8D38E9AA32894EBE216D09C6B28454B2D1CB1E62947E3C7A19A33B95EAE69B6158D7A\ +179EDDEA39CB308B36B8F446EF02AD0EE039225376000A6717A27D8C7692E3D9F210B521C561\ +A8D46E022D56BB93F232FEA37257EB30EF41C92C727126FF7058A7DCA2C5649C3A5AE6CBDB5F\ +B9C5CEE676885A27773433E1E3756218041AB4F95E71771DE5D52E40A425FEE63C3D93A0886D\ +4C56E69E0C01954249210F792B19BFC25C3FB872EC1D9BB94CCDCD695F43F5D7D1210A803539\ +AD9B68BBBF893FE055D715A8EEC0A289D77A3FC8FF9F2B7B6994E476F16988E6DE7E002F0083\ +EBC007F0CC0FACFF5E0238ED1C0598CACAC390FC03F75B876E8B8AE1F35E1A64D3F2635ACC52\ +618004A21B0F8FC204AAE2F8A84FA419A930D266C619D4F736AFF6D2C1028CBB129C355678B5\ +518645316A3F9C38E37707548CD38A24428A989E14EABD3AA8D3BD1252496E458193C5CCFC39\ +19602987E4CD4C8264E1B8279B598A910C235D7FC9C861B517B59ECAF0B797F18519420A993B\ +016C9A6728D707EE7EFBAE8FDCAE866DFA3686FB5C65CCB11A9DB7C7B3D15E8A747679BC9DFE\ +B2177698BE98A216514009BD1BE3C62A0234252DF983DF15969E97F99DA7913BA518C52017B7\ +EEF0B789BDDDC3A083BC1FF8018622CD3455EE108FE7DD5BABCAE1E0E88264016C0A1FED524F\ +EDFAC1BAA8D9D4CA330A27128E2F774F3134CAD49A41548D0BA303717D8EFDF9EBAD46FDC719\ +24FDD61989E1516E4C2CC6AB099CF68A3721AAF8B4FEDBE794D2A5D60F3A618F1D4E697A60C8\ +8014E0A9B465538E82FC37F94FD368AB1B0EFA99FDBAD037F2162554C714E1A539F5DC35E620\ +CF81454912E92943AA12CE4447B83DAB8B75EE124A34038BE4297D8C88C6DF3EC8361912B883\ +D4BEBF5858F5116A3B8F9A818E0C19B42D11499A70A75A577E46B9793BEA5E6195F23394EC4A\ +F1F1F4BBBD10CB1B672568795AC479865C4EA8540BCFCE77F78C7F0B0600693007A5B69B6827\ +5617DC6ADD55B5192D6A4C8BCFB8B822CB6C9DC831C4357AD605ECE9F15C5C3C0953807E65FB\ +3E06FA59A8FA4314111564691962AC895715053CB22358A69A2DD658F14239C4BEA0D1940F7E\ +786A53E1390B74DF3B176D54272B62B1D61245B958884349A7ECF2ED98198244DD0001FCD5A0\ +FC8B3302B0B659CD94953AA0C3A0003E74A074673E9C3C39DA5DADCBEFD0A638CB7B3711FC17\ +967E44C01B65A64EDF9E9A0DC1DB5E810E8D3096A959C918E9813E2934C8CAF1800B55C623AD\ +350FF26006E97919D250C2EA700A54231E28FC85E2193162F4783027BD86F859B01868678F2E\ +1C911F23364E350F4628570FBD639D15F30AB2BDD7512BDA269C631C3D4DACB0B3FA6F84:\ +C2F4F2996C7BC1F19B88BA92B41BC6F42BB4DDDE56 + +1F9093D9F61F1FBED0E57C530B3A38755A4F8E09AEE810FB7033F47E7461A4B6BB2EB898EBD7\ +9B3BEAE94B0BA1F3D43DD186D33F7B0469BD9357B4A8CFF6CA3974D795C11B55F7218FA5F7A6\ +5AB3799F7CB571E670F12C5318F734B9A63C0ACF016214EBEEAC2FC77961BACEBE48681EC078\ +C933C24B2A1431AD0D4910859F98BC3D3CFEA2CD07D5062639D5189A0C439D3E8078669B8123\ +EAD0038B9B702A82260014E6A07A965C2E7BC16D5AA7BF8CE23970677144FFDBD4902E4C195A\ +66811CD6C0B3E6F38525B3854620F1FA4B2B699108CC090EC110DFBAB90C289C37171414AB86\ +AB0A1F09EC28A844B21A2A3803D832E3C1704339CECA91B93E98014124E15F7EF2ADA34C2267\ +C5FF600385B6176C2E8DDB02266628EE51A58716F1C6ED39FC82553AC1D646B16208601DCBFB\ +9C75B1821BDE1BBCFCE0EF4134759D1CCE23DCD4BBAFA24D5BAD86D09AA3B9EEDAFAC4B405FB\ +DD6B107D6C65B0BE3194F41EDCECBD1116C19ED72BAA7E1FE91684CD430E683D72AF2E7ED471\ +D210189E9651EEF40943111F5B19D9A05B453006E32323A9489D1FEA7EDCBD486EF8CBD8369C\ +B342048F63E0A8503E61C17A4BA2AEDE680C48834B28B43A7436AE84C1737F68E0E6ED6983CF\ +C17E33515D6C2303AD08971F990793EF2F6596BF67AD773104BD01EC4848122567C6A4BFB0AF\ +C89122296839B9B01A603AEAACCC0EA7A8C0801562F50C107B9FF06990DA929B3A6FC51955A0\ +010FE2C412044DFBB519B0BE5F151AC8FA5A3E537276D8C6D18B9666E607C03E886F74D9F4BD\ +3BC20122C5A111E6CA07C14D3D12D43BB80B5D3D69C11538A56A9CEA77FDCB9BA0A73D992B60\ +64F96FB32A513E310261E87BEB457382A6897334F486323F90D85620C4AD93A7F88A3F310513\ +ED54A38743D9918C4B12714373734862E6EC1E5681E85BCFA8FF283BDA08D7333B95596195E9\ +4DBFB5E65EBB0DA07A1A913AC2E936EDF3075A8C6CFD07C80E60B3254C188ECD0661A4E276A3\ +DC4A729E6E5FD18AEDEB28B81694421885924C5D6CF5EFD257AEDCC39B1A8B88406200D19BBE\ +E9AD2346117F576F5AAC7A82BCDE6CB19A1BDCC70F335EF6543E9E25F157E189EC8624DC3B8A\ +6724DA2691E2FCF06CA9AC2D92E9335B70248EC33E8F83532DBEECBBF4B1158F3B2766BBD2D0\ +11C931005FCD3EBE3AFB23F252E19D12AB9304410DE599FA6A4D37EC7736155D92B668D7FBDC\ +BE5C2CA70536A5D401822261801D9D0177C81287A33984A56E9FA0DFE02D150A0A3A223BC86D\ +2D7C0CC50E8FFE77151CB709D6514889750165A2306E7F204BC0571BA1581F4059DFFF9D748E\ +B45303362164B24C975926549EB6EC3B4372530DA1A4E3293F1B0403A0B7C0C4EC72F18AB1AD\ +83533791E8846191F0D27A1B8BD6F91A3A8012A18E3B34ECCD8374AC203BC644ADAB06BD:\ +22D743189DA67A78A29148D4545DA4B72DE285A43B42D9CAC731B34D12DDD16541A0EC412A77\ +5E24EFACA5C206081E5C3328F88E2BB0C06BA703044E05CFFACE073068830D9C856B2920CC6B\ +006257796A7FE2ECB3CE6644913FB5AE98F6476DBEE36936D386CAC9C39B0D9766CACF5DE9C6\ +0084F09B36282DE5F109417FE711E0425BE00FB55620F386C81F0EE91F4E2306D8D134A1A458\ +13E36DCC9F045E4C7A18BF1427BF5C3780E3EFBAFED3E4714A6EC62C0309803C7C187F97C780\ +2DCA176EEE313A574B49C81DF25E427C8C373A9A5EFD6B290AD9EB6ADFB52BD7E3A4B86B056C\ +E75D50AD4564F5755A00F148ECB36673985F8F17F084D75BBB251FF261C06BB1972EF6F5AD98\ +A8221AF8E962A869BA395AF096ED24B58B810C7449E20DA628A69B69673278C6A1DD2DFEB5AA\ +FD226575923095CB6FD06A1379404945925B782A09E25FDAA51ADFDDCF2F8384FC1A8D53D36C\ +C3423099B54B03F0FBF5ED17CF363B140EDD3B4C20B982024A9E4F26C1B330D2A9360B737A13\ +90163E7347EF8FDC960F03C5F9194F8EC838CDFE1FE4452300548857F424ED392CDA3D88F831\ +58347D931E87E11F938BEFC178C2E191FCD5D1FB6087D09C2A25FCF65AC3286401A908420472\ +02825D6BBAE5D937E3117F61C1E212BCD6520BA984C04D1A9A03AFC01793063AD19288FB9AE0\ +324106D305D9CBC1AE8D4CE73808911DC45A3D543B8FB87347E5BD3103E95BFC51245DEA0C6F\ +4AC7E9D40B28CFB48866930D91464C1B602238C7E2C4752640F1B4344DDAB38C34BA694B93E0\ +9DC086FC49DFAD08F37C1F543B2768806C39E9386CA47DB9373EECB375BAD545DA04742C6725\ +5668B63E2408C564DA1FA44EC9833689DD4EC5EC8AA1525137CF7E935F079979B7E09E211E60\ +2A991AEABEB423A939FCCCFFB9EABDD6B03F24D2D0DE2D01FB40638F069234A66A7A60E3D667\ +6A82D7927306865FF74D4456E9B73E498B88CFED4C0678613A74440886DC0A17F948A1FDA388\ +7C99DB2133EC4D8A09CCB6DACE059373250F8BDE5EFB11C3897D592E1B9E080C185A4ADD3C9E\ +047C5DCF9781C228F194DDD075423D89E8DB2053FCC1DEA35FFA3909C791447E1CC85A77B5DA\ +82D2E012AF8D2C23017219ACD2E4245DE9197A0F4EB43EB3B203C930D48287321845567AC0F0\ +1B639442715A07BDA9457B38DFE779905990C0CAD83696514BF524F889DF87031B0CAC938265\ +18321921523BFD2676636DE5526C3D10C176AB27012A609992B3BD01D822F11AEC3C88AD3E1C\ +AC3F9F42FF60D4CA0ABC2BC93CD8096D66C135C4FD6E7835F506D26FD5C0A4405FB353FA10BA\ +DFDB343419FF6102052362D5CB6841ED111E55B7B609195A36A6E79932C363D7924E6725D28D\ +F66FC871357EF8F78CAD93AF7C20B9CA1C9590EEBF12E15B1A2EBF02D9EC43A78B7C6AFF:\ +B49715EC3C39DFB191BDD75B46A2151C033FEF2652C0 + +8EDCB7A73161A699F571C3E4837B05B8510F8B47C6177E293F376EC69B607781280EC24A8EA3\ +F1B57C6D4A842746A35EE44B86D6463997B8F506168C3395ECC8613E1DCC181A26CE0B541551\ +511CD570D3B912F0E7F10EE18E51B9C83EEDD4E81FA6F14529E886A5E6F3D1A815847881DBB5\ +D432745CC24D2BCA39ED8641F35297A46ABFB5E06FBBDC9B23404B42B4F6122E0A29DD945AA3\ +A9374531E60CF973D4E42B5F21385F2BAFA38372DE67205335EA1BA7B9C6E75F85C9437E8F69\ +D48524971B6FA192D6476B16EBD6434A9C802AAABE857389A9538870B7A17D1A62B2033AEEA4\ +C84666EACAAED730D8B7557C7B3D4421F0074372606B95D74518B017D8725E691995E215407F\ +51C745B09390AE6E7ACEA17ECAE1C9786AD70CBBED26A522D215B4EDDD5C5239612BFC9B400A\ +6F33AB66F5D4E96D497E0BBA951084496D8BE3621DE03754321A6B2A9C4394B04FDCDF606933\ +0D5651177FCDD78132ADB1C52910BA87BB544713911CAA9B8491907AA9F1FBE1650A8B03D216\ +5A97E68AB092E26A03910472347D1E12F9868B39B872F3339FA8817FD5427F073527FF6642D2\ +0F3DAED64C670598BF3E6163D88333F66F0D6F50952CAB037F29F2C6F5E7985C5C23CFC1AD2A\ +051BC94F9A0116E28B6075138B207DC639FF8D6C96D4ECC9DA9B5365FB61338EE7F398862A03\ +D70819403DFB08301AACB19D5E20BD17A428AEA172A63353D6EEDB8B39003912ACF52C6D6EB1\ +832629F151835D3F518A2E018BA9F9A4D192EA9683AF1A726403BE65C1E97EBF80E55CC8BF9F\ +DC4C7692003E8E5E10B62179A669B7A87E88B8395255344609DE906F474E90A74EE6F88D25F6\ +022DF4BB9C2491F20D0A6AE16FBAD102CDA4A99214BA494D7105CF54D34904C67B76A73B75AF\ +F13D9F9597F07B2C2A72103759A6EA6571AD68AE11BEA14BC8A02EF623137F349036DEB2B105\ +8A26C58502CC55629F3E5EFB9A3F30BFACD1BEB34D26B73666033BC3E8957D5CAB95DB5BE1EF\ +3AC844E6179F5C3DCAE207CEA301937C7B6F6392B7A3C885E291A2772B0F9998D98853623177\ +79E9EABF3E5281CAD5A9827EADCAE9371604ABD85BB9811E9DF0A7DBC9AFDF8C0D2AECEFE899\ +6A6B8C355C49E5638230CB00B552BECA580928987C7A958F95AB3E4C0EB30D2C89C2946F0F7E\ +2DF961C02F8DE4676636A0EA87D5941DF710C55EB37EAF9E2D0CDDF0406065EE6877F259BE55\ +11853F777BCFF730E642C671C12807B4A590D59D40D69C3E4278A32EDC63658F47B0F01A3361\ +136AF4F777DAC44AE1173BC71812A335B8119B06F71324642560A609289B9A7AB6271AE98B3D\ +3EF010200C4222077110CE34558F860C7252E96AB61127F39C9767BDB716EE2E812F9AA39577\ +AD4820C5F3580BAC84D6186C72D11DC2B994F72E7885A08CBAF3D6CDCA020D86B4D885E4:\ +7CEA4FA938DAA9A9E01D791409298E10C3921441647AE602446766820A0059E6289EEC102A51\ +EC6C884E2B007052B9FC863EE06E21429392E2AED8831125E8AABCF6E184BFDE646279340448\ +F61F1C6351FC6739E088F4213A63BB95B38FC6B83BF38B8FB45D27FABCEC411B6F18A8B9E3B0\ +F4A4CE3DA6FDE2464FA8F37AD06C99362CCB716DE824CCB62EF8F5D8873D8237837F020C6797\ +CFFDB23E004D532E3640A0869577ADA434FC7DD3C1D287083CB2547CB6FEEA2AEB3774629775\ +53960FB634700115D677D2C12DB25AADD1DD7D52602CEF1F8861E291CECDDCA69DB08D98F2EA\ +CBDBFF1FDB7EF5D08B704FC6C8F7B4AAF2A62A68267BF50FDD92FDD106C56393CF431DF3D7FD\ +82A3517609D32787DB418E2E41C55EED489E3186244DA744D5D50FF4CD71EA8F58C4CCE5D84E\ +BC4D5A37BBF7A7D93994B3B8D41F4D2D2367A4A8CCAFEC61F4D1D8FE637C9FD275CCB15B0496\ +4433F8F0A8220EDA6D3B0E96853447BBE97BB9EDCF60899896A0829FD2D0E17389F5A55FBA37\ +1C55E7D3E93F27ABE89474A243B2867A1F16F474E6972FD54B8A683884360159F0F8109D05EE\ +799731A1C36CA22AA6D0320BC9B25FB1FBF9F1CB98886CF53DAF959E1FCB277173339C1CDF59\ +702E4E3894843C336B1E527F5CE2D2DA9A22824D68FEA16222810C42A78E70B574BB1D5CB42A\ +A6E318EB0A71E415E9CD0FF6E98001B16134B6AA8CC258652E156B16407FF5F7ACFB27FC869E\ +A07835E38F4476B4D9D014CFD6FE90DA6D9D64C24934DB12D6237F9B782BFE0537F30E1B3115\ +D875DB468721FA0201541D4EC6760C6E3E7D0EEC428B34ADB6F44928739BEA013996A9AF4E1C\ +E74585C8BEED9A8C778633753930AD8A05589138B647828E01A841524B1A87071B77532D7DF3\ +3173AA606A196DAC31A26C3B7225CD18A0DDFDEE85CF90D8C2796B1782BAB320116101A63BC4\ +B7C4FCF336968BD2DF51D329E6BAD996923FBAB99E9F198E067DAD4C8267B0B80587C88E9773\ +755D1BF62FB694AE313DC6AA85A4C0740E4983E2527E5CA9C860327BBD67A53B9DB1FBE524F1\ +8B422F8DA23323926ACBE1BF751188C01264AB49F0A3DC5107E85C2F5C3897B9DA326D04BEAA\ +8C9DD5490938934855E67C3A0F34C5F74F25D710BBB4FCFF65AFEF6877E51B05739CF64573C4\ +F18EE1D2C19CD4F966C8A037B93ADD684A956091F82D91EAC6D929401A660FEC7A969B2D4D44\ +523362F50CA7EA5D37E0047384F24411CCC9506CF1484F8583344EC6DEA320784C5C496CA9BB\ +D30066A57D5452AA33CD03D041638DEF81D2761DA24E2AEFAA6A128E86926DBEF4F6CD832A1C\ +0E120B0F7E10B8C970754E5E0919A4CDD9C288EC9316E2BCE4357B8E3B708C8BDCDBA04080DD\ +1E986317E1316E95A7B0DB6C87DACDE723BA6E59277BCFFE4607ECB5B8FBAD0340631D7E:\ +A0B8CA1B1F83F3303578B0CCC449871843D7C8360F93C6 + +DBECB1C042AA98E8593629327CAE8C1984169010D5EAE745ED9122E71827818ADFEBE013E774\ +ADDEC8A2628EBEB1473A8864E2FAB7C9973553993689D72166197B31DA18F5B0A95363F4E765\ +A419756BDA665E66C10DB27D712ABF7146ABD48F9DB2638FF3CB3099FB0BC26B6CD4C64A6652\ +63112AA378F6A093C11891B641C74D2C0F816FD5E52F37F01BF84BE64F9AB3727D8031213A79\ +1F9C6BC1EE49A259CCAD511D5CA26DB3272DB3751D73C2E56BE46684D6F9E952DB9DB1C9E879\ +797C487F56993420102418AA512F50B1C1339ABC6FC13E905DBADFFC651CBB420D6D9BCD7B86\ +FA66083DEB317FB538A5381636F73CEEA73F28EACA590F6AEB4153B5DE87B25A7D58A7E89659\ +DE2673C751343C72CA13B2B5ACF96129DBD9587DC1F427485DF9D75366C099F186B6E0821805\ +977C728C11269C4650DC21D8ED1ED60CD00C41F0A362B9E8F938A20E7B68B51A264750D4F825\ +3CF216D17DE03191360D6C9B33CBE7D2ED1E6214D0665C34D03EF11662C7CD7B25E9CF939B05\ +C77943ADC1F8F4D3B861842D5F4B147529113C414A66269CFB33B0334D7C18A80821EF56C151\ +1A2079AEC4A2C9E5A1FA2212A358CB5D994BCFB43042D5696F895A7E2F24D1F9F1C9EA37F56C\ +2F41824B1A628FD1ACB5D0BA64B858F68816C76B11D3154337E49BB54CBB894E7F4781087FEB\ +75123B50F59D34E12E99D3BE1CDD6C1167A45D4DA1B5E4A0657BBFABAF3CF360C1BDECD6C5B2\ +9F268CBE1CE12A08B7C3EBCCCDE1521CA93C16259ACDA418D48319BCB93AD13F6E379D6CA25C\ +7277CD5CCAEF1EB90B2036D6CF7BDE5E64CD038C469F936F56D86D2DDCCDDA23810C2391958E\ +FE7C76512F66F11F44B9E9F1CBD24AF6E5A728D01C7FDEB95A17214C48F52938404BDE078254\ +872B6003351A464D824424DB0D573BE4A2A8D836F342022B87097F8D20EBCB3AC56D26FD4720\ +77845CA68200D60261B79C4B60C6477A1A597C81E72D09BA38BD4B0E5E692B436CD1B541D4E2\ +E72C24DBC766022ECD4F6556499AAFE062B260E104903C4FE3AF208B6D25A5738760B2FDAB52\ +D1A5E66B7348F7172924E15E0A4F00D0FF01F6504092555973DAB665AAA68D9E6E54141805CB\ +409FB511507C66F76578C40A034F7398D88576B47AB98EE94CD18CFE6D99471FF56EE064B70B\ +224A43E691AF4166D97CFAEE55A6B73CE15FEE6AF7214D12C092A5FEA66EC489D868902D5293\ +48B212D5A478A33F918974620818C12CDB01B150610C1A2B5DA3B693617C64FB9D084B293C3A\ +1E460776A5ECA6CF50419B4E6DB18FAD314F0C7877213FCFAE640E11B4D64B0EA1801D0CD7EC\ +123A9EA0E290872A8238FCC8FD358586EA73F2A065E0C9B8BE847B836077B6F3867F23539AE1\ +9E6CC3A245A059D1C3A17E70C68F92C69AE400351B9AEE6BD3E896547622262D02370247:\ +8E536C2B3E9964DACDEBFF25C78DF2B29CFD2F423E3B85EAC810F536E18CE420763AE2F07E9B\ +EE944437DA35D5843BDA0FDAD0F5C0C70474B84402D56B7CC1EDCAD0F6FD87ACA8ED695BB2FA\ +F60F916C401BBBB744B0C6BA13D12C8557EFBC024441AB86B0E63B40D86082B51677AA296CAD\ +65B16335740DD87F75614A2BE2A025278FABBC19FACC257F01B395D803B3868177AB0E8B258A\ +931A9F41F2F3D08EEE08B4A8384BCADC8348B199443853D97C2DE47E896142244B123B98D22D\ +281F6C5999E7ECD0AF5DEEDA96B65041807A7520BAD6525F9D2F5DFC19630297C5C738510C94\ +78C0F105765B0E15995042A8E1F255D572C14BB7F8556E45BBB38FC00ADEC00DA5F7BCA78B26\ +B8E38B37DCB845F968010DF7E908078504D4C6B09246140E27044D9796112005C878C983C27C\ +0ECF9C12F2ACD41078EFEA7B1BB1CC5A6A288B3D2FA67E2FFD0C42046F06862CCFBFF191F435\ +07450409670E3076DB2C6DA71550DAC99861E7D011A3998D3A27A268D93B09DAE44D7263DCE2\ +37CC7D136D977DE988B24FBD7A0AB103669733E4C1AF667EB71961F242C0E5551DEDF1037FFA\ +037BE420458B8921D59C6076F9DFD257EE563B922E703846F709E8498C584B9D2963C16C2160\ +7E4E3F4A8E72C41C54A51EDF14BF9DD69A78EF3BF0F0420FEA75D62BA644389F5DCB01D95B5B\ +BE6A268ACBD7A0C8FCFB7BA6076EDF1DB4BDF8DCDCFF73E5D99E864C78A6E909DBDAAABF7326\ +C572CBC82DAC8E276CEEF2E75A29916990B1C0B9AE8E28106233DE6EBF15407BE06D20B4C201\ +28F15FAC31841DBE8CFDB93EEAF7204BCC824933F80615C1123419AA8E28737D11AE352C36D2\ +F69CA9A348EDBAB3952AFD8136B4FDD2261A57BE6C42206742A8C54F94432D480A52DAFF7ED6\ +25E6F5D1FD5CC409392400B80D62F1052190314B64694003022D154F7B12FCE34E3B9CEBB498\ +1A722E2C344475134F9685DD95BB419ECBA2AACB502B28747665F4A1650A881B37F6D45280B3\ +35E68AB613D826757E1BAFF076E0E45CF5899A73384EAE2468CD16B12B5041E736723A771CA1\ +F93E80FA664BCE73A5D88BBEBA76DA2FB3521D70FB06D61532EA28D7AF279BB6C0EE77FC3EC9\ +C8C4B1652CBD71D64FF5E55817921E5C6088F0BE653A754335D9A030C89B4AAAA3586E77D8B2\ +3D969B5D1BFBE7B5E8D0C4A612B38270E51A63591F7DAEB0815DDE403F7ED968FD1077F94270\ +94C5B212D03B4DA47C7E968FB8F982C81398BCCA00A304A1F098B451D9A2EEA2DBF9C2561097\ +F0C16666C8471FEA676CE01A6DEA5EBCA591C509C3C0C943F5AAAF8456E1E98508E5527040A2\ +8DF9F3010AB8DD3C7EBF25BD7416BF65590E5B3B3BEA45477C063B90FA0207D56D716D2577D3\ +F5808C4C40941DFEEE64D2AA91710A5B2169FF77E21369A595F3A1EC1A956D916DBBAC22:\ +E09C01FC9C5EB8AE01A145C966D18B54D86962C307539BE8 + +510F5C74619D838446DFE399B6D460EC17CCFE8EB1FB0A32E65D6C8FA1C36E2D02CE83C39603\ +AD466C16DAD9528CEE7E3644AF881CE6E764FC8F6C96B51B7E3467D9E52A779F091C174748D4\ +9BE6FF831AEAE0D9317DFD0F9054E6F6E9AE61F491D23860FCA94E6E99260A7FE8311A91A337\ +57B140B9E08EF8CA4CB62EBA23FC2001D5F817F861A901076DCEFC95324E426F839AE0ACF452\ +7F70EB3C218FE15C2FFE7CB522F7F8780AC620E6E86CFE47C0F37ADFE0057A9E66D4DAB6B83D\ +1478D57819291CEBB798C1D97363337B15188705FCC6108F1F4CD55B956304DD270CA10BE504\ +FD93B68A7224C02A065F2877D93CC48FEC8A5BD5969629BA11169F0812A6C268FF5D09346F0E\ +848118993F240F25FFCAEE40FAA3CA451F08FC167C5A2BC3F2F43907A03B116BCC93C7320C62\ +B3DB61039CCDBFECC1D9686144EE8EBB884020C5D7B7FA8AD199CEB512EC5224149A911A96F8\ +8E6F4D000C72B20CFAB17B0028876C777F5ECE01720BDB7DFB73C2BA43DD77032B1A23712439\ +459FBC5D539C63A16DC168BAA923784AEFE68C403733AFA0C9B70101358EEBF05C81518181F7\ +ABB606FB180937799D256437281984017D56AADF3CAC1064FB198D54BCC5FF354961B1C11845\ +973F93BF878080C3206DD1976106EFEC6768DDD4A00039168E00A7515191A1C06145A5460BC9\ +323AC9204AC1A4AFEEE7CCE1662C034C63566DE3FEF9671FB4277702F4A3429B2D7B8FE1B7E0\ +34E00B2CA548DEFBE7DF7BF3B77FCBDBDFBBC105E375E9B9870E7FAA4ECA36FC6E25A6D4E04D\ +1001C5E0EA40ED893B59C6E7B16536028CDDCE2DB3ADF756504A546CD7CA1E97FD83D7FED79E\ +C25DC4780544FEDF3675FAE8474323A8BBE081C401D097572E02DDFD088117C7DEEBED761490\ +F812A2F2FC1C38EF62B597710655AE6C28D290D003A41C322654395FA3EA0B5389B3FBDD5EF7\ +C9D3E159924FE179B2B8C25F36EA1A26D883DE42B2B800C9629CF99FF280B9ACCD51495C60BD\ +A9E6963EE0007D86963BCDD00589333B7C84B8474BCB2BD28B6B5ADAAD16B452152ACBB951B3\ +A603283623D2A445E70F991A9C5C5B883237BB6200A47A7D601915847AEA550F3663CD366A33\ +981B123BA770ECE42ED5B933FF829682594422D1F3341D04120C1FF547A1F80C08F097E64D50\ +F7A9E1E2B28638543BD36A603C40ADEB9CD5453D572FC0309516AC24763303E652C170DCE7E2\ +F30CF22EB5C8E1ECB222E1EC2650334DE8C7504985CE290A48A0702EAFC9C5752E87510484A8\ +A4706AEE25350DE1D691547CE9F474E440FD3A8C22706F9362D8F4A6D7F2DA1D3B6E458FAB7E\ +601C0811A10FF6BC5CE7AE7B5E7CCB9FEF3216A883EC88853340B306336D58F744659D67BF7B\ +C738D0E89FF18C7B386D786B111B2C90BAA220267A7454E5229A4E800B94D2C9D78C8753:\ +C813B0E5702C0C6DE3328EF88A7E1F823ACD43EA6AE2A3339FB3F40E71DF4085142161B6414D\ +BDCA3450B5303E2489E7D0A943E836FFCA6D99C473F46664818F5FD0CCE69A5B0DB47749C1C5\ +B85BF8B93DBF8685ECA343B7274800D757C3D482E9E27DFAA293C37CFC4E6A87A51B8E283796\ +8D9D71E0CBCA79D7F7CA29C849CDBFE3C0E1A67212AA88D55C2667E7E18FC77ACE1325C6C497\ +01D0E51BDF69216EF105FE3EE23234EEE479FF85DE0451F0245515DA9C7696EA7B589922D44C\ +65DF23DF4FD437D2A68130EFE72A5BEF60754D7087692B09CAE3D964CAC2CDF2E4E47152DCAB\ +D0C1E9EAB1ECAE68001A934EB8BF08B35BAA4857A085A477AAC48D3C33104712947053A3A6AA\ +E9420761A148F42AE11F29507595DD468F9A0B24BD667C58D52E303673C5BE286D9ACC26FA8A\ +401E8B4A2FC327BBAD64E7E27FFE5C9ED91FBBC7EFFB9DA538121567D934F43B89A10A9086E6\ +94818B3F9F076BCC04DF8BE4C39E0C8FF4891E45B0147D435A946BD2A099C64D4DD6E3BAB8CA\ +C7A44FB825FC10A0CFCF2E07144BF92513B4B468F89BD04B451A59A0F36B0B1768C8520ABA30\ +6EEBB7BFA6470BAC3C99F570034C3B8C73824A14719AB2A7C9177176C626447F2392DD1CE5EA\ +E77F66F3EFACA292420E947C96074557912526ED5340A282581825055327454110F16A601058\ +77F16346CE130514CF938DC48AB7C5B6BB5814860EF7342087AA12283BE3F4E5D052740F74FE\ +A37011E2FAF3A991F6F64ED4D0B27359646AF04177033E9A85A70E1292EE24F17E3158605F3C\ +4F5E50115E3FAA01584D3615617EF0A78B6301B4ABF79E0F13F227C03AA55EBECBA7253A74C6\ +DD3539F9A9651AEEBC0444A7F2D69F175D757B25B53006CC424947AD0FE57A722B3B5C994992\ +74AA31A994EC8981A18A29695414CA397F3EF2571E165002693CBA1F54A72B9A2E0E0EF83C40\ +18C864472474A52A53CDEF878471648D2748FCE41CCBB9B55A1DF82AFC07B378B814D57EA8A6\ +F60F8872ADF7D0CE4FB942424602508D1550711365BE45433656E1A4734BCE2E1729038BA26B\ +9D3BB3D47C960A7E1A3286A41632B47147F533F8514A799B96B740BE43DF9E5D9596DE6FACE8\ +F75517B97E6764D700AE9B0F4EAF9259DDCA66972EE5CE74D376D59D9A7F921D92E172368191\ +CC21FA0B367A8522F9A05DCC89776596BFDF7DC34B71B2171E8D74F8E87E26592E84AE240DCE\ +A4F8236F7E13FA1D254EE7CA048F36DD359733A5097090293E676638C54348DA584F38BFF03F\ +67E61A38331D31769D41BC04C8EC73CFD9A66C95656F87563E17BFD7A5CE3C1B2BEAB42BCE01\ +7DA00249A77AB05EB39A99999E8C374FE9EFA7323A542C7ECE218B1005B100A171C94A5A7169\ +F679E0C89F6AFAC45202B3344F1C1F11FC749FF120A7B1B2E30DF2AB3A1A20247D8EBEB4:\ +BC7974BF2DEFA077AD76ECF9B5FFA109B688D685A736A03F42 + +A3878B8AD4FA1EB390BCEBD93724540756966688C1ED1F877932E75D50C1253CD20E79BC6FA7\ +1285DDA89BA56FA95BFF11E2EE1B171DD95F698971B3B850EE1BCB8EC181C3921A8D9857203A\ +2A96260818B0B7807F1F93C32BE2DE700E75C81D3EF9A515B708C516327DFBE7C642C14238E1\ +F2E2348F92547B2A1F8058E467611E3D139D1616FC616715754E8593678E32A49B2BF820BE3E\ +55AD895B388F43B587596103A3A01271DAD456205BD53C03BD8ECCD9C7182B1BDD24BEB7C845\ +CC775D56150DED9E059BCEA42AF4072803778040E1CD33EF81A21767006D0824C90185C54948\ +8D9092CB0EF9175AB351B394786611C6CBE7B47F1762BAD1F39AF185B9FBDD3DEA790D1BF5FC\ +A6A80E4EE953DC61C54F7905F45F373AC9299C67C9A543AA3597E84653C43D80D11BCFCDB635\ +E12A846CB4B0D4F82CBC40DE236E6D8DA39BD9C90A03C8C9C47C8302CB53518A2D7328BD0463\ +B2931EEC975F3699C28C8B2A08C3C40ED78931C6FB807441B0B154F8EB0F8A0D811482864A3A\ +755E96C62CA19609A63AFFDE31F11A65CA9A98268F7797E883558A9221C57F32E126F156945F\ +E4AAFA2C5D9E4A2B383794F23D0E7296613DD73558F5B16576E7D8F0D87D4F2AC6D3196C2827\ +4822C648175C919559D85C13B97870FAC56C5151CBAA305CE02A23621F3C50A53E4C39FC6ABA\ +9A957F32DEBF5DF62FC34BFB94B186D376EE4FBEF617EF511AD2ABB1B3FB8CA56735BDF60D9D\ +38BF4AAD71D91F194DB1B8AD003D803402B047CD714EEAAB30C9B7A672958265E032CD9F1BA2\ +55856CE3CC55FA29589610624F25A68AD3A0B668F69426C5D91D17C5FD721628B0038ED397D0\ +A0D88D4436F317E78AA05446B8DCA1F3E7A1B16F754046001146487B06A6C1DDB8C98D3D0727\ +D9CA9F5A99A428C63018EDCB49D810BE4C3D77E2F006F9787DC1C0745062A4AB11734EE71175\ +DE27FB2FC04502E1A8E127E374FBC983227FD935035DF6D99A99C9700213EEF4BE0AB6DAABAC\ +727D6FC09CF528795E7FC36481EFD8E982AA5721895AC421D73B902B01CA30103AFB77594F8D\ +62B021C7770CFA088549B8B6292481901AE54D542AE2B547A41C8A2E54AD264A511965065E1D\ +5352CD37E0F0E9A17A0A237E894618079F5FDFF5019A2DE7037CB7073426F1933FE7777933D6\ +F212DB8C5686613D73A82C070CD06ADD134CADD2C746B8B175CC73DC606F0F2206B269E3E2BD\ +7070AEE53EE4BDEB702C8F5474305D3A99527779967DF66785AEE17CEA574FED7250CCDC111B\ +BA529548FC52B9FF81F1CECB530BD3A5D8799DEC62074C0C5F2927E0AD6677CE90B57FFB1796\ +D9F62157C4D4A0FC09F4A376D8D6E96EB58AB67073BE683E1A0B3DFB6BD5331A73CEDD91C104\ +DD8FBDEEEBF4F80CF2C79653947AB84F10663621160D20C32D60F15622EDBBFA4B1B4435:\ +30C59A448D99C6CBAE0C75F3012A728713BC357DCF1E814FB0E164F2502D8E1838C20A053FF5\ +41E0D51EB389D0932357DEA124126D40AA8EED077239B429DB16D18FA4537D2694A7E78AA8F7\ +B5CA9E2E4C62379A860D4BFEF73A23509359517C8F191C83ADE0351EC54855449441952B8D83\ +40F9A8E9692B79C9E52A48F55F7D281D5A093DFC313E704DAB8897B35142D3055E2B26816D11\ +8A1B2102580D87E888B5BE5C26E00FC6BE2A8A2DF05E35D0F34B43191F1A5BB5865D2F9F0695\ +B5F163F5AAEB43A21190C81344927DE4DE397DE23905509F4A94144276EC3085E353E9409BBB\ +FB4CB4871F67C11F93E772BF800DAD9B56CE49ED9E807A7AA2E82E9341FC5531EDE9D39C5DA8\ +1158501B0C0A23894E04418DDF6B3106FD980C676E65B7599197FCE7BED861FAC3E3DE4B6113\ +400933C276733FF335B725889885D1F05B104D60621E823E9E1EF47FA982445FC5F5FAEDF701\ +BFAE44EA5DAB480861FF4940C13D9E4351BCA2B84C21FB3EA23433FF7F2E9C56DDA92D645180\ +E6EB610B39309ED073A700C891BA183AB048FD285476EAB85042605B2BA614B390F5B0062647\ +31E736D9D266A56B62344A25AC7B95F88A53916BC0A764B373CB04ED7B1F84290A368D2B2F37\ +E794CBCDDE38AAF38915C1E0035B190C7AE546C9C3641829FA089F3E454373A90BDCF7BF5FFA\ +1E91D89BC026C28B00275EF96EED2A3E311CE73A3F8BE58C5E30380D67E55BB16CFDEF9EB6D5\ +2FCC797C0C017A4DABB554FBB4B3AD7D4EC0520EE5CB63BE6FEA34F8EF1B9B94CFB1202F4A1E\ +D694ACCE6B5D0A07147F0C15A554A6B05BF0224092A4CD3EEC46DB5CF93706D6EC1184AC2280\ +9617A6A9FDE605794947A10B11F5EBE05E674DD48908F71DE8045C71F345D22851607353201B\ +0B0B0FE0744063FF262B91894584784D216E63A7E0A550680053C85687C98DC8E8D31AE8EBEF\ +ACBBDC2AB15176136042A72F6E80A12168462723C42FB6F759392F40E4C38C74685B164A7AEF\ +478CCB598B39F3A84646A945CBDCE3339E369720A5BAD10C32058C07F7AAD768A693B3CCB9FC\ +677B5AE21CD4EC66992B8D1EE676DC0108A9C2E4344FA37B1AAC704D6A9AEDAC68741DE35FBB\ +8D103DE27CABEADBCF06E214EAAEB615051528456AB7477CE95BE4DD899975806D8F21055CF4\ +5DE6C98456F5A8F0B30AC2647B5A61B7A10BB77C91D7353541CCDD5CC98B24B5B6CBC28AE123\ +713AF68D9352407A232E65316400C25647840F0B60B8172325D3338561B797A9DE775C847A28\ +8D535E9A42530057487A8D4DB74A9E8D989B1A6CE6A9F66AC9121B8FD1FB4259275CE1BB28B8\ +25D1825DDA3330AD4AFD6B94B166C4C2B069C77B134AA105857772657A42976FC1B671F21B68\ +67F6F2F79DDA6AD5E207602B57055B0654FAF0ED455F164A7033F6B91E28054232030D56:\ +9F442E3FB2EA592A0CB7B0CB8D8CC4EF5257C2DAE393C21BA0BB + +C3E72DA2352F1272F2A862C1802DE449E63051F6D9DFA19260EA094B450FB888C40A82AB5283\ +AE400000BD786852E0A9502FC25AFEBEB3BD6787887DEEAB68A7DA7614A9446772DF7FC0BE33\ +BA1494FC76DBF30F7894E644FA1DF0191612BE7516420A850C46CF65389CD5AF7C5A534E7A40\ +CF76C90BF322166E26057A3CEDF2497B57742ABF06774C0E4A8675199F3CFC5DE26402B40BB3\ +CC303EAEEAED2F7AE6A0ACBD24D54549EDF40CF1EC6180B59CA17D4568201D211E400EF9D47A\ +320514F62404B010F730D40A1ABC45D4FFE475997A8692202E88D8A4BE2E3891D41096AE609A\ +19105E5CF74CE58EC9C574F0815DC470DE7E36F3780684EA0CC402610327879AFF283DCE3FEC\ +687D4F4A58CD4DE931DD5F3DE319C93E775BC417C29E6DB8B875F2F441B0BF7119980322C071\ +AD77B723E0823C5062D479820EB6D53F9F39AFF69D69C741C8C1C39EEDEC6A15336E0F25FE17\ +92B17D236C0567D14703F6C64685707C7221DF34EF5E3849CD44C3199C9D7953F132C0DCDA32\ +DB03D1A1C97511AE7A6D440277CAD76332251201B1E2FAC46EBA667C2905C00206145A08B25A\ +8FBD1478084E52300BC8187B3AD4EFD51CD7E2AF440BF7B61C52BDB5E25B2EE89E186F8FCAED\ +91E557DEBC038E3E0EAE0F894D89F1843E12C9A450721977D74ADDE7DA2F13C4D1F20884F03E\ +BACD1DBBCCC6815FAF755554DEA59BBE56B54F3EDD76220F35F82D9EF760A72E5EB70A20F45F\ +9458B2F42CEA0068133321772EF76C79760ADE842ADD7A9449B30C9E88D9B707BADCCAF72986\ +8EDD11B9460B39BEC7605A54CC156AD27B6D96A474D183EB1C0D2C5EFD388DB9ADDA2EF38B06\ +D723A0E11D94D0610701E20A8DF084F8AE67FF6DFD52A8D7EFC25D73802540FCA4C7E99008BE\ +15BCF36461FD9D5D3F66AA25510DB2DC7C715A5A1D40ED8DE77F3145BE7918BE39A579BB1AD3\ +9B64750436A2619A96094EBC67B6C7095A9CE54D32D866DA097AE970C5254113940BE9E89497\ +97F8F0FBD38281206D2F36AD1D4E0DF47FF3917173FFB99652F74EBDF85E0C26BE6E88661811\ +F285A02A8995CDCE78820711266D6A9ED3B29220DFE13D7FCADD3B3460903460EDC6C877BFEE\ +1705C0688C6B19B8AA29A712864BAD9D221A973D133317EBFD85095706D553452A31E9FA1C2B\ +18E11269524A8C585D0D852B5CEF5C20C898776C36F269F09BF33A645C860460263399864151\ +F13B10DE554AC09EFC791652451FE761D93F6B159CA6CE312AEFE8989A0C173F0C9C3D185DA1\ +ECA468B1C246F9EFE6D8CD7BCED96DE3D6E6F34ECE1EE378AE4A3D386EEE3775DA3192617163\ +DB46D1E7BCE606B6A43E07A9C17C6FBA952E2A6EAC4DFC3D4D31B447C85750361B9F08B0ACCC\ +87887CD270CF7A898B8C0DE907E28337F9E011F20E219D313E3BFB708A3273149DF69193:\ +EFAA6D16D871391B565E2CD61AC153AD5A52CFB19535E0F0F0C0AD361D70053885367ABDDCE4\ +8793DE9FDCDDAA35ACCF7E99D76A98DDC4FAB05C31A1F39B971F20D2AF515B4EC62C686AFE08\ +6E7571EF15629281B76988CAE44892015C3DBF8F44731CE3D2C862F8A1B0600BD7C10B6DD5CA\ +276FF73AE22C411A6FFB7177819132DF0C012675B59364231EC6222A270F80004E403C20A63E\ +0EEAFE8F8B1D7F389F53A27BEF11BD9486FB83678A971A49D584405C9010F1A28EAED00FC2AA\ +F4A763659C28D73D0F79429A65BBF18F4736DED48043CC8D9E4BBCE9C8742FA66F566CDC64B6\ +C77F0D4C5EB39C45B65B748F86E00B0A94850B4A3EA2BAE4508DCE0C2C040032E714FAD46A91\ +08CB9053E5DE1108036E816027BB28E8A4F9BC8FC4E0532C0F734247EAB51C3EFF525FA160F8\ +2AFF051E3E0879A5C0B37BE3EA7FB811CD473D711C45DA6C35A499BF6F4CD9A61FF77FE4D62F\ +F750EB353427496F34C46741A612597BEFA6E78EA7F73C3A9AB06D66C46E0254F5BD2634FB8C\ +87B188A7ECBCDA62E7C60A60629EB89630760DC9946C898FC6A8FA1CA72AABB45A44EC09EA7C\ +B7A83E32088957703617C53FC8612EDC540F2B9F12263EA3DBE1C137B7401C4BBC79601C8986\ +02E0FF0F9FA82CC31CDFCFC876C8692727982F95081B21BEB36664A103D743BB4DC43FA4D886\ +853C555787BE2EF4BCECD3F960271494B3272FFBCFD15DB4F13C808B43A93B18FA2D412ED8EE\ +94798D45177F25B64BE91681901FC0067D78CDE05797968A4A5A17EE2DA3B13D05CCAB6C9BA1\ +DDA97AA52B7D54348C902EEC725B2F27C0E30F080FEEC33ED2406172833EBCF7324AA784E34E\ +EE33987AA71B631CC63577FF8DEA298986EEA883FF69E95EBA40D94AD348AA8D92997F4718A9\ +1A963FC2954D6912EE70297B365133822978C251E4F8A3CA7233A6A928E36D0CCC15BAE70BAB\ +7D6FD849F2EE215206CB09E91A879B475832EB839A19032985A3AD58C99E89042080B4BEBC24\ +A4643BE342057385E33C6C08C8C66E9E842051B5D53AFC272EFF54B6287CA60A54A45DE35B9D\ +83B0ACF58A5EF76A9562630DCE413E2650AC40E6AC286D170A0FFCC03EFBC6E19F0BE6A7A694\ +10F019FAE61CBEEDD64AF69D9346ECE739B4F0DF179406293B16137510060206B34D47069ABB\ +5CF345E8273C6E614B9140DCDC7721920FAB33FEB009E51A1A65E2A004C5E24FDE771A4FA06F\ +692D8D8FF6E41CDC2B6CCD81E001EA39E529367B7CC7DB6602927E5A7916410AEAEE2267545B\ +79E3CFBBC6CE1EF761555E387524990EF18539BC4B69F65C5E7F6BDBD4C304105C7436F445D6\ +1B69578ECFA9DDC357BACBC0919C2A796B17778EF65FFAC0D55CA5055AA2042B00B1B92F9227\ +B061EBAB643853CEA690A77138B4276840E895EF691370E6A36434EC092A815FDFB12AA8:\ +98D9C8D2899042442EE0AD2507DF56B749696D07D2B3BEDAB9D13B + +70FA4F489BA7A72EBFE10B8A591FC75809D116425A300FD9DBCC0B8863EE25A11D531CF58FF5\ +FF93D05346FBCE189515B84C8AB100CE6B802A340E11D522EC771C1EB4071A1A3874674E285A\ +C4A8AF302E95BCFAF741B3FBE85ED098EBC177E509FF2B120DD48FD41C914354A8818A4AA8D3\ +6EF2926CCE7C71FA19B0FF67ED6B9D2A3AC3FDB6108E3A68477C92897891176D4B03D4E26292\ +B79FD0AEA177B0F058D3F0917D642D39F4DDC8D02773C1C75F705529629E25B10E465148C498\ +62B0A89F1BF62AC70711AD6313387BB0185E8AD71F8CB4244655011E7170A304DBD9D1FF3EA5\ +CECE7C3207F3F94F838CB61754672BFBBC8F9F7BF255012D759E6A2E07E90C7DCBD8E0F87FAF\ +CE0B095957A07F5CA27D6754F3B1FB5090D4F971486F533BE5012BF3C1CC4ED7F7963854EC84\ +932B8B0DC8690F1402E201C0821A345CBBD7B65BBA2849287B4EC1C62D822919AA1F1F46CCE1\ +ECB1E01FFA7445A38B1BB8A7AB84400159C8B1738EB3642F6BF12DD4418F2C2A4B5262891F16\ +E5496561C6348286DD2C1DE2C8FC1657E49A0C039AF09DF56C5EB561DF4CB947FA0A932A07BB\ +0970B3FBC018D9B17A4CB87AD93E51CB2F3CB13164AA6C3FD719419F4B67D1B03E3A9308FAE9\ +D6DC94B4B1C0689C9C97D9BE77D395071825C3ADB32D0702109F702AC8D7B762DEC9A1AF5038\ +59F98F7AE75AEF4691F3A55174623200205D7DE038071CF8B02736C99A3A18E92C10E866F6D6\ +9F416EAC0EF9420DAFF040BFE3CD7AB9A240268C03B9D66F603C6A1AD1254D736BA669F9350A\ +EEAA647D3B7FF0CB3456A9C39EA5F936C5F6B124281ED41F760BCB1E49056F74142A0F6A6BB6\ +4B85958F8B25CF7A9B90345ACB5C3ED17B285977125A090F7C7FA391DCA1FC2F442746EDB895\ +C466D665C949BDF2AD3E56049A3F62C916987AA911CB3D72969F920FBC4883AB0B365109502F\ +D5AADB0DA1B79324D3299DE64C6944776C0E9F575DB1812C408FB263F7CC7612007216741B5B\ +397F7F3E7CCADE3E9F9A891FA1FCE70CB46DA29E520F7E7BC049A954D6F6997E82A7B49C1E98\ +0BEBFDEE9AC11D43C152988C1BD90B9E643A1761898993BF642B4465DC05D87FD83F1BB98CB2\ +6F1CFC986DFAAF1BFE98096C65ED8FE76AF4D085837D46F63AB58FCF5FADC6E098D319AD7172\ +E0B2CD6AF62E10C41A46C5F08B2A401C212D49E4ED6F7A372B5565D7164897CF6CFF57E0F25C\ +C814A1B46B01C78D76391D76EAD6D9A9F37B6DDE47BD32E153DA5CA8AAACF436D4C91BD5BC85\ +AC9550D4181A3FB20F6B0DE6E136161DF570D6BC72C52AB743BE670F3B83351ED71F3018B333\ +6DD861CC0DBA507BC2A16B6EE7E0F29E7472772E7FDF47DA7AA4BA19253CA2CB69BB5EBAD19F\ +30C6321EDB5D908DFAF162550E06BA90276B9901BAC6E7F1F21D9E7E6895396ADD9E6DD5:\ +B2511B9C8A29E538FAF6C9FBC0C5EFB8B53548000F3B69A8192D1074ADEF8A589A68F0ABD991\ +5F869AF21281EA9910C20FF08006AB2C558FAA5E42D2C3117DE89C276C1977E36EB8DC80AB91\ +9B142D35ED73382D4736F9135E16F58B64D5FF75D235637AEBF4ECF8677F214C039EA29D2B95\ +37F88B9B20C20F590B26A8394A2B9D4A4798EBA65EAA6342F370E732459DF8A13BFBB49F5331\ +B5B0B60526FB42D093271807F7873DFF03F5303725CC3E2AA847EDA1E413E8D11E9B8BC85C9E\ +2B95E14F38991CB01164EF054076D028D9C0AB1EFBAC1D0CAF727194DBD817A6FDCA84965434\ +495FEFBF6A5B28D8E816680002B03754178FCA6C5EC96FC069D30CCE54307EC1EF1D4EEC73F1\ +45240D4BD8C86BD1C42A79456683A8D1720B24B839ACF53FA450A5A5AA6350E8DBEF67B8E072\ +F1DEAC1FF5940D1BF7EFFF618DBD461C66298EE462230CD07AA44D1B145432995F17EB6BC069\ +6F9260614FB1839AAD3AFB70B767232EA053D3A03AF278BFC4396B31176082A97E96B11E88ED\ +DE6E419BD34079C5E2C0E3063EEA2E8D285B11F886B1AD177DAFCF6C5159ECD12393743FB6E8\ +734147DC08F681C79B8ED889ED4BC2908D37168604740F92F13C8407A2F7F1138217154FFB55\ +4D1CBA031337867EB64B03FC343C35CA899E2B279A3879F1A282535E53B7C54E1429FADE2FDC\ +31D371BB3A0C6FA886E592CA9E3A41864CE3B3C1A4C64737A835C40678F2F22A48BC2F02BB63\ +462BD9BC8A0108DDCF3A96FD4426EF9F5F9515ACE83D9B37DEB30D9FB6612E1F8509E7B55730\ +2A86F491A6DB9E7BF4FAF867D8237A491D41EF94F36A691892275248AD721092A5EBE87CE010\ +9D497221E17B6582A0C6AE2E6D9486B8CDE0046A196FE4F6E9490D2D3341DA9AD473BC94C341\ +E1B003E5579CE7C07C8ADECD38AF583A226EB1365C853FB512F27B25CBA25FCC210F3093CF7E\ +C680A2A32CE434E7AA563236D86442E7935DCFF3050681CA2CD516054DA3D94C159A935EE03C\ +96D2906391BF5128D82FC106A2948649E8AFA0C5A3496F42206DDEEB12168A248B4066D9939C\ +036CB94E54570B18E234429EC67AB15B8760EF62053F2834DD41667C3CC57291C7AB37395908\ +7A101AD986AD201A7BE01E79DBF19D392DC119796382C7F1748D86418110309C27451A89F111\ +24F41F8D497DFC0874C9618C8DF99199D2E366E7147E8DE0D84FFB122BB24ECBA72ED6F42AC0\ +E0A4B73924CB2E193E4DE685B9C0C557F2AE0441B93838003F59A014EAAEF999B41ECC3E0A9F\ +F58C38406178BB2271F2DFEDD3B8F4611E1795755EC713F5E7F4967919BD21AA336E767FBB31\ +0E2B305EBEC9E3CFD2F2DCE6F2695D29C3A69AEDC81344D1975522B20E2A39BDAFE01F370C4B\ +21AF921E5D39A47D5F9D0373F69BC94E154A95DDA966B83E9D72AEE63A3C3F01FA45F7EE:\ +3EDB5024B4439FD8463FB27E72DFB2A0EEC2A108770C9EC58D91D5FF + +13AFF54F5FDA5CFB464DA7CB2B7EF98B3E19DC7BDB50302DFD044BC96A26F889A3C869F861DA\ +D16F832D9095855385F7CEEB11C9FF029E270A82AA00B71D62951AB702C24BF5AB04E72974CB\ +70E575995F093E28E3AC8B74931B77FA74BFDD704E841D3AAC4C3CCD41829B052ECBCE10CC90\ +9285F644CA5EE801434B95B7BFE1E8D13B8BBF0DA6D608CF438409B9A5BEA68CFD03A0C040DD\ +53698F0CCC5A23AF583848CE756821435B9DD99B431CDB9EF5419B8D595260CE0D129A475CB7\ +8105EDD56C24B55860A56CA0A404B695852637C8220E7B26CABC0EF8477191FE4CA80356D693\ +DA691FBC7881AE3740D17740B5B39C01FEA3463484A016621E1320D2503F1B680F62FA2F45F8\ +5D9CE530CE7456257D86C68198338BAD10CFF149DA46B4AE5F4B4942204DF5D45887E8171581\ +283BF27B420C99314556C74FAEEE06FF34492F7D6B9E1DDFB4C7B0C68AF0DB1309548F3B0C14\ +DB47D59CFA2B990C67AFE1A68E765180F7F28B9A022FE1B9D46BEB9CA70FC84848C640BD2658\ +22BDBB22ACF459A83ED381DD01C1B4FD8F560EBAEFB47798116BA55D7401F876F841DD7CD7B7\ +A868D8E25F177C856F9DE63A800FB38DB1B75A1AB8F5DAE7F17F78158ADBE74B74F55BD6D2A5\ +853DDB39052B7F8320266734019EBCC808EEAA974B9B25DA57CA946FE338E551DD1ECAE44098\ +5FC7EBE545C7DDBD2DD6D9F8B998460788C1B9BF031A3919F56D425B08ED00BF8B413A094D88\ +F5BBFA5C080D1E9988DAFC03CB7DC3DA3963FF91A57C35803263821EAE880A90F4A50BE0E253\ +4498E8360AEF2E6DCDCE3BF0C9B44B865E82B26644010A5560E0C94E6C12BA664399849B71F5\ +27F74411D41D408C938805C3E9674B8854B8505EAFD47EFA6157CAAE3CB05E11F2A689AF1449\ +9895104A59778EF19385D6640466CF19E45DCE6B7367D55F802AFA2BEC0553C730EBFC603CDB\ +6BCA10B5066BDDB55EB6E81AD2012D7B9802ADE7A8AE708CC5816CB77E52B44648032FAEC763\ +942C3AE1B6E226F2B89590D9D738A9BCBB8D8F1C92F3F5C84DA4628ADD590E71AAB74E91B7CF\ +558459B641A5F5496B93A973EA4F40A1A3DBEBBFCFC01559B0F081F01A83074C16F101E46563\ +9B159ED430C194DC78D398EE03B779D978FB4BAA7BA417B12BCFF174F22F71020264B5F49D91\ +0718DE1EBACB8D80DC7D45882EDC842DAE134679F60C5D59A0B8B71082009A5D0C335CD44389\ +9E62A2D693EA93F593F1CB33A0519EFB246421F3BAFDE66A44D6061BEDB0E93F1C5DD6CD6D22\ +864FC0407664349C83AD6C3362978DC255F0C9DD421D9247536401887301E5BFF9286FBF0D71\ +ABA606A4C3DE065FC95D282209ED7A18221969C79147191FE629076234C62995A07F9550CDC5\ +201966645DE98A12FB2F36AFE4779FDFC1AD49A59992AFF96E372AB59CFB056A37F3CB56:\ +7037C2E54E86E1F52D497FB4E60229BDBB7357FD617924EEA72AF90D68BD5075267A9B02B8C0\ +2EBF86782C0B4BA174D9FF66014B2AF61184C722D5398C531218054D7D8F30EB6FCB0A871115\ +2AD577B2D51179E6266173B6F4CC868AEE184AD2C39D06432AA31D672BB75FC710A8BED7CBC3\ +B3CE303C13781E243441E7B6A1B6D223A32D4472EFDC8E50F6947AD601F4B07EE405AA66AA71\ +313612F904626550F6DDBC71A24B3FD9F036ADACAE04A035C13E2DF78AD9458174DCF3677776\ +BAF8ABDB1668D39F4D4B513A2DFC8D36869154DF1D3F45EED4DAE86E77090FA21B0C2514CE24\ +EAC2A0D928EB487843CA5431D3C6FF527BA67D8C337DAD9163EFCB9001E027A4EA629624474B\ +112EA2DCBC213365EF44B1388EEA3C76D02AEBF1C2731FC54AB6D197821984DA98D22FE979DA\ +6920C15A2A4F19FE86A7A49C1045421149548BF31A48254D1908F56B885F39909BE3553D8242\ +2FC41AEC0C63D047DC65A1DD9C7413097A8B986C3964A498C3C99C2E7A4DE23205265734C29D\ +457C32A2FD4E598C136C2B74A51511024F75E9CFFE60278D7DD4E674EB07F1EF7149B9859A3B\ +A40E06CE8DE91FA588CD228765D7FAD214DBDED8B7BFD6726A51CEFB803740CD87D8F23E7385\ +5691B6FBAC114C929992BEFE46465FFAAA6C592B0570C9F9EA87D36856448B9A5881A8F3446E\ +9F884FA0D3F6F396AA1B95CFF30873141CBF22DE721E355675BEB018E2A725B296F029E9A683\ +E43B9FA417A3DBB5E9F5756EA1DF3C3797E70E54960A9ACCB28CCAC4A4635BFE1F4A2A2CA5F8\ +4A9F2FF6B2498C7F4F93ACE34128B73BCE971BE0A5920E9A938F37402F1BC4DFB2B651A7F30A\ +DFBC991263418BEB635E25C1CE3E748A0BF9D9C6D4CF3EE48646033EFDC377FA5A5472375349\ +900D1F1DB1D313DF7E64B9B34C4A7CDE434E16A9D93797C07D50400D13E7F65486DADF196099\ +FE9F71554CEDD782D89B92AEC58E007BC903BE82C26DDDF2C86B8FCBD52ED64A19FC2920C74D\ +7F0B47AAE7FC176851AEBA05E33EE2081DD244B751BE89D8FD1E74A798EEE60A493CC36AFB34\ +DD96C34541EC3A2C32F1285DDBD88BC71138DA04E373DC80D958CD369C64FD5F26485369ADA4\ +1B93F5D43C47E2DFF1CA55320A70A0E07903964571DB66C75FBC691691B0520A2D31A3BD0CA5\ +22D842576D01B57AE4580B8AB4A6160159A96DA5FED007FD02E4D63ECCAFAC155251F316BB54\ +FCE1390AABA68E296756AB4F0189F92816FE9710C3E190F4679687631E99981F17429ABC4CA3\ +482C56C0E42061171BAB63AEEBCAA30B3CC4883A74ED71E47D5D8930A700F6D5DBD39627996D\ +9B93B978A8ED52D6E87752CA617331543CEAC386A6E3A8F43ADBCBDB46053F570119B3F19B2B\ +D92477AD98AF4197C274C2B569E013A7FA7850D8425F65AA425581B720E27BF9D9399A76:\ +4AA2A4958F5A0F91B928D76B91C36506F6B4C7C3EA41EBD6416DE2AECC + +2407970735E9026331AE5641300FE86BCDF45897190370274A476C8790502949D887AF8DFFB7\ +D1CBEEE0BA4BBFD0AD393E2D0698FBEE8F3E56C6E08C3ADC37A2B2AD1BC1A5AAE25B21B6E779\ +E41DDEF6C1FAC6EE571284F4DEB791EE1F079DB666E2E64C1378763C3EEBA9B998C27C757E70\ +8C680CE0E9C64B3767B4711C62D2C10F7905364DEE5C4A7DC533299BFF6D55086941F876CF1A\ +803F04EBC45EAE5D48612FCFAA1E6FF325CC8643DD77B48B16CD6C01E767DC11499644B6C301\ +565E16BCFFCE712676FEB37841608CC173456A4BFCEF5F9A40FF521CF94A9A38E20622277426\ +EE49330442455945510EB10259B6FB360F1C38535CDE3CC563DC44F36F978A1766CF91D49592\ +1BE0ADF59EA0C659D97E1C321BED0113B840350085179AFA32426A6F30AD9CF478A727D89DD5\ +693A087B16AE1C40010984D8AE35323FA84598B3F7A13BEF741A6BC59B47BC8D5250BE51E563\ +BF30BA364E54B68B75955FDE0809C56C25B79831EBCAB1DE292095DB60DD5E6F8C68386EEC70\ +4CDF5FD9B21D2011A955DF9425E62E94E7B5400801E549959B1D7512A5F69494226824FD4E14\ +80D28ED9D41094AB13D280D6E324DC2C61AAD4141F82BCE5B2342654F2A78F08A5C272501617\ +ADA60BD42A7E5214072B104A6EB88916E59694D4C72ABACD08D31130C88A6BFB1CAA47E3F142\ +8F4EF3D55DA9593408A60CAAC3058FCB5520C86D6B5A127A2D711180313690B79EDBFDC16EB8\ +3496C458426F00B56F5DA2AE368A297A76E2F6E86974FAD93297E55269E03E59EE09EEAC0DF0\ +2655DFECF618C83575EC012F36D6BB05196CF85D49F82D99C5DD164AC87AD9C5AE7698B721AA\ +293A63EF98535F7547BB044A3EAF9E9F3970DDB3DFB6E1BACB4A457E7D8D63780BEA7CBB1068\ +D66123C401ACDC047E0819A4BCAC745C2F4EFFDE8249B1FDC0428972EA8FBAA981F004C7CB4F\ +652326E43819BFF7530D44D8B42E52CB52EF56E897DCBAEFEE5984E9369E3EE7BFE5EC40FCC7\ +30E2C15C05D6319483329E117B79F94E441F1F4BF0814501418AA5349EFBD62F7CA3E5E67257\ +D9FB373C8D3DAF0080493F181EEFBC69C5B9F8D2EADD3D9D18774CF76C2C063C9B487FDBDB12\ +A9B5A104D1B6B5C4081E6A83EDDDAB5026EC6A5236D2360550372AD28461A60D9E5ECE6E1005\ +405252035365C61DA77ECB6126C7CCE1A5F1F2B5E8B53A50A49B6626159175623A537D0593FA\ +142194E7F137A88950B5BBE35B30DAE7A6375831FA9A3AF07E35A0C92BB60EECAD8F6AFD225C\ +D68B7F77BB8D96CF9225324527F5575A17CC29C380650B1D6C8A4F273FD3492A30EEA845B028\ +3EFD0DC9E7D2F241E77218342F4B263855D3C4DBA5279891BDE280942CA5F39A48A73A605F65\ +42E64B8D234DBBF3765A6A142E20EF90D4D30F5C93B243E39D86411A5EC1C04D0BAF7157:\ +1587639AD9EB4304EA3BDB1B51BD4A3E928941107B3E4D0BD637C39676F1EC92F01B7139A4A2\ +5AA3060945143EC36BF7A6D38478ACC037988AB7D334C8DE4D0C4163F8F8180A0B45CA17BA0E\ +4D850E169DD0DA41EBF7EBD08B6E059AA7E5012286BBA63201F44129C0B214C31E338C0924BA\ +E2552EA450659AA96464B34250DE693E4A1B917B63EBD1528BFF6DEC61BB70E84309245195D6\ +4E9B30A880CCFAD7E39EB3C526E657DDD41183A13E16C23B9E18194F14372EACB8DFB31B6DC4\ +18614C4A2679C1D101A4259DB50781795C55FDFEBA2A5621831A2142461D3BCF80799DBFCD41\ +26C85398EFD911F7039C62A32667C4067E155C1BD9DEB210E6006FAE5DB67ADDA8EDBE2DEC75\ +B5BBA1570C2CF3E3118C0DB8E5890A94708A9C089BA5822CA7F59F897DE20020DE3EC4F6D092\ +DE2159A93367083FB15A302F5113F49A521BA8C863161080EBF49FB603990D1F920FF5C23455\ +E1560C1D54E5E7E4227DD35E86298E12B344FB30F1F9565382E073A2946D7AC8B3CB903D7649\ +01A04E79F5F09E563E6A84FBF60EC88990ABFC71B071997FB6024F1BE56B94159EDEF135EB59\ +FE37EEE584BF4E066D014CEF83151103C21B64D623B115F84E0ACC52435DEA7D39C11A68B608\ +332C56CA5B9CF0EFFE59040FC386F947170D22F2453A8EB948E3FEA25CD482A4822335005DFF\ +5A6ECA44221231E7EE7CA8AF990346B049AF59A95CEB2A7C884A5DEF765BF8D837817F4019C0\ +C323B2087159CAF7B9E6EA2678DAE509B4C607134F6293DD2591DDEB92D9884D96295A811593\ +89D44CE9617921842F6D7249738500F3CF2B73EFA762B9EB399F8E2DB5B29EFD71F1A6AF0B37\ +97DFA41651947F330361A5AC495C0D3A2B9E4F34FA5D186CD946EDE0665F861EF99AC831F0D6\ +7351E848D9C9FBB74EB97F4CE03B5B9D70C103A7530063C4A7A3EE331F9A6314335E1B433D77\ +D158AA36563ED4DA4CDB9B635C5EFBC5B7A840A6F74B0DBD906D949BD419FC7503AD21E285B2\ +EB01BD7123BF7AF375D05DAAD012121310CA7A9A5ACDA2218D5FBA47596F2BA86FFB59090040\ +40CEA480E2EC50AF9953D379CAD0A00E375CF4AF2F225C4C66B2BC26F751B3FF35512CAB8B94\ +4A5120EBFE7606281BB53C7AA3CD5012592638A9C6B8D855264940A980DB68FAD2441691384A\ +C8ECB31C6529787B5B51B534E94F1DD21E75E8D666F74485642BF4FFFBA1DB6D8D4F40442127\ +6BF1CC7B5AFF5E57241B1E14BBC4DE84B137EF7BC9E1434DD36FB9A91B551E82A9E82F87FB53\ +665DE96A33B5B3871EF88A18560AF91C050AB6476700C7FBBA84F861E1A738691BE2BCE485C6\ +FD4E6D958CDE8DA49BC4B2ED3ACA18D12E8802967BAD848CE3C5CCD25B4941BC96B0FBFC745E\ +802D86C8E11642F3A0C2AA1026ED148D15D4EA27D68B26F7A73A15F05C056A68FD8D1D3A:\ +FD7760119A0432CB5928F24CB65E989B523B540161A3703E2E9370EEF544 + +BEC2A17A991E96730F4189382AA0D0B9FB9F3DC9478D3DA9BE077815332DD60D74A5B06E2EE8\ +91E2DE94FB011BDBAFDD287053B792FE58B6C0DDAA56731A160CFF5140FBB15AC775C99E5265\ +42D2F885902869689561B6CC222F216231537665F3055258B99CAF7E24A756AA64F9F5F93C7B\ +9C790F0F56C83CF32F265C75A1FE60A0D03E2AAEFA99EBF6F3B5C3FF6D12CC8C8D1BD9F13EA6\ +E3EE9C41963824CAB090305A928B7732F96C8538489AC959AA38CCA32669D3477E25102349C0\ +59E47DF8CF161E174B75918249D61F5F8BC5F5010B48A84484AEE8149822750112052557DBD2\ +FB46C741338C1AC533FED2B753906A47AD8FEC3853BA882A35461FA5BFD649DC1349FC9D8A04\ +117029FD146E54B4B434AF5ABCD0194C226FF3AF3FE22070DF5FE6B927D27AC30B3CC304FEB8\ +A8F087ED668700E1268AE6B2A575E44ADA0BED14592410F4252585A2559F6A59E4E226F53F5B\ +4DB4A9F886E6BC044580B20EE79D5EFB6C035DB9D24A2684286071DBCDD5BEBD4B38DBE2F990\ +E7D0C30E4BECD54607D673A6FE226946D54BF84F11E4B10FD44C7EA79AD5A523BF38CF23D856\ +311AFE8BE54A9E417CAB529A77BB210AA8E3DD8C0A9F810FDBDD9F7EF1726F489F907BB6AC2B\ +AA5E6B7CBFFD864B8B47E91D0CEAB50ABA28245A1A93C3C6A3B0A907F678F2424FEE8C25FE94\ +AE69C454158F8ABD844F499F4BD39ECE28DDDB373C8A1C40C0B060927C7A879E1FD03876830A\ +7C2A67E9AAD1AD7B41B960C27D0912039FCA6E49075D1CC86619AD7A8FEC8422BF3AF1DFCB45\ +E2826D96DDCD8616FF4EB4CBCF2634104A09250739D6FE762CD05619A9D552D33B8AAF54CB8B\ +9AE834DC2EC340530DFD16D8E122F46092B03CEBD8AC54B70D0157F0D30DD4F1CA25EDB7F527\ +741AC5DC48E2AC752BFF7CEB19FC1618008A4F622C9DC1B29B4CC13C2170E7F771ABF40D3A63\ +4FAF580D97A3D7F7014EFD71425639EA7E026557123C347B3E2E57C7A7BF14BAB4B86EA05B2C\ +7DDA0787F4DD4EDE1A2F7675DAE9661E3F13D200FDBC64649B977BBA5AAFE6DEF9EE606E3152\ +675144015D012B663C219434A9F413E4331503B0EE68B7D53C71CD30429A33A6FC421C3EF8CF\ +7C63954B071D36A0EA1A9973C0BEF37DF9FF62C3FE6C9CF9D5F040CA663EFE4D9501CBA1F9EC\ +71F55DA295954E119A2172252618EB74DA2A931AC8532F9745BD6FF660E9E851D58976882ABE\ +61ED14DA8B2C0AB5A16EF9CC949B1F8854103F4D8C55E02802E9CAC30D0B0C8D5FE26D987BA7\ +F63C195FC376DA3C0518D2B8D9D7CA945EAF8ABE2BEF78F99FA8EF19133FABB845BA842E1CA8\ +6927207452C129FA12ADCCA3E4752635675C4226B473749817E57986BE452B67F9D6D8845EFA\ +0B1642905D0A9A1FDD6F4741111E578370095FF5623EDBD4DD92D7C4A9E51AC4660FA2E4:\ +27E92D9318FB1F44542B1FE1D040204690E57E289012A86D785E230A6A473A0CC3FF61846382\ +6C5A6BE0EC29A42424539114D11325B75D7F84B8BEAE7AE78122AC69E8537FF94D1E5514F12D\ +5B2A985DE39B68996471E15FE5AB14E533D36D61EEC01B70EA9749BB431AB9533D1DD1DCE6D5\ +69696057DC693C0BCAA9BF18DB7B6DB009230D492D01E7FF2DECD0BEF61E4425E1706FD396FD\ +2203818AF5EC5833BB7C902D325F47E3ADD947DFD7F7773CB791C7878FFF63916FC373642F38\ +B3200780C9831D8C173389AE404C6ACB29E844B96487B8F59B4A5C64CD03F1BB0AE9F5200E3B\ +C642D2FCF3A422FADAC4A23788B44B4D085D25C346A381D43782BA28240AC89C75BE6E346E0C\ +098CC65D785D3B522EA3F03DA743D84471A2FDA73B637A849C0D924CE9DE42E74F77AAEBC64E\ +844E69FAC8D1125AEF4770957ECBCB1E7F3183780E30B188101D598D7F89FA6A8B32051C3D44\ +6F9DF12A850F418282F819CDD06A95B0A08FCAACAB87D1D9CC91FCB3A762EA11427CA8045C6E\ +AED46D823E6813D2C1C9D496B726A3F06DE1C5D70B943CC41E39D7904105875E9D6D1571D07C\ +3FD63007A759210CF93D8581529D0C3CE80CC60EBDBE318DBF63F914F1BF0E991F51932DCE90\ +08DFF7C6C29EDCCA1836BDADA487BA7080A6D154939FB82A0F41800397576636804E97DDAC08\ +F36508DF60A2538F0DA657ED17A54AEED2F46A9D924B97C5A8442611D12E140D5584B7375C2E\ +47389F339469022C055E7303A144D63566069DCBF40432EDF8A6693D2764BA19E590114B44FB\ +CAD4F1699FDCB64F89AB053D34355915E987F260E09D657283CB7758FE7633143FDBAF479598\ +6A9E480E8448FBB16EA49C51E6359491A5215DE7947E3AE0FF018E8DA065FA6C17AE90D07431\ +F8F4B6B956884B3288937F40F72B7A90E36917043C994B354DE67E3DEAAF15B683A62B023BF9\ +DC0E6DACA05D75FA9B8A16CCB8802355B0ABDF961B34E18853220E5D01BE63449F002F23799E\ +7989E9EA37BA15B525AA053B200B4AE796DB432242B9EECACAFD1EBBB9037C90D837AF20407B\ +194ECEE1A4D468BB95EA0135C84BDD8079818C822768728CDBEE416FF0B5311A3AD893437D57\ +60A14A94F4ADE9A0C4D7F2CD33AEFB982B8C05E4CD0D8E7C50C9591AC3678E1DB93796004E71\ +9705288C15F8FA49CAB636757ECB0037B852B755B2B519552EC3F1D9EB79676DFB793806043E\ +880319E9781B9702E3A39C80D8DD30A9ACDF993319287ADC774EF961670FBF74EF41CCFC4EBC\ +CB2A571945DD5652F7FB85B20C5BA4FB4B7AF0993C4ABE8DF1231DB8E635BF7E6B5F73DA5FDB\ +042E699F68EDA254EAA50E9B180341C1AC72E0DDA1275205AC0AD31388F2D002E3DD3FFE26FB\ +8CF8B69D9728E583B1369F3688AA9F3EC3F1C306836635E3F14F37FC6FDF7FA8578BE943:\ +8B73381DC14BAD9CCA68FD348320642E282C53740BD4E479F9FB21A740C4E4 + +B5E5EC7969BE71F2CB23A1B3F03683D760849D250CED76939779CB56F68A1FB0C5203E70C709\ +AA3BD5F46BEF4810F7A1D5D3DF80C7E887BF8D8AAF851D22A70663CFB11F9FAFF3C7C3CF7989\ +A62D3D51A317F5AB3F34E3E666FCEF0AF7565831C148AE441EC5B944267D2A5724225EA7FF93\ +B39A3B4840FFE9F379598721C1C8E5C72DFB37999932C75D16C5F43D77199BE6FFC9F19EB8C1\ +9296AE5C06CF2B7263941D6CD40EF0D68E3D4E309E46794EB0CEF97FFC79A2209B49657CA501\ +0257AB977BEB3070192E13672E94C99E8250CBA79BA46A23C1613D46EDEB7DF6D2AF8F092811\ +5CC002103BE69BD1E7BA4D81EC5CEF372DD1A6FE6B2BBD643C04E0C7AFE61BAF19140C0A45A7\ +226D059D66EBAEA5346F6C79B32F234813CA2365D3F45E13F77ADE50C16A216ED9497BCC77AD\ +AE50DEDA9636E67504C71D499707951CB28EDCEB16974A7F8015170E7CD9A2962D529EA97877\ +281DDBDAB23988502C46A0F2CDA4700DE1923334CFA6F344F4F8514DEDE2DDC82C0079729840\ +A459A59DC89C57FE7CA34784178FDD70D1AD7F46C1D464DCCA8D0D9CFEC542A0689441360C33\ +F1EACC4B882DE9BFE1B593459A13B73E86BD8C0B0282C69387B0506FAED80D13A2CD8A61FD55\ +6AA52CA111A250A9759B65C9815E8917A81248E47F7AB963A5D26ED23F07F1DC07F74490F97F\ +0EE79AC55532855E44BF85AC6870ECDB6EB454F04332297D1A219E76CDD92BAC023036C580F3\ +311D5255201F6617AD800A7C1BD4E0014AB554840B72BC2E6492CF27E246DFEEBFA679789260\ +0B13CDDC4B71F644492950476B21315B6BB6599355EB2ED3B41DEDAEC9915803204A77B2BA17\ +F5EE77143D62939326C6B0E47D013C8B4CA35EFD56969CD9922DF373DA3361692F2215D1D79A\ +620179B399ED509B75D64229E678D50BA5DE297D4E3F43E63910BDE9F50D81477C4204205F74\ +3F94168FE1B1D49BF0DF9B4CDC54043BB0992D1D8D2DCCA0E2BC3D16BC9750DD2683C8B60313\ +E9A8E613DE853B5BAA0A6F987F6E7DD4753E285ED6FF895D521BD38567588F36DCAAE3CFC13E\ +A204DA65E1D8FDBDB8406FB10F99C977D2523B0556C989D7A13E4B6CFCE1C92CAD06F513D4E9\ +ABF607D88FECECD8C47413ABD8814DE84075C4BD8315EBA45571247DB384BF6C84661B93E4CE\ +7ECAE02CD3B2E5C93F08FD020AC41B583B73E5C1534D5F101058B9EF51BE65959D30E2A74F64\ +3F55A71DAC6441D3C03A117A675F6472AC5BE7C3D05791E85134CB10CD4C8A4F9E62EBFB24DE\ +64FD5713CE856BE832F4D6C409390EDEA43E8B1BBEB195C38478342B33BE0595334B3D0EC5E3\ +92BABACF0052B3686AAE8AF9A9D49093EBDF6507E073EABAD120CAF75A172E08046542B14958\ +8AFBDA53A1713D91980F04E95A048BA7A92B98C4C090A622ED1C9E9BBEE79D1F24E36DA1:\ +A497092296A16CBAB0B6A592C33FEAB468D38BC809F666492B55F6A0FA8C02B38856A0ABFDB5\ +EB16423C8FE8C50DF5522C27CB55251A8560E25633B97CD00434266786B57AA4CBFF2334D072\ +CC32652917F8371F17EEEB05B46B520F97D63EEE0DBEB2FAC94896C49D13EA71EC1D6553B05D\ +C266D1C2B8AB82932B5821A5DE558317B0C42DD1CC86DB784564BBAF915F5467701FD7C28C9A\ +A51DE741D90FCB60A16FB21504F77E7EDD65CEF98E1C88CDC657BAB27039C3A89A022B18783E\ +65FB6F7DB2D8DB623BCAF56FD94634FCA45C9537BDFA76C6DBA3F4A7F39037C2B935C25DD517\ +AA2DA9CD8F5E83AE7D3E95ED63025E925253D1C5FCDBBBF18310954C22CE7851ADFB0527C057\ +B51EAA8504082D138DC6569F9736EAB6C11BB0DB9243BBBEE576A1CB9390F92362F7A3581E91\ +F27B3B47FA0E2E375584D8B7588BF5B5EF1EC2CA21267685AD9E76B985F5887B0A6E313BE827\ +5E3F7C0BBE87228DFED01E37A7213349150191860B1AD3E20C91DD504C2FF642AB869E4B427B\ +11B1C22A6D1029BCBC7610EDF9B2F4A2834A8897303A9C5A313D7C3B18796CB0F0F968B175D7\ +CA252ADF80CFDB258228FB6A1A9AA52F8847E18866C4F1038B28A6A3EB14C51098049C519FFF\ +83136206BE095094C66CF3F683BC5757D2394DE9E0808E42DE433988FF30326AD87C4AE38521\ +A2B8E4BE8BD7634FC62FE02E450510A190A767B3475639A86ED3F31230C21B2C9BE5C1285C8B\ +127BF153B2F3D082F4F6B18BC2AC3380BFC4BCAC748C7C8F781F58CD674DA01CC6351C354FA7\ +5879E002A6C95986A516035F6F2A9C50FC8BE5AC79B7E9EBE8FB4F4DFE1683C52C966DBEAC35\ +5965A04F9AA6C91833BD55F508B04100A88FDA58F14E5C260859EC7CB60F625928EDD7CAF8B3\ +490655E234CC511B523C40B56BD07CB9A6A08A3642DA96C3D889C1D95176C9FAF6E28E74A548\ +FD6F8C3B0FBCEC237A5BD739A2DCF7EA93943DAB8CB5F228E0C752867E116842EA867AB7FB0B\ +4A6D031E9FEB8780C1318DFDBD6CD335122568E7B7294DD851C800156E13B445D64B22E9CB46\ +49B07E4BA64D2D22387173727EB434AC69D7A3F5580EEED15F7D4F15B6A6B190630C3B4BF6CC\ +BE98549152E5E6EF47FD02E5ACAA8D1C7E8621FBA77C4C712C6B91EE273B81C9CB4B0F5C6103\ +03F700C441DEE3C05540B793CD4E72C787F262F711EB788057486250076C2B1F09B93B2DD962\ +098CDEFC48CF50A90DE67B97819FA4248D45BC29B3325C4EC1EF95C9C2B1701190BD7420FEDA\ +9976DDF8CF70AFCAF1A8799738C5311757616764701CECEFF27D2676B1F55E3749751080358D\ +D9E9A9125287342FCB08E6BD33C776B0E0E2A6F28A043F52A6508DA1C7F867512E13A64A20DB\ +83D86884B50141254C71B7388F6A7D65EFB2D069A815FECB0970A3300CD5C5AA73776E2A:\ +8E3BE5C3118FA8382BE650BF4727BF6B84F6D962367AB966A072BD5913335457 + +# This is quite trivial. These were generated by OpenSSL. +[MARK-4] +97212EACFDB13D5BBC037B01A81CBB736B8136124E275E2F25823B8B98EDD3C4BF7F6AD52D:\ +EA57CEA491D69813935D09E0DED97221B4E909BC5C59CC8C1202BD0E7BA82C53DBD27540D6:\ +AAC76CB1CE2BF5144EE9A543328AFB95 +87742937D3EB3D9729D4C668273DFF01D6096DE237BCE72B598727935704DE047378453395:\ +120EE944C947D8EAA10A446BD6E65BBC1D5821764262F2129FE2C37B65A38C5FB41D4A27DB:\ +141619BCD6053F33E5D479E32F937222 +B0B0488DA6A74775D3C3B3459309D21E20D00798B45EAC2C6FAD29A1A8C1743E744D34D1B5:\ +AE1EFEE98A07A2654C42B68FA24065C02714D43EED8C0AB336EFEA1DA1906ACE3586C96DAA:\ +A2F81CF25695060C04A2ED2E6F92339A +9BC14F96CEDDCF5440130D170608752B75A2D1BD7227F8CA2B991AFEFEC0EB3B9656ACFA53:\ +953A60AFE169AEAA288638AE7DD5DBC2120418F44470194E6B869584BCAA13D7E0FBA35FC6:\ +4404423C571E0843B8EC4F5B0380EB60 +7B083BFA430729619537DF5BF575777CF5A433206CFCB8B175AA4BB5AE46EA82A69A15C2E6:\ +80206B94450FA80D81D44D3E751C8541E15B9DCFBCC05DC6007425E52851DF51B8166A9EF2:\ +BD348966C075CE6B78BA2918258538ED + +[Salsa20] + +# From linux-2.6.25.9's crypto/tcrypt.h (all zero IVs) +0000000000000000000000000000000000000000\ +00000000000000000000000000000000000000:\ +2DD5C3F7BA2B20F76802410C688688895AD8C1BD4\ +EA6C9B140FB9B90E21049BF583F527970EBC1:\ +000102030405060708090A0B0C0D0E0F + +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000:\ +AE39508EAC9AECE7BF97BB20B9DEE41F87D947F828913598DB72CC232948565E\ +837E0BF37D5D387B2D7102B43BB5D823B04ADF3CECB6D93B9BA752BEC5D45059\ +1514B40E40E653D1839C5BA092296B5E965B1E2FD3ACC192B1413F192FC43BC6\ +95464554E975030844AFE58A811209:\ +1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A + +# From Crypto++ via Linux kernel +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ +202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ +404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ +606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ +808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ +C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ +E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ +000306090C0F1215181B1E2124272A2D303336393C3F4245484B4E5154575A5D\ +606366696C6F7275787B7E8184878A8D909396999C9FA2A5A8ABAEB1B4B7BABD\ +C0C3C6C9CCCFD2D5D8DBDEE1E4E7EAEDF0F3F6F9FCFF0205080B0E1114171A1D\ +202326292C2F3235383B3E4144474A4D505356595C5F6265686B6E7174777A7D\ +808386898C8F9295989B9EA1A4A7AAADB0B3B6B9BCBFC2C5C8CBCED1D4D7DADD\ +E0E3E6E9ECEFF2F5F8FBFE0104070A0D101316191C1F2225282B2E3134373A3D\ +404346494C4F5255585B5E6164676A6D707376797C7F8285888B8E9194979A9D\ +A0A3A6A9ACAFB2B5B8BBBEC1C4C7CACDD0D3D6D9DCDFE2E5E8EBEEF1F4F7FAFD\ +00050A0F14191E23282D32373C41464B50555A5F64696E73787D82878C91969B\ +A0A5AAAFB4B9BEC3C8CDD2D7DCE1E6EBF0F5FAFF04090E13181D22272C31363B\ +40454A4F54595E63686D72777C81868B90959A9FA4A9AEB3B8BDC2C7CCD1D6DB\ +E0E5EAEFF4F9FE03080D12171C21262B30353A3F44494E53585D62676C71767B\ +80858A8F94999EA3A8ADB2B7BCC1C6CBD0D5DADFE4E9EEF3F8FD02070C11161B\ +20252A2F34393E43484D52575C61666B70757A7F84898E93989DA2A7ACB1B6BB\ +C0C5CACFD4D9DEE3E8EDF2F7FC01060B10151A1F24292E33383D42474C51565B\ +60656A6F74797E83888D92979CA1A6ABB0B5BABFC4C9CED3D8DDE2E7ECF1F6FB\ +00070E151C232A31383F464D545B626970777E858C939AA1A8AFB6BDC4CBD2D9\ +E0E7EEF5FC030A11181F262D343B424950575E656C737A81888F969DA4ABB2B9\ +C0C7CED5DCE3EAF1F8FF060D141B222930373E454C535A61686F767D848B9299\ +A0A7AEB5BCC3CAD1D8DFE6EDF4FB020910171E252C333A41484F565D646B7279\ +80878E959CA3AAB1B8BFC6CDD4DBE2E9F0F7FE050C131A21282F363D444B5259\ +60676E757C838A91989FA6ADB4BBC2C9D0D7DEE5ECF3FA01080F161D242B3239\ +40474E555C636A71787F868D949BA2A9B0B7BEC5CCD3DAE1E8EFF6FD040B1219\ +20272E353C434A51585F666D747B828990979EA5ACB3BAC1C8CFD6DDE4EBF2F9\ +0009121B242D363F48515A636C757E879099A2ABB4BDC6CFD8E1EAF3FC050E17\ +2029323B444D565F68717A838C959EA7B0B9C2CBD4DDE6EFF8010A131C252E37\ +4049525B646D767F88919AA3ACB5BEC7D0D9E2EBF4FD060F18212A333C454E57\ +6069727B848D969FA8B1BAC3CCD5DEE7F0F9020B141D262F38414A535C656E77\ +8089929BA4ADB6BFC8D1DAE3ECF5FE071019222B343D464F58616A737C858E97\ +A0A9B2BBC4CDD6DFE8F1FA030C151E273039424B545D666F78818A939CA5AEB7\ +C0C9D2DBE4EDF6FF08111A232C353E475059626B747D868F98A1AAB3BCC5CED7\ +E0E9F2FB040D161F28313A434C555E677079828B949DA6AFB8C1CAD3DCE5EEF7\ +000B16212C37424D58636E79848F9AA5B0BBC6D1DCE7F2FD08131E29343F4A55\ +606B76818C97A2ADB8C3CED9E4EFFA05101B26313C47525D68737E89949FAAB5\ +C0CBD6E1ECF7020D18232E39444F5A65707B86919CA7B2BDC8D3DEE9F4FF0A15\ +202B36414C57626D78838E99A4AFBAC5D0DBE6F1FC07121D28333E49545F6A75\ +808B96A1ACB7C2CDD8E3EEF9040F1A25303B46515C67727D88939EA9B4BFCAD5\ +E0EBF6010C17222D38434E59646F7A85909BA6B1BCC7D2DDE8F3FE09141F2A35\ +404B56616C77828D98A3AEB9C4CFDAE5F0FB06111C27323D48535E69747F8A95\ +A0ABB6C1CCD7E2EDF8030E19242F3A45505B66717C87929DA8B3BEC9D4DFEAF5\ +000D1A2734414E5B6875828F9CA9B6C3D0DDEAF704111E2B3845525F6C798693\ +A0ADBAC7D4E1EEFB0815222F3C495663707D8A97A4B1BECBD8E5F2FF0C192633\ +404D5A6774818E9BA8B5C2CFDCE9F603101D2A3744515E6B7885929FACB9C6D3\ +E0EDFA0714212E3B4855626F7C8996A3B0BDCAD7E4F1FE0B1825323F4C596673\ +808D9AA7B4C1CEDBE8F5020F1C293643505D6A7784919EABB8C5D2DFECF90613\ +202D3A4754616E7B8895A2AFBCC9D6E3F0FD0A1724313E4B5865727F8C99A6B3\ +C0CDDAE7F4010E1B2835424F5C697683909DAAB7C4D1DEEBF805121F2C394653\ +606D7A8794A1AEBBC8D5E2EFFC091623303D4A5764717E8B98A5B2BFCCD9E6F3\ +000F1E2D3C4B5A69788796A5B4C3D2E1F0FF0E1D2C3B4A5968778695A4B3C2D1\ +E0EFFE0D1C2B3A495867768594A3B2C1D0DFEEFD0C1B2A39485766758493A2B1\ +C0CFDEEDFC0B1A2938475665748392A1B0BFCEDDECFB0A192837465564738291\ +A0AFBECDDCEBFA091827364554637281909FAEBDCCDBEAF90817263544536271\ +808F9EADBCCBDAE9F807162534435261707F8E9DACBBCAD9E8F7061524334251\ +606F7E8D9CABBAC9D8E7F60514233241505F6E7D8C9BAAB9C8D7E6F504132231\ +404F5E6D7C8B9AA9B8C7D6E5F4031221303F4E5D6C7B8A99A8B7C6D5E4F30211\ +202F3E4D5C6B7A8998A7B6C5D4E3F201101F2E3D4C5B6A798897A6B5C4D3E2F1\ +00112233445566778899AABBCCDDEEFF102132435465768798A9BACBDCEDFE0F\ +2031425364758697A8B9CADBECFD0E1F30415263748596A7B8C9DAEBFC0D1E2F\ +405162738495A6B7C8D9EAFB0C1D2E3F5061728394A5B6C7D8E9FA0B1C2D3E4F\ +60718293A4B5C6D7E8F90A1B2C3D4E5F708192A3B4C5D6E7F8091A2B3C4D5E6F\ +8091A2B3C4D5E6F708192A3B4C5D6E7F90A1B2C3D4E5F60718293A4B5C6D7E8F\ +A0B1C2D3E4F5061728394A5B6C7D8E9FB0C1D2E3F405162738495A6B7C8D9EAF\ +C0D1E2F30415263748596A7B8C9DAEBFD0E1F2031425364758697A8B9CADBECF\ +E0F102132435465768798A9BACBDCEDFF00112233445566778899AABBCCDDEEF\ +001326394C5F728598ABBED1E4F70A1D304356697C8FA2B5C8DBEE0114273A4D\ +60738699ACBFD2E5F80B1E3144576A7D90A3B6C9DCEF0215283B4E6174879AAD\ +C0D3E6F90C1F3245586B7E91A4B7CADDF00316293C4F6275889BAEC1D4E7FA0D\ +203346596C7F92A5B8CBDEF104172A3D506376899CAFC2D5E8FB0E2134475A6D\ +8093A6B9CCDFF205182B3E5164778A9DB0C3D6E9FC0F2235485B6E8194A7BACD\ +E0F306192C3F5265788B9EB1C4D7EAFD102336495C6F8295A8BBCEE1F4071A2D\ +405366798C9FB2C5D8EBFE1124374A5D708396A9BCCFE2F5081B2E4154677A8D\ +A0B3C6D9ECFF1225384B5E718497AABDD0E3F6091C2F4255687B8EA1B4C7DAED\ +00152A3F54697E93A8BDD2E7FC11263B50657A8FA4B9CEE3F80D22374C61768B\ +A0B5CADFF4091E33485D72879CB1C6DBF0051A2F44596E8398ADC2D7EC01162B\ +40556A7F94A9BED3E8FD12273C51667B90A5BACFE4F90E23384D62778CA1B6CB\ +E0F50A1F34495E73889DB2C7DCF1061B30455A6F8499AEC3D8ED02172C41566B\ +8095AABFD4E9FE13283D52677C91A6BBD0E5FA0F24394E63788DA2B7CCE1F60B\ +20354A5F74899EB3C8DDF2071C31465B70859AAFC4D9EE03182D42576C8196AB\ +C0D5EAFF14293E53687D92A7BCD1E6FB10253A4F64798EA3B8CDE2F70C21364B\ +60758A9FB4C9DEF3081D32475C71869BB0C5DAEF04192E43586D8297ACC1D6EB\ +00172E455C738AA1B8CFE6FD142B425970879EB5CCE3FA11283F566D849BB2C9\ +E0F70E253C536A8198AFC6DDF40B223950677E95ACC3DAF1081F364D647B92A9\ +C0D7EE051C334A61788FA6BDD4EB021930475E758CA3BAD1E8FF162D445B7289\ +A0B7CEE5FC132A41586F869DB4CBE2F910273E556C839AB1C8DFF60D243B5269\ +8097AEC5DCF30A21384F667D94ABC2D9F0071E354C637A91A8BFD6ED041B3249\ +60778EA5BCD3EA01182F465D748BA2B9D0E7FE152C435A71889FB6CDE4FB1229\ +40576E859CB3CAE1F80F263D546B8299B0C7DEF50C233A51687F96ADC4DBF209\ +20374E657C93AAC1D8EF061D344B627990A7BED5EC031A31485F768DA4BBD2E9\ +0019324B647D96AFC8E1FA132C455E7790A9C2DBF40D263F58718AA3BCD5EE07\ +2039526B849DB6CFE8011A334C657E97B0C9E2FB142D465F7891AAC3DCF50E27\ +4059728BA4BDD6EF08213A536C859EB7D0E9021B344D667F98B1CAE3FC152E47\ +607992ABC4DDF60F28415A738CA5BED7F009223B546D869FB8D1EA031C354E67\ +8099B2CBE4FD162F48617A93ACC5DEF71029425B748DA6BFD8F10A233C556E87\ +A0B9D2EB041D364F68819AB3CCE5FE173049627B94ADC6DFF8112A435C758EA7\ +C0D9F20B243D566F88A1BAD3EC051E375069829BB4CDE6FF18314A637C95AEC7\ +E0F9122B445D768FA8C1DAF30C253E577089A2BBD4ED061F38516A839CB5CEE7\ +001B36516C87A2BDD8F30E29445F7A95B0CBE6011C37526D88A3BED9F40F2A45\ +607B96B1CCE7021D38536E89A4BFDAF5102B46617C97B2CDE8031E39546F8AA5\ +C0DBF6112C47627D98B3CEE9041F3A55708BA6C1DCF7122D48637E99B4CFEA05\ +203B56718CA7C2DDF8132E49647F9AB5D0EB06213C57728DA8C3DEF9142F4A65\ +809BB6D1EC07223D58738EA9C4DFFA15304B66819CB7D2ED08233E59748FAAC5\ +E0FB16314C67829DB8D3EE09243F5A7590ABC6E1FC17324D68839EB9D4EF0A25\ +405B7691ACC7E2FD18334E69849FBAD5F00B26415C7792ADC8E3FE19344F6A85\ +A0BBD6F10C27425D7893AEC9E4FF1A35506B86A1BCD7F20D28435E7994AFCAE5\ +001D3A577491AECBE805223F5C7996B3D0ED0A2744617E9BB8D5F20F2C496683\ +A0BDDAF714314E6B88A5C2DFFC193653708DAAC7E4011E3B587592AFCCE90623\ +405D7A97B4D1EE0B2845627F9CB9D6F3102D4A6784A1BEDBF815324F6C89A6C3\ +E0FD1A3754718EABC8E5021F3C597693B0CDEA0724415E7B98B5D2EF0C294663\ +809DBAD7F4112E4B6885A2BFDCF91633506D8AA7C4E1FE1B3855728FACC9E603\ +203D5A7794B1CEEB0825425F7C99B6D3F00D2A4764819EBBD8F5122F4C6986A3\ +C0DDFA1734516E8BA8C5E2FF1C39567390ADCAE704213E5B7895B2CFEC092643\ +607D9AB7D4F10E2B4865829FBCD9F613304D6A87A4C1DEFB1835526F8CA9C6E3\ +001F3E5D7C9BBAD9F81736557493B2D1F00F2E4D6C8BAAC9E80726456483A2C1\ +E0FF1E3D5C7B9AB9D8F71635547392B1D0EF0E2D4C6B8AA9C8E70625446382A1\ +C0DFFE1D3C5B7A99B8D7F61534537291B0CFEE0D2C4B6A89A8C7E60524436281\ +A0BFDEFD1C3B5A7998B7D6F51433527190AFCEED0C2B4A6988A7C6E504234261\ +809FBEDDFC1B3A597897B6D5F4133251708FAECDEC0B2A496887A6C5E4032241\ +607F9EBDDCFB1A39587796B5D4F31231506F8EADCCEB0A29486786A5C4E30221\ +405F7E9DBCDBFA1938577695B4D3F211304F6E8DACCBEA0928476685A4C3E201\ +203F5E7D9CBBDAF91837567594B3D2F1102F4E6D8CABCAE90827466584A3C2E1\ +00214263:\ +B581F5641873E3F04C13F2771860655E2901CE985553F90C2A08D509B3575556\ +C5E95690CB6AA3C0FFC479B4D2975DC443D1FE947B88065AB29E2CFC4403B790\ +A0C1BA6A33B8C7B29DE1124FC064D401FE8C7A66F7E65A91BBDE5686AB652130\ +00846524A57D85B4E317ED3AB76FB40B0BAF15AE5A8FF20C2F27F409D8D296B7\ +71F2C5994D7E7F757789308B59DBA2B2A0F319392BC57E3F4FD9D356289744DC\ +C08B7724D952E7C5AFF67D59B244051DB1B011A50FEC33E16D1B4E1FFF5791B4\ +5B9A96C553BCAE203CBB14E2E82233C15E769E4699F62A15C69702A06643D1A6\ +31A69FFBF4D369E5CD7695B87A827F2145FF3FCE55F6951008771043C6F309E5\ +68E73CAD0052450DFE2DC6C2948C121DE625AE98128E199C8168B111F669DAE3\ +6208187A254928ACBA71120BE4A2E5C75D8EEC494021BF5A98F3026855037F8A\ +E5940C325C078263AF6F9140848E5225D0B0295305E2507A34EBC94620A83DDE\ +7F165F36C52EDCD11547C750406D91C5E793951AD357BC5233EE1419225289A7\ +4A2556774BCACF0AE1F53585307E594ABD145BDFE346CBAC1F6C960EF481D199\ +CA88633D02586BA9E59FB300B254C6741CBF46AB97CCF85404070852E6C0DA93\ +747D93995D7868A62E6BD36A69CC126BD4C7A5C6E7F603045DCD615E1740DCD1\ +5CF508DF5C9085A4AFF678BB0DF1F4A45426729E61FA86CFE89EA1E0C74823AE\ +5A90AE750A74188905B192B27FD01BA662072501C7C24FF9E8FE63958007B426\ +CCD126B6C43F9ECB8E3B2E4416D3109A9508EBC8CBEBBF6F0BCD1FC8CA86AAEC\ +33E669F44525863A22944F00236A44C2499733AB36140A7024C3BE043B79A0F9\ +B8E776292283D7F294F44149BA5F7B07B5FBDB031A9FB64CC22E374049C33816\ +E24F7782B0684C711D57619CD94E5499471328733CBB0090F34DC90EFDE7B171\ +D31579BFCC262FBDAD6C50696C3E6D809AEA78AF19B20D4DAD0407AE22904A93\ +320E369B1B46BA3BB4ACC6D1A231533B2A3D45FE036110851769A678CC6C8749\ +53F98010DE80A2416AC33202AD6D3C5600715106A7BDFBEF3CB59FFC487D537C\ +66B04923C447100EE56C7413E6C53FAADEFF0744DD561BAD0977FB5B12B80D38\ +1737357B9BBCFED47E8BDA7E5B04A722A731A12086C71B99DBD189F494A35369\ +8DE7E874118D74D60737919FFD67503AC9E1F436D5A047D1F9E539A331AC0736\ +23F866181428340FB8D0E729B3044B550141B2758DCB96853AFBAB2B9EFA5820\ +441FC014227561E8AA19CFF18256F4D7787B3D5FB39E0B8A5750DB1741654DA3\ +02C99C9C53FB39399B1D7224DAB739BE133BFA29DA9E54646EBAD8A1CBB336FA\ +CB4785E96138BCBEC500382A54F7C4B9B3D37BA0A0F8727F8C8E820EC61C759D\ +CA8E6187DEAD80D2F5F980EF1575AFF580FBFF6D1E25B740616A395A6AB531AB\ +978A19894440C0A6B44E30327B13E767A98B5704C201A6F42899AD2C76A378C2\ +4AE6CA5C506AC1B0624B108E7C1743B317661C3E8D69F05A71F597DCD145DD28\ +F35DDF537B11E5BC4CDB1B516BE9FB3DC1C32CB971F5B6B21336798053E8D3A6\ +0AAFFD5697F7408E45CEF8B09E5C3382B04456FC0509E92AAC2680141DC83A35\ +4C8297FD76B7A90A3558798E0F66EAAF516C09A96E9BCB9A3147A02F7C71B44A\ +11AA8C66C564E63A54DA246AC441654682A00A0F5FFB25D02C91A7EEC4810786\ +755E336997E42CA89D9F0B6ABEAD98DA6D9441DA2C1E89C4C2AF1E00050B8360\ +BD43EA15237FB9ACEE4F2CAF2AF3DFD0F31931BB4A74841752322C7D61E4CBEB\ +80381552CB6FEAE5739CD92469C6953221C811E4DC36D7933866FBB27F3AB9AF\ +31DD9375788A2C94871A58EC9E7D4DBAE1E54DFCBCA42A14EFCCA7ECAB430918\ +D3AB68D107994447D683853B30EAA96B63EAC407FB432FA4AAB0AB0389CE3F8C\ +027C8654BC88AF75D2DC6317D326F696A93CF1618C1118CCD6EA5BE2CDF0F1B2\ +E535901F854C765B66CE44A4329FE67B716E9F5815677287648E3A4445D476FA\ +C2F6EF8505187A9BBA4154ACF0FC59123FDFA0E58A65FD3A628D832C03BE0576\ +2E5349979433AE408115DB6EADAAF54BE39870DFE07CCDDB02D47D2FC1E6B4F3\ +D70D7AD9239E872DCE87ADCC72050029DC737F64C1150EC2DFA75FEB41A1CDEF\ +5C50792A5656718CACC0795069CA593265F254E4523876D15EDE269EFB752E11\ +B510F41773F589C74F435C8E7CB90552244099FE9B850B6C223E8BAE86A1D279\ +05686BABE34149ED15A18D402D61DF1A59C9268BEF304C884B10F88DA6929F4B\ +F3C4530B895D2892CF78B2C05DED7EFCC012235F5A7886436E27F75AA76AED19\ +04F0B312D1BD0E896EBC96A8D849399F7E67F02E3E01A9BAEC8B628ECB4A7043\ +C7C2C4CA820373E911DFCF54EAC9B09551C0133D9205FAF4A934C8CE6C3D54CC\ +C4AFF1DC114426A2AFF185757D0361684E78C6927D867D77DC7172DBC6AEA1CB\ +709A0B19BE4A6C2AE2BA6C649A1328DF8575E643F68708686EBA6E799F04BC23\ +50F6335C1F2425BE3347804556A3A7D77AB1340B903C9CAD445F9E0E9DD4BD93\ +5EFA3CE0B0D9EDF3D62EFF24D8716CEDAF55EB22AC936832055B47DDC64ACBC7\ +10E13C921AF323782BA1D280F412B1208FFF2635DDFBC74E78F12D501277A860\ +7C0FF5162F63702AC096804E0AB493355D1D3F56F72FBB9011168FA2EC47BEAC\ +56012656B18CB210F91ACAF5D1B7392063F169204F13121F5B65FC98F7C47ABE\ +F7264D2B847B42ADD87A0AB4D874BFC1F06EB429A3BBCA4667706A2DCE0EA28A\ +A987BF05C4C104A3ABD445438CB602B041C8FC443D59AA2E44212A8D889D57F4\ +A00277B8A6A0E6755C82653E035C298F3855AB3326EF9F4352FD68AF36B4BB9A\ +5809091BC36546461DA7941823502CCA2C551997019D933B6386F2036745D272\ +28526CF4E31CB51113F1EB21C7D956822B8239BD6954ED62C3E2DE73D46A12AE\ +13217F4B5BFCBFE82BBE56BA688B9AB16EFABF7E5A4BF1AC986585D19353D37B\ +09DD4B106D84B01365BDCF5209C485E284741565B7F751AF55ADA4D122547094\ +A01C9041FD99D75A31EFAA25D07F4FEA1D5542E549B0D046623643B282157550\ +A472EB54271F8AE47DE966C5F153A4D10CEBB8F8BCD4E2E7E1F84BCBA9A1AF15\ +83CB72D03379002D9FD7F12E1E10E445C0753A39EA68F75D1B738FE98E0F7247\ +AE350A317A144D4A6F47F77E916E748B2647F9C3F9DE70F561ABA9279F82E49C\ +89913F2E6AFDB549E9FD59143649406D32D88542F3A5DF0CA827D754E2632FF2\ +7E8B8BE7F19A953543DC3AE4B6F4D0DF9CCB94F321A07750E2C6C4C65F09645B\ +9290D8E1D1ED4B42D737AF653D1139B6248A60AED61EBF0E0DD7DC960E65754E\ +29069DA4513A10638F1707D58E3CF428005A5B0519D8C06CE515E49C9D719D5E\ +94291AA780FA0E3303DDB73E9AA9261837A964084D945A88CA35CE8102E31F1B\ +891A7785E3416D324219237DC873EE25850DF83125791B6F7925D2D8D423FDF7\ +82366A0C462215E9FF724191917D3AB7DD659970F68D84F867152011D6B2557B\ +DB87EEEF55892A592B078F438A593C018B6554A166D538BDC630A9CC49B6A81B\ +B8C00EE34528E2FF419F7E7CD1AE9E253F4C7C7CF4A8264D5CFD4B2718F96176\ +48BA0C6BA94DFCF53B357E2F4AA9C29AAEAB860989C9C240392C81B3B81767C2\ +0D324A3A6781D71A3452C5DB0AF56339EA1FE17CA19EC135E3B1184567F92238\ +95D9343486C6419415F95B41A6878BF8D5E11BE25BF38610FFE6AE6976BC0DB4\ +09900CA2650CAD74F5D7FFDAC1CE85BE00A7FF4D2F65D38C862D05E8ED3E6B8B\ +0F3D838CF11D5B962EB19CC298E170B9BA5C8A43D634A72DC992AEF2A57B0549\ +A7333486CAE49623765BF2C6F15128427BCC768FFAA2AD31D4D67A6D252554E4\ +3F5059E15C05B72748BF07EC1B13BE2BA1572BD5ABD7D04C1ECB719BC59085D3\ +DE59EC71EB89BBD00950E1163FFD1C34C31CA110775398EFF2FDA50159C29B26\ +C742D949DA582B6E9F5319767ED9C90E68C87F512242EF49A455B636AC09C731\ +88154B2E8F3A08F7D8F7A8C5A933A645E4C49476F30D8F7EC8F6BC230AB64CD3\ +6ACD36C2905C5C3C657BC2D6CCE60D87732E7179160663280915D88938383DB5\ +421C0824F72AD29DC8CAEFF927D80786F7430B55153F9F83EFDC499D2AC15462\ +BD9B66559FB712F31B4D9D2A5CED87758726EC612CB40F89B0FB2E685D15C78D\ +2EC0D9ECAF4FD22529E8D2262B67E9FC2BA86796121F5B96C61453AF44EAD6E2\ +9498E412934C92E018A58D2DE4713C474CF7E6479EC068DFD4F55A74B12B2903\ +1907AF90625C6898481611029DEEB49BE5427F08FD16320BD0B3FA2BB799F929\ +CD20459FB31A5DA2AF4DE0BD420DBC74999C8E531AB43EBDA29A2DF7F8390F67\ +63FC6BC0AFB34B4F55C4CFA7C804113E1432BB1B3877D67F544CDF75F3072D33\ +9BA820E17B12B5F3EF2FCE72E52460C130E2ABA18E1109A8213344FE7F353293\ +39A7AD8B7906B2CB4EA95FC7BA7429EC93A04E5493C0BC5564F048E55799EE75\ +D6790F66B7C65776F7B7F39CC560E87F8376D60EAAE690391DA6326A34E355F8\ +58A0587D33E02239446487865A2FA77E0F38EAB030CC61A56A32AE1EF7E9D0A9\ +0C324BB54928AB852F8E01363852D0BAD60278F80E3E9C8B6B45993F5CFE58F1\ +5C9404E1F5186D51B25D1820B6C29A421DB3AB3CB63A1303B246824FFC64BC4F\ +CAFA9CC0D5A7BD11B7E45AF66F4D4D54EAA49866D4223BD38F3447D97CF4723B\ +4D0277F6D6DD080A81E186893E56103CBAD7818C08BC8BE253ECA789EEC856B5\ +362CB203BA99DD7C48A0B0BC9133E9A8CBCDCF595F1F15E256F54E0135274577\ +47C8BCCB7E39C19728D384FC2C3EC8AD9CF88A619C28AAC5992043859DA5E28B\ +B8AEEBD0320D527809563FC7D87E26FC37FB6F04FCFA9210ACF83E21DC8C2116\ +7D676EF6CDDAB69823AB233CB210A0535A569FC5D0FFBBE4983C691EDB388F7E\ +0FD29888818B4567EA33F1EBE997552ED9AAEB5AECDAE168A89D3C847C053D62\ +878F032128950C8925224AB093A950A22F576E184219540C5567C61149F45CD2\ +E93DDD8B48712100C39A6C857428834A1B3105E10692E7DA85737845207FAE13\ +7C330622F483F9353F6C71A84E48BE9BCE8ABADABE2808F7E2148C71EA72F933\ +F2883FD7BB696C2919DC84CE1F124FC8AFA504BA5AABB0D9141F6C689839897A\ +D9D82FDFA8474A25E2FB33F45978E16885CFFE5920D4051D8099AEBCCAAE0F2F\ +6543348E7EACD3932FAC6D143D0207709DA4F31B5C36FC017334850C6CD6F1BD\ +3FDFEEF5D9BA56EFF49B6BEE9F5A786D3219F4F7F84C690B4BBCBBB7F285AF70\ +75246C54A70E4D1D01BF08ACCF7F2CE314895E705A9992CD0184C8D2ABE54F58\ +E70F2F0EFF68EAFD15B317E6B0E785D8232E05C7C9C4461FE19E492023244D7E\ +2965FFF4B6FD1A85C416ECFCEA7BD62C43F8B7BF79C085CDEFE198D3A5F7908C\ +E97F806BD2AC4C30A7C6616CD2F92CFF30BC22817D9312E40ACDAFDDE8AB0A1E\ +13A427C35FF74BBB37094B916F924FAF52EEDFEF096FF75C6E1217726357C7BA\ +3B6B3832731B9C80C17AC6CFCD35C06B311A6BE9D82C293F96FBB6CD13913BC2\ +D2A3318DA4CD57CD133D64FD06CEE6DC0C2443314057F17217E33A636D35CF5D\ +974059DDF73C02F71C7E05BBA90D01B18EC030A95324C989846DAAD0CD91C24D\ +91B089E2BF8344AA287223A0C2ADAD1CFC3F097A0BDCC51B8713C65B598DF2C8\ +AFDF1195:\ +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F + +[Turing] +0000000000000000000000000000000000000000:\ +696626BBDC6E09F6DA9ABAB5B56C14878246DF18:\ +74657374206B65792031323862697473:00000000 + +000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000\ +00000000000000000000000000000000000000000000000000000000:\ +B64B97325A32BBAA3A967545D99A50889D7EFAC385A4A20E3C30C87D799DD84173802D01\ +6513022FE0FDCAF79625DA0FF7F66E76DA56926D3115D9F87A939E1C1B27A87386006244\ +B1A5360B0E5BAE03FC64C766B348A4FC18C9D95516B4BBE0F4BBAE2B:\ +42A6B922EC35FC7709EAE8CA0F6AA212DFBC0D6C:FFAA3441 + +000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000\ +00000000000000000000000000000000000000000000000000000000:\ +0847AA490901FC9BFB07F12590622DC3E672ADBD42813B79BB28B4C4DDE2A519751363EC\ +00EBEDBB684E4D1FFC02CBDD1FA2E3F8E593AFEE8648461DCC054D32192A6517F41AA4D6\ +C3B75DFFBED80CEEA3D28397D6B86722185CA6BABB64088D13A75DFB:\ +53A6B922EC35FC6609EAE8CA0F6AA212DFBC0D7B:FFAA3441F4BBAE2B + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000:\ +833E62C8D5E8B0B723F8ADAC68340288319D6F73762E7655EE35F2AA8E2E21DDEC2C1D2F9C48A1\ +BC05DA8E7A87A650114C6A065E21DCE06142D4E6C40B4616AEE65E869C1D3A1040C7DA1A44E6AD\ +F49C51B12058824D79B7622614C0F8E1B968F7F99A94959ADF845B7BED3B5771B6F7E30C32C2BB\ +A8463B2FFDEE4C4623CB69C66A7AA4E1CFADD429DFFA3F9BFAE9C9CBBA44246765699B2F7211E5\ +4AB6793969835AE9F5EB2F66DA83EE07701031DA84F357B2DE473D7A7952462AB42940294E6349\ +C73F6B91BD769E07B0FD9A212D551A66E7D9B7C6F8077D16DEDEF30EA0AF61226DBA8333293870\ +C8693C8AF52E5D097CCD94AD9BE287139A5F5AC9E3448A1CA781B068F76B64D362AD99080B38F7\ +5506A5E81BAC8F4BD82A4F35A8526909D35023C3C7D9F13F54CAB1D16413774815F20D07CD98DA\ +EA8200D4399C43494F769000C84752A9B95561B23626E8DE135FF44651C7243488C1DCDCEC0A6E\ +C8FA9A1A6FF8706EFA6AA8A664727A4BD2EA3416E0631F4911F1D135CA96A227004930D8BD4135\ +56697B941F03519489DEEF118E44F54EADA077F1E253C33740CC79305F869CE1E857D368A7E0AD\ +8F1714FAF0BF4756295E9A5A57BA1CE7DF4CB44C324B62A78534CAA2FE00913638A740AD9225C1\ +6D29096DA4DE452AC6C1A2BF0CF1C5F135A1D214E2730246724A1FB37D7AE6BCFB19F3D191E1C7\ +5B024B8442:\ +C3B75DFFBED80CEEA3D28397D6B86722185CA6BABB64088D:\ +0847AA490901FC9BFB07F125 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +A1D8F7780442DCF29F883A8379319273C91B3297E87441290B3121B7FE0F72E68D9D507703159E\ +457942A4F6A7E6C5C0D6B82204FC70605B16641376AD819C8268F208A3E727DE352FC57CAB0DC4\ +2FC9863C9952BEEA6A79D059FA52DCE5BC1815C1E3B2018E3A5CC93E86D162787C9A38B30808:\ +510D879D383902C3A1287F58ABC5FB35 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +8D8EA275C14DB64CB19760D598A38073E3BE840A016889DCCD5387B3052483E8B72AF6FC590FB7\ +C2365AE8F64EACDF07163D24EC80F390A714BFD910A15A7187CFFF1CEBB7F9A07E187C5E7D24BE\ +21B468CC90F6387D63FCD4EB8244921395C5104964AD85B8A4815BE83EA6D77DBEC292F50F8B:\ +0F57C4CDFE6F6317EC7C50CBE8100603 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +3D220053B6F702E7CAEB74DB867FA24D792968D4C2A59CCA308F806C3A5C00147A00293309248B\ +8A6EF0C50B7214B442E440E44991E419D4723CB59B6E42C53864A9AB62ABAF837DB330A5E1FA86\ +3FD5EF5D2ECACC9F04382807E537859E97D2615A9FA70B1BA046C006A37EA20FF3DF6123D0D2:\ +197F3A50A197CCB854AA6C85D608F93D + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +DF9C919108DA643347B191C2332715F4AC01AA13CAFF0CA525E214659E928F8C2903673BADF322\ +C52BA8C60E6D682BF4447704C8B653AA386562B7F20D880B23A73E573FC5E6E1FA797307B0541D\ +42BA1DA70A7096235F28F059325F4B02A178360D14CCA63E1ECF4F24DCB06872416D72E8BCD2:\ +743C96AD88706814461A15FB11EBCA52 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +54B42471FFFD76D364CEE2013A5FB8B145915408860C3E3F6F56F75E41031CCEB973FA92C9E67F\ +DE4A0FBA7AEABFAF65DDAD8C6CA7AF13656867BA72ADCA70373F304E4CE9081367F179FC65988F\ +5224E6A4ECE1C3299C9ED1D0B699E4C5481D907877441F5E4B02526A91EB134DC7BE551137E5:\ +AFB5E81BC51672AB968B33AAB54E40FC + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +35108EA6DFCB3251ACFEA14C7978A1AE729E3E20D1AED75FCC26713DD2416855C1F03F0121A0DE\ +010C1CCA302706DFDBC5F0DFF3E6B3F6C0A6C90BA96DEC940616FCBD4406662B822ED87A5F826D\ +14C612C8A5BAA10A4757BC278C0C3638C8AEFBDE11608E30087B08D957B23A0FA7C73FBC4981:\ +ACCADB90F6DBC430AF5B9CACC069C58C + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +C77753E149061AC705815FBC5E6DF1E6B022BF45CEA31959D671A1938A0FA7622ABB2FFA8687F2\ +05A7DB417F61CA5968A88E6E5447CF2639BB8813C66DD0A12A8FCE3C4FC893AEC2B2A5786AA1DD\ +27BE50633198341E224BB3761381F8E5CED9B17CEECB08D2017D4800B584F4E078A33BC75BC1:\ +76DAC1C77B73EC50F7380129345991BF + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +E3D437F8F4E2B5C79BED77075E618682EE2823BA800F59FCE2E6F18C355314903FE3CD41349931\ +323413F3B85248D0EE4F79BB4AA67DA37CAF06902C99EFA396A79DE4AA2CB3B0E67A0B87356D63\ +261ED20287425AB3E7455375AF21453536085D529D3D07525FC578455D9E43D529A7230A2510:\ +6E35E3D8E6D332E27C0BE03C8A5471A7 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +334554121BFE766D9E1D99C66E66E9580C9362D6A239A8A392153FB052BC9D5BDA4AA20B28C90A\ +16A40BB68240A41A55D5FC245FD5CEDEBABAE81E92171B850E50695CFE6E0AF004FEBE4D8AFBC7\ +8DC82D270CF66176F0B00BEB5F14D2FD261AFEE2A2B49370E6298EAE5DEBB86750E8EFF5974F:\ +C8E48F6BBCB573B8006B0A6B0523FAE5 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +631D5CF348368BC46C49DEF8FC8BE88FB53A3D0D8B6B19D9B4296D556B9DAF82D9D3830DBDFA74\ +6E09EABAC61E54878916966ED13F55570A76794B52366494D46B0418927116B5F466BC262F1655\ +FE2325D89FF2087F6545F0CE710CA99F603DB5B7D967A3EF00694F07EEF4D19920E30DFE3640:\ +39B1805E219B7784D334E1DA137B71ED + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +44CDEDD31F2EB9D7E5C52BB62E3D89272472981B6A56B0D0056A6210A836F4C7CE02BCE4120FDC\ +B1F8346810D4273CE45A957FDB4534B332D05DF7BD67D2B116FC0355AD416C77D8A42FEFF6CD9C\ +D4986F5CFFA6E85F30B5968D2D11BC407309B7908C7EA28451B85B3EDF3B1081596E300890AE:\ +A783DB338CA910BC771BE1BDFFF3D7D1 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +8F5BF391BB2FA4A3D727122BC05DEF4473C936FFBFE6E0A37276657418F18235A84C9B1B817BD1\ +63DC8D414F61AF31E1CFA51CF692952CBB501F117643F2EBC7470C3F870CB173C55D93CF810D4B\ +BA9AC41570A93ECA91CBB204A006A484956AF9473C50FE281BE39EF0A23E324137BABD00C4C6:\ +DE89AD958277237ABF4143BCA129B902 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +92A18810C64D4598C7CE3FF3D2CBAB42CB3DFE4976DE40D95621134C4BE3C066D11220B2E68DC3\ +054CAF977838AB5684214FAA05D27E5E110ABC7B719F184A64EE825A730D9B390D35195E452FA3\ +362B0E6880E547F983ED4C7199D321680497C9722C930D61EB11FE15807CFCBD81036D4AB6B6:\ +9BAFD22926AFE2BB782E07E3E9713A47 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +BDC0B3934130AB769D5FA9A2D43BCF3B3BFBA90CD76F04AB3955B287058298C4E627C2AB7F3951\ +B5BC44DEBAB33E3DCCC471E17162338C3BB42E418B7E33D5275547715BC7AFB94669BC5E3D30DD\ +A55C91D2BA23396ACCF20094D2CBD425CE273BACD304EFE61A01768C077DE5D4BD38307C25F0:\ +9AE5CEA10D25D4980E0D848D14166BD3 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +BB0FC7E77790B8922EC54D8EE7B74764C057B6066CA342FD2BA2FF5945EC9EEFF49F568011C64A\ +039CA7256ED642EC7CA86715293D8A94D3ED32E6EA74B4E437948187C29B5EDA90468FD52B6AE2\ +711D9B72B97534914D73C6E4F24D8B8D4B78328C891801FA94C6058EE687BCC0FAC6AB3E0775:\ +5DC3289BDF8E0AC2E11A6A846D6D3555 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +749223E6659B4990E3FBD44C422131460CDFDDDA81A0A90426114C09183B308FDDA2668540E468\ +3F0D2DA5BA5225CE30BBF4BA350441123E390D85C0A90CA5C34BA7D4624024807BC42666894A00\ +D2A3AECC60308117F3C7E14859CEC97553145FAE37796DC3DD869AF7CCD112450DE85A13FE5F:\ +9028DC083356F6539CAB46B85943CD28 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +7F55CF196A7704A73CAD784B3C9747615CF0AE344F576614CD5C4448979D1F2F58787B25DEE890\ +4A6DA1907ECD3B9BF7CA2399C794FA099380D1E9396D170B2CA89D1540469003405160DE22F403\ +E09D75DBB55AF8C8F346260569D7B09242EE7AAD06BE1B46C26DD9F72E6B7F99C83DB9B7C194:\ +119830CB54051CF9515FFA349A97EAC9FCD97433 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +66881BEF696C04B312B95D664FE71EEBDC95EE998C85B57D6237769EFE0D7D471DA4D2FE41053D\ +4DFDE1442C8A3EFD14F22C41292749375A902746A86B117929F46BED63F16D94073836DFAB3201\ +419E728F2A8901E4E543A5C7C021FFB321F275A4921FEA3F3A2CC54E05CCC985AE50BA731B6A:\ +1A1412B8FB13AEA84475FB158B5EE83A99DC560D + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +FD771ED1DBF5BC652A502E75BF74251FB72F67DD83276D6238C8A88A9BC667BFE7FF46AE6B62A5\ +BDA67499001617893DE1CB83BC08793DC6DAEF2A294315D53F3F6E7AC704350C456460A4FDAF4A\ +6F683664CBE88C476F2AE6F47C7B23AA1F024D13AA1DAB8F952D4142B51C984E55C2899862E8:\ +A6E318E21447AAB02FE846D51CD0CAFE6D020F6C + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +0523E8B622F04A650A50AEE32CDDBD3A4B25DF714094A6CB5783898C7323DCA8986477FE389AF9\ +42668A44CFA42ECEE4652A1709BED798154E5131F6840726E3EDD8F7A5374ACB66B25B60E193CF\ +6D2D7E1212FB04E841ED5595B9C38020433D9CB390BBA523118206A0BFF01DC67E0D46AFEDF6:\ +28845F13275E38336B32B99554E6F3A195D1AB28 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +1142B12772A584401A94ADF193D301C320382C62038452064C10B06B8A1B311678CCC4D0D2BBCE\ +25DD343DD733D4D7FD5EFB6D9456C7F690F9EFCB28862E2789316CF649A3D868A6273B915EEED7\ +A5EB401E59740D7899A7E7306E2563F086FF419A4827143DB9550E145D468876C67F33BFD092:\ +FFB05F0DC00FF74F159CFC3CE7B1BA5A09779483 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +02B4201C31F165C497154DB1EAFE1C082F88931B9010FCAF8E110926985C37A9BEC4DBC680ECB7\ +B9F45D024D521299466AB9246E7F4E40F8C5B402B5DA0A318248675B6A006B67E5B02198EF6063\ +24CAD5173E6A6684715CA91479B352E1A5711F6DABDA6C835BC1674E74504E02717EEFEB26E6:\ +FD79C0D751B8B9DA3C40C85B944EC105EB3BDC1B + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +5E3AA5F59F746A8481F1F1CB6D63822AB4ED3D4B7F94304A1C0E9DDD9646C617287038AEF0933E\ +90C523BBD736905EC5FD0332356C24E4D6B006D0FABCE86C09EFDC958EE748926D6AA9BC37B1EC\ +879FDA063FD134705AB21439768CA8791A6F7D996A722B45707904BD13984D61A4E5DCD587B2:\ +18A0DCE520BF4DD0724F5173022106C8EB370B5A + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +6CE98801210B00DE4F71DE0CB62E2D281C98D932C96CB34A009E1F3430F50FE287D66CA2FFCBED\ +C97EEA7CF2FAB70E3592C5CBB8625723B91A13D078C8DE1279F393D277419FF78E84B49180E7B4\ +E9B3E48F0F66579AC34566A271CE963581D7DE48E747D79660C78ADC308347597DD7862FC72F:\ +7480690DA8C0E3393A161E29C312139B007131A8 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +32E8CE4394B86237E45BF3CBE2AE3355FECE63BAFADB0ADE19C6EBA100ABA5FC1777688CA8FF0A\ +79F3657688458E4BAA47E9D7AFD9A4C1243F5F083809E367C59DDEF9A515D3CF395FB5C0AC44B5\ +F5D96884AF0BF1368C4D00EB8E06F0D805496219D9D8E8866E901C592D60E1449CF50D20E983:\ +0E31E26B5374E9DE11F528A6E7E57B03CB6B983B + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +F76855E776AF2E29D139ACFF506BA0C1C917265A172242A2A5652FBF9D8A90872503A12F9A4620\ +11E0894D9E34CFF08D979F37CB2553889A2CD0B8932C2B7A47130C0F724DDA8EA904F8D9FA5127\ +498ECAFA9D94D392642EABE1BDD8433A1CEC7ABB0BD065D9AA0FD04B68368E49A0FF08D10117:\ +B4B6FA36F7F42D89DBDB51D887475D5376CC27FA + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +7E42E03FDB2966552705EB79ECF02C652B2A62EFB7DC204E25439E7BC5C41D80F90D756C14A6AC\ +F0C79C15975B713E547623F71F225A073FFA501202031C6AEFD6D794B093A56E1F88A5BD8E76D3\ +E25921E1BD75B33D9604820A5F92415A3BE2C028BE60D4C764890F7FA8F89E9911DA716E36C8:\ +C2D17692AEBC93A9CD87248FA0496EE027B354CA + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +295C77B2D2CFCF4376DF06D4CB168A5FD315A46816986A024030685D35D6BBB62E0519B8753ED9\ +E6919BB94A828A172B9C01DCB6058915DF9889D1AA0AEEFDA89724D25FAC07BBE1208BEE8A3CB3\ +5509CB9A12AAB14B75C4B0FF0A8C0F444AA96D6C9E3457669C3BFE0AED6E17599A53F614EAC4:\ +1DC5682D883D41FFB9C6D9146A19DE5596351DAE + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +D2252875127726975223224C5B4E66ADFB573582539A796770B84C86FCE47B886A1CFBAD755C15\ +C49EDDC9932D3C0CF4FD41EBBA79D46C1A883F1B3B2B1626BEFD26B4708A26995C896B90354300\ +F1BBA09945D441C7DFD1EF152154520C1FA86D435C6B3205AE6FBE012F835C6B621A73A98B71:\ +DBAD2FE9A4B89C17AA39AC48BA3A1709543ACA62 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +9CFB54F9B1D66A5A96EDF432EF62841E52D33E90E399E049C554DE679B887E056A8F78D0653206\ +B6B80E0DB45C0AF1A36303159F4D1EF034B28A4835D04EDF61251F9C40493CAE5695EEC6E10AA0\ +91B760B7146159A491CAB476CCA1E39DD1D1B3A08FBCF327C15122D83197909B8BE0F72485A2:\ +E4C4AA2357758D79D8528C833607FA757CA50D6D + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +8F0A8C023B79F012A1A2788B5A20E5861397481AAAAF72E70467C06209B0049E7C3FB8762A31CC\ +F8D2C939C49FB5A0D31D8C64C78B2412EEE0185A846A8AE5974A1A0D55DFCEDEFEF3644845BA9D\ +17229FBC258C59605F75071F356C01C4959F7F1BD8FA294D65037C077AB2CF6C58B62759E8D5:\ +3264792868880D91C28949655BF9EBF87779DE78 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +FA183B4B91F78B2D16E8B7289D2D86259362F253CDB65B0D1C2FE45CF7B78921EA7BBB516327B7\ +454EAB0E3138AFFC09BD0DC6BD85D264321D33429496098DBA7B5F7F677077FC907A717E93E141\ +732FAE7E4B68DB130A928CEFC90062865FD8F83B071C3F22539AFA812955CE00B156E34426EE:\ +1D297636D3B1B64BC13420645E9A6CE6C6699289 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +AEA85A57F3F752FACE718C71531426067D6FC70DA997D59AB23013635D77F65D92864D76272491\ +71B2E655CDEF807E85D86A42B7722047DD38434975FCD6BB71A56292938FF230C75FDB57D9161E\ +DD6C64252AF0B39930DC8E38748B0BF399B93728189AEC248F9322455DCE6E9555B9EA097E42:\ +F0E946A71123EB5A6DE6B8BC44F843FD45285564ECC20881 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +B36A7DB00583F48EEC653314FA1C7D2B052F34251507FD176F12D955F31528A6E9FAE66DF4BA7F\ +2787982E95CCF1FC600F2C3DD7546CF2B0ECEF1A4E02111F391C99E6E9C51BA359F8BD211D2554\ +89F1C85D57D867CE43377B4674EF4C626CD7F40AE55584C390D4CB226DD71C379A0D0C930425:\ +BBDE3BFB69D2301556CDDC0C34DA8827D10217F607DAE9A1 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +6D608E00EBD99EBD4E2CB2C8159969EF2E9B21212FF4A1FC4165E4E048A4569BC1EAD2D943EB96\ +19D68BBB806F72A5C0ECD1584CE7B0CA6F322AB0467B64318E3041E5B0468D88234BEDFB91FDA8\ +026551BB4585E423D6C2D6AD0A0909B9849A6C329F9F44CB53B8AE2A7C00E3C3AA1F42DCBA84:\ +D09DEE33E299290B4FF3262A259BB29BB52F584A25723F0E + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +95CFA8627DF9A518B3ED1A5DC93BB27AF30A9B37C46E1313FEA680F94B434B5A39A4DD74C75C9F\ +9D1B2EBB7F154436027F3A6C6EDF84DBCFF604536409CA6B8FF2A66501B02AB95BA0268A41B511\ +0342976B9DC96E5F2B4F7E32979B4F6C275D3BD0CBF7871AD03FBF78E383A8EA9E7C9E9082A9:\ +65298E00B106B798D808647F16572A09C15927E24B8F7DB6 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +94D2C237DBF27F6D25B1F22735AC74BF4F92D0A7F8378DE493F82153DD3A28EFEA69B99A4EE1EF\ +ADDE786134327D0AC17585C66F1245466FF98F6B41F69D84333121603DBBF76B654135BD4271D7\ +19DA93196511B5DE8B5256A906EB4341C029A016382C40B726B30BC46B6CBDE97CE6F13739EF:\ +0681EB738C45B44BC134112E8CB420A1C3780D71A8413422 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +160B99E09742B020BFF397E0FB1890052D1A03B145C8905FF61A604B19AE0F5F7FE6A8AE1E75B6\ +502AD879DA2D081F5C6CCEF60C2B1E4B3C5023D9271857BA043585E87F2B480556295410C0AA55\ +642DC4B3426210D7899369976E11F4D5CFA86C27FF10A5C261EEB6D70A093F20733C34EB3C76:\ +75E916E939A8B762371C349082B56F7CA5342D240FC310FA + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +2E8039CFD8E4BDC9BF718E5FF80E19723F9E67042D4160106E50620362550632C08DBEED7B2CDC\ +71DC56C452ABC0766D883B657A04538F7353D9ED5B5BCB65FF035D8CB97051D2A5FD2C96EE1BF6\ +AECAD901E005D2B6A62F9FCEA63FF6CEE0E1AD27468D175217C50FE00F44C23F777CF551009C:\ +B76EDE68222C46E013F96F2112E6ECC52C079050BDC7BDFD + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +200B3DA16D1089B0EAE8814400688690E611FA120459AC843EF81AC08FFF4589B5DEB62944C851\ +667E6CFA21323B1BB063B4F803A11AB28856FC81D11C4097E2FA710B2AAD0AA0101F7E8B575F63\ +E74960AD851D055039411CA2F3029AFAF2E8A8B85EFB677958BB66D7F8D28483DC2F3AAD2ADD:\ +C119544812869B717339FCA3EBC5DDFEE645DB6193E6010F + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +F3B0AC1ADB198D82D68845EC4C0F354948FA2834A3739C8C8BF95B674A5D7A2C811AF0B517BCEE\ +62D9D5365F44A0A5B5C3B75F952383AF0248CE8E728E64959B672162D44E15CCAD0DF0D80EA2C5\ +1BC163F25AECB4E49359C93BA9338DC57C5AFA50FD7371EEDA38EC1BD0D77913C64BCFC93D5C:\ +E866DA8B4439CEE798D394FADEEC2108C5C2802829C1486F + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +E01640C6FB90ADE04D5F4BC99A42EC5C25E27E4EB59B2991FEE3B3B90119357A5F6E6FD4EF2EA7\ +52A79FB92A3133541EF6DF00E8B243A47F93485BF4110DD61AFBDE83EA7C0EB4A338849130D9FF\ +FE2F18EE7E32F3359464A488128559A7A61DAD85DFB909D4A4C95D321656D2C7F3B6D9876453:\ +B1A1E8A1CDD487E053E8EA1A85366A956116B0BBF3DBA2D0 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +F94EE0B40A4E97A792FB8CE1A09E0E2F1577D29FA6A7EB0517DA02AAED5A952150F57E105B9D55\ +EF9440F591A19931965F78D326A0F45E6BC179AC8B826872D3BBD1478F43B62C22B471EDF82BF4\ +E6ACDAF260BE3CB14F4A70BF947F0F70ED5C133FCFE06A805F06CE41FD4340A02CCED54C46FB:\ +D7C76ECF8F3E333986D0727FEB74A933FB078ACDA732E8A5 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +0194823D67E3D53DFAADE5625420EB0BE7E58C254E47A54858C52F42427005D6DE162DC1FDAC14\ +3780C202F6E1A0573250C2B050B4985B147440F024E0F7222794D70EDE913CAEDCF4F997E32402\ +25B5EBF179D179E1F1B35146250D42FF59431BDCD213DC2E0E7AE0FA4C20B1483B72A225C9E5:\ +4043315440250D9D80D6CDD850AE06BB000B2CAE4CF3E4EC + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +DCA07BDA8327FFAF65A6200C0163ABAF7B267BF00665319154CE603BCF1D971923D8F6A877D3C3\ +C991CE741F92AD78DAE00B6FA8A07F4B5521E9607D248B25EE2A6ED0A2E62032E3536FF5D420D4\ +C3197D24F79019ED6F98D0A91D424738E82FE4DD2F6EC8C35C5DF2A36D0A5F6911C3247F3FD2:\ +2B9B3D6C5CCA6FF1CB13E304A3E33E359AE5698C43BAF498 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +4ED372793A4B85C9D0FF69654D4BBE78DB2B4258A385DC046C094629AE232F136E63EF18FD3150\ +E9EB93504D06B5B2D354D1D3DBDBAF1B99599435B4DCC0419F278868465B43658ADA435E6492C2\ +0438DCE19435323B5E6485F384CBFF46D166E6E3CF97F32095C03F388BBF4E627A26BF35B9A2:\ +6D7A73687DEFAA9FA22344CCD67BAD74B4BA6A058DC7BA9C + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +F3D3E04261645CEDD6B423A102168281535EFB7B43EE0F07B925B710FD6171E8C38F815992A133\ +DC16B6EC99FDE8BECBB29205C185DDACEFABBEBA824424C1F910DF7FFFB81D934FA2FD1D41344D\ +7397BCA30D26BA0EE1CD7A430FCBFEE31483C6EFC9D577A2E3CC0B8C5A1F6619A1C0F85B0B16:\ +C49C6CFB09608BD78CDD826009220526AA030F2216DC6229 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +FD3866800048B2E0BD760ACDA846843D421B61204EBD31097EC45C6CAACE840CF611F01A9F5EE7\ +DEF380269A1C805239080B88549F19FC30365129B8B75117C2FE3C8B8F98D85CFA9FEC85BF5D95\ +D196F939E8A6140EAF06834DF13F0D1D4A3630E350666BAB04582DC7C6DDB08A6CEB8C54DAB3:\ +55D7A1004D57B763ADAE222CC95C90D91453EC7A006D922E + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +647281CBDEC5661CF5B3BDDA1E711505F4422309C4079F9D1B3AE4A49866D9DE180402A5300CA4\ +F65603DE7A797F497C326342B6F1DFB91B247094C99358C0BC875367F3407ED1E7BEEAB674E575\ +9ED55ABF01FED9AA360F4F049C4DFB60EE680C6AADF6880C5A52AC4592A6BD8A02653231900B:\ +9E232577306C0F1B81125646AE9D18C4C9CB5A41BD1F49C2E7213C31 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +5657DD6E9316DE1934E7C04681F88549FF92BBDC43E1DE589C08AE609119E05357EE5A5FA205C2\ +ED588E7EF53C316E3C5023923E1185352DF17605E0AD8CFDE15BF56B2B3C4015142B3D9B3B4893\ +241150ED83E5B956034F91033FC7C83749A77B08C37AED9E919781265E7A41CBC32154E45FE0:\ +64FC422E55B6DE470C8EFD59F894D238F566B94BDA07916ED9A7EC97 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +53368F208092A0D7B842B885D2E910F22E9BAFA33DFAD2548139B6FFD845C1AF579B77D40840A6\ +95A6BC0FFF8FFDA411A42153D7A349C6C61C21C78D9F664ED84AD1FDA1CA7FAC8676525E8011E0\ +CB22E89F8BA394B962F84CCB0C7117388CDB6B0F6C4C1E0A466F48395472F3BF02363C24E81F:\ +5834B00FEC3DD4650BFAE554545628CF93E2C4CB47310082888295BC + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +4E4E29CE1CE2A1BB216F6BD85844244731E8E2998886BC15234DB5E95DA1FDF09DA6F8491590A9\ +AF2719ECA6860F7BD1D2DB7FE6BB05C1C38DC2402A95DCC6EE556524E373EBC003D56EF2A03B91\ +DBEFDB3EB0BAF3BD0058B9BD77AAD361655B42229791D6C6684D1DC62BBB8A69E0B9B3577DEA:\ +AB02C30031CB74190E31F994D3EED4CB516002717F7F259BFC8CAA00 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +358996611F1464D8F0EC63833E3354C9258D358EAAC807DB66841FD48F5711495FF4C4A278018D\ +3AD15E14613B4EC54AC78DCF4A7EDC299AC237213882F10BCB027B01DB9B453BD0D33BD88531B4\ +0F9977FA9BB54B9448E1BA9EEFA984C826A65CF0D241863B945B8684F59E006449A740C92D58:\ +9C697CAA308F7E76DFDDA9588D9002E9B28C8FF79858C7E02D4BDDC5 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +873EF326CFBDEE5506BA5BD86EF7C37CFE5F649A4064716E38135C9FFE206C1267CBF14A1646B8\ +3CA770B1F86D1EA1438C216E753234C2AA08475B42883DAD3A2B67892E01D6D2DBB8CAA21D1A1C\ +87B66B895842D4E3F3A2E3753FF936AC8AE734D9A2EFE9789830DEEC38ED8AB0F15F1A91ECAF:\ +B2F3D97249C90040B9D09F0CF30DAA31BF586A7717E911D1333060A8 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +FAD37FCF8378422A2257170B1B87DB04076E366910CBB6381B822A8F66CF6FDAEE1953F4A5B36B\ +211B0B73B7E93E3566DD9CE06004F49B683E803D443E601938E8C84C6E2757E4C1666002B9C915\ +412CB719129DDBFF748E1D379B724C09082DCA39B056691B9ED21F47A4E3857C498C63E9E91F:\ +39D944EDA34DE7D3E92BCB1996196BDBE7D0D6AEA85F540333252008 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +A63D061A64D62DB78C51E8DD7A293BF15CDC65FB4A182296B8804A902D039925F13D5D9DE52702\ +7A116D581D2F77FD306C6D675D13526A4C3505364670C16139FD5D479F9B9363919E86B6C33A56\ +28FCCA1970EDBDF2B683FB9E54BFEEAFEC001551266133F0A5E72FDB8A0D8670EEE71F21BBE1:\ +59ED6E2136849971FEE7F5DDC529B7CE30C18A05A2308480FD792A5D + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +F8B9AC6B917837E768DAD946B8274C1A1623846A88ADB68D5A75934E8C3BF3447971FA635FBD24\ +0E626F226E5F00E5F5A11F5297BFC67711C557B308FEAD4A9FBE170793814F0E78FCE0FD18A91C\ +88B93E38BA31EA1AF2A173582DC432C5A00D1B08BD87D6AD25A11A902A9AA761911E894C8E15:\ +60BD44AD1B7E9895CF569D087BE7F8AC9EE737169C0861A0B0097A5F + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +417152A3907586B9E8F59D2F62CCEA5FF9556A6B286B61FABA146B067FB56A1B549D9E9409228D\ +5C5FE54B577F6902ABC9D4D5F0258D6ECFBB214E0A08A361DA479DADDA854C96EF80CFBE8BD277\ +A1D01D801F7079F94B4B92F3A42587104B44259F894CA375C0E4597926EBF769203C922AFB0E:\ +7F050CD0C1D36397C06231716434969D8D0514E92FCC1D550B4B2933 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +B2EB626B3C6A8485425F75273E8B771B263F1CBFAA40A0786ABB5042D04C7D6AF7FF96B63842F8\ +E8FBACF665538964881BC1BD0A0F0D33CB038DBCBCBEE96459282054BDE39AB31E82E7409CC564\ +B2166E6C03DCABBDA449E99BD094A32942ED21BA03A3BFD93620DEC36A86F299B7B018F4D325:\ +63320839C85CE863EE1FBC962C057C623EA2531B9854B58C3AB10216 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +076777CB3F25CB914EC32439031667DDFAD29EA5EC4DAD2A8CE97134966A4B21CC2374D4C31103\ +6CFC8175C55A9C4D1647589B73A8866EFC30BA1E3F7B7688F2F819B868B884111A12E90D78B3BC\ +350C41BF9EE79DA16D27C1C28ABF12932AF23E6F57F50DEB79682829A5FB4D95CCBCEE8BF01E:\ +09292F664BC64AE5A21DBBE7DA2E2EDBE3F6D87446A0BBEA9CE7E6E1 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +A4ABC46FC552EC00DA3745959C1198733C064521B7BB0E8F7F5384051A4A23C6FA5CACB2A762E7\ +5E8FF44DC41DB1B1B3A72BFF0116DCECEEA3257E88FC863E562C32B9BD55112CE7B2825DA8BA6F\ +ABE9458BE0ECA65901A671FBB7369B62A3579C47029F6212F775E01ED3BB9E2A70284D49C9E3:\ +56D4718FEFD691064778EAB35BCAC749ED62931F9A5B46137BF6C4CD + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +8D8AB1E9E8385824E18C6560872C73D7B2D567B9B4061EC447B0694B3109D05D89955A4AB47541\ +2223BE082AF95066146D77E22EAA042DFE360AAE8000FA375B4185DC1A056E48DE3E6282F4FC2D\ +9BE215BF09C7C5ECAB95CD29E9286542C35654AB23982221C2BF5352358D8FF27A6BBAA34AB6:\ +E48054A763E7A3EA9CD093B565D664248218A872E58DEBBBE1419B91 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +9287CF8EF16BFCECA5ECEAD6AFCEF50FEB39FB637DD78E0C875EB68B162A70EFF53C08FCF888E4\ +14E4EF0AF8793BDB5F5641671BD8616E1610264B364E4BC5584EFF564FFCBCED53A9AFCBCD205F\ +8A7C60F2125550D93102121A25E233DA212FAEFBC7A453DC8CE2F2BAB2D3D02CC1F41F7B677D:\ +F0549B6B0B6F1382593F986E3AD9BBC541AE11D1ED9A2C4D7CECD236 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +2DC8D0716265CBCBFE491B26B0CE8144C51636D7A5E45F4558DB6EA78AFE5CC65EABB4CE1D3E4F\ +D2D1C7266767DB75B331635DF7CF3E46432C2D37ACF08BEFC73C9A544B121AF5B48FAF56944357\ +2FA4B3B4F9FCFF215D0D813116E398C1945F2B072251A92FF2ACC078DD82E298B63AC9FDF2CE:\ +81580051D3030AD104AB6D1D0A03E00AD011BD5A2C48B407DFE79188 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +6188BAF16DE19FFCE9051A868B3746988E699825AFDDA484C242FE08867E19F2BD27C3AAFC51E3\ +856BD6ECCD5CAF43F79B4192ADF5EC7B13CD476D6F8566044646DB685B32AE0E83F23A33E31DAB\ +A93585272646A9CFEE0626AC517DF92642DFBFAA26BA5E2158D7101A7E3E319AA200DBD0ADAE:\ +7BC01C35F8977BE59CAF0D4139A65D1D52A3088482C72B3DCDFB30558B1BFE0F + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +35F87088FDE70BEDAFF51621580A0032902AE95DFC7BF73466EFA2CC5FD2ABC72F4B958352FEA3\ +3CDCFE675A0E971A9CFE809794E1DD4C951548BDD9A6EF3A2ECBF2C404E291BEF95A42A1A4EF22\ +85304E7F23157F4509BE3B482F59067143BD503210208C6D0AA05DBED3640F30926C04D0CEFD:\ +B0E8BF51536BA3FEAB51E6480730F80114F50DE1A41EF73A477DC524809CDB98 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +91682FF67AF5D75F08768D1385CE7257FDD619992DD1634F6E6118BA4CE94EF9D8F6D620E94296\ +C523B8C780BC50F2761EB35B0F243788EAB761951FAB2F7742DB766E80E96D1080E5C0C6513D68\ +25885B9F865398D7A5CC7CCF1A9A976302B4933EACC4CE9E1E213C7D95326D70BDD34CDED8CF:\ +EBBE1D35F01304D1CB6B400664B70E57C80FAF6B630A6719826DD79E4FA8200F + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +607A183B7C5F03BAC0D00D7DADC446255AEB8C78078DFAE6B167CB43A25815C295FD4D134EF8EB\ +9A5858240E39CEC6D4C9519D681BF884274248346639CE90DCCFD55990174B960817ACEA2508B4\ +9C9263ADD321F11F794C681CD8D191F57911C60D9B7AC6018837A8A13651E6BA4DEF8E890070:\ +F9BA1DFA6B93C46AA579CA6BA81AAD50B1E9B1EBD81D26FD36B20C0EE2C251B7 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +82137497F0E3EDB4C6AAC483924F051E5460B8E91947E0A3FF9CEECC7645E519D262A4F1E0611B\ +CD3760C4D1E8293E814713C61A07AA7C12F1C0F206C97DBEFE191170FBA988347B52DB7241594B\ +252800B7667BD1DE9042F4B88A51B13F507925254C0A03C7AE3C704A7B4F9AD96AD5992E9997:\ +DCC24C1F5D2C7240EDD9BAA530E1BDD68739F0CFE59226977C508AE8D4C87323 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +CCF9B2CC2419FAE9D04C92E246385E4CDD87E29213092C677B9D699B7905AAE392AA270DC013B3\ +FB7DE8AE837C81023C8EDFB0F03DB6A548D4D460075490507AF6DB17A32F48C1F99A6069CA94E9\ +75D1FDD78271EA47AC9EC196F37286B53A8B540E44A8B8835709DBEBC7A7EB246971DD0F4722:\ +917D882FEF03ADFD6669CE45EC62CDDF5FF1C03721FF3193C21C5930CF1272EE + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +05164B3F11E848547D665D426B1145559B69322F8FBF7D28B4E0E96E59390132AEAD0D39375B38\ +3C216728DADAE7279CB9059E725D3EE4772CC41BA8058B88C5A0DDC3B5E8F710C2D4CB55B4A680\ +7243B569440FD548A13F2996269F1BCD38911F7B811AD2204D35DE8E99FF129E9248CBCDE2FC:\ +1FE748157BE5CF6DA0AEC0DCA0E7720BC1EFEA43BD409F719FD2A7BADF8794CC + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +6ED1A789681A608231E66A5E07023C61DC71901C4EBE810A22D1416C011702CC66D33C06365F65\ +055ED9CC152B7F6729F9A69FC5957D89FDFDCF7955156D0C688D94588FB73DFBCD5B7CDF9E0FC7\ +8BE9389158A395028ECD0D91353E3692192481C676503FB1849082FF38BB90DA4FDE760FE5BE:\ +2C6825ED9252193DD2F4F96CCDD9223DAB33524EBA2DD3D254852D8F40A4FC6D + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +F4B7357D06DB0100897B838AF028EA1148D7D955653E1ACCC1FD919BDDAC4981329DFF1288E06F\ +0E2805468F6BBBE88F3E27ED6C5B73ECC63D946C4B90D841BE5D3007AA205E2685EB112C7D10D3\ +6E3F0449A4D2F773379722846F4CFBD85060025C41650E7AAFD97D348959AE3652A8E93F80DB:\ +0ABBCDAA3E91D88CBF4C38CB284BA3306FE470A1388C2B96E46936BBECE1CC3D + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +0CD874631E7080D093A47992DF9816EB03F83A23D9CFF79FE7FD068403FF3E0DC3D4D881952B10\ +7BABE1C83FA226A0D37DA5621161F478BE0E986E76D477ADDC2CBCCE3CA94BB29DF6E4387AD9D6\ +2CB8550553EC5D19A24BE2E7E386AFF65331483662E155F38EB3DDE79F54A1C75B0AB9F83E7D:\ +800A51F252F9E6D431FA3DCDB426E3D4BC3E1A34AD5706385F8D063FF5B716B6 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +1B907B35122B8E5D9CB6EC43BB6BF6F0F5C2FD7B65E98AE1F4360E4B4A9EA3165CDD59342B0A22\ +54AF793A09E2AC76F6230413ED204ED47B9836EAB4DF6D82469CFD1B5393E39DFF9E0DA74EB56C\ +99BA357439F1B01C158742C9CBEE4F7CC8E15AB181DAC526380A2CC650F7125C93D20AF80640:\ +E14E65EBFD403DE7EF39C663AD4E08B99ADB01D00B2AD024176E0EE35CF11A42 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +FCFFF45F031BE2C3D6B85032C754D39B83688D3470587ED1D13D9DFBC74CDE191F33D5567BEA4E\ +3665F0058AF27C7C8FFC45EE5F012CF340B836824D508EAE7145BA2067B6BC926C5007F7803FD4\ +67084B06EE858F1A1059C9EF0CBC85E9BD7C454010AFF2B0CA04A9AEEEC54F07AA48634A5F53:\ +8FA304D1DFF976D5649AF564FC3E3917AAFFA59F0E4D560D415F27490FBBEC37 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +0F34E8E8517206BB8EB2426A684694052AFCD7DBCDD3419303973A24113B58CD08530000527098\ +E72A0EDDDDD78380DBDFD60EBE30D5150475ED2C95CCFBE860DDD94BB45F6E40E81C5263C7B2CC\ +B79F1C6CE75AF6D2F1E572B43823EE63A3CA73E1256AF44FFD6F0C67E396348D489CA663E478:\ +FB9E93C4F43B223837F9EA773DA68A03842496B8E2BBE7141673855DC3F73114 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +32EEF5793FC730D20B8A8B9DAF7E54BEFC79B9713F8B19FE252194831E8A2DDFBDE392C5190573\ +62EE1171331F1256120D693CE463D187A5ED1F8FDAF5D5BB9D483C3E912DE8ABECD2E70EF9D921\ +E1DEBA85FE051BF3D25297AA9EFA0C8A836982184254703ACF1694C65A1B2BAD491D9395FA1F:\ +C506703121027BCAC2DC90AAB30B5CD30AA87773B98D3B182115B8F1E32F4BE7 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +5E779BE50FD31E25442C0B04D5FBF92E83FDB492F22EA12899A435E468C9CBE839CE66A349B299\ +1DE381389A310F653D85D972B9D9F2C875468EF1ABBE2C9F8DECFE452055164A1EAEFF4DE0962F\ +B3E34848672D1D1CC1F91CD4332D520254C0A9B49525608C462292CC4F189B15F4FCE120555A:\ +18CF7B4A85C5D9901E1D92DEB6487B6292C0A94589183151575207C4F776F4C6 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +3586BB52787EBFE1033261802E9C88E29933425EDFBB199C7650FBC56A2223EF0F12A7450DA282\ +93812ADAA43E5EF663440EC16905BF2EB9E4626F539D94D41D0CB11231D1BBBB145A3A19E384FD\ +645667CA2104A0C1D56F90848508B2D37D194AF882EE2C198EBA68A10B112A3EC9E6265B6726:\ +45DE118319AA726809A10C56D46915A88595811603B9A146DDF183D24DD0EF1B + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +9ECF899E3F58E481103B201C076C52EB93148CDE72B6EBDA0EFCF452E13195D89FC48BEF1A9117\ +7364C49DAA87F296CB8B91B67E40635648445984928207379C85E8126D94015A223F2DBF696FF5\ +3958AE5FD52E9CB8F5575730A874CFABB1E097F85E69177A47776EFB1C1CF90C1A1D62CA34BD40\ +10006E432403F8F16012F6F4B440854A19A208629AE54BDDD860A4BE4A1159BAF061E3FA861339\ +636815C3DE489782D7895BF4472AE48DCEB1D3836EDEDFED8EEE4F86879E4A9864100BDDFBB854\ +8CD4C7109FB0DEA6E8709A89F6704D0741E69538D11F151D67C991B84A257710A8A22E42BE4E68\ +065E77FA1F2A6F5F2CE7C09FB221C86CFE8299501E547ABC79AB1EB9F7C3BD2418E2EA3205BD51\ +51163CDACE8E334EF82E8970164D0CDE7E0A86817387078B10FA562A09820E0BA2ECB8D6342227\ +0E18370B0DE7F5D5B875B226A365A3CA40835E84C3743A50632615AF9ADD11B8D2FA4D0E4DD885\ +2DAE6FD3C24CEC2CEAFBE759627B59FC7AF5CF91A5DF974ECD1FCA9B062DABC4A1809D80C18931\ +C713820DD4C5F6FB09E02D419E4E461E4419C20686E7269A2BFAC1F114D9943B96E26D4509A44F\ +E5D9EA4E2D50F0AF4B7AA476AD21EEECDEB09DC1CD19B3E501C2C42EDFC830DC94E35EFD7C461A\ +21E05A3EA4EA83D7496CFEEB0D44A25D756A09367D353F1D0B694533D57801AD0D9CB03D3B4072\ +EAEF914C46CEE34201C25DFAE244612AC425B5F1E932A0E4FCB73EE2209872BC107F77DF5828C9\ +58E22CFD979DB435337F6FBF85133A5534E685E3C07EC607F92CB8FA7AA5CF2E1A8C52F69462F0\ +07BF759DCC4E51D183D88A541829A279AE3B4EC70822B6E6A3C6CF08E9145B84AF7FA76C6A792E\ +35C6F39992C568D6846C5987C9CA1EB7E730F6E298D199A6F0609D6BEA3473321261253EC5B276\ +0FCD458B6766123F0BAEC522ED99AA9AFFEF817A491F41CFCFCC0882D3E0C3E7E6E1E3F948464F\ +95CC9C9BC8E4543BD50C305A1822063224697AB2AA2FB210F776FB705C326530E50AA5CAB2929E\ +5F972BC45A3F8056078BDB203E75531A58AA279A3EE84615DA808E2018EA49A3FCE1CF6AB487CF\ +ED6EEB611182D1FB2D5B6E050C443F6C61833B0A16CED574DC2A72676F55AED91CBD5B3D518D06\ +678BBF5300CFDE4E39A35A3291A270D5442EEA2459B76EB8611F37388ACB558A76E8CE5C5C08D4\ +21809FC3A15BEAA37361A80D58D5CE60E5119D6B8173E464EC4F01EDE72F3D1BA6D4E7089A606D\ +CEEC5CB5181C7AEC6ED1CBB84F1779D3CCC2F54C341B96F96A8E2042AD7BD3FC5819EE1B741179\ +211588106D5561334180B4EF9476ED01B44140C4594D2C0D6EFEB0C167BDCB20772505B894A2:\ +71CFE52667B4A931A046532C71D60787 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +24660DFE3352E0C6FBC9FBB3A981589A2873679C88693EA1D12022A3BD95F693FE99CDEED2B828\ +347414BC75DB4907D60AA1DD9C54DAD229F29351BBA0646A668FA57FC06FDC44E04E40CF9CCD47\ +1A82976F14AE7CE835F89E27BD607CFDCE54464C4871BE8CC4A2CB9D62760CD08F7896648BB032\ +18EE30D5855A20114081CFB5B402461E098B5B2F561E628EA3FE0E8313CB955B077BA58B756522\ +3ADC84576F10BDC0608800003EB5E5D705A563399341550047C1265FD9A30C4E5A3A8B603CE2F7\ +7D6EC6168A6598278FE662FF3B7B923F54348E12FDEBE2A74E070D4F4A7A75A3949FD36F393D83\ +D48B80604A5CC32762E72916EA951C4D8FC4114B9699C092F316078C1AD390CB8374653F0F3977\ +15FC80908894FF89FCA4FD3E27F8CB15CFF26239FD79F212B91084031C45110C23BE81BFF98180\ +25ABD3190C767075B4284A433FB87ED5C551DCDC30F9FF937918BE347FA95DAD0C5BEA42C24C61\ +22F476253A0C976874F57E824C3C15FDCCDC225CB2B74D4CF0C9439ECE94417A805C91FCB399AE\ +5127B28D6B5FD82C24496CCC901F265EC169AFE8B5ABB4BE5BF98831EA1D5BBD95CD30194FF346\ +1E04353450DC7B82E48A796B1C5A5871A1DF22E5558887556CDE9FB342D420F338E5C5E0FE9DCC\ +F97679FC22F743F4E853FE459E3C8FE402BC05B22F2E429511D3EEE94F422037527140CB914C58\ +0FE1E0AD937869A4E246A83DEE4E65D63DC109EA44F6081F45D08590D0CC30397251BFAF74F981\ +09D052C92EBA9C3C1DF373B52A5DE581A212405AD9AB62B2BFF1395DD26BE790A9591C21238881\ +AE8E4F034E389CEA9E7960AE05A097C4AF623B4EB14017E42940ECA45483D78F40BE6BF986FE7E\ +7CF75AF15E5840CA3DB75B9877D2895435252395C1659DFB195335FCF2DB3DBB6400077D9860D3\ +8F9D93984136BDF8542C46ADC71434B17B9D5FED0785D282C44FE6D08C5CFEC856DE0EA33D6A92\ +CB313D17074966436A757F94402164D3883A7353D65AADFA2B39EC9E979E574AF9964A34BA636D\ +761B448CEA9A10B5B7114B3B1B53AF5F5793FADD06BE1465114519C2829F3D23329D11F99018F0\ +1FF9F9855A744A97494B90282288022ACCCC58D6AC48BEF73B7504715B6565578EF875A9ADB904\ +CF1B53B933FF6F0F19FCBB3FFB87443B64DBAF472A16FF3A29ED5CEFC6179AFC478707D7C4E58E\ +8F3C82A9AB4696FB14C4403CDB6F2F5D423F39A346F809E7EC5CB2A21C9A5949E4C4F888FA0A98\ +4A5F2324C1A810887D0E960BE3728173F9B8BDCAEB471B8CCE8B837C6D424468D92831C06DA69A\ +4505F2CD98DA06F73326839FA913974172E4EF2BF1D8BC9CBEBC8943768EEA1D49FF05C2D86C:\ +98DBAC0E4C2624FBC6474652ECEFB1E7 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +9633FD518CFCD7EE436ADAAF7276B57B740D98BB4395362FF04485A69735B816A59C1237481A70\ +948E0948F354DD4EF220A1D066975A00E758D87159D5A5A9B0F76BED463F27A7E2F9628E38A749\ +F96A446CCCA40A70E387D39CCE3192A6C090FDD3C70160B51EE3B2FFC39B46E6B443C778776CC9\ +65D691D35E61298F41ECEDC4D80C28CF72484D79782336B56A95B282279EB2DBE7F1300E0509F2\ +55BFC7ABEAD61C6628F4EE410D12D1A8B48FFCF3021D95A6002D8E2C0E1E8F4291855D941AFD86\ +6F5D93E43EF630AF63AF7DE546B518BB8FA0E7936CD2CD59FF48F542B1795B1AAA36800ECB054C\ +CEEA862418E33AC76697996B627B8F9A15344685E2BC087FC9DFFE48C8A842AC70E5BFEF0A8D32\ +5E86C7BE2A217A2581D37F2D185D07E09C4B859D98B325D03C399C0B36D1FC8B46BC20DE9F1985\ +EE87362797B984E3E5D5B5DB580CDC916012BB40F3C97DA934DED61996882A00A0EA65C2C3DCC9\ +4B5E88733EE2E8664275FE26810707EE2D8C8BCC3E4A42614AA1DAAA7DDAE0434F9137A9B4B88F\ +E89D12B99684C58906260DA869EAA396BFBC71F9367F191E475AAF4A0CB8831CD39BE94C51D95B\ +2ED63987DB37E4FA59E48DD7FC4B9E524208EDA0D5896199DAF89A645D6B419EC27899AA1A64DD\ +496B2F7914B69952DBD6927D191FA74A7561EC6C577F47CC115D8F24C738406E1E51698AA45266\ +2DFFFF81807CF1429C754C6ABC3CFED8E7697F08267A4AB6F403EB167FD42A2BC386A07BDB3ED8\ +D59D98E8AA85A92B5EFA2B9D3801B81AF1A12F351DB4F275A30CE635276068AC86597337AA1AC6\ +810EE0658EAEBA4CB872C5CCC2FD5525B81EAA690498DE590BF4ACE022E9AFF53C533D40A938A2\ +C9459E0EE809F9ABE118E143CD40C284E986E053F7250D2DA54E77139E2BB248EAC2403AED1E46\ +0C4CCBA8AAFE729478F180754A9330F8CCF999580D63B9AD63142DD865A94920E1F37B974EBD18\ +F6246820370B0E85E9FB9BB27FA4F98F48B10E659F9849B51DBE89E62A545EBAC0E91087928643\ +4E303518E0F19B19293D7F70A91CC0FA7EBE39C0A4DF4D142D9060451D6D4EE029473441C20C06\ +81CC5ED84AD7F8E0712DFFA9D3FDFC319030253AE11330023B3C74990DB102523234562664DCFF\ +AD0A26B3AC1418E97C08AEC16EF934A61FF508593360275021294969A0BB17EEBDEDF8A63FB4B6\ +C2C64FD875D472CD6CAE8B6085F3FD30237D3B31297A4BFD1235296CB0146DCCB8526BCBC776D8\ +347C21BF4D716FE3070227D72C3C70B3F0BDD0172FDC73F69C37DB9512D1323FE57D60CD1B99D7\ +7BC95FC0021F9D98FFE142CE8CC764549039520F7479F092AE10A2CAFA06AEC496FA24331F5F:\ +FBCAE48796A9AE72E0A4D218BDC0859B + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +A14B6E9A9551094EB317924F60FF52AABC369053AACF65FC84B5A49A1CA7EA17F874EEDB3B622B\ +04415EA80821203CFA4C6E7F5C0F88CE49DC7E49DC58FDF15DAACE114BF7FFC13666F3C5954795\ +4A664FD9DD0BCC5779EE33B858B767B155A167DF2A3C93A5735C8D54F0E29E1037386EA2BE9277\ +CF1E1618F96F1164DEAFD2F6FFE62E550B1D7DCDC737AE66E2DB6032559946110742036201CAA3\ +6E3A0897AC470DF4CA78134266302F15307EF18A0E21146F3404B5BEFD22ADF97E5888A2207D9C\ +F9A16E329171558C83D5270A3BAB99CB941E36C4B308A4F27FE98FB8AA84818B63FCB44DD6FA97\ +C30A86D87E8B7656CD05D722A7B3483C9C338FB12D7581EF94FCE7639221DF785C9CC52DC27CB6\ +CD2FB396066AF964065ED0A9FDAE5A8B202336378EAE2B5CBFA463C9F7668B0656B0DE6EED47BF\ +B062DE72E8E721EA5C3363CE2749FD0F3A67899E532B19EC5E54FDD399CB2BECF16CF0A91FC404\ +364C0A8E46D52389D7D1B2B7CA0270A650713D8F6F812DBAA7F06CCFA24E200B7C8438B04323F9\ +D29C163E0F734B40B0389B1AB5D0EA77265B2F189650164661AC14B1B49287AFEEF33014D52C59\ +FA06540E5F7090DCE8C77ECA6CAEF38E9293A79875E9E04DC2B79C8B2FD9A7419A9522DF5FE5C6\ +66D6EFDFD8253EB54E6FFB41AB6ABF957784FD88646AED00672DCF495A777AD8A0A4F91C9F4FAC\ +F930949F2B59008C2A1CBB2D3E5FE0D4A8E0CEB63AF23E4758C995382178C4FD07D0777906DCA8\ +A919FF9B38CF2F9F7CD9FE276F12FC7B0DE1DD31F3042DC74654ABCEADFF0D196644FF8175854F\ +8EE3C65178C45AF19E6E43659CF1DC46409336A48EC5935E941593300FDEB7FD738232A5417F1A\ +2B3CFA16CD08A3835FA08FF233208A385723D566952C7385192BBF1C2E73A2B1376015B7484998\ +9CBAD04866DF8D5EF484C09B640D543635852DDB3A80F2F85926D4154575F999714C4C88AE7435\ +EAFB151BC90A5BC7951BD6E4A1CDD568B5D0AB42F9B1E1CDE0E7D42F6C29337359AC383168F001\ +F43A79DC440E153EC16E62D5218EA23C2F8CB80201EAD61131BBE1EE5C85414FBF0D0BF50F2B74\ +B89A94C391E567229745C15B8E7459BE663C6AC83DA708F5BA562608F5814A3713D040A7452513\ +C8EB36A3F5088F09C9CCBF9A1B26F1211ED41F33DDFDB77CA9E5319DDE52A749C88CC7E0907BE5\ +0802C63EBDF5702B93E09CA89EF9FDEF41A8A47352D166401FAF92A8B35DDF43ED66B98417E304\ +29DBB317C8718D39BA5C364597F6C034B20F585271958AB284D184DA758650AE8C9DA359BB922E\ +DE4450DA14666AD5F02ED6135DCEDB532ECD6CEA61B071FDD364421B941E03DE48ED1DBD73DE:\ +BB1B359766D442D2E9FF3F7995A26473329055F8 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +5ABDB1C683F4DC2946F45916427260563A2B99D6A45693A684DCB02ED3FAEA19867E3D4199CBC5\ +906A4416E1AF936E3277F5B46722A7EB85DB2502C830C49C39B526DBA34EFB08B96C161ABC60AF\ +3466751BF5F1974E29DA846F9FE0A77A7528CD2EC911673301A5FD70708A088739D4D2CD991515\ +4BD06BBA1A0CC682CCE16BD1D0C68A72D2C85CCA0B33F6091DE098A599C3444FAECF15E7DA5769\ +1B7BAB3E458069D5F03FB5BC7C068B80B47DB1EFBCB075CD860D3B391158F615935EE977193625\ +61C99D06F0763F9DB85C987801CA9D44D66E8EF8B64B45289BDFEA52B514DA12A2359451B92641\ +983991F17F4F9DDD0AC174054CAB0F70171083A18A103405D861BB4F2530D077BA68C528058C46\ +E497006CA82E7FD407A3B78EF7C7A8FBC4359ED109337083DC8EA9F6CDC9AA694C353642CCD20A\ +344A5B47C42F31F25EEB82EB1368A2171B5DB13E4CADFA21558D0DDF10EF45E7E79E8143C556EC\ +DAAD047CEF149404902521DD965CCD0BC9B8354967CEF3C1C50779443B08BFA82AE49BE9927330\ +609AADDFB49E7DE339447B73BFDE525DF8A4D54D2D7C4FF0FA285D39DF0F2DA25E66F0A77DDA50\ +913CC00E5531B449D8499198E0D326D07740A29D438E2393D9D6F49606573F35F924F3125A3727\ +F5C3BC485CCFE6DBA28CC7688B6D8B88C7AA62F405F38887F2970FAE4BB38DDA60531011DF615B\ +B58207BF10BB0E3087E0F1736A1192BDE595668AE6B4D7A370ED2572C388901C23122A8684E025\ +6BA3AC3F7F547028E31AB28EC0EDB31E922F3FC3BA1265ADB8C19A87774A89DEFE0D51B0B70047\ +0321993E671224CB07D017C4C0C057AD7DC2DCD634CD88C53E74454248C4D562707EA3299E6C14\ +5C4A86EFCFC3567678B24E5B8D7481CAF2BC6D2194490B29C0F2A6A19CD33240114F44D5AA852C\ +69B12951B89E599A36E42C32020DC5D45E1080B510E898BD08784FA7418D6DC1BF8D089206684A\ +EB0513A0F4D431C44423B4E2666B9BBDAE879C0F1DEFCABFFDA4A45DA816AC4C6CAF1DE1F35D19\ +5C88F05733D60509E20301CC64FFC1AC3B07DEFFB364A65B6C58EC10E588FD5420189FC3D5A3D6\ +7CAAAA3C6B85986F29984B11A81CCD904E96290EE31DC937D26C84C0E19BE0097952E8F5D0312E\ +D44AAA311C09EB98D275268AB6FA7075D60C8881AB1CC3516DC79563F7E04D4136221E41827589\ +DA880A812D85D91AC9A8DB37B547524CEB835F033B1A452587A39DCEA47C26C9AD418749C82786\ +C96927B8BDEF0DC2149F38836D3A3522904E08288300A69B16F0F5E7F5DA6B6248D7D2800786E0\ +CAD44E36E32F89870A28B8D9D6685DA341A85F9DA2AC526B39E9A9326E5AF5D3E38D8C99976C:\ +05C3DCC6D59016C8A56E2A005CDC423B9E79B2E1 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +66E3E90396ADD580D0CAB8120EBA8B827B94F8EB5CF151E6DE08F163F540E902C98F6B069D4952\ +B8F0D4469C3B90D67FF87A60DC75063B69AF405A72B3045A7A878820804ABB23ADCB1D4717C9E8\ +9BB90ADA72714255F3DFADE1CFDCAC240F4AFA5D5AC955106390AED2E72E673EA8B45E2A92A166\ +C6131B5EDC7F3FAE3C256E586C56ED9CEACC32CDC249E6F812D4EDB4783ADF31CE6C83BC81F77B\ +6705C1ED1C37061A9D3BC91D7C0F889F5C91E574D80E3CFCF19754201CE5FD4379EF087369CEC7\ +F68587907915FAA2195544490DAB9D3434AE49832556232A77CAA32A1D6FB6D797F0E388DE8A98\ +D7A7B2D5FD71BB4983BC4790A652F8FB99D4A7D0E18DF328BF376FCEBD2FE8EBEB67AAAB608881\ +85706F0E320765BFF8516280F45F53677BCEBDA244DF9F5604FB8C816E21478F25E44DF83903D2\ +A3CA94BD8AB15565B60A4D41B08A155C42E7AB92922505C793C1796EF03CDE688F1FD0E4527888\ +6F0098A72FE0AA2FBE87F56DE1D2F2B8A3EA2533FEACD41880067FB69FEB8DDB8C9B7276ADDF0F\ +5DCDFF1FEE3D4A9DC8E66361AA16931D1C737F08CFB7F5A874F1294B25BC2DCA5757F65603B8C7\ +2E7985723628AE7A6D9A0B5BA1BBA655F639410C681C80B0A9C3FEE24752FCDDCE948314E3D341\ +22270608F563A623569412F5BA073E54B59EB379672DCC5A85D6247648397804EBE8311FA5070E\ +1DE5CD66EF2FD736D5598791BDFB0F6EE30C617B3471E9BCB49759A679D8BD1D8FA86748F54C7E\ +A97556AFF98F0F49A1EDEC49F97652C197C5D6618E227306DED51DD5F44D800B23DB2FA2BA2599\ +A215B7DE3F34AFF7ED3911A5C6F7F57CCFEC6A47C7DAF1F2728FB58AE10400C3D8B29E4B1DC819\ +14D3890C1D09B6F52019D4D28A1701A9CC86EC9150ED845BBC5DBBD1DC26318B0420C64A1825DD\ +9AA0C8E1B47836F5C8C4C2B70F6B758476E9BE624FB42EF954DD94F8E326B8EF51666861702A5D\ +1D65D62135F89E3564D3A913061AD00A3EBC3C5AD3C52CB732304792D0FD2F14BD0644A5E3BEDA\ +6491E35EB1B0CD52FA3FF75228F55230FA20444C272AB54DC0C0DBA7971C923AB8CD6E72148284\ +019321302E2B1A3580A20A4923BB6B6E104529D948B5770E18BD2C6CF34B389F1A4A9BDBC464CF\ +8FCE544891145D980293DF4F0FE6F35DF22117939BC26C89735D027541B562A93D0C611BD7CB87\ +1B556A3E3F0FCDF1F5DBC7A9D795C1B45E1DF6D91E6C7AFEA00E00E44CB6D25CB6C2D658D0032D\ +67C7609A8598BB427FA9B8767FE3E3BE1733CB352318E6099F7EBD3B1025DDA5FEF1F4BBB7B173\ +5828D291B77236E7660A23393F116EDFEF8CFDE2DDDC3017480B4E6D8A16AFC5EB4955AE855C:\ +0C68CEDDD3BFF23048B47C9BD966A19E46F7E2D4 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +99350D7C2BCCB1F021C0E1269D7B764B0C3015839F0645127820CD4A8413E987892E8704AB3C3A\ +E99150F2BDBF9FB7745E7BBD3FC99B573C5DCED0E842D98242D8F31E5DD69B6A8100C7DA0C0E33\ +ADDEE224B9A7ADD35ED065743ECDE4D38A47D67B3553FBA06C4D2F5B7A53B423C367DEE0AC3CF9\ +4B9A7C620743609E27F16EF8AADBE74FED3A727B00F8666562461D126038067B44B3CF1D7D41AB\ +BFCEEF122F6BAB5403EC7AD66B8B60F790DF1DBAF330A040B1E542E783DDED48C1D8E196A9FE32\ +A5B7EA6F63446E9BFF93B0B3892CAF044F87002381F92D9CCD7FF554E07EA42CA7A44577C47B54\ +97A212157EABCC342D650A41F3CEDEC99E5207FD0AB916697D85A619BFDE3AC899FF424AB3EFE1\ +7C9C8B96F58AAA9362DE3DDCF097D7E88EA3006BE01FEF9BD9481CF9E1DA674FA133D114D5910C\ +4D61523CF20FE135CA48F3379C0A29D0B05AD4A41E782968A1520BA8DC6268830C55BC92D19232\ +EFFCC65F351194430EC4F25DF2413DFFC08783876B87A0F6AC630CDF04A4FE19EC6C56CCE07515\ +4866E7CB687FF5537C880679DF8DEB23D7278ABD4AD260D445388132F6848D8B6191FCF90D0D66\ +D4B95B3EAC5439D6C6303CAAA73B968FC385EBB727B6A5526B0162E2AAC32401C62B3FB150C598\ +846241854996E412E99873BA2CAF040B137250F7706EF5376ADAD52FF13B812DD74A8792E2474D\ +ADB993C2239494C9CFBF860F1216EF02246911AA8FEE28042A22A5BFE311406E9C1F4EF8233587\ +10A6E55C07A31F59B19D70500835FE15B3B36BB119A4971A67D66F3BE04E27175069C21EAB2F28\ +737C5F564552CAAF7D45CA4BD7FFCBA429E7593E603975EE81A97E8BDBD2C5CADB1C18818DD494\ +D7186D36B36F289118A834297C2B8C3BEA35F716435F49E32559DDF80910C3767CDBAD107070F7\ +37EC37DC47F5E3529F863096FCAFFA389E848D8F411B54CAF289C382C0AAAC6C781C03E78BAB1F\ +D299C8C14D2A37916F2287D6B5B1195D0A176613065D8C3038096A5ED63DCA5F9EFA2E3A5D5445\ +87DE1BCD995CE4CF371873D0F5032AED6B1A08686E4134B1EC63BD9E755863771B885CA610E03C\ +86DB96CA77E9E7CC0C4D97A185297501C20A5953D70664CE9712D4143B0F8CA7941BF6F114F8A9\ +2ED16C5ACAE4B2BDB940CC573B86AA7918167BA3AEA93AF833B51590A09D4CA299DFF975C2F1CC\ +B2E3112CF5684C60344917F6400D1B1B6FF0A986A1CB955987354EA8B69B4203A664882F6F1544\ +F71B5E89D104CBE8AC412E4FFE927F9181F54F1DC4A06B488D7058FF1B59D67A47B42276E9E4F5\ +5807CB1131340C5C7D5FA901A75999B3EEA02E853868E6DC4DA82A2DEF303E2473A8D7D6C0DA:\ +D9A5B1BDEAA3E8DEF14E7692D97F502C48A9ED21C2429BE6 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +354FBDA4E986570038B707CD6A79CCB72E00640B07DD1418643F2EC5BD5B281D022EBA2413CB38\ +0D061EA457CD4F60208F7A99412F0CC511005371CA55BDCEEA21DFC3AB42CC654E0A5E0BDE063D\ +63E4080AB120959D0B298273F02A070BE9355CE28583844CB85049FA9813DCB0A1762322501073\ +4578E48A543AFC3BAB1F7D50E3A2FA561440D08488BC6135EE12047E89EA92A22E175F1FBF370B\ +E1C4B596E14F77BB4462F34418F6BCC1526173FC8F030A0604F24ADB94AA01C9602745803BA767\ +255721F0907B2F387A5F31C3B45780CB1F8F526169E5D710CA88901C5585CA980B4B39D8DC6EE3\ +D563EFF3725E3E149D6EBA1B2239662304D504FDFD53619D17F35D6C2597BBEF1257CF40608548\ +4540FE0FC2FBAEA3955F49A6BC71028D984804F7DB46C6E2ACCF9CEA144781D795BD4F65332E3B\ +0FCCE28A63028ABA2EA2D03C8BBF76BCD8DCF50343FA40D53C133736A632E78B11D3D5CFE6A990\ +4CD9598CE9DED58F3350BE38937867F59B66115248946F701998A9A3724185595B114E696742DB\ +0EB92398CD9E93BD93AEEC0006B9449EE5EF94D7DDDFF9221336ABF8280738617170D89D2B6B5B\ +8BE4570430F6721C2DF50A94679A7FBC3D6D5E32953D93F8C2192C70CF945B2EFC73D3BF5AB1E5\ +EBA34EEE60B755918E2C3E71CF61D666607FF099D2594AE8EC91B9882DBC27FCD235C4AD01A568\ +CA39B426624948D732F7DB11F277EABE1F53AB877F9841B4DDC3C1886FD6F37B20F3D80BDCB874\ +8E99F3A30F12E5D3FC5407D40D95BFCEEBB41515C4120267A543892D115C1830220964F841AEC9\ +563368DDE3E837C3721DB4B5E082073FDCCD87914D495AAF07890B1673FD8A614E5873634EFCE9\ +E223C2F5B83DE8453B773A86E4346DCEEA885D7BBD5D9B50EA3275A7C7A9459F5FF974AC0296FD\ +6F2B7DDB178E123112D56463F2B048829D3680020B549D16AF318C8FEBAB7CC6798AFD96F67347\ +BA86EFF75BA5425833F1FB581E9BBB3EB668F80A441C69F61FE290D03830AC59E2B9805677995A\ +DBBE6ECB0DF9166385ED4F896D4F4A8A12B94EB26001D7429D4A81EC3FE613DF395E08D2A59D56\ +ABA82F9E7196EF2B9CD024CFD3DBA7D50863344BE7E291B8295B46E8DCB765078DAD3C3C2DF539\ +84BDD216BB5BB596A5CE204762737AF55328AD03D0CC0BD11823E89A59802FD2D774C830DBB16B\ +2AC25EF359454F853FB85142BE2745A6A325F421FBBB41F6EFA4F4F931B01707E137B5E66F96B2\ +C76A34F866940F0C34CC8B6560D55C18B468BACBE4220440B5A07228F4BC635CAA92325BC5F670\ +BF0BF3F1C48AF93A85A7A245FC4EF214ABA06CDA6351920C3229468C547B0BF9C7CE3CC7142F:\ +57426DC52887DADEDA58D6297A1680E85C1E65EFB9285D99 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +B01557E5B83A7C68993572EC916B133F1EFD32358EBAA3ABF519CE1FF7BAC100E603DA5A16DC49\ +FD5ACF9B04DE9C4ED5A862AEE3C9E301392D32246461D3DA41DD69240B47C4554D6B036CFFE7A8\ +3C67D32785D77049A056A4BB9AAC1B94A43516D56C2B23DC4F0F8BC203614144E296F48065ECFB\ +812FE28B0622A24EA973B6BA4D35F9CC1263D6B6DE14FEDA3A2B62B7608A84BE07743F1C911806\ +EAD62CBC130C55DD6465960C8041D17AB27A2EB0661D2D6FE03B284773D84EEFD68AE37BAAE934\ +0621D3656785CC409846E61D7D44B327F2D5CE6247740929C42C193EF515A283365A6C22368518\ +9F32522C12F8D6FD67BBCCA7D5BFA7275E0E1877C3A16033CBD35CF07C7655C9D1AAB6F08F984D\ +5FC420F07B498BCCF77C310DB9358BA43E015780F0C79E42CAFE0AFFA5F7A47ACBF79D5921EA8D\ +3869E74D7A56CF05A3BAA75C8E6A38F78BD7638AD9842CD095A9E6D5140184C99A35AB3DC6A0BB\ +CA717014ED032FA09C4AE182183113594BC6D78731A0211D82C91F41F6262FBEF6D1EDD2FF973C\ +1173C70071A6F516DFC34FBF6EDA87CD097EEA24A693F19D8474E6E53B02B5B682B4B77D25E159\ +2DDC9B9EAA12B19D166F78F3990A1F557CB6DC795754C00E8066A7607861779237798C100D0BD9\ +75354F1E307BA6E10870817482E4DBF633293B67670E27E81C88BE245C0FDFBBECD2668B1300E9\ +1D53D0011BD0F67399EEE363FD6B63C8BA86807A866F3B5A00A2C0224C40CD6838B717BD2A58A2\ +4115CCC0D8CF174C3ACEAB7D98482AA1E29F29DE27F7C3B60BD5D991B73803345EC59347C1922E\ +CE2896A6D8772BC7451D665B210E7A7CD1631EE2C55893214111CFD2CC3944080F212AC85CAA45\ +9D44C669B36CB59D6A09E15B2146A0739EA5AEC2275000E5CE45A3EC36921C2917DB20042A7635\ +2C28B32D912665FA5857C7D6961BDE4FC9F9279EF39D9EB2B826D77293280730231B0F530BABF3\ +C3A25DFDBB5E5348C5AF8690844DC8CBCB55754F5E5D5BF3C6B0EB639038D58BE4F631299600F8\ +781906ED42D6603A432037BCB72FF07592497A288F9AA7AA379358395F7BE07602E547D6C37DA0\ +C3F22C395068BBC799E2BD00BC306CC5624D00CC55CF46C0BA5CE9D722051C9BE866BD244197FA\ +CB9DC70A124AF897396877B92DBD891C57E6439F51168D9F43EF740A7E810966EF6009F8973663\ +E695FC97946184BCD39D13130B4DCF218087F16A7344036AC7FE0111C7050464A4D32EDE1081CC\ +EAB6A15777D9CCA0BC644CC82EC660BEA8F416B53DC14421E811436C4088A37CB1B46B83A95A35\ +3BBC54FBB836618D1640AC53A2BF916965A81F6E1149C0EA89D50D182B652D97A810F5B43819:\ +55255DE499962F4597F5C976155D223EEA3740A7544D6BD9 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +23AC39460E6746D760C584C6B35EE1F579B43161AFB94B725AE5E3D1DB9B5E85D70068A81161F9\ +CCEC724CE1D2ACCC9C5CF21AE056BF733F9134AD16B2121F16644E43CF1D38C498DB715F134FF2\ +677DEEB796B43641C9C508103016F94B91EAB0311DD2C8E81D4E1F4115CB329B63F34F68D62314\ +BA4C77EBCA6DEA17438B9689537CD849CC08AA11665FF59BE715E2341072DCD3BD6FC12E21E176\ +FDF969CBA0FC63705250609BB745E8578BE290B74E990993E2D09F8B3EAB2DD36F360734EACC54\ +E03A4A588ECE8C622DB610C0CA883A699EE4E97E31F6BFA1F0771AE380A1502D178AEFC0916BED\ +F4A0BF876B18C23245C9FAA024CAF00832A60A083052D17E6BB8A6FAAA99CA1272CA2D166A3CFE\ +60D19AC01F1A0101E8E39508BA99E10D66D0611F01E4F212434642A2742A6B454E948EA7B55BAA\ +AD242420C052EFBFB531BEAD83C60B7015B4FE943FD6962B08B1FD6CF2767D5E045EB1F223011D\ +83B061F0AE6653F7BFA64C0774AC423C74F17877C7BE62669B095DEFE73F389D4C25C8BD78CD4A\ +C76DF63C36A19082C97473B08B3F2FE8C5D89143F4D8177E9372414673D340B301A85C5D9200FF\ +B36D5BB12ECE203CF00181AA5034C09A7BCF3843F98E22A02EDFC1A50F896774252D1CAC93F578\ +9BA684431BDF3C7978F3647696DEF4489DA921B76E56D46E208E31F2B320DEB6196E723698CBF4\ +3204E68EC8B86DF48344E2575F3E9F1818A334C66A942EC3C3D6439CDDF970D4419EFD0206E413\ +C99ADD9D48527676672C96B268683F49832EC8C1B5750B900715A7955DBCF06A2AA6995475D15C\ +7D5EB440E228899315101E6A8A45842EDBE41785AA4B2808956731BEE81AC9ED8741884052DC10\ +090FF82CD9CCCB2CBCDAEF343143C5D7ABD58A730AF8229825EF2591A253FB52F1A21C8E5CD64F\ +E327FDD55BA792CB1E8AE92A3EF84F035D72F808976350165ABA7675D8A520B9EF9CA7D04F3D26\ +B8ECD7E5CD61A19D0CC13DAFEF2283808B808B4C5DD01E9A6DE54662D4FD21083120723D84EE76\ +2C197D33277E0D87E777FB2B619A597DBDEC83A93F87ECCAAF64D3223CA1E2CD2F7A46092EC5FB\ +0CA5350D575828AA20D60DA75379C7D883D662A0F66880C7170E11BAFCFCA74556A180F140E173\ +6612FF94CA2B5782FB8990408CC77D39FA68262C738A607F27CB5247A00482A7C17C19CE01147E\ +536898826372F81157939C70BF693C9A194619BFD5F9D56B5C63C0C61B3AD6AFA5F03BA313E4DC\ +69C6E0F1DB8FF4A3019C5A4E990886197D5C1A31A7C108D94B285FAC00C617D68B177C26576CDE\ +8F621A6FDB021FC25C9534BF7E7E1755611200C59193D8C28C7B2CDF47A05CE9D7A3D89E6103:\ +2AE43BAFF61783491A33341B26F65F7CBA8E393B19C1E97BE420FE58 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +040AD7CC43206F37EF55970D545AB43710E0BB8AB6FB66F7E7CF60869F5C61C018E869CA7FC0E6\ +E3798649BA2A1B7CBEFB1C59EAD2A3117AD370CC3CC9D5714430429A002BB092098BCC6DFDB593\ +E1DE2546D8E410773F3EEB2E10A15AD39D51F7A87EB244818BDF53DC3536C955982A733B5121B7\ +2BD5FCBA34D479F246F505BDABFC6A0D95CB0FA64EF6287052A0BC26133718958D19C7387BA152\ +10DAF602037E407A731B918F681FC2005A6CDDE141E405493BA0987978424C7B189C94B13BA8A3\ +0865241C1D6EF06A8E3EF3DFB9D0E2443B7F47A4FDB1D02B5FE31BCEC51086CC38BFC7CFA2ADE3\ +A75ECDC3B4D01F3A9FD71EAD8E5A0E9870C605DC4A6F1BC3932937EDF7F4C72794978C582A4819\ +2C12156B142D9F8D00D837057296D2E1263BD7939D56F56D31FBE031BC7B1194E2B19A7E3A83B4\ +82BB57AADF5FC8FCC653227ABD1C895CB3CC7FCD5B7BDF86FEF7C55B78323DE51E2BCFC370880F\ +A872BFFD4CFC0909A9F79B8089EF50E7E93239E679E158D6D518F7C5555F325953A36221C1269A\ +E5F235CF338BA7A8615EB1D0B54CDE65291F6EDB3C2FE41FCBDE0457CF050E5E30149C857A91FA\ +F767743C968C56B94FF79A4CD6F798356F20091174187EF169210706E84FCFADF57D96B7077433\ +CAB883C73C060475C207E611E679B9A795428FDD891626CFD6B868203714F71BB158086F93D86C\ +A5499C0B9B8109E1CD0F7E6FDA5B0840CC3FF0C1EBB4CEA6DC5562BD64BF08EA6E675EC6298C9D\ +5E1296B327B4EC150C0373580011D105DB11CD4E8FC8F3E49A64E2AD9D1D2261C85FAD9A31BAB8\ +6C7D92837FC297CA387E945DC82CD10255D14ACC503606C0A9BA7E2F4F1C72A5E17801091ED1BC\ +B2B9BBE91EC4EDEE5A908EB3BDC51EC443BECA0E99F5BB8A2656702B49723B0A3B37F6C7443BF3\ +E85F77CD3DDC39A7B016F1F53683E75C103A4C78217D2CF5D5E156E2293507E25E17CDC7B22136\ +92E0A15C0ECDAD687DA2ADD96D59B609A7A9956DB3705C22E38460933FF5302343C5B36ACE8DDF\ +022127C5F1046EB03B4CF2BA625989C2EE484D365D04D69DE3612D3961491FEE3F101A9CC66543\ +BD52D0BBA41819CA542E56C58F1B2861C224EF4A9A50AA4CA7CEEFBD3BFFEDBE82D5FDACB315A6\ +B9A4F99A01BA7B09FB9D826DAF4AC7B913D8A9EE93894B834B8F2A9B242F515D7D6C3A2FE9FE59\ +7583497785A299DA86185235FF8D255A17BF45851C67DCCADDDBADB5D5B49D1E357793AF60FC39\ +E15F201B6082999E5252B6C34B542003C209A8F28DDAA58BEA27763AB060510D132219BFBB5CE7\ +D8F6759D64E2D25604156E4657E3EA764B2C3D2A0710EE44D5AD6EB9C7407FF852C2DC161D46:\ +2372F9B0FF27B8B5FCF2735FA58AEE77083942303E1378D777407E0C + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +063AAC01A9FD95C649CB7891779D91D9DD1EE283A256083007C910D584A8A967412B486E9C302F\ +EFA2E4B3EAB48160CDFB924C3E4818315C2E8939BE010349D20A80E34886BE789BEB3403CCBB3D\ +A87FAC97F60EE091656565843AAC43EBDE6B7A65FA71AFE86DD8B00431A75A84F7B40231061806\ +491AE5E20143F09949FF991997C93950E209313E28D1B1F17FD790AA03F6E9530C934566A44FFA\ +4F059C681DD6C9018E1FADD0DE1D3F48E6CAE065013B1CDE175A6714DC64ADC360700D2E36C120\ +70BC591FD06A4DD02E5555B26E9A319F9AFCF1FB446183DA03C53631D97DA89925ADFAADDBABBE\ +11B118FADEC43A6B726F3FA10087E6FF75AF9DBE1D0BCDC29F88CF2C31492CCD38C834F237FF58\ +709ECFAEAB5688C3287D1632CCECA70ED625840256F93BF7D21F05E7AA3E4F10117C980826B9A9\ +6CA135C510BC1413A1A2ABE79DCC335667771EB5D327DD9FD8659D8385A79526AFCF88D15529AB\ +76955E6D5D4C3E452CD22EEDA7576ED1ABDEE5D75A003D24307F861DF68335A2E071010F5F74E9\ +C5CCB0ABCA73B474E7EFFDFE50F8171B4BF4322E7B5E1B555E50B16F27F078BFBD7EDCC55E7E4A\ +D0752925226E2EF083AF2BDDAF3F49AE3E4BE98D174F9EFDB42FF413B336248FB6551ED9AD42EA\ +2F619B25E9BC3C26F7C29733692A091C754C23B60925EC99E013D002EAC4234BFD35BC420B7AB2\ +69419BF731E1680E6715D7B268C463298FE1CFC554CE6A0875D09177E679035A9E4980E828B894\ +87CA9D8AEE9406943EEB4AF2B715EAE982C0B129655B392F765C4BC59CE9AF4049FCDD52C50600\ +D4423045D61D4F917B2BBA7D20CE7086ADA6786000CFCE344BCFB937F829FFBD9388553B5F4E90\ +71BF8AAD6326859B78E4BB9F96FED01D84E0C22AA6FF48FD3A2171DA8BD32556E010E8FD120C65\ +02EFCBC0FE8F3BCF58A021B1CDE9156EFE82DA463805504309D515A7DF571BA206508CAD4B9715\ +8130576BBEEB5757F166E7ABD74CCA2F68417DF7076E2F7DA29AB4A4242545B41EAF240F1018FC\ +12E581A9C023FE555AFD6FB4E08D6016A465B03566EAAA4FC5B6583366639DA696CEB701B446BB\ +B320E649536C14454B091840C0DED9BF51111E3EDC26E7644CB8CD342FE5F19E8D81D9F21FAB9B\ +5B4C0FCB020E4468C8D5C4C6C42312745827DF00E8BAC1DCE0838BCBDEF39C05A50489D8E0B9D1\ +230729F544C5ECFE071F67900A394C2B5F3E993F0B1EFE487DF0C92B0C9C378D6ED097C4DD09CF\ +59A5470EA59E0CECD91129D26BB8FF8A145E2FA70C1F2AF7AA615712797E24546B22ABF8542FEB\ +F3C7948C328E7D8470AAE32E44A4E71FEA0974CB76B7775617CC450999BDBABEB98CECCD756B:\ +6951EF357C02124B4D1E31E956FB7A3E1F8EECAEA99C2E3F379D9F10 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +5E45AD93CA54638C779AA42B69C9CA40E659E8169C53F968126C05D39F08C5794136E206FC9CCA\ +51F496C6E781AAD51424188D80CC2AB68745A5B277538ACC82AF5F9C2F7E24A2FBA1801DDD7E2D\ +FB8D1C0A599E6E7DB9EE28483E9A2F1E02CF0C0640988C66B57F4B60018D1A7E251D4FD87D8D15\ +2BCC74BDDACBA9AF2460C3738505DB119029B4261A96BF5A95F385420713C283E843BE2797DC28\ +1C3F1A77548E97BF9B6D764C523D2C462F77DFE2121A9BE7B436CC4B4D6D00D8810E1B80DA3D53\ +C28D20B06272CC48E665150A309DC80B8E4B2C8457C73E0A81B734F82F0431877167F116306954\ +6FCBB7D0C828A8F92C60F28B679825CCDB9AD1FE0C20B184753AA2357B04DB9EE3AFC26615DC80\ +B7A080748709D2237CC22ADF374D74B3B4A1CD4265FD247E4B138C9E8AA4FEE4DAB218090D9C4F\ +6CE5CA6C092F109C5D0740F0D9BD298FE75979B5EB122E3EDC0F1B5829F87E3D92EF91895B00B1\ +5CBB36CA712BF71FBAE7D5FA4F912C324C6BF8C7E2F35441F9F38982E6D33299160B058843CECD\ +911A64473CFB46683B3AC23AC940E2B4E253F47B160522A76558CB8F487C87CE670DAF81E5650F\ +FF511DBE2DAA34344B1133E57DF8E7455569FD89C2763D7D3214E7B158320E795FCCC78AB535ED\ +A3FBEACB25CDC81EF7DDCB0A7C7579F78D6585DDBF6EB1234357495EB8A36B7B7F81F50B3CB7C4\ +185C208425DF40950363DC9917D129A681466B1C8F0F02ABD5A45BF240ACBD2263C74E8AA2D9E0\ +DEF480ED29773AA0D6BF518C0FCB8B6B005A2A41A04FAEC5C650EB280B3E92326244902DCEF85A\ +581517EC6CC917BCB2A69F2A070F9D8E0AC15F79790B0DCE9E508A8C55512E2C1476BB63018D01\ +4E101F13FA8B0B5CE0D5D6531DB60BF1E0C709C5154BEBA3CB74D8A7FB21C65857E692B2438722\ +8E48CC4EF259E94C2BFBD7B8D6EEF502E5B30227D08F8D9B31F61804220CD7C0B36FAE7567E664\ +FDEDFF60C3021B1E4FBC8234EEE749E01F0E3E4D6AB2AEFE5B170C01CE7C7875F12D8DF551EC46\ +46D9AFEB43D5A47C8D9CDCC2200BAD5D32624492444BD7552B7E0077292AD15CE6B26A8FA036C6\ +7CB71338BEDEB6E9AB0A17C1452256AFCC6F9E457525F9D285DE4BD16FC66309A047260C932EBF\ +F33E2E3E6EE3C0B3E54301E0FB5382498995E9C5D8078560A539CEB8BD22600486BEF999F8C506\ +E3B40BF2062D3DFA98A3303C52423C8134D713B2E7F5DF254237460655B4FC668AF7B3886EFF4B\ +9214ABBCDA6D33DC7E7C9FB9D67B056B9ED2ED7FB31892EDDAA32BD99C77C533223B4E85808F3A\ +0C50A2B196A6B091C1E876587E9631959BC0FE1A6711242D52AFB80664397C4F00A14017A2A7:\ +3CA260A152BCE7AFBC673137B4B258DFCBCE5E4946B909468F727B54AE3171B6 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +85DE284F504C0C624AE145B4AB67FB7D91EC26D0E9C3873106C16D5C09BC7CE453B4D495199873\ +BC375B31ED963978074F6F28ADCEFEF618DDD53B2393D4C99F6FE8F09B307403538EEBAC5B7647\ +449323301689751FADA050BD6C8B8AC14C0B645B0847957C803D9F336229D9C59D3A276491D4C6\ +06FE6CC1F936A97246F1EEBF398A4109D75DE8BCF372F8966579CAAC9A254C14DCB573F6868C08\ +E8D932A63905C8E318E28DEB26134CCA2CDD631389B130B1D0469B86C462BAF826EBD48CC9B775\ +CC5D0002D87CCFA7DF9F0E90A80B1DCC0F0741A3CD6F39E51FC10CA683DF6611D3ABE6C453CC27\ +675F825AC3DFF2F7A521D132C71E230E84C520BFCC1437905624C398B4C5908A0260E7C17D8C7A\ +DFBF75B059EEA93B87CA731D82A0505C590587796C7FDD614DBCEEC4A984E0612EDDCC055B63BA\ +DD66DA0541D35E4AAC9E766CD67CEE5CD75177387C5C8D94C86434ABC1B14639FA2599812532CC\ +CF2D72B3443145F5DBF2312C74263A48D8B7D09E8E622D9FA1723029C84C6D904609C253AF8FC3\ +0D574559247BE10029265C2DE89E12C4C4505434969E8703AF5906A278AC9F3E7E01D2A8FE09F5\ +2C121CB3A97C7C3A4B9BE17D146E8BC2213189A356E4D9959DB4170F1D004BB2D4FAA7B56FF489\ +8AF5DEAA337B1807B52C63B474E1FEF110AFACC1D57ECA33A2DD248BD830A16309CD9549BA44BF\ +D33724FD447D217E5E543AFE7DBE74C503383C5BAC4CE75D20632BBB92FF02DB888DA566BD7E59\ +4B613C3754E1FFCEB7D53C0BBE678399BA448B9E35F0F2BB0477B767B1488EC90CB4733F1956E9\ +6E1845535BA97224E569799551F07B8CEA084FA8852B17A9D8B34C0047A15F8D2754011C3B523E\ +3E5F5763EDF6A06269AA3FD281B8F9F1B263705A9F5170C34B9E7C46F40A3048E7B98D21CDBC6F\ +721250670E82DC60DA8326427708105C297BC05D8BDE97B0F78E55E00D5B65C65DB5B11849290A\ +6D58FF4F3B88697879993509FC7A5092AD6E194C35BBBAA74C2452FA12150CE3B6F1ED8DCEA0BD\ +600F529EE4D4A84400EB8E756770E7BCB7E279626F9EE6B30B9E9F952DEC4150CC71B0F9939809\ +C7D2DEDF98D01112A9A58821A0BC96D267AB9A2B77C21AE53F1135F9FD390FEDACCFA9A6817121\ +FA5719ACE8C079DBC8391C1B4BE6AF67ACDD52016933A99C9F2BF62093D5299D093EEE7226C49D\ +5BD519ABCDE8AD8230E3B3652F374ECDA7F0A6BDB84A8EBC9C657213B402EEA5EA5FF2F426BF8E\ +189517255E38E19ACC793971CB4492E8D346D25C10EB626CD709DD670631B2F19C95752879DAF3\ +DCD2A07109625F4D8403B6E153E3536521B78B6D6AA7ACCAA42B0A2CF47048099441A5823F64:\ +003776133C69B7D16F80023FFA5657C44DE96400BCF49A7F7ACE7BA18B224F21 + +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +09CDB68A29150A0DABA207A6515339A0AA10470318DD7C6C9CFE89F8DD520B6E5DC9A612C6E365\ +91159E162592D695B03300A2C5C4C28C8912DAD980E9AE05533ED8D7F05A5B55A8DBE01418C1A7\ +1F01FFC89ECE38B0B457FFE586AB48780E0F297EFBC7A27F713FC54D0E8217D760D545C6A384F7\ +5865C02F0DDF49B0FDFA7D920F57D988B3220DC1BDAFE0325EDCBB37E94C09EBD0E17E42FD0E91\ +F86B958D9BCDCCF525F8FC4F16ECF2404077257EE35C6E86DE6264910E33621535316C30752500\ +EC0D52BF3256BBE976B38390BEB6F960A6EB1954356F8D94EE248AB021CA09192F808F8026C34C\ +C95DB1C5FAC16255C518A2E3B0283EAF066F6B31A03B2170377C08C1D83D350762347E61365B04\ +D8DADA99FBADBAEF87D8008BF09EFA3153CA0C79321C0EEA989E74252CCE2E2A34F0FDE7AF1394\ +D94E2DC52E98B25680E5DF6A1F99E6178580F3FC6FB1217385E5BAEE4AAD33B434CD74F56CB95A\ +8F9F263A0CB5CE04D5939AB62077A5852F7F1EF8E7AC72A8DB2C7B13616B061262BB6A18970CAA\ +340A469BA8F86EE8D1776B3B5E2F20F64E4D02F6A3571C7B5DB810746252B6C51E584787925164\ +67B0B564A6C92935C7F05A856AA6080AF0BDB0639921A281983FCC406E3612B0A3626805ABDBD9\ +01C7E0E93B69505170CAEDD8B811AAB18698F3ECC6B6B0856FAE92B7D72CFE805931CC3C8BB65C\ +784162C1B88D53C50BEC2370982C0F4F0419D26D17CFA4E6757C782605B9419134FDA2F09C568E\ +50BCF07626B9E6B401F55B43036C72A339570652EA50EE4BA5CE3AC1E098F61AD23300D51F95F3\ +AF334CCFBBE3413D418A1009137CB9EF22ED141680CDA3FF7727BAEE26C2E35780F9FA8B63F122\ +9B24CAC1DEE900F52C03B734F54CE6F5E5F32D89E4C991D3788786DAAFDAC3C262906DADE08612\ +FB9F8EF1364ACD2EDF23416F1AD0BC3E23D5A5EFD11C3838D3E4694D065E04C349F97AB5B9B4D8\ +C0272CBA7AFE0998BC6CD51F1614476285F11163D20470073BBCE0A06EABD199EDD2523C9D595D\ +47D211D844929E3D614C26A75F7CB90734DC3B9DC7005DFBB66101D9B0C3DFDCB03F972087D093\ +4EBFCDD1C9BAC0F62D50C5437E5A9834DA80FCD750D8C577DF7703A63B847D75B9505C522FD241\ +10C1237F7A2DA2C6610661E154FCA6326A0272BDD16BB78C9891D3F94B1BCF064A1E0DA24B582C\ +962FB807C3A69B4489AF0EF8488C59530EA5D92A95A12B7C00F28889AAB6A91E0D9D6593944AB4\ +C89CF11AAFDCA2D72A1C0C793CB4C18ABA658207517B041C7830B3799BA802841623F3EC6C3D6E\ +2E1A11E0E33A1D1F97A4E6D771D120B11C52736AFF0AD3FEBA59FF03FCC087F50E36839B4119:\ +085A85EFA966BC844824B45AE82708DB927709623911A1FD7877636C62EEF2C5 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +0C79B2CE647574C631FD55BCCB1DB3BE69BA847E0F23AFB00C21B7D41794C10F3B8F61929227:\ +1510BFDF958D2C4BEC1EDBFD675ACE6F:6D1DDDEEC1BA73C15CE4851DE0B6CB0E + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +DC61600D30CAE1E33CCB50E4F7CBFCF7C889CE9DC780B264CEACDD1C21133B49F9E1BC4EB879:\ +0ABF45AC5AB91F794B98DFA5FA0CD894:00DA828DA37D94E0841A484A2EFA4C19 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +6072A1F5D942825E92CD02CD362FD79B209801622723A30DD7F99AB5D7830DD88DF4BBB29E24:\ +A6787289DDC9376947BB930EFD48CCC6:FD020136FC6D6B8BDFE9C13CC6E3F2F7 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +846C5C3DD0BE453FDA15DE04706DF957036BF8771305D35A99D57E5EEC0276A0F8C69928D05C:\ +15175F1FC90E93CF104366657D8BC80C:874B703E2D1AFA6A9DB2CE90DC30F76D + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +A134A7EA12EFCA03BB8B0D2420A2234C7CAB5F9D990A83D9C2E014F6DD6427F25044FAA47977:\ +51846E247DD72812FD39BE78E1B2F50AC36EA2E3:7487C24E287E5BCD87B20A15B9A5B7B7 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +69A0D15F8D18562FA4754B77601184755E99E3C42E618D497F8A165F25B393CEB6B00FC7B723:\ +3803A2009424E2AE8581075A53ED058A274EA8B3:E359E0E5888FE70D570BCF0AF6E89E0F + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +7876DE9ECF5FE512ED7E96B24466CB3C642EB6AF65FF7BC6151A92F08DA4BD8CF110866E698F:\ +936225367409CF84A999E6FEF051FD5E75882295:99EB3466CC3DD02A69420C158FB77159 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +BB7D4F56219322E943A1F8B23EDAE9D510760CD9F9F6DBFD8F4D88DCF237980B64AAD59747D8:\ +0EEFE7FA570C584A0A256B8192C964D86D37C3ED:4AFC9814F82675F50C84CC306E758A8C + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +C47122CD6BE53F777B20E91324A92307589A731711BC29FE6902935C307CB61BE8380E261794:\ +0DB2B86717F826082435438568139119BC66B0BCBEC2BE20:\ +B254D36F8AA0429EF8E197245B6B92CF + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +1050A35FD348E0EB6FF6FAC7CCA1A342B471FE1085B3B7928239E1926735E3832627FACEAC22:\ +31A10A2F283FBC4B9723794D41C935B03395746408A69787:\ +B69D21D86FE5C58FE8936043477CFCD7 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +F9D965BA84542E60148704BF612E95BEAA5F6E1747E22EA8F59DCA7FED5D4888431B1C0CF164:\ +8A8062489A1A70F9BE06B6FE1567CECACAE292DD7D7AD296:\ +B030A9DCFAF8393C46696F79D6599428 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +CF2485D29FB99F8ABB7BA07CCCA2982945BC033427EAB654711318911750AF51B560DB75B9AF:\ +1A738B670621D0F433D38AE8C527E3A534002882D5487EBA:\ +0B1211AB1B6266EEC19B7CE5EB1B2612 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +C5D1027641C9731930CBC636D34C027A561D787E008859E2C97FF3CDFADCE02A126298842372:\ +2273D359BE54CD6C8F5F3D5E0D5CF19D9247DFD19F5CC7F5F09076F8:\ +C9B2B798B7B4C57EF9EBC67C2DC036C4 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +1C50895355461A627EC16B84FE6B8490AE09CDA0DC6312FAC2402CEDCD7C3B211745083CEF54:\ +BECDF3EF2461DDC8BB7153C4DA7047CDB396DB9060A8C23746CE6089:\ +DE503503CB0418F161D46E03EF29FB53 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +E042BB60BDD972CBE0E76304378A5763AAD9E142FEDD3FF7501FA2EC0B49EEFAAA91F5ABCBB4:\ +0FF69687B5BAB2235F7F00BA631ABAA80623F7998C643B2C3CAEE314:\ +272EF1CC3DE16447EBC186209B8BC4B8 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +79A412224B54CC67A462A02A97E800CF052F39B083F628A6C2F2CFD3BD2028704426EE7ADF4C:\ +1CF78658191C43325399D78B8F88128629FD623ABC455944FED3EEC9:\ +B13E3072909CA56B16C01F27F5DE34A1 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +AFF10AD6FBD068C28D5E1F7A29149A49D6C29768996FBBB61142D6AD74C9C399A9133F3498D9:\ +FA90065E64D8493DB9C16ADD882D3BB51CA0C0B9C06B3FFBA5E04A2284D3AEF6:\ +95784AE2EAEEDD1AB38C40C810E66EEF + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +7E2060D913D10A1A1C936B7357A65449D590DF4E75DF36E4271F244E4A492A8EEE05475F8834:\ +4F0D8A0D3E14455A155BFFB5FE4ABEC0067C01E943FAE93E81983A0A76EAD0CD:\ +F919E073CE8C9205FD228079DB3F8BB6 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +C441EEAA8FA7661E14AD10F2B38D1210DA891FC230D298EEF4D9504C4C950B753D9D33E05961:\ +B2A5718C5A08671772836723C357A15BD6FDFAE38EE748ED2E94B5921DCFC1A7:\ +0A8B2DFFB1D0534252D8F20A35FC28B6 + +0000000000000000000000000000000000000000000000000000000000000000000000000000:\ +1B7713FA6B8D47BB8EBFCF6F154788C0A47C5FA71A6EC061AE6D84EEC62649DB8DA7D8651CC8:\ +35758E318556EAF61FCF8B83E9C10F70DA4C1BD85336E087E3A2E72540B83177:\ +926F710B6040C8E755AA2F30F5A1F093 + +[WiderWake4+1-BE] +1234ABCDA0B1C2D31A2B3C4D55667788:0DF79CF5E34C6DCD0596ACEDD702AAD9:\ +1234567898765432ABCDEF0110FEDCBA:BABEFACEF0E1D2C3 + +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000:\ +0987CA45C360D114EB012D9E47459ED88C0B95B927E5B3B6D0A34A13C20A7A3C\ +B9B5A2BBFAA44A1924B40BF469E7CFEAE869CD443717A45F01AFC0A8231F8BE4\ +C6175BEC707A80826A73CCD57A2207C93B2A22C86DF66CB4823F11BF8C60F48C\ +16E1C18B95097CF2B4A762102D13E3F40D230FE8C183303AF32E43A6E4641B5B\ +792CEC33CCC1351E194899D7F6D9B35E921F1ADEB65C103717B3DF71792C4426\ +9DBFD7F7F76678F355ADBC402B1F4BC0AEE90ACC054888596CABC597EF56D8A5\ +2B0CAACB3147E5E450429990BE7D4267412600B4E700FBB3D0D3E5AE542FE5FF\ +46E5FB796080F4E03FEDB133D598CA782ED9353AC777BB7CD457A525A8163D68:\ +F234567898765432ABCDEF0110FEDCBA:CAFEBABEDEADBEEF + +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000:\ +5C2AB1625BC271890886964C53FE7B994896042A9047059316035D4ADAB67AFC\ +C18414F17EF8891D3D49952D31CC01A4BCB98F2A81EB3D82602FD2AF18430681\ +E21DC6ED32E6F2A45FFAACD4BB81898FFFB504DFFA1E8B1953C474AA61FFFA97\ +0BE71A02E9ACC64DE7F2EECD5E7C1965548E290DB3108F79620B3F2E381143D9\ +D5ED2A7EE66C32D697E10ECDE7C7907FB011EB9E9862094B9384490484F3B3FF\ +E4B82648D57D9F22F2410F603BB12C3D22B48A9AA72215BDD62E849755A33B75\ +025252D67C80BA5FF8EAED75B62669428F791D1FA9B39789266E41C2848AF99C\ +90E10A1DAF45A4E1EBBE00C9E1E436D550DBC547BD0818E8E6E580BF911E879D:\ +00000000000000010000000200000003:0000000000000001 + +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000:\ +C65409182C9BE91884D6DA11EF91971717C3FBBA228B4088E616478FD11C5D74\ +076B8226F824AD7DB07B7F4FC38B8A442BC51F6AA51496911D9DA5E21083A7C3\ +DC45860D0385BFF75404A641581E2F87EC2BE542A2F70A075A10F4A2AE8DCDAD\ +4BD1396978866C9497F4DAAFBAF75A7B8437D09686800C0F819A6E7DE6BAEBF9\ +DBDFB5C4B3493AFB55311E06EFDE37C848CF99C0DC3832D2BE701FE121E1F27C\ +32563D559CA5E2CED8B66E4000FD280C8BE9116E91DE032E8D3C20760AC5FA5F\ +0611667720ADBF0DE5CA79A8DA58D5EF9237C2E722840AA596444BDA66B15AE7\ +C513431DDD22D67ED170ABE6A3E7CCB9EF8D7D5D44897C5916FE0EFAA827E86B\ +0C3FCA6A413F8C7D8BC7735A649AFE06CD64DD4086A6F3E80FE6CD663D61C0D4\ +00BA48E6FFDD1C971DBD4BAF46B5D6502A6EAA6096C48D5DAB484CB9095F5942\ +199B35DDFCEDAB9E573B19417829347087C111D2F87D3FBBA5EA2160055B1F56\ +234254251868D5EADE48F0DF21C1182ECBD201220251B080342B4AAC08C1AE8F\ +9F8410D93E732360ECCBB3D2105C3273CBF4772A4477E95BA924DD2C61AA8719\ +1FF467AF970B323BA61DEC5E08FF012E51F3E6D5EB8599C76E29BCF6B07190E3\ +E37FEFEAF3A1D0B0431A0795F319A1C9DC09500D648481C645F7C268691D465D\ +46BA742B49241BE0E46E7164493F78E523DCEFD1063487133D7D10C408AB5655:\ +771C23C6FE5A4873C5185CFFF61F58EC:59C17CCD08C4D7AB + +107C217F5AF5E15ED2C0AC85FE26742C53A70D8ABBB47DFC319F2E307A3327ED\ +C74ADD0C982C5D438852743889CA15742B5A1272F1FA85889F100D294D3A0C36\ +3F7052CBCF23E9FBA30FC8CB0AD7757FFB40166AF2A1509611AC6EC8438D2FDE\ +66046532C346EA79CB1840BACB9850050368FF5EE1790011244522A20B1C3B30\ +61FEF9DC132E74BDB37E835298E698FDFA60DDB9FE72DE583494621734609855\ +C5C99B58E863A0B3CD6A82BBF59D2F3EE03AC6464AB98EA087D33B978C505E55\ +2210EEFBA7D0F81B7435BD4FB9340C0BC75F7AABC90DE789CE3FF899058CA40B\ +F57502AC6ECE700381443577C6F807809212CE91E70DE4A5272A5FF11E403F9C\ +7CDE160D7A14C13BEA47C8CFEE4E6E6576A7B7A93C0E203D947ED5CD9A124434\ +914A0907B68A5DE1061D537956FC3A3C3E2CFB82641F2C33000361DC665FAA61\ +5EDDA3862DC54B463D5138E2CE68AFD0DF520F999FB0A0CDA0B09455BBD7BDE0\ +ABBE9939479EDBDCD2B9812207400EBD486234FA19ACD819F2DBA6C09F930EC0\ +4665EE163597B69C6B5C13B1026517836BB23679E9C308B1AB119D52DB48682C\ +2776E2524C00233D69435A201BC7E01AAAAE6CECF70F25F26D253AAD23B15DF3\ +79A48EB973434FBBCF807AFC7BB6C5B5CED51F8E8BD47C45A26594F89E32F36B\ +2A8D28791625DAC0993548A49C2011B4CDF4730D7C85C93CCEE16C5926A9D67D:\ +CF329218A3A3B6B08B89B0D9D8889F488B0CE31E621EBFE7EAFC5E45814E82A6\ +A2FBDB762922BEF71F969E5FB2F0C81060AD765E86A4A664B77C4E028535809C\ +3D6B78CBCE1D5D4F9D75D0198D3A7E7BC9F5B24D617821DD5B5386DA2E629FD6\ +0DA58E4810380E18D3D6F056B5117F29067AF8AAE29BC6E591DC2F7D38C3EBC7\ +6760A297D351EE92513D2296F3B2656C7B360717D51BA235B3C6581AE6264FE4\ +0494C2DD159935A7F36F040252DE647C0688B1DAB9853A47DA378A04065B3E72\ +CD57D1C52085C3E7EE99A33BDD305E318184A1E132BB8C673ACEBBCE7DBBB261\ +B66039AB388D3D94DD625058B0B582D1C261A61DFF23D6078E7B4114958AE0E9\ +7FE3F4E9D88289F57C9B31B31CE8F8B8F72EEA086314F9B117F3EAA024393125\ +298BE358444E34BDDF2B4DAE77870588F8C92199AFDB218A15E8D88361483B65\ +DEEBB0C33C0B5E0674CA4296996E756439BA809A180FE192A3ED89BDB5207956\ +1D2E935E5AAABDF04F7C5562BD371C41844CE9A29CEB6E5D3E1781C86689C59D\ +E57276567EE3F08D0EAB63B67DD949B58E47C22162E263B84EFA4EC6534AB0D2\ +2931F5F89B405147B2057BD37C1C93F45BC65EC64019D70F6BA6BC684239E12F\ +E164DECAE9A2640F47E0A1D8C0F4CB70B4C2B1417CF1D4E82CD79599BD4208CB\ +786EC8499954410D58756D21551223987BAA744DCBD4DC1709F392ECD3FF30FC:\ +50E3C199E9D556552E79026253E2E9FD:69EF9A725A8DC78C + +83A1729A280FEEB72DDCFBAB631C322C6A5FC558A49879F144A35FBF8B0636A9\ +CED7D1C96B6E86C406387C67A2395675FA362408F088811AF5EDDC95BB2190BF\ +2E06E34D00BC54058E4BA434F8DD1FC932CF1FA4C06EACD36938631FE67A7EF4\ +7542F6B566F6819C3D77FEF2CA072ED30F8A98D7CDD8D292190C61CF27BCC49D\ +5407E2C84F7B24148AD89ED31ECFF089ADE4DD97D7D23DDB13A980D9CD54759F\ +3B7FC287D63BEAAAD241CF4C3237E4751D5FC96BFF9EDD91514D1A598D5B7056\ +AF1EBAD0F908841D07B0D848316C181BB48212034E5FF696CD3212C605720A6A\ +B7606370BD2996C80FE30E924D2A9AE0D6F432446CC9033740A41A9F749E49BE\ +9E1307F7F1012F13DED442835C6E961F47879D259871E763EBC1F8EAEE02853A\ +5409E6E207C48F16AEE1973F517ACD71990CA26888B71621EC7B4435649E9277\ +1F842DBB87F52C6C0AF908B99050C4C5BD774F40AC9055CA2D869DF5D837A484\ +8C43F70600297A4BFE9D5D91077557C9C67D186473DABD022483CDC96890A8C6\ +AA1411048B646BC3499597BD6AA8BF9BFE2FDCB050CF2F2701C6F06ABFD4FF7D\ +80A6074511E975B628A3C185D76864D198383B69312536831889714CDAF904B8\ +A518B47B5FD89C0D5900A1043BEA33351929710F4ED6F85A0FB03607942C48EA\ +047371A191EEA22447D88C200D5A0D10C62528C83329D0BDCF9122DDA3C01C65:\ +AEC06F99E3408F738F040C16DD934157ADBDD9489B19727298BB426433A5D1F4\ +2CFD9CA4D5C946D31C069DEBC1BD9BCA52FB28BCA8EC84A32218DE629231D46D\ +F052558743E60F3A7042AC71D917C979EFEB8794006F0929B853F5C8D9C1741E\ +44EB8B85880BAD4C013F2047FD2ABCD06708D5A1483E9AE03B48F197D1BBECAA\ +B7C18F7F8332CF797A4E969AA032827D37BC63F49A64644DDDA852FCE8BBF890\ +A0E03DB5EA89CA05B11466A40322E2A1DB398120A8C84C522871357E92F954B8\ +87F86E14841A127E74D102178CCA7F83F2D5B142A9D05A9F224F27E93CB70C33\ +24D7C783FF0D3C475195CCD7535B9631DD1B520924EF14EA0A9BD5EC8380C39A\ +774234E41624D3A7E89FC2051F3EAD8DDB37DC8D9350452887DA9E7585949D6B\ +BA846A6AE0F3F2B469DB68F3EFFB3D52F828D91ED02234A17F4AF974B9DBEC92\ +B11813F0CB8289CA2F4465DD1A6182C3570AAEADCAF50632754986FF2B550780\ +DD069775FCEF49156422A63DA7CCDDA14DDAB1FC0DE5DAC3D8793F605E093B11\ +76407E3EF5B326DD3361BC4AE824B96237E34B67BE42BDBFEB7332D19DF1CFE6\ +ADE42FE5ED3CC3460FE6D1046A38E83B7FFC3BCBD26A49AF2FE5EE09C558D474\ +D0A2EEC22DCCF56BF208D7A1DA1CDBCDEE3A71CFFE3C205A8913D555363E3362\ +31D766F1DD3E0C78931F8D5FA9CBD3213BAB06929A5D9EE04E772646D32832DD:\ +ED507AEA3196727632963F503ED26A50:D5A58B8F626130C7 + +# Checksum format is input:checksum + +# Randomly generated by reference code in RFC 1950 +[Adler32] +:00000001 +35:00360036 +5EC8:01860127 +679496:02F60192 +B32AB23D:04EF01CD +8CA9455795:07770267 +D37EAD077220:0B3B0298 +E2210CD33A1068:0BB90295 +5BB33F53C9D00795:111503D6 +537A0E6291C9DF5E4B:130F0420 +387900E329FB770A78FB:167204AD +0CE184B96C789E7E0A6EEC:207D058F +773870CD456F8797BC61EB73:2547063A +E5FB7B41CDAA1C4FB21D195467:33B00622 +60D382B3CB4341FB141360855BD8:367006F2 +E48EBC5C8730639FFB47C12D238856:41FA0775 +4A25B557982801088B8B4E45AFD7DC0B:30AC065B +A864D51DA8BE2CED6E2498FFB1E56C4EAF:54D809A6 +580E32B4D34F21CC2978076EB3A6D0FCCFC4:47CB092A +5B32E288EE8AA4E866678D65DDF844F5B3CAB1:70720BF7 +B014940A8D58C8550E9E1BAB1E96540ED0AFA6DB:54DA08ED +2A085FB051FD798552D6E1F60DE222AC5F595AAF73:6F340A7E +C1A30E3E8EEB24B5350A75D1D38255FE834CFE6C638D:7D950B59 +A8BE4CC3005FD904F6E58D5DD60AF8AAC3928F2FBB2B45:97790C37 +C6D1E2B2B546867A22ADD3A422F2111ECE6ED49CE85F0ABB:B12A0D68 +A28FC69AE1044743338EAEB08DD876267B9DE4780182568D82:A7F70C7D +5C575A7D25204220C994D3E130B48E14650477D64FE646890033:8F750AB6 +C3AEDA730EBFBFE54DCE695AD46CA06C4D2D197680C4C42645D60E:D2A40DBA +D28292D1255B080A66BE9CD5C213844C2564DB843A95416E5A8DC215:BE1F0CA8 +A8E22320693BCB2368267AC0F4D448825F36A080CA2C6DFD67DA66D124:CFAD0E6B + +41BA45D14C618EBE7C0AE0150F1D18EA457E54164DD6E3FE8227EC874D65A085A5BC9B06\ +C5399B4C5D47A5D639B9F2E1C1211C46DDD56728D2269C7FBC1E9EA82B1DB5FE2974AF83\ +D33F5E7039E3C44DFCD9359492DE314514068E483EAF1637ABD215117D53755229962A37\ +B91176170EFD1AA0DC751B53059D32DD4FAB3C0AAF52375854B9FFD2BBB303CCF617874B\ +60CA368AF6AA6C149BABF22885F443F0D2870EE9A8E5E429BC00B7AA0942025838D8ED14\ +89114D4BBA666678BCB6C75B66902559186BA330ED378EA5905DC8B41C474ACAF54BF191\ +A0B20FCAE96DABAD046241C58324A6C1CCA5F50D1FC4C35FD565B53693D0FBD874D5959C\ +8327CCAFF79760FCEDF5C0CDE1721054B443FDE8D771B5621A9AFB0F935409F5C63638FA\ +AFB99BD5A3519408A30452A5BFF41AA62DD077AEF418942F076F730D10277ECDA8C1A71A\ +4E16FDA1F61FE45660AA554E530D31562818EC961EB116AD5161687A23B8DAD5E0F016BD\ +7AE0AB63E710B20AFAE8928C616292D5DF207042617BE830401C30A49FF8308D9060AB7E\ +124417B139FAA303AD73C7B102DF81D763CD239C5EEF3A5FB60C374216263A48B68C9CC0\ +2121CF90AE72F906BE21C87315FD88A24237215A725992F4B18855D2217A4D033F459744\ +0567736AE9BCCA4A7187479399B03E75CA828736614209FE0D3F71A9C90CA6310BBBF387\ +F983BE221729763B290C986B8B43BEBE7F3AF9A895BA29663C4B204935C0F7182549E96D\ +96252DA545ED4C54EEE6C1A174AC74CE9C22DF29159F8EB12771CB8396E6F07D0FC43EAF\ +930C0AF228D53527235637E5408A234B785A9E2CC8A30C7E27E1FC55FE6FAB0B3465616F\ +5EFC59B1B52F2FE8A4BCEA7EE470AC47E148165CF025B99808494865D5FFE9263150821C\ +10BD916423101EE3B8640CFAA74A4EEBC86349DB8C8726ECFD1F4B603E6755FFA0586304\ +196A11EFDB7F892B5C7E0EF1A41E99ED60ABE3402D5017240869A26F0447017A31392293\ +2FFA53E56BE913A0EA465A95E0370C0B5A8418733BCC2FD7D294F23C474E3C3D331E2B7F\ +42051E7BAF2026295B56837F497865D4D60B02EB2E76058756D2E306519046B6A3B71522\ +36D73B2C698A8F0155C4E8F1D634D5737C3D7005B5557E2FDF1EC77B2B16239B5C21D105\ +AF86B8BE5BFBF52E00D63349568CBE25E6735BABF057E3B01CAB9520D5D03D2C4F7CEDBB\ +7C6FE4943B95B27CECF671AEA54B8740074445D4F14C17C9B9A12E581B559CB17149A131\ +613FD35ADF9ADE4DE981DD01E45262002B480B2FD524E39B307BD5A6D1CF9178B59B98F2\ +B43EA4CDED27513AAC550E1754DD6452A9434BB59B1186F9DA61E174D6610C2B286AECDB\ +AE9E6CBD4D2BFCABE0B83627A13F87288ABE927A891E372163A87A437CD1F4AFC91A940F\ +F55F5DC6CFA5AADF689946192050BE7C:9DA7EB84 + +# Randomly generated by reference code in RFC 2440 +[CRC24] +:B704CE +A6:47CC72 +E5B0:5AB692 +C52385:9B469A +8E69FB27:2B8005 +4A87C90369:452CCE +DC10A8E4AC5D:60375E +6B48125403AF14:D8948C +0BDE9946163348C4:6DC026 +384EB1EC12064AED51:29B27C +AF4F16B80F0AC808B595:1158E2 +0C571D708F3CB0A234196C:24D7C1 +7FE77AEAD433AD02533EFEFD:E25DC7 +D990831F658D306DEF60A10D5C:E0C845 +826CE458F0983CB46E68BA73D27A:BB86BD +995BFA6433F4185E76DC67F6D30C35:AEC6AB +C7688868D06251C906A919F011ED7FFE:B9B9EF +AA1E9FECA8E4FE3CE31928FC262A4015B8:ED74AD +5273E2B97EC0AB37B1F3004C1BF69E7A0C77:BE8A43 +2F68AA285719E8F8B6C1C01227EC83F2C6ABCB:A852E2 +CFD75FCCDAF1980008AD554AC7FAEE2E60317121:D6F9B5 +29AD5BCF5F4FD710F0CD859DF62AD678F66DEFC0FF:3C15F4 +C70CE8FB338D808338FA51A0125FA9537206EB6961C9:A210AE +141240BD7DFAF34FB8AA5ED107A899AE8CC29201B4CF32:822081 +10C4F0E357A90F7FAC078282A92E9E10E347D356199427B9:D7C1A5 +A982A5BEB78D751C6999B8F487F2A186CE587A0B558F3BD39D:1AC0DF +D6AA6D70B1E5DC2985D0952FCCDB6227F1AEB01CE24B8B2C2F3B:6BF464 +C95155A2CB524B40F1F7DE80D2E0718406B309FE818AF6580B88EC:BB641B +6E68D0055FA2B284183000188682F36D31B26F8D04950E381F965DBE:C62516 +260D0ECAA0E8E9F595C5AC8E1D7EEA2DA7603A96BF83251B3122C80D07:876037 +80E559D244C4188ED223ACF70E358CDE3110B6161F70C3289266873E7802:B8184D +637C9217C88420128CB3CACFF911FAAA2257CB093715B882AE7B708E2EFE46:E39818 + +D2272C22FDED6F8F1012F230FD29B56622D8B25864101E801EA80AD0038577D043F299B2\ +CFF639EFF4E083808D8C9A11DA0C6BDE91B58A6E1BD6F6E17D860E4860493EC7B90D3884\ +73A85332E39DF103D0133B7B3CE83BB88DE9333D80C09837B882B231DD2D1C33676BFD77\ +D5596B6AD4BDA0BA63150310FED783496BF0E10107889E10A95D81CDEC48C06319492BB6\ +AD17EC9D13A29294EE578377D772377E18727C38D96952322791143F63D4B8B849808448\ +400D2DF85E9722BD8E766A4A33F53F77F2DFD3BDF8AF16153886C9CC7B47D62CF957448E\ +326DD9E3E01C558F1D68230EF8D0B8F8D9CC427C94EAB99CB5ADBA109ECF52604CE483D2\ +CFCB12A11486900BEE7A78B9FDEDEE60E00DE69703C2AC0756D3A0D74A155BB6FAE5C78A\ +CA3137FE28928AD124742449F9B874E8C10B159C4E508771B6848F9A71DC4F16F42D8EAD\ +F4B0ACDC38D83A9F1A1E73A6D46C437A82B575D287AA0339F3A3390F9DA40897F6C9EF94\ +F4816234B9C92F9FD7D0E4D29F21D97A1465EC5341516F8E7614190D9CCA97DB96AAF91F\ +EA4420DAE08C43289775FA96156F8DCD8CD02B34C01297A79E2CD34EB211F3464463D33B\ +07DB91519C4C53AE9A8911E5740CB564F628344203A830356E106C45DAE9BD29CFEC398D\ +D7DA04FE67CE1A7DBCB8B0B35373DD241690A391899940833F570972AB9F49726DEB55B9\ +5F60173E7B32E81BB67B9141826862646F96BCB8331A8458615C2614076F5FA8C860DAFF\ +2684570384716CACBB375813E2331F809C4A7BBC3134858E69032814812D90BA2AD8CFE2\ +C5DDF24B8C802F857CC424842A1B9340A00A6824C6CCA9374DF99A882401B466C72BC690\ +2E467C9932061A27FA3DD75253DEE2F9FED87FC9E5963B1674628B3D227F2B476DA8CE3B\ +CE3C845B582A51D46D975A86D0C347A0ABED6AD55E24941FED982ED0BD92A01097E02ECD\ +E37F00442050B8F5FC22C295B4CA3EB66CB4A424E490CEAD354B263F2E0EDD0DA0D6BA6E\ +7F0CD84C13667958F936FF18938C657B0CF0951A554C06934C132030FABA32C7B038266A\ +91DADC4C5D65EFF7EBC76E16969D5A7BF0FAB573295CEB76C8623A79922EEA61B9C48E40\ +2AE547381D412F5C2C4590452A2651921E3BA8C5E3AE5313E1B61D83624DF2DB092834C2\ +9185DE44355B2D5E4B90AA81769040AAB8CF59F91776FFA86A7AFB78BA67BF90F71C9996\ +296C497ACC2AAAFCF6DF4BB59D1657C97D189E4CF4C14F834E562F55D0A2D2A0B3576E89\ +6A7F6D567BB78B8956AE4924FB573D509A5BAE3C75065D76EE5ED2B5D4AF0B55F17A4406\ +BCF38DC7302D8E68C3A34A5211F06BBB555525BA3312E4BFDA85CAD2BCD5F08C45010D51\ +00A0AC4679B54E518DE2FDAFCA039AF8E02DD713813A91292FE6CFAFA1E92712C2652586\ +1D3C48D2A0253AFD14A952871052130C:97E8E2 + +# Randomly generated by reference code in RFC 1952 +[CRC32] +:00000000 +AB:930695ED +9112:DA3AD8EC +7814EE:CCBFF8D0 +B833E34A:3CF5EA01 +E82355DFC9:E26E344C +0AE1C79DBDCA:31666AED +E03ABB0006E852:4B755129 +6A9F7E0C99AB3BED:3E3D892D +901D636199E6900216:A627CC4B +B56B114E357B346E3248:83845B2C +9F85F4ED02899207CE7EDC:CF52BD20 +37548C6B4F99996A9E243790:90D9C1A6 +183C1DF8F8808870F6DA2A3FB1:079BD60D +6213908DA80D4FB2DF29ED8737DC:994C68CD +8852141FB4405E0C3CC6A14EAE64D6:256409AF +B8BD524FF91CD2699195636E7035B241:AE189D30 +F1BA35E6503D50A6DACC2B3B3038B6261C:130A8886 +E3F51AA78DFE8C2083C0721BC280EDA90F4E:A10398A4 +BBEF661E8064936B079B7D398137C7DF7E9B50:67A1B46A +172949BC62843B24357BB0BE815A231E076011DE:B1FC384E +B81EDF9309B0FEAFD9D3C33DE2AC278A39604A5F5A:4F204EF1 +8B93D005AC5CB91F7422B1BB110070442C9B9D3DFED3:F2E02E35 +C2AAA8A9116EF67071A7B89BD930219A0D93B4D429222B:9DD0E0B0 +7EABAB1422497A99C6B99F91F6E69DE1915A3A87DD71E637:72EC609E +CD3FCB8FFC0DD5E163E8B6CD76A39C2804BBE91821D780576E:ECC18144 +DA267A57335B8E73F77443B2C74596851407D4C5122F1B22B055:A0B5C467 +EFD26D48E020D6C8014ED651A47ECB61142BD1E10A0EA69D41ADA5:74E5B3B7 +3A2A70233F5A5BFAFB76A58B9131C877B6C1691F05D7B79AA7F1AB28:E84AA432 +21D411056F80656AD1077C1F785F4C44A8BB8C87FE5DFE14469890B52B:CA157CA5 + +# 1K of random bytes +ECE01CE672A42EC6007EF3FD6298DD8554BD3D01BE8C8D9A945E150F087A1567BB17266E\ +EDF2DE3BE79C0A14ACA1E02C247C4C5E126C941F0F123546BF6AA6B15C1639215C38F79C\ +1E441E8AF2F812ECFC89F2F9A358AF8D65F29A63AA49F42028B232F6AF3EBCB80E2CADC0\ +07A62879A065B0253239468043504C081FD6B5FBE1184F69C4D157883BC25E9D5985C0DD\ +0DF137D0AF6278B07CD9935F5397DD98FF1DDF2F47485CDDF642ACC901174F664D218770\ +D1C05246FE7E51B5435626A55C41900DD97663951FDF2EFC18F3087C24FDF23603676D73\ +2B7BE9A00E55DEE023077196114D9F516BBA13C93DFF4930F045484193B2FC6D41B7C9FC\ +1C6F362232ECB643CB5F74B637DA845D9510B881049FB651A47D1439D187020A89F48581\ +5D683509EF570023DD9D6E60DABBB244E7B94D56D2FE9E37D3ECD2CBC4EED7FD9840FFA5\ +47B44C06AF2102BEB08616C22FB45994372CCB9EF1AE5FCEBEBC7DB1F0A74EA260A50C32\ +32A36084CAE7A95FC54A61CC7B022096DA821428D9DD21A0F108A5885AFB11D777ABCD63\ +62FE011CDB7E2B36FC943C3548AC643357AE81917A7FB508202255727707E87B801C5594\ +3769152ECC6A8BD98D4ED4CD74D823D4176A66D3B059D711A58F7BA890E93933E81AA735\ +27FA1B7044406C8A38F14C19936C26A09FB1F4C380210E55A55A03557D72EB7EF1D9FC77\ +45817BDF4A328CAF340E7F6AF05182C08DA2165806263A28B0748FB5E33AEB8ADB4D4C95\ +5C998CA82998C26049CC549F77A77756A08986A2AE5C84E0C1EA8A7E9EA9E44F653A0C90\ +FD5BF615AA8F7E5398063BCE72E1EE15A32A7A96EFCB6D5365FA7E33CEA17CF0CA310DA1\ +67C6EEA1494A4C581420AEC2489ACE5F67F92F92D8D871B96F6583C7619E156495828C9A\ +3A08A33FCB4980522E2BCD7A9D5994C841A7E684F132BF8AEF668C1045BCED0C6C7E5B0D\ +FC46E24190B2A28EF0C34B5C14E16D36BDC3A87089297360A47D6B6121475274128D9C9E\ +BB10CD0220A1BE87A8A015DFACF19578075572836B4D2E54190FD709D95636BBBDFD2420\ +F893AF11AB4B33F489EB2C884AC4EF3505072162663698361A1FD5E9980236481A23EEC5\ +10EEE798AD558ECA4067C363B5E892A489A9913DB71506241C2B743F2402DF8D75F07F55\ +1B9E2CEF1ED9667BA421E658ACB9B10FF4531C0174C34F17D96F869DE142FE6A56EE1DDC\ +F0FB3CF47E856E3718ECEEBEAC912CD0A057C81C46F806AC8814F3F66B29B2433409129B\ +23224FFAC15ED1F21FEA148C41DE6B6F6157251B60B4A5E3CE91961EC36618BED42759B7\ +0403EEF65388F0E5AA28F305B48E66DE1E21D0891D64EBEF281DE976FA877324DDBCB104\ +02926EF8B6D0F7B73C55759E8B35756B393F12190E5EB0495DE818334F3459B6286D7FF6\ +D8C1D4BD9C3086F1FDA0ECD33C4FFAFF:72D73FE9 + +# MARKER: Hash Functions +# Hash function format is input:hash + +# FORK-256 vectors generated by the implementation in Botan; there is only one +# test vector, and it only covers the compression function, not the entire +# hash. The implementation of FORK-256 used to generate these vectors did pass +# the one known official vector, but there may have been problems not found by +# that vector. +[FORK-256] +:E6A3C4881D6B1EE37F70847D9C8424A3E2AC408079570ED5ED9D20D0214D7599 + +1D:90753CE547CE7FAE1A736D6D38E8C6F14D93897D106FA63CA32BFD1219E06A62 + +3E07:D5C380F39876FB9836D492ED520E2F6929C302133BCB9F2A5080204DECE3583A + +A8F001:13428BD3C7368C8EB0B890A0FA3461ADD5202FD23257EEAF1559079344123046 + +EA8F7A2C:65DD3204D3C9E9CE5EF21CECB3421F59351D5ECF0B928D199887BFDAB1906A0F + +2E19859C9E:DC5DEF85475A372F3E16A0893302A3C77218C4EFBCF6D9331DB7A2D3CEC5E8C4 + +2AF0BDBB8363:88AFC377D3630E6B686EC48F9030DCC78E64F7DA1023CC34D49F01861487525E + +82F8A36D0A7979:\ +9D96C6B2ED8B50A2153A89BBC861718C4744547F2AF24F648235E553BDC03E13 + +78F37E4B9235DFFB:\ +CB3367A41C64D73EE024FD9F9BCB59ED66F6F9CB370BE0354D9C6ACFFFEE5D6A + +FB85C864108365961B:\ +B657CF6B34422A945A870FEED5468FE052F046626A4D9EA8DE0F6C9837E72429 + +793BA844BCDD71B1B750:\ +0371387237C9300AC6E4CDBB1E33904561225D3DCBED9E9EDDE710BE34C72084 + +19781F1B1394459A3EF407:\ +B53815CC5F494D0983475EF4FCA87AADA732D10DE1E89E62BE397BEB53496545 + +55B5FD2344A64809C7608A57:\ +3BC33C0FFD68E3DE47D5C1E85AF732C94EA390999B0D10C428CE655A023699C6 + +AD14F3D82E4349DC3B8C1B2A9B:\ +428111A57BF802669AC9EC7BAEF3929036FCAD03979F2151CE3F8C19B7430529 + +7C6FCD56927F530DD8E27C661ECB:\ +098FF664FDD45068D5B51F2AAEF738BF35AEE8945270663A179FBD8C62184D97 + +270303C1B3E754DB1B8A388632B79B:\ +BD6E8FE6F4F0D67FE6EA76774F8049FCB3E9FB9C490467CEFAE793900AA86C2D + +70B7BAB2A9BB809F9A74311B562BF43D:\ +611DFAC246B16D3D6A359FC580E477D474751C24A78225D93009A910BEFC7A5C + +5E01E5540B5B6F371F642D15B4F412C190:\ +DD75FD419466A998B7B460E093224A7DD82A630B6E88BBC8437589FE68764E4F + +3557FD9C93B37B3E484E55242105EEF9EB64:\ +D86D755CAF29D6DD1E339F4F3D8DA2FCFA26FAE62FF27851F8DBBA942DB8093E + +C851F162EDFB2E5D9CF7BEB5369B423B049120:\ +10095694CF4940D5512FA27975FADCBEFB4F96C4DA321A3F35F6B24DE2A2C879 + +D5DDEFF9F8C8921DCA1820C4368F28C4945B0402:\ +D0235CA1FA883DC7BD2F8E018FC51739FC644D49BD9B6FCF0D4434873C7F466C + +8F5D3CCFA13AE2710E293638068A8936D9B2887D8A:\ +5135B14FD4DD8BA1BCBB0E613F71077EBD6B41B0608F495365D442D213ABB5D4 + +F4247F6724C9832FF65B9D98EBBC091241DE8C9CDC57:\ +FD9A2FE9D7D59F793BFF7BE343A6EA70C37DAAE0B0162B9BD8050DB99975DE8A + +C8A3DFBFAF08F34B258C6BC33E826ECD5F808CEEB88E43:\ +CFDD70E8344315DA659697E6B929F7E5410BBF2BFAA46D911CA4D548F6A80648 + +3F40DEC3198D7EF8D7AF8DAAA86C6246B464BCE6878D7D91:\ +A6A0D6461C505C70050235F89E88EC7C0E6B3DE130E198E2EFDCE562D4E354A9 + +5D61E8C5431A0578175AF50F2D0D27D41D16E1C397F73EFF15:\ +DB064D53411169A3928C8C7B62CA538BBA5276FD83E93667195735F88EC4A7EA + +8DA080EC9907AC188208DED4D7F634DAC6B1382AE3BDB721B665:\ +ADA78594D6230C9587F0EE87F17AA21CFBF4C82DFDFB8473A8529F3DE6C14895 + +865F5D01E678E4FEA91ED39B8B9B1C4B8B17459BC4B4A3D677BC49:\ +2641A6AA41499952DD1ECBF5AF4426A4DAAD233127F3AC56F308B2E9D5F25B7B + +D787FFA504B1470076F898CC0D2CB65CC23B5B02437539F54826BA61:\ +D29DF8910ECE7FDE01B2FA5D8641DEDE6E8DBDA44143ACC58AA2CE01D2406455 + +595199257CB4178EF928983A6E822846C1B024328A3B1FFB6E242E3661:\ +AE72575D2EF2664C75E0538165AEACB24B80A3B28546096DABB2642A7AE959F7 + +5EFBD43D66A7A1D23382E1757241AA5679B4C0F9F78419985B65D70A6E8C:\ +F707AB7EBCFFB3F78EF1AAB7FEB832D2651E82889AA95FD02958F326AF975D93 + +32C2BF9FBF3871314F84F17949882E4BBDB530C8808FB58648BB811ADDCB8C:\ +8D3E1FE5840130D141A68991C9321719F4D50E13C52ACA0BBF6D218773871544 + +7820ACB94D6A8A2E7B7273C6C528E2088F60B6E57CB4494BDAAA4B7877202862:\ +DDE3C2EDE2D0AEB9F80FC6F8C54CC6A108F5F693EE8EDE2C755AD20FCF011C1F + +A14BAAC3891D78465A9798ABC984407072BD209D80A7550DB1FA63EB922300F43B:\ +FAD764D75BB72296BE85979A4F57C89E51D9AEA8280DD87D18CA5ABFFD3553A2 + +1166A4CEBBFA31E715B19FEB15D4FF84C35112E4876D7182E3EF97147606760FD23C:\ +57B507F04922E9E2ABE3D8DD8205579715AD0276F2179360C092966D3E335B1B + +AE7C2882888543E7206BD57350F33985322DED8508BBC70BA961C3ED35075CAD439732:\ +DA545CEF32F141181F07AE275FBFA6C9D8A299FD40660EEF3C344657EB22E8B3 + +48F1A035DC0FE6D0BE1F2D1233B08714D404682DD8CB39F66E8FE163AAC79F7241E9BFC6:\ +20ACC36E9788C4E7484BA8C166E93953124F703ECC15369943BF81AF10062D2A + +ED596E8DC5A9AF7FF123D886589592D5FA0FF86151B8634DF4C4C1F1450E5323D6228BBEDA:\ +6E85CCA98D2CD2591018E303330ED12F3434DD9706A1194ACA4E60866F78291B + +EABAEFE3421D3BFB668B390430ACBA72E4EE6F2C92142A93F0BAC595906579C64E2A3EA33D0C:\ +7A7564C0053A3630FEFA5C3A2DC80B99341C05903BFB6765777112F96DE7D3AC + +F71C08AFD45891723E61BD9241DAC454A2333D2ACF21B3848EA47BF01FE524E4E6E1D47A635A\ +F8:04A03842A1E8E916781CBA312A65C3C99DC949895CD48567FC3C836F39CF8EEF + +E2895A841C03629710EFB16B6C921E31B86A882A56C63914E631446A91FA0092A2AA570DCE0A75\ +2F:737E62D552B437F0E46EBD69A2BBC3B8AC4A4992AE64830077B8E0A9946B0454 + +002E5C6DF7AD9BFF9E6E08AE68EDE886B39BF6365CA081A25576741708ECB5B64D80F640EB26AB\ +69F5:609CE0C785C2BE58F1E76CDFBD903C48BFE385EE035C7604715CA86EF9B38D1C + +FEA76D123D4EA976912A521763F6588E56D694791398C6DB760E5BFF381A6506EF4280008A5948\ +5B5943:53598D2271C83D3238AA9FD90DE0B5037525854770337FEFBA0FB636A1623E1E + +AD53132CD9C61018CEC4B07278D5667DDFB4EE9A839DBF584962D1880345951007DEC5E0F52FFD\ +9AD0FD9B:E8FF3DDB2CBAF8B220DEC63B5F1320E02A47A5ED02297FDE7C0788E5A7306082 + +D11C82ED861EB312B69AF9A372B8F41D0BD9B0BF2F03D9F1F13D54CAFC475B97C39A169369EEA0\ +D92606377F:544180FA5E0FDA3054596B7ABC0C6B7F0CF5ED755C5C490E7C93FC00B4CB0C8C + +7C438726B3E3AC24D06F1AC23494F030655A4E5DC5D523641B0BCBBD8339B3DD8A0632520BDCCC\ +29DE6654B5FE:\ +5F00EC9E215EBC9F7669627B6C91FEA12DE0E4D475F49AED7EA937AF490A599E + +9D934509A19691DF7555BEA1A244AB503D278918AE8A0D984300CDF5ED7962A8FA5EDB01E8D38E\ +830976BD4F6800:\ +40135DEA3BC67E8C4295856C8B30B9AADAA904A5106CCE597A49912DB64CC8E0 + +9C0EEBCE97B82482CF742A88F3671F85A84239D70A9A03D07B67876FE7C103A787A941955D2149\ +662F57CC29C93ACA:\ +8EE3D2595A3427BA24E14D610246CDF354FFE1704C42B1CA50B22E400AE0321A + +D159C512621C4E59F0F2D63534E62E66C0AC8665F37FE51213305598A53148A28F410DACAA103F\ +F204372EA0CA1A0023:\ +C0148D8A4688A49E35014EBC61786F00743788A4B9529C2C02ECCFED5B00BB08 + +89724F1F0A6377DD6AD938CDB297F247BF09CEFADEBA43F5769799948D6D5D160DE142A7417315\ +6FCA9A237573076D1655:\ +4DD08B4E2401168ADEC0E05A341EC69A27890D0DBE48D898C9B657AA6D753860 + +89308DC7FABEB7E264E283819D6742A1FA9DFA076CF7D607D7B10E9996F3C1349404D01737FA32\ +ED58555A00935F54C309F5:\ +0D8E3B5C1C8876DF9021ECCAF0D0221E4F156A9EA75624335C39DBD7F96960FC + +41FB354861A111C2169C18F5E29824E0E80A47CB8C30D828369C6C2456125B685B8CF11D092532\ +E844D55C8A492D660504C908:\ +4BF1967D6772CBD680C01F244EBCDE85EBD402E6CF9B5EBCE8A00B0733D09132 + +3B4D0D2D8926B376A5CE3421CCE1F4E5D4A1818ED55996CF2EAE935D0E41CA7621CC009BE7FDA4\ +AB371594177DBA06670A521321:\ +A0146AFB474623D6559E8011E112F1DA7E3F0140327B2C8205899C2A0B611022 + +2175F02F451F59DD84156218AE9A949ADDC0428FFD980F23CAC66570160637A40819481F528C62\ +A4A7F1B5A092C7FB4B9101C5E8C1:\ +44787DF2F8F0E4203E3EBAF8304744DFBE6DF6D53C33D4BB6B9A3A40766A2CDE + +9F836DC75A54F209E4FE423F6C08A1E3565732E8642DEA0C17E59D27C63A8ED80C6E18E48DAEDC\ +5FAD99E27DC63F426C6F6BE02EE03B:\ +0379CF92A8627230F274731CB269E5DE24A91435D39E7C461E9E0AEC9CA1C30B + +FB1678C2D4A5262046B0B7A9B11B5F069E4C0297C1698DC6766AEDF936303B3DBA1FC229F1C1F1\ +FAF54A32D72400514274A741B7AB3F43:\ +08826C3E6319A2E9CC3B23E0ECCD3AD2CAF30640D1250158D8E4ADDB46217AD5 + +24D4117E61379F5E55CC6C311B140CA4FECC300909BB3BC05FDB68B961187F3DE2BA18FF7F4522\ +012DFA073122902D691A824F6EF08AC9E8:\ +36D90AAF4107C7790231FEDD5332027AA45540908F7881BFA6DBF6CA26CD220A + +1C4052964E9796FC030EED644C4661F242BF0AA3D2E93141B85D0383AB29C0025FFB160EC413F0\ +4591B18F3F892639EA57B5558ED8DA358961:\ +CEE495F4969D81025AEFDCF40A20E54B060F13B755633AC2350569DBAB97BF35 + +00743CE2A53D08393B32BF3F8EEB081FB684DE4905834AEBF966ADD0EC484FD5F0D15131E5674B\ +15380C11554EF823838D931EC010BCCBF928CD:\ +BB7279D1120515D472EC9CE71BDC32BC7CFE8F3BA7D5CAA371816C3AD23DAAA9 + +6C7D10949194F2C22BB9CE620FBBFDEF0B61BA1960B580BCB29DDE81A3D5F0BD6722046191823B\ +2297CB1017503342A353D2523B427086BB2DF313:\ +199B856E5AD193591859688E316E09D6942582DFA984CD8EBB8FA262920F2645 + +8D2789C6885A275FDEC50B7B37065B6F681BCDC0030E1C582BCF3247133D293834443A3FEB8F38\ +8D67C729F92633AAC54CAF6D8857C1B0FA151064BC:\ +FB6A7F1878E278BE80564FFC190097724A870F09660FD3BE72878713BF13E618 + +1235B88BA03D232060450C91F3374A44FD4C40A03BEB54523AF85F7A5ADE59E31E23AD0B0FAF7A\ +438D5F3F981C03D2C900BC2A9C5B1B979145ED3C7214:\ +B8089EF455C50D5F3C4DF616C032E6A593CE74D05990FFC9CCF5BFED8C7B002F + +511DACA4F9FDD439D14FC91E3350CEA754E8B32E1CA9B45C27006967D86C2D5A826D6606588E63\ +3781411F627127DD135DE7CBC03025CC34B5601D4CB7B5:\ +CE0F3874027B7573BB829CC054E63EEB9EC46BEF340213DAF5333791C3D3556B + +08AA26D82CAFC07026B19DE0EE09D74B84C4AEFE969D60F76B7A819E4E8F1CF8A687E2E9CC4124\ +041DE331A4D078D836881C430101A89FD89BCAF6C3AB425C:\ +BFD882A8BA5A0A22CD63466958A9C169F40068ACBF7514B71B79438855E004E4 + +530E88B454E963D5C46F2D58713BA9CD1792D1B262BC4696BF8AF0451D4E34555F7CF83C94B7D6\ +ED1FF924603F80F36CE994A41D308F5D4367C895104BCB1E7CE6E16E6EA1991B245851BA28D915\ +86FBFA9B295EFC15C5277711D738F8B061ABC5F8A2257F85F4BEC0E37B53A42B7A3A10D11370FE\ +B4DCB29E6C0E17E15EC41BC695C72B7200785C7B3DACADB7682441E29DD3D0029AAB241CADB2A4\ +DD92997A93BF01DF6605A8CB776789F12A5D402A1DDC4DCED50FF449CEE65EE7296E88D61758A9\ +7D0DE90F9CD9C44D165C504F61F32800CC48DE51CC1FDB3CBC5E2C3F200733B2E266049945CFAB\ +F41A665A3CF8C65E13D784E3C5D40AFDB1E1526DA87B27035CA65CB368457E627A6EB5962DE24C\ +FFE29A723F03A7A0409BD1ADD5B6A2D0B39C2372E29686CE5032CE1473CC1661B06A3243714265\ +698667B7BE6688922676AC9042AB6A1785D732B2F4EA288DE4AE8CEAE26DE59231FF04ACFB447A\ +71679EB96320B22BB0F730E17DEB159B661D8DC6D397B5C9ECC722BE2AC48000B830CF7DA06572\ +8138A8EDFCBD04E97E6915825CA08A7AA4B5BF96CC2FCA7E391222C6B3247830E77BE9AE10230A\ +2A97099A4344A7203F47689418C72626435DCD59208E679C6B387AC88B39D50335E3479FA62CE6\ +94E4E3CF65018A0938911BBCA21A28C8B54BB43C42B9A868309428A89930CCD71D74A425A30578\ +2CDAF4847500035E53985472F4CA1C4A78240BA9DC9E2E4FAA636871D827B02454CB8C209F9F2D\ +F5D7A62D3B720CF9D9B21B1FAD6FBB34FB6B3A7E89014C54927044135465F0F42AFBF6E77AA6A8\ +498B7917D130DE7E7035577BA4C9F6400ED183767155348A9A2C1A4BD63D1CB9ECACC34ECC2D80\ +E2CA077B0B53A9FDB225624E6774D3ADA17688B6040C53D39D3545C4B20D6C4A0432C18B0A1E3F\ +3AC14CB7E90E4642A1A890FED7D8E725065D52C8DA6942BF9CE0916F3538EF63C327594940BE98\ +7F36764AB59BB6B42CC4C42DC3F7BE7DA7B8AD1DA51462C0A72B9ACBDE65029B2DE0809C1AE230\ +B76014F42A41E1B7B3332851DC46E82704B01CA0F1417539AA8C0BAA547838A6443826E12CF993\ +C891BF6F303C4C20D2DFA07DD14B7560C608CC3B8FD8AB7D825EC2834D08289360B613C7F435F4\ +78A641D7DD115940BF1C5200D6DD54F612DF6136DAF5F95FF6BCB9D9480E60BC8020B9C9154B25\ +4860EBB4FD3112B33A18FCEA742487D79401CBCB07761EC3874663A4791D5508BBA41CB14BE22B\ +98826462194D7943C61E2C3C01A8868E121429B4C49D9B42EFBB10685CB6AFB1B11EC17D7CF2E7\ +1482325F3C16F9C25EC3FC7229B4DC3F82162E3E2E04DFA670AC617E4274D73163D24E43D06687\ +47D1017948E4BE0D0722B6830F415A409DC7A2B15B521FB19790B9EA07883AB000D13AE2E6D62D\ +99DA32577B6037338E5E:\ +06308BA4E79A2CF117A1D5BC027A7492F50138FE4750DBF51F08913ABC40CCE5 + +83F47CEEFB4E8306A59CEBC0BBECBB88174E17497C1BF33E9047B74D486A255EF79F1555E8E889\ +D0311CCA0B9EF678D976AA02103EDA58CA7A33CE9B7C994348A1641B3954FFCC1AA97832248C47\ +3187D69CCD10A4F553CF73964DBAB05006F0BAC17226E7E98DA3FFA0B8A8F241FFE54A0FD5CF4E\ +B9E5327CACE16B445A65FCA2CF6F9F99B000B0A18D7F3634A00AE49B9A79753C61E3C1453C6C0C\ +F210D6FEA9EEDB12D8F79275FAA4438B765DA316DCA0A8C5E084BB422883C2C195BF49130FFA10\ +D291D69FA362E2B96A6E2A4C9695154BC6A4C4CB194420D3AFDE1035A2CF57E54FACAF2DEAE3AC\ +790A0FEF68290DEE590DF70DB61AA7BB94015F18E6DDFBDD50602110D7FCB5B97612E6FFE5EC16\ +CE738BDDDF71726972E80860BC04CDBFCB67C5AE91E7F4F7913C16769A043F46A986AEF327C5D3\ +FE4AE2525815C162565048D99C559A8F0E9DF8BF88E178E339AC39EA836A9652955B3F440E090A\ +D28A8E14E29E78711A1744E8CAE85F55FA7EC643F4CD1989323F0E049A3BFCBBF254F2583361A2\ +798BAC6411D1FD837D7B64C7A7D93DE278E1D8562621D8B04BBD0CD4D7425C6FA909B3A6241FE8\ +C1A8D67FE616802C69694A318A5D47F97555458F753A960CA9A1DFEC13C8716EAB62603C07A10C\ +67CFFEACE6A1D81A4C4558258C8C14CE75961482B2A34BFB1C81C8474151434186ADF205855DB5\ +F5CEBCB7280C4C9D6CF08167DC2B5B1F112EC3AEA996953465377DD883889D164DEEDD33A012AE\ +3F474417384EFB98D8FF3B757F2B8A8ADE184D443AD1945C14273D4733108083DAB38811AF3708\ +79F8702780D041238B6E5D4AC6D5506AE03B5EC0C76CC16C15E33EFFBCBB877151AB79F2F13F2C\ +AA51ED3B441B7AD204CD209AA19E569B7B5D67EA549F70572ACA4CDC3F438EC78AF5C4B832415A\ +CBE71E1E918310EC9685595F1A62FBA2BC7FC933CEBF1EA6FC00151E33FAC0BBB121C168E7AC9E\ +C4F78B18B7A122D1801298C5D1268AA66CEEC75A5795F3048E6763762C98746CF763A2AD9E78E6\ +30D9402C482656223F21958AA045CB90027338858363EA97A639F239963A8D76622D42E069E813\ +ACD776879FA1344A2C08522D0B53C62E4377FD8504817778CBCCD074099E097A2E361F138FF7FC\ +B60ECCEC6029549F0489022379145A5EF7A7781A1B201B6012E125F9969D57459ED08D21773718\ +AB2B58F7EF41E2FF850AD8194D37324F59B50E85123AA972AD28587C526F05D81057A6BED26AF1\ +E174AC90645BA624287209AA108C6CA3FC6D3532AC28D8314939C1E320A04146D0A68EAE82D5CB\ +8B368E69CAE0040A33BDC3D0DABFA26D70E99D4A40E7675443E22FE51FD2FB5AF0091060DDF96E\ +4C4024D1F1359A95C1B93CCB25DDA483363AD73C4FA952C433809B4C1FC0F3D140E3A6856C9CEA\ +46EA438CED188E0BAD7BF4:\ +226404B39155EC9D9CAF51BFC6A7F0115355FD83104FF66FBBDEB5BF0370EA99 + +70BEE2D1E703CF4D8872E6E63BFA59A218F8830FEEADE6D2412507386C9CC90EA83312D4565E84\ +9CC6FFFD58A90D3719D1C0AAC147B20033E9F40E515CAA938453CC2EA6D848801B8F6A31721334\ +DAFEF40DE5C8E7C33B1190DC6A33F66CDA2D7174E2CAC423C96DA4BCB399863760EDB44990C2F1\ +D0031D56A9DE624FF3658FF14D33CEF67D9752678A9F18AB64E4551EBC54F96688856AE25C13EA\ +C5A2E92A43E32590509705DA31F7B5A750E6D493D6F3BC7CA0F5E9B1782100E9BB6A4DF4E5934D\ +97BC0D75C1A2341B93024AB1D997F270922C7E2A8D1F6F453FF2C4AA73C69A4D16B50DBF8C1FCB\ +27B1002E4EDD5C3EAAE1DE241214F2E50457551EA42A9A6D515B7224011F9F51D20BCE07FDC533\ +080AF6A0217A2F679D60FBACCDE2659F637481BA75FABC1E224C52B77F74379BDD6002AB917A8F\ +77CEAAC83B134EA14A5AD92780C84CFD08CE4956659900D9F57278A2F074648AB857089F204150\ +899CAC987F522E5CFF41C2289F7DC079B1E7C9F10E41E3B31CEE52195B3E49AB6C4D2B5613BD0B\ +BA01A76E824408BADAECE8BF22AA0469506DC88AE469AD679BFA254ECD06C99F8453B720D4BF05\ +36F3C6272CB8FD8B0F1B995FE75E0DE6DCEBA87EAB8C822325951FB024D0230A569E4CCE190F72\ +A16637A3D3865D33C0ABBC0A3182C915AAD6B4CB22A648703F164026481E6505C6D80A5C7BFC0F\ +32557704563399317F1A1DCF0CE425F20E9290FECE77831D60FF3472874C1F4BDFE18A0A00218D\ +0B428EC195BB221D1C49FDDB68039980AFFE6EDD7C166E944AFB71499CDFC96EC95BC28DE747EA\ +72E031E83D8405A8DB1B6AAEAD15087FE75DB7471E2BC49F9E9418C6BD52B32D747B2ACC1F0F7F\ +0B21EC4DE2879B249D6FBDDF5B85FFF8A4861FE7206F9F84F5B761398055038FC100794FCE09E9\ +96794DB1CB30FBFAE4B183D0BB0D1C10920DEA7B7D3234F6FCB682375D8C36401A9F67FB3A8615\ +E3F649B7AE4D6586865A1D8CAD6DA45B694977B4F378FE610C4F943D41A223BC7318ECF98515B9\ +2168DCCBA7411AFB84AA6E35C473D6F595ACE62336AF52298040FEB2DF462FA30E039FC4AD80AD\ +D3B420D8CE0675E0DEA46884AAB203699B65DB309E71615728A44E80EAC271541C6D85A3160C7E\ +5274F624DD288C387DF342619B751E15615E464249CEC80FF132FFBFDAB5827CC4DE01FF506F29\ +CEABD8DB256DEBD26D519F6210E3956F95D7ECF1E48DE31839360C2985815348D1A451FB4683EE\ +5C06C362725C97E8BA8F9926691B32B38441D49B4032D9239033A72288FC98B26BEE3461F6147E\ +1C6C1D93A4B857E53A5B9B25AE03E5741C673E7D1757B165F36B21170A5B3B9DDACC015554E132\ +38B987DF9F236A689FC79450CBF3B611660267816D3152CE6B75A2D6EFBCFDA900AA3DDCD5B684\ +5448DF2F0C089A436D3C7290:\ +93F020C6617AEF37E1E53D0558AE8E8731E9B79DDEF0C3BF931973955175D957 + +20BE956038BE1F4F76697367DA55A382B082DCF66A6EBEE838E10D41AD87D0F1A83723467AAD5C\ +4AECF39480ED5E47A9143AE6F9AC5BC46E7AC83428DE404E1A89D3783FC38BA0B16FD912D118F8\ +3C4631375D39CC220A278485BEE01F8B45AB57C9564566F49C3584C455919095713A75BA91CF03\ +CC9BE013CF9D69266071EAE64C2C07DEA0C117271D349DB1A940BF3B2C91F3AAF407DBB97FACA4\ +7B909ADC6F1EDC1398015048359E0A831AADEA251F8BDFB88C6B9EA073BB238134483952D0F8B0\ +E9C0629E55E5F5DD47072E9C5D0FBD6B4C5326C11CB2734CA4DAD6E2D8BBA212F6E67F570290B2\ +1F1D69D146A140C57125D169EAF6B91913E5841F2442E0AB40BA77D8F376E4C45C95BC9B4797F8\ +DBF941C66252539E63E001D139FD4A59E7AC4817B73879A2522714979F536F481B76582653B482\ +4DD76A1441A8A1525E8192F1F273F95DD564CDB4853B682E87693EB2B544950BCCD27BB664E323\ +1080A486884F235DF20A7E6639B40DF4D63D0A2112B5E6BBA21838380DD4E49C1F4965B45A335C\ +557860EDE58AA283CD176285DAB929DBA3260B5FEBA261FD9814D09BE315FE1493A5AEE3CE6071\ +259982EEF9716409A09E28091F23E1DE08E7B89962CF354201247C15D75281ACB079A51A9F3992\ +F9BC88727658E8E1BA6932C18184EC3BE572B98642BBD886242F781AB13362B389423B39B27E69\ +E6D91488A280E1040110E037FB0D55B12DF029B7D577B0F7FC7BE884D3FDCC066A57D1A0DC86F4\ +12BAC3079696DA7AB3DA894BF399D9B56685FB405FDAA681AE09D8B53D0CC661092F9A13F89173\ +1205CA3F7CF939DF632406D37C444ECAE7A2A293DCBA2F647FF9C775465B70D663878090B0FAA2\ +C48F5D681FA1B0FDCA11FDDC779B47AD2814657585C9A4EBC5748B48AD7B72FA5E07040DE0914D\ +4F8AE04806835879FC0BD0B5B150A157C0273192B0779D37D0B1AEE1043BECCECD80A8690EE4A9\ +207564E5B703559C79FDD16C040E8E60AC42DD4E2E9B66C14F2C44BFE7A360638ABBFBDF1C4B31\ +53B81BA783BDE2B41EAC104E24ABAA66C83D69F7F5143F776C359335AED8C5AB47256139834C32\ +085A351ECAC6AB4F8DC4F097B91FA156F093A93C7CD5EF5CDD5F4BC1A650C2FB0E7ABCC97947A8\ +7620D619DC999CEEC1796D0325B0533BC08E870DFAD00FD518CFCC38587CA225A965594C88B969\ +0D63F37231BE9BEFB54427F76E230792DB580C7835F60E4744D4B9FA2F8BCCD7CF35B6345666E1\ +753B538E276E09966D41F3B1AD3E249031775B448A1BF1C6DBFDC643BFC5F6CE3D670F4736ED9E\ +A546D9351429DFB9098FBB06EF908391A6BCDFDC6E1DD3C5CDDB0E157A26C8D7DF8BC9808C7032\ +9FB0CBDACF5B6D4BC7A5C69B231A145F15B1BCDD16F9BAC45EAD69D54281FE1DFAD35CECA9320C\ +068714F99A21BD61EFAC4B64D3:\ +7D08AD57B93CC590A028ED1EC9C32BE0713C82EDDF6A593616E681DA0F0E6E00 + +95315A26C618D637F1A28403406D9E81C76D33F8BA62F55F2EDAC56883534DEBD8B83F2675C58D\ +455747473F92178B2A3E356B3D02455ABDBF32E9AA934A5A2D85BC87799F45C068C137E170E8D1\ +D26F2BAF3551CF367AF42208DC66316A93D4B594C96AE0D4C5B4843D80464C35357926A3FC7531\ +AB7E0A0C3FA899481B5EEDA5FD3193A13019DB382860EC6F6C842A1B5F9E90337403031FB4BAB1\ +F2AF12171793DBC5058E8D53675A6422A6BD9472828922FC36F05A4989FD48658AF04DD0B26FE5\ +D614BDBC05A2046E28502F531938AA3076200EA90641FBA11DAF84A670DABDCE3831D50D9DC46F\ +F3D302B339ECD9D2465EB65A6BD0C65220025DA2BA27AAEF32D4567884A76688322CC997AF5FB2\ +DC15EFEE3011E4069CFC3E04DE84D181C7D2FB48E156E0CF46B0B8A68E8A2F2EE49BF5F75FDFA7\ +B0E615A0B8311614668AB8EF68FFE2D72A074F3FCD5384F8482DFCCA534DF2434AEB2E2D3CA69B\ +D98BEB1479C48620A8AB64B31D94EE0934DCC3E1B459D3A5CA345A7B91DC0B797542BBC3AD3559\ +C5ECA7E85B427457299B57F236CE7D836BD850D8024C50165D3594B9F68464C0C16AD7997825A6\ +E0792D0277C21FCE28C34148D65C2CAF04C4A1852B79F365DDB50CC038B3C0B8CEA6B6BF64F083\ +0465724CE5A2CDE6EE03C4BBF6ED02F4385156AFF9EB9323B820AAF32B511DEA73226FF6514049\ +AFC462DD093267A861CB3C77DF626BE8CBE5C36AFF3ADEB4C51A4E58F8E2F2DE896452F49F4AE2\ +EBE07D9EBE7B84DA4AB48829451F6F0EFA6B0775991B3E8271C5F898514B47F5E1FFA24EC91AA9\ +E261E69EB9BBC77C75B928B6B70B8BDEBBCAE270B225D0E8FEF3451A202B82A6864776C3B4DFB5\ +6EF99D2FABD30D0BD00E2D77EBB1B47B6DE59C8D82D60149E772B2F8FF73898658207DBCCD402B\ +26BBE2F044AF68E05ED5835EC787B359C6BD4E10D13418E6552BF31F39F5B5F224F578AACE7CE3\ +1C4F19CE8ABFDF2F5CD1B2402A94A8B07B1A887A1AEFF95FBB0F1E4F56AEEB4E3861366ABAC0B5\ +F1E8B76A079F5835FDFCD9AEC107E68EB00B024FA537766BFB9EC7B211257CD894B74A216FAABC\ +7937742A8548FABB60417B467F9583D8800CE965305D56E17AB6E5A78593E07178F6B3CDEACB74\ +D39A909F7745033BAB6F048480375683F5595887F6CDD5476BCF016878CB991A5C2E05E5B7D08F\ +CC0388573D75284B1F374B97388792EBA1DB97206BA34377A5EC482B83A58D3D113D886464C9DA\ +F7FA3E7CC34C17BAF560FA1363BB766C4822DCCE82F391A759870E28BC0C3FEA07D85ED67AD2F5\ +7CA5868A38EE2582EBB3981044EB4C9DE914759BDFC48511611AD61A7E4DFFF23C55453E03627F\ +08CE2D8F8547E43C42892464A729DCBDD01B3E9C7ECD63853A7A6C0AFC21610AA3CE40E9ED5860\ +C1CB4A607255B9C68D211F3EBCA1:\ +4B34FD24F0F9938C0D3FE66CC29F90963B03543087D1C9D91ECBA5C963C3A5E6 + +695E1DB4DBD8CAA02EE634A3FD177C3A2E9287C4A5B2AA19170E0BEB3BC064659412218EE812ED\ +18B44A23CAC021CA32CDE74239EBE51CD8A585B8349E3C93943F09997836A3835AEC57DAF7A828\ +D9B797F9D293CDD5357FD65F54C4FC525E442BF85319BD682308C7D72328E7EEB36CB926640EEA\ +F116EDC014A6933BE5ADCA3733F13CE240C41F50601930E14B3A26ACAAFA25F1B4D0971993D533\ +FC9698DC97F1A932A0A543596296AAA1E09C33B15086E5EBAC4733C3679AD7FECBAF9F056E82B4\ +A854A71AFD5C6BC51A938752346DEB2E06C54F11AE829B99880B8859C4779C33239B8B526E0E61\ +B75033A9C09DFC533D906C5AB6F617B46F199B42964E92D6FFCB31033930F1CAA74A74F41E64C0\ +03232C6D6D75E7209FF538DAFED90899BB6425E2FB77178CFF14863025D3503954B5FAFC7E4C02\ +FA8110B131E79BD7B120C8757E1BB9BB72856896CBDA5642F2624BE64404201515C493CC1A5906\ +CC6BF4370A5A60BE18F398C570B901CE0945C84AB2AC55627AAD6540BA461BE9848FD96F8B53EC\ +9DF4970C8831D2ABF0E92357437416AABA2FAC81470358B3C42389D6317ECF65F41B5EA676E06A\ +1BEC4C83CAE628349956608603AF32C4B292A05F518C6B5127F216245D80DF929BFD28C89DDD64\ +D9AB0A9ED24FBC60A75FFFAF8118160F75B64D7D5A3968D1200D484CB67ECE27FD2EC4299A2E3C\ +A58066570BF3B2F214A131377515FF589B1EAE4D78BCC68DEB1004244AB811252AF791E61E5589\ +CA07091F5F9117535592B3991A9BD27AD791732C777A15DFBE309286CC77CE61A2711DE5EA58CE\ +5EA5A60BE2BFB41C1EC7ABCA0D7C51E7045A0C01F07419E277BCBF7EB0EEC20D9D06156BCDC377\ +7BD3A56A1B58028E7CA20E1FD51F41C8DBBE7A9FDE46EB5DB3580DAB00B9637DF4E3BAD671564B\ +E93E73CAAC580A21566E9C7248F2A313B094BF03D904FCB1D04E64801A6A22A703DEF08DC0B540\ +20C31C0137C77A4CE189933C451216DF38569303FE75CC80DDACD26BF2E09A3D43683E7CB0AA52\ +6EDD2F88FD1D6EC54EADEB0734103D24BC58A158ED23B7CD05CF59F4427FC1AC26F2C4710389A4\ +E4F1818B25F19C59A742C6233D92B34F4490A5ED52A4151269CB7006F70A787CEA40C044088554\ +97BF0C3F8C24A19E8AEACA1367A8C37BD4AFBE2FF2A4BCDDE413616C245E2D50AABE967ACA4E0E\ +C6D5747265A38298BAB9B920F4DEE454377CD899A82536ECA7B3A021FF1E05648B6257D270F1CC\ +01A9CA609602D9284CDB17C65445D623108A9D5EF86EDFC2C85F2A27B005B85109E01A1E716B30\ +51B801484A1C1F7CCC30931F99F7FD41ACADD68BFD0F89487172A7971626DFF0A877974892DA86\ +F9A616DAF67F73DE452C6A984F9C82DA61FC023A60F43373AF900EEAE581AF403F55AB1A3CC12E\ +39E35A7785405E8DE5BCBDA2E7E734:\ +40F535BD7C0542A3ED6E30440504B78770B48D31F05A6AEF8747F4D280E47B82 + +ED5F341CF8E2D40A804DAC57107019902C7598CD296923718AC8BFAA3952F9FFBBB3A47C460FB4\ +EE29C847B4E1CC22C4693C5C6903AF633FD73BA16A1D9F42EF3B4B5B16B7CD45AA5E83C4335AFE\ +14DAA263B267D7B01653335A99E69EEEEDBC93CFE453856850775A7A17CC27A2ACF82614BC4BFB\ +5118C937A52DE8FE4FCC7B0F8249B80620A17AAA8C103BB0A026F668BAB5A18F1AED0798CDC2F1\ +A77EBC8EB772046FF2327F4DF04DA3BC16B132AC76BF2E20723DADA7C4997702FA06AB191FC0EE\ +0B50EB2F9374B08F8CC4E06F6F57502AC3A55EDE1AE5D9FC28D95A1BBEC77503E443627458EEE2\ +18E87A3AD66E8D169D1F2544B8F4C6F4FC43B1A5795CF1E5D300B6038768303C8E6A3E983A9448\ +A5FC45C39B43E715FD87C63E4F593A420471E771083D0543FA834B6332372D7CC90AEBE96960F7\ +078D95A3F2785A918DCC9801269B7BB967C7FA40805FC91B83526E3B477C7F48D7535EB34193C7\ +2B14EB6A7E7933323AB52BA887BC91C497EA2AE61B824F9C17BCABDA07E35F9616BD75C89399FD\ +8A968EAD40B15B20A1B80334246EFDF3D651B5381988C1685CA229A01869CAAC03D41D2C7C2FF8\ +CC5628C66A749FC7EB69D8D462BFE87E2DD5D7C399377A8E5F5C06D6264D228389266F2EB78292\ +C429D7DB5667EDD578E4A87819069D912A3E2DBCE9D6ACA568A84F331B649F4D16596CA6500C79\ +3AD9FA82D8916A2077ECBB22ABBF5EA5C2B7CAB4C8BA0E360F3F4562C009DA71E23174A45A0457\ +A30A4B2A0B46DF213A64ACF038B1A882FD7E349DE10FF0F7D3579A75E15831AE597C2CB1C64834\ +9C4F5E340063B84361D94C5C4243D4C2A5818EFD0F043F424798932FD1F2DD6E44442DD3894AF1\ +D77549B146D43847293DE9BE5CC0069F341302409B33B0724C6D95A5566C267EBE623781595D72\ +A461FF8CBAA40B3C4259766D7F4F61ED404B2D8C651F6A38F6F757E219864500EEFB9DB9E9F1AF\ +0D5197A1A2D615A64C03DF7D7E15AD48CF22E75D1DEE51A44CA15025F4A9849C8D0126CD4B74FB\ +E444A0DEAEAAB2D11229DF6982F5F0AF95D672D0C84BB005D9FF5846E7C8703E439CA9941AE7E7\ +0E076E907BCBDC209C9284FBD6A1CF8549C90DDCA992E60FD29E876C30E6500EE8ED31FC752385\ +6F84C22A2553542F2494038953633ACB8FBE11B87646D81D366DE4657A85BAE1DD7EB820676928\ +227518C719A310C9AA97E5FB39FB4EF03631BF0D2F51C82565841B3E39C5E7D0CAF07D9BD49CE2\ +AAE1EFDAA9E8D9C6572B0155BD9C6474EE97B9FF7FA167A06DB2D3CF5C2FA0DC8CD780CB0E1F04\ +539E24D1559F0295DE3802DFAD3DCADA8274980C6620B39147B5BA75C7C1D65684573FA1FCF26C\ +4310D24ADBCD39FF34EB2D616A7FD997FCAF4BBAFF356978D675767E2CBCBCF772B55A71D94EC7\ +D50166EC608FC171BFD96DCE340D1446:\ +6D71EC68FF4949433604E7699092096B38169E18AC91CA5B24A2BD63011C031E + +C126AEAED489F433D325FA396A69920B4940CE3D8993369F8B776126CF31D9CDEAB316C3028342\ +8BFAD19CEFFE9AB9F9FC589FB7C0658C5FB58BD127F9A90C4C60311D4AC435AE0FEDD241A31091\ +C55B8ACFA4D89DD0053C43085E395C85935327040D950779B3D6E58BA668EBB191149331BA68CE\ +7AF35EA27CB68AECF9D6EFE29BC2072FB47E54DAD157DD17BBE7F09748AD257DF67B1A6553A366\ +E31BBBEB5D969D4B7CD348D1968D84813FB5E1981E873ACB17348D4B31C56690101AC361E5AD2C\ +4BEE75B3DD1AFB68512D30A226F514D38CE51A2047E53D3CA91A4794368F6FEC1C191E2C205915\ +E1B8056547C667AB77223BC7A22464FAE4F1F5058F5AEABA1461F4B4E97861DF37535CD487AA5B\ +9845DE89AF6DF844AB86BB5893D03ECAE0DBBF1ECCD04F8CC286C40A732E4C9373BEBB969609E2\ +3A236C3B74129B893DA55C114432032DD32DE7304FDDCEDDA0C6217C11EC9347D7423F7DB1B94A\ +1B8686EC6B626CC22198C1DA6FF01E7BF447F3AF32E55AF453CB500EF9EEA4C866CAEF142091C7\ +F11034C1A755E01A35D5C9C57770238239B7A0402FD8F0589B0596E019F8472A5173E86DFF657C\ +0A8B5A65F85DB43AEC400C9A0F7C26A489026CF8D59E7FA867EB5B3B89F01B77C371C96E65B52E\ +2F8F6C362C766C83582D51CF89040ADDABE70396E81569897BD21C5F6B50B95E62A6D10761A957\ +F172EBB30E28D192AB19AECF1FB8041B5C95B07FEE75AEABAF4668018A157F8C8246D886E30C29\ +4466209CA296AA79F01D99CA518196DC107CC73B4F1134BDAE068159C9D5D68BDCA71B2143E096\ +96209A597752DD880572082409D198A9DDB8257FAD0A47CDEDF80584FC5487BA94CE02271B21A7\ +8B371A2B8C9B6FF0EBBAFD608EB593255ADE224E213114F94BFDC985019D413065762A1D8738CD\ +EB84D5E24C6CDBB68F2C9BBB16C9ECBE2B796A51FE23BF5C945EE3519F50BE6438F83012492290\ +093E18D6BD69C677AE9A66EB25FA8FA22D080AD89B3BE356A0A9FAEFF764234128B11FD07F3CC2\ +E4D3921D0D04ED4BB1206EB63B7C17F173FCC2F88F47297BB33B7AB3D0DDBCDD1934988B87E089\ +B090EC6381CBE7EB07AFD0406FB11610305400B3C2659905542D98D697BDD7652BA039F9D8F8B6\ +22A41490A7CBD7E8EA4DB50E8225094ED8052165F3DB97366CAA3A97C3CED84F0DFE18FCE254AB\ +A0C8D12EB46E7713D62D404D67F9178FD13DAC633C7092A0E27B148BD972B0BAC0D7C8E61A56F2\ +C27E6E4A29B48029224A62F617A97B265F6AFA8DA77A7C0EF080BAD36F8124C787C3D2C318C7AF\ +B9974F596E38C9765DE921728A3C495D13FEF0D99CE269979AD075703F1C784BAA6FF6105337A2\ +70DF2244AD2F19EB243E3B623382260607546ECEF1CCF3C5B6A5425EE9D565CA8AA70A5E1AAF56\ +F3B93E5D7F8E763D4BC2EBD2C25997BF11:\ +84CE84165BBB95175543526DEA5F0C97A4308D2776108D22ABF842ABD1AE968D + +9F46C2E21D2366A40CAF149524BB4CC51DD7E8D221F86E68090EB9B72BCADF0DBD1E00C8167149\ +86EEC2CD8B9A38D8061746BEAAB4F81141CC57FBDB4DEFF3FF67439F451ACB4655A7A1665894F7\ +B01450E8CF23FD443B107B4CB83C62A0E4369584B59AA57A4AA758EF200D0B48E50D926A185C0C\ +691EAA2A5B30B1656469798120981393A2DE461BCFF6E78656C22E5BB599BF92D16AE1788D0DEB\ +2891083FE095D7B3A6C8257A07EBB59EB517E0090C372BCC0ED25DDE88803F35FDAF12C657717B\ +10C1C1B647EAF9787237B445B4BEA460F1541B44B2E288591CC75FBA04222946C2DBD9BDC674BF\ +5C8D4BFFAD17248881460C7A95EEDA2548902069A81A48C84D6366FA248F4751871EFB8F238B31\ +0965EEF21C1D0D0ACD5D50D059B6B66CAB482585125E46D5B637D937649D795911EB1DBC4C27A6\ +988AFAAAA23D79FFD1251F5B46BCDE7A0A19DD2F2597FE3BACDA148BC6244938846D9EA16455E2\ +6E1590B6B428025B8114AA60936C7BC904B47689A4F4451F0BB3210EC7BC65CEDB6621BC10D937\ +94DD969F5CAD5236A1F0E4ED224C6DA106EF63C175881F7EF4AA96B9D61666D30F643E53C9E3EB\ +701847C0A62263EEA4094338D8DF317FBD5C8D6339816D8F2BBBCAB7E8E877810FE89B6FBEC7C6\ +1A3F0BE7488096FBF807615CA8AF1057FFD467AB836956A1FCF4DE073FA1B8E2C55E75873AF1C3\ +4251CC288BF669F75157D2D0A79885FEB46791AD61E7459B3D532E88E04B564ED4FA72860A74CD\ +4342FC2E35190B1C588B997ED11148726D4B943A123F34B7C6248836D54EDFB9416F84106E4305\ +6CEB62618BDE8DE862D6F972069F7AA8B11D5380A13451B4E8AD998ACAE76E809465AA2BBD56E4\ +8F4EEBEC27BEC0CAF07CF00F9FB2CADD2E8E3E15B851F49B262277033C4F1EE0989D928EB93D94\ +654E389ACB8213A2FE8786D9C783E09EC9693E5916A1D5BEEBCEC342756971A8DC573960CD9A2E\ +50EE53BEC7EBB9B1C3789DB2290930771DE7149C13E192B9CAE5C81CF8D7551CDC7650243E3058\ +E4C3F9422C5E46764F10EE19B7346078F0CF3E4D65BBFAAFDEDBC55B91E9F071FF8E143F98B60D\ +669D8A80A9902080AA05657892BFBA92DED6852DFCC3805850E2D952C9E77ECDB2696F44E722D1\ +BFF3049E7F9F55491AF44FCA64F17CA6DC1C1A980371E9F43E4DA07B7D8C28E4C0A77FED054EDD\ +4C88C7635CD63539926C961C1182A243F680898E34BE3EAACC8DB4545BA623DB0F2DBA2C747541\ +01A952A8BE54C5F2985F088C98CB00527BB42984E8C609A73C5ACA0B575A2B4A914EA6B782B14F\ +CF858E1B3172624BA4CE0943DC70AF09029A755E8A613C66C5B29270494E1960080A0FFE8697BD\ +56019E4F1F42F99A83C23CB53DEEF877955A653E2621CD267C4705935569BFCDC2B87AA191E5AC\ +5588F0961E39E9B668825BE62DA329D6EC44:\ +0FBF1D93D23BF1474C044E9BD979EC7120F98604EE006EFFD8C33C0FC59C649C + +0F8D71AEFB9E58C7D41B456852145204B4F3D998EE65A47161815478CB2E88E94350135C331126\ +78D40A7585E9C519C25ABFF0F1927717DC9BF411E8D12ABA65F34B9927A652EDB8F129DACF3C74\ +4FFCDBCEC171E862164B241D63090DDAFADF41910C3A61EDE7CE62427950EE15A3368192038395\ +A98BCBC6FEC064241F165B645CE9B2974D854DFD1D8C3BA6B294B8AA91A049A7FBE85ACA6F224C\ +AE72DD42CCEDCF76159569DF29CA02F4DF914B875E87895FDF2740DAD1671E6866F9DD7CF173DD\ +FC88890B0235FA483873685DBAD323945CBD2448803D54AC79C16AA90D26DC70A84308AC019A93\ +93D78A09503F62B7819860C3397211E56C615621950361DB16D22BC8F9F316D12FB4D492AE142B\ +42DCE04958F6840D2A48F055A2F68C32F786597FEB04D1E1261DE7CBCA5D34A085025B66A7D78A\ +34F0DE8619A136C71ED86730834E88E9D2826CA87B016ADA70A9F06844D62D44A86D1EA8E872C4\ +06F4542CDE275D0CC9E6F8A4F05CD3814D8A50DBB8117C0E731E9A80AF34B6B3435000DBBE81B7\ +1E715962073057B2011637EAFC6B45C71CE5EE97558EBF171CC4AF74BF1D2747CE5DE49557F686\ +740BF993E3E208AF7C033C23FB2616047935E8AB73563FF47C7A1DF274CACC96EC77F5186E3E42\ +3625C817831B2F0BFAD273AE893E59CA08F8B9031238817781B52243CD6A382197C71140BF5A21\ +A3E2B3E8B6779AFF965ABE7EB135C87EE974D7D8AD3902FD65F55E01D8D9878F24F6BA4C1DE634\ +98ED65A2ACD9C29194F30B41FC5B2C0EA0C86758970EBA68AF455B358DFA3E9FFBEDE4ADFF9FCF\ +B184E99A70DE24D65B0019E98F9F00B0001E64BDD39B3D0866F6F1DFCE5A8160DC3520C940262C\ +24B2D06A461B48D1311FD2BD83FE229ED9617EA6B7C880D7852DB2B74966EF951D0B46F02D8F4B\ +E1603681B4ECCF17CB4F7BD3552BFD2EAD2C41001A52883707C2C4382576EECF0406FE84993888\ +9688061DA54EF59808CD947125D29C27DCA01A67B0C9DA4211EACF9EFE1B274BA4250AECD07C2B\ +5994E0997367818C2750447EA3E671911622B2FDC0C84CF11A1345420C2D2B9D1161E0760BF666\ +9A36D6F5A571B11B68C98E485CF2256A8DCB50CAA2FE74CF99530A1B51265D3EACAB5FDD27793E\ +18479B4EA782FA24901A80B6434108DD1DE0F1B4C80C665EF6B52B8403DBB3A553D550D43DF311\ +8BB7862D4AD002E87FADA601728DFA97ACA4A15590265D825BBBECA73ED15A4E62A3AB7DBCFA74\ +56CE2D1F3B1B6E8756E33F6DA52EF56C35BA574E6D250900841EC42C6596B8F135C3D61AD98C54\ +8E6448975FD5EB5C9E69BC7B6B646FAE0DE1AA96AEB2058491123B17BCFEF67DA21BD13027FF9D\ +1F36B2C91DB41BF756442C3B72326C6A02EE087A75A73552CBE231C06B5B0C7D3E9180F9445542\ +8FF8AE90B08F61E929BE4ABFA35D7CA39E8D74:\ +CB0A81684E5369ED90D222E5CE73E899DCE5CC763A044D908D99B9F754D915EA + +3B81E34BFDF7EB8F91A1BF748053E95D304B4857A563C8FABC509DB7C40F2D0C44F98FDCBD1711\ +164E186F885C720AE6FE4CFCB4DF85E4BBE30540FB472338CFF09DD725B88F4EAD30640A48C0CC\ +8F948CE70649946E6AECF38BD4228CBFA874E6D652B9728DF1FA08FC0E80BADEDCC74042A6ED13\ +D2A64E5E595946920CB7EFFA2960A2EEFE20871D215970233E1EEC8F2F3F1D7A32D5500414A2F9\ +D161EDB8CD2D48966532D4E091F704A440C3C35697D6C3199AEB839DBADCDBDDA8E08EBD440339\ +D1CBFCCAFBEA6C1EDFC9443BCBF692EE4052DCC014A1DD529FC86A4FA35D72E63A5A45783B3030\ +6F7609402DFC77787C360E400C0BDA451562CE098EA9F671C637BED7E254DB2E75C0E1D2C3A285\ +03007069F5F54EF776185F50A034D4A2AFD919EDD984139A9ED070DA9259C5C1A091334361C35B\ +5183EDCC7B312420993D2C7592A693491B6C0834EC293028112DFF0A5B8ACCFB197E996E97D594\ +DBD63DBFAAC2EBECD96F73EE3CED050282AB9053EC9B3463DDA1C5EC7C8936BAC9742E9DDA82D6\ +6D544CBA9B4F80CE8DC32C80AA430C00DCEF65EB9720ADA8B1B762E502C3C1F923F2679CCC74FA\ +430907ED37CE17B89ED75DA0A7B32A376D4345E7FE3587B43AD23FB380067C9AE736C65656610F\ +02F58D1F78D84C8EF058E6A7312932AF4A48E0E0BDAAA9C37F41E82276C3E2AC47F774F1422B2C\ +031BD6BC630168524604C5D65D00656F863B997C8FD9E8EC99B16016528C229EE81D0E20F01BB1\ +C5CD512A105BFAE82FDA1715F6DAF6F6E044184A09AFE96DBDD7D2EB7729D56440656989E0D4E4\ +21D951A5F68EB5B4E3FD4E5F1953A4ED29FE5E265F2D7BF56C3FDE493AECC8169AD265A38EEC98\ +6DF7934389040F52877221C34A846668F33EDD663E4B6D08ABDF66925EDD743DA3BCCCBBB98997\ +4201FFD633ED693131762B6D2790DC65AA050532E692CD7DD2E0FA793B5E4020C802717932D3C9\ +4163DCD84E1D93F3562D240E3FD74C28B014192F1520F5EB69ECB33D2904A76EB95947A7D74654\ +3A0E09E1362239838871FB117F4B1ED20E6CCF30524B3DAF592E3BD8F15002E0A10557C12DF27A\ +55374781AAB0B2A20A980BFBB72589333A3C16C3DDE19F727B324F3DED460062EB78402E303FB1\ +846ED84E6AA01CEFAF2C07569AC04CAC024F50B511AFF91D22391AA81E7C521DFFE12812BB34CC\ +6D0CE560820BB219D2063826614A9AE8557F34DD5C8E0DFC46AB1C321D3B3A4A7CDAC40BD1D728\ +0F2469FDCB6CBA607816D668057CEA4CA64F881CC31F9308A1FC84606C1C28E3E0BD7DBF45E430\ +81C04B07804F5E0F91B1EE298AA6B9DED88B1FD920D6804FAA8D6D0840A4476894ADBCA71B66C8\ +AB46DA39D0849FE4F1134220B4315A1C7BB622D95B6838D0561D65219D902989472ECDD0F9B31E\ +273C95B96BE1AE42089639F72915829E629A2E15:\ +F978717338E5BB3F578BBD8C4587CB0BF84D9A55A129485250D257338E1D5A5C + +88DA2C023A73898CC6EC26A0901F71C388B18D213699D1247A23C00704880C6B0CF835CF5C5CDD\ +6644D9FA95369B4A1E673162FE84065929B79E7718F53C7556B1A3A7BEDD95B68B57C5024070D3\ +0E73B48AB44D98A172DE22AC1CC28F0A64CD6ACF5A5CD6E1A7B42AEBD69D61209C32F942EEA253\ +0224ACF0A7BAED6CFD1CBCF074506D5AA20E1D8A8AF192C319F519753267599AD8C6E8BC1432C0\ +ED9302B3A72A77CB4109C2E312A3E2017CAD78425AC2DBF4E4286AA9411A98FE769E988FD60025\ +08B193D605499E120CDE012DBCDE8DCADE91A7978F7BB6E5071257189291951E6D2AF09EE0B435\ +B944AB4E2D9BB342EF570966448214389D1978B0AF8B9729E6200C583FF1926D998906628ABA8A\ +1AE58CA5BE7CEC73593B2E7CCD8E33C4803AE3FA07374F1DD5AD0D883A84C76E54A6C733BF9205\ +A9B6446E2F5015ACDDF52D7239C4DF8AE11F2BB02C09A87F88CB56CF63D5AB8451961C06B8361C\ +148785F6D7F2BA78E27B33785BE64C403A4C9DA51948573405EAB99C0778F3B1AC5B877B2CBB79\ +38833FC4DAC613D40352FE2428FCC6D3152F46F99E206FDD7618A3025112E6A4A1982CEC8315FC\ +59759EDC3C7D8BDB211A6BB5088CBF65F2A54D6E3B54D75DE5561041E2317EAE392E18847316B4\ +184A80D31C97109322095728728AB923210DA7734469E9B8E762EC28A2783A504EF57C84C1DAA9\ +F873AA7C968CA27D78DEE8CCF4BAAF24685803CF748456702899F3181A199C95E5878ADAF0AB52\ +37CE8D9BB3962B3BCF511826F20AF064A5B50420AC32C81937FE6A318009C4F92CE35FF501887E\ +0F902FD8D9B5BF7E0D30B40619D2E9832C6BA02A2872E57BA4B5A533659CCF034D8E72C9E23EBB\ +3778A0A7F102361C79F25273EDC27B7D63155C0A70644A0EBEC634954C7BECE6CE027A8A74E72A\ +BD1B7311D033DBA9F22B798518822A7383DCA72ED70D00700E9BEB677C5F0D5D3D110D179F407C\ +C1F00D06E67063DFCEA0E113C1D7F5822CB81CB9D89FC53B8A679FCD83A1774BBF2B76792819DE\ +03909AB7F38FE447600B453AF0E261EA5496F91E00BC594C9CD37ACA8F8D784D44766E58D9C36A\ +0C73EFF2C2D67014E6F80D3B55D77B8B97BA2C30DE7D3C4C0386771FB6AF3B21F433F102016409\ +BE94638452A9B2AA79B52F8A6D2439DB7C71F57E2AA1A6915EA0993E5D203BF85EF5E914A21C5F\ +8ED05B290DF3BE28A5861398402C4114DBCA88A17FA0ADEBCC223A86F35B989DD046E31F130282\ +D2FBA623636173B71AC85D45FCBCC39E4D71D817038BB50BE88E91717311E35AFE5C58B57392F3\ +D1443AD25483003F02573653878B0D3271931704EC0AC5E47ABBA1B57DE9BBD0611708E6A7B2E1\ +FB8A468814541357381A5D24BF1042AC9BF0CE48A674DF9CE54D5A0F107B7DE23E28D3F6B87E93\ +87CCEDA9C2402041E8C5454DDFF083F99A83045FBC:\ +503186570B08E394FF436ECE9E353A899D32506689AFD3343F0EA72AD6446D0D + +58755EEF96A6E5CB9904BBB82508C0D67040B90C60DDD27EF96586175B6F23E60D5B186CA6C2C4\ +EF08752D5D5F4A4FD8D62D5D108A2BA0471FC2E6DCA7C9E4C95812E50073EBC8A6D0E3F5D01E99\ +427428A0965E97FB5442F13755E19B575780D380A362D9EB6713550756AC9B2C2895614C865810\ +6E99A222ED710A0272B23C5AFE1EB3022B258D18CE4DCE181FEB79261497EE61A89178D332431E\ +C02065FFAC5FD76EC059D8A3C2BAA5E739D0EC020E4E0685047EAC4B53C54CFCF799753FF61552\ +DC1363C06DBF48F3598BD1E5ACFCB0E13F102614F6F4DBF2CFA197209ECEEA428F44FC74B83EE9\ +58BED64107E8FB6C18A5EDCC3F4888D5A872751A71B07591BE273788A656C4AE162E5A7B0EB43A\ +30295B61A8100B337D8483B62DB2414EA534A4E4C0F1D7FB13F25C0068E104B4A92E88F579B6BC\ +A424DA036227B5FFCF75D4BCCDC91A97D32ED8F781BDC33D0F572744DC1D1A2F356CC2ED23AE2C\ +B22B149D885461B61650E4BEBD3153A15B5064B3CB1863903D795A1986B6F13ACCE1B2026D431A\ +0F60306D35933C067C25B93C465D76CA117234057298840163E93C4BE77EEE2EEA24E398FF50AF\ +7702263FF34E88BEC7292973130DD3150C3BAAC695681B0D2C6804B40D80CDDA9C00C12B7D811A\ +7969888CE29FD20F897196471050DFA9985156F6732F66F3F4F128A84FCAA3A4C92E20543C4EAC\ +58AAF14FD6EF769306AD5C490C14AF969686FAC100CFC49570684423648F74F5D69F7917052465\ +B92453F934E911838BCA1021C71FD1390C2613127F93B31CC80B7DD2CD8EF58E341740F5467B35\ +19D01E2827FC0A65BF902FCBD94CE8B09BB78ABCAF6E7EB7E693994535D15E8CCFBC3D21AB82DE\ +DC3AC3081DA7D84BE13C8B0E99181E63E9E9FB1765DF1116FCBC2BF3B67C8749812ECEA1AA4964\ +29AAA8519F61DEBD2E6050ED9BDFFDBF2CF800321B5FBE37930873BFE189148F70D0A1ADA523CD\ +E42A1401D7E439D5324B045675466C3E8EC22845D19D368F0FCEAAC3FA7F3D5355BCF7ED8FC233\ +2A87A413744A010283EEA276D02C7CC6D6A50FBD8B66A8FAE9C67381C0CDDB56FA456F6DB4940D\ +28C76898DE93150073C348F450C497F259EEF6CE4D9B36DC8DFA4096CDE7AB1DC3E0B6282DFB42\ +ED2B85041FD7DB2AB1BE12F63EA15053BF6C665BE0E58D9B2D936C9070064CDAF4CD0709249D42\ +6060BCA9EBF9426CA3FC1DD5B68B8B9A37BBEFF5297717AE668A9E8E861532972DB6047442945B\ +84C639366863871129CBA3E20652D6D89899D2E8B7548F989C7BE81F4355E5619AEB4206A0E04B\ +D1227DDA12ACE2FED4168DF9DD025219F436CFF47D977BEAFFE1E3B7157D7AB7ACF8DB2152F8E3\ +10F5AAE7CECA51E70D402D4757D9349223619C345B83F2C74EE497B957362FEE549E991B84162B\ +8E232EAA6514E726226297C103D2638F2A1DC951B4C6:\ +CAA390A8A09EE7B7D32346D3644E95BBF77EDF017775B8AD47F58722C2BAAE48 + +0ECFB8586C18DE7B9BB2E223D93ED47EE12964582480F8703D10F603BA655DD0DD21A9E2864972\ +FFF914E921857C6962717AC82518581241F1EE13FF515D0B73F6A13AAF4F69064E061112EB4CC5\ +DD30EE53438EB8E4A5A2E56DA0049A750341D23D660B69F43A976267C53781A47501173697213E\ +BF3AD79C394353E40B074B3F0D9B01E3E64234B81DDBB9442857AC36F8107283F53DC6EE173990\ +479EF5DD913A46F6CCBC3D8FCB0150FAA1C155020829A46CE3B24B4D91DF564058399EFA183D8B\ +0D9FC82B9BD1AD3A2BFDCACE47011E8B0B2C078CAF0BD1F58FBDFF27E6734BFB5ACB3E51A233D4\ +135BDEE26DC929B77F4A3CE2B62E6E95ABDC5D24EC56EA3E4524ED2B79AE43BCD61B7A0ED5DBB2\ +BE870F55D49276AB9B6868F28FE7A5127402DA1A153D69D9693AC5FA3894D8830D74E702FF0E52\ +4BDE87FEDFAD40D14995A7A94C881231B08C39E3BE535258C823A4F12B7F56797891458891B82B\ +6A8BB28932B942367FDAC0ACEED6854680CAB35EA9D0F9CC7143400BF1BDB654B84A9552925D99\ +623B5120F7A9A82E83D1A0668A5D1DD8D68F4B5DE34D4BBD34D4C0A84AEE897EE103CA6EE88356\ +5CBD2B0415CC668FCEF49DEA550EB569C31E4B565DD0E0AAC73E4C48460CFAA969F6D794828BC8\ +193AA0F30A08212FE5CBC05C89DFA5AC478A016921ECB0B963340276C2BF14A836C8CEC999AFC3\ +E0FC175867BF0BA0AA09617D5C38388B86E26611312368ABF78089A345B022E7E32B4E3156173D\ +10750D401B6C1D907CD127FC9734F64DABC1457C3AFFCF2F41D839AAF165D32BE40D8540C581FE\ +A39CF02779CFABF9C269B21A44F085AA077308D0BA7B398E727C1ED023F8F9B2571D0A0BAEF408\ +235F1FE5BD219F3B015AE66D3299BF1434012A60E004EEC076939D014DDAC568F374707F75538C\ +D717F232B9BF88112FE2DDF18CD0C25C0332E46426D4B5C119A805329BF1EAD2837B4984264060\ +4E4A11F21090007210B3DB6E40195ED9BD17D2B774AF08822CE3115E08FC5EE9A9CCDABA8DB673\ +ECAC0EB64CD155B6983FE4AC29C2C5EA52CAE6654FDF8FCA117B547865E13941C5672940FD26C7\ +2E44F5E84BF12D4774670FE3E7035F6D50E58FDB639B0783EBA8636B6398F3C7DBFD1DC70E793A\ +2E83C044F479C84A854CA26BB604064995A0DC9206D619D84F2EE6CF7B929FBB39B3C5AAD3E7C1\ +ED66EB66E93233A52D902FDFD603610B30F3C2E100DA258765CBEB21F698F9637E262D0142887C\ +E83227793AD5820C1B11F9D8D5C9A5E9AFFB91CEBF5E50223978D84AC944D3EB71F9F8F2BAEEFF\ +C8C1983C43998AAC89CC318BE364C3283632AC1A5E2712AD65B2E90E74570C93DA67B17A945C41\ +CC8829A11FF472471DEFD598A38A260EA7DD492A938C1E7457AC452AD7048A5731C89AC6444E9E\ +64DC461EE2138FFDB95E954BF30D2291161B68FB52FC1F:\ +61B399FB5C54FAD93B8082BA8F430F2183A77DFE3832947A0723E24751B51C75 + +CC75458EDA82E7DA1DB1D8C48050DA95D2DDB8B775C56628D177CB6F28F5F871B0FDD75E39708B\ +774B9085151647FF25E1F0EAA4E2436693272EDAB0B2BAB5AD1B941D70969BE27AD7A11F5ECD79\ +535EEFFE45FD5E27D5558CA160336203A2D1313001BC8D964481258249FF971EF4F2175F19911F\ +4E68E20944C98C1DC5A68AA47DC67338FD3C8E706225BD68A51D7A424C844B38831D52D12C64BF\ +A254A7117DCA1D9A120B5A189E2B5575B2FE98D8066229DD4E2EF4177223993A789876DA71CF19\ +F083F07C9F0387F2F82FBE907030E7841AB2118EC834457F96DB059BD4CBB838AFA0E290406893\ +EF7AB07F94A5D741AD811B0CB67D4B51D360090F7A8AF937D29EDB1A7FD40C2DAEF57EC2CD4BBA\ +6AFF1E00B115BFB4D2F1DF4C70F6DF280415F1A0A90C63980AD1D9BED38C659D6FDE472D7A58C1\ +1F85F51DB3D63E278B33D1EE0C11275027B0C79434FFD766DB5AD2D622CFB40836A2BB5125C599\ +1FD19A9BF2B90538C79BB9800AD3D439135BEEC5C8444A9FBF4277D595C802490373BA05225093\ +1D3434C95B1FD268087621D4CA631700172101F1436E76BB8AD04A47EA6CB18C526352F1B4D9C3\ +E1B1C94D4C7C509532CAEC430BD31C12B7EB0BCDB1EB34C87F2D94873DAAF4BC88E6A9E76AF943\ +2A7D3CC1C823C3BE53B7673DB19E1258AC4615B50301B3D4D035DEDE43A87B7EDDB7633C52DA4F\ +E28B356A1494B139B440B8764A404F439CFDCB7D5C2FDD5EF4B997C65733C37AEB04B17305E8BB\ +66AD986036C067F53A3C518A92EEB7237F291FB3DB0F9AFF002225DF7D678124D43D2AF2657E6F\ +C9752D4FC23A2B570804E094A9126AA427D690AE6B5E2FCCE5553B70C6EDEAEADC230560DCC63D\ +E3AEB312922AFFC9AF8104A3475A19F7D11F52B4BCD0EDCDFFC7F1329836D859E23C8D8150EC77\ +F5995403B4E8049F39F6E755082140586C690B0DBB154B606E18B6CD57738C81C5855F06DE1896\ +031AD801D354F672803EBCCFF032EAC565743261433DB2226AC0E577B88A5C5DF0E6C618756409\ +FA394B4CDB92F0BCEF00DF610A649E3D5965E960B76DC2AC3350E05241DD98A6D3DA6485B133DE\ +91B0647C225EBDDBFD46CE214B2C16BC7F715B1387807EC2D9D589C7EA15208784E1D75F0B97D6\ +4AA6A32BF2BBC50977B10B3C06D9F1695DB9B424C9F9BC15B363BB5E1859E203ADDABEB9CB5375\ +3B1C546E5911ABBEB367AD4AE6846583A5D18AC6AEDD99987BBF7763278728447AAA34A1C01157\ +2DF0460CC1E95D184DBE871DD7EA76547BAAADCBCB0BBB9B548480895ECD2AB81BDCEC1B412B02\ +CC98F6501C5C68C509C26BF0FD8365AD8EEBF5C14BB36B4E8855CFEC2D324E27BD78A4EE9AAB20\ +088CA08BF8322C7F65E509744A729AA1ED5FE27E76E95C741FD3874C0AD86F647A90BB7E7A9885\ +784BE46D6C4B2294148024B853FFB33B313CC069D9258FFA:\ +1647976017C0CCEB3204A02B3578B65C2785CF95F141063637B3689135B01D71 + +D2254E881D09E77C39BDD2BE668A83D6684172FC7F3A2E5602DF649F07756BC693BFD856F9D870\ +403954D3EDD0E48F8D071DF89FEC540A826AB52836CE9C39527452014BCDF128D53B590DA9B53F\ +39552AB49FF59EB60823ECA6BD51E0733CF0CDF4E9A0D4379000ACC56A27F0E0B9697590036776\ +0FCB86A88F86937AB2E04F2DE22B6A485776E548757C76BECF786C80C68A209F173AA1D5782AE5\ +F1DE25DD9DBC314A2DFF9A8CF318D41793A45AEE857ED30012407D8362FFEF338E04000E21546E\ +040BF8AE3643701B25B3A66A107B57B1529CCB3C88B8B781E68D578617F04261A1B467AE2D74D4\ +9A8A118F3E74826A5F2F3CE930EB3A96890CE4991FCD09CC331EDA16F60C8407EC5C9A91CD938F\ +55023445C113AF011516ACB603E93BD1C6B8977543C92C93811749978F977CEDA06A58B48F76F8\ +EE5FAEF76FA48F695A33725B45118E52106D581BA370D758B742861A87D86258623EAA359AF117\ +D028A923EFEA8194DF661409CFB75547590CEB3534A0FCED6E249792154727AB2024D3E9C7B379\ +97D811DB49761987C4E4B45C7B42DA3C1AE564D7A93ACA823ADD426374FDB3B5EFFFB5DACE925B\ +8908C7DBB125682B066C069C28CB8BCFC4888D78F9E3A001A00D8F83E1C65F596523905D142B86\ +9057301ECED09B0BDCF78FC734FD99A32D5605635806D4210637D21E617490D9FD43EECA5C0F1C\ +274A0B512490B42FE41113B4B24F8193D3DA1622F1A5D7CD43390367DFE2D80901FBBDE82CFCDE\ +4571B066D228A166FA8A873A5593E13942508EBBDE1624DC2D5E96A5B45853C54BC9D90D853D1C\ +2CE0D89C7B1F54B205712919F3053A8F8730F4D1D7749774607795DF5508D947521DB651D49700\ +A57EF2F1945AE6724AF0F81EE02F86D886702822DC4EFD421077F526803746E1782F680842BDCB\ +6F9C34D13C02AD04FC3E2C2510CA3955FD4202F40AC756EC07E6AC4EE19738BBDDB47EFD523B25\ +C1C524FFCF237800175DCAD9FBAD0141C7155BDAE41D756A4485B5BBCABC265EC4410EB8D12BC9\ +39EBE8E867843AE133D602760F7CD513AD11F94B9D85524C87135E6FCB9B402F31A32C202B8F61\ +6A4A8DB809881841C023A048A0336C58FF0176EE96B0BB64B148EB622D50CE34BCC89753AC1AA7\ +E9040FBDF789860C4C9D5AA74DB17B824CB7D13BDDBED24A6C80A118F05ED520A36CEFF13ADB15\ +5AEC3F97DA79B6C248C3375130ABE3A8FD0514F1D8624297898F3BF92B92EF363EDF7FF0D00E89\ +022EECE47A182BEB7915B98050CCE278EBEAAC31E4F721294D994FCA38A9401E8584EF5670CA70\ +6FB266F31034A36545C7C3586BDB47F9A2AEFAB724826432272F1F97B3B282E3F749089DF2E6D2\ +A6580B71BF5DF7A01F84396200B1764B09350220EF99B0BB244A044F486D2E8006F710AFCCE0AD\ +03F646C8B1A6711273D1D1A07D61D97A4A92AD6EADEC71BADE:\ +AB79BCD11952F3008FE2983D748A2C3E537BF3C7CD4F4378CB6FDCD3E607A848 + +7EC32975F47F4F8DC2E7DC7A68F02771AAF5DF6A31AEB5E6E1EC58890C4AD5F8F19C4D2FEEA12E\ +169A73281A19F36A02EFFEC4BA14E9DDD877E7F911C0D3B77FC9FB24DD9919AB4B79DF64CACA98\ +DA52E91018F628399E1A2C043673D62F8D92758C4C903AC7DBAF65E8AF151ADDB6E796335F8A58\ +8AB7034ED3FD8AE9F034C3824B1310AAC10676F41017C04642582B1A9F7EAEC9DBAAEABAA6ABEB\ +B5E15EB8AB6C3AF58D848177DA5B512466839F196B894A1A7E7C62F8012D11A42EDCF544D3CAA5\ +8C251E0036EA602A4CEEB0EA33B6D8970668C75F4BFBA6835E6740D83A4A2D740E2841363ABF07\ +D7C74811E2D171DFDE54EFD7CE74E16AAED0144B08FBC244AAA7846637662FA298C153C99985F7\ +8964364619D7C4345B84CDE705F06061D2D63DE01C2D65713AA5FE447D4FF86F00AD983F6F9B7D\ +E54E6C770B9AA69685337E73BF6B4327C96F23B94930D7C75F8C242F64BA426F900DFFC8F8EF02\ +53690A4AFFC345C070D1B1046EF55F7804AE74C74696FED88046DC61B215B8079752E804445C29\ +D6D3A8EDCD7F2B506E9890355B38D3662098EEBCEEB0791F1D26D6BEAC8BD40EA3E318210405F0\ +0A6D3E17D7A501190B355588DCAC102C6C052EF33DC33BA9068B71A9B6A1BC289E3E108B1D023E\ +978E8BFF7BFE7F88D73E4DDF6D2C2A18FD027DA76782F1812F16BA73B3D534E5EDE512CDFA71ED\ +E2CAFAA11356C37D11BF4A066E825444D7EC7612B4240C21865AA29E19D02BE980CC85AA4ADE40\ +3B5C09ACD10701CD3AFC931B0473B351D27EADDC920791BC66A1203F666B3AE8FEB1565E69DE3E\ +547B9056DD8AFB6E2B88668A0C7E5593FA8D412007F8B3BF92C1C168D0254A5B6527ED2DACAC04\ +963D7CC93D6395346A5A3A04082BDAB11B4C0A0B72B1020CF0B048EB2BF9D8609DF27BF014E96E\ +CFE2488176FA3B93DD5068FDDBCBB9FC747B6B48DF5E989586C3D0A7E17E1B5F7EB695C0FC8D2E\ +09DF77F964F6FAFC6E5D090440AD393A2B8B5CB39CEE1196F08FCEC7BB7ECF5410FEC126311F1D\ +09DF4A9119C7B09115C57250FB78D718139CE8A8C37A91A17B4DFA87B614E318894E2F7598402A\ +FE826F6CB2BCCAB72A65565C64BBDDEEDF12337D7CDF0EEA143B40BF033C541672790EDD71DF21\ +FF50AF0729498390AA5923C6E1D295A3F8D41EDC60C81956800EAB6B115A9A99C30C17AC4CC800\ +64420101410E76DE2D74E7C5B3F3BC780BA34C4D289A23587624C6E31B3EFDF9C292F1F080E3B6\ +42C65AABA102FFC85BAE63CAA050F41EE17050D300BA5D0B952860EE5BD3ACF1163BDE54C6AFE3\ +D58772FBD2F3FDA85360F462071F2717CE2AECC75F311D2AC56264FD71014F20B49E2CBF17277E\ +E857FF6AC531C006F1A6DAA6C82A15B2140959328A1E9D2A40DD03A02B850069040902A9E2C3B7\ +A9C8B13845C8786137B9EBF3AB06D6130682780248F10BE7C280:\ +FFA92041D1819A20B97BE2ED14D6D9C95FF0A4CC4104CFEABD575058D8B7BA5E + +F2592D6041113B82E0391FF3D24189FDC98F210B8D9C9C348B45B9DBBA0C0369E6175CCA2C2C55\ +067299C1EC634478F3977A6039662F83D19E8DE9085D8E2B45F350C536CDFA12394D77026BD45C\ +41DCA426720C5BE90C85F012FCFD04F06A4365587732090E6F6C52CC141B8652E92139106993D4\ +5BA95DB0BE841AC7C5747BE9B2443E8C646A3F8902CB1785AB56D8D4AC65BFE839A8E7AE57F845\ +0ADA0C8610EB3651DCEAAA11C17EE362C727DF460E89087AAFFA9A3D100EED9CD76331DDD3DF73\ +CA89B98CC7A4108B51C465735D902F5FAFFA8A4AE6816CDD628E59DCE1FEA96DAF017816651390\ +6FF735948F234EED61BF8F462E8ACDAC526BE26FB27D8F2EADD5E7F3F5C526A90CF2ED04C3F192\ +C5B800DDE45F9B63B11B6E64D4CCF2894ABD6F3353B8651BC3687995F044323525303422918AD5\ +552E0DAA2B33CB0CFB57F5817F85E140C7AB1CC1FC8084A0E03FF8BA980FE0245F55354EFBD28E\ +7EF646600CEDD1788CBE5A80EB0106BA7C7FA86D5E6751D9143E23641937276654ED1DAFC014D7\ +D0CD7DC71EAE3310D6656C41B92A9F6668932631C66CF7B70A9FD8295E888FE1780305158319F7\ +B78635BB355A54A930BC15A0626F2F85817D442D105CEC47A721276B37E4B82C17AE043EE4E4BE\ +B40CF78B72CDBF10253CDD0350673C7B91AFEC2B4EA18EF4E5E2B5231E95242EBD724FC6E7CD34\ +C3866D8F0C90065B821FD324DC2A5AB68220C6E84A6A99B2804D2D34D69C69AB0B8E5387EA38D2\ +9790FB5BD56123EC22A554B4F1D5FD3BE0A94956C70E39896D0745AB0918CA91045C128087A8F5\ +DFA7CA84DF416F3616276BFAB9B8AE44C5CE25B9F85F160971189134327017F776BED33130D33F\ +FCE5622D8A6144EB4EF50011E895DF9F068716C810C27F94815421B8247802896106F647FFF5DE\ +7F64AE9E26411C76F7FE75ED8413E9DCC95E8804E93E9C388235610C41C7D627210FCD66E5306F\ +C11F9A9DFE688379AF64EE7AE958948A7DA7013B78AF8B01EEB4C2A6EB7EE8E6FFB178F5AF8A00\ +0E31B5ABF3E44BD7E45F5E218DF8FC14A19EDFD7E0DAFC455C7082F77D6176158704036A14061B\ +9A9D7D0647C7B16E20A8566A576025A7A7E9DA3182A9F6723CBE34E68388B7D56B7E902C584758\ +F5D07FFDB5619C82A035F269E16F255B746800D4B1A3B9FF83BEE4A59C74A69EDB9667F4EC272B\ +DEAA6BADF993402CF0D23B0D07216B9348110E680F92FF7230916D8357C7D79757BD337BF60925\ +CF8611D74FD3164E2648AF0CB2C002D18CAF2092C576CA4C95E62016C6119E7704F3A5B5B28B19\ +854C1B0A4BB7762496DC6220AE0A6F44C56CCF1B9C0E323BD233F31307642E206D0CD34D2DD8AA\ +980089034B81E0285910F141A3F29B40CB9F498A5646DF2258755B1654CBC8D6B80F3F0589EE4F\ +3330EA89CC0E6AD4A3D03162C82C5061404916E41C8C1EE316448B:\ +83E01C097F00DD5947FD07BE085E895903E7C71CFE764B6CEB89082B8D6E3374 + +B1CDF8A2B282E91E1AE01820301C5F1DD5D0EBB570E138EB11FAA542A2B86DB01B4285F6BECA7A\ +85E2AD2D4B5753924B754E7EAB1DB2E0BEDA35E1B20377A54C8348C69AF9166646D0B1A2D8B1BE\ +0218A7259E920897260DFE80A53974A2E5D3B1CC45FCFC101A24F251868CC722FFA1B3283FB0DA\ +C1EBB74E6771A99B8CE08C86F28C745EAD0BB77A38BE99EED08354FF0B90D13779A43BF8499EC5\ +323F3ABECA3CFD7328D634F08E16D9FACCBCAAAF7F5A3ED47A4543983F3791CD0FC9562FC6516D\ +464C7936A7936A3BD8341C33332A724C1E89BC0A8CF968FCA37C70701675E6716AA77936E5B688\ +E09C7448F6CEBBA4E91792AB528BE434A90C3A984AB7AD43A82622EB7E7845251A9D93DB7E2779\ +73E8372EBF75AB4ADAD050C4CF43C57DBE7460D688D8205DA51B932DF163D800C0D687989990A9\ +946166B2C6A8F89FAC0D42FF69A0BAE0199189F2D8098D14334F4A99DCCACAF0182932FBF371ED\ +A4B197155AD1AC156370FB1B292949668A58AE03CD79215D8F1CCBB356ECC40D3669C5489F22C0\ +E9716BEC20DC83722BE2259DFB6640D6827756065E041ED0448C07E971F88BA783C41CDF68F4F9\ +5D7B5EE8630054BE9F1664D2E3A3EF027E59A0AC254E9E87A6DFC124C6A5E4798CD4504C496C19\ +C06B76B80AD8A2C66D96EEDD2104B83BB76904BDAE883F0EADE666C052D6AF802397579166ED76\ +2D6F4264747F655B9CDD88BA3595FA9580121B27E2AEACBDA2C95C6861181DBF457054381A30F6\ +FF7E8E62626B78F66B70BBDBA0F0B91892DFCCF1AB7813239A2B7EF6AF03407E0953D1116E1ED8\ +BAD1808BE008524A3C25244A5937528364DD85F055D0881B487C3CFE6272ABB894EEC92CE3FFE7\ +C34A60D6B1C23B2BF7AA3391B9090539D3EB5D7C51D85BD1A8E4F834F1C31B74BB45B6AAF31AA9\ +13DE1FBB5E65C2C7B731BDC491F270B884FBE9326CD3B6C0B1E2DDC4995E3ABA7447E457D724E8\ +999D54E881D4B79A992EA0BF6B8F60B53EA8ACD8DCDF9BB8238867A3A1BB90AC2B2D521591AB61\ +6E453D9E3CDBAC503AF94031D7CFD2858DE20E389B40EF0B677704BF95468ADA429E48984F7A49\ +74D534A3ADCE84EBFEE91263CC87317F9C465DA5E4EFCF0034A15278C6862168356B2BA5BC125E\ +4066154814295CD7957046E76FAACD30FABA296E1A78F7FF658669991C973FE25D4C51F8D1150C\ +8B3D5FE0B19C5C7A29C08445992B46ACF06008221B3FED8DABFA26B064D4DC92EBC1135E77905C\ +148FB5EEDE88A5A7D117ADC5406854774008ED44AE9CEB16EA398BDAE1E1BFFD6D7CD04CC2B3FB\ +AE1CCADEC9F6A58CE2FA4029434454A17081FCCF3323BBA91D26EC4C3C09DF34D6A02C6475B9B0\ +E9E31D7032441D89B2BD963A63CEE6068F965D94555B544648855BEFACE42CD49E302C1B6C43D2\ +20B1C8F677F8ACF89DABE4C265F55BC13BCF71F61CBCC2801259BF7E:\ +1331D84FDFB3161A753E6BE1C68BF78E2D8ECCB1281AEF8C1F12916352400452 + +D0CC18AC8DEFDC7089C8F8DB0298A33BF79007BA72BB0E2C57E7FEC1CC27B8982BFC06DF3F7FD0\ +9F0D33F921FD4D7522173B56AB09C48D71F846BF4546B44E219CA1257633B17C50B23EE8D20C3D\ +02360D5C53F4A32AECBB40F821D06A18903DCFCE752CCB356228802EF85165C61C6A78B5A7C6FD\ +7FBB8A3B9B9B959B7CAEC308B027629F926EEB2970032CBC906F2EE71B0063D7CF184887138B8A\ +F53D8002D26A976837186CC35CD07A31F3121C5815FC18F5CA559E3A5B42D32D8889DD2BBCD931\ +790105EE9174D72CA975E310CC3C7EAD6EFBA9B6E59B45ED1AE587032721F126C0CA38A7DA0667\ +961AA98D1C161177B322A79E5C14DE1C74495357906A8D72C7D418956C83D09176143D797B446C\ +DBF864EEA1A1BB17322347E3326F8493DB05F57AE72A86129F019B44DA6854914FFF3533A58A4C\ +D359DA953CCE3E8A9EEE35FE94D7E0DD3F9CF24762B5893B648C9EC1E12FFF96CB76C91A20D01A\ +70A5CCB2903C444AE6C9E99521F0D2283CC458363F6A289FE7503ED53800E07545C04D27B6DA4A\ +7B400C6F3F0506C46CEBE5D0B2EA251A2B415FA70A6F57821D6948790B869DE010D533B6467270\ +E246FF80B75707D2E3710411ED327C35E8BF666EFCDDA33F4317C78AC8B09BF60C3FAB9408B097\ +356DC4383D2E2F1332764DA26E5256098372F2192689AE9CA20072DD1D04F84ACF52540EEAABC4\ +26E0477B78A1CFBB5B0254B9A9AD983F5AB84DCAAC930CB0A69006518927B90F19BE83780AAE58\ +4CAC65626B450775050C82F31E148BC94F8D6437F42333E73F83C7F48D4B6A7DB06202A754D636\ +7CD29C75C91ACAD7B0BEA07BA03B9F7AB7CF7B9D4C573125AE50D41C0F5A11E23DC1C09AD02A7D\ +7408EA411F43F1CBB7B147D1FDB761FE097887461A1AD241032B52E2A394268AA334C033DF5E27\ +23327EACAF1C01541746327212B8BCEB2790EA1B80DB34C3449B62043355F9E1FB82EBE9A6E3E8\ +819B3458941F9092F713619ACDC961F3D88BA4A28D63601612927AC1701210DB67736FB565F462\ +9B55F542DC1A124B2E57D89DDC4E1FFBB32BF9AE517C9655D57101689D925057BD83B66E03D116\ +1A3CCF6575909D94D6F8C1102067ECC4314B7C2D1B00A39A6DA544A15306F348BCAE7B7FAEFA53\ +E843305F73155C2F1C0BD3B84C935C2AF2F7463AA9EC10CFEF72669EA30AD2D8ABAEBFD8DF992B\ +0792C120E302F86E4C42629BE2F866382CB28E1C5F3E829D2562CFD1476FA8E4A38471BCD7C46D\ +DE3BB0DD0CB87B0A583E5F560374B7E85B5B6BA780EB872839B7BD84B4DB4979F5F579581DD6EE\ +126CD5D426C74E9AAC605B6D147EAE0DAFF0CD5F30C465D1801C2FD776655E0C7DEB8A8C39933D\ +7E441B90CE308CE40A6977F6F1DF6C7BE079F6641F3042C973197CD98E374021CC57245C25A34A\ +3004D7C26127118C035019C87A56BDA4FC3407005594976864D161B39B:\ +8874AAE5A4315343B396F469732C783B277FA0BE98C454056EF36E203DB18161 + +7D3EFC597588B87152A6010670F36C8A900D6C217126F56D5903FD7ECFB23B5F06947272BBA7A2\ +E3C4084D2B49F82A2996F8AA26A1C8EC56DCC994101DEF03B15BD48B56DAB2A7DE37FA8FABC475\ +659B2E465FAAE217CFFB75513D40141DAF882B98AA009E1B98B360C74E3749535A553E829B595F\ +E14C0287B068C309DBD7D81F7C2A415E8107F3A9376EF901D3B8869D5FF5553567AA57992DEDB7\ +553E582E70BD2F62A22AC87A965D74FEDEF061A891A54D58D8E9046A4D6C7C6D4A0E78219C5E26\ +F93F9DA39E1F7F7619E931320C6AE0598FDEC957E8C2B055D428C822FDCA8C8EB6788BD957A2E9\ +87363C38DD83AB4E04B5EFCE9A69A09C14BDEBB72096EECF49E26DEA6CD0B3E8F8B347C1E217FE\ +9EBB2FD01C4345285A29DCEDCD0F5DC4C9DBC0CBC8A27AED672B20E085C3DCD5EE6BBF9E445A45\ +F9A1A247600AAE5B57BECF1539FE4C87D5929DBBFA1D6E5DEDF4FC358F49EE11D4ED73653042EE\ +D46B384B23307E01923F2E61D72A92B0BA66CEF763CD173C92730495359B3C939851884EFF82C8\ +1004217D3F27784C65C42A2040D72A8715E02FC3B33B596346DADAA94803244746079678A8B376\ +51FD1B39A1B677B69018CDBB656652249F91C139070C99BA849362B177054C28A55B385C4CF338\ +B13B232DB877930C22EB3F51CE070C4314CB679D4583E38931802E105FEA524BB2A2877ED178E0\ +4536C2F9679AE7C564A3E8A3EAC08E6F8B15EFCEA58942B5690DB34B507D7B111CEB47E8BA0875\ +2DE21A41F47147B7D507A3A1DF5E0F9B0DB36A7D05D84869745C4230680241E294D689653119A2\ +2F2FC5C0C9E98697A92E3513A6430908360FB0EE43A2F9718773DF7CBCBDD54E420A7193B95EB7\ +881C98CE177556BE37CEC861D56A11F77C656200EA7605AD5AF3FEB065EB8AB88E0A38034880F3\ +A2660784A701391E71A092B2DBDE145F6FAB54CFC39E3E79C3B9E54FB31EBD0AE42E0FBC9FB761\ +A3456557087C9BE253D179C6D08B90DF9F871BD29B125DD2D22F7FA4A104559699B1AB1A906C8D\ +56AE853A31607EA1EACB0B1D41F1D971C5ACFA4705F61D37CD1D808F8B0DECCCA66EF01AACE0B6\ +1974F49504A4FE7AF474CC338DB516302484B1CBEE0C8DF5143C42628AC09388C8E822775829B9\ +F5B3FB2F72448A5DE7265885A3B9DB6FCC0349B3863D01DD377BD60EFF49FAAF3C508576E34FC6\ +1A5E0F72494E45942A43FA424AF438F687DF4747632DCA34294813F6EA10009510005AA7A1FD60\ +12E94DB7CA439EC242F5C5FEEFE374EB967670D2D019589B3DCB4B41290AE70F339CDF7EEDCC71\ +927973AE9E25D8BDC0D74DC9C9E1AB8F2C648808A78FC88607C3D1BF59A5F1047F8F7419B18445\ +8742C16F7641DF79896B4BE4ECDF52BE5BB831530528D8FA0218ACC94357DF588DD027CF1C8E90\ +61DEB12D5FAF24CC59FCF6AC5A04D675AB809B88895C862BC3CBA615BC1C:\ +555F6602A47B634BEA410A9A92367748203B9FB16ECC130503F69616B66F011E + +42F3B684726E0A9E4FF5470A725DB94AB290A477DC9ADE1E3D42C4D68A3597D0E60875D1700269\ +1F5B62365CA19D4FAE96AB779E86D89AB13D46A3E90FF99DF8ADEE749BDC43EF6514241C57F32F\ +6FD153E5EC5A8854A18342639A8C0EDE6EDC6D4F50953440B939ACC3476120AFF3FDAF71663FB6\ +BE71563788668A87A106DC50ABE0158DFA0B173DDF032B44059B59E29BF438F3BCD47E4CAC0872\ +3B364BE9CDAA4AE88E54C6E2073C61F6397AFF910DF07DE05AACFEA0DC2A82C0F43D79EFC02355\ +735F3588FF13DB6D2FA5BB8D3E114B631212C560049ED9D31B890538E670B81C2E7E87D141539E\ +278A46A1E673DCB7410EB6F84CFD046665EE86FC8B256315B97262E5D90935F21E3DD17AF226A3\ +B3E2F035C64A1EEA1EE8A31E5930389A6057A1CEFB2E469C5692CAFBE39CEBF111C581A05A1AC9\ +30D3B9CFF0600FC1B96F98FD302CD691BDC5A2A24E003E67DC36D148F275E771CC2C3D9C2107A2\ +1095B4DB6AEDFF04D5AB06A2A4DEA65F4DBEC42A3843F67748DE61F00FCE264F38B28B9018FE80\ +C34788DC79674FAFB67CD49E7590159884967AC1917E6E3F27AB231BEDE67170EE458861F14843\ +6291FB892B3795F539FBBBF7115445CD8F08E2E383C85ACCD376B26507009F741D198AD4BC5CBF\ +CA3FF5D56E9202F5494B521B08799C890F3A6E6D6348817BDFD3BCCED8119D1A64EF2D02265A6F\ +C1B95BADCC295B8304804C30EBED369EF1CD253EC0025D15203F129D47394C1452DDF966408C73\ +88EB0AB7974A23D7291231F7D0C07CE2F8A66F51401EC8523F4F178B7C7473C50C67E7ABF06897\ +3D453A12C82210E922746CEFD08CA5664687D762774524B5725128CF8F29FE3C339793A1E1A0F7\ +B9BA698714AA282A4E298EC80E1550D6003B9309577940002A91AD200CE646A649784B17049758\ +473F48A9A5647CE099E65002B1B76EC05D3C81350088C7E4C043E542F2E883577AEAE24EA671F0\ +718C5A35758D07B71CAD44B7953E18A746ED7073AD9044F6AF4245424A792E09453B363ADD4226\ +F7FFD6E470D223AB12F65A9C917F3282E5D64A83DF20F22843BC9652C9C89EA22F74CC9BBB0097\ +61BBFC63FF7796C92E907537EEEB082711FAD82820FCFDCEB964B863259D049298B565112E4784\ +5595CA483E821F996512B3AB83A613A8E2F5296021302AA068CC59C8093BFAB264886C1060229F\ +E043B32E85EA44E15A81E6FC5DE4F05C91B714783D948F3E90D3B801F503F839319696FF956680\ +3FA407FB32FB6EABD2AEF94C76CA5D7D20FECE71E9E6AEDD6436FA194FC61B39495AB75EA40287\ +5686284F4D03C6DF78B95831D622859FA67B12EBC2DD1FFD5C40AE485AA971A87ADFED61D19AF2\ +F9671B8464E1F56733E3C1B98F4F70FC3CBB4E549B3437B1604163075B24D7208D4BFB11C66862\ +0CF8A291B9422AD7CE1551A65D82A2DCB00475552852D4D7C06831FD51B802:\ +D0D1561464EC8C59AE1313C89CAA89CDC2A7A0359C84B2516E873F5B19229C66 + +780DEDF7FC6C135550F524F4D84B33B769F58E7FFECE6CB25F497A87D6E5FC912F4E8A60742920\ +8CCE5A4B6657AA2830DFC8C1E9492DE204B2ACB9B42DB884A6F194FFD517DCAA205647B27A0E2C\ +BCEFB357A55F3F0D35CDC83956CDA8A9D021D694FB178C44FBD9B4003D11BAE011FB4131635A27\ +FD26C75B0523EEE2ECE6D8AFB6C76280E0A3F2C1B0531539DC020698F7466F959D6CB6BD1B0F84\ +B17906120D40E6D8DB675873FCA7EDBC1409F0EB5A759767F9F5CC01FE006586EAC27A4D4115E2\ +FF92587DE3F2F6C09222738DD99945348B8B9F6427848DF4D31EAE22FFC4BBE21ACC896CD903C3\ +CC0DF9A49B9576465AA0D8FC4F40468B41481A5AB0FA47CE1E85BF7F9B418E90DABCE9B655D183\ +B06044C92CB050EA223D2F73778BBC1B90945EEBBBB7C7238A78BCAC9A0DF94CC2FC667E110936\ +DE714855F3AAAA3D60615134868BE0715C54F39D26E9A32019684299A71358125174C6A33385AF\ +5283801FCCE195913E56D7BF2F806633DFBF11674E970FEE95B53911D46045DA1F8FAA841ED16F\ +E850949CD69A13A3DEF631337958203B39D3C1C748F96AD7E0E8F24D23AACB23624A1981D845BF\ +89F56AF58FABA2E9E6513AF5DED200C62092EA5CEDB5330B0229B4667DDDFDCC635E381701DDBD\ +55480E935460D18E94C78C2B1D1D866801E203850B8833A2E0AE32E43FBB28AD255A3D31296A34\ +8DDDB983EECC0B0D84958D1B0D95EFC39EA075AAF25595F4FA794A0889EBFCA1E57E92E7C2180B\ +DF90946D6B2A8607DA10FCCA868F6E24AAACDBD3850B44C8D8D7DCA15499C6C33A7741BB5203B3\ +9D001C32177F7C060EE5B43AB4BA9F8A53AFF79E55A532F78832446216E5484519D87395A5C0F9\ +AAB59884F8163AB732F161CFA23307AA2646C3D4C9D129C2A9173E427741B4B7B23F8139354646\ +778B10F97781953C2473FC277D3F0DE097ED9359E83A33AB01DA298741CF9EAD9CD297C0A39AB9\ +BE72D5621A06D990FB175E7E10D460245AAC744965CC2CB520B93FCB02E25DEAEBA92E9EDD0AEA\ +6DD8264D1609F3AD1990627A4E33A73257723F2405A393F1FDE2EF7935F9A41506B437DD9D2813\ +752301AE513502281CFC635844D3F13F532F3DAF403E8AA70DF3CFF67520B00EDD0D0E53A78827\ +043511256A6464CF6E3FFFDEF8C0522FF17915189E4D6377B9CFD3BEB52CE73F4A63CF262AA071\ +6C2EB5F3D9FB5E5E39D072E55DB768498C80BBA3D11E1ECBB89ADFD7EBF73030AE102BD7D5D95C\ +B4599706A0A9348EF65D59FB0FB15143C0896EF64946BDE0E5AB7205F1AA5030CD960CB4F21081\ +E3A0AA1DF10CB6DF811B9E70E3F86581092928A25EF64929DDE63AEF555F4DF0E951AE6E3C41F5\ +C1B1E962E1DFBC1F30458B7574F35A3346103C62461384354DC9B2F98497D1C4987D3CD45D84E6\ +B392DF9E0A2AA8559EB4F597DD759E8323CAF7CAD0D41A69163871648927D6FC:\ +37494F0A17C7164E023F6409B4AE8248D25391910AA24BE3F116D4A44CCC02B4 + +600BB1C53869CD6912501049B9A53E112B5E6694F39504B56C965C915DC20EF170CF0F1C9E638D\ +56BE11694156CFEA74E2BC7C14AEB360A984E29067A36D011EB1A3541B97009C5642E64916C357\ +7B4BA5C87AA36ADF41D712E22E94BD8EED81629BD548AA69624155A131654CFDDAA4D758341EC8\ +F8021B4239A1BBD9DD7AE777D903F0AE8CD332BEA85DED4A66B8140D1B694EC08E238417E00C5B\ +696008E5652C9884347AEBA3C28B58AB8B955C2849234A431C71B0C3A58BB2619BF2ACA0FFFCC1\ +710673C3EE0FEEE5E091ECCA5833F4F37E8509595BA2BF1BF7437988BE4F63C7E613FAB270149E\ +8B37FAEF45CB23E4106E6502D97135A5B7B36A7563BBDB18D4C37DF72EEE79CC4758D08ED7E0F8\ +24A3CF4C3BF116F4D7D7D60EA0A819E2FCF832E7919BEDE619C64228F9A32C885FE92A7600FCA4\ +B0C74C2BDB2B18A210A2CBEC520960EB5BD53EB6A53E01C4D4B16EC421449360841294CCA5BBB0\ +424CB8A6F6A87F26FA5A75E04BA9646D80574DB61A2D8C38534E9CEC4B85D36A105B3D3F9E2A0D\ +1C935FF8EF962F3EDB09FBD6F626C42E3EA08FC8A24122FEB53182B45098BC4644F64BDA83E2DC\ +0E6886167F03852A5783497FED6C5C8E41FEB1B0BE701139458529ECEE21F60C643CCC18ED07F6\ +95E54A3341128E1CA3A6C171DE7A2E1C50BB2C31CB0DCF5584B36CBB41B40C41E5F3719E7472AA\ +3D241FA27F212FACCD1D720B6F1D1DF4477D7A473C8347F73026E32BE78153BB975E8A61F888CF\ +60DB98888FFB5BAFED7EE92E3218747D83E5A248ABB756ACA331003C9BF27ADC5E273626060C34\ +C1E8E76306C9C7A6E4CAAE08BBDE5B1CFDB5007C10250862A4F2F5B8B58A7F8112EED4D0850CB5\ +BB2F9921C49776925D2B74F0E83ABD85E5BE986BE661C29266094CE3959232CEC6D9EBA553AF9E\ +1B70A55BD4C720D95366133576A11EEE942DAB0722538A7CE32F17B8EC2629F69483C90F3A7417\ +63CF953681E441D5E567341130A5EC5B8F36AC35725E23A6979907AC337D03FDF6AC75EF4856EA\ +D4E18738A26667196F6CD15488291F948539C8F8F018387528EC6B4963F0A3E2AFD1F4F56F1253\ +DE53F314CE4572CD6814B7E2B03EC0D88C1CD737952DAC1D85F8761E2FE3DDE9929C859B9AF957\ +FC8F78C5878243865983CB3E3CD76AD1038DCC5AD04C754FB649851A50DE89D76FFA4537BBEBA0\ +82017E5840D20F2FEECF4C1DD9B409EE4C9CEC91ACA81115BF90CF4784C998FA3A1FF18347520F\ +307E52D67C596742B677B6CCFEA597D787B63708181C765EE28328667516AB7B75F3A655810088\ +6E923F2B94D730C51A05874D9B944B458C95DA87E071D753EBADB54D0876CF387A70684ECAFCB7\ +0BE1FF16618F0DA96DB5070215B7BBCDB4AADCB7BA825538B3FDDE5D55C0BC91EF7E52072E62DD\ +1E3CD2764BAD4DB94F9C:\ +8E58A67D528725BBD8AB846914F9A31961C90BA68765F872F785FF59C4EF0D2B + +AAF2F5BD8D412040B7B7F0C638AB081C9B4F9EB542CDFDB53C0D156BEEDC811A9F9838CE32D42A\ +DB83BB1B5B83EFF374B4FC8D64FE26FC94BCA43E812079AD8C33923355C634004E10449309E9C9\ +0564887BD27A5CD0839F159CD56087913D05D48E6ED6B80350B09B3A8FF426B777FD8FCDC72C22\ +ED7308C448E6D4A28B3F0A1BC23C300E228E4C3530C98F507106D5D526253C7D49FBD5D84D20C6\ +67E346224E2F890C947F56AB6538B3AE6B297EA1AB5F33CD43A8C1654C1DFE7AACF7E7DD733C09\ +68DFF6718CBCB537FE742C68B220F243A750FB66419DB03F48AFBCCD68798CA4A24C2E49BCF380\ +004EF6B685E528F3C2FE79CD3DBB9CF88D7DE09557D10459823B5BA08F31865B5A055CB5FA58AF\ +3D849A4CEA6F7C23C9BAB07EE0F4B330FEE01BB3AC55FB5882895DD1DB086CA37064BD8558DAFD\ +B26F34ADC8A560A9B9E845BD3D18DF8C528261069332D0384C04A09CDC9AB9B631D88B06133E65\ +F1A8FDF4E5088BF2BE5C970FFC80DEA689EA3B67EABC5C097880594A0406F21963D9C2F3FB52BF\ +621019BD1F69CAAD6205E44B5D414B73AF9671088D6DAFD728351AB9F6D9C255D9700222ABEF98\ +14DE1571384DDDDD7362BDF06F3E5EA35FD56E0DA288DBC8C80CD585024F3BED4912E6D5CABAD2\ +0250A51F3FD1A25457ED07B3F652FDF0CD8F6DA583DFE780C6B5D92333DFEE4DFB22A3B4DDB141\ +BC385B0852D9B92198A8F2DA49BA0F119CF183E40EDD764B418AD5A880DE5FCCBAABE0785C8E13\ +4E03204BBE0F991A8B54A44633AF79D434BBFA0FAFDD1FAFE1071964169C712D51619C8E9EE8CA\ +DF9E54D7E61BBAB8548D9D2C53CA22A4938F8AA8EC5FDB5401276A081D7C0906556CE98AEABB5D\ +5989BD97C689BA83D2B2197298E155A0FCCA5A42355FBB6BA619783E6A1E343ADE8741349E315F\ +1BE78D1E3969F0FA6DC147C0880DAA7F066B18615F1F88307C515BC82CBE38A1967157D4592F63\ +C738C861D92348AEE550727735F0B04006CEAE3E083629855FF75332A9BDA43D2827AE97BCED1A\ +3E015AE79425237069D6F630A247B9E906D5352AC4BC486558572E876EFFC1BFBA7CF90A6C17AC\ +6AADA8B3C7D0374DEEF1D8D0CC8E4C2A7D86ABC5B6E0EF7D047AB30A6D801C91B3A84799202923\ +A7B6B1966884C50F9A2FE3A047AB588B86C70128B0A1D263751DF699C2D152A1F8B70EE6AFBA6F\ +F9EA240C4D6047EED74EA06FB885AD468E6C9D5ED4444FB1EB4987F966CC1EE51DBFC269CCFB81\ +47162965113DF7696A9FE1911E569A5E221F0B915EEB34E689F0FEA7655A179D9506E0787C205F\ +BD11CA9802E5A4D4B3F8E9D270BE51E75718BB17BF3099C8F68637059009757EAFC48010A66E1B\ +A572D774628B4C35E06F0ED0DF055F27C054B4A556B1ABEEB076D5D502390E1C31E28555BE7F6A\ +6ED4B49FD7CAB793E4BC:\ +B97C3815ABA1958CB4A6F64B3DDA017236224597101DD822F24A6A594F255973 + +[GOST-34.11] +# Using the CryptoPro sboxes. Generated by OpenSSL's GOST code + +:981E5F3CA30C841487830F84FB433E13AC1101569B9C13584AC483234CD656C0 +616263:B285056DBF18D7392D7677369524DD14747459ED8143997E163B2986F92FD42C + +730B3A80E44DDB0AD9A04D990D22F84009A86E5E8A2E00164EB168CEB279:\ +DF252A7F37EBDCF4995B5419394A6D3D2C782D30AB5FAE89F3665F86A4BBF78F + +67C6697351FF4AEC29CDBAABF2FBE3467CC254F81BE8E78D765A2E63339F:\ +EF35DA69225241950EBA3F20E6EE2D86A6286707EBE04819A81F79AD71DB62E2 + +C4852EB81C5EEE208BBDCAA019F49142FC132197EDAF0E02374187066A9E25:\ +CEA05A7CA858638868FB64A1BBC015296980A6096B4EB09B03F1C8B075FF25EC + +12FC7387466C9687EF618EB38BEE08D4F67564BC48DFDE8A477EBBBC425C2C54:\ +D1E138CD1DB357091037E6041E6BBC7F58E32C4294F938868A9FF5E66E174EA0 + +A040EE298C760CD98EB6467BC03D839A31598922758D475AA389881F465A8BE79B:\ +6AE26456D06C682AB63DE2DE3D0A8A932370B12204BAC4B04F78472665A350D7 + +3679B590CDB17A11BB39575C88F02BA1EC7FD72A454D3A30E702073A9451F7CA\ +CBAC5B985ED5AA190E017597F2A038DE1F0F08655D429544459C7ED9EE75A4B9\ +21FF517FD4FB98E2FD0D79EFADB1CDCD:\ +F2D03BA660317AB8AE88490C6B25B79D74B2C307AF0DF128E82E98204C3504E1 + +B3980FFE5331EE30B407FC8EFA18FF6CE35C841C1622C405C93A51CBE8B2EC9B\ +4AFC999E2D87CEE18FCA7089E26FF5C5CC7AE1E29CA6E766E03831C8EA1D6335\ +19FCD34683A128126B989C4D079113D30BF4B6A89A9D0E7AD63F42C05CA5F576\ +A1C8BC2569E437D47CD3228465355770290D18C4AB263E81658141C2263738C8\ +FFF4ED69D9243D55F85FD95D9431CDBE3EE682E90CC06A7241AC3468E36C30E2\ +601D4B3941898F39E868967D99643BD84ABDC1567D2CC8BFD8FC27BB68579DC9\ +74E902B57291EF5AFA85D793E9126B33CF2D8A4D59520C314F33ECB78A8980FE\ +7283B3E414A23F0E2816A211290D45F83ACF45932151C47084B0:\ +D8A200CD03364E0FB2A396FAB05E67E0EB1195672316B0F54D1D05425E2005D0 + +D658E6C4786E9CA4E60B8961514C406336F46691F29A9B2B1C07784E7EDC6C55\ +355219ADC0B551A6C0DA07112748745D3CDAEE2E748A599091D2DF0FAE4B64E3\ +9D7D915D33E204F3BD0B05E45379418F542FBDC8B917594AE9385A9783BE7B20\ +3C0C7D6FEE8162AB8D678FE0E1D07035002DFDB94456042D8E5EC5111C403158\ +4CAFC73A302AE6BD91759E72460EA7463BA5FF80FB03AD8A61729B7EB2CDD6FE\ +7C9E39ACC81F6A599408CCDA167320511820D114237F9E85F13903A406D9A282\ +77DB2F3FFA99998FA16569B7D88A08F1AADA05CD59A3524ADC55EEE32F9165A6\ +6C94E6672D7FF6CEE45F85BCE98EAD9368B261C155B30B3209FA15388B7ADEF7\ +0FC45E3C43540B27B490E49D1E913186449247994553CB4E4DE086D85B65CF6A\ +292EA66D82B194364278D4600A05E74E972EE7DC81B32BCE93B1A6EE16765840\ +A4FFAD26B0415DF2BA3153C4363A12CD68F9A9EAACD4B840865F2E9CD587DC79\ +86899F36CBFC29852D7C4963B65B301E54DA0801AEC14134206FD1F5F6AD6E7C\ +370DB3020ADC873758D09B0E2BCB2C7FA5358054F6C1881631590B270779A43E\ +8657409033C7C88B976399C22EC541D4FAC228F083B006B40A11DC118A804F11\ +D78FA10A566995EDCC2EAFFBF3F0CFEEB2F7DE36A7E5EAB1F6C6C2814611921D\ +A03327F69DBCE369EA9264DE8333CC352AAA6BD28F5683861C460763579980F8\ +CCA8EE6964D2D34F64372DE76BF91D95A3886733DEEBB9FB31C05E8859DE8025\ +866F8FEB41623AA599678D0460AA9A0332013611ECEF0C1DAF6AA60848262ECF\ +95BDBAD61FF47CB85B09BDBBB357BEE558F5F645E40262946C089CB52FCA84C4\ +873E9BA632175F8D201C48D37306B8CBFBAF10E0B173741E7B10D3AADB576F62\ +950A09C721685441849C14F7A2CCC29E7BD37E2D46F24BC1021E6CDD75DB400A\ +E549D106B1254735C15B2C6327EE01A3C17FD007711BC974393551AE1091B8F5\ +DA89FB8BAE42C06F9DECD2C4DBD4679C5337A4C5526D398BA28A39B21CF1A7F6\ +7AA28228E44297812F6A450A3EADA691E44A5637B78FC2591AFC0B36EDB22C68\ +54AE9038F128B92092FF2AD0ACD061901BB8C7D2478A2C6186379773EAC4DB3E\ +726C7763943083262FADF6DB7E576C990F336B57BD97B843CF50B7B91492F786\ +FE6EEA929F6DB8CE1BAEAA9906163215499D6C0735254A047501BD8994B40F92\ +23F925C267DD90828C3A1B92504DA79AEA14A11F39EB23AEEDE03781954613B8\ +40387AA7160A29A24544349591DB2F7BEFD09B28BCBED6A99F0D2A34543DEC94\ +76663B8C70642EB5A8624B393D7AB42D4B4F55070E2CB0AD39DAE18D17CD218D\ +335C19A3C0475968A9A4A1E71E561469A56970B3952060CFFA415C120E7E9F41\ +DAB9E59B003E03AAE2A59100FBA56AA00EDA54A4FBB473F5F6CF07044DA74628:\ +12DF46E869E72CB058629D3554917D7ABA7C6D9D432751F58600138DD5862BFD + +# From TTA.IS-10118: +# "Hash Function Standard - Part 2 : Hash Function Algorithm (HAS-160)" +# Telecommunications Technology Association, Republic of Korea, Nov 1998 +[HAS-160] +:307964EF34151D37C8047ADEC7AB50F4FF89762D + +61:4872BCBC4CD0F0A9DC7C2F7045E5B43B6C830DB8 + +616263:975E810488CF2A3D49838478124AFCE4B1C78804 + +6D65737361676520646967657374:2338DBC8638D31225F73086246BA529F96710BC6 + +6162636465666768696A6B6C6D6E6F707172737475767778797A:\ +596185C9AB6703D0D0DBB98702BC0F5729CD1D3C + +4142434445464748494A4B4C4D4E4F505152535455565758595A616263646566\ +6768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ +CB5D7EFBCA2F02E0FB7167CABB123AF5795764E5 + +313233343536373839303132333435363738393031323334353637383930\ +313233343536373839303132333435363738393031323334353637383930\ +3132333435363738393031323334353637383930:\ +07F05C8C0773C55CA3A5A695CE6ACA4C438911B5 + +# Not implemented - how I wish the test vectors had intermediate values... +#[HAS-V(40)] +#:475974BED7EA137D982D1DF5B2583B1AC4D5941D8D557BB303586742D889178\ +#8943A9668A9DA68C3 + +#616263:A70AB818294865CF9C9697D69715235370381B833F8F1A42E01505888B002E43\ +#05FE6405519F595C + +[MD2] +25:A248ABDA0C79140E2D99170DAD36CBC8 +3386:43C980AD45E7B3B1CD75CA4E7D9A723D +A0A806:0D4596E208051A05DFF8116455562630 +7664BC7A:E561C90B5534D750BC251EB77A9E7870 +94A3C94A0C:2D8026BE7A76954A9E096343C39ECD8C +2BA359656CCD:2C549D1C220B32CDFC242874E6807B0B +F62E1519F7C123:7D473DB4CBC7B479443BE0F5BA34AB88 +731E26C302E41557:DFFFCBFDB186EDFC3174BD6118B9F4AE +E96E54E58C275946D6:DDD255C1D97FFC23ADA446D630E648D8 +A05EF276F00ADD9AA737:7468B835B7FAB5B85E95BCEB563AF71B +B2E29CEBCFE26335B65604:96CCB8AEB6DC5B5D0502CA2DD5795197 +4A926951A34CFF9612086FA1:CA2A050506C450FDFF20DD7E4EE5339C +501771E1BB1766FD3FA714BCC1:FA6F95FB2DAF9E4E153D7D78590EE138 +07ED7EC95443B759D36E5699547E:61B549A5FB75E337A194E2FCA382DE25 +50AD2003A260C982EFECA7D5912BFF:6BA8E7DDD4019F159FF72514CFA156D9 +940866DDC4A37CD965DFFBE3E2B0C341:6A92E7EB476CB01F9C404494260E3777 +62F3333A791881457264348DA07FB6B7C4:61017AB161754960D3F1D1F1D10FE8F9 +E68EA199397AD1D0C9A76BEB4D96722CBDA2:B373D1E21455608FCA99654850ECFFD6 +A7A8C48263FC70A6A77374CD0E685773248D26:07FF45303EA30885D7AACAAD2E16BD50 +654C952DA2E3C7998473AFCA3C9AF2AE89B2DE45:C9444F92EE581185EF649354CA8F4BCE +A4D93A05DF87F08E3113EA2D0CAF8F70CBC2BE4B2A:B46ADB25D38DA1F0E7F6F8C5DD129D40 +EA12AE41BE9B71EBA74C9010C4C884FE5DC9B0C5C65A:B6CFCF8CFDC2FE63CEAA66A5573FDA81 +C3AF0ABC9A2B464A1C4F629908D1EC556F20F64084E733:523441B8A2FB07E41E9B1B8CC5276660 +3C8BCC24A8DC88690F6B6C7CFB25DEF15D37335EC41C8C83:\ +F80ADCB9C78CF9DE5211091CEC3E310E +65E2194B8A8B5B30F5C53D01F8431E8C20418EE6A06F89F87F:\ +5833781CF79E57F605F9D73D3B7088CC +62FBD128DA286D5C6C5A3E73D463E5B31D7FB06F34DD050B3CDB:\ +987C1F6BB686F3A983D611C22C5086BA +DDA05271A7C4860D49D2CE62A0B59B11BDCAAF272898EB8E18F1A8:\ +779D23550876E50A7C19F4777C84984D +AA8DB1791C56E3C88122A1AB77A9D8BCE0D53240C01B789DE7FCD594:\ +9540F40D24417EAD9465B26D8A7746CC +A1C7EAF91BBB251411A86595BC66D4E5CCF227FB2D9913F3EFB4E69B3E:\ +D67F49DE6E7BB44071947A6C96774E02 +611B90477FDC084652039E3E3F55EB74EE1A3E14BB49A08882AB67EABA73:\ +C7F8C0C4B53D40634A084A0E388186DC +5E9F73521E348BFBF3ECC570012AF45C9832F673FFC61CB034908EB91A6672:\ +03B6F0BCB2A99CE4CE51D92DBC9ED3B2 +275C7EC5230978B84D4D87B929EE90C04269B91A32A69BFE2B30E84361CD8905:\ +72721B4138FEE747BCB950DD01291C37 +BFC3C421B77FDC497E417DF9A2E8A480CB975BED8E3B90F0BDFC567D66D8747D85:\ +92BCE15368AA8388D71E1CC5B4773536 +C2B801C8419027751EF0C9EDBA783BDD703259834E0D28F1CC18BA82A2D9DCDDCD5D:\ +7B194DE6324A19C54F9AFEB352EF9A8D +787B37C5C74098B78B693D33E5DD5A12BC2D502D3F69852DCB5CD56D6263E846F96ED4:\ +F63A8C1958208D999F55917D9A1F3228 +0614889EFFDC294287D820C8A4459FA44CDD02CB1DE0F678493C959E7DD1DF90257AAF0F:\ +1E20FBB25E31606B0B22FDFDD2639C71 +60D169B12C1ECC464591BA572EC74B454D417BBDC49A82F01B9A4FD1273404F6FEBB575E51:\ +C23B75350BA0174D6A4BD629A8E43311 +642350615A9C6CBC8894D72176AB2EE4AF3413D15C4D4D9B38D071C95FC620FBAD6AB37FB8E5:\ +3D0C91CA852FB8C51AB9441D5A3C1F94 +C6299D1B98BB473500364EC66A3DD9238DCCEA4F281005FF630E99B5C8D2A7AC5FB1\ +3C693ED05D:E2B2458ADCFB7D0BCD4789EB9FC0D2CE +9D5AA26103830005ED7C966E120253DD7ADF49C56BD89B211B6B0D5B491066A52498\ +736122A325F7:C8F205DEC0103264BEF4FA0501CF007C +7E038B83083785FDF4696310B579D3C0D98A0092FF2D71808C620225FC54E6973B90\ +7E5ED4A50BBD5F:91F01747135E4E9B18A95666FF4C8801 +CBD41D36CC3F85C7427E3D04DB05E66D32FE7E9683A35B9ABC5B06185E24A867B954\ +DDC4FD41E0379423:96110102BF17E3CB91AF30EB0B527851 +61F01942CFBDCC748AAB816527D49848CF698A8AE5E5EDE8C3C9178EA5719EFBA60E\ +B1C4C3324C6B1AFB2D:94EBDFBB3060FA8E7FCE7A4538CD6829 +3E96A6186BD855DF00FCE2693B1394151594448B516DE0B9C8D15396984222497B15\ +EE0DFCD47AFBD8AC3F83:D39A82F44F8E7D8384938DD8C42C28AA +9C8CC760D830780DD8671282D6A2909E9D163BC54A04119586404BCBAF5489C79491\ +AB236A4F9781CA58E58408:1F902D98C973B382D084FBB40F0920AB +00A530B70C406BFD533C2642B94FF767EF4C7BCB28EA5CB69C62F52A01AC1A25F1ED\ +D918719004757463E6663340:C7FA3641EC0626AC66FADE4B77FFC795 +8DAC93EB30AF1242B93B4C1C8D7D2A8E1320B2738C3D40E623E7380AFE596A783A90\ +2B6A19DF17D15356C24CEFBD66:437FF6F86D68E35D5BC507AE88C8B0D3 +C3D2DA59D6435405406E342683A324DE6844C527687521E43066270CDF8534C110FE\ +EBD79B5F2FB00FA3B9A31E1D548F:7B4E56A2014BC8127D6DB1699128310D +D178D2623180FA605C3379B2EF0D5A3272593EE49588708303F5744E8A26DC7F4E3B\ +4435B85A8E68B5ECC40AC7DCB2039F:CEC9CC7590DEAFB05FDA5D42C5CC3A71 +4B2C6190EBE39D5282026FDB3124D64094108DA1237FFD3A52ACA1BD96FBE752C4C3\ +631C33913BD5DB067AB234C4628B2ED9:E0CABDA82227CE74EA7550053F942E74 +9A75285DE0B739BBEC8AF7A791FEF5375A8E722134B6299D6FF167F43BF80F5CCD83\ +8F76AC2278C6CA5BE7E5C339ACEB8BF77A:117451E0A38EA5E87D6817003D9DC6B1 +A2ABD527204652A5DC3C672A1E47F5CA34FB1D7F300580F63B463959991DE6DE1472\ +EB21CAD19D4636C26B0F1FA99CBE6DA4CD70:EDBEAC9A8676D1BA66949F71B7BE5005 +FB2063EF9B211AB8ACF3D1256DEB4E30D1B6DF1882308FD7F80F27C2141DA8A89551\ +B878410D914C4099DB464738EA337335828434:4DF72B07A43EF126FBDEAD01E51ABAAA +41DEB68691AFCB42C865CF29EC0C2698CE621594ACD0D3443B8D025F6A4547DFD058\ +740A837867A2C1E204CCEB27740C343BDA0AB6B2:83A4F9739748D0402BA738757FCC517A +38C8C56CE471F839B8FD15AB3AF0E1D1A3FA494E7DFE660D5224E1C8D43907E5CBC5\ +6CECCCBB44CEC1AFFF26EA7594E33D05789DC49E76:07A7A27D722092692035AAF579751495 +6AAE2909D84B75F7AF3155E85660A1CB224DF40A4EA6CEF0C0F28AD149F3486AC3E8\ +37E7283E07803522CCE7000D0213C73B09FE77500852:C7324E5968CC534F8B98406165C5ACF5 +9934BAEAF002C98F527AB248B8D44520456FD552409845CF1E666E41151DD3383E5F\ +658DD3AEE63DCBB94BF5ADE141D753B57BDC3BD22D6648:985711D04A1636B27B98EFC2DB61A806 +69C8BB8FB1ADA90D0B9739E62AA1090D12C750945EC15F28D03886BDD1ADCED71699\ +48E085B56996D4537A35F72FEB5313F3B7BB3DEBA66B2B84:\ +709578A0AA3DBF9CE4BE69AF71E1AECB +1EEA19E3548286905BE1092F54EC9E372DBB9950E77EAF7E9C55031232D8D70AC9DE\ +C5D71FACC235EA339B859D54C4D3245F8702D535467E918F86:\ +26BC86988B1C278EEEFA648345431254 +24215B243E36C2EFC561CABA961A170C0EC406344AD712DF5DFF62CB80B4A12C08FC\ +009E4A359306601ADDF31845A88F927BD86566634466BA15E5BA:\ +2BB96ED578D8C61B39DEA925DCDE859F +4B6AFF3B20CA5685D3E173AD26E443D38748340B209D63E60F26988AA4C31FEE1427\ +83DA23BDE5D322C6AF97599C63183EAAC6B9DBC3611E6C2C32054A:\ +F54BBB34D01EDA10B43753BE8BB9C219 +26C82DDB40254A854F3FDD1334F1A191101730DCE43972881706FFA4D307D7D91598\ +93252B25732F3976DE9675C7128990D7E321CB023221E2A89BA7E066:\ +951FBE39B9172884541297FC8DD4C2BE +F357FE7BE2CFC971379457338EBEB69A40286C9C0FE5DB16888E2E270EAD23BCF7F7\ +0031770B08B5C7C4CFF2E49C6BF9844F773B3F84C49C575173C691CAFF:\ +C2AE33C5E43079851FC8D2671F5F4CB9 +F5A11AC76D127223FD9E95B3E743B7EFD13BDE1E502D0E81E33EC85852420EFB3535\ +95BB7591E11E3A79FAE079239EE4C87FD141BAE6C6B7019B9A57BB6498E0:\ +45F83BFC62EBAFF4EA00678A138D7E7B +CE9C44FA430FCB3BACFF6B384A2A6C2B0617C0737DB20B0B78D86C6F7C341D19801A\ +C2E4400822DAE74DFA40A4468CF5D1081D3290FF35AB4775790E22FAA58BCB:\ +882D31790CC7FA4B512EF4A00B1F5180 +BE2FBB79CC864E84C625D71F9886DC29F9D5D387BBA4AABC2DF2C8C75FA45C759E19\ +2E0EE1A31BCD51618402D8898E8EB937630F6211734AFC590F99AA67BAA0DA69:\ +497353E9FFE29110092E859CEC5B366E +53726A30175CCB0EEE5B91B542E7FFA6EC7C2DD20784563D5D379B0DD5F632060B9B\ +9FB6264AC792830B6555767F91BD0D6808134624E7A2D8901A6BA01F558BE4A549:\ +2CADCE7ECC0BC5DF4043C9A3F4F838B7 + +:8350E5A3E24C153DF2275C9F80692773 +61:32EC01EC4A6DAC72C0AB96FB34C0B5D1 +616263:DA853B0D3F88D99B30283A69E6DED6BB +6D65737361676520646967657374:AB4F496BFB2A530B219FF33031FE06B0 +6162636465666768696A6B6C6D6E6F707172737475767778797A:\ +4E8DDFF3650292AB5A4108C3AA47940B +4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465\ +666768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ +DA33DEF2A42DF13975352846C30338CD +31323334353637383930313233343536373839303132333435363738393031323334353637\ +38393031323334353637383930313233343536373839303132333435363738393031323334\ +353637383930:D5976F79D83D3A0DC9806C3C66F3EFD8 + +91F1999647F001F7B4D4452CF7C07B64A994EFD25DCDBD9F6B260A77C8855AEB3EE8C65EAEE6\ +397DF26F58A1729BF7A12ACFCF1C4C07A760B829D4158164A57037C15FBFCFFCD85C987C9FB5\ +319AEF44484965425FDEED7D182861A0F3F9BA42BCE7CA288355DF484BC4476B1C587C401BD6\ +196A401A9A99BEC075E8B99CEC15B3E9292F6399F61E00B27837AF4CCCDAAFB235E90282A08C\ +979628E084C66FF24E6E180AB9BE50E274861E174FB511760CB2EB48A2A50D9D70C97B864236\ +BD6AB8C2D9BE95E44FD317FBE6135B800C00E2422068F399F6F9427340AD4ED5CAA1DD96C76E\ +FA688679F577FDBC02624F7D936A199A9CEFBB4F2A9FD15A1A81ABD5703A55FE3911455C8F0B\ +BDB6C6479B24BF8501654DE0593F52713A53929E46FCECBF708ED4EF00768352682B8BF7731F\ +2682991D3CE26497BD4419B6BD67A04907C6A1D84B2B7C2B8C622EAE73AE49D978DEEF8214AA\ +CCDFDDBAE1F10D19AB6BB7D38D5BEA2A6141A55BEF2BEFB605FBF01A88BB7294E4952283731B\ +E737EC395B8B537558BE7889CC9C43C855F6CBF4131FB2FA17D72E334F775466F1B9C70A4325\ +DFAFF502D71ECC73E113871EBED295D9FD66EB2F8CCF456075666C9FFC121BFAD286C457AC11\ +91354CD5AFC3F8678CCDC3371B2D86F378182B7F40517FB36DB0194A0D517D9CF235D91001FF\ +E86F7386717B9CDA393C712E3E2628768EA5FB41B1E26B11615B6187E0CE73015FE6811420C1\ +A2CB00D69399C91AE4A21F759B31CCE31CF01F0F9D1E40162130EDE0ADC73B641121F1286FE0\ +3619B2768E1FA021311CEDC5B124EDD6B1AAED550CC3AE65E0DDE172F9A8CF136D417C859DA5\ +C1B6F2166810AA46BFBBC2C13B1D23EECA6159CB09D511233A50FCE4DB27E3D35728CA1F35C1\ +A5D538BC4B1F2D95C8B8B424B346FEC0EDBE78D727B9E982EC2DA3CC81238D2317648CCDCEED\ +1C887E97FDAA0E764807F5503FC97A555D99B417185F75F06CCE3646E6C1900A64DAB07881D0\ +74FDCB400043275A4D23C5AB64FA7ABA88D225EFA9AA399A7C18640B09D37F189D5B8AE4256D\ +20A50B5BC26DB9DD6B2A81436A098DB8283BC6BC64C07B0F700A2BB0A4440DF1BB4B63197EEE\ +B31039AEA6B2517B54D5B6F93F9432D94E5C6755F4B847635C8E70E7B66A2ACC479B36BEEF51\ +3B583CEBBB97310DA9B96111B137E37A3DB5656A1E3C2F7DF8F7A84857FF376F6AB085C80A3A\ +3733D519677805DC1AB9F0278C78A2A55026EB6998761E8F1853EEE64B843B74714CBA56B578\ +766942B241D32000384C9634E09BCC45E80F5CBC32B86C33AF2E96E0602CD081DC9174B33F15\ +06951A560C0141F940E3F2E84133C137F7002F0C7CBD7D86429963C1B5F8BC3996685FDA856C\ +4548F3317904D4EFE606070F783E7BD746537170A9EBE29967C36A2CA8ED8AC08114C24CC860\ +013195:\ +3A1237D02204327A5D2CB7CEDF024363 + +[MD4] +:31D6CFE0D16AE931B73C59D7E0C089C0 +44:AAE7B2D482382AAAD75FDE64DF8FF86F +0246:CB386D6A1189CD159F4458A1CEF7B28E +A7EEB6:1C4E79A284594FBCCAF9C67B4C41A7E4 +93C40129:FCD8841C546F832310476AAAAF7E40BB +D9CFF9DFE7:E05B135D5DDF92FFB6E85F95E1B246AE +6C69618F2E04:9FDB803940A796F1A3812C3FF149FD92 +51CB4187084217:EBB806618D65266CD195CCD4B00E5CA4 +7FEEC81F78691BB8:E1C8A1F598A1465C30B180731D134572 +D9F6B614968646FFDC:D27628156A0EF18309EC5085E67097E0 +747F01DF7F723DC311AF:FE1F19114FFA1695A28B92315F6911C8 +E933B52C2E88CFA8E26F3E:18B8AB7B5B7610CD6262A05417AD467F +A1483E3BCCDAC94A9A2B1A63:39F0B4AD11180EAAE992489347AD13C2 +F1C7365D2B16368DB23EC806DF:A2CF9BC244949E0B9917AFDCD0EACC65 +8DBAA281D14C19F35C2AAD537F7C:F2E6FDDD6568EA8AB316111E5946CC9F +785D55E2AD30E4960E6AA3482B648B:A01DA0D565A3753717D1D81ADE3166B0 +BEE8FFE30FCF0BE745BA22215B320F66:68A5FF4E4CE33D50E8F42B49505279E3 +28BAE5F8B5ACD3BE26521E0CAB1C9A6541:93B775F3BCCA2F2BE24D5CC63BBB3224 +2A7415DBFDF5FEDAD4E8DCD96543FA6D03E8:2BC3478938FD5EF823D2974302E61ED5 +285A585DCA6B4B4D59554C80BDF8B19491984E:C7C6E691B1785C64D8CEDE5B6F6B98ED +C7FD53B9E39B4A447442C45B7AB3FD0602C57DE4:3DA2CF785958E6C115D8843BEFAD1979 +D83F308D3AC2F0D82C3E69A08CE8BD97AD02E3492E:82F6CA7BB64799BE36AD89714AEDEB83 +936800D2940A8A22A5D54804B451F59668FDE5187416:6E4F874F35C5BD38617A31F9EC693B44 +C7D740B0DF155D9C1F11D1F6AB708A22FA1F2146D48953:E72B78BCA0A764CDAD13FF69B48B2A8E +EF7CF50DFD9B72E8CA0099BF631BB334CABDF76192CB951A:\ +9E7B7A7458B016BD68736D1512995585 +F5A46EAEFF6B9A9F01653E35E90116342C470425CAF7B942B7:\ +CC032DAA2546C0C2BADCC0BD77EB12C1 +D8AE0DE315E449498FEAF2FBDB1971A09B7BF658AA70AC782E15:\ +AA1E5DCDD854DF06B715DEAB33E62E0D +A1EC5E04538FE815D26B6B3BD9A889A43416F301064B15BCB480B7:\ +CACCEDF21D2BF863F1F4719B4B83F18F +97EA99966751703402F57A2B5B6505BAFD1C440B8147C87EEC246F0A:\ +ECCB8D37D12527CBA6D493169AF12159 +01864FB76236CB325D893BD1C7778E017284ABE61217C9B5C6B41E55A7:\ +BB7EBA4B6592A688CD29C782FDB74EB7 +976A837D0AD29D030D376C3D8BDFD37F4E0AF1C4BB72B043EE3B6AF44AFB:\ +4B814B19C0DCBFA31405AB495034A4EA +6E72B873F63F61E03EE166E6E988951ED02398094FB6DB178B2AAC3A56E248:\ +95BE77F915BA362E80430F4911DAEB22 +894B431AA20CC3AD8CC34C95895E0BC2DE6599FDDC863040ABF7735FA2128905:\ +4CE468F58CFA95E789D74A47FD8BA37C +C79F893B67218FF1672939A1BFE5F7E48A5E81E502585DAA16378B95F853251EDC:\ +777CF61193AAEE17EF6B68B5168AFD48 +DA074189254813206E7A3F4483CAE746550F5658A8287D0250E988FF49E3EEBFFA81:\ +011542927FD9263EA2CA86D668DBBF10 +E881A6FEBD17422B451CA7DBC1D4A7D9878970CD3E7FB0274247654279FF837886C68B:\ +2AAA877A05C4D944ABF15C603C8AB6D0 +0ECF376EF3EAB389E65F415D4247031420792C988E47D63A354481B52C31ECD552728A79:\ +B817B64F224083D701A6BBF838AB7796 +888941D7E809DFDDC49BA6B2EE804DE1AFBA451126F0CF8B9BAB1D04A78EE28D98A4A90288:\ +B320402832D24B4EF38ABE044B521EF4 +9634A438BD14D8DDC3AE525A04C37E7BCCD803570C1A9123F714614B365017360FC50F280936:\ +8DF996A89A7D2BC860ECA7FAD90B34DB +A9B5ADEC5616B4BB3DC89A5996A4977DA8C1AD36910143C267ADDA0BD80F9054F4DB\ +BF02CF585F:98EC309FAD45969BF125350868669D39 +CB76A9EA278044A520757E020ACDED18A5417D096796B8E8119DE09ABF5F17F95E82\ +6AD61E39858C:F29AB28DC618F5E4FB8525387B00836B +914502535D0F05A72A316F15BE8316BF9E579EDE86C591B8037D1EC036D95F8CFEA2\ +65032029F6B696:CC09BE6F76C27424ADA44C52554F05AF +A273736D5BEC5C75463FEFCB2297388BAAF202111517DE2506D331BF7F560E020D34\ +7848C2A1459423FF:9AA76F6791DC4ABA5DAF67B4A62CBB47 +F6DFBD94D04077E328166DD05FF54E6C7BEF77E104648951895771BD4897B2B7216E\ +F6A66A7B18BEC8A639:A90B980820FF501957009DF700451D78 +6B5B94AF15D1F60A181925BBF0372528964F79D5F2AE04850AC53105D9D732F3EF69\ +9DFE26FBBDDF43E17CA2:BADED5524542AF6A21F796EBDA1A096C +520817840BA40BB5AAE8709ED60F89D7642BC81C7B7D68A52566E353AE869D0EDABC\ +D8B3CFD3200851AEC7F632:BE5618463DA165C84B7E1C8307A5A301 +3F793FECECC4896206D2A3F960394DDBA4405615D3DC17453036958DCD2042AB4B6F\ +AB256522ED1EFD38C22D9FDA:9914518E9351F15DC4D60B243CDA1B58 +2F859EE93CAF6F3944D1AED1194A53C236D95B721FB892D5EDBA47CCBA6D95EBD498\ +5086A8E3C0D7E84831C41ED70E:99C81ECD5B50F43DE3385A9E0D482CCC +ACCA7AA450D9FE5AF957C5C9FC152822D0A7FA9322B044666B3264ED488656A805D9\ +FD95EC243FDBAF0937BE9460D77B:400ADD0630AD12EFD9695BB69AE126CA +E84D9DC677B38B6A9646D2648441E12D7DF7BB3DC0AC0CC20C2783CF0C1C45B93272\ +9C33042D0B013B562DB482D50C24F2:8CBECF75DBDAD10C9D480579B476C6C0 +07C14E13B62BB89468ECDA029F66EA279EC9AAFB7BA7C80FFCD9946F88CB80F32317\ +7B77C65C1CE9397775C980A02B481C92:320C6C79226261DFA3D2B9BAFC51A3CF +7F999F347589D4E2901BC1CA533E8DA0D3BCFC39564DE20FF0537759CEC5DB807D6E\ +B2C9D4587AAD0297BA6CB0BA6BD436CAB0:0FA0F71F8E8B9F47A966283F3C8BA4E3 +3099FBBB801C8B27A26B549FE23A834966A9AEB9C59EC76E6EAC7C20D934370C6B42\ +3DA31582F8BADBF3CEEDFFE69D3333A8E15D:B2CE84058F967E45000D287500C9D81C +839ECEAE837ADA0AE91E52343B095B9CBE6E1529B090677C36F4CEA1FCACD1067977\ +88954417C61F951D678B6B1E8EED9FE7E0D2DB:7498590DBBF71F17EA3F4EEF7FD68641 +A4F122E71DAB34E6E35A27BECA6F3753E9DE662FA23E4B6492A1A0145AE3CA7362F0\ +1258670B9C955F55A300BF2F7D22B0A020E5CA15:98754DE80336A4BD012F8A05617532BD +6FD5D1E011D2C155BF4CE63FDA59BFEC91755D6DE6F646CBE774BF96FB8463B8C880\ +6BE81F1238C5F9AD1F77A2A277D2694D12C3E5E9CD:C31E7ECCD70786BA1E2301239E2C9EDF +F1B68A476C7738A656E25FC954AA7A42CB7E6BDD3142523F6566CF5B838D13E0E011\ +263407ACC6BD74B0FBBEB9B918529FC5848031896C0B:90FF6B4BEE1A2B833982850E2F06FDEC +D223A6E65743997A871BE50E918F03AFE9B9847464A465BE1EE852BFDB1501989576\ +95F18A7928B0041575BCF5A095B3291242DA05D766E1AE:72C28BAFBEB177406866743F1B8A2B6D +784743D4AE588AFBBA7425AA095A1E757017EE0F126683CEA69901458D237A7A69CD\ +2235FAD6A1DDCF1E4FC98017B3FD2081BFB6E3F801B46FED:\ +D956EE28E490B90B9C57CDC723A310FB +3F18CF84A687A40725F32352824C9C2AA7444A4888E68D6892C8778D478EF4A5D97E\ +64F0D4D6D2C8A20AFEDAE41F7FB30EAA293AB43DBB16FBD9AC:\ +51678626D21DFDF58AEB6B35E977730A +D7BBA140CA4D4C398732FED7CCD574C326FB498E8750177DCC9347110E43C82B9CED\ +D9A3BE266A6F93C1D5CFE5C6EB2D2768C5841F562EE01A4770B0:\ +B9DD09BA8E4A8B4200E943F928420368 +C6B516FD918CA874B08B446C7F421AB01532E12D4ABD34CF1B7E9AB6B478D04D21D3\ +98C9E486223A803003E93EA6FDB6323FA52634383D5A9E43FAE4CF:\ +6D14138691FFC136B97C432E88AE1957 +4C4E1022271853F9FA261C3A52BF46E806A73ACB3E3AA25343D826B5291BF5DF1713\ +77D76285273B2AF7CD2E50A3D5D2BC08742817A29851AD5BD1F8EE02:\ +15AB1275F436B96CF1BCBFFAF15E6EBC +3141EAD348142A07B4B7853471FA243511F1D8E6C633EA25BAE04CDA97B1AFFFD0B6\ +47131C67040986EBE78E86D89F1C86CF591365F7AB45865EDE0628EEFD:\ +B58A8F44BACCC511DE13227E98A69F3E +CA547E696B455522A16EF1191F8C39196BBBF6EABA00693B69698DC1344416F6F3BA\ +1DF367B7EAE71D48165678F7C78B0096D6DD5EE2E7EB618E85758392EB7F:\ +8391004470075BF3CD8858C492E7184F +2FDE680648A3CB7210D74BCD690A5F03B1DCF7EED861DA0F4C4E3FEB7B6B7D4B4988\ +F5605B30613B87E7DF8D3D6050721BE4F6FF0674EABEF58720685EDE942F82:\ +2CBBC00DD0EE6EA828221934A4605A93 +C6E48AA0604F18E1F579BC827779B850FAAABF96327FDACE8C10BEC830AF1EDEB2A6\ +46A5143AB342B9191FA5B02A581C4CE68880608B9D37120C2EC560B4AE309C94:\ +AB6200335E0B4DDBDB719BC4E36DAA07 +84600F3274F4ADE17F1C8C7AE3CF650D861269DA9079F2474DB121BD29FFB9A09D86\ +44A62E8E88C369722FF09108C430C8FA6B0E9EFF4DBDF1F353E1D25E5661AA3E92:\ +526A127BE8518E713CEA69D5147E9382 + +:31D6CFE0D16AE931B73C59D7E0C089C0 +61:BDE52CB31DE33E46245E05FBDBD6FB24 +616263:A448017AAF21D8525FC10AE87AA6729D +6D65737361676520646967657374:D9130A8164549FE818874806E1C7014B +6162636465666768696A6B6C6D6E6F707172737475767778797A:\ +D79E1C308AA5BBCDEEA8ED63DF412DA9 +4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465\ +666768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ +043F8582F241DB351CE627E153E7F0E4 +31323334353637383930313233343536373839303132333435363738393031323334353637\ +38393031323334353637383930313233343536373839303132333435363738393031323334\ +353637383930:E33B4DDC9C38F2199C3E7B164FCC0536 + +[MD5] +:D41D8CD98F00B204E9800998ECF8427E +7F:83ACB6E67E50E31DB6ED341DD2DE1595 +EC9C:0B07F0D4CA797D8AC58874F887CB0B68 +FEE57A:E0D583171EB06D56198FC0EF22173907 +42F497E0:7C430F178AEFDF1487FEE7144E9641E2 +C53B777F1C:75EF141D64CB37EC423DA2D9D440C925 +89D5B576327B:EBBAF15EB0ED784C6FAA9DC32831BF33 +5D4CCE781EB190:CE175C4B08172019F05E6B5279889F2C +81901FE94932D7B9:CD4D2F62B8CDB3A0CF968A735A239281 +C9FFDEE7788EFB4EC9:E0841A231AB698DB30C6C0F3F246C014 +66AC4B7EBA95E53DC10B:A3B3CEA71910D9AF56742AA0BB2FE329 +A510CD18F7A56852EB0319:577E216843DD11573574D3FB209B97D8 +AAED18DBE8938C19ED734A8D:6F80FB775F27E0A4CE5C2F42FC72C5F1 +DB7BF252A4641FCA34866BCD5F:6EE7E13A9D83DA498EC31AB7F1AF2F9B +8D62994630AEE95D4C2F192B3F7B:7BC1620BEBB0BA89F8E51454A2F90421 +BD68233EAC90E380907F13A3DB7A4A:529961E476F563084D25E0F981CAF73D +8DF425048D0BC1CA3544975250B956CA:5127AEF56B982E136A90BB0617AB89DA +D18ECD6B341CF10DE7AFF3CA82EE04FFE8:EBFD075F46B974E971971CE09CA3960E +BC66823C5C3B9328940D2C1312B90DC92205:436D62CA86CBE2D645B728C3A3D012FA +247E8B8F71BEFEFD1B001D34362851B71C2C5C:69D0CC38938B60E5308F62748C91FA78 +B2B8E155E9409960B216FF533647F1BEA88DF5E9:550C07A2545183EE4A46695CDE92CEFA +87BBCDAB47CBD7A8DBFD46175E901B2F2014D2574F:AC1E96028760970301A2201C02E7BC2F +E68232740643E72213C7CCDDF3FB6BBBF8FA91318E07:4ED55A365805C916A7B476F29161BC1A +F0521C42DB4D92770C7BE97BC3BBCCC13936A72FB0ED94:ACE41D10A5771692320E8AEB0C6EE308 +9910BCA80E2A1E98D16871CAE15129D0E372F07CC0076C6F:\ +349B05E073186D50B8E98581C90C6254 +BFAFA136A48F1DEB19DFB707E34B495FB1C72CEA1DF6F47993:\ +31BB7F0CEE1528BE4FE0CCE8D140F622 +DE42D4B7A1FFDA4F086142F8D9C9A29F752A348E566F8CE53FE0:\ +6D7E9235A586970F8670FCE5FE7A4178 +45BDEEEF37A626381FD30D7AE7DA9DDB4AE8F5F17E919A8286AE2C:\ +9D1D7ABC247166C9508BB99934DAC532 +C5661640140037B16D5C98DD120AA50FAEB3548ABE84906DB82E0228:\ +0993CF5D2A56DF4D47F9FC2DD48F62E8 +B5B9EAE5DF6E2191C154D7128A2286E9C7E682B24CBC72962470BA89CC:\ +1BE6103887AB908F155C0EB3968F9E37 +264A4620BC5429260CB2DD0BD1639613F9AB513189F54467D46767B737F2:\ +828B112BCEE9225AAB202B54345F002F +03BB178060230719B7AEBD628334EDCA158D062F3AEA6C0073370831FEAA32:\ +2C07E94CD50F9DDE6C9C99085573F6DC +DF9A276CBECC9A28D999A67BD14D28E1C5827DB2F0B0D48BABA57F07BED49752:\ +3D39093BA64DBD00C07183177CFB4F18 +65ADA2267A286CF3490F5967574E707FC3C03E837D689C997B9A634E5B4710119B:\ +50C430128BF7499760DA8164F4FFB71B +2954D2628C422A02C1B8A9D2950D177B508FBDF57DF94BE3447FB79E40B2F65845D1:\ +FD9242F1604EA977F5DEDE760AA9319C +053F2617C86E5468D53D869CD260549392C53F6A7D8429685B86AFDA12CE4B611386ED:\ +929AEEC5B56780EC07B1455B1D2E0580 +FB55D0287923FEE055AE96937735BAAB47E488E3C24160E13B5FE2D06534A2E00F957FF2:\ +35C6713BF2E172D0A30A142869EB3B9A +38AD3FEC103EEA5F808779233955B03EE4E7677A894A8159DE95E9FDCE9BC57D919C13C66E:\ +73E6A3F3BF0891DC4FA050936FFB702A +765D5F0B37926C40D544BD7AA4052EC15BF4F367567C2F1ED21427C785724EEA29303B055A25:\ +D2DEDD1D77EB642E6CFBE87DA2537AAB +86DBEF8CC3D93F340FB31E92C2324BC3301B9196ABF4292263AB0B883E002423F063\ +280B0F385F:92032B502AE736973AC4BE67E263809A +B81F79B5B9B17DA768607C66B99976BAD8F53DEFC743EDC387B6C2584970BF5FDFEA\ +E48E99AE4C09:1CE836B431110C7E4099E5D8F8E54C0F +8A8BC0EE1763CBB2081E774B282085DBCDB5F198DEDE350BFDF7B290BB097180BA50\ +318A833F5BD9A3:0B278644E43EBAD38FB5237405B31C35 +359AC2B44FCE85DECF35F5CF9536C7F6C48BE18F44731759A8D6C5DC2BB8374AF0E1\ +2A48F8D111286067:37FD5E056A2050789F8E95E9EEB8E564 +6213F3543EA1B634B8D9C86A26D08D1C8B7DADEFD9BE50721354395B1A99D653DF74\ +75A5FFC45A7E035ED0:79FB0A2C96B58FEA3194CD6FB3030C1F +C2409DF528DFE67C1488D7E84970A82E006EA1B34D97728EC821FE0597D8204906DD\ +8396948C2CFD9A86E13A:E235122E1DB5E26DEAFA30C64C8FB5F9 +4E314E192FD989FA432E727083199163B6448C83CFB98A968189BF7F3DD69B635EFC\ +381BED87108A794C19336A:1C494D375150DCEF2FD51F84AA59D601 +2183108500C74144F21D67DBE132EF997B0DEB97513A381334D5413A6805733357A6\ +41A3EB2A72F0813C21589A9B:23D80B20EE33C33D8A75E485309ED45C +F43753ADBFD4B2BD905C0F06D5450673D98AD6F50E192625338F5737DF8A0B375964\ +2FCA66CFFA9C96EBA5F57078CE:B176D8F4982A9CCE331366079033FC1C +D04E4313C792988B8774DD759AD8BDBBF98306F4F6F7090F0E5F68FD8A2351544634\ +BD44F7423F30FE37881874F5B819:9BEA5C357BF5202B6976307713A903B5 +DB266910FB841658BB855DC312702CB639834C1E5C50AEC2AE199D352D2E4CA1DE6C\ +AF81968D586A31A3C5D65AD0F4912E:768434AC733C239B8DBCA7A459A2FB42 +43BDF85AE7C27AB66EEBF743F1D4B67F2BBC98EDB8B92F3251C81CCF54A219F6A684\ +E1B65ECEF7B3FC9C95AB3B5B7F374FEB:46956F7F64806E86C9973DA6CE2FBF90 +A87792462EA3BB903170039536B13C1617BEA2285FBEC835A7FB2CE7FCBAE27FF0ED\ +E753862E0AABF04DA01B74D95C042E1FF9:6D78DF86BBCBD8B08DD7FC648AD0DA64 +CFEE147442E699CF016714EFFB3579981230BEC61D7BD8CCD4CED1556278DE848627\ +C9D72FAA12AE7E00821839FFCDE8E2A421E3:67E9F45E71CA07B2E0D0D4B658B84228 +32CA147C83280D487ECBB61C3FEB34F0D44D6E5414E2A544EAA2C2992A19469090DF\ +86C2D98DC4350205A50416DC045A28580BE425:1136E79134EC1B4AFC61F39F9D0EDA2A +03B674C177DD0E9D3C450FA48AC356417B319874C46B04F9387E823785FB6A2CB103\ +5B17F7B3B789BCC1721167BC393518737AD65A1E:CB5084C965F8433B3F739A3F85AD649B +7538B43E81C97808AB82AB9BFAE52E2395185B3779E0631A11FE85B189C9F390BEFB\ +1087577AE977CD79AFE115D7462F60C4693BC16E0A:0D88491C0EA8F820A253F250B831BD26 +FD04FE966AC54F6A1BC4FBC86FA328248AA235D9F190C7D7D72C2382C094EBABEF78\ +72BBD5BA4611445B8374F0FC0269E5032392B95B8DDB:CD9965783D9A1EA097E9D9E2831ADCE7 +98948A1E28A1F7B97BBA154ACA43BB28C05A197E8471F1D35359F5744C66BB9D0FF2\ +34B7B5E2E73D533E5FC78C13FFF2B68B3C7DF94B860752:037A76A6C9B017AC440B3A9330EDD0FB +06449B27F353990EAA0A81C4A0422079B5296FBF87209D084DAF4C81C796433E9235\ +71733CAE194EF225B12E67D1F5F21E0A50486F1A3E57C6C6:\ +75B70BBCEC3769FD56BB04D7FCAE220A +75D4D3B833E659784D26E988145A3B7B01774CE6321F61A08B0A0C1A4645FDEBDAA4\ +9323B051B47C1F6B38185D60139CB7C22755FF6E2BB7FCB5BC:\ +2A087E2C8002DF98EF390183E96D52AA +20DF7267729FD77DE12969F507383E240F39F018A0666E32A58846E0ECD9FD6D7A13\ +2BCD755F463846A1C861BD5593DFC71318DD7BDB905C315FEB72:\ +F414EFECC9C65E20FB175DB5C7FA2AC0 +E96C3DF4D195693DF4D3CCFACCDA4C6A18EF039F886F33B6980C4F1233A5C704B3DF\ +B205751A6B09145AB69E47A1653CBD69A593040AF6B3D6F5407267:\ +F14A6A40918BBC6901639C04C34C1B3E +C44CC1C20FDE000FBD7F49453FE4519000E30AEE2BCC504B4FC0911807FDEDF488C3\ +BAF39A6D227A22D8888E9912C1AA9B37DDD2EE9C509B300E864493A1:\ +B82E59AA885C741BEAE1DD7FE19B1ED6 +B37A592ACDFC58C2E4E78FCECF067111846227CC1C53347B141F5F378B64FB5163DC\ +25149B88C28E6E390C561245D73485DBA5D616654EE17A76C20300E774:\ +EC58A5879BE2E425B1A126AD80E32FCE +3104C2E23C21C174A512C7DF0DFA11DE82FF6D9B8CA86331970F8C29A5BD5F58DBFC\ +874B9F3F81136E8FB1AAC2D244C697637526C8A680B3072C86272FA684BF:\ +51E46388BBC048DF3914582F8ED32E0E +D6EE0400EE5E1C18B170D309D17A8C79918449FFDD945F33C79DA666678C0EA732E3\ +1226BF56398B0C0BD654F286F00ACE0184C486440433D76E74E3ACBB933F5D:\ +E2592235FD61589C07E26861E34B75CF +8910E1CA14F15DAE918DAABBC4C7555417ED6F8BED1950CF7B6B321E14D82AA49296\ +0DA9068F8B24A0C061EA41FF7C7DCBC797B4CB1E0A35C8F86E33CA0CD558E93E:\ +C0059500DCC36D2C1B8D07D521BF9047 +FB7B50ADDE9FF5D8DEB65C4764DD3FF42C15F498D65018583F224734DF414C8E0523\ +5B406BBF79FF32EAA14DC9599AEDB4A9F201BEF4AD2D324F1736EB95F9B70BCD1B:\ +0E2496AD1385C0695F1123141170F9DC + +:D41D8CD98F00B204E9800998ECF8427E +61:0CC175B9C0F1B6A831C399E269772661 +616263:900150983CD24FB0D6963F7D28E17F72 +6D65737361676520646967657374:F96B697D7CB7938D525A2F31AAF161D0 +6162636465666768696A6B6C6D6E6F707172737475767778797A:\ +C3FCD3D76192E4007DFB496CCA67E13B +4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465\ +666768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ +D174AB98D277D9F5A5611C2C9F419D9F +31323334353637383930313233343536373839303132333435363738393031323334353637\ +38393031323334353637383930313233343536373839303132333435363738393031323334\ +353637383930:57EDF4A22BE3C955AC49DA2E2107B67A + +D9C7DD80BE463DCB2087E3BE65F0453BEBBE1B6A3440CD10CF26B60653F00C16B92CFAB17F4B\ +E6F2A7A5F463D1558653DEB907EEF6579BF86ECB460A252B7D92C6FEA35AE8267332E8169284\ +86B1AF0AC4F61238A8A2D37E7648A9B8F3E6E972CA989C6C6FCBECCA418650DD5D31EBD1E6C3\ +1288C0AD0EB3DE61EDF01863EC11C2BBC4D03D78407999EC1A33F606F1A49F6BF1E626FAA2D5\ +7E4FB2B6838B349C28B32E90377D71FDBDED640E21700A0FA6475F34462098FFFE1F76E3E824\ +09C86EFAEFCA4599E764B682FA4CAE0606D39F8F87CD29BE2ACAFEC9C0343A4ECCB8F43B1100\ +49AE7B74EBCF01567A86F3B3EF75D38874940BB142FD65DEFD1A0ED4C33086915E46F85306F3\ +4CB7A110D68365C830B822330784EA44C168D9428065B206B34721EBBAE49B840AA74B0354FF\ +B1D744A29451A6089C3C8B2C7F242BB9A83894F311ABCBAD2D0F614687D935E5703CE323764A\ +016AE97D841F7122BF6BD101343790FB3FF889DF86F770B4825BDA11FDDA93BC1CFD2C0D9CFF\ +907330BFEF4758BDEDC2012B025561A60B659B4E9E4FC458EF33F7D5529A64F10D87ECCDBD26\ +0AF5F3D76E069BE60FCD10274C7B4E199E8A9E85F0D6565939808E51B52684CA76D5F83B515B\ +8C4936ECF342B770E1D910C55347527EE495E6B16423369E781037CACBA212C5A7380789EE16\ +8A90FB2B291B975005F1ABA7DB3B9D950202E168CBC8DFF5FF951E28DC86E6FEF0371911CA1E\ +94CCEE27E42F7EE907273B2E87438D3520D1DE94C70057FA79816E5BAD7A840FFF881BCD3C68\ +0543BCC19E847A3136EB84EE7389E3978E122FF782702D6BFB1C26ADE57570D15DC8408CC132\ +E8D647D8B318FB76E8918D2513AA9E62F64E4EA3DC8D618E9A596F2B6EA8D0C55E2791A71392\ +8A7D6401B533CD86048E3581EA8F60FE8F94F6FD5B577B73BA339AA8C5B4CDD093AB895D6F9A\ +A5575BE5C9FCDC461A1E9DC50F31938779AE8BE160476AD65FC1F7FF9601B07E48CFE676686D\ +D772999737D0264EFDDF546167F4393BFAF26CF29801A4D4CEB04A5A551332DAE0014EAA9E09\ +0260CFCDB547883CD0A622102AD1C1B975353BBFD2F1C98C555BCC4DC26631AEC0E9FD70F609\ +8785748F5E2D3A1963F99355D05599C180FA35920E48CC0594CA3F3B1A05883B28B73EF43FFB\ +BD8A0AB4C4EAAFFE5793B415B957CFB27A46DABEF173B316BFBA466023C7C89EF4A5FDE003B3\ +602E722C9E2E3E624E2B130A024A2B6CAEC46FFF282412BEE4F28CA4ADC6822219D76BA77F91\ +1EF8F9AB52C5066806A1D47EBE40045F1DB3590BF0128A56CC86943670FF83E8D4E120F6E4D0\ +082386EBDF83488DFEE827371C773A2B7A03ECDAC24EB977A16361353DDB164ABBB1908CA2F2\ +BC694E141DACFCB241746786FB24C04D2DA7AC188436201B3556ED2D6874B0AF6227AA072B51\ +BF8699:\ +EB16D2E1DC85C8EC527FDB6BDF228A63 + +[RIPEMD-128] +:CDF26213A150DC3ECB610F18F6B38B46 +61:86BE7AFA339D0FC7CFC785E72F578D33 +616263:C14A12199C66E4BA84636B0F69144C77 +6D65737361676520646967657374:9E327B3D6E523062AFC1132D7DF9D1B8 +6162636465666768696A6B6C6D6E6F707172737475767778797A:\ +FD2AA607F71DC8F510714922B371834E +6162636462636465636465666465666765666768666768696768696A\ +68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071:\ +A1AA0689D0FAFA2DDC22E88B49133A06 +4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465\ +666768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ +D1E959EB179C911FAEA4624C60C5C702 +31323334353637383930313233343536373839303132333435363738393031323334353637\ +38393031323334353637383930313233343536373839303132333435363738393031323334\ +353637383930:3F45EF194732C2DBB2C4A2C769795FA3 + +[RIPEMD-160] +AC:FAF1685349FE8B832BB2FF1CBA482583B3560F3F +E9EC:C4EB5003F5FC64E122194EF6FBA841B30B1E8761 +74524B:D5904A1D8BA51B972BCF6D00681A5F0306C57AC5 +E233E3B4:9CEA3480EF59215C514C4FFF9B813677120AA8AA +445A2F97AD:6AE5414CBE327CDD20FD8887F2F94D7B69222AB7 +A242802B76EC:5DCA1535835D75ADFA1B204C5CDE68C2CA8F1D67 +CBEC35D2FC21E9:C9809CA68C9013F34B7525936DB84B5737C591DA +E8F3385F8B210A7E:497049F4D70E7B42A3F30582C27CC22DA5A51CD7 +61A82B5B622C48F6BE:DF01106CAF345F6E084DC5A46137EAD345D445D9 +4AC97BA5461EAF9228FE:C44507E89C39B4E9965FC9610B6B82985B1A2B57 +0E0B7D71B3CDF458B883B5:39F567E3B8A7AE93BE5AD8E35067D8B2AC81B9CE +43A4A8265FB24F3279D6CDE3:F6342D8150996D93CA43369A69A502F14DDE041F +5CC368C293058FA49906602624:893A6A07EE0A2669BAF707ED3BA2376125EF9654 +0A52FEEB91C5D0355FBB35E93F5D:5162732EF94AFE500679F550CBECF8043B70ADA0 +A3FC5E1467219DB6ADD73F59808955:3DD7B8C0D2278884B5A5C22A3CAA061131A5AD7A +ED45B0BC151B3A739D710AB3AF72A32B:5BA207C3A45289463C98A21E2138C3758D2DDC4A +AF7F01692A1AA195E2A3856DD936285F2B:D744FC79D37AA33E16C60DD7973B7E0D1E790828 +5028D7983E49966980AC8A564CAEDDCCE890:5906BECDAF00A5C700D548EFA92FB23FCD1C8D6F +C17757BF03B8661B4407D06E4E47E8B6C678FB:2B7202910CDBD3CDA240AFFAA5929D6F82FEBC48 +5C4172923580ED789714245E42FDA873F405EE97:\ +053DAFE5970069C38F5575A54C4BBAD3FDC34DBC +74F77522AD9FBC0E45DA88354EE4F5552EAC5F02F7:\ +0B72DF59FCC468CC4BEF4B0A77DA59DD4EA4486B +33A75FB9CDBFBC9A257B122BE7ED337BD65CB1FFE9A8:\ +1B8A94BCEFE1E6CD9000A70AB342FE7930E62220 +8D7042CBDCD336C86E7732A1E633BDCC137380AFC37D25:\ +F18C667A28AA595890E689D6CD19FAE3F9FB7D7C +D9419BA075C613F701E19DE6449E21A22FE4BB58067A5B0C:\ +D656A0F985E186388C2A211AE0EC8EA30B059505 +8E5A281FA95E7E9B42EC0CB0B9A35B54851257AC78494078B4:\ +AEBECEDAFAD9EDFDC204AC1303D14F549EE12CCC +3E01A429466E67653B7B07751F8E497929A0DE5515FBA7D69FD6:\ +1640ABEE310D1860D7944F0B9929D3E4264AD358 +1CF65AB71AD544D423CB904F064A5D227A01761D6A6188296201E1:\ +0181503434C565B41EFF7C432E220BCC290F0A71 +5781599B64981D4657B3C4751DA4D7594BF446E386621EC838C30D84:\ +07D728840AB1449D31CBADCD5466D887EDFD4650 +44C392B435A8CE90062F7BA756D23FD7A3582F23C61DBE8A06BCAA2B62:\ +4ADACCC7626AABF56320040E42174BF284D4333C +053AEE544BD93733C6FAA8AF9B89D1D7C1067832273F23EB6BB5D1D7ABF4:\ +A993D46BFD0705CB8692F6D6B88AE5DCB20CBCCE +7A641E5243317176E497DDD286E47A2A36DEF6451A4A44AEBA12C03CFEFA57:\ +C0CEED6AC5A60323EF0B6D07535AD5264EEF0AFF +3BD0AF34C27EFCA58CE047F265F1CFC8BE60280CBFA57225AFE6B353EC1B1B86:\ +AED53C23187ADCF3C2D85FE77AA3FFA7CACC85AD +5C861109B9A1FDFB6E9B61737461F722E6582C94C9B406DED106DFF2FBACDF5B07:\ +CA900EED8F00A8144C60756317CA7B23FE5797DE +D0416B0BA3B19EE355186AC2A09ACFE91964F229DE3D4119AD5AB4A09CF0FE10DD2A:\ +B2421A5314D8311C18773DECC2798300A36CE63D +F7077210023297CF642C3755338EBD2CA234C22269FFAD31A7BC6B12EBBFFCCEDE293D:\ +797538F704EF4FB5D7E93DDE8B9C742EAB19010F +169ED88895E743A171581730D9CE32B90E557C2AC178F00AD15C13B2639BEA59AB5CF95B:\ +2BA71C7B2BE43AF1825A3BBC7DCCD104A8F8AB74 +747EF1D2FFE2942444429B7B6D46631C7BC8C00A63D44176014E8594D9F2E09451E956B0F7:\ +5EEDCDDCCAB146BA30C9613D5B4825DDF6D0DF57 +546E13EFD694F71819385EE6F9A8022EB57B0E6173AD2042984AACBB6CF506102317DDDA6773:\ +5BCDE7DEE110935114F5422194178110A0C8558E +8D0AD66F63EE8211654EB12362F5CE0F7A0672A3E77A0F3FBB6E6986C13ABD2DEBD6\ +E7F916FC7F:54FD721965D4C6DBEBE9E3D2B5A334957EA3F0BC +6120F98D23DDABF5CA10022CF22A58CC89CD516F6B9AD1901A6C450B89569BD75B6E\ +D43D1AB1ED1F:560FD1CF282E07A4FBBCB495EA33C550CEC1CC1A +7497FEA1D85825B29DBECE7C90F52B1B4760393693B31F56EB366571D49CB6B0EE85\ +4BDE58BAA64FBE:B61AA965CC9A9A1AE9A7CC0087E7417CF942A0A2 +2470B0926239D1A1B94F85204EDDE011000E3D08DB9F59E86A8CF7217C48C5DBE5CD\ +00480FFE00A22B89:81586567893FFA39A8079018F46B9FF14811C590 +56199F4131AF9AEF9BB9F1CEFD8552E75E1B607770A461E6DEBA3664972908DF469B\ +7E065D0DB531608171:6B74A4AB1C06E029004F14DB759C344DBB770B1B +554809F00123973A8308B8D3D5F10EE4E5514DA51F615E1F606957E1FEBC87BA9C36\ +9F6ECF29F99CDD57733F:FBF816D9A81A8605487F6529255DDC43D031065B +4315B59DE93EC8AB4BCD8EFD4FEE3B87CA4194C24211EA0E79055DDB1FBA7511203F\ +D56C0154AE12DB25ABB434:F465D07419A5F3AADE344BA5D64A5133EBA1B873 +7C2D0A5131F7C83789B1CBA64E5E6B3485E3340ADA2135008FBF1862BF711C7A6559\ +2FD4A49C511E29CF910003F5:C9D8494FDDF45D298164D5BDA3DF18AB29434D58 +7597DB5290120386E158890C7BCD70DFFFC100184A8339F98E7EBB17B23B6A88772F\ +4A05F2E0A7B2059DEA991BF154:CE9AB0CF93F471AB913043DF76270514AD281EF7 +B17BA36D07623609ADA5CF2D8F878025F02C3A4F578021BDEC12345A53780C71FF9A\ +D5F280BF8E1039E5643389F478EE:2B42FE8018B985141E4EC9604F2C75D454155EE5 +AB1FD81A1D2128A9767132079C36929BD76336157054FA889AD09B117DD753166CDC\ +9AE51EEA15DDF8D7B3113F8534DF77:22954D720F8259B5F04D288A453DFB54712BE71C +53FF3194FD863938021F2033F2E31F508AF10E8D0B309FC2E3477495141732BDBDA9\ +CBA44F83B5459FCA222A894783741C7B:544E6CACE0C57A4AF18F0913D951191869EF933D +160EA25128E0509398038A0F490BA73C62A03E58997174594FDA1B45924F406DD3BC\ +E56253021B446D27ED16CD7AC0EEFEAA48:6A56C5CB8CB5F4E64EF06FB32D94188884682A2D +F18CE863EFD88F83ECDAA3ACC57786AD1A961B31446436D4E8F86F5999D475EA783B\ +A3473D09C60D0CA6FE3D8BC16D5B5460C296:\ +D85DC07C16A44C4DEFEF238EBFDB7FD14C73A788 +890D6A3EB3EAA9C75FB27D643257A8196387A5A49556CA3E81351B2668E56FE1D0E1\ +5BA1139C59B48F879664F6CB3B80A9BABA6DED:\ +50F41FFF64A49D8753883F71792305A0EB0ECBC3 +370A044BC71750BBCD57491DB54DD6335F426299A3FDD0FBF6C419856CF2FEC70FBB\ +AAF6AD0ADC2B31681BE7437F1DE7D02393034E00:\ +A31C9760489983399EA803BC7945914B7CA59142 +64BF8D78E7E1BA0F32F6D4D4F1AA68B12965A7F942B2B152A47869750DDAB6F1F33C\ +82BA1E75EF76F1B2D9769016CBAC063717FB06184E:\ +E2401F5AA89927A7F51D4D6345B482B135EDBD32 +F434CDF6BE6104121A533FB7F7D4F100FF1F0F6DDAA76297A32BDAE535CF040CB38B\ +E51CDDB96107E1045CF24444BF482D9EA131CD163A53:\ +D95AB29A9F3C2A2DB6374FF7A0DEECEE521BA792 +1B99BEB5458C96D9D402D85CB1ECB797D352AC8C04F3FFACA76A33B365CEEDCE9ADB\ +A53A5BF381ECA73D863DA273FBC47FB3F9A9F6F25829C7:\ +220F85E79731C094C8D457CF97296F89EFE404E6 +034A75357AF6255F0B55856FA240FDCDEBAFADBFBCB500D17E1830A3D074B252AB27\ +77333A9381D63DBD4DB685A72A67E41825B331F0E183DAA9:\ +A0671C3BADC8D07C59F6551017B00211B3C35B9C +9C17DDD3617C5522491DEB7FF1BF56076ACD10EE7C482D606247EBD6D67F8062A3E9\ +ECF29D938E04879C062FFEA08C2F87F3BE840C50294FFA1DE9:\ +47FAD7E0D17A05345E130FDF458071900E90371D +147C4FDD4BB30F38661C0A4C57CFCCF5DE5369B089EDCB74AF24E814AD4BC17A466F\ +BD2501E745AE16D2D0C976D3DCF2F93E2E7088733BC6F4013F28:\ +FCA67427FAC3BFFF73FBC789A4D8FC0058B1729A +719F6946F69E185FBDD545EF118F9527630025ACF9B62DF5C38E69C9855C7B63E905\ +EEFD099E0635D2C40815A01B5EA79585DA3E4F1A2EC97C46DD1F00:\ +7EEF5539213A672C7599B489B0F80B954B0E9D1D +997C62CF0780FDD3164780D38BA784905E4A87BF1DA252E13F6C320040193E5CAD1E\ +AB40A6DB7291DF54952C1DBE3B76541856D2B71591D0794435243372:\ +7E882963AFD9163AC13F7E4C1A7DCA9FC4C6CCF7 +D93D8E8987E0D01BDAA37B1AFC53A07C5A7F46273D1F77A472D83D0F9D9B241599AF\ +C51846C16E33D1C1E2E532BED264C49B2A9919F324834B097509933798:\ +FD21687491F7F8D2A8EDD82DB8F08137D6C1499F +CC54B091B967D610BE6D6D889F909F843419091CDAE2C4447B8C830045B12760964A\ +D8D05EB0285A428BACA3E7B7398A37F7982238288732710EC97B5E32122A:\ +BB391A32D4F84199A444F6E9476B908209044624 +61B9077FD4A0E2E73060B4B26E86FC7A8131E0E305A5D874BBCD28BEDFA46FA84DD8\ +9431FEF6E16E4B5B3781956DFDFF1C1843DB12329F6C1C365F9A91B3A1F15B:\ +E3D6E5F7196B310A56089E76220A59D523DDA37A +9CAFFBB1325C6579B094C4EE8F5B1EB9CCDC5EE861FFA090E055FF2CE6323295AFCA\ +2DE193F15E5FE64AB7AC655B9E99145CE1786F266BFAC834A0FF367FD174540C:\ +954D88771139F64710E8F31A0B990E8A1E569A74 +BC15671078B9AD440EB3C16FE28A33216DB848F19A289A6C805655053311A2299F9C\ +7D091D3AA130E0DF2E318E75402D54528A9C67FB4B14D754D4DC41E1C06787669E:\ +69F3A729309B288EE077582807DBEEC2ED5D4360 + +:9C1185A5C5E9FC54612808977EE8F548B2258D31 +61:0BDC9D2D256B3EE9DAAE347BE6F4DC835A467FFE +616263:8EB208F7E05D987A9B044A8E98C6B087F15A0BFC +6D65737361676520646967657374:5D0689EF49D2FAE572B881B123A85FFA21595F36 +6162636465666768696A6B6C6D6E6F707172737475767778797A:\ +F71C27109C692C1B56BBDCEB5B9D2865B3708DBC +6162636462636465636465666465666765666768666768696768696A\ +68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071:\ +12A053384A9C0C88E405A06C27DCF49ADA62EB2B +4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465\ +666768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ +B0E20B6E3116640286ED3A87A5713079B21F5189 +31323334353637383930313233343536373839303132333435363738393031323334353637\ +38393031323334353637383930313233343536373839303132333435363738393031323334\ +353637383930:9B752E45573D4B39F4DBD3323CAB82BF63326BFB + +35B8A2F1B5F332F159AFB86212DCC4DE02B3FBA3794B0E5FE74A4ED9F1A55F55AE7711C6FEE3\ +178A410E3979D8B07594D769AD733EA00D64DCC1D601B871F918F1FDD914C2B6F9EC49B8AC13\ +A62A07E1091E0DD024E645BF3B602B4706583060CF9502E4EA6911AC9EB90E13816530B7683B\ +ABAAE225781440C35E8031515C45D5E4F5493FAED6B0457DD661B713895FB9D22646ECAD7C07\ +187B65AA508FE4F5B15A5C428264910143581512DCFBDA974902037D82451E4B1E12AD3364C8\ +F848E2B2A7D53D25F30C06AA6C62784DE8B8B6D097559C62D340C8103D51E0C303B1781F5A95\ +AA6AD1B7EFE3DB9E8D8BE9D1271AFC4DA9B0928642818965C922DDBB0B0A53E6D2ECE3672E95\ +68D0E285177BC5E5A9C2349788F8987267AD5ED26092A552AD3674344DE7FD79B9E33B855DA4\ +7F8CA0A70EE806945A6417C92C97CDC14C6BD9B7B25A2D89FEB62C594FD11A7CF3BEA1EF3018\ +B26B0E401EA8C7B8F07DAC07B77ACB78C3F45A73BA9FC32301EB3A19DFF000F3413AE0E92548\ +1D8F93D387CD458D749BA848BD4A92B9B7AEB0E244E479ABC4A85F50E94C7299E06BF0DAA158\ +7F49907CD94C426C33ACFC31E08D183A4353A36D8C6D39AAA1AF20519629C01A45BDCD60B115\ +CD490E9873D74FBEA994B75BB7FEE9F2167850AFAF42873D44543E3D6359A0A0A140705D4021\ +DE256AB12C38184BF822B9B69D7FB059C32EE332D86AB9DF26D1CF832381555CAD1688A362BD\ +B1F2982A55AAA37E5137B95B5961E8F354EA30ECB13B98DC697605556DF4C4EEDE6593016B7B\ +C30862C55C6651DA8A3589DD3E9EE42495374BA7E6C6BDEFF8CC078559DCD99581061348B13F\ +AE03259832EAD8BB84FAB48EBF725C6C5037539FC373791F21D34B56DE04A6CBC591B798B7CA\ +E2AD8BD5BF9E963559C981286F26802FD1A49A5A906AB814B34FB514A8ED0FEC7B67A550A59F\ +BEDA7B0685E69ADD13B68A69E070CF2C9E8D6CF4CAEE4ABA732BA20A8BA6C3DB8BFFD392CC2D\ +14D46367D451F0A3B77A411B128224AA473247C4A9A446606CEA8414E9C09DE13301C8E60B2E\ +E51E9801E1CFFC6E9EF283238E2AD209E5D48105D48044BFD28BD9F32C53D5D37CCB158FE597\ +983CBB45A05F1B9148F25772ECF3667554247CDB2A95A99E06275C36C6E4FD779DC9F8FA4575\ +16EA4CD020F6726E3A32DF65E34BD85DDFE16B285A0AFB0F3E2DD8954A9E636BCA5CF7FED181\ +B041D14D223F10AD0DE9E23372DD7A61718CAB6B9CC7C1D88D98697356811AC0B834228A299F\ +6EEF970E11D59E9FD307DACD40256AD7BEB203175CCABF70D9137BC29E2C7B0494C3FA6D338B\ +027BB993E870B02EC68A08EC8A24BD163D5AB43411AB7BCF1A09F64A7EAFE15A0C350F5D6F0E\ +68C1A83FECE5227112F8E6F8EF11149B3188970A279C9559BF11E7A4EF9F72C9C1E9B58EE48F\ +F880AA:\ +B48C57CAA63FFCC261E4B3532E75CBA497B4FB6C + +[SHA-1] +:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 +A9:19DA91F2603889267DFD77786E07A5B8F067D62A +97E8:D617ED3AB073B4E7A53D2A238D7DC55F26EE3888 +D45C48:8E7E3C02A55608B637C8AD621E6AA933821C40BD +AC42E6AA:FCB240AA79C665358ED174887E186220F0DA2608 +B520B2C214:0374FD36056476A85427EA2F7B1412D65A17D64B +9E2D7971A47F:DA4106AAD290AE4430618FBD3C5D1FC6C66ADAD9 +F1EA1C9B787BAD:B234020692659C3DEE19F7E75390984DD7E7EBBB +22BB11D0A3DA8661:A307CDBBEC5297114EC00193E056C0E30B15B499 +C70BCC3952C8330A17:57AFFC668D529B05EF9FDCE03448AE6B4848522B +24B2BFC2E6D47E0467B3:393C606D9C41D743BD234EB62D36A381151FA8FA +179BA867948A881232F2DF:F01A9954C602AD6A295512AB1FF58AC0AFA3CD1D +0DF890F7B14B4A8D16B76AFE:5CEF1B50663EED91BBFBDA9EB7F34757AC5AB330 +B0DBE17E0D80568C0AEC5E39F0:22AA3BC193DC2986C10CEF2E5AA4C673883D32D4 +AFFF20DF4873A1AD68AA924DD5C3:21337165D43D02685C5FEC0CC1C73C44DD99A072 +BCA74FF24F139C9952074F9D16F6CF:9F48417F472141A2CD49CB3CBB4D3544EA76F949 +9779CC9003344147C0A718C6EF20987C:C7255A698F731CA134BA102982345CF0A305AAF0 +06CFC48642CADA4A5E1A4BE7D42AAEBCB6:044581EF47C9F2DE49F71B284B7D80631775A6E7 +8A68E58F72C5DE3A63FAA08DED9C89435372:E485D9B0FCED9EE033A4B4759D211023638BFAFD +9AE8D4749CAB071975A18F45A49FA950B13A38:5BD5DECCAAC74D57D7CE628ECFB973409B364982 +F1413BFE7319315A7A7FE2D32F6E564C9186CD8D:\ +633002546668978822CA81A44E0CA113EC95C088 +58E747CCFD7781CA99755B24BA4EE7C13B59095796:\ +BBAB138D0A3369D67C9ABD0A1E0583EA6DD2B402 +90D6D80BADF7D52A7513892976D6C5BB28D8562E7748:\ +8F9D0D4F0E8F208BE8CEAD973776C9441C9202CB +E033E25A7D550BEEBA3965753D86D4AB982EBF0621FA8A:\ +0B2EB3B57ED697BCA7D73E18A479FAD38EF99ADE +0EABDACFCD5484F3B4C3D52D38E3E80CEE792B0CF600E2B6:\ +1F04BBA35687BA07375BFCC645E2DF26BAAC2294 +C6A3FABC7ECE7AE5592A107C437F80B1EA24488337F1AE6BA7:\ +A5E8F975C621FE415E49BFACC94C189E644261BF +DD5CBDA778F532D63FFDFD67D0A5F4B0262B4C505B4BA0F25882:\ +CF03D0BA50F9E569103B85BDF43B949E907EF0C3 +389CFE2CDC0B55DF41C1C704FE9D58585B9E5757FD71415F73F073:\ +00B0AEF6D2BD6213175DDB6B4E7968039F70AF49 +45B1C7013FCF2AA9928B166F9666D3E76B61DF676DBBA7420A159BFF:\ +AB5CE29466A6BFB2DFD93DBDBAD389A0B7F97C1D +1F1F4B688D24B30C8146D576156A7FC3149C66682B28C97EA157950B67:\ +18A9AF9587796E9E8493D20D8AE6F2EC82103352 +0F84EEC636A3381757004310399D3B3F12F97605B701A9038EC04B1CFC81:\ +AD05B1D89788743F97344D1C3AE3BA9499353371 +AEFB942B4B7A9BDFC9A97C447F7065E21A917F5393EF14150C5569CFC28DE8:\ +939EB0F17269FFA80738F66B3B45011A04A679A8 +8BCCF096CFB773326D7487A06D217A2471E709DC4C60614FB5A7E481381982DF:\ +3B69259D2E5E00F4208E8D2CC84D798A33CC1514 +232F3F1AFE834DD615BAC06A2510D1852E946F34B9E2085F7A36FD8844511F461F:\ +DFA0A9DB29A68171E01A6C7399B90F974A13F940 +704452E58745BD09D159F6AD40FA9B8C7419A2AA188D8B3AFFB00AC34EB2E304A0FF:\ +A099BC7BBED72769786FD913F61F655684031F93 +A62B2098C1D208024EA91470C903F8426E5D8F660C1DA268D0958E4BC11D2CD98F3835:\ +D2DEEC7774B67D924D131224BF6C908597F99178 +BF7E4F3FD269AC9CEEF6A08DBB5CB5BCAB5AF7080B8D675A7332F741EB9E17963E9BE157:\ +EEE037F1DA86921B491CBBF048B9BD872418DA9A +FF94FEF100BD0056A37830E6B1DBCE8B832EBF819867932D46BD7495BCC5CE2E9DAF08F1CA:\ +97517C81813BCAA6BEC71CDE13DB4FA44CF4BCD2 +88EDF78F02C8E36CF0CDA3D07A9B1485CFA8AE44884E290461A22D599A7F30E3A88E52F019B0:\ +44FB2EC4643E984CDEAB550BA1383CD6E7847CF6 +7FE04629976A8EC967733E95F2BFB79DA1A126DC5CEF391291320A57DA487D49EE7C\ +4247F8A932:782C391A16A08F98C32C780D7A1F2570A7675FA6 +97807FE1CA7BBFD000A057A70A6F6F026ADD4EC3D50AEC664A2BF970C0D0D36001DB\ +B7231640ED9D:C06024CD60C3859D653B5ED18AE949ED7C43C05A +98184A0CE7EEB9C8DFE36D6A19FD668A3B6F0C9A493835D63A70A4340AB6F8A7ABEF\ +0E5E09E4807334:7B7EA4D0E3AA0581B1DA3838ACC370E9394CDDF8 +33347AC8506D2C2F74C458B2AA0BE72CE38C752A4623A62DB758A9A6827287B364CF\ +D4C077F0D1DB9034:A1FF355DE693851B9A62D77CDC709826B27D6B3A +7DB60CBEE84BDD9B357951A59C724A757B90D77D85D61F5B90FCD93D101DF697F490\ +4EA0F2FA1CA7BD7440:2409204F9658D8BB4C8BFD10420BD576FD7401FB +AB8AEFD1533F3F07DA8BCAFB5C0C12E6BA7364A7EA2525796924B075242C22FA0028\ +F97B670DE6ADF935F082:B3837EB32A441C2C10E112677FF1569D2C6372F3 +890225FA3A7D120C325EEA0A0CF4050833C62C527B6A009CFFCA8DC2094135051B1B\ +C8ED9F9ED37B5DE16B4052:5AB7E0AC97C202630A54BB3BEA5F485BAE9257C0 +5D6F1CC0ECF25EAB98398A20D8278F84DE663FA9252361F01AA3F9A0D4FEA71CC86B\ +C63318A5E3019A6FD96851C2:2E3E5F3488A5D2C8C02A3B7E566844F35C0EC2D7 +0ED8D77EDA25AB5B9AF72F39A49B688B595D79363C563FE8F0265DE2FE0E490B4A2E\ +C86DC789CD0B05716993500C19:F4FC59ABA3C8D6F57DBA4F865DD24666251AA2E3 +89837C88BE7FE04FF3364AB6D455ACA1860D5C11FFBB56E16F817857CE0E3EB8106D\ +9FAC60FF571B181C86A830EDF292:31FB958B1D0935E46891EB09F8BFB99CA6809C5D +D5E0D6AE8AB7A630EF2206D5160338C7AACC6A5CED2E8A3AA224626F1BD16DE547FB\ +822CD1FB0EA84C1259A427BD1AFCA8:69124A48D475B5110EE562C59131DA40707F897C +A9CB3047ACAAF1A2AE06231A4DB46E28EB76694EA03A5FF78FD3C36797CB74259621\ +324F2897D80CC8C070454E55C341A3C8:53F6A0A6DD49C2D58413FE55A3CBF334D559A03F +338ECBF06225FBA761755EF7F9147A1AB2AA696BDF2516584EBB948192C6BD240902\ +451FD5E6ABC48B017A71BC608C87DE1623:CD0AF641834C8DEC7CB735BA31CB674AF90EC3EE +552150498BEC425BD0DBA052C9DD61714CDC22B1DA7F915FA7286C8CBB7D722342E6\ +91C877B748DBC369D4333F287587206EBC2A:\ +9B658AC6B9BA14176CD55F3AD40EF51722F25FE7 +6467642AE2A5C9D1A98BEAC2567A7097F00624AC9FBC1A7751487417EC33BDBE7E15\ +97E0205A7F85B10A06B7F8CBAF33E41B3FAE28:\ +48514214D5442EA393C2F29A0B632FC2C76B3221 +80C293CA96261C78EE05F7D666AA2D4C84D30A8B66EFDB0E34B0625E7CD2F691CD4A\ +92D07D66E22E837853F7DBD5D34BE1AE02501083:\ +E2E5864D1B24C5E8C1A2F8E54F80C942207DB2AB +6FECF376F676C90422AD0A6440EE8EF2CE1F4A4F5AF46868F77013F8A582D465F09F\ +18ACB8F1052E603E4634AD345A63495C80ADD64940:\ +22C6DA67A1B13AB8D11DBA2989E88258CA12CA2E +B6CFFE9D40FBA3830F2C20248690AB0862FBD8B1A5EBF832965F2AD7E8BF3C74A930\ +62C79F9CD16DE48043A69BFEA723035A2C81FF118184:\ +A517711BFA20D7324C710DBF3C5A955EF465926F +47C63FF1E5AF57CDFC0307BCF453F528E5767CAE52117854E9036F20286D1C1BCA27\ +70645B4794BD5047EB59F0EA5F751243AD8EB5FA3F69F7:\ +533815F09B700B11A674EE0647F8E320F79A5ABD +995C78E561CE4F9D9B9226C01DA4C55B5C4A1D5099027B1123AEE851AECA3B70CF54\ +BC7A74A4185D3781EAC76CD63718645A8F15CAD1911F529F:\ +62E81989C86A4AEE3A9DE5114AB72821AB7B1150 +F713F0C9CDF3A28629861AE19C38B73664352AC6939C976AF92A673857AE48DCEC04\ +E8967EC5AD8245CE062D8AD5FE5E92F39F5DCAAC9884F8B5CD:\ +79221ACEB0F387413AF24481A55633E54DE4232A +DEF310EF52F8839F15BA13C8A5B90815867AFDEF25247FA10B6AD03E70952F5AD0B9\ +836012F119315C43C90DD6B5D018B3C75BB01659535588A4C17E:\ +136C5C9F49B4C0C41E87762878846279E167D8C5 +4FD13DB66F140B6DC804F9EB821FB82800976070D59EE4C035527EEECEC97E1EE5C9\ +973F1A25362A84BEC6EAA38A47078CBA24C6B7155CF76E30C22199:\ +988A4CE4FDEE20041D30AAED622BF1CA4E01C5AC +57BD9E7BF1647FEAC33DA17BA902FEA19F7FD09E85CE23BA02EEC263A321580423DC\ +0872A9F794838EFB820A8D3D3D2AE81574F77825B70C569568A31EAF:\ +BD95E63B9EA0ACF05710DDFD13B77D518BE21CB5 +A222082AADDCA13A7CBDF9A9AD12BA723456BFD8B515A6A52F8F861226CF94D5C3AB\ +0B2A151A3B557DA8DA72585EFDF60FCA469AB30EAB12B51571E906557C:\ +03AB52978F19B3FA870D84814002A305AC58AC10 +89AA2C4D4F81CECE57B0485842B0AF8B857E7609CC0F29F0343A5B8A09181A63C8F8\ +4251C497136D1916DC5634DA842793C1B648A381B2534DA78E78E7898BE6:\ +BCC5DCB8FF9EECF6B282FDDFC8635B1923C2BAFA +94CF076400B9C2911C2C2C1BBCBF30E50157EA88CEB3B4966E61A18BA2C58ECA65BA\ +C7952E5A629E0DF53F4B8A9B031765A639C87A4941E42CAF4A5572AC05B085:\ +EFD01DA5BC765BA961954C2D7E5FF2104B1FA58F +B8847AA6FE095FA629D090307AA2D686C7D628B12D63BCFD8E4F6BE8CCE039E8CB69\ +683B8B70DE74DCBA93A019D0B459D707C4F2BE8EEC9B0280F6ED26D99BD454FF:\ +32CE1A1F18A2FEB9CF0189E37D8894E7CEB70CDA +676DD8B7DDF731349BF6238C855E8136AD59E734B20ABB500018925966EA4E076336\ +90AFA11E57550766745BD3401459373A418A360D4C4B9275714679517C73F60FAE:\ +81D2AC8F3A2C92E190ED1AAA0F7EEF24579E697A + +:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 +616263:A9993E364706816ABA3E25717850C26C9CD0D89D +6162636462636465636465666465666765666768666768696768696A\ +68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071:\ +84983E441C3BD26EBAAE4AA1F95129E5E54670F1 +3AC0944F60DD6E0988CFD28AE2103952C6070DC0A97EF7AAD20B5F9CB8FBE054368BF91C6791\ +CE900B487B309615F29F1A045D210D226D2A018ADA22D27C:\ +968569B83FB232766A9967C9FF6E9B162BF49DC7 +E5EF4476F1A0C19631E317518F0E64A8AFFF579A264FB3B00B55C108F76F667919731882DE49\ +05BA0493AA17E1F39115D136F9A037C704F5D329CDC36CA728:\ +170A3BF2284128B2A02097800B6A3FFEE825BFE5 +AF500080F6905D82050886CB27371AD9BDCDE1D3858E66395CBD034D8A69198AD33A762534CF\ +9C7F39B22DE123AD03ED25BEC4E73FE05A1CC506B8D06D32B0F3:\ +B79E4B7FD2A3DBCF5E9BF50D91BF651FF713DC65 +0AEE08E2D291A3D500160C74FD6A8F4C64531FCB51297E503BC4ACBA07ED629AC3CE70D1EBE5\ +B4730DDF29DED06B9E9CF8EA963718CE4BE9373C35BC1188A5F054:\ +5CD361EC04BF2F526803FEEB81E729AF5807EDAD +08D2CA90EB94205F40277F2D47DE7F52025B31B57F62DBD443BA005D6301FEE4F4DC57181C72\ +69F1FBA4210E26358C48887C09C4317CD890315BBD563C948173F6F1:\ +F788C706B2B67D4D698C2DCF99E45B1A8541D3DE + +F0B38F0505089A926595ECA3080BFFEE28929EF769577D91A8E5E2867B01EA4C58A4CE62101E\ +D2DA38D608C266346DFB5FC14800D618E958A8572B35B23393A11613C85CD443D2B4DE78D5A4\ +D641E70A23467D7CB4BBBE362AFF2AB35D1A075CA33EB619DDBC9AFC65586F077A3ADAE4B115\ +0E0FE9274280FB011F0420155E5848920D9E25D1BE66DCC670D4395FE2847848E04645C13B33\ +4E4BCB588E069510BA6D014115579706670D2D93E3080466CE6BBD07CDDB9670ACF68E4E36FA\ +17E03EC3F88910FBCE247128486B0475775AA5642812B44F444A14DC547E7D5D98527302261A\ +13FEB8BDB4A7A0FB221E1D08388B4353AE2DC7E3464969DCF12B17ED0A5E549B8FF8A8956FE5\ +FB69C1AB428BBA8CAE7E267F52CAFFFD2DCAE8F9B5D448AF548C7BE88443649254089A281A1B\ +7537896D7D4C97399F0513E3976981843E20C15EDF14378DC4425CAC30ABF7CB034B6D4AE213\ +360CCDD1C956ACC0D437C177C983EAEB9FB5F3A5DEB19CE3319C9368C2A7AF4B077A6B1BD417\ +F17E2CA36BBDA826718515FDEBBBEB5268801073457F8AC83ABD1EED888BBF218DCC4554F67E\ +FCE107A216B0540116691DAE98F34FB218969728E3165425C7EF1BB033329DDE4CD98A731772\ +7F4E6E24AFBDF39F79D71CF3C6B93E75E007500874BDD94F7484C15EC5F5A509FA4AB14828B2\ +895B0280C554600DC9834D23F824E1EC4662CC62CECDA8B9F9F31A6B4D589E5F95401644800F\ +FD2132F60CB45A91940CD420ADAA5DB3577F41E099EB79708F7A0C61D37923B503DE8810C55F\ +80AF43B4D87060070BBA4A948A41DE58E7A7DBDA9020D77F290A62F1DE6E47521C495B6EFCA4\ +0FC97FED9DE7389836F82BA05FEE66975121C38A6C7926EAED407E37CAB7E7005A891A93D88F\ +68DDE4DE9FEAE55D6FE86FF34CAF9CCD7263085C2CFA67A77FD28659FACC7AFB9734159D35C6\ +C96A755FCACB2048ACB7756696F4E481328A5A93A9D0BF8AFE0C31A98E1E6A4BED0C6CA661EB\ +7218F9C5792334121604587A86423B652FBFA1638C96CA1715164C7D074117ADB267923F06AC\ +AE45B493438BFAF384CDF7697AB0E0B75C6D21C6FF1139752143FF84F4652BAC47D44689E7A7\ +3A87E4491C0D9B8DC60D546E4350BC66BCF814ED004F202AAA9CE6E4638ADEA6B485CCAD2D55\ +FF7A597DE0662C746AEB34B36C7D46FD47A67DB75363D314B40672A6289B60F1D444090B606F\ +73A9CFE3BA46BBD3D5E629AD508D6F6592DA126E9400377D7DA41295DFA37E5654FA841A5616\ +E528C65952846DB40FDF29DB7317B8FEEE5B0F670EA0198520E58FABEBFB68BAD63709C5941B\ +A9F8DBB064EDC425B263DF4573EB6E3CADD080D9EF7BCCA048F60E163448DD6531B6B9F8CDB6\ +6CA368FE6AD9B651C51284E51253A3B64FFEE4806A0A88840BD61CA888345648D7743A060A36\ +105C88:\ +8395ABC1B17BA7BF947145EB1DF1A2050C8E78C3 + +426F74616E20312E372E32332D707265203F3F3F3F2D3F3F2D3F3F0A68747470\ +3A2F2F626F74616E2E72616E646F6D6269742E6E65742F0A0A54686973207265\ +6C65617365206F6620426F74616E20697320746865207365636F6E642072656C\ +656173652063616E64696461746520666F722074686520312E382E300A72656C\ +656173652E2049742073686F756C6420626520737461626C652C2074686F7567\ +6820736F6D6520415049732068617665206368616E6765640A696E636F6D7061\ +7469626C792073696E63652074686520312E362072656C656173652E0A0A596F\ +752063616E2066696C65206275677320617420687474703A2F2F7777772E7261\ +6E646F6D6269742E6E65742F6275677A696C6C61206F722062792073656E6469\ +6E670A6D61696C20746F2074686520626F74616E2D646576656C206D61696C69\ +6E67206C6973742E0A0A466F72206D6F726520696E666F726D6174696F6E2C20\ +73656520696E666F2E7478742C20746865206275696C6420696E737472756374\ +696F6E732C20746865204150490A7265666572656E6365206D616E75616C2C20\ +616E6420746865207475746F7269616C2C20616C6C206F662077686963682063\ +616E20626520666F756E6420696E207468650A646F632F206469726563746F72\ +792E0A:\ +D233D919F2B5358520B725F427C4F35B5D866FBF + +436F707972696768742028432920313939392D32303038204A61636B204C6C6F\ +79640A202020202020202020202020202032303031205065746572204A204A6F\ +6E65730A2020202020202020202020202020323030342D32303037204A757374\ +696E204B61726E656765730A202020202020202020202020202032303035204D\ +6174746865772047726567616E0A202020202020202020202020202032303035\ +2D32303036204D617474204A6F686E73746F6E0A202020202020202020202020\ +202032303036204C75636120506963636172726574610A202020202020202020\ +2020202020323030372059766573204A65727363686F770A2020202020202020\ +202020202020323030372D3230303820466C657853656375726520476D62480A\ +2020202020202020202020202020323030372D3230303820546563686E697363\ +686520556E697665727369746174204461726D73746164740A20202020202020\ +20202020202020323030372D323030382046616C6B6F20537472656E7A6B650A\ +2020202020202020202020202020323030372D32303038204D617274696E2044\ +6F6572696E670A202020202020202020202020202032303037204D616E75656C\ +20486172746C0A20202020202020202020202020203230303720436872697374\ +6F7068204C75647769670A202020202020202020202020202032303037205061\ +747269636B20536F6E610A0A5265646973747269627574696F6E20616E642075\ +736520696E20736F7572636520616E642062696E61727920666F726D732C2066\ +6F7220616E79207573652C20776974680A6F7220776974686F7574206D6F6469\ +6669636174696F6E2C206F6620426F74616E2028687474703A2F2F626F74616E\ +2E72616E646F6D6269742E6E65742F292069730A7065726D6974746564207072\ +6F766964656420746861742074686520666F6C6C6F77696E6720636F6E646974\ +696F6E7320617265206D65743A0A0A312E205265646973747269627574696F6E\ +73206F6620736F7572636520636F6465206D7573742072657461696E20746865\ +2061626F766520636F707972696768740A6E6F746963652C2074686973206C69\ +7374206F6620636F6E646974696F6E732C20616E642074686520666F6C6C6F77\ +696E6720646973636C61696D65722E0A0A322E20526564697374726962757469\ +6F6E7320696E2062696E61727920666F726D206D75737420726570726F647563\ +65207468652061626F766520636F707972696768740A6E6F746963652C207468\ +6973206C697374206F6620636F6E646974696F6E732C20616E64207468652066\ +6F6C6C6F77696E6720646973636C61696D657220696E207468650A646F63756D\ +656E746174696F6E20616E642F6F72206F74686572206D6174657269616C7320\ +70726F766964656420776974682074686520646973747269627574696F6E2E0A\ +0A5448495320534F4654574152452049532050524F5649444544204259205448\ +4520415554484F52285329202241532049532220414E4420414E592045585052\ +455353204F520A494D504C4945442057415252414E544945532C20494E434C55\ +44494E472C20425554204E4F54204C494D4954454420544F2C2054484520494D\ +504C4945440A57415252414E54494553204F46204D45524348414E544142494C\ +49545920414E44204649544E45535320464F52204120504152544943554C4152\ +20505552504F53452C0A41524520444953434C41494D45442E0A0A494E204E4F\ +204556454E54205348414C4C2054484520415554484F52285329204F5220434F\ +4E5452494255544F52285329204245204C4941424C4520464F5220414E590A44\ +49524543542C20494E4449524543542C20494E434944454E54414C2C20535045\ +4349414C2C204558454D504C4152592C204F5220434F4E53455155454E544941\ +4C0A44414D414745532028494E434C5544494E472C20425554204E4F54204C49\ +4D4954454420544F2C2050524F435552454D454E54204F462053554253544954\ +5554450A474F4F4453204F522053455256494345533B204C4F5353204F462055\ +53452C20444154412C204F522050524F464954533B204F5220425553494E4553\ +530A494E54455252555054494F4E2920484F5745564552204341555345442041\ +4E44204F4E20414E59205448454F5259204F46204C494142494C4954592C2057\ +4845544845520A494E20434F4E54524143542C20535452494354204C49414249\ +4C4954592C204F5220544F52542028494E434C5544494E47204E45474C494745\ +4E4345204F520A4F5448455257495345292041524953494E4720494E20414E59\ +20574159204F5554204F462054484520555345204F46205448495320534F4654\ +574152452C204556454E2049460A41445649534544204F462054484520504F53\ +534942494C495459204F4620535543482044414D4147452E0A:\ +6ECC9C5DA3C61107935336EC58F3655DB0C210A7 + +2020546869732069732074686520637265646974732066696C65206F66207065\ +6F706C652074686174206861766520636F6E747269627574656420746F20426F\ +74616E2E20497420757365730A20207468652073616D6520666F726D61742061\ +7320746865204C696E757820637265646974732066696C652E20506C65617365\ +206B65657020697420736F72746564206279206C6173740A20206E616D652E0A\ +0A2020546865206669656C6473206172653A0A20202020204E202D206E616D65\ +0A202020202045202D20656D61696C0A202020202057202D207765622055524C\ +0A202020202050202D205047502066696E6765727072696E740A202020202044\ +202D206465736372697074696F6E0A202020202053202D206D65617473706163\ +65206C6F636174696F6E0A2D2D2D2D2D2D2D2D2D2D0A0A4E3A204D617274696E\ +20446F6572696E670A453A20646F6572696E67406364632E696E666F726D6174\ +696B2E74752D6461726D73746164742E64650A443A2047462870292061726974\ +686D657469630A0A4E3A204D6174746865772047726567616E0A443A2042696E\ +6172792066696C6520492F4F20737570706F72742C20616C6C6F6361746F7220\ +66697865730A0A4E3A2048616E79204772656973730A443A2057696E646F7773\ +20706F7274696E670A0A4E3A204D616E75656C20486172746C0A453A20686172\ +746C40666C65787365637572652E64650A573A20687474703A2F2F7777772E66\ +6C65787365637572652E64652F0A443A2045434453412C2045434B4145470A0A\ +4E3A2059766573204A65727363686F770A453A20797665732E6A65727363686F\ +7740756E692D6475657373656C646F72662E64650A443A204F7074696D697A61\ +74696F6E7320666F72206D656D6F7279206C6F61642F73746F726520616E6420\ +484D41430A443A20537570706F727420666F7220495076342061646472657373\ +657320696E20582E35303920616C7465726E6174697665206E616D65730A533A\ +204765726D616E790A0A4E3A204D617474204A6F686E73746F6E0A443A20416C\ +6C6F6361746F7220666978657320616E64206F7074696D697A6174696F6E732C\ +206465636F6D70726573736F722066697865730A0A4E3A205065746572204A2E\ +204A6F6E65730A453A20706A6F6E657340706D6164652E6F72670A443A20427A\ +69703220636F6D7072657373696F6E206D6F64756C650A533A20436F6C6F7261\ +646F2C205553410A0A4E3A204A757374696E204B61726E656765730A443A2051\ +7420737570706F7274206D6F64756C657320286D75746578657320616E642074\ +79706573292C20582E353039204150492064657369676E0A0A4E3A204A61636B\ +204C6C6F79640A453A206C6C6F79644072616E646F6D6269742E6E65740A573A\ +20687474703A2F2F7777772E72616E646F6D6269742E6E65742F0A503A203346\ +3639203245363420364439322033424245204537414520203932353820354330\ +462039364538203445433120364436420A443A204F726967696E616C20646573\ +69676E65722F617574686F722C206D61696E7461696E657220323030312D6375\ +7272656E740A533A204E657720596F726B204E592C205553410A0A4E3A204A6F\ +656C204C6F770A443A20444C4C2073796D626F6C207669736962696C6974790A\ +0A4E3A204368726973746F7068204C75647769670A453A206C75647769674066\ +682D776F726D732E64650A443A2047502870292061726974686D657469630A0A\ +4E3A205661636C6176204F7673696B0A453A207661636C61762E6F7673696B40\ +692E637A0A443A205065726C205853206D6F64756C650A0A4E3A204C75636120\ +506963636172726574610A453A206C7563612E7069636361727265746140676D\ +61696C2E636F6D0A443A207838362F616D64363420617373656D626C65722C20\ +426967496E74206F7074696D697A6174696F6E732C2057696E3332206D757465\ +78206D6F64756C650A533A204974616C790A0A4E3A2046616C6B6F2053747265\ +6E7A6B650A453A20737472656E7A6B6540666C65787365637572652E64650A57\ +3A20687474703A2F2F7777772E666C65787365637572652E64652F0A443A2047\ +462870292061726974686D657469632C204356432C205368616E6B732D546F6E\ +656C6C6920616C676F726974686D0A533A204461726D73746164742C20476572\ +6D616E790A:\ +7B01AE4E25243CE9B4735729CEBB285C1853473C + +[SHA-224] +:D14A028C2A3A2BC9476102BB288234C415A2B01F828EA62AC5B3E42F + +61:ABD37534C7D9A2EFB9465DE931CD7055FFDB8879563AE98078D6D6D5 + +[SHA-256] +:E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 + +61:CA978112CA1BBDCAFAC231B39A23DC4DA786EFF8147C4E72B9807785AFEE48BB + +616263:BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD + +6D65737361676520646967657374:\ +F7846F55CF23E14EEBEAB5B4E1550CAD5B509E3348FBC4EFA3A1413D393CB650 + +6162636462636465636465666465666765666768666768696768696A\ +68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071:\ +248D6A61D20638B8E5C026930C3E6039A33CE45964FF2167F6ECEDD419DB06C1 + +3132333435363738393031323334353637383930313233343536373839303132\ +3334353637383930313233343536373839303132333435363738393031323334\ +35363738393031323334353637383930:\ +F371BC4A311F2B009EEF952DD83CA80E2B60026C8E935592D0F9C308453C813E + + +8000000000000000000000000000000000000000000000000000000000000000:\ +84B3F13B0A4FBCCE4C3F811E0313E00DCBD27431C229EFF576598BE8D1AFB848 +4000000000000000000000000000000000000000000000000000000000000000:\ +94CE3F7973AAED52C6C446BCC59BD8D43B6695FA3FDB9E3D1CC47503A432D3D8 +2000000000000000000000000000000000000000000000000000000000000000:\ +6D0855A335802F0BC20946F3C48C05B6B98C14B578020D5F42A166B97FE6F59F +1000000000000000000000000000000000000000000000000000000000000000:\ +56FD25956F759E64E853071FF01587C364EAF6286C97DA600E0BE78C701637DB +0800000000000000000000000000000000000000000000000000000000000000:\ +067DC6A810183E9069F63C2020B692C122C8D58263ED7F5C0E531504DC3B6E06 +0400000000000000000000000000000000000000000000000000000000000000:\ +4B78063B9C224DA311BD1D3FB969BBA19E7E91EE07B506F9C4C438828915563F +0200000000000000000000000000000000000000000000000000000000000000:\ +5778F985DB754C6628691F56FADAE50C65FDDBE8EB2E93039633FEFA05D45E31 +0100000000000000000000000000000000000000000000000000000000000000:\ +01D0FABD251FCBBE2B93B4B927B26AD2A1A99077152E45DED1E678AFA45DBEC5 +0080000000000000000000000000000000000000000000000000000000000000:\ +0CAD7906B177460EF96D15A612E83653862592A190F78FBB7C09F4AA89E616A7 +0040000000000000000000000000000000000000000000000000000000000000:\ +E30C1BA805347BC13F4E4E4E82658AB2C1C97BEF72C4F3D555590784C64B3587 +0020000000000000000000000000000000000000000000000000000000000000:\ +3B5C755FC2A3A868DA0A668B2704635B13E3DDA0ACFD386B4C025ACB644400C3 +0010000000000000000000000000000000000000000000000000000000000000:\ +9F911FC19889661AF03C2E9849208883BB606BEB75BB6C162FF63F65E4CA8157 +0008000000000000000000000000000000000000000000000000000000000000:\ +3EC07F4585EF5C91814F7DDCAE396DC42156DF82307C46C7AE977CFCDDBD04A3 +0004000000000000000000000000000000000000000000000000000000000000:\ +7E8BBD09E5C09DE409CDF71C4B39F59B350B4B5DEC4A45D0B6127FDF873B4602 +0002000000000000000000000000000000000000000000000000000000000000:\ +1616C4B5C8DBB446F269F2C9705B857B4A4315355A52966933E6B0E51DA74A76 +0001000000000000000000000000000000000000000000000000000000000000:\ +36258E205D83BFAD1642D88F39A6CC128CA554016DE9CF414BEF5C5C4DF31019 +0000800000000000000000000000000000000000000000000000000000000000:\ +9B885490F45E3558384E94FE2C64773323AE14BCB8F9E8E02B3FED18EB930A30 +0000400000000000000000000000000000000000000000000000000000000000:\ +3BFB6EFD3AFC93BCD7ECDE51304456C2DC0C697A337DE3FD611CBEC3B3BCC53C +0000200000000000000000000000000000000000000000000000000000000000:\ +1D8052462938001AFE80A3A2DD04EA8B28AEA9F613849C5285401B7DF2E8D604 +0000100000000000000000000000000000000000000000000000000000000000:\ +C15F125ADA3B323C7D79FB6D1C96D87CA7890C468A209C66F80B5EA223E5E533 +0000080000000000000000000000000000000000000000000000000000000000:\ +4C49B88894D742530818A686961A640CA28692C2E2AD020B7CFD86DE3E594068 +0000040000000000000000000000000000000000000000000000000000000000:\ +85BFB6E1A0AA50099696212DCE8A0067F4FC8A2C4DA0946B6106BE1DD01D7D78 +0000020000000000000000000000000000000000000000000000000000000000:\ +5D5E9793D0F89CC3A709D2FFC1B488F1FDC7CAADE69BA027EA7B44F18BCD082F +0000010000000000000000000000000000000000000000000000000000000000:\ +1EB50E78E6DFB0A4725FB71BA0443C3129A6822213F3D40DA2439FCD2BCED580 +0000008000000000000000000000000000000000000000000000000000000000:\ +F7B7700280839E9E0FF8AECCB3BE5C586DF0BD6B7BDB4AC8C8ED45AE3EEF3686 +0000004000000000000000000000000000000000000000000000000000000000:\ +2E0D44F2BE93B23ACCB8E7680FA0B58E25F48E33334481A9297C8F5E9428F326 +0000002000000000000000000000000000000000000000000000000000000000:\ +672504FFC411A43E4E9CAC5A44BB62DF4A7DA166D18E4D47607CEFAADFB667F1 +0000001000000000000000000000000000000000000000000000000000000000:\ +4A9F5FF8813D3465074FD633B060B49318D9EE98B3CF3B3F4A3C903E4AC66396 +0000000800000000000000000000000000000000000000000000000000000000:\ +C68386BCDCEF8EDF31D9ECCE2A34E006F49AE1652FF0BBDA847FF6601F762815 +0000000400000000000000000000000000000000000000000000000000000000:\ +A5FE20624689A0F3378834E922989DDAAEDAD5BF51D3B1F5E84D63778A8F43E7 +0000000200000000000000000000000000000000000000000000000000000000:\ +03DE22D278E3BE1E8FDB7DA3EE6679E6D514DEE8FC118FB27A91664CDEBED8AF +0000000100000000000000000000000000000000000000000000000000000000:\ +D1AD35A94F018CCB8E40A06FED17DB11F0638DA3F3E638108ADE5D151ECCCE23 +0000000080000000000000000000000000000000000000000000000000000000:\ +4D205614446CBDF1A8160A7182BCB24EFB32D725E016BB91D84C1E7DF55201AA +0000000040000000000000000000000000000000000000000000000000000000:\ +72171D3BFE9863D702B81AE9C69135AD007200A5A7B8DC419F884C944A309DD0 +0000000020000000000000000000000000000000000000000000000000000000:\ +3F0A6EDF24B8D9F9038B828D2F45F7625123F8A1B07E39892C86FABB2FE687D7 +0000000010000000000000000000000000000000000000000000000000000000:\ +C9BF3EEA4D22268BD1EF0027A5E1E398F0D6C4A8190BD99AD869A8796EB0CD4F +0000000008000000000000000000000000000000000000000000000000000000:\ +5706ED5B0DB45898C5C01F4C4B5360043E1029CA00B33C33E684C27C30222A1D +0000000004000000000000000000000000000000000000000000000000000000:\ +ECAB997B21788D277CFCCC07AA388C4B199AE63D6E606CDE28328EC209B794BC +0000000002000000000000000000000000000000000000000000000000000000:\ +58D2C35FFAC68BCF336A44B98AFF5740823CABAEE65865C608D487FFCFFC95BF +0000000001000000000000000000000000000000000000000000000000000000:\ +909F22C2B34103BF854580C5F2C4F64C2520AA57B492E422D1801A160B6C6E67 +0000000000800000000000000000000000000000000000000000000000000000:\ +A0FC0A816AB024C9DED26D9A474B53C66635376400FB3AB117BAB262321A1308 +0000000000400000000000000000000000000000000000000000000000000000:\ +9DEBEDEDB5B1B6A2A2FABE9104C8D3F425144F290490ED788D6B6A19994C703B +0000000000200000000000000000000000000000000000000000000000000000:\ +CBBF98775780C3B92BBC871C1D5137107BE63933D0F3FE1BE7AEE434AA5509BD +0000000000100000000000000000000000000000000000000000000000000000:\ +C1B245D91A44973947297E576511B7FC55CBCD06159CB0F111101E601B36843E +0000000000080000000000000000000000000000000000000000000000000000:\ +6986E93DBC3B044D949945C0AF3BC35ED63915E0268E9395D552D4ACBC5A79B9 +0000000000040000000000000000000000000000000000000000000000000000:\ +5FF28A82880765E64116AEC484F2B3A0EC1DBEACEC2BBC78737E5504A94C2DF2 +0000000000020000000000000000000000000000000000000000000000000000:\ +76DBB5BA9EC438D93638BFA8F62664201E29BA84BC6B1AB704D9688E89431503 +0000000000010000000000000000000000000000000000000000000000000000:\ +80D3EB7836CB04382BBAF764EEC343F07C9618BDFE98E01FD2BA2958902253C0 +0000000000008000000000000000000000000000000000000000000000000000:\ +89FF132255600368DE253F025BF92BB5AF9BF4D1FFEBB25575CE30EB77E4E4A6 +0000000000004000000000000000000000000000000000000000000000000000:\ +2012053E7AE584DEEE9B71A412FCC9351C29961E9D3972615C10EA59329A1D3A +0000000000002000000000000000000000000000000000000000000000000000:\ +414DAAED4DEFCABB5A3E4A82131B914E597522EFCE506AF7B294A14486B40ED8 +0000000000001000000000000000000000000000000000000000000000000000:\ +BC52EFFBBB3C6F7C66AD400B707CD98930A828F6B5BA3E0C71D706F42000E80C +0000000000000800000000000000000000000000000000000000000000000000:\ +6225473F5D9BAB2A34928D9F3C9891C990982718319F2408D07670A7460D783D +0000000000000400000000000000000000000000000000000000000000000000:\ +B2B2DEA4697FCEB6CC466A7859A30C2BF5C6E477F6F442A1918802BFE707990B +0000000000000200000000000000000000000000000000000000000000000000:\ +873D4CB3F71AA7704660011B30E9B573AE0E839CF0B102633F197290F19998A7 +0000000000000100000000000000000000000000000000000000000000000000:\ +DA24CF903BB826BFC026106F54EACFE50C0E8319BE205B47E181642723DA2305 +0000000000000080000000000000000000000000000000000000000000000000:\ +AFE22988EC899E95704B9E87082EE375F78DB2687478CCFBC2DFDC1E121C49F4 +0000000000000040000000000000000000000000000000000000000000000000:\ +497D0D90F9A77F1D67F0567E67F7ED60F9D324CDE0DB266E51AFD4B25CF24FA4 +0000000000000020000000000000000000000000000000000000000000000000:\ +0845CA0AAAF8F899437303A1C4A24101437DA7C90D1147E653295BA68CED2D1C +0000000000000010000000000000000000000000000000000000000000000000:\ +A1BD23817C23BA5910B9EE8404740A0CE3E81DF31A5AFCD172B4613ECB1A9B65 +0000000000000008000000000000000000000000000000000000000000000000:\ +13EA147D01F645B321E81F39D15CE4AEB9CF2E0373D6FCBBC1CA7CDCFCC40C29 +0000000000000004000000000000000000000000000000000000000000000000:\ +912E64C464286112AFC2CCD15E638707F293D8A8133E03D6795E96562D471183 +0000000000000002000000000000000000000000000000000000000000000000:\ +1AF94AA75BDB9B976831E1A6A1A7BBD14697F710E514AC4019B33815F167B555 +0000000000000001000000000000000000000000000000000000000000000000:\ +E13FCB8F649438F18530EC00DAA36A110FC641A226C3DDE990F82C4B561DA4DB +0000000000000000800000000000000000000000000000000000000000000000:\ +C8387BF8DBADF1C9BA583A8D27B620F4BD13CEE4EA2EF98BCB0E1BDFD6F3D8C8 +0000000000000000400000000000000000000000000000000000000000000000:\ +79A257D3B1260EAE2C407B55A33C28E19777C185B5254AB051442D2353B35464 +0000000000000000200000000000000000000000000000000000000000000000:\ +6552EBE29B1B037562F1888498BBB208054638E97C0C625F127C1A203EFFFC65 +0000000000000000100000000000000000000000000000000000000000000000:\ +2D77A6F16003C7F09E6DAEA5CAF4E61B9CD822CDF21A33F300EEAF33264AC67F +0000000000000000080000000000000000000000000000000000000000000000:\ +F5B8339CB1EFC7F3FCB94DCDF8BB3EC191EE016609082E47242EE6253A05DA9B +0000000000000000040000000000000000000000000000000000000000000000:\ +BD7CDCC82D46856DB3E580548999DFBA0D8BD38E0EDBB797188DE335D933C8B3 +0000000000000000020000000000000000000000000000000000000000000000:\ +D340DBC1256765FEA41925FDA295BDFEAA1055CBFEAE0FDBA8608E3116D746DC +0000000000000000010000000000000000000000000000000000000000000000:\ +49293309D25CAFC914C11063C2D1CD286A4500D519B11B4FC98500EFB85F6D9C +0000000000000000008000000000000000000000000000000000000000000000:\ +6091339D451E8F830A46C5CE040717C9D06F36AA4C5A9A8A9F1622384A6EB694 +0000000000000000004000000000000000000000000000000000000000000000:\ +6CBD66038B54D94A931006EA23DB48C300E1384CE7FA0F7CCFB8EFE2FC0AC4F8 +0000000000000000002000000000000000000000000000000000000000000000:\ +8A1A30A8F415D71BBB03C5AE3DF4836CE54CBCFD78816BCE86E0B983B059E972 +0000000000000000001000000000000000000000000000000000000000000000:\ +8039AA16A81B23F2410448563996605C13766D1E7417F4BDFBD8AD5D0D33554E +0000000000000000000800000000000000000000000000000000000000000000:\ +7549D699D3D1989D940600F25501C243E9AF21FE51EF2ADB8358C159C9E9663F +0000000000000000000400000000000000000000000000000000000000000000:\ +831F3936CACEA264EF4FAE2E36B2110F6729BAF434E61A6EE379D0C014F2DAAE +0000000000000000000200000000000000000000000000000000000000000000:\ +013EDBD6B8EA866D7AE7F553C079663CA22ACF4E21E64F0085ECE1B449BD10EF +0000000000000000000100000000000000000000000000000000000000000000:\ +D9B846387CE55AC512A1E2807AAF6F8DCFBEB462ED6D4176CC56A0B0BDFE1047 +0000000000000000000080000000000000000000000000000000000000000000:\ +0528B59ED6EBBA187A69C3C41E88120B1315CEE497BB6731191DC05000CD1E78 +0000000000000000000040000000000000000000000000000000000000000000:\ +1EBA730823BA27ECADE25B38144D339053446006EC3F66131AEE473EA3FB9E04 +0000000000000000000020000000000000000000000000000000000000000000:\ +B8AE9BF4E323C6EF3BFE75B6969EBFA68FE6C14B06481CF06869D12C555DBFA9 +0000000000000000000010000000000000000000000000000000000000000000:\ +C89944EF4886967A517064A212E38BDA5FCA80CA54E18103A75D54A6E230C694 +0000000000000000000008000000000000000000000000000000000000000000:\ +452E5D0AF5DABFDC5C74868D916F1E390A7354937785F1F6D4D0B1D72F06BD8F +0000000000000000000004000000000000000000000000000000000000000000:\ +87AD2F7F2E5DB1BE3BCC982EA058955AE34A3CF0CBF87DC4813AE5B0E6B3C517 +0000000000000000000002000000000000000000000000000000000000000000:\ +FB4635AC471CBEBE2EB3367F259232D7B62B8A6342E1BF73294FE447C3B8076E +0000000000000000000001000000000000000000000000000000000000000000:\ +9ADA02E914EB181D22E7F6D9B3F39804A0F758BDA23995E567E3A1EDFF0B60E8 +0000000000000000000000800000000000000000000000000000000000000000:\ +D41BC420CD25BA9038A4E1D1C4CEB1B05D993D0B68095F46B4BB524B72F15287 +0000000000000000000000400000000000000000000000000000000000000000:\ +329954D9CB855DD7798E587403353DD69CEBF91A5020AE5FC4D742656E4CAD0B +0000000000000000000000200000000000000000000000000000000000000000:\ +7FF37D832DB4DA7CC3473FC3F0B263949630F21DFD8522A544994C5A3B12644B +0000000000000000000000100000000000000000000000000000000000000000:\ +7F27BEE720048484188F774D660D86276B6383AB2E40990F181E5349DC72FC52 +0000000000000000000000080000000000000000000000000000000000000000:\ +AAFCA0AC1D6C80EE40FB43FAD51F006D39DE0A101449B450A3E0FD9D44FE0230 +0000000000000000000000040000000000000000000000000000000000000000:\ +941A10F2333950E3501C6229C085A54185E55A1017C9B8DFD9187B614371884C +0000000000000000000000020000000000000000000000000000000000000000:\ +FA7862ED967E19EC63F91344184684099C7BD734EDF810509E2FB308FE5DAF16 +0000000000000000000000010000000000000000000000000000000000000000:\ +E5C92E4C6590AD2F982267BE2B13E110C44D9C69E93516F594B7E433A0E93AF4 +0000000000000000000000008000000000000000000000000000000000000000:\ +0656DD98DED7D764BCDEE4E96A9699E70974AE77CF72F166B7A979B707F1878B +0000000000000000000000004000000000000000000000000000000000000000:\ +1FA047EFED4A196A9B538C099E50B67A0F537897FCA6F0AEB386F43E65D48A31 +0000000000000000000000002000000000000000000000000000000000000000:\ +74BF1C0E1DA85358FA86ECBBAB419C9223F41D47702583593CD01539E861DB73 +0000000000000000000000001000000000000000000000000000000000000000:\ +846C472932FDA94B56483E7A903C6545B5CDE4FE5D0A2FFA03B52AD53570D54A +0000000000000000000000000800000000000000000000000000000000000000:\ +E78743B610392B52CD122071F9071A8E9C35AABEC0BD63C73C5FD12171838B32 +0000000000000000000000000400000000000000000000000000000000000000:\ +4A435A44A2BE1F40D8E6A1F7C332C5330EDE4E0F55505304E571B4443255A5A9 +0000000000000000000000000200000000000000000000000000000000000000:\ +18122CF13AB2412FA65CB693713794DE6B30403B65688234A6FA940FC6D506FF +0000000000000000000000000100000000000000000000000000000000000000:\ +BAE3E67A9D5505A5685EBB52B8510B44315C0FAA422F0EBFD4EF3413490248FB +0000000000000000000000000080000000000000000000000000000000000000:\ +B7F300939FCC6EA45A8920C7B8D3F18E753C0076062E4A499B69AF96328CEAF9 +0000000000000000000000000040000000000000000000000000000000000000:\ +7E5AAFC21B6238FFFC561283AC2B592C1F5BB35237061629AC9A4AF7153CDB3A +0000000000000000000000000020000000000000000000000000000000000000:\ +B98F3C9FA25CC07AA02F7456E15C7707DA6702628AB589351B8737A814DBCB9B +0000000000000000000000000010000000000000000000000000000000000000:\ +B01668CF19C69B22737F7409EDE201CC37BF1B23FC0630FDA9364652171389AC +0000000000000000000000000008000000000000000000000000000000000000:\ +A8BBE8B393AB0E3D0E822C8AB9F23B8F1C985E93E6EC17050CC6A0D82B27A078 +0000000000000000000000000004000000000000000000000000000000000000:\ +FB246A9EEC0AA00A971416718CF0BB789F44496183642024C5A3C8043C5E72F0 +0000000000000000000000000002000000000000000000000000000000000000:\ +5937034D4C6184BC32CEF38ACA4BCEA720F3D3061191D1E0EB5C84E242C7DEEF +0000000000000000000000000001000000000000000000000000000000000000:\ +C0DEB1F9A2060A3CE111BC6C36DDFDEAED2713229EAC55C75608B9272E10B78E +0000000000000000000000000000800000000000000000000000000000000000:\ +08CC99BD1C9E6C2AC03DD17C7BE3F0D744AAC4144D542D2F4D2F3366837E030E +0000000000000000000000000000400000000000000000000000000000000000:\ +B5026F002368EFAB1FC2AA97BE628698C41DB381B44F8BC2C8BE3635C8F0BCFA +0000000000000000000000000000200000000000000000000000000000000000:\ +98A020137D37236B11D0ACFEC699107679EAF0339E8C0AAB3AFF1538296F754E +0000000000000000000000000000100000000000000000000000000000000000:\ +A30B09A7870D5FCF10704CA8A00083FF4ED2D0B78F530161C698A0DC272C5F12 +0000000000000000000000000000080000000000000000000000000000000000:\ +C4CEF7219FBA14B0515FF84CA552273E471EFB23A26274778C11D0FB61805A8D +0000000000000000000000000000040000000000000000000000000000000000:\ +0F70F20E2513A79AD1D153C98981D5CD21DE4C134977658D1C9C4B4367A73F99 +0000000000000000000000000000020000000000000000000000000000000000:\ +690A81F1FE0464FAB24A2E9861C24E52087D902B2DFB344713B42285051E5C81 +0000000000000000000000000000010000000000000000000000000000000000:\ +403E430C39EECA88D967926B543A06FBB68654C348801FDE7466F34A5579E2ED +0000000000000000000000000000008000000000000000000000000000000000:\ +715623D0A82109017F74E8DE00BF5B700BC6C161CA403CDEB9A09B659268B779 +0000000000000000000000000000004000000000000000000000000000000000:\ +6E367FF2768A6D4C980D7D1B75F312663CB816E5C0191A8839F6F9E50A44853F +0000000000000000000000000000002000000000000000000000000000000000:\ +81F33A1BC1018F2C4886865F55AD2FDDD891160D06717805F2687155E26DC2E4 +0000000000000000000000000000001000000000000000000000000000000000:\ +1C074CA4ABAF8B662D0C75635F84FE4ED9011CE476C45F8214F798438E1CB9FD +0000000000000000000000000000000800000000000000000000000000000000:\ +003D837BBB718E13778188399EACD53DF9781EE8AD3F77BBD35F5B617D38AB24 +0000000000000000000000000000000400000000000000000000000000000000:\ +37212E518E30D555EA442EC7467B1E95DC06371C9784705D0D885D1C61981029 +0000000000000000000000000000000200000000000000000000000000000000:\ +74119615B3146E59D08DDDF07CF0614264D73F2118CF4A5CECFBAA691B005F2B +0000000000000000000000000000000100000000000000000000000000000000:\ +3269AEB6831504CB8679EA40F749072951EB1728CC5E21E45FD0D6B423F6FA42 +0000000000000000000000000000000080000000000000000000000000000000:\ +D504FD065F8D2BCD3D1D3A4B298328E09F1CB44E3106D156477E992AABE9812C +0000000000000000000000000000000040000000000000000000000000000000:\ +8AA4012B4573828D21C20AC64D18A6EA73DA0347B5D1A71442091CA48655DB70 +0000000000000000000000000000000020000000000000000000000000000000:\ +650189D78DE4CF754ED237A9DDADD9686B58D85D06D82E937DF6075F4CC87642 +0000000000000000000000000000000010000000000000000000000000000000:\ +D140E61D738C3298875886B8D8DE576E48FF5C7E9F4D0E66D0149D0BDEE19F49 +0000000000000000000000000000000008000000000000000000000000000000:\ +59E7ADDB5E068640DE3F8FB015017E7AA7495430D2533F87D4ECE9F7EE548FA3 +0000000000000000000000000000000004000000000000000000000000000000:\ +5481B8528EF488D0A4ED259244306AFF83145B7D675E159EFECE21DEF7561297 +0000000000000000000000000000000002000000000000000000000000000000:\ +671EAA12D76BE21EB2CED2F61AC1E98DF94C1952C2CDFC047895C74F15A7F3FA +0000000000000000000000000000000001000000000000000000000000000000:\ +6CC4F0E930B34481D03A4134331852EAED66667E3B3D8605F7CD3777551D2B6F +0000000000000000000000000000000000800000000000000000000000000000:\ +58A971DF91F981284DFCA88C6A21AB89D4E6A12E0D8A1E12BB585EB697D597E3 +0000000000000000000000000000000000400000000000000000000000000000:\ +AFE25F910412D62DB9FEFBAC5CAF3D240153725FFF1B8D85FF835BD418028738 +0000000000000000000000000000000000200000000000000000000000000000:\ +AC99C31BFF7B16E8916E8ED5C969CE7DD1B7A4A009F2F03EA8FB240B1AB16CE5 +0000000000000000000000000000000000100000000000000000000000000000:\ +85A6CECFA95E645104A45E2E34E98F92039ED921ADF65E78631E270548521637 +0000000000000000000000000000000000080000000000000000000000000000:\ +1C686E808A38E9D3D800AB94F8EF98888FA959593FE9A78850EE01CCABF170B9 +0000000000000000000000000000000000040000000000000000000000000000:\ +058AE81BE2477D2BB0EF309F69713D68196A0A9D758BE3814B565088FD752AB3 +0000000000000000000000000000000000020000000000000000000000000000:\ +5B1919A40F9A5AEF568E1E24B414A85C0D60D1DCABAA2CCECA09A91D78A91D15 +0000000000000000000000000000000000010000000000000000000000000000:\ +FFD4927E8C35AFD614A39AEC5654A8CEF3CFB47B737BCD55342BFDA0B9D81E53 +0000000000000000000000000000000000008000000000000000000000000000:\ +D47A6B8BDBA65DDF5820DBCB3F1733018CFA0A3A278540C7FBD575E36E20F063 +0000000000000000000000000000000000004000000000000000000000000000:\ +9D8A03520FC2F2653AC52B7C0DA06F5436858A811E5F4B2DB0B2182C2C8F6D12 +0000000000000000000000000000000000002000000000000000000000000000:\ +13A17E3E7C07F58935075A41B2B5B332CC64F7099E320430DBEF41685DD95B27 +0000000000000000000000000000000000001000000000000000000000000000:\ +9250C7028C00AAD64F1A1140F4DE8812608FCF15F3E91AB886C911E71BD41324 +0000000000000000000000000000000000000800000000000000000000000000:\ +C019BC0605ED4157C8D3E4761BC74D403558E426D04403B17C9923AA5A732C48 +0000000000000000000000000000000000000400000000000000000000000000:\ +524FCBE1456CE1D535E6E75098F7A817EEB99F6D3B77A9705BF40674E84AEAF6 +0000000000000000000000000000000000000200000000000000000000000000:\ +F4A5E902E2633F78A4AD90C9305DCA8CCFF31A8CE6FE8DC3755A591D201BB51C +0000000000000000000000000000000000000100000000000000000000000000:\ +BB242C3D49140119969CE07F0021E400ECDCBDEB3FC8C92459EFF346878A6FF6 +0000000000000000000000000000000000000080000000000000000000000000:\ +362B9130763C98696ACE92E946F2646EDB7A9D419CBE12ABF9CB40B9BBDB32DF +0000000000000000000000000000000000000040000000000000000000000000:\ +6BF88E66479D09985823F2B87BD7DFDDA415442B5132B2482F9B092CD3FBAA4A +0000000000000000000000000000000000000020000000000000000000000000:\ +DF6777DF2585349325132C5A6AB16481498BF9A1957EBC2F113095669C7AFE96 +0000000000000000000000000000000000000010000000000000000000000000:\ +37108D63C635FF214AF8A98DCA6A3E288FA14EA8F5E8C52A583B6F12BDBA3CF5 +0000000000000000000000000000000000000008000000000000000000000000:\ +C22FAEF7E57A7BF3E344132436FAE85BD59A9BF4AE01DA2545A6EE3779773AF2 +0000000000000000000000000000000000000004000000000000000000000000:\ +A1947F12BD61D72067884D47AC2C8DF8541FBB4A9EB2D0F1A8F6997207819AE0 +0000000000000000000000000000000000000002000000000000000000000000:\ +DDA4ABDAD1290FD66A171D9724A409B02612F8606C58D85D530F30E7CEDEA3D2 +0000000000000000000000000000000000000001000000000000000000000000:\ +658FCE7342D3C8E1EDEBD0EF0B72612346500B72CEEB1AEED11845F1AD1401F6 +0000000000000000000000000000000000000000800000000000000000000000:\ +518EE98053E9D1F1F42F9E59DD74A6D9AA0D1F1FDDDD4F799134B4C111226D98 +0000000000000000000000000000000000000000400000000000000000000000:\ +1F2513F0CD6195005B81727F7784B1F109C2F680A5E3343A9EA0FAC21F35BAB6 +0000000000000000000000000000000000000000200000000000000000000000:\ +2D05A4ED553CBD1F532EEA35D158F01F2867D49A7120ABE733A5F6C2E5C92C21 +0000000000000000000000000000000000000000100000000000000000000000:\ +0BFC42AE0F93D32617BB3C7CF8E4A6515AA8668922E05AF39A27CAE39F9CA221 +0000000000000000000000000000000000000000080000000000000000000000:\ +C3F2631B8F76C94534ABDE0EB456EFA47DC43B08F7CDBE379622621B28458915 +0000000000000000000000000000000000000000040000000000000000000000:\ +9C15E4A671EB6E390BDB67AC4441DA8CCC9E56AFE28B8BCC928FC6F3E552569A +0000000000000000000000000000000000000000020000000000000000000000:\ +EFD7A7E53F7F21FE9B9D4A5BF3BE5AE7ADB0947F8412BE25F7E88A45743E6FB8 +0000000000000000000000000000000000000000010000000000000000000000:\ +A524AC0D0DACF565BBA3B84015D995202E1F67409D63FE16D442CAF5C72C3D3C +0000000000000000000000000000000000000000008000000000000000000000:\ +80073614FB76A09C3DD701E83BE717117A3694D05331B032F8104CA241F11482 +0000000000000000000000000000000000000000004000000000000000000000:\ +C475A4C797002B5C66A21DEF4295CDC4C9DE4F045FB0FCE7A1BDB977224BAC97 +0000000000000000000000000000000000000000002000000000000000000000:\ +6D8547CABF8F0AEAF7A9B3598CBA769F545C61E8873FFD6D5E7EE9C1C5527F95 +0000000000000000000000000000000000000000001000000000000000000000:\ +7187108D9F4506C15B5E6AD523167BD2BADABE69242EB6AEBCFE52F70874E757 +0000000000000000000000000000000000000000000800000000000000000000:\ +A195EAA4E6377B4C0360C343D52F82704BD85BC5905D669C5E4ECA7C1F028C88 +0000000000000000000000000000000000000000000400000000000000000000:\ +72C72361133DFFEBFD3EBBB8FDC6B76DC530AA7FF5E22EE709B65BE866DACD86 +0000000000000000000000000000000000000000000200000000000000000000:\ +20F3BF2E8F3876FA733F41CECFDA7C641CE579B8ACE9DFE06A64A4BA72BFA901 +0000000000000000000000000000000000000000000100000000000000000000:\ +D3B0F2A184D2AEDACC760448DC351B63E975D5E48444320733F19381EB973659 +0000000000000000000000000000000000000000000080000000000000000000:\ +25D380557DDACD3761FED7B1EF2AD9B2CB25EF263DDDC08E34646EFBB696F718 +0000000000000000000000000000000000000000000040000000000000000000:\ +7DF39F3B439912E4859500ED516F4096EF60A96911F626052B3315416C307F90 +0000000000000000000000000000000000000000000020000000000000000000:\ +D05070BC61FC95F05359B8B36C70DB0E3D5FC077F73C02CCF4310A24C91A0F33 +0000000000000000000000000000000000000000000010000000000000000000:\ +CD3683D700693575FBB3355F844458ED60B1A45294CD27CD380A9A10E660E407 +0000000000000000000000000000000000000000000008000000000000000000:\ +AB19432215B64F93A344F7E6A46B386C4AC159924AB4A6F366FB8552A96DBCE6 +0000000000000000000000000000000000000000000004000000000000000000:\ +1F6B7158C0B0A4311FBEF86E39BD812BC94207D154B9CB2380433F16F6821B7B +0000000000000000000000000000000000000000000002000000000000000000:\ +E65A4E3567D420D98EF51C29405AB004A019D794C51A67A680F6D54F21F08E5C +0000000000000000000000000000000000000000000001000000000000000000:\ +53382A486C2390F7FF94A33BAFCE7285F382BDB5BED4FF076D7A161B169D6B4A +0000000000000000000000000000000000000000000000800000000000000000:\ +9E36673A278E023992B653AA0683CE64BA7CCE51239E091C80D98BC627B45A00 +0000000000000000000000000000000000000000000000400000000000000000:\ +AD51CB9156C8CB66C202133E098061688A0360EA0E5B49A9F47EB00C346EB1F4 +0000000000000000000000000000000000000000000000200000000000000000:\ +9DD8990FD868111F6854AC54D85BA38B9B0BE3E02037B4A3DAD2D0D9E89DBCE3 +0000000000000000000000000000000000000000000000100000000000000000:\ +8A4A51AEB3BFE9FEECD9F4AF22D2D34C534F3A2B127E959236407206A4E1DB2E +0000000000000000000000000000000000000000000000080000000000000000:\ +32F59D1C8E62EE49BEDCCF59007194EEBBC698B888050723C5325A746463E3C2 +0000000000000000000000000000000000000000000000040000000000000000:\ +FCCD7332FBD25CE39EE7522F432185F2322EF05CF1F5E36A2458272FF1397A0A +0000000000000000000000000000000000000000000000020000000000000000:\ +62775BB6A290E509389C0EA6BAE5C8567A0E034A813F9AD62666B4871D8FACA3 +0000000000000000000000000000000000000000000000010000000000000000:\ +264AF724EBD387076F1427EAF7D7E94734A209DDFFAB1BF455528D8BFB548681 +0000000000000000000000000000000000000000000000008000000000000000:\ +96FC8FF80897ED6F514A67FB4FA5CF9D53814E305FED248BAE6B5761A331E0C3 +0000000000000000000000000000000000000000000000004000000000000000:\ +F98B7C970726889639C19C75FA4E63BFF6D48063806A19EA4584B84F3C40079B +0000000000000000000000000000000000000000000000002000000000000000:\ +76CA7485A665D0B76ABBB2909B193D8F8572C8DB77F969256480F63728ACA867 +0000000000000000000000000000000000000000000000001000000000000000:\ +8004B9B6A39295D73D00759682C72DE9A49E7278189CA9A1D704FFFDE8F8AECB +0000000000000000000000000000000000000000000000000800000000000000:\ +98177F21E631C18FD21733C5BCCF33243970AC5EBDBB19A257DC96BF43D5151A +0000000000000000000000000000000000000000000000000400000000000000:\ +DCE21D3195A4B65B3B2C3EF0A954A157785C8CA4FD195AE15BD7F420D9D5CE14 +0000000000000000000000000000000000000000000000000200000000000000:\ +EDC0E40C3027D41914BF3144A08078742B337B96DA8E503D4FF84BB6A8E97D55 +0000000000000000000000000000000000000000000000000100000000000000:\ +013F21DD7052786E2C338B57F23EC2C7FEB0C12F7B3B28FBB5AFFACA27103F51 +0000000000000000000000000000000000000000000000000080000000000000:\ +BF8362CE587255D74A374DE2775680C02A02B2106D05EB9B1EB83BC88A9C97EF +0000000000000000000000000000000000000000000000000040000000000000:\ +CA72BC9BB4F0F6E2DDD3D641D94A62163A066AF9D77AC3937CB00D134DFD46F2 +0000000000000000000000000000000000000000000000000020000000000000:\ +6B42A2D46EEBC60C0238517A9F2B78BA27CE4B87ED35261FB0A0DEDDD39DC753 +0000000000000000000000000000000000000000000000000010000000000000:\ +D441092F524AE16D1339E78FB13892732A5975705F90F82E54EE09D80448E49D +0000000000000000000000000000000000000000000000000008000000000000:\ +C7F6DFA7F3E4F92D6C20AEEAE921FA209685D0C20714D69A95D1F94FA41D097C +0000000000000000000000000000000000000000000000000004000000000000:\ +300223DF08C84B22C569FC15ECAC264F9D1CFDAD758962B406C757FCA69D0A0A +0000000000000000000000000000000000000000000000000002000000000000:\ +FB81B52E00690B2F03F8D410A357E582F6F4367D4359FE7DD7CC6C6A3AD24CEB +0000000000000000000000000000000000000000000000000001000000000000:\ +BD5ECECE8B8CBC564A91294968C3BE209B15730CF7594D2B79BEE0D44391BE7E +0000000000000000000000000000000000000000000000000000800000000000:\ +80179FB24A6EEC0173DAF26891251C3054EA8D7280F88D4C57A3F52B5F1AA388 +0000000000000000000000000000000000000000000000000000400000000000:\ +59C6F16A4878FC819F3A3CDFCF7C5A8CEAFE9231CE259A7F9E377E3D8B41C16B +0000000000000000000000000000000000000000000000000000200000000000:\ +B18656E3D9D293F342A9A4B88884BD9A650D72368C1703B74ABD2D4ADD1B6A5A +0000000000000000000000000000000000000000000000000000100000000000:\ +A7213DAEEBA47277122DFC9FFADBB36881C6FA9C89293D2291407522639E017B +0000000000000000000000000000000000000000000000000000080000000000:\ +33D62D3A60AF659D70978E12F6AE01D6D62686965288B584796B6AECC37167B7 +0000000000000000000000000000000000000000000000000000040000000000:\ +3F2F1919206CFBEBC68DB1BD552D78AFF61F5AD296AF45F15145E176CD4E93BF +0000000000000000000000000000000000000000000000000000020000000000:\ +4ACA600624783F035871A05365EDFD0D01A67C9DD59D38A68117474D81F4A93E +0000000000000000000000000000000000000000000000000000010000000000:\ +9B352CDE8F0BDEFCC8B1F37D34B3641FF6F55C05FF5193928402ED95C986D1CD +0000000000000000000000000000000000000000000000000000008000000000:\ +B14B9519FE51B738F81BA61AE48723835412B544F41E8CA4D3C2BE8B8E7B7ACB +0000000000000000000000000000000000000000000000000000004000000000:\ +AFF464673EDD86FED0C0CC97BE3DE9375E61503680B17AC4FD44AEDC02EF086C +0000000000000000000000000000000000000000000000000000002000000000:\ +B600CCFEC9DDAE068109C82B0B7BA3632501857EB23CA7860FD26F3BC1335697 +0000000000000000000000000000000000000000000000000000001000000000:\ +884AA440D0320D6FB74A8B02BBE5F7DF50CC4B83571523CDC4A2683776AD6218 +0000000000000000000000000000000000000000000000000000000800000000:\ +C20D94291275F858E53FDC834B0E02FD496145B8713F53555E863425A61D1E88 +0000000000000000000000000000000000000000000000000000000400000000:\ +B1087C12C70D6224460202DA3FA5B985D3D2B130F2347D6BC7DC7668856EF5B8 +0000000000000000000000000000000000000000000000000000000200000000:\ +BE7F81F61289AFD0E08467938F054F69D2795E570D0F5C7577125BD37D72069C +0000000000000000000000000000000000000000000000000000000100000000:\ +D7E79AEEAEF9CDC5889C68E98DCC7C1D85172D0F183A62815DF0104CA67F3068 +0000000000000000000000000000000000000000000000000000000080000000:\ +ABCAB82BD056C3A975C8CC78B160B1A726EA2D58DC8775EC9CC1E97B1887263A +0000000000000000000000000000000000000000000000000000000040000000:\ +716A3871C88D6C0D6AB03C6C925CA5B0FEC9816CB393BE5226E387048DC379AA +0000000000000000000000000000000000000000000000000000000020000000:\ +046284F44965FFE307372B5EAA47D0DCFC282B13B1D13FEE3786A0A2173CA034 +0000000000000000000000000000000000000000000000000000000010000000:\ +0316CC9C233290D72C53938CF8D216E24447D95114C3F9BBF2FA508EEA9E72CB +0000000000000000000000000000000000000000000000000000000008000000:\ +388A34BA91711C31E14675BBA6CC29A157237E2B1B6095B02A49373A8ABF43B3 +0000000000000000000000000000000000000000000000000000000004000000:\ +CCFC11FC56D48DAF0F233275E9E591B76758CE6099465FA3E8B925FACC8C1D87 +0000000000000000000000000000000000000000000000000000000002000000:\ +F1C19314208EC565B4E50664B650FC0D256B4EB5A177ACDCCEFC78BEF7543A6C +0000000000000000000000000000000000000000000000000000000001000000:\ +954A6575B642BDDDD05409CF5973BA837F25B2E391950BE91FA23334093D88F5 +0000000000000000000000000000000000000000000000000000000000800000:\ +D8C9AE155F36F1EDD6A9A0FBCE9D8A2D97EFC4896EEAB31FA4B2A267F10F83D7 +0000000000000000000000000000000000000000000000000000000000400000:\ +E1291A0E2D900F2D61C7B915EC60CB2F26C58DE63B0DA7F1AA1F40FB609C7261 +0000000000000000000000000000000000000000000000000000000000200000:\ +18DA34910AFFCD9B1F0B80D57B2B545DBD3FCBB9327B0744553B0AE309D01F2E +0000000000000000000000000000000000000000000000000000000000100000:\ +0B07727D83B28795BD6CBBCCBEBEA5CDEDF3430C407723FD2F5270BED6F574B7 +0000000000000000000000000000000000000000000000000000000000080000:\ +6580335A2908A8845A95E26E793D522451579D91C90A4C92D8667361957C4FA1 +0000000000000000000000000000000000000000000000000000000000040000:\ +34B59ECBD01296EA9FE6C2F1E22AD83AE34AD9917F762E5AE194700A95F5B08B +0000000000000000000000000000000000000000000000000000000000020000:\ +8C7809B15F5525F59885E518A954871A34A4850A0C5AC531CB5564C91D10FA81 +0000000000000000000000000000000000000000000000000000000000010000:\ +A1F386B9AE9B170E1F02E3FA611B991E4A383E1D998FC03F1026028B70C5FBB9 +0000000000000000000000000000000000000000000000000000000000008000:\ +25E947AAA44B7574BCE0D0AC4D91D63489A7837F6AF73764EAB3CC83EFF2B01F +0000000000000000000000000000000000000000000000000000000000004000:\ +1B85D67D1481C20BACB50AEA0C506AFFA04B258C049A8CBA641DD4D3A0ECE1A1 +0000000000000000000000000000000000000000000000000000000000002000:\ +CBC332EC5110FEAE214FF569FECA4BEF1B3CEB809F0E2362E3924A762153785C +0000000000000000000000000000000000000000000000000000000000001000:\ +0193D8FF39177FC604D8C0E60D5495222DA10CD84D4AE6D12BF84CA923158B31 +0000000000000000000000000000000000000000000000000000000000000800:\ +B6A210AEB8D431276712B83DFB27A338166436C37B13E533E6A664BC0696E21E +0000000000000000000000000000000000000000000000000000000000000400:\ +F1337369C5303A28DA9132C4562C7D1D7381E3F30575F05C72DD3E969CFCA5EF +0000000000000000000000000000000000000000000000000000000000000200:\ +5BF54EC3CE05919EFEDDEE2AE288118DB06A3AED340D89CFE279D0C6927CD336 +0000000000000000000000000000000000000000000000000000000000000100:\ +084E640FA57CBF5F097FD08636FE5E98E23839D95C532099EFE1A7A838DBAFCA +0000000000000000000000000000000000000000000000000000000000000080:\ +63794A3BF8875AC2C32BA6238D27E7E15E56A3B794B8D2D6AEC82FAEF2360E3A +0000000000000000000000000000000000000000000000000000000000000040:\ +D9ECE2CD2214F52C55DCD9BCA56A900EC79C1343F12DF8A60F0298D255896B61 +0000000000000000000000000000000000000000000000000000000000000020:\ +9633190BF775667487569D0F5E7ADFEBC899E55AB9D62AAABE9F8754A3FA9C20 +0000000000000000000000000000000000000000000000000000000000000010:\ +A3ECDE0C1D9DAA6B7A949C87A1AF7963C69CB2C412FB3086C495F14630C17B7B +0000000000000000000000000000000000000000000000000000000000000008:\ +38DF1C1F64A24A77B23393BCA50DFF872E31EDC4F3B5AA3B90AD0B82F4F089B6 +0000000000000000000000000000000000000000000000000000000000000004:\ +E38990D0C7FC009880A9C07C23842E886C6BBDC964CE6BDD5817AD357335EE6F +0000000000000000000000000000000000000000000000000000000000000002:\ +9267D3DBED802941483F1AFA2A6BC68DE5F653128ACA9BF1461C5D0A3AD36ED2 +0000000000000000000000000000000000000000000000000000000000000001:\ +EC4916DD28FC4C10D78E287CA5D9CC51EE1AE73CBFDE08C6B37324CBFAAC8BC5 + +[SHA-384] +:38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07434C0CC7BF63F6E1DA\ +274EDEBFE76F65FBD51AD2F14898B95B + +61:\ +54A59B9F22B0B80880D8427E548B7C23ABD873486E1F035DCE9CD697E8517503\ +3CAA88E6D57BC35EFAE0B5AFD3145F31 + +616263:\ +CB00753F45A35E8BB5A03D699AC65007272C32AB0EDED163\ +1A8B605A43FF5BED8086072BA1E7CC2358BAECA134C825A7 + +6D65737361676520646967657374:\ +473ED35167EC1F5D8E550368A3DB39BE54639F828868E9454C239FC8B52E3C61\ +DBD0D8B4DE1390C256DCBB5D5FD99CD5 + +61626364656667686263646566676869636465666768696A6465666768696A6B\ +65666768696A6B6C666768696A6B6C6D6768696A6B6C6D6E68696A6B6C6D6E6F\ +696A6B6C6D6E6F706A6B6C6D6E6F70716B6C6D6E6F7071726C6D6E6F70717273\ +6D6E6F70717273746E6F707172737475:\ +09330C33F71147E83D192FC782CD1B4753111B173B3B05D2\ +2FA08086E3B0F712FCC7C71A557E2DB966C3E9FA91746039 + +4142434445464748494A4B4C4D4E4F505152535455565758595A616263646566\ +6768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ +1761336E3F7CBFE51DEB137F026F89E01A448E3B1FAFA64039C1464EE8732F11\ +A5341A6F41E0C202294736ED64DB1A84 + +3132333435363738393031323334353637383930313233343536373839303132\ +3334353637383930313233343536373839303132333435363738393031323334\ +35363738393031323334353637383930:\ +B12932B0627D1C060942F5447764155655BD4DA0C9AFA6DD9B9EF53129AF1B8F\ +B0195996D2DE9CA0DF9D821FFEE67026 + +[SHA-512] +:CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE\ +47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E + +61:\ +1F40FC92DA241694750979EE6CF582F2D5D7D28E18335DE05ABC54D0560E0F53\ +02860C652BF08D560252AA5E74210546F369FBBBCE8C12CFC7957B2652FE9A75 + +616263:\ +DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A\ +2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F + +6D65737361676520646967657374:\ +107DBF389D9E9F71A3A95F6C055B9251BC5268C2BE16D6C13492EA45B0199F33\ +09E16455AB1E96118E8A905D5597B72038DDB372A89826046DE66687BB420E7C + +6162636462636465636465666465666765666768666768696768696A\ +68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071:\ +204A8FC6DDA82F0A0CED7BEB8E08A41657C16EF468B228A8279BE331A703C335\ +96FD15C13B1B07F9AA1D3BEA57789CA031AD85C7A71DD70354EC631238CA3445 + +61626364656667686263646566676869636465666768696A6465666768696A6B65666768696A\ +6B6C666768696A6B6C6D6768696A6B6C6D6E68696A6B6C6D6E6F696A6B6C6D6E6F706A6B6C6D\ +6E6F70716B6C6D6E6F7071726C6D6E6F707172736D6E6F70717273746E6F707172737475:\ +8E959B75DAE313DA8CF4F72814FC143F8F7779C6EB9F7FA17299AEADB6889018\ +501D289E4900F7E4331B99DEC4B5433AC7D329EEB6DD26545E96E55B874BE909 + +3132333435363738393031323334353637383930313233343536373839303132\ +3334353637383930313233343536373839303132333435363738393031323334\ +35363738393031323334353637383930:\ +72EC1EF1124A45B047E8B7C75A932195135BB61DE24EC0D1914042246E0AEC3A\ +2354E093D76F3048B456764346900CB130D2A4FD5DD16ABB5E30BCB850DEE843 + +[Skein-512(160)] +:B034BCC065B01B0C486159B3DBA3E03AA52FDD70 + +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000:\ +3DC1772828D7D723A170B0317CF3E4BC15A30ED3 + +[Skein-512(224)] +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000:\ +2B718DF0B6C720A58F1875A0FA602247AA2563C51503229AB0310DE6 + +:\ +7AA86748769C688C43B5DAFE45B267DC057B89FDE6BC3EBF5274D6FB + +CC:\ +E4E4D51523F7667C0204D4EFF24B12A77AC1E86DCAC42BD5F570C69E + +41FB:\ +C91BB6F83D34DC3202CA2D35902D3DEA2099A3A77C39722341AD1102 + +1F877C:\ +7A606D82C208B19CB9C35793C91E7167FDA464E3056DC6F6EB4B7DBF + +C1ECFDFC:\ +7F1A5454AD65FA1DA2C35A6966F79B313AA3F7421F25E2B9C17ED036 + +21F134AC57:\ +66FF42A3C5FD93FB3DC6ACF4BA936E7975A1101942BB96F86BE63598 + +C6F50BB74E29:\ +C0732BA73E4E8F49D990000122AECCBC9DD7C62F1B84586C04B2CA97 + +119713CC83EEEF:\ +BFC1F706A79037EE0FF2896FCBA0C2E891BB53EE00AB81A7187FB135 + +4A4F202484512526:\ +657C8557A264BEED5F0E4D63821CD23DA9A141D40CE9E4EA5C494193 + +1F66AB4185ED9B6375:\ +6CB0E36907DB405784B1B16027C1EE218881BF47E4665EB34D49F493 + +EED7422227613B6F53C9:\ +210C03C1D282980FCDA5D3E99D8EB7C0EE6DF2A1EF88CEA189F3ED3B + +EAEED5CDFFD89DECE455F1:\ +BB6AAB5B0F5992493C54FEA44A7A62D135F28D0E146E114494006726 + +5BE43C90F22902E4FE8ED2D3:\ +129D08AFAAC4997AA4EA9694F17E9B77B945A13A944A1A9D78BA0FBE + +A746273228122F381C3B46E4F1:\ +5A540119ACCE26D6B741802874D6B98F21794EA0588617B598126392 + +3C5871CD619C69A63B540EB5A625:\ +568E96915FE801E45171A07D0A8CE3DBC4D5BEC71CCB3C06EB78647C + +FA22874BCC068879E8EF11A69F0722:\ +512F863E0C1FD2E4D916EC2FFDED958687964D5FE43E058EFF63B001 + +52A608AB21CCDD8A4457A57EDE782176:\ +FE2AA246026EFADD6D4A3F8DE3C07BB4BC18CF260910E5A0B0B98CDE + +82E192E4043DDCD12ECF52969D0F807EED:\ +0A6FC81E4936511F0FD9186495B39A32B6867E7A524EF2AA05F55348 + +75683DCB556140C522543BB6E9098B21A21E:\ +BB439DF50CE268CE0640091E2DB3BEAF3EBBF1373C247A2E90E2C989 + +06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ +0A5C2E588978B2A327D2115D425B9F407CFEC582F4939A849AC25CFC + +E26193989D06568FE688E75540AEA06747D9F851:\ +DB357210E767B9ECAF25D573ED94DC1B6CD3D523B576025A77CB6CB5 + +D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ +FDC36CF68208BFF974D8AAF9B2ABDB59E2C9CC5F2154973F7B4254A0 + +57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ +427AEA70DC9605EDC313D273E3568F0A0E87BD74FE1A5E8AE5334E1B + +A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ +45BD02D8656C555D555F995C223AFE9C823D2B181201A81EC548FD23 + +AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ +54D7D4AB57C5667FCB59B63446D9AA67422F9A0AD7518D9B35E7BB08 + +AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ +72FA8FD765194C88C7002C8CA45A24FDA914F69D270B8454A2D97FDE + +7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ +7BD3F6187F506186720893AC14CDA6E96D269A024187594557850A37 + +FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ +B0B459577B499D2C5ABA619CD5C6A5732D6F6D78BB33312D4C930CEC + +0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ +64CFC989C1EC79DB84A51B7DE6F40E5B7A900AEE4F6B5751D8886A65 + +A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ +81435B887DCADB952F24B6CA67FF30C377B00308BA0A6F8278334368 + +03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ +E1CB3E09E5916D2EE42E633F8DA30448052960A95B21B45911BDAECE + +84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ +7FAC333FCDF52F5833E55D0DD4C783DC61B1727C1EF9A02C7AE201BB + +9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ +4B235F8557EA5C202C9C5168206D349060A2781E21DC958FE679E3E1 + +DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ +46:\ +AFFE2914DD6072CD980960FFDFC599D7CDA52F09920A8DFA62EA4EEB + +62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ +B5A0:\ +3997E91CF25CE17CA8B035B2353D1AB48EC90ACEFE72CEB096F250EB + +B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ +FBAD4E:\ +75F4072F0F0A284A8D24766E933AF709E1FE3AF385F4C6875A1AC11B + +47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ +ED2C2492:\ +7B6333A603FF632E9CFE01D0D64D0AAC13C1E5EFDD97224A79DCA121 + +512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ +6B2EE4E542:\ +BFA0D6B54B8A045434E722394DF84B664F28016D235B2F48F5EA588D + +973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ +2A1493D8F4FB:\ +C395991E0D4727E0AB271C1321A020EAF5DFAB9631F389900D6595F9 + +80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ +30A934467DA4B0:\ +B5CEDF4D9504DF3D9171F8BA96090B45BB90F3E8A911402A1C3E00E3 + +7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ +C0308E29446B8ED3:\ +3E6E936755C1D9836B3FC379B4C6D18F439CA6A1DC78AEB1D50AE837 + +C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ +723B20F67BA610C2B7:\ +84B0632239E55E830F2AEC7D6687868CE4C054F5E6A2BC085D062895 + +01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ +0C834CE6EADC2BB86BF6:\ +9273DC67961CFE9E6D86A432D40FF797F501B53B5EAC00123FF0BB88 + +337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ +1540D29BA27AB8E309A4B7:\ +9A34A7E5F29932359C7ABA6F7A4ADE7041DDE12428DE78D3B8A085BD + +6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ +32B58EBC38FC2A6B913596A8:\ +FC35B4F43134B30F500F76B9C52213DF9A4DC3796B5C27010012BC51 + +F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ +38467205F5DCFB34A2ACFE96C0:\ +01B761AC903AE54A0F16F9F38F721A32ACE7E86E222B41DE11CBCA00 + +CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ +B06CF0F5A0EA15CA907EE1C27EBA:\ +B207ED6F58D136D84844531CCD9EAFB23DB225F10AF02B2A919DF59F + +1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ +BCF84D0D4726364B9BF95AB251D9BB:\ +D708038912881BCA7D358F3BA8B08251AFD4CA8F7357AE8A5D65967F + +D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ +C7F157298EABC4DCE7D89CE5162499F9:\ +CFB39569FDE7249D935C5AB4B68090BD8BD79B15D22984F6325C5DB2 + +BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ +BEF788CDB5CF4606C9C1C7F61AED59F97D:\ +D6C7ABC171CF6DF6BFE29C363980A9E21470BA4CE4B2CB425ABEFDF7 + +7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ +86E779CF053C77785AA9E692F821F14A7F51:\ +13EB1D3594D54BC55D647C5B9BBA4A6D2D4B6E0E76D3FE7840706A34 + +9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ +43304FBA401EFB2BDBD7ECE939102298651C86:\ +D8FEA9C7267C4E94BACF948079D921AB4C3F4E7C5B90FA5E24C15F47 + +C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ +87D68D28CC3897452F6A22AA8573CCEBF245972A:\ +3A0FD6E34B2CC7EE17C03E889FCCD3C1EE541730A65DBD9C1C572BF5 + +EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ +22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ +6BDE585863AFBCEF2C0E1E201AF3204F64ABDCB6C091C2262F7D2A17 + +0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ +FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ +CBBA015CD7BA55FA3485825C6992FB0D25E988DC0E880D4881050DAB + +DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ +9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ +F6FB0931870DC9EDA2A28A78198DA9B35127F783DCC6660481BCBF19 + +EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ +E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ +CD301B7C9DC97E379F80A2F023526E5E614CE47899A625141198B113 + +416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ +97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ +2B8B782A4DC25125B11F24D82A0B50B63C2A9E1DCA26C94AE31B877F + +5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ +A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ +0C3BB1C61319B57D59AF6B27B179F1AF198D275EB9EC34F6F729F3F3 + +7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ +66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ +A6692363E7C4179B699F8726BA0508842C159FC91936DE9E57E94424 + +2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ +4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ +26514934EA8D7A27A910535F2494D9F03CFA2219926547C72140F301 + +95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ +D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ +AF0857642D2D1AA057948D790680BF7C40592BAD4F1E78E6757330DF + +C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ +30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ +15F49CE92772067F0A4445B264660694A7449833404212316222565B + +F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ +05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ +1F3E4A237EB8B7E279A0CBD95CE4FBABE205558017B87676EB90877C + +E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ +E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ +7DB6E11E9B3F884611DEEEAE357D22EAF55445D713470990F3A2BD90 + +16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ +DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ +00:\ +82DDEFF26BC92AD8C3A498E4AFE52B38AE7640D439C11DA0967216EF + +FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ +B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ +37FC:\ +9B073BD1543742361400C9C1608113025E9770A7CDB2600411BB37D7 + +ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ +2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ +599BA5:\ +18D2007C0AF3099B220AC755A34AAF3365B946F00C9817E718D54907 + +36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ +479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ +40706B05:\ +3C072B8543E6A1169A8B45C0C8AA28D3331A41C16124E9E0178378F9 + +ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ +29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ +31D06C77A4:\ +17FA4ABDB577A8343A630FF1EC1BDCF2B4F527EAA6F63F8E391D1ABB + +94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ +EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ +A259FC4FBD72:\ +C003A198B3E1D0AA2640E20369BF26804EFF011AB1BBC680183633E8 + +13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ +C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ +DBE5FE9694AD6D:\ +44A844061000C61661C3A362BC808C22DBD4962F18CBB9A5B5DCA05C + +1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ +E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ +7EF57B91397AA8A7:\ +60DE15C6C9BCB169F1407FEB77D534E55BC47DCD59E66437D9E4F70A + +BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ +7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ +44B78B2D48DE1A08AA:\ +54F2168C3C3207201F22E1D861B8C629CE0F01112CC931E29AECACC4 + +0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ +DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ +B3A6C9FED24D70749604:\ +1F63AAC1832C1518F6FEC037E49FF7FE2155BF3EABA503FEAEF8395E + +BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ +A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ +8B033F77D384CA01593C1B:\ +6FD05F307E9CC34FD41E3AFDA497BE0BA444BBC11C3AEC0525001F93 + +90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ +B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ +013C23F1E9611D595EBAC37C:\ +F63D918DB69CCA874196DA64486DDAA5A1E33BFA58128FB2C7088F36 + +64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ +9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ +4EC5A49FFDB59A1BD6A292AA0E:\ +761B70CCFF0047701D60E9A63666DA44574A146D1CBE6221B0455EBC + +D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ +B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ +498E1F6C82C6CAE6FC14845B3C8A:\ +879CAD70F8A95E75DADD8C1F98B5F26D5151D615385FC2F08E3C65AC + +12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ +88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ +5B01FECFC146BDB251B3BDAD556CD2:\ +EEAF23D57EF12AA5D5C6E8709B4ABDF65045B096D76B31059288C1DA + +871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ +DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ +AE9CD5CF0991878A311B549A6D6AF230:\ +09AF148CFEDB3CE21A4C1283806D9C31F2A6551CAA4C65E1095CCA65 + +E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ +105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ +B50C7C681E773D109FF7491B5CC22296C5:\ +1FF12E3B3F1C0F1580DE3B2B434317B1094145D4D5F88D49C2899913 + +E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ +190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ +2C7CA303269ED14014B2F3CF8B894EAC8554:\ +864EC0649750A7E91E90E841BC32466DE974DB33D4045B029BD1AC4F + +6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ +ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ +1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ +9961608B85AAACB8CFD7183AF1FE84620BC077208EE7F2A3A206930D + +4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ +8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ +37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ +B62124BCCC2FDCEEDCFCA7475F33EDDB5BE61B6AF0F85A7F6BF2272B + +08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ +B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ +85EA51D49894E45BAA3DC707E224688C6408B68B11:\ +13BDFB31B626629662B4956552B1037163D3734CA3E84F1AE1E41E0A + +68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ +8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ +04E18D475920CE828B94E72241F24DB72546B352A0E4:\ +D9111963E738F28B6FB70970B83E41FEF4CC2D5129ADA2069318F4A5 + +B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ +CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ +BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ +24ADCC7FC40FC12041DAEA110672AFC9EA7F2231D36E8828AD12D107 + +0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ +578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ +44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ +45A994D0D305EFE61B91C658206E092586D3ACA33195839B20E97868 + +1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ +F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ +4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ +CE9A443639BD043B3F0001B015332E22CE98AAF237CE8610E98B40D0 + +B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ +C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ +E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ +423AC9DD5A9B573EF657C306448D3EEA618E3621631E20D1859B4446 + +CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ +5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ +27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ +ECB8B0555265D47CBABD9A3259E254E5C57E2C1913FA8D4F6D50C0A1 + +072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ +E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ +A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ +129803DF866AE32F3FD4E9883A2920FC1C0E1854E312CA7E1BF2769B + +76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ +FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ +29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ +1E3FADDC3974593E6294539CA73D22278CA2A7862D17D19E9BC3E17D + +7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ +650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ +AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ +E75807D47DF0CC8590C1474FFE018C541FB56772676E5446B87BB347 + +E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ +7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ +8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ +2FE934932126411F9E760CB06C98E6374F762325A8F40D3559861CFF + +69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ +1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ +040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ +C9746187BB2681AFF066D735B325E1CFF02F4EC585FBBDC730BB3705 + +38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ +0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ +0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ +49:\ +990766FA326BF1793AB5C2140A8820AC93DC68CEAC0847FE07C07A1B + +6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ +0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ +2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ +5B52:\ +A881E5D1CFE74CE904C948D0496C392E8805E5C550B56B0B09415EB0 + +6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ +B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ +C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ +89CCC1:\ +85E3D7307FABF376B894EB810CABAD829F7B0A40F0058AE43C37947E + +433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ +14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ +22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ +6DCBB4CE:\ +46DEBE450ABA22B5D4FA8422B4E9259CE416CF3F428C83E9947A9E68 + +A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ +7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ +881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ +BADF45685F:\ +0E79C3B35616DE0ECEEB3B9E669B600E42A4EEE291F570114122A8A9 + +006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ +312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ +96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ +9B62C60A4771:\ +014200515103F199DD4FDF17443AAB936A0F51CF2CCC6697BF47F3AD + +F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ +A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ +9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ +CA58D5DAB38ADB:\ +45149B32F55F93F61D2DEC87B926A4B7EA17D49891F65EF14EB3B7D9 + +E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ +F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ +B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ +21691E1069413848:\ +FAF24398B32371FD680CF6B652173C812B5FEA2C08218F3AE1046189 + +64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ +D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ +FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ +B57D6D0C2EDC4E78D6:\ +02F3B34DAC38A5850EBE9604E7EA1AA4BD87AA3C1860C55F9786C255 + +5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ +CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ +8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ +CD19E781AF20454AC880:\ +23CFE985DAB39A2627F5CA6E67D15F6F7EE1381FEFAAC5EF4F7D3F74 + +03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ +F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ +A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ +BF0FE3C32C17AA188A8683:\ +82D16C2A021675F4E9F2ED6E34349EBE7047001F84F56F26D47FE571 + +F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ +E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ +0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ +2E937F21C005F17411473041:\ +3F9960493D89F2DD6A8375BE0673AD4C64D9AB396F502159628A2AD5 + +758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ +62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ +2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ +29F695815D866DA99DF3F79403:\ +C1799D6E48834E5E893359B1F8C8799040AD9D7BEA701CFEC0DAC204 + +47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ +84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ +3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ +1BB15B447589E86E8D76B1E9CED2:\ +5FBE11E1A85A635033A97920BD48337210339E9EFB9221EF5B519EB4 + +F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ +4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ +853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ +AD3D7E886DEA4F005AE4AD05E5065F:\ +7677527F993D3E84C2EBF650EAA373FC32526FAA1A078D02DAEFE5E2 + +58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ +7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ +68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ +EAABC35F5C2B0A0F2379231953322C4E:\ +8D2CA9D933106BD1D2659B029DD8306248091212CF231A7FD3FD5AAE + +BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ +4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ +2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ +159388D5C3277E227286F65FF5E5B5AEC1:\ +3DAACF14099A70A48EB6CC45A996881326FBE0ACB4B3EE92B5134A94 + +8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ +A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ +D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ +407847DD0DA505AB1641C02DEA4F0D834986:\ +1EC1B0284FB0B7AB356726338A66082E96F943D57C2B5F2898B2AA9E + +B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ +33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ +99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ +7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ +A0CBCD5C15B59946971CFF0C0B0BE9E8898A3237FC8B28FBE8789B51 + +2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ +A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ +2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ +205AA1615DB44057DB991231D2CB42624574F545:\ +28C9DF2DD04C5F97381E2485A6A2D75250ACD6D19AA778E057B3C0BD + +DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ +F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ +2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ +157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ +B3B4ACC18B310D480A3AC74B524B9B87EFA6AEB2CDC4ED9F5CCD78DA + +42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ +0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ +0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ +3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ +39EF2D06DA8A9C035D46F3DC432DC5CDF6EBA2A49047220308B91FDF + +3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ +FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ +DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ +46176EBF044C4784467C700470D0C0B40C8A088C815816:\ +C62D2148CA179988D3B80A00A08977E0A67445EA480D115B73CCB96C + +D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ +91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ +1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ +EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ +DF5ECBCC94DA5D734E989C47EE11FB8C5BCE9B9E6E676672823D0984 + +626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ +1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ +285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ +6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ +ADE2FF5F07E85FB9A8002728B9033797BF432405E47C4B8AF10A7CC5 + +651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ +27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ +9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ +C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ +F133DAA776EF321565DA24BDDFBAB376D8F60D54F75BF24466CCEDA7 + +8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ +BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ +DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ +D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ +75395112E1313F0CE6C4FE6B8AAFE6E1ED4191F7F6A65E47CBD73E35 + +53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ +8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ +4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ +47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ +E8F832C631891E973C6AEDF2CFDB6D6F75864571D94F18D3B90803D2 + +A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ +E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ +2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ +B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ +E8333A5AA6735D8D778970DAA70435A126380122F02459F51A143EAB + +0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ +5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ +4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ +D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ +9694E0383F0DF8B31E1FD0BF0E7B355C7842D008D4752B8F5DB2E06C + +A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ +07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ +6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ +AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ +D2634E1D88ED5681B6446054CB7469CEF40A245BCF9DEECEEB8A0CDE + +2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ +29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ +E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ +98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ +FBDCBE127DF0838CAEAED3A8EA1C006C7D070A858567FC0153E9E3CB + +10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ +3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ +A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ +B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ +E2:\ +7E5F9CE032AD6FB15D6E18719F60FCA5C1FB8FD79342297EE4456D7A + +9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ +1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ +3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ +52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ +61EC:\ +24550D634FBEB66AB3677AF8C5ECC003347610773AE28B5414056C86 + +E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ +9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ +2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ +609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ +9B5EDC:\ +09991E8F4691292A12E67810B26F33E3B48CDCCE5B4F92750F8995FF + +FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ +CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ +B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ +63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ +42D75D68:\ +666EA481FD0857DF57653199108239DF721FEEDFC485B117382DB4BE + +59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ +A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ +BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ +E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ +7815BF3C49:\ +03E39562FE1C30F00F44031F1DB1C8240E859A7267C24A795B5713B7 + +77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ +61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ +B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ +025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ +951CB2068CC6:\ +0115CE3021E490ACF0BCC43A69581007196DE30CD63571CEF8D3E87A + +B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ +BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ +93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ +AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ +B0FED6A8052FBB:\ +AEDDDAA1BD1EBC5C77F956A3D45516C8DCD71A598D9EAF31228D969C + +B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ +35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ +780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ +015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ +37674C6F8E380C04:\ +F22DF9B555059C00C4C6B34443241E2BE287C4228423E2E3BAB2C658 + +04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ +DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ +D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ +F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ +F22DA873C601016A0D:\ +B64C633AFFC4FB95643811604DC92A0D177CB0CD8F4210AA9E236E66 + +8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ +DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ +472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ +994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ +1373FB09A1A6E3C7158F:\ +4937F05A98AC41F57ED57F05D539C791AC867B9AEEEBA56241831036 + +FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ +ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ +084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ +B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ +339612E830E9E7A9C29065:\ +4A679F2369429C49AC06BBC518534DE41B0EBDFCC9B2DF08E821215A + +9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ +B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ +5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ +8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ +377838973C1D943C22ED335E:\ +35273B8FA54F9A70BC75DB4552F60C4A514368A7A9402879EEA0162B + +2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ +725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ +798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ +8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ +2D0C9E7448DE3043AE22FDD229:\ +C92798112891E82FBCCD7D9B9A4B1718E7D42C15806585073CD4712B + +94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ +C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ +F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ +E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ +5B6C338CBB8F6659D342A24368CF:\ +94DDDB9B3114070645DBDBB1481EB403204A7AD591D503980C69CC3F + +EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ +76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ +C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ +E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ +F6954BA0801A1294CD8D7E66DFAFEC:\ +94338025D8F19FF359D26A8A0DDC47979D3C6F66128FD183C18772DD + +157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ +CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ +055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ +EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ +256FB33D4260439CBA73A9479EE00C63:\ +F42AFC3BE1202040D2145385038A9CB2E28609388F443884014A8A26 + +836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ +D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ +A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ +911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ +5994C1DBB3B5C7871A11F5537011044C53:\ +D6E224CF1ADEE925664DAE5BEE27C9B0EA249A267882F955C4C92ACE + +CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ +2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ +586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ +4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ +4E53426CAA453F8DE1CBB57932B0B741D4C6:\ +6B14C7A19F6B14AA1CD6CB4218DB66716E994E78C2D5A43DD4464273 + +7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ +868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ +83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ +C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ +C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ +64A7FDC77F564F849A72FA360B6441CB068C99F90AD16A7937755E02 + +EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ +BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ +E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ +EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ +CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ +68807BF2E0A3AB42C258B3031A74D4870AFEF475D231434F957B14EE + +1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ +F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ +656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ +46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ +8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ +1F0B5A43F9E9BB7F34C253133CA52B5CBB4111D4226F1F81F7243707 + +4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ +7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ +E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ +4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ +99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ +CF61ECF3F61415CF44D166A289A597A88F752C3D2AD546A27C00E764 + +D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ +66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ +B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ +67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ +F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ +DF256A3D4CD87130377616F00727CAC501317FD8EDCBDFE0F530A83A + +842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ +DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ +1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ +48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ +15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ +484A17B4E7F8B00935ED84391EA0874D5D8AAB59B833051EBB49CB15 + +6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ +C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ +7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ +66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ +5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ +D337A2B8AB0AF673676067BE9BC271D3CDC033B72B83934211ADCAD3 + +51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ +7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ +BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ +1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ +1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ +9457724687C625B7F1F23F27514A04AFB1FD9A9FC0DD603A392A82C4 + +83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ +9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ +0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ +AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ +45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ +91D56808DFD6F719BC8D80668C53994122CC2596C9B1763B12BBF78C + +2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ +D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ +1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ +BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ +B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ +84769A9F80414A9A9FC161E2543CC6759769210D42042F6904FB259B + +CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ +60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ +A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ +A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ +0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ +E2164A2FE936AD8FD9B736D8FBBC5E5BB5716756E7F4BF6B193AC39A + +F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ +10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ +AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ +568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ +46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ +B917878D9BD7BBBA6FD213B92F17D729702916088B4E15AA0F8F2EA0 + +25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ +8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ +C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ +4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ +01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ +29E930630830092DF0D4E19D63939750F11B79B9FDAD2EBC1B036C92 + +21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ +CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ +FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ +9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ +447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ +BFA7E3153C86ACEF9C12F5B918C8F33395ED19FC49F81D7F428A46AB + +4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ +74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ +5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ +DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ +A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ +CF:\ +738DC6B191C7EAE75A2A432876ABD8E4BF4849B818BCAFDACA17653D + +FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ +B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ +5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ +71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ +EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ +1DC8:\ +73FAFCF89E546762076C9535A215A79B1E4B8628F7D4E19D42761790 + +E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ +54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ +009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ +2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ +99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ +C25E88:\ +13257FC53DC8829C29AAAA1035788815F7117C03AEA369B1AFB1FFAE + +F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ +65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ +E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ +3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ +BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ +C5C06729:\ +395D486F2C3489278E96BC494CDEC507DA9AD166B42FA084EC044371 + +CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ +68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ +6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ +F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ +551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ +CFE0AF93EB:\ +2C90DCD95DAF28199E8D44A61ADBBE0D2AFDCE6E1EB8DD5EE7CE8419 + +2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ +331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ +2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ +ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ +05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ +F467BC75A9D1:\ +F3B9C6B3CC0B3A1680B7834E341D26CA4CB6869EB91BA61EE7BA860E + +0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ +EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ +A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ +AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ +513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ +C6F4756017FFF5:\ +ECFE64459ED2FFE61B8DB24E3655C59173A9E44294EA3FD2E3981905 + +C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ +E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ +C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ +798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ +9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ +45DBA58E6CB2C8EA:\ +13A162EE3FAFC7D305DE4E705A901C91BCBDBFB80E43439237998445 + +B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ +C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ +01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ +86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ +10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ +E8419D48FDFBD744CE:\ +301F2A019345965B60A17A2B04068492FF16F5BD1730EE3A3CA56C6E + +A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ +7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ +6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ +1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ +4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ +359D5D1EEA105F28DCFB:\ +B3FE0C069F44C79AEC45357012C26F3351304B9F5DD67C860867465E + +E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ +2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ +6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ +D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ +8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ +7ADFB974EE205A9BF7B848:\ +EED8BF12A5609A417E4BC6B215F9A1814D86A57C79F5F768C85BC0AE + +B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ +E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ +D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ +EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ +7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ +EC77F29D211BE89DE18B15F6:\ +38B126F85C57E8E30BE3DE75D09225BB317BC9D2F59FD5408CDA73E1 + +DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ +4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ +49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ +9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ +50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ +63EFE793489C39B8FD29D104CE:\ +44695E9983D11A5A83EFD4E5D65D4AC3F7751C84B9CFFB74CF8D5092 + +BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ +DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ +02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ +C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ +711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ +AE5B257BE36A7124E1060C170FFA:\ +51B4A0AE4D12D2D8275B81DFF10C09FC8F650FCCE3E216CB8AB2F191 + +5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ +F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ +5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ +70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ +001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ +480AB79D4E6415B520F1C484D675B1:\ +CBA2209C564DF70242EEC7DA8962EF2089592F623B6D35ED70BD9E86 + +A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ +CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ +84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ +920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ +E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ +D42956588B3B58CD948970D298776060:\ +945C6513694D0ECE506D195FA100FB28AA9141D6ACCE2696CD1F877F + +06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ +3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ +678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ +2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ +8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ +A96CBDE5FBC953D9E576CD216AFC90323A:\ +C54C64C65C2DD6AD413D0D412897F29BC220D50481A8E584C7EEF205 + +F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ +DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ +593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ +0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ +358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ +67B5AD93D874812A1DE6A7B93CD53AD97232:\ +FC3ABB92CC894EE736B19F12C03FE79789AB4A84DB6103FE9B989739 + +9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ +F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ +DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ +85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ +D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ +352BDD3740DD6A16792AE2D86F11641BB717C2:\ +3DA07988CC99EC6D87DBC8904DA8876D8E0A73976BB8489C807B3375 + +5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ +F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ +71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ +865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ +2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ +9ABA31EDB903B28FBFC33B7703CD996215A11238:\ +F1CBE43C4AB525B2A6CB836476E4FE3DC8FB41052F0A72C56843B09C + +576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ +8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ +13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ +9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ +32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ +D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ +257A1A08B24AF74D0FBE5637A736F6E1526301961D20B9C2F1323FBA + +0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ +D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ +3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ +7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ +F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ +C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ +13C10F28096473B2C9CF8C6B44ED9A10491919C911450831658E6B0B + +3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ +2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ +41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ +D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ +1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ +6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ +561AA276D17621468FDC21ED81BD9EDA4711F9524CAF054AA1CFC1EB + +C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ +58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ +21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ +104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ +A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ +CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ +6830C20140483E52232218E34F30803CF8BC981C3D0B755AA4F4F22D + +8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ +4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ +76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ +B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ +C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ +C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ +7CB804CC3A8FF2E2BEDC28643E81D9F926A9B94E7E6AC031AEAE01B9 + +C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ +D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ +D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ +7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ +D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ +36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ +CC8B8FCE54C49DDFA044FDB1C2588676B086C3A002B689551235833D + +8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ +BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ +8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ +BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ +7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ +57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ +5613CA11E7014D81F4CB33DFFFD67F57895837FD9FB1438A0647A6CD + +6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ +FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ +384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ +B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ +4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ +55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ +DB93BE7FA7F15CB5C13611BFACEC7CB602BA218A8174E2C166A6BA67 + +C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ +4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ +761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ +D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ +B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ +A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ +08C09E713A7EB4DF5246CC69366E8D1697B5EB173FD0C44205A80F73 + +07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ +0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ +475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ +F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ +6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ +6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ +24EDABEB8415BDCD3607B5BFE50696D0296D334DA195C8667E1756BA + +588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ +D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ +635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ +822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ +F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ +1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ +671CEE30617D425D03059E1AD4E732FC1B935F00B789DB7697C95305 + +08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ +D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ +1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ +698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ +47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ +E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ +4C33B12F057C7F95062BFD138EBFCF995A482E427653EF09A9CA91A9 + +CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ +C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ +8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ +DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ +696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ +7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ +01:\ +670B25B14DB350162266995D7FE07C35C65EDE762D04F5360DC17FD3 + +D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ +0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ +2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ +CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ +9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ +E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ +4D4B:\ +A439D6AB94388991C1BAEBC8E009295CE012CC1378D0733C9894F37C + +8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ +EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ +1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ +18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ +299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ +4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ +A3BA86:\ +6A36CC8B19BC8C7A319237B2A97D0943A286EDD5D5D51F334CBC28CF + +84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ +69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ +1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ +61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ +B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ +477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ +FB9E4AB6:\ +DEDB114F80BEDC104D53AD842F53950A940D3B70E92C01181CC987E6 + +FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ +31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ +59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ +A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ +CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ +7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ +91355C6280:\ +129FBF7A9C1833F1701EB37002CB26D44781F2F63D69E264E42F9308 + +70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ +62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ +225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ +A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ +1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ +366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ +AF1AE717238D:\ +A2A2143D652583E19A42A0D8809175DF172DEE12E923661FDAFA6FCE + +74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ +85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ +D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ +C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ +A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ +16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ +528F9AB49C79F2:\ +677C274FFD58E155E9FBDC416CB01FDBB913851A319D884AC922D018 + +8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ +AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ +584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ +4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ +4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ +5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ +EBDDC89186839B77:\ +35917E2DAA15F615DF9664E5238DE6A0E89594EC741C4FED59617AC1 + +FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ +E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ +AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ +CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ +B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ +6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ +C66F252F6E64EDC96B:\ +4FBDCF7E5B9B841BAD1E8B5CBD4BB21F60C51264285C1133AD0F5C17 + +B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ +5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ +252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ +FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ +25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ +232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ +5363892A2495DF8C1EEF:\ +29A3738DCC1C867454E299ED3697E44C51524B930501AD8BDEC2D727 + +C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ +FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ +272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ +414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ +49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ +199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ +5C6D1BE4BC79F08A1A0A46:\ +79EF7589A255610B4AB00F33A79E1DA9BFABDE45C0D9302111553A3A + +4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ +A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ +2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ +443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ +C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ +D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ +6EB6E4A80358ACC78647D043:\ +77193DBA1277B4728F2835B36A01A860C9C4B080E8DA52416C4B0974 + +EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ +F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ +D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ +01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ +E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ +A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ +90BF2C4062FD2AD58F906A2D0D:\ +C6D41623D719DF195B26C29A55372678AF6AE0036B3A583726FBDFE8 + +E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ +AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ +E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ +EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ +DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ +EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ +3EE46FB67422F814A68C4BE3E8C9:\ +A82DFC36AFC499EC5CCB239C4EB3E3CC53B396885F207C7DE21DEB63 + +D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ +C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ +4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ +38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ +806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ +4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ +A17E776C0D02856032A6CD10AD2838:\ +25FFB9AFDD43FA70BE51020FC95E55499591F4FCFC37ACC4C9A77EEB + +F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ +C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ +39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ +42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ +4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ +CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ +2ED1C78631FD23B4C3EB27C3FAEC8685:\ +5FCC4B77DCECC27B77EDDEF1CB0639B13FFFCEC5FF64070AD2857E7E + +447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ +94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ +286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ +D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ +04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ +72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ +CD90333A77BC4E1988A82ABF7C7CAF3291:\ +DDA1BA567A97E1A2196AC1F3E7F91D285666B386CBD499DEA3582A19 + +9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ +E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ +29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ +ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ +E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ +5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ +626C48322E9791D5FF72294049BDE91E73F8:\ +EE4588DB80183DB94B4AD3EBA30DD9500FD788EA99CB75753B4E9014 + +AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ +1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ +42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ +A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ +DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ +B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ +774BE89C1114DD531C011E53A34DC248A2F0E6:\ +EB074053888780F9FDAACAF71E2CD842AF1DA574CB0211A023AF67C0 + +3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ +B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ +CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ +246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ +47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ +94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ +A7059ABE99182714983B9C9D44D7F5643596D4F3:\ +4792D0DE0EF6C17AA8E4F39D9A644DBE49905B2041DD61A90639BFA6 + +3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ +BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ +374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ +6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ +63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ +5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ +4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ +6E86F86F524EFC4475D352A0D0D815B451DD9990800D07BF98DC1BFD + +7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ +575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ +BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ +E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ +AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ +7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ +591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ +C90152A748421620F1755F7BFB09A49618797B7DF70223AF51BB97AA + +7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ +D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ +37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ +3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ +A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ +9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ +24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ +F55877B8BC9872EADD1E8C0687C00CF352D4F454EC48D1F29E697CB3 + +D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ +A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ +D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ +33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ +CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ +0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ +52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ +A9B9968B4AAA65C0A35B08D83AF3A113274F8897F20FF18B4994A0FD + +2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ +D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ +7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ +5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ +AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ +B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ +806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ +7C569414A62DA6C017BFCC6260E7F63616A4008DBF78BD3816A04D1E + +5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ +271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ +CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ +608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ +D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ +990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ +2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ +48E0F383E46F71E07A4EF6AFBF71F6641C934E348CEA4841CFC867F5 + +C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ +56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ +8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ +50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ +1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ +F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ +9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ +2B91E8EF41B40B6940A9454025A1418547B66823E2955382260EAC1D + +7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ +5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ +4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ +DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ +261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ +CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ +31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ +AA71E9EF7E7047FAC9A6F14FF1DE7C18E53903C5D646F8848C3FC220 + +7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ +266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ +7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ +B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ +357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ +5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ +719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ +F6D0F2DF20E815C332C4D85735F4BFA8782197474B5323EAC15E4E9C + +988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ +8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ +3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ +267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ +A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ +8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ +D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ +622EDE6C66F1CBA304B603D7B0AE6B515F858D4E9108F13C5F5E1DDC + +5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ +F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ +C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ +A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ +1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ +4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ +3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ +3FC1F106F8950B3D229E42D5F90C803719C455703EF6D54F1CDC33A3 + +47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ +994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ +DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ +37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ +7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ +9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ +EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ +67A3D063540E800E8615128D159DC079F0EA702AE773D69F7EA8329D + +8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ +E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ +DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ +394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ +43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ +7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ +A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ +E8:\ +C425F8DCFA3A78973900971F89AE8F200CD3A124966B6EB467B69E85 + +EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ +F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ +85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ +C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ +4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ +97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ +345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ +6427:\ +49BC279888DB44BF436B0219079928FF292573957C9599CC447CC6E8 + +23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ +89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ +DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ +DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ +BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ +F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ +DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ +630012:\ +340304F2A3C16806EA7A03520497327549D910369FF047C3DA55D0BF + +0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ +F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ +C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ +A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ +A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ +95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ +4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ +78DFB921:\ +DBD5AE8F4DE149A3B6A1F4C0AA9D3D6B5F89EB04BA4058B31A261BCF + +3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ +A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ +4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ +BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ +DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ +91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ +9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ +BB0D19F909:\ +128ADE79B19D737A49FEE5759CB0E44DAB715A0AA030E1F3A587925A + +747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ +6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ +57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ +00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ +77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ +81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ +04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ +BE6BF8082E8A:\ +F038461526E684F9A24F3CF2C87BF4BA625ED69A3F559F687CCAE651 + +57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ +06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ +6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ +4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ +D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ +58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ +FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ +E839A9D4608F03:\ +B8CB35B78354C1F2E2298748B224D344A897F0D3B159E070673DBA19 + +04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ +10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ +2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ +BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ +2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ +8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ +8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ +5153592EA81C6FBF:\ +B108DC459A46A7DB743312E9897D88C44FA07C810960865BB91D6802 + +7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ +735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ +1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ +7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ +39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ +9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ +F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ +604F5035C46B8197D3:\ +2C91FC3830D6FBAAC0DC820849578BC6CC1717F90EEC3DD9E1BCD4C8 + +E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ +94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ +DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ +7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ +60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ +7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ +6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ +07E3B953ACF99964B847:\ +8DD2447F7DF47F51DB05745E5B3A539A15DC43FB4F67F05DFEBE02ED + +D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ +32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ +7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ +8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ +07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ +C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ +4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ +6C90E8C4D100ACD9EED21E:\ +396A16C8BA8E29A02F5349BF53BBACD1698AFCCB30F70F31F508A724 + +3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ +AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ +18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ +A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ +E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ +886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ +4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ +E2DD603D9EA24DC7C5FD06BE:\ +AC03967249EAA1365AA489D3962FCCAFEC07AD981A54986706785FEE + +1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ +742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ +B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ +69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ +E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ +9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ +779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ +A80012976F31FFDF305F0C9C5E:\ +51554A3AFBC30F302F7FA4133C5B8E131CF9B9BBC50B2CCB7D884193 + +08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ +9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ +53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ +479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ +B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ +DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ +3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ +B461A40645BF176601F1E760DE5F:\ +F336B69FCD40BFB5085A641A78088169971FADCF691C4C57BE585BBD + +D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ +5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ +E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ +F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ +8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ +EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ +1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ +86C226169FF257954EBDA81C0E5F99:\ +AA93E8FB2E8220F092EE64BFCC1DED1EB810240CD908376B0ED41E21 + +5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ +431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ +40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ +A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ +0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ +2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ +83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ +D3C356C914FA06B9A7CE24C7317A172D:\ +D7A472FDB42739B3613BAD3D579F786C01BD82D0BE7F8CDCB4612B18 + +6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ +E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ +D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ +B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ +645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ +F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ +39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ +68F50D79F0C9C7314E750F7D02FAA58BFA:\ +B94E392A8B74D2A51C09E9E9754CDB078A0A1F402A09B47ED3BB8ABC + +5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ +4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ +717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ +4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ +FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ +9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ +39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ +7DF95B60FA8712A2271FCAF3911CE7B511B1:\ +26A3734EC5BDA57A5CE90DBD16FFE9366937E2B95C630ED2D5BBEF3B + +03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ +C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ +C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ +261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ +0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ +61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ +37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ +A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ +AE9E408B69CD8003595B8AACED7426A7A2692009F5B4B797A60A0DA4 + +2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ +C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ +4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ +339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ +5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ +F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ +7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ +B7F5CB9923AD97058EC067700CC746C127A61EE3:\ +7A6A0B6B4B669ADF9370CFDE5C9655B6500B7BAA52884398FA7E3A71 + +90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ +70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ +495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ +DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ +5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ +00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ +F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ +CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ +6DE44F673AAC9C6B219D98E1DFF1D239FFF771F4365758EDF14BF04D + +2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ +6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ +6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ +1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ +0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ +B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ +2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ +C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ +92D860929D7B3EC9EA2FD7AE4FB26BACE1CA6AB5735F88157F4C3194 + +721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ +EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ +B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ +FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ +2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ +5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ +C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ +9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ +D4E7DC30605D852F428ACC224875FFD94BEB06B71CE5152C9C287C80 + +6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ +C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ +8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ +90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ +6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ +0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ +CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ +6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ +88D5879FB2468072F08244B2D67F9CE2733F4F16472748770F5A705B + +6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ +70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ +5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ +E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ +2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ +4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ +27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ +CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ +6EB4FEB861D45200C6585A69D9BFADFC6794915420D3DD79BD7E6EAF + +B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ +E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ +0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ +F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ +0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ +8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ +547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ +758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ +A76B0EE363B13AC6C8EDA94F4DEC7298CEFDBB8E62FB36509F25D18B + +83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ +C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ +38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ +BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ +5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ +3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ +8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ +5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ +E8B706D7B3247FB728DD0182ADE8DCC37FA246FE447AC561A412401E + +A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ +A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ +EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ +3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ +80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ +49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ +9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ +E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ +6059E9FC165CAB929FEC72F5F4A943B599A0D8841E6AA0717A46978C + +A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ +A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ +0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ +639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ +B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ +877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ +1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ +D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ +25D9CC7C7BCE962346D37CB7FD26EA399F8AEE643095A5F189043E73 + +83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ +9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ +10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ +8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ +88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ +0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ +2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ +04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ +8E0887B79F61D0C7013D4755ED0653B314093C33C199F767947A2938 + +3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ +623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ +15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ +A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ +B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ +C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ +817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ +5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ +529902444F790393A2425B8A2E8D6E35CE7A1EA1F232BEEB3B3DA09B + +724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D\ +21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DA\ +BCE506E558720520D33352D119F699E784F9E548FF91BC35CA14704212870982\ +0D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C8\ +7E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1\ +A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CE\ +C6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2\ +FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195:\ +209B7E757D298DF854604E0CE41E605E737828130A271D8DDB78385F + +3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A11\ +4E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B2\ +92D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02\ +539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332\ +DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B\ +0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49\ +F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C252\ +7AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04\ +CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D\ +2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18:\ +6FC3891BAA6F667E4227CE803DBC698A14E872001525F3ED52ADED81 + +023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A69616526\ +76DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529\ +C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC00\ +4691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C\ +0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8\ +B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F\ +52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B46280\ +27A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718EC\ +AE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8\ +720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710\ +D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D\ +9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651:\ +E32A2A6158317D0841BF689FA15A93F35C3B0E0DAC8A7AA6FA6EB571 + +20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3\ +131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890\ +808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1\ +AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135\ +A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAA\ +E17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4F\ +DB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D510\ +71BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C\ +6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493C\ +D136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C30\ +74E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E\ +4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E\ +6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6C\ +E2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7:\ +3581EF73FBF527AE22060E928439AE30D8E61EE8642E9C9D03E957D1 + +4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD8\ +0F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB\ +2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB\ +0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5A\ +A756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A\ +2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746D\ +B6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E\ +8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3\ +284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C\ +584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9F\ +AED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A\ +582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB\ +8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10\ +E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107\ +DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3\ +C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD:\ +2EB421F1A6C9B3F3E08F59A7CFDD8AC7CA45778F964603228AE94B17 + +D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024\ +E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211\ +D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C3\ +13D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D7\ +3D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D\ +682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058\ +321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B2\ +1E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D512\ +63B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978A\ +E90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA\ +21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4\ +910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C\ +63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A9249\ +8D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089\ +CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6E\ +D83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A7\ +90910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA\ +43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C\ +4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC9\ +8D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBC\ +B88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A89\ +6771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78F\ +A3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824\ +CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD564\ +9FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458\ +A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8:\ +31BE6FE35784081DA23627B566BCD60A966271D44E9D370A7023CBA1 + +4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B\ +73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF\ +2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520\ +A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD\ +574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8\ +298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB\ +6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB4\ +2610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61\ +ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A898\ +8B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014\ +BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B\ +07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC826709399\ +48FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02\ +F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED66402361\ +6B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA\ +7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8\ +A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F\ +469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E\ +6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F\ +40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34\ +B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF\ +08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281\ +665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F\ +4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9\ +186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC62814\ +0996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE0\ +0D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA962838\ +1055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79\ +CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4\ +C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D5\ +99B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8\ +D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED\ +1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACD\ +B178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF2\ +14DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478\ +DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48\ +E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3B\ +A36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385\ +F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7\ +A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4\ +C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017\ +C3A66CD4EB2DDB42EF85EA0CD65534:\ +4F02153C6F3B705628C62048C1B6615C98B18D436E1B1F9C552BC70D + +523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3\ +EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D\ +6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA054187\ +70F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01\ +C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08\ +D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6\ +013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF044\ +5B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCF\ +E87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E55\ +44E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D\ +8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80\ +DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671A\ +DEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8\ +B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC728366\ +1D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615F\ +B93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF19\ +9E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D2\ +9B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB\ +4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D\ +323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2C\ +FBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF\ +8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AA\ +CDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83ED\ +F9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED092\ +53039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6\ +EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE\ +11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADE\ +D1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648\ +EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107\ +CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B96\ +5A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7\ +B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E17\ +41553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E8\ +19C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48A\ +BE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548\ +647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816\ +AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430\ +142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE\ +40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C6\ +40909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E5\ +3E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB4665\ +2196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B\ +94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE\ +4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9\ +CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D25\ +9C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE\ +561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7E\ +F94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E\ +5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1\ +C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6\ +303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A\ +2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1\ +C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3D\ +A8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6F\ +E398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6\ +F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C2\ +13171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD\ +46B568CE294C89:\ +CA5E9BDFDE3AEFB36B01D09BA9D8F8CDCBFD7012D8C72BE25A85D457 + +F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD\ +9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81\ +FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E904\ +49F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0\ +D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6\ +D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EA\ +F977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B\ +32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0F\ +A032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C\ +2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC01\ +03CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31\ +B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F4412\ +0ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7\ +685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491\ +B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF\ +2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C\ +3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF30\ +0251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736\ +BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CA\ +C2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B983\ +20B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B056\ +2B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1A\ +F9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A46\ +3B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F\ +5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137F\ +F9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BE\ +D133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68D\ +A188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE8\ +97B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030\ +DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A74030017989\ +92F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54C\ +F7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA698\ +3D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B5\ +2C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE\ +703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C\ +05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B0\ +4DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC0\ +99EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED\ +1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754\ +688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F958\ +1DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F9\ +4E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4\ +181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6\ +FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169D\ +C46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12\ +C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB0\ +00057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D0\ +0A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4B\ +A1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C\ +2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441E\ +C8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A\ +537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8\ +B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88\ +DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656C\ +C30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D7\ +2DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19\ +C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B8\ +8DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8\ +F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B85\ +5845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4\ +ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F16467\ +8160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D629\ +4FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D1208\ +9CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0A\ +D12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397\ +B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA\ +727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE\ +9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E7\ +3EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A81\ +0FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1AB\ +F6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E\ +854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07\ +813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215:\ +F43DB3485955A0F7EAB0D2FEED4E1D95043B4081996796BE9A7A4E67 + +08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6\ +A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6\ +B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399\ +DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB296\ +47F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE\ +7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B600\ +4DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FA\ +DDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120\ +D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE390308\ +0A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBD\ +BEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A294\ +4384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E62\ +22A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D37\ +52889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0\ +A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33D\ +B8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4\ +C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F\ +7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D\ +7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24\ +204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB229\ +07F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3\ +C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD1\ +5C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130\ +D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2\ +D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D\ +56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572\ +FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD5\ +6495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C\ +15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDE\ +FD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041\ +259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A819498975\ +5D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A\ +317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC\ +5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3\ +504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E5\ +32A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999\ +B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D77\ +85C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FAB\ +AA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C215366\ +3B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2\ +B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530C\ +AB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2\ +281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD898\ +6EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B\ +82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77\ +BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFE\ +CDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BB\ +BE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C2\ +8F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705C\ +A27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2C\ +ECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D1\ +0CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F\ +2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246B\ +D04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD\ +1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F\ +265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB0989\ +5CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E\ +4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F\ +092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E90\ +0200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C\ +29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A1\ +3EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398EC\ +F3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A\ +49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BF\ +EA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480\ +C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD4383503\ +3B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E26\ +26AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A\ +5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041C\ +B3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB52231\ +91E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B24\ +42B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E\ +228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB\ +5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604\ +FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE\ +25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914\ +BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F\ +2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8\ +AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42AB\ +AD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3\ +B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3\ +688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B46\ +7CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB3\ +3770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F0\ +7942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD\ +394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C79024581211\ +3204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA\ +8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B\ +09B7F42D193FB3E9C06329818251A2F7E6474462C95DED:\ +3F3AF252BC954FBC567A0CB6A5517AAB201D177D855E1BA5FFB14B74 + +1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380\ +D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8\ +DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F7\ +6316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA37608\ +26D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E693\ +9C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9\ +C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96\ +C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108A\ +F1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322\ +B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE7\ +0057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DF\ +CAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D0094\ +32DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181\ +221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083E\ +A427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF00\ +36D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A595\ +2AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CF\ +AE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF097\ +72D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A\ +83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1F\ +C070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E\ +0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665E\ +D1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA28998410\ +3F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1E\ +CDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADE\ +B9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C\ +6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121\ +210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8\ +889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3\ +123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB\ +71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2\ +B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F62\ +1275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5\ +EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E81\ +6D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A3187054\ +3D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B4403099898\ +57103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B\ +4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C\ +2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE\ +6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D88\ +0CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD2\ +31B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB3\ +97EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3A\ +DFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FF\ +DF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A2492\ +4A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC27\ +75833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0\ +FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666\ +DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F\ +40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5\ +F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA7\ +80703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF9428\ +15C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEB\ +A3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45\ +B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F\ +5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C\ +16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5\ +278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D5\ +59D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E\ +97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956\ +E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1\ +E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106\ +E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10\ +ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E\ +806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA\ +01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD8\ +78C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D\ +29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB\ +31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FF\ +E178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590\ +320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C\ +908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8\ +369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98\ +966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A6\ +5A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F94\ +76D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340\ +847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E\ +950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFE\ +E744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D\ +30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C\ +89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427\ +A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0\ +EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E288\ +5EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB8\ +9B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABB\ +F1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11\ +735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A8\ +64D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7\ +FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA7\ +25473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697\ +C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112F\ +B2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA4\ +2F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715\ +180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED\ +9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7\ +120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C\ +07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE1\ +6318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884ED\ +D768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E\ +4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B65246\ +7FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030C\ +EBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4\ +E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841\ +BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF\ +57795DABAF40687B2CDA7A5014168F:\ +4C2E08F08D72B88D5CD8F1F8AB534FB52B5E3D8FB7EFB339CB33E45F + +1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D5075\ +2ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07C\ +F488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A107\ +6D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3\ +BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C40\ +5F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB03\ +78391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB1670\ +0EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F\ +273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC3\ +3B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60F\ +A01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E\ +6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9C\ +E264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA1414\ +1AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C3295\ +8A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA7547\ +0C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B\ +98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2\ +BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7\ +C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255\ +048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF\ +00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8\ +EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0C\ +FCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F\ +8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96\ +E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94F\ +E43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE8\ +4E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D3625\ +7C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C95\ +63844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000\ +F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CE\ +FFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986\ +D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE9\ +54785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB7867\ +6E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FF\ +A65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B2\ +3C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFF\ +E6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C946\ +50C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3\ +742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D0\ +2BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE\ +79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFD\ +C2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2\ +E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C\ +59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C\ +4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91D\ +F0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97\ +B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073\ +D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB50\ +7608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5\ +E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E\ +5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B\ +0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159B\ +AA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D\ +9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF\ +05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855\ +CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC424\ +5A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E1\ +3B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E1484\ +3D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC\ +9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2\ +CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F7\ +6242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B2\ +60F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C7369\ +6F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA8\ +1F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631\ +E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2\ +FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D352\ +1720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A\ +7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9\ +F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EB\ +A748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A\ +37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE\ +42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA1\ +5337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD\ +7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE7231992\ +24F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885\ +A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F71\ +0BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96\ +B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B301\ +3839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433\ +B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FA\ +F353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD\ +44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF\ +3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E\ +5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2\ +B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A\ +1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054\ +DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B\ +4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F\ +1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A3503\ +14B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA4\ +0FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C\ +78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5\ +B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2\ +BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF86\ +2EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377\ +131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7\ +AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB04\ +8CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF\ +8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9\ +455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389F\ +A745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32\ +D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810\ +E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615B\ +DE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8\ +EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA60\ +69369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6\ +D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F\ +7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF17\ +39C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06\ +EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A\ +1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4\ +A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8\ +545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8\ +D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B65\ +75A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364\ +A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6\ +BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D235197303\ +38D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312\ +C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34\ +090FC9BC045271:\ +52CF6C4ECE275EC1339D6FF1AC8CDCA0F2FBA3AA150C6DBFF58E500E + +[Skein-512(256)] +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000:\ +11E6AF5061A8DDD426A5B521A649FEA5A485A3259F71B4E72EFA860648AD692A + +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ +DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0\ +BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0\ +9F9E9D9C9B9A999897969594939291908F8E8D8C8B8A89888786858483828180:\ +E47A51E65137FDA22CA8A671AC8AC255E8C81730E798BCBF6B8F277E20D23D3F + +:\ +1E00D0BFCD14E4C7B457A003451D7A8C60EF00D410A5C443F5F03BB2D0848AE3 + +CC:\ +429ED7E0FE04482E0F43B187D07B086BF10A19D1911E61034CBDCA8021831328 + +41FB:\ +A2369D570355FC404C4217115037AAC1D035B05904FAC6ACDFFEF7E4285B501D + +1F877C:\ +87F4667094586DF08223586830B1BC38C26EC17CED50B5163F80F0BBD6C60B10 + +C1ECFDFC:\ +082BBAB29E8701472EDF7C74A030AC8C0AC7555AB41BD5DFA189BB79E3F6FB0E + +21F134AC57:\ +A06AE1CDB0D4E3B8DE64F864B96BCC84B78F0C653933E1AFFB4101C1E08DD869 + +C6F50BB74E29:\ +318BE56C77DE6E24CB0E4EF43919D066E7A923E41278EDBE9B6B991C5869F24C + +119713CC83EEEF:\ +95D9EBF047786083304434F6D1041B5DE80F084D9211753848A4BD2F215674A0 + +4A4F202484512526:\ +7A3C3DA19B30342096945112E074A544424AA93749014FB8D1446E25158E8E34 + +1F66AB4185ED9B6375:\ +91B959E639D30CA556E69B28CF31A158552D8C3CE53C97A805EC5412D9AF55F9 + +EED7422227613B6F53C9:\ +0C1B6AA53E1D148E677BC8DDE229A65147FE4BBFDE5A0C538F46AF787DB08C57 + +EAEED5CDFFD89DECE455F1:\ +D5C9F69AD4584B582D209E30B7C43B234032AAAC5AFB2F4285EE16B8D45FDBF0 + +5BE43C90F22902E4FE8ED2D3:\ +4A57C843E89574E4BFCF5BCBAD48E7B988CD87865065B60E076219BE4C9FE2CA + +A746273228122F381C3B46E4F1:\ +8A6177C2AAA181A6A3DDE78EB56007FEE7E3065B38123326D60050B96B34FC07 + +3C5871CD619C69A63B540EB5A625:\ +4214355B444E57D04496A6D39C8A0630161F91BFC5D4E7F5F3ACA78FBF455745 + +FA22874BCC068879E8EF11A69F0722:\ +E39C0547168F39A68E1D3D65F2594E1EFA882F7653C58D5DADAFA1A7E4BAB82D + +52A608AB21CCDD8A4457A57EDE782176:\ +4693D075D7CA346A069D1DFF49742179E575BC5512EC671D174DD48139B943F0 + +82E192E4043DDCD12ECF52969D0F807EED:\ +A8BE7D54BA61A7DAC908CCD37CC0766D92ECB2ADF268846964E55A42049B0523 + +75683DCB556140C522543BB6E9098B21A21E:\ +FC413AC58A0BB74D815062E24CCFAEF3498D64BE273530ECF4326A7032D54385 + +06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ +B689A1979B693189EBB188EF921F57CDEAA0012E36A1A2A82B0DEA4E09C453CA + +E26193989D06568FE688E75540AEA06747D9F851:\ +E1CCA81865E969E82AFE93F3AEFA79D5E05D58FCA4AE3093427FF45ABC17C006 + +D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ +47180B3B11DAA5FBC2885A395C9F8999BD4DEA2DBEA9E47D3EEDAB1F98CCCD84 + +57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ +74C3CC2BB5D0A0203D38912AD50A75D68601D6FA22A95776642B1CE1F795A127 + +A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ +A1AF63F102E6F131A30E5FD853FCD4041B2F913AFBC2D44242B1CB379736B478 + +AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ +40E2925E88F97C2FEB577532A9DFD61FFD6DCECD6403F2D2C681D0B64724AD8B + +AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ +94C5B5D4180F38383C119B13A2C17254DDDC12A72742C9C16695EB769EEBC60C + +7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ +DC5F762FFFC40D395EC14BE6A81811CC5C18865EE4DBA4315CF7FB48D85D32CB + +FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ +F566BF5EDD063970417EA77DFCBB2816B85F56AA3E2216652E76A8C175226612 + +0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ +F61113B65011BF8782745E07CFF7EFA1032C2906B621C0472AEF159F7F569C26 + +A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ +666AF4BBA1A0B1D3AB3D1D8F82EE3FB77A4D11B78F6898EFEB3123EDE176B670 + +03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ +207FA3956CEE3A92FE0BA467085C64FAE6ECDAC553D296ADF05061F471FF43C5 + +84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ +7117BA37EDAD8F9DF63BC321AAD902BF7B1827D131C62B70466C95F9F77FA49D + +9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ +39D51F70B8356741939916230EB0E2C114580056562B5BCC66B6B4AA058305AC + +DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ +46:\ +66AA19E2F0E39447A702379FD38E79FE869B378C8C60A495E89F6427EC50E568 + +62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ +B5A0:\ +9E6D3AC9CDB3D47603D7BBB80BA6EC09A01F5FBBBBCD8AA6D397AED067457F2C + +B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ +FBAD4E:\ +6C48FBF9DD4E943D208E6CB8BBA3D87D2989DA9271E21368312AC0E7BD365C84 + +47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ +ED2C2492:\ +78851F942E1FFF92D5AD70039518206F3A652D65D9BE7C63F87BD2A42542EFBF + +512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ +6B2EE4E542:\ +4712546AC21934811FDA8AC878D7B533D8877F8FC6238B6E6E243CC6AAB888BF + +973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ +2A1493D8F4FB:\ +A29A6ABFEDB0D6811FCD7FA629196C60AB3C38FE73FAA6982B9C99846EFBB8CD + +80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ +30A934467DA4B0:\ +0883758BFF55B86AEFD6DA96FAEA0623CBA4C004130DA6A46A2C3B57CC7125F7 + +7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ +C0308E29446B8ED3:\ +44D8C15A4DC68DF41C46BC911B5B9AAE144827FA04F7960B370C05B5BA6D8E84 + +C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ +723B20F67BA610C2B7:\ +21C8AA3E384349C7B181879521190AC9A919409CC1DB0F2AB4FDAE929E6A5FD8 + +01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ +0C834CE6EADC2BB86BF6:\ +2D461A1A25482258F203BBC8E4545CACA1416D0766291FB01245BCA30F4AC58C + +337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ +1540D29BA27AB8E309A4B7:\ +3A0E64622960E6FC6485034A0AC5DA480B41B9BE631709ED051AFBEFE4FE75A8 + +6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ +32B58EBC38FC2A6B913596A8:\ +7B871134DDE8454E2E81C7DF011BAACA0618AF97D079C7A166275211FAE31F81 + +F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ +38467205F5DCFB34A2ACFE96C0:\ +16E3DBC25596D513C4F299738A85675AA0162D51AAF6628D0CA6EA2B28E6BED6 + +CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ +B06CF0F5A0EA15CA907EE1C27EBA:\ +D6D8C9191769D23706AB3730B13CF4073FA7BBBF9644D8F0DE53A03A92BBCE40 + +1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ +BCF84D0D4726364B9BF95AB251D9BB:\ +E6828FAECDC944FE7A36B8E5EAC866D9657B7DFCC39A40F5DADDA7EDFCD149E3 + +D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ +C7F157298EABC4DCE7D89CE5162499F9:\ +5DC506190AC68FA6E271EE4C401598C14BDD9B0A627CBF80156A1B81FAEAB320 + +BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ +BEF788CDB5CF4606C9C1C7F61AED59F97D:\ +BB4813A3E3A65DE6EDFA6BB732DDAB477EE2660A03725AA292ECD0ED9974790E + +7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ +86E779CF053C77785AA9E692F821F14A7F51:\ +75B7D09CD1BF9D4C472D3EC3381961092B084AA42CEC1A4B8DC2BA8A2EE8D9A8 + +9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ +43304FBA401EFB2BDBD7ECE939102298651C86:\ +A54CDFA819DBFACF5281A8B1234F70DC71360D45FEF9249B164C424682D96286 + +C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ +87D68D28CC3897452F6A22AA8573CCEBF245972A:\ +A07CE23C1891BFD785C59AD1275590859169D9D3D586E5D9E71376E1DAB59220 + +EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ +22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ +89C3D08C43BBF3449F9FEE260F5CD56E988BF82556F4600A91716E5F9F87C5E8 + +0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ +FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ +B890D474B371A3B3C1BF791AE023D4BD038212B3E58759D3B8003C0463B831E3 + +DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ +9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ +CC76AEA3EC11317C28A10C81EBC12B0547BF206B95F7394B58A434C5A6F6F13B + +EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ +E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ +4051594D6F14620838A8DA93116C90178F271F4DA8B65646A60F62069E8DED86 + +416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ +97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ +51696697631BAFD6F411AFD2A53968662BFD3BBC66253B276484566044780C19 + +5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ +A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ +0239EE74B056C2D65D372856ECA2D5949D595D3EDA70085AC7490574A2D01EE8 + +7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ +66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ +8052F0E9D52F64ED9DEA11270404E99778226ABCA4D9E3D4086C7A120DD4B573 + +2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ +4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ +12463A357E0C2ABE748693BFE81D52BFDB782C7F3AD5A381BE92DA1D5EA0BA87 + +95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ +D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ +4EA1D6958DA1A7AA6DDE7A1973F2296697B98326DF10D26BF83026C3EFB3829C + +C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ +30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ +8AE7D93A38166DBED49B6144D58664C0A188ADBD9AE18409479579E82B556E7A + +F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ +05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ +27551CE7545CD33AF7D6B80908E65C76DCDFCC2220D47C2DEF878E93281D184B + +E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ +E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ +511C87F11C0FC63BCD6BDC79110E2A3DC9E9E8E274ECAA92021F3734F059D5B2 + +16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ +DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ +00:\ +C7F53C3BE9A3ADF6FCF6B1148D900175C3AE29701558A17800B0995536C1579D + +FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ +B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ +37FC:\ +E05CFFD265344EAB2A47E42D4A0380B1C7C8D41DFA87CF6F2CC69F378DD11960 + +ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ +2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ +599BA5:\ +0AB68A3A20A5539B3D93BA80BDAC33473ED509CD015F9E1F97596641C7543BE2 + +36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ +479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ +40706B05:\ +D32A031715109945CCA49ED388F685509299968D56F9A74BD283EABFB93A640C + +ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ +29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ +31D06C77A4:\ +7DD01BEE13227DA797EAA4D954BEF62953B88596C83177D0F7FA99C0B0000C36 + +94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ +EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ +A259FC4FBD72:\ +61ACECF69E5B1A9C2C2E18B0C1F030FCDF0092929D2D35CAD3B531C288214792 + +13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ +C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ +DBE5FE9694AD6D:\ +CB7007F2B749D27412428779B903D02FABB36C36BC7CBE4F15849BE17212C363 + +1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ +E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ +7EF57B91397AA8A7:\ +A74E554018C7FD1CB9FD5071760076EC60CB1129179E1359163D00E6BF77DB18 + +BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ +7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ +44B78B2D48DE1A08AA:\ +6F94293899915204CC387F419C3ADA24BBB210151983AA2182AC0AACF3A3A5A8 + +0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ +DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ +B3A6C9FED24D70749604:\ +C6FA8A35628FC4FEB4C791929D151B083DAE074D6A56B8774B439EFD670646F5 + +BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ +A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ +8B033F77D384CA01593C1B:\ +143EA9E408A52C8B61F156A4CA40CBA6B3957D8406A3EC6E11CD47AF7937F9A2 + +90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ +B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ +013C23F1E9611D595EBAC37C:\ +C95B94E144B3A01562AFE7DE278BB9E563F91309BEC413E2AD1688DFE9B63A54 + +64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ +9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ +4EC5A49FFDB59A1BD6A292AA0E:\ +1273AE0047382469F025CB8DDF56B627AF5701000113907C36C888346182D5E2 + +D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ +B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ +498E1F6C82C6CAE6FC14845B3C8A:\ +EACCB48C714CB1A01FEECCE044B643289AC76BFA33109B9FC610110BEB171903 + +12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ +88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ +5B01FECFC146BDB251B3BDAD556CD2:\ +4494D1708CF9CB3F9481E0DDCE684E70007731F42352969EF22AE2E9455DAE93 + +871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ +DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ +AE9CD5CF0991878A311B549A6D6AF230:\ +74B01863854AE0C659805A9DBEB0C0DD35393F251F379384AF58ACFEC09E95DD + +E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ +105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ +B50C7C681E773D109FF7491B5CC22296C5:\ +BC2794E929371BB9A8559CAD010B68F5DF2D3622129928ACFB27CAC307ACD339 + +E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ +190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ +2C7CA303269ED14014B2F3CF8B894EAC8554:\ +A628B977C2D1A95BE0F4D08D7EE8CD788F0D5BEAE3E32085292328272A7ACB7D + +6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ +ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ +1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ +94B6A16A64E79AA8A0465902C245F71618D3D552358E3DA304808686D0557AB8 + +4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ +8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ +37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ +8A003E1C23979216574C13FB6AD09984F7B931BA8B0F4BAEDD58A73F2598E822 + +08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ +B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ +85EA51D49894E45BAA3DC707E224688C6408B68B11:\ +BCE45B4D7735D0807E818E0025646391E147C30E3F53934439F12FF71C98777A + +68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ +8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ +04E18D475920CE828B94E72241F24DB72546B352A0E4:\ +ED0B018161DD4209702F8AC7709FB36367D3F368D262F25AB9862AC67CF27A80 + +B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ +CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ +BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ +205F82F248A0BED634985E5B7B90CBE09CF4453A490C01596F3510739F077ADD + +0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ +578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ +44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ +B20CF7C5DF1E854E092AEC3696D17302EDBACEE9D98F9F37663465B0C4F669F2 + +1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ +F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ +4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ +6B37499CF7E5C8DAE33148F8E2A19D4A8ADA17D49761F0A81F6698DE11F413C5 + +B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ +C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ +E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ +40EED4722ED52B5A839A4818AE20A643792EABCB7C0595F6F11590411F4702E5 + +CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ +5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ +27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ +6E57E65EE1C4356C7BD4E33C61E0494BCDA0039178DCAAF08337C21E35E0A9D4 + +072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ +E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ +A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ +4CD15803384770305889D50B73E6FA8E0C713F07EEB43C28D5F07CAA0470A6CF + +76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ +FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ +29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ +D139EE1C13D44DBBDCF8431E5595061ECC781F861081ED0E9A22066BC91FA311 + +7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ +650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ +AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ +8B993DC3236D3078C2F4B917435CB2DD73BAD44AF196FA1CBA53A0C4343E804E + +E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ +7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ +8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ +F1B43FAC50156FECF5D859EDF896A9AA011E827E42790A458538EAAB47ED7BA0 + +69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ +1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ +040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ +18013D6955E1364A8847F431351546B61F2B4F24C384A9ED60A7817432A2C20E + +38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ +0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ +0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ +49:\ +D2916C3A168C2D9D79C3F91FFBDA71B2092FB62D5BE7AC23235B6245BCBABE0E + +6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ +0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ +2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ +5B52:\ +5FC0CFC99C9C57812FAD19416A6F7C3E81FC1A854FBC2E60A723B803B35862E5 + +6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ +B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ +C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ +89CCC1:\ +EC7120A58FDD192138B64D8DDE1C9BA3904E18AEE30580A61EC82567BB117435 + +433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ +14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ +22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ +6DCBB4CE:\ +AD1F3CAE6974D135666842BAC782589BCC775A52D9D38E1F8E986DF9380E0AE8 + +A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ +7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ +881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ +BADF45685F:\ +EE5E4A142053D19B10DE3DC20E44695AE745751B941E3D15EE8C6123E89D7D85 + +006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ +312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ +96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ +9B62C60A4771:\ +C64F497DBADD60A772053B5E95660E8CDF349BDEB9AAB57A8EC18D2D4E56A2B3 + +F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ +A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ +9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ +CA58D5DAB38ADB:\ +CF9599A2A65BF618E5B89A14C1A740B0BF716FDD04F7E2738FFC58BFD1A3F15F + +E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ +F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ +B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ +21691E1069413848:\ +9103BB40BD80708918784FA2B5B24D0F5E45C78367D313823798455D88A3DDAC + +64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ +D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ +FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ +B57D6D0C2EDC4E78D6:\ +15A8C8709617C4995D19DC7CF349E29E6E1183E7EE3543D7759B3442B46DAE43 + +5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ +CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ +8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ +CD19E781AF20454AC880:\ +89EFA7391173D1DFC34DA1E5261F08E6DCFF33D6B6B63A9F30CCBFC66E89171D + +03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ +F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ +A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ +BF0FE3C32C17AA188A8683:\ +5DE806282012D68B1AD059E0049317DDD521F9B0297A72EF04DCEA3B9DB1A54C + +F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ +E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ +0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ +2E937F21C005F17411473041:\ +CDF48A0C99695521F9A6C47E868E95300AEDBE25E22CBDC0966849843CE4AC86 + +758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ +62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ +2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ +29F695815D866DA99DF3F79403:\ +1B359EC23B574C684D0511DD875B52E771D23472AB7542147E525E5596639C68 + +47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ +84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ +3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ +1BB15B447589E86E8D76B1E9CED2:\ +1C621F37EF11339275EFC9AB1109D29B3141791D870DE33684BCCA055E2AB99B + +F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ +4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ +853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ +AD3D7E886DEA4F005AE4AD05E5065F:\ +010BF6553870870E6D3AF084A2E6EF3E5775827B78DEF9FC4160B49E3DE7D789 + +58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ +7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ +68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ +EAABC35F5C2B0A0F2379231953322C4E:\ +F87862441FDBE4FA75EE1EE8A6444B6EFB75A49EA0A16DB7F40E17287699CC83 + +BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ +4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ +2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ +159388D5C3277E227286F65FF5E5B5AEC1:\ +F69B7CBA54F6E77FCBFBFC6B1F8380F2EF4ADE3926F1BC31895006DB749D8213 + +8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ +A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ +D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ +407847DD0DA505AB1641C02DEA4F0D834986:\ +535C6FD93EB60D3568BAB26B5E051645255C685055BE055BC3C28418EBBB4273 + +B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ +33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ +99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ +7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ +8A2E48C852367E48C791F4D4AC2413827EC428BE0BD7729D014F4EF790C0C3ED + +2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ +A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ +2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ +205AA1615DB44057DB991231D2CB42624574F545:\ +9E5A063FF56228999FF3B254BBF4FACDC4D99620838C321542A9EB3471D35A62 + +DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ +F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ +2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ +157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ +03E26068B45B974F4164CEE5C4B9F4F603B4161FDCEC240E08D1771379D7187B + +42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ +0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ +0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ +3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ +7608A56E7911B370F079D5F31FECF145A2CF5BAF9E5B043BA654B071846A7ED1 + +3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ +FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ +DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ +46176EBF044C4784467C700470D0C0B40C8A088C815816:\ +66485D9843D6D2B6E1AAAE7B5A1D23666868F8913911E3BA6D51CFCDEDBACA3B + +D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ +91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ +1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ +EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ +738940EBCC4D58E1F3B00342BAB5B105AFD5DF42B5C6C82DA77784822CFBF53F + +626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ +1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ +285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ +6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ +9AAC97A6E044E8069A60EF9C892E43C39BC053920E43231C064587F3408B138E + +651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ +27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ +9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ +C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ +30DC38C1C43E8E7115681B122857CCB6B8937DA6A1F818B3621ABAFD0EF70100 + +8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ +BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ +DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ +D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ +A9AAC496D31FA2E4C9E64E10183E9CCB73C331F0414D3FF6709E1FD16EECA32E + +53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ +8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ +4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ +47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ +9EA9F15C82857BFF45A9C23FCDD4173F719415DCF81A80312CFAF4DB2A66DE4F + +A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ +E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ +2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ +B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ +EA93962E7E6A1A9C6B02B35C581112958B36274F3C3C573F48B292C7C89DE5E0 + +0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ +5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ +4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ +D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ +DDACCEB467A0D6373D99E4B8ED84AB60FBEEA00958136497BECBE206F2EF80F5 + +A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ +07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ +6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ +AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ +121E3D0FE6AC51609FA92D5533F03DCEA2449DD7DD8151D1CC23A9533471F421 + +2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ +29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ +E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ +98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ +EF98FDE255F2522CA53A7165ABADEFB0CA15C1CF46787627B3C73DE98B7068A9 + +10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ +3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ +A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ +B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ +E2:\ +1DDC1375806D28D594FCC4E89EB7FC882B83E4421E98BD7F0A3BFFC03F55402C + +9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ +1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ +3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ +52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ +61EC:\ +F69C19A5CE68C4B8713300DC064A9EF2974B6B25F167892921FEEF057523AED2 + +E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ +9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ +2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ +609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ +9B5EDC:\ +3EC08D73A250AA726C7D2DAFCFD943D28EDE8E7DBD8AE82D653CE98B837D43B2 + +FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ +CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ +B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ +63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ +42D75D68:\ +4B4FB44BA4355B4A8B9B7EF07407919F0791E39F4A13D62D015CD3361AEE586C + +59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ +A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ +BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ +E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ +7815BF3C49:\ +196488E73E0B92CDC9AB00ACEBB980FA89E0E68408C504FD0F7EA293049EEDE3 + +77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ +61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ +B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ +025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ +951CB2068CC6:\ +656CAA5587FBBB782CAA71A9F136C38BE5F7B566C86D9BCCC4DF2DBE1DAC2A55 + +B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ +BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ +93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ +AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ +B0FED6A8052FBB:\ +FAACDE40E4EF8945E9585FBDD745CE646BB421E73C2BB1D36E1CFF48818127B9 + +B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ +35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ +780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ +015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ +37674C6F8E380C04:\ +C6F6F5CD1EA117D1EFD66143AEF6DD498AAED8D5675EF3A3DA9344CC1C0F78C6 + +04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ +DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ +D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ +F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ +F22DA873C601016A0D:\ +C1C68FE2A1C8A299BE50FD321388B66D5331B6A62105069AD48FD8861388B3C0 + +8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ +DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ +472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ +994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ +1373FB09A1A6E3C7158F:\ +A0CA92610633D90B4AE83290F367318CCED1EF8AC4AA89F8B706366E7C1DC495 + +FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ +ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ +084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ +B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ +339612E830E9E7A9C29065:\ +9415005A00BBB5B648E0875C62109C2D2619D4AF352300D32B9283C49BF365B7 + +9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ +B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ +5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ +8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ +377838973C1D943C22ED335E:\ +96CBB359587B2DE3686157241CCE9C198BDE88412BABEA7E3421FE05156FBEB9 + +2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ +725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ +798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ +8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ +2D0C9E7448DE3043AE22FDD229:\ +FC5D94CE94A9DEFBCD5B8739C3EDCD2496D690617EAE7CE67DFE51896CDAFBD6 + +94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ +C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ +F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ +E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ +5B6C338CBB8F6659D342A24368CF:\ +77BC570C7F1001D4F2D7404F9DD50AC370BC7AB2BBC50707BC7154AE7C8C8A16 + +EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ +76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ +C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ +E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ +F6954BA0801A1294CD8D7E66DFAFEC:\ +1CADDC9DE421B45C733D039F6BB45FC9B2F9A527CF28513C8F3F60FE3413C845 + +157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ +CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ +055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ +EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ +256FB33D4260439CBA73A9479EE00C63:\ +B66818877735C0FC3E982A4FC004C8231B2F332F24FA0BD4CED033CBF56C0695 + +836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ +D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ +A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ +911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ +5994C1DBB3B5C7871A11F5537011044C53:\ +F4110D27E8E7C4C4C5A3A5AD6C4DB25785AB43FD57BD60CC7643BA5D43130202 + +CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ +2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ +586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ +4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ +4E53426CAA453F8DE1CBB57932B0B741D4C6:\ +9E588689BC703D11FF99CF6A45F6C03DCD79B030E21ECFF55A76438CDB5456FB + +7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ +868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ +83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ +C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ +C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ +59F1F0F50D57DBDCD98FC3E93D280287E8B4089414C2EDEB9BBF7633DA5ABA23 + +EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ +BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ +E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ +EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ +CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ +704C9F0BDBDF7FCE94984DBA0CCDA0742E76A7E1A313241CA71BB675E3E6520F + +1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ +F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ +656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ +46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ +8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ +32C533DD299AF65FF382A5639842A230EAF2F87E601ACE1430877296EFC3C039 + +4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ +7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ +E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ +4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ +99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ +A330F9BEA0E6798447529A215A1910C9F14EFB3B1093AFBCFFB99AF34C85E942 + +D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ +66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ +B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ +67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ +F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ +CB146217DF22A6BE48BE40B830316D8CF8B52CB867150729B7D6F447F1CD86B3 + +842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ +DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ +1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ +48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ +15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ +E9F33B20CA61B4AF6D351554754C125A8B00BD11FA9E13EB87F4149E028DFAB7 + +6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ +C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ +7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ +66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ +5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ +DD5595C48CD407A0CF3B083B173D41DC8D040C8384281F77EA74098836BB4F6B + +51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ +7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ +BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ +1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ +1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ +A23D49330B489EE5865CF3EF8A50E3D907AF5A466352486959BF363377D37584 + +83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ +9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ +0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ +AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ +45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ +4FABE0509494DC148CB5124EFB102CF46A6E1EBFF1F7B8E0E1CBA26D821202C0 + +2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ +D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ +1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ +BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ +B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ +5AC11CB4A0AA3D2F562C6601774B72731F230D8B2283975E7D4EE397C22C453F + +CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ +60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ +A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ +A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ +0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ +0B54924DEC7DDC42E8BF6ED7F498E5875CED195115448D3379E46D72D346C509 + +F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ +10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ +AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ +568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ +46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ +3C6162A88D4E9DBB17271204B5C7EEAD685FE1FE594FADE341235B2CBC68CEC0 + +25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ +8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ +C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ +4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ +01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ +946FCDEC1F60A84B0D6B2AF0C756B28F9D0DF5BE05A907674CA43BB62D74E950 + +21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ +CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ +FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ +9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ +447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ +B84EA6716092FC94C53E11FA506D35339F24DD09A5E114E9753DEC8B7C7E5604 + +4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ +74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ +5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ +DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ +A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ +CF:\ +BC33DAE57720B9B0C4112E0C301F0BC4155DA8B254DE306CACAD9354CE598F2D + +FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ +B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ +5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ +71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ +EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ +1DC8:\ +3CBFB2D8628C0DFCF709F2406E226DD7551254D7EDC884595021950C003439E6 + +E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ +54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ +009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ +2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ +99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ +C25E88:\ +0FBE3BD588D17869B12B9398EF32071C60470366B3434C3CBEA2DDB66E2AE915 + +F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ +65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ +E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ +3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ +BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ +C5C06729:\ +02338A8F5C73C951EA04098AA488914FEFEDE9FE73ED58B8FE9B3050981BA8D8 + +CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ +68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ +6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ +F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ +551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ +CFE0AF93EB:\ +B91FE78406406F7729C81AD744E460E3285659039A65427F40520D9D9A6147E8 + +2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ +331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ +2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ +ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ +05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ +F467BC75A9D1:\ +B17D0DB11C55BF13127FA695B3864C394F46BDD9BA777B1ABC73E419083B2696 + +0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ +EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ +A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ +AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ +513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ +C6F4756017FFF5:\ +4AC28E88BBCF2FC39280FB67E882E1EF7705CCB24B3F856BC8FAA7A02BE6DD29 + +C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ +E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ +C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ +798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ +9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ +45DBA58E6CB2C8EA:\ +BC4AE5A53728E73D1EE3D8E9AEDEA6791575B542BDC92C4E9E0617598309478D + +B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ +C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ +01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ +86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ +10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ +E8419D48FDFBD744CE:\ +B203F5364F28DBD5D4411B4619411AACDD3C32D1BF432B9F9802617C1C2B4BE3 + +A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ +7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ +6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ +1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ +4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ +359D5D1EEA105F28DCFB:\ +510D0553E4E438B8D994496CC91487412F67A311ADDCC798E4D47D09E4C13BAE + +E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ +2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ +6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ +D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ +8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ +7ADFB974EE205A9BF7B848:\ +435139166C6E7EA175C46B26FE1F240204D77EF9AD3985E79CB37A32AD886229 + +B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ +E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ +D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ +EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ +7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ +EC77F29D211BE89DE18B15F6:\ +CFF89A7EB8137D51D182FAB2B119860DC11A4D8F9F6F3B5CE51A63631CC31821 + +DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ +4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ +49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ +9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ +50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ +63EFE793489C39B8FD29D104CE:\ +B0CAED5E052B52D9CD6F537D68453D6B67C02BB3C2D5277E7243AF289FFC30D7 + +BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ +DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ +02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ +C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ +711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ +AE5B257BE36A7124E1060C170FFA:\ +021C8CAD21920F53F068C7AE3AFD9ED5941633CFE9574265B1E47B637581BBBB + +5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ +F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ +5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ +70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ +001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ +480AB79D4E6415B520F1C484D675B1:\ +70C70C7F71EF0F7AC0C26F1F3EDB538FB7EC1539B452882FD9F6C24306D54398 + +A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ +CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ +84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ +920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ +E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ +D42956588B3B58CD948970D298776060:\ +45788795247613C2EA7016DA14152F103C0F2F2798148BA2CFD9083F128698C7 + +06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ +3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ +678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ +2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ +8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ +A96CBDE5FBC953D9E576CD216AFC90323A:\ +3A49DD62D76CF4657FDC786479E584669CAD59F9A5B94EBBEB01EB9D020CD529 + +F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ +DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ +593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ +0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ +358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ +67B5AD93D874812A1DE6A7B93CD53AD97232:\ +B2BDD3B5EBF32DB12AD4D6FE6C49CBF3BC9125D52DD17978FFA8FEDD4398947C + +9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ +F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ +DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ +85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ +D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ +352BDD3740DD6A16792AE2D86F11641BB717C2:\ +D6B4D9E7B448B67E15093D3FDDD1D473C742EA5A13BB311A4DE1D79AAC72A57E + +5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ +F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ +71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ +865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ +2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ +9ABA31EDB903B28FBFC33B7703CD996215A11238:\ +E3B800D89C4DD23DC554D9B78D9B96125DCF6E89A371186D27808B5D797BBF5C + +576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ +8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ +13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ +9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ +32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ +D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ +A8E2A468FE0165C5F8905299D2C155A54E52E24B45886AA23371E0F7F6EFF00E + +0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ +D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ +3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ +7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ +F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ +C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ +C3B0543C39039856058A98B18953AED843E9B359D94BDBC000348B319740F448 + +3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ +2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ +41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ +D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ +1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ +6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ +B630FF7E906FE7AF98DCA85BF1A1CF9817DA235AC13D2970F071C91516A29634 + +C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ +58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ +21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ +104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ +A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ +CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ +F86E73D19616F1B3DAF93E969CBD88B1617669D1D63367DD553AC8C3CC784606 + +8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ +4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ +76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ +B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ +C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ +C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ +667E4CA173E8E2E52D1840664B8C20D0C87B4D67579BCEC686B084FD84C6BD0D + +C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ +D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ +D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ +7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ +D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ +36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ +BE2006B2F5521B05D0B862C93EA896B7E08E55EBB9DAB65C197666EF565FB698 + +8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ +BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ +8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ +BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ +7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ +57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ +499DF5B0D7521A5F8A25E75956F52E6981589873874647B97C26B6E8FED86D30 + +6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ +FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ +384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ +B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ +4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ +55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ +A9B83C7A64FDC954C9AFDF05BA59AAA62A00C3AC15AECCC652F32CB093D54E86 + +C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ +4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ +761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ +D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ +B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ +A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ +5A876086C025566D3579CF97B0A19204024059DDEC59E12284C191F70A7AECAB + +07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ +0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ +475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ +F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ +6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ +6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ +FDC7006493C501533937B301734A4FC03062932BE2B85121CFAB77704F328770 + +588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ +D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ +635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ +822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ +F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ +1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ +0AEF5D9189B8C1FCBB8879177AD9541148CC3FD096A4B18736AF524BA7F82862 + +08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ +D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ +1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ +698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ +47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ +E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ +2DC25921699467CA5CB104B49EE27FB9F5850005C68D10E459044B6C048C00D4 + +CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ +C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ +8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ +DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ +696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ +7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ +01:\ +DE5ADE0B0E304EDA2439C7ABAFD62A8C3EE0F5BCC5B3B5C78EEAAD4BA58A57B8 + +D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ +0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ +2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ +CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ +9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ +E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ +4D4B:\ +9066FCB7FCE7505C662B46E921A63B864F300402B6DFAE82789B1A05D63A378C + +8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ +EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ +1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ +18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ +299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ +4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ +A3BA86:\ +C97FE695E0A6DDC215810AA2DAC517878ADA7D2B186DD9B37482C31F4E532A0F + +84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ +69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ +1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ +61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ +B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ +477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ +FB9E4AB6:\ +AE47EF5C61E6AC58497ECA06052012A1CA14B86B605BC8A593326A7CF2286046 + +FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ +31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ +59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ +A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ +CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ +7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ +91355C6280:\ +83642CFED259EAB056914DF8825ABCD930E0199B43A624A4513FE4DFC60765E9 + +70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ +62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ +225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ +A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ +1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ +366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ +AF1AE717238D:\ +63C10EB69F4BA9A18A0E0D620D5F059E95F49623FAEAD0F158C716DD72E4CCE9 + +74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ +85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ +D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ +C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ +A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ +16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ +528F9AB49C79F2:\ +BED58E843BA10C20F0D37EE1CA553B81CBB6F8347B8DE1B90A0FFF2701D76C3B + +8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ +AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ +584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ +4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ +4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ +5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ +EBDDC89186839B77:\ +00CC683A0853D9E81A193D351B10F9859AAA51F73D38C8CDDC713E85F0488BEC + +FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ +E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ +AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ +CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ +B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ +6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ +C66F252F6E64EDC96B:\ +B1B86AD854EF99D676C1BA60D99919878054C601620478494B6C589F099172FD + +B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ +5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ +252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ +FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ +25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ +232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ +5363892A2495DF8C1EEF:\ +D28E2F5F5A8C6E99542E127EE08A3C0CE367BC9389440CD4B0621DB3D175AC00 + +C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ +FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ +272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ +414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ +49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ +199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ +5C6D1BE4BC79F08A1A0A46:\ +E6029498E687D6F382AC1FF7CC4637873ACE78E7646A44DEFA98DE0FC66D13C7 + +4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ +A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ +2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ +443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ +C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ +D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ +6EB6E4A80358ACC78647D043:\ +316D41DB4674159E7B3CAA356BDB3E89F9D2533CBC5CE7060CD068044ACE705C + +EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ +F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ +D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ +01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ +E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ +A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ +90BF2C4062FD2AD58F906A2D0D:\ +23564BE9C1E771F667072B641CFBF98B6DE366921FE06D5800D09A78D1B2ABA0 + +E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ +AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ +E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ +EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ +DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ +EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ +3EE46FB67422F814A68C4BE3E8C9:\ +811181C74DC99406B541A02D7613B488A6DCAB5A418C8F9E9A65A5D287CEEEC4 + +D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ +C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ +4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ +38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ +806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ +4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ +A17E776C0D02856032A6CD10AD2838:\ +DF0E92A55BC924854CE90A3231CA437352800FAC355A0303E59AF719AEBCF928 + +F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ +C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ +39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ +42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ +4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ +CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ +2ED1C78631FD23B4C3EB27C3FAEC8685:\ +29C0D8CB45FBF24A93E94A5D444AA4DA86A35FC1EBC3A1D074F9A4F9FDC8C33E + +447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ +94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ +286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ +D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ +04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ +72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ +CD90333A77BC4E1988A82ABF7C7CAF3291:\ +4FDB760C7C304E04EF821770F27D965AC2B0E3413F354264A48E73AAC00A11A3 + +9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ +E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ +29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ +ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ +E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ +5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ +626C48322E9791D5FF72294049BDE91E73F8:\ +E5D2906B09C4EDA48F1DC1F97FB281BA919A1781835F79CB66F97DFA5EE9A6AE + +AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ +1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ +42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ +A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ +DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ +B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ +774BE89C1114DD531C011E53A34DC248A2F0E6:\ +CB499830195004278E91515FC1B5677947F56C5D435079C115611C56B1114826 + +3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ +B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ +CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ +246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ +47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ +94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ +A7059ABE99182714983B9C9D44D7F5643596D4F3:\ +C528029336E2DB222F7DF18E81350AE44C0DC06B91E51ABE095236607012250F + +3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ +BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ +374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ +6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ +63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ +5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ +4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ +6384F4F86B59E42CE0C2A67521C83DD2D31E4F2EEDABEF5572A6DD2613525F83 + +7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ +575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ +BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ +E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ +AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ +7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ +591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ +945B8718D14494DBCD296611D2A32B2C1FB8DA19FAAAEE4CA5E8C6B6535F10B8 + +7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ +D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ +37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ +3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ +A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ +9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ +24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ +E6258B0788EBF57D030C625000B6350BC122800B0EBEE25B6A05736743F4517F + +D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ +A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ +D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ +33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ +CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ +0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ +52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ +CBDE4B2715DB042840E80E20AAF54CAF7770026C49140A13808610318FB1B74F + +2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ +D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ +7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ +5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ +AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ +B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ +806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ +DA60848F1B6606F72B9C2F0946A17DFE1B6DE31B6FC0A1D20EBFC1BBF969EDF8 + +5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ +271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ +CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ +608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ +D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ +990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ +2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ +50425B8A6993AF09C8E6AE22C136C04386D61E9437008741A067E97957060D4A + +C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ +56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ +8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ +50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ +1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ +F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ +9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ +872DC8B8F7B200D83101677E6E5E0E90661FD8A591E84536F872E330B2D288E7 + +7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ +5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ +4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ +DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ +261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ +CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ +31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ +E5AA12FB17C67075DCA98DB2DA1395A2D738629826CD69C28F2ED438D0742C29 + +7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ +266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ +7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ +B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ +357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ +5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ +719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ +03C7BB658E15EF862405999D673EC243DA44432412766FC0FE7DBD2DE0C0953B + +988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ +8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ +3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ +267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ +A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ +8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ +D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ +A26A94B2A5FB0B847E0B691CA58C56C249B68B6966C1C57ACAFC69BCB59588E4 + +5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ +F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ +C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ +A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ +1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ +4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ +3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ +C860C4C6C0D8E68A61F98E4F2FDA791F4F8C67327A3411545A9E5C6D37E7876F + +47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ +994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ +DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ +37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ +7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ +9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ +EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ +F8A4EBBB9408DE592BBCE7DAFB7C3099F2A40421F30A6A8B91DCAD915617EECD + +8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ +E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ +DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ +394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ +43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ +7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ +A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ +E8:\ +04B0412F27BF62A6E5D67D6BC51405A31D4B68B0975ABDD8D7BF6F1F7580037A + +EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ +F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ +85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ +C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ +4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ +97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ +345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ +6427:\ +B8EDB1D60863BE7151070547291BCC11EFBDA4D6909E528016BAF99A3E30DFD1 + +23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ +89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ +DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ +DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ +BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ +F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ +DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ +630012:\ +610136223FE73B3BBBFC6981807986215ABA21EA75F67AA5483DDDF702F06ED4 + +0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ +F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ +C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ +A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ +A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ +95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ +4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ +78DFB921:\ +BF9E2E277D79ACAF2FFB995CD7B2A9A59768F20705490CF1EA51F2EA91129E34 + +3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ +A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ +4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ +BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ +DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ +91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ +9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ +BB0D19F909:\ +665AB405F342E3652D427A13BC5C69B7E5863CBA2B65691B7952AC6573A87B44 + +747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ +6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ +57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ +00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ +77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ +81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ +04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ +BE6BF8082E8A:\ +ACB07139B29E569BA65C4B40A850554D30E863F5681AC7D9B8EE35CF81763F84 + +57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ +06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ +6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ +4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ +D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ +58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ +FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ +E839A9D4608F03:\ +5D08215314B5C56908FD7488C5FFE47BE95FD6CF7D8C6014E51532F4E751CA6F + +04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ +10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ +2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ +BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ +2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ +8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ +8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ +5153592EA81C6FBF:\ +116E8D8C5AF649C0D15F2194CDD3291A15F222A6F88A3761943E846F33FCD9FE + +7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ +735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ +1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ +7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ +39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ +9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ +F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ +604F5035C46B8197D3:\ +2C0AA5EF88459A493BDD073DBA18CF4977633CCBBA580CBE604BA6FB3E922DB1 + +E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ +94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ +DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ +7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ +60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ +7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ +6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ +07E3B953ACF99964B847:\ +4A911F2687A33F5C8E754829044058F87FDE6A72907DE042560A5AF51554D20C + +D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ +32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ +7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ +8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ +07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ +C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ +4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ +6C90E8C4D100ACD9EED21E:\ +DAD360AFFE0E7B3D1157BCB4657177775EA28B45557D6A65D2641E2046166F87 + +3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ +AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ +18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ +A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ +E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ +886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ +4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ +E2DD603D9EA24DC7C5FD06BE:\ +6032B5B05F13DDAAC2D93D57A5EFAF1B1C1CC49CE84CCAF2EE1286D1F1EBF96E + +1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ +742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ +B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ +69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ +E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ +9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ +779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ +A80012976F31FFDF305F0C9C5E:\ +9B9FEE76015A257580598089FA621E0CA05E7DC2AABF7CE9CCFDCF061871CB7D + +08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ +9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ +53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ +479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ +B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ +DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ +3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ +B461A40645BF176601F1E760DE5F:\ +DC8CFB916B692D02DF855014C611DEFDAE743EC8451DAA9C7B1CE3935FE41C16 + +D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ +5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ +E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ +F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ +8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ +EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ +1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ +86C226169FF257954EBDA81C0E5F99:\ +B1A50F01F62F4B06B9596EB0AFAAF5E1D0E8C067D0B49023D9E747998F23DF43 + +5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ +431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ +40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ +A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ +0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ +2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ +83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ +D3C356C914FA06B9A7CE24C7317A172D:\ +77C88F224D467CFFEDDA4DC6E2277694EC4223ECC318C24EF3E45E4350F2C921 + +6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ +E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ +D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ +B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ +645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ +F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ +39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ +68F50D79F0C9C7314E750F7D02FAA58BFA:\ +2163A2543C14FCC35C3A89DE438ED5673AF2C7694D465A9B4543D8E32DB7EAFF + +5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ +4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ +717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ +4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ +FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ +9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ +39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ +7DF95B60FA8712A2271FCAF3911CE7B511B1:\ +8E6502BB8EF5E3891B1A9F51D5617066B9FD4F4F5FE65359EF0A1D2F4C6A710A + +03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ +C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ +C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ +261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ +0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ +61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ +37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ +A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ +F7B1D93134A0CC838E869BEDA32CA2D9D9BEC6E7A7A45875DE05EB68B0417F73 + +2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ +C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ +4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ +339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ +5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ +F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ +7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ +B7F5CB9923AD97058EC067700CC746C127A61EE3:\ +9A6FF92A2AE3BCD719D5FB66B029F67798C929B4E67AA91F9C9F8CEE6B54C36D + +90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ +70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ +495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ +DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ +5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ +00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ +F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ +CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ +13BA5049059F654500FA455A7E5A44D3ED0E2335169F96357FCEE1D6FBD659D1 + +2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ +6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ +6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ +1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ +0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ +B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ +2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ +C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ +06C6B67E13014CCAC898010F86BC8FDDFBF694EB88934FBBAB86FB6B6396C2EC + +721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ +EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ +B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ +FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ +2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ +5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ +C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ +9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ +1DA0A375209C2882A102714BE037FF04128D072FB5C6431CD258D9A1D59AFFC8 + +6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ +C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ +8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ +90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ +6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ +0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ +CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ +6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ +706229A0AA969CAA09A896C2FA90F7917E3A18D05D1EB5682053D8BDCF512C6A + +6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ +70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ +5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ +E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ +2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ +4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ +27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ +CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ +49D1A717356298D5B8E2B07735716C363099CB0431A3A677F4AD33965117582F + +B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ +E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ +0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ +F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ +0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ +8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ +547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ +758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ +922B6E073DDDA9E57F15F6D65B66667921BACF94B229CE0041E7150894826956 + +83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ +C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ +38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ +BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ +5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ +3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ +8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ +5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ +829618746241EA263BF89B5A908E7ED475B7EB53B9B290A20134C2670F7A2496 + +A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ +A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ +EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ +3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ +80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ +49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ +9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ +E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ +2ED33A40EE546F0D5BF182AE69258B4632FDE6501C4319AF4E348334DDCBEA9E + +A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ +A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ +0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ +639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ +B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ +877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ +1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ +D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ +325F7F78EB55A3AB1C9DF0C79AD6B325F1DE2EC4513CD0C50074D96A4952E704 + +83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ +9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ +10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ +8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ +88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ +0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ +2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ +04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ +068C2325A49AFC18068DC7780138370FE1556719A3614B4CBEECE37BAD97B5BE + +3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ +623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ +15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ +A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ +B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ +C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ +817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ +5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ +A43DD35DE780E9DDBC86390E83529C7AC0717A351CDBF9719AA5F45677187AC3 + +724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D\ +21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DA\ +BCE506E558720520D33352D119F699E784F9E548FF91BC35CA14704212870982\ +0D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C8\ +7E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1\ +A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CE\ +C6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2\ +FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195:\ +8B451F3F47238313FC8D2E289193BB7EACFE3D0EA42162E2BF6480EB19DFE24B + +3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A11\ +4E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B2\ +92D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02\ +539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332\ +DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B\ +0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49\ +F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C252\ +7AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04\ +CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D\ +2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18:\ +108619224EBBA468F3E2166F8567E8F65798BE63D27911829941DEFB9F41FCA6 + +023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A69616526\ +76DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529\ +C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC00\ +4691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C\ +0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8\ +B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F\ +52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B46280\ +27A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718EC\ +AE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8\ +720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710\ +D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D\ +9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651:\ +94357E4E74ED684DA386A7B2DBD8F611C21408F77258222B92DA7DEA603B3B48 + +20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3\ +131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890\ +808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1\ +AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135\ +A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAA\ +E17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4F\ +DB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D510\ +71BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C\ +6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493C\ +D136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C30\ +74E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E\ +4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E\ +6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6C\ +E2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7:\ +764303D3B9B470A4DEB78DB588A4FA505570337515A372143AFB2604CD51319A + +4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD8\ +0F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB\ +2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB\ +0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5A\ +A756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A\ +2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746D\ +B6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E\ +8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3\ +284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C\ +584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9F\ +AED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A\ +582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB\ +8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10\ +E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107\ +DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3\ +C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD:\ +3CBBEC1BA9409A694E4513DEBBDA2223CA1A91376D97298C26FD920A7AC730D6 + +D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024\ +E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211\ +D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C3\ +13D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D7\ +3D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D\ +682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058\ +321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B2\ +1E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D512\ +63B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978A\ +E90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA\ +21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4\ +910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C\ +63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A9249\ +8D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089\ +CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6E\ +D83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A7\ +90910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA\ +43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C\ +4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC9\ +8D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBC\ +B88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A89\ +6771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78F\ +A3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824\ +CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD564\ +9FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458\ +A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8:\ +75F9112253A5AB9767736CB5801763EEAFE5286EC12A7EE642E2683BD3F50BBC + +4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B\ +73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF\ +2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520\ +A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD\ +574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8\ +298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB\ +6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB4\ +2610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61\ +ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A898\ +8B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014\ +BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B\ +07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC826709399\ +48FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02\ +F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED66402361\ +6B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA\ +7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8\ +A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F\ +469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E\ +6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F\ +40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34\ +B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF\ +08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281\ +665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F\ +4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9\ +186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC62814\ +0996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE0\ +0D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA962838\ +1055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79\ +CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4\ +C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D5\ +99B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8\ +D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED\ +1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACD\ +B178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF2\ +14DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478\ +DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48\ +E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3B\ +A36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385\ +F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7\ +A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4\ +C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017\ +C3A66CD4EB2DDB42EF85EA0CD65534:\ +E78E29F038A4D0DBBBB28AEF1A99904F5E132660EC509BC1621987A9058FBFBD + +523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3\ +EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D\ +6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA054187\ +70F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01\ +C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08\ +D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6\ +013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF044\ +5B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCF\ +E87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E55\ +44E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D\ +8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80\ +DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671A\ +DEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8\ +B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC728366\ +1D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615F\ +B93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF19\ +9E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D2\ +9B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB\ +4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D\ +323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2C\ +FBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF\ +8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AA\ +CDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83ED\ +F9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED092\ +53039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6\ +EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE\ +11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADE\ +D1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648\ +EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107\ +CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B96\ +5A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7\ +B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E17\ +41553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E8\ +19C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48A\ +BE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548\ +647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816\ +AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430\ +142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE\ +40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C6\ +40909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E5\ +3E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB4665\ +2196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B\ +94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE\ +4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9\ +CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D25\ +9C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE\ +561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7E\ +F94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E\ +5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1\ +C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6\ +303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A\ +2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1\ +C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3D\ +A8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6F\ +E398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6\ +F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C2\ +13171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD\ +46B568CE294C89:\ +73261257A08B911C326E016A5E8EDB23C23BA48EF26C6AA9E9013AB6B1688A50 + +F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD\ +9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81\ +FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E904\ +49F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0\ +D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6\ +D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EA\ +F977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B\ +32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0F\ +A032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C\ +2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC01\ +03CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31\ +B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F4412\ +0ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7\ +685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491\ +B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF\ +2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C\ +3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF30\ +0251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736\ +BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CA\ +C2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B983\ +20B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B056\ +2B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1A\ +F9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A46\ +3B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F\ +5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137F\ +F9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BE\ +D133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68D\ +A188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE8\ +97B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030\ +DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A74030017989\ +92F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54C\ +F7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA698\ +3D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B5\ +2C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE\ +703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C\ +05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B0\ +4DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC0\ +99EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED\ +1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754\ +688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F958\ +1DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F9\ +4E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4\ +181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6\ +FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169D\ +C46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12\ +C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB0\ +00057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D0\ +0A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4B\ +A1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C\ +2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441E\ +C8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A\ +537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8\ +B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88\ +DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656C\ +C30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D7\ +2DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19\ +C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B8\ +8DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8\ +F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B85\ +5845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4\ +ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F16467\ +8160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D629\ +4FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D1208\ +9CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0A\ +D12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397\ +B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA\ +727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE\ +9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E7\ +3EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A81\ +0FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1AB\ +F6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E\ +854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07\ +813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215:\ +7C39A01E12C91952FF656E415AFE80CDAAD576A87966B49F93F53FFA9AEFAD4D + +08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6\ +A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6\ +B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399\ +DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB296\ +47F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE\ +7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B600\ +4DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FA\ +DDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120\ +D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE390308\ +0A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBD\ +BEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A294\ +4384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E62\ +22A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D37\ +52889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0\ +A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33D\ +B8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4\ +C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F\ +7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D\ +7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24\ +204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB229\ +07F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3\ +C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD1\ +5C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130\ +D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2\ +D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D\ +56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572\ +FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD5\ +6495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C\ +15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDE\ +FD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041\ +259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A819498975\ +5D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A\ +317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC\ +5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3\ +504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E5\ +32A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999\ +B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D77\ +85C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FAB\ +AA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C215366\ +3B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2\ +B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530C\ +AB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2\ +281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD898\ +6EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B\ +82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77\ +BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFE\ +CDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BB\ +BE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C2\ +8F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705C\ +A27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2C\ +ECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D1\ +0CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F\ +2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246B\ +D04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD\ +1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F\ +265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB0989\ +5CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E\ +4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F\ +092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E90\ +0200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C\ +29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A1\ +3EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398EC\ +F3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A\ +49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BF\ +EA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480\ +C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD4383503\ +3B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E26\ +26AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A\ +5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041C\ +B3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB52231\ +91E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B24\ +42B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E\ +228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB\ +5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604\ +FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE\ +25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914\ +BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F\ +2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8\ +AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42AB\ +AD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3\ +B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3\ +688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B46\ +7CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB3\ +3770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F0\ +7942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD\ +394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C79024581211\ +3204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA\ +8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B\ +09B7F42D193FB3E9C06329818251A2F7E6474462C95DED:\ +918EC37DC5D2FEC29E71E89A04AC10B3A4AFDA3045532E104BCAF15003A785D8 + +1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380\ +D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8\ +DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F7\ +6316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA37608\ +26D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E693\ +9C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9\ +C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96\ +C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108A\ +F1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322\ +B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE7\ +0057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DF\ +CAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D0094\ +32DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181\ +221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083E\ +A427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF00\ +36D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A595\ +2AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CF\ +AE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF097\ +72D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A\ +83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1F\ +C070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E\ +0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665E\ +D1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA28998410\ +3F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1E\ +CDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADE\ +B9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C\ +6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121\ +210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8\ +889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3\ +123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB\ +71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2\ +B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F62\ +1275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5\ +EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E81\ +6D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A3187054\ +3D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B4403099898\ +57103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B\ +4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C\ +2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE\ +6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D88\ +0CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD2\ +31B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB3\ +97EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3A\ +DFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FF\ +DF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A2492\ +4A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC27\ +75833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0\ +FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666\ +DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F\ +40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5\ +F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA7\ +80703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF9428\ +15C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEB\ +A3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45\ +B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F\ +5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C\ +16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5\ +278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D5\ +59D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E\ +97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956\ +E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1\ +E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106\ +E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10\ +ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E\ +806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA\ +01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD8\ +78C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D\ +29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB\ +31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FF\ +E178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590\ +320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C\ +908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8\ +369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98\ +966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A6\ +5A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F94\ +76D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340\ +847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E\ +950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFE\ +E744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D\ +30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C\ +89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427\ +A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0\ +EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E288\ +5EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB8\ +9B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABB\ +F1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11\ +735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A8\ +64D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7\ +FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA7\ +25473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697\ +C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112F\ +B2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA4\ +2F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715\ +180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED\ +9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7\ +120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C\ +07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE1\ +6318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884ED\ +D768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E\ +4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B65246\ +7FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030C\ +EBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4\ +E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841\ +BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF\ +57795DABAF40687B2CDA7A5014168F:\ +446D6A62F685746493DB900509FB28B14CE9D0005C0769A6193D43853F5B7593 + +1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D5075\ +2ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07C\ +F488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A107\ +6D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3\ +BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C40\ +5F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB03\ +78391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB1670\ +0EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F\ +273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC3\ +3B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60F\ +A01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E\ +6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9C\ +E264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA1414\ +1AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C3295\ +8A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA7547\ +0C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B\ +98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2\ +BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7\ +C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255\ +048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF\ +00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8\ +EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0C\ +FCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F\ +8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96\ +E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94F\ +E43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE8\ +4E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D3625\ +7C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C95\ +63844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000\ +F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CE\ +FFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986\ +D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE9\ +54785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB7867\ +6E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FF\ +A65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B2\ +3C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFF\ +E6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C946\ +50C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3\ +742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D0\ +2BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE\ +79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFD\ +C2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2\ +E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C\ +59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C\ +4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91D\ +F0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97\ +B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073\ +D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB50\ +7608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5\ +E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E\ +5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B\ +0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159B\ +AA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D\ +9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF\ +05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855\ +CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC424\ +5A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E1\ +3B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E1484\ +3D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC\ +9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2\ +CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F7\ +6242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B2\ +60F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C7369\ +6F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA8\ +1F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631\ +E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2\ +FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D352\ +1720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A\ +7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9\ +F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EB\ +A748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A\ +37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE\ +42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA1\ +5337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD\ +7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE7231992\ +24F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885\ +A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F71\ +0BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96\ +B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B301\ +3839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433\ +B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FA\ +F353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD\ +44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF\ +3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E\ +5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2\ +B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A\ +1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054\ +DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B\ +4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F\ +1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A3503\ +14B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA4\ +0FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C\ +78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5\ +B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2\ +BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF86\ +2EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377\ +131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7\ +AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB04\ +8CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF\ +8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9\ +455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389F\ +A745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32\ +D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810\ +E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615B\ +DE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8\ +EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA60\ +69369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6\ +D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F\ +7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF17\ +39C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06\ +EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A\ +1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4\ +A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8\ +545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8\ +D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B65\ +75A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364\ +A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6\ +BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D235197303\ +38D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312\ +C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34\ +090FC9BC045271:\ +7758F5E55D885FC6B3A5A2996EF53A416080FF804A16D8B8459502A1236143ED + +[Skein-512(264)] +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000:\ +711008AEFD2E8E3F2AB52C038A28E213EBE8135A212840F3069BCF92F10F711C0E + +[Skein-512(384)] +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000:\ +C952AA1A43EC04F1FD9507DF7D6B5CE4550BFA40273A2B061C653E65CE41A2FA\ +3AE7AC3EE2120AB3DD3E3BE20DD26609 + +:\ +2C3FE10673F4D6904F27585FC3DF455A678BC12D7D39D6BE4B37F47B80A43889\ +181103BC727A7DB4B4E2D2DEC1DED86A + +CC:\ +153100603EA72AC9379541D7D9E5D9D2A29B54CEDCD02BDB254C8A3A967CF18C\ +9F01149D1829A75E57BFCD7061741636 + +41FB:\ +592F818C26B31F9713928C06BCB0A0AF37A8EAFDB1DB6E4CE3B898C9335FFC01\ +C2EA2BB5878C41FA1C1F880AF6B07E81 + +1F877C:\ +E8A30D9AEBA2A2FD7D3F70D22467814743E49D0524F290D8ECBF9CE82093370D\ +D2533F7A3C4ED3004CB1A98513CE911A + +C1ECFDFC:\ +2F329BC31075B71C67766905F68F0EB69C93D72E01847E748D77E84CEF325C64\ +23C2EB321A97B5B5A44B4E37D18546A9 + +21F134AC57:\ +E9C0109D2E5EEAD89750EB34678BB79A3FDE8DF016AB71CBF076EFDE0A97C4E5\ +6D83A3B085457A99A9CE8D04E313CAB9 + +C6F50BB74E29:\ +8628572E137A7A28F8947B625B593E192EED783E751D2AB870B5D89B5CC4D60E\ +8852407345DF72C1434A13346F8BA85E + +119713CC83EEEF:\ +C80B465E10874FC36D0B9AF63FB8098D60012B29BCDDC850C310932D2DC4F535\ +E8E2E9782D31F4224ED9168B42E84A14 + +4A4F202484512526:\ +8A18298A96C9BE26F9AB3A4F40A1666BB600CD1F8642844CCDE01F503894D808\ +C7A8B6161EE9C5F1786B0539B0A837F4 + +1F66AB4185ED9B6375:\ +EC505856949FBB7D127E9A3A3E51AC5FAB3183F5604E44173F66716A2EAA9F64\ +4755701EA5157A2410AAB122BA76E28A + +EED7422227613B6F53C9:\ +9C91E8EBE46C9CC45F525B0FAE5C068BAC1B1C7369BB11B43C28625E1450EB04\ +0F3933E141D0B80A4FDF03163E2FEC2B + +EAEED5CDFFD89DECE455F1:\ +89933A7AC0C918294F3CE51B1804A474CE17531653A2A1AD821A898644368F79\ +3BD3F483B4BB5E3D9C904E299AB97F71 + +5BE43C90F22902E4FE8ED2D3:\ +90BF8928E882EAA602DD001425866B7F8DC6C30F3BA9D015EF5A628916BADDAB\ +75CE2A77CAAA78A37524F16815349387 + +A746273228122F381C3B46E4F1:\ +4E0EAA88A051E5B285D979839D1937AA86F32F5251A61A3D37937439E7A46167\ +D68C6D5AD043FB25D5D81FD9E5C0810C + +3C5871CD619C69A63B540EB5A625:\ +5A53537729CCF9F0C70C7922B2D12AD453093085412EDB25369DF3388DAF2DDB\ +2D9A22E5E87856161F0B743D0B745B2B + +FA22874BCC068879E8EF11A69F0722:\ +BF679781E632FC0129E1A006D618914AC66DA06797410BEE173FE1F88D4D9DDD\ +BD4C33C6F2A8541638D26746776B3ED0 + +52A608AB21CCDD8A4457A57EDE782176:\ +D3B4BAD4D127D4D29F0965F115FC9733F8067DE731DA317B9ACA98F4AE94378B\ +73C0FC60E3871A0711332BF426E0D60D + +82E192E4043DDCD12ECF52969D0F807EED:\ +05365323208EE5ACFB02105C2D3CA3458202AE8DF6729B0741695499CA375A54\ +0AC0945EB270B3522A6DDA29F53A7C79 + +75683DCB556140C522543BB6E9098B21A21E:\ +38F8A4070E589CAC8CCC2F2A419524E7F966F91B13B298B321130EB9FB712ADF\ +064929DC6873F4DDCDF56D409F8DCFF6 + +06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ +A3C489ECF7B545C25046EC2F65F13D79FBE12F5CE2AA10FA3A61E4DB32F3CAF1\ +855FC30E14457C26DD6F1ED4945BCD4F + +E26193989D06568FE688E75540AEA06747D9F851:\ +0A516C2C0FB8A498D15338A930A20FD86618358C53572255D09AC175F2B5751C\ +7BD49A01B4778429D51A3AB61AAC2061 + +D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ +F1E8A00710E19E86249A80DE6FA50526E5FBE64438207231249D51B50DEC8883\ +E7FFDE09E8DEBB1CFCE539823B3362B9 + +57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ +7FA16BC2A56730815067F99E76E1CE9DB79F477067D85DDFF59D40E496D167F0\ +04A99C74928968022FC06E348EBCC8D5 + +A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ +5F863EBB7A86F7FD6827CF599B8D85E3481F707A5ADFE75F25DF42E0CFB0C1A0\ +CDBA7620F8DC57F82868B46D02DF7DDC + +AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ +E5616D3DD0AC7F52B8E782A38CFE17EF08573A738A0AFF884F33C49427344EFB\ +FD0458213F3AA0C8553732AD11316350 + +AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ +CCE64A8FAE669346FE91A12889EAB757217C2F0F8C8D78803D8A448A226123A8\ +9D41BF94A083E6EA68CAE3893D794CD8 + +7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ +F2A6C9D80252597C7BD0A6BB2242CFA97184E7D20C34C0DFAF72189875114F34\ +2E42A13F162B3E4C3BE9DE41AAFA1AC7 + +FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ +23E007E2BB891712D875D2A93E33D20FF6B0EBE1F8264DB3CA738E33DE32EF9B\ +CD00888D0E07413211B534E4FCDA44AE + +0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ +B9A975DF3113D4A3C53235CAF6D5579A0F4E7B1287AD1A7C37E7334131BFBCAC\ +89697353411FA22787254747C29F16AF + +A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ +4B62F5A40F3F919D055C2BCE2E9DC70515FDC3D609D76F6AD861C57B2D38DBE6\ +A57E46D28E33B45BF3CAE822A526CE76 + +03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ +99C520DA875D5EDD5BEA2842FC5C71FB4DA0F907E07641B232ABFF040EFF68AE\ +CE69708D8889CB00E33D17B0BB43C682 + +84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ +1A117392B66BF7EDAECB8B082F0E15B7B24F2BD51B3759129082D0E585749D11\ +37DFE717823CE2D82C072014B2669F36 + +9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ +4E0F3DFFE0E1E4FDB6DC714DBC5822348D9A664F8019F29DA980432AE8BD2833\ +476E4CD51315C665B982D9AE3EEC543B + +DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ +46:\ +58D723501857B2C8655C25942CF33BFE39FDD970E2630BB59C13CD3BBA546917\ +EB7B70F551D2F7FAB63A4FE6A78B34C1 + +62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ +B5A0:\ +4CBE1507D220DEF9571E3DD57BA781D8EE9B18B631A60BD93CDFEAF054EBEB46\ +DA2E1358422B2FBD46470810A861C30B + +B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ +FBAD4E:\ +68917DDE9C73E2AF43BC5CF6CB221EDDF50EE53D3D964940F5CF701A4A738FA4\ +3AD9CAB9BEF59CCE32344DC9575B36EC + +47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ +ED2C2492:\ +5D515A3F8DBA2F0C386EF2E5AB7178A6959ED1FDDE68068480A303D974DA9B20\ +6787305A9F9004557F51BD8BCD306C6B + +512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ +6B2EE4E542:\ +424282E6EDA3521DADF5822DE0BA07B9A729C9C68FF19AB4FCA207F35560B2B9\ +ACC5FEB9AD46896B1530369ED0161E24 + +973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ +2A1493D8F4FB:\ +32B9C298EB2DAF966CC0BD717A85FF5C9C38F7FDEB477D1EBE4CE3C4DBEB09B6\ +24DF2B882ED2E083F10E321D1996B718 + +80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ +30A934467DA4B0:\ +9CB6A4A6A141DA9E807E8210671C089C1856F56CC45E5D386FD95D21F7403C0E\ +743048CF8A2E446AC430E251D99E25F1 + +7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ +C0308E29446B8ED3:\ +0F7560C2316115A49278D58C670216F572FDD987B2514DADB1DE80425F0D4DD1\ +8E0F19B5E8AC9E16F69685ABFBBD3B2F + +C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ +723B20F67BA610C2B7:\ +C0B9A77E8DAE031FB50DEE1DD298B354C9DF42734D2011D7F688E1C050593FFC\ +A0F9305A96F457E74C8F5CB6B3B52ABD + +01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ +0C834CE6EADC2BB86BF6:\ +93B6BA62997D9C73B8287E062F9D81447584A86D324615643D7B69C2A1582772\ +DBF380AD015334C890204CAD1995A1B4 + +337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ +1540D29BA27AB8E309A4B7:\ +3B471D96B1A3ED28BE345DC04972C73C1409488BAF3628BB3CB0A1EA3F4851ED\ +292EE08922FE3D1E1E13A1BB5580F0C2 + +6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ +32B58EBC38FC2A6B913596A8:\ +BCFA350348267A8600ADE6550F6AA63ACEFD4700D7D4A7DEB7F7AC739B5E4614\ +BC67990FD04BA91F4BC76B706D2B0FAC + +F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ +38467205F5DCFB34A2ACFE96C0:\ +1FCB346090BC993C83C070467E08156D13C916F98ABE75A16F885D83222B5703\ +0BF9123E54251AB8D40E53E4DAB20326 + +CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ +B06CF0F5A0EA15CA907EE1C27EBA:\ +74ACBC7D7CABF2E0935F695C383F1199D35A42145112B04F15BBB45A4B7C3CE2\ +9C74F5D9197C57CCE22C0D6D63335F6A + +1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ +BCF84D0D4726364B9BF95AB251D9BB:\ +5BDCA5F769B4F8C1BCE86E97B10FB34DC0397C7E1D3F9B89263A496467D9080B\ +8CFBA643C216D6169193C95F09763AE9 + +D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ +C7F157298EABC4DCE7D89CE5162499F9:\ +7474D881894D358AD131EC542CA1A6627DE7B8C9DD420AA2EE182F1204741CEA\ +B223DFF7AED61007C2A35E043FD7B32E + +BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ +BEF788CDB5CF4606C9C1C7F61AED59F97D:\ +E0ABA1C0CFF9A8FDB3170ED088E3ABFCA51B3151D18076589AE80DC14DED1CDF\ +E79C6EAAFA20248BB6B14BE958334657 + +7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ +86E779CF053C77785AA9E692F821F14A7F51:\ +1A899A045F2DB571989A28902861F87949D2DB1314866ECBC0533FE7A960B235\ +3E65B03FD5475319900CF25450F82E56 + +9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ +43304FBA401EFB2BDBD7ECE939102298651C86:\ +F8F99EB34E023F45370C30E29A2BB360F8E68398C6E0257B487414C323A94589\ +C8F9EE7E5BD2DEC7BA256F731EB13D8A + +C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ +87D68D28CC3897452F6A22AA8573CCEBF245972A:\ +9F5E92FC62BF8E9E223165F0EE330A025F2668ECBC55F4481B1F059A872D4768\ +F8B87E3A96A04789F82D95673AB3914B + +EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ +22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ +4BEA57BAF0210DF3F0EE7E78DFF504FBB64D874B3BEBCA181408C5A534FEC99B\ +1497FF12BFE32024483F8F2EE8945879 + +0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ +FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ +2B5A32DF064E646797C9DDEB3929DCFD5BAC33ADACE033E5705C7163A3182DF7\ +BC7F42BFC102899558E7394E03444186 + +DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ +9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ +20187DBC0D197F0348F7AB1D3C0CF63DB29168CAE06BB75E5808B6F5F10C599E\ +C91F7E1F0A676C06423E05B4B379733D + +EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ +E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ +0AFBB0A04C6461E979FEA1822BE6FCB3B625250B1803B1705A9950C8D8029169\ +9B9961EAF333DB94C1F108BDF6498FED + +416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ +97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ +B697AA9B197114B0E0EFCBB842764EEC1CE0A7119445C97EC9540F018F5754C6\ +8E1C9DC3EDA22CBB948A124200B87BC4 + +5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ +A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ +0F5ADBBE1EC5A2DC052010F955F0C23AB5BAC551EA8449C2743FE2DE28A54F6A\ +1947B06E45ED19418FA615F2AB8C409F + +7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ +66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ +BEBF06EE6EC90FC36BAA543F28E576D4662D935F87CF763BDFFA1E0B01BBCCF9\ +5CF3E27C81597B165CF6F48D8B557D6D + +2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ +4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ +9CFC8B95E54A43B2AE9443CC6468BB033AD4FFEC707D59DE21D454596FC00ACE\ +3DB59F83942D5A79BF99107A33F31A58 + +95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ +D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ +3FF0E46D9E71D354279A63A60B623FF3446192D783E385F5DDD33E5E794F6984\ +68FC2089ED46B34327C9690457A295B9 + +C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ +30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ +7C6D14CB8F178882338D3B27CB91D37AF3A8980C739D492364CC24175C3D9291\ +89BA2355A044279A537ACB3A2C00E355 + +F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ +05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ +4AAB89B4E37850B4C874C37BF24F457FDD49EF04A28F7E6AD5D3CB4A143D05F5\ +C29893CCB881B78082C40490AF0C5067 + +E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ +E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ +6CE8169CBD2FADB7FEF003B8BE1E9744925FDBC1A26B0496D86128FABBE9FAD7\ +6C2272574EDC55B6D3B620273DBC0D6D + +16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ +DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ +00:\ +4A890EF5BDE2CD4FB34FC9DD5C264C66340DC47AA8F717630371BC2C9D1558A0\ +42AAD51955C2887FA81FFF50827937CC + +FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ +B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ +37FC:\ +DFF1E6EF7D24AC16E6F18D6421818CC9552500584BDD47C30EBC02FC95A4AF51\ +13D9A4F7FCF44457F335ACAAB8159732 + +ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ +2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ +599BA5:\ +BF6DC926A7DBF0354E0F6F488D02B350F58E0F0E48241D6F5C3E49A363728929\ +5942D1156F0CAD515F27BC752299B853 + +36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ +479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ +40706B05:\ +672F3F8A1A35204DF532E93D3255E7F4C314649E04137007316776C302917C5C\ +22FE8332434A78E0966A15009F421FA5 + +ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ +29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ +31D06C77A4:\ +D9DA2B5081202D186B4B117431D716F0A9FF83A7513D918622A60B72AED07E8D\ +8F066F04557B0642FD991A2F303700D5 + +94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ +EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ +A259FC4FBD72:\ +D5648EACC0E8904FA86A182120DDD308A32AFBA4C1AC1EAF4D6EACCA4D619E71\ +0582C5FF067AAD49A2E6BB71F02686F9 + +13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ +C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ +DBE5FE9694AD6D:\ +1A9B50918B7E47A0DEBBC572B69A0F8C748D493768FE69738D6EC18F72549997\ +19B6AD8B29AA42035DEC5A47F00CCD33 + +1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ +E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ +7EF57B91397AA8A7:\ +8F9F441D51B777EDE476F4C85548E0AB1F92389531B20661CFC993A77E03BE92\ +BCDE385487FC1E25BFFBFD3B37C8F419 + +BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ +7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ +44B78B2D48DE1A08AA:\ +6F2098082054F1B2232A4B85B20D1CF520A41EBBDC947C506A575CA2B47B8898\ +6E062583D15595893326E8AFAF3F6ECF + +0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ +DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ +B3A6C9FED24D70749604:\ +4C0E90B28BC652F935D4F6C689B1555864DCF5D6B922F9C067F9D0810F1685EF\ +5892BA323C65BC83B2EA55869BE732AC + +BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ +A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ +8B033F77D384CA01593C1B:\ +7E71FAF636E9AD3CE76DB7A358AC03064A99646CC704E0DFDDC3ED050DEA3788\ +1787326C7355C214D51874448FC74D35 + +90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ +B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ +013C23F1E9611D595EBAC37C:\ +F69DA6546BFE881D7D5C8990A7A012194C734A3089D4CFBA41937647AB7EEEDD\ +68604A0BC7B82E3F667BFB57C2F44F27 + +64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ +9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ +4EC5A49FFDB59A1BD6A292AA0E:\ +3B40209B9BA0648359D4108ADD32012275A7935AA2F0D7D9603AA90006CCF69D\ +FEB999930684F10FD59B008F93CB1016 + +D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ +B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ +498E1F6C82C6CAE6FC14845B3C8A:\ +C6429C4D080056FAD6E95C81F91EC023FBDB65ADBE366053909018E0930BA47C\ +52066362C65088D159BABF0F76CB28C6 + +12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ +88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ +5B01FECFC146BDB251B3BDAD556CD2:\ +5552CE6258CB3EEA22A029E0C013760A14B009795322DAC05691C408A130F8C3\ +61B8D27C0C466D60D4D419725243E9F3 + +871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ +DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ +AE9CD5CF0991878A311B549A6D6AF230:\ +4CF2F34C8BB30FFCE607F52FBE54C8C72F4E6B109462A56D6DFAA35498A1F585\ +B964BDAD1C2D656FA09DAAA1591A488E + +E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ +105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ +B50C7C681E773D109FF7491B5CC22296C5:\ +27B86E7B6008903ABC916199E511AF8AAADF8C3226CACDDF398D1C88F999EA48\ +94A0F0EF521CB3DF2F0866D5A00516E6 + +E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ +190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ +2C7CA303269ED14014B2F3CF8B894EAC8554:\ +A987C872E07801C8F0AF3E70EB25C370DB4001D731AE1CCA1365D82A33A7F2F3\ +7CBEF4CE88D0545228EB29175F787353 + +6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ +ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ +1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ +BAC5B9FDFD097BAF8AAEAE1D2695593D7B5258D224DEA79A1FD4A511C004351A\ +DBF000F37C28055FCD43FCF1CD2C0ABA + +4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ +8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ +37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ +9F432BC09FBAF070F939DBAB12E6E148BE02B16B717D729BDB37CD667B4AD2D6\ +7921C0A598126FB715A7B0960076ED09 + +08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ +B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ +85EA51D49894E45BAA3DC707E224688C6408B68B11:\ +7CF44B87EB23E3C92739CD6F0F6C5AC3FA1441ADFEADB3BAC87DAAA4C64BDAEC\ +9068AA7E68692E20168AAD5819ED2DC9 + +68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ +8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ +04E18D475920CE828B94E72241F24DB72546B352A0E4:\ +30887A16283EE8E45E7AA48B746A741B2F60522FC688B182573C1993562B2E71\ +9F526EBA3150406FA158DA61B68D99C8 + +B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ +CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ +BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ +732CFCC7A3680BAE5C3DF25F2B9AE98BABD31EDB0D7045B7550B9BADF66A1CB5\ +CD0EAC6919EE6B19B9A1E9DE61AB3EA4 + +0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ +578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ +44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ +15C34B99050E8D0CD333D2EC6CD0A52DC76036AD7E000E01CC8F1812171D10BC\ +12E1D43DCC689CB5A38FA61484411104 + +1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ +F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ +4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ +D8CB85547D6C015433E608818BB58F0A5BC97997EC976BE33F9C2368D1245764\ +F4EEF9F5311CB5667224DA9F353A1A35 + +B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ +C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ +E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ +35BCFC9BC9F138F76094099DE78BEBC0F1BB93FE5A4561493719716A2C33459E\ +AB4CF5175E3673782B09354FB191936D + +CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ +5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ +27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ +A2B4E92FC5D6978430B3ACB887FCC8B6EA23CCDB7494BD1025604843E7944CF1\ +14776D4E8C2B3C2AD517A7EE7AB0F788 + +072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ +E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ +A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ +9F8E772C845766AA61B63C2873CD46C0F42769279B60E57122AE9D17508203C6\ +6F3F9833F7F6DC34C7ADAA5B5310D91B + +76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ +FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ +29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ +DA7A9EFFC5B684BAABF8CE6F10E72539D76FE2F97A4F77251739D310C7671742\ +4886252DB34BB4B467183BCF146E759D + +7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ +650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ +AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ +4B1CA37472CA2A810571CF8FDC364F1BE7B55ADEB3E4588BADDE5F3B477B0D77\ +DF143304FDED929E92242E5CB6C56940 + +E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ +7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ +8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ +C7864270011C680DA45A8988FB499A6A14B869155118F74B48AC05FDACF407B0\ +B98789B3E6B805D3BCB8D87594D8EE77 + +69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ +1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ +040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ +871B7C9F9896A88979FF56138D51547CF21C5B2DBA048146FB28515572D474D6\ +DC9DF5CE71A09EA27518F31B1E95A14A + +38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ +0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ +0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ +49:\ +F00B722DE52D30F6741262A49081748F9C09ECF77F3505E5DBD033F3F5490466\ +8E2137B6F53146CD8DBB804375435452 + +6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ +0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ +2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ +5B52:\ +775816077887FC010E03C94E235BFB45CE7A2B0F491D3C1D5BDFBD1168210C94\ +FA286D7B8C04ACEE166F78DFC691CA5B + +6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ +B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ +C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ +89CCC1:\ +F47D9E58D2F2CF8D8B0B62689B3BEA46D7329B095C3783C8B808C2047C6D2D32\ +849D906FB0378FB8F2413931A1C55847 + +433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ +14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ +22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ +6DCBB4CE:\ +4B11FD3E56684E244573F53EFD5D9396591775D5A68EB82D4795396D14510106\ +122BCA43CEF98B5ADCF3ECD17DCD8F73 + +A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ +7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ +881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ +BADF45685F:\ +CD165E9DC90F563CDB79E66EFE968CF19EF97ADF353803339968A4DD7B540411\ +5B430BC9D5AF24FFC6165487C3BE5FAE + +006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ +312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ +96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ +9B62C60A4771:\ +738D788FE5D49A3C33266D68AC4CE3F4D475B9209AAE2F0B7460891A2332F8AC\ +933340FC18192283D133D57A81C263AE + +F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ +A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ +9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ +CA58D5DAB38ADB:\ +8327353E70C85DC9B4CCFA0172E2E16439C3D8B65849DFA69CC1E7A92A506EE9\ +25BB483FD5239D8EA3CD89CABD6832F3 + +E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ +F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ +B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ +21691E1069413848:\ +9962B874CF12130536B1EC61D5B6BF01008B271C60F37D25EDE7CA1E4D8A65AF\ +A90CE25553E99AD6104C1108471F018E + +64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ +D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ +FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ +B57D6D0C2EDC4E78D6:\ +B3A935122B532314B5CA59520C4E10D0761C15BA8E605556357A3E5C8F139B38\ +BE59BBEF4EB4D8F364863A5B04232873 + +5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ +CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ +8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ +CD19E781AF20454AC880:\ +FA2CCC83AB84357AE5850CC5A4862E7EFA72B74C99E904841895D39F69CB64CD\ +AB5ED766A5A43AB2BA8B21D3F8C9923B + +03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ +F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ +A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ +BF0FE3C32C17AA188A8683:\ +E56CCFCAFCDF368296C596A70D2721D88ECEB513866052473B46EB768D39BB64\ +D7F119BBB17C177BD768D712E67CDE91 + +F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ +E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ +0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ +2E937F21C005F17411473041:\ +71096347A0EC565FC5303607BEAD5B2729EDBAC7C88D938FAD69A260710AA56D\ +F57BC0167A1EA324580F6BDBA134AF57 + +758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ +62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ +2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ +29F695815D866DA99DF3F79403:\ +10D64A7FF0FCFEC8267154BE73D61B31076B6BBF1BA5398ADA8476EBA472C60A\ +EF14F51AD8DF7DB6C3F457FFCC0DBDA6 + +47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ +84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ +3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ +1BB15B447589E86E8D76B1E9CED2:\ +582A6AF1176F547C4902DFF1F0CAE4E0A1A60C2653CCE9D0CE4904A1ECA58621\ +E1E4405A15AB7427CB43BF97C6C8E2FE + +F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ +4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ +853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ +AD3D7E886DEA4F005AE4AD05E5065F:\ +41915C04CDAEE9CDC90DF4276EEF89EF1F1B11241397D352FA3AF261AF614F40\ +A76D72BCC7D193D5276908260DB0BA83 + +58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ +7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ +68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ +EAABC35F5C2B0A0F2379231953322C4E:\ +6A8339532F5314F35F4570CA151FD8D21E903B6995051A1C2FF8F9C0EA793D7D\ +500A0649C952C4656C6C85BB08FA1828 + +BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ +4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ +2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ +159388D5C3277E227286F65FF5E5B5AEC1:\ +6F906CA99970F6BD5344D4E8641ECF479F75E7EC56BEC6D88C82CF68F1E339AF\ +E61DF74D63023388346A93A1AC12968A + +8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ +A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ +D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ +407847DD0DA505AB1641C02DEA4F0D834986:\ +70DF5FD7B0B5E7E16F40978BAA958D1D64193886CC6BB09B8A253639A9C5DC6B\ +DEBF2F7D17B9E47E87DAF381508F851A + +B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ +33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ +99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ +7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ +184BB5032F023B7162E981CE43BAD38A61291A0AC41FC30E18D5223AB9AE5978\ +BB3ACD8E883CB40BFF21EDB189E564F9 + +2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ +A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ +2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ +205AA1615DB44057DB991231D2CB42624574F545:\ +6897C81DA325453DBAECFBA605E2B120F762BC6A14B3935EB8D1EAFFEABEE958\ +C7B15B9C10ED1143DBC5F2AEE2D559E3 + +DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ +F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ +2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ +157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ +5468330C26A3C17BA1783A11F5198761AF24C2F9CB1F1F934B902201A7531B5F\ +5A2D110B9C783B69BF3EA2178DF91F29 + +42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ +0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ +0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ +3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ +2D21F6208A33C7919BDB33EC8F997F9FECD5D67E8E8EA6176E3BCF58497FFCEB\ +BAA723AF5C88A65760BE73AC447F32E6 + +3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ +FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ +DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ +46176EBF044C4784467C700470D0C0B40C8A088C815816:\ +7C77507069871A5D8605EA4C9D7BEB6E1CC4521BDDB9B64F2614B9677DBD8C31\ +18AD375EA59CC3A6BD00B00E0A11CFD6 + +D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ +91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ +1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ +EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ +1C7941A5F120E32AC2DB8036F25C3311A7203170F8B10856DB49C297C319539D\ +509F1DE938CE94F7E1CBDA295FF8E4C8 + +626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ +1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ +285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ +6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ +15B14B1D44174D85B9AFC305D591B0CA50A9060CA1D78D8FD6D7BCC97DDC4BE8\ +3195B3EC6159C2891181BA2720E6D1BC + +651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ +27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ +9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ +C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ +F5E3EF40266E244EDF40A2EEC07825A891A96CD1B852B5BC937073ADB68123F9\ +CCB85453D4FAE90877368DC4AE7EB718 + +8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ +BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ +DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ +D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ +145DE80DC772DFE2DFD34294A8CA257DE4BEF9C882F20D922C8812992EE796D5\ +63C87C483333C492F2912F73229B8797 + +53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ +8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ +4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ +47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ +617B3BC941708E0D3343925F531C6AAD9FC8B7076FCE8A64A13B4B196AF46616\ +80DFB7E884D1929900D76F9EDFF9FA3A + +A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ +E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ +2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ +B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ +5AEEE99287F9B81EA53D68B8831F6C0CF675A864F381F7ECF872B9CE18967AF9\ +EE70F941481FCBECE36DA6B40AD33782 + +0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ +5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ +4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ +D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ +FA4AC59E79C8BF68E27505766DBC0E7ED3CB2B8848148D324577A5CBD63AB603\ +D64F3C69054F22EC65D16BC86C867176 + +A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ +07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ +6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ +AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ +09376F02C5567AA313A9E828FABA108828D1729E244DE0F36DB8FF9A485FB393\ +846ED2627A31AD8DBB8FAA965ED89DA4 + +2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ +29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ +E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ +98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ +D5E5E632BC24710887AFE34C784D8F65DBCEC105E0C642D5B67B960D629DEFD8\ +E6030EFA9B238EC567475D3401B8EFF8 + +10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ +3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ +A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ +B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ +E2:\ +14895343ED1DB9FA01DA79173C4CBEC323BC21352347DD9B82194A08E14AE418\ +7C35C6DC1B3715D1722689C7FF15669B + +9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ +1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ +3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ +52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ +61EC:\ +D5857D50A0BD78C9C72965F2D4B08AE3C7E2F24F9FBD3E3BB96E6964F8A78D9A\ +80E7A7603CBBEAFD80CC9CCD34EFA1A1 + +E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ +9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ +2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ +609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ +9B5EDC:\ +EFE8F31B4080402A72D11E70E9F4C368CF7A51313915119FF00BFB105890121C\ +46E803A662DE2C694B843652CCACA22C + +FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ +CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ +B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ +63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ +42D75D68:\ +C9AE23B26501636E14225CB707A87C6228D273FD97C725FF31DF570343FCFA33\ +30FC592CAEBA8A26B2E598A66DF07B8D + +59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ +A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ +BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ +E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ +7815BF3C49:\ +6F541A14D2016CAE80DA4CF80EC3B6B9D81180B860AFBC2FD2F412D44E460644\ +88962E68D515210C4C172EE39D79ADFC + +77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ +61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ +B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ +025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ +951CB2068CC6:\ +141B750B7EEF0E4160AC1261CAA6A6E8F2FB344A23EC3F9483507E2E0CC19DE2\ +F3EBD5CC8F1F78CA8D5856343A2821B3 + +B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ +BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ +93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ +AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ +B0FED6A8052FBB:\ +C9735F0A53D93622457E6C4AE4110B503B473FBED0066E27595E5D98D41F846D\ +500C875538B73FECE6CE70ED620FCB98 + +B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ +35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ +780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ +015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ +37674C6F8E380C04:\ +EECE82A3F4617FD13364D1F828582BB05F44BA3E466913EF6B8F8BE88739A37F\ +D57E0751B698E264D4B6929A28F97415 + +04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ +DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ +D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ +F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ +F22DA873C601016A0D:\ +02EC97CD1BED4AC11BAF315CECB8E345EBA64A01808D6B472EB970D5CF11B7FE\ +1FCC1E8901F06FDFBFCD5F5A3C19F626 + +8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ +DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ +472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ +994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ +1373FB09A1A6E3C7158F:\ +57272E80EA0D673EE8E8CCBE539300A182434CC5749E96C348AD3E86EF2E3564\ +32DE480E2FC73B5EDE3D023C9CB7EAC9 + +FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ +ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ +084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ +B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ +339612E830E9E7A9C29065:\ +7B049EC9A17EDCE74EA69A3E1FEB50A36456E41B3DA50F78A9BA8DDD02F93480\ +D9017E5FC1864EFA227060F936FB31E1 + +9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ +B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ +5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ +8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ +377838973C1D943C22ED335E:\ +307F1275FD1A18019290313C0C70C9F8503CA67482B95EA8F46CFE0DA6B8BF7D\ +61C84F498695C9B91410834014837A38 + +2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ +725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ +798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ +8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ +2D0C9E7448DE3043AE22FDD229:\ +ACE6DE32897220E66FEB86087215D33ED1440CD87452024294C711C15BD07AF8\ +6767DAA2E2421F2314A0557316F05AD5 + +94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ +C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ +F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ +E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ +5B6C338CBB8F6659D342A24368CF:\ +ABB01DEF2545BF2F00F5D83B2B0EE6D67057996933821A4869EEE98CF2EBA6FA\ +D752E0F6F01F722F617614F79ABCD9B9 + +EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ +76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ +C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ +E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ +F6954BA0801A1294CD8D7E66DFAFEC:\ +CAAF388B056F2AEA0A8F646B1EB9383FCB3B1EDA994D58FD6A41F8F04EEF8D0F\ +B61A41BB3CB573CC59689DFF25009DFF + +157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ +CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ +055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ +EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ +256FB33D4260439CBA73A9479EE00C63:\ +6397BEADC127E49ED51E14DC9C6C3336C45880A2987277A9A3BABD2ED4E89A00\ +C083E84466039D9D52C3962C7965D6D0 + +836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ +D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ +A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ +911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ +5994C1DBB3B5C7871A11F5537011044C53:\ +41D07FEF7D6623A2171CE53AD77F00657A6C037929967B111ED8872E26EB95B2\ +0337FED74304391F38EEB5B9C93831DD + +CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ +2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ +586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ +4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ +4E53426CAA453F8DE1CBB57932B0B741D4C6:\ +B2DCE2E4C0B39A2B544BB34BF35485547783EF59FB1EAB2111BF9B0CF7FBEC4D\ +12FC454BA49D3BD54CC073D31E65E7A8 + +7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ +868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ +83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ +C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ +C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ +E3E049A185E57B7B098B9E3F437200C61E60D272AE0FEDBF494D73519F3C0997\ +58BF0214C71F597277B10B31E92E5B02 + +EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ +BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ +E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ +EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ +CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ +7210A9FDD3CCD72B3A87E80B6ABE1D82D50D37773C23D61F74C62D06B47D0349\ +985032905B84C3B88059B4279775FAF2 + +1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ +F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ +656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ +46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ +8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ +E7F5023F70475C3B6BB016B520893FF673DDD59285900C1A86E2728F435071E2\ +7CBDD203F756DCA5085639B41BC06F1F + +4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ +7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ +E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ +4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ +99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ +0AEFE328C2DB1214CE983BFC552EAD8FDAB85B9CE9A5C7BECA9ADC68A48FB027\ +1866F159919698233587721671D952A0 + +D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ +66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ +B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ +67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ +F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ +2A50545931886A36BD0311E1523CBEAEAEF3FD51D300AA45623533E88CC20FF0\ +A32F14FA5187B6F8EBFAF212F5888328 + +842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ +DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ +1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ +48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ +15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ +933064A97F16887A93FED91A366BC2EBE104193999DD01BB96281C564DB97887\ +74CF2E29E6FA5AF5F6D064252E27D274 + +6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ +C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ +7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ +66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ +5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ +3F099FA6A70BEB496A0F8B8BB52B4A1425E456CBDBECA503E40A8557226F8AB9\ +7FF4C1FC293F5FE882317370093BCD58 + +51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ +7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ +BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ +1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ +1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ +479342BC69779327FAF1D39197ECB957E1AFC68F6BC6EB02C2EB0BAEEA35ED05\ +8994D8132A3F1CC2757EA700E0BA51A1 + +83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ +9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ +0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ +AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ +45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ +625EBE3650496538E9FC2122C62952B40F7CB670E0D9BE8BE0485ACF43962AFA\ +0274C50E27EDD065B9A89F9E55B52DBB + +2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ +D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ +1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ +BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ +B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ +A3052636C2EDD4D48D8627E7CB24FC427A548EDF5659F454B1DD9D6550E19510\ +1418EAB0AEC1FE854F5F66383ADFD885 + +CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ +60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ +A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ +A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ +0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ +B87D7F42CBD8F867956CD9806109F4103DEAFEE60B3190A16AFE6E8034C97996\ +6F1D61537376D95565E0806EB6802D29 + +F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ +10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ +AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ +568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ +46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ +609206C8DAD2A95A64E8570831269DB0FB4D45112D6CFCBF4590C17934BDEEBC\ +3F5123282A393FDBC070E03277E361EC + +25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ +8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ +C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ +4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ +01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ +211943D97DD21032C126A8327FDF9FC6D26393C13FAC9B9DC6DC16CFC2C30B9D\ +44025D3C0753C10C2C0A97E6E8F93B32 + +21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ +CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ +FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ +9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ +447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ +F934F1642B8DDAEE31E46CA0B3FA178AFC48C73EE04B087B287102CA103F6B5C\ +2B1890FE398507C2CF0A2941D7ABBE57 + +4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ +74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ +5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ +DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ +A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ +CF:\ +84D5B3E3FF65D4E2197E71E2C7558467EF3480376F304B1F2B384D8E680D9AB8\ +E0AB4D6B7B541E875F3AD058C0C3CF39 + +FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ +B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ +5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ +71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ +EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ +1DC8:\ +4B8794114634CF880CE5A8C0861BC2CCACB46B2E82208CF2B150B10C6291565B\ +0EAE2FF20A3293EE5B1965E15F3E40D0 + +E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ +54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ +009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ +2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ +99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ +C25E88:\ +EDFEC1B059C4645CE46D722C2A771C3F451A967BA60A35F6844A86A82A19F7AE\ +4BC940130BA2D61DC998FDD4F1EB7696 + +F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ +65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ +E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ +3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ +BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ +C5C06729:\ +038E8E463D24674BAD250A7B63FFBB5FA83C0A2B702C9329982AFF5E0C9F4C67\ +4E4AF490E2FA00C4EC8666444635D180 + +CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ +68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ +6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ +F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ +551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ +CFE0AF93EB:\ +8F24904AA1CF56933E0EFEB6AE843BB3065C171C7A55E5544468CBDFA9CA06EA\ +6061541595AA0B3566CC1E0D63859249 + +2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ +331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ +2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ +ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ +05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ +F467BC75A9D1:\ +5DB0E56A11B61E2639ABA1E46439D874E406F408A2899437EBF404011A195001\ +E9D4CDABD2B7178B8375A98910C30E2E + +0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ +EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ +A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ +AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ +513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ +C6F4756017FFF5:\ +CE14E248C1615587F07A73470668FCC6FE760D8FBE361D7EE3CA73F187DBC922\ +19B5E58AB1ED9BD89CDD9BEACE219757 + +C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ +E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ +C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ +798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ +9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ +45DBA58E6CB2C8EA:\ +2573C84CF6A190AF5825B48985289BEB68379036D7247C2127BB891E0527FAE1\ +8C7E59A46B67DA938F1A5EA134EDBF37 + +B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ +C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ +01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ +86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ +10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ +E8419D48FDFBD744CE:\ +6120D07BC9609EAA4235E0A7EBD649FD60DD6DE97ABD9B2513EA01F0EA8C9174\ +78B6A73C33DF39D99AEF3AE4718ADE5F + +A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ +7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ +6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ +1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ +4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ +359D5D1EEA105F28DCFB:\ +3005CF4DAF6F74C096E00BFE1DF106EB053F7E23181E1D235EBA57B921671633\ +E6FB0D2D9E2A89F599DE8404DF3EB966 + +E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ +2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ +6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ +D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ +8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ +7ADFB974EE205A9BF7B848:\ +7D6924134B0FBEE6FBDF5604B51FEA18FFC0EC3D509A82834DD3C76CBAF112C9\ +C636E9AEBBDBE612510C293B10748EDC + +B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ +E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ +D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ +EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ +7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ +EC77F29D211BE89DE18B15F6:\ +F5E1A1035D378FAC64F31F773140DB91C61E659FC51533D85C9725A29F79DD5A\ +B2769BBB8FA60CC0D3E1742EAAC49721 + +DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ +4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ +49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ +9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ +50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ +63EFE793489C39B8FD29D104CE:\ +40BC9DD9D775D571AACCE6D17A49A931B53D598104CF79ABFF3A67F04EB8D31D\ +B6B2DD31A2C1AE7DF0C1CC0652F4F009 + +BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ +DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ +02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ +C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ +711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ +AE5B257BE36A7124E1060C170FFA:\ +96B493E2E55320FE2DFBCAA14D1FBEEB8DDF4AEE018870F5434AFA4B23C6EFCC\ +90EB96DA5CAE98713DB93977AAC7D6F3 + +5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ +F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ +5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ +70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ +001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ +480AB79D4E6415B520F1C484D675B1:\ +0E5521076983B02BEE8C9D2A91343D967C3570063DFC8E05DBEB3F2C2E2ED366\ +5E127A60E8C9A7CB35B0AD7D18C28239 + +A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ +CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ +84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ +920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ +E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ +D42956588B3B58CD948970D298776060:\ +39B4012E95E7F74BD2C1C979CD0CB43208CB0FD6093C68CBCABFB8392E918BAF\ +7CF687FE1D6966C3E3A776F533C44FCE + +06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ +3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ +678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ +2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ +8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ +A96CBDE5FBC953D9E576CD216AFC90323A:\ +10DD17C12F25CD5C4AB2475D4E2EE055A3A5184E3B1D1BBB192D62809670584D\ +C3DE5316005027F4685F191C0683C01E + +F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ +DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ +593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ +0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ +358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ +67B5AD93D874812A1DE6A7B93CD53AD97232:\ +CA4989360AD874C38A049FCE389028DCD5884FB1E93E4B60C5E06BE93EE99130\ +860FDAC3ADB902E47370A71ACB3FD689 + +9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ +F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ +DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ +85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ +D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ +352BDD3740DD6A16792AE2D86F11641BB717C2:\ +5552568147601C956ADC55344266AAAC8010F71D8B0241942F5E0D6242A3CF3F\ +03FB617C39193740BE27D1EE227CFBDF + +5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ +F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ +71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ +865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ +2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ +9ABA31EDB903B28FBFC33B7703CD996215A11238:\ +1F226123B5840DC95C61C1B7042AEA3D044C807D0B1753283B6E5A32F63615C4\ +B2AA79DAC27074B6D50E171DAD094114 + +576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ +8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ +13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ +9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ +32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ +D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ +A0FB1050167EA0EE214338B4D240D4083E0EA4E8B2BFEBAD83177C02A8CFBFDC\ +67CD1BC9FE7D7C400ABC031BDA5787AE + +0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ +D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ +3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ +7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ +F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ +C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ +3F137F81EFF0BBC83E89EEA41FFBAAF88EAEF2776BA9F01B49DEF393337E7608\ +E0D4BACA006B7380AFC40BAECCDC8BE6 + +3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ +2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ +41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ +D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ +1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ +6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ +58E4972774C28B8AF406700D5C4438C298B2F83E4256513210BE8847937456C6\ +522A32FFE69DD576892E1CAEEF5689D1 + +C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ +58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ +21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ +104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ +A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ +CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ +F6674659BEF3CD14385A8F23E61E19DA5D597E1E7C8B9CE00012FC9B0CC38469\ +55F91B6A8897DA8A20B2A51C2E42582F + +8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ +4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ +76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ +B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ +C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ +C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ +7254E5CCD2F682A9981CABE020DF1667B3CA3DC5590E1DE5799C1CD608AF6855\ +0B1C77AF8C7FC0B4F37ABD61EE12BB4A + +C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ +D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ +D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ +7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ +D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ +36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ +824E912E862C9923A98F9D416A5FA4B12BBBE5D165D38E2F1055271DF9DF24D4\ +B2F5F7904D49DDB22F83EA9ECBD17B11 + +8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ +BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ +8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ +BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ +7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ +57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ +69E3CC0325E159E33FC5B6CDB6686979A334FDF5E841EDA3E3AE32EC4A5B77FB\ +E9480444776DAF1D0E210C8CB75FC4FD + +6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ +FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ +384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ +B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ +4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ +55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ +817DADD01589BEEB3A6A70003965C57755094BF3F731E2AD0AC339CB88A2120C\ +3B7CD70CFE95CB265952A1227DB5DCD5 + +C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ +4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ +761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ +D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ +B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ +A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ +71E243A14255B13BF3E4840BC649453759769BF4D6E6FB1DFB9EB835264233F6\ +9BCC1BDC70007E2E933D0CD3F6E4CF3B + +07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ +0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ +475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ +F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ +6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ +6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ +A7A87BF389D420D04C930857034EA948C7099B5E7103D79874BE8FF069A97444\ +46DF2679E4CC066DE5912E030D1389B4 + +588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ +D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ +635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ +822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ +F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ +1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ +043E849FF1B05A7447F34B1FDC4ACB7EAD94700B8B58089DB00D59E38AAD99F9\ +FF34E7F4AFA763C145A40CA819CDF969 + +08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ +D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ +1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ +698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ +47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ +E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ +6C67C129BC3B32A107F5E6F93108AE8EFEE971C4158A625EEB902D329CC635B4\ +620D55C22FA5D1F7F6BE0B0BBE019BCF + +CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ +C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ +8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ +DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ +696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ +7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ +01:\ +D178543CA9E471C88BD4D69E65118BDFF29658598C4E1A6D57AFF008BDBD5E60\ +544BBE0EB69DF39AC2E62E0B62F4A900 + +D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ +0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ +2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ +CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ +9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ +E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ +4D4B:\ +306F95DCD2A7E030507F30533166773C5FC7D2E353704A26AED7439922535109\ +1B7A66750F96A9225EDE9F8A38399F18 + +8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ +EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ +1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ +18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ +299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ +4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ +A3BA86:\ +0FB9B9016EA95BA4DBC8500F7758B0457A95437F2255472BB33FCB12FA5C10BB\ +1D346C3F36B4360E8A85B9C66C26A9F9 + +84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ +69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ +1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ +61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ +B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ +477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ +FB9E4AB6:\ +F84275FC683297C2D6D433B04022222DFFD2B47F29C9DC649CB146417D5665DB\ +A176B0A75B00925BEB8B1038D50CAE76 + +FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ +31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ +59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ +A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ +CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ +7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ +91355C6280:\ +9F1F27D8A76394B8FAD318A5A7A7071148501F4E95DCE20CA8C6CE12999BED33\ +8261399EA638D760C8648A8325023060 + +70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ +62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ +225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ +A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ +1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ +366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ +AF1AE717238D:\ +7954871B5B8B2D4451CBB267D7DCC176A23FAB8DD7C72F5735CCAD7E8016B4D2\ +B2B54668AD54C1CBCFBDD98DA1635DD4 + +74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ +85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ +D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ +C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ +A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ +16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ +528F9AB49C79F2:\ +B5E24CC7299D4B295B29A13ADEA87B58AFAC5731D9AC5DAC14D18C59D506A990\ +941C55182223F3FC44398B1FBBD9A18A + +8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ +AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ +584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ +4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ +4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ +5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ +EBDDC89186839B77:\ +E1130E500E8E4C8804EC490C8669E20EC55A924F01AE17B8729E4FC2B92D55F1\ +159695B4DD5550C059100ADEE9443942 + +FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ +E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ +AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ +CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ +B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ +6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ +C66F252F6E64EDC96B:\ +7AE6290212713AD00E07B9AD18A118166D7C6E3537B1BD02C5FFA6E419A07AE0\ +3D81231DD9C872BD40CBECD92B359873 + +B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ +5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ +252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ +FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ +25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ +232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ +5363892A2495DF8C1EEF:\ +B9D5A8571C99AAD244E931DF1C3249F7FE0CC4D2AAB0E26C075425470718B34D\ +15E20B30B2BBB1630397BA57520A7FF7 + +C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ +FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ +272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ +414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ +49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ +199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ +5C6D1BE4BC79F08A1A0A46:\ +8E2B057C5ABC03133B143FBA8FFD60B0A7ED58EDA82C26942C96199E7F656FF3\ +47E857BC25B17979AF6955E03F6C2EA0 + +4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ +A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ +2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ +443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ +C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ +D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ +6EB6E4A80358ACC78647D043:\ +8385EBCA2713CF95F24EE18AFB651754DB093D06D28054BDD335206730FD88EF\ +D4FBF9BE7F3DDD1FB0670A1A3DC28CBF + +EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ +F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ +D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ +01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ +E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ +A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ +90BF2C4062FD2AD58F906A2D0D:\ +7F045E33C10E4D5DB25B6B4B85D97055AF22D40E32C6C8409F8024F794CC3E12\ +403E8EA9575284294A9580201B6F7114 + +E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ +AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ +E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ +EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ +DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ +EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ +3EE46FB67422F814A68C4BE3E8C9:\ +3EE36F052B121B303E1243A5B116C1A036F4ECBCBCCB9AF64A51210EA554067F\ +6A398C7F269BF30B8C8CA32750E2294F + +D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ +C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ +4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ +38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ +806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ +4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ +A17E776C0D02856032A6CD10AD2838:\ +0232C135B8F082CAC7C31EE81C10F423875004365C00E1E41FD1D6E91FF7074E\ +2265AAE87CFAA0153BC2FAFFEFAAADEE + +F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ +C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ +39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ +42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ +4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ +CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ +2ED1C78631FD23B4C3EB27C3FAEC8685:\ +498741AC645D7C49BF3692D5A4430755B3AEABAD508818CAC453E92C07EABC8D\ +46706D457F98C73BCAC4673532F46A59 + +447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ +94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ +286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ +D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ +04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ +72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ +CD90333A77BC4E1988A82ABF7C7CAF3291:\ +C970B0BD69D87EEA8AB00F8BD58CD0CC5E96C2ED43A667553308041A47C32BBB\ +1FB477CF8B53520D56A243E2F6BBA29A + +9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ +E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ +29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ +ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ +E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ +5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ +626C48322E9791D5FF72294049BDE91E73F8:\ +6679FD777C2E4DD03DA3EE5617CBF583710935D786828A8DAE1A4C8411DFD453\ +8059D6FEB97973BEEB621E2C7835D4F7 + +AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ +1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ +42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ +A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ +DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ +B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ +774BE89C1114DD531C011E53A34DC248A2F0E6:\ +9AD437DD093F9D3A6C2C763CF911658EEAE0AC9976914D353CED96A9F6714757\ +B41E6B2572CA34EBA5ACB0B1BE862C0E + +3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ +B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ +CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ +246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ +47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ +94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ +A7059ABE99182714983B9C9D44D7F5643596D4F3:\ +5A0AABA2258361DA8D53BEBBE3C326C47CD08A681D5BED148909F7B691AE91F3\ +C53DFE1F364DDA82C9FB73EB2F632F15 + +3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ +BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ +374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ +6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ +63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ +5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ +4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ +444F16F77ED3EF011B24AF14453E20E72AF793AAE853A718FB2B3F6AD7FD6F5A\ +532F6B253C405D67621EAC61FDE7568C + +7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ +575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ +BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ +E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ +AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ +7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ +591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ +71F2954EEEBF619C400341BF1BF3E108026655E0D79F83D55CACFA44812AA2FE\ +D065434CDCC533641C29F95ADE893B88 + +7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ +D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ +37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ +3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ +A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ +9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ +24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ +CF14A88F577F8B166ECE3945F93A83FDA5CD6BFFA9E599971F2928D921586813\ +ECEF65F2697DAE386B736CA7B30FEE35 + +D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ +A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ +D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ +33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ +CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ +0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ +52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ +ACD67AA725CFA1C23E1D0EAA4732CE67B15EDC2015B455ECFB6584708D07BC4C\ +286E820C256E130396338A4E2F561E6C + +2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ +D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ +7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ +5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ +AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ +B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ +806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ +C8F92626C72916F9D9394391F00ABF203C2584889D49E78607F5C56F1A9AA3D7\ +D9B242329F4A208BB4CE6CDF75696681 + +5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ +271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ +CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ +608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ +D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ +990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ +2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ +713FBC5CD55251312A505E4E4AC540AC439F71EE7545F89039DDCE1BAD4DEBD8\ +D42275EF803C65AF0E0055FED0C06ECB + +C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ +56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ +8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ +50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ +1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ +F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ +9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ +40E904CF844BEBA5083EDCA65BE3874FA98AD7E15EAAA5DEF49E8F16DC67630A\ +A51C3876C3214A179CB8C4EE0B55840B + +7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ +5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ +4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ +DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ +261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ +CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ +31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ +13CF8E684B995858EEE9C0D812DB851D29B927744457987AE97D57833B11D87B\ +ADE949C5EF5131C8541D613F40C7551D + +7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ +266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ +7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ +B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ +357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ +5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ +719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ +6490DEE37949D51317BD0F45F201ABC00106A671189D243C54B254CF1FFC5DEB\ +1D1E28C07E5F2226C2860CA05F257566 + +988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ +8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ +3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ +267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ +A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ +8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ +D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ +5622C8B591C19D263DB8950A2BBC681C461B21967FB01D77B3F0CEE2C1FA2573\ +752E2945A351E54E690EBA7CC303E6B8 + +5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ +F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ +C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ +A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ +1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ +4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ +3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ +F3538F2AD8A797B94F5DE5A4B89945CFFE0C8DC5EE49B35FBEC2D66D39DD6F50\ +12389F25FA64EDA30AB938093D72B1B3 + +47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ +994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ +DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ +37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ +7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ +9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ +EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ +44CF18335ED47D3858FD30559CB02ECD5BC57970DC9E17EC6D648DF8B104CB69\ +6B2008C2769A89BB4C0DE8B9C7CC2316 + +8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ +E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ +DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ +394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ +43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ +7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ +A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ +E8:\ +684F56F8E5F781F6E9429769733BBF32CB7CB91A7EB4E0880BCB6528B850DC82\ +BC5E00EDC7D0A1FD9680A96A0C88D741 + +EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ +F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ +85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ +C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ +4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ +97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ +345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ +6427:\ +20541C2A62B48EB7CC3B51D867AA5589DE2A15262083002ADAE540038C444425\ +3B05B6A54D67987963C7C2DA91BB0CA3 + +23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ +89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ +DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ +DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ +BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ +F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ +DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ +630012:\ +B66EA21D2A4AD66E9AC2C935CEA581D6E798FE77E26C5A092A1565D280C563B9\ +55F0B9C5969409ADD68F23753B0E10F7 + +0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ +F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ +C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ +A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ +A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ +95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ +4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ +78DFB921:\ +588433FC26C41E9854F2AEF43306043851BCCE4AFD782911599FF05EB01A5CEF\ +51BFF7A0F141948FCC989B56F5DC85B5 + +3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ +A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ +4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ +BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ +DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ +91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ +9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ +BB0D19F909:\ +7AE8CC1E77BE9459E0F2449AC99EF9978F2A4587E877AEE8DF639E6655685957\ +A267E3766099612D2FDC8A83694276B9 + +747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ +6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ +57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ +00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ +77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ +81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ +04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ +BE6BF8082E8A:\ +A064A6AC91429EB63A0B2D97DFA3B3F07A273BCB87363FECF6831AB6534B5D60\ +2CEABA051B4CA62871E583406964E64B + +57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ +06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ +6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ +4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ +D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ +58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ +FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ +E839A9D4608F03:\ +D72F778BA9B333AC61183BC8D84D6D4BFA51809519BF0E5081985276BA1A3F4E\ +9F4E191D208C7519771D348D4C3E29CA + +04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ +10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ +2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ +BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ +2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ +8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ +8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ +5153592EA81C6FBF:\ +A1C0E86F0093538477619E9DB75EF5881821FD9BCC00FD6590C815FB2DA59AAF\ +59C151F02DDE9B840841ADCAEEC72698 + +7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ +735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ +1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ +7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ +39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ +9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ +F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ +604F5035C46B8197D3:\ +26A5D1D67AAE51F8A14A6DC2E42264FC62F63F73F6F6FF58AA02888D276D5C8F\ +F77862E8C4B59D4D53D516C208A85064 + +E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ +94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ +DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ +7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ +60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ +7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ +6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ +07E3B953ACF99964B847:\ +EE7B56D5135AC16823C49E65BDFABC83C8AB96778FB2FDBC9A32CE79CCB1AE7C\ +18CA39B48FFB8E9F0EBA584BD1CD1BA6 + +D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ +32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ +7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ +8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ +07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ +C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ +4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ +6C90E8C4D100ACD9EED21E:\ +94A3FEEE9C2554CF6732A7C87617FF6D067FF7851DC5148B6FC98F6E5EB1E65F\ +8917B14F7BA3295684869016383E7239 + +3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ +AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ +18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ +A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ +E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ +886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ +4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ +E2DD603D9EA24DC7C5FD06BE:\ +FD5707477DB367FB95AA0716703514CE3401637741D86CC0688CB879C82D59DE\ +4AE720B3E2F018A665D1F0FBD9562943 + +1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ +742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ +B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ +69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ +E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ +9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ +779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ +A80012976F31FFDF305F0C9C5E:\ +94A27262B344E01233FBA98BEBDB822DA06BD22E0286ABF3ADA616AAD34049A0\ +8FF1A9D0FD4FAD9666C2AAD6F796CC97 + +08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ +9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ +53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ +479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ +B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ +DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ +3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ +B461A40645BF176601F1E760DE5F:\ +E3C7C87442779B40EC9ADAF74430144DE108515CABC232B70D3157BED0B17FA4\ +907E84F2C3FE23720A3031E7ECE5B187 + +D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ +5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ +E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ +F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ +8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ +EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ +1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ +86C226169FF257954EBDA81C0E5F99:\ +13183BC4EB545F24B5803F49BC278F64EFFE1F688E2DB09DBC01FA9B67DF38CF\ +15B9B5F7827D02F4B731F168CA413F7E + +5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ +431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ +40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ +A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ +0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ +2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ +83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ +D3C356C914FA06B9A7CE24C7317A172D:\ +FE98D2252804D32171AE2DBF85B70F7F4CC639CFC93F37167862A2AE493370F1\ +3333393E3FAAD85C0F371AC40BEC3E72 + +6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ +E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ +D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ +B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ +645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ +F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ +39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ +68F50D79F0C9C7314E750F7D02FAA58BFA:\ +05E1DC86EE49D63E3F674B402A4280F682C73834BB2BF9759AC9466922B5D3BB\ +4275B04E090FD5194347B3F13268ED93 + +5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ +4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ +717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ +4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ +FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ +9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ +39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ +7DF95B60FA8712A2271FCAF3911CE7B511B1:\ +583C37FB2932A6FE22795CB74725B33EE2F13228CDF81ACDCE7DBAC4D2086805\ +6AA2F256C7A382A8D2300F34C73A2F44 + +03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ +C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ +C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ +261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ +0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ +61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ +37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ +A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ +3AC6EC41E7DB66408273C6AF2526099737A3F29E2D567BA37F7CF678F3E42978\ +D93CAAF8AFB06540591ABA9F767A1364 + +2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ +C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ +4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ +339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ +5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ +F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ +7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ +B7F5CB9923AD97058EC067700CC746C127A61EE3:\ +F96FF1F5D0FCB2A167141E91F18E04DD039E74822D65F7826E6CA3605CB9385C\ +DA5EA194866FBE7F91699ABF707CA11A + +90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ +70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ +495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ +DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ +5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ +00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ +F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ +CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ +A8C1CAE5BB4C53D9BC76EF0BF67B1A257A041F74CE59F9B0B5300F1FF185B2C1\ +C74FE82618BDE4143E43DD6F876C988B + +2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ +6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ +6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ +1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ +0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ +B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ +2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ +C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ +519737FE0D3C60652F73CAD8222033ACE03BBCAB1BB96B1772658A92080ABD96\ +18F96B99AE3AE7932AD55C887B54BF91 + +721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ +EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ +B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ +FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ +2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ +5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ +C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ +9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ +DF9E83758D502A5A3869697B415F411277BCE9A7638A99D912EAC710BEB3C86E\ +F90F7C41DB4D898A24E7E570745A145E + +6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ +C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ +8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ +90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ +6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ +0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ +CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ +6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ +7E0A5E927B4D10A6430B368099C7B403E21F29BC66CD35F73E2013C8F24F1752\ +C88724E4A8970AE8050455E572FE0C82 + +6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ +70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ +5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ +E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ +2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ +4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ +27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ +CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ +C0826DB674835EB58C479DD02B95A1D14BD4C233B22E001AD5DFC10361EC2EA2\ +294F31DEC53DD08057B7F8D917C26821 + +B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ +E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ +0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ +F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ +0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ +8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ +547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ +758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ +E36DB0361FF2713448930246EF3D9C325352B4F9211E428453038055E27C5A6F\ +3275546268A17B525BC6F661EE663F9A + +83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ +C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ +38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ +BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ +5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ +3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ +8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ +5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ +DA9526897C8B9B550AF90ABB2A8D57940E91254727C505F6E3551D988E6E1DA2\ +5A5C153AEBE3C6546DFBFBC5346A1205 + +A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ +A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ +EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ +3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ +80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ +49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ +9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ +E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ +5CD7038528211F12A21CBC69017C48E4AC4E361EB9B6CBC89A2907A86508E7FD\ +2A2B2CEC39A16AD412ADCE2AA4623755 + +A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ +A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ +0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ +639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ +B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ +877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ +1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ +D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ +49DF9723D9FA56B7202AA9BD779D5AD33B7313015FEF57787AB34FEEC9D0033C\ +094009B585209A4B08F126285B5AB379 + +83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ +9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ +10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ +8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ +88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ +0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ +2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ +04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ +F3F1F376CD2B43FE3B811792A6F4116225D04ACE10D480F7E42DDD5EB3B0884E\ +B670AA250215FCFBB5DFC87884C2B71F + +3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ +623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ +15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ +A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ +B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ +C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ +817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ +5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ +CE7D90B1C0A54B5C1918CBD023FB90D130C54116F8292BC388E31C1218A48005\ +3A118DF97A07E6C3F4BFDCC45083A57B + +724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D\ +21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DA\ +BCE506E558720520D33352D119F699E784F9E548FF91BC35CA14704212870982\ +0D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C8\ +7E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1\ +A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CE\ +C6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2\ +FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195:\ +76AA811F8BEACBA315A805A3EE2782E44E9C950FAE78F502260641B7B7F267E9\ +7F0CCD0DFF353A48ED620D73845DE5DE + +3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A11\ +4E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B2\ +92D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02\ +539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332\ +DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B\ +0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49\ +F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C252\ +7AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04\ +CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D\ +2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18:\ +4B24E0D8F401F94B7B3BC3B3CCA1843EB553AAD14F7997AC2F7ABDBC1D9FF96F\ +40E6B6E00C3376081DCED89AB4869A29 + +023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A69616526\ +76DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529\ +C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC00\ +4691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C\ +0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8\ +B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F\ +52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B46280\ +27A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718EC\ +AE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8\ +720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710\ +D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D\ +9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651:\ +9938232020EEA3BEDC550D9B85C1C6DD5D6AC043373BC1571AB5980F28287DF3\ +F48B2C8136E0A7A59B471F0B11A7414E + +20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3\ +131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890\ +808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1\ +AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135\ +A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAA\ +E17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4F\ +DB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D510\ +71BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C\ +6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493C\ +D136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C30\ +74E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E\ +4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E\ +6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6C\ +E2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7:\ +099495B5804C6ADEABB69E59CAE70E81BC2CC7193EF74465DD9616F36FBBC07E\ +F1C5BD2A0F59796123EEEF22F31D2C25 + +4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD8\ +0F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB\ +2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB\ +0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5A\ +A756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A\ +2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746D\ +B6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E\ +8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3\ +284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C\ +584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9F\ +AED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A\ +582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB\ +8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10\ +E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107\ +DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3\ +C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD:\ +97C99D30F073E9FBF61954DD94DA41B19440F4B4678CD1566E8CE114EEF64587\ +047EE036EAB1E386373CC75114D3017C + +D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024\ +E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211\ +D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C3\ +13D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D7\ +3D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D\ +682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058\ +321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B2\ +1E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D512\ +63B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978A\ +E90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA\ +21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4\ +910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C\ +63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A9249\ +8D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089\ +CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6E\ +D83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A7\ +90910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA\ +43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C\ +4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC9\ +8D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBC\ +B88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A89\ +6771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78F\ +A3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824\ +CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD564\ +9FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458\ +A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8:\ +47A44A3B08EB1AF1F5BCDE156207A71F1D123D2EAEFD2F554D1ADFACB41C7364\ +E8A7023D42DE0045CF3651FD9487584B + +4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B\ +73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF\ +2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520\ +A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD\ +574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8\ +298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB\ +6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB4\ +2610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61\ +ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A898\ +8B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014\ +BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B\ +07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC826709399\ +48FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02\ +F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED66402361\ +6B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA\ +7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8\ +A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F\ +469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E\ +6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F\ +40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34\ +B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF\ +08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281\ +665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F\ +4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9\ +186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC62814\ +0996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE0\ +0D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA962838\ +1055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79\ +CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4\ +C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D5\ +99B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8\ +D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED\ +1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACD\ +B178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF2\ +14DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478\ +DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48\ +E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3B\ +A36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385\ +F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7\ +A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4\ +C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017\ +C3A66CD4EB2DDB42EF85EA0CD65534:\ +3D30B8FD9922ACCE224F21324E9FDE7E9CDC3D961117DCCE95F9F1AEAEC23C10\ +85C14EF1C58FAE5F9FB56595491C9693 + +523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3\ +EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D\ +6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA054187\ +70F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01\ +C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08\ +D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6\ +013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF044\ +5B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCF\ +E87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E55\ +44E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D\ +8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80\ +DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671A\ +DEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8\ +B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC728366\ +1D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615F\ +B93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF19\ +9E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D2\ +9B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB\ +4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D\ +323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2C\ +FBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF\ +8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AA\ +CDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83ED\ +F9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED092\ +53039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6\ +EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE\ +11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADE\ +D1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648\ +EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107\ +CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B96\ +5A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7\ +B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E17\ +41553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E8\ +19C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48A\ +BE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548\ +647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816\ +AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430\ +142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE\ +40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C6\ +40909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E5\ +3E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB4665\ +2196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B\ +94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE\ +4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9\ +CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D25\ +9C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE\ +561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7E\ +F94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E\ +5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1\ +C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6\ +303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A\ +2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1\ +C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3D\ +A8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6F\ +E398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6\ +F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C2\ +13171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD\ +46B568CE294C89:\ +732977A1AC5D19808E9D7AB638F6463723AE3F16FC61CD2C035F253F0F7148F8\ +38C8CC41FB383A8C854B7A02B5116F54 + +F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD\ +9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81\ +FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E904\ +49F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0\ +D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6\ +D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EA\ +F977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B\ +32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0F\ +A032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C\ +2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC01\ +03CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31\ +B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F4412\ +0ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7\ +685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491\ +B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF\ +2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C\ +3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF30\ +0251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736\ +BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CA\ +C2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B983\ +20B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B056\ +2B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1A\ +F9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A46\ +3B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F\ +5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137F\ +F9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BE\ +D133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68D\ +A188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE8\ +97B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030\ +DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A74030017989\ +92F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54C\ +F7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA698\ +3D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B5\ +2C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE\ +703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C\ +05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B0\ +4DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC0\ +99EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED\ +1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754\ +688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F958\ +1DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F9\ +4E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4\ +181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6\ +FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169D\ +C46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12\ +C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB0\ +00057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D0\ +0A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4B\ +A1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C\ +2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441E\ +C8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A\ +537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8\ +B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88\ +DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656C\ +C30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D7\ +2DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19\ +C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B8\ +8DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8\ +F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B85\ +5845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4\ +ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F16467\ +8160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D629\ +4FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D1208\ +9CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0A\ +D12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397\ +B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA\ +727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE\ +9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E7\ +3EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A81\ +0FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1AB\ +F6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E\ +854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07\ +813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215:\ +6F9117B8DE97FAB71857BFF4BF5BA8C6FC83537017D225686C538D895DC5BDE8\ +BBCD4584201D1CBB47B60F6EC195B53B + +08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6\ +A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6\ +B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399\ +DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB296\ +47F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE\ +7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B600\ +4DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FA\ +DDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120\ +D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE390308\ +0A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBD\ +BEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A294\ +4384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E62\ +22A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D37\ +52889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0\ +A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33D\ +B8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4\ +C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F\ +7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D\ +7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24\ +204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB229\ +07F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3\ +C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD1\ +5C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130\ +D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2\ +D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D\ +56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572\ +FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD5\ +6495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C\ +15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDE\ +FD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041\ +259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A819498975\ +5D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A\ +317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC\ +5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3\ +504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E5\ +32A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999\ +B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D77\ +85C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FAB\ +AA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C215366\ +3B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2\ +B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530C\ +AB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2\ +281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD898\ +6EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B\ +82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77\ +BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFE\ +CDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BB\ +BE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C2\ +8F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705C\ +A27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2C\ +ECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D1\ +0CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F\ +2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246B\ +D04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD\ +1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F\ +265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB0989\ +5CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E\ +4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F\ +092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E90\ +0200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C\ +29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A1\ +3EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398EC\ +F3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A\ +49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BF\ +EA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480\ +C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD4383503\ +3B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E26\ +26AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A\ +5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041C\ +B3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB52231\ +91E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B24\ +42B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E\ +228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB\ +5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604\ +FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE\ +25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914\ +BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F\ +2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8\ +AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42AB\ +AD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3\ +B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3\ +688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B46\ +7CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB3\ +3770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F0\ +7942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD\ +394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C79024581211\ +3204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA\ +8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B\ +09B7F42D193FB3E9C06329818251A2F7E6474462C95DED:\ +91E706E199A3601ADD699E05696623B6AE12B1E462E874177A79D1BE34C37348\ +359FBA3070281C78CF8813171760A6BA + +1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380\ +D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8\ +DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F7\ +6316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA37608\ +26D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E693\ +9C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9\ +C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96\ +C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108A\ +F1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322\ +B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE7\ +0057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DF\ +CAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D0094\ +32DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181\ +221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083E\ +A427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF00\ +36D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A595\ +2AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CF\ +AE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF097\ +72D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A\ +83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1F\ +C070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E\ +0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665E\ +D1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA28998410\ +3F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1E\ +CDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADE\ +B9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C\ +6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121\ +210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8\ +889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3\ +123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB\ +71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2\ +B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F62\ +1275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5\ +EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E81\ +6D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A3187054\ +3D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B4403099898\ +57103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B\ +4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C\ +2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE\ +6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D88\ +0CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD2\ +31B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB3\ +97EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3A\ +DFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FF\ +DF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A2492\ +4A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC27\ +75833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0\ +FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666\ +DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F\ +40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5\ +F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA7\ +80703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF9428\ +15C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEB\ +A3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45\ +B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F\ +5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C\ +16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5\ +278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D5\ +59D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E\ +97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956\ +E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1\ +E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106\ +E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10\ +ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E\ +806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA\ +01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD8\ +78C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D\ +29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB\ +31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FF\ +E178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590\ +320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C\ +908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8\ +369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98\ +966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A6\ +5A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F94\ +76D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340\ +847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E\ +950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFE\ +E744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D\ +30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C\ +89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427\ +A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0\ +EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E288\ +5EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB8\ +9B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABB\ +F1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11\ +735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A8\ +64D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7\ +FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA7\ +25473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697\ +C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112F\ +B2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA4\ +2F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715\ +180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED\ +9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7\ +120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C\ +07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE1\ +6318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884ED\ +D768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E\ +4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B65246\ +7FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030C\ +EBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4\ +E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841\ +BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF\ +57795DABAF40687B2CDA7A5014168F:\ +CED226A8D39FDAF82FA3FB513B3D4DBCA48D586921B918F3CE45D1C5B294762A\ +AFAB4440F6732C6663D90E206C4C6552 + +1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D5075\ +2ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07C\ +F488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A107\ +6D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3\ +BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C40\ +5F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB03\ +78391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB1670\ +0EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F\ +273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC3\ +3B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60F\ +A01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E\ +6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9C\ +E264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA1414\ +1AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C3295\ +8A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA7547\ +0C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B\ +98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2\ +BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7\ +C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255\ +048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF\ +00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8\ +EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0C\ +FCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F\ +8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96\ +E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94F\ +E43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE8\ +4E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D3625\ +7C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C95\ +63844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000\ +F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CE\ +FFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986\ +D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE9\ +54785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB7867\ +6E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FF\ +A65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B2\ +3C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFF\ +E6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C946\ +50C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3\ +742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D0\ +2BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE\ +79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFD\ +C2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2\ +E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C\ +59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C\ +4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91D\ +F0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97\ +B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073\ +D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB50\ +7608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5\ +E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E\ +5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B\ +0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159B\ +AA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D\ +9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF\ +05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855\ +CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC424\ +5A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E1\ +3B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E1484\ +3D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC\ +9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2\ +CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F7\ +6242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B2\ +60F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C7369\ +6F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA8\ +1F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631\ +E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2\ +FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D352\ +1720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A\ +7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9\ +F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EB\ +A748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A\ +37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE\ +42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA1\ +5337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD\ +7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE7231992\ +24F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885\ +A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F71\ +0BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96\ +B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B301\ +3839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433\ +B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FA\ +F353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD\ +44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF\ +3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E\ +5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2\ +B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A\ +1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054\ +DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B\ +4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F\ +1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A3503\ +14B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA4\ +0FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C\ +78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5\ +B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2\ +BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF86\ +2EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377\ +131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7\ +AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB04\ +8CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF\ +8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9\ +455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389F\ +A745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32\ +D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810\ +E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615B\ +DE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8\ +EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA60\ +69369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6\ +D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F\ +7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF17\ +39C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06\ +EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A\ +1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4\ +A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8\ +545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8\ +D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B65\ +75A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364\ +A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6\ +BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D235197303\ +38D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312\ +C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34\ +090FC9BC045271:\ +1CB96015F86E5DF62EBB416D772ED6CC74D056A83632EE18BACE73614AB0CED8\ +C3372EA72615CFE17F88C993FEE98415 + +[Skein-512(512)] +:\ +5AF68A4912E0A6187A004947A9D2A37D7A1F0873F0BDD9DC64838ECE60DA5535\ +C2A55D039BD58E178948996B7A8336486ED969C894BE658E47D595A5A9B86A8B + +CC:\ +D44B1D69E638D37908EE7C9EB212F4FBE465F2B383476C19BB5516E2A365BE1F\ +B33BD8E14B4E03539816B9E1430AEB6B16146E91D03BCE7968A35D7DAA4F9416 + +41FB:\ +9FE78BD755A7B4E50E91033C250F65680D83D5288628FC848374496B849E0A21\ +31C538737FC48F017DA892D0F2A61C903790505313C4F22A207FC991E2BEEDC7 + +1F877C:\ +14477998719358A65C531C8FD867A7830975FFB77FC8E7D997DC093B80C26FF0\ +02F691F74F7D4DCB2129354BBD04D5733B735D2A7548CAC5CDAC2D2A22D9D6F4 + +C1ECFDFC:\ +7118835A893594C9829B6CBA912B03F90CAC2B5FCE8534181E90559237827381\ +A67D1D72422D3D896128A431DD36624DC9FC0423D66618945532C36485EBF492 + +21F134AC57:\ +0B636B011E65FF9893C8B8665FAEB8438C1F2D67418B78E03372B835531EA6AF\ +B6AD6300BC7933A463AB675487E5BF4997B78DBA7453C35FD626657AE64B192E + +C6F50BB74E29:\ +162E21E3D5E818B47016E6E1C06889E418EFF6CABB735B1B1E6B5F19237F1DBA\ +CB74CDEDC6B764ED377B7BCD1EECBE7A83F4EE43AB075D8E6230DD6527645971 + +119713CC83EEEF:\ +2A2909650F127D6E82E44E5E6A9808CF19C6755B8FDD57C8F2D14ECDBEF3D0CD\ +48CDC5E6D546A794B5B005A9A34C7F4D3B0C30DD9A45F73540431C46D5D75DA5 + +4A4F202484512526:\ +67BFFE5E3E7AA93FF534949BE88A0BD280B74F65942904E925F361CC769E82EC\ +B3520E41A617788CE1F22A033B9476AD41AC890DF8AF61B3DCBC2C965AB8C539 + +1F66AB4185ED9B6375:\ +BD27B8BAF70BD1A57F449B336FD441125070D317FF894EF5FFEC88F78EECCA9F\ +386B6502CC4340FA94F230A9A3FD39B94CD88D557F80CEB0B02DE7E482CE202F + +EED7422227613B6F53C9:\ +D62E7DD468F310B5BEC1FD2F8CE10EC55807D0F4D43CB34A1BA93BE818502898\ +8689E44D95CEEFBEF5BEACC63C95202C30858A8A788D83C60ECEB9327F89DD0C + +EAEED5CDFFD89DECE455F1:\ +38D4905C4233E15E0032CB3AFEC2016F7D4837BF9C3C50A5FB330E0F215132D8\ +98E516DA122A83FE995DFE80D0B9D16B959CCA1153FE74EE0B80AEED886FBF1B + +5BE43C90F22902E4FE8ED2D3:\ +55D8112842FDABB61FB26DA285C79025D3B22129F0B3A3A75BB32A30604BF7EE\ +42ED0A10B1F5307950739B1A3D10197F8DB5336AE81BEA27B5491F19F1D5A184 + +A746273228122F381C3B46E4F1:\ +94CE960085179BDEDF655B1CE1E82C7F2F4B744B01ECE7F4F1E19D49AF88A7C9\ +5660CF77793A27C90C1060B22F6544169143708EA09F26416F81AB48278B504E + +3C5871CD619C69A63B540EB5A625:\ +A249D08ECB8D45E14B2ECFF34BB444A93F45FB687DA95FE2EDA2A645F0191869\ +43A0CA0635D5DC8DDD05007B21151CAB187B4BF0B831C70E48235D7FAB4D31F4 + +FA22874BCC068879E8EF11A69F0722:\ +8004B6E57B50DDF61425194684FC6D2D548493C424BC380C5E20364D12939C30\ +333F04F170C02B8D39D0701AA9BD687DBCAE1856E4A358DC24086BAB50F8BF9B + +52A608AB21CCDD8A4457A57EDE782176:\ +83D4300128648D2C8A62970F3B228942A5708B525AF4F6CF52588686C65A1290\ +A3D1EA8BDEDF87D6FE81BE701FD237E7F80C5825E1BC02325B3869516D513C9C + +82E192E4043DDCD12ECF52969D0F807EED:\ +64D4BC8F76EACBBBAFFEF53E0A88C22369734541E709DA4C9E25E7FE796B6878\ +23474A38F8F9A0ED60FEDA6E052D415880AFE0A63A5B0EE1D9F3A97DBEEC6FFD + +75683DCB556140C522543BB6E9098B21A21E:\ +5F6CAAC2A8C20225ACCDF535169E01413DBD012BE8FC5B9D499D5E86A8D11728\ +235EF81FC7EEEB4AA55C4052065CE23D01E9FD9565500372890CB7B12CEA6E1B + +06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ +7C298303F3C110FF7F0CFEA1BF0A5B03ECE9BE35707A2EF8A21EE7231986694B\ +681C246CBE0CD6B57746D02DDC2A08022D4F43DA48CDBB8608675A91F3EF6B6E + +E26193989D06568FE688E75540AEA06747D9F851:\ +F24A324C7D6002BEA95C2C58D76F7FB447EE8B8A44C79BC80A3561507B068E03\ +99E158EC21314EEEBD8C2BC3B2E754DE1A9CE6610873A9C6EF3E101E8DAFC377 + +D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ +7CF59648210FE7128AD8100911DAC9315E5FB01691B14517B1A5CE2B87E09963\ +847623F230358284AB21D760CCB62A40CDB04B3F8F8F500FE71C7482B7AAB52B + +57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ +6C7592D5EA214887F27BED37C73E5BB1F1F57A34D94B844729C99D136391F671\ +8313DE0E8171A9E72AF720DF8B8D79A644C156808E00E711434EBB1EF6A1A4D4 + +A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ +A9B4107760E1A0CA06F58E6CCB8CDDCAC88FAB92A6AE78ADE7086D1D0F3F21B7\ +F3F61E750B98F2CCA926236381B00BE45C5B61398917090D1D97D86CE32CD4AE + +AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ +7F8863F906EF0605D3CA7C225D8EC78E793A53A2ED5EBCD06A6332B5F3CFE8A1\ +0FF722B087E8326C2D17EA38285509FDEE1337E75163AC3F24268D2CC3117755 + +AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ +39F7739EA96268971A4D14F2DB217BB582EDE8891E5776EE1B7C9D380D7EBD62\ +A26AD9AC880E606950AB156ED0E58F05D7F1351FB69F91EF91F8D9BDB1A13B56 + +7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ +E12ABD9E3EF6CD2029BE5C3FE2BEB3909CD41EFEDD940D1CF7BEBE9921303115\ +F4FE78E3880821C8FB17C91D170C533072D260610510EDAF370655DFB4D142F7 + +FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ +83CA72EBC5D7733F617BB3137551052DF789BCBF1ED9EA37E8132A3BB21B7AD6\ +31147FCEA0342D39E30C98F01B32CD804BE246CAE747CFDB9F9CCAA6A384D215 + +0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ +9B2B9905B6CBA3266ACD36AB4BFFD1038EF7D85E3CD4F6A538B2370771C4195A\ +0B057DF95B167D56BA14AA49F01D1D0E79547C8373B86807BB98C5B6D55E0240 + +A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ +198CE7B1ABD54A06D27177CCFC875E557A3F88AAEA24FE27D42EB28F5DC3EDBB\ +7F94AB88E5536D1EFD79D68B9466419CAF146DDDB8707EBDF1E241FA8B4F43D7 + +03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ +3FF97EE9A9B02FCB9198C2B0674D039071AE38344EE45EADCAB21505B916DC71\ +8C9E31E31586D2D1DB03C3C4C32F65B44EDC00B8A02ABF0B6CE58303438989F8 + +84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ +D48BFE65490DD33DFBE4F218E786778EF6BA41507ABAFB0AE0566CDC95705FD4\ +F3C8D1C87D2FE3A6D1A770B5D2809552B3E7E4754A9EB8D300E7114A2D92163E + +9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ +842443FAC2554CCFA9D8F23FB14AF18655D0E412B6EF6F156C4B2FCC2B6156AA\ +013D8D02FC04F4151899EDA22493A4F5D3C6402F1784A07BF4EAC6F83FE31D67 + +DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ +46:\ +A08A4E0CA9153E3B8D67FCC3607E22410E1F257243DCB0B02C4C1A3E7FF7B7C0\ +6C56F2A3EF6AF1F203F1AF353BCC654FA2788C397A584981DEEBB84B62CD784E + +62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ +B5A0:\ +94BC5CD05EC833E5ABA95E0AAD30704F53A759A03105A4EF0F66B05E4FB750DE\ +8D03171D45A8FAF53565C56D6CC1F254F97BFF437BD2AF271FCA14B6E10AFAE7 + +B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ +FBAD4E:\ +8C893818B1A4958593AAA3DFEC60A697301858F845060A97D630A7F60439911E\ +7498E4734779722459B8B038B58437499B9E04DC6AAC700753788904209862E3 + +47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ +ED2C2492:\ +604284B092DDFF75ABBE3C33DC49D602E32C925848A3CB6C5692A3BB41462EF4\ +9AB20964B92516A3D99D5CAA23F3C24BBE3F6BABCCF906EA337BD6389404E9D4 + +512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ +6B2EE4E542:\ +8511F2B71FD7313E0F13DFA3334EE256FC696680C0588308DF978479990BC60C\ +757EE05CD869716164FC71A74C164F9EB8E013A3C26FC2B2DFFE3808E59BC6B0 + +973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ +2A1493D8F4FB:\ +AFED8C12189D55B3B7BC58767ECDED41CF3C990EB057BCAB0199341A9B548032\ +5679D87269EF95A03916BF29548FAF80092EA22D4BAE02500D26C5DD28C73AB6 + +80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ +30A934467DA4B0:\ +F4A3305E83BFF9F4E724DED2621D186AB60C61E787207C60328FD2D998B6A16D\ +9B8C6527306ACC3E4307549C65B5013EBEE2827D9E2790D54B8906339FA6630A + +7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ +C0308E29446B8ED3:\ +B3E5DC61E4E8F42CF6FBEC1CB36B87A0EC15E3672BC31A74F4A4BB0C35A2F509\ +8166AAE37100326EC7E3C2D85E869AAD5FBF6C257AC8AF003AC2315138289219 + +C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ +723B20F67BA610C2B7:\ +CB8289DF6CA9F60F82D2ECBB27F6BB58C1E10588ADF3A875DD2154FC258CE8B9\ +77F68A03B8B91075B0930E9AB9E69EF6B55C005967D67BA1CE401B73D58D6FEF + +01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ +0C834CE6EADC2BB86BF6:\ +A48EDB5A5466949DF0C13F0B31453D43B1E6072FFB46F1D271265F66D0712B9E\ +8C1FAB7BA33F7B598611B67E6C563577BFC6A5536A31B3FE77229752B3443163 + +337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ +1540D29BA27AB8E309A4B7:\ +D177AF21ED52695508442EE117EB2B958E992BE4E6EEC486D35164B34857AA9E\ +DA06ACFE8F2D83D65B6A3AA0EB16921995534BF5BA1E92340D65B86D1FD729D9 + +6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ +32B58EBC38FC2A6B913596A8:\ +473029BD56406552A0A73E42EE5C4E940BC0DF4615C3A6E90ADFD7ACCC642C87\ +2172E374C74065FA0E9CFD0D2FF837CB1FDCD28E337F8904962111983A446E9E + +F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ +38467205F5DCFB34A2ACFE96C0:\ +95890A1D43E76A33C3CF4E3CAF9477310E240AD7ED33A1278A29B20D7CC0A7C2\ +D2AA3E2CDC64AE682BF8063449F972AEC5E7B5B29703E6B5D4C9746051E8C392 + +CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ +B06CF0F5A0EA15CA907EE1C27EBA:\ +80E68A5A7E83E11B5E872AB0EF2B4AE83BF0AE5F69C0C9877011D26E74DFBF01\ +02B3788BEABBE6B397E4930C37A9F9589D933A29D8F0817756A2DC760CC6260B + +1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ +BCF84D0D4726364B9BF95AB251D9BB:\ +1B7CED96075AC040E0DB5920DF335A5156E88E8CB4810CB678CB22022AA9B604\ +24761F576C20C8A1C34F3E2290E9035697E40DC6BD309652B3104AC16E930997 + +D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ +C7F157298EABC4DCE7D89CE5162499F9:\ +3C0C4F502CAF055E9B145DAF4B45FCAB168C2CC7CF5BEEE2273F76D047AFAEB4\ +9A72A4D677DA23D0D7BD916C43E3B7D546E5A155F4DD2C877B08A880153D6409 + +BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ +BEF788CDB5CF4606C9C1C7F61AED59F97D:\ +EC59D0F7E4EBEDA8D53C8D562307CF2E040207C08EB90FF640E6C9D550851794\ +4757DACB0F00E3CB8548C2A363F8511034368A7BF200A62BEF363685F61250DE + +7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ +86E779CF053C77785AA9E692F821F14A7F51:\ +0D49FED2C3105D46DACFDEEAD9E029FBD5D80BC0D5931CA33105932E5442552E\ +357531BA36BE2F158AFE1E1983CCD5DD07C220DCD5956820A0A1A80BE7CAD201 + +9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ +43304FBA401EFB2BDBD7ECE939102298651C86:\ +C40708D0556997C243202DBEAADD5C18DD092BEA1988CED4E85B029C02912B81\ +192D262571B5578E8C50DD9DE8B30414D13AEA3CD134F19071B50524723ED9A7 + +C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ +87D68D28CC3897452F6A22AA8573CCEBF245972A:\ +C6333D0D55C12CFC2DCFF9661B81920FF38351382DB0D454D09512C2FDE2B109\ +F8C5D445DCDE08E18DBAB94DE6432AB88971AA57EC811FA6DC658F9DAD184DF1 + +EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ +22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ +B7FD3B978E069F9A532E312D9B90AB8397D10DAA982184F76324D295A4D6DBAB\ +C3471B9817F1EE5881F611DE4F7A8CF66DA44C92284FE6DB7300CB98921F1EDF + +0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ +FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ +C718B883F2CF362B3D85750A5C602D671A2A12542E305081A31B2EE20A6C4361\ +22CE67AF70D622B08412DE036AE7C4DF5AA67D3B74181309C139662733A9C4DD + +DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ +9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ +AAC62EF9A43F0FFB93E89ACC421675E439F6C452851073877579EFF9D8CE126D\ +98A72DF829B066D12537FD5ADD3F5D584226A4885A52899E3FEDEC85F1D59176 + +EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ +E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ +8FA10CD34DA4CF0E0FC2819F8C6843EA024AEF6786EAB7EB6C770C47D6B5F28B\ +32CDF3D1F6D23F4498FCB3D1135ACCB5AE9FB22519525E8A8A50A85FB7E72711 + +416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ +97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ +4FF9CB413E26122BF029A27014D932371CD3191622E062EAC7D13414FC9C52AC\ +F414B9E46353EC08F019403658F003F97A83B66CCE5D8127C5B64D7D937233C7 + +5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ +A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ +31539AB8E30EB0DE0206ADBE95144482C42E6C9B7BDE8AEC94EE838215BFAA01\ +549212FC22058AE7A4B81CCAA36BFBBA05210C78346C9C687B2F24F47280A444 + +7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ +66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ +2CB150803ACEC71A771990A132FBEE6D841859E48C024D2757EAF2F6AEE737EF\ +0024A5F3BC423D4C8E5E3009E30A1EF7B137784221D602BEA3A83B81A8A2D5EC + +2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ +4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ +93C64B20F4487EE75FDD266AA66228C31FB7F9C34A8C6BEE423A029AA0BBBEE7\ +50A597FC60C1180A1637455E8068E87AC52E6BC33DF55DFDD818B05920CB798F + +95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ +D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ +77E947665E3674FBCD67139B98CAD5E0E05CBD04FE7978D489F0B3B0B8D26DE2\ +6A9C807F05B9D6EF30EC5FEF654EFA6B9F0366E155669F167F54EA2AF629C0B8 + +C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ +30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ +6A020AABB7306680492575842E34A88A0329A43EA49D7EA6DC41FDAEA75BF0E8\ +0429D9378CF5DC6A05AFB4A2980C78BE223062126C7430CD95A5FAAFE82F2321 + +F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ +05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ +F55C758ADD989972C679B26F399C204E4225CA29EC5AC8516DAFF82D90204BA0\ +8B3C4727B8E17100F9B9CFC04E7F39E5F6126C034CBCCF6FFA2DF3C0B081645E + +E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ +E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ +E33EDAF1D7A3553340DD919BF207E6852E5D5B3E09CC57C5CFEBAD2CB7D78600\ +2D7D568604CEDD09F9C24EA8377558F5E0A718BD47802DF75B8417F79743F4BD + +16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ +DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ +00:\ +B14AE0A5B22EFD7DD9CDD9493BC44F4DB00DE603F495FD7CC1C9D1A6526DC415\ +DEE5B7CC5906268C0005DA223A7D9F61347B12135EED23E971FFAF1A231BCB79 + +FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ +B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ +37FC:\ +0771607C10C77F9C2CC381CC16265B51492E996B75D05A84088467FA33CD5644\ +20986C7FD32FF211FD4017C7CD3FCDDE9CB9869679511363F72CC121832847F0 + +ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ +2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ +599BA5:\ +A1AA396E8689DEF39B8B81424525AB466FEF29EEC2E0B418E6FB4819A1D5E916\ +3A342E9FF9B013E49091FC1AF06879FFCA3C9FB40D0A5BB885CA7AC6495E2EEC + +36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ +479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ +40706B05:\ +713FE585737CA3817C711A5A747AC2C9B83E30EE9A83D5E6639EE4EB3A0F039F\ +F2342E25868D63BDB0FDA1030C26E2CB12997320A1103325ECD37E3FE06B95E5 + +ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ +29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ +31D06C77A4:\ +8C54B270780181E9AFFB354A46967D2E15EB627A33B9B51FFCD470B6D6CD5EDA\ +728F52244DCB6CC601A377F1912E3C081DEBE1309D52CC8A24AE932346B532AA + +94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ +EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ +A259FC4FBD72:\ +37F6454A0790CF4228DB57AAA21361F4C9445F5D43769B0667E8DD4651C9FAA5\ +D82AB2232E1F76E0B43AE3B231E980197E93A89DD17FAA87F8C1974DD4691D2B + +13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ +C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ +DBE5FE9694AD6D:\ +066876DEA299473304E95FDE464BC8DE5EF690F7ABD175FBF645627B2510696A\ +CBA360B3AC18738EF8BA68E9061A1AF8ADEDC0CDBD6BAB3BB191E90FFCC275D0 + +1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ +E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ +7EF57B91397AA8A7:\ +F08F0A71CF5691E602FABC24F466C737CC796AC4F467F42EA0751466426026C0\ +DD26211286D8783810CA8E3989891A6A4ABB54FF214391172DFDFA4F38214E54 + +BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ +7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ +44B78B2D48DE1A08AA:\ +3D59497B54622B33A4A8238653792A99E89E3DCCB8925149954E7DE6027D89D1\ +5D24D7B8E43D35C8C4B2DE8AF22138DC0515C4B20FB9A5EC065CAEF7E422C47A + +0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ +DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ +B3A6C9FED24D70749604:\ +3BEC4E0682BEF95AB5495A5949B11F570B3DA7801C7383F2A01EA87302BF40C1\ +61EA827828EB1763DA0D401DF4010FAD5329E3B1CA4A9925D2ACC325D5C9A906 + +BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ +A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ +8B033F77D384CA01593C1B:\ +B04D52AB7728CB43949ABF54274AC6842CF5B6BF1B7AC38FC352735322B9A655\ +7738E65580A0D110EED81E484BB2EE7FE8FFD257A9F9DCEC28A29B837D064F8E + +90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ +B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ +013C23F1E9611D595EBAC37C:\ +F33AED5F4B135D56A1387823FFC3E0B743C2D80E7EC32B7D8F339ABE83047790\ +8BB12F90F7BF18DD01C899CF6249AF4E77AE862B9BD80DC68CE05CD316A94E24 + +64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ +9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ +4EC5A49FFDB59A1BD6A292AA0E:\ +C235A9378EE1138DDEBF7BA475C0E298AD07673C03C3EC7FD6C67C957C80C56B\ +1ED079EEA09E84A7EEED20F3A10679A621205871E908D41589B4CAFB158A9BED + +D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ +B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ +498E1F6C82C6CAE6FC14845B3C8A:\ +0F15A5BEA0B3FD775796B8AF4C37C6293258CAA7137AD1EA1C42E85223C4F790\ +A1622B9A0EAB00AEFFC2F6C5D5F410A366C401BF30711F42A5CCB053B988452C + +12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ +88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ +5B01FECFC146BDB251B3BDAD556CD2:\ +8A9C9EA4910C8E0013387EE14D2158AB77A6E8E8D9BDDAD46012C0E8492EEDB3\ +6B6633C77B611C54438E33835C0AEB10EA2DB72D3A876C463DE848BDB75368E3 + +871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ +DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ +AE9CD5CF0991878A311B549A6D6AF230:\ +9845D5E82E4811D34FAAAD0B0AFFB22058B3F3BA23A2F2D2C96118510B51DD8E\ +8B58F6BE4997D60130FAE637BFB6172CE15A220F194AE2A706119A0681469C7C + +E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ +105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ +B50C7C681E773D109FF7491B5CC22296C5:\ +668BC32E633DF1C83D2E1E16E74A4EB292B5E9A92500213DC02A68AA98A783A9\ +21E73C78224A77DCD480551D7A07505C586DACB13E76C6C9C882B0F34848FA1F + +E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ +190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ +2C7CA303269ED14014B2F3CF8B894EAC8554:\ +8232E343C42568FB76CD4AFA7C554CC10F1188DB5CC22779C3614F03216A8783\ +7B8F331A02EB586C9764920D5CF62CA733DEEC217997E4D617671D35AA045217 + +6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ +ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ +1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ +4FC121F7F12E84CA4CCBD936B65A072FF73D80D8F5CC3AE73D0B6108A2C21238\ +56FAEE60C54F578042E26398B4E2EE19595B8775FF30672A489CDCCB8689B6AE + +4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ +8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ +37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ +DFF6BC6E2CF7BC1FB5B31B3779B58D5E6747BD83C4D0330C01D509059AFBC821\ +9B0F007580F6819C374C7892EDD6D5D2998D77EFF37F6412F44DADFBDF190206 + +08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ +B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ +85EA51D49894E45BAA3DC707E224688C6408B68B11:\ +A00BE2BC62617F78B7A40771B0884304DBDCC4D9A18CDB6C090AA60A8A9B4E5F\ +337A08BFDBAF8BECE5758B68D5F9A4615B797677ADFE076D701AAE7D177707BC + +68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ +8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ +04E18D475920CE828B94E72241F24DB72546B352A0E4:\ +FBADA5CC80D297537DDE932D45BB3CB2F08EA9859AAE830ECA90454D757CA11F\ +A719F260E613F5621D1AE1A9DAE2EDF8C81B4595008610E3957FC965CA6E021D + +B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ +CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ +BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ +38992902898AF4199CB7AF17E9890D2CFF7C772C65CC6A89CB524D07A4927290\ +D7DEC357C99253A14098B9169E83B970C65ADE55D66DFD64FBB6FE3421661FE1 + +0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ +578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ +44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ +6A790982AA5FDFD646AA1CE1F7026BD70CD8F4B16D5A98F78F9853C9F454EC1E\ +653D8E81B074B83964E083D42A87371FF627F316C73E1CAACDF22B359C64D1FC + +1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ +F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ +4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ +F7F195061FE0F6B3CE2BB0A1AE6F62040EA4BCD7F76750B7254D39F29FAABBFE\ +95810714F24FD2C2AEB25F037BF81FFAA14700D2F6EBFF5E341FFE7DE471DE82 + +B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ +C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ +E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ +4F25B9AE73EB2ABF53BA6D8864981AE382332279A57D6008C000709AB7BA1FC1\ +87074C9DE58BA55C88B532481C1110EFED65F9F89F55AA5C307A099066D9EAD3 + +CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ +5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ +27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ +909287F22D5619789410D2148F99D8997E6C42741A784A2C289D936FBA3A11E7\ +10E6F4A3918181BE5F3DBF8E867478D6F6F5189480A0FF327A479480932189D5 + +072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ +E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ +A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ +F9419515E368F174C98E6CBDBD0C4A608D49ADC8C0D0AFF45D2045385D8C8656\ +0A1F107E16AC294A22E2E29382CE39D2D63ECE51FCC8D02371605A5AE647E710 + +76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ +FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ +29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ +28F4D11F5F7811CD0DBC382F9DB2C8F309CCF510EDC13C7577EF73AC04FD9C89\ +75576DCD0A75D725C216BE2FC016D84128BC30C29BD838A8E5D23C7EC0D2279F + +7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ +650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ +AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ +E11ACE7F6D80AA0D2A6F80F74BAB9FB6CED1082B0BAEC48FFF2CD00B4A04A67C\ +58EEED8A617A48704AF36CAF8B3D38766DB1D88C0B4CE404DF15E703EB5C60A2 + +E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ +7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ +8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ +C34CD1BBB4BA5A3F35A2050B4BC01FB45DCC12929D250195B681CA17299F41A2\ +D466629B28BA0DDB5A8E7117836D09DC3654449A6225E245DED5E47F5116233A + +69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ +1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ +040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ +625A5D81169F344C5502E0F37A8373FEA67DD046A9F529DC2FD8AF63C930F4DE\ +D077145CDBCFDDD26BFF74B4B6855D12923906FEAF767BC3FA5F650D35FBE93B + +38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ +0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ +0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ +49:\ +8E4E564509D498AF8730C1F624B5B3ED039CDF1F9D0FDF7E6662BFD2F21D6350\ +37E9D724E646777AAD6AC17B1E10B516528658FDB923D4AD14EAD28018AC0BB0 + +6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ +0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ +2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ +5B52:\ +1CF572260B273D588B8F69C79C95E799441AC2BDD53E755BAFBE650E066794B6\ +6584FF66BFEAD0D6439CF8559F4AE723A7C8E5AA9968C3A3F413CE112CCB3F9F + +6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ +B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ +C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ +89CCC1:\ +96DDFEF31B9C589ADF4DD7AFDEA6F4D3F053C96518C51E9A6B1B56083B4D4371\ +72AB6AF42E3E4504E8186CF5A20FA1384A9DD56431181786562A7765F3BB5734 + +433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ +14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ +22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ +6DCBB4CE:\ +C482F674B5C5CA87BC3417A07053F160C6ED905B6D7A7BBAD4288AEE2854B54C\ +1B7350F6D23BEEDB5C687721FCD1B5E46C19D1625B3AB20EB2C22249C95672C6 + +A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ +7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ +881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ +BADF45685F:\ +C721ABCA24C7A496275D7B4171CE962144A7AAAFC9984CBFB7A6CBF69BDC6A36\ +39D363386171FE08E13609A2EAB4D78CEF842D95BBEE248CD662B7ACE72D7A8A + +006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ +312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ +96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ +9B62C60A4771:\ +473AD9315718739279E96A01F10E6D58B1272F6BB3496F2BA915D6E5B702FE96\ +2F1384CCC7C96E7EB71E54FEDA2F58016092BFD0DBCF70A4EA353A72F83A3FC4 + +F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ +A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ +9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ +CA58D5DAB38ADB:\ +3D673DA2CF25C00F21B51F30A41675B97FB59F828815B858F62F3E70AFBEE61E\ +AB72652213323FBAAB554C72A593FFCA648A03DD34806302984D8F91540B7196 + +E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ +F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ +B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ +21691E1069413848:\ +E90BEDF3CC53985910E405E6FD3357E9E34D642B8492341AC63E4B97DC097D5B\ +0E1617A4DCA0E8AA142595A7D52F2353189FF419328F60DCC9DAD5B5240D8C88 + +64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ +D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ +FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ +B57D6D0C2EDC4E78D6:\ +D3D783CFC9AE13C2CD463A2FBD776497435C5F31376C7DEB25F8F075ACD1640F\ +0FD244F2B8F80B1A8247D12BEFFC85994235A7357DEA2AF3952D8AFF69D2DD66 + +5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ +CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ +8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ +CD19E781AF20454AC880:\ +EFB0510BE69988D8AC86EC6EC8955E81970BBB6419967E9886C479AEEB3C2B35\ +C210E388B3FD84F7CCCF7C8FCEEF27A760342446418274784319D1BFB6E31D7E + +03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ +F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ +A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ +BF0FE3C32C17AA188A8683:\ +78EBBABA1E277949D3227086A8FE5C8AACEE40E78D16DF9CFEB80C0F5AA2160D\ +F19FE72BA4F2B2BBF5C6142E370F6FB70660551C96E02FE84AC3910D7FAA8655 + +F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ +E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ +0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ +2E937F21C005F17411473041:\ +0EFF04A9DCF46B12BE7FC8E1EB96B6C77FD7C8B548F90F7B4BEF8181AEE70BD6\ +F7538B508290C796D4656AB64C13BF965EA30A40A79BB084BB23A0DC3C962F5F + +758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ +62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ +2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ +29F695815D866DA99DF3F79403:\ +811DCEC2A8020F66974EC685546BD97854C72597332B860DD687FA977CC82159\ +B69D61F106AC4A70833BDC78471632D96FD1BA82BBCBFA9415FDCA12F868A813 + +47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ +84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ +3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ +1BB15B447589E86E8D76B1E9CED2:\ +4A1027E1D074DD6E1C480995DC551A857C6A61791DEC5B4B38908DAB68804D35\ +4B7F6055B395C0CDF158EFCDBD8170302439037C0DFF49F087D08DC5FF141FF3 + +F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ +4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ +853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ +AD3D7E886DEA4F005AE4AD05E5065F:\ +C669C31277926472D262E3967578F82E1756EF387B94EA9A778A2D60C1C8CF48\ +ED193D520BFEE4F7E13F820735996232D93960A237AF8D4EEFD70129A1C2AC8B + +58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ +7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ +68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ +EAABC35F5C2B0A0F2379231953322C4E:\ +6694CB192D378B19E30D2C61CF323F95361008B63BEEAADC2CC1156FC5C3A3EE\ +8DC3D057E74B5AC68A2D6BE30CDDCC3D066F8F753B2F0EBD648B9D11C1B244A5 + +BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ +4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ +2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ +159388D5C3277E227286F65FF5E5B5AEC1:\ +293711F929B2D7069A7551737639FEC7F0B84F8859486E3CDFD9C49553C0A719\ +06B87D5344234F098ABB4DE86F463155BD243A71B72D59B82B84230CFC6B38B1 + +8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ +A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ +D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ +407847DD0DA505AB1641C02DEA4F0D834986:\ +1B13A33069397F84B575283BF01F9B6859C39B19FD0539E979738CDE220BFA32\ +E194047E0EE944E51E4E5F2961AFD359534013D6C01D64E1EFE05CB089BDADA4 + +B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ +33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ +99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ +7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ +3B9DB555CE766F19E08AA227DF42574A312353510713E5F9DF5F3704A851907A\ +465471F686D24DE3FEFA23C6A010FAD0D2CEE2B970AC8629E69E75325FE72ABA + +2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ +A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ +2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ +205AA1615DB44057DB991231D2CB42624574F545:\ +5B16C423C1AD8FAAC4539E02E2F728B7AD951AB608D2FA607ADEAAA0E2A8C2E4\ +33DE19048F9122D4A5819D62EC76581C1E12DD619AD7CF48E93980A9B87CBA39 + +DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ +F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ +2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ +157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ +FA2C6CE535A66502E36B2D0B6861ECAB0F2018A730175D2A150A614E04AA11D2\ +48F327F8CF1C16C5B33F53879394BD243E2F2E56C96556958C51BB036F3CFA3C + +42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ +0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ +0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ +3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ +41761A253EA4A37EBB9D68B022F30ABBEF1B0038B043D72092ECC2A51F810282\ +DA06143156EBC3A632F5E0D8561CB4B1C9EBF5F89AADC6B7B62FDC33A6955B44 + +3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ +FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ +DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ +46176EBF044C4784467C700470D0C0B40C8A088C815816:\ +DE0665A8B41255B24D6FB3C32A64884CAA7D185D8AC72A829A3903B8D6D6CE7D\ +2C572C2DF4AA108557874E730A524B100D57B4A6C6E7DB27B00B3B602603037F + +D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ +91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ +1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ +EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ +A8200C1AA6009807FD50B0B4B9704F2B5B7E14983A0A40DB431EAFDF2DAC012A\ +E7695E85DD11E50A028C4EF1C3B4DDF5BAED8336FDD5C0D1380E3B5EF28A27A2 + +626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ +1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ +285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ +6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ +D9A0278086A77DEB208298197FC8D1806235163959EEB26CD36C523F2A77F6E2\ +6FBEA52D4F3637C3792F93E889C4F8640C882C2DCF811B728DB4316CCC1804F2 + +651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ +27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ +9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ +C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ +9611A7BA803A72823BBC3B9811D9BCF83C2B434EA1625758F3DE912E3B2CC6B2\ +6AFD733C942E95F6BEB68BB4F81A3AD919A1F4001902ED2D3041B7AEBDFB33C6 + +8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ +BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ +DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ +D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ +E220AA5855680EB8B4B35E61173B48B8A5B1D77C181439EFDB3BF642757256DC\ +A2B132EEE6D6F15652912C1F12EB875BAA25FE690787A35DD06444E661763999 + +53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ +8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ +4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ +47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ +E0027961679B6CD1CF4B496DEF4466EC6692B435D2AB3DF739A6D82E0C5B71B0\ +E666714E1EE58B78AEF5986FC63BACE53C658517306628E059B310A718605BDA + +A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ +E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ +2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ +B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ +BA3291627ADBCF8D6447E46FE2DC88544D38304353DEF25C4C1DE27D3B3CD90E\ +1B8629334DD1CC155D576925DDEC7F89C933BBFB761FC029221BD163D731052C + +0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ +5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ +4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ +D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ +D49A8BC7CDF5194F5B1278F765091616F54ED1F7144F72CBAB23A4FE0F89DEBF\ +9CCD47C38349A0F35681628E70C401BD859CBB3048A4089B8153A124629521C3 + +A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ +07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ +6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ +AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ +FF9FBA36F65BB0F4E5A201E7F5FD9E32B68A7E7ECFF5874B4CC8239C8F7AFE5F\ +E8A548C77E120E2417704DA858791207BE072958ABB80A1818A9D2A9E48DAC71 + +2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ +29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ +E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ +98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ +492DB0C6B669BE4D9EC22A45F4C9D8F706FF580B90A6D5C8B83A22B2CEB6D919\ +35B549F3E5D4CE0010B57ACB0A6F99FF2DBBF51305ED934904C5F3A1AC7DBBC7 + +10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ +3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ +A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ +B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ +E2:\ +8F49E749AB90B158C061B32E8BC4E375EE02712A39DD4A414F037001ECCC97BB\ +3D9AA3D05BD5674E40266B0D7D402A0396EBC3D880FD0C6BCDD19FAB1C2D8AB7 + +9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ +1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ +3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ +52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ +61EC:\ +036F6083AC46A67292E7685C835AA334FC1E58013A11EC8DD8A02D79512C265B\ +1009846F46F292C26767BED00372719541BFBDC8056CF5010EE2A61A87826131 + +E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ +9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ +2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ +609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ +9B5EDC:\ +9F84EFA2D01B7CE2DC1879B54D9CA330438933219EB0AB63EAE03EC40D44F9D0\ +9468ACC223DC9F67537B4A4177529A65491C682F21CC316F24B64DD05930595A + +FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ +CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ +B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ +63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ +42D75D68:\ +9C7BB21B3A034216AD6BB42A157D4018911671BCAC9165DEA00045FFD9928A7B\ +E25EC695D82EFA328D924C5B18A709A092B1D1FAE9B30ACEF72BAA142A22332A + +59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ +A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ +BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ +E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ +7815BF3C49:\ +6DEDF9B477A2081879C289A3105272E431E226D794E52DCFFE50960D1C18FBB5\ +65CD7891233B1FDD26D26D0E7D19284191E0705F6EFB4B93CDE1482FC54B475A + +77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ +61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ +B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ +025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ +951CB2068CC6:\ +6441C583EF5862DA39F1DAE9E5AB301C2E5297A226F54968B98C6121E57C34AF\ +76D5D1B4DEA90D1CA30B7F088C2FBB4044F1E120E59450BC2274E7D16F4FA7CC + +B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ +BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ +93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ +AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ +B0FED6A8052FBB:\ +E252EBC46763D1C46B4B6F5BD7B7A68C0EBA6CB5ACE8E31DE2BC67B60553AB5B\ +CD5AF42E0BCA79EFA038B46D456778E9769E8C3805899FD69EBF6417F3A4DB0A + +B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ +35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ +780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ +015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ +37674C6F8E380C04:\ +1DC90E1A98EDE43835371AED47CD1BAEF83229FB1FB148160F48AC0B080B5CF9\ +EB76F60C6728988AB4A5FE43D1A67B5A80098808369A0D0AE09FB7C8BD1A6A4D + +04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ +DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ +D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ +F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ +F22DA873C601016A0D:\ +083E6B3D4683464BBD9039BC446E75D751A7DDE74DF0C6FDFBF53524F7E8879A\ +9F0FD7C58979FCD9700DE0B59A71CDF5CB019CA196D497B8CF03C2B596103102 + +8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ +DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ +472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ +994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ +1373FB09A1A6E3C7158F:\ +AD978D3A72E307F396DEAFAF87EEE2E8E4BDFE12AC5B32954EE2CE61CC562F41\ +5C6DDF4C656F88C3863DC3A8EBCD7B007977BCB1ACB41F8D35F2EAB0F6401C8D + +FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ +ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ +084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ +B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ +339612E830E9E7A9C29065:\ +F2E9D8402E4FE43618FE1570DB0F2D8E004CC15BE3B70534E9BB77B52DAAFCF8\ +6DEF6E28C40AB31745C0F5E6A2678B508065C90EC5AC61EB461A3990EACECAD4 + +9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ +B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ +5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ +8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ +377838973C1D943C22ED335E:\ +B38D0AEF283D33B490C1A7289AE1B954AB2F649C3194F6C3C55FE34030F91B25\ +1259F3725950C4F0DBF15B6A29881393D3FC7582A0223711ED3ABBAE54C2EC55 + +2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ +725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ +798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ +8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ +2D0C9E7448DE3043AE22FDD229:\ +BFFA1584243F431DED719972832AE363D17EFCC27BECE05A46A5E8C68C421EF4\ +524F9C7B5FB3C09686B16295A7F3CC16D2D6802EA7031F2A4587C230794BDBC2 + +94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ +C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ +F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ +E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ +5B6C338CBB8F6659D342A24368CF:\ +4BAE05893FE99B63E6EFA831D6B0ADF6B857A25814C1983AE209C01B45D14070\ +0CC99EB18903FB8849FAC4E32B822D63968446A9DADF42F81EFF3B11BA0F882D + +EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ +76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ +C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ +E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ +F6954BA0801A1294CD8D7E66DFAFEC:\ +C64D9689EF653BAF2EACB6417049DC1B9CCD1B47EFCB77DA039C0B31AC91652B\ +022E4A9BA1B2A8F67AEC6BF3B475CF61D1599D481774FB99D6CE4394939DAA89 + +157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ +CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ +055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ +EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ +256FB33D4260439CBA73A9479EE00C63:\ +89659D854DCFF397CC19CA47656D165CC98541C87C2B208BE0F4137D1F4BACD3\ +2604CA886AAE9907DC383155C381C78659FEBA11F63380D837EE4FF6AA6C6DE8 + +836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ +D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ +A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ +911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ +5994C1DBB3B5C7871A11F5537011044C53:\ +53763EA36E27ABF066F6CB232DE00DB5483EE2A0B08CDB3AA8BCB164186DB4B9\ +43598484BD1B5D4F616774B63A0F318B781F9AF9EFFE9CA3AF824C07D611B492 + +CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ +2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ +586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ +4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ +4E53426CAA453F8DE1CBB57932B0B741D4C6:\ +F378B13998EED4FF3D9F064C80BF99DA7663DACAFE504F757D5281B30225FF27\ +5C43ABE91897F152FF5B90048485532926D446684BC0BB744C0F825BAC4519EC + +7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ +868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ +83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ +C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ +C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ +6000F31F370B82E83ED8D5ACAEFC074F627C065E97494E3AA591507FD31EBD86\ +E52C9CA0F565E868CDC84A2A62CA03AF7893D5F4ACF0817E506FFF9CFF095006 + +EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ +BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ +E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ +EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ +CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ +BBD4EBE27C353D6B9680D4C6AAAAA912573445200C601FD67EBF96117A1CF543\ +D6BBA6C8EEF734AE34429BF555DD79B691027900931652B0B9DF0F9E9FD9C050 + +1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ +F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ +656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ +46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ +8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ +A6D3D6AE760CAFA9C97215D412B294947AEF38D0E3F174F41D99C87AF9EA8A72\ +B799CED0489006EB3078147E36FFF8A4429DA581214D70D38567776DEB4EBEF6 + +4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ +7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ +E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ +4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ +99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ +9AA3ACA7AB03CFA7E59403169343C34A0D3E8B256DE91C5BD62FB465E2D1CAD1\ +E1AC5949CDED1F86B76B64DC23BC4C5195EDB42AF04ECA3E22B8C11A9304DC92 + +D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ +66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ +B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ +67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ +F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ +981C7896E9930313752E5BA36A1871598034987482B30403C763D7B458E73B1C\ +0D2F9007ACE336A4659877D5C746A18A3B67876385335DBB31FD3987CC701169 + +842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ +DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ +1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ +48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ +15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ +A95F37C2E906C7CC23FE7C9834A6660DA363827C512919FE19B79676782051E6\ +F8009C34E3C70B7B51E365096B895C6BCEFD1B3F9A42BCF35DC458FFE9430CFB + +6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ +C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ +7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ +66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ +5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ +4D5C55BFD9A5B840AF2D0E087E27503E2955B8DB30CCFBFF36A51BF529013AB0\ +A6F7F9D3A19C8B735F5E756ED7D24CA36FF46B75D746099546274BDA493771F4 + +51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ +7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ +BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ +1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ +1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ +95EF299ED55C75630EDB3BA526A0172D80DC9A0D98389D3E8FF1D8A317C2CBFE\ +F509C2D2736B81F4E4324F7BA036548E94344723DFCBC368808370040B93FF72 + +83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ +9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ +0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ +AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ +45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ +8C30FC0EDD2C4AD0CD674A9421BDB0ACD23941B0672ACDAD34348F126BF8457C\ +49C00AED645831B4766B039B42AED42D7E2C5523D0C2CCCD4FE2A99267751246 + +2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ +D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ +1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ +BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ +B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ +0572CD419E48997F008008F29EAA066C92245A319A8CD5F3F1E17B6A9ECC8AF8\ +F6AD0BCCA8B5E36BFE250F162CBC43FE87C4F76F1EC395581E892FC370FC2640 + +CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ +60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ +A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ +A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ +0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ +E16A1FF187CE047B79A9D33CCB40E2A665857430C985A074B22DF228716337D7\ +C02CF1E800BB28A927F58532EA989D2B0A08143A26B016237FBE0E7A4EBD4066 + +F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ +10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ +AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ +568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ +46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ +1E7A250410C53BE0F9E7BD12CBDBA9157330018BAFAD317510A8C08D8BA74037\ +C96B2DCC3C2835517314541C1CC33F7A4A98C657789754C1E5CEE24D8AB79B7B + +25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ +8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ +C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ +4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ +01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ +042B7FC81C0A1A2635648D60C90B80144DCD51BF83497F45696DF6091EF1C70B\ +54E8798AE309304AE088256F6DE815B0F758BAAB24F4787BDD9DEC35027582FD + +21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ +CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ +FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ +9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ +447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ +F1531F74713213E6A5E29ACF8AEDBDC08FE56D3AEEF76E53CC63C553D8EDDACC\ +0757096590F9AA8C059671AEE73BA2CFC5B9C8BE731AAC103A200227AF4E6BD7 + +4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ +74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ +5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ +DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ +A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ +CF:\ +690A922814B1F0C905C0BE2B1F1B84176C86E11F9508F94D32324F633ABC0D51\ +DFB9866EEC06AB1545088BF46F17CF9EADA5AAD3D46016363E1567AB33F14AAD + +FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ +B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ +5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ +71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ +EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ +1DC8:\ +44CE8A1D5CFCBDC5573F562D96116137254313F0D12692006F3EE319FE2FC36F\ +3FA9EBCCF630C88AF2A2283B60124F82CDF0E0F51577B3E3E11FD4B93CD556FF + +E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ +54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ +009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ +2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ +99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ +C25E88:\ +C36AA59A5F385CF0093337872E819EE1D21AA653781D3C433969C416FC6435D8\ +D5827B9DC2FD2EFC5298A23D4771E1E7FE368A6860DE3DB8BFF5E96C902DCACD + +F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ +65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ +E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ +3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ +BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ +C5C06729:\ +76EE20581200E8C2744BEEE0868F6AB4E4700F14B7E6BC119CA15ABF5B7D7650\ +42D745A1DB59411E199491F412B7D2DE4E6602C0C517AD46A11599EB1B41FE04 + +CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ +68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ +6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ +F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ +551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ +CFE0AF93EB:\ +D1D3D9705FA1E6F850730F7CAA2109041DBFB5B2D9A07D8ADDBE79DD7643C528\ +233E1A7BD43A5B5A249CFBDFC75C77B93E535A51CA1670B2E6676F9D978A0F80 + +2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ +331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ +2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ +ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ +05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ +F467BC75A9D1:\ +41FA9C9DDCBA93F6CFF44DC85D251384686F42313BAFB1581FD44AA3F471E12E\ +88626410A1BBD7D6C029C8836292443BC776B47611BF440BAF31AEE416088E70 + +0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ +EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ +A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ +AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ +513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ +C6F4756017FFF5:\ +4B301E55D2186F1AE749FEACC15BF7957DADEF69E0C6B22BD1EB07B8CA5F37B7\ +26B642E6FE2D5C87427742712FF842DC3D1D68EEBBA1E7E6A27DB195ED526258 + +C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ +E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ +C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ +798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ +9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ +45DBA58E6CB2C8EA:\ +21B32E64D26CC9F9F589E74850A08203B70D3E5CB7E0CFD01FCCFA95F9DD05F7\ +7B1299DC92387860A6E3EA676E0859F0B11E6FA029D4F3BBFEF472D6F096FF94 + +B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ +C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ +01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ +86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ +10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ +E8419D48FDFBD744CE:\ +62ABB23B1C72C7E00F65007D0CBE5D96B93CB318E1495326D366AEAA618B2FFE\ +42AD7CE18D5A65FF877ADB42A35CE6227FB8F5748E653482824426AFA92DB6B2 + +A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ +7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ +6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ +1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ +4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ +359D5D1EEA105F28DCFB:\ +2FED42B65B3F785E89C25AE005DE353BF6819459E071292CE81E1458D4FB1B80\ +A805FB568889D8A05EF68740F472E05D7001A6FCC28B28C339D1F790848F49DA + +E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ +2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ +6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ +D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ +8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ +7ADFB974EE205A9BF7B848:\ +BE28BE9E3B17384A3724CD601E32AD86A8E7FFE97E655A17148EE9F7BB49BAC6\ +9D248CECC5AA18FBFABF2A9005B862E8935F310A7C0DB04F9286F83AFE3C5B43 + +B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ +E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ +D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ +EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ +7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ +EC77F29D211BE89DE18B15F6:\ +001F8A09BC7D7321E3E6191D10DB354606FE1F80E06EA598E164C9ED5A9BA8D8\ +B3E3CB0D4E243DDBA700BC9D0F1B2B1F0AD5635B63DCEF6741336ECB19C87C2E + +DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ +4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ +49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ +9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ +50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ +63EFE793489C39B8FD29D104CE:\ +E635747BEDC669D071D16D70DAD0C66B82A87BAB3891992BD891ED0D0B6C2809\ +919E507571D35A35D80F772FE11E61E94675BC5138138AB24722BF1D56BC7449 + +BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ +DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ +02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ +C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ +711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ +AE5B257BE36A7124E1060C170FFA:\ +25EDD7E6E3496256343928AD4F59A00AD38866AF358E120D1B53F7B3A975AD3D\ +0F9C960AB8D17E7D29B331EB3C37AC779D36352F33B238F1992626FF5B134E10 + +5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ +F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ +5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ +70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ +001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ +480AB79D4E6415B520F1C484D675B1:\ +CBEC8E314138BECE0FD4A4A266AE09D5776FF0C19E3CEB2AB287E7DAB909A8F8\ +82718CF90489E8772D151E50DFAAB87D7FABD5873D060FCC3936A84D253857FB + +A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ +CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ +84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ +920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ +E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ +D42956588B3B58CD948970D298776060:\ +BC11B07AC39497094FDEEEE0AB6A1AF7AA3A2E9E496EE7607D64058A0896430C\ +74FB967EC7F742D788E2F448B588D61F4DE56FF2EA392AA3EE516302DBAE9E52 + +06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ +3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ +678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ +2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ +8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ +A96CBDE5FBC953D9E576CD216AFC90323A:\ +9306E8982942FE6310626C66863546D3CB1354D568A4477B8C226023F5B10330\ +2B2D2B04540EDD45381E3262593E7FFED53850053ED782FAD7A8684660417122 + +F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ +DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ +593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ +0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ +358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ +67B5AD93D874812A1DE6A7B93CD53AD97232:\ +D0344AFA80AC97DA86D1AF70D61808273399EA7E970099A83D1B05572C0D257F\ +8E72F99313F52EF801113E37D60036E6333F1A8563D7360A56AE007090B3E256 + +9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ +F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ +DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ +85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ +D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ +352BDD3740DD6A16792AE2D86F11641BB717C2:\ +97976B7A6D374CEDA51D3D63353AA7362E2CEC852BA67FD7F00E08F5A82FE062\ +31A93F860ECFC42566983C8160609A7B77A2AF1BBDCA447219CC392866BC102F + +5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ +F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ +71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ +865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ +2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ +9ABA31EDB903B28FBFC33B7703CD996215A11238:\ +CA4F055CE09A20AC58ADEE120EB0B6CF3DAEA0734A41ED162DF863A71B946581\ +5DF6F75B872B9AA45360ABDD8FC2A7320D620050679C300D0A9AF2EB240AC5F6 + +576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ +8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ +13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ +9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ +32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ +D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ +651BBB9A3478CF0186A9F94EF8DD33D76A29966D8F747586D73EA963DC966F27\ +7A7361E84A88BC99E2ECE134FFB807FB86B8AC92474C99AD7B730BB6C1ADBA6F + +0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ +D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ +3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ +7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ +F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ +C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ +66AA665B49601F044B334769E9D745BBBA240F7E8732BB28DFE4E6D337A9BE5E\ +50747B63CCC2FD88E1A963A3CD62D2BFAFDDF0E5E803006C3CD25C743EC21A04 + +3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ +2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ +41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ +D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ +1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ +6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ +3162916999F016C87E0775D7DFD2666003092247EF1FDF031BDB803EACF33CE1\ +5C47F7E9C8AC08976DC8A67CC35B4AD69E72D30E90EE7A849E4281944737A1ED + +C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ +58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ +21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ +104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ +A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ +CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ +F032D67B156D1873B4DD9268856435737DA3203E9614DC74E8DCA4A9A84D65D9\ +0CE1EF255FC1B0427D2D95417472889F0C49D9014E27E51779EC2AE71BCF1C7A + +8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ +4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ +76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ +B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ +C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ +C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ +ED9B31E1BD0CE1BA0BB66EE03EB9D648385E7CE6AFC2EC777F1EB943E6ACF12B\ +4510B0F37804632540A9BAA03624E9501C285698104E5EDAF471F638DDA13485 + +C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ +D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ +D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ +7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ +D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ +36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ +DEE7D084B9C53A0AC64338554D7144A325FC7287F6014CE675B32FA194B99E0F\ +208100B85A0071AABC52D6BCE17E9DBF4CF3ECD55DB87F135A7D88D49DB8D0E7 + +8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ +BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ +8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ +BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ +7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ +57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ +C983E9577544FF394FCC034FEBA8942A1DE7875ED82EE4E5AA394AAD4F2EC87E\ +0BAF454DA957ABEEB527582DD14896CDECE6048278569C3F6576D76E46E0545E + +6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ +FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ +384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ +B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ +4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ +55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ +8E22CB4065DB12F2742FB77FD70E195A4E06CA507DEF9948F5DDCF06245CACF8\ +C37FCE88980759177105F164106DBF43183E0BF32F311B39908F5481A526A86A + +C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ +4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ +761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ +D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ +B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ +A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ +9126DCD87166196A0A3C6F27C728DD9B6652854478BD97B1118C6FC4581109F6\ +CF548CCE0C817A45E8E154A7B7CABDA0AD87E04B93B1498DE97CDFD36527D6EA + +07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ +0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ +475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ +F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ +6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ +6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ +6B37FB9120740BADAA1839965179B5C2E30AD8C07F5818C228CE490A6EE661C7\ +395F1A66928F7C32DE82183B6CCAD07217B189CD3C95DAA1A42F567FBA7C8019 + +588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ +D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ +635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ +822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ +F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ +1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ +95ED53B3D0EA630000AD37035B86502FB98CD2825D8AD2734116AF09C0FF0058\ +95E0CBF84FA843C09DAF43FDCE8C4DACA2F9432480942710C6E4AA640B9BD403 + +08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ +D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ +1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ +698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ +47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ +E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ +41EBE47652EBD797A1DA07936C97FDC63E658B718548167B2908D08EEFFB6C7F\ +00838BD79A7B2F25D582A93B144C101ABBB5C9975C5FA404638F68E6F146F782 + +CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ +C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ +8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ +DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ +696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ +7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ +01:\ +3659331E32D9CF89CF0D4F2A484DA0626C50DD2604739D62F1260EEF67EDEB5D\ +77ECB02147428697684DD135067D7CEEF9BD6DFD1109EB348086D494F954FECC + +D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ +0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ +2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ +CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ +9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ +E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ +4D4B:\ +38D34FB7D56C15C2216D5B8409C5D2EF229B89E546BCBDC7172E3E0B1F6FD6DA\ +36E87A2BC794EAD5FB748EE6C1E9E4DFF29C950F2129CEFF290F3A7D6BB68EE1 + +8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ +EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ +1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ +18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ +299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ +4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ +A3BA86:\ +64EFC4356C27F19824C324932938A7FC3941FB0410A3BBCCE5C93D2794825348\ +78D9DD77BAF5505EAA668EA5441F05F53F7D5AF00B0FDA0367037720EBF1E5CC + +84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ +69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ +1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ +61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ +B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ +477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ +FB9E4AB6:\ +00C2AB70B3D6C51A5FE5D0F0081EDE0C215BDCD342C720231D0BCC0D85BB4B5D\ +7F082ECBA986E2CE2B8B65E67ED186D03319007FB29C286F7F53CFF5864C385F + +FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ +31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ +59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ +A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ +CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ +7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ +91355C6280:\ +E4D7B11C693EBE332A054100DBB84B860B485E9F2DDD2C3105A399C5D882F5E1\ +9504EB09874D6CD08BC29E8898AD118B7B52A1E3D111266671663B23FA8130C3 + +70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ +62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ +225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ +A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ +1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ +366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ +AF1AE717238D:\ +CBA293EDC18DC23BC4D3519C8E395A1152408CD30C769F907F832528211F3D9A\ +40516C5FF35B0089166F7343B61ED1DBF7E690403695A5C1BA6759B63C512D3E + +74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ +85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ +D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ +C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ +A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ +16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ +528F9AB49C79F2:\ +B76B535F4284DAE534942D4550BB44ACC68F0CCDD4C37E41657D49F969311E81\ +DC03D4CF6EE6F0EC02DE4203D52B9C54364C1EDCEABB97963468B68CD88CCACB + +8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ +AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ +584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ +4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ +4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ +5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ +EBDDC89186839B77:\ +E6431FFEB780377D04EA873C6F407A55BF9696E96FEBD19217E5B6303EA45873\ +4FCEE2BF895D7095BAFDE147FC1D24A57BC48450B494515192F2D5BFA09A2D2E + +FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ +E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ +AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ +CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ +B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ +6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ +C66F252F6E64EDC96B:\ +9F1D730DF3670BF72EDED050572F9338F5A651709818558849CA3AF8DBFC591E\ +81606753F742B67DCED42785FB6E019BE776EBAAB5AA20219052C03093FF9156 + +B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ +5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ +252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ +FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ +25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ +232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ +5363892A2495DF8C1EEF:\ +63E1C2300AB80C173489D84A4E3F3E589C616F792475BE05A1C85EC319364B96\ +FF1AFAC04127F59C4AD4BCDF7A8ECB2C3EC2EA41BF2119F8F3E0CF396213C9EB + +C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ +FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ +272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ +414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ +49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ +199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ +5C6D1BE4BC79F08A1A0A46:\ +37D4442868321073AB61D481468EDB24CE60CE3C0C2A92B6E20BC144CEA5B749\ +D2AD93A23D1A2312675EE50F069F77D43D36FA3571322D5DB07A97E5F735AD3F + +4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ +A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ +2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ +443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ +C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ +D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ +6EB6E4A80358ACC78647D043:\ +92B29DC4A8B4378E8C8D8759563E1145F0255A9B0EF8351947AE0C132E008FC4\ +0508C0124B9AF0E7D4116E3C3280D9BC69D92DFFA39E0DC99AB3D90D5FD00220 + +EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ +F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ +D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ +01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ +E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ +A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ +90BF2C4062FD2AD58F906A2D0D:\ +423857FF8C9A0F5536566FBE09CF5BA527442F4EBE3ADA7C28951A89999A613D\ +C9EF13E52A389B3880B8C911F6629AD6ACD4AC4BE1E39CFEBDF74F7AFB42ADC4 + +E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ +AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ +E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ +EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ +DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ +EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ +3EE46FB67422F814A68C4BE3E8C9:\ +BE84D55224938B7B69F0CE8A2C45BEC38D1DE818FB80F492690D5CB75E473163\ +87656EF483AC978066D8B4F05017460EC28AA349F888BD213F3499EEAB7A6D11 + +D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ +C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ +4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ +38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ +806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ +4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ +A17E776C0D02856032A6CD10AD2838:\ +E1FC5A6C209F8A4E2F1701CFC43EE843807E3994A2943DACCF0347D30B6243E4\ +AEC2D8700AC713CE5ED76EC9688E78922EDB2CA0D578634ADF60763C025EB424 + +F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ +C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ +39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ +42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ +4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ +CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ +2ED1C78631FD23B4C3EB27C3FAEC8685:\ +F77ED1B03275C3BA51501DBD076B36C8EAFAD9FBBDFC0CE80A2FE105CB4D9EE7\ +C7AEDCA5F6FEA9065CF507D8F61DD7BA0B9355ED2A753A4F9F084CC758BF9ADA + +447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ +94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ +286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ +D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ +04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ +72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ +CD90333A77BC4E1988A82ABF7C7CAF3291:\ +9408FE45CB615EAE7CCC92E33051C3CA8382A1BAB834AD8201B901B897175C35\ +509296066FE4ABAA2347BF25D798F7B51B6231BE37DC363818B55AE3D93C7861 + +9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ +E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ +29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ +ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ +E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ +5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ +626C48322E9791D5FF72294049BDE91E73F8:\ +B8EDB924C295E8740A0C4BA2F55C2E3A9D0F193F81402BCD95DCBC3481ED6F2F\ +E60BB871CBB52347C1B871E5F9195CAB3ED4C54B61F199ABC15FE5BB1CCBE920 + +AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ +1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ +42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ +A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ +DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ +B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ +774BE89C1114DD531C011E53A34DC248A2F0E6:\ +4BEAFE927E01FEA9EC5A1EC24F6B58B56468C3064C43AE91354EA2770FCD0B39\ +6702F6750C7B91A3625AB6D38DEA3D49C2FD32872D7CF842BD8BCDFF3787705B + +3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ +B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ +CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ +246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ +47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ +94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ +A7059ABE99182714983B9C9D44D7F5643596D4F3:\ +151D4002FE1C85CA59D8F759938CED3236CC5D00471C300D3CAC63BC180214A4\ +49795E35C39A8C6DFDD74D2DD340A71C284678B99929B9DFFF0852462E0ED10D + +3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ +BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ +374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ +6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ +63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ +5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ +4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ +9CA3A802AA51F1AFA3D50A6E369C22DE9D68809ED5A0CD443F46C3B3118B0F34\ +8E0FA230F6E0BE784396957F52E100413FA26832CE0B88FBCCD47A1AB1C667C8 + +7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ +575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ +BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ +E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ +AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ +7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ +591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ +09D304C2BE91424FABE8CA3C91E331B92C4A0A11928BBD59BDB1454D22D0B689\ +A25A0BE04CC1605C158AFA2E504D08B13DA4F04C10C07D94088F664163EEDB78 + +7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ +D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ +37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ +3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ +A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ +9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ +24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ +0045581DC66F42F4020CF88E67D1810A234BD5A99715B3E6B06EF649E6071A3B\ +3BB2B1628C711528621DC94810F0063F2656CF83C4093CB637B233431F76625A + +D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ +A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ +D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ +33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ +CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ +0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ +52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ +415F5ED9FC4E825DDAC3A283BB79339CEE6D67880A9B8A79A1EB6597BB25C8D8\ +E4716712FE0D3F12A45699FB55E857E76609593DE2516EDF0F5E99D59946A806 + +2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ +D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ +7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ +5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ +AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ +B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ +806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ +BF4A6DFD55489A2B9787960E6A787BE9DBCA875B17A8CF2F111C313B01C8994C\ +E01B2ADA486AF7676AF04BAA88E07A0214BCA00008004150CE4DF598B44CD814 + +5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ +271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ +CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ +608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ +D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ +990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ +2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ +72F3EC4F8D3A31E42C4B8C3C4C1CE51340677D17A7FE8AE04F9DB6B6B7C13CF5\ +613FBCB7396E5F1B3FAB086558996B2079FF64C7AEA34AA7830084D40E416F29 + +C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ +56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ +8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ +50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ +1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ +F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ +9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ +7B26CC15637AE7137BFEB543208A7BB5C41F2F8E1AA8C7336EB656F2A7D350AE\ +EA77734091E49D8C026F67CC712A54BE8AC2C2879661CC83BE51554D9D141FD0 + +7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ +5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ +4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ +DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ +261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ +CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ +31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ +6A8A4AF537B7B652EB1C1B4F55E442F8D20FB7D477A22AA4A3AF7DF5AF140F17\ +1BCFE65603255414F7D5E87C2DB91DCA223026D9E26BF3BDCA251E8325327977 + +7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ +266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ +7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ +B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ +357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ +5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ +719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ +AFE7EF29D0CF870483B17FBCAD1B425F59C542D9CD777AB48F29060665ACCCAC\ +1409DC5A191E3D91B34B3D6DB907F2F575911B797A91C981F13FA5A83E2A81BF + +988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ +8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ +3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ +267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ +A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ +8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ +D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ +D61BFC84CEDB8148652A409AF58EADD8E85D920DF69C70AB5929587FC1D14662\ +DE3A4D8E238F9269095E972A698C29E391852E9BF3C7AC052148AA6D2F54B974 + +5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ +F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ +C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ +A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ +1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ +4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ +3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ +5D33D32A4401B95BB332238FC13F4A905A4E07157006370CF6B47ABE33495598\ +E0A6144D2201ACF4BD60594EC431F66AC7308C7916B17A03122934499ED4EE39 + +47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ +994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ +DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ +37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ +7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ +9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ +EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ +E50E6C9BF5DFC7698DAB40159D2BD7E0C22E845ED8F2A817421845C522B85458\ +6415923768B4FA29431EC3ED7202CE9D512954DA4BA96C5B28657E9A50B9AECF + +8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ +E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ +DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ +394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ +43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ +7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ +A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ +E8:\ +8ED1362986F4A6D24534EA826AF9BD746044657B35FA48EDA6EFFA9417D1218A\ +4CA84E8847243B22C508D74489747FA53E7CF96EC52ED7C485BEA3CCD5AB1E32 + +EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ +F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ +85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ +C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ +4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ +97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ +345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ +6427:\ +F757E258A9F249FEDD4D3D8F43A0862B46951700902AE90B7782D01D0869ED72\ +0DC57F2E4E89E329E8F81FEE91D5A0DD72888C08535F2987BB6A020CC9A3A13A + +23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ +89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ +DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ +DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ +BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ +F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ +DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ +630012:\ +995958EBB5F16F360A7C035B081BD3324F85E3A84047362EE22957B5D8C8BE78\ +65A09FE1B50E37ADA0812C370593730752D963FE83DFFA00C3F5D9EFC23A28C7 + +0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ +F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ +C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ +A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ +A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ +95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ +4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ +78DFB921:\ +8E1F3C32D6994A9F28FF810DAEBEC0DCDA92F963E1F464915CB9B2F05B081E9B\ +7D968E73A2FCDEC720F67DAADEE186B3A3E7BDBFD68D015AE4084081407978EC + +3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ +A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ +4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ +BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ +DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ +91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ +9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ +BB0D19F909:\ +64F2AB3327F730A3FEB81AF8122EE111F64D6C31A2ED23F9BA22F67946D5811F\ +03DB1CF002E57E2CEDB18C29C0C73EF2255D8AAA6A851F2ABA50D1B0CBFF6F16 + +747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ +6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ +57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ +00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ +77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ +81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ +04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ +BE6BF8082E8A:\ +9B833B7C6B5F97E75FBCEAE20AA2487DF07692DCA64375295C09A68B4A93EADF\ +12A7137283C215DF590F1E1304FC2A5E95528AD95EDC08085647526A69FF57F8 + +57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ +06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ +6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ +4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ +D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ +58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ +FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ +E839A9D4608F03:\ +624CD5B6F0F1259512D6E0B6E65174CA7FBF6CD324149F0F592F386BAF5DE550\ +D44AA471CB97E9EEF6C03D262714BE00F6581D902A9326A337CD6DC2A1CC5CBA + +04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ +10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ +2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ +BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ +2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ +8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ +8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ +5153592EA81C6FBF:\ +0FA1E0A7FFA3CAB76299251FF7A910A2076BBC6A0BC36025B1B0AA290FEA8E30\ +AE1D5B512778E0DB8CCD5C325CBD711BE4C7BF6F5465380878A2FC6285D3D630 + +7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ +735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ +1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ +7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ +39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ +9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ +F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ +604F5035C46B8197D3:\ +02FE69A2CA198E76405BEBA6088EA173F581DEFD8F7312F5B810E60E5EBE4336\ +690154E0B3E05C4DE06BD4B9AA274BBA2E362B247219C9475587A706C50B8EFF + +E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ +94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ +DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ +7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ +60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ +7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ +6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ +07E3B953ACF99964B847:\ +9A478AF3A0C60C5A3C2A84FE8144BB0917C3F309A867ADA82E736092006D3CE3\ +BA923310689850708CD5B4C28C022AEC70858B9E2962D7EFA507DA763D33ED4B + +D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ +32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ +7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ +8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ +07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ +C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ +4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ +6C90E8C4D100ACD9EED21E:\ +F4B4D0CCD7C89E6E9C076F50353684BA262A00B7ED4C09DEA918F2D55607632E\ +4698771B85B76C257F067D2178AA496B39CBABBC1BDA24498011547D20557728 + +3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ +AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ +18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ +A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ +E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ +886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ +4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ +E2DD603D9EA24DC7C5FD06BE:\ +AF743FC4D4A38E1DF12031C88650E2FEB8DD44E5E4F7EB6A4CF7510D9F8ECE46\ +C65EFAD09CE058CC79857FB0BD8E36880BBDA85974CF8E23A900E6BC2C08EE34 + +1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ +742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ +B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ +69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ +E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ +9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ +779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ +A80012976F31FFDF305F0C9C5E:\ +24708162B81727BFB94FABE72B10A3B4C199F56C6A802B61567902E4CBFB5F63\ +968CF1C96BD95F89C9713CDCC0C0A8DE917E74D84B2053F5A6CF89AB2EE246D8 + +08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ +9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ +53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ +479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ +B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ +DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ +3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ +B461A40645BF176601F1E760DE5F:\ +355646AB4447D03309BEC48B9F42BA621A36782A6E4838A77CD2E683CFD601C2\ +02DE97FDB26340C8EB0C8DC71A2C6400ED3B95FE7987410307E8CEEA78BA77E5 + +D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ +5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ +E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ +F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ +8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ +EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ +1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ +86C226169FF257954EBDA81C0E5F99:\ +DBB1DFCB8D644373EF832EE88DA144A118F85FB2265D0CF970A9007E310D0499\ +99281C8F817C80D2F893563DEDFA8F82366F19131A04BCC951588B98B224A739 + +5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ +431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ +40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ +A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ +0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ +2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ +83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ +D3C356C914FA06B9A7CE24C7317A172D:\ +2907154FF72177BEE84B4C0F36EE1816B4018527CDA1D8342C3F9E658E89D8BB\ +3D0C630C6C15FD7CCB923693A9A8BE055CD763C07680CF1E514B59E37E9050BE + +6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ +E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ +D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ +B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ +645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ +F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ +39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ +68F50D79F0C9C7314E750F7D02FAA58BFA:\ +73D5B2280174B827D23F50A181D5B14BAA98BACA01ED41C1F6340592EF728351\ +73A384F016A9F3653906725EFF77A1C3DF7151737879955EA00BD9BDE094386D + +5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ +4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ +717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ +4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ +FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ +9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ +39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ +7DF95B60FA8712A2271FCAF3911CE7B511B1:\ +CE44C5ED4AF7B36F5081768EA8C25BA1A71890A0FB7991C04140DF521C923B22\ +2B5358ED05AD7DCDB4D2EA752DE791A90003A1F8C55556B5A7C47BF91FCFE755 + +03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ +C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ +C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ +261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ +0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ +61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ +37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ +A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ +C5DCE72A89807E54BD4A8EF240DCA679955333A27E166483001D250E1FDDCA12\ +BAF513B0832058F1E7B91929226DA79910AAD20B6C4262C4D087AC69EE593161 + +2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ +C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ +4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ +339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ +5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ +F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ +7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ +B7F5CB9923AD97058EC067700CC746C127A61EE3:\ +42BC28AFD406DC56568834C0B61AE363EEF99CA53F4A26104FC84E57D06DBE73\ +93AEA9A567AACFDBF8FB5AE3D5EEBA953FDA4CDAF09C6DF9B14826BEFA241FB4 + +90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ +70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ +495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ +DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ +5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ +00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ +F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ +CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ +08075B4359FD064EB852CA1A9135B5ADCE9823B26C70B5A7BB3DFE6150C935C3\ +AA541D127B7502692DE31F640C86C0E5CB45633A37A0415AB837FEB1D1DDE2C2 + +2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ +6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ +6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ +1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ +0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ +B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ +2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ +C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ +FC2D6DF44B9AA29D442D630161A94B2CC3B48F26F147C65928C46A6724AF3F20\ +6EC2C6FB5DBF868BD73E9A1900DF7D1099D5F7C8715F1F0D3194C6B44BAFE92F + +721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ +EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ +B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ +FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ +2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ +5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ +C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ +9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ +0ED14BB066ABBAB817EF207CAD4C414AC9C6539570FA3FFB49E2D9F4139AC7AD\ +03A00B668AD7E82836F60BA75E71CDE45E1C161CD635B5AE4D4B2F605D4D88D3 + +6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ +C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ +8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ +90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ +6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ +0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ +CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ +6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ +16DED5B846E2F478C9B55428982616FA711FF0F1565030D597F562BFE4E32C76\ +52222261DE787C554F3D54897C7781575F8972871A8E05DA9425F18A2CF107AD + +6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ +70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ +5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ +E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ +2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ +4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ +27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ +CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ +54B8E349B7DFDF7EF6BDF29662BFAD5B9393354E344786895E87D59EE8F7564A\ +336E70B1ACB5AE7C4B18F4488A87217D8F27EE2102BB7C15CCA532B229E2C22A + +B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ +E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ +0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ +F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ +0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ +8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ +547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ +758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ +55A9BD64C942E46F7BFE916BFBEA173433E17CD9FA58EE3F615B7747944E0ADE\ +18E432D605CB1B2D0D3F168F3A1B792B97062834C33AB8260D63D06CCF6DE843 + +83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ +C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ +38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ +BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ +5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ +3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ +8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ +5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ +FDE40A74217B586CCDA78C27C1F6920D69B755557942CABF37E7C409E27A29D9\ +1A41D9B5E8D99F6E908BE4517F799CEDF344B195077125D7C85B71429370055E + +A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ +A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ +EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ +3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ +80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ +49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ +9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ +E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ +A4EB74B9A9075E138375E20643E5143CD1D43E5D90F4794341514BA4FEE442DB\ +4204DB5E07F431FE27B863899F584AA61B6AC132FC03964E57B725408E70B7BA + +A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ +A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ +0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ +639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ +B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ +877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ +1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ +D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ +C1B250A1AD9CF163C56A59847A1742694FDD4258FA4BF534BA8E1DA108166937\ +ACC7E6FB7D4ADB0B70F3293CA678B5F56C18B4653545C2F283801567AF73304E + +83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ +9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ +10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ +8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ +88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ +0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ +2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ +04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ +B592380AA42A1BB56301CE763D3664B9356F1EB900241E0A23E5AC9AD474A7A1\ +B367926BC3E5F4CF8E3C5D85BDADFCEAB0FB6EA8D05EDEB50C869FD271737571 + +3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ +623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ +15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ +A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ +B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ +C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ +817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ +5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ +2200D5458E4948BCA7A818CEB2CEDD3C3ACBEA67DAD5F61C134724F884F140E0\ +B68898E8E779ED454E3C8151218B46E22E96472199E87999FBDAC380E1FBCA2A + +724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D\ +21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DA\ +BCE506E558720520D33352D119F699E784F9E548FF91BC35CA14704212870982\ +0D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C8\ +7E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1\ +A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CE\ +C6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2\ +FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195:\ +5D44716E5D773B289E6F77E7A0C87D11467D2EAD2C06E3FD6242FF051F4590EB\ +E3712D83176861D93FFAA14378C17AAB0758C04CEBF054C6CFB7BA973BCFC3D7 + +3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A11\ +4E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B2\ +92D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02\ +539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332\ +DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B\ +0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49\ +F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C252\ +7AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04\ +CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D\ +2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18:\ +1E4D41591C38DAAFDF29E7E2D653D7CB304537A98DCCB7CBAB24F315C85B5031\ +F4DD511F06526E645F73CDD21BEF8060731A76D0AA1971C368BEDB8C8A71C379 + +023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A69616526\ +76DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529\ +C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC00\ +4691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C\ +0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8\ +B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F\ +52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B46280\ +27A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718EC\ +AE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8\ +720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710\ +D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D\ +9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651:\ +14DAB99E5924FBF164A08C31EEBBCAFDF1550DDF51A9E617DC920158360AAD59\ +4F894CAA950CA95130946C1DA6281B467EEE0C7E41FAED8A062A19662DB3945C + +20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3\ +131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890\ +808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1\ +AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135\ +A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAA\ +E17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4F\ +DB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D510\ +71BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C\ +6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493C\ +D136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C30\ +74E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E\ +4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E\ +6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6C\ +E2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7:\ +09A1766C860771A5ADEA9E01F811DEC3C45B58915EDF1CFF452A6B67A01C67D4\ +F2C51BF1FBCB7D0B54018E7DA3873093F35448CFB666A18428A964638853FB5B + +4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD8\ +0F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB\ +2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB\ +0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5A\ +A756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A\ +2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746D\ +B6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E\ +8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3\ +284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C\ +584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9F\ +AED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A\ +582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB\ +8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10\ +E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107\ +DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3\ +C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD:\ +CD50496D8998A0F2F2B1AEE49DCCB7423994912F1DE493302D94A11CADAC731F\ +3EB855C20FC645E711E181FB1BCB7252CB6F8EE3D7119EBD56EC219BEA011FF0 + +D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024\ +E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211\ +D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C3\ +13D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D7\ +3D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D\ +682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058\ +321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B2\ +1E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D512\ +63B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978A\ +E90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA\ +21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4\ +910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C\ +63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A9249\ +8D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089\ +CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6E\ +D83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A7\ +90910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA\ +43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C\ +4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC9\ +8D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBC\ +B88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A89\ +6771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78F\ +A3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824\ +CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD564\ +9FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458\ +A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8:\ +A36AEE15B7942102CA6ADE2796C36CCD8EE2B76BDF1437B9A4C885391F680B91\ +7A95CA7DBA79CE46CE75C675572A92A047909521EEB3AA994FF8AC81C524DF25 + +4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B\ +73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF\ +2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520\ +A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD\ +574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8\ +298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB\ +6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB4\ +2610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61\ +ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A898\ +8B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014\ +BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B\ +07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC826709399\ +48FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02\ +F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED66402361\ +6B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA\ +7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8\ +A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F\ +469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E\ +6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F\ +40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34\ +B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF\ +08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281\ +665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F\ +4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9\ +186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC62814\ +0996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE0\ +0D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA962838\ +1055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79\ +CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4\ +C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D5\ +99B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8\ +D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED\ +1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACD\ +B178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF2\ +14DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478\ +DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48\ +E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3B\ +A36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385\ +F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7\ +A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4\ +C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017\ +C3A66CD4EB2DDB42EF85EA0CD65534:\ +C0676C3390631D76AA6E5779716E3CFA579B52C27F31BEE78127803C08152EB7\ +60FB7D7301154C2A52C5CE39D8E237C0E38947A9554689E72D0C20AC6EA8762D + +523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3\ +EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D\ +6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA054187\ +70F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01\ +C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08\ +D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6\ +013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF044\ +5B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCF\ +E87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E55\ +44E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D\ +8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80\ +DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671A\ +DEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8\ +B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC728366\ +1D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615F\ +B93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF19\ +9E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D2\ +9B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB\ +4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D\ +323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2C\ +FBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF\ +8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AA\ +CDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83ED\ +F9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED092\ +53039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6\ +EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE\ +11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADE\ +D1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648\ +EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107\ +CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B96\ +5A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7\ +B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E17\ +41553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E8\ +19C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48A\ +BE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548\ +647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816\ +AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430\ +142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE\ +40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C6\ +40909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E5\ +3E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB4665\ +2196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B\ +94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE\ +4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9\ +CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D25\ +9C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE\ +561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7E\ +F94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E\ +5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1\ +C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6\ +303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A\ +2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1\ +C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3D\ +A8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6F\ +E398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6\ +F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C2\ +13171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD\ +46B568CE294C89:\ +99F6BBABC6C82A5E093DAC4A81360C22982A105A4F9F16FB5F4D3557C571DC3A\ +1178CDB18287E8A8BAC028F9D9F246E046B646C079A4442217BC6F748959E7E2 + +F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD\ +9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81\ +FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E904\ +49F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0\ +D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6\ +D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EA\ +F977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B\ +32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0F\ +A032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C\ +2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC01\ +03CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31\ +B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F4412\ +0ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7\ +685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491\ +B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF\ +2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C\ +3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF30\ +0251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736\ +BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CA\ +C2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B983\ +20B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B056\ +2B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1A\ +F9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A46\ +3B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F\ +5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137F\ +F9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BE\ +D133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68D\ +A188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE8\ +97B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030\ +DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A74030017989\ +92F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54C\ +F7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA698\ +3D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B5\ +2C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE\ +703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C\ +05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B0\ +4DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC0\ +99EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED\ +1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754\ +688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F958\ +1DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F9\ +4E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4\ +181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6\ +FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169D\ +C46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12\ +C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB0\ +00057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D0\ +0A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4B\ +A1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C\ +2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441E\ +C8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A\ +537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8\ +B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88\ +DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656C\ +C30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D7\ +2DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19\ +C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B8\ +8DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8\ +F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B85\ +5845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4\ +ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F16467\ +8160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D629\ +4FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D1208\ +9CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0A\ +D12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397\ +B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA\ +727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE\ +9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E7\ +3EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A81\ +0FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1AB\ +F6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E\ +854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07\ +813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215:\ +5F3B32AFE1FEDF7258ABC6C34F89CE73A1668A97E170CC4905CA8B15C5919AA6\ +F45654A3C74FC9E13CE088EC8C5C76D06FF94D64691C7477A65EBF058D1A6FAA + +08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6\ +A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6\ +B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399\ +DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB296\ +47F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE\ +7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B600\ +4DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FA\ +DDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120\ +D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE390308\ +0A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBD\ +BEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A294\ +4384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E62\ +22A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D37\ +52889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0\ +A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33D\ +B8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4\ +C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F\ +7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D\ +7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24\ +204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB229\ +07F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3\ +C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD1\ +5C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130\ +D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2\ +D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D\ +56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572\ +FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD5\ +6495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C\ +15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDE\ +FD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041\ +259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A819498975\ +5D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A\ +317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC\ +5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3\ +504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E5\ +32A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999\ +B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D77\ +85C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FAB\ +AA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C215366\ +3B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2\ +B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530C\ +AB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2\ +281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD898\ +6EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B\ +82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77\ +BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFE\ +CDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BB\ +BE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C2\ +8F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705C\ +A27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2C\ +ECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D1\ +0CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F\ +2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246B\ +D04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD\ +1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F\ +265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB0989\ +5CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E\ +4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F\ +092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E90\ +0200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C\ +29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A1\ +3EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398EC\ +F3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A\ +49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BF\ +EA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480\ +C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD4383503\ +3B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E26\ +26AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A\ +5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041C\ +B3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB52231\ +91E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B24\ +42B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E\ +228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB\ +5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604\ +FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE\ +25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914\ +BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F\ +2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8\ +AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42AB\ +AD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3\ +B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3\ +688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B46\ +7CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB3\ +3770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F0\ +7942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD\ +394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C79024581211\ +3204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA\ +8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B\ +09B7F42D193FB3E9C06329818251A2F7E6474462C95DED:\ +010ACCEAC8A085540933A8B2872DFA7014AE88B08468AE73AF1DECF232A627FB\ +F5191743F1782E554DBAE76C8A40CB190730C3C533E5E00D07D12FA88D39D40C + +1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380\ +D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8\ +DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F7\ +6316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA37608\ +26D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E693\ +9C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9\ +C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96\ +C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108A\ +F1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322\ +B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE7\ +0057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DF\ +CAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D0094\ +32DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181\ +221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083E\ +A427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF00\ +36D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A595\ +2AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CF\ +AE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF097\ +72D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A\ +83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1F\ +C070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E\ +0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665E\ +D1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA28998410\ +3F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1E\ +CDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADE\ +B9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C\ +6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121\ +210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8\ +889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3\ +123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB\ +71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2\ +B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F62\ +1275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5\ +EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E81\ +6D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A3187054\ +3D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B4403099898\ +57103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B\ +4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C\ +2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE\ +6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D88\ +0CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD2\ +31B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB3\ +97EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3A\ +DFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FF\ +DF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A2492\ +4A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC27\ +75833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0\ +FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666\ +DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F\ +40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5\ +F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA7\ +80703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF9428\ +15C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEB\ +A3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45\ +B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F\ +5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C\ +16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5\ +278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D5\ +59D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E\ +97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956\ +E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1\ +E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106\ +E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10\ +ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E\ +806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA\ +01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD8\ +78C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D\ +29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB\ +31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FF\ +E178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590\ +320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C\ +908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8\ +369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98\ +966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A6\ +5A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F94\ +76D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340\ +847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E\ +950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFE\ +E744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D\ +30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C\ +89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427\ +A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0\ +EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E288\ +5EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB8\ +9B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABB\ +F1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11\ +735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A8\ +64D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7\ +FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA7\ +25473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697\ +C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112F\ +B2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA4\ +2F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715\ +180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED\ +9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7\ +120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C\ +07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE1\ +6318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884ED\ +D768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E\ +4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B65246\ +7FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030C\ +EBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4\ +E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841\ +BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF\ +57795DABAF40687B2CDA7A5014168F:\ +FD963B660F075A55C055E41FE5535B79923F0D20787AC05AF2BB15829FEAB38E\ +9AC653383550056344FF769CBCF4FAB9BB1A50E44A02BC12533C3538D8906A63 + +1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D5075\ +2ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07C\ +F488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A107\ +6D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3\ +BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C40\ +5F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB03\ +78391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB1670\ +0EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F\ +273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC3\ +3B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60F\ +A01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E\ +6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9C\ +E264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA1414\ +1AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C3295\ +8A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA7547\ +0C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B\ +98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2\ +BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7\ +C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255\ +048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF\ +00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8\ +EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0C\ +FCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F\ +8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96\ +E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94F\ +E43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE8\ +4E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D3625\ +7C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C95\ +63844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000\ +F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CE\ +FFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986\ +D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE9\ +54785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB7867\ +6E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FF\ +A65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B2\ +3C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFF\ +E6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C946\ +50C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3\ +742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D0\ +2BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE\ +79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFD\ +C2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2\ +E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C\ +59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C\ +4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91D\ +F0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97\ +B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073\ +D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB50\ +7608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5\ +E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E\ +5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B\ +0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159B\ +AA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D\ +9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF\ +05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855\ +CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC424\ +5A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E1\ +3B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E1484\ +3D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC\ +9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2\ +CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F7\ +6242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B2\ +60F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C7369\ +6F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA8\ +1F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631\ +E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2\ +FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D352\ +1720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A\ +7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9\ +F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EB\ +A748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A\ +37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE\ +42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA1\ +5337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD\ +7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE7231992\ +24F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885\ +A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F71\ +0BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96\ +B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B301\ +3839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433\ +B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FA\ +F353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD\ +44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF\ +3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E\ +5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2\ +B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A\ +1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054\ +DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B\ +4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F\ +1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A3503\ +14B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA4\ +0FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C\ +78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5\ +B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2\ +BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF86\ +2EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377\ +131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7\ +AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB04\ +8CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF\ +8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9\ +455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389F\ +A745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32\ +D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810\ +E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615B\ +DE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8\ +EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA60\ +69369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6\ +D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F\ +7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF17\ +39C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06\ +EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A\ +1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4\ +A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8\ +545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8\ +D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B65\ +75A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364\ +A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6\ +BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D235197303\ +38D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312\ +C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34\ +090FC9BC045271:\ +8B64094ABC1CB0FF0BF0E156173297F07680FEC15F32187AAC32E7CBF9D667DE\ +92999C2DD7B40E7F326D174E493DD15F6699D2C2824F4209FE2E9124F8A46148 + +[Skein-512(512,20090606 lloyd@randombit.net BOTAN/test)] +:\ +433FDF4356B59774F971B24569CFB7214EAB19640AF3E3B23993040FA3392910\ +32495D163CB696EC8F1B8F1E85CEAF47CAED303279FC6608C27E070B04B48B59 + +52A608AB21CCDD8A4457A57EDE782176:\ +7796202A3FC08282B85E9EE677884DCF4E4AFFBC398C93993F90AFE2A430BD6F\ +9CAA96EC3AC7F23CF4EFDA5D9EABA5622766101D6751882BD5ED1B03D02E31D8 + +E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ +E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ +E3587F76DA804A12CB639A2ECADBDA67A6748A3022F96DDA6E17E55D3A89570F\ +6D81480C906F18A7BF08E0C0D02EEB953C675353EB22D3B6144CDD7108B309D9 + +2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ +29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ +E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ +98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ +499B8752B2E0BD0B28B55BD516F468A1E6DDE1D82626376296C88F0083C7D151\ +A148C5767D6E5D7B2BDA65D6209BC02F291096EBC14DFDE6A0F8E9252D2A1E8B + +[Skein-512(1032)] +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000:\ +24971DF13AB62266AB7D3E4EA8234CB3D74AF3264692BE46F6FE51FA2B77CB18\ +7675A25DABDB6F8390CD389CBD5C21FF6B4AA230DF6734616DD7CF2F3BC1D443\ +114984C4425D4A89009CAA9FDAD1A4A854E4420424738C3F892FCBB738DD380B\ +AB4BAD90A50C6BE5E3184B9824B75E1213CD87AAE9E5ACA5969B014C6D9B775202 + +[Skein-512(2056)] +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000\ +0000000000000000000000000000000000000000000000000000000000000000:\ +ADDCD709FD7BDD504C173A7A80091E00B26EBD035302C43B74C23A2721492AE8\ +1C083FE13CDAD62FCF30CEA277A157975EE9D92ACF9B8CCA78AC2D0B7BD2B3C1\ +F8B52D43175470F6A2BC3B5B7C2B94BBEC210C8513204B3DC4970EC7943BAD20\ +AE8E56AF8A319CC834097932E94D329DB216C3F9CCD673D01993A7E8AF128313\ +D988CE60222F674894349F1B4B89C13C6248468CE9B088CC62A52AE3A8A80D5A\ +757410CD23E9F89CA5C242916CB2BE7BCDFF8C8C35BF41088CEB75361D38DA36\ +6D0D2DF38B76D91736AD8B2F910D543FE1F0CF5537D1D85FD3AE08CF84C5D46C\ +0BC83D0B63C0D8159CE118E636182BC02CEB0312F627D543A136BD2116AD3E02D1 + +[Tiger(16)] +:3293AC630C13F0245F92BBB1766E1616 + +4142434445464748494A4B4C4D4E4F505152535455565758595A3D6162636465\ +666768696A6B6C6D6E6F707172737475767778797A2B30313233343536373839:\ +48CEEB6308B87D46E95D656112CDF18D + +[Tiger(20,3)] +:3293AC630C13F0245F92BBB1766E16167A4E5849 + +4142434445464748494A4B4C4D4E4F505152535455565758595A3D6162636465\ +666768696A6B6C6D6E6F707172737475767778797A2B30313233343536373839:\ +48CEEB6308B87D46E95D656112CDF18D97915F97 + +# Tiger is Tiger(24,3) +[Tiger] +:3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3 + +616263:2AAB1484E8C158F2BFB8C5FF41B57A525129131C957B5F93 + +4142434445464748494A4B4C4D4E4F505152535455565758595A3D6162636465\ +666768696A6B6C6D6E6F707172737475767778797A2B30313233343536373839:\ +48CEEB6308B87D46E95D656112CDF18D97915F9765658957 + +4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6\ +C6D6E6F707172737475767778797A303132333435363738392B2D4142434445464748494A4B\ +4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767\ +778797A303132333435363738392B2D:\ +C54034E5B43EB8005848A7E0AE6AAC76E4FF590AE715FD25 + +5469676572202D20412046617374204E657720486173682046756E6374696F6E\ +2C20627920526F737320416E646572736F6E20616E6420456C6920426968616D:\ +8A866829040A410C729AD23F5ADA711603B3CDD357E4C15E + +[Whirlpool] +:19FA61D75522A4669B44E39C1D2E1726C530232130D407F89AFEE0964997F7A7\ +3E83BE698B288FEBCF88E3E03C4F0757EA8964E59B63D93708B138CC42A66EB3 + +61:8ACA2602792AEC6F11A67206531FB7D7F0DFF59413145E6973C45001D0087B42\ +D11BC645413AEFF63A42391A39145A591A92200D560195E53B478584FDAE231A + +616263:4E2448A4C6F486BB16B6562C73B4020BF3043E3A731BCE721AE1B303D97E6D4C\ +7181EEBDB6C57E277D0E34957114CBD6C797FC9D95D8B582D225292076D4EEF5 + +6D65737361676520646967657374:\ +378C84A4126E2DC6E56DCC7458377AAC838D00032230F53CE1F5700C0FFB4D3B\ +8421557659EF55C106B4B52AC5A4AAA692ED920052838F3362E86DBD37A8903E + +6162636465666768696A6B6C6D6E6F707172737475767778797A:\ +F1D754662636FFE92C82EBB9212A484A8D38631EAD4238F5442EE13B8054E41B\ +08BF2A9251C30B6A0B8AAE86177AB4A6F68F673E7207865D5D9819A3DBA4EB3B + +4142434445464748494A4B4C4D4E4F505152535455565758595A616263646566\ +6768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ +DC37E008CF9EE69BF11F00ED9ABA26901DD7C28CDEC066CC6AF42E40F82F3A1E\ +08EBA26629129D8FB7CB57211B9281A65517CC879D7B962142C65F5A7AF01467 + +313233343536373839303132333435363738393031323334353637383930\ +313233343536373839303132333435363738393031323334353637383930\ +3132333435363738393031323334353637383930:\ +466EF18BABB0154D25B9D38A6414F5C08784372BCCB204D6549C4AFADB601429\ +4D5BD8DF2A6C44E538CD047B2681A51A2C60481E88C5A20B2C2A80CF3A9A083B + +6162636462636465636465666465666765666768666768696768696A68696A6B:\ +2A987EA40F917061F5D6F0A0E4644F488A7A5A52DEEE656207C562F988E95C69\ +16BDC8031BC5BE1B7B947639FE050B56939BAAA0ADFF9AE6745B7B181C3BE3FD + +[Parallel(Tiger(24))] +:3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3 + +[Parallel(MD5,SHA-1)] +:D41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD80709 + +[Parallel(SHA-160,Tiger(24,3))] +:DA39A3EE5E6B4B0D3255BFEF95601890AFD807093293AC630\ +C13F0245F92BBB1766E16167A4E58492DDE73F3 + +[Parallel(SHA-1,RIPEMD-128,Tiger)] +:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709CDF26213A150DC3ECB610F18F6B38B46\ +3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3 + +# This is mostly just a tricky test for the lookup code, it's equivalent to +# "Parallel(SHA-1,RIPEMD-128,Tiger,MD5,MD4)" +[Parallel(SHA-1,Parallel(RIPEMD-128,Parallel(Tiger,MD5),MD4))] +:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709CDF26213A150DC3ECB610F18F6B38B463293\ +AC630C13F0245F92BBB1766E16167A4E58492DDE73F3D41D8CD98F00B204E9800998ECF8427E\ +31D6CFE0D16AE931B73C59D7E0C089C0 + +[Parallel(MD5,SHA-1)] +:D41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD80709 + +# Lookup test: TLS.Digest.0 is an alias for Parallel(MD5,SHA-1) +[TLS.Digest.0] +:D41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD80709 + +# A tricky one +[Parallel(TLS.Digest.0,MD5)] +:D41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD80709\ +D41D8CD98F00B204E9800998ECF8427E + +# MARKER: MACs + +# MAC format is input:mac:key + +[CBC-MAC(DES)] +37363534333231204E6F77206973207468652074696D6520666F7220:\ +F1D30F6849312CA4:0123456789ABCDEF + +:0000000000000000:67C6697351FF4AEC + +29:616FE88F809D55FE:CDBAABF2FBE3467C + +C254:AED0202A4D19E0E1:F81BE8E78D765A2E + +63339F:69E2BBE362FFA373:C99A66320DB73158 + +A35A255D:99AF085AE0872883:051758E95ED4ABB2 + +CDC69BB454:346750C009F85AE7:110E827441213DDC + +8770E93EA141:457FA6D39A704CDB:E1FC673E017E97EA + +DC6B968F385C2A:725FFF0F41477E42:ECB03BFB32AF3C54 + +EC18DB5C021AFE43:1D119FAEB0BB44C3:FBFAAA3AFB29D1E6 + +053C7C9475D8BE6189:E4DD5474534FE9DA:F95CBBA8990F95B1 + +EBF1B305EFF700E9A13A:BEE63E65CAEFA450:E5CA0BCBD0484764 + +BD1F231EA81C7B64C51473:495FF947F6665F45:5AC55E4B79633B70 + +6424119E09DCAAD4ACF21B10:53C806C8B69CF03C:AF3B33CDE3504847 + +155CBB6F2219BA9B7DF50BE11A:2CFD97F2BD38C7A0:1C7F23F829F8A41B + +13B5CA4EE8983238E0794D3D34BC:A83C88744DF51267:5F4E77FACB6C05AC + +86212BAA1A55A2BE70B5733B045CD3:112C46B74BD7D1EC:3694B3AFE2F0E49E + +4F321549FD824EA90870D4B28A295448:F12831C24A551F5C:9A0ABCD50E18A844 + +AC5BF38E4CD72D9B0942E506C433AFCDA3:0AB4EC81A81F5C6C:847F2DADD47647DE + +321CEC4AC430F62023856CFBB20704F4EC0B:B2D3297BE75E9505:B920BA86C33E05F1 + +ECD96733B79950A3E314D3D934F75EA0F210A8:0AA5F1B82E138AB3:F6059401BEB4BC44 + +78FA4969E623D01ADA696A7E4C7E5125B3488453:7143592230891CC9:3A94FB3199903257 + +44EE9BBCE9E525CF08F5E9E25E5360AAD2B2D085FA:90E6F543EDA1AC82:54D835E8D4668264 + +98D9A8877565705A8A3F62802944DE7CA5894E5759D3:491310A9E2B8B18C:51ADAC869580EC17 + +E485F18C0C66F17CC07CBB22FCE466DA610B63AF62BC83:\ +302E436ABB2B6193:B4692F3AFFAF2716 + +93AC071FB86D11342D8DEF4F89D4B66335C1C7E4248367D8:\ +1ED636A10A187609:ED9612EC453902D8 + +E50AF89D7709D1A596C1F41F95AA82CA6C49AE90CD1668BAAC:\ +2A02740B45449296:7AA6F2B4A8CA99B2 + +C2372ACB08CF61C9C3805E6E0328DA4CD76A19EDD2D3994C798B:\ +CEA8016EAE33A92B:0022569AD418D1FE + +E4D9CD45A391C601FFC92AD91501432FEE150287617C13629E69FC:\ +E584507E7606DD42:7281CD7165A63EAB + +49CF714BCE3A75A74F76EA7E64FF81EB61FDFEC39B67BF0DE98C7E4E:\ +5A09D5EF7B21251E:32BDF97C8C6AC75B + +A43C02F4B2ED7216ECF3014DF000108B67CF99505B179F8ED4980A6103:\ +3AA4E5750CA579D9:D1BCA70DBE9BBFAB + +0ED59801D6E5F2D6F67D3EC5168E212E2DAF02C6B963C98A1F7097DE0C56:\ +FAC262455D9691C6:891A2B211B01070D + +D8FD8B16C2A1A4E3CFD292D2984B3561D555D16C33DDC2BCF7EDDE13EFE520:\ +32127540A949B873:C7E2ABDDA44D8188 + +[CBC-MAC(AES-128)] + +# A test vector from InSiTo (taken from Bouncy Castle) +00000000000000000000000000000000:\ +66E94BD4EF8A2C3B884CFA59CA342B2E:\ +00000000000000000000000000000000: + +# Randomly generated +:00000000000000000000000000000000:67C6697351FF4AEC29CDBAABF2FBE346 + +7C:A2F5C113EBEE0F124B649287C7F7986F:C254F81BE8E78D765A2E63339FC99A66 + +320D:5C787D4CDAF3B4D106A7AA09F41BCFCA:B73158A35A255D051758E95ED4ABB2CD + +C69BB4:B32F25C34E061A972C49E4B0A0678AA5:54110E827441213DDC8770E93EA141E1 + +FC673E01:B5D6A0E8F3202BFF37796DB5EB920B7E:7E97EADC6B968F385C2AECB03BFB32AF + +3C54EC18DB:F3896484B179F90BE3B62DCE3F748C52:5C021AFE43FBFAAA3AFB29D1E6053C7C + +9475D8BE6189:100D2CDA97B85428D785D9EECC8D51E2:F95CBBA8990F95B1EBF1B305EFF700E9 + +A13AE5CA0BCBD0:\ +92A7A024C4F6D8C82C53030545C23C10:484764BD1F231EA81C7B64C514735AC5 + +5E4B79633B706424:\ +E235CFD4C307E2B3D44199E83E5D83C6:119E09DCAAD4ACF21B10AF3B33CDE350 + +4847155CBB6F2219BA:\ +2379D24A48EF60E46807E92C1A602AA6:9B7DF50BE11A1C7F23F829F8A41B13B5 + +CA4EE8983238E0794D3D:\ +D6DA42CAE5C664F3C4D597CF6CE1DDD7:34BC5F4E77FACB6C05AC86212BAA1A55 + +A2BE70B5733B045CD33694:\ +93990491923BF761B3220C1E45ACD359:B3AFE2F0E49E4F321549FD824EA90870 + +D4B28A2954489A0ABCD50E18:\ +9B14531370EE1EFFCF5A3BBC2161D25C:A844AC5BF38E4CD72D9B0942E506C433 + +AFCDA3847F2DADD47647DE321C:\ +EB597AD53F1B208B4FEB5C20D78545AB:EC4AC430F62023856CFBB20704F4EC0B + +B920BA86C33E05F1ECD96733B799:\ +91C3626B64EA3B16E15C2F9B32189C68:50A3E314D3D934F75EA0F210A8F60594 + +01BEB4BC4478FA4969E623D01ADA69:\ +F6251F1A89FE388121DED78B8CA9FD7C:6A7E4C7E5125B34884533A94FB319990 + +325744EE9BBCE9E525CF08F5E9E25E53:\ +E55A004723589CAA843140BA5AC52119:60AAD2B2D085FA54D835E8D466826498 + +D9A8877565705A8A3F62802944DE7CA589:\ +53A217151AA961BBF0C7AD4AFDCB9B5F:4E5759D351ADAC869580EC17E485F18C + +0C66F17CC07CBB22FCE466DA610B63AF62BC:\ +CE21D27F4D455511CD327D205853EE85:83B4692F3AFFAF271693AC071FB86D11 + +342D8DEF4F89D4B66335C1C7E4248367D8ED96:\ +4DC9B5ED541B7382F0FCC7CFAB5AAFE0:12EC453902D8E50AF89D7709D1A596C1 + +F41F95AA82CA6C49AE90CD1668BAAC7AA6F2B4A8:\ +2FB0B595042C8D7AD592583D7E6C76F7:CA99B2C2372ACB08CF61C9C3805E6E03 + +28DA4CD76A19EDD2D3994C798B0022569AD418D1FE:\ +AC464531064DA66A2F8591AFAB2931D0:E4D9CD45A391C601FFC92AD91501432F + +D4A628D05B1663A1BABEA82646DE1005197A63C1EB5C:\ +A16EADA7B6D32D01FE75759FB6DE2E1D:F466C626BC51E907F0BDAE188D092EF1 + +ABE8AF530FF6311FFB4B995F0C84BB00EA8226A7D30FAE:\ +7D980A5E6DA633CE4FED22E815A1C5AD:C3CC5CDB5A660A4B11F2FA6401F09621 + +ECE1BA4BED3F06ED298813D05B237F1EEFDBFA4941049452:\ +425497C221479FC5696D3078D062E725:F68FB7F87F4D196B2ED3B61B12BD083C + +451B0CA13E8BBF2E67B977A8BD0CFBB49BB2AC1AFFC5862D98:\ +90029A6EE195A0665D02997A844BE499:3C48ABF950E73F6BF3E0AA7F9FD8E659 + +4F8E165B89CAF63B76113A3B9767D4D3AF7FCDFF660C6B59EC15:\ +BCA39FFF3C95AB00DACF2B2A9A37C7FE:D88BEDBEE43C4DFB98D6C58E123C9F4C + +7736B44B0A63CAD76330E3CE8ACFE3625AD0213F0C6E3AA444FF33:\ +D55DC707BA4568B0642E3D70116308D1:563BD2A3B30957FE13BAC9EA1DF9CDEB + +839CCEE6F69E0735AB756F4FB96F8210AA55B35D5E0A5C71C4255BE2:\ +295F3F2DC91B300874147AADBF2132FE:1E28CDA2C49C88BA3A8FF0E5045F35BD + +CEB7CD790C80D66A8A32DB4F573631765EFE18229AA0DDD52FCDBA332C:\ +049AE1796CE825B2ABB88AA1EBE8D7D2:EFF0FBA7BE74B33E4A1EC97DF918D430 + +494A8E4762B1E2028EB7315B7164876155820813F6BB5141D91ABED33292:\ +AD921BBF28C028B76D9E1B4F92D36DCC:037BDD91C33F42A542D05C732BCDD8B3 + +2E2D3536402CF2916DCBAC2B9EDEBDA15A9A331DDA75C21C461E8F71EB6724:\ +952D487FE1B8A1F63B26B2027217AC14:1A945A50D4864266F30E121EACF0DB4E + +4A76816750F6296C3C47FBAE3363D24DF72C9DCCB2E032A5EE44C39A349FE87F:\ +ED1B41F593FF135A1E6DC7C85A2F1A2B:1569E6656010D19C57CC4A8A2F1DD727 + +4975F3FC5525A1436965DD9D04C61C192F037E8F134F2C6A1B76F54B93CC72DD41:\ +29326E91479F46720D9D1B067B10E617:65D9968A7AD9F3DFB790E37DADFCACB0 + +7A3CC3C9682DE5DE223072EFA24F300728C791A2A08482571465D4C1628171DCBD34:\ +440A055C9D93DE336B725E0FAE8BCB3D:A625628B0384BB75735DC4A464EC6BF5 + +8F0B7911638D76374FD8B8C0B575F55B9A57E69EDBA1134FFED8F362C45E575369D064:\ +345B392931218A9395F08BD1A45A9B43:CC5DDB04ACB3BC6D683262C3CCB9A96A + +944A7EE34856D6AA1A34016E9ED1D26A2FAD6EDB612B48C95DAA8D29633694F88112DBC9:\ +2D49E335B07A2519287CDA50D482FC48:68B27482E675F08447C3EF76705D51D1 + +889A9BE544280FA85EA3A0DFB57BA91D2D1D9F14929098D953874FC3E5A1956D3B30537F58:\ +900A6FB8FD5661FF12B7F391279DB085:6227B605C796BA433FD7705C7684EE06 + +1DC859A4171D89B8B2F7F3E24A733AAC9AF0B162866BA5C5421521B89A10BFB7D8185BEF35E5:\ +096DCD92F3919145B298201BC3820612:A8E7DC9BC9260E03D2A9F4830B7AEEB0 + +4030C561E85F71A71649C07239F557E1DD337CA6\ +598BAA2B349EAE3F189CEF58CCB4BAB4142B5C:\ +2E8B2AF6CFF3FD6AF55898BC1374609D:2A751C9CAE11F38FEE260B957F963FAA + +CADD5809F5F4F84EC0AD0875C133D1EBA8ED8856\ +FE7BE5EDA2F1822187C1CC529E245B931954E1D9:\ +351E0741D63B5CCED0131A483C3B89F0:01E94EC21D1FADC50C351C0BB101F853 + +F27A747A3B40CCD965276C7E7B4E577C37A63E54\ +C5EC1AD22136DDD237D5252A4F9AA48ADA70633F97:\ +5F144222C4B8C33CA82A85CCC177A0AF:CFBD131D158F55BBCEA980BAC352DBF9 + +2FAE3104D35B536DFFDD486F4087061045192D5A\ +A98215772C9531EFE80CE917BA1A1C8E756FFB744D43:\ +5FD061418DDE0BB0A8A3E6A4FD5BD2A8:E38DCBE99D1003CB6AAC4D7F23791454 + +69FC6052141B6C30A9E19FA455ECE8387AB32117\ +C324E22DD030ACF3A9C04712BDA864D1C3D0016CB1A010:\ +73E376B5D0B9466453438B5CEFB27EEF:068DF83E07AB601E6E84019B55314748 + +DA0890EDC5385196FB229767D33777DAC47018CB\ +1B78EA8AFDEB25521C6D9AF6752AE33A6235D05D5767C42A:\ +03F54C4F6B9E5E214BE93289CB2F2D4B:9E3C0463AC1D2EC7951851920377E41F + +E47F1659A9F9930C2E636985CA2EB0686AB4CB16\ +D1FADD67122FF916A6DE358A5D4BE30645761273D97CF9A3AA:\ +9FA99D925751C9613D3A8D42E3B604B0:A90B145DD72A2FD10796E3368FF9DC6D + +2F66CA7A49D1BFBFE333985F2C3B09D5471D321E\ +4761EF4FF7D28587CC62F4FBC8BF75129035D173686AD394A5DC:\ +BF0557B787C01A589BBD6EBB83F3A330:69ECFA9B0A41FDF990F4CC167B987870 + +[CMAC(AES)] +# First twelve vectors come from a paper, they were generated by Eisuke Kuroda +# and Yuki Ohira at Ibaraki University. The rest were generated by me for the +# EAX specification. +:BB1D6929E95937287FA37D129B756746:2B7E151628AED2A6ABF7158809CF4F3C + +6BC1BEE22E409F96E93D7E117393172A:070A16B46B4D4144F79BDD9DD04A287C:\ +2B7E151628AED2A6ABF7158809CF4F3C + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411:\ +DFA66747DE9AE63030CA32611497C827:2B7E151628AED2A6ABF7158809CF4F3C + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +51F0BEBF7E3B9D92FC49741779363CFE:2B7E151628AED2A6ABF7158809CF4F3C + +:D17DDF46ADAACDE531CAC483DE7A9367:\ +8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B + +6BC1BEE22E409F96E93D7E117393172A:9E99A7BF31E710900662F65E617C5184:\ +8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411:8A1DE5BE2EB31AAD089A82E6EE908B0E:\ +8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +A1D5DF0EED790F794D77589659F39A11:\ +8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B + +:028962F61B7BF89EFC6B551F4667D983:\ +603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 + +6BC1BEE22E409F96E93D7E117393172A:28A7023F452E8F82BD4BF28D8C37C35C:\ +603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411:AAF3D8F1DE5640C232F5B169B9C911E6:\ +603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 + +6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ +30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ +E1992190549F6ED5696A2C056C315410:\ +603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 + +# The rest were generated by me and are non-official +:146843CEFEF83BB230862DEE5288012C:FBFC57D01402E2527D11C008C041D51F + +4C:3FD7EC49061ABD552D6FA2685FF77388:556813A5E6DC9A926FB235991CA1A014 + +258B:80BC1B9501710D77C01451732517F272:6195FB30EABDBEEF1C5CE5E2CD533893 + +D1EF53:B708B2BDDEAB33BF33AAE5B47C8ED59B:7BB3D07953D5D76252B2C73642F1C829 + +84878883:D8E24AF6410BE6D26FE65E05DB95C1A0:18D366221A8BDAD5DD6483A388163EF5 + +721CFD4147:8F8ECB42EFE42F708D0EF849B4180627:2E0C3C02080D6B4C6A01FABC78FCC2D2 + +991225136F00:2B73C3006233572AD1AF399539723018:A157A82608FD6228D0F08D785B1AAB24 + +350183544EB437:D25C063089641481A482D02BAE21DEB0:\ +DA042063FE9E16CBA7EA06345E479DB5 + +424ADA19952F4588:2625B8C34C00C1F1BB066BBCCBFF9BCA:\ +8DC221212A006704B5DB69FDFE17FCF9 + +8596E11E94EA19CC3A:86A9ACE5C41B661924C8D4CB02335E0F:\ +B7F6065E06187815BCEA2B8260C4968A + +7C82BF2335D8A2E21C7A:836A7DC8C531AB6CFA8022132D88B4FD:\ +43929194A29B904776D80925BCDDA258 + +70202B9787517E4E1135C3:2C05A0B0ED6D8425347C07AC28CCE816:\ +F587DAD7CEB57FD9D205B1FBA1C7CD48 + +AFB34746EDC8281368ADB521:01454B9D291553F7B2832A88F0D4F4A9:\ +19B140930E41923A1381B76133A28067 + +C35C54CA3855817DC78E9E3187:A0FA07F0E142234072A12F0512197ECD:\ +C9D0F494B96DE372B33D8507EA2AA2B3 + +A601BF53B49B3CBED0CFC259C96D:0BA5CC599A16EC3965A5E2FC53AE2016:\ +2767C4F69FF145F1226863771AC86B90 + +3581A17D977891E5EBA90C547397A1:6A8EB76EFA42243E15A7CE5913298331:\ +4D1F72F544CE74099E135956FAF88FF8 + +1E28DBAA317AFA919A0F97FE25B3C8A1:1DB868DE86D1E6ED593060147B78E08E:\ +C97C0A1C1E2F7327331FBF3337846251 + +01702E80410F607CE8A85041E0419FE88A:666315D7F0A1D25BD69E7C11E0220258:\ +5E0848CEB6E1469C33B9C397C6212608 + +DFC8914D867E651B30F5910397E6DEB9F140:137C3A9C80A9FBAE82B1B53586EED7DC:\ +DB210A614E72085F8681A82936893EE6 + +1C8EF80E2D646CE28406C4312000F18E95D82A:B964FEC670CD39AAF35D2DC10D3071EE:\ +BF6E95E79CFF45B78B60B523682A67F8 + +3DC82D1710367C124696CAA6760F1C01B626E065:7F6E14CF8020207D74CB786FCE9F10C0:\ +768AA70ADFAF6738DC8FF2A85C34B6AE + +91D45A498BB9A093F6F678C495A7EF12C881A782E0:0BCFCBF5C1011EED7453CAEBEFEDDFC3:\ +2B7D219195BA5F620E18C9628F3611EC + +91B47BA5E78F1D059BE584C388D76CB7F55079BAC1EC:36790C9BA09C76E402F22D4FE9127C9C:\ +A92F1EE4C1C4717339FA7A4305851B5D + +3B2E8F8C7838FDE9610CE6FCC10F854AEAAE3A2184832A:\ +6B642B7D118A78A160B7EA0E11789A99:8989DA29F037D54809D39E0F21BAD66B + +9951105BBA18783C1AF2DC8F88A9B98C9E9C5502A1CEE559:\ +7C05D6851E344F0F725CE228A5E91F40:2903F5E3C9630579E3B7F9E97E141494 + +94D6C4C8EF018F83115A27B01218A7CE29A715FE32C90AAB84:\ +1C10A73B946DBFABCCBB21C93990AE5A:F7BC110047D58BB40C79BB46697AF357 + +DB170C579267ECDD54DFE24695B56459160530EB62EC7A9489A3:\ +C27600E6310E45A698C5F5F8BEDFB6DF:1EC461A0D7D45DBB8F329D28FD1120BF + +52ADDFA309053D90A9C807EBB9B85D28C8BD6F6463247B20726170:\ +03E0A715698908157EC2CF38A818092C:726F0F60469CA5B517BD4EE64FEC2198 + +B47B761A8FBA35F68E25B097A17191F2A9DB4D34162E1242BFEAED88:\ +97442B172B28A4C98BD1CB2A4D1634F3:FA51384A5B8B3BE1DD2C91D8ABC9E262 + +264D32E2A14653254743926ADB7CBB4DDF1C55DD0F24429DBC4BCF718E:\ +A6945844614FB76BDC75BD488637E34D:5171636008FDF3CF658D980932B44394 + +BF685A96FE74FC30B14285B1479A1591D92CDAE6BBBE678A193D3AB7B360:\ +022D9710FC7641F76728136323870565:644A3F16490C8FE381CF5BD6B09E7525 + +415D0574EAAE71B878EC707F50A850A196CE448AB4274701CF27CD0EF5A2CC:\ +C9CF027DBAF268A9B7304AA8E3F5BAF3:D151ED7EA3F4E6E3BD4DA7E0CC3FCED5 + +A39FA8261CD507B473C53E7B6BC2A859AF5A1E7E38F3938230A23470E7DAD48A:\ +79171CA85E8F2821B0889A259491CFDB:2DEEEDB2C4CEDED515493D0EB23F45A6 + +F688810E10DCFE4A64:61364AD45A2E15C8EE119CA8C36FBFA9:\ +D5505FEB66C306AFB167E1B240682C1A + +C280CBC1:76EA6672EEE06EE1050365F4CB404D66:D1CB929113E995A13D9E0B5FF068CF2C + +F610:5AFE8C966695BE3B4FCEA22F5C27B059:A7A252D3AB457702263B837F48814AE4 + +3D5E:41246CF56814027408D33634109C9C9D:7B3ED445B003A4839266B017B7F8226D + +741D:BB170239A6A86DC4906F8FA56222F883:25F10513DAC4792CBC0A76A1603E3CFE + +2D225860EF0FF7FFFA2040C60077560E5AB737B9F9AA689C11B35480AEABBCDB\ +CD143CBD2433BC1E54FDE454743B63CEF29A87EB44EF8756A2DBD651:\ +D36509415886167C44D9208EF5DB4C5A:900EE360285E4273AFA3674BB76FFB57 + +DDE273DA5EE3F41B370A7C10B706FE82AB82E7813BA44162EA99514218C3A4F5\ +A517CF03FBC41E32CE9A4385A141074CC3EECDFE930E607DA8B1C0C07464B61A\ +7C851D77493CA918D6EC9D772DA5C3F19391EF269F50A44701640876C8BE9044\ +43AD:DE5E5B64B403E3772CCB13E175C734FE:\ +EDCBA48465D6B8BDBF274658EF587F72 + +F4FF3C7E2F56F4:E1D41EC244EBC98373457A95685D0EFB:\ +76BF48A88F0F5531C4D1A14846742CE39B8D8827F863ABDA + +B664B2C219D625DC472EC765605E6D5822681C5E9FFD10645B:\ +3FC310BAF6F1A39FA25AE7DEA104EDA9:\ +19449A56180CB52462C37109EA1D329708F7C4FBC43B37E1B2C55E38F5551C0E + +6540E334A0024EFCEB621E91B94AB6E5A6D4D085D986410B113A5B6E319B9D96\ +DC80CA7C8319786E7B96FF34E0B6:\ +DA97AE2997EB3E74B35C6A6FD5471F8C:\ +F0D16D00B5CF601F1A5BE91422A5562C252C5C1DEBDF05B5BC328BF8505DF740 + +4DD7C1974501D1E454D23C509FE2265BC375CA:\ +CB1C20084C5DACB3270F118633DB4F33:\ +420D2C372E496D403A9F520158FCCDA6D6BCE14E6EAD2B90918B919E5E8621A0 + +E2C0FFB463EF4B6EC114322FAFB8:D25D89E8CE9685D975C645FB2A19E50D:\ +970BD2C9C46E9B85E13949E13D39B466A8070F40570D1070 + +85380139C424704AC24497634E9CBFCEE21E0F99CF3AC8F9C6AE2D6FDD091363\ +41149C05380C4FFA50E65D9E831D6C653B7BFE0BB5C6047C7431EB513AFEB47B\ +1250804B5DD045ADB6A34C39C0B89EFB349C06E9620A65D63C5028764EDCF261\ +2D72AC8A42F137F9948332543CD150706D5659D061BFA69D0FCE135EAB05BFD8\ +786B62BA5C99B3F11DE64559B795C924EC22F44DE19BEAF169FD4F14030EEC7B\ +794E35D5E8E9C6:\ +3015A6D16CDDF7E1E8C28521F4064A28:FB565C5DB38C2237869ED34CA10A055C + +7B326530160FE8CFFB68704022DE43BBB54FCD83BF4C554774BAC625441C1DBF\ +4F82F06591D8348C40A4CD6282101D3860EBBB1F371166ABCB2DD00F49EDCF98\ +6FBFFD0197328DD7D65A39596B5791CB424CEA795D5024287DF438C7E1075F50\ +C65D515D8FDF3465396DBEA4C44F6F069C597FF9AAA32227:\ +39F2933F156616549749CCAEBF682322:\ +0398D70C12CE6F7ED28828647FB18A56 + +# SSL3-MAC vectors were posted by Thomas Pornin to sci.crypt +[SSL3-MAC(MD5)] +00:A856430AF077AE2C328D9FFE4E56813A:0123456789ABCDEF0123456789ABCDEF + +01:96279D16E7812EDDA2EC64DAC996348F:0123456789ABCDEF0123456789ABCDEF + +0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\ +0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\ +0123456789ABCDEF0123456789ABCDEF:475006C7DC7A3F371352D948B4BE950E:\ +0123456789ABCDEF0123456789ABCDEF + +[SSL3-MAC(SHA-1)] +00:DD2BA1F4A721F22C8A9BA7350B5CD6838B225827:\ +0123456789ABCDEF0123456789ABCDEF01234567 + +01:CD6289A1FEC0BB104C271BE488343BA92328B073:\ +0123456789ABCDEF0123456789ABCDEF01234567 + +0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\ +0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\ +0123456789ABCDEF0123456789ABCDEF:98E523EADE38B3BF4EBF51D7EE814316C9EB3159:\ +0123456789ABCDEF0123456789ABCDEF01234567 + +# From draft-ietf-tls-seedhas-00.txt +[HMAC(HAS-160)] +4869205468657265:\ +F5B44115A53F716B6F488DE1098EE7C251418623:\ +0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B + +7768617420646F2079612077616E7420666F72206E6F7468696E673F:\ +A74547C1EF0AA147C7428AB7E71664549BE2A412:\ +4A656665 + +DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\ +DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD:\ +E4C91BC71782FA44A56BE1A34AAE167E8FFC9734:\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + +CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD\ +CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD:\ +14D1055DA875222053BF1180BBEF8892EBA3AC30:\ +0102030405060708090A0B0C0D0E0F10111213141516171819 + +# The RFC has this one wrong +546573742057697468205472756E636174696F6E:\ +124131A293F1FDF3D6B11E2B7F7A1F5B12E42D58:\ +0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C + +# The key is HAS-160(AA x 80): prehashed because Botan's HMAC accepts +# a key of at most 512 bits +54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A\ +65204B6579202D2048617368204B6579204669727374:\ +63750D67AF40E3FDE33526545D300972A1527053:\ +A766901C8630F7DB3A3FC2A9747A6E2593452BE7 + +[HMAC(MD2)] +50752120507521205075212050752120507521205075212050752120\ +50752120507521205075212050752120507521205075212050752120:\ +3CC6A661CC76DC9A617C967EA7E1CDC7:\ +FFFB66FFC4F304CBF3B2A3E293D856FC3B30A9DF82DF3D17DDC300215A89CF23 + +43617264436170746F722053616B75726120346576657221205E5F5E:\ +93B02F8CA34C52F33A9BDCD75D3558E7:\ +93837AF03A1378796B2234EF3CA009AFEE599FE446EF7B3043BA273A5A4DD9 + +53616B757261204B696E6F6D6F746F:3F0EFFE820B7F02939656A3092F9E657:\ +17DB32EAA8FF99C81EC3C063915A122A51FD32D70C76DB07D788 + +[HMAC(MD5)] +4869205468657265:\ +9294727A3638BB1C13F48EF8158BFC9D:0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B +546573742057697468205472756E636174696F6E:\ +56461EF2342EDC00F9BAB995690EFD4C:0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C +54657374205573696E67204C6172676572205468616E20426C6F63\ +6B2D53697A65204B6579202D2048617368204B6579204669727374:\ +6B1AB7FE4BD7BF8F0B62E6CE61B9D0CD:8FB6AB01840023EC453ECDEC73DC1B66 +54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B657\ +920616E64204C6172676572205468616E204F6E6520426C6F636B2D53697A652044617461:\ +6F630FAD67CDA0EE1FB1F562DB3AA53E:8FB6AB01840023EC453ECDEC73DC1B66 + +[HMAC(SHA-1)] +4869205468657265:B617318655057264E28BC0B6FB378C8EF146BE00:\ +0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B +546573742057697468205472756E636174696F6E:\ +4C1A03424B55E07FE7F27BE1D58BB9324A9A5A04:\ +0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C +54657374205573696E67204C6172676572205468616E20426C6F63\ +6B2D53697A65204B6579202D2048617368204B6579204669727374:\ +AA4AE5E15272D00E95705637CE8A3B55ED402112:\ +4CA0EF38F1794B28A8F8EE110EE79D48CE13BE25 +54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B657\ +920616E64204C6172676572205468616E204F6E6520426C6F636B2D53697A652044617461:\ +E8E99D0F45237D786D6BBAA7965C7808BBFF1A91:\ +4CA0EF38F1794B28A8F8EE110EE79D48CE13BE25 +CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD\ +CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD:\ +4C9007F4026250C6BC8414F9BF50C86C2D7235DA:\ +0102030405060708090A0B0C0D0E0F10111213141516171819 +DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\ +DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD:\ +125D7342B9AC11CD91A39AF48AA17B4F63F175D3:\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + +[HMAC(RIPEMD-128)] +4869205468657265:\ +FBF61F9492AA4BBF81C172E84E0734DB:0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B +CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD\ +CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD:\ +BDBBD7CF03E44B5AA60AF815BE4D2294:\ +0102030405060708090A0B0C0D0E0F10111213141516171819 +DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\ +DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD:\ +09F0B2846D2F543DA363CBEC8D62A38D:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +546573742057697468205472756E636174696F6E:\ +E79808F24B25FD031C155F0D551D9A3A:0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C + +[HMAC(RIPEMD-160)] +4869205468657265:24CB4BD67D20FC1A5D2ED7732DCC39377F0A5668:\ +0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B +DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\ +DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD:\ +B0B105360DE759960AB4F35298E116E295D8E7C1:\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD\ +CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD:\ +D5CA862F4D21D5E610E18B4CF1BEB97A4365ECF4:\ +0102030405060708090A0B0C0D0E0F10111213141516171819 +546573742057697468205472756E636174696F6E:\ +7619693978F91D90539AE786500FF3D8E0518E39:\ +0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C + +# From draft-ietf-ipsec-ciph-sha-256-01.txt +[HMAC(SHA-256)] +616263:\ +A21B1F5D4CF4F73A4DD939750F7A066A7F98CC131CB16A6692759021CFAB8181:\ +0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 + +7768617420646F2079612077616E7420666F72206E6F7468696E673F:\ +5BDCC146BF60754E6A042426089575C75A003F089D2739839DEC58B964EC3843:\ +4A656665 + +6162636462636465636465666465666765666768666768696768696A68696A6B\ +696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F70716162636462636465\ +636465666465666765666768666768696768696A68696A6B696A6B6C6A6B6C6D\ +6B6C6D6E6C6D6E6F6D6E6F706E6F7071:\ +470305FC7E40FE34D3EEB3E773D95AAB73ACF0FD060447A5EB4595BF33A9D1A3:\ +0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 + +4869205468657265:\ +198A607EB44BFBC69903A0F1CF2BBDC5BA0AA3F3D9AE3C1C7A3B1696A0B68CF7:\ +0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B + +546573742057697468205472756E636174696F6E:\ +7546AF01841FC09B1AB9C3749A5F1C17D4F589668A587B2700A9C97C1193CF42:\ +0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C + +[X9.19-MAC] +# The first three test vectors are from ANSI X9.19-1996, Annex I +31311C3931383237333634351C1C35383134333237361C1C3B31323334353637\ +3839303132333435363D3939313231303030303F1C30303031323530301C3937\ +38363533343132343837363932331C:C156F1B8CDBFB451:0123456789ABCDEF + +35383134333237361C3B313233343536373839303132333435363D1C30303031\ +323530301C393738363533343132343837363932331C:\ +AB4884061A159618:0123456789ABCDEF + +31311C3931383237333634351C1C35383134333237361C1C3B31323334353637\ +3839303132333435363D3939313231303030303F1C30303031323530301C3937\ +38363533343132343837363932331C:C209CCB78EE1B606:\ +0123456789ABCDEFFEDCBA9876543210 + +# The following were sent by Darren Starsmore (he has access to a commercial +# implementation of the X9.19 MAC) +3330303030323031393543555354303120202020552020202020202020202020\ +202020202020202054303253454154504152594742324C54535435534F414131\ +3939353032323731333339343430303030202020202020202020202020203330\ +30303031304139354558413030303030333144:\ +DBE9EB0FA03838D2:4061610D85685DB0F4D9F1C8FE15A123 + +E7EF0EC901CCC8E5E44579A25AAE7FB82FA475ACD95F2DE313C5C2B7BCA63BA3\ +95496C9615347CFA7AF59CD4A31C8DD3C0027F9961AD7C75723E2C2EE467D279\ +B13E10C6738CC0ED815DC125794EF8395177D2B2244E27978D53C571BB97EB6C\ +D6FB324987F3360850F72DC9462502979DD449C1227158AFC41E217FB50CEB8B\ +071ED48E110A966102C42A48E92CDF860028482299A0D25EBEF3DD74FFC9FF06\ +E7D494F8DE2A59E0EE8328D8AF075EAF30A6D1C947A3270596057995CE799BB5\ +4D2FAD2B5A060C48893420383C7FE76C25B8356C5C5D72F262EB88306423E5B1\ +5392DDAD98E9F521:83C4B075AF24AB7C:BB296726F91480CDC432AB3067536EAB + +12916051C77047C9EFD1E3A43D0086D9899AA28818BCCC5D8B5A0A848682F898\ +1359E9DAC931A4B902875D3F87E318107DBB98967765F302BFFD8645807FDE93\ +D8C76EA1F8125AFB99B83A209B5331190EC9AF852EA287EEA00D33208C11B364\ +D92106D13360CCCC1807EDB45A1ECD68E77CED161E7404BE8137DE0E49927222\ +B378F3E7D9C0B3F1C7A0A521BE7289A6EE76BC0DEAC0CB6BF7AA79403CEC62EF\ +6456D63D168A2FDD2AD4FEE947878F35FD4B42E70B0E5202B8CC43F4B8A5E31C\ +FBBA5A114489EE6E5DEC57A473E6DA70311C573C2AAA3FE2:\ +31174049F029EB36:214B48AB97E144F1005831C8C97B8EF0 + +# MARKER: KDF Algorithms + +# Format: secret:output:salt:out_size + +[KDF1(SHA-1)] +61736F67696A6F7367696A736F69676A736F6964676A6F696A6F736467696A73\ +6F6964676A736F6964676A736F696A:\ +A0D760447F105CE64DB99FF2FC92F961F24E7D9C::0 + +61736F67696A6F7367696A736F69676A736F6964676A6F696A6F736467696A73:\ +A0D760447F105CE64DB99FF2FC92F961F24E7D9C:\ +6F6964676A736F6964676A736F696A:0 + +61736F67696A6F7367696A736F69676A736F6964676A6F696A6F736467696A:\ +A0D760447F105CE64DB99FF2FC92F961F24E7D9C:\ +736F6964676A736F6964676A736F696A:0 + +617361736F67696A6F7367696A736F69676A736F6964676A6F696A6F73646769\ +6A736F6964676A736F6964676A736F696A0A:\ +DBFEFA0EA12D352C4AE5B0AF17D061E0E2C469A8::0 + +617361736F67696A6F7367696A736F69676A736F6964676A6F696A6F73646769:\ +DBFEFA0EA12D352C4AE5B0AF17D061E0E2C469A8:\ +6A736F6964676A736F6964676A736F696A0A:0 + +[KDF2(SHA-1)] +FD7A43EA8A443C580C0DE618ECC013704505EFF8B5A4A9:79:BF0B2ECD1724A348211D8C0CA7:1 + +701F3480DFE95F57941F804B1B2413EF:FBEC:55A4E9DD5F4CA2EF82:2 + +BEEA23BF806E106D0C91F8E87095AB402C433C581088E1236FD20564A8F1AF67DCD2265C40:\ +78F8E7:36C94DC7C2353757E0778323B3DB333BBD57AA8F5C:3 + +5A6999A96594B0989B89CA72B5C0803043D4DE78709B490EB98610:\ +84C92008:5F0F820B69ECA512:4 + +C6E227F3F9BB5227BE37D6CE7433022D5F0DFFE18C5777EBAF396F1E40C4:\ +F518EEE6F2:CC06A6F3F9A0AF4CC76D839D:5 + +CD6356CA771E3FCC4BB548B4E6EE4E3715EB7A4A806E4967B1:\ +E72EC27D6A81:221DA543:6 + +B7FA7917A833B0C0364FAC414D92DA:8E54D1C86DA8A9:\ +DC32AA175531CF88C8D55A51DA5CAFB314A92C2B52:7 + +8A14:A2FC623645F9AD29:65A907357B5CBADC5C5EFF7065AD:8 + +135FF7296DC87F5775B64F8CFF46D366C10A8A98712345CE58CD5839E9:\ +73036FBD1941C7955E:A439FC03312570F9A4C76E5B17FA:9 + +AD499722078DF83AEC1EC23A507B190740B0A6821F8C:\ +A461A98B6BBBB0FDB0BD:3772601ACF052CD530D91EC7:10 + +CF99B7A985C223BE83F999D7:735BFCF26A4357F5642964:\ +055396C3E0EE8190DBE10212AE099FF0BC0A8D:11 + +B640D21A1FECF5E61D79E1E09C2393915D5790EF8080E7F6CC18:\ +6DB9BAE99803B2EB725FA8B3:5AE5506D6306:12 + +F69885268F3DF8488490419F49CD39A54D0D8C9A3861D375A8BE:\ +2A1EB238B7CB39422DE263E4FD:C1:13 + +DCF4DF1F6B5D71DF98ECFFE8A4B7C5E7234AFC10CC0C941D853BFC32487A:\ +FCF8D9D4E43318EFC0056EBCD271:\ +7F246E5F44DABCB5B954A1B83D456F022C924D29A21935:14 + +BD2EDB4CCCB0ED3D01BA03D1A816425E40ACBC7F214126A6775AFE28B0B2646DE040B9ACF0:\ +C669ECC95557FE8E49457576BDABD3:\ +A7E9F261EDC30903056744B123C3D364E979:15 + +3185AFBCFC621B6F9FFCBB75C7E71A4161A0AA39278676:\ +687481BEF8354C8D48D8F5A5F3D9ED3D:80834249A9A4CFFCD655AB92:16 + +15723A13E56CA0FF5EE43D8A4BA8284B4A946D861F:\ +439082061EBAE065C434932D981603AE1B::17 + +92167440112E:3A5DC9AA1C872B4744515AC2702D6396FC2A:\ +45A9BEDED69163123D0348F5185F61ABFB1BF18D6AEA454F:18 + +208AA86616B4133903946BA8:A267CC65619C84EF5FE1744EC3A92A06B99399:\ +CF08208B76D97F:19 + +04879F0DB43E33435D53F0DDDC72BEB957F04F2CA5E8FB38DC4F78:\ +F46E2675B807CC42FC1DD4C84A5BEA3AC175B093:2B688B3F6C12:20 + +AAF175079CB9CD462EB2D4D62440EF18B22AEF1552CE5F04EF0158C177572D21:\ +5A3796C9045712759E6DE769E5049E5829408615DC:\ +48A228E55BF52B89A8FF5FCC3F4EE4F178D406CBA265CF9166:21 + +901BBA708DAE7365ADCCB7AE056729B5DD610226966B084A02D1E8:\ +8A397BBA8EA862DCD004897304B901784513754E9FF6:\ +3FCD4A2A5D65E4CDF29241573F:22 + +D20CD658:5C893F99FE81F1E955F2A7CFEC4F50B7CCC890BEAE4768:\ +17D7E5C9E3DB69B28EC9:23 + +B669EDEC3D9A78:1A4DD8282E8B4D7A739030FF60CD88C4D3C0E5C3A0DEB127:\ +D072D0:24 + +349AD0D9BEA0D29C:678051858CED59674C06B60EE21D18ACD55C10B049B22F5CFF:\ +D4C8D8DB185F7EBBEC046ADC49A26DAA172F81E3:25 + +B809759B369EF9B2F34A0254AAE645:\ +1C2C3C95529E4C8E5677F714E122A2E348810379B09689FA4B30:\ +D3EF4B914359E78F253FFC8B9B6D711E257B94:26 + +20216E8DCC3AA461F9FEFA4BE06F3C63BB:\ +A24D44F5194B4257B92CF85C8493B5BDA52515E18337280C45F005:\ +AD13544336F28B8F1B2615BB9658:27 + +40923A6409592A370301A859F1E797:\ +4C8919843B73BAA06853E1C8D9D4B18518CD857A624BE3EBBD507BCF:\ +C3D9FCE8C68AFD0F97D21AAE826ADC1EAB6F580F78B139B0B43B58:28 + +26541874BEBDA8DB76CCD60DE28E65E91CC5F128B9C56F6609185F108337A4A98B:\ +B16B3FAD79618B39D2FB0983BDE7D3E8C17E2DBF2C2853CE8D92191696:\ +BD1D497AC525F091FBFD7389635DA5284ECE:29 + +5D17A9CFD9994A1CC1F0AAC3C48F60C7DB:\ +1233A118E3B025AF2240F2AB14A61777A1347AE58033B2FFA313946631B3:\ +FC56:30 + +32048974CBE67FE8B4E6C0D4E21035B2A657E7C5E3592A61A2:\ +5301147F08E1D473F82558F815498F7421D8C501056402F77A186779A6C5C8:\ +D6ABF65542:31 + +F4E8338789D14BCD31EAE46199DB1A86AC76B8611809DF4D77279F53CB0F6DBF:\ +90C528975E02E3B5A9970B0074C02A691401A7BCAA94A8B731648A1732806D6D:\ +F7A146807292:32 + +0DE2DADDC876B4B0322B3B995B43B580B4D5DF529F4E29606F825AFA72:\ +41163C646606A0B96EE1FA2783AAD072260670283870BB8A510A693D01F9C0A5D6:\ +BECB7FA1A65C69:33 + +CF00B2A31485DCC4D6F9296D219F4831CE80A0043CA937F9712DCD1C0AF02BD9F0DD7C:\ +EFEAF89E578CFC169570F08452C42157EFB9905D33DCD97DF29A4CD626F9DF539E3E:\ +046259C93952F2:34 + +EE67BFB3A6F4CD:\ +1D02C4CE8D6AF08F2A4E8660718EBF8031C640B7502BE5F1F2EE91CB35241952D63BB4:\ +A85EEB10A12C6B8DE05642:35 + +BC02C1:\ +6D3B84710944B5A4448455C22D5CF21852123816A33269ECB29DBCB10616978FD5200FB6:\ +E2E57EB395:36 + +85B2DFCEC6D020E7DD45933451363AF111346D52E1BA4B168D47BE178F:\ +E43AC0F5353A0ED3C35C1EC0BEA6190C49A9F8925E510DB762441BBAF8B798686C1BE6D84C:\ +CA79147C58E3422803290548BD3999F3738A04A8:37 + +6E757BDFE044D00A96AB79F3CEB27F96:\ +0A18BD32469D8FCA917A80C173C2E01B2C9E2AF978CDE34E5EFF933B563F3B26842778BAD326:\ +:38 + +26E7CF534DAF8F9243C5CE3297D807D1C6B4F0CAB16AB5CED3C737:4A:8AD8F6:1 + +166C66F4B39A17A2:8AEC:81:2 + +8533C513D7D26ECD416DD3DC:030CAC:52474087F2:3 + +E876D64472865C8F4B7F:A83C863B:BA88B207:4 + +15AC949219878463A7B1A6599ED9:AA28AD4916:E79A373588F3:5 + +D288A4BBC027594788F81964C74F:5777F5478B70:06:6 + +84D3564BA0AA5A0DAC7AD62F88D9373B9DB280D026AF0AE5BCA633AE36C24ABA95A005:\ +934CEDC65FDE09:364A60:7 + +5977D030DF4051B9FB03167331C6B6366A0F8CEC71B69FFB1FDC9469B5:\ +F09FE23B9C34EFC1:E734:8 + +26A51955CBF815122460E803F1B399F617A4AE1CEE:\ +17A5BFF10B516A752E:0E33D563:9 + +EFB7C556790493E3C15B513CCD250FEF4BA7878585B8E50E1009C56BB146B5A0:\ +EC92ACB1367E34CF1361:FD7B:10 + +F2EAABA8E42ADCC55CD36A2C78DD0325E55C1B4E9C6BE9F77966BFBD623CD454267FFC0BA9:\ +E0DC1C8E9071A644ADEE46:D8D005AB3A3123:11 + +01A8F53F2BBDFB05D41E9FCCDD85CFBD4BC0502C:\ +1C9D86C49E9F3DBFF9674A11:6E3EAC35BA:12 + +02414433D5734F:EDB45D5FA17F17147645DD8DC2:70:13 + +13EC731CB6C29FC4350FE0DE63FCBB5A6F3568E05250099715795D51C5AC10D89883F44E46:\ +AA07990CEAAB482272FCB3A3AB46:93127BA3F25906:14 + +2BCB12D2E40A5BB81BE4297F9306:3F450384BEB9C9A478F46F051FF152:67:15 + +4DBF180733:0FDFEE8AF8D926763E28AB284C7B8040:54C4:16 + +BD3E9044AD45F1E710529172837597E7BCBC2C27505187:\ +0E4FD5D562490C5FFD0A37588344D86347::17 + +822816:21E8AEDC72151B03D2F9A3E7CD9CA6805FEE:C1:18 + +7FE688:6701CD19F736B12C067D58FBF0D024E695C18B:C9:19 + +1EC869F1476B8C7C537E8B1AC4411A10332A7DD06645C835EBBB3CEFD570A9:\ +F04DCD7617D96283E463511A1A9313006EB6BD4E:F338:20 + +6C78966EAF4DB43ADC3865962F292CDC81:\ +9093D86736C445B12843AD189410984F8B912281A5:D4:21 + +D85C07E05DDA286A4A1B9191A929FBE1D19D:\ +DCB8FF108AAE1B16901CABF9BAF0AFC4ED1B20A72312:\ +138399:22 + +597406:AE58662CFE38E861B289EF9E3146A37393C798BB7ABEE0:D5A5EEBC47:23 + +33460E:6A85B3C6A5A6D0E1734004B788FE84C744BBDDBE42C32ABC:F8A648C9B6E9:24 + +74BF53754034B0DC:BDCADDFCCA599DBB24A2789DEAD088EEA633E8A15A03B65291:89:25 + +F6B3A879AEE95C1604EF005F90D35EC4621F6BE5D52F65F1BF192FAD2D22C223D66B9C8454:\ +9FA401DABDDEFE3B64702DB7395950A357CA32A501E43CF6DFFE:F89A58E89B:26 + +5C90E327068324D80B780A10646E01F1C57D4F67E2BF9322:\ +F95C1618F2F62B9EB4516E0AE68D38658183D30BF3B97B63BBAEB6:C13297:27 + +F88AEB2006224184F1231BF42D63D2BA69C88ACD47C27996232EB2FCF04647E8D03308D6:\ +A7666ACE2515FBF42334F21F48510174CD8944A7397EE0F0BF38262C:\ +55495A:28 + +B98B0026B2D40DD0827B58090D2698140A9CBB3B13F5:\ +ECE9B1E55CCF257F2C7BA2B39BA852DB81FE9B32DD08130CB6041CB349:\ +C1AA:29 + +F8BEF20480916E2762A77D00:\ +1102796B06234073DC6913318D65010A4F4C9E95358DACB3CE0D08857B28:\ +1CE36F6EC8FE:30 + +80C9D5FD0C7BC1278F74975303D1F94600877754FCE3B8:\ +CFE56E573F2933E1728B3367F4EDAA797BE7C843B89250B98C4EB3BAF2E4D7:\ +EA8332DE20:31 + +2EDB67D2CC64BF4B62:\ +52E44DB4B04F9792243508B969FF730779CB2A1EDF764324D11C14235B055D30:\ +38D7ED2715EC6F:32 + +86D77225DB6E5EA176F5DAF433E4C2C804B24FB22F2747FC5D8978189842981F19:\ +02BF3A2F5009054AF526E277EF6AB436BD8B7A53A3E4C2671F1E34556239F97453::33 + +C73E664D445C0C60C59CEF54F10ACEAA456E6BFB:\ +4E984339A1FB20BD73894494B36CE8C1182BCB0D289BBAB3BBBD366B1DD061BB9E16:\ +F8C579F9:34 + +0651E961BA3374DE7248CE52EFC948809C20B8:\ +36AEC134DF567B1FBF448D0C56C6B62E40A375BDC74A2D44E415BCD105B48317145D95:\ +43:35 + +BF5BB2:\ +6F7533ABD09546770D6E71769A645B0D3BFA6D578B7B9B182D25CF8F8B4394C2BBDCECAE:\ +159B4039D67403:36 + +64353C0E4D64C60C3F2FEBE1C6466E57FB28:\ +7B80CD69345CBA9E46186372DD6602F2CB55496364CEEA96823110E28CAA68BB200F56F37F:\ +EF4AAB69:37 + +6FD4C3C0F38E5C7A6F83E99CD9BD:\ +02AEB40A3D4B66FBA540F9D4B20006F2046E0F3A029DEAB201FC692B79EB27CEF7E16069046A:\ +DBB986:38 + +[SSL3-PRF] +6E60:D626B75AB8BD4F5B9458BDDA8589FD39:17FEBCA565786528F84A:16 + +66BEEC6EDE7FCDF50B76EBCD5C0FE0A472F2EA8B1E2BE2971E49CA:\ +EB:5C461D77ACDB631ABAE2E7AFED5E9ABBBAA99B:1 + +1171D78F812512DEFBA258574E41F2832BB9B359EB0CA79E7669:\ +2C8B:73D677854D88F62417774A2A5645CCAE9C1AEF8E9D1B48:2 + +6162DEC990B2132C30C153F2B200:1B9430:2666F0B22E8E48DB1640:3 + +D3C0DD69C18F17D35C5296FE45F0:C7C19FCD:320C9EEC122C19AFB8E90F72:4 + +EE6A733EC671DA7477AE18916895A133CC92E23DBACEE2634846CAEF0B08:\ +C264D9D0C9:B7F9722B37389C11:5 + +97D7F3D2AFB3198862F6FAC8B17CCEFB26:C1CB767626AC:\ +D3583CD13AC119CAFBD44CAEA5AB:6 + +E87A9BBC656884A13295B8D4DD4645905846C249D2470ACD2BE5:\ +3DC5B6402F451C:542D044668EDC104A9266C2EC79EC37F72A0C6B7301EFDF267CF39:7 + +7463F0B9F822E17311E47680DC5B505811E9:FE4B1DA4EDA36820:02AB98439528C994:8 + +EE8999703E5D9C628AA404235F3C94C3A890B1:EF317D3E81DAEF0F89:161DEB5AB705BD15:9 + +AE531918E679D2D7B32C61BA31415484E9725B2905095819:18D5272345C1695BE38C:\ +A162AC0F0AB41CB80735D1EDAEA3C562CF261C0067:10 + +8FE402D6ED0BD018A532FC063E7D81D97CDEA7:D61088CA1CE8944B17CD3E:\ +BF7F091B6E0DDB90897B6BF80A4F:11 + +4279DB52505E7B505BBC26CE0FBF2F4353086C1363:4A84A8E829528393FF890129:\ +8710A8A12B2D18A27A50E5F32C37448A:12 + +B80B58DAB89B1C4D1335C48E479220E253B8EACFD64319544A:1450E50B7D86B76015930BA420:\ +E9158BA5F6E25D013A37B9D65406E989CB77D05D97B2B04F9C7F26DF987A:13 + +965F1BC656F01C1C7F977419A5F99FB54FA34548C332EA79B5B0EE:\ +CEE11A3A9A406FE9DA77FE6FB007:\ +3F6FF94F05596ACBAF5AE7CBD97E3FF3233992D988361E:14 + +657B5F618710AF88BF4F0328E7071D022D02EA5E:8EA957C330D55CC208326CEA06D25A:\ +BD0A575481E823931F68BE84E31DE56B2D95F3ECE4F614CBFD31CE:15 + +33CE7917528009F2A1011CFCD494B80D4BBFD901:2FB1FDD16FCE41C9C563226A564D1647:\ +81851CC61D3E910E04D5EC38A465:16 + +40ED568CFC6C0A17866C67B7660C96BF9DA54C:321118AA031C5C9EFF145542B4426C3C71:\ +A3502B96214854E5AF5720E8970D3F240AAB2E21319A88E901:17 + +12695F5B19541C8B0092418A72A7ED8482F35FCC4A82D4E1C5AE:\ +22BC94F745F6E247054DDA2C772E5D2D3EC4:\ +2CE5F4676C06D0CB61E91F7D751F0F:18 + +F36E535A1C2C6F6771:6004BBD20BB68E2F1FFC65977807EE25A3FBFE:\ +290BE26068D887AA6E86500E85C606:19 + +7C7EE43D46AE85D23F0D5264DBD410:0E1FE69316D67CF65D62196C25CC4F517664BD43:\ +FC4A7F986331A012CBDAD765288C2CEC08AAD045:20 + +C580B05EC577F45434C13640AAB31B:937E22F90D1493317B0B068A44859036905540AF67:\ +6C9F5929EA435A86E117BD586B34F7E4F97794573C0B4C90:21 + +E275AEB758A949CBB11256E74412E1DA3743899F9007DD5D80A7:\ +69C2640797F38E87F1C870891164F0B31F1A3A02627A:\ +585B267A9E08EF4DBF48F6:22 + +DCF06E7AC257DA73CC6FC0A086B4:30CCF63491F642A55E45136E42FDD0355DB272502EA1B0:\ +16F0355230F105EB316F558512EC3B51871741:23 + +C4C38EC6A1EA975D0ECA535B0CC4D6D0:\ +3B50F91EDFDD96CBA8B6329616D4F5964CD8C961CB1D9332:\ +E84EE4D9DC701DE04E250768F2DFB9B6A2:24 + +7B557AC16D60B74ECAA87641887E6467BAC107:\ +CA148D27F3DC362B0F43C68312058C1CD9B92ECAC2CFDD601F:\ +D7B9EB91BCDE1F6C144A0799:25 + +B23EFA7FAA11D0E597F00867992CB3B9DA93D607FAC0:\ +510297144BA4E0FB5C94749576F756AA36F51289CA463419DC06:\ +DA5E3A17C6DDE81CC69A5AC11904D2E9E969D9F2D1731E842C:26 + +1A5063B374A5F7769AD59432CFFA6B:\ +3437D8B56E573E724B72DD08A5D144E86E646BD24EA0795BA2C3BD:\ +FE0314911D4C07803C48A9EA86:27 + +870515C65F0AF7AAB10C365AF8AC535E1AA8997D139645A21F71FD23ABBB:\ +1895554BD0A1DE7F48FA8776D314EAE2B9E8D7E3CF2A418D17659DC1:\ +AA33C0BFF91FC9F1C97BFD00D5F5AC2953C6D1EC43E5838887A2F984C5A53F:28 + +1BAE220F6AFEB0A2F51D44721A7A9B9C:\ +13720151D256DEBAAA668359A876A9A9788D540F509E90372952A91757:\ +11555530CBAECFF82C76147416A50831532A40BD29F15F1E0EA49129:29 + +BC55F2BAC14370BB5832575A233F1FCE32322E5B4CE1955153CAF3C84493DF:\ +972B190F7EC73DA7C5B8B38E9B6DCEE452AB0BC2220F37BEA3FAC596B2F6:\ +00E8D1BAA9142A646C5DBCC680FB:30 + +834CD382FBF84FF54CC8D3BCB778ACD7DDE8FE32ABA212ABB1:\ +6151C82D7384ED41264424827766B6A7279593C86DCBAC9A4D711009E30EC3:\ +EE768F1AAF889EFB5B20F7536FECA037BF:31 + +E0BDEBC1D1EEDB393368D489:\ +F3D8ED6D46280C3694F33D2D4A210248D657277DD78ACD3B34063D085657A58E:\ +5D2B46C7BB5258ABC13514995E518FD4D77BECB738D77909:32 + +[TLS-PRF] +6C81AF87ABD86BE83C37CE981F6BFE11BD53A8:A8:\ +A6D455CB1B2929E43D63CCE55CE89D66F252549729C19C1511:1 + +6BB61D34AF2BCCF45A850850BCDE35E55A92BA:5E75:\ +510194C9C9F90D98452FB914F636D5E5297C:2 + +3CC54F5F3EF82C93CE60EB62DC9DF005280DD1:706F52:\ +7FC24D382379A9CD54D53458947CB28E298A1DCC5EB2556F71ACAC1B:3 + +BD3462DC587DFA992AE48BD7643B62A9971928:841D7339:\ +9F6FAFED1F241A1E40ADEAF2AD80:4 + +1235A061FA3867B8E51511D1E672CE141E2FA6:D856787D41:\ +1026B9224FC59706BEADAE58EBD161FD2EAC:5 + +63A22C3C7C5651103648F5CFC9764A7BDE821F:F13096FEED6E:\ +512FBF47D9DA2915:6 + +AA15082F10F25EC4F96DFFE9DC3D80BBA6361B:B637FCADE57896:\ +519B87DB85FBE92FB4070F3BEF6E3D97DF69B66061EB83B4A334E8EEDC0F8E:7 + +775B727CE679B8696171C7BE60FC2E3F4DE516:3431016193616501:\ +453C2549058B063C83E8B85E5CEF3570DF51B7D79B486F4F33:8 + +AB299AD69DC581F13D86562AE2BE8B08015FF8:A624CC363499B1EA64:5569FC:9 + +AE4947624D877916E5B01EDDAB8E4CDC817630:5B908EB5B2A7F115CF57:\ +7FDE51EFB4044017C95E3608F8FB6F:10 + +4F13EB6FBE1FA2FCD7B5B21C9F20980D1986A4:EE73EEE90E35AF2BC3575D:\ +514DBCE520AB34:11 + +41BC094049008CBAE99CAC0BA901D0B2DD15DF:BD859DAE2729A348774146B5:\ +CB6C0544FF8CF74C71E910F2220D54C509DC442CB3:12 + +95751B37945DD9DE515B45927A229AAB40F7D0:FE310AF0913149D53718AC53E5:\ +75318F49A11F42A24AF48267411FDD0831:13 + +FC250F36E5C1365C3EAD122E63F90612DBBDA7:C0107D144E53227EDE5E677A35BE:\ +8A4B5AEA3AC0B2FF777D77B5EFB6E7D8AF:14 + +F6A8A67ACA60F25080100F3F5C928038936E57:A1FCD686295E3DE32C438A8FFD63CE:\ +F8B663768421BA77861F1EBEBF4C8341DC01ED1F7D4B054B7C:15 + +77BF131D53997B1FB2ACE2137E26992B36BF3E:60D0A09FCFDE24AB73F62A7C9F594766:\ +859D1EE9A694865ECC1830C361D24485AC1026:16 + +39CF412177DD47B8E97A4D92D104138CD4E41C:F7D49D2C112F3EE64411F50B264AE15BB4:\ +9CD35F26E8A89C25410B3394A957B781BBD0D190DA:17 + +5C40AF252D0A4F445E638D954993BCB0673281:\ +FDA100D44E2F839C21199A56ACAF57454C21:\ +2DFB810DC9ED5B291754144937E6052666D476D1F5F94C:18 + +2A8B07B082F2A4C95611B20685A4410E90B8D2:\ +A5CCE186AFDB9C0EB664C719DD1A69C1BA6059:\ +320ADFA586F7EBF346646DE9:19 + +BCBD1EFDA490B9D541BA9DF50FE9A451DD0313:\ +2291E19459725562F106F63FE2F81E73BA23F04A:\ +255230A341E671BC31B1:20 + +B361B123993602D0BA62567BF9B81992DB108EAE:\ +A71CB3E9C58E83414D69775CF7127E9C95AF10B7E2:\ +20878A3A703785DE37846086C097619E9823F7FCD2B7B3A9466FA6:21 + +8E7CC0EED8BFF691B370C08FE0DB32D06700B088:\ +25DA6B3027CBBCA4352EFB85D3FCB9060285BC39ECB8:\ +02F3B9155F5CFF08B9F47A2FDC701BA3F08BCDDF21292911D06FC0A5A99B:22 + +041CC7ED27C01A701A0F15269DA6CA6D806B10C3:\ +E3B7F0D721C05663166B43A75F2997F9F029886FC069D0:\ +8E5F4FADE80AF92D495AF5A50C8E:23 + +A7421C0D96D2455E57408C2BF02E86DCEE71B060:\ +46948B1DD4C7977AA7241ABD74A88E7838E575DD34AA9B75:\ +BD2623716653B538C885FA2ED4B0A2:24 + +56DAD2D1AF95F938E073D10A1A779F80BB0F76FE:\ +53B1169FA52AABC427D1C41501B612DF6D726F55DAD9D246E9:\ +D1DA1DEF7BD5C327894B7A992AA7A694664470F642:25 + +4F2E4F77820A686894B90A0AFD0ABA772D0CC6B0:\ +30ED285AE596143BE7998901C2F35530D81CA4DD14E03D17DF2C:\ +062577E22854BAF0E68A51A27644FFB0:26 + +86173BD0F3C5E7052482B53BD8604E197112F3D8:\ +BB3BD1CBFA7889441E930C4B5E8EC7AB00D9612E9D762D42427AD9:\ +12B4E5F24ADC8A:27 + +2B9CE8B0AB3041D6A1803BDD342E6537E40BE305:\ +88F8AFCB8109C7B359B18CCED73A1B09404CC9EABB23695BF353ED9E:\ +517D3D00850F48912B713E653CB4F38703B6A6:28 + +819CB722AA4475D8301A8E24DCD9D82DF2B081F4:\ +83FD6F33AD11819019E086F0683E26D59D57C9E5AF26C81738E44D47A3:\ +56872A31A10E8C:29 + +80F1F9B0D05F41C448E5306E41833918B9E688ED:\ +0C00B5F50565FDD5345C63773D5FCC8B3C8E412DFFF23B95490EFB4E53FA:\ +6175CDE230DF6691F4E8A36B265C53CAD736AD6F34F895D5C6633D66B5:30 + +0AE876A7BB96C24CEFA6ED53CEE7B0A41B8FF7B3:\ +881B99C3E43B1A42F096CF556D3143D5C5DBC4E984D26C5F3075BCB08B73DA::31 + +2212169D33FADC6FF94A3E5E0020587953CF1964:\ +1E1C646C2BFBDC62FA4C81F1D0781F5F269D3F45E5C33CAC8A2640226C8C5D16:\ +FCD5C9637A21E43F3CFF6ECF65B6E2F97933779F101AD6:32 + +# From RFC 2631 + +[X9.42-PRF(KeyWrap.TripleDES)] +000102030405060708090A0B0C0D0E0F10111213:\ +A09661392376F7044D9052A397883246B67F5F1EF63EB5FB::24 + +# Same as above, just numeric OID instead of name +[X9.42-PRF(1.2.840.113549.1.9.16.3.6)] +000102030405060708090A0B0C0D0E0F10111213:\ +A09661392376F7044D9052A397883246B67F5F1EF63EB5FB::24 + +[X9.42-PRF(KeyWrap.RC2)] +000102030405060708090A0B0C0D0E0F10111213:48950C46E0530075403CCE72889604E0:\ +0123456789ABCDEFFEDCBA98765432010123456789ABCDEFFEDCBA9876543201\ +0123456789ABCDEFFEDCBA98765432010123456789ABCDEFFEDCBA9876543201:16 + +# MARKER: S2K Algorithms + +# S2K format: passphrase:output:salt:out_len:iterations + +[OpenPGP-S2K(SHA-1)] +666F6F:0BEEC7B5EA3F0FDBC95D0DD47F3C5BC275DA8A335A8CAA4039FDBC02C01A649C::32:0 +616263:A9993E364706816ABA3E25717850C26C9CD0D89DDD3742EC1A4D2A5B563A2B62::32:0 + +666F6F:DFFE49EEC99E3530FF75A794773E1F8429A46835925DAED4A27FA2957BBD29B5:\ +698619A932D101BE:32:0 + +666F6F:8051BB97BB42199330C9D52383D1B56532FF9BDFB180BD2BD61F24A25265639F:\ +EFB0A8DDE02BAB42:32:65536 + +696C696B65706965:A32F874A4CF95DFAD8359302B395455C:2AE6E5831A717917:16:65536 + +666F6F626172:9B1D52CC0DA89C9D85B91EC84B6780FB:AD8FC3C853BBB225:16:65536 + +717765727479:67CACC2B4B6F1B76E620748C1E777070:3891D354B8C86161:16:0 + +4141414141414141414141414141414141414141414141414141414141414141\ +414141414141414141414141414141414141:080316AFB4E11D98120B29D1070CE749::16:0 + +696C6F766573616B757261:109D161363DF1E97322112F82169911A::16:0 + +[OpenPGP-S2K(MD5)] +666F6F626172:\ +3858F62230AC3C915F300C664312C63F26E4AEBF38BF1BB6AD49BA54BCACD9DB::32:0 + +616263646566:99C8FD9A0516337E7C0F71563D937B09B14F7E7B6CB53FB56B5B8137E189DA20:\ +B89343B95A46FECE:32:65536 + +666F6F:CC364F2BC41FACAD36E0D45E581D61F707BA925C982BEF7E:\ +760566702FEE54C8:24:65536 + +[PBKDF1(MD2)] +71616C7A73656774:7C1991F3F38A09D70CF3B1ACADB70BC6:\ +40CF117C3865E0CF:16:1000 + +766E68617A6A66736978626F6D787175:677500EDA9F0C5E96E0A11F90FB9:\ +3A2484CE5D3E1B4D:14:1 + +66686565746E657162646D7171716E797977696F716A666C6F6976636371756A:\ +91A5B689156B441BF27DD2BDD276:\ +5D838B0F4FA22BFA2157F9083D87F8752E0495BB2113012761EF11B66E87C3CB:14:15 + +736E6279696E6A7075696B7176787867726C6B66:\ +49516935CC9F438BAFA30FF038FB:\ +F22D341361B47E3390107BD973FDC0D3E0BC02A3:14:2 + +[PBKDF1(SHA-1)] +66746C6B6662786474626A62766C6C7662776977:\ +768B277DC970F912DBDD3EDAD48AD2F065D25D:\ +40AC5837560251C275AF5E30A6A3074E57CED38E:19:6 + +786E736F736D6B766867677A7370636E63706F63:\ +4D90E846A4B6AAA02AC548014A00E97E506B2AFB:\ +7008A9DC1B9A81470A2360275C19DAB77F716824:20:6 + +6F74696C71776C756B717473:\ +71ED1A995E693EFCD33155935E800037DA74EA28:\ +CCFC44C09339040E55D3F7F76CA6EF838FDE928717241DEB9AC1A4EF45A27711:20:2001 + +6B7A6E657166666C6274767374686E6663746166:F345FB8FBD880206B650266661F6:\ +8108883FC04A01FEB10661651516425DAD1C93E0:14:10000 + +716B78686C7170656D7868796B6D7975636A626F:\ +2D54DFED0C7EF7D20B0945BA414A:\ +BC8BC53D4604977C3ADB1D19C15E87B77A84C2F6:14:10000 + +[PBKDF2(SHA-1)] +6A79756571677872736367676C707864796B6366:\ +DF6D9D72872404BF73E708CF3B7D:\ +9B56E55328A4C97A250738F8DBA1B992E8A1B508:14:10000 + +61717271737A6E7A76767A67746B73616D6D676F:\ +FA13F40AF1ADE2A30F2FFFD66FC8A659EF95E6388C1682FC0FE4D15A70109517\ +A32942E39C371440:57487813CDD2220DFC485D932A2979EE8769EA8B:40:101 + +6C7465786D666579796C6D6C62727379696B6177:\ +027AFADD48F4BE8DCC4F:ED1F39A0A7F3889AAF7E60743B3BC1CC2C738E60:10:1000 + +6378676E7972636772766C6C796C6F6C736A706F:\ +7C0D009FC91B48CB6D19BAFBFCCFF3E2CCABFE725EAA234E56BDE1D551C132F2:\ +94AC88200743FB0F6AC51BE62166CBEF08D94C15:32:1 + +7871796668727865686965646C6865776E76626A:\ +4661301D3517CA4443A6A607B32B2A63F69996299DF75DB75F1E0B98DD0EB7D8:\ +24A1A50B17D63EE8394B69FC70887F4F94883D68:32:5 + +616E6461716B706A7761627663666E706E6A6B6C:\ +82FB44A521448D5AAC94B5158EAD1E4DCD7363081A747B9F7626752BDA2D:\ +9316C80801623CC2734AF74BEC42CF4DBAA3F6D5:30:100 + +687361767679766F636C6F79757A746C736E6975:\ +F8EC2B0AC817896AC8189D787C6424ED24A6D881436687A4629802C0ECCE:\ +612CC61DF3CF2BDB36E10C4D8C9D73192BDDEE05:30:100 + +6561696D72627A70636F706275736171746B6D77:\ +C9A0B2622F13916036E29E7462E206E8BA5B50CE9212752EB8EA2A4AA7B40A4CC1BF:\ +45248F9D0CEBCB86A18243E76C972A1F3B36772A:34:100 + +67777278707178756D7364736D626D6866686D666463766C63766E677A6B6967:\ +4C9DB7BA24955225D5B845F65EF24EF1B0C6E86F2E39C8DDAA4B8ABD26082D1F\ +350381FADEAEB560DC447AFC68A6B47E6EA1E7412F6CF7B2D82342FCCD11D3B4:\ +A39B76C6EEC8374A11493AD08C246A3E40DFAE5064F4EE3489C273646178:64:1000 + +# MARKER: Encoders/Decoders + +# Format is input:output + +# Kinda silly to hex encode base64 encoded ASCII, but... +[Base64_Encode] +31:4D513D3D +235C91:49317952 +4142634452313236:51554A6A524649784D6A593D +241BB300A3989A620659:4A42757A414B4F596D6D494757513D3D + +31323537374343666671333435337836:\ +4D5449314E7A644451325A6D63544D304E544E344E673D3D + +60E8E5EBB1A5EAC95A01EC7F8796B2DCE471:\ +594F6A6C3637476C36736C614165782F68356179334F5278 + +31346D354F33313333372C31274D754E7354307050346231333A29:\ +4D5452744E55387A4D544D7A4E7977784A303131546E4E554D4842514E4749784D7A6F70 + +[Base64_Decode] +4D513D3D:31 +49317952:235C91 +51554A6A524649784D6A593D:4142634452313236 +4A42757A414B4F596D6D494757513D3D:241BB300A3989A620659 + +4D5449314E7A644451325A6D63544D304E544E344E673D3D:\ +31323537374343666671333435337836 + +594F6A6C3637476C36736C614165782F68356179334F5278:\ +60E8E5EBB1A5EAC95A01EC7F8796B2DCE471 +4D5452744E55387A4D544D7A4E7977784A303131546E4E554D4842514E4749784D7A6F70:\ +31346D354F33313333372C31274D754E7354307050346231333A29 + +# These are actually fairly dangerous, because bzip2 could change the +# compression format somehow and still be compatible with old versions, but not +# output this exact bitstring... +[Bzip_Compression ] +:425A683917724538509000000000 + +54484953204953204120425A49503220544553540A:\ +425A6839314159265359FDAED210000009DE0000104000100032604C1020\ +0021A4D1EA0FD2840D03401E19B4D4B254EE89F177245385090FDAED2100 + +# These are much safer +[Bzip_Decompression ] +425A683917724538509000000000: + +425A6839314159265359FDAED210000009DE0000104000100032604C1020\ +0021A4D1EA0FD2840D03401E19B4D4B254EE89F177245385090FDAED2100:\ +54484953204953204120425A49503220544553540A + +# The stream was flushed every 10 bytes +425A68393141592653598BB9F5F700000A7FFFC021D1CE7DF41018B66921CD80\ +681D23A08C880C91110BE808084F8353AA822820007439900068001A00000000\ +03201A6D2064D82870000D3201A34C469E9000001A6269A7A8623200D1A63D70\ +DF4E435801FAA9C3CE54096593D38853A1E5A8DDD43585C763E592CF011C0D5A\ +956B48C7EC1D405F5B90DF441E168AA02C6D25E179EC44D02A2691295F38ACE1\ +201DE855B2B543D8944F805514C8D6971908389F4520A130AA848329C6BEDC53\ +3F8BB9229C284845DCFAFB80:\ +2328B92CB5578B4B87D7E07F7457E0DE93268B5FD5720F484558D057A600E9E6\ +3B9B5B5669179FCB2CA6415EDDD709223F201CF527E55C421BF916689C207E48\ +18BB3AE0AA29D3C31D12268FB51044A673816B218F49EF1B51AED3231CED7DE7\ +5FF5B532EB8B1BFB8CA2242AF9E9E226D4D629796B76749BD4EFB6B80E4EB7B3 + +# Two concatenated streams (same stream, doubled) +425A68393141592653592ED49B3D000011FF00001000204004100032604C1030\ +44200021A6A06431014D323131310BD3A516096617117C90B42C26B1292F659F\ +254753C2DF1772453850902ED49B3D425A68393141592653592ED49B3D000011\ +FF00001000204004100032604C103044200021A6A06431014D323131310BD3A5\ +16096617117C90B42C26B1292F659F254753C2DF1772453850902ED49B3D:\ +54484953204953204120425A49503220544553540A0A41414141414141414141\ +414141414141414141414141414141414141410A0A0A426C61682C20626C6168\ +2C20626C61680A0A54484953204953204120425A49503220544553540A0A4141\ +4141414141414141414141414141414141414141414141414141410A0A0A426C\ +61682C20626C61682C20626C61680A0A + +# Two concatenated streams (different streams) +425A683931415926535980A46FE20000FB5F800010507FFFF07FFFDDE03FFFFF\ +E040031CCC62B5D74143534134C9A9EA683D53D1A4F53269E8CA7A4F51A66A03\ +4343404553FF51A4D31354F328C286418464C020C8D007A9A19E9A9EA8F48034\ +1E89A64C8C43401A1A6834C234C25348200202646D29EA0D0001A3D460D4D016\ +EAB324536379286DA9D72DCE3E1DACF47749AF69757E5E7F6589071D076F7FDE\ +9E3227D8EEAC7D2ADB6C98D82F0FE534F76F9B1D2A498B440E921B0B47D66809\ +2E6AB8DCA972C499399C923849148B4343D2AF95D2FEA63C00953DB38E47A94F\ +993CAC4B48E5459448C69A906B75779D00B5D25D02ECF3E955F77AF7D31CCACE\ +A6D766C9BD447AA85AD393BAB5343CF7BED96AE2F1A72DF6FC512430CBD13371\ +1D442490439C3BDA77C95341F5EEB3269B62608CFAEDEB16968AE0E1C7753E1A\ +4B6DC7ACF5670E4B362858963DA8888EB483B82630B6442AE6C2460FBB95549B\ +CCDAF8408C74F1BE7984FD643E90E35FBE0EDEC19C38B32699CEEC4AF1BB21D2\ +B2E42DEB44718B63CACBA7C9520882C457A828469A102444386BD54E724C3AAB\ +6BF6DCF24C969154AC2D704AB4D123280D1C2646726A2F69EF8C10CB5412918C\ +80EF05771E58BE5827CFB59C95A9068FD0F6021BE2418A8977A09CD734FD5871\ +2F672E76F06F6C612C1C85C4E4E8F432886D8B46075B92428A02519CCDD2C0A0\ +CBC1C1B28A3FAD08281080BA8981FD84B2C5138C44987953B3357F39E35DFAA2\ +D0B582B90F136B2C6DBCC1E7C227C744A85B1672F818E332EFA32AA24B158F24\ +204A1D310B264CE35D24021852F03A6D6B24024046744FB7BCDA68835129EFCB\ +40A4350B66487BB3212310E5AE7330F85643470D99C0D04F9F2A922FA5028621\ +F220B87E422B866CD7A13042D2B564316000ED9504B71D21329B02DB17839B94\ +70D6A6C45EDA5A96A26EC4EE0CED46CCBA3C532CCE19AD2F131AF59A74F56E28\ +41912A2AE079CC91BF7D3ADB3F3C8F733692EC3407388C79E31DD81C239356AE\ +1C673CC6768D429E376781B711EB2CF2D6E488D6419C145B574736BBE8578E25\ +B2125659973504559442A7A2D7C37C244C7E6AA709631308D78C3FD285B08595\ +D32154402DA6254F31403C4B32444507CA1C32A7FBAA86204E29D1DADC046970\ +87253D38C21131CF44661B046A59A1563495044FF8BB9229C2848405237F10\ +425A68393141592653598E46405D00011CDF8008D060EFF71CBFEFDFB0BFFFFF\ +F05004A5AF5C689D74340EB4786A653654F530D4DA991EAA7A9FA8C6A9E126D3\ +534F2469EA6D320C5004553FD3234464D32A7A9B29B536A1900001A06800D01A\ +A7869094F49E840DA80D0000000680007302626830993264C8C2609A69918980\ +218069A1009A9A9E22609A9B530A7A8F53D4CD400D1A347A81EA4DD64CF7FBEE\ +A25B21C0CDA99F572545B2436738C98D46F76CD222194C4E3130CCA4C121330D\ +1BCBD8E1C17D5124E37CC31EC74364E6E0A7CBB3CDC38FBDB2CE3E54E744C337\ +86924DA1B840AC53FAC8D9A4AF92C2671A2FB4C097C22ABF7119FA4D758D60D3\ +5186FEE4CE23643BD62FE490BC123E9561F1D092729E9330CD7C8B612C4381A8\ +CF061D2786C5D544421539BDCA41949E820E7E6B22B757534F25B5B56186B66A\ +C0BE8CAD5C796BBB5624C4B7952CE7AD678D5B5D42CC8360AAD4812E371DCD9A\ +285A51A520F04181EAC5474D793B1CC9C908C25298E50E3456D8C155D94D8C0A\ +2951723DB9DE8F70FB65DBE79EA0FADD0B2BD0DB70935D6E603F1881803B808C\ +659C50F6B5E1292C6323799426F06C759AE61A00B375DFE43EA298E9AACE4F1A\ +48B3EECCD57EFF4BABDA432BCB9F7EB68B4925E7CF8A0EC53D60FA1485ED0BE7\ +F1F4F927BEF419AC8593230DEEC1C823637C078F45E82C407A56CEC38FA30EF4\ +308D37020852624B3A29072212825D954810915F2508CA6515A03269515F46E9\ +D1BEE330901B3BCB6A39B888AA21DDFD5640B417C1502CE17E8BFB683B5DE8D3\ +C78A4A483203260399BB70136F9C127C0A8403EA9A0407E6F4BEB40BCCE0E379\ +1EF0407F4F9292C4F6D78BBD23B360E39447DCA5E52316108A05F81934A26509\ +0D155B7B3081560A412C1772603B649511C31986AC033342E5DC2CBB254E8D85\ +4D08D2550C0E62110F282C21C60B1D9D0A23515259DACAFA59BF5A9EF8DA354E\ +129B880F76A9C542BA8EA2F91A858645E969E0CCAF090083286CC714CE4234D5\ +1758A2301076C932813905A18856FE5D311C8D00D226931EEECBB5CD863A81EB\ +BAD43476102E47614D8822503F274AF08D038BAF65B1E671E73A989FBFAE4106\ +F2F0451EC29C8A1218189603C03E207370B0239861B99F6354F2E4B095C25C84\ +7DBBB98D08EA3A8C923515F541F30F07B4927DAA8313DF01D00DAEBE6228BB48\ +F6851D2898F0B4040AD354213349D096B8AADB92B887533A32174C5BA7A3CB46\ +F5A2FAC580C26A987508D9C4AE2EF2D5D04AD8F72A52A9DE470554B41F0D0030\ +48C1C3C962ED158409287B9560E8CA5CB3396DC43977DAE8A0025193798220B5\ +AA8CF250B26463F59E40085714F16E29D2C35E027974D6834D12F82500C45977\ +51FAEF7B883482EE04A9F2194B6CA60391A6099E6899E0821E6BC2795B7D5808\ +E043A30D9613F39BC26AAA3E81D3598248DBC3049389D7AB4C5A974502AAA402\ +47459D9C90CB9FF33C25051ABBD9C4D8754F70902C942E49BA94389C6C1A8E66\ +D7519D75DFF9A3B11CFD6F8A365F0B87A9EEDB5262DC155922CC580855531CEC\ +C80C8B46418C46520A44C8125A4484DCD26AB2A8862AB81672293CFA3186666A\ +E52801C200D1E0BE39F11E5315409520A10A568AD8459029191AE9EDC5A93A88\ +BA2E16A2EBF15847D58535A266376BBE082891ED6413F54D62093D71CB10F01F\ +932886265650E6066A7D9EAD0238EA014DC86BE01A6F9C07879BD33FC36F7000\ +CCC5DC914E14242391901740:\ +4F70656E434C2C20612043727970746F6772617068696320436C617373204C69\ +627261727920696E20432B2B0A56657273696F6E20302E372E333A204A756E65\ +20382C20323030310A0A2A4E4F54452A3A204F70656E434C2069732063757272\ +656E746C7920696E206561726C7920626574612E20546875732C20796F757220\ +636F6D6D656E74732061626F7574204F70656E434C0A286D6F73742065737065\ +6369616C6C7920746865206170706C69636174696F6E20696E74657266616365\ +2920617265206E65656465642C20616E6420796F757220636F6D6D656E747320\ +63616E0A6861766520612064697265637420656666656374206F6E20686F7720\ +4F70656E434C206368616E67657320696E20746865206675747572652E0A0A4F\ +70656E434C2061696D7320746F206265206120706F727461626C652C20656173\ +7920746F20757365206C69627261727920666F7220706572666F726D696E6720\ +636F6D6D6F6E0A63727970746F67726170686963207461736B732E204F70656E\ +434C2063757272656E746C7920696E636C756465733A0A0A426C6F636B204369\ +70686572733A20426C6F77666973682C20434153543235362C2043415354352C\ +2043532D4369706865722C204445532C20444553582C20547269706C65444553\ +2C20474F53542C0A202020494445412C204C7562792D5261636B6F66662C204D\ +49535459312C205243322C205243352C205243362C2052696A6E6461656C2C20\ +53414645522D534B3132382C2053657270656E742C0A202020534841524B2C20\ +536B69706A61636B2C205371756172652C205445412C2054687265655761792C\ +2054776F666973682C20585445410A436970686572204D6F6465733A20434243\ +20772F2050616464696E672C204346422C204F46422C20616E6420436F756E74\ +65720A53747265616D20436970686572733A2049534141432C20415243342C20\ +5345414C0A486173682046756E6374696F6E733A20484156414C2C204D44322C\ +204D44342C204D44352C20524950452D4D443132382C20524950452D4D443136\ +302C205348412D312C20534841322D3235362C0A202020534841322D3531322C\ +2054696765720A4D4143733A20454D41432C20484D41432C204D44354D41430A\ +4D6973633A2041646C657233322C2043524332342C2043524333322C2052616E\ +64706F6F6C2C2058392E313720524E470A0A466F7220696E666F726D6174696F\ +6E206F6E206275696C64696E67204F70656E434C2C2072656164207468652073\ +656374696F6E20224275696C64696E6720746865204C6962726172792220696E\ +0A646F632F6F70656E636C2E70732E205265616420646F632F72656C6E6F7465\ +732E74787420666F72206E6F7465732072656C6174656420746F206973737565\ +7320737065636966696320746F0A746869732072656C656173652E2054686520\ +6C6963656E736520697320696E20646F632F6C6963656E73652E7478742E0A0A\ +436865636B20687474703A2F2F6F70656E636C2E736F75726365666F7267652E\ +6E657420666F72207570646174657320616E64206E65772076657273696F6E73\ +20286F722069662C20686F72726F720A6F6620686F72726F72732C20796F7520\ +66696E64206120627567292E20496620796F75206861766520616E7920717565\ +7374696F6E732C20636F6D6D656E74732C206F722072657175657374732C0A73\ +656E6420656D61696C2E0A0A4A61636B204C6C6F796420286C6C6F7964406163\ +6D2E6A68752E656475290A0A4D5553540A2D2D2D2D2D2D2D2D2D2D2D0A492074\ +68696E6B2074686520667470206C696E6B20696E206F70656E636C2E74657820\ +69732077726F6E670A0A427A6970325F4465636F6D7072657373207365676661\ +756C7473206F6E2062616420696E707574202D2069732074686174207573206F\ +7220746865206C6962726172793F0A0A53484F554C440A2D2D2D2D2D2D2D2D2D\ +2D2D0A546865207370656366696C652073686F756C6420666967757265206F75\ +74207768617420657874656E73696F6E73206172650A617661696C61626C6520\ +286261736564206F6E204F532920616E6420636F6D70696C65207468656D2069\ +6E2E0A0A73656371756575652E682073686F756C642070726F6261626C79206E\ +6F7420626520696E7374616C6C65642061732069742069732061207072697661\ +7465206865616465720A0A41646420612067656F6D65746963206D65616E2074\ +6F207468652062656E63686D61726B20636F64652C20666F7220636F6D706172\ +696E67206265747765656E0A646966666572656E742073797374656D7320286D\ +61796265206A75737420616E206F766572616C6C20617665726167653F292E0A\ +0A4D616B6520612073637269707420746F2068616E646C6520616C6C20746865\ +2072656C656173652073747566660A20286D616B652054475A2F54425A202872\ +6F6F74206F776E6572292C206D616B65206261645F6C69622E6469662C207369\ +676E20616C6C2C206D616B65205352504D2C0A2020207369676E20746861742C\ +20706F737369626C7920736F6D657468696E6720746F206D616B652052504D73\ +206F6E2061206C6F740A2020206F6620626F78656E20696E20706172656C6C65\ +6C2C20746F6F292E0A0A54657374206F6E2043796777696E20616E642042654F\ +53350A0A54727920746F2067657420612056432B2B2F4E4D414B4520706F7274\ +20676F696E670A0A4D6F7265206578616D706C657320286120676F6F64206372\ +7970746F206F6E6520657370656369616C6C792C206572726F7220636865636B\ +696E672C206D6163732C20616E64207468650A77686F6C65207363686D657265\ +292E20577269746520757020736F6D657468696E672073696D696C6961722069\ +6E204F70656E53534C2C20616E6420676574207468656D20746F20776F726B0A\ +746F6765746865722E0A0A7A6C69622F627A6970323A204D756C7469706C6520\ +73747265616D732E205741495421212120446F657320697420616C7265616479\ +3F3F213F213F0A627A6970323A2053686F756C6420737570706F727420666C75\ +7368696E672E0A0A5A6C69622F477A69702066696C74657273206E6F74206576\ +656E20696D706C656D656E7465640A0A416C6C6F6361746520616E64206D6C6F\ +636B206120706F6F6C206F66206D656D6F727920616E64207265706561647465\ +646C792070617373206974206F75742E20486F77206C617267653F0A616E6420\ +484F573F0A0A576861742063616E20626520646F6E6520626574746572207769\ +7468204F532F43505520646570656E64616E7420636F64653F0A20202074696D\ +6572732C20656E74726F707920736F757263652C206D6C6F636B2C2066696C65\ +68616E646C6520737570706F727420696E20506970652F657463200A0A444553\ +2049502F46500A0A506970652073686F756C6420737570706F72742027726561\ +6C2720616C7465726E617465206F75747075742073747566662C206E6F74206A\ +757374207468650A6861636B207573656420666F72204269744275636B657420\ +2D206D617962652E204973207468657265206120646563656E74207761792074\ +6F206A7573740A706C756720697420696E2C20696E73746561643F0A0A446F63\ +756D656E742074686520757365722D76697369626C65206D6F64756C65730A0A\ +52657772697465207468652070617273657220696E2076616C69646174652E63\ +707020286D6F726520666C65786962696C697479290A0A436F6E73747563746F\ +72732073686F756C64206F7074696F6E616C6C792074616B65206B6579732028\ +3F290A0A4D6F726520636865636B7320666F723A0A2020427A69703220286E6F\ +6E652121290A202043532D43697068657220284E4553534945290A2020534541\ +4C202849424D3F290A0A53686F756C6420757365207265706C6163652028666F\ +722048544D4C2062656E636861726B20616E6420696E0A76616C696461746529\ +2E205361646C7920697427732062726F6B656E20696E204B41490A0A4E657720\ +53796D20416C676F726974686D730A2D2D2D2D2D2D2D0A4D415243340A50616E\ +616D61203C2D2043616E2075736520696E2052616E64706F6F6C0A0A4D415942\ +452053484F554C440A2D2D2D2D2D2D2D2D2D2D2D2D0A46697820495341414320\ +6B6579207363686564756C653F20556E74696C20492073656520736F6D657468\ +696E672066696E616C20746865726520646F65736E2774207365656D206D7563\ +680A706F696E742E0A0A466978206F766572666C6F7720697373756573207769\ +74682075706461746520696E207468652068617368696E6720636F64652E2050\ +726574747920756E6C696B656C7920746F20657665720A61637475616C6C7920\ +68617070656E2074686F7567682E2E2E2075706461746528782C31293B207570\ +6461746528792C30784646464646464629200A446F6573206D616B65696E6720\ +706F736974696F6E207536346269742073746F7020746869733F0A0A + +[Zlib_Compression ] +416263416263414141626262436341626343666F6F6261720A0A666F6F206261\ +722062617A20717575780A0A48656C6C6F20576F726C64210A0A416972277320\ +224D6F6F6E20536166617269222069732061207265616C6C7920677265617420\ +43442E0A:\ +78DA15863B0E83400C057B9FE241932E77B0968226550A6A9B9F56B2B0628214\ +387D8C34A319D6911366552DF796C55D2588B2C8492F7C8EE347D4CF668EC1C3\ +A686886B3C76B42FF70D6F59246A8BBA4310B3989D58B35F94EE497F70C02021 + +4141414141414141414141414141414141414141414141414141414141414141\ +414141414141414141410A:\ +78DA73742416700100F0260AB5 + +[Zlib_Decompression ] +78DA8DCAB10A83301405D0FD7DC5C5C5C90E82D08E199D5B704EF49604352979\ +B1FAF9825FE0998F317789989FE781CF1E62ADA8DE5C38164E30AB0B8C0543CA\ +B3E2D935AFB642504991485F144F386AC1F5738A61845DDCB62AFAFA4F78DA3C\ +3D444ECBD82A0278DA4BCBCF57484A2C02E22A85C2D2D20A85B4FC7C103FAD14\ +425628240171597E4E49517E1E17008A0710D3:\ +4141414141414141414141414141414141414141414141414141414141414141\ +414141414141414141410A0A4170686578205477696E2773202253656C656374\ +656420416D6269656E7420576F726B732038352D3932222069730A6F6E65206F\ +6620746865206265737420656C656374726F6E696320616C62756D7320492776\ +652068656172642E0A0A666F6F206261722062617A207175757820666F6F6261\ +72206675626172206675782062757820766F6C74726F6E0A + +78DA734C4A76042247C7A4A4246710D3392D3F3F29B1880B006C380868:\ +416263416263414141626262436341626343666F6F6261720A + +78DA0180007FFFDA2EE53C61F3EF2147C60D6F20A1B470782B538BF848E85E8C\ +CDD05AAF9BB1A895B96FC5144435AAE4D7E7428FEFACADF543EDFFCCE1083414\ +8B043F0FD65ED45B19CCBDDA923C60A6492C98921798B4711F6A3EB4651157B5\ +213DEFF8ED8292154B6B8490C8B536F1D6925B3BCEF1C4334F10C0FE607D9DEB\ +5F0967F5AC1D07FF634251:\ +DA2EE53C61F3EF2147C60D6F20A1B470782B538BF848E85E8CCDD05AAF9BB1A8\ +95B96FC5144435AAE4D7E7428FEFACADF543EDFFCCE10834148B043F0FD65ED4\ +5B19CCBDDA923C60A6492C98921798B4711F6A3EB4651157B5213DEFF8ED8292\ +154B6B8490C8B536F1D6925B3BCEF1C4334F10C0FE607D9DEB5F0967F5AC1D07 + +78DA73742416700100F0260AB5:\ +4141414141414141414141414141414141414141414141414141414141414141\ +414141414141414141410A + +# Same as the last one, doubled up +78DA73742416700100F0260AB578DA73742416700100F0260AB5:\ +4141414141414141414141414141414141414141414141414141414141414141\ +414141414141414141410A414141414141414141414141414141414141414141\ +4141414141414141414141414141414141414141410A + +789C15863B0E83400C057B9FE241932E77B0968226550A6A9B9F56B2B0628214\ +387D8C34A319D6911366552DF796C55D2588B2C8492F7C8EE347D4CF668EC1C3\ +A686886B3C76B42FF70D6F59246A8BBA4310B3989D58B35F94EE497F70C02021:\ +416263416263414141626262436341626343666F6F6261720A0A666F6F206261\ +722062617A20717575780A0A48656C6C6F20576F726C64210A0A416972277320\ +224D6F6F6E20536166617269222069732061207265616C6C7920677265617420\ +43442E0A + +# The stream was flushed every 1 byte +78DA0A06000000FFFFBA02000000FFFFE206000000FFFFDA00000000FFFF1202\ +000000FFFFFA01000000FFFF9200000000FFFF8A03000000FFFFF205000000FF\ +FFAA03000000FFFF3A0E000000FFFF0A02000000FFFF6A02000000FFFF3A0D00\ +0000FFFF9A09000000FFFF5A09000000FFFF9203000000FFFFE202000000FFFF\ +5A04000000FFFF3A07000000FFFFE202000000FFFF3A06000000FFFFAA010000\ +00FFFFD205000000FFFFCA05000000FFFF3A0C000000FFFF3A0E000000FFFF2A\ +07000000FFFF7A07000000FFFF6A05000000FFFF3A0F000000FFFF7A0D000000\ +FFFF5A09000000FFFF7207000000FFFF0A07000000FFFF7206000000FFFF5201\ +000000FFFF5204000000FFFFFA0F000000FFFFBA05000000FFFFE202000000FF\ +FF5A0D000000FFFFDA02000000FFFF1206000000FFFF7205000000FFFF920000\ +0000FFFF1206000000FFFFAA04000000FFFFDA08000000FFFFEA04000000FFFF\ +FA0D000000FFFF1206000000FFFFEA04000000FFFF6A02000000FFFF32070000\ +00FFFF2A02000000FFFFAA04000000FFFFFA06000000FFFFCA05000000FFFF7A\ +0F000000FFFF9A06000000FFFF5A03000000FFFF3A0F000000FFFF9A08000000\ +FFFF7A09000000FFFF3201000000FFFF6A06000000FFFFFA01000000FFFFF202\ +000000FFFF9A09000000FFFFEA06000000FFFF9A07000000FFFFAA04000000FF\ +FF4A00000000FFFF0A01000000FFFF3A07000000FFFFD204000000FFFF3A0700\ +0000FFFF3203000000FFFF3A08000000FFFFDA02000000FFFFDA05000000FFFF\ +FA0C000000FFFF5A0C000000FFFF5200000000FFFF3A0F000000FFFFEA010000\ +00FFFF3207000000FFFF3201000000FFFF6203000000FFFF7201000000FFFFE2\ +04000000FFFFF204000000FFFFB205000000FFFF5A01000000FFFF6A00000000\ +FFFFD201000000FFFF9200000000FFFFAA04000000FFFF8A03000000FFFFDA08\ +000000FFFF8A01000000FFFFDA0E000000FFFFE206000000FFFF6205000000FF\ +FF9A0F000000FFFF4A05000000FFFF6A07000000FFFF5A0C000000FFFFB20000\ +0000FFFF0A04000000FFFFCA07000000FFFFDA0C000000FFFF1207000000FFFF\ +9A05000000FFFFDA0E000000FFFF9A0D000000FFFF7A01000000FFFFD2000000\ +00FFFFB202000000FFFFFA06000000FFFF5A00000000FFFFFA04000000FFFFD2\ +02000000FFFF3A0C000000FFFF6A01000000FFFF0A02000000FFFF7A0A000000\ +FFFF0300D0883EB5:\ +53D40BB012F8185E4D7EC75282CB99A91E0AA2CE0AC67C2D6DC3C777EE85CFEB\ +A94757432421FFDA0AABB41345181379B189FB138982377279F66DEF96ACCF91\ +E93483F84A998B9E796054CE29CE36C1B4BAF3A320CF8C3734064409493DA880\ +2C18795EB15CB70B059F6587A338516FB3179AB79BE8283AF6A0F22AC38452E5 + +# The stream was flushed every 10 bytes +78DA0ABEC2BD41E887449C6F1D000000FFFF3A1ED4747AE64A39AE45E7000000\ +00FFFFE23A56A39B7BF878F9BB5600000000FFFF3AFF7AA57BB8B38AE2FF5B00\ +000000FFFFE25ABD45D85542B8726327000000FFFFFA2DDCD9645E54F92DF73D\ +000000FFFF9AB6E6FCC49726CD3FBC6602000000FFFFEA9E579910724EF39CD9\ +4100000000FFFFDAB2EBF36285F33DE6266C00000000FFFF72E1F4B45DD1A023\ +511907000000FFFFDA18B39D9B757E6AFB620B00000000FFFF0ACCDF2C3E6BFB\ +EC171A5600000000FFFFFAB6E093D6E196A0A700000000FFFF0300D0883EB5:\ +53D40BB012F8185E4D7EC75282CB99A91E0AA2CE0AC67C2D6DC3C777EE85CFEB\ +A94757432421FFDA0AABB41345181379B189FB138982377279F66DEF96ACCF91\ +E93483F84A998B9E796054CE29CE36C1B4BAF3A320CF8C3734064409493DA880\ +2C18795EB15CB70B059F6587A338516FB3179AB79BE8283AF6A0F22AC38452E5 + +# The stream was flushed every 100 bytes +78DA0064009BFF53D40BB012F8185E4D7EC75282CB99A91E0AA2CE0AC67C2D6D\ +C3C777EE85CFEBA94757432421FFDA0AABB41345181379B189FB138982377279\ +F66DEF96ACCF91E93483F84A998B9E796054CE29CE36C1B4BAF3A320CF8C3734\ +064409493DA8802C18795E000000FFFFDA18B39D9B757E6AFB628BC0FCCDE2B3\ +B6CF7EA161F56DC127ADC32D414F01000000FFFF0300D0883EB5:\ +53D40BB012F8185E4D7EC75282CB99A91E0AA2CE0AC67C2D6DC3C777EE85CFEB\ +A94757432421FFDA0AABB41345181379B189FB138982377279F66DEF96ACCF91\ +E93483F84A998B9E796054CE29CE36C1B4BAF3A320CF8C3734064409493DA880\ +2C18795EB15CB70B059F6587A338516FB3179AB79BE8283AF6A0F22AC38452E5 + +# MARKER: Random Number Generators + +[X9.31-RNG(AES-128)] +00000000000000000000000000000000:CF08AD39D7DA4FCDBE158347EE3752A3:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +80000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BA + +00000000000000000000000000000000:07BDFB5F94D0CB20F668161CE7E25E36:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +C0000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BB + +00000000000000000000000000000000:81A997CAAA8EE7403D03A8F0AA6A588C:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +E0000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BC + +00000000000000000000000000000000:B00B42011B37494912AA2DE456FE6284:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +F0000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BD + +00000000000000000000000000000000:D42AA72455C3AE5AD634A5A4B3D577D2:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +F8000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BE + +00000000000000000000000000000000:0D06CB87B99641C38A5411EC3D273E70:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FC000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BF + +00000000000000000000000000000000:459E5E2D6976A5B34FD18926EE1E0BB7:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FE000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C0 + +00000000000000000000000000000000:53F2D091AD47E858555371AC9BE9F3DA:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FF000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C1 + +00000000000000000000000000000000:1A72444D745503F63B340E0F294726DC:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FF800000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C2 + +00000000000000000000000000000000:6FA57C78F09768AEA09ABB7DC5EA2944:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFC00000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C3 + +00000000000000000000000000000000:6E549FCCD3BE7B6B70B317BC04B5AB01:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFE00000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C4 + +00000000000000000000000000000000:7FF7C3F80E9A7C323B822FA436D6AA2F:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFF00000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C5 + +00000000000000000000000000000000:52FF54A163E97610EAF318E7EE7CEC7E:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFF80000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C6 + +00000000000000000000000000000000:4FF5C162147653F594105D480D9F24F7:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFC0000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C7 + +00000000000000000000000000000000:1F863D1EA9EA0E1D741D195249B6AF21:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFE0000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C8 + +00000000000000000000000000000000:A87313E2771F16B842DB27D3E55AB0B0:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFF0000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C9 + +00000000000000000000000000000000:A45BBF6E2ED76655119273112AFE1C6A:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFF8000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CA + +00000000000000000000000000000000:E135FBD5BE6CB13B0A5A76696BCF46F6:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFC000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CB + +00000000000000000000000000000000:5A0601F625C622CC97D6CAE9BA0AB6BB:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFE000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CC + +00000000000000000000000000000000:A9662449F9AC50293766DEC60334B8F0:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFF000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CD + +00000000000000000000000000000000:F80A41023F9E350E1D2F86DB10CBB329:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFF800000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CE + +00000000000000000000000000000000:334EB3E404DE9F452C647C05EE09E3E6:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFC00000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CF + +00000000000000000000000000000000:5B2C202C018A5E482D5035B18905BF46:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFE00000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D0 + +00000000000000000000000000000000:9E9E63D29CFB4757FDDEC2B35147D830:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFF00000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D1 + +00000000000000000000000000000000:EAAC43B87260BC73BFFDFABF5BCF94A9:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFF80000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D2 + +00000000000000000000000000000000:4B378D2FF53B5FF913AA2064D04285D5:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFC0000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D3 + +00000000000000000000000000000000:DBC25FE1203EA0E64F1D5C2E2F056F87:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFE0000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D4 + +00000000000000000000000000000000:D3C96C9C5905DC56A292A7A98AAC9234:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFF0000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D5 + +00000000000000000000000000000000:0A9223570A1288EB47595D6D18994353:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFF8000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D6 + +00000000000000000000000000000000:E43B8F94C2B557259920C10A51A38543:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFC000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D7 + +00000000000000000000000000000000:9B86C73D371FDAD1432065F9EB6BB6D2:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFE000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D8 + +00000000000000000000000000000000:13F949FF373A58947D8C6543FEB81F93:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFF000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D9 + +00000000000000000000000000000000:2F7D996CB269EDC9B7902FF6D061C302:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFF800000000000000000000000EB8DE39CF261EE2C7389B748F8B642DA + +00000000000000000000000000000000:801AF9A32F49A1F3A43DBB22DB281DFC:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFC00000000000000000000000EB8DE39CF261EE2C7389B748F8B642DB + +00000000000000000000000000000000:8914E2CE1F46B13624AB93FDE9104214:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFE00000000000000000000000EB8DE39CF261EE2C7389B748F8B642DC + +00000000000000000000000000000000:C1D223A2A1785EF3CE6128333DD95347:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFF00000000000000000000000EB8DE39CF261EE2C7389B748F8B642DD + +00000000000000000000000000000000:538FEEC081411A95767AA722BCFB8C0E:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFF80000000000000000000000EB8DE39CF261EE2C7389B748F8B642DE + +00000000000000000000000000000000:0CCDCCA45FF772D0D02F53D823BB4C9E:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFC0000000000000000000000EB8DE39CF261EE2C7389B748F8B642DF + +00000000000000000000000000000000:550B87DA4C940750ABB829E43522F4D7:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFE0000000000000000000000EB8DE39CF261EE2C7389B748F8B642E0 + +00000000000000000000000000000000:3E17DE96FFF84D276E8156ADC9E35007:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFF0000000000000000000000EB8DE39CF261EE2C7389B748F8B642E1 + +00000000000000000000000000000000:06F0855A2F6CE7DFF53F59A6994017AE:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFF8000000000000000000000EB8DE39CF261EE2C7389B748F8B642E2 + +00000000000000000000000000000000:741FA68C1FEF02AF6DFCE803379AF7B8:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFC000000000000000000000EB8DE39CF261EE2C7389B748F8B642E3 + +00000000000000000000000000000000:A7F64667398AECDEC34481265FE59235:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFE000000000000000000000EB8DE39CF261EE2C7389B748F8B642E4 + +00000000000000000000000000000000:F19F46D46822951708F4E194F4960A56:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFF000000000000000000000EB8DE39CF261EE2C7389B748F8B642E5 + +00000000000000000000000000000000:6E7AF2F730E9CF4CCA2E69D5067DDC76:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFF800000000000000000000EB8DE39CF261EE2C7389B748F8B642E6 + +00000000000000000000000000000000:CA15A95DFB686938D97D804298D094AA:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFC00000000000000000000EB8DE39CF261EE2C7389B748F8B642E7 + +00000000000000000000000000000000:F76DAEB0ED23167614294AC2F8E9EE9A:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFE00000000000000000000EB8DE39CF261EE2C7389B748F8B642E8 + +00000000000000000000000000000000:C66A4B38050953805598F4EAF203CDE4:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFF00000000000000000000EB8DE39CF261EE2C7389B748F8B642E9 + +00000000000000000000000000000000:76A726ED76276D5E7119AF0CCAED854A:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFF80000000000000000000EB8DE39CF261EE2C7389B748F8B642EA + +00000000000000000000000000000000:EB8FE9FF9A053DD2F132B11F17F53D78:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFC0000000000000000000EB8DE39CF261EE2C7389B748F8B642EB + +00000000000000000000000000000000:A6C5E4E13C36E80E1BBB046E6377D290:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFE0000000000000000000EB8DE39CF261EE2C7389B748F8B642EC + +00000000000000000000000000000000:75B476973CF532F655B8BF80CB6AC2A3:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFF0000000000000000000EB8DE39CF261EE2C7389B748F8B642ED + +00000000000000000000000000000000:3AC698CFC1EF3ED72C26CAF5347DF997:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFF8000000000000000000EB8DE39CF261EE2C7389B748F8B642EE + +00000000000000000000000000000000:167ECAE8C6F793FEB00A69E3A9FAF332:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFC000000000000000000EB8DE39CF261EE2C7389B748F8B642EF + +00000000000000000000000000000000:8F2906AF93A28FFFBFD83D5D7E6D7F72:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFE000000000000000000EB8DE39CF261EE2C7389B748F8B642F0 + +00000000000000000000000000000000:5BBA7C625C23F69354A61CCF2289A1B3:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFF000000000000000000EB8DE39CF261EE2C7389B748F8B642F1 + +00000000000000000000000000000000:0083A3EC21348F22B0039759AE762A2F:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFF800000000000000000EB8DE39CF261EE2C7389B748F8B642F2 + +00000000000000000000000000000000:5E2864DD971DB13227F06535D52C24AE:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFC00000000000000000EB8DE39CF261EE2C7389B748F8B642F3 + +00000000000000000000000000000000:D5792243D3B9BD5C7299151685192BBA:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFE00000000000000000EB8DE39CF261EE2C7389B748F8B642F4 + +00000000000000000000000000000000:7B26CD6C3468209850FDF7F67448FAB7:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFF00000000000000000EB8DE39CF261EE2C7389B748F8B642F5 + +00000000000000000000000000000000:717586F8B816B273A691D3379005301E:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFF80000000000000000EB8DE39CF261EE2C7389B748F8B642F6 + +00000000000000000000000000000000:33D8F8DDF2A5E97E9CB1C032735BEF21:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFC0000000000000000EB8DE39CF261EE2C7389B748F8B642F7 + +00000000000000000000000000000000:B277E4BA071293C54D84A29637273B04:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFE0000000000000000EB8DE39CF261EE2C7389B748F8B642F8 + +00000000000000000000000000000000:FBD6F5662D222FC9C55332A60F747879:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFF0000000000000000EB8DE39CF261EE2C7389B748F8B642F9 + +00000000000000000000000000000000:88FF65F58F6F4BF35DB846BB2132DEC6:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFF8000000000000000EB8DE39CF261EE2C7389B748F8B642FA + +00000000000000000000000000000000:BE12ADEDECB8DCFF2723E1D5F0D9C753:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFC000000000000000EB8DE39CF261EE2C7389B748F8B642FB + +00000000000000000000000000000000:5A368FCCC787680145BBFBDA64BE16C6:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFE000000000000000EB8DE39CF261EE2C7389B748F8B642FC + +00000000000000000000000000000000:A804DC10C6223194AE4310D7C628DBAF:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFF000000000000000EB8DE39CF261EE2C7389B748F8B642FD + +00000000000000000000000000000000:1DE5494C7B609ABD1406FB318B572DE7:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFF800000000000000EB8DE39CF261EE2C7389B748F8B642FE + +00000000000000000000000000000000:78566AA937E9C90D764DFB1D5723140B:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFC00000000000000EB8DE39CF261EE2C7389B748F8B642FF + +00000000000000000000000000000000:9F42A9F1512DA372008DF3D469B4AD04:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFE00000000000000EB8DE39CF261EE2C7389B748F8B64300 + +00000000000000000000000000000000:C80993A52AE00A74A64FAD42EC586FF5:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFF00000000000000EB8DE39CF261EE2C7389B748F8B64301 + +00000000000000000000000000000000:3AFC74E774FE9B27202B8596C5B1396E:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFF80000000000000EB8DE39CF261EE2C7389B748F8B64302 + +00000000000000000000000000000000:64829EB2B232687C9CE32F8A91274497:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFC0000000000000EB8DE39CF261EE2C7389B748F8B64303 + +00000000000000000000000000000000:E9795D38B5A1AAD7901C7765CF4F23B2:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFE0000000000000EB8DE39CF261EE2C7389B748F8B64304 + +00000000000000000000000000000000:28989B6F2458E95A32485C7050DB4155:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFF0000000000000EB8DE39CF261EE2C7389B748F8B64305 + +00000000000000000000000000000000:3DFFB7C3CDBB9C3B27A5CCCFDAFA9AAE:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFF8000000000000EB8DE39CF261EE2C7389B748F8B64306 + +00000000000000000000000000000000:4B42865DA59E224D8CD7587D8C4AD73E:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFC000000000000EB8DE39CF261EE2C7389B748F8B64307 + +00000000000000000000000000000000:19316BB7F4041A621BD659FBD34397D6:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFE000000000000EB8DE39CF261EE2C7389B748F8B64308 + +00000000000000000000000000000000:963835BE55A1E143D1F2F56BCA837BBE:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFF000000000000EB8DE39CF261EE2C7389B748F8B64309 + +00000000000000000000000000000000:2C614F8E813AF275902D7139B08C0998:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFF800000000000EB8DE39CF261EE2C7389B748F8B6430A + +00000000000000000000000000000000:6B0F6D50554C31C8439ECEAC28B2C256:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFC00000000000EB8DE39CF261EE2C7389B748F8B6430B + +00000000000000000000000000000000:B6D80EEEC39FBB091ADC6BB3BB5D5A67:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFE00000000000EB8DE39CF261EE2C7389B748F8B6430C + +00000000000000000000000000000000:6C8D5E16792215E76E73FD4650A407DB:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFF00000000000EB8DE39CF261EE2C7389B748F8B6430D + +00000000000000000000000000000000:AA6E5BE4C0C26EEC0161D364F0FF7DE3:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFF80000000000EB8DE39CF261EE2C7389B748F8B6430E + +00000000000000000000000000000000:1CC202A40F8ED80D5559BB2B29E96A65:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFC0000000000EB8DE39CF261EE2C7389B748F8B6430F + +00000000000000000000000000000000:0B4B9B6139443912D9492EE91A1769CB:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFE0000000000EB8DE39CF261EE2C7389B748F8B64310 + +00000000000000000000000000000000:C10EBF773A13A852500F2025AB965540:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFF0000000000EB8DE39CF261EE2C7389B748F8B64311 + +00000000000000000000000000000000:5221FDCFA12F36E4E893E902A54999E8:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFF8000000000EB8DE39CF261EE2C7389B748F8B64312 + +00000000000000000000000000000000:E9090364194100265EF53E91299865FB:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFC000000000EB8DE39CF261EE2C7389B748F8B64313 + +00000000000000000000000000000000:8CD5E4284B02C8B711DE7B234F6484F7:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFE000000000EB8DE39CF261EE2C7389B748F8B64314 + +00000000000000000000000000000000:76F5D704C6B17CF7397C58D3021C2FBC:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFF000000000EB8DE39CF261EE2C7389B748F8B64315 + +00000000000000000000000000000000:F157BFB5FBF1011BD22292D947D12986:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFF800000000EB8DE39CF261EE2C7389B748F8B64316 + +00000000000000000000000000000000:2D2BD62F2AD0EE7854072B7F6860FFCA:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFC00000000EB8DE39CF261EE2C7389B748F8B64317 + +00000000000000000000000000000000:3D96768C1F0796A39077BE1C70301FD4:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFE00000000EB8DE39CF261EE2C7389B748F8B64318 + +00000000000000000000000000000000:D5073B8CF890C43AEE43AE333D57D642:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFF00000000EB8DE39CF261EE2C7389B748F8B64319 + +00000000000000000000000000000000:D38ADEA6FE821453B9EB88D9CADAD3F4:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFF80000000EB8DE39CF261EE2C7389B748F8B6431A + +00000000000000000000000000000000:F4F66618DBFED3C4B90AD93FAC1083F8:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFC0000000EB8DE39CF261EE2C7389B748F8B6431B + +00000000000000000000000000000000:930AD1D86D3ECA7A0692766CD1E40490:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFE0000000EB8DE39CF261EE2C7389B748F8B6431C + +00000000000000000000000000000000:63D8247A053BBE984B9840CFB7D90DD2:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFF0000000EB8DE39CF261EE2C7389B748F8B6431D + +00000000000000000000000000000000:827D954277E357D0453BBC537C9AB221:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFF8000000EB8DE39CF261EE2C7389B748F8B6431E + +00000000000000000000000000000000:9E2BDF167485A3AE004F0643E775CF42:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFC000000EB8DE39CF261EE2C7389B748F8B6431F + +00000000000000000000000000000000:445A3F86B2FC284BB933CBC68649E4CC:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFE000000EB8DE39CF261EE2C7389B748F8B64320 + +00000000000000000000000000000000:F6AEADC9A5A8DF7A1664B4CD055E42B4:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFF000000EB8DE39CF261EE2C7389B748F8B64321 + +00000000000000000000000000000000:1B43269E05CD108EE91AAA0ECC1CA831:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFF800000EB8DE39CF261EE2C7389B748F8B64322 + +00000000000000000000000000000000:857EEB71AB8F12AE4051B825F6B7B686:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFC00000EB8DE39CF261EE2C7389B748F8B64323 + +00000000000000000000000000000000:C92EF523170FDEBA77CFA50D84742D68:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFE00000EB8DE39CF261EE2C7389B748F8B64324 + +00000000000000000000000000000000:DC8C52D3698E8356F9D0F77361D8F26E:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFF00000EB8DE39CF261EE2C7389B748F8B64325 + +00000000000000000000000000000000:86A95BA023CBE3E5A5911D5CA22C504E:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFF80000EB8DE39CF261EE2C7389B748F8B64326 + +00000000000000000000000000000000:6E9CACEB9D51D7D05E1FD06B1BE031C7:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFC0000EB8DE39CF261EE2C7389B748F8B64327 + +00000000000000000000000000000000:556ECC72A98D46912ADDD08FDE7BA0A3:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFE0000EB8DE39CF261EE2C7389B748F8B64328 + +00000000000000000000000000000000:3A404D891C30FBBA2EED516E81B82391:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EB8DE39CF261EE2C7389B748F8B64329 + +00000000000000000000000000000000:7BC825F8C9CB40A71E6B714171A77436:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFF8000EB8DE39CF261EE2C7389B748F8B6432A + +00000000000000000000000000000000:EC8430466E19133B11D9B99DA3C614B8:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFC000EB8DE39CF261EE2C7389B748F8B6432B + +00000000000000000000000000000000:DCB6690389626F5392FD37E486490649:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFE000EB8DE39CF261EE2C7389B748F8B6432C + +00000000000000000000000000000000:73A591DF83E5F8E819BC63702471DD4A:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000EB8DE39CF261EE2C7389B748F8B6432D + +00000000000000000000000000000000:76B3B1D6EB12BBD6C3F17E73E9E2EB30:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFF800EB8DE39CF261EE2C7389B748F8B6432E + +00000000000000000000000000000000:FEC46BE2B11B2FA1C7D7A5CC3012F5DC:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00EB8DE39CF261EE2C7389B748F8B6432F + +00000000000000000000000000000000:393389AC2C7FBA821920F6DC2193A4E0:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00EB8DE39CF261EE2C7389B748F8B64330 + +00000000000000000000000000000000:43D7D429B793F150173FCFEC35D9A4E8:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EB8DE39CF261EE2C7389B748F8B64331 + +00000000000000000000000000000000:8EAE659DF12B19C428CFC37E3432683D:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80EB8DE39CF261EE2C7389B748F8B64332 + +00000000000000000000000000000000:5080B7459858EA77FFC5AEAD88DEE1B5:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EB8DE39CF261EE2C7389B748F8B64333 + +00000000000000000000000000000000:ACBEEAFC7D2C5DCE6AC63452E07D6A95:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0EB8DE39CF261EE2C7389B748F8B64334 + +00000000000000000000000000000000:95407BD82770032D496FD3F54478A589:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0EB8DE39CF261EE2C7389B748F8B64335 + +00000000000000000000000000000000:F3B8D4093A4D2845A2C411C8EA1E9F12:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8EB8DE39CF261EE2C7389B748F8B64336 + +00000000000000000000000000000000:6B232AD852E9D6EB2CA54E8C9B5163C3:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCEB8DE39CF261EE2C7389B748F8B64337 + +00000000000000000000000000000000:C3CB4B5855323C13C8973982E9EA33E7:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEB8DE39CF261EE2C7389B748F8B64338 + +00000000000000000000000000000000:504D101AC84F9B4542C1B0264B947410:\ +C592BF6A04D72BB1CBEAF590B7CCA6BC\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB8DE39CF261EE2C7389B748F8B64339 + +[X9.31-RNG(AES-192)] +00000000000000000000000000000000:765F8B450404187233E6F7C30A9C3033:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +800000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C82 + +00000000000000000000000000000000:3636889C7E3720C3E0DCF399104597A4:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +C00000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C83 + +00000000000000000000000000000000:2845D5BCACD8C65B5B4B5A168E778DF7:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +E00000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C84 + +00000000000000000000000000000000:41CDAA700F6E179354AD61B7CBD5E272:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +F00000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C85 + +00000000000000000000000000000000:E08638EAEC7EA84B43AC7EB48296B94C:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +F80000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C86 + +00000000000000000000000000000000:A7AFADA8824F5B94EB20E31B30519A91:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FC0000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C87 + +00000000000000000000000000000000:F5CAB3443DA2C48B0C309FC64FB903C6:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FE0000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C88 + +00000000000000000000000000000000:6CCEBF22A49BB4921E4E30D0663F90DC:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FF0000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C89 + +00000000000000000000000000000000:D8CCE94DE9CFE74E3392418BCC843B14:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FF8000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8A + +00000000000000000000000000000000:D56EEA4E0B3963E370E6145352F170F0:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFC000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8B + +00000000000000000000000000000000:43894E0870AD99C2CF7116FF3F076AA3:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFE000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8C + +00000000000000000000000000000000:0181C2495F3DDB5BBA9F52634A3CA1A1:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFF000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8D + +00000000000000000000000000000000:AE97729D2D864B54619DCCA39F7C1E3E:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFF800000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8E + +00000000000000000000000000000000:E7F674C418E2CF20CE7152BFD184428D:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFC00000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8F + +00000000000000000000000000000000:DA0CCB4303614FE6F975AAC0A6B79C0C:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFE00000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C90 + +00000000000000000000000000000000:02AAAFF23E2D38885670604C1356CAFA:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFF00000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C91 + +00000000000000000000000000000000:649A70DFBEEBAFE24F102BB45302CA90:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFF80000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C92 + +00000000000000000000000000000000:2E2CE97AD3E20C8F5E676D453FC0573A:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFC0000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C93 + +00000000000000000000000000000000:147AA9D83747429EB9E642190331E140:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFE0000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C94 + +00000000000000000000000000000000:CA64870FDF1A3DFD3206EC3C39E37831:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFF0000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C95 + +00000000000000000000000000000000:9D91BBFA64EC181C0FEA5B620338C93F:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFF8000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C96 + +00000000000000000000000000000000:DBF7E2FFD26CC3DE9E58F06EA4AA108B:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFC000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C97 + +00000000000000000000000000000000:172248D875492388F40E465884809BEC:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFE000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C98 + +00000000000000000000000000000000:9CDDA74369BCE1E0545AC7BB33ED56C6:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFF000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C99 + +00000000000000000000000000000000:58F86FD5A8CE9F2DE1D7B036646C3CF0:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFF800000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9A + +00000000000000000000000000000000:22B087E72247F42628C4EED66DAC2857:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFC00000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9B + +00000000000000000000000000000000:2C5A29C655986B70CF4D824DA14CCC51:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFE00000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9C + +00000000000000000000000000000000:166EA4679813A0BC390389EC305336FB:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFF00000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9D + +00000000000000000000000000000000:BF11A059C4081554C66DA4BD62B20954:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFF80000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9E + +00000000000000000000000000000000:566904C94E52FC620F980EDF352428CA:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFC0000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9F + +00000000000000000000000000000000:DC3EFF7EAC7A8EBD840DF5F621A3449A:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFE0000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA0 + +00000000000000000000000000000000:EADDA03E98C5B8A6A28C92B7EBC7AC97:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFF0000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA1 + +00000000000000000000000000000000:99F41647A63D58E862E3AC10FC5AEE92:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFF8000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA2 + +00000000000000000000000000000000:B5D386B2184EDFD9726DA021B0F34142:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFC000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA3 + +00000000000000000000000000000000:FAAE880D0C2DADC2015C66BE8AD6BC1E:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFE000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA4 + +00000000000000000000000000000000:250DCFF45916E9F8FA2219F62A422B00:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFF000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA5 + +00000000000000000000000000000000:853BAB572DCE44B910DDE9D74D6EC4A9:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFF800000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA6 + +00000000000000000000000000000000:EBFC3DFD08EE68B825F47F63F47FFC2D:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFC00000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA7 + +00000000000000000000000000000000:6D25021AE6865BC70971485E1888CB35:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFE00000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA8 + +00000000000000000000000000000000:A1D2584BBE712619CABD295ADE48D132:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFF00000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA9 + +00000000000000000000000000000000:8EA62AAFD310009DE585FCA2542128C6:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFF80000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAA + +00000000000000000000000000000000:5DBEEB2438CDC2E4B0727F537EB6BCEE:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFC0000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAB + +00000000000000000000000000000000:81A884DD17A78D57BB00FC23B372A003:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFE0000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAC + +00000000000000000000000000000000:22ECAAC6F2884CC9F2977C63A7F429AF:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFF0000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAD + +00000000000000000000000000000000:35A2E0D7BE633C0E24C09E6F7EB681A5:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFF8000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAE + +00000000000000000000000000000000:FAA2B324614E430AF7168D3BE22AB8F5:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFC000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAF + +00000000000000000000000000000000:FEEB51786DA2CAD7C17EB084F16ED95C:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFE000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB0 + +00000000000000000000000000000000:60C5CC3D4FA90CAE8F800FE0EBC3BD7D:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFF000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB1 + +00000000000000000000000000000000:F4F4B400DE91585909EC6C772A616331:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFF800000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB2 + +00000000000000000000000000000000:10A1126BFCF62DE266240BEBC70345D4:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFC00000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB3 + +00000000000000000000000000000000:7E54A01950089CECD54EF526C2CA4D32:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFE00000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB4 + +00000000000000000000000000000000:878880E754C0835B28EE7ABBAC5483BE:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFF00000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB5 + +00000000000000000000000000000000:5818CF8CCCF36E2FD381F40E8E6B6C22:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFF80000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB6 + +00000000000000000000000000000000:5342E61C5CE89EFC82790297315BC6BE:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFC0000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB7 + +00000000000000000000000000000000:C1A6F265700B4B032B82A8DDECE58FA8:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFE0000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB8 + +00000000000000000000000000000000:4206F2CBF9FBBC6CF774642B552754A6:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFF0000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB9 + +00000000000000000000000000000000:0839EF91752B19D1B4D853BF27945C98:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFF8000000000000000008159E43DB66ECF3EABE5A44E0D4C0CBA + +00000000000000000000000000000000:3AA99E43E643F56D51EAE0DD94D53FAD:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFC000000000000000008159E43DB66ECF3EABE5A44E0D4C0CBB + +00000000000000000000000000000000:8A17C2B4992E26A7A0E709F05C3B81EC:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFE000000000000000008159E43DB66ECF3EABE5A44E0D4C0CBC + +00000000000000000000000000000000:9D14DA0A5F6D0E5F7B9FC38BBD598196:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFF000000000000000008159E43DB66ECF3EABE5A44E0D4C0CBD + +00000000000000000000000000000000:709CAED6B876ECE41FF7AE78C3892CAC:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFF800000000000000008159E43DB66ECF3EABE5A44E0D4C0CBE + +00000000000000000000000000000000:5AD091FF7C2677F8E3DFB98F8E85E54A:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFC00000000000000008159E43DB66ECF3EABE5A44E0D4C0CBF + +00000000000000000000000000000000:989D89F341AB464BE89E17B06467A8FD:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFE00000000000000008159E43DB66ECF3EABE5A44E0D4C0CC0 + +00000000000000000000000000000000:3257273E13063BCFB64C7A0B090B0A2D:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFF00000000000000008159E43DB66ECF3EABE5A44E0D4C0CC1 + +00000000000000000000000000000000:431D551090D4E840432CD0D8E7170666:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFF80000000000000008159E43DB66ECF3EABE5A44E0D4C0CC2 + +00000000000000000000000000000000:F3EBF6C275C41C7015BFEE14DE87F372:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFC0000000000000008159E43DB66ECF3EABE5A44E0D4C0CC3 + +00000000000000000000000000000000:13EE442069EC7B852034397B1F09EB3D:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFE0000000000000008159E43DB66ECF3EABE5A44E0D4C0CC4 + +00000000000000000000000000000000:ACFAA2C816C9ECAD0A19BA783BCAB411:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFF0000000000000008159E43DB66ECF3EABE5A44E0D4C0CC5 + +00000000000000000000000000000000:2AAEB898354B9E1358CA6DF57369C361:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFF8000000000000008159E43DB66ECF3EABE5A44E0D4C0CC6 + +00000000000000000000000000000000:52C35276866C0DA1277FC4952B732EEA:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFC000000000000008159E43DB66ECF3EABE5A44E0D4C0CC7 + +00000000000000000000000000000000:BAEEB093F380B5D887DC48B7DE672D33:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFE000000000000008159E43DB66ECF3EABE5A44E0D4C0CC8 + +00000000000000000000000000000000:D524C38205AD436D54199E0F8E04D8D9:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFF000000000000008159E43DB66ECF3EABE5A44E0D4C0CC9 + +00000000000000000000000000000000:A0D1315745F15F0DDC468DBDD9E56714:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFF800000000000008159E43DB66ECF3EABE5A44E0D4C0CCA + +00000000000000000000000000000000:2776D4FFDFFB344EC55FC22FFE450A3C:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFC00000000000008159E43DB66ECF3EABE5A44E0D4C0CCB + +00000000000000000000000000000000:BC0716E00000562CC8A9E2470F3D8B63:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFE00000000000008159E43DB66ECF3EABE5A44E0D4C0CCC + +00000000000000000000000000000000:E29DD29D73D883CD8DAF74838BBEFC7C:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFF00000000000008159E43DB66ECF3EABE5A44E0D4C0CCD + +00000000000000000000000000000000:84CBCBB352E2D3CB77E04C954280694E:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFF80000000000008159E43DB66ECF3EABE5A44E0D4C0CCE + +00000000000000000000000000000000:558744FEBFFE7A0AE424D45921B87309:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFC0000000000008159E43DB66ECF3EABE5A44E0D4C0CCF + +00000000000000000000000000000000:7FF9325EA7576D41B4A1B557533432FB:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFE0000000000008159E43DB66ECF3EABE5A44E0D4C0CD0 + +00000000000000000000000000000000:01CC9B4887AD0B270EC55F6527AB90A6:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFF0000000000008159E43DB66ECF3EABE5A44E0D4C0CD1 + +00000000000000000000000000000000:044176DA3370910AE0BCBDCF1D895CC0:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFF8000000000008159E43DB66ECF3EABE5A44E0D4C0CD2 + +00000000000000000000000000000000:BCA18B1630EAEC7CBDDF5C513A53D456:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFC000000000008159E43DB66ECF3EABE5A44E0D4C0CD3 + +00000000000000000000000000000000:19D1D3DA04BDAD8D710DD14A611F8F17:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFE000000000008159E43DB66ECF3EABE5A44E0D4C0CD4 + +00000000000000000000000000000000:615BC0AF497F862399EF275E649746F0:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFF000000000008159E43DB66ECF3EABE5A44E0D4C0CD5 + +00000000000000000000000000000000:58F46ACF8BB0D1B56EF0AD46D90DA340:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFF800000000008159E43DB66ECF3EABE5A44E0D4C0CD6 + +00000000000000000000000000000000:2F2DBE7F2123A2E66CD8DD478688A07E:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFC00000000008159E43DB66ECF3EABE5A44E0D4C0CD7 + +00000000000000000000000000000000:AA80B113C8E106723409B3F31969965A:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFE00000000008159E43DB66ECF3EABE5A44E0D4C0CD8 + +00000000000000000000000000000000:DFC761136BCB3B2E1E13E0291BA85972:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFF00000000008159E43DB66ECF3EABE5A44E0D4C0CD9 + +00000000000000000000000000000000:E0944C42C6EE12FAA28286B0ED4F5DC7:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFF80000000008159E43DB66ECF3EABE5A44E0D4C0CDA + +00000000000000000000000000000000:DAF99970E52C6639188262C5DAD13123:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFC0000000008159E43DB66ECF3EABE5A44E0D4C0CDB + +00000000000000000000000000000000:0E07202C26F31E74004015F6BC7E2100:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFE0000000008159E43DB66ECF3EABE5A44E0D4C0CDC + +00000000000000000000000000000000:93DCAC92FB0DA5976DF8A75DBDC61C9B:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFF0000000008159E43DB66ECF3EABE5A44E0D4C0CDD + +00000000000000000000000000000000:9370C5EC398DE376E319370A4C5F26E2:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFF8000000008159E43DB66ECF3EABE5A44E0D4C0CDE + +00000000000000000000000000000000:83C03F2B1B64E72ED21D0A5F59FA7F8C:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFC000000008159E43DB66ECF3EABE5A44E0D4C0CDF + +00000000000000000000000000000000:AA1159B23592ADECC168B2268952A92B:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFE000000008159E43DB66ECF3EABE5A44E0D4C0CE0 + +00000000000000000000000000000000:14EEE0E44CA217E45440EC84011D89A5:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFF000000008159E43DB66ECF3EABE5A44E0D4C0CE1 + +00000000000000000000000000000000:B2C88BBA8B055BA74622297E8BC8D95D:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFF800000008159E43DB66ECF3EABE5A44E0D4C0CE2 + +00000000000000000000000000000000:FADFBA23CC801A926A119F78B37A9307:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFC00000008159E43DB66ECF3EABE5A44E0D4C0CE3 + +00000000000000000000000000000000:4CB2D5484366D91C9243C4797DA983DD:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFE00000008159E43DB66ECF3EABE5A44E0D4C0CE4 + +00000000000000000000000000000000:367EF2BDC4163545C4C9011AE53755DE:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFF00000008159E43DB66ECF3EABE5A44E0D4C0CE5 + +00000000000000000000000000000000:51888B85AD78889BACEA726798C30C95:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFF80000008159E43DB66ECF3EABE5A44E0D4C0CE6 + +00000000000000000000000000000000:1D3CEC46E078E44BF11603DB2726D8F2:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFC0000008159E43DB66ECF3EABE5A44E0D4C0CE7 + +00000000000000000000000000000000:A369189A3667F44FFA8DA2E5E9425D6F:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFE0000008159E43DB66ECF3EABE5A44E0D4C0CE8 + +00000000000000000000000000000000:ED8C0F37154A57D27A9A11CAE3F3131E:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFF0000008159E43DB66ECF3EABE5A44E0D4C0CE9 + +00000000000000000000000000000000:8B04BF18036328006D9A7FC4C1BCF818:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFF8000008159E43DB66ECF3EABE5A44E0D4C0CEA + +00000000000000000000000000000000:0E1E3F517E7502E4CC98A3A312692666:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFC000008159E43DB66ECF3EABE5A44E0D4C0CEB + +00000000000000000000000000000000:306CA0902C2B572BB5E2CE0848D6280E:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFE000008159E43DB66ECF3EABE5A44E0D4C0CEC + +00000000000000000000000000000000:8F8479252EF0C104D27B38C52F4F40EB:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFF000008159E43DB66ECF3EABE5A44E0D4C0CED + +00000000000000000000000000000000:D5C6F739A2B316B8CAFBC39999C731CB:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFF800008159E43DB66ECF3EABE5A44E0D4C0CEE + +00000000000000000000000000000000:5C153EA9F8580BE16B093EE1CF83529B:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFC00008159E43DB66ECF3EABE5A44E0D4C0CEF + +00000000000000000000000000000000:13A3DF5F58736008E8101087B5B49563:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFE00008159E43DB66ECF3EABE5A44E0D4C0CF0 + +00000000000000000000000000000000:2CB0DC2125C33149703A9A86CB0FB7D2:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00008159E43DB66ECF3EABE5A44E0D4C0CF1 + +00000000000000000000000000000000:5453577F4F95E85D729DCFD84B297381:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFF80008159E43DB66ECF3EABE5A44E0D4C0CF2 + +00000000000000000000000000000000:588702C309F54A76467B8F587FE17096:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFC0008159E43DB66ECF3EABE5A44E0D4C0CF3 + +00000000000000000000000000000000:7779A89AD48BB3FD8BBFDC5BD8C9101E:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFE0008159E43DB66ECF3EABE5A44E0D4C0CF4 + +00000000000000000000000000000000:9EDB48F7416AE0BD9802172515AA3D80:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0008159E43DB66ECF3EABE5A44E0D4C0CF5 + +00000000000000000000000000000000:84AEA377BDDC54012F710254A435E1D1:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFF8008159E43DB66ECF3EABE5A44E0D4C0CF6 + +00000000000000000000000000000000:4BEE75DC775926F27373A958BF64A168:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC008159E43DB66ECF3EABE5A44E0D4C0CF7 + +00000000000000000000000000000000:76B563BA44BFF0D9CB460CD5E8D55C32:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE008159E43DB66ECF3EABE5A44E0D4C0CF8 + +00000000000000000000000000000000:0682EA4560113BE4D3F3E92256D2BAAC:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF008159E43DB66ECF3EABE5A44E0D4C0CF9 + +00000000000000000000000000000000:65D98A2BC1A84569FC553ED36C28FF45:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808159E43DB66ECF3EABE5A44E0D4C0CFA + +00000000000000000000000000000000:0AABEB6CE77559F813C8257E57938C2C:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC08159E43DB66ECF3EABE5A44E0D4C0CFB + +00000000000000000000000000000000:5ED815849F9F2480202FDAE7C05CC83B:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE08159E43DB66ECF3EABE5A44E0D4C0CFC + +00000000000000000000000000000000:5F453DBC5FED77520B0AFB71DAE3C083:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08159E43DB66ECF3EABE5A44E0D4C0CFD + +00000000000000000000000000000000:14CAA4D84D923CCDAD2CD1CCD0377833:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88159E43DB66ECF3EABE5A44E0D4C0CFE + +00000000000000000000000000000000:573691CD8E310DC33A645582BA51DE9A:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8159E43DB66ECF3EABE5A44E0D4C0CFF + +00000000000000000000000000000000:8B77DFB1C9BD1FBF4B379B159230A7A6:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8159E43DB66ECF3EABE5A44E0D4C0D00 + +00000000000000000000000000000000:CCAE97D6E56FBDA46C9B0DF5B6AF71C3:\ +E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8159E43DB66ECF3EABE5A44E0D4C0D01 + +[X9.31-RNG(AES-256)] +00000000000000000000000000000000:6C5EE8D10201D608874E6AE8C8A2BA79:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +8000000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C2 + +00000000000000000000000000000000:3790A9D44DE68EF0800837B32E2ED032:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +C000000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C3 + +00000000000000000000000000000000:72A1742C79E8B1D4F62E0669657F744D:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +E000000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C4 + +00000000000000000000000000000000:9E5708E79B379B9D393C766CFD802C98:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +F000000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C5 + +00000000000000000000000000000000:AF7A0A13DE0B16512986538D5FECDC7D:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +F800000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C6 + +00000000000000000000000000000000:D885CBF7B4E38B9FAC1C8EB625DDABCA:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FC00000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C7 + +00000000000000000000000000000000:7AEF038A328D1827D52DA4A36567C7BA:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FE00000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C8 + +00000000000000000000000000000000:14169D5DE6E79DEA20E261DA55DBA593:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FF00000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C9 + +00000000000000000000000000000000:DFE31312A96369CF41CAED493D4DFF4B:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FF80000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CA + +00000000000000000000000000000000:BAFFD64502B19D26DCA93D09E43D8036:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFC0000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CB + +00000000000000000000000000000000:8BDEF0F95AB8F3B5A591A78364B723C7:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFE0000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CC + +00000000000000000000000000000000:38145A8F807E13CB05B2810E752BABDE:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFF0000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CD + +00000000000000000000000000000000:98EA671222B7332AEA395F37A355B1CC:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFF8000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CE + +00000000000000000000000000000000:20C8AB02049C9987A7B00B4498B2C6E3:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFC000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CF + +00000000000000000000000000000000:67B8ACDE366BD5D064CB53C09EB0A95A:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFE000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D0 + +00000000000000000000000000000000:137721E4A673550141E2E3CF652A0819:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFF000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D1 + +00000000000000000000000000000000:29C0369E50A4B5494166E60E7E394149:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFF800000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D2 + +00000000000000000000000000000000:09FAA6F94FE3DAFE3E10A38D8B9ABDE4:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFC00000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D3 + +00000000000000000000000000000000:5F976E965ABC8C93D1C175AA750C16DC:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFE00000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D4 + +00000000000000000000000000000000:25C386A980D1E75632566AD290FE3333:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFF00000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D5 + +00000000000000000000000000000000:D0CB44688ADA0966204B3D53FA89D534:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFF80000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D6 + +00000000000000000000000000000000:D2D11DD6ABE3B30BAECAADE50A2E9642:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFC0000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D7 + +00000000000000000000000000000000:068451BECF49C9AD8BF47F176B154092:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFE0000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D8 + +00000000000000000000000000000000:A8B505B0B75D061A1111FF97EE70CB2D:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFF0000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D9 + +00000000000000000000000000000000:0479DBD05E14286F769AD495AE114D56:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFF8000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DA + +00000000000000000000000000000000:9C62B0A336593C307F2144658DA20BA2:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFC000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DB + +00000000000000000000000000000000:D68EFECC5CA3C1109769F14288202779:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFE000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DC + +00000000000000000000000000000000:DE6A7F99826A4F60BD70A2839B269A39:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFF000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DD + +00000000000000000000000000000000:F03D08EDF438E946E056B6D085C27B28:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFF800000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DE + +00000000000000000000000000000000:4DB84EFD6F81DC4B70CAB3E365C70B21:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFC00000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DF + +00000000000000000000000000000000:2D78FEC4CA1917B5070D4B5246D5CD11:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFE00000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E0 + +00000000000000000000000000000000:CE9228E22BD9E7A39FF05E194805F730:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFF00000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E1 + +00000000000000000000000000000000:D8912B41584C29C70874CBB947833B38:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFF80000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E2 + +00000000000000000000000000000000:83644C0D80557650F719DF1B28A0CB3F:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFC0000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E3 + +00000000000000000000000000000000:032A88989BB02C57501CC05D4D72E8A1:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFE0000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E4 + +00000000000000000000000000000000:7C3607B5F5193A51DF18A19CF4577795:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFF0000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E5 + +00000000000000000000000000000000:76B055658ADF07D15422895951F692E0:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFF8000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E6 + +00000000000000000000000000000000:7F87F363569F479DA806ABF988002705:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFC000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E7 + +00000000000000000000000000000000:9A830D8126A8D39BA023B4F545670618:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFE000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E8 + +00000000000000000000000000000000:7C0907F8FEBC6DCF1A4D83D420E5DC85:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFF000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E9 + +00000000000000000000000000000000:F84F6500F554CAF20FF785C28E70AA69:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFF800000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EA + +00000000000000000000000000000000:876052A291745E5479FD0ADB65AB3CFD:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFC00000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EB + +00000000000000000000000000000000:69F6A409470573A5DEB23744A9FE8C26:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFE00000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EC + +00000000000000000000000000000000:455FF206B8BA6D99DDA0B0E645DD03A0:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFF00000000000000000000097B45F0EE0FB64AC3B8A1B9B750666ED + +00000000000000000000000000000000:A82E4437632E216EA6E5F75AEB6DC148:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFF80000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EE + +00000000000000000000000000000000:A7B1E69A85CC0E01CD2F59E7AFAF790F:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFC0000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EF + +00000000000000000000000000000000:68FFCB667FCD6113A1B3E6F20ADBADFE:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFE0000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F0 + +00000000000000000000000000000000:CEE4E4C331CE6AF61D07617079420E4E:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFF0000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F1 + +00000000000000000000000000000000:E7CFD60A04AE3875F6E460FE73FC151E:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFF8000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F2 + +00000000000000000000000000000000:301E3DA5BD96188B3154AAC685EB8B6F:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFC000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F3 + +00000000000000000000000000000000:12588D677D871E4B042F16E98693167F:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFE000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F4 + +00000000000000000000000000000000:938DF998D725B8EF5363C99A82D447F8:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFF000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F5 + +00000000000000000000000000000000:6588A7E9B2D3F82BEACB086A24F05730:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFF800000000000000000097B45F0EE0FB64AC3B8A1B9B750666F6 + +00000000000000000000000000000000:CA0BBDDD004301639B1644A8CB9360B2:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFC00000000000000000097B45F0EE0FB64AC3B8A1B9B750666F7 + +00000000000000000000000000000000:35B609CE89EE33F267A4E875FA4128F3:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFE00000000000000000097B45F0EE0FB64AC3B8A1B9B750666F8 + +00000000000000000000000000000000:BAC817B7C3E5B617FFC977F23BBF755B:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFF00000000000000000097B45F0EE0FB64AC3B8A1B9B750666F9 + +00000000000000000000000000000000:46487C6F7B5EEDCDAB5BB08234EE4C76:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFF80000000000000000097B45F0EE0FB64AC3B8A1B9B750666FA + +00000000000000000000000000000000:752D69F5FFAAB3D22A07B5E8CC02C7DA:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFC0000000000000000097B45F0EE0FB64AC3B8A1B9B750666FB + +00000000000000000000000000000000:46688ED5C008A8431D25FECADCAC511E:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFE0000000000000000097B45F0EE0FB64AC3B8A1B9B750666FC + +00000000000000000000000000000000:2A5BCBE76FE95C1274F4B9315D4286CE:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFF0000000000000000097B45F0EE0FB64AC3B8A1B9B750666FD + +00000000000000000000000000000000:C9BD29164997EB53E05D41B4A5654AE8:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFF8000000000000000097B45F0EE0FB64AC3B8A1B9B750666FE + +00000000000000000000000000000000:EB5C8D67F1B7A2183A0B196E8450B873:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFC000000000000000097B45F0EE0FB64AC3B8A1B9B750666FF + +00000000000000000000000000000000:CD9231AF1BB1CA82226F5C5852BA17C2:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFE000000000000000097B45F0EE0FB64AC3B8A1B9B75066700 + +00000000000000000000000000000000:5C0DA74392E5BE679DBD40FC95EE03D4:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFF000000000000000097B45F0EE0FB64AC3B8A1B9B75066701 + +00000000000000000000000000000000:786D6BA1C0BA6FC1AF0F11EC5875A1F5:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFF800000000000000097B45F0EE0FB64AC3B8A1B9B75066702 + +00000000000000000000000000000000:1F251DD8210AAEDCB79D4152369CD76B:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFC00000000000000097B45F0EE0FB64AC3B8A1B9B75066703 + +00000000000000000000000000000000:1B291C0DBDB2075E9B9C709A15016ED7:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFE00000000000000097B45F0EE0FB64AC3B8A1B9B75066704 + +00000000000000000000000000000000:8465C72B7319CD4D0E35A05D49C5508D:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFF00000000000000097B45F0EE0FB64AC3B8A1B9B75066705 + +00000000000000000000000000000000:07F04A0749B6DE3B5C668729B28AFB54:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFF80000000000000097B45F0EE0FB64AC3B8A1B9B75066706 + +00000000000000000000000000000000:6C97CB048F5B4E7C32196C14E678A0E1:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFC0000000000000097B45F0EE0FB64AC3B8A1B9B75066707 + +00000000000000000000000000000000:BE029441D7AF7EE8CE7310F6F5006809:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFE0000000000000097B45F0EE0FB64AC3B8A1B9B75066708 + +00000000000000000000000000000000:31074BC8D063E87E2FF1F9E0EAA404D9:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFF0000000000000097B45F0EE0FB64AC3B8A1B9B75066709 + +00000000000000000000000000000000:37A677D029773FE867F07020F65F0246:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFF8000000000000097B45F0EE0FB64AC3B8A1B9B7506670A + +00000000000000000000000000000000:89DF0BD0FA7D852EAC6B564AB8E6F3F3:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFC000000000000097B45F0EE0FB64AC3B8A1B9B7506670B + +00000000000000000000000000000000:CA7747BEFE61CFA622F7A821116E43C2:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFE000000000000097B45F0EE0FB64AC3B8A1B9B7506670C + +00000000000000000000000000000000:82D1BA96DF72AC93CD57E9234509FB08:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFF000000000000097B45F0EE0FB64AC3B8A1B9B7506670D + +00000000000000000000000000000000:299ECF7AAFADB0F2B21812B8B2977470:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFF800000000000097B45F0EE0FB64AC3B8A1B9B7506670E + +00000000000000000000000000000000:7A7A2015F797F943F75F70994F43E523:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFC00000000000097B45F0EE0FB64AC3B8A1B9B7506670F + +00000000000000000000000000000000:88F208943716B38D25EC02E164357DBF:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFE00000000000097B45F0EE0FB64AC3B8A1B9B75066710 + +00000000000000000000000000000000:2420712BC5A2187E71436DF0C7D9E5D7:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFF00000000000097B45F0EE0FB64AC3B8A1B9B75066711 + +00000000000000000000000000000000:A95EC3F73418436AD057F861BBC1811C:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFF80000000000097B45F0EE0FB64AC3B8A1B9B75066712 + +00000000000000000000000000000000:713E1A0B1C56DD8D219921C8FEB462EF:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFC0000000000097B45F0EE0FB64AC3B8A1B9B75066713 + +00000000000000000000000000000000:B5AA2282CC8D2F0003A6492CDE8BD888:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFE0000000000097B45F0EE0FB64AC3B8A1B9B75066714 + +00000000000000000000000000000000:BD38241AF3C4E5CC844CED745CF65B7D:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFF0000000000097B45F0EE0FB64AC3B8A1B9B75066715 + +00000000000000000000000000000000:D6DF902987B9C3D5826BA71F1A5FA271:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFF8000000000097B45F0EE0FB64AC3B8A1B9B75066716 + +00000000000000000000000000000000:DCD0CA7E3C0422E4723AE53641DF1E47:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFC000000000097B45F0EE0FB64AC3B8A1B9B75066717 + +00000000000000000000000000000000:757E483E335672145C0C0C2097DACDA5:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFE000000000097B45F0EE0FB64AC3B8A1B9B75066718 + +00000000000000000000000000000000:3BAE296E2434A5331383085CC7704988:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFF000000000097B45F0EE0FB64AC3B8A1B9B75066719 + +00000000000000000000000000000000:F2CE3B5AA3DCCAF64722D1AE10DE005E:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFF800000000097B45F0EE0FB64AC3B8A1B9B7506671A + +00000000000000000000000000000000:58DEC1DEF6FD5E09D814AE6F8641A219:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFC00000000097B45F0EE0FB64AC3B8A1B9B7506671B + +00000000000000000000000000000000:2F28B31722EE508F8679234F458BDA26:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFE00000000097B45F0EE0FB64AC3B8A1B9B7506671C + +00000000000000000000000000000000:B89DE1B9E3937F115EEE36CE1C1BDD74:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFF00000000097B45F0EE0FB64AC3B8A1B9B7506671D + +00000000000000000000000000000000:B6B987E6C49B5BC452F97991838DDCEB:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFF80000000097B45F0EE0FB64AC3B8A1B9B7506671E + +00000000000000000000000000000000:E363D02F055C097BF19CD491654FF798:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFC0000000097B45F0EE0FB64AC3B8A1B9B7506671F + +00000000000000000000000000000000:654A5415175E6343672AE4C63D6643A2:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFE0000000097B45F0EE0FB64AC3B8A1B9B75066720 + +00000000000000000000000000000000:ED2313EFC077667BD26DB08F581F3C74:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFF0000000097B45F0EE0FB64AC3B8A1B9B75066721 + +00000000000000000000000000000000:FC6348FC174F45C96F5A3C78C13B220B:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFF8000000097B45F0EE0FB64AC3B8A1B9B75066722 + +00000000000000000000000000000000:65AEDCD56236E056217C94642BFEF8BC:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFC000000097B45F0EE0FB64AC3B8A1B9B75066723 + +00000000000000000000000000000000:920A3A154BD41CB775BA25C2EB3A6885:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFE000000097B45F0EE0FB64AC3B8A1B9B75066724 + +00000000000000000000000000000000:07953BBE0BE803D75E3B8A0EDBEF1D36:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFF000000097B45F0EE0FB64AC3B8A1B9B75066725 + +00000000000000000000000000000000:A0BCB7A68C7C29E13306E5BD11AD6746:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFF800000097B45F0EE0FB64AC3B8A1B9B75066726 + +00000000000000000000000000000000:6DEB2CEA2F4AC6AADB7D3A22A3DA0B65:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFC00000097B45F0EE0FB64AC3B8A1B9B75066727 + +00000000000000000000000000000000:9D70BC79E81D6279EDCBEFD2C0EF1C5D:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFE00000097B45F0EE0FB64AC3B8A1B9B75066728 + +00000000000000000000000000000000:AEF03890D852369F48651CF873E30710:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFF00000097B45F0EE0FB64AC3B8A1B9B75066729 + +00000000000000000000000000000000:F189987D9AA73395765EF29A72B8B058:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFF80000097B45F0EE0FB64AC3B8A1B9B7506672A + +00000000000000000000000000000000:87F833C8D5200898FF3B6BDD0B869F94:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFC0000097B45F0EE0FB64AC3B8A1B9B7506672B + +00000000000000000000000000000000:5A7B8BB4F19D6DAC3AB19C2F9E2C65DA:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFE0000097B45F0EE0FB64AC3B8A1B9B7506672C + +00000000000000000000000000000000:CBDBA79302A31040BEB82623B832DF92:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFF0000097B45F0EE0FB64AC3B8A1B9B7506672D + +00000000000000000000000000000000:38E92CC8333025DC803CE15A2628E34A:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFF8000097B45F0EE0FB64AC3B8A1B9B7506672E + +00000000000000000000000000000000:FB033A85B5CD43564D80C0280D70B92F:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFC000097B45F0EE0FB64AC3B8A1B9B7506672F + +00000000000000000000000000000000:21EC2A86B6A717DB2A3FC7F1DFF2ECEB:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFE000097B45F0EE0FB64AC3B8A1B9B75066730 + +00000000000000000000000000000000:7DDECD08BA8101F3CD61C42C33B987A7:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFF000097B45F0EE0FB64AC3B8A1B9B75066731 + +00000000000000000000000000000000:784E688C7D87FC3C9D31B2B45885DB6E:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFF800097B45F0EE0FB64AC3B8A1B9B75066732 + +00000000000000000000000000000000:08610008A6FF151C4DD5DE24D578A284:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFC00097B45F0EE0FB64AC3B8A1B9B75066733 + +00000000000000000000000000000000:91F83EC50CE5A5885659D15A3A50FF3E:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFE00097B45F0EE0FB64AC3B8A1B9B75066734 + +00000000000000000000000000000000:B4CE519B707EA0791AF63F4344207CB4:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00097B45F0EE0FB64AC3B8A1B9B75066735 + +00000000000000000000000000000000:94D92918083BF232F8D6580E6A0DEF10:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFF80097B45F0EE0FB64AC3B8A1B9B75066736 + +00000000000000000000000000000000:F62EE1B2DB6D84D57BEFC1C99C7F4B60:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0097B45F0EE0FB64AC3B8A1B9B75066737 + +00000000000000000000000000000000:5E4B8514D4CDFDD77796B3ED0E310AFE:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0097B45F0EE0FB64AC3B8A1B9B75066738 + +00000000000000000000000000000000:3175BBBFE5ED208D189E6B25ADEEB78B:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0097B45F0EE0FB64AC3B8A1B9B75066739 + +00000000000000000000000000000000:5AC67D25AA2BEFA746FCD6B3FF5BE1DA:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8097B45F0EE0FB64AC3B8A1B9B7506673A + +00000000000000000000000000000000:6842AA6307CC06A719828A0039FFC800:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC097B45F0EE0FB64AC3B8A1B9B7506673B + +00000000000000000000000000000000:664C66BDE4DEA06C4A79E2EC36DBA148:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE097B45F0EE0FB64AC3B8A1B9B7506673C + +00000000000000000000000000000000:F14CE6B410049F5601E8426C4DBAB6F8:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF097B45F0EE0FB64AC3B8A1B9B7506673D + +00000000000000000000000000000000:262051DCA403EFBABE2B6BD45C9952D5:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF897B45F0EE0FB64AC3B8A1B9B7506673E + +00000000000000000000000000000000:4B4D035F1419C491D8FB486510EA97D8:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC97B45F0EE0FB64AC3B8A1B9B7506673F + +00000000000000000000000000000000:152AF024DA001782BFEB875224F2622E:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE97B45F0EE0FB64AC3B8A1B9B75066740 + +00000000000000000000000000000000:8D7040135B3F89F28277A2527111CF36:\ +A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97B45F0EE0FB64AC3B8A1B9B75066741 + +[X9.31-RNG(TripleDES)] + +# Two-key TDES +0000000000000000:667BC708CC798ABE:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +8000000000000000F03E2147D5D7BC7F + +0000000000000000:E721EE3C0A2D3886:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +C000000000000000F03E2147D5D7BC80 + +0000000000000000:CB0FA40E1752F8B4:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +E000000000000000F03E2147D5D7BC81 + +0000000000000000:DF0351A5B44144A8:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +F000000000000000F03E2147D5D7BC82 + +0000000000000000:2110E29B7345A88D:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +F800000000000000F03E2147D5D7BC83 + +0000000000000000:78B751774AF554FB:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FC00000000000000F03E2147D5D7BC84 + +0000000000000000:E6BC50D6F128D30B:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FE00000000000000F03E2147D5D7BC85 + +0000000000000000:6B7A3116248AE121:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FF00000000000000F03E2147D5D7BC86 + +0000000000000000:B9B973F5CFA262BD:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FF80000000000000F03E2147D5D7BC87 + +0000000000000000:CF0A02808E4416F5:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFC0000000000000F03E2147D5D7BC88 + +0000000000000000:57AAA1031665A0F6:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFE0000000000000F03E2147D5D7BC89 + +0000000000000000:C5DA694741C400B8:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFF0000000000000F03E2147D5D7BC8A + +0000000000000000:827985C4BEED13AD:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFF8000000000000F03E2147D5D7BC8B + +0000000000000000:4C959F98D557367B:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFC000000000000F03E2147D5D7BC8C + +0000000000000000:FEB783CEC07F19E0:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFE000000000000F03E2147D5D7BC8D + +0000000000000000:B2729B4BC2D30E9A:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFF000000000000F03E2147D5D7BC8E + +0000000000000000:09F52DED6D12850F:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFF800000000000F03E2147D5D7BC8F + +0000000000000000:84255B4BEA0AD20E:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFC00000000000F03E2147D5D7BC90 + +0000000000000000:D85EC40C40BCA823:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFE00000000000F03E2147D5D7BC91 + +0000000000000000:66E000E798487EDB:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFF00000000000F03E2147D5D7BC92 + +0000000000000000:DA51E314770DC073:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFF80000000000F03E2147D5D7BC93 + +0000000000000000:3C9876ABFCD744E1:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFC0000000000F03E2147D5D7BC94 + +0000000000000000:35C48069FB403A05:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFE0000000000F03E2147D5D7BC95 + +0000000000000000:167E7A420F8CE115:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFF0000000000F03E2147D5D7BC96 + +0000000000000000:3F5F4A0BA480A18B:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFF8000000000F03E2147D5D7BC97 + +0000000000000000:F8A5AB2EFFBE6588:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFC000000000F03E2147D5D7BC98 + +0000000000000000:49D255DCA42D2980:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFE000000000F03E2147D5D7BC99 + +0000000000000000:01FD7EA6AC37D847:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFF000000000F03E2147D5D7BC9A + +0000000000000000:94A77C76071734A9:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFF800000000F03E2147D5D7BC9B + +0000000000000000:BF7E82A8F9ACEE71:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFC00000000F03E2147D5D7BC9C + +0000000000000000:F7CD2DB61C062B70:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFE00000000F03E2147D5D7BC9D + +0000000000000000:5D5FC3205EA443CB:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFF00000000F03E2147D5D7BC9E + +0000000000000000:177BA1ABE977A3BC:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFF80000000F03E2147D5D7BC9F + +0000000000000000:A216FB8EBB474E43:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFC0000000F03E2147D5D7BCA0 + +0000000000000000:EC01B37568C1C8E6:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFE0000000F03E2147D5D7BCA1 + +0000000000000000:5C99E5EC34992209:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFF0000000F03E2147D5D7BCA2 + +0000000000000000:7CA695FA30B7274C:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFF8000000F03E2147D5D7BCA3 + +0000000000000000:C4FEE5C7491D331A:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFC000000F03E2147D5D7BCA4 + +0000000000000000:E478C7F21574449D:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFE000000F03E2147D5D7BCA5 + +0000000000000000:A11D4FBD732DFD01:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFF000000F03E2147D5D7BCA6 + +0000000000000000:2C44DD477C786C0D:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFF800000F03E2147D5D7BCA7 + +0000000000000000:850D5D9DA85BC0FF:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFC00000F03E2147D5D7BCA8 + +0000000000000000:A3A6DDB46772D1B1:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFE00000F03E2147D5D7BCA9 + +0000000000000000:97FF98957CF38B00:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFF00000F03E2147D5D7BCAA + +0000000000000000:BC9E368D91CD2271:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFF80000F03E2147D5D7BCAB + +0000000000000000:6B47A38A2BBDD3C8:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFC0000F03E2147D5D7BCAC + +0000000000000000:123A41498F2F64E0:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFE0000F03E2147D5D7BCAD + +0000000000000000:7362426810CB6EAF:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFF0000F03E2147D5D7BCAE + +0000000000000000:42FB3B0EC5DBC02C:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFF8000F03E2147D5D7BCAF + +0000000000000000:B7524AB40D565D49:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFC000F03E2147D5D7BCB0 + +0000000000000000:811C84CD8E223FB5:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFE000F03E2147D5D7BCB1 + +0000000000000000:16DDAFC9DBA1194D:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFF000F03E2147D5D7BCB2 + +0000000000000000:390B6AB9069DC5B4:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFF800F03E2147D5D7BCB3 + +0000000000000000:009F167DC8664555:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFFC00F03E2147D5D7BCB4 + +0000000000000000:47645D90B39B319F:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFFE00F03E2147D5D7BCB5 + +0000000000000000:D75CEC7FBA2064DF:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFFF00F03E2147D5D7BCB6 + +0000000000000000:F59DDE3C02AD7C11:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFFF80F03E2147D5D7BCB7 + +0000000000000000:35AC2155446CCE9F:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFFFC0F03E2147D5D7BCB8 + +0000000000000000:1DFEBF13320F7758:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFFFE0F03E2147D5D7BCB9 + +0000000000000000:017CA3327FC53831:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFFFF0F03E2147D5D7BCBA + +0000000000000000:999A450B6E2040B9:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFFFF8F03E2147D5D7BCBB + +0000000000000000:49C1CAAC8C229EDE:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFFFFCF03E2147D5D7BCBC + +0000000000000000:2C9D8D0F5D014F7B:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFFFFEF03E2147D5D7BCBD + +0000000000000000:16D7C77223C2FAED:\ +E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ +FFFFFFFFFFFFFFFFF03E2147D5D7BCBE + +# Three-key TDES +0000000000000000:4AACAD89C236FA2B:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +80000000000000000167E25F4EBC7336 + +0000000000000000:A255A79AAB2211BA:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +C0000000000000000167E25F4EBC7337 + +0000000000000000:061EFE779DAB818D:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +E0000000000000000167E25F4EBC7338 + +0000000000000000:23214F0B19BF16B4:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +F0000000000000000167E25F4EBC7339 + +0000000000000000:52D38F9D53B530AF:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +F8000000000000000167E25F4EBC733A + +0000000000000000:B9F4BA694FE9BC3E:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FC000000000000000167E25F4EBC733B + +0000000000000000:2384398BBFBD3010:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FE000000000000000167E25F4EBC733C + +0000000000000000:D33ECF451E367919:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FF000000000000000167E25F4EBC733D + +0000000000000000:FAA94CA00765794C:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FF800000000000000167E25F4EBC733E + +0000000000000000:14C1303AAEE1B314:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFC00000000000000167E25F4EBC733F + +0000000000000000:DC3A4F07DC68AC93:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFE00000000000000167E25F4EBC7340 + +0000000000000000:A4872C92A093B379:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFF00000000000000167E25F4EBC7341 + +0000000000000000:3EE74CDFFBEED032:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFF80000000000000167E25F4EBC7342 + +0000000000000000:328FD9C77EDC78BA:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFC0000000000000167E25F4EBC7343 + +0000000000000000:A5D36BD81D93CB71:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFE0000000000000167E25F4EBC7344 + +0000000000000000:D0765A50A9CAE3ED:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFF0000000000000167E25F4EBC7345 + +0000000000000000:15F3441B4AC4F802:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFF8000000000000167E25F4EBC7346 + +0000000000000000:01463E8F161851C2:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFC000000000000167E25F4EBC7347 + +0000000000000000:312E7CB57F08CBC2:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFE000000000000167E25F4EBC7348 + +0000000000000000:D9688FEF358FE5DF:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFF000000000000167E25F4EBC7349 + +0000000000000000:30B34034C46E22B5:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFF800000000000167E25F4EBC734A + +0000000000000000:A7CA7218CA7D5F9D:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFC00000000000167E25F4EBC734B + +0000000000000000:CE41C7659B6BFDA3:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFE00000000000167E25F4EBC734C + +0000000000000000:B8EED0C6DFB8B76B:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFF00000000000167E25F4EBC734D + +0000000000000000:A0C514277C70278A:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFF80000000000167E25F4EBC734E + +0000000000000000:7A8F57670E11D5D8:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFC0000000000167E25F4EBC734F + +0000000000000000:35AF5134EC18E0FC:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFE0000000000167E25F4EBC7350 + +0000000000000000:3034436B0E8B1B4D:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFF0000000000167E25F4EBC7351 + +0000000000000000:B1DC17DE141AD9EC:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFF8000000000167E25F4EBC7352 + +0000000000000000:40D2868DCF3BDA80:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFC000000000167E25F4EBC7353 + +0000000000000000:D3F365825B585FF6:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFE000000000167E25F4EBC7354 + +0000000000000000:952046F8E93A268A:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFF000000000167E25F4EBC7355 + +0000000000000000:97D96E48A9216264:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFF800000000167E25F4EBC7356 + +0000000000000000:DBEE3AD97B87915C:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFC00000000167E25F4EBC7357 + +0000000000000000:94093248683E084F:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFE00000000167E25F4EBC7358 + +0000000000000000:3133C57CE22A28AB:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFF00000000167E25F4EBC7359 + +0000000000000000:B32CC354449589E1:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFF80000000167E25F4EBC735A + +0000000000000000:979F03CF867FDA3C:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFC0000000167E25F4EBC735B + +0000000000000000:6BFECB79437E62F4:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFE0000000167E25F4EBC735C + +0000000000000000:BAFB5D5B9BE92EEC:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFF0000000167E25F4EBC735D + +0000000000000000:D4FB2CAF0F114F42:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFF8000000167E25F4EBC735E + +0000000000000000:3F910FDBC4C74698:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFC000000167E25F4EBC735F + +0000000000000000:516D7E7739908FED:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFE000000167E25F4EBC7360 + +0000000000000000:50DE403CB1FB1733:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFF000000167E25F4EBC7361 + +0000000000000000:1A91443B2892FE8C:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFF800000167E25F4EBC7362 + +0000000000000000:F3A490F9FE853450:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFC00000167E25F4EBC7363 + +0000000000000000:B7F8398C9D32149C:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFE00000167E25F4EBC7364 + +0000000000000000:179C6729EBDE6A46:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFF00000167E25F4EBC7365 + +0000000000000000:34520C49E68D307B:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFF80000167E25F4EBC7366 + +0000000000000000:B6C2F4E4763DF833:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFC0000167E25F4EBC7367 + +0000000000000000:F911A2AB5E1F0E49:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFE0000167E25F4EBC7368 + +0000000000000000:307C3C11DF3EE8EA:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFF0000167E25F4EBC7369 + +0000000000000000:C26A5A02596BFE8D:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFF8000167E25F4EBC736A + +0000000000000000:B44B68C5BE17352C:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFFC000167E25F4EBC736B + +0000000000000000:3779CEB11398375F:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFFE000167E25F4EBC736C + +0000000000000000:7A9EF507F43BD31C:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFFF000167E25F4EBC736D + +0000000000000000:85CD4D72D2664C70:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFFF800167E25F4EBC736E + +0000000000000000:9EB57EACAB2B38C8:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFFFC00167E25F4EBC736F + +0000000000000000:E521B274CC7EC06F:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFFFE00167E25F4EBC7370 + +0000000000000000:50148A63F3D39097:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFFFF00167E25F4EBC7371 + +0000000000000000:6DCE0D8E770CF809:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFFFF80167E25F4EBC7372 + +0000000000000000:CAF9334B5A606C31:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFFFFC0167E25F4EBC7373 + +0000000000000000:1088488A43D9ACAD:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFFFFE0167E25F4EBC7374 + +0000000000000000:F922C4B2357E9034:\ +5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ +FFFFFFFFFFFFFFFF0167E25F4EBC7375 + diff --git a/src/libs/3rdparty/botan/checks/validate.h b/src/libs/3rdparty/botan/checks/validate.h new file mode 100644 index 00000000000..f7cc4bdf998 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/validate.h @@ -0,0 +1,34 @@ + +#ifndef BOTAN_TEST_VALIDATE_H__ +#define BOTAN_TEST_VALIDATE_H__ + +#include +#include +#include + +using Botan::RandomNumberGenerator; + +using Botan::u32bit; + +u32bit do_validation_tests(const std::string&, + RandomNumberGenerator& rng, + bool = true); + +u32bit do_bigint_tests(const std::string&, + RandomNumberGenerator& rng); + +u32bit do_gfpmath_tests(RandomNumberGenerator& rng); + + +u32bit do_pk_validation_tests(const std::string&, + RandomNumberGenerator&); + +void do_ec_tests(RandomNumberGenerator& rng); + +u32bit do_ecdsa_tests(RandomNumberGenerator& rng); +u32bit do_eckaeg_tests(RandomNumberGenerator& rng); +u32bit do_cvc_tests(RandomNumberGenerator& rng); + +void do_x509_tests(RandomNumberGenerator&); + +#endif diff --git a/src/libs/3rdparty/botan/checks/x509.cpp b/src/libs/3rdparty/botan/checks/x509.cpp new file mode 100644 index 00000000000..6f191285c38 --- /dev/null +++ b/src/libs/3rdparty/botan/checks/x509.cpp @@ -0,0 +1,224 @@ + +#include + +#if defined(BOTAN_HAS_RSA) + #include +#endif + +#if defined(BOTAN_HAS_DSA) + #include +#endif + +#if defined(BOTAN_HAS_ECDSA) + #include +#endif + +#ifdef BOTAN_HAS_X509 + #include + #include + #include + #include +#endif + +using namespace Botan; + +#include +#include + +#include "validate.h" +#include "common.h" + +#if defined(BOTAN_HAS_X509) && defined(BOTAN_HAS_RSA) && defined(BOTAN_HAS_DSA) + +namespace { + +u64bit key_id(const Public_Key* key) + { + std::auto_ptr encoder(key->x509_encoder()); + if(!encoder.get()) + throw Internal_Error("Public_Key:key_id: No encoder found"); + + Pipe pipe(new Hash_Filter("SHA-1", 8)); + pipe.start_msg(); + pipe.write(key->algo_name()); + pipe.write(encoder->alg_id().parameters); + pipe.write(encoder->key_bits()); + pipe.end_msg(); + + SecureVector output = pipe.read_all(); + + if(output.size() != 8) + throw Internal_Error("Public_Key::key_id: Incorrect output size"); + + u64bit id = 0; + for(u32bit j = 0; j != 8; ++j) + id = (id << 8) | output[j]; + return id; + } + + +/* Return some option sets */ +X509_Cert_Options ca_opts() + { + X509_Cert_Options opts("Test CA/US/Botan Project/Testing"); + + opts.uri = "http://botan.randombit.net"; + opts.dns = "botan.randombit.net"; + opts.email = "testing@randombit.net"; + + opts.CA_key(1); + + return opts; + } + +X509_Cert_Options req_opts1() + { + X509_Cert_Options opts("Test User 1/US/Botan Project/Testing"); + + opts.uri = "http://botan.randombit.net"; + opts.dns = "botan.randombit.net"; + opts.email = "testing@randombit.net"; + + return opts; + } + +X509_Cert_Options req_opts2() + { + X509_Cert_Options opts("Test User 2/US/Botan Project/Testing"); + + opts.uri = "http://botan.randombit.net"; + opts.dns = "botan.randombit.net"; + opts.email = "testing@randombit.net"; + + opts.add_ex_constraint("PKIX.EmailProtection"); + + return opts; + } + +u32bit check_against_copy(const Private_Key& orig, + RandomNumberGenerator& rng) + { + Private_Key* copy_priv = PKCS8::copy_key(orig, rng); + Public_Key* copy_pub = X509::copy_key(orig); + + const std::string passphrase= "I need work! -Mr. T"; + DataSource_Memory enc_source(PKCS8::PEM_encode(orig, rng, passphrase)); + Private_Key* copy_priv_enc = PKCS8::load_key(enc_source, rng, + passphrase); + + u64bit orig_id = key_id(&orig); + u64bit pub_id = key_id(copy_pub); + u64bit priv_id = key_id(copy_priv); + u64bit priv_enc_id = key_id(copy_priv_enc); + + delete copy_pub; + delete copy_priv; + delete copy_priv_enc; + + if(orig_id != pub_id || orig_id != priv_id || orig_id != priv_enc_id) + { + std::cout << "Failed copy check\n"; + return 1; + } + return 0; + } + +} + +void do_x509_tests(RandomNumberGenerator& rng) + { + std::cout << "Testing X.509 CA/CRL/cert/cert request: " << std::flush; + + /* Create the CA's key and self-signed cert */ + std::cout << '.' << std::flush; + RSA_PrivateKey ca_key(rng, 1024); + + std::cout << '.' << std::flush; + X509_Certificate ca_cert = X509::create_self_signed_cert(ca_opts(), + ca_key, + rng); + std::cout << '.' << std::flush; + + /* Create user #1's key and cert request */ + std::cout << '.' << std::flush; + DSA_PrivateKey user1_key(rng, DL_Group("dsa/jce/1024")); + + std::cout << '.' << std::flush; + PKCS10_Request user1_req = X509::create_cert_req(req_opts1(), + user1_key, + rng); + + /* Create user #2's key and cert request */ + std::cout << '.' << std::flush; +#if defined(BOTAN_HAS_ECDSA) + ECDSA_PrivateKey user2_key(rng, get_EC_Dom_Pars_by_oid("1.3.132.0.8")); +#else + RSA_PrivateKey user2_key(rng, 1024); +#endif + + std::cout << '.' << std::flush; + PKCS10_Request user2_req = X509::create_cert_req(req_opts2(), + user2_key, + rng); + + /* Create the CA object */ + std::cout << '.' << std::flush; + X509_CA ca(ca_cert, ca_key); + std::cout << '.' << std::flush; + + /* Sign the requests to create the certs */ + std::cout << '.' << std::flush; + X509_Certificate user1_cert = + ca.sign_request(user1_req, rng, + X509_Time("2008-01-01"), X509_Time("2100-01-01")); + + std::cout << '.' << std::flush; + X509_Certificate user2_cert = ca.sign_request(user2_req, rng, + X509_Time("2008-01-01"), + X509_Time("2100-01-01")); + std::cout << '.' << std::flush; + + X509_CRL crl1 = ca.new_crl(rng); + + /* Verify the certs */ + X509_Store store; + + store.add_cert(ca_cert, true); // second arg == true: trusted CA cert + + std::cout << '.' << std::flush; + if(store.validate_cert(user1_cert) != VERIFIED) + std::cout << "\nFAILED: User cert #1 did not validate" << std::endl; + + if(store.validate_cert(user2_cert) != VERIFIED) + std::cout << "\nFAILED: User cert #2 did not validate" << std::endl; + + if(store.add_crl(crl1) != VERIFIED) + std::cout << "\nFAILED: CRL #1 did not validate" << std::endl; + + std::vector revoked; + revoked.push_back(user2_cert); + + X509_CRL crl2 = ca.update_crl(crl1, revoked, rng); + + if(store.add_crl(crl2) != VERIFIED) + std::cout << "\nFAILED: CRL #2 did not validate" << std::endl; + + if(store.validate_cert(user2_cert) != CERT_IS_REVOKED) + std::cout << "\nFAILED: User cert #2 was not revoked" << std::endl; + + check_against_copy(ca_key, rng); + check_against_copy(user1_key, rng); + check_against_copy(user2_key, rng); + + std::cout << std::endl; + } + +#else + +void do_x509_tests(RandomNumberGenerator&) + { + std::cout << "Skipping Botan X.509 tests (disabled in build)\n"; + } + +#endif + diff --git a/src/libs/3rdparty/botan/configure.pl b/src/libs/3rdparty/botan/configure.pl new file mode 100644 index 00000000000..1ce01e2b4ba --- /dev/null +++ b/src/libs/3rdparty/botan/configure.pl @@ -0,0 +1,2340 @@ +#!/usr/bin/perl -w + +require 5.006; + +use strict; + +use Config; +use Getopt::Long; +use File::Spec; +use File::Copy; +use File::Find; +use Sys::Hostname; + +my $MAJOR_VERSION = 1; +my $MINOR_VERSION = 8; +my $PATCH_VERSION = 8; + +my $VERSION_SUFFIX = ''; + +my $SO_PATCH_VERSION = 2; + +my $VERSION_STRING = "$MAJOR_VERSION.$MINOR_VERSION.$PATCH_VERSION$VERSION_SUFFIX"; +my $SO_VERSION_STRING = "$MAJOR_VERSION.$MINOR_VERSION.$SO_PATCH_VERSION$VERSION_SUFFIX"; + +################################################## +# Data # +################################################## +my (%CPU, %OPERATING_SYSTEM, %COMPILER, %MODULES); + +my @DOCS = ( + 'api.pdf', 'tutorial.pdf', 'fips140.pdf', + 'api.tex', 'tutorial.tex', 'fips140.tex', + 'credits.txt', 'license.txt', 'log.txt', + 'thanks.txt', 'todo.txt', 'pgpkeys.asc'); + +my $TRACING = 0; + +################################################## +# Run main() and Quit # +################################################## +my $config = {}; + +main(); +exit; + +sub exec_uname { + # Only exec it if we think it might actually work + if(-f '/bin/uname' || -f '/usr/bin/uname' || -f '/bin/sh') { + my $uname = `uname -a`; + if($uname) { + chomp $uname; + return $uname; + } + } + + return ''; +} + +sub deprecation_warning { + warning("$0 is deprecated; migration to ./configure.py strongly recommended"); +} + +################################################## +# Main Driver # +################################################## +sub main { + my $base_dir = where_am_i(); + + deprecation_warning(); + + $$config{'uname'} = exec_uname(); + + $$config{'base-dir'} = $base_dir; + $$config{'src-dir'} = File::Spec->catdir($base_dir, 'src'); + $$config{'checks-dir'} = File::Spec->catdir($base_dir, 'checks'); + $$config{'doc_src_dir'} = File::Spec->catdir($base_dir, 'doc'); + + $$config{'config-dir'} = + File::Spec->catdir($$config{'src-dir'}, 'build-data'); + + $$config{'command_line'} = $0 . ' ' . join(' ', @ARGV); + $$config{'timestamp'} = gmtime; + $$config{'user'} = getlogin || getpwuid($<) || ''; + $$config{'hostname'} = hostname; + + %CPU = read_info_files($config, 'arch', \&get_arch_info); + %OPERATING_SYSTEM = read_info_files($config, 'os', \&get_os_info); + %COMPILER = read_info_files($config, 'cc', \&get_cc_info); + %MODULES = read_module_files($config); + + add_to($config, { + 'version_major' => $MAJOR_VERSION, + 'version_minor' => $MINOR_VERSION, + 'version_patch' => $PATCH_VERSION, + 'version' => $VERSION_STRING, + 'so_version' => $SO_VERSION_STRING, + }); + + get_options($config); + + my $default_value_is = sub { + my ($var, $val) = @_; + $$config{$var} = $val if not defined($$config{$var}); + }; + + &$default_value_is('gcc_bug', 0); + &$default_value_is('autoconfig', 1); + &$default_value_is('debug', 0); + &$default_value_is('shared', 'yes'); + &$default_value_is('local_config', ''); + + # Goes into build-specific dirs (maybe) + + $$config{'build_dir'} = 'build'; + $$config{'botan_config'} = File::Spec->catfile( + $$config{'build_dir'}, 'botan-config'); + + $$config{'botan_pkgconfig'} = File::Spec->catfile( + $$config{'build_dir'}, + 'botan-' . $MAJOR_VERSION . '.' . $MINOR_VERSION . '.pc'); + + $$config{'makefile'} = 'Makefile'; + $$config{'check_prefix'} = ''; + $$config{'lib_prefix'} = ''; + + if(defined($$config{'with_build_dir'})) { + for my $var ('build_dir', + 'botan_config', + 'botan_pkgconfig', + 'makefile', + 'check_prefix', + 'lib_prefix') + { + $$config{$var} = File::Spec->catfile($$config{'with_build_dir'}, + $$config{$var}); + } + } + else { + } + + choose_target($config); + + my $os = $$config{'os'}; + my $cc = $$config{'compiler'}; + + &$default_value_is('prefix', os_info_for($os, 'install_root')); + &$default_value_is('libdir', os_info_for($os, 'lib_dir')); + &$default_value_is('docdir', os_info_for($os, 'doc_dir')); + &$default_value_is('make_style', $COMPILER{$cc}{'makefile_style'}); + + scan_modules($config); + + print_enabled_modules($config); + + add_to($config, { + 'includedir' => os_info_for($os, 'header_dir'), + + 'build_lib' => File::Spec->catdir($$config{'build_dir'}, 'lib'), + 'build_check' => File::Spec->catdir($$config{'build_dir'}, 'checks'), + 'build_include' => + File::Spec->catdir($$config{'build_dir'}, 'include'), + 'build_include_botan' => + File::Spec->catdir($$config{'build_dir'}, 'include', 'botan'), + + 'mp_bits' => find_mp_bits($config), + 'mod_libs' => [ using_libs($config) ], + + 'sources' => { }, + 'includes' => { }, + + 'check_src' => { + map_to($$config{'checks-dir'}, + grep { $_ ne 'keys' and !m@\.(dat|h)$@ } + dir_list($$config{'checks-dir'})) + } + }); + + load_modules($config); + + my @dirs = mkdirs($$config{'build_dir'}, + $$config{'build_include'}, + $$config{'build_include_botan'}, + $$config{'build_lib'}, + $$config{'build_check'}); + + #autoconfig('Created ' . join(' ', @dirs)) if @dirs; + + write_pkg_config($config); + + determine_config($config); + + process_template(File::Spec->catfile($$config{'config-dir'}, 'buildh.in'), + File::Spec->catfile($$config{'build_dir'}, 'build.h'), + $config); + + process_template(File::Spec->catfile( + $$config{'config-dir'}, 'botan.doxy.in'), + File::Spec->catfile($$config{'doc_src_dir'}, 'botan.doxy'), + $config); + + $$config{'includes'}{'build.h'} = $$config{'build_dir'}; + + generate_makefile($config); + + copy_include_files($config); + + deprecation_warning(); +} + +sub where_am_i { + my ($volume,$dir,$file) = File::Spec->splitpath($0); + my $src_dir = File::Spec->catpath($volume, $dir, ''); + return $src_dir if $src_dir; + return File::Spec->curdir(); +} + +################################################## +# Diagnostics # +################################################## +sub with_diagnostic { + my ($type, @args) = @_; + + my $args = join('', @args); + my $str = "($type): "; + while(length($str) < 14) { $str = ' ' . $str; } + + $str .= $args . "\n"; + return $str; +} + +sub croak { + die with_diagnostic('error', @_); +} + +sub warning { + warn with_diagnostic('warning', @_); +} + +sub autoconfig { + print with_diagnostic('autoconfig', @_); +} + +sub emit_help { + print join('', @_); + exit; +} + +sub trace { + return unless $TRACING; + + my (undef, undef, $line) = caller(0); + my (undef, undef, undef, $func) = caller(1); + + $func =~ s/main:://; + + print with_diagnostic('trace', "at $func:$line - ", @_); +} + +################################################## +# Display Help and Quit # +################################################## +sub display_help { + sub module_sets { + my %modsets; + for my $name (sort keys %MODULES) { + my %info = %{$MODULES{$name}}; + next unless (defined($info{'modset'})); + + for my $s (split(/,/, $info{'modset'})) { + $modsets{$s} = undef; + } + } + + return sort keys %modsets; + } + + my $sets = join(' ', module_sets()); + + my $listing = sub { + my (@list) = @_; + + return '' if (@list == 0); + + my ($output, $len) = ('', 0); + + my $append = sub { + my ($to_append) = @_; + $output .= $to_append; + $len += length $to_append; + }; + + foreach my $name (sort @list) { + next if $name eq 'defaults'; + if($len > 58) { + $output .= "\n "; + $len = 8; + } + &$append($name . ' '); + } + chop $output; + return $output; + }; + + #my $modules = &$listing(keys %MODULES); + my $compilers = &$listing(keys %COMPILER); + my $oses = &$listing(keys %OPERATING_SYSTEM); + my $cpus = &$listing(keys %CPU); + + my $helptxt = <&1`; + + $gcc_version = '' if not defined $gcc_version; + + my $has_ll_bug = 0; + $has_ll_bug = 1 if($gcc_version =~ /4\.[01234]/); + $has_ll_bug = 1 if($gcc_version =~ /3\.[34]/); + $has_ll_bug = 1 if($gcc_version =~ /2\.95\.[0-4]/); + $has_ll_bug = 1 if($gcc_version eq ''); + + $has_ll_bug = 0 if($arch eq 'alpha' or $arch =~ /.*64$/); + + if($has_ll_bug) + { + warning('Enabling -fpermissive to work around ', + 'possible GCC bug'); + + $$config{'gcc_bug'} = 1; + } + + warning('GCC 2.95.x issues many spurious warnings') + if($gcc_version =~ /2\.95\.[0-4]/); + } + } + + trace("using $cc $os $arch $submodel"); + + add_to($config, { + 'compiler' => $cc, + 'os' => $os, + 'arch' => $arch, + 'submodel' => $submodel, + }); +} + +sub module_runs_on { + my ($config, $modinfo, $mod, $noisy) = @_; + + my $cc = $$config{'compiler'}; + my $os = $$config{'os'}; + my $submodel = $$config{'submodel'}; + my $arch = $$config{'arch'}; + + my %modinfo = %{$modinfo}; + + my $realname = $modinfo{'realname'}; + + my @arch_list = @{ $modinfo{'arch'} }; + if(scalar @arch_list > 0 && !in_array($arch, \@arch_list) && + !in_array($submodel, \@arch_list)) + { + autoconfig("$mod ($realname): skipping, " . + "not compatible with " . realname($arch) . + "/" . $submodel) if $noisy; + return 0; + } + + my @os_list = @{ $modinfo{'os'} }; + if(scalar @os_list > 0 && !in_array($os, \@os_list)) + { + autoconfig("$mod ($realname): " . + "skipping, not compatible with " . realname($os)) if $noisy; + return 0; + } + + my @cc_list = @{ $modinfo{'cc'} }; + if(scalar @cc_list > 0 && !in_array($cc, \@cc_list)) { + autoconfig("$mod ($realname): " . + "skipping, not compatible with " . realname($cc)) if $noisy; + return 0; + } + + + if($modinfo{'uses_tr1'} eq 'yes') { + return 0 unless defined($$config{'tr1'}); + + my $tr1 = $$config{'tr1'}; + return 0 unless($tr1 eq 'system' or $tr1 eq 'boost'); + } + + return 1; +} + +sub scan_modules { + my ($config) = @_; + + foreach my $mod (sort keys %MODULES) { + my %modinfo = %{ $MODULES{$mod} }; + + next if(defined($$config{'modules'}{$mod}) && $$config{'modules'}{$mod} < 0); + + next unless(module_runs_on($config, \%modinfo, $mod, 0)); + + if($modinfo{'load_on'} eq 'auto' or + $modinfo{'load_on'} eq 'always' or + ($modinfo{'load_on'} eq 'asm_ok' and $$config{'asm_ok'})) { + + my %maybe_load = (); + my $all_deps_found = 1; + + LINE: foreach (@{$modinfo{'requires'}}) { + for my $req_mod (split(/\|/, $_)) { + next unless defined $MODULES{$req_mod}; + + next if(defined($$config{'modules'}{$req_mod}) && $$config{'modules'}{$req_mod} < 0); + next unless(module_runs_on($config, $MODULES{$req_mod}, $req_mod, 0)); + + $maybe_load{$req_mod} = 1; + next LINE; + } + $all_deps_found = 0; + } + + if($all_deps_found) { + foreach my $depmod (keys %maybe_load) + { $$config{'modules'}{$depmod} = 1; } + $$config{'modules'}{$mod} = 1; + } + } + } +} + +sub print_enabled_modules { + my ($config) = @_; + + return unless($$config{'verbose'}); + + my %by_type; + + foreach my $mod (sort keys %MODULES) { + my $type = $MODULES{$mod}{'type'}; + + my $n = 0; + $n = 1 if($$config{'modules'}{$mod} && $$config{'modules'}{$mod} > 0); + + $by_type{$type}{$mod} = $n; + } + + for my $type (sort keys %by_type) { + my %mods = %{$by_type{$type}}; + + my @load_lines; + + if(keys %mods == 1) { + my $on = $mods{$type}; + + if($on > 0) { + print with_diagnostic('loading', $type); + } + else { + print with_diagnostic('loading', '[', $type , ']'); + } + } + else { + my $s = $type . ': '; + + for my $mod (sort keys %mods) { + my $on = $mods{$mod}; + + if($s eq '') { + $s = ' ' x (length($type) + 16); + } + + if($on > 0) { + $s .= $mod . ' '; + } + else { + $s .= '[' . $mod . '] '; + } + + if(length($s) > 60) { + push @load_lines, $s; + $s = ''; + } + } + + #print "Last1 '$s'\n"; + + $s =~ s/\s*$//m; # strip trailing whitespace + + push @load_lines, $s if($s ne ''); + + + print with_diagnostic('loading', join("\n", @load_lines)); + } + } +} + +sub get_options { + my ($config) = @_; + + my $save_option = sub { + my ($opt, $val) = @_; + $opt =~ s/-/_/g; + $$config{$opt} = $val; + }; + + $$config{'verbose'} = 1; + $$config{'asm_ok'} = 1; + $$config{'tr1'} = undef; # not enabled by default + $$config{'modules'} = {}; + + sub arch_info { + my $arg = $_[0]; + + my $arch = find_arch($arg); + + unless(defined($arch) and defined($CPU{$arch})) { + warning("Unknown arch '$arg' passed to --arch-info (try --help)"); + return ''; + } + + my %info = %{ $CPU{$arch} }; + + my $out = "Information for $arg ($arch)\n--------\n"; + + if(@{$info{'aliases'}}) { + $out .= 'Aliases: ' . join(' ', @{$info{'aliases'}}) . "\n"; + } + + if(@{$info{'submodels'}}) { + $out .= 'Submodels: ' . join(' ', @{$info{'submodels'}}) . "\n"; + } + + foreach my $k (keys %{$info{'submodel_aliases'}}) { + $out .= "Alias '$k' -> '" . $info{'submodel_aliases'}{$k} . "'\n"; + } + + if(defined($info{'endian'})) { + $out .= 'Default endian: ' . $info{'endian'} . "\n"; + } + + if(defined($info{'unaligned'})) { + $out .= 'Unaligned memory access: ' . $info{'unaligned'} . "\n"; + } + + return $out; + } + + sub add_modules { + my ($config,$mods) = @_; + + foreach my $mod (split(/,/, $mods)) { + # -1 means disabled by user, do not load + $$config{'modules'}{$mod} = 1 unless( + defined($$config{'modules'}{$mod}) && + $$config{'modules'}{$mod} == -1); + } + } + + sub disable_modules { + my ($config,$mods) = @_; + + foreach my $mod (split(/,/, $mods)) { + # -1 means disabled by user, do not load + $$config{'modules'}{$mod} = -1; + } + } + + sub add_module_sets { + my ($config,$sets) = @_; + + foreach my $set (split(/,/, $sets)) { + for my $mod (sort keys %MODULES) { + my %info = %{$MODULES{$mod}}; + + next unless (defined($info{'modset'})); + + for my $s (split(/,/, $info{'modset'})) { + if($s eq $set) { + $$config{'modules'}{$mod} = 1 + unless($$config{'modules'}{$mod} == -1); + } + } + } + } + } + + exit 1 unless GetOptions( + 'prefix=s' => sub { &$save_option(@_); }, + 'exec-prefix=s' => sub { &$save_option(@_); }, + + 'bindir=s' => sub { &$save_option(@_); }, + 'datadir' => sub { &$save_option(@_); }, + 'datarootdir' => sub { &$save_option(@_); }, + 'docdir=s' => sub { &$save_option(@_); }, + 'dvidir' => sub { &$save_option(@_); }, + 'htmldir' => sub { &$save_option(@_); }, + 'includedir' => sub { &$save_option(@_); }, + 'infodir' => sub { &$save_option(@_); }, + 'libdir=s' => sub { &$save_option(@_); }, + 'libexecdir' => sub { &$save_option(@_); }, + 'localedir' => sub { &$save_option(@_); }, + 'localstatedir' => sub { &$save_option(@_); }, + 'mandir' => sub { &$save_option(@_); }, + 'oldincludedir' => sub { &$save_option(@_); }, + 'pdfdir' => sub { &$save_option(@_); }, + 'psdir' => sub { &$save_option(@_); }, + 'sbindir=s' => sub { &$save_option(@_); }, + 'sharedstatedir' => sub { &$save_option(@_); }, + 'sysconfdir' => sub { &$save_option(@_); }, + + 'cc=s' => sub { &$save_option('compiler', $_[1]) }, + 'os=s' => sub { &$save_option(@_) }, + 'cpu=s' => sub { &$save_option(@_) }, + + 'help' => sub { display_help(); }, + 'module-info' => sub { emit_help(module_info()); }, + 'version' => sub { emit_help("$VERSION_STRING\n") }, + 'so-version' => sub { emit_help("$SO_VERSION_STRING\n") }, + + 'with-tr1-implementation=s' => sub { $$config{'tr1'} = $_[1]; }, + + 'quiet' => sub { $$config{'verbose'} = 0; }, + 'trace' => sub { $TRACING = 1; }, + + 'enable-asm' => sub { $$config{'asm_ok'} = 1; }, + 'disable-asm' => sub { $$config{'asm_ok'} = 0; }, + + 'enable-autoconfig' => sub { $$config{'autoconfig'} = 1; }, + 'disable-autoconfig' => sub { $$config{'autoconfig'} = 0; }, + + 'enable-shared' => sub { $$config{'shared'} = 'yes'; }, + 'disable-shared' => sub { $$config{'shared'} = 'no'; }, + + 'enable-debug' => sub { &$save_option('debug', 1); }, + 'disable-debug' => sub { &$save_option('debug', 0); }, + + 'enable-modules:s' => sub { add_modules($config, $_[1]); }, + 'disable-modules:s' => sub { disable_modules($config, $_[1]); }, + + 'with-openssl' => sub { add_modules($config, 'openssl'); }, + 'without-openssl' => sub { disable_modules($config, 'openssl'); }, + 'with-gnump' => sub { add_modules($config, 'gnump'); }, + 'without-gnump' => sub { disable_modules($config, 'gnump'); }, + 'with-bzip2' => sub { add_modules($config, 'bzip2'); }, + 'without-bzip2' => sub { disable_modules($config, 'bzip2'); }, + 'with-zlib' => sub { add_modules($config, 'zlib'); }, + 'without-zlib' => sub { disable_modules($config, 'zlib'); }, + + 'use-module-set=s' => sub { add_module_sets($config, $_[1]); }, + + 'with-build-dir=s' => sub { &$save_option(@_); }, + 'with-endian=s' => sub { &$save_option(@_); }, + 'with-unaligned-mem=s' => sub { &$save_option(@_); }, + 'with-local-config=s' => + sub { &$save_option('local_config', slurp_file($_[1])); }, + + 'modules=s' => sub { add_modules($config, $_[1]); }, + 'show-arch-info=s' => sub { emit_help(arch_info($_[1])); }, + 'make-style=s' => sub { &$save_option(@_); }, + 'dumb-gcc|gcc295x' => sub { $$config{'gcc_bug'} = 1; } + ); + + # All arguments should now be consumed + croak("Unknown option $ARGV[0] (try --help)") unless($#ARGV == -1); +} + +################################################## +# Functions to search the info tables # +################################################## +sub find_arch { + my $name = $_[0]; + + foreach my $arch (keys %CPU) { + my %info = %{$CPU{$arch}}; + + return $arch if($name eq $arch); + + foreach my $alias (@{$info{'aliases'}}) { + return $arch if($name eq $alias); + } + + foreach my $submodel (@{$info{'submodels'}}) { + return $arch if($name eq $submodel); + } + + foreach my $submodel (keys %{$info{'submodel_aliases'}}) { + return $arch if($name eq $submodel); + } + } + return undef; +}; + +sub figure_out_arch { + my ($name) = @_; + + return ('generic', 'generic') if($name eq 'generic'); + + my $submodel_alias = sub { + my ($name,$info) = @_; + + my %info = %{$info}; + + foreach my $submodel (@{$info{'submodels'}}) { + return $submodel if($name eq $submodel); + } + + return '' unless defined $info{'submodel_aliases'}; + my %sm_aliases = %{$info{'submodel_aliases'}}; + + foreach my $alias (keys %sm_aliases) { + my $official = $sm_aliases{$alias}; + return $official if($alias eq $name); + } + return ''; + }; + + my $arch = find_arch($name); + croak("Arch type $name isn't known (try --help)") unless defined $arch; + trace("mapped name '$name' to arch '$arch'"); + + my %archinfo = %{ $CPU{$arch} }; + + my $submodel = &$submodel_alias($name, \%archinfo); + + if($submodel eq '') { + $submodel = $archinfo{'default_submodel'}; + + autoconfig("Using $submodel as default type for family ", + realname($arch)) if($submodel ne $arch); + } + + trace("mapped name '$name' to submodel '$submodel'"); + + croak("Couldn't figure out arch type of $name") + unless defined($arch) and defined($submodel); + + return ($arch,$submodel); +} + +sub os_alias { + my $name = $_[0]; + + foreach my $os (keys %OPERATING_SYSTEM) { + foreach my $alias (@{$OPERATING_SYSTEM{$os}{'aliases'}}) { + if($alias eq $name) { + trace("os_alias($name) -> $os"); + return $os; + } + } + } + + return $name; +} + +sub os_info_for { + my ($os,$what) = @_; + + die unless defined($os); + + croak('os_info_for called with an os of defaults (internal problem)') + if($os eq 'defaults'); + + my $result = ''; + + if(defined($OPERATING_SYSTEM{$os})) { + my %osinfo = %{$OPERATING_SYSTEM{$os}}; + $result = $osinfo{$what}; + } + + if(!defined($result) or $result eq '') { + $result = $OPERATING_SYSTEM{'defaults'}{$what}; + } + + croak("os_info_for: No info for $what on $os") unless defined $result; + + return $result; +} + +sub my_compiler { + my ($config) = @_; + my $cc = $$config{'compiler'}; + + croak('my_compiler called, but no compiler set in config') + unless defined $cc and $cc ne ''; + + croak("unknown compiler $cc") unless defined $COMPILER{$cc}; + + return %{$COMPILER{$cc}}; +} + +sub mach_opt { + my ($config) = @_; + + my %ccinfo = my_compiler($config); + + # Nothing we can do in that case + return '' unless $ccinfo{'mach_opt_flags'}; + + my $submodel = $$config{'submodel'}; + my $arch = $$config{'arch'}; + if(defined($ccinfo{'mach_opt_flags'}{$submodel})) + { + return $ccinfo{'mach_opt_flags'}{$submodel}; + } + elsif(defined($ccinfo{'mach_opt_flags'}{$arch})) { + my $mach_opt_flags = $ccinfo{'mach_opt_flags'}{$arch}; + my $processed_modelname = $submodel; + + my $remove = ''; + if(defined($ccinfo{'mach_opt_re'}) and + defined($ccinfo{'mach_opt_re'}{$arch})) { + $remove = $ccinfo{'mach_opt_re'}{$arch}; + } + + $processed_modelname =~ s/$remove//; + $mach_opt_flags =~ s/SUBMODEL/$processed_modelname/g; + return $mach_opt_flags; + } + return ''; +} + +################################################## +# # +################################################## +sub using_libs { + my ($config) = @_; + + my $os = $$config{'os'}; + my %libs; + + foreach my $mod (sort keys %{$$config{'modules'}}) { + next if ${$$config{'modules'}}{$mod} < 0; + + my %MOD_LIBS = %{ $MODULES{$mod}{'libs'} }; + + foreach my $mod_os (keys %MOD_LIBS) + { + next if($mod_os =~ /^all!$os$/); + next if($mod_os =~ /^all!$os,/); + #next if($mod_os =~ /^all!.*,${os}$/); + next if($mod_os =~ /^all!.*,$os,.*/); + next unless($mod_os eq $os or ($mod_os =~ /^all.*/)); + my @liblist = split(/,/, $MOD_LIBS{$mod_os}); + foreach my $lib (@liblist) { $libs{$lib} = 1; } + } + } + + return sort keys %libs; +} + +sub libs { + my ($prefix,$suffix,@libs) = @_; + my $output = ''; + foreach my $lib (@libs) { + $output .= ' ' if($output ne ''); + $output .= $prefix . $lib . $suffix; + } + return $output; +} + +################################################## +# Path and file manipulation utilities # +################################################## +sub portable_symlink { + my ($from, $to_dir, $to_fname) = @_; + + #trace("portable_symlink($from, $to_dir, $to_fname)"); + + my $can_symlink = 0; + my $can_link = 0; + + unless($^O eq 'MSWin32' or $^O eq 'dos' or $^O eq 'cygwin') { + $can_symlink = eval { symlink("",""); 1 }; + $can_link = eval { link("",""); 1 }; + } + + chdir $to_dir or croak("Can't chdir to $to_dir ($!)"); + + if($can_symlink) { + symlink $from, $to_fname or + croak("Can't symlink $from to $to_fname ($!)"); + } + elsif($can_link) { + link $from, $to_fname or + croak("Can't link $from to $to_fname ($!)"); + } + else { + copy ($from, $to_fname) or + croak("Can't copy $from to $to_fname ($!)"); + } + + my $go_up = File::Spec->splitdir($to_dir); + for(my $j = 0; $j != $go_up; $j++) # return to where we were + { + chdir File::Spec->updir(); + } +} + +sub copy_include_files { + my ($config) = @_; + + my $include_dir = $$config{'build_include_botan'}; + + trace('Copying to ', $include_dir); + + foreach my $file (dir_list($include_dir)) { + my $path = File::Spec->catfile($include_dir, $file); + unlink $path or croak("Could not unlink $path ($!)"); + } + + my $link_up = sub { + my ($dir, $file) = @_; + my $updir = File::Spec->updir(); + portable_symlink(File::Spec->catfile($updir, $updir, $updir, + $dir, $file), + $include_dir, $file); + }; + + my $files = $$config{'includes'}; + + foreach my $file (keys %$files) { + &$link_up($$files{$file}, $file); + } +} + +sub dir_list { + my ($dir) = @_; + opendir(DIR, $dir) or croak("Couldn't read directory '$dir' ($!)"); + + my @listing = grep { !/#/ and -f File::Spec->catfile($dir, $_) and + $_ ne File::Spec->curdir() and + $_ ne File::Spec->updir() } readdir DIR; + + closedir DIR; + return @listing; +} + +sub mkdirs { + my (@dirs) = @_; + + my @created; + foreach my $dir (@dirs) { + next if( -e $dir and -d $dir ); # skip it if it's already there + mkdir($dir, 0777) or + croak("Could not create directory $dir ($!)"); + push @created, $dir; + } + return @created; +} + +sub slurp_file { + my $file = $_[0]; + + return '' if(!defined($file) or $file eq ''); + + croak("'$file': No such file") unless(-e $file); + croak("'$file': Not a regular file") unless(-f $file); + + open FILE, "<$file" or croak("Couldn't read $file ($!)"); + + my $output = ''; + while() { $output .= $_; } + close FILE; + + return $output; +} + +sub which +{ + my $file = $_[0]; + my @paths = split(/:/, $ENV{PATH}); + foreach my $path (@paths) + { + my $file_path = File::Spec->catfile($path, $file); + return $file_path if(-e $file_path and -r $file_path); + } + return ''; +} + +# Return a hash mapping every var in a list to a constant value +sub map_to { + my $var = shift; + return map { $_ => $var } @_; +} + +sub in_array { + my($target, $array) = @_; + return 0 unless defined($array); + foreach (@$array) { return 1 if($_ eq $target); } + return 0; +} + +sub add_to { + my ($to,$from) = @_; + + foreach my $key (keys %$from) { + $$to{$key} = $$from{$key}; + } +} + +################################################## +# # +################################################## +sub find_mp_bits { + my(@modules_list) = @_; + my $mp_bits = 32; # default, good for most systems + + my $seen_mp_module = undef; + + foreach my $modname (sort keys %{$$config{'modules'}}) { + croak("Unknown module $modname") unless defined $MODULES{$modname}; + + next if $$config{'modules'}{$modname} < 0; + + my %modinfo = %{ $MODULES{$modname} }; + if($modinfo{'mp_bits'}) { + if(defined($seen_mp_module) and $modinfo{'mp_bits'} != $mp_bits) { + croak('Inconsistent mp_bits requests from modules ', + $seen_mp_module, ' and ', $modname); + } + + $seen_mp_module = $modname; + $mp_bits = $modinfo{'mp_bits'}; + } + } + return $mp_bits; +} + +################################################## +# # +################################################## +sub realname { + my $arg = $_[0]; + + return $COMPILER{$arg}{'realname'} + if defined $COMPILER{$arg}; + + return $OPERATING_SYSTEM{$arg}{'realname'} + if defined $OPERATING_SYSTEM{$arg}; + + return $CPU{$arg}{'realname'} + if defined $CPU{$arg}; + + return $arg; +} + +################################################## +# # +################################################## + +sub load_module { + my ($config, $modname) = @_; + + #trace("load_module($modname)"); + + croak("Unknown module $modname") unless defined($MODULES{$modname}); + + my %module = %{$MODULES{$modname}}; + + my $works_on = sub { + my ($what, $lst_ref) = @_; + my @lst = @{$lst_ref}; + return 1 if not @lst; # empty list -> no restrictions + return 1 if $what eq 'generic'; # trust the user + return in_array($what, \@lst); + }; + + # Check to see if everything is OK WRT system requirements + my $os = $$config{'os'}; + + croak("Module '$modname' does not run on $os") + unless(&$works_on($os, $module{'os'})); + + my $arch = $$config{'arch'}; + my $sub = $$config{'submodel'}; + + croak("Module '$modname' does not run on $arch/$sub") + unless(&$works_on($arch, $module{'arch'}) or + &$works_on($sub, $module{'arch'})); + + my $cc = $$config{'compiler'}; + + croak("Module '$modname' does not work with $cc") + unless(&$works_on($cc, $module{'cc'})); + + my $handle_files = sub { + my($lst, $func) = @_; + return unless defined($lst); + + foreach (sort @$lst) { + &$func($module{'moddirs'}, $config, $_); + } + }; + + &$handle_files($module{'ignore'}, \&ignore_file); + &$handle_files($module{'add'}, \&add_file); + &$handle_files($module{'replace'}, + sub { ignore_file(@_); add_file(@_); }); + + warning($modname, ': ', $module{'note'}) + if(defined($module{'note'})); +} + +sub load_modules { + my ($config) = @_; + + my @mod_names; + + foreach my $mod (sort keys %{$$config{'modules'}}) { + next unless($$config{'modules'}{$mod} > 0); + + load_module($config, $mod); + + push @mod_names, $mod; + } + + $$config{'mod_list'} = join("\n", @mod_names); + + my $unaligned_ok = 0; + + my $target_os_defines = sub { + my @macro_list; + + my $os = $$config{'os'}; + if($os ne 'generic') { + push @macro_list, '#define BOTAN_TARGET_OS_IS_' . uc $os; + + my @features = @{$OPERATING_SYSTEM{$os}{'target_features'}}; + + for my $feature (@features) { + push @macro_list, '#define BOTAN_TARGET_OS_HAS_' . uc $feature; + } + + } + return join("\n", @macro_list); + }; + + $$config{'target_os_defines'} = &$target_os_defines(); + + my $target_cpu_defines = sub { + my @macro_list; + + my $arch = $$config{'arch'}; + if($arch ne 'generic') { + my %cpu_info = %{$CPU{$arch}}; + my $endian = $cpu_info{'endian'}; + + if(defined($$config{'with_endian'})) { + $endian = $$config{'with_endian'}; + $endian = undef unless($endian eq 'little' || + $endian eq 'big'); + } + elsif(defined($endian)) { + autoconfig("Since arch is $arch, assuming $endian endian mode"); + } + + push @macro_list, "#define BOTAN_TARGET_ARCH_IS_" . (uc $arch); + + my $submodel = $$config{'submodel'}; + if($arch ne $submodel) { + $submodel = uc $submodel; + $submodel =~ tr/-/_/; + $submodel =~ tr/.//; + + push @macro_list, "#define BOTAN_TARGET_CPU_IS_$submodel"; + } + + if(defined($endian)) { + $endian = uc $endian; + push @macro_list, + "#define BOTAN_TARGET_CPU_IS_${endian}_ENDIAN"; + + # See if the user set --with-unaligned-mem + if(defined($$config{'with_unaligned_mem'})) { + my $spec = $$config{'with_unaligned_mem'}; + + if($spec eq 'yes') { + $unaligned_ok = 1; + } + elsif($spec eq 'no') { + $unaligned_ok = 0; + } + else { + warning('Unknown arg to --with-unaligned-mem (' . + $spec . ') will ignore'); + $unaligned_ok = 0; + } + } + # Otherwise, see if the CPU has a default setting + elsif(defined($cpu_info{'unaligned'}) and + $cpu_info{'unaligned'} eq 'ok') + { + autoconfig("Since arch is $arch, " . + 'assuming unaligned memory access is OK'); + $unaligned_ok = 1; + } + } + } + + # variable is always set (one or zero) + push @macro_list, + "#define BOTAN_TARGET_UNALIGNED_LOADSTOR_OK $unaligned_ok"; + return join("\n", @macro_list); + }; + + $$config{'target_cpu_defines'} = &$target_cpu_defines(); + + my $target_compiler_defines = sub { + my @macro_list; + + if(defined($$config{'tr1'})) { + my $tr1 = $$config{'tr1'}; + + if($tr1 eq 'system') { + push @macro_list, '#define BOTAN_USE_STD_TR1'; + } + elsif($tr1 eq 'boost') { + push @macro_list, '#define BOTAN_USE_BOOST_TR1'; + } + elsif($tr1 ne 'none') { + croak("Unknown --with-tr1= option value '$tr1' (try --help)"); + } + } + + return join("\n", @macro_list); + }; + + $$config{'target_compiler_defines'} = &$target_compiler_defines(); + + my $gen_defines = sub { + my @macro_list; + + my %defines; + + foreach my $mod (sort keys %{$$config{'modules'}}) { + next unless $$config{'modules'}{$mod} > 0; + + my $defs = $MODULES{$mod}{'define'}; + next unless $defs; + + push @{$defines{$MODULES{$mod}{'type'}}}, split(/,/, $defs); + } + + foreach my $type (sort keys %defines) { + push @macro_list, "\n/* $type */"; + + for my $macro (@{$defines{$type}}) { + die unless(defined $macro and $macro ne ''); + push @macro_list, "#define BOTAN_HAS_$macro"; + } + } + + return join("\n", @macro_list); + }; + + $$config{'module_defines'} = &$gen_defines(); +} + +################################################## +# # +################################################## +sub file_type { + my ($file) = @_; + + return 'sources' + if($file =~ /\.cpp$/ or $file =~ /\.c$/ or $file =~ /\.S$/); + return 'includes' if($file =~ /\.h$/); + + croak('file_type() - don\'t know what sort of file ', $file, ' is'); +} + +sub add_file { + my ($mod_dir, $config, $file) = @_; + + check_for_file($config, $file, $mod_dir, $mod_dir); + + my $do_add_file = sub { + my ($type) = @_; + + croak("File $file already added from ", $$config{$type}{$file}) + if(defined($$config{$type}{$file})); + + if($file =~ /(.*):(.*)/) { + my @dirs = File::Spec->splitdir($mod_dir); + + $dirs[$#dirs-1] = $1; + + $$config{$type}{$2} = File::Spec->catdir(@dirs); + } + else { + $$config{$type}{$file} = $mod_dir; + } + }; + + &$do_add_file(file_type($file)); +} + +sub ignore_file { + my ($mod_dir, $config, $file) = @_; + check_for_file($config, $file, undef, $mod_dir); + + my $do_ignore_file = sub { + my ($type, $ok_if_from) = @_; + + if(defined ($$config{$type}{$file})) { + + croak("$mod_dir - File $file modified from ", + $$config{$type}{$file}) + if($$config{$type}{$file} ne $ok_if_from); + + delete $$config{$type}{$file}; + } + }; + + &$do_ignore_file(file_type($file)); +} + +sub check_for_file { + my ($config, $file, $added_from, $mod_dir) = @_; + + #trace("check_for_file($file, $added_from, $mod_dir)"); + + my $full_path = sub { + my ($file,$mod_dir) = @_; + + if($file =~ /(.*):(.*)/) { + return File::Spec->catfile($mod_dir, '..', $1, $2); + } else { + return File::Spec->catfile($mod_dir, $file) if(defined($mod_dir)); + + my @typeinfo = file_type($config, $file); + return File::Spec->catfile($typeinfo[1], $file); + } + }; + + $file = &$full_path($file, $added_from); + + croak("Module $mod_dir requires that file $file exist. This error\n ", + 'should never occur; please contact the maintainers with details.') + unless(-e $file); +} + +################################################## +# # +################################################## +sub process_template { + my ($in, $out, $config) = @_; + + trace("process_template: $in -> $out"); + + my $contents = slurp_file($in); + + foreach my $name (keys %$config) { + my $val = $$config{$name}; + + unless(defined $val) { + trace("Undefined variable $name in $in"); + next; + } + + $contents =~ s/\%\{$name\}/$val/g; + } + + if($contents =~ /\%\{([a-z_]*)\}/) { + + sub summarize { + my ($n, $s) = @_; + + $s =~ s/\n/\\n/; # escape newlines + + return $s if(length($s) <= $n); + + return substr($s, 0, 57) . '...'; + } + + foreach my $key (sort keys %$config) { + print with_diagnostic("debug", + "In %config:", $key, " -> ", + summarize(60, $$config{$key})); + } + + croak("Unbound variable '$1' in $in"); + } + + open OUT, ">$out" or croak("Couldn't write $out ($!)"); + print OUT $contents; + close OUT; +} + +################################################## +# # +################################################## +sub read_list { + my ($line, $reader, $marker, $func) = @_; + + if($line =~ m@^<$marker>$@) { + while(1) { + $line = &$reader(); + + die "EOF while searching for $marker" unless $line; + last if($line =~ m@^$@); + &$func($line); + } + } +} + +sub list_push { + my ($listref) = @_; + return sub { push @$listref, $_[0]; } +} + +sub match_any_of { + my ($line, $hash, $quoted, @any_of) = @_; + + $quoted = ($quoted eq 'quoted') ? 1 : 0; + + foreach my $what (@any_of) { + $$hash{$what} = $1 if(not $quoted and $line =~ /^$what (.*)/); + $$hash{$what} = $1 if($quoted and $line =~ /^$what \"(.*)\"/); + } +} + +################################################## +# # +################################################## +sub make_reader { + my $filename = $_[0]; + + croak("make_reader(): Arg was undef") if not defined $filename; + + open FILE, "<$filename" or + croak("Couldn't read $filename ($!)"); + + return sub { + my $line = ''; + while(1) { + my $line = ; + last unless defined($line); + + chomp($line); + $line =~ s/#.*//; + $line =~ s/^\s*//; + $line =~ s/\s*$//; + $line =~ s/\s\s*/ /; + $line =~ s/\t/ /; + return $line if $line ne ''; + } + close FILE; + return undef; + } +} + +################################################## +# # +################################################## +sub read_info_files { + my ($config, $dir, $func) = @_; + + $dir = File::Spec->catdir($$config{'config-dir'}, $dir); + + my %allinfo; + foreach my $file (dir_list($dir)) { + my $fullpath = File::Spec->catfile($dir, $file); + + $file =~ s/.txt//; + + trace("reading $fullpath"); + %{$allinfo{$file}} = &$func($file, $fullpath); + } + + return %allinfo; +} + +sub read_module_files { + my ($config) = @_; + + my %allinfo; + + my @modinfos; + + File::Find::find( + { wanted => sub + { if(-f $_ && /^info\.txt\z/s) { + my $name = $File::Find::name; + push @modinfos, $name; + } + } + }, + $$config{'src-dir'}); + + foreach my $modfile (@modinfos) { + trace("reading $modfile"); + + my ($volume,$dirs,$file) = File::Spec->splitpath($modfile); + + my @dirs = File::Spec->splitdir($dirs); + my $moddir = $dirs[$#dirs-1]; + + trace("module $moddir in $dirs $modfile"); + + %{$allinfo{$moddir}} = get_module_info($dirs, $moddir, $modfile); + } + + return %allinfo; +} + +################################################## +# # +################################################## + +sub get_module_info { + my ($dirs, $name, $modfile) = @_; + my $reader = make_reader($modfile); + + my %info; + + $info{'name'} = $name; + $info{'modinfo'} = $modfile; + $info{'moddirs'} = $dirs; + + # Default module settings + $info{'load_on'} = 'request'; # default unless specified + $info{'uses_tr1'} = 'no'; + $info{'libs'} = {}; + $info{'use'} = 'no'; + + my @dir_arr = File::Spec->splitdir($dirs); + $info{'type'} = $dir_arr[$#dir_arr-2]; # cipher, hash, ... + if($info{'type'} eq 'src') { $info{'type'} = $dir_arr[$#dir_arr-1]; } + + while($_ = &$reader()) { + match_any_of($_, \%info, 'quoted', 'realname', 'note', 'type'); + match_any_of($_, \%info, 'unquoted', 'define', 'mp_bits', + 'modset', 'load_on', 'uses_tr1'); + + read_list($_, $reader, 'arch', list_push(\@{$info{'arch'}})); + read_list($_, $reader, 'cc', list_push(\@{$info{'cc'}})); + read_list($_, $reader, 'os', list_push(\@{$info{'os'}})); + read_list($_, $reader, 'add', list_push(\@{$info{'add'}})); + read_list($_, $reader, 'replace', list_push(\@{$info{'replace'}})); + read_list($_, $reader, 'ignore', list_push(\@{$info{'ignore'}})); + read_list($_, $reader, 'requires', list_push(\@{$info{'requires'}})); + + read_list($_, $reader, 'libs', + sub { + my $line = $_[0]; + $line =~ m/^([\w!,]*) -> ([\w.,-]*)$/; + $info{'libs'}{$1} = $2; + }); + + if(/^require_version /) { + if(/^require_version (\d+)\.(\d+)\.(\d+)$/) { + my $version = "$1.$2.$3"; + my $needed_version = 100*$1 + 10*$2 + $3; + + my $have_version = + 100*$MAJOR_VERSION + 10*$MINOR_VERSION + $PATCH_VERSION; + + if($needed_version > $have_version) { + warning("Module $name needs v$version; disabling"); + return (); + } + } + else { + croak("In module $name, bad version requirement '$_'"); + } + } + } + + return %info; +} + +################################################## +# # +################################################## +sub get_arch_info { + my ($name,$file) = @_; + my $reader = make_reader($file); + + my %info; + $info{'name'} = $name; + + while($_ = &$reader()) { + match_any_of($_, \%info, 'quoted', 'realname'); + match_any_of($_, \%info, 'unquoted', + 'default_submodel', 'endian', 'unaligned'); + + read_list($_, $reader, 'aliases', list_push(\@{$info{'aliases'}})); + read_list($_, $reader, 'submodels', list_push(\@{$info{'submodels'}})); + + read_list($_, $reader, 'submodel_aliases', + sub { + my $line = $_[0]; + $line =~ m/^(\S*) -> (\S*)$/; + $info{'submodel_aliases'}{$1} = $2; + }); + } + return %info; +} + +################################################## +# # +################################################## +sub get_os_info { + my ($name,$file) = @_; + my $reader = make_reader($file); + + my %info; + $info{'name'} = $name; + + while($_ = &$reader()) { + match_any_of($_, \%info, + 'quoted', 'realname', 'ar_command', + 'install_cmd_data', 'install_cmd_exec'); + + match_any_of($_, \%info, 'unquoted', + 'os_type', + 'obj_suffix', + 'so_suffix', + 'static_suffix', + 'install_root', + 'header_dir', + 'lib_dir', 'doc_dir', + 'ar_needs_ranlib'); + + read_list($_, $reader, 'aliases', list_push(\@{$info{'aliases'}})); + + read_list($_, $reader, 'target_features', + list_push(\@{$info{'target_features'}})); + + read_list($_, $reader, 'supports_shared', + list_push(\@{$info{'supports_shared'}})); + } + return %info; +} + +################################################## +# Read a file from misc/config/cc and set the values from +# there into a hash for later reference +################################################## +sub get_cc_info { + my ($name,$file) = @_; + my $reader = make_reader($file); + + my %info; + $info{'name'} = $name; + + while($_ = &$reader()) { + match_any_of($_, \%info, 'quoted', + 'realname', + 'binary_name', + 'compile_option', + 'output_to_option', + 'add_include_dir_option', + 'add_lib_dir_option', + 'add_lib_option', + 'lib_opt_flags', + 'check_opt_flags', + 'dll_import_flags', + 'dll_export_flags', + 'lang_flags', + 'warning_flags', + 'shared_flags', + 'ar_command', + 'debug_flags', + 'no_debug_flags'); + + match_any_of($_, \%info, 'unquoted', + 'makefile_style', + 'compiler_has_tr1'); + + sub quoted_mapping { + my $hashref = $_[0]; + return sub { + my $line = $_[0]; + $line =~ m/^(\S*) -> \"(.*)\"$/; + $$hashref{$1} = $2; + } + } + + read_list($_, $reader, 'mach_abi_linking', + quoted_mapping(\%{$info{'mach_abi_linking'}})); + read_list($_, $reader, 'so_link_flags', + quoted_mapping(\%{$info{'so_link_flags'}})); + + read_list($_, $reader, 'mach_opt', + sub { + my $line = $_[0]; + $line =~ m/^(\S*) -> \"(.*)\" ?(.*)?$/; + $info{'mach_opt_flags'}{$1} = $2; + $info{'mach_opt_re'}{$1} = $3; + }); + + } + return %info; +} + +################################################## +# # +################################################## +sub write_pkg_config { + my ($config) = @_; + + return if($$config{'os'} eq 'generic' or + $$config{'os'} eq 'windows'); + + $$config{'link_to'} = libs('-l', '', 'm', @{$$config{'mod_libs'}}); + + my $botan_config = $$config{'botan_config'}; + + process_template( + File::Spec->catfile($$config{'config-dir'}, 'botan-config.in'), + $botan_config, $config); + chmod 0755, $botan_config; + + process_template( + File::Spec->catfile($$config{'config-dir'}, 'botan.pc.in'), + $$config{'botan_pkgconfig'}, $config); + + delete $$config{'link_to'}; +} + +################################################## +# # +################################################## +sub file_list { + my ($put_in, $from, $to, %files) = @_; + + my $list = ''; + + my $spaces = 16; + + foreach (sort keys %files) { + my $file = $_; + + $file =~ s/$from/$to/ if(defined($from) and defined($to)); + + my $dir = $files{$_}; + $dir = $put_in if defined $put_in; + + if(defined($dir)) { + $list .= File::Spec->catfile ($dir, $file); + } + else { + $list .= $file; + } + + $list .= " \\\n "; + } + + $list =~ s/\\\n +$//; # remove trailing escape + + return $list; +} + +sub build_cmds { + my ($config, $dir, $flags, $files) = @_; + + my $obj_suffix = $$config{'obj_suffix'}; + + my %ccinfo = my_compiler($config); + + my $inc = $ccinfo{'add_include_dir_option'}; + my $from = $ccinfo{'compile_option'}; + my $to = $ccinfo{'output_to_option'}; + + my $inc_dir = $$config{'build_include'}; + + # Probably replace by defaults to -I -c -o + croak('undef value found in build_cmds') + unless defined($inc) and defined($from) and defined($to); + + my $bld_line = "\t\$(CXX) $inc$inc_dir $flags $from\$? $to\$@"; + + my @output_lines; + + foreach (sort keys %$files) { + my $src_file = File::Spec->catfile($$files{$_}, $_); + my $obj_file = File::Spec->catfile($dir, $_); + + $obj_file =~ s/\.cpp$/.$obj_suffix/; + $obj_file =~ s/\.c$/.$obj_suffix/; + $obj_file =~ s/\.S$/.$obj_suffix/; + + push @output_lines, "$obj_file: $src_file\n$bld_line"; + } + + return join("\n\n", @output_lines); +} + +sub determine_config { + my ($config) = @_; + + sub os_ar_command { + return os_info_for(shift, 'ar_command'); + } + + sub append_if { + my($var,$addme,$cond) = @_; + + croak('append_if: reference was undef') unless defined $var; + + if($cond and $addme ne '') { + $$var .= ' ' unless($$var eq '' or $$var =~ / $/); + $$var .= $addme; + } + } + + sub append_ifdef { + my($var,$addme) = @_; + append_if($var, $addme, defined($addme)); + } + + my $empty_if_nil = sub { + my $val = $_[0]; + return $val if defined($val); + return ''; + }; + + my %ccinfo = my_compiler($config); + + my $lang_flags = ''; + append_ifdef(\$lang_flags, $ccinfo{'lang_flags'}); + append_if(\$lang_flags, "-fpermissive", $$config{'gcc_bug'}); + + my $debug = $$config{'debug'}; + + my $lib_opt_flags = ''; + append_ifdef(\$lib_opt_flags, $ccinfo{'lib_opt_flags'}); + append_ifdef(\$lib_opt_flags, $ccinfo{'debug_flags'}) if($debug); + append_ifdef(\$lib_opt_flags, $ccinfo{'no_debug_flags'}) if(!$debug); + + # This is a default that works on most Unix and Unix-like systems + my $ar_command = 'ar crs'; + my $ranlib_command = 'true'; # almost no systems need it anymore + + # See if there are any over-riding methods. We presume if CC is creating + # the static libs, it knows how to create the index itself. + + my $os = $$config{'os'}; + + if($ccinfo{'ar_command'}) { + $ar_command = $ccinfo{'ar_command'}; + } + elsif(os_ar_command($os)) + { + $ar_command = os_ar_command($os); + $ranlib_command = 'ranlib' + if(os_info_for($os, 'ar_needs_ranlib') eq 'yes'); + } + + my $arch = $$config{'arch'}; + + my $abi_opts = ''; + append_ifdef(\$abi_opts, $ccinfo{'mach_abi_linking'}{$arch}); + append_ifdef(\$abi_opts, $ccinfo{'mach_abi_linking'}{$os}); + append_ifdef(\$abi_opts, $ccinfo{'mach_abi_linking'}{'all'}); + $abi_opts = ' ' . $abi_opts if($abi_opts ne ''); + + if($$config{'shared'} eq 'yes' and + (in_array('all', $OPERATING_SYSTEM{$os}{'supports_shared'}) or + in_array($$config{'compiler'}, + $OPERATING_SYSTEM{$os}{'supports_shared'}))) { + + $$config{'shared_flags'} = &$empty_if_nil($ccinfo{'shared_flags'}); + $$config{'so_link'} = &$empty_if_nil($ccinfo{'so_link_flags'}{$os}); + + if($$config{'so_link'} eq '') { + $$config{'so_link'} = + &$empty_if_nil($ccinfo{'so_link_flags'}{'default'}) + } + + if($$config{'shared_flags'} eq '' and $$config{'so_link'} eq '') { + $$config{'shared'} = 'no'; + + warning($$config{'compiler'}, ' has no shared object flags set ', + "for $os; disabling shared"); + } + } + else { + autoconfig("No shared library generated with " . + $$config{'compiler'} . " on " . $$config{'os'}); + + $$config{'shared'} = 'no'; + $$config{'shared_flags'} = ''; + $$config{'so_link'} = ''; + } + + add_to($config, { + 'cc' => $ccinfo{'binary_name'} . $abi_opts, + 'lib_opt' => $lib_opt_flags, + 'check_opt' => &$empty_if_nil($ccinfo{'check_opt_flags'}), + 'mach_opt' => mach_opt($config), + 'lang_flags' => $lang_flags, + 'warn_flags' => &$empty_if_nil($ccinfo{'warning_flags'}), + + 'ar_command' => $ar_command, + 'ranlib_command' => $ranlib_command, + 'static_suffix' => os_info_for($os, 'static_suffix'), + 'so_suffix' => os_info_for($os, 'so_suffix'), + 'obj_suffix' => os_info_for($os, 'obj_suffix'), + + 'dll_export_flags' => $ccinfo{'dll_export_flags'}, + 'dll_import_flags' => $ccinfo{'dll_import_flags'}, + + 'install_cmd_exec' => os_info_for($os, 'install_cmd_exec'), + 'install_cmd_data' => os_info_for($os, 'install_cmd_data'), + }); +} + +sub generate_makefile { + my ($config) = @_; + + my $is_in_doc_dir = + sub { -e File::Spec->catfile($$config{'doc_src_dir'}, $_[0]) }; + + my $docs = file_list(undef, undef, undef, + map_to($$config{'doc_src_dir'}, + grep { &$is_in_doc_dir($_); } @DOCS)); + + $docs .= File::Spec->catfile($$config{'base-dir'}, 'readme.txt'); + + my $includes = file_list(undef, undef, undef, + map_to($$config{'build_include_botan'}, + keys %{$$config{'includes'}})); + + my $lib_objs = file_list($$config{'build_lib'}, '(\.cpp$|\.c$|\.S$)', + '.' . $$config{'obj_suffix'}, + %{$$config{'sources'}}); + + my $check_objs = file_list($$config{'build_check'}, '.cpp', + '.' . $$config{'obj_suffix'}, + %{$$config{'check_src'}}), + + my $lib_build_cmds = build_cmds($config, $$config{'build_lib'}, + '$(LIB_FLAGS)', $$config{'sources'}); + + my $check_build_cmds = build_cmds($config, $$config{'build_check'}, + '$(CHECK_FLAGS)', $$config{'check_src'}); + + add_to($config, { + 'lib_objs' => $lib_objs, + 'check_objs' => $check_objs, + 'lib_build_cmds' => $lib_build_cmds, + 'check_build_cmds' => $check_build_cmds, + + 'doc_files' => $docs, + 'include_files' => $includes + }); + + my $template_dir = File::Spec->catdir($$config{'config-dir'}, 'makefile'); + my $template = undef; + + my $make_style = $$config{'make_style'}; + + if($make_style eq 'unix') { + $template = File::Spec->catfile($template_dir, 'unix.in'); + + $template = File::Spec->catfile($template_dir, 'unix_shr.in') + if($$config{'shared'} eq 'yes'); + + add_to($config, { + 'link_to' => libs('-l', '', 'm', @{$$config{'mod_libs'}}), + }); + } + elsif($make_style eq 'nmake') { + $template = File::Spec->catfile($template_dir, 'nmake.in'); + + add_to($config, { + 'shared' => 'no', + 'link_to' => libs('', '', '', @{$$config{'mod_libs'}}), + }); + } + + croak("Don't know about makefile format '$make_style'") + unless defined $template; + + trace("'$make_style' -> '$template'"); + + process_template($template, $$config{'makefile'}, $config); + + autoconfig("Wrote ${make_style}-style makefile in $$config{'makefile'}"); +} + +################################################## +# Configuration Guessing # +################################################## +sub guess_cpu_from_this +{ + my $cpuinfo = lc $_[0]; + + $cpuinfo =~ s/\(r\)//g; + $cpuinfo =~ s/\(tm\)//g; + $cpuinfo =~ s/ //g; + + trace("guess_cpu_from_this($cpuinfo)"); + + # The 32-bit SPARC stuff is impossible to match to arch type easily, and + # anyway the uname stuff will pick up that it's a SPARC so it doesn't + # matter. If it's an Ultra, assume a 32-bit userspace, no 64-bit code + # possible; that's the most common setup right now anyway + return 'sparc32-v9' if($cpuinfo =~ /ultrasparc/); + + # Should probably do this once and cache it + my @names; + my %all_alias; + + foreach my $arch (keys %CPU) { + my %info = %{$CPU{$arch}}; + + foreach my $submodel (@{$info{'submodels'}}) { + push @names, $submodel; + } + + if(defined($info{'submodel_aliases'})) { + my %submodel_aliases = %{$info{'submodel_aliases'}}; + foreach my $sm_alias (keys %submodel_aliases) { + push @names, $sm_alias; + $all_alias{$sm_alias} = $submodel_aliases{$sm_alias}; + } + } + } + + @names = sort { length($b) <=> length($a) } @names; + + foreach my $name (@names) { + if($cpuinfo =~ $name) { + trace("Matched '$cpuinfo' against '$name'"); + + return $all_alias{$name} if defined($all_alias{$name}); + + return $name; + } + } + + trace("Couldn't match $cpuinfo against any submodels"); + + # No match? Try arch names. Reset @names + @names = (); + + foreach my $arch (keys %CPU) { + my %info = %{$CPU{$arch}}; + + push @names, $info{'name'}; + + foreach my $alias (@{$info{'aliases'}}) { + push @names, $alias; + } + } + + @names = sort { length($b) <=> length($a) } @names; + + foreach my $name (@names) { + if($cpuinfo =~ $name) { + trace("Matched '$cpuinfo' against '$name'"); + return $name; + } + } + + return ''; +} + +# Do some WAGing and see if we can figure out what system we are. Think about +# this as a really moronic config.guess +sub guess_compiler +{ + my @CCS = ('gcc', 'msvc', 'icc', 'compaq', 'kai'); + + # First try the CC enviornmental variable, if it's set + if(defined($ENV{CC})) + { + my @new_CCS = ($ENV{CC}); + foreach my $cc (@CCS) { push @new_CCS, $cc; } + @CCS = @new_CCS; + } + + foreach (@CCS) + { + my $bin_name = $COMPILER{$_}{'binary_name'}; + if(which($bin_name) ne '') { + autoconfig("Guessing to use $_ as the compiler " . + "(use --cc to set)"); + return $_; + } + } + + croak( + "Can't find a usable C++ compiler, is PATH right?\n" . + "You might need to run with the --cc option (try $0 --help)\n"); +} + +sub guess_os +{ + sub recognize_os + { + my $os = os_alias($_[0]); + if(defined($OPERATING_SYSTEM{$os})) { + autoconfig("Guessing operating system is $os (use --os to set)"); + return $os; + } + return undef; + } + + my $guess = recognize_os($^O); + return $guess if $guess; + + trace("Can't guess os from $^O"); + + my $uname = $$config{'uname'}; + + if($uname ne '') { + $guess = recognize_os($uname); + return $guess if $guess; + trace("Can't guess os from $uname"); + } + + warning("Unknown OS ('$^O', '$uname'), falling back to generic code"); + return 'generic'; +} + +sub guess_cpu +{ + # If we have /proc/cpuinfo, try to get nice specific information about + # what kind of CPU we're running on. + my $cpuinfo = '/proc/cpuinfo'; + + if(defined($ENV{'CPUINFO'})) { + my $cpuinfo_env = $ENV{'CPUINFO'}; + + if(-e $cpuinfo_env and -r $cpuinfo_env) { + autoconfig("Will use $cpuinfo_env as /proc/cpuinfo"); + $cpuinfo = $cpuinfo_env; + } else { + warn("Could not read from ENV /proc/cpuinfo ($cpuinfo_env)"); + } + } + + if(-e $cpuinfo and -r $cpuinfo) + { + open CPUINFO, $cpuinfo or die "Could not read $cpuinfo\n"; + + while() { + + chomp; + $_ =~ s/\t/ /g; + $_ =~ s/ +/ /g; + + if($_ =~ /^cpu +: (.*)/ or + $_ =~ /^model name +: (.*)/) + { + my $cpu = guess_cpu_from_this($1); + if($cpu ne '') { + autoconfig("Guessing CPU using $cpuinfo line '$_'"); + autoconfig("Guessing CPU is a $cpu (use --cpu to set)"); + return $cpu; + } + } + } + + autoconfig("*** Could not figure out CPU based on $cpuinfo"); + autoconfig("*** Please mail contents to lloyd\@randombit.net"); + } + + sub known_arch { + my ($name) = @_; + + foreach my $arch (keys %CPU) { + my %info = %{$CPU{$arch}}; + + return 1 if $name eq $info{'name'}; + foreach my $submodel (@{$info{'submodels'}}) { + return 1 if $name eq $submodel; + } + + foreach my $alias (@{$info{'aliases'}}) { + return 1 if $name eq $alias; + } + + if(defined($info{'submodel_aliases'})) { + my %submodel_aliases = %{$info{'submodel_aliases'}}; + foreach my $sm_alias (keys %submodel_aliases) { + return 1 if $name eq $sm_alias; + } + } + } + + my $guess = guess_cpu_from_this($name); + + return 0 if($guess eq $name or $guess eq ''); + + return known_arch($guess); + } + + my $uname = $$config{'uname'}; + if($uname ne '') { + my $cpu = guess_cpu_from_this($uname); + + if($cpu ne '') + { + autoconfig("Guessing CPU using uname output '$uname'"); + autoconfig("Guessing CPU is a $cpu (use --cpu to set)"); + + return $cpu if known_arch($cpu); + } + } + + my $config_archname = $Config{'archname'}; + my $cpu = guess_cpu_from_this($config_archname); + + if($cpu ne '') + { + autoconfig("Guessing CPU using Config{archname} '$config_archname'"); + autoconfig("Guessing CPU is a $cpu (use --cpu to set)"); + + return $cpu if known_arch($cpu); + } + + warning("Could not determine CPU type (try --cpu option)"); + return 'generic'; +} diff --git a/src/libs/3rdparty/botan/configure.py b/src/libs/3rdparty/botan/configure.py new file mode 100644 index 00000000000..7f597a85381 --- /dev/null +++ b/src/libs/3rdparty/botan/configure.py @@ -0,0 +1,1122 @@ +#!/usr/bin/env python + +""" +Configuration program for botan (http://botan.randombit.net/) + (C) 2009 Jack Lloyd + Distributed under the terms of the Botan license + +Tested with + CPython 2.4, 2.5, 2.6 - OK + Jython 2.5 - Target detection does not work (use --os and --cpu) + + CPython 2.3 and earlier are not supported + + Has not been tested with IronPython or PyPy +""" + +import sys +import os +import os.path +import platform +import re +import shlex +import shutil +import string +import subprocess +import logging +import getpass +import time + +from optparse import (OptionParser, OptionGroup, + IndentedHelpFormatter, SUPPRESS_HELP) + +class BuildConfigurationInformation(object): + + """ + Version information + """ + version_major = 1 + version_minor = 8 + version_patch = 8 + version_so_patch = 2 + version_suffix = '' + + version_string = '%d.%d.%d%s' % ( + version_major, version_minor, version_patch, version_suffix) + soversion_string = '%d.%d.%d%s' % ( + version_major, version_minor, version_so_patch, version_suffix) + + """ + Constructor + """ + def __init__(self, options, modules): + self.build_dir = os.path.join(options.with_build_dir, 'build') + + self.checkobj_dir = os.path.join(self.build_dir, 'checks') + self.libobj_dir = os.path.join(self.build_dir, 'lib') + + self.include_dir = os.path.join(self.build_dir, 'include') + self.full_include_dir = os.path.join(self.include_dir, 'botan') + + all_files = sum([mod.add for mod in modules], []) + + self.headers = sorted( + [file for file in all_files if file.endswith('.h')]) + + self.sources = sorted(set(all_files) - set(self.headers)) + + checks_dir = os.path.join(options.base_dir, 'checks') + + self.check_sources = sorted( + [os.path.join(checks_dir, file) for file in os.listdir(checks_dir) + if file.endswith('.cpp')]) + + def doc_files(self): + docs = ['readme.txt'] + + for docfile in ['api.pdf', 'tutorial.pdf', 'fips140.pdf', + 'api.tex', 'tutorial.tex', 'fips140.tex', + 'credits.txt', 'license.txt', 'log.txt', + 'thanks.txt', 'todo.txt', 'pgpkeys.asc']: + filename = os.path.join('doc', docfile) + if os.access(filename, os.R_OK): + docs.append(filename) + return docs + + def pkg_config_file(self): + return 'botan-%d.%d.pc' % (self.version_major, + self.version_minor) + + def username(self): + return getpass.getuser() + + def hostname(self): + return platform.node() + + def timestamp(self): + return time.ctime() + +""" +Handle command line options +""" +def process_command_line(args): + parser = OptionParser( + formatter = IndentedHelpFormatter(max_help_position = 50), + version = BuildConfigurationInformation.version_string) + + target_group = OptionGroup(parser, 'Target options') + + target_group.add_option('--cc', dest='compiler', + help='set the desired build compiler') + target_group.add_option('--os', default=platform.system().lower(), + help='set the target operating system [%default]') + target_group.add_option('--cpu', + help='set the target processor type/model') + target_group.add_option('--with-endian', metavar='ORDER', default=None, + help='override guess of CPU byte order') + + build_group = OptionGroup(parser, 'Build options') + + build_group.add_option('--enable-shared', dest='build_shared_lib', + action='store_true', default=True, + help=SUPPRESS_HELP) + build_group.add_option('--disable-shared', dest='build_shared_lib', + action='store_false', + help='disable building a shared library') + + build_group.add_option('--enable-asm', dest='asm_ok', + action='store_true', default=True, + help=SUPPRESS_HELP) + build_group.add_option('--disable-asm', dest='asm_ok', + action='store_false', + help='disallow use of assembler') + + build_group.add_option('--enable-debug', dest='debug_build', + action='store_true', default=False, + help='enable debug build') + build_group.add_option('--disable-debug', dest='debug_build', + action='store_false', help=SUPPRESS_HELP) + + build_group.add_option('--with-tr1-implementation', metavar='WHICH', + dest='with_tr1', default=None, + help='enable TR1 (options: none, system, boost)') + + build_group.add_option('--with-build-dir', + metavar='DIR', default='', + help='setup the build in DIR') + + build_group.add_option('--makefile-style', metavar='STYLE', default=None, + help='choose a makefile style (unix, nmake)') + + build_group.add_option('--with-local-config', + dest='local_config', metavar='FILE', + help='include the contents of FILE into build.h') + + build_group.add_option('--dumb-gcc', dest='dumb_gcc', + action='store_true', default=False, + help=SUPPRESS_HELP) + + mods_group = OptionGroup(parser, 'Module selection') + + mods_group.add_option('--enable-modules', dest='enabled_modules', + metavar='MODS', action='append', default=[], + help='enable specific modules') + mods_group.add_option('--disable-modules', dest='disabled_modules', + metavar='MODS', action='append', default=[], + help='disable specific modules') + mods_group.add_option('--no-autoload', action='store_true', default=False, + help='disable automatic loading') + + for mod in ['openssl', 'gnump', 'bzip2', 'zlib']: + + # This is just an implementation of Optik's append_const action, + # but that is not available in Python 2.4's optparse, so use a + # callback instead + + def optparse_callback(option, opt, value, parser, dest, mod): + parser.values.__dict__[dest].append(mod) + + mods_group.add_option('--with-%s' % (mod), + action='callback', + callback=optparse_callback, + callback_kwargs = { + 'dest': 'enabled_modules', 'mod': mod } + ) + + mods_group.add_option('--without-%s' % (mod), help=SUPPRESS_HELP, + action='callback', + callback=optparse_callback, + callback_kwargs = { + 'dest': 'disabled_modules', 'mod': mod } + ) + + install_group = OptionGroup(parser, 'Installation options') + + install_group.add_option('--prefix', metavar='DIR', + help='set the base install directory') + install_group.add_option('--docdir', metavar='DIR', + help='set the documentation install directory') + install_group.add_option('--libdir', metavar='DIR', + help='set the library install directory') + install_group.add_option('--includedir', metavar='DIR', + help='set the include file install directory') + + parser.add_option_group(target_group) + parser.add_option_group(build_group) + parser.add_option_group(mods_group) + parser.add_option_group(install_group) + + # These exist only for autoconf compatability (requested by zw for mtn) + compat_with_autoconf_options = [ + 'bindir', + 'datadir', + 'datarootdir', + 'dvidir', + 'exec-prefix', + 'htmldir', + 'infodir', + 'libexecdir', + 'localedir', + 'localstatedir', + 'mandir', + 'oldincludedir', + 'pdfdir', + 'psdir', + 'sbindir', + 'sharedstatedir', + 'sysconfdir' + ] + + for opt in compat_with_autoconf_options: + parser.add_option('--' + opt, help=SUPPRESS_HELP) + + (options, args) = parser.parse_args(args) + + if args != []: + raise Exception('Unhandled option(s): ' + ' '.join(args)) + if options.with_endian != None and \ + options.with_endian not in ['little', 'big']: + raise Exception('Bad value to --with-endian "%s"' % ( + options.with_endian)) + + def parse_module_opts(modules): + return sorted(set(sum([s.split(',') for s in modules], []))) + + options.enabled_modules = parse_module_opts(options.enabled_modules) + options.disabled_modules = parse_module_opts(options.disabled_modules) + + return options + +""" +Generic lexer function for info.txt and src/build-data files +""" +def lex_me_harder(infofile, to_obj, allowed_groups, name_val_pairs): + + class LexerError(Exception): + def __init__(self, msg, line): + self.msg = msg + self.line = line + + def __str__(self): + return '%s at %s:%d' % (self.msg, infofile, self.line) + + (dirname, basename) = os.path.split(infofile) + + to_obj.lives_in = dirname + if basename == 'info.txt': + (obj_dir,to_obj.basename) = os.path.split(dirname) + if os.access(os.path.join(obj_dir, 'info.txt'), os.R_OK): + to_obj.parent_module = os.path.basename(obj_dir) + else: + to_obj.parent_module = None + else: + to_obj.basename = basename.replace('.txt', '') + + lexer = shlex.shlex(open(infofile), infofile, posix=True) + lexer.wordchars += '|:.<>/,-!' # handle various funky chars in info.txt + + for group in allowed_groups: + to_obj.__dict__[group] = [] + for (key,val) in name_val_pairs.iteritems(): + to_obj.__dict__[key] = val + + def lexed_tokens(): # Convert to an interator + token = lexer.get_token() + while token != None: + yield token + token = lexer.get_token() + + for token in lexed_tokens(): + match = re.match('<(.*)>', token) + + # Check for a grouping + if match is not None: + group = match.group(1) + + if group not in allowed_groups: + raise LexerError('Unknown group "%s"' % (group), + lexer.lineno) + + end_marker = '' + + token = lexer.get_token() + while token != end_marker: + to_obj.__dict__[group].append(token) + token = lexer.get_token() + if token is None: + raise LexerError('Group "%s" not terminated' % (group), + lexer.lineno) + + elif token in name_val_pairs.keys(): + to_obj.__dict__[token] = lexer.get_token() + else: # No match -> error + raise LexerError('Bad token "%s"' % (token), lexer.lineno) + +""" +Convert a lex'ed map (from build-data files) from a list to a dict +""" +def force_to_dict(l): + return dict(zip(l[::3],l[2::3])) + +""" +Represents the information about a particular module +""" +class ModuleInfo(object): + def __init__(self, infofile): + + lex_me_harder(infofile, self, + ['add', 'requires', 'os', 'arch', 'cc', 'libs'], + { 'realname': '', + 'load_on': 'request', + 'define': None, + 'modset': None, + 'uses_tr1': 'false', + 'note': '', + 'mp_bits': 0 }) + + # Coerce to more useful types + self.libs = force_to_dict(self.libs) + + def add_dir_name(filename): + if filename.count(':') == 0: + return os.path.join(self.lives_in, filename) + + # modules can request to add files of the form + # MODULE_NAME:FILE_NAME to add a file from another module + # For these, assume other module is always in a + # neighboring directory; this is true for all current uses + return os.path.join(os.path.split(self.lives_in)[0], + *filename.split(':')) + + self.add = map(add_dir_name, self.add) + + self.mp_bits = int(self.mp_bits) + + if self.uses_tr1 == 'yes': + self.uses_tr1 = True + else: + self.uses_tr1 = False + + def compatible_cpu(self, arch, cpu): + return self.arch == [] or (arch in self.arch or cpu in self.arch) + + def compatible_os(self, os): + return self.os == [] or os in self.os + + def compatible_compiler(self, cc, with_tr1): + if self.uses_tr1 and with_tr1 not in ['boost', 'system']: + return False + return self.cc == [] or cc in self.cc + + def dependencies(self): + # utils is an implicit dep (contains types, etc) + deps = self.requires + ['utils'] + if self.parent_module != None: + deps.append(self.parent_module) + return deps + + def __cmp__(self, other): + if self.basename < other.basename: + return -1 + if self.basename == other.basename: + return 0 + return 1 + +class ArchInfo(object): + def __init__(self, infofile): + lex_me_harder(infofile, self, + ['aliases', 'submodels', 'submodel_aliases'], + { 'realname': '', + 'default_submodel': None, + 'endian': None, + 'unaligned': 'no' + }) + + self.submodel_aliases = force_to_dict(self.submodel_aliases) + + if self.unaligned == 'ok': + self.unaligned_ok = 1 + else: + self.unaligned_ok = 0 + + def all_submodels(self): + return sorted(zip(self.submodels, self.submodels) + + self.submodel_aliases.items(), + key = lambda k: len(k[0]), reverse = True) + + def defines(self, target_submodel, with_endian): + macros = ['TARGET_ARCH_IS_%s' % (self.basename.upper())] + + def form_cpu_macro(cpu_name): + return cpu_name.upper().replace('.', '').replace('-', '_') + + if self.basename != target_submodel: + macros.append('TARGET_CPU_IS_%s' % ( + form_cpu_macro(target_submodel))) + + if with_endian: + macros.append('TARGET_CPU_IS_%s_ENDIAN' % (with_endian.upper())) + elif self.endian != None: + macros.append('TARGET_CPU_IS_%s_ENDIAN' % (self.endian.upper())) + + macros.append('TARGET_UNALIGNED_LOADSTOR_OK %d' % (self.unaligned_ok)) + + return macros + +class CompilerInfo(object): + def __init__(self, infofile): + lex_me_harder(infofile, self, + ['so_link_flags', 'mach_opt', 'mach_abi_linking'], + { 'realname': '', + 'binary_name': None, + 'compile_option': '-c ', + 'output_to_option': '-o ', + 'add_include_dir_option': '-I', + 'add_lib_dir_option': '-L', + 'add_lib_option': '-l', + 'lib_opt_flags': '', + 'check_opt_flags': '', + 'debug_flags': '', + 'no_debug_flags': '', + 'shared_flags': '', + 'lang_flags': '', + 'warning_flags': '', + 'dll_import_flags': '', + 'dll_export_flags': '', + 'ar_command': None, + 'makefile_style': '', + 'compiler_has_tr1': False, + }) + + self.so_link_flags = force_to_dict(self.so_link_flags) + self.mach_abi_linking = force_to_dict(self.mach_abi_linking) + + self.mach_opt_flags = {} + + while self.mach_opt != []: + proc = self.mach_opt.pop(0) + if self.mach_opt.pop(0) != '->': + raise Exception('Parsing err in %s mach_opt' % (self.basename)) + + flags = self.mach_opt.pop(0) + regex = '' + + if len(self.mach_opt) > 0 and \ + (len(self.mach_opt) == 1 or self.mach_opt[1] != '->'): + regex = self.mach_opt.pop(0) + + self.mach_opt_flags[proc] = (flags,regex) + + del self.mach_opt + + def mach_abi_link_flags(self, osname, arch, submodel): + + abi_link = set() + for what in ['all', osname, arch, submodel]: + if self.mach_abi_linking.get(what) != None: + abi_link.add(self.mach_abi_linking.get(what)) + + if len(abi_link) == 0: + return '' + return ' ' + ' '.join(abi_link) + + def mach_opts(self, arch, submodel): + + def submodel_fixup(tup): + return tup[0].replace('SUBMODEL', submodel.replace(tup[1], '')) + + if submodel == arch: + return '' + + if submodel in self.mach_opt_flags: + return submodel_fixup(self.mach_opt_flags[submodel]) + if arch in self.mach_opt_flags: + return submodel_fixup(self.mach_opt_flags[arch]) + + return '' + + def so_link_command_for(self, osname): + if osname in self.so_link_flags: + return self.so_link_flags[osname] + return self.so_link_flags['default'] + + def defines(self, with_tr1): + if with_tr1: + if with_tr1 == 'boost': + return ['USE_BOOST_TR1'] + elif with_tr1 == 'system': + return ['USE_STD_TR1'] + elif self.compiler_has_tr1: + return ['USE_STD_TR1'] + + return [] + +class OsInfo(object): + def __init__(self, infofile): + lex_me_harder(infofile, self, + ['aliases', 'target_features', 'supports_shared'], + { 'realname': '', + 'os_type': None, + 'obj_suffix': 'o', + 'so_suffix': 'so', + 'static_suffix': 'a', + 'ar_command': 'ar crs', + 'ar_needs_ranlib': False, + 'install_root': '/usr/local', + 'header_dir': 'include', + 'lib_dir': 'lib', + 'doc_dir': 'share/doc', + 'install_cmd_data': 'install -m 644', + 'install_cmd_exec': 'install -m 755' + }) + + self.ar_needs_ranlib = bool(self.ar_needs_ranlib) + + def ranlib_command(self): + if self.ar_needs_ranlib: + return 'ranlib' + else: + return 'true' # no-op + + def defines(self): + return ['TARGET_OS_IS_%s' % (self.basename.upper())] + \ + ['TARGET_OS_HAS_' + feat.upper() + for feat in self.target_features] + +def canon_processor(archinfo, proc): + for ainfo in archinfo.values(): + if ainfo.basename == proc or proc in ainfo.aliases: + return (ainfo.basename, ainfo.basename) + else: + for (match,submodel) in ainfo.all_submodels(): + if re.search(match, proc) != None: + return (ainfo.basename, submodel) + + raise Exception('Unknown or unidentifiable processor "%s"' % (proc)) + +def guess_processor(archinfo): + base_proc = platform.machine() + + if base_proc == '': + raise Exception('Could not determine target CPU; set with --cpu') + + full_proc = platform.processor().lower().replace(' ', '') + for junk in ['(tm)', '(r)']: + full_proc = full_proc.replace(junk, '') + + if full_proc == '': + full_proc = base_proc + + for ainfo in archinfo.values(): + if ainfo.basename == base_proc or base_proc in ainfo.aliases: + for (match,submodel) in ainfo.all_submodels(): + if re.search(match, full_proc) != None: + return (ainfo.basename, submodel) + + return canon_processor(archinfo, ainfo.basename) + + # No matches, so just use the base proc type + return canon_processor(archinfo, base_proc) + +""" +Read a whole file into memory as a string +""" +def slurp_file(filename): + if filename is None: + return '' + return ''.join(open(filename).readlines()) + +""" +Perform template substitution +""" +def process_template(template_file, variables): + class PercentSignTemplate(string.Template): + delimiter = '%' + + try: + template = PercentSignTemplate(slurp_file(template_file)) + return template.substitute(variables) + except KeyError, e: + raise Exception('Unbound var %s in template %s' % (e, template_file)) + +""" +Create the template variables needed to process the makefile, build.h, etc +""" +def create_template_vars(build_config, options, modules, cc, arch, osinfo): + def make_cpp_macros(macros): + return '\n'.join(['#define BOTAN_' + macro for macro in macros]) + + """ + Figure out what external libraries are needed based on selected modules + """ + def link_to(): + libs = set() + for module in modules: + for (osname,link_to) in module.libs.iteritems(): + if osname == 'all' or osname == osinfo.basename: + libs.add(link_to) + else: + match = re.match('^all!(.*)', osname) + if match is not None: + exceptions = match.group(1).split(',') + if osinfo.basename not in exceptions: + libs.add(link_to) + return sorted(libs) + + def objectfile_list(sources, obj_dir): + for src in sources: + basename = os.path.basename(src) + + for src_suffix in ['.cpp', '.S']: + basename = basename.replace(src_suffix, + '.' + osinfo.obj_suffix) + + yield os.path.join(obj_dir, basename) + + + def choose_mp_bits(): + mp_bits = [mod.mp_bits for mod in modules if mod.mp_bits != 0] + + if mp_bits == []: + return 32 # default + + # Check that settings are consistent across modules + for mp_bit in mp_bits[1:]: + if mp_bit != mp_bits[0]: + raise Exception('Incompatible mp_bits settings found') + + return mp_bits[0] + + """ + Form snippets of makefile for building each source file + """ + def build_commands(sources, obj_dir, flags): + for (obj_file,src) in zip(objectfile_list(sources, obj_dir), sources): + yield '%s: %s\n\t$(CXX) %s%s $(%s_FLAGS) %s$? %s$@\n' % ( + obj_file, src, + cc.add_include_dir_option, + build_config.include_dir, + flags, + cc.compile_option, + cc.output_to_option) + + def makefile_list(items): + items = list(items) # force evaluation so we can slice it + return (' '*16).join([item + ' \\\n' for item in items[:-1]] + + [items[-1]]) + + def prefix_with_build_dir(path): + if options.with_build_dir != None: + return os.path.join(options.with_build_dir, path) + return path + + return { + 'version_major': build_config.version_major, + 'version_minor': build_config.version_minor, + 'version_patch': build_config.version_patch, + 'version': build_config.version_string, + 'so_version': build_config.soversion_string, + + 'timestamp': build_config.timestamp(), + 'user': build_config.username(), + 'hostname': build_config.hostname(), + 'command_line': ' '.join(sys.argv), + 'local_config': slurp_file(options.local_config), + 'makefile_style': options.makefile_style or cc.makefile_style, + + 'makefile_path': prefix_with_build_dir('Makefile'), + + 'prefix': options.prefix or osinfo.install_root, + 'libdir': options.libdir or osinfo.lib_dir, + 'includedir': options.includedir or osinfo.header_dir, + 'docdir': options.docdir or osinfo.doc_dir, + + 'doc_src_dir': 'doc', + 'build_dir': build_config.build_dir, + + 'os': options.os, + 'arch': options.arch, + 'submodel': options.cpu, + + 'mp_bits': choose_mp_bits(), + + 'cc': cc.binary_name + cc.mach_abi_link_flags(options.os, + options.arch, + options.cpu), + + 'lib_opt': cc.lib_opt_flags, + 'mach_opt': cc.mach_opts(options.arch, options.cpu), + 'check_opt': cc.check_opt_flags, + 'lang_flags': cc.lang_flags + options.extra_flags, + 'warn_flags': cc.warning_flags, + 'shared_flags': cc.shared_flags, + 'dll_export_flags': cc.dll_export_flags, + + 'so_link': cc.so_link_command_for(osinfo.basename), + + 'link_to': ' '.join([cc.add_lib_option + lib for lib in link_to()]), + + 'module_defines': make_cpp_macros( + sorted(['HAS_' + m.define for m in modules if m.define])), + + 'target_os_defines': make_cpp_macros(osinfo.defines()), + + 'target_compiler_defines': make_cpp_macros( + cc.defines(options.with_tr1)), + + 'target_cpu_defines': make_cpp_macros( + arch.defines(options.cpu, options.with_endian)), + + 'include_files': makefile_list(build_config.headers), + + 'lib_objs': makefile_list( + objectfile_list(build_config.sources, + build_config.libobj_dir)), + + 'check_objs': makefile_list( + objectfile_list(build_config.check_sources, + build_config.checkobj_dir)), + + 'lib_build_cmds': '\n'.join( + build_commands(build_config.sources, + build_config.libobj_dir, 'LIB')), + + 'check_build_cmds': '\n'.join( + build_commands(build_config.check_sources, + build_config.checkobj_dir, 'CHECK')), + + 'ar_command': cc.ar_command or osinfo.ar_command, + 'ranlib_command': osinfo.ranlib_command(), + 'install_cmd_exec': osinfo.install_cmd_exec, + 'install_cmd_data': osinfo.install_cmd_data, + + 'check_prefix': prefix_with_build_dir(''), + 'lib_prefix': prefix_with_build_dir(''), + + 'static_suffix': osinfo.static_suffix, + 'so_suffix': osinfo.so_suffix, + + 'botan_config': prefix_with_build_dir( + os.path.join(build_config.build_dir, 'botan-config')), + 'botan_pkgconfig': prefix_with_build_dir( + os.path.join(build_config.build_dir, + build_config.pkg_config_file())), + + 'doc_files': makefile_list(build_config.doc_files()), + + 'mod_list': '\n'.join(['%s (%s)' % (m.basename, m.realname) + for m in sorted(modules)]), + } + +""" +Determine which modules to load based on options, target, etc +""" +def choose_modules_to_use(options, modules): + + to_load = [] + maybe_dep = [] + not_using_because = {} + + def cannot_use_because(mod, reason): + not_using_because.setdefault(reason, []).append(mod) + + for (modname, module) in modules.iteritems(): + if modname in options.disabled_modules: + cannot_use_because(modname, 'disabled by user') + elif modname in options.enabled_modules: + to_load.append(modname) # trust the user + + elif not module.compatible_cpu(options.arch, options.cpu): + cannot_use_because(modname, 'CPU incompatible') + elif not module.compatible_os(options.os): + cannot_use_because(modname, 'OS incompatible') + elif not module.compatible_compiler(options.compiler, + options.with_tr1): + cannot_use_because(modname, 'compiler incompatible') + + else: + if module.load_on == 'never': + cannot_use_because(modname, 'disabled as buggy') + elif module.load_on == 'request': + cannot_use_because(modname, 'loaded on request only') + elif module.load_on == 'dep': + maybe_dep.append(modname) + + elif module.load_on == 'always': + to_load.append(modname) + + elif module.load_on == 'asm_ok': + if options.asm_ok: + if options.no_autoload: + maybe_dep.append(modname) + else: + to_load.append(modname) + else: + cannot_use_because(modname, + 'uses assembly and --disable-asm set') + elif module.load_on == 'auto': + if options.no_autoload: + maybe_dep.append(modname) + else: + to_load.append(modname) + else: + logging.warning('Unknown load_on %s in %s' % ( + module.load_on, modname)) + + dependency_failure = True + + while dependency_failure: + dependency_failure = False + for modname in to_load: + for deplist in map(lambda s: s.split('|'), + modules[modname].dependencies()): + + dep_met = False + for mod in deplist: + if dep_met is True: + break + + if mod in to_load: + dep_met = True + elif mod in maybe_dep: + maybe_dep.remove(mod) + to_load.append(mod) + dep_met = True + + if dep_met == False: + dependency_failure = True + if modname in to_load: + to_load.remove(modname) + if modname in maybe_dep: + maybe_dep.remove(modname) + cannot_use_because(modname, 'of dependency failure') + + for not_a_dep in maybe_dep: + cannot_use_because(not_a_dep, 'loaded only if needed by dependency') + + for reason in sorted(not_using_because.keys()): + disabled_mods = sorted(set([mod for mod in not_using_because[reason]])) + + if disabled_mods != []: + logging.info('Skipping mod because %s - %s' % ( + reason, ' '.join(disabled_mods))) + + logging.debug('Loading modules %s', ' '.join(sorted(to_load))) + + return [modules[mod] for mod in to_load] + +""" +Load the info files about modules, targets, etc +""" +def load_info_files(options): + + def find_files_named(desired_name, in_path): + for (dirpath, dirnames, filenames) in os.walk(in_path): + if desired_name in filenames: + yield os.path.join(dirpath, desired_name) + + modules = dict([(mod.basename, mod) for mod in + [ModuleInfo(info) for info in + find_files_named('info.txt', options.src_dir)]]) + + def list_files_in_build_data(subdir): + for (dirpath, dirnames, filenames) in \ + os.walk(os.path.join(options.build_data, subdir)): + for filename in filenames: + if filename.endswith('.txt'): + yield os.path.join(dirpath, filename) + + def form_name(filepath): + return os.path.basename(filepath).replace('.txt', '') + + archinfo = dict([(form_name(info), ArchInfo(info)) + for info in list_files_in_build_data('arch')]) + + osinfo = dict([(form_name(info), OsInfo(info)) + for info in list_files_in_build_data('os')]) + + ccinfo = dict([(form_name(info), CompilerInfo(info)) + for info in list_files_in_build_data('cc')]) + + if 'defaults' in osinfo: + del osinfo['defaults'] # FIXME (remove the file) + + return (modules, archinfo, ccinfo, osinfo) + +""" +Perform the filesystem operations needed to setup the build +""" +def setup_build(build_config, options, template_vars): + + """ + Copy or link the file, depending on what the platform offers + """ + def portable_symlink(filename, target_dir): + + if not os.access(filename, os.R_OK): + logging.warning('Missing file %s' % (filename)) + return + + if 'symlink' in os.__dict__: + def count_dirs(dir, accum = 0): + if dir == '' or dir == os.path.curdir: + return accum + (dir,basename) = os.path.split(dir) + return accum + 1 + count_dirs(dir) + + dirs_up = count_dirs(target_dir) + + source = os.path.join(os.path.join(*[os.path.pardir]*dirs_up), + filename) + + target = os.path.join(target_dir, os.path.basename(filename)) + + os.symlink(source, target) + + elif 'link' in os.__dict__: + os.link(filename, + os.path.join(target_dir, os.path.basename(filename))) + + else: + shutil.copy(filename, target_dir) + + def choose_makefile_template(style): + if style == 'nmake': + return 'nmake.in' + elif style == 'unix': + if options.build_shared_lib: + return 'unix_shr.in' + else: + return 'unix.in' + else: + raise Exception('Unknown makefile style "%s"' % (style)) + + # First delete the build tree, if existing + try: + shutil.rmtree(build_config.build_dir) + except OSError, e: + logging.debug('Error while removing build dir: %s' % (e)) + + for dirs in [build_config.checkobj_dir, + build_config.libobj_dir, + build_config.full_include_dir]: + os.makedirs(dirs) + + makefile_template = os.path.join( + options.makefile_dir, + choose_makefile_template(template_vars['makefile_style'])) + + logging.debug('Using makefile template %s' % (makefile_template)) + + templates_to_proc = { + makefile_template: template_vars['makefile_path'] + } + + for (template, sink) in [('buildh.in', 'build.h'), + ('botan-config.in', 'botan-config'), + ('botan.pc.in', build_config.pkg_config_file()), + ('botan.doxy.in', 'botan.doxy')]: + templates_to_proc[os.path.join(options.build_data, template)] = \ + os.path.join(build_config.build_dir, sink) + + for (template, sink) in templates_to_proc.items(): + try: + f = open(sink, 'w') + f.write(process_template(template, template_vars)) + finally: + f.close() + + logging.debug('Linking %d header files in %s' % ( + len(build_config.headers), build_config.full_include_dir)) + + for header_file in build_config.headers: + portable_symlink(header_file, build_config.full_include_dir) + +""" +Main driver +""" +def main(argv = None): + if argv is None: + argv = sys.argv + + logging.basicConfig(stream = sys.stdout, + format = '%(levelname) 7s: %(message)s', + level = logging.INFO) + + logging.debug('%s invoked with options "%s"' % ( + argv[0], ' '.join(argv[1:]))) + + logging.debug('Platform: OS="%s" machine="%s" proc="%s"' % ( + platform.system(), platform.machine(), platform.processor())) + + options = process_command_line(argv[1:]) + + if options.os == "java": + raise Exception("Jython detected: need --os and --cpu to set target") + + options.base_dir = os.path.dirname(argv[0]) + options.src_dir = os.path.join(options.base_dir, 'src') + + options.build_data = os.path.join(options.src_dir, 'build-data') + options.makefile_dir = os.path.join(options.build_data, 'makefile') + + (modules, archinfo, ccinfo, osinfo) = load_info_files(options) + + if options.compiler is None: + if options.os == 'windows': + options.compiler = 'msvc' + else: + options.compiler = 'gcc' + logging.info('Guessing to use compiler %s' % (options.compiler)) + + if options.compiler not in ccinfo: + raise Exception('Unknown compiler "%s"; available options: %s' % ( + options.compiler, ' '.join(sorted(ccinfo.keys())))) + + if options.os not in osinfo: + + def find_canonical_os_name(os): + for (name, info) in osinfo.items(): + if os in info.aliases: + return name + return os # not found + + options.os = find_canonical_os_name(options.os) + + if options.os not in osinfo: + raise Exception('Unknown OS "%s"; available options: %s' % ( + options.os, ' '.join(sorted(osinfo.keys())))) + + if options.cpu is None: + (options.arch, options.cpu) = guess_processor(archinfo) + logging.info('Guessing target processor is a %s/%s' % ( + options.arch, options.cpu)) + else: + (options.arch, options.cpu) = canon_processor(archinfo, options.cpu) + logging.debug('Canonicalizized --cpu to %s/%s' % ( + options.arch, options.cpu)) + + logging.info('Target is %s-%s-%s-%s' % ( + options.compiler, options.os, options.arch, options.cpu)) + + # Kind of a hack... + options.extra_flags = '' + if options.compiler == 'gcc': + + def is_64bit_arch(arch): + if arch.endswith('64') or arch in ['alpha', 's390x']: + return True + return False + + if not is_64bit_arch(options.arch) and not options.dumb_gcc: + try: + + matching_version = '(4\.[01234]\.)|(3\.[34]\.)|(2\.95\.[0-4])' + + gcc_version = ''.join( + subprocess.Popen(['g++', '-v'], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE).communicate()) + + if re.search(matching_version, gcc_version): + options.dumb_gcc = True + except OSError, e: + logging.info('Could not execute GCC for version check') + + if options.dumb_gcc is True: + logging.info('Setting -fpermissive to work around gcc bug') + options.extra_flags = ' -fpermissive' + + if options.with_tr1 == None: + if ccinfo[options.compiler].compiler_has_tr1: + options.with_tr1 = 'system' + else: + options.with_tr1 = 'none' + + modules_to_use = choose_modules_to_use(options, modules) + + build_config = BuildConfigurationInformation(options, modules_to_use) + build_config.headers.append( + os.path.join(build_config.build_dir, 'build.h')) + + template_vars = create_template_vars(build_config, options, + modules_to_use, + ccinfo[options.compiler], + archinfo[options.arch], + osinfo[options.os]) + + # Performs the I/O + setup_build(build_config, options, template_vars) + + logging.info('Botan %s build setup is complete' % ( + build_config.version_string)) + +if __name__ == '__main__': + try: + main() + except Exception, e: + print >>sys.stderr, e + #import traceback + #traceback.print_exc(file=sys.stderr) + sys.exit(1) + sys.exit(0) diff --git a/src/libs/3rdparty/botan/doc/api.pdf b/src/libs/3rdparty/botan/doc/api.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a9939f271c1124d041bdb56b8091f2f96495c29f GIT binary patch literal 254607 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%0A0FS6&CG#1V+@w0YXJ11Ya;B?ge% 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�mRav2h^JgtukkIir!^QCO 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

0GYwFx$xsk?)IJayIxvmr` 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 c1 = pipe.read_all(0); + + byte c2[4096] = { 0 }; + u32bit got_out = pipe.read(c2, sizeof(c2), 1); + // use c2[0...got_out] +\end{verbatim} + +Note the use of \type{AutoSeeded\_RNG}, which is a random number +generator. If you want to, you can explicitly set up the random number +generators and entropy sources you want to, however for 99\% of cases +\type{AutoSeeded\_RNG} is preferable. + +\type{Pipe} also has convenience methods for dealing with +\type{std::iostream}s. Here is an example of those, using the +\type{Bzip\_Compression} filter (included as a module; if you have +bzlib available, check \filename{building.pdf} for how to enable it) +to compress a file: + +\begin{verbatim} + std::ifstream in(``data.bin'', std::ios::binary) + std::ofstream out(``data.bin.bz2'', std::ios::binary) + + Pipe pipe(new Bzip_Compression); + + pipe.start_msg(); + in >> pipe; + pipe.end_msg(); + out << pipe; +\end{verbatim} + +However there is a hitch to the code above; the complete contents of +the compressed data will be held in memory until the entire message +has been compressed, at which time the statement \verb|out << pipe| is +executed, and the data is freed as it is read from the pipe and +written to the file. But if the file is very large, we might not have +enough physical memory (or even enough virtual memory!) for that to be +practical. So instead of storing the compressed data in the pipe for +reading it out later, we divert it directly to the file: + +\begin{verbatim} + std::ifstream in(``data.bin'', std::ios::binary) + std::ofstream out(``data.bin.bz2'', std::ios::binary) + + Pipe pipe(new Bzip_Compression, new DataSink_Stream(out)); + + pipe.start_msg(); + in >> pipe; + pipe.end_msg(); +\end{verbatim} + +This is the first code we've seen so far that uses more than one +filter in a pipe. The output of the compressor is sent to the +\type{DataSink\_Stream}. Anything written to a \type{DataSink\_Stream} +is written to a file; the filter produces no output. As soon as the +compression algorithm finishes up a block of data, it will send it along, +at which point it will immediately be written to disk; if you were to +call \verb|pipe.read_all()| after \verb|pipe.end_msg()|, you'd get an +empty vector out. + +Here's an example using two computational filters: + +\begin{verbatim} + AutoSeeded_RNG rng, + SymmetricKey key(rng, 32); + InitializationVector iv(rng, 16); + + Pipe encryptor(get_cipher("AES/CBC/PKCS7", key, iv, ENCRYPTION), + new Base64_Encoder); + + encryptor.start_msg(); + file >> encryptor; + encryptor.end_msg(); // flush buffers, complete computations + std::cout << encryptor; +\end{verbatim} + +\subsection{Fork} + +It is fairly common that you might receive some data and want to +perform more than one operation on it (\ie, encrypt it with Serpent +and calculate the SHA-256 hash of the plaintext at the same +time). That's where \type{Fork} comes in. \type{Fork} is a filter that +takes input and passes it on to \emph{one or more} \type{Filter}s +that are attached to it. \type{Fork} changes the nature of the pipe +system completely. Instead of being a linked list, it becomes a tree. + +Each \type{Filter} in the fork is given its own output buffer, and +thus its own message. For example, if you had previously written two +messages into a \type{Pipe}, then you start a new one with a +\type{Fork} that has three paths of \type{Filter}'s inside it, you +add three new messages to the \type{Pipe}. The data you put into the +\type{Pipe} is duplicated and sent into each set of \type{Filter}s, +and the eventual output is placed into a dedicated message slot in the +\type{Pipe}. + +Messages in the \type{Pipe} are allocated in a depth-first manner. This is only +interesting if you are using more than one \type{Fork} in a single \type{Pipe}. +As an example, consider the following: + +\begin{verbatim} + Pipe pipe(new Fork( + new Fork( + new Base64_Encoder, + new Fork( + NULL, + new Base64_Encoder + ) + ), + new Hex_Encoder + ) + ); +\end{verbatim} + +In this case, message 0 will be the output of the first \type{Base64\_Encoder}, +message 1 will be a copy of the input (see below for how \type{Fork} interprets +NULL pointers), message 2 will be the output of the second +\type{Base64\_Encoder}, and message 3 will be the output of the +\type{Hex\_Encoder}. As you can see, this results in message numbers being +allocated in a top to bottom fashion, when looked at on the screen. However, +note that there could be potential for bugs if this is not anticipated. For +example, if your code is passed a \type{Filter}, and you assume it is a +``normal'' one that only uses one message, your message offsets would be +wrong, leading to some confusion during output. + +If Fork's first argument is a null pointer, but a later argument is +not, then Fork will feed a copy of its input directly through. Here's +a case where that is useful: + +\begin{verbatim} + // have std::string ciphertext, auth_code, key, iv, mac_key; + + Pipe pipe(new Base64_Decoder, + get_cipher(``AES-128'', key, iv, DECRYPTION), + new Fork( + 0 + new MAC_Filter(``HMAC(SHA-1)'', mac_key) + ) + ); + + pipe.process_msg(ciphertext); + std::string plaintext = pipe.read_all_as_string(0); + SecureVector mac = pipe.read_all(1); + + if(mac != auth_code) + error(); +\end{verbatim} + +Here we wanted to not only decrypt the message, but send the decrypted +text through an additional computation, in order to compute the +authentication code. + +Any \type{Filter}s that are attached to the \type{Pipe} after the +\type{Fork} are implicitly attached onto the first branch created by +the fork. For example, let's say you created this \type{Pipe}: + +\begin{verbatim} +Pipe pipe(new Fork(new Hash_Filter("MD5"), new Hash_Filter("SHA-1")), + new Hex_Encoder); +\end{verbatim} + +And then called \function{start\_msg}, inserted some data, then +\function{end\_msg}. Then \arg{pipe} would contain two messages. The +first one (message number 0) would contain the MD5 sum of the input in +hex encoded form, and the other would contain the SHA-1 sum of the +input in raw binary. However, it's much better to use a \type{Chain} +instead. + +\subsubsection{Chain} + +A \type{Chain} filter creates a chain of \type{Filter}s and +encapsulates them inside a single filter (itself). This allows a +sequence of filters to become a single filter, to be passed into or +out of a function, or to a \type{Fork} constructor. + +You can call \type{Chain}'s constructor with up to 4 \type{Filter*}s +(they will be added in order), or with an array of \type{Filter*}s and +a \type{u32bit} that tells \type{Chain} how many \type{Filter*}s are +in the array (again, they will be attached in order). Here's the +example from the last section, using chain instead of relying on the +obscure rule that version used. + +\begin{verbatim} + Pipe pipe(new Fork( + new Chain(new Hash_Filter("MD5"), new Hex_Encoder), + new Hash_Filter("SHA-1") + ) + ); +\end{verbatim} + +\subsection{The Pipe API} + +\subsubsection{Initializing Pipe} + +By default, \type{Pipe} will do nothing at all; any input placed into +the \type{Pipe} will be read back unchanged. Obviously, this has +limited utility, and presumably you want to use one or more +\type{Filter}s to somehow process the data. First, you can choose a +set of \type{Filter}s to initialize the \type{Pipe} via the +constructor. You can pass it either a set of up to 4 \type{Filter*}s, +or a pre-defined array and a length: + +\begin{verbatim} + Pipe pipe1(new Filter1(/*args*/), new Filter2(/*args*/), + new Filter3(/*args*/), new Filter4(/*args*/)); + Pipe pipe2(new Filter1(/*args*/), new Filter2(/*args*/)); + + Filter* filters[5] = { + new Filter1(/*args*/), new Filter2(/*args*/), new Filter3(/*args*/), + new Filter4(/*args*/), new Filter5(/*args*/) /* more if desired... */ + }; + Pipe pipe3(filters, 5); +\end{verbatim} + +This is by far the most common way to initialize a \type{Pipe}. However, +occasionally a more flexible initialization strategy is necessary; this is +supported by 4 member functions: \function{prepend}(\type{Filter*}), +\function{append}(\type{Filter*}), \function{pop}(), and \function{reset}(). +These functions may only be used while the \type{Pipe} in question is not in +use; that is, either before calling \function{start\_msg}, or after +\function{end\_msg} has been called (and no new calls to \function{start\_msg} +have been made yet). + +The function \function{reset}() simply removes all the \type{Filter}s +that the \type{Pipe} is currently using~--~it is reset to an +initialize, ``empty'' state. Any data that is being retained by the +\type{Pipe} is retained after a \function{reset}(), and +\function{reset}() does not affect the message numbers (discussed +later). + +Calling \function{prepend} and \function{append} will either prepend +or append the passed \type{Filter} object to the list of +transformations. For example, if you \function{prepend} a +\type{Filter} implementing encryption, and the \type{Pipe} already had +a \type{Filter} that hex encoded the input, then the next set of +input would be first encrypted, then hex encoded. Alternately, if you +called \function{append}, then the input would be first be hex +encoded, and then encrypted (which is not terribly useful in this +particular example). + +Finally, calling \function{pop}() will remove the first transformation +of the \type{Pipe}. Say we had called \function{prepend} to put an +encryption \type{Filter} into a \type{Pipe}; calling \function{pop}() +would remove this \type{Filter} and return the \type{Pipe} to its +state before we called \function{prepend}. + +\subsubsection{Giving Data to a Pipe} + +Input to a \type{Pipe} is delimited into messages, which can be read from +independently (\ie, you can read 5 bytes from one message, and then all of +another message, without either read affecting any other messages). The +messages are delimited by calls to \function{start\_msg} and +\function{end\_msg}. In between these two calls, you can write data into a +\type{Pipe}, and it will be processed by the \type{Filter}(s) that it +contains. Writes at any other time are invalid, and will result in an +exception. + +As to writing, you can call any of the functions called \function{write}(), +that can take any of: a \type{byte[]}/\type{u32bit} pair, a +\type{SecureVector}, a \type{std::string}, a \type{DataSource\&}, or a +single \type{byte}. + +Sometimes, you may want to do only a single write per message. In this case, +you can use the \function{process\_msg} series of functions, which start a +message, write their argument into the \type{Pipe}, and then end the +message. In this case you would not make any explicit calls to +\function{start\_msg}/\function{end\_msg}. The version of \function{write} +that takes a single \type{byte} is not supported by \function{process\_msg}, +but all the other variants are. + +\type{Pipe} can also be used with the \verb|>>| operator, and will accept a +\type{std::istream}, (or on Unix systems with the \verb|fd_unix| module), a +Unix file descriptor. In either case, the entire contents of the file will be +read into the \type{Pipe}. + +\subsubsection{Getting Output from a Pipe} + +Retrieving the processed data from a \type{Pipe} is a bit more complicated, for +various reasons. In particular, because \type{Pipe} will separate each message +into a separate buffer, you have to be able to retrieve data from each message +independently. Each of \type{Pipe}'s read functions has a final parameter that +specifies what message to read from (as a 32-bit integer). If this parameter is +set to \type{Pipe::DEFAULT\_MESSAGE}, it will read the current default message +(\type{DEFAULT\_MESSAGE} is also the default value of this parameter). The +parameter will not be mentioned in further discussion of the reading API, but +it is always there (unless otherwise noted). + +Reading is done with a variety of functions. The most basic are \type{u32bit} +\function{read}(\type{byte} \arg{out}[], \type{u32bit} \arg{len}) and +\type{u32bit} \function{read}(\type{byte\&} \arg{out}). Each reads into +\arg{out} (either up to \arg{len} bytes, or a single byte for the one taking a +\type{byte\&}), and returns the total number of bytes read. There is a variant +of these functions, all named \function{peek}, which performs the same +operations, but does not remove the bytes from the message (reading is a +destructive operation with a \type{Pipe}). + +There are also the functions \type{SecureVector} \function{read\_all}(), +and \type{std::string} \function{read\_all\_as\_string}(), which return the +entire contents of the message, either as a memory buffer, or a +\type{std::string} (which is generally only useful if the \type{Pipe} has +encoded the message into a text string, such as when a \type{Base64\_Encoder} +is used). + +To determine how many bytes are left in a message, call \type{u32bit} +\function{remaining}() (which can also take an optional message +number). Finally, there are some functions for managing the default message +number: \type{u32bit} \function{default\_msg}() will return the current default +message, \type{u32bit} \function{message\_count}() will return the total number +of messages (0...\function{message\_count}()-1), and +\function{set\_default\_msg}(\type{u32bit} \arg{msgno}) will set a new default +message number (which must be a valid message number for that \type{Pipe}). The +ability to set the default message number is particularly important in the case +of using the file output operations (\verb|<<| with a \type{std::ostream} or +Unix file descriptor), because there is no way to specify it explicitly when +using the output operator. + +\subsection{A Filter Example} + +Here is some code that takes one or more filenames in \arg{argv} and +calculates the result of several hash functions for each file. The complete +program can be found as \filename{hasher.cpp} in the Botan distribution. For +brevity, most error checking has been removed. + +\begin{verbatim} + string name[3] = { "MD5", "SHA-1", "RIPEMD-160" }; + Botan::Filter* hash[3] = { + new Botan::Chain(new Botan::Hash_Filter(name[0]), + new Botan::Hex_Encoder), + new Botan::Chain(new Botan::Hash_Filter(name[1]), + new Botan::Hex_Encoder), + new Botan::Chain(new Botan::Hash_Filter(name[2]), + new Botan::Hex_Encoder) }; + + Botan::Pipe pipe(new Botan::Fork(hash, COUNT)); + + for(u32bit j = 1; argv[j] != 0; j++) + { + ifstream file(argv[j]); + pipe.start_msg(); + file >> pipe; + pipe.end_msg(); + file.close(); + for(u32bit k = 0; k != 3; k++) + { + pipe.set_default_msg(3*(j-1)+k); + cout << name[k] << "(" << argv[j] << ") = " << pipe << endl; + } + } +\end{verbatim} + + +\subsection{Filter Catalog} + +This section contains descriptions of every \type{Filter} included in +the portable sections of Botan. \type{Filter}s provided by modules +are documented elsewhere. + +\subsubsection{Keyed Filters} + +A few sections ago, it was mentioned that \type{Pipe} can process multiple +messages, treating each of them exactly the same. Well, that was a bit of a +lie. There are some algorithms (in particular, block ciphers not in ECB mode, +and all stream ciphers) that change their state as data is put through them. + +Naturally, you might well want to reset the keys or (in the case of block +cipher modes) IVs used by such filters, so multiple messages can be processed +using completely different keys, or new IVs, or new keys and IVs, or whatever. +And in fact, even for a MAC or an ECB block cipher, you might well want to +change the key used from message to message. + +Enter \type{Keyed\_Filter}, which acts as an abstract interface for +any filter that is uses keys: block cipher modes, stream ciphers, +MACs, and so on. It has two functions, \function{set\_key} and +\function{set\_iv}. Calling \function{set\_key} will, naturally, set +(or reset) the key used by the algorithm. Setting the IV only makes +sense in certain algorithms -- a call to \function{set\_iv} on an +object that doesn't support IVs will be ignored. You \emph{must} call +\function{set\_key} before calling \function{set\_iv}: while not all +\type{Keyed\_Filter} objects require this, you should assume it is +required anytime you are using a \type{Keyed\_Filter}. + +Here's a example: + +\begin{verbatim} + Keyed_Filter *cast, *hmac; + Pipe pipe(new Base64_Decoder, + // Note the assignments to the cast and hmac variables + cast = new CBC_Decryption("CAST-128", "PKCS7", cast_key, iv), + new Fork( + 0, // Read the section 'Fork' to understand this + new Chain( + hmac = new MAC_Filter("HMAC(SHA-1)", mac_key, 12), + new Base64_Encoder + ) + ) + ); + pipe.start_msg(); + [use pipe for a while, decrypt some stuff, derive new keys and IVs] + pipe.end_msg(); + + cast->set_key(cast_key2); + cast->set_iv(iv2); + hmac->set_key(mac_key2); + + pipe.start_msg(); + [use pipe for some other things] + pipe.end_msg(); +\end{verbatim} + +There are some requirements to using \type{Keyed\_Filter} that you must +follow. If you call \function{set\_key} or \function{set\_iv} on a filter that +is owned by a \type{Pipe}, you must do so while the \type{Pipe} is +``unlocked''. This refers to the times when no messages are being processed by +\type{Pipe} -- either before \type{Pipe}'s \function{start\_msg} is called, or +after \function{end\_msg} is called (and no new call to \function{start\_msg} +has happened yet). Doing otherwise will result in undefined behavior, probably +silently getting invalid output. + +And remember: if you're resetting both values, reset the key \emph{first}. + +\subsubsection{Cipher Filters} + +Getting a hold of a \type{Filter} implementing a cipher is very easy. Simply +make sure you're including the header \filename{lookup.h}, and call +\function{get\_cipher}. Generally you will pass the return value directly into +a \type{Pipe}. There are actually a couple different functions, which do pretty +much the same thing: + +\function{get\_cipher}(\type{std::string} \arg{cipher\_spec}, + \type{SymmetricKey} \arg{key}, + \type{InitializationVector} \arg{iv}, + \type{Cipher\_Dir} \arg{dir}); + +\function{get\_cipher}(\type{std::string} \arg{cipher\_spec}, + \type{SymmetricKey} \arg{key}, + \type{Cipher\_Dir} \arg{dir}); + +The version that doesn't take an IV is useful for things that don't use them, +like block ciphers in ECB mode, or most stream ciphers. If you specify a +\arg{cipher\_spec} that does want a IV, and you use the version that doesn't +take one, an exception will be thrown. The \arg{dir} argument can be either +\type{ENCRYPTION} or \type{DECRYPTION}. In a few cases, like most (but not all) +stream ciphers, these are equivalent, but even then it provides a way of +showing the ``intent'' of the operation to readers of your code. + +The \arg{cipher\_spec} is a string that specifies what cipher is to be +used. The general syntax for \arg{cipher\_spec} is ``STREAM\_CIPHER'', +``BLOCK\_CIPHER/MODE'', or ``BLOCK\_CIPHER/MODE/PADDING''. In the case of +stream ciphers, no mode is necessary, so just the name is sufficient. A block +cipher requires a mode of some sort, which can be ``ECB'', ``CBC'', ``CFB(n)'', +``OFB'', ``CTR-BE'', or ``EAX(n)''. The argument to CFB mode is how many bits +of feedback should be used. If you just use ``CFB'' with no argument, it will +default to using a feedback equal to the block size of the cipher. EAX mode +also takes an optional bit argument, which tells EAX how large a tag size to +use~--~generally this is the size of the block size of the cipher, which is the +default if you don't specify any argument. + +In the case of the ECB and CBC modes, a padding method can also be +specified. If it is not supplied, ECB defaults to not padding, and CBC defaults +to using PKCS \#5/\#7 compatible padding. The padding methods currently +available are ``NoPadding'', ``PKCS7'', ``OneAndZeros'', and ``CTS''. CTS +padding is currently only available for CBC mode, but the others can also be +used in ECB mode. + +Some example \arg{cipher\_spec} arguments are: ``DES/CFB(32)'', +``TripleDES/OFB'', ``Blowfish/CBC/CTS'', ``SAFER-SK(10)/CBC/OneAndZeros'', +``AES/EAX'', ``ARC4'' + +``CTR-BE'' refers to counter mode where the counter is incremented as if it +were a big-endian encoded integer. This is compatible with most other +implementations, but it is possible some will use the incompatible little +endian convention. This version would be denoted as ``CTR-LE'' if it were +supported. + +``EAX'' is a new cipher mode designed by Wagner, Rogaway, and Bellare. It is an +authenticated cipher mode (that is, no separate authentication is needed), has +provable security, and is free from patent entanglements. It runs about half as +fast as most of the other cipher modes (like CBC, OFB, or CTR), which is not +bad considering you don't need to use an authentication code. + +\subsubsection{Hashes and MACs} + +Hash functions and MACs don't need anything special when it comes to +filters. Both just take their input and produce no output until +\function{end\_msg()} is called, at which time they complete the hash or MAC +and send that as output. + +These \type{Filter}s take a string naming the type to be used. If for some +reason you name something that doesn't exist, an exception will be thrown. + +\noindent +\function{Hash\_Filter}(\type{std::string} \arg{hash}, + \type{u32bit} \arg{outlength}): + +This type hashes its input with \arg{hash}. When \function{end\_msg} is called +on the owning \type{Pipe}, the hash is completed and the digest is sent on to +the next thing in the pipe. The argument \arg{outlength} specifies how much of +the output of the hash will be passed along to the next filter when +\function{end\_msg} is called. By default, it will pass the entire hash. + +Examples of names for \function{Hash\_Filter} are ``SHA-1'' and ``Whirlpool''. + +\noindent +\function{MAC\_Filter}(\type{std::string} \arg{mac}, + \type{const SymmetricKey\&} \arg{key}, + \type{u32bit} \arg{outlength}): + +The constructor for a \type{MAC\_Filter} takes a key, used in calculating the +MAC, and a length parameter, which has semantics exactly the same as the one +passed to \type{Hash\_Filter}s constructor. + +Examples for \arg{mac} are ``HMAC(SHA-1)'', ``CMAC(AES-128)'', and the +exceptionally long, strange, and probably useless name +``CMAC(Lion(Tiger(20,3),MARK-4,1024))''. + +\subsubsection{PK Filters} + +There are four classes in this category, \type{PK\_Encryptor\_Filter}, +\type{PK\_Decryptor\_Filter}, \type{PK\_Signer\_Filter}, and +\type{PK\_Verifier\_Filter}. Each takes a pointer to an object of the +appropriate type (\type{PK\_Encryptor}, \type{PK\_Decryptor}, etc) that is +deleted by the destructor. These classes are found in \filename{pk\_filts.h}. + +Three of these, for encryption, decryption, and signing are pretty much +identical conceptually. Each of them buffers its input until the end of the +message is marked with a call to the \function{end\_msg} function. Then they +encrypt, decrypt, or sign their input and send the output (the ciphertext, the +plaintext, or the signature) into the next filter. + +Signature verification works a little differently, because it needs to know +what the signature is in order to check it. You can either pass this in along +with the constructor, or call the function \function{set\_signature} -- with +this second method, you need to keep a pointer to the filter around so you can +send it this command. In either case, after \function{end\_msg} is called, it +will try to verify the signature (if the signature has not been set by either +method, an exception will be thrown here). It will then send a single byte onto +the next filter -- a 1 or a 0, which specifies whether the signature verified +or not (respectively). + +For more information about PK algorithms (including creating the appropriate +objects to pass to the constructors), read the section ``Public Key +Cryptography'' in this manual. + +\subsubsection{Encoders} + +Often you want your data to be in some form of text (for sending over channels +that aren't 8-bit clean, printing it, etc). The filters \type{Hex\_Encoder} +and \type{Base64\_Encoder} will convert arbitrary binary data into hex or +base64 formats. Not surprisingly, you can use \type{Hex\_Decoder} and +\type{Base64\_Decoder} to convert it back into its original form. + +Both of the encoders can take a few options about how the data should be +formatted (all of which have defaults). The first is a \type{bool} which simply +says if the encoder should insert line breaks. This defaults to +false. Line breaks don't matter either way to the decoder, but it makes the +output a bit more appealing to the human eye, and a few transport mechanisms +(notably some email systems) limit the maximum line length. + +The second encoder option is an integer specifying how long such lines will be +(obviously this will be ignored if line-breaking isn't being used). The default +tends to be in the range of 60-80 characters, but is not specified exactly. If +you want a specific value, set it. Otherwise the default should be fine. + +Lastly, \type{Hex\_Encoder} takes an argument of type \type{Case}, which can be +\type{Uppercase} or \type{Lowercase} (default is \type{Uppercase}). This +specifies what case the characters A-F should be output as. The base64 encoder +has no such option, because it uses both upper and lower case letters for its +output. + +The decoders both take a single option, which tells it how the object should +behave in the case of invalid input. The enum (called \type{Decoder\_Checking}) +can take on any of three values: \type{NONE}, \type{IGNORE\_WS}, and +\type{FULL\_CHECK}. With \type{NONE} (the default, for compatibility with +previous releases), invalid input (for example, a ``z'' character in supposedly +hex input) will simply be ignored. With \type{IGNORE\_WS}, whitespace will be +ignored by the decoder, but receiving other non-valid data will raise an +exception. Finally, \type{FULL\_CHECK} will raise an exception for \emph{any} +characters not in the encoded character set, including whitespace. + +You can find the declarations for these types in \filename{hex.h} and +\filename{base64.h}. + +\subsection{Rolling Your Own} + +The system of filters and pipes was designed in an attempt to make it +as simple as possible to write new \type{Filter} objects. There are +essentially four functions that need to be implemented by an object +deriving from \type{Filter}: + +\noindent +\type{void} \function{write}(\type{byte} \arg{input}[], \type{u32bit} +\arg{length}): + +The \function{write} function is what is called when a filter receives input +for it to process. The filter is \emph{not} required to process it right away; +many filters buffer their input before producing any output. A filter will +usually have \function{write} called many times during its lifetime. + +\noindent +\type{void} \function{send}(\type{byte} \arg{output}[], \type{u32bit} +\arg{length}): + +Eventually, a filter will want to produce some output to send along to the next +filter in the pipeline. It does so by calling \function{send} with whatever it +wants to send along to the next filter. There is also a version of +\function{send} taking a single byte argument, as a convenience. + +\noindent +\type{void} \function{start\_msg()}: + +This function is optional. Implement it if your \type{Filter} would like to do +some processing or setup at the start of each message (for an example, see the +Zlib compression module). + +\noindent +\type{void} \function{end\_msg()}: + +Implementing the \function{end\_msg} function is optional. It is called when it +has been requested that filters finish up their computations. Note that they +must \emph{not} deallocate their resources; this should be done by their +destructor. They should simply finish up with whatever computation they have +been working on (for example, a compressing filter would flush the compressor +and \function{send} the final block), and empty any buffers in preparation for +processing a fresh new set of input. It is essentially the inverse of +\function{start\_msg}. + +Additionally, if necessary, filters can define a constructor that takes any +needed arguments, and a destructor to deal with deallocating memory, closing +files, etc. + +There is also a \type{BufferingFilter} class (in \filename{buf\_filt.h}) that +will take a message and split it up into an initial block that can be of any +size (including zero), a sequence of fixed sized blocks of any non-zero size, +and last (possibly zero-sized) final block. This might make a useful base class +for your filters, depending on what you have in mind. + + +\pagebreak +\section{Public Key Cryptography} + +Let's create a 1024-bit RSA private key, encode the public key as a +PKCS \#1 file with PEM encoding (which can be understood by many other +cryptographic programs) + +\begin{verbatim} +// everyone does: +AutoSeeded_RNG rng; + +// Alice +RSA_PrivateKey priv_rsa(rng, 1024 /* bits */); + +std::string alice_pem = X509::PEM_encode(priv_rsa); + +// send alice_pem to Bob, who does + +// Bob +std::auto_ptr alice(load_key(alice_pem)); + +RSA_PublicKey* alice_rsa = dynamic_cast(alice); +if(alice_rsa) + { + /* ... */ + } + +\end{verbatim} + +\subsection{Creating PK Algorithm Key Objects} + +The library has interfaces for encryption, signatures, etc that do not require +knowing the exact algorithm in use (for example RSA and Rabin-Williams +signatures are handled by the exact same code path). + +One place where we \emph{do} need to know exactly what kind of algorithm is in +use is when we are creating a key (\emph{But}: read the section ``Importing and +Exporting PK Keys'', later in this manual). + +There are (currently) two kinds of public key algorithms in Botan: ones based +on integer factorization (RSA and Rabin-Williams), and ones based on the +discrete logarithm problem (DSA, Diffie-Hellman, Nyberg-Rueppel, and +ElGamal). Since discrete logarithm parameters (primes and generators) can be +shared among many keys, there is the notion of these being a combined type +(called \type{DL\_Group}). + +There are two ways to create a DL private key (such as +\type{DSA\_PrivateKey}). One is to pass in just a \type{DL\_Group} object -- a +new key will automatically be generated. The other involves passing in a group +to use, along with both the public and private values (private value first). + +Since in integer factorization algorithms, the modulus used isn't shared by +other keys, we don't use this notion. You can create a new key by passing in a +\type{u32bit} telling how long (in bits) the key should be, or you can copy an +pre-existing key by passing in the appropriate parameters (primes, exponents, +etc). For RSA and Rabin-Williams (the two IF schemes in Botan), the parameters +are all \type{BigInt}s: prime 1, prime 2, encryption exponent, decryption +exponent, modulus. The last two are optional, since they can easily be derived +from the first three. + +\subsubsection{Creating a DL\_Group} + +There are quite a few ways to get a \type{DL\_Group} object. The best is to use +the function \function{get\_dl\_group}, which takes a string naming a group; it +will either return that group, if it knows about it, or throw an +exception. Names it knows about include ``IETF-n'' where n is 768, 1024, 1536, +2048, 3072, or 4096, and ``DSA-n'', where n is 512, 768, or 1024. The IETF +groups are the ones specified for use with IPSec, and the DSA ones are the +default DSA parameters specified by Java's JCE. For DSA and Nyberg-Rueppel, you +should only use the ``DSA-n'' groups, while Diffie-Hellman and ElGamal can use +either type (keep in mind that some applications/standards require DH/ELG to +use DSA-style primes, while others require strong prime groups). + +You can also generate a new random group. This is not recommend, because it is +quite slow, especially for safe primes. + +\subsection{Key Checking} + +Most public key algorithms have limitations or restrictions on their +parameters. For example RSA requires an odd exponent, and algorithms based on +the discrete logarithm problem need a generator $> 1$. + +Each low-level public key type has a function named \function{check\_key} that +takes a \type{bool}. This function returns a Boolean value that declares +whether or not the key is valid (from an algorithmic standpoint). For example, +it will check to make sure that the prime parameters of a DSA key are, in fact, +prime. It does not have anything to do with the validity of the key for any +particular use, nor does it have anything to do with certificates that link a +key (which, after all, is just some numbers) with a user or other entity. If +\function{check\_key}'s argument is \type{true}, then it does ``strong'' +checking, which includes fairly expensive operations like primality checking. + +Keys are always checked when they are loaded or generated, so typically there +is no reason to use this function directly. However, you can disable or reduce +the checks for particular cases (public keys, loaded private keys, generated +private keys) by setting the right config toggle (see the section on the +configuration subsystem for details). + +\subsection{Getting a PK algorithm object} + +The key types, like \type{RSA\_PrivateKey}, do not implement any kind +of padding or encoding (which is generally necessary for security). To +get an object like this, the easiest thing to do is call the functions +found in \filename{look\_pk.h}. Generally these take a key, followed +by a string that specified what hashing and encoding method(s) to +use. Examples of such strings are ``EME1(SHA-256)'' for OAEP +encryption and ``EMSA4(SHA-256)'' for PSS signatures (where the +message is hashed using SHA-256). + +Here are some basic examples (using an RSA key) to give you a feel for the +possibilities. These examples assume \type{rsakey} is an +\type{RSA\_PrivateKey}, since otherwise we would not be able to create a +decryption or signature object with it (you can create encryption or signature +verification objects with public keys, naturally). Remember to delete these +objects when you're done with them. + +\begin{verbatim} + // PKCS #1 v2.0 / IEEE 1363 compatible encryption + PK_Encryptor* rsa_enc1 = get_pk_encryptor(rsakey, "EME1(RIPEMD-160)"); + // PKCS #1 v1.5 compatible encryption + PK_Encryptor* rsa_enc2 = get_pk_encryptor(rsakey, "PKCS1v15"); + + // Raw encryption: no padding, input is directly encrypted by the key + // Don't use this unless you know what you're doing + PK_Encryptor* rsa_enc3 = get_pk_encryptor(rsakey, "Raw"); + + // This object can decrypt things encrypted by rsa_enc1 + PK_Decryptor* rsa_dec1 = get_pk_decryptor(rsakey, "EME1(RIPEMD-160)"); + + // PKCS #1 v1.5 compatible signatures + PK_Signer* rsa_sig = get_pk_signer(rsakey, "EMSA3(MD5)"); + PK_Verifier* rsa_verify = get_pk_verifier(rsakey, "EMSA3(MD5)"); + + // PKCS #1 v2.1 compatible signatures + PK_Signer* rsa_sig2 = get_pk_signer(rsakey, "EMSA4(SHA-1)"); + PK_Verifier* rsa_verify2 = get_pk_verifier(rsakey, "EMSA4(SHA-1)"); + + // Hash input with SHA-1, but don't pad the input in any way; usually + // used with DSA/NR, not RSA + PK_Signer* rsa_sig = get_pk_signer(rsakey, "EMSA1(SHA-1)"); +\end{verbatim} + +\subsection{Encryption} + +The \type{PK\_Encryptor} and \type{PK\_Decryptor} classes are the interface for +encryption and decryption, respectively. + +Calling \function{encrypt} with a \type{byte} array, a length +parameter, and an RNG object will return the input encrypted with +whatever scheme is being used. Calling the similar \function{decrypt} +will perform the inverse operation. You can also do these operations +with \type{SecureVector}s. In all cases, the output is returned +via a \type{SecureVector}. + +If you attempt an operation with a larger size than the key can +support (this limit varies based on the algorithm, the key size, and +the padding method used (if any)), an exception will be +thrown. Alternately, you can call \function{maximum\_input\_size}, +that will return the maximum size you can safely encrypt. In fact, +you can often encrypt an object that is one byte longer, but only if +enough of the high bits of the leading byte are set to zero. Since +this is pretty dicey, it's best to stick with the advertised maximum. + +Available public key encryption algorithms in Botan are RSA and ElGamal. The +encoding methods are EME1, denoted by ``EME1(HASHNAME)'', PKCS \#1 v1.5, +called ``PKCS1v15'' or ``EME-PKCS1-v1\_5'', and raw encoding (``Raw''). + +For compatibility reasons, PKCS \#1 v1.5 is recommend for use with +ElGamal (most other implementations of ElGamal do not support any +other encoding format). RSA can also be used with PKCS \# 1 encoding, +but because of various possible attacks, EME1 is the preferred +encoding. EME1 requires the use of a hash function: unless a competent +applied cryptographer tells you otherwise, you should use SHA-256 or +SHA-512. + +Don't use ``Raw'' encoding unless you need it for backward +compatibility with old protocols. There are many possible attacks +against both ElGamal and RSA when they are used in this way. + +\subsection{Signatures} + +The signature algorithms look quite a bit like the hash functions. You +can repeatedly call \function{update}, giving more and more of a +message you wish to sign, and then call \function{signature}, which +will return a signature for that message. If you want to do it all in +one shot, call \function{sign\_message}, which will just call +\function{update} with its argument and then return whatever +\function{signature} returns. Generating a signature requires random +numbers with some schemes, so \function{signature} and +\function{sign\_message} both take a \type{RandomNumberGenerator\&}. + +You can validate a signature by updating the verifier class, and finally seeing +the if the value returned from \function{check\_signature} is true (you pass +the supposed signature to the \function{check\_signature} function as a byte +array and a length or as a \type{MemoryRegion}). There is another +function, \function{verify\_message}, which takes a pair of byte array/length +pairs (or a pair of \type{MemoryRegion} objects), the first of which is +the message, the second being the (supposed) signature. It returns true if the +signature is valid and false otherwise. + +Available public key signature algorithms in Botan are RSA, DSA, +Nyberg-Rueppel, and Rabin-Williams. Signature encoding methods include EMSA1, +EMSA2, EMSA3, EMSA4, and Raw. All of them, except Raw, take a parameter naming +a message digest function to hash the message with. Raw actually signs the +input directly; if the message is too big, the signing operation will fail. Raw +is not useful except in very specialized applications. + +There are various interactions that make certain encoding schemes and signing +algorithms more or less useful. + +EMSA2 is the usual method for encoding Rabin-William signatures, so for +compatibility with other implementations you may have to use that. EMSA4 (also +called PSS), also works with Rabin-Williams. EMSA1 and EMSA3 do \emph{not} work +with Rabin-Williams. + +RSA can be used with any of the available encoding methods. EMSA4 is by far the +most secure, but is not (as of now) widely implemented. EMSA3 (also called +``EMSA-PKCS1-v1\_5'') is commonly used with RSA (for example in SSL). EMSA1 +signs the message digest directly, without any extra padding or encoding. This +may be useful, but is not as secure as either EMSA3 or EMSA4. EMSA2 may be used +but is not recommended. + +For DSA and Nyberg-Rueppel, you should use EMSA1. None of the other encoding +methods are particularly useful for these algorithms. + +\subsection{Key Agreement} + +You can get a hold of a \type{PK\_Key\_Agreement\_Scheme} object by calling +\function{get\_pk\_kas} with a key that is of a type that supports key +agreement (such as a Diffie-Hellman key stored in a \type{DH\_PrivateKey} +object), and the name of a key derivation function. This can be ``Raw'', +meaning the output of the primitive itself is returned as the key, or +``KDF1(hash)'' or ``KDF2(hash)'' where ``hash'' is any string you happen to +like (hopefully you like strings like ``SHA-256'' or ``RIPEMD-160''), or +``X9.42-PRF(keywrap)'', which uses the PRF specified in ANSI X9.42. It takes +the name or OID of the key wrap algorithm that will be used to encrypt a +content encryption key. + +How key agreement generally works is that you trade public values with some +other party, and then each of you runs a computation with the other's value and +your key (this should return the same result to both parties). This computation +can be called by using \function{derive\_key} with either a byte array/length +pair, or a \type{SecureVector} than holds the public value of the other +party. The last argument to either call is a number that specifies how long a +key you want. + +Depending on the key derivation function you're using, you many not +\emph{actually} get back a key of that size. In particular, ``Raw'' will return +a number about the size of the Diffie-Hellman modulus, and KDF1 can only return +a key that is the same size as the output of the hash. KDF2, on the other +hand, will always give you a key exactly as long as you request, regardless of +the underlying hash used with it. The key returned is a \type{SymmetricKey}, +ready to pass to a block cipher, MAC, or other symmetric algorithm. + +The public value that should be used can be obtained by calling +\function{public\_data}, which exists for any key that is associated with a +key agreement algorithm. It returns a \type{SecureVector}. + +``KDF2(SHA-256)'' is by far the preferred algorithm for key derivation +in new applications. The X9.42 algorithm may be useful in some +circumstances, but unless you need X9.42 compatibility, KDF2 is easier +to use. + +There is a Diffie-Hellman example included in the distribution, which you may +want to examine. + +\subsection{Importing and Exporting PK Keys} + +[This section mentions \type{Pipe} and \type{DataSource}, which is not covered +until later in the manual. Please read those sections for more about +\type{Pipe} and \type{DataSource} and their uses.] + +There are many, many different (often conflicting) standards surrounding public +key cryptography. There is, thankfully, only two major standards surrounding +the representation of a public or private key: X.509 (for public keys), and +PKCS \#8 (for private keys). Other crypto libraries, like OpenSSL and B-SAFE, +also support these formats, so you can easily exchange keys with software that +doesn't use Botan. + +In addition to ``plain'' public keys, Botan also supports X.509 certificates. +These are documented in the section ``Certificate Handling'', later in this +manual. + +\subsubsection{Public Keys} + +The interfaces for doing either of these are quite similar. Let's look at the +X.509 stuff first: +\begin{verbatim} +namespace X509 { + void encode(const X509_PublicKey& key, Pipe& out, X509_Encoding enc = PEM); + std::string PEM_encode(const X509_PublicKey& out); + + X509_PublicKey* load_key(DataSource& in); + X509_PublicKey* load_key(const std::string& file); + X509_PublicKey* load_key(const SecureVector& buffer); +} +\end{verbatim} + +Basically, \function{X509::encode} will take an \type{X509\_PublicKey} +(as of now, that's any RSA, DSA, or Diffie-Hellman key) and encodes it +using \arg{enc}, which can be either \type{PEM} or +\type{RAW\_BER}. Using \type{PEM} is \emph{highly} recommended for +many reasons, including compatibility with other software, for +transmission over 8-bit unclean channels, because it can be identified +by a human without special tools, and because it sometimes allows more +sane behavior of tools that process the data. It will place the +encoding into \arg{out}. Remember that if you have just created the +\type{Pipe} that you are passing to \function{X509::encode}, you need +to call \function{start\_msg} first. Particularly with public keys, +about 99\% of the time you just want to PEM encode the key and then +write it to a file or something. In this case, it's probably easier to +use \function{X509::PEM\_encode}. This function will simply return the +PEM encoding of the key as a \type{std::string}. + +For loading a public key, the preferred method is one of the variants +of \function{load\_key}. This function will return a newly allocated +key based on the data from whatever source it is using (assuming, of +course, the source is in fact storing a representation of a public +key). The encoding used (PEM or BER) need not be specified; the format +will be detected automatically. The key is allocated with +\function{new}, and should be released with \function{delete} when you +are done with it. The first takes a generic \type{DataSource} that +you have to allocate~--~the others are simple wrapper functions that +take either a filename or a memory buffer. + +So what can you do with the return value of \function{load\_key}? On +its own, a \type{X509\_PublicKey} isn't particularly useful; you can't +encrypt messages or verify signatures, or much else. But, using +\function{dynamic\_cast}, you can figure out what kind of operations +the key supports. Then, you can cast the key to the appropriate type +and pass it to a higher-level class. For example: + +\begin{verbatim} + /* Might be RSA, might be ElGamal, might be ... */ + X509_PublicKey* key = X509::load_key("pubkey.asc"); + /* You MUST use dynamic_cast to convert, because of virtual bases */ + PK_Encrypting_Key* enc_key = dynamic_cast(key); + if(!enc_key) + throw Some_Exception(); + PK_Encryptor* enc = get_pk_encryptor(*enc_key, "EME1(SHA-256)"); + SecureVector cipher = enc->encrypt(some_message, size_of_message); +\end{verbatim} + +\subsubsection{Private Keys} + +There are two different options for private key import/export. The first is a +plaintext version of the private key. This is supported by the following +functions: + +\begin{verbatim} +namespace PKCS8 { + void encode(const PKCS8_PrivateKey& key, Pipe& to, X509_Encoding enc = PEM); + + std::string PEM_encode(const PKCS8_PrivateKey& key); +} +\end{verbatim} + +These functions are basically the same as the X.509 functions described +previously. The only difference is that they take a \type{PKCS8\_PrivateKey} +type (which, again, can be either RSA, DSA, or Diffie-Hellman, but this time +the key must be a private key). In most situations, using these is a bad idea, +because anyone can come along and grab the private key without having to know +any passwords or other secrets. Unless you have very particular security +requirements, always use the versions that encrypt the key based on a +passphrase. For importing, the same functions can be used for encrypted and +unencrypted keys. + +The other way to export a PKCS \#8 key is to first encode it in the same manner +as done above, then encrypt it (using a passphrase and the techniques of PKCS +\#5), and store the whole thing into another structure. This method is +definitely preferred, since otherwise the private key is unprotected. The +following functions support this technique: + +\begin{verbatim} +namespace PKCS8 { + void encrypt_key(const PKCS8_PrivateKey& key, Pipe& out, + std::string passphrase, std::string pbe = "", + X509_Encoding enc = PEM); + + std::string PEM_encode(const PKCS8_PrivateKey& key, std::string passphrase, + std::string pbe = ""); +} +\end{verbatim} + +To export an encrypted private key, call \function{PKCS8::encrypt\_key}. The +\arg{key}, \arg{out}, and \arg{enc} arguments are similar in usage to the ones +for \function{PKCS8::encode}. As you might notice, there are two new arguments +for \function{PKCS8::encrypt\_key}, however. The first is a passphrase (which +you presumably got from a user somehow). This will be used to encrypt the key. +The second new argument is \arg{pbe}; this specifies a particular password +based encryption (or PBE) algorithm. + +The \function{PEM\_encode} version shown here is similar to the one that +doesn't take a passphrase. Essentially it encrypts the key (using the default +PBE algorithm), and then returns a C++ string with the PEM encoding of the key. + +If \arg{pbe} is blank, then the default algorithm (controlled by the +``base/default\_pbe'' option) will be used. As shipped, this default is +``PBE-PKCS5v20(SHA-1,TripleDES/CBC)'' . This is among the more secure options +of PKCS \#5, and is widely supported among implementations of PKCS \#5 v2.0. It +offers 168 bits of security against attacks, which should be more that +sufficient. If you need compatibility with systems that only support PKCS \#5 +v1.5, pass ``PBE-PKCS5v15(MD5,DES/CBC)'' as \arg{pbe}. However, be warned that +this PBE algorithm only has 56 bits of security against brute force attacks. As +of 1.4.5, all three keylengths of AES are also available as options, which can +be used with by specifying a PBE algorithm of +``PBE-PKCS5v20(SHA-1,AES-256/CBC)'' (or ``AES-128'' or ``AES-192''). Support +for AES is slightly non-standard, and some applications or libraries might not +handle it. It is known that OpenSSL (0.9.7 and later) do handle AES for private +key encryption. + +There may be some strange programs out there that support the v2.0 extensions +to PBES1 but not PBES2; if you need to inter-operate with a program like that, +use ``PBE-PKCS5v15(MD5,RC2/CBC)''. For example, OpenSSL supports this format +(though since it also supports the v2.0 schemes, there is no reason not to just +use TripleDES or AES). This scheme uses a 64-bit key that, while +significantly better than a 56-bit key, is a bit too small for comfort. + +Last but not least, there are some functions that are basically identical to +\function{X509::load\_key} that will load, and possibly decrypt, a PKCS \#8 +private key: + +\begin{verbatim} +namespace PKCS8 { + PKCS8_PrivateKey* load_key(DataSource& in, + RandomNumberGenerator& rng, + const User_Interface& ui); + PKCS8_PrivateKey* load_key(DataSource& in, + RandomNumberGenerator& rng, + std::string passphrase = ""); + + PKCS8_PrivateKey* load_key(const std::string& filename, + RandomNumberGenerator& rng, + const User_Interface& ui); + PKCS8_PrivateKey* load_key(const std::string& filename, + RandomNumberGenerator& rng, + const std::string& passphrase = ""); +} +\end{verbatim} + +The versions that take \type{std::string} \arg{passphrase}s are primarily for +compatibility, but they are useful in limited circumstances. The +\type{User\_Interface} versions are how \function{load\_key} is actually +implemented, and provides for much more flexibility. Essentially, if the +passphrase given to the function is not correct, then an exception is thrown +and that is that. However, if you pass in an UI object instead, then the UI +object can keep asking the user for the passphrase until they get it right (or +until they cancel the action, though the UI interface). A +\type{User\_Interface} has very little to do with talking to users; it's just a +way to glue together Botan and whatever user interface you happen to be +using. You can think of it as a user interface interface. The default +\type{User\_Interface} is actually very dumb, and effectively acts just like +the versions taking the \type{std::string}. + +All versions need access to a \type{RandomNumberGenerator} in order to +perform probabilistic tests on the loaded key material. + +After loading a key, you can use \function{dynamic\_cast} to find out what +operations it supports, and use it appropriately. Remember to \function{delete} +it once you are done with it. + +\subsubsection{Limitations} + +As of now Nyberg-Rueppel and Rabin-Williams keys cannot be imported or +exported, because they have no official ASN.1 OID or definition. ElGamal keys +can (as of Botan 1.3.8) be imported and exported, but the only other +implementation that supports the format is Peter Gutmann's Cryptlib. If you +can help it, stick to RSA and DSA. + +\emph{Note}: Currently NR and RW are given basic ASN.1 key formats (which +mirror DSA and RSA, respectively), which means that, if they are assigned an +OID, they can be imported and exported just as easily as RSA and DSA. You can +assign them an OID by putting a line in a Botan configuration file, calling +\function{OIDS::add\_oid}, or editing \filename{src/policy.cpp}. Be warned that +it is possible that a future version will use a format that is different from +the current one (\ie, a newly standardized format). + +\pagebreak +\section{Certificate Handling} + +A certificate is essentially a binding between some identifying information of +a person or other entity (called a \emph{subject}) and a public key. This +binding is asserted by a signature on the certificate, which is placed there by +some authority (the \emph{issuer}) that at least claims that it knows the +subject named in the certificate really ``owns'' the private key +corresponding to the public key in the certificate. + +The major certificate format in use today is X.509v3, designed by ISO and +further hacked on by dozens (hundreds?) of other organizations. + +When working with certificates, the main class to remember is +\type{X509\_Certificate}. You can read an object of this type, but you can't +create one on the fly; a CA object is necessary for actually making a new +certificate. So for the most part, you only have to worry about reading them +in, verifying the signatures, and getting the bits of data in them (most +commonly the public key, and the information about the user of that key). An +X.509v3 certificate can contain a literally infinite number of items related to +all kinds of things. Botan doesn't support a lot of them, simply because nobody +uses them and they're an impossible mess to work with. This section only +documents the most commonly used ones of the ones that are supported; for the +rest, read \filename{x509cert.h} and \filename{asn1\_obj.h} (which has the +definitions of various common ASN.1 constructs used in X.509). + +\subsection{So what's in an X.509 certificate?} + +Obviously, you want to be able to get the public key. This is achieved by +calling the member function \function{subject\_public\_key}, which will return +a \type{X509\_PublicKey*}. As to what to do with this, read about +\function{load\_key} in the section ``Importing and Exporting PK Keys''. In the +general case, this could be any kind of public key, though 99\% of the time it +will be an RSA key. However, Diffie-Hellman and DSA keys are also supported, so +be careful about how you treat this. It is also a wise idea to examine the +value returned by \function{constraints}, to see what uses the public key is +approved for. + +The second major piece of information you'll want is the name/email/etc of the +person to whom this certificate is assigned. Here is where things get a little +nasty. X.509v3 has two (well, mostly just two $\ldots$) different places where +you can stick information about the user: the \emph{subject} field, and in an +extension called \emph{subjectAlternativeName}. The \emph{subject} field is +supposed to only included the following information: country, organization +(possibly), an organizational sub-unit name (possibly), and a so-called common +name. The common name is usually the name of the person, or it could be a title +associated with a position of some sort in the organization. It may also +include fields for state/province and locality. What exactly a locality is, +nobody knows, but it's usually given as a city name. + +Botan doesn't currently support any of the Unicode variants used in ASN.1 +(UTF-8, UCS-2, and UCS-4), any of which could be used for the fields in the +DN. This could be problematic, particularly in Asia and other areas where +non-ASCII characters are needed for most names. The UTF-8 and UCS-2 string +types \emph{are} accepted (in fact, UTF-8 is used when encoding much of the +time), but if any of the characters included in the string are not in ISO +8859-1 (\ie 0 \ldots 255), an exception will get thrown. Currently the +\type{ASN1\_String} type holds its data as ISO 8859-1 internally (regardless +of local character set); this would have to be changed to hold UCS-2 or UCS-4 +in order to support Unicode (also, many interfaces in the X.509 code would have +to accept or return a \type{std::wstring} instead of a \type{std::string}). + +Like the distinguished names, subject alternative names can contain a lot of +things that Botan will flat out ignore (most of which you would never actually +want to use). However, there are three very useful pieces of information that +this extension might hold: an email address (``person@site1.com''), a DNS name +(``somehost.site2.com''), or a URI (``http://www.site3.com''). + +So, how to get the information? Simply call \function{subject\_info} with the +name of the piece of information you want, and it will return a +\type{std::string} that is either empty (signifying that the certificate +doesn't have this information), or has the information requested. There are +several names for each possible item, but the most easily readable ones are: +``Name'', ``Country'', ``Organization'', ``Organizational Unit'', ``Locality'', +``State'', ``RFC822'', ``URI'', and ``DNS''. These values are returned as a +\type{std::string}. + +You can also get information about the issuer of the certificate in the same +way, using \function{issuer\_info}. + +\subsubsection{X.509v3 Extensions} + +X.509v3 specifies a large number of possible extensions. Botan supports some, +but by no means all of them. This section lists which ones are supported, and +notes areas where there may be problems with the handling. You have to be +pretty familiar with X.509 in order to understand what this is talking about. + +\begin{list}{$\cdot$} + \item Key Usage and Extended Key Usage: No problems known. + \item + + \item Basic Constraints: No problems known. The default for a v1/v2 + certificate is assume it's a CA if and only if the option + ``x509/default\_to\_ca'' is set. A v3 certificate is marked as a CA if + (and only if) the basic constraints extension is present and set for a + CA cert. + + \item Subject Alternative Names: Only the ``rfc822Name'', ``dNSName'', and + ``uniformResourceIdentifier'' fields will be stored; all others are + ignored. + + \item Issuer Alternative Names: Same restrictions as the Subject Alternative + Names extension. New certificates generated by Botan never include the + issuer alternative name. + + \item Authority Key Identifier: Only the version using KeyIdentifier is + supported. If the GeneralNames version is used and the extension is + critical, an exception is thrown. If both the KeyIdentifier and + GeneralNames versions are present, then the KeyIdentifier will be + used, and the GeneralNames ignored. + + \item Subject Key Identifier: No problems known. +\end{list} + +\subsubsection{Revocation Lists} + +It will occasionally happen that a certificate must be revoked before its +expiration date. Examples of this happening include the private key being +compromised, or the user to which it has been assigned leaving an +organization. Certificate revocation lists are an answer to this problem +(though online certificate validation techniques are starting to become +somewhat more popular). Essentially, every once in a while the CA will release +a CRL, listing all certificates that have been revoked. Also included is +various pieces of information like what time a particular certificate was +revoked, and for what reason. In most systems, it is wise to support some form +of certificate revocation, and CRLs handle this fairly easily. + +For most users, processing a CRL is quite easy. All you have to do is call the +constructor, which will take a filename (or a \type{DataSource\&}). The CRLs +can either be in raw BER/DER, or in PEM format; the constructor will figure out +which format without any extra information. For example: + +\begin{verbatim} + X509_CRL crl1("crl1.der"); + + DataSource_Stream in("crl2.pem"); + X509_CRL crl2(in); +\end{verbatim} + +After that, pass the \type{X509\_CRL} object to a \type{X509\_Store} object +with \type{X509\_Code} \function{add\_crl}(\type{X509\_CRL}), and all future +verifications will take into account the certificates listed, assuming +\function{add\_crl} returns \type{VERIFIED}. If it doesn't return +\type{VERIFIED}, then the return value is an error code signifying that the CRL +could not be processed due to some problem (which could range from the issuing +certificate not being found, to the CRL having some format problem). For more +about the \type{X509\_Store} API, read the section later in this chapter. + +\subsection{Reading Certificates} + +\type{X509\_Certificate} has two constructors, each of which takes a source of +data; a filename to read, and a \type{DataSource\&}. + +\subsection{Storing and Using Certificates} + +If you read a certificate, you probably want to verify the signature on +it. However, consider that to do so, we may have to verify the signature on the +certificate that we used to verify the first certificate, and on and on until +we hit the top of the certificate tree somewhere. It would be a might huge pain +to have to handle all of that manually in every application, so there is +something that does it for you: \type{X509\_Store}. + +This is a pretty easy thing to use. The basic operations are: put certificates +and CRLs into it, search for certificates, and attempt to verify +certificates. That's about it. In the future, there will be support for online +retrieval of certificates and CRLs (\eg with the HTTP cert-store interface +currently under consideration by PKIX). + +\subsubsection{Adding Certificates} + +You can add new certificates to a certificate store using any of these +functions: + +\function{add\_cert}(\type{const X509\_Certificate\&} \arg{cert}, + \type{bool} \arg{trusted} \type{= false}) + +\function{add\_certs}(\type{DataSource\&} \arg{source}) + +\function{add\_trusted\_certs}(\type{DataSource\&} \arg{source}) + +The versions that take a \type{DataSource\&} will add all the certificates +that it can find in that source. + +All of them add the cert(s) to the store. The 'trusted' certificates are the +ones that you have some reason to trust are genuine. For example, say your +application is working with certificates that are owned by employees of some +company, and all of their certificates are signed by the company CA, whose +certificate is in turned signed by a commercial root CA. What you would then do +is include the certificate of the commercial CA with your application, and read +it in as a trusted certificate. From there, you could verify the company CA's +certificate, and then use that to verify the end user's certificates. Only +self-signed certificates may be considered trusted. + +\subsubsection{Adding CRLs} + +\type{X509\_Code} \function{add\_crl}(\type{const X509\_CRL\&} \arg{crl}); + +This will process the CRL and mark the revoked certificates. This will also +work if a revoked certificate is added to the store sometime after the CRL is +processed. The function can return an error code (listed later), or will return +\type{VERIFIED} if everything completed successfully. + +\subsubsection{Storing Certificates} + +You can output a set of certificates by calling \function{PEM\_encode}, which +will return a \type{std::string} containing each of the certificates in the +store, PEM encoded and concatenated. This simple format can easily be read by +both Botan and other libraries/applications. + +\subsubsection{Searching for Certificates} + +You can find certificates in the store with a series of functions contained +in the \function{X509\_Store\_Search} namespace: + +\begin{verbatim} +namespace X509_Store_Search { +std::vector by_email(const X509_Store& store, + const std::string& email_addr); +std::vector by_name(const X509_Store& store, + const std::string& name); +std::vector by_dns(const X509_Store&, + const std::string& dns_name); +} +\end{verbatim} + +These functions will return a (possibly empty) vector of certificates from +\arg{store} matching your search criteria. The email address and DNS name +searches are case-insensitive but are sensitive to extra whitespace and so +on. The name search will do case-insensitive substring matching, so, for +example, calling \function{X509\_Store\_Search::by\_name}(\arg{your\_store}, +``dob'') will return certificates for ``J.R. 'Bob' Dobbs'' and +``H. Dobbertin'', assuming both of those certificates are in \arg{your\_store}. + +You could then display the results to a user, and allow them to select the +appropriate one. Searching using an email address as the key is usually more +effective than the name, since email addresses are rarely shared. + +\subsubsection{Certificate Stores} + +An object of type \type{Certificate\_Store} is a generalized interface to an +external source for certificates (and CRLs). Examples of such a store would be +one that looked up the certificates in a SQL database, or by contacting a CGI +script running on a HTTP server. There are currently three mechanisms for +looking up a certificate, and one for retrieving CRLs. By default, most of +these mechanisms will simply return an empty \type{std::vector} of +\type{X509\_Certificate}. This storage mechanism is \emph{only} queried when +doing certificate validation: it allows you to distribute only the root key +with an application, and let some online method handle getting all the other +certificates that are needed to validate an end entity certificate. In +particular, the search routines will not attempt to access the external +database. + +The three certificate lookup methods are \function{by\_SKID} (Subject Key +Identifier), \function{by\_name} (the CommonName DN entry), and +\function{by\_email} (stored in either the distinguished name, or in a +subjectAlternativeName extension). The name and email versions take a +\type{std::string}, while the SKID version takes a \type{SecureVector} +containing the subject key identifier in raw binary. You can choose not to +implement \function{by\_name} or \function{by\_email}, but \function{by\_SKID} +is mandatory to implement, and, currently, is the only version that is used by +\type{X509\_Store}. + +Finally, there is a method for finding CRLs, called \function{get\_crls\_for}, +that takes an \type{X509\_Certificate} object, and returns a +\type{std::vector} of \type{X509\_CRL}. While generally there will be only one +CRL, the use of the vector makes it easy to return no CRLs (\eg, if the +certificate store doesn't support retrieving them), or return multiple ones +(for example, if the certificate store can't determine precisely which key was +used to sign the certificate). Implementing the function is optional, and by +default will return no CRLs. If it is available, it will be used by +\type{X509\_CRL}. + +As for actually using such a store, you have to tell \type{X509\_Store} about +it, by calling the \type{X509\_Store} member function + +\function{add\_new\_certstore}(\type{Certificate\_Store}* \arg{new\_store}) + +The argument, \arg{new\_store}, will be deleted by \type{X509\_Store}'s +destructor, so make sure to allocate it with \function{new}. + +\subsubsection{Verifying Certificates} + +There is a single function in \type{X509\_Store} related to verifying a +certificate: + +\type{X509\_Code} +\function{validate\_cert}(\type{const X509\_Certificate\&} \arg{cert}, + \type{Cert\_Usage} \arg{usage} = \type{ANY}) + +To sum things up simply, it returns \type{VERIFIED} if the certificate can +safely be considered valid for the usage(s) described by \arg{usage}, and an +error code if it is not. Naturally, things are a bit more complicated than +that. The enum \type{Cert\_Usage} is defined inside the \type{X509\_Store} +class, it (currently) can take on any of the values \type{ANY} (any usage is +OK), \type{TLS\_SERVER} (for SSL/TLS server authentication), \type{TLS\_CLIENT} +(for SSL/TLS client authentication), \type{CODE\_SIGNING}, +\type{EMAIL\_PROTECTION} (email encryption, usually this means S/MIME), +\type{TIME\_STAMPING} (in theory any time stamp application, usually IETF +PKIX's Time Stamp Protocol), or \type{CRL\_SIGNING}. Note that Microsoft's code +signing system, certainly the most widely used, uses a completely different +(and basically undocumented) method for marking certificates for code signing. + +First, how does it know if a certificate is valid? Basically, a certificate is +valid if both of the following hold: a) the signature in the certificate can be +verified using the public key in the issuer's certificate, and b) the issuer's +certificate is a valid CA certificate. Note that this definition is +recursive. We get out of this by ``bottoming out'' when we reach a certificate +that we consider trusted. In general this will either be a commercial root CA, +or an organization or application specific CA. + +There are actually a few other restrictions (validity periods, key usage +restrictions, etc), but the above summarizes the major points of the validation +algorithm. In theory, Botan implements the certificate path validation +algorithm given in RFC 2459, but in practice it does not (yet), because we +don't support the X.509v3 policy or name constraint extensions. + +Possible values for \arg{usage} are \type{TLS\_SERVER}, \type{TLS\_CLIENT}, +\type{CODE\_SIGNING}, \type{EMAIL\_PROTECTION}, \type{CRL\_SIGNING}, and +\type{TIME\_STAMPING}, and \type{ANY}. The default \type{ANY} does not mean +valid for any use, it means ``is valid for some usage''. This is generally +fine, and in fact requiring that a random certificate support a particular +usage will likely result in a lot of failures, unless your application is very +careful to always issue certificates with the proper extensions, and you never +use certificates generated by other apps. + +Return values for \function{validate\_cert} (and \function{add\_crl}) include: + +\begin{list}{$\cdot$} + \item VERIFIED: The certificate is valid for the specified use. + \item + \item INVALID\_USAGE: The certificate cannot be used for the specified use. + + \item CANNOT\_ESTABLISH\_TRUST: The root certificate was not marked as + trusted. + \item CERT\_CHAIN\_TOO\_LONG: The certificate chain exceeded the length + allowed by a basicConstraints extension. + \item SIGNATURE\_ERROR: An invalid signature was found + \item POLICY\_ERROR: Some problem with the certificate policies was found. + + \item CERT\_FORMAT\_ERROR: Some format problem was found in a certificate. + \item CERT\_ISSUER\_NOT\_FOUND: The issuer of a certificate could not be + found. + \item CERT\_NOT\_YET\_VALID: The certificate is not yet valid. + \item CERT\_HAS\_EXPIRED: The certificate has expired. + \item CERT\_IS\_REVOKED: The certificate has been revoked. + + \item CRL\_FORMAT\_ERROR: Some format problem was found in a CRL. + \item CRL\_ISSUER\_NOT\_FOUND: The issuer of a CRL could not be found. + \item CRL\_NOT\_YET\_VALID: The CRL is not yet valid. + \item CRL\_HAS\_EXPIRED: The CRL has expired. + + \item CA\_CERT\_CANNOT\_SIGN: The CA certificate found does not have an + contain a public key that allows signature verification. + \item CA\_CERT\_NOT\_FOR\_CERT\_ISSUER: The CA cert found is not allowed to + issue certificates. + \item CA\_CERT\_NOT\_FOR\_CRL\_ISSUER: The CA cert found is not allowed to + issue CRLs. + + \item UNKNOWN\_X509\_ERROR: Some other error occurred. + +\end{list} + +\subsection{Certificate Authorities} + +Setting up a CA for X.509 certificates is actually probably the easiest thing +to do related to X.509. A CA is represented by the type \type{X509\_CA}, which +can be found in \filename{x509\_ca.h}. A CA always needs its own certificate, +which can either be a self-signed certificate (see below on how to create one) +or one issued by another CA (see the section on PKCS \#10 requests). Creating +a CA object is done by the following constructor: + +\begin{verbatim} + X509_CA(const X509_Certificate& cert, const PKCS8_PrivateKey& key); +\end{verbatim} + +The private key is the private key corresponding to the public key in the +CA's certificate. + +Generally, requests for new certificates are supplied to a CA in the form on +PKCS \#10 certificate requests (called a \type{PKCS10\_Request} object in +Botan). These are decoded in a similar manner to +certificates/CRLs/etc. Generally, a request is vetted by humans (who somehow +verify that the name in the request corresponds to the name of the person who +requested it), and then signed by a CA key, generating a new certificate. + +\begin{verbatim} + X509_Certificate sign_request(const PKCS10_Request&) const; +\end{verbatim} + +\subsubsection{Generating CRLs} + +As mentioned previously, the ability to process CRLs is highly important in +many PKI systems. In fact, according to strict X.509 rules, you must not +validate any certificate if the appropriate CRLs are not available (though +hardly any systems are that strict). In any case, a CA should have a valid CRL +available at all times. + +Of course, you might be wondering what to do if no certificates have been +revoked. In fact, CRLs can be issued without any actually revoked certificates +- the list of certs will simply be empty. To generate a new, empty CRL, just +call \type{X509\_CRL} +\function{X509\_CA::new\_crl}(\type{u32bit}~\arg{seconds}~=~0)~--~it will +create a new, empty, CRL. If \arg{seconds} is the default 0, then the normal +default CRL next update time (the value of the ``x509/crl/next\_update'') will +be used. If not, then \arg{seconds} specifies how long (in seconds) it will be +until the CRL's next update time (after this time, most clients will reject the +CRL as too old). + +On the other hand, you may have issued a CRL before. In that case, you will +want to issue a new CRL that contains all previously revoked +certificates, along with any new ones. This is done by calling the +\type{X509\_CA} member function +\function{update\_crl}(\type{X509\_CRL}~\arg{old\_crl}, +\type{std::vector}~\arg{new\_revoked}, +\type{u32bit}~\arg{seconds}~=~0), where \type{X509\_CRL} is the last CRL this +CA issued, and \arg{new\_revoked} is a list of any newly revoked certificates. +The function returns a new \type{X509\_CRL} to make available for clients. The +semantics for the \arg{seconds} argument is the same as \function{new\_crl}. + +The \type{CRL\_Entry} type is a structure that contains, at a minimum, the +serial number of the revoked certificate. As serial numbers are never repeated, +the pairing of an issuer and a serial number (should) distinctly identify any +certificate. In this case, we represent the serial number as a +\type{SecureVector} called \arg{serial}. There are two additional +(optional) values, an enumeration called \type{CRL\_Code} that specifies the +reason for revocation (\arg{reason}), and an object that represents the time +that the certificate became invalid (if this information is known). + +If you wish to remove an old entry from the CRL, insert a new entry for the +same cert, with a \arg{reason} code of \type{DELETE\_CRL\_ENTRY}. For example, +if a revoked certificate has expired 'normally', there is no reason to continue +to explicitly revoke it, since clients will reject the cert as expired in any +case. + +\subsubsection{Self-Signed Certificates} + +Generating a new self-signed certificate can often be useful, for example when +setting up a new root CA, or for use in email applications. In this case, +the solution is summed up simply as: + +\begin{verbatim} +namespace X509 { + X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, + const PKCS8_PrivateKey& key); +} +\end{verbatim} + +Where \arg{key} is obviously the private key you wish to use (the public key, +used in the certificate itself, is extracted from the private key), and +\arg{opts} is an structure that has various bits of information that will be +used in creating the certificate (this structure, and its use, is discussed +below). This function is found in the header \filename{x509self.h}. There is an +example of using this function in the \filename{self\_sig} example. + +\subsubsection{Creating PKCS \#10 Requests} + +Also in \filename{x509self.h}, there is a function for generating new PKCS \#10 +certificate requests. + +\begin{verbatim} +namespace X509 { + PKCS10_Request create_cert_req(const X509_Cert_Options&, + const PKCS8_PrivateKey&); +} +\end{verbatim} + +This function acts quite similarly to \function{create\_self\_signed\_cert}, +except it instead returns a PKCS \#10 certificate request. After creating it, +one would typically transmit it to a CA, who signs it and returns a freshly +minted X.509 certificate. There is an example of using this function in the +\filename{pkcs10} example. + +\subsubsection{Certificate Options} + +So what is this \type{X509\_Cert\_Options} thing we've been passing around? +Basically, it's a bunch of information that will end up being stored into the +certificate. This information comes in 3 major flavors: information about the +subject (CA or end-user), the validity period of the certificate, and +restrictions on the usage of the certificate. + +First and foremost is a number of \type{std::string} members, which contains +various bits of information about the user: \arg{common\_name}, +\arg{serial\_number}, \arg{country}, \arg{organization}, \arg{org\_unit}, +\arg{locality}, \arg{state}, \arg{email}, \arg{dns\_name}, and \arg{uri}. As +many of these as possible should be filled it (especially an email address), +though the only required ones are \arg{common\_name} and \arg{country}. + +There is another value that is only useful when creating a PKCS \#10 request, +which is called \arg{challenge}. This is a challenge password, which you can +later use to request certificate revocation (\emph{if} the CA supports doing +revocations in this manner). + +Then there is the validity period; these are set with \function{not\_before} +and \function{not\_after}. Both of these functions also take a +\type{std::string}, which specifies when the certificate should start being +valid, and when it should stop being valid. If you don't set the starting +validity period, it will automatically choose the current time. If you don't +set the ending time, it will choose the starting time plus a default time +period. The arguments to these functions specify the time in the following +format: ``2002/11/27 1:50:14''. The time is in 24-hour format, and the date is +encoded as year/month/day. The date must be specified, but you can omit the +time or trailing parts of it, for example ``2002/11/27 1:50'' or +``2002/11/27''. + +Lastly, you can set constraints on a key. The one you're mostly likely to want +to use is to create (or request) a CA certificate, which can be done by calling +the member function \function{CA\_key}. This should only be used when needed. + +Other constraints can be set by calling the member functions +\function{add\_constraints} and \function{add\_ex\_constraints}. The first +takes a \type{Key\_Constraints} value, and replaces any previously set +value. If no value is set, then the certificate key is marked as being valid +for any usage. You can set it to any of the following (for more than one +usage, OR them together): \type{DIGITAL\_SIGNATURE}, \type{NON\_REPUDIATION}, +\type{KEY\_ENCIPHERMENT}, \type{DATA\_ENCIPHERMENT}, \type{KEY\_AGREEMENT}, +\type{KEY\_CERT\_SIGN}, \type{CRL\_SIGN}, \type{ENCIPHER\_ONLY}, +\type{DECIPHER\_ONLY}. Many of these have quite special semantics, so you +should either consult the appropriate standards document (such as RFC 3280), or +simply not call \function{add\_constraints}, in which case the appropriate +values will be chosen for you. + +The second function, \function{add\_ex\_constraints}, allows you to specify an +OID that has some meaning with regards to restricting the key to particular +usages. You can, if you wish, specify any OID you like, but there is a set of +standard ones that other applications will be able to understand. These are +the ones specified by the PKIX standard, and are named ``PKIX.ServerAuth'' (for +TLS server authentication), ``PKIX.ClientAuth'' (for TLS client +authentication), ``PKIX.CodeSigning'', ``PKIX.EmailProtection'' (most likely +for use with S/MIME), ``PKIX.IPsecUser'', ``PKIX.IPsecTunnel'', +``PKIX.IPsecEndSystem'', and ``PKIX.TimeStamping''. You can call +\function{add\_ex\_constraints} any number of times~--~each new OID will be +added to the list to include in the certificate. + +\pagebreak +\section{The Low-Level Interface} + +Botan has two different interfaces. The one documented in this section is meant +more for implementing higher-level types (see the section on filters, earlier in +this manual) than for use by applications. Using it safely requires a solid +knowledge of encryption techniques and best practices, so unless you know, for +example, what CBC mode and nonces are, and why PKCS \#1 padding is important, +you should avoid this interface in favor of something working at a higher level +(such as the CMS interface). + +\subsection{Basic Algorithm Abilities} + +There are a small handful of functions implemented by most of Botan's +algorithm objects. Among these are: + +\noindent +\type{std::string} \function{name}(): + +Returns a human-readable string of the name of this algorithm. Examples of +names returned are ``Blowfish'' and ``HMAC(MD5)''. You can turn names back into +algorithm objects using the functions in \filename{lookup.h}. + +\noindent +\type{void} \function{clear}(): + +Clear out the algorithm's internal state. A block cipher object will ``forget'' +its key, a hash function will ``forget'' any data put into it, etc. Basically, +the object will look exactly as it did when you initially allocated it. + +\noindent +\function{clone}(): + +This function is central to Botan's name-based interface. The \function{clone} +has many different return types, such as \type{BlockCipher*} and +\type{HashFunction*}, depending on what kind of object it is called on. Note +that unlike Java's clone, this returns a new object in a ``pristine'' state; +that is, operations done on the initial object before calling \function{clone} +do not affect the initial state of the new clone. + +Cloned objects can (and should) be deallocated with the C++ \texttt{delete} +operator. + +\subsection{Keys and IVs} + +Both symmetric keys and initialization values can simply be considered byte (or +octet) strings. These are represented by the classes \type{SymmetricKey} and +\type{InitializationVector}, which are subclasses of \type{OctetString}. + +Since often it's hard to distinguish between a key and IV, many things (such as +key derivation mechanisms) return \type{OctetString} instead of +\type{SymmetricKey} to allow its use as a key or an IV. + +\noindent +\function{OctetString}(\type{u32bit} \arg{length}): + +This constructor creates a new random key of size \arg{length}. + +\noindent +\function{OctetString}(\type{std::string} \arg{str}): + +The argument \arg{str} is assumed to be a hex string; it is converted to binary +and stored. Whitespace is ignored. + +\noindent +\function{OctetString}(\type{const byte} \arg{input}[], \type{u32bit} +\arg{length}): + +This constructor simply copies its input. + +\subsection{Symmetrically Keyed Algorithms} + +Block ciphers, stream ciphers, and MACs all handle keys in pretty much the same +way. To make this similarity explicit, all algorithms of those types are +derived from the \type{SymmetricAlgorithm} base class. This type has three +functions: + +\noindent +\type{void} \function{set\_key}(\type{const byte} \arg{key}[], \type{u32bit} +\arg{length}): + +Most algorithms only accept keys of certain lengths. If you attempt to call +\function{set\_key} with a key length that is not supported, the exception +\type{Invalid\_Key\_Length} will be thrown. There is also another version of +\function{set\_key} that takes a \type{SymmetricKey} as an argument. + +\noindent +\type{bool} \function{valid\_keylength}(\type{u32bit} \arg{length}) const: + +This function returns true if a key of the given length will be accepted by +the cipher. + +There are also three constant data members of every \type{SymmetricAlgorithm} +object, which specify exactly what limits there are on keys which that object +can accept: + +MAXIMUM\_KEYLENGTH: The maximum length of a key. Usually, this is at most 32 +(256 bits), even if the algorithm actually supports more. In a few rare cases +larger keys will be supported. + +MINIMUM\_KEYLENGTH: The minimum length of a key. This is at least 1. + +KEYLENGTH\_MULTIPLE: The length of the key must be a multiple of this value. + +In all cases, \function{set\_key} must be called on an object before any data +processing (encryption, decryption, etc) is done by that object. If this is not +done, the results are undefined -- that is to say, Botan reserves the right in +this situation to do anything from printing a nasty, insulting message on the +screen to dumping core. + +\subsection{Block Ciphers} + +Block ciphers implement the interface \type{BlockCipher}, found in +\filename{base.h}, as well as the \type{SymmetricAlgorithm} interface. + +\noindent +\type{void} \function{encrypt}(\type{const byte} \arg{in}[BLOCK\_SIZE], + \type{byte} \arg{out}[BLOCK\_SIZE]) const + +\noindent +\type{void} \function{encrypt}(\type{byte} \arg{block}[BLOCK\_SIZE]) const + +These functions apply the block cipher transformation to \arg{in} and +place the result in \arg{out}, or encrypts \arg{block} in place +(\arg{in} may be the same as \arg{out}). BLOCK\_SIZE is a constant +member of each class, which specifies how much data a block cipher can +process at one time. Note that BLOCK\_SIZE is not a static class +member, meaning you can (given a \type{BlockCipher*} named +\arg{cipher}), call \verb|cipher->BLOCK_SIZE| to get the block size of +that particular object. \type{BlockCipher}s have similar functions +\function{decrypt}, which perform the inverse operation. + +\begin{verbatim} +AES_128 cipher; +SymmetricKey key(cipher.MAXIMUM_KEYLENGTH); // randomly created +cipher.set_key(key); + +byte in[16] = { /* secrets */ }; +byte out[16]; +cipher.encrypt(in, out); +\end{verbatim} + +\subsection{Stream Ciphers} + +Stream ciphers are somewhat different from block ciphers, in that encrypting +data results in changing the internal state of the cipher. Also, you may +encrypt any length of data in one go (in byte amounts). + +\noindent +\type{void} \function{encrypt}(\type{const byte} \arg{in}[], \type{byte} +\arg{out}[], \type{u32bit} \arg{length}) + +\noindent +\type{void} \function{encrypt}(\type{byte} \arg{data}[], \type{u32bit} +\arg{length}): + +These functions encrypt the arbitrary length (well, less than 4 gigabyte long) +string \arg{in} and place it into \arg{out}, or encrypts it in place in +\arg{data}. The \function{decrypt} functions look just like +\function{encrypt}. + +Stream ciphers implement the \type{SymmetricAlgorithm} interface. + +Some stream ciphers support random access to any point in their cipher +stream. For such ciphers, calling \type{void} \function{seek}(\type{u32bit} +\arg{byte}) will change the cipher's state so that it is as if the cipher had been +keyed as normal, then encrypted \arg{byte} -- 1 bytes of data (so the next byte +in the cipher stream is byte number \arg{byte}). + +\subsection{Hash Functions / Message Authentication Codes} + +Hash functions take their input without producing any output, only producing +anything when all input has already taken place. MACs are very similar, but are +additionally keyed. Both of these are derived from the base class +\type{BufferedComputation}, which has the following functions. + +\noindent +\type{void} \function{update}(\type{const byte} \arg{input}[], \type{u32bit} +\arg{length}) + +\noindent +\type{void} \function{update}(\type{byte} \arg{input}) + +\noindent +\type{void} \function{update}(\type{const std::string \&} \arg{input}) + +Updates the hash/mac calculation with \arg{input}. + +\noindent +\type{void} \function{final}(\type{byte} \arg{out}[OUTPUT\_LENGTH]) + +\noindent +\type{SecureVector} \function{final}(): + +Complete the hash/MAC calculation and place the result into \arg{out}. +OUTPUT\_LENGTH is a public constant in each object that gives the length of the +hash in bytes. After you call \function{final}, the hash function is reset to +its initial state, so it may be reused immediately. + +The second method of using final is to call it with no arguments at all, as +shown in the second prototype. It will return the hash/mac value in a memory +buffer, which will have size OUTPUT\_LENGTH. + +There is also a pair of functions called \function{process}. They are +essentially a combination of a single \function{update}, and \function{final}. +Both versions return the final value, rather than placing it an array. Calling +\function{process} with a single byte value isn't available, mostly because it +would rarely be useful. + +A MAC can be viewed (in most cases) as simply a keyed hash function, so classes +that are derived from \type{MessageAuthenticationCode} have \function{update} +and \function{final} classes just like a \type{HashFunction} (and like a +\type{HashFunction}, after \function{final} is called, it can be used to make a +new MAC right away; the key is kept around). + +A MAC has the \type{SymmetricAlgorithm} interface in addition to the +\type{BufferedComputation} interface. + +\pagebreak +\section{Random Number Generators} + +The random number generators provided in Botan are meant for creating keys, +IVs, padding, nonces, and anything else that requires 'random' data. It is +important to remember that the output of these classes will vary, even if they +are supplied with exactly the same seed (\ie, two \type{Randpool} objects with +similar initial states will not produce the same output, because the value of +high resolution timers is added to the state at various points). + +To ensure good quality output, a PRNG needs to be seeded with truly random data +(such as that produced by a hardware RNG). Typically, you will use an +\type{EntropySource} (see below). To add entropy to a PRNG, you can use +\type{void} \function{add\_entropy}(\type{const byte} \arg{data}[], +\type{u32bit} \arg{length}) or (better), use the \type{EntropySource} +interface. + +Once a PRNG has been initialized, you can get a single byte of random data by +calling \type{byte} \function{random()}, or get a large block by calling +\type{void} \function{randomize}(\type{byte} \arg{data}[], \type{u32bit} +\arg{length}), which will put random bytes into each member of the array from +indexes 0 $\ldots$ \arg{length} -- 1. + +You can avoid all the problems inherent in seeding the PRNG by using the +globally shared PRNG, described later in this section. + +\subsection{Randpool} + +\type{Randpool} is the primary PRNG within Botan. In recent versions all uses +of it have been wrapped by an implementation of the X9.31 PRNG (see below). If +for some reason you should have cause to create a PRNG instead of using the +``global'' one owned by the library, it would be wise to consider the same on +the grounds of general caution; while \type{Randpool} is designed with known +attacks and PRNG weaknesses in mind, it is not an standard/official PRNG. The +remainder of this section is a (fairly technical, though high-level) description +of the algorithms used in this PRNG. Unless you have a specific interest in +this subject, the rest of this section might prove somewhat uninteresting. + +\type{Randpool} has an internal state called pool, which is 512 bytes +long. This is where entropy is mixed into and extracted from. There is also a +small output buffer (called buffer), which holds the data which has already +been generated but has just not been output yet. + +It is based around a MAC and a block cipher (which are currently HMAC(SHA-256) +and AES-256). Where a specific size is mentioned, it should be taken as a +multiple of the cipher's block size. For example, if a 256-bit block cipher +were used instead of AES, all the sizes internally would double. Every time +some new output is needed, we compute the MAC of a counter and a high +resolution timer. The resulting MAC is XORed into the output buffer (wrapping +as needed), and the output buffer is then encrypted with AES, producing 16 +bytes of output. + +After 8 blocks (or 128 bytes) have been produced, we mix the pool. To do this, +we first rekey both the MAC and the cipher; the new MAC key is the MAC of the +current pool under the old MAC key, while the new cipher key is the MAC of the +current pool under the just-chosen MAC key. We then encrypt the entire pool in +CBC mode, using the current (unused) output buffer as the IV. We then generate +a new output buffer, using the mechanism described in the previous paragraph. + +To add randomness to the PRNG, we compute the MAC of the input and XOR the +output into the start of the pool. Then we remix the pool and produce a new +output buffer. The initial MAC operation should make it very hard for chosen +inputs to harm the security of \type{Randpool}, and as HMAC should be able to +hold roughly 256 bits of state, it is unlikely that we are wasting much input +entropy (or, if we are, it doesn't matter, because we have a very abundant +supply). + +\subsection{ANSI X9.31} + +\type{ANSI\_X931\_PRNG} is the standard issue X9.31 Appendix A.2.4 PRNG, though +using AES-256 instead of 3DES as the block cipher. This PRNG implementation has +been checked against official X9.31 test vectors. + +Internally, the PRNG holds a pointer to another PRNG (typically +Randpool). This internal PRNG generates the key and seed used by the +X9.31 algorithm, as well as the date/time vectors. Each time an X9.31 +PRNG object receives entropy, it simply passes it along to the PRNG it +is holding, and then pulls out some random bits to generate a new key +and seed. This PRNG considers itself seeded as soon as the internal +PRNG is seeded. + +As of version 1.4.7, the X9.31 PRNG is by default used for all random number +generation. + +\subsection{Entropy Sources} + +An \type{EntropySource} is an abstract representation of some method of gather +``real'' entropy. This tends to be very system dependent. The \emph{only} way +you should use an \type{EntropySource} is to pass it to a PRNG that will +extract entropy from it -- never use the output directly for any kind of key or +nonce generation! + +\type{EntropySource} has a pair of functions for getting entropy from some +external source, called \function{fast\_poll} and \function{slow\_poll}. These +pass a buffer of bytes to be written; the functions then return how many bytes +of entropy were actually gathered. \type{EntropySource}s are usually used to +seed the global PRNG using the functions found in the \namespace{Global\_RNG} +namespace. + +Note for writers of \type{EntropySource}s: it isn't necessary to use any kind +of cryptographic hash on your output. The data produced by an EntropySource is +only used by an application after it has been hashed by the +\type{RandomNumberGenerator} that asked for the entropy, thus any hashing +you do will be wasteful of both CPU cycles and possibly entropy. + +\pagebreak +\section{User Interfaces} + +Botan has recently changed some infrastructure to better accommodate more +complex user interfaces, in particular ones that are based on event +loops. Primary among these was the fact that when doing something like loading +a PKCS \#8 encoded private key, a passphrase might be needed, but then again it +might not (a PKCS \#8 key doesn't have to be encrypted). Asking for a +passphrase to decrypt an unencrypted key is rather pointless. Not only that, +but the way to handle the user typing the wrong passphrase was complicated, +undocumented, and inefficient. + +So now Botan has an object called \type{UI}, which provides a simple interface +for the aspects of user interaction the library has to be concerned +with. Currently, this means getting a passphrase from the user, and that's it +(\type{UI} will probably be extended in the future to support other operations +as they are needed). The base \type{UI} class is very stupid, because the +library can't directly assume anything about the environment that it's running +under (for example, if there will be someone sitting at the terminal, if the +application is even \emph{attached} to a terminal, and so on). But since you +can subclass \type{UI} to use whatever method happens to be appropriate for +your application, this isn't a big deal. + +There is (currently) a single function that can be overridden by subclasses of +\type{UI} (the \type{std::string} arguments are actually \type{const +std::string\&}, but shown as simply \type{std::string} to keep the line from +wrapping): + +\noindent +\type{std::string} \function{get\_passphrase}(\type{std::string} \arg{what}, + \type{std::string} \arg{source}, + \type{UI\_Result\&} \arg{result}) const; + +The \arg{what} argument specifies what the passphrase is needed for (for +example, PKCS \#8 key loading passes \arg{what} as ``PKCS \#8 private +key''). This lets you provide the user with some indication of \emph{why} your +application is asking for a passphrase; feel free to pass the string through +\function{gettext(3)} or moral equivalent for i18n purposes. Similarly, +\arg{source} specifies where the data in question came from, if available (for +example, a file name). If the source is not available for whatever reason, then +\arg{source} will be an empty string; be sure to account for this possibility +when writing a \type{UI} subclass. + +The function returns the passphrase as the return value, and a status code in +\arg{result} (either \type{OK} or \type{CANCEL\_ACTION}). If +\type{CANCEL\_ACTION} is returned in \arg{result}, then the return value will +be ignored, and the caller will take whatever action is necessary (typically, +throwing an exception stating that the passphrase couldn't be determined). In +the specific case of PKCS \#8 key decryption, a \type{Decoding\_Error} +exception will be thrown; your UI should assume this can happen, and provide +appropriate error handling (such as putting up a dialog box informing the user +of the situation, and canceling the operation in progress). + +There is an example \type{UI} that uses GTK+ available on the web site. The +\type{GTK\_UI} code is cleanly separated from the rest of the example, so if +you happen to be using GTK+, you can copy (and/or adapt) that code for your +application. If you write a \type{UI} object for another windowing system +(Win32, Qt, wxWidgets, FOX, etc), and would like to make it available to users +in general (ideally under a permissive license such as public domain or +MIT/BSD), feel free to send in a copy. + +\pagebreak +\section{Botan's Modules} + +Botan comes with a variety of modules that can be compiled into the system. +These will not be available on all installations of the library, but you can +check for their availability based on whether or not certain macros are +defined. + +\subsection{Pipe I/O for Unix File Descriptors} + +This is a fairly minor feature, but it comes in handy sometimes. In all +installations of the library, Botan's \type{Pipe} object overloads the +\keyword{<<} and \keyword{>>} operators for C++ iostream objects, which is +usually more than sufficient for doing I/O. + +However, there are cases where the iostream hierarchy does not map well to +local 'file types', so there is also the ability to do I/O directly with Unix +file descriptors. This is most useful when you want to read from or write to +something like a TCP or Unix-domain socket, or a pipe, since for simple file +access it's usually easier to just use C++'s file streams. + +If \macro{BOTAN\_EXT\_PIPE\_UNIXFD\_IO} is defined, then you can use the +overloaded I/O operators with Unix file descriptors. For an example of this, +check out the \filename{hash\_fd} example, included in the Botan distribution. + +\subsection{Entropy Sources} + +All of these are used by the \function{Global\_RNG::seed} function if they are +available. Since this function is called by the \type{LibraryInitializer} class +when it is created, it is fairly rare that you will need to deal with any of +these classes directly. Even in the case of a long-running server that needs to +renew its entropy poll, it is easier to simply call +\function{Global\_RNG::seed} (see the section entitled ``The Global PRNG'' for +more details). + +\noindent +\type{EGD\_EntropySource}: Query an EGD socket. If the macro +\macro{BOTAN\_EXT\_ENTROPY\_SRC\_EGD} is defined, it can be found in +\filename{es\_egd.h}. The constructor takes a \type{std::vector} +that specifies the paths to look for an EGD socket. + +\noindent +\type{Unix\_EntropySource}: This entropy source executes programs common on +Unix systems (such as \filename{uptime}, \filename{vmstat}, and \filename{df}) +and adds it to a buffer. It's quite slow due to process overhead, and (roughly) +1 bit of real entropy is in each byte that is output. It is declared in +\filename{es\_unix.h}, if \macro{BOTAN\_EXT\_ENTROPY\_SRC\_UNIX} is +defined. If you don't have \filename{/dev/urandom} \emph{or} EGD, this is +probably the thing to use. For a long-running process on Unix, keep on object +of this type around and run fast polls ever few minutes. + +\noindent +\type{FTW\_EntropySource}: Walk through a filesystem (the root to start +searching is passed as a string to the constructor), reading files. This tends +to only be useful on things like \filename{/proc} that have a great deal of +variability over time, and even then there is only a small amount of entropy +gathered: about 1 bit of entropy for every 16 bits of output (and many hundreds +of bits are read in order to get that 16 bits). It is declared in +\filename{es\_ftw.h}, if \macro{BOTAN\_EXT\_ENTROPY\_SRC\_FTW} is defined. Only +use this as a last resort. I don't really trust it, and neither should you. + +\noindent +\type{Win32\_CAPI\_EntropySource}: This routines gathers entropy from a Win32 +CAPI module. It takes an optional \type{std::string} that will specify what +type of CAPI provider to use. Generally the CAPI RNG is always the same +software-based PRNG, but there are a few that may use a hardware RNG. By +default it will use the first provider listed in the option +``rng/ms\_capi\_prov\_type'' that is available on the machine (currently the +providers ``RSA\_FULL'', ``INTEL\_SEC'', ``FORTEZZA'', and ``RNG'' are +recognized). + +\noindent +\type{BeOS\_EntropySource}: Query system statistics using various BeOS-specific +APIs. + +\noindent +\type{Pthread\_EntropySource}: Attempt to gather entropy based on jitter +between a number of threads competing for a single mutex. This entropy source +is \emph{very} slow, and highly questionable in terms of security. However, it +provides a worst-case fallback on systems that don't have Unix-like features, +but do support POSIX threads. This module is currently unavailable due to +problems on some systems. + +\subsection{Compressors} + +There are two compression algorithms supported by Botan, Zlib and Bzip2 (Gzip +and Zip encoding will be supported in future releases). Only lossless +compression algorithms are currently supported by Botan, because they tend to +be the most useful for cryptography. However, it is very reasonable to consider +supporting something like GSM speech encoding (which is lossy), for use in +encrypted voice applications. + +You should always compress \emph{before} you encrypt, because encryption seeks +to hide the redundancy that compression is supposed to try to find and remove. + +\subsubsection{Bzip2} + +To test for Bzip2, check to see if \macro{BOTAN\_EXT\_COMPRESSOR\_BZIP2} is +defined. If so, you can include \filename{bzip2.h}, which will declare a pair +of \type{Filter} objects: \type{Bzip2\_Compression} and +\type{Bzip2\_Decompression}. + +You should be prepared to take an exception when using the decompressing +filter, for if the input is not valid Bzip2 data, that is what you will +receive. You can specify the desired level of compression to +\type{Bzip2\_Compression}'s constructor as an integer between 1 and 9, 1 +meaning worst compression, and 9 meaning the best. The default is to use 9, +since small values take the same amount of time, just use a little less memory. + +The Bzip2 module was contributed by Peter J. Jones. + +\subsubsection{Zlib} + +Zlib compression works pretty much like Bzip2 compression. The only differences +in this case are that the macro is \macro{BOTAN\_EXT\_COMPRESSOR\_ZLIB}, the +header you need to include is called \filename{botan/zlib.h} (remember that you +shouldn't just \verb|#include |, or you'll get the regular zlib API, +which is not what you want). The Botan classes for Zlib +compression/decompression are called \type{Zlib\_Compression} and +\type{Zlib\_Decompression}. + +Like Bzip2, a \type{Zlib\_Decompression} object will throw an exception if +invalid (in the sense of not being in the Zlib format) data is passed into it. + +In the case of zlib's algorithm, a worse compression level will be faster than +a very high compression ratio. For this reason, the Zlib compressor will +default to using a compression level of 6. This tends to give a good trade off +in terms of time spent to compression achieved. There are several factors you +need to consider in order to decide if you should use a higher compression +level: + +\begin{list}{$\cdot$} + \item Better security: the less redundancy in the source text, the harder it + is to attack your ciphertext. This is not too much of a concern, + because with decent algorithms using sufficiently long keys, it doesn't + really matter \emph{that} much (but it certainly can't hurt). + \item + + \item Decreasing returns. Some simple experiments by the author showed + minimal decreases in the size between level 6 and level 9 compression + with large (1 to 3 megabyte) files. There was some difference, but it + wasn't that much. + + \item CPU time. Level 9 zlib compression is often two to four times as slow + as level 6 compression. This can make a substantial difference in the + overall runtime of a program. +\end{list} + +While the zlib compression library uses the same compression algorithm as the +gzip and zip programs, the format is different. The zlib format is defined in +RFC 1950. + +\subsubsection{Data Sources} + +A \type{DataSource} is a simple abstraction for a thing that stores bytes. This +type is used fairly heavily in the areas of the API related to ASN.1 +encoding/decoding. The following types are \type{DataSource}s: \type{Pipe}, +\type{SecureQueue}, and a couple of special purpose ones: +\type{DataSource\_Memory} and \type{DataSource\_Stream}. + +You can create a \type{DataSource\_Memory} with an array of bytes and a length +field. The object will make a copy of the data, so you don't have to worry +about keeping that memory allocated. This is mostly for internal use, but if it +comes in handy, feel free to use it. + +A \type{DataSource\_Stream} is probably more useful than the memory based +one. Its constructors take either a \type{std::istream} or a +\type{std::string}. If it's a stream, the data source will use the +\type{istream} to satisfy read requests (this is particularly useful to use +with \type{std::cin}). If the string version is used, it will attempt to open +up a file with that name and read from it. + +\subsubsection{Data Sinks} + +A \type{DataSink} (in \filename{data\_snk.h}) is a \type{Filter} that takes +arbitrary amounts of input, and produces no output. Generally, this means it's +doing something with the data outside the realm of what +\type{Filter}/\type{Pipe} can handle, for example, writing it to a file (which +is what the \type{DataSink\_Stream} does). There is no need for +\type{DataSink}s that write to a \type{std::string} or memory buffer, because +\type{Pipe} can handle that by itself. + +Here's a quick example of using a \type{DataSink}, which encrypts +\filename{in.txt} and sends the output to \filename{out.txt}. There is +no explicit output operation; the writing of \filename{out.txt} is +implicit. + +\begin{verbatim} + DataSource_Stream in("in.txt"); + Pipe pipe(new CBC_Encryption("Blowfish", "PKCS7", key, iv), + new DataSink_Stream("out.txt")); + pipe.process_msg(in); +\end{verbatim} + +A real advantage of this is that even if ``in.txt'' is large, only as +much memory is needed for internal I/O buffers will actually be used. + +\subsection{Writing Modules} + +It's a lot simpler to write modules for Botan that it is to write code +in the core library, for several reasons. First, a module can rely on +external libraries and services beyond the base ISO C++ libraries, and +also machine dependent features. Also, the code can be added at +configuration time on the user's end with very little effort (\ie the +code can be distributed separately, and included by the user without +needing to patch any existing source files). + +Each module lives in a subdirectory of the \filename{modules} +directory, which exists at the top-level of the Botan source tree. The +``short name'' of the module is the same as the name of this +directory. The only required file in this directory is +\filename{info.txt}, which contains directives that specify what a +particular module does, what systems it runs on, and so on. Comments +in \filename{info.txt} start with a \verb|#| character and continue +to end of line. + +Recognized directives include: + +\newcommand{\directive}[2]{ + \vskip 4pt + \noindent + \texttt{#1}: #2 +} + +\directive{realname }{Specify that the 'real world' name of this module + is \texttt{}.} + +\directive{note }{Add a note that will be seen by the end-user at +configure time if the module is included into the library.} + +\directive{require\_version }{Require at configure time that +the version of Botan in use be at least \texttt{}.} + +\directive{define [,[,...]]}{Cause the macro + \macro{BOTAN\_EXT\_} (for each instance of \macro{} + in the directive) to be defined in \filename{build.h}. This should + only be used if the module creates user-visible changes. There is a + set of conventions that should be followed in deciding what to call + this macro (where xxx denotes some descriptive and distinguishing + characteristic of the thing implemented, such as + \macro{ALLOC\_MLOCK} or \macro{MUTEX\_PTHREAD}): + +\begin{itemize} +\item Allocator: \macro{ALLOC\_xxx} +\item Compressors: \macro{COMPRESSOR\_xxx} +\item EntropySource: \macro{ENTROPY\_SRC\_xxx} +\item Engines: \macro{ENGINE\_xxx} +\item Mutex: \macro{MUTEX\_xxx} +\item Timer: \macro{TIMER\_xxx} +\end{itemize} +} + +\directive{ / }{This specifies any extra libraries to be +linked in. It is a mapping from OS to library name, for example +\texttt{linux -> rt}, which means that on Linux librt should be linked +in. You can also use ``all'' to force the library to be linked in on +all systems.} + +\directive{ / }{Tell the configuration script to add the + files named between these two tags into the source tree. All these + files must exist in the current module directory.} + +\directive{ / }{Tell the configuration script to + ignore the files named in the main source tree. This is useful, for + example, when replacing a C++ implementation with a pure assembly + version.} + +\directive{ / }{Tell the configuration script to + ignore the file given in the main source tree, and instead use the + one in the module's directory.} + +Additionally, the module file can contain blocks, delimited by the +following pairs: + +\texttt{ / }, \texttt{ / }, \texttt{ / } + +\noindent +For example, putting ``alpha'' and ``ia64'' in a \texttt{} block will +make the configuration script only allow the module to be compiled on those +architectures. Not having a block means any value is acceptable. + +\pagebreak +\section{Miscellaneous} + +This section has documentation for anything that just didn't fit into any of +the major categories. Many of them (Timers, Allocators) will rarely be used in +actual application code, but others, like the S2K algorithms, have a wide +degree of applicability. + +\subsection{S2K Algorithms} + +There are various procedures (usually fairly ad-hoc) for turning a passphrase +into a (mostly) arbitrary length key for a symmetric cipher. A general +interface for such algorithms is presented in \filename{s2k.h}. The main +function is \function{derive\_key}, which takes a passphrase, and the desired +length of the output key, and returns a key of that length, deterministically +produced from the passphrase. If an algorithm can't produce a key of that size, +it will throw an exception (most notably, PKCS \#5's PBKDF1 can only produce +strings between 1 and $n$ bytes, where $n$ is the output size of the underlying +hash function). + +Most such algorithms allow the use of a ``salt'', which provides some extra +randomness and helps against dictionary attacks on the passphrase. Simply call +\function{change\_salt} (there are variations of it for most of the ways you +might wish to specify a salt, check the header for details) with a block of +random data. You can also have the class generate a new salt for you with +\function{new\_random\_salt}; the salt that was generated can be retrieved with +\function{current\_salt}. + +Additionally some algorithms allow you to set some sort of iteration +count, which will make the algorithm take longer to compute the final +key (reducing the speed of brute-force attacks of various kinds). This +can be changed with the \function{set\_iterations} function. Most +standards recommend an iteration count of at least 1000. Currently +defined S2K algorithms are ``PBKDF1(digest)'', ``PBKDF2(digest)'', and +``OpenPGP-S2K(digest)''; you can retrieve any of these using the +\function{get\_s2k}, found in \filename{lookup.h}. As of this writing, +``PBKDF2(SHA-256)'' with 10000 iterations and an 8 byte salt is +recommend for new applications. + +\subsubsection{OpenPGP S2K} + +There are some oddities about OpenPGP's S2K algorithms that are documented +here. For one thing, it uses the iteration count in a strange manner; instead +of specifying how many times to iterate the hash, it tells how many +\emph{bytes} should be hashed in total (including the salt). So the exact +iteration count will depend on the size of the salt (which is fixed at 8 bytes +by the OpenPGP standard, though the implementation will allow any salt size) +and the size of the passphrase. + +To get what OpenPGP calls ``Simple S2K'', set iterations to 0 (the default for +OpenPGP S2K), and do not specify a salt. To get ``Salted S2K'', again leave the +iteration count at 0, but give an 8-byte salt. ``Salted and Iterated S2K'' +requires an 8-byte salt and some iteration count (this should be significantly +larger than the size of the longest passphrase that might reasonably be used; +somewhere from 1024 to 65536 would probably be about right). Using both a +reasonably sized salt and a large iteration count is highly recommended to +prevent password guessing attempts. + +\subsection{Checksums} + +Checksums are very similar to hash functions, and in fact share the same +interface. But there are some significant differences, the major ones being +that the output size is very small (usually in the range of 2 to 4 bytes), and +is not cryptographically secure. But for their intended purpose (error +checking), they perform very well. Some examples of checksums included in Botan +are the Adler32 and CRC32 checksums. + +\subsection{Exceptions} + +Sooner or later, something is going to go wrong. Botan's behavior when +something unusual occurs, like most C++ software, is to throw an exception. +Exceptions in Botan are derived from the \type{Exception} class. You can see +most of the major varieties of exceptions used in Botan by looking at +\filename{exceptn.h}. The only function you really need to concern yourself +with is \type{const char*} \function{what()}. This will return an error message +relevant to the error that occurred. For example: + +\begin{verbatim} +try { + // various Botan operations + } +catch(Botan::Exception& e) + { + cout << "Botan exception caught: " << e.what() << endl; + // error handling, or just abort + } +\end{verbatim} + +Botan's exceptions are derived from \type{std::exception}, so you don't need +to explicitly check for Botan exceptions if you're already catching the ISO +standard ones. + +\subsection{Threads and Mutexes} + +Botan includes a mutex system, which is used internally to lock some shared +data structures that must be kept shared for efficiency reasons (mostly, these +are in the allocation systems~--~handing out 1000 separate allocators hurts +performance and makes caching memory blocks useless). This system is supported +by the \texttt{mux\_pthr} module, implementing the \type{Mutex} interface for +systems that have POSIX threads. + +If your application is using threads, you \emph{must} add the option +``thread\_safe'' to the options string when you create the +\type{LibraryInitializer} object. If you specify this option and no mutex type +is available, an exception is thrown, since otherwise you would probably be +facing a nasty crash. + +\subsection{Secure Memory} + +A major concern with mixing modern multiuser OSes and cryptographic +code is that at any time the code (including secret keys) could be +swapped to disk, where it can later be read by an attacker. Botan +stores almost everything (and especially anything sensitive) in memory +buffers that a) clear out their contents when their destructors are +called, and b) have easy plugins for various memory locking functions, +such as the \function{mlock}(2) call on many Unix systems. + +Two of the allocation method used (``malloc'' and ``mmap'') don't +require any extra privileges on Unix, but locking memory does. At +startup, each allocator type will attempt to allocate a few blocks +(typically totaling 128k), so if you want, you can run your +application \texttt{setuid} \texttt{root}, and then drop privileges +immediately after creating your \type{LibraryInitializer}. If you end +up using more than what's been allocated, some of your sensitive data +might end up being swappable, but that beats running as \texttt{root} +all the time. BTW, I would note that, at least on Linux, you can use a +kernel module to give your process extra privileges (such as the +ability to call \function{mlock}) without being root. For example, +check out my Capability Override LSM +(\url{http://www.randombit.net/projects/cap\_over/}), which makes this +pretty easy to do. + +These classes should also be used within your own code for storing sensitive +data. They are only meant for primitive data types (int, long, etc): if you +want a container of higher level Botan objects, you can just use a +\verb|std::vector|, since these objects know how to clear themselves when they +are destroyed. You cannot, however, have a \verb|std::vector| (or any other +container) of \type{Pipe}s or \type{Filter}s, because these types have pointers +to other \type{Filter}s, and implementing copy constructors for these types +would be both hard and quite expensive (vectors of pointers to such objects is +fine, though). + +These types are not described in any great detail: for more information, +consult the definitive sources~--~the header files \filename{secmem.h} and +\filename{allocate.h}. + +\type{SecureBuffer} is a simple array type, whose size is specified at compile +time. It will automatically convert to a pointer of the appropriate type, and +has a number of useful functions, including \function{clear()}, and +\type{u32bit} \function{size()}, which returns the length of the array. It is a +template that takes as parameters a type, and a constant integer which is how +long the array is (for example: \verb|SecureBuffer key;|). + +\type{SecureVector} is a variable length array. Its size can be increased or +decreased as need be, and it has a wide variety of functions useful for copying +data into its buffer. Like \type{SecureBuffer}, it implements \function{clear} +and \function{size}. + +\subsection{Allocators} + +The containers described above get their memory from allocators. As a user of +the library, you can add new allocator methods at run time for containers, +including the ones used internally by the library, to use. The interface to +this is in \filename{allocate.h}. Basically how it works is that code needing +an allocator uses \function{get\_allocator}, which returns a pointer to an +allocator. This pointer should not be freed: the caller does not own the +allocator (it is shared among multiple users, and locks itself as needed). It +is possible to call \function{get\_allocator} with a specific name to request a +particular type of allocator, otherwise, a default allocator type is returned. + +At start time, the only allocator known is a \type{Default\_Allocator}, which +just allocates memory using \function{malloc}, and \function{memset}s it to 0 +when the memory is released. It is known by the name ``malloc''. If you ask for +another type of allocator (``locking'' and ``mmap'' are currently used), and it +is not available, some other allocator will be returned. + +You can add in a new allocator type using \function{add\_allocator\_type}. This +function takes a string and a pointer to an allocator. The string gives this +allocator type a name to which it can be referred when one is requesting it +with \function{get\_allocator}. If an error occurs (such as the name being +already registered), this function returns false. It will return true if the +allocator was successfully registered. If you ask it to, +\type{LibraryInitializer} will do this for you. + +Finally, you can set the default allocator type that will be returned using +the policy setting ``default\_alloc'' to the name of any previously registered +allocator. + +\subsection{BigInt} + +\type{BigInt} is Botan's implementation of a multiple-precision +integer. Thanks to C++'s operator overloading features, using \type{BigInt} is +often quite similar to using a native integer type. The number of functions +related to \type{BigInt} is quite large. You can find most of them in +\filename{bigint.h} and \filename{numthry.h}. + +Due to the sheer number of functions involved, only a few, which a regular user +of the library might have to deal with, are mentioned here. Fully documenting +the MPI library would take a significant while, so if you need to use it now, +the best way to learn is to look at the headers. + +Probably the most important are the encoding/decoding functions, which +transform the normal representation of a \type{BigInt} into some other form, +such as a decimal string. The most useful of these functions are + +\type{SecureVector} \function{BigInt::encode}(\type{BigInt}, +\type{Encoding}) + +\noindent +and + +\type{BigInt} \function{BigInt::decode}(\type{SecureVector}, +\type{Encoding}) + +\type{Encoding} is an enum that has values \type{Binary}, \type{Octal}, +\type{Decimal}, and \type{Hexadecimal}. The parameter will default to +\type{Binary}. These functions are static member functions, so they would be +called like this: + +\begin{verbatim} + BigInt n1; // some number + SecureVector n1_encoded = BigInt::encode(n1); + BigInt n2 = BigInt::decode(n1_encoded); + // now n1 == n2 +\end{verbatim} + +There are also C++-style I/O operators defined for use with \type{BigInt}. The +input operator understands negative numbers, hexadecimal numbers (marked with a +leading ``0x''), and octal numbers (marked with a leading '0'). The '-' must +come before the ``0x'' or '0' marker. The output operator will never adorn the +output; for example, when printing a hexadecimal number, there will not be a +leading ``0x'' (though a leading '-' will be printed if the number is +negative). If you want such things, you'll have to do them yourself. + +\type{BigInt} has constructors that can create a \type{BigInt} from an unsigned +integer or a string. You can also decode a \type{byte}[] / length pair into a +BigInt. There are several other \type{BigInt} constructors, which I would +seriously recommend you avoid, as they are only intended for use internally by +the library, and may arbitrarily change, or be removed, in a future release. + +An essentially random sampling of \type{BigInt} related functions: + +\type{u32bit} \function{BigInt::bytes}(): Return the size of this \type{BigInt} +in bytes. + +\type{BigInt} \function{random\_prime(\type{u32bit} \arg{b})}: Return a prime +number \arg{b} bits long. + +\type{BigInt} \function{gcd}(\type{BigInt} \arg{x}, \type{BigInt} \arg{y}): +Returns the greatest common divisor of \arg{x} and \arg{y}. Uses the binary +GCD algorithm. + +\type{bool} \function{is\_prime}(\type{BigInt} \arg{x}): Returns true if +\arg{x} is a (possible) prime number. Uses the Miller-Rabin probabilistic +primality test with fixed bases. For higher assurance, use +\function{verify\_prime}, which uses more rounds and randomized 48-bit bases. + +\subsubsection{Efficiency Hints} + +If you can, always use expressions of the form \verb|a += b| over +\verb|a = a + b|. The difference can be \emph{very} substantial, because the +first form prevents at least one needless memory allocation, and possibly as +many as three. + +If you're doing repeated modular exponentiations with the same modulus, create +a \type{BarrettReducer} ahead of time. If the exponent or base is a constant, +use the classes in \filename{mod\_exp.h}. This stuff is all handled for you by +the normal high-level interfaces, of course. + +Never use the low-level MPI functions (those that begin with +\texttt{bigint\_}). These are completely internal to the library, and +may make arbitrarily strange and undocumented assumptions about their +inputs, and don't check to see if they are actually true, on the +assumption that only the library itself calls them, and that the +library knows what the assumptions are. The interfaces for these +functions can change completely without notice. + +\pagebreak +\section{Algorithms} + +\subsection{Recommended Algorithms} + +This section is by no means the last word on selecting which algorithms to use. +However, Botan includes a sometimes bewildering array of possible algorithms, +and unless you're familiar with the latest developments in the field, it can be +hard to know what is secure and what is not. The following attributes of the +algorithms were evaluated when making this list: security, standardization, +patent status, support by other implementations, and efficiency (in roughly +that order). + +It is intended as a set of simple guidelines for developers, and nothing more. +It's entirely possible that there are algorithms in Botan that will turn out to +be more secure than the ones listed, but the algorithms listed here are +(currently) thought to be safe. + +\begin{list}{$\cdot$} + \item Block ciphers: AES or Serpent in CBC or CTR mode + + \item Hash functions: SHA-256, SHA-512 + + \item MACs: HMAC with any recommended hash function + + \item Public Key Encryption: RSA with ``EME1(SHA-256)'' + + \item Public Key Signatures: RSA with EMSA4 and any recommended hash, or DSA + with ``EMSA1(SHA-256)'' + + \item Key Agreement: Diffie-Hellman, with ``KDF2(SHA-256)'' +\end{list} + +\subsection{Compliance with Standards} + +Botan is/should be at least roughly compatible with many cryptographic +standards, including the following: + +\newcommand{\standard}[2]{ + \vskip 4pt + * #1: \textbf{#2} +} + +\standard{RSA}{PKCS \#1 v2.1, ANSI X9.31} + +\standard{DSA}{ANSI X9.30, FIPS 186-2} + +\standard{Diffie-Hellman}{ANSI X9.42, PKCS \#3} + +\standard{Certificates}{ITU X.509, RFC 3280/3281 (PKIX), PKCS \#9 v2.0, +PKCS \#10} + +\standard{Private Key Formats}{PKCS \#5 v2.0, PKCS \#8} + +\standard{DES/DES-EDE}{FIPS 46-3, ANSI X3.92, ANSI X3.106} + +\standard{SHA-1}{FIPS 180-2} + +\standard{HMAC}{ANSI X9.71, FIPS 198} + +\standard{ANSI X9.19 MAC}{ANSI X9.9, ANSI X9.19} + +\vskip 8pt +\noindent +There is also support for the very general standards of \textbf{IEEE 1363-2000} +and \textbf{1363a}. Most of the contents of such are included in the standards +mentioned above, in various forms (usually with extra restrictions that 1363 +does not impose). + +\subsection{Algorithms Listing} + +Botan includes a very sizable number of cryptographic algorithms. In +nearly all cases, you never need to know the header file or type name +to use them. However, you do need to know what string (or strings) are +used to identify that algorithm. Generally, these names conform to +those set out by SCAN (Standard Cryptographic Algorithm Naming), which +is a document that specifies how strings are mapped onto algorithm +objects, which is useful for a wide variety of crypto APIs (SCAN is +oriented towards Java, but Botan and several other non-Java libraries +also make at least some use of it). For full details, read the SCAN +document, which can be found at +\url{http://www.users.zetnet.co.uk/hopwood/crypto/scan/} + +Many of these algorithms can take options (such as the number of +rounds in a block cipher, the output size of a hash function, +etc). These are shown in the following list; all of them default to +reasonable values (unless otherwise marked). There are +algorithm-specific limits on most of them. When you see something like +``HASH'' or ``BLOCK'', that means you should insert the name of some +algorithm of that type. There are no defaults for those options. + +A few very obscure algorithms are skipped; if you need one of them, +you'll know it, and you can look in the appropriate header to see what +that classes' \function{name} function returns (the names tend to +match that in SCAN, if it's defined there). + +\begin{list}{$\cdot$} + \item ROUNDS: The number of rounds in a block cipher. + \item + \item OUTSZ: The output size of a hash function or MAC + \item PASS: The number of passes in a hash function (more passes generally + means more security). +\end{list} + +\vskip .05in +\noindent +\textbf{Block Ciphers:} ``AES'', ``Blowfish'', ``CAST-128'', +``CAST-256'', ``DES'', ``DESX'', ``TripleDES'', ``GOST'', ``IDEA'', +``MARS'', ``MISTY1(ROUNDS)'', ``RC2'', ``RC5(ROUNDS)'', ``RC6'', +``SAFER-SK(ROUNDS)'', ``SEED'', ``Serpent'', ``Skipjack'', ``Square'', +``TEA'', ``Twofish'', ``XTEA'' + +\noindent +\textbf{Stream Ciphers:} ``ARC4'', ``MARK4'', ``Turing'', ``WiderWake4+1-BE'' + +\noindent +\textbf{Hash Functions:} ``FORK-256'', ``HAS-160'', ``GOST-34.11'', +``MD2'', ``MD4'', ``MD5'', ``RIPEMD-128'', ``RIPEMD-160'', +``SHA-160'', ``SHA-256'', ``SHA-384'', ``SHA-512'', ``Skein-512'', +``Tiger(OUTSZ,PASS)'', ``Whirlpool'' + +\noindent +\textbf{MACs:} ``HMAC(HASH)'', ``CMAC(BLOCK)'', ``X9.19-MAC'' + +\subsection{Compatibility} + +Generally, cryptographic algorithms are well standardized, thus +compatibility between implementations is relatively simple (of course, not all +algorithms are supported by all implementations). But there are a few +algorithms that are poorly specified, and these should be avoided if you wish +your data to be processed in the same way by another implementation (including +future versions of Botan). + +The block cipher GOST has a particularly poor specification: there are no +standard Sboxes, and the specification does not give test vectors even for +sample boxes, which leads to issues of endian conventions, etc. + +If you wish maximum portability between different implementations of an +algorithm, it's best to stick to strongly defined and well standardized +algorithms, TripleDES, AES, HMAC, and SHA-256 all being good examples. + +\pagebreak +\section{Support and Further Information} + +\subsection{Patents} + +Some of the algorithms implemented by Botan may be covered by patents in some +locations. Algorithms known to have patent claims on them in the United States +and that are not available in a license-free/royalty-free manner include: +IDEA, MISTY1, RC5, RC6, and Nyberg-Rueppel. + +You must not assume that, just because an algorithm is not listed here, it is +not encumbered by patents. If you have any concerns about the patent status of +any algorithm you are considering using in an application, please discuss it +with your attorney. + +\subsection{Recommended Reading} + +It's a very good idea if you have some knowledge of cryptography prior +to trying to use this stuff. You really should read one or more of +these books before seriously using the library (note that the Handbook +of Applied Cryptography is available for free online): + +\setlength{\parskip}{5pt} + +\noindent +\textit{Handbook of Applied Cryptography}, Alfred J. Menezes, +Paul C. Van Oorschot, and Scott A. Vanstone; CRC Press + +\noindent +\textit{Security Engineering -- A Guide to Building Dependable Distributed +Systems}, Ross Anderson; Wiley + +\noindent +\textit{Cryptography: Theory and Practice}, Douglas R. Stinson; CRC Press + +\noindent +\textit{Applied Cryptography, 2nd Ed.}, Bruce Schneier; Wiley + +\noindent +Once you've got the basics down, these are good things to at least take a look +at: IEEE 1363 and 1363a, SCAN, NESSIE, PKCS \#1 v2.1, the security related FIPS +documents, and the CFRG RFCs. + +\subsection{Support} + +Questions or problems you have with Botan can be directed to the +development mailing list. Joining this list is highly recommended if +you're going to be using Botan, since often advance notice of upcoming +changes is sent there. ``Philosophical'' bug reports, announcements of +programs using Botan, and basically anything else having to do with +Botan are also welcome. + +The lists can be found at +\url{http://lists.randombit.net/mailman/listinfo/}. + +\subsection{Contact Information} + +A PGP key with a fingerprint of +\verb|621D AF64 11E1 851C 4CF9 A2E1 6211 EBF1 EFBA DFBC| is used to sign all +Botan releases. This key can be found in the file \filename{doc/pgpkeys.asc}; +PGP keys for the developers are also stored there. + +\vskip 5pt \noindent +Web Site: \url{http://botan.randombit.net} + +\subsection{License} + +Copyright \copyright 2000-2008, Jack Lloyd + +Licensed under the same terms as the Botan source + +\end{document} diff --git a/src/libs/3rdparty/botan/doc/architecture.pdf b/src/libs/3rdparty/botan/doc/architecture.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f0edc3fc13648adb22f683ae5d3d3532132ead4b GIT binary patch literal 463402 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 pOXk-(OdG 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 N7gsJ+kDFV^c_`5wVF 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
    G!%_uL{%`KG|CQL-zIjBZ2=JI76SVmzv*Z+Fc*M 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

    T=a5a$a2+13B~f6 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

    (VFMd{`E=SFLp7=LVy4HTNsOlNbJHXwBLG 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 z%0A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%0AvZVO@!! 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 literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/doc/building.pdf b/src/libs/3rdparty/botan/doc/building.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9b7d45a044ebaf2a6232e7d4f174593a2bdf3180 GIT binary patch literal 84582 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 OBNJ0DRaIAiH!c8Au?NBc literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/doc/building.tex b/src/libs/3rdparty/botan/doc/building.tex new file mode 100644 index 00000000000..aa4435c14da --- /dev/null +++ b/src/libs/3rdparty/botan/doc/building.tex @@ -0,0 +1,398 @@ +\documentclass{article} + +\setlength{\textwidth}{6.5in} +\setlength{\textheight}{9in} + +\setlength{\headheight}{0in} +\setlength{\topmargin}{0in} +\setlength{\headsep}{0in} + +\setlength{\oddsidemargin}{0in} +\setlength{\evensidemargin}{0in} + +\title{\textbf{Botan Build Guide}} +\author{Jack Lloyd \\ + \texttt{lloyd@randombit.net}} +\date{2008-11-24} + +\newcommand{\filename}[1]{\texttt{#1}} +\newcommand{\module}[1]{\texttt{#1}} + +\newcommand{\type}[1]{\texttt{#1}} +\newcommand{\function}[1]{\textbf{#1}} +\newcommand{\macro}[1]{\texttt{#1}} + +\begin{document} + +\maketitle + +\tableofcontents + +\parskip=5pt +\pagebreak + +\section{Introduction} + +This document describes how to build Botan on Unix/POSIX and MS +Windows systems. The POSIX oriented descriptions should apply to most +common Unix systems (including MacOS X), along with POSIX-ish systems +like BeOS, QNX, and Plan 9. Currently, systems other than Windows and +POSIX (such as VMS, MacOS 9, OS/390, OS/400, ...) are not supported by +the build system, primarily due to lack of access. Please contact the +maintainer if you would like to build Botan on such a system. + +Botan's build is controlled by configure.pl, which is a Perl +script. Perl 5.6 or later is required. + +\section{For the Impatient} + +\begin{verbatim} +$ ./configure.pl [--prefix=/some/directory] +$ make +$ make install +\end{verbatim} + +Or using \verb|nmake|, if you're compiling on Windows with Visual +C++. On platforms that do not understand the '\#!' convention for +beginning script files, or that have Perl installed in an unusual +spot, you might need to prefix the \texttt{configure.pl} command with +\texttt{perl} or \texttt{/path/to/perl}. + +\section{Building the Library} + +The first step is to run \filename{configure.pl}, which is a Perl +script that creates various directories, config files, and a Makefile +for building everything. The script requires at least Perl 5.6; any +later version should also work. + +The script will attempt to guess what kind of system you are trying +to compile for (and will print messages telling you what it guessed). +You can override this process by passing the options \verb|--cc|, +\verb|--os|, and \verb|--cpu| -- acceptable values are printed if +you run \verb|configure.pl| with \verb|--help|. + +You can pass basically anything reasonable with \verb|--cpu|: the +script knows about a large number of different architectures, their +sub-models, and common aliases for them. The script does not display +all the possibilities in its help message because there are simply too +many entries. You should only select the 64-bit version of a CPU (such +as ``sparc64'' or ``mips64'') if your operating system knows how to +handle 64-bit object code -- a 32-bit kernel on a 64-bit CPU will +generally not like 64-bit code. + +By default the script tries to figure out what will work on your +system, and use that. It will print a display at the end showing +which algorithms have and have not been abled. For instance on one +system we might see the line: + +\begin{verbatim} + (loading): entropy: [beos_stats] buf_es [cryptoapi_rng] + dev_random egd proc_walk unix_procs [win32_stats] +\end{verbatim} + +The names listed in brackets are disabled, the others are +enabled. Here we see the list of entropy sources which are going to be +compiled into Botan. Since this particular line comes when Botan was +configuring for a Linux system, the Win32 and BeOS specific modules +were disabled, while modules that use Unix APIs and /dev/random are +built. + +You can control which algorithms and modules are built using the +options ``\verb|--enable-modules=MODS|'' and +``\verb|--disable-modules=MODS|'', for instance \\ +``\verb|--enable-modules=blowfish,md5,rsa,zlib --disable-modules=arc4,cmac|''. +Modules not listed on the command line will simply be loaded if needed +or if configured to load by default. + +Not all OSes or CPUs have specific support in +\filename{configure.pl}. If the CPU architecture of your system isn't +supported by \filename{configure.pl}, use 'generic'. This setting +disables machine-specific optimization flags. Similarly, setting OS to +'generic' disables things which depend greatly on OS support +(specifically, shared libraries). + +However, it's impossible to guess which options to give to a system +compiler. Thus, if you want to compile Botan with a compiler which +\filename{configure.pl} does not support, you will need to tell it how +that compiler works. This is done by adding a new file in the +directory \filename{src/build-data/cc}; the existing files should put you +in the right direction. + +The script tries to guess what kind of makefile to generate, and it +almost always guesses correctly (basically, Visual C++ uses NMAKE with +Windows commands, and everything else uses Unix make with POSIX +commands). Just in case, you can override it with +\verb|--make-style=somestyle|. The styles Botan currently knows about +are 'unix' (normal Unix makefiles), and 'nmake', the make variant +commonly used by Windows compilers. To add a new variant (eg, a build +script for VMS), you will need to create a new template file in +\filename{src/build-data/makefile}. + +\pagebreak + +\subsection{POSIX / Unix} + +The basic build procedure on Unix and Unix-like systems is: + +\begin{verbatim} + $ ./configure.pl [--enable-modules=] [--cc=CC] + $ make + # You may need to set your LD_LIBRARY_PATH or equivalent for ./check to run + $ make check # optional, but a good idea + $ make install +\end{verbatim} + +This will probably default to using GCC, depending on what can be +found within your PATH. + +The \verb|make install| target has a default directory in which it +will install Botan (typically \verb|/usr/local|). You can override +this by using the \texttt{--prefix} argument to +\filename{configure.pl}, like so: + +\verb|./configure.pl --prefix=/opt | + +On some systems shared libraries might not be immediately visible to +the runtime linker. For example, on Linux you may have to edit +\filename{/etc/ld.so.conf} and run \texttt{ldconfig} (as root) in +order for new shared libraries to be picked up by the linker. An +alternative is to set your \texttt{LD\_LIBRARY\_PATH} shell variable +to include the directory that the Botan libraries were installed into. + +\subsection{MS Windows} + +The situation is not much different here. We'll assume you're using Visual C++ +(for Cygwin, the Unix instructions are probably more relevant). You need to +have a copy of Perl installed, and have both Perl and Visual C++ in your path. + +\begin{verbatim} + > perl configure.pl --cc=msvc (or --cc=gcc for MinGW) [--cpu=CPU] + > nmake + > nmake check # optional, but recommended +\end{verbatim} + +For Win95 pre OSR2, the \verb|cryptoapi_rng| module will not work, +because CryptoAPI didn't exist. And all versions of NT4 lack the +ToolHelp32 interface, which is how \verb|win32_stats| does its slow +polls, so a version of the library built with that module will not +load under NT4. Later systems (98/ME/2000/XP) support both methods, so +this shouldn't be much of an issue. + +Unfortunately, there currently isn't an install script usable on +Windows. Basically all you have to do is copy the newly created +\filename{libbotan.lib} to someplace where you can find it later (say, +\verb|C:\botan\|). Then copy the entire \verb|build\include\botan| +directory, which was constructed when you built the library, into the +same directory. + +When building your applications, all you have to do is tell the +compiler to look for both include files and library files in +\verb|C:\botan|, and it will find both. Or you can move them to a +place where they will be in the default compiler search paths (consult +your documentation and/or local expert for details). + +\pagebreak + +\subsection{Configuration Parameters} + +There are some configuration parameters which you may want to tweak +before building the library. These can be found in +\filename{config.h}. This file is overwritten every time the configure +script is run (and does not exist until after you run the script for +the first time). + +Also included in \filename{build/build.h} are macros which are defined +if one or more extensions are available. All of them begin with +\verb|BOTAN_HAS_|. For example, if \verb|BOTAN_HAS_COMPRESSOR_BZIP2| +is defined, then an application using Botan can include +\filename{} and use the Bzip2 filters. + +\macro{BOTAN\_MP\_WORD\_BITS}: This macro controls the size of the +words used for calculations with the MPI implementation in Botan. You +can choose 8, 16, 32, or 64, with 32 being the default. You can use 8, +16, or 32 bit words on any CPU, but the value should be set to the +same size as the CPU's registers for best performance. You can only +use 64-bit words if an assembly module (such as \module{mp\_ia32} or +\module{mp\_asm64}) is used. If the appropriate module is available, +64 bits are used, otherwise this is set to 32. Unless you are building +for a 8 or 16-bit CPU, this isn't worth messing with. + +\macro{BOTAN\_VECTOR\_OVER\_ALLOCATE}: The memory container +\type{SecureVector} will over-allocate requests by this amount (in +elements). In several areas of the library, we grow a vector fairly often. By +over-allocating by a small amount, we don't have to do allocations as often +(which is good, because the allocators can be quite slow). If you \emph{really} +want to reduce memory usage, set it to 0. Otherwise, the default should be +perfectly fine. + +\macro{BOTAN\_DEFAULT\_BUFFER\_SIZE}: This constant is used as the size of +buffers throughout Botan. A good rule of thumb would be to use the page size of +your machine. The default should be fine for most, if not all, purposes. + +\macro{BOTAN\_GZIP\_OS\_CODE}: The OS code is included in the Gzip header when +compressing. The default is 255, which means 'Unknown'. You can look in RFC +1952 for the full list; the most common are Windows (0) and Unix (3). There is +also a Macintosh (7), but it probably makes more sense to use the Unix code on +OS X. + +\subsection{Multiple Builds} + +It may be useful to run multiple builds with different +configurations. Specify \verb|--build-dir=

    | to set up a build +environment in a different directory. + +\subsection{Local Configuration} + +You may want to do something peculiar with the configuration; to +support this there is a flag to \filename{configure.pl} called +\texttt{--with-local-config=}. The contents of the file are +inserted into \filename{build/build.h} which is (indirectly) included +into every Botan header and source file. + +\pagebreak + +\section{Modules} + +There are a fairly large number of modules included with Botan. Some +of these are extremely useful, while others are only necessary in very +unusual circumstances. The modules included with this release are: + +\newcommand{\mod}[2]{\textbf{#1}: #2} + +\begin{list}{$\cdot$} + \item \mod{alloc\_mmap}{Allocates memory using memory mappings of temporary + files. This means that if the OS swaps all or part of the application, + the sensitive data will be swapped to where we can later clean it, + rather than somewhere in the swap partition.} + + \item \mod{bzip2}{Enables an application to perform bzip2 compression + and decompression using the library. Available on any system that has + bzip2.} + + \item \mod{zlib}{Enables an application to perform zlib compression and + decompression using the library. Available on any system that has + zlib.} + + %\item \mod{eng\_aep}{An engine that uses any available AEP accelerator card + % to speed up PK operations. You have to have the AEP drivers installed + % for this to link correctly, but you don't have to have a card + % installed - it will automatically be enabled if a card is detected at + % run time.} + + \item \mod{gnump}{An engine that uses GNU MP to speed up PK operations. + GNU MP 4.1 or later is required.} + + \item \mod{openssl}{An engine that uses OpenSSL to speed up public key + operations and some ciphers/hashes. OpenSSL 0.9.7 or + later is required.} + + \item \mod{beos\_stats}{An entropy source that uses BeOS-specific + APIs to gather (hopefully unpredictable) data from the system.} + + \item \mod{cryptoapi\_rng}{An entropy source that uses the Win32 + CryptoAPI function \texttt{CryptGenRandom} to gather + entropy. Supported on NT4, Win95 OSR2, and all later Windows + systems.} + + \item \mod{egd}{An entropy source that accesses EGD (the entropy + gathering daemon). Common on Unix systems that don't have + \texttt{/dev/random}.} + + \item \mod{proc\_walk}{Gather entropy by reading files from a particular file + tree. Usually used with \texttt{/proc}; most other file trees don't + have sufficient variability over time to be useful.} + + \item \mod{unix\_procs}{Gather entropy by running various Unix programs, like + \texttt{arp} and \texttt{vmstat}, and reading their output in the + hopes that at least some of it will be unpredictable to an attacker.} + + \item \mod{win32\_stats}{Gather entropy by walking through various pieces of + information about processes running on the system. Does not run on + NT4, but should run on all other Win32 systems.} + + \item \mod{fd\_unix}{Let the users of \texttt{Pipe} perform I/O with Unix + file descriptors in addition to \texttt{iostream} objects.} + + \item \mod{pthread}{Add support for using \texttt{pthread} mutexes to + lock internal data structures. Important if you are using threads + with the library.} + + \item \mod{qt\_mutex}{Add support for using Qt mutexes to lock internal data + structures.} + + \item \mod{cpu\_counter}{Use the contents of the CPU cycle counter when + generating random bits to further randomize the results. Works on x86 + (Pentium and up), Alpha, and SPARCv9.} + + \item \mod{posix\_rt}{Use the POSIX realtime clock as a high-resolution + timer.} + + \item \mod{gettimeofday}{Use the traditional Unix + \texttt{gettimeofday} as a high resolution timer.} + + \item \mod{win32\_query\_perf\_ctr}{Use Win32's + \texttt{QueryPerformanceCounter} as a high resolution timer.} + +\end{list} + +\pagebreak + +\section{Building Applications} + +\subsection{Unix} + +Botan usually links in several different system libraries (such as +\texttt{librt} and \texttt{libz}), depending on which modules are +configured at compile time. In many environments, particularly ones +using static libraries, an application has to link against the same +libraries as Botan for the linking step to succeed. But how does it +figure out what libraries it \emph{is} linked against? + +The answer is to ask the \filename{botan-config} script. This +basically solves the same problem all the other \filename{*-config} +scripts solve, and in basically the same manner. + +There are 4 options: + +\texttt{--prefix[=DIR]}: If no argument, print the prefix where Botan +is installed (such as \filename{/opt} or \filename{/usr/local}). If an +argument is specified, other options given with the same command will +execute as if Botan as actually installed at \filename{DIR} and not +where it really is; or at least where \filename{botan-config} thinks +it really is. I should mention that it + +\texttt{--version}: Print the Botan version number. + +\texttt{--cflags}: Print options that should be passed to the compiler +whenever a C++ file is compiled. Typically this is used for setting +include paths. + +\texttt{--libs}: Print options for which libraries to link to (this includes +\texttt{-lbotan}). + +Your \filename{Makefile} can run \filename{botan-config} and get the +options necessary for getting your application to compile and link, +regardless of whatever crazy libraries Botan might be linked against. + +Botan also by default installs a file for \texttt{pkg-config}, +namespaced by the major and minor versions. So it can be used, +for instance, as + +\begin{verbatim} +$ pkg-config botan-1.8 --modversion +1.8.0 +$ pkg-config botan-1.8 --cflags +-I/usr/local/include +$ pkg-config botan-1.8 --libs +-L/usr/local/lib -lbotan -lm -lbz2 -lpthread -lrt +\end{verbatim} + +\subsection{MS Windows} + +No special help exists for building applications on Windows. However, +given that typically Windows software is distributed as binaries, this +is less of a problem - only the developer needs to worry about it. As +long as they can remember where they installed Botan, they just have +to set the appropriate flags in their Makefile/project file. + +\end{document} diff --git a/src/libs/3rdparty/botan/doc/credits.txt b/src/libs/3rdparty/botan/doc/credits.txt new file mode 100644 index 00000000000..ef2ee6bc114 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/credits.txt @@ -0,0 +1,78 @@ + This is the credits file of people that have contributed to Botan. It uses + the same format as the Linux credits file. Please keep it sorted by last + name. + + The fields are: + N - name + E - email + W - web URL + P - PGP fingerprint + D - description + S - meatspace location +---------- + +N - Charles Brockman +W - http://www.securitygenetics.com/ +D - documentation editing +S - Oregon, USA + +N: Martin Doering +E: doering@cdc.informatik.tu-darmstadt.de +D: GF(p) arithmetic + +N: Matthew Gregan +D: Binary file I/O support, allocator fixes + +N: Hany Greiss +D: Windows porting + +N: Manuel Hartl +E: hartl@flexsecure.de +W: http://www.flexsecure.de/ +D: ECDSA, ECKAEG + +N: Yves Jerschow +E: yves.jerschow@uni-duesseldorf.de +D: Optimizations for memory load/store and HMAC +D: Support for IPv4 addresses in X.509 alternative names +S: Germany + +N: Matt Johnston +D: Allocator fixes and optimizations, decompressor fixes + +N: Peter J. Jones +E: pjones@pmade.org +D: Bzip2 compression module +S: Colorado, USA + +N: Justin Karneges +D: Qt support modules (mutexes and types), X.509 API design + +N: Jack Lloyd +E: lloyd@randombit.net +W: http://www.randombit.net/ +P: 3F69 2E64 6D92 3BBE E7AE 9258 5C0F 96E8 4EC1 6D6B +D: Original designer/author, maintainer 2001-current +S: Vermont, USA + +N: Joel Low +D: DLL symbol visibility + +N: Christoph Ludwig +E: ludwig@fh-worms.de +D: GP(p) arithmetic + +N: Vaclav Ovsik +E: vaclav.ovsik@i.cz +D: Perl XS module + +N: Luca Piccarreta +E: luca.piccarreta@gmail.com +D: x86/amd64 assembler, BigInt optimizations, Win32 mutex module +S: Italy + +N: Falko Strenzke +E: strenzke@flexsecure.de +W: http://www.flexsecure.de/ +D: GF(p) arithmetic, CVC, Shanks-Tonelli algorithm +S: Darmstadt, Germany diff --git a/src/libs/3rdparty/botan/doc/examples/GNUmakefile b/src/libs/3rdparty/botan/doc/examples/GNUmakefile new file mode 100644 index 00000000000..d854c81d828 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/GNUmakefile @@ -0,0 +1,21 @@ + +BOTAN_CONFIG = botan-config + +CXX = g++ +CFLAGS = -O2 -ansi -W -Wall $(shell $(BOTAN_CONFIG) --cflags) +LIBS = $(shell $(BOTAN_CONFIG) --libs) + +SRCS=$(wildcard *.cpp) + +PROGS=$(patsubst %.cpp,%,$(SRCS)) + +all: $(PROGS) + +clean: + @rm -f $(PROGS) + +%: %.cpp + $(CXX) $(CFLAGS) $? $(LIBS) -o $@ + +eax_test: eax_test.cpp + $(CXX) $(CFLAGS) $? $(LIBS) -lboost_regex -o $@ diff --git a/src/libs/3rdparty/botan/doc/examples/asn1.cpp b/src/libs/3rdparty/botan/doc/examples/asn1.cpp new file mode 100644 index 00000000000..95757ec19e5 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/asn1.cpp @@ -0,0 +1,312 @@ +/* + A simple ASN.1 parser, similiar to 'dumpasn1' or 'openssl asn1parse', though + without some of the bells and whistles of those. Primarily used for testing + the BER decoder. The output format is modeled loosely on 'asn1parse -i' + + The output is actually less precise than the other decoders named, because + the underlying BER_Decoder hides quite a bit from userspace, such as the use + of indefinite length encodings (and the EOC markers). At some point it will + also hide the constructed string types from the user, but right now you'll + seem them as-is. + + Written by Jack Lloyd, November 9-10, 2003 + - Nov 22: Updated to new BER_Object format (tag -> class_tag/type_tag) + - Nov 25: Much improved BIT STRING output + Can deal with non-constructed taggings + Can produce UTF-8 output + + This file is in the public domain. +*/ + +/*******************************************************************/ + +// Set this if your terminal understands UTF-8; otherwise output is in Latin-1 +#define UTF8_TERMINAL 1 + +/* + What level the outermost layer of stuff is at. Probably 0 or 1; asn1parse + uses 0 as the outermost, while 1 makes more sense to me. 2+ doesn't make + much sense at all. +*/ +#define INITIAL_LEVEL 0 + +/*******************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +using namespace Botan; + +#include +#include + +void decode(BER_Decoder&, u32bit); +void emit(const std::string&, u32bit, u32bit, const std::string& = ""); +std::string type_name(ASN1_Tag); + +int main(int argc, char* argv[]) + { + if(argc != 2) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + + Botan::LibraryInitializer init; + + try { + DataSource_Stream in(argv[1]); + + if(!PEM_Code::matches(in)) + { + BER_Decoder decoder(in); + decode(decoder, INITIAL_LEVEL); + } + else + { + std::string label; // ignored + BER_Decoder decoder(PEM_Code::decode(in, label)); + decode(decoder, INITIAL_LEVEL); + } + + } + catch(std::exception& e) + { + printf("%s\n", e.what()); + return 1; + } + return 0; + } + +void decode(BER_Decoder& decoder, u32bit level) + { + BER_Object obj = decoder.get_next_object(); + + while(obj.type_tag != NO_OBJECT) + { + const ASN1_Tag type_tag = obj.type_tag; + const ASN1_Tag class_tag = obj.class_tag; + const u32bit length = obj.value.size(); + + /* hack to insert the tag+length back in front of the stuff now + that we've gotten the type info */ + DER_Encoder encoder; + encoder.add_object(type_tag, class_tag, obj.value, obj.value.size()); + SecureVector bits = encoder.get_contents(); + + BER_Decoder data(bits); + + if(class_tag & CONSTRUCTED) + { + BER_Decoder cons_info(obj.value); + if(type_tag == SEQUENCE) + { + emit("SEQUENCE", level, length); + decode(cons_info, level+1); + } + else if(type_tag == SET) + { + emit("SET", level, length); + decode(cons_info, level+1); + } + else + { + std::string name; + + if((class_tag & APPLICATION) || (class_tag & CONTEXT_SPECIFIC) || + (class_tag & PRIVATE)) + { + name = "cons [" + to_string(type_tag) + "]"; + + if(class_tag & APPLICATION) + name += " appl"; + if(class_tag & CONTEXT_SPECIFIC) + name += " context"; + if(class_tag & PRIVATE) + name += " private"; + } + else + name = type_name(type_tag) + " (cons)"; + + emit(name, level, length); + decode(cons_info, level+1); + } + } + else if(class_tag == APPLICATION || class_tag == CONTEXT_SPECIFIC || + class_tag == PRIVATE) + { + bool not_text = false; + + for(u32bit j = 0; j != bits.size(); j++) + if(!isgraph(bits[j]) && !isspace(bits[j])) + not_text = true; + + Pipe pipe(((not_text) ? new Hex_Encoder : 0)); + pipe.process_msg(bits); + emit("[" + to_string(type_tag) + "]", level, length, + pipe.read_all_as_string()); + } + else if(type_tag == OBJECT_ID) + { + OID oid; + data.decode(oid); + + std::string out = OIDS::lookup(oid); + if(out != oid.as_string()) + out += " [" + oid.as_string() + "]"; + + emit(type_name(type_tag), level, length, out); + } + else if(type_tag == INTEGER) + { + BigInt number; + data.decode(number); + + SecureVector rep; + + /* If it's small, it's probably a number, not a hash */ + if(number.bits() <= 16) + rep = BigInt::encode(number, BigInt::Decimal); + else + rep = BigInt::encode(number, BigInt::Hexadecimal); + + std::string str; + for(u32bit j = 0; j != rep.size(); j++) + str += (char)rep[j]; + + emit(type_name(type_tag), level, length, str); + } + else if(type_tag == BOOLEAN) + { + bool boolean; + data.decode(boolean); + emit(type_name(type_tag), + level, length, (boolean ? "true" : "false")); + } + else if(type_tag == NULL_TAG) + { + emit(type_name(type_tag), level, length); + } + else if(type_tag == OCTET_STRING) + { + SecureVector bits; + data.decode(bits, type_tag); + bool not_text = false; + + for(u32bit j = 0; j != bits.size(); j++) + if(!isgraph(bits[j]) && !isspace(bits[j])) + not_text = true; + + Pipe pipe(((not_text) ? new Hex_Encoder : 0)); + pipe.process_msg(bits); + emit(type_name(type_tag), level, length, pipe.read_all_as_string()); + } + else if(type_tag == BIT_STRING) + { + SecureVector bits; + data.decode(bits, type_tag); + + std::vector bit_set; + + for(u32bit j = 0; j != bits.size(); j++) + for(u32bit k = 0; k != 8; k++) + bit_set.push_back((bool)((bits[bits.size()-j-1] >> (7-k)) & 1)); + + std::string bit_str; + for(u32bit j = 0; j != bit_set.size(); j++) + { + bool the_bit = bit_set[bit_set.size()-j-1]; + + if(!the_bit && bit_str.size() == 0) + continue; + bit_str += (the_bit ? "1" : "0"); + } + + emit(type_name(type_tag), level, length, bit_str); + } + else if(type_tag == PRINTABLE_STRING || + type_tag == NUMERIC_STRING || + type_tag == IA5_STRING || + type_tag == T61_STRING || + type_tag == VISIBLE_STRING || + type_tag == UTF8_STRING || + type_tag == BMP_STRING) + { + ASN1_String str; + data.decode(str); + if(UTF8_TERMINAL) + emit(type_name(type_tag), level, length, + Charset::transcode(str.iso_8859(), + LATIN1_CHARSET, UTF8_CHARSET)); + else + emit(type_name(type_tag), level, length, str.iso_8859()); + } + else if(type_tag == UTC_TIME || type_tag == GENERALIZED_TIME) + { + X509_Time time; + data.decode(time); + emit(type_name(type_tag), level, length, time.readable_string()); + } + else + fprintf(stderr, "Unknown tag: class=%02X, type=%02X\n", + class_tag, type_tag); + + obj = decoder.get_next_object(); + } + } + +void emit(const std::string& type, u32bit level, u32bit length, + const std::string& value) + { + const u32bit LIMIT = 128; + const u32bit BIN_LIMIT = 64; + + int written = 0; + written += printf(" d=%2d, l=%4d: ", level, length); + for(u32bit j = INITIAL_LEVEL; j != level; j++) + written += printf(" "); + written += printf("%s ", type.c_str()); + + bool should_skip = false; + if(value.length() > LIMIT) should_skip = true; + if((type == "OCTET STRING" || type == "BIT STRING") && + value.length() > BIN_LIMIT) + should_skip = true; + + if(value != "" && !should_skip) + { + if(written % 2 == 0) printf(" "); + while(written < 50) written += printf(" "); + printf(":%s\n", value.c_str()); + } + else + printf("\n"); + } + +std::string type_name(ASN1_Tag type) + { + if(type == PRINTABLE_STRING) return "PRINTABLE STRING"; + if(type == NUMERIC_STRING) return "NUMERIC STRING"; + if(type == IA5_STRING) return "IA5 STRING"; + if(type == T61_STRING) return "T61 STRING"; + if(type == UTF8_STRING) return "UTF8 STRING"; + if(type == VISIBLE_STRING) return "VISIBLE STRING"; + if(type == BMP_STRING) return "BMP STRING"; + + if(type == UTC_TIME) return "UTC TIME"; + if(type == GENERALIZED_TIME) return "GENERALIZED TIME"; + + if(type == OCTET_STRING) return "OCTET STRING"; + if(type == BIT_STRING) return "BIT STRING"; + + if(type == INTEGER) return "INTEGER"; + if(type == NULL_TAG) return "NULL"; + if(type == OBJECT_ID) return "OBJECT"; + if(type == BOOLEAN) return "BOOLEAN"; + return "(UNKNOWN)"; + } diff --git a/src/libs/3rdparty/botan/doc/examples/base.cpp b/src/libs/3rdparty/botan/doc/examples/base.cpp new file mode 100644 index 00000000000..eca0ccf24dc --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/base.cpp @@ -0,0 +1,44 @@ +/* + A simple template for Botan applications, showing startup, etc +*/ +#include +using namespace Botan; + +/* This is how you can do compile-time version checking */ + +#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,6,3) + #error Your Botan installation is too old; upgrade to 1.6.3 or later +#endif + +#include + +int main(int argc, char* argv[]) + { + Botan::LibraryInitializer init; + + try + { + /* Put it inside the try block so exceptions at startup/shutdown will + get caught. + + It will be initialized with default options + */ + + if(argc > 2) + { + std::cout << "Usage: " << argv[0] << "[initializer args]\n"; + return 2; + } + + std::string args = (argc == 2) ? argv[1] : ""; + + LibraryInitializer init(args); + // your operations here + } + catch(std::exception& e) + { + std::cout << e.what() << std::endl; + return 1; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/base64.cpp b/src/libs/3rdparty/botan/doc/examples/base64.cpp new file mode 100644 index 00000000000..d35aaf593bb --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/base64.cpp @@ -0,0 +1,82 @@ +/* +An Botan example application which emulates a poorly written version of +"uuencode -m" + +Written by Jack Lloyd (lloyd@randombit.net), in maybe an hour scattered +over 2000/2001 + +This file is in the public domain +*/ +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char* argv[]) + { + if(argc < 2) + { + std::cout << "Usage: " << argv[0] << " [-w] [-c n] [-e|-d] files...\n" + " -e : Encode input to base64 strings (default) \n" + " -d : Decode base64 input\n" + " -w : Wrap lines\n" + " -c n: Wrap lines at column n, default 78\n"; + return 1; + } + + Botan::LibraryInitializer init; + + int column = 78; + bool wrap = false; + bool encoding = true; + std::vector files; + + for(int j = 1; argv[j] != 0; j++) + { + std::string this_arg = argv[j]; + + if(this_arg == "-w") + wrap = true; + else if(this_arg == "-e"); + else if(this_arg == "-d") + encoding = false; + else if(this_arg == "-c") + { + if(argv[j+1]) + { column = atoi(argv[j+1]); j++; } + else + { + std::cout << "No argument for -c option" << std::endl; + return 1; + } + } + else files.push_back(argv[j]); + } + + for(unsigned int j = 0; j != files.size(); j++) + { + std::istream* stream; + if(files[j] == "-") stream = &std::cin; + else stream = new std::ifstream(files[j].c_str()); + + if(!*stream) + { + std::cout << "ERROR, couldn't open " << files[j] << std::endl; + continue; + } + + Botan::Pipe pipe((encoding) ? + ((Botan::Filter*)new Botan::Base64_Encoder(wrap, column)) : + ((Botan::Filter*)new Botan::Base64_Decoder)); + pipe.start_msg(); + *stream >> pipe; + pipe.end_msg(); + pipe.set_default_msg(j); + std::cout << pipe; + if(files[j] != "-") delete stream; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/bench.cpp b/src/libs/3rdparty/botan/doc/examples/bench.cpp new file mode 100644 index 00000000000..37ef1104df3 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/bench.cpp @@ -0,0 +1,98 @@ +#include +#include +#include +#include + +using namespace Botan; + +#include + +double best_speed(const std::string& algorithm, + u32bit milliseconds, + RandomNumberGenerator& rng, + Timer& timer) + { + std::map speeds = + algorithm_benchmark(algorithm, milliseconds, + timer, rng, + global_state().algorithm_factory()); + + double best_time = 0; + + for(std::map::const_iterator i = speeds.begin(); + i != speeds.end(); ++i) + if(i->second > best_time) + best_time = i->second; + + return best_time; + } + +const std::string algos[] = { + "AES-128", + "AES-192", + "AES-256", + "Blowfish", + "CAST-128", + "CAST-256", + "DES", + "DESX", + "TripleDES", + "GOST", + "IDEA", + "KASUMI", + "Lion(SHA-256,Turing,8192)", + "Luby-Rackoff(SHA-512)", + "MARS", + "MISTY1", + "Noekeon", + "RC2", + "RC5(12)", + "RC5(16)", + "RC6", + "SAFER-SK(10)", + "SEED", + "Serpent", + "Skipjack", + "Square", + "TEA", + "Twofish", + "XTEA", + "Adler32", + "CRC32", + "FORK-256", + "GOST-34.11", + "HAS-160", + "HAS-V", + "MD2", + "MD4", + "MD5", + "RIPEMD-128", + "RIPEMD-160", + "SHA-160", + "SHA-256", + "SHA-384", + "SHA-512", + "Skein-512", + "Tiger", + "Whirlpool", + "CMAC(AES-128)", + "HMAC(SHA-1)", + "X9.19-MAC", + "", +}; + +int main() + { + LibraryInitializer init; + + u32bit milliseconds = 1000; + AutoSeeded_RNG rng; + Default_Benchmark_Timer timer; + + for(u32bit i = 0; algos[i] != ""; ++i) + { + std::string algo = algos[i]; + std::cout << algo << ' ' + << best_speed(algo, milliseconds, rng, timer) << "\n"; + } + } diff --git a/src/libs/3rdparty/botan/doc/examples/benchmark.cpp b/src/libs/3rdparty/botan/doc/examples/benchmark.cpp new file mode 100644 index 00000000000..d046e8d2029 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/benchmark.cpp @@ -0,0 +1,41 @@ +#include +#include + +#include +#include +#include +#include + +int main(int argc, char* argv[]) + { + if(argc <= 2) + { + std::cout << "Usage: " << argv[0] << " seconds ...\n"; + return 1; + } + + Botan::LibraryInitializer init; + + Botan::AutoSeeded_RNG rng; + Botan::Default_Benchmark_Timer timer; + + Botan::Algorithm_Factory& af = Botan::global_state().algorithm_factory(); + + double ms = 1000 * std::atof(argv[1]); + + for(size_t i = 2; argv[i]; ++i) + { + std::string algo = argv[i]; + + std::map results = + Botan::algorithm_benchmark(algo, ms, timer, rng, af); + + std::cout << algo << ":\n"; + for(std::map::iterator r = results.begin(); + r != results.end(); ++r) + { + std::cout << " " << r->first << ": " << r->second << " MiB/s\n"; + } + std::cout << "\n"; + } + } diff --git a/src/libs/3rdparty/botan/doc/examples/bzip.cpp b/src/libs/3rdparty/botan/doc/examples/bzip.cpp new file mode 100644 index 00000000000..02252fb948e --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/bzip.cpp @@ -0,0 +1,108 @@ +/* +An Botan example application which emulates a poorly written version of bzip2 + +Written by Jack Lloyd (lloyd@randombit.net), Jun 9, 2001 + +This file is in the public domain +*/ +#include +#include +#include +#include +#include +#include + +#if defined(BOTAN_HAS_COMPRESSOR_BZIP2) + #include +#endif + +const std::string SUFFIX = ".bz2"; + +int main(int argc, char* argv[]) + { + if(argc < 2) + { + std::cout << "Usage: " << argv[0] + << " [-s] [-d] [-1...9] " << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + std::vector files; + bool decompress = false, small = false; + int level = 9; + + for(int j = 1; argv[j] != 0; j++) + { + if(std::strcmp(argv[j], "-d") == 0) { decompress = true; continue; } + if(std::strcmp(argv[j], "-s") == 0) { small = true; continue; } + if(std::strcmp(argv[j], "-1") == 0) { level = 1; continue; } + if(std::strcmp(argv[j], "-2") == 0) { level = 2; continue; } + if(std::strcmp(argv[j], "-3") == 0) { level = 3; continue; } + if(std::strcmp(argv[j], "-4") == 0) { level = 4; continue; } + if(std::strcmp(argv[j], "-5") == 0) { level = 5; continue; } + if(std::strcmp(argv[j], "-6") == 0) { level = 6; continue; } + if(std::strcmp(argv[j], "-7") == 0) { level = 7; continue; } + if(std::strcmp(argv[j], "-8") == 0) { level = 8; continue; } + if(std::strcmp(argv[j], "-9") == 0) { level = 9; continue; } + files.push_back(argv[j]); + } + + try { + + Botan::Filter* bzip = 0; +#ifdef BOTAN_HAS_COMPRESSOR_BZIP2 + if(decompress) + bzip = new Botan::Bzip_Decompression(small); + else + bzip = new Botan::Bzip_Compression(level); +#endif + + if(!bzip) + { + std::cout << "Sorry, support for bzip2 not compiled into Botan\n"; + return 1; + } + + Botan::Pipe pipe(bzip); + + for(unsigned int j = 0; j != files.size(); j++) + { + std::string infile = files[j], outfile = files[j]; + if(!decompress) + outfile = outfile += SUFFIX; + else + outfile = outfile.replace(outfile.find(SUFFIX), + SUFFIX.length(), ""); + + std::ifstream in(infile.c_str()); + std::ofstream out(outfile.c_str()); + if(!in) + { + std::cout << "ERROR: could not read " << infile << std::endl; + continue; + } + if(!out) + { + std::cout << "ERROR: could not write " << outfile << std::endl; + continue; + } + + pipe.start_msg(); + in >> pipe; + pipe.end_msg(); + pipe.set_default_msg(j); + out << pipe; + + in.close(); + out.close(); + } + } + catch(std::exception& e) + { + std::cout << "Exception caught: " << e.what() << std::endl; + return 1; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/ca.cpp b/src/libs/3rdparty/botan/doc/examples/ca.cpp new file mode 100644 index 00000000000..41dd409d5fd --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/ca.cpp @@ -0,0 +1,74 @@ +/* + Implement the functionality of a simple CA: read in a CA certificate, + the associated private key, and a PKCS #10 certificate request. Sign the + request and print out the new certificate. + + File names are hardcoded for simplicity. + cacert.pem: The CA's certificate (perhaps created by self_sig) + caprivate.pem: The CA's private key + req.pem: The user's PKCS #10 certificate request + + Written by Jack Lloyd, May 19, 2003 + + This file is in the public domain. +*/ + +#include +#include +#include +using namespace Botan; + +#include +#include + +int main(int argc, char* argv[]) + { + if(argc != 5) + { + std::cout << "Usage: " << argv[0] << " " + << " " << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + try + { + const std::string arg_passphrase = argv[1]; + const std::string arg_ca_cert = argv[2]; + const std::string arg_ca_key = argv[3]; + const std::string arg_req_file = argv[4]; + + AutoSeeded_RNG rng; + + X509_Certificate ca_cert(arg_ca_cert); + + std::auto_ptr privkey( + PKCS8::load_key(arg_ca_key, rng, arg_passphrase) + ); + + X509_CA ca(ca_cert, *privkey); + + // got a request + PKCS10_Request req(arg_req_file); + + // you would insert checks here, and perhaps modify the request + // (this example should be extended to show how) + + // now sign the request + X509_Time start_time(system_time()); + X509_Time end_time(system_time() + 365 * 60 * 60 * 24); + + X509_Certificate new_cert = ca.sign_request(req, rng, + start_time, end_time); + + // send the new cert back to the requestor + std::cout << new_cert.PEM_encode(); + } + catch(std::exception& e) + { + std::cout << e.what() << std::endl; + return 1; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/checksum.cpp b/src/libs/3rdparty/botan/doc/examples/checksum.cpp new file mode 100644 index 00000000000..232be057c3b --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/checksum.cpp @@ -0,0 +1,31 @@ +#include +#include + +#include + +using namespace Botan; + +int main(int argc, char* argv[]) + { + if(argc != 2) + { + std::cout << "Usage: " << argv[0] << " filename\n"; + return 1; + } + + Botan::LibraryInitializer init; + + Pipe pipe(new Fork( + new Chain(new Hash_Filter("CRC24"), new Hex_Encoder), + new Chain(new Hash_Filter("CRC32"), new Hex_Encoder), + new Chain(new Hash_Filter("Adler32"), new Hex_Encoder) + )); + + DataSource_Stream in(argv[1]); + + pipe.process_msg(in); + + std::cout << pipe.read_all_as_string(0) << "\n"; + std::cout << pipe.read_all_as_string(1) << "\n"; + std::cout << pipe.read_all_as_string(2) << "\n"; + } diff --git a/src/libs/3rdparty/botan/doc/examples/cms_dec.cpp b/src/libs/3rdparty/botan/doc/examples/cms_dec.cpp new file mode 100644 index 00000000000..3fa285395bd --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/cms_dec.cpp @@ -0,0 +1,116 @@ +#include +#include +#include +using namespace Botan; + +#include +#include + +int main(int argc, char* argv[]) + { + if(argc != 2) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + + Botan::LibraryInitializer init; + + try { + AutoSeeded_RNG rng; + + X509_Certificate mycert("mycert.pem"); + PKCS8_PrivateKey* mykey = PKCS8::load_key("mykey.pem", rng, "cut"); + + X509_Certificate yourcert("yourcert.pem"); + X509_Certificate cacert("cacert.pem"); + X509_Certificate int_ca("int_ca.pem"); + + X509_Store store; + store.add_cert(mycert); + store.add_cert(yourcert); + store.add_cert(cacert, true); + store.add_cert(int_ca); + + DataSource_Stream message(argv[1]); + + User_Interface ui; + + CMS_Decoder decoder(message, store, ui, mykey); + + while(decoder.layer_type() != CMS_Decoder::DATA) + { + CMS_Decoder::Status status = decoder.layer_status(); + CMS_Decoder::Content_Type content = decoder.layer_type(); + + if(status == CMS_Decoder::FAILURE) + { + std::cout << "Failure reading CMS data" << std::endl; + break; + } + + if(content == CMS_Decoder::DIGESTED) + { + std::cout << "Digested data, hash = " << decoder.layer_info() + << std::endl; + std::cout << "Hash is " + << ((status == CMS_Decoder::GOOD) ? "good" : "bad") + << std::endl; + } + + if(content == CMS_Decoder::SIGNED) + { + // how to handle multiple signers? they can all exist within a + // single level... + + std::cout << "Signed by " << decoder.layer_info() << std::endl; + //std::cout << "Sign time: " << decoder.xxx() << std::endl; + std::cout << "Signature is "; + if(status == CMS_Decoder::GOOD) + std::cout << "valid"; + else if(status == CMS_Decoder::BAD) + std::cout << "bad"; + else if(status == CMS_Decoder::NO_KEY) + std::cout << "(cannot check, no known cert)"; + std::cout << std::endl; + } + if(content == CMS_Decoder::ENVELOPED || + content == CMS_Decoder::COMPRESSED || + content == CMS_Decoder::AUTHENTICATED) + { + if(content == CMS_Decoder::ENVELOPED) + std::cout << "Enveloped"; + if(content == CMS_Decoder::COMPRESSED) + std::cout << "Compressed"; + if(content == CMS_Decoder::AUTHENTICATED) + std::cout << "MACed"; + + std::cout << ", algo = " << decoder.layer_info() << std::endl; + + if(content == CMS_Decoder::AUTHENTICATED) + { + std::cout << "MAC status is "; + if(status == CMS_Decoder::GOOD) + std::cout << "valid"; + else if(status == CMS_Decoder::BAD) + std::cout << "bad"; + else if(status == CMS_Decoder::NO_KEY) + std::cout << "(cannot check, no key)"; + std::cout << std::endl; + } + } + decoder.next_layer(); + } + + if(decoder.layer_type() == CMS_Decoder::DATA) + std::cout << "Message is \"" << decoder.get_data() + << '"' << std::endl; + else + std::cout << "No data anywhere?" << std::endl; + } + catch(std::exception& e) + { + std::cerr << e.what() << std::endl; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/cms_enc.cpp b/src/libs/3rdparty/botan/doc/examples/cms_enc.cpp new file mode 100644 index 00000000000..de16bbaae33 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/cms_enc.cpp @@ -0,0 +1,53 @@ +#include +#include +using namespace Botan; + +#include +#include +#include + +int main() + { + Botan::LibraryInitializer init; + + try { + + X509_Certificate mycert("mycert.pem"); + X509_Certificate mycert2("mycert2.pem"); + X509_Certificate yourcert("yourcert.pem"); + X509_Certificate cacert("cacert.pem"); + X509_Certificate int_ca("int_ca.pem"); + + AutoSeeded_RNG rng; + + X509_Store store; + store.add_cert(mycert); + store.add_cert(mycert2); + store.add_cert(yourcert); + store.add_cert(int_ca); + store.add_cert(cacert, true); + + const std::string msg = "prioncorp: we don't toy\n"; + + CMS_Encoder encoder(msg); + + encoder.compress("Zlib"); + encoder.digest(); + encoder.encrypt(rng, mycert); + + /* + PKCS8_PrivateKey* mykey = PKCS8::load_key("mykey.pem", rng, "cut"); + encoder.sign(store, *mykey); + */ + + SecureVector raw = encoder.get_contents(); + std::ofstream out("out.der"); + + out.write((const char*)raw.begin(), raw.size()); + } + catch(std::exception& e) + { + std::cerr << e.what() << std::endl; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/cryptobox.cpp b/src/libs/3rdparty/botan/doc/examples/cryptobox.cpp new file mode 100644 index 00000000000..0a769b0cd62 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/cryptobox.cpp @@ -0,0 +1,50 @@ +/* +* Cryptobox example +*/ +#include +#include +#include +#include +#include + +using namespace Botan; + +int main(int argc, char* argv[]) + { + LibraryInitializer init; + + AutoSeeded_RNG rng; + + if(argc != 3) + { + std::cout << "Usage: cryptobox pass filename\n"; + return 1; + } + + std::string pass = argv[1]; + std::string filename = argv[2]; + + std::ifstream input(filename.c_str()); + + std::vector file_contents; + while(input.good()) + { + byte filebuf[4096] = { 0 }; + input.read((char*)filebuf, sizeof(filebuf)); + size_t got = input.gcount(); + + file_contents.insert(file_contents.end(), filebuf, filebuf+got); + } + + std::string ciphertext = CryptoBox::encrypt(&file_contents[0], + file_contents.size(), + pass, rng); + + std::cout << ciphertext; + + /* + std::cout << CryptoBox::decrypt((const byte*)&ciphertext[0], + ciphertext.length(), + pass); + */ + } diff --git a/src/libs/3rdparty/botan/doc/examples/decrypt.cpp b/src/libs/3rdparty/botan/doc/examples/decrypt.cpp new file mode 100644 index 00000000000..68d5f890b0c --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/decrypt.cpp @@ -0,0 +1,158 @@ +/* +Decrypt files encrypted with the 'encrypt' example application. + +I'm being lazy and writing the output to stdout rather than stripping off the +".enc" suffix and writing it there. So all diagnostics go to stderr so there is +no confusion. + +Written by Jack Lloyd (lloyd@randombit.net) on August 5, 2002 + +This file is in the public domain +*/ +#include +#include +#include +#include +#include +#include + +#include + +#if defined(BOTAN_HAS_COMPRESSOR_ZLIB) + #include +#endif + +using namespace Botan; + +SecureVector b64_decode(const std::string&); + +int main(int argc, char* argv[]) + { + if(argc < 2) + { + std::cout << "Usage: " << argv[0] << " [-p passphrase] file\n" + << " -p : Use this passphrase to decrypt\n"; + return 1; + } + + Botan::LibraryInitializer init; + + std::string filename, passphrase; + + for(int j = 1; argv[j] != 0; j++) + { + if(std::strcmp(argv[j], "-p") == 0) + { + if(argv[j+1]) + { + passphrase = argv[j+1]; + j++; + } + else + { + std::cout << "No argument for -p option" << std::endl; + return 1; + } + } + else + { + if(filename != "") + { + std::cout << "You can only specify one file at a time\n"; + return 1; + } + filename = argv[j]; + } + } + + if(passphrase == "") + { + std::cout << "You have to specify a passphrase!" << std::endl; + return 1; + } + + std::ifstream in(filename.c_str()); + if(!in) + { + std::cout << "ERROR: couldn't open " << filename << std::endl; + return 1; + } + + std::string algo; + + try { + std::string header, salt_str, mac_str; + std::getline(in, header); + std::getline(in, algo); + std::getline(in, salt_str); + std::getline(in, mac_str); + + if(header != "-------- ENCRYPTED FILE --------") + { + std::cout << "ERROR: File is missing the usual header" << std::endl; + return 1; + } + + if(!have_block_cipher(algo)) + { + std::cout << "Don't know about the block cipher \"" << algo << "\"\n"; + return 1; + } + + const u32bit key_len = max_keylength_of(algo); + const u32bit iv_len = block_size_of(algo); + + std::auto_ptr s2k(get_s2k("PBKDF2(SHA-1)")); + s2k->set_iterations(8192); + s2k->change_salt(b64_decode(salt_str)); + + SymmetricKey bc_key = s2k->derive_key(key_len, "BLK" + passphrase); + InitializationVector iv = s2k->derive_key(iv_len, "IVL" + passphrase); + SymmetricKey mac_key = s2k->derive_key(16, "MAC" + passphrase); + + Pipe pipe(new Base64_Decoder, + get_cipher(algo + "/CBC", bc_key, iv, DECRYPTION), +#ifdef BOTAN_HAS_COMPRESSOR_ZLIB + new Zlib_Decompression, +#endif + new Fork( + 0, + new Chain(new MAC_Filter("HMAC(SHA-1)", mac_key), + new Base64_Encoder) + ) + ); + + pipe.start_msg(); + in >> pipe; + pipe.end_msg(); + + std::string our_mac = pipe.read_all_as_string(1); + if(our_mac != mac_str) + std::cout << "WARNING: MAC in message failed to verify\n"; + + std::cout << pipe.read_all_as_string(0); + } + catch(Algorithm_Not_Found) + { + std::cout << "Don't know about the block cipher \"" << algo << "\"\n"; + return 1; + } + catch(Decoding_Error) + { + std::cout << "Bad passphrase or corrupt file\n"; + return 1; + } + catch(std::exception& e) + { + std::cout << "Exception caught: " << e.what() << std::endl; + return 1; + } + return 0; + } + +SecureVector b64_decode(const std::string& in) + { + Pipe pipe(new Base64_Decoder); + pipe.process_msg(in); + return pipe.read_all(); + } diff --git a/src/libs/3rdparty/botan/doc/examples/dh.cpp b/src/libs/3rdparty/botan/doc/examples/dh.cpp new file mode 100644 index 00000000000..7855aeae5e0 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/dh.cpp @@ -0,0 +1,59 @@ +/* + A simple DH example + + Written by Jack Lloyd (lloyd@randombit.net), on December 24, 2003 + + This file is in the public domain +*/ +#include +#include +#include +using namespace Botan; + +#include +#include + +int main() + { + Botan::LibraryInitializer init; + + try + { + AutoSeeded_RNG rng; + + // Alice creates a DH key and sends (the public part) to Bob + DH_PrivateKey private_a(rng, DL_Group("modp/ietf/1024")); + DH_PublicKey public_a = private_a; // Bob gets this + + // Bob creates a key with a matching group + DH_PrivateKey private_b(rng, public_a.get_domain()); + + // Bob sends the key back to Alice + DH_PublicKey public_b = private_b; // Alice gets this + + // Both of them create a key using their private key and the other's + // public key + SymmetricKey alice_key = private_a.derive_key(public_b); + SymmetricKey bob_key = private_b.derive_key(public_a); + + if(alice_key == bob_key) + { + std::cout << "The two keys matched, everything worked\n"; + std::cout << "The shared key was: " << alice_key.as_string() << "\n"; + } + else + { + std::cout << "The two keys didn't match!\n"; + std::cout << "Alice's key was: " << alice_key.as_string() << "\n"; + std::cout << "Bob's key was: " << bob_key.as_string() << "\n"; + } + + // Now Alice and Bob hash the key and use it for something + } + catch(std::exception& e) + { + std::cout << e.what() << std::endl; + return 1; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/dsa_kgen.cpp b/src/libs/3rdparty/botan/doc/examples/dsa_kgen.cpp new file mode 100644 index 00000000000..4669cf70521 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/dsa_kgen.cpp @@ -0,0 +1,66 @@ +/* +Generate a 1024 bit DSA key and put it into a file. The public key format is +that specified by X.509, while the private key format is PKCS #8. + +The domain parameters are the ones specified as the Java default DSA +parameters. There is nothing special about these, it's just the only 1024-bit +DSA parameter set that's included in Botan at the time of this writing. The +application always reads/writes all of the domain parameters to/from the file, +so a new set could be used without any problems. We could generate a new set +for each key, or read a set of DSA params from a file and use those, but they +mostly seem like needless complications. + +Written by Jack Lloyd (lloyd@randombit.net), August 5, 2002 + Updated to use X.509 and PKCS #8 formats, October 21, 2002 + +This file is in the public domain +*/ + +#include +#include +#include +#include +#include +#include +using namespace Botan; + +#include + +int main(int argc, char* argv[]) + { + if(argc != 1 && argc != 2) + { + std::cout << "Usage: " << argv[0] << " [passphrase]" << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + std::ofstream priv("dsapriv.pem"); + std::ofstream pub("dsapub.pem"); + if(!priv || !pub) + { + std::cout << "Couldn't write output files" << std::endl; + return 1; + } + + try + { + AutoSeeded_RNG rng; + + DL_Group group(rng, DL_Group::DSA_Kosherizer, 2048, 256); + + DSA_PrivateKey key(rng, group); + + pub << X509::PEM_encode(key); + if(argc == 1) + priv << PKCS8::PEM_encode(key); + else + priv << PKCS8::PEM_encode(key, rng, argv[1]); + } + catch(std::exception& e) + { + std::cout << "Exception caught: " << e.what() << std::endl; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/dsa_sign.cpp b/src/libs/3rdparty/botan/doc/examples/dsa_sign.cpp new file mode 100644 index 00000000000..caf05031306 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/dsa_sign.cpp @@ -0,0 +1,83 @@ +/* +Decrypt an encrypted DSA private key. Then use that key to sign a message. + +Written by Jack Lloyd (lloyd@randombit.net), August 5, 2002 + Updated to use X.509 and PKCS #8 format keys, October 21, 2002 + +This file is in the public domain +*/ + +#include +#include +#include +#include +#include + +#include +#include +#include +using namespace Botan; + +const std::string SUFFIX = ".sig"; + +int main(int argc, char* argv[]) + { + if(argc != 4) + { + std::cout << "Usage: " << argv[0] << " keyfile messagefile passphrase" + << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + try { + std::string passphrase(argv[3]); + + std::ifstream message(argv[2]); + if(!message) + { + std::cout << "Couldn't read the message file." << std::endl; + return 1; + } + + std::string outfile = argv[2] + SUFFIX; + std::ofstream sigfile(outfile.c_str()); + if(!sigfile) + { + std::cout << "Couldn't write the signature to " + << outfile << std::endl; + return 1; + } + + AutoSeeded_RNG rng; + + std::auto_ptr key( + PKCS8::load_key(argv[1], rng, passphrase) + ); + + DSA_PrivateKey* dsakey = dynamic_cast(key.get()); + + if(!dsakey) + { + std::cout << "The loaded key is not a DSA key!\n"; + return 1; + } + + PK_Signer signer(*dsakey, get_emsa("EMSA1(SHA-1)")); + + DataSource_Stream in(message); + byte buf[4096] = { 0 }; + while(u32bit got = in.read(buf, sizeof(buf))) + signer.update(buf, got); + + Pipe pipe(new Base64_Encoder); + pipe.process_msg(signer.signature(rng)); + sigfile << pipe.read_all_as_string() << std::endl; + } + catch(std::exception& e) + { + std::cout << "Exception caught: " << e.what() << std::endl; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/dsa_ver.cpp b/src/libs/3rdparty/botan/doc/examples/dsa_ver.cpp new file mode 100644 index 00000000000..3b7ea0255fb --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/dsa_ver.cpp @@ -0,0 +1,92 @@ +/* +Grab an DSA public key from the file given as an argument, grab a signature +from another file, and verify the message (which, suprise, is also in a file). + +The signature format isn't particularly standard, but it's not bad. It's simply +the IEEE 1363 signature format, encoded into base64 with a trailing newline + +Written by Jack Lloyd (lloyd@randombit.net), August 5, 2002 + Updated to use X.509 format keys, October 21, 2002 + +This file is in the public domain +*/ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +using namespace Botan; + +SecureVector b64_decode(const std::string& in) + { + Pipe pipe(new Base64_Decoder); + pipe.process_msg(in); + return pipe.read_all(); + } + +int main(int argc, char* argv[]) + { + if(argc != 4) + { + std::cout << "Usage: " << argv[0] + << " keyfile messagefile sigfile" << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + std::ifstream message(argv[2]); + if(!message) + { + std::cout << "Couldn't read the message file." << std::endl; + return 1; + } + + std::ifstream sigfile(argv[3]); + if(!sigfile) + { + std::cout << "Couldn't read the signature file." << std::endl; + return 1; + } + + try { + std::string sigstr; + getline(sigfile, sigstr); + + std::auto_ptr key(X509::load_key(argv[1])); + DSA_PublicKey* dsakey = dynamic_cast(key.get()); + if(!dsakey) + { + std::cout << "The loaded key is not a DSA key!\n"; + return 1; + } + + SecureVector sig = b64_decode(sigstr); + + std::auto_ptr ver(get_pk_verifier(*dsakey, "EMSA1(SHA-1)")); + + DataSource_Stream in(message); + byte buf[4096] = { 0 }; + while(u32bit got = in.read(buf, sizeof(buf))) + ver->update(buf, got); + + bool ok = ver->check_signature(sig); + + if(ok) + std::cout << "Signature verified\n"; + else + std::cout << "Signature did NOT verify\n"; + } + catch(std::exception& e) + { + std::cout << "Exception caught: " << e.what() << std::endl; + return 1; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/eax_test.cpp b/src/libs/3rdparty/botan/doc/examples/eax_test.cpp new file mode 100644 index 00000000000..283e33501e0 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/eax_test.cpp @@ -0,0 +1,241 @@ +#include +#include +#include +#include + +#include +#include + +using namespace Botan; + +unsigned to_string(const std::string& s) + { + std::istringstream stream(s); + unsigned n; + stream >> n; + return n; + } + +std::string seq(unsigned n) + { + std::string s; + + for(unsigned i = 0; i != n; ++i) + { + unsigned char b = (i & 0xFF); + + const char bin2hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + + s += bin2hex[(b >> 4)]; + s += bin2hex[(b & 0x0f)]; + } + + return s; + } + +void eax_test(const std::string& algo, + const std::string& key_str, + const std::string& nonce_str, + const std::string& header_str, + const std::string& tag_str, + const std::string& plaintext_str, + const std::string& ciphertext) + { + /* + printf("EAX(algo=%s key=%s nonce=%s header=%s tag=%s pt=%s ct=%s)\n", + algo.c_str(), key_str.c_str(), nonce_str.c_str(), header_str.c_str(), tag_str.c_str(), + plaintext_str.c_str(), ciphertext.c_str()); + */ + + SymmetricKey key(key_str); + InitializationVector iv(nonce_str); + + EAX_Encryption* enc; + + Pipe pipe(new Hex_Decoder, + enc = new EAX_Encryption(get_block_cipher(algo)), + new Hex_Encoder); + + enc->set_key(key); + enc->set_iv(iv); + + OctetString header(header_str); + + enc->set_header(header.begin(), header.length()); + + pipe.start_msg(); + pipe.write(plaintext_str); + pipe.end_msg(); + + std::string out = pipe.read_all_as_string(); + + if(out != ciphertext + tag_str) + { + printf("BAD enc %s '%s' != '%s%s'\n", algo.c_str(), + out.c_str(), ciphertext.c_str(), tag_str.c_str()); + } + else + printf("OK enc %s\n", algo.c_str()); + + try + { + EAX_Decryption* dec; + Pipe pipe2(new Hex_Decoder, + dec = new EAX_Decryption(get_block_cipher(algo)), + new Hex_Encoder); + + dec->set_key(key); + dec->set_iv(iv); + + dec->set_header(header.begin(), header.length()); + + pipe2.start_msg(); + pipe2.write(ciphertext); + pipe2.write(tag_str); + pipe2.end_msg(); + + std::string out2 = pipe2.read_all_as_string(); + + if(out2 != plaintext_str) + { + printf("BAD decrypt %s '%s'\n", algo.c_str(), out2.c_str()); + } + else + printf("OK decrypt %s\n", algo.c_str()); + } + catch(std::exception& e) + { + printf("%s\n", e.what()); + } + + } + +std::pair translate_algo(const std::string& in) + { + if(in == "aes (16 byte key)") + return std::make_pair("AES-128", 16); + + if(in == "blowfish (8 byte key)") + return std::make_pair("Blowfish", 8); + + if(in == "rc2 (8 byte key)") + return std::make_pair("RC2", 8); + + if(in == "rc5 (8 byte key)") + return std::make_pair("RC5", 8); + + if(in == "rc6 (16 byte key)") + return std::make_pair("RC6", 16); + + if(in == "safer-sk128 (16 byte key)") + return std::make_pair("SAFER-SK(10)", 16); + + if(in == "twofish (16 byte key)") + return std::make_pair("Twofish", 16); + + if(in == "des (8 byte key)") + return std::make_pair("DES", 8); + + if(in == "3des (24 byte key)") + return std::make_pair("TripleDES", 24); + + // These 3 are disabled due to differences in base algorithm. + +#if 0 + // XTEA: LTC uses little endian, Botan (and Crypto++) use big-endian + // I swapped to LE in XTEA and the vectors did match + if(in == "xtea (16 byte key)") + return std::make_pair("XTEA", 16); + + // Skipjack: LTC uses big-endian, Botan (and Crypto++) use + // little-endian I am not sure if that was the full difference + // though, was unable to replicate LTC's EAX vectors with Skipjack + if(in == "skipjack (10 byte key)") + return std::make_pair("Skipjack", 10); + + // Noekeon: unknown cause, though LTC's lone test vector does not + // match Botan + + if(in == "noekeon (16 byte key)") + return std::make_pair("Noekeon", 16); + +#endif + + return std::make_pair("", 0); + } + +std::string rep(const std::string& s_in, unsigned n) + { + std::string s_out; + + for(unsigned i = 0; i != n; ++i) + s_out += s_in[i % s_in.size()]; + + return s_out; + } + +void run_tests(std::istream& in) + { + std::string algo; + std::string key; + + while(in.good()) + { + std::string line; + + std::getline(in, line); + + if(line == "") + continue; + + if(line.size() > 5 && line.substr(0, 4) == "EAX-") + { + std::pair name_and_keylen = + translate_algo(line.substr(4)); + + algo = name_and_keylen.first; + key = seq(name_and_keylen.second); + } + else if(algo != "") + { + boost::regex vec_regex("^([ 0-9]{3}): (.*), (.*)$"); + + boost::smatch what; + + if(boost::regex_match(line, what, vec_regex, boost::match_extra)) + { + unsigned n = to_string(what[1]); + std::string ciphertext = what[2]; + std::string tag = what[3]; + + std::string plaintext = seq(n); + std::string header = seq(n); + std::string nonce = seq(n); + + eax_test(algo, key, nonce, header, tag, + plaintext, ciphertext); + + key = rep(tag, key.size()); // repeat as needed + } + } + } + + + } + +int main() + { + std::ifstream in("eax_tv.txt"); + + Botan::LibraryInitializer init; + + if(!in) + { + std::cerr << "Couldn't read input file\n"; + return 1; + } + + run_tests(in); + + } diff --git a/src/libs/3rdparty/botan/doc/examples/eax_tv.txt b/src/libs/3rdparty/botan/doc/examples/eax_tv.txt new file mode 100644 index 00000000000..95cd7c1ab7d --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/eax_tv.txt @@ -0,0 +1,461 @@ +EAX Test Vectors. Uses the 00010203...NN-1 pattern for header/nonce/plaintext/key. The outputs +are of the form ciphertext,tag for a given NN. The key for step N>1 is the tag of the previous +step repeated sufficiently. + +EAX-aes (16 byte key) + 0: , 9AD07E7DBFF301F505DE596B9615DFFF + 1: 47, 57C4AC75A42D05260AFA093ACD4499ED + 2: C4E2, 26C5AB00325306772E6F6E4C8093F3D2 + 3: 16177B, 852260F91F27898D4FC176E311F6E1D1 + 4: F09F68BE, 700766CA231643B5D60C3B91B1B700C1 + 5: 8472705EDF, AC4C3359326EEA4CF71FC03E0E0292F2 + 6: 14C25EB5FD0D, 8DBD749CA79CCF11C1B370F8C975858C + 7: F6A37F60670A85, AFBD1D5921557187504ADE61014C9622 + 8: 1AACFEAE8FBAD833, 82F477325D6F76BB81940AE25F9801C2 + 9: 069414324EC293697C, B980E21C09CA129B69E9032D980A9DC5 + 10: D8174DE9A2FC92B7DA9C, 1E42CC58BA2C8BFD83806444EA29DB61 + 11: 2C087DEA30F8B7EE510990, 83DB400A080C4D43CAA6EC3F1085A923 + 12: F36B93C272A703D3422C6A11, 1370C3AF2F3392916364BBBCC2C62EC1 + 13: A0F33477BAE2E28E6747AA3193, B626DC719528CAC65DB0EF94E35422CE + 14: FCF5193506052E8BFA095C1A5205, F5BD02E0B3C91CC7D6FAAA8A9A76CE6A + 15: 3797D7F8599B8EEAB39C56241880DC, 0B70003E77146B903F06EF294FECD517 + 16: C4BAD0E0356FFD369110C048D45D81BE, DE7C2B1D83BE2CC8EA402ABE1038BB79 + 17: AF5C358BD31CDCAC2F0EA5252F1C3BE1E4, 2D700986F93B22DFE6695C2A243B4E42 + 18: 7DEF9056FBDAF491D7206B26B19DEF617AA1, E71A7D00BE972D85C77931D7591B2151 + 19: 6E9B2C0A90BF9D38A6EA3B5D2B9B2D97F938EB, 5B483D7F15C39602C2918181E57DA341 + 20: 7C5F68DEE9BBA3B04F11D5FC7C9C7FE6E8B5025C, 0AE6A12D37A9C10BB1A494E16705DC05 + 21: AF0A886BF673BC72045FC074F06A0176C96105E2E6, 06B2DC9A2868C23F86D710E01E37E07B + 22: 5F228A986DFE4301EDBAF07A02E114F1B30932995CD1, 74EBF68627C78B1FD024A59B56B2A8FA + 23: 911322F60555118CBECD8DD82F186AC19514316E8D48BA, B6A8BAF2F175CD0C71B63B1EF37E185E + 24: E7F52730CFB808EFDB376A5D5DF31A7EF8292DC5FC37E9BC, BA2AD158A2D2E5CE01296402B592E1DB + 25: B3F8D7CA47D8D86E94D670AFBAFA3B8D9E186C97DC029D4705, 709D2D2B9975D4729C19D4EAC430E65E + 26: 7178FEC027AFADDC2C03518E75CF34D207CAC2EB1537A0DBA520, A315F034CE5E66601444402520F55DE2 + 27: FC230B2B8522F53459D0B968421469BBA7E683ACB0190393B2870F, 48679A78E470E175CF3D3E9B46CEDFCE + 28: 35A641127C78C721ECDC50866C21637FDC9515E41CE60F09015EA713, 0062987222F6412B7AAF8A9ABF6FBF98 + 29: 3D42D6C113421743C08A6F682CFA0E517D5531BB66241C02EC4DCC26F7, B1AAFE11FA2D6E0C870177DDD7F98FF0 + 30: DAD065B4669B7C59C8392D8E7BD7E64BC01CEFFF27E335B25A328D356F0E, 8973B9B9ECF26DAB58CCF0787EE928E5 + 31: EBE626F9E241FD233D9781C359430C982667AA26921B62E98FAEC502C01B0B, 2AC0D7052A2CDCCE8E26FEA7595198AA + 32: 64D842B66796A797C2B4C6905742FDF2148FFC445E192F9E03B53810C082F788, 9778B345EC12D222DCC6DBABD2651750 + +EAX-blowfish (8 byte key) + 0: , D8C4C23A6AC0B7B7 + 1: 2A, 5E0E4BDDB60772FB + 2: 7695, 7581B16CCC9C45F1 + 3: EB14C8, 6223A121CFA216C7 + 4: 5A5C809C, 4A47658796337D6A + 5: 8BC2041181, E1FBA8DBA00571FC + 6: 89C666F015FA, 2B4A76A0E699FCFE + 7: 86C1FA92484AF6, 31B3B738A261D6F5 + 8: D1F401C145C9328B, 4C4A045EB489F59C + 9: 70C9C7753698324A73, AB298B5B20567EB4 + 10: A50D9D88DC101B6DC8D2, 529DFCBFD13B8E6C + 11: 7CC2885C2BE79C44F28FF2, 566255022B40C81C + 12: 6902D58347C29250EE07981C, 34619AF18E14C690 + 13: AB6C3C4AD3EC45143392B642DA, E6D2DD323DA175BB + 14: 7065B28BA8AB67B2FB7B6D5E3FAF, AEDCAA54F4B0772F + 15: CBBA14A74AD4ADC0EF036EDAE42D51, F2BFFA4D81BAC034 + 16: 60A315193F58144F5701D547C79FEEED, 912FDBDB05467DF5 + +EAX-xtea (16 byte key) + 0: , 86881D824E3BC561 + 1: EE, 4C3505F04611D9C2 + 2: 80C8, 6A3428BEEAD60738 + 3: BF88E7, 04F1E99E9F5906C2 + 4: E06574B7, 33B0153AAEF9776F + 5: 42D950AF63, 4A0F415640322FDF + 6: C30F6AD46EC9, 9646FE909D2B95CB + 7: A0049FCA856A14, A0257289C6BBF278 + 8: 2814B0C1358440E0, C4B0A2354925E887 + 9: BF4F062B52C1E489CF, B56442A3CA57A041 + 10: 63DF433956831B8780FC, ADF9ED0B46DCA19E + 11: C317FD079817F50E0E8A16, 2EA0EC993FC603AE + 12: 2BD12FDDD81EB11660346D2A, FBC6F69125BBA88D + 13: 85D356536FE2843C6BBE60EDBC, BB2FEFD04F230E79 + 14: 22493009DB01B4746F4927A8C4FB, 64CC08471D93C9AC + 15: C0F3C0DB08DC93FBA725D1E02DE084, 77B762213DDCCFFE + 16: 568B66D3112556BD98FF9339E9C002E5, C8355F508219FE0C + +EAX-rc5 (8 byte key) + 0: , 169C7954341EF44D + 1: 22, DABFDA9A0B0BA067 + 2: 2E54, 6A3D6D9AA5877C5A + 3: 2A6ECF, 2A34A3AF5DE8919E + 4: 9CC5F84F, D3F673EDAF75E3B5 + 5: FF5611756C, CC647FAAC8D49BF1 + 6: 74C939BEB31C, C335999CCFE8F5FA + 7: 7976B6F7709B5F, 2A7969C5FD063A88 + 8: 421EEC5022276174, 2C9BFB1EAC3C54A2 + 9: 6A4761CD266B1C0ECB, 3EA3CCEBC85FAC4E + 10: 7C09201098E764239A2E, 8043ABA9BF4D5AEE + 11: 8CE26277562F646DE33C88, D72AED48895E3B40 + 12: 52150F44D37D121560DA87F6, 58E865E22B485906 + 13: BA0A73B45F93ECFBFC3AB3D8D0, 683D52FA47FB1A52 + 14: 96546CBE01054AD24CC95DB54724, D80D0D530E5D1DDE + 15: 61E654BB18CD26FC36C09F874DC2C7, C65884CB9D9FEC1E + 16: 1D77B8BF02CDEAB4A707C07628826D5B, F18D1730C3D64701 + +EAX-rc6 (16 byte key) + 0: , 1DF8B0B92A3F0C951C425AF4830E63FD + 1: 1A, 8A2959EBBE90180999994DEB7036DB85 + 2: 435D, 7EF00CB57DB7B4155DB530D75CE6B025 + 3: 08A6CF, 2ED6AF0F2D5BAB05F623D389480A01F2 + 4: A86E54D3, FC69547C8BD922A5BF2F7B26C4D20F98 + 5: ED0822E439, 0007A3C6DEFC6C912C0E5B853B520368 + 6: 7BEFC7FD4054, D32C43A4D1086D57C5BCFAEE04EBC600 + 7: 5235E58E79287C, A27E9C781327C0FC7C55410EB0C828A9 + 8: CEB5EE99BE521F4D, 547F46383987F2A3582A81A3BCF9B280 + 9: 0358B063D5F99C3770, C0A73730512CDA6AD49599775D59EDA1 + 10: 434B9AEE07DFADD0A332, 499BD88881E558E09A8E822BE27D2496 + 11: D47849E650F350BB622D74, 638E37A84E7FAAF8F5D77F1B061773DC + 12: 814592F568284085E79A024B, 9EB1405E8422FE50BC0D88D837A2C650 + 13: 6F2B55EC91B591082053AF692E, C48F91EF01AA43A1EE3B36D233DDD48B + 14: 506CBDD2901838EE2F178B6953DA, 03778957F536509BFCA577B23A18F726 + 15: 446EE435D3D1848B51BB8C5F7BE4A1, 1129EAEAADE534940546D43242A4C839 + 16: FB9D2B150C42465B1685D8F069CC06DB, 41E2940F5DC63CB4E2FBEC25ED8A31E6 + 17: 9684F683260107BE8FEBBEE1D3EEDAA7BD, BAE7C116F7FF96631F4ACEE95C65CEF3 + 18: 5082B1FE48CD3AB58F63C2DCFDD4069AC736, 19AC7B8EE315CBB7131A283851B32266 + 19: 8C72AE495B6F003A3C784D144E84E88885F78E, FA4CEC023740A8D670E351FBCF62C1CB + 20: 815D6361C7AE34C9D796ADF9C71ABC46AEF88BC9, 9A1F7288C61A6623B9A82748137ED7CC + 21: 904A853E2E96BD2B85AAB3F5DFB900E9B3642EE667, 9AA90DBDD461CAD20495DCFBCB513DD2 + 22: 79D738A462F727B3D3C529ED999B6FDCCD991D1C5A4D, BF0987BEDDE650D73CAE7D380FED3431 + 23: B2DEFDB7D503A84E83155A04B8DE8C8DBB68C2FC475007, B7CE900CF43CD518024123C76F6DA328 + 24: 9E723E15439E12F6C46DF8A309AE1E97B6FD18436259CFB0, DF8B6E1E23512CC4CF5FF531A1908F69 + 25: A7F0AD03CEBCC9202718AA164886E1026975306A664C5AC7A9, 4A771BF8B9A4325705C85E5499FD98E9 + 26: A53A92AD1C6835F28E04EF591E783D36F3D76E489B31B87BEB7A, AA263B52A6E6A043DE4D7029D4DC73F5 + 27: 79BE3C38291A7F77E932C8A9DEAC08DE6442EA9B3895B101A14E7B, 33B84DE06342E675E019CD0237292ED0 + 28: FA108123C5A69571CFDFE8C3D00535121FDE3096DDC0D700F8F26A5A, 764025D7CA1A3F2C54D28956423B0C77 + 29: 36EC2D67FD977BD2B73DB6D8EB756B3EADA13690E1B6DFC12A4781B34B, 4BC6B38DE3B02283D92F4DF19A5C48C5 + 30: 96D3243C945905C9732B5927E46F00886D511463B38C86002FC26B65AB8C, 5B5511CDEC35687AB8425AB22D58B4F1 + 31: 9CF83B87BEA3374AF7722E999863E3DABB858B0383383EAC7757F5B80FD44B, 1E0CBC961940FDA93B73A92DACFD67F3 + 32: CE3BC3C9FA5EF4AFE5272B3EDD24B1B003FED2C2E501528CFF44D3FABFF52CB4, DC94FDDC78AAB2B7CAA1E1EF149AC355 + +EAX-safer+ (16 byte key) + 0: , B120C7B37450C46189712E4DFD1F0C44 + 1: CA, 82BA1869C5FF1EF2A4F6ADC1E7DC1F1D + 2: DD20, 6BD5601B16C9943A84AC1F99A176E6D1 + 3: C1C09F, 0911DC63AA414C004E2BD825BECDC93B + 4: 27E43F59, BD858F084B082F76814DC385E1FB20D1 + 5: 2A9A92F246, 5ADC4A32491934AC0BD00FCE686B26F1 + 6: 52C78C0CD6F4, F35886F46C03EDCA10B3D01CF07B1E0A + 7: 23E0D3CED3795F, FE33D96FC98B78A30C0A412C60E93992 + 8: CD3FC9961559F239, 9982364A61609FC41068260267231EE9 + 9: 6EA46CB7AD7505C1BC, BB15053EF0F78B9091B3064118F3E9BF + 10: 05D9BA230A56CCA0703A, 1338E68E3DC992B6EB2685C668E75869 + 11: 7AAD6049DFDCA6771AE42B, 35267E431051E1812495615324C4CBE6 + 12: 8695091532B83B23C296F620, 7B2EEA861E9A91E6B6A911E10FC3FDD1 + 13: D909DA4BC7372ACAEA78E6A0EE, EA6C1CD16180DF0B07F4E204A4B4FACB + 14: 7DEC8443600D0563AEFE87A2064F, DA454728069B3B409889664783588189 + 15: C042FE656742CD2FE5D9C212D18C6C, 5929E4AECC2CA047BAE948E7023FE4D0 + 16: 0B84D3CF59EEF7319633F4A397D47CF8, 31F892FFDB7535DF5D9143456E404163 + 17: 8C9E57AAFA7969B142742B63AB73286600, C418231C44F96660DDBA8C26B3BB3681 + 18: E9EED66D370A3A6A39C7E0E570D96F807EAC, A4AFE8D1D3C31B956A3BDBD043E7A665 + 19: 1A5D47992DA5597D1449B4C8DD47B7404C7657, F3ECEE5182014FC3365FDBC4C33CC06A + 20: E7C7945FD1AFD3F5DCE666D8A5A2E8A3C11A7A5F, 86D78B2FBA7597B8806BED505B52BDF6 + 21: 9E2165B47B29CBC4ACD50660E011D691F061209969, E9B1E860BD02085177E1A94E1EE6F3F0 + 22: 48EA2945C8DD3FE09407BAC8973A861DB15B788C8FFD, 502926712EDB1B3DD13806052C6C75D7 + 23: F37D46B35B60819EA52B00457D79155C04B55972D0DFA9, BB2B7D210BF0570F422640BF81F39B9E + 24: 12E85C0C78227205CC682360C79E35BF58EC6551CF8FE2D0, 042990D7A58D458C570A15DD375DB4E7 + 25: 4F6C15109DE980DD14A7F4C27F48671E4787C53A564232F427, B097A5990D8067DD89C21473150C070F + 26: AAC472E49DB101B564A8A01E2C80C0C6AE9065D332C2DE79FAB6, ACDD587A7DB86542E195DF73AF1C1CBC + 27: B9912CE18019C31692A1F7E11D9CCB20297ACCB9DC62C47C01D2C2, B0ACBF028CA5B15E0035D2EB8CA916BE + 28: B4F2B1FE14A1ECDC9C8EA1A0120395E6ED1E69D3FC85DD0F3F90F350, 9A561EBC769369B95B9CB74FC6AC27D3 + 29: 3FE397C8AD02689B7437A37861F0907AF1F6014A293B46419348771C5A, 6B7BEB9BD5018FECD71BE5081C7C2544 + 30: 5019089142199F7207E1B7731B8B247A18A685B231499DF12A73F5D67D37, 307E93446777005BA1B088F178A0DB6E + 31: EAE8F9F02F8DB3D70B78B08CFB0949D99F1A86C958A8E3823736BCEAB86BE1, 6C94F48591C18BF9C450515B73379973 + 32: B9C795F7A87305B4AD36DBA10B3B1C70B329D29E49C8C6A932D96A74334AEE4A, D18E6E233FEFD6E5C7148BDC1504299C + +EAX-twofish (16 byte key) + 0: , DB0C02CB069E3773296D3BD4A87A381B + 1: 99, 7D21D19E9C440F68E99F1F2EA2668694 + 2: 0696, EA590EC417C88E23FD23917F9ECFB0C6 + 3: B9B082, 82D4C9B68DDB02C906496413E13A2D68 + 4: D6B29D74, 5BCE5CA4F662E883BF7FCAAE5FB2CE01 + 5: A59C9CB009, CBFB04226D1029A7EC9D64A48A6729BE + 6: F4924FE3E355, 3D85B3900DECA0528C815F1447A1F209 + 7: 679C88D52FB519, 931C7A863C3701D8015FDBD8696C6C30 + 8: 26DA41C0D115375E, 7627E23E791A4DCB0FA5ED71B1ED2288 + 9: 8FEC6EB7016AD2B178, F65ED0286A724F0CB2EA317D5022B0D8 + 10: B5F22415B1334133C531, 87C4F3A8991BBB85984BC4D3305A5CF1 + 11: 23E1D0ED2E820AFE7DA2FE, 100499F1093FAB2ECF73B643594E98E3 + 12: 79519ABA91F46B8DAD6D5335, FBDCD1FCDB20AB99135F28A714C6992F + 13: 5968D0B4198A0AAD3D0395018F, 781F22E2DA98F83398FCF911B2010057 + 14: 4E55B14432B601E3EF2EF567CB15, 8BF6E53D7657E56EA3DA1BFD9C9EC06E + 15: 6ED89651CE19B3DD1EE5C8780B5015, 131CFD657D32D4E1B35140ADDCA0E13A + 16: 2295A968B4D072D12757756247554850, F35FAC95C2AA4155450EAAA6E2E789B5 + 17: F9B2AA2AA502EA79BBA0C5EAD932B8E1EE, 0ED81AA40B9BF39A9AAEDDDB7A04BEA6 + 18: 385055F1C1C26C0472A504B4CD225DCA55FE, 24831680B56368231AC54227D737F582 + 19: 771529585C741A3F8B1C973709892F255A99EE, 2A132B4BF96FD5109DB04459103F5E84 + 20: E7A2197D9FAA8AB8B303B5EC71AE34AD5EC5DD66, CCAB6518371EC8E0A9E9EE4F7CA5878B + 21: 279E54F755EAC6B57375B9EC4406E43DB3139D740C, 7B6F26F2C0ECC9F2DF4EDD7513E6E0B7 + 22: 27816AA94CBA2BF98E49E595AF5B3FAD12BF1D6F1AC6, D04876C5492D275F15C834E3CF794F0E + 23: B5658DC148855F68B282211D879F688F3C142FE555CF81, 4539CDA8A65DB9047AAD76B421B81120 + 24: 72F0BD4F939C2C9B4FA734DCB0AE4FB9BD342BC8459ED2FE, CEA8469BC0457EBF3418C1114288C904 + 25: 70568245E6E6BD5D11AD0C74030D7AE08BA05057DEA0FBF4AD, 71554FDE6B87477A51EE4499D78783D2 + 26: 8702D35BE07D7ADF70684046CC6C72FBBBF821E0BBCCBC973601, 33CC6FBFDA15E306919E0C3BB2E22BB6 + 27: 0BA23F4A6174165D4A8BA80B7C875340B0F8B2A6967D34E106BC22, 00E6679496714236EECEC84B9AF3072E + 28: B9E25ABA84C6BD95B5149E7616FE2E1D6FAACEAAD77A636C60279176, 8D8AD0B9D4C709E1DA370EE01611482A + 29: 74759711F6D542581F9F83498FB616638D092732BA07109BF4B5BE045C, 71A40DC777BD09F75362F7B20E0B7576 + 30: ADBF7E98926484BA2C7F6CD7CD9734FC19265F68AF3BFCAEB025F6296E37, 8DF15B5F69B67F7DABE44E3666B55047 + 31: 2DC26D449379997D110309B2A0DC2760FCE8CADB4B14ED580F86C70F69C9BA, EFCB60EB2B25737E256BC76700B198EF + 32: 2B1890EB9FC0B8293E45D42D2126F4072754AA54E220C853C5F20FBA86BE0795, 1A1B15BBC287372FB9AF035FB124B6A1 + +EAX-safer-k64 (8 byte key) + 0: , 9065118C8F6F7842 + 1: A1, 1926B3F5112C33BA + 2: 2E9A, 5FA6078A0AA7B7C8 + 3: 56FCE2, 984E385F9441FEC8 + 4: C33ACE8A, 24AC1CBBCCD0D00A + 5: 24307E196B, DD2D52EFCA571B68 + 6: 31471EAA5155, EB41C2B36FAAA774 + 7: 03D397F6CFFF62, 7DFBC8485C8B169B + 8: 8FA39E282C21B5B2, 2C7EC769966B36D7 + 9: FEA5402D9A8BE34946, A058E165B5FFB556 + 10: 6CDEF76554CA845193F0, FED516001FFE039A + 11: DC50D19E98463543D94820, 8F9CCF32394498A1 + 12: 42D8DC34F1974FB4EB2535D7, 77F648526BCBB5AF + 13: B75F1299EF6211A6318F6A8EAA, C5086AEA1BE7640B + 14: 1E28D68373330829DD1FFC5D083E, 33EDA06A7B5929A2 + 15: 85529CF87C4706751B0D47CC89CEA6, D031905D6141CBED + 16: FE5CB61BAF93B30ED3C296EE85F51864, CC484888F0ABD922 + +EAX-safer-sk64 (8 byte key) + 0: , 5254AB3079CDCB78 + 1: 75, 798DCF14FEF8F4D1 + 2: 0300, D5FCA75DAC97849C + 3: 520F98, 10E357957CE20898 + 4: 80E2764D, 5C7F46656C6A46EA + 5: C48960CDAA, 3CCF44BD41F01CA8 + 6: E0E60BD9AA2C, EBB493983FCEE79D + 7: D13D8804906A1B, 6EDDCA919978F0B6 + 8: B7AE14C37A343BFB, 2369E38A9B686747 + 9: 5DE326BBCC7D0D35E9, 041E5EE8568E941C + 10: 13494F5B0635BA3D6E53, EAEEA8AFA55141DD + 11: A9BB35B14C831FDA0D83F7, 4002A696F1363987 + 12: E242043A1C355409819FABFC, 63A085B8886C5FDC + 13: 204598B889272C6FE694BDBB4D, 194A1530138EFECE + 14: EE3F39E0823A82615679C664DEBF, 1EFF8134C8BEFB3A + 15: 8579D87FD3B5E2780BC229665F1D1B, A832CD3E1C1C2289 + 16: 74D7290D72DA67C4A9EAD434AE3A0A85, 96BAA615A5253CB5 + +EAX-safer-k128 (16 byte key) + 0: , 7E32E3F943777EE7 + 1: D1, BA00336F561731A7 + 2: F6D7, 8E3862846CD1F482 + 3: 5323B5, BD1B8C27B061969B + 4: A3EC3416, 170BBB9CE17D1D62 + 5: 0C74D66716, 7BD024B890C5CE01 + 6: 6158A630EB37, B5C5BD0652ACB712 + 7: 17F2D0E019947D, F9FF81E2638EC21C + 8: 68E135CC154509C8, AA9EAEF8426886AA + 9: EDB1ABE0B486749C21, 355C99E4651C0400 + 10: DB0C30E9367A72E8F5B2, 631B5671B8A1DB9A + 11: D4E5453D9A4C9DB5170FCE, 75A2DF0042E14D82 + 12: 3F429CC9A550CBDA44107AA7, 2C2977EA13FEBD45 + 13: A7CA22A97C2361171B415E7083, BFE81185F31727A8 + 14: 170F79D8B0E3F77299C44208C5B1, D5ED9F9459DF9C22 + 15: 2E24312D2AE5D5F09D5410900A4BBA, 2FC865CA96EA5A7E + 16: 8F3C49A316BA27067FF2C6D99EC8C846, 9D840F40CDB62E4B + +EAX-safer-sk128 (16 byte key) + 0: , 22D90A75BBA5F298 + 1: 3F, 98C31AB2DE61DE82 + 2: 584D, F4701D4A1A09928C + 3: B9DEAD, 6E221A98505153DA + 4: 06D4A6EB, 0E57C51B96BA13B6 + 5: 7B58B441CA, E28CCF271F5D0A29 + 6: 7950E0D1EC24, 2ACDDE6E38180C07 + 7: 65A4F4E098D7C6, 7DC1C9E9602BACF2 + 8: FEBE4E72BAA0848F, C4607EA3F138BAD9 + 9: 9B7BD6D6D655985AA3, 8B2C58A9530EA6AC + 10: 60C92F925D1478470203, 51E6F5F6DC996F84 + 11: 7B40769370E651F64AA654, 74F1F8A8D3F4B9AF + 12: 7215832C2FB9C54DF7A9C686, 9BF9AEF14F9151D1 + 13: AD0F9C79008572AB8AE2466EFF, F375D0583D921B69 + 14: C05076E2C330A0D25D7CEC80597F, 843C12F84B00A8E0 + 15: D18F0563AB0278140B0CD9A9B07B34, 262B1688E16A171E + 16: 650747091F5C532EE37D2D78EE1EC605, 1BAC36144F9A0E8D + +EAX-rc2 (8 byte key) + 0: , D6CC8632EEE0F46B + 1: 4C, EA19572CB8970CB4 + 2: 5537, 3EDD3253F6D0C1A8 + 3: 206FA6, 20FA88F03F240D31 + 4: 17EE8B40, 702E8194F1FCBFDE + 5: 2A89287136, 31C5534786E15FB3 + 6: 3A6AEDC7066B, 3C663A4081E1D243 + 7: 8BC5203947A644, 6AAC806C92BFBD6E + 8: 2E0274BBE14D21A3, CEB0E0CB73C3664C + 9: 9C4B292B0CF17E3A29, F23CD535559023EC + 10: 8E322734308F85662877, 46363D7EFC322821 + 11: C413C405767FF5F98E3667, E7BA35D8F3678E7E + 12: D77806B7A218098B1569EADC, BA67C306E5C0181B + 13: 4BE5EF74F9E9799A4D636FEA9F, 4C511C44ADBA4030 + 14: 7E19969170C2C8D8AEBA8C7FBC2C, 54CC6D466A2DF6DA + 15: 2EF1CEDC1DD3403CF440FC5561BE33, 61C6FB277E93701F + 16: DE052719153EBACE9D7B19F52AC4282F, 4AC2A96F2FA8634C + +EAX-des (8 byte key) + 0: , 44048B7F240B6F5F + 1: 0A, 37009B7D4E09953A + 2: 03BA, BFD2FD7758961728 + 3: 37EE10, 16A6AF96DE888A19 + 4: 07F44290, 100CA84AA0EDAA1D + 5: 389EF0023B, 9614FB800A533268 + 6: 3F4DBA8AA01C, EFA6B55B7ED5E40F + 7: 8C7B837896EAE7, C113CE8F664CE3D4 + 8: 7011D993D8EDB0C7, B4C370A919F60497 + 9: 0DEB30A31351B13D7B, 00ABC82DC5F3A1AF + 10: 8D3897B2CBE323D6EE1C, 7A2D15627CA1441B + 11: DBC002C817DEBFB419F94B, D8EB87F86D6ACDEF + 12: 17048E2976FA85AA849E9A80, 229FCD1C9D1E3B9C + 13: 30B989EF646544885A478AC198, C1B7EB4F799105C8 + 14: 5C2E12A7F118A08D6FD585F9C839, C358679FEE6FE7D7 + 15: 8D1A1E888BBB8648E638C4E74E11B8, 685E006C441448B8 + 16: 93AE906B8BE4EAC8ED6D8F48F04A7AFF, 71DD7AF752FE28FB + +EAX-3des (24 byte key) + 0: , 8914311BB990B725 + 1: D8, 2094EDC5D03E54B1 + 2: FEE5, 781CFB0EBE3895CA + 3: DECF5E, 59918E8A5C4B459B + 4: BD583AAD, 2013BEEBEEA795A1 + 5: 2BC01C6C78, 0B1134DBBEAB5D3F + 6: 4D5EAF01A895, AB4D17516ECBA50A + 7: AF229F90614480, D3113C0A9D133CD4 + 8: BCA6F375DF4568E0, 8E9EAEC8E77786BC + 9: 575F34219E6DD8DB4C, B40C75139E5D1860 + 10: A199B8AC433B615EC96F, 774AF803698ADE3D + 11: 718A2975DD9A872A68AE10, 3B9460F849CBA7FB + 12: AB38E148180F6E2FFBB96F91, E3EE3B8FC50DADBC + 13: EB10E0233507459D4A6C29EE80, 8D90B46BB1EAB27E + 14: EB48559C320DFB056C37458E19B5, 9315F0C4AF8500EB + 15: 9E8C73EADA105749B5D8D97392EDC3, 2E749EE66C1E6A16 + 16: 600FA4149AF252C87B828C780AEFF8BC, 33D7D11DCDC19936 + +EAX-cast5 (8 byte key) + 0: , 382FB8F7E9F69FDC + 1: 99, 20DA959849B3F7AB + 2: C54B, D05547C6AFA3484A + 3: 579836, AAA92B2321FC50C5 + 4: FEB7AE55, 639EDF01C4FB965D + 5: EA8A6023FA, 01274B3ED5CE102C + 6: B7C4E995121F, 712BFE27CAFF6DDE + 7: F44236660B0004, FAC51D1DF8EC7093 + 8: 01CD7E3D0BF29E8A, 049C47A45D868D0B + 9: DAB170493DFD6E0365, 6F3AEDD9A3ECF4FD + 10: 82C9EEC4803D9CD11FA8, 32683C0A9128C6EA + 11: 324AC59E87B244ECE0F32F, F6B095AAB49353CF + 12: DBDDAB11D02C9CA5843C406E, EA728FC46DDD3B04 + 13: D67376C2A4AD92E7DD80E39303, CAF72B7E7C237EB3 + 14: F2B9BBEF08036C2982C6DDD06918, 70A29D780C22752C + 15: 96E3D9141F8EBF520540C2BC9A9C23, CEFC86A1CD48203D + 16: 70CABBA983179106AE7FCD5F1F31D5C3, BF7F9168F4F82F56 + +EAX-noekeon (16 byte key) + 0: , 556805EEA595CFB9A30FAD196103D7FD + 1: F5, 0A7DAEDFB656526CEF4DDBA8087A227A + 2: 7B8C, 249895D79962D5B4D18FE07366281B72 + 3: ACFF15, DCC489D24832EB106F576AE6B6EB957A + 4: 08ADE7DB, 0D3215999E9960EDAB29B78744C7F139 + 5: 66139213F6, 505E1E7141D043E903C26EE0959EEECD + 6: 078B79F880A8, 35B7EB326A55E50332866EEDB682EC20 + 7: 2809E34D9667D4, FFDEC555F68524A09A6ABACA372077D9 + 8: 93D267DE1EC635D3, 4FF3561990A56E4B374618722EF850FF + 9: F377A4D93FF32F4A51, 91D4070423A90FC54D305169C03F49ED + 10: 6244B717E082993EB7A1, 2E3A8A354AFA9473667ED7FDD46BE9FC + 11: E917559625D25E6E5F2EDA, 19295C37A70314CC9A1D11FDE8D23C92 + 12: 1E6DF2EE112A893AB14DFA92, 12C4A89D4CD65F8116A03A135AFD3701 + 13: 47B18CD762E011770E203CF605, 434909A97E118B20D3AEDC79AFE33A9E + 14: 72D9A1A7DA6F33D5E0B927F9F32C, 779C23714FCAA2B2321EC7FB5B03E222 + 15: DA8B830FFCB3DB274807F780D33240, EDC2F1C8A401F328A53392597730B007 + 16: B53DD2BB840AD933D36A7B5FFDCCFBBB, 4EC0E6D1F916BF633869239B672B37A1 + 17: 42936BB9A936C30408660855F4F47F3314, F0DAA6DDA15585E1697ABBB4790B15B5 + 18: 00372E47F5BA016F1B2A1E680B76AB02052A, CDBF3D241BF7FF96D3DFBEDDB872E901 + 19: 8AA236B0C8BEF6F67A97C2DF90628F6E5838FF, 731DCD61F7F26004C03519F9500EA824 + 20: 55338647812FC9D86CBDDCED7120268A4D43F8BA, 0E61B3C835CAD95FD49FEF002C014E72 + 21: 435820B28E52154B47A04D5E635D8FE37FA47FC985, F6A96DCE4917E8D7C610923627E80970 + 22: 0D30C15B6FEB4A48B14DD15D41A4B25D442AA677B25C, 28E15CCB74AE992C68BDDC8D87802050 + 23: D9D701F9AD6B0E13D2CDDA15A5194E7CE8BD2C02137391, 2DB9A15884E9C996C3D6B5BDA44B9598 + 24: E2390AC5CE10CCFBC72106A52C7F180CB477E3C193CBACA8, 22D3F7DCD6947EA4E78DF57A8E1A9A59 + 25: ADEFB7D9500658D34996AF6BE6336CD78891064EA1DB8E9785, F239D67D039A15C620A7CD4BE4796B3F + 26: 89964C90ABF54A6DF9F13C3681E70C702D80A17BE79F8160F30E, 6336F729ECE1ED7368669D75B7E2DCBA + 27: 576B2813CECDA4F905BD5D58349EF070FF41B7EB6BB2B01B061B0B, 125324CBF2ACF1011A44A99A11EC8AFC + 28: 430B957481748519A60494F0B5F698F34B1A8235B00AC0D1F0A4442E, 1E80A7FCEBBB8E1E12D6831906154485 + 29: E781BFE5FCDE0BFC056CC86C4A0B9DD3B815BE8CA678204CF47289B5B5, 190D5AAA9EC1CB4CC86FACE53BF1201B + 30: 78BFAC07A9B7B2AE9329BF9F9BF18A1A49DD9587001EFCA00E9AD9752764, 4FB5ECBEEB0995C150EBC66508FA19C1 + 31: 7D6C20694109DE21F7955855A8FF832347518DD496C2A114DF142C68ACDEAA, B25D4BB34056DC091A7A3950D46C32EC + 32: 3E1E4395DEC1AFEA9212B95F37E679B6E2D14DF23C5DE49018C2C8038CC4AD45, 9A6DE7BD41A21918AD504490EF4E581D + +EAX-skipjack (10 byte key) + 0: , 85F74B6AFFB10ACD + 1: 3F, 604DF8BDD98A0B3F + 2: EA87, 792374FE07588BF9 + 3: 0169CA, 489AB8AF69DA3306 + 4: A7AC3EB1, 428DAF508E24B583 + 5: AA9028D5B3, C0A44EDA71FB2C86 + 6: DA97BA88A061, DA2EC34077F42585 + 7: 7E25FAA41CEBC8, 36D4987551E06D5B + 8: F662DA6C9001CBFE, B7DEF76680C316A9 + 9: 6D3F73EC716E1DA897, 5F0F83BAE4D3513B + 10: 2A300F585BEE9C889743, F4756C24DEB72A9C + 11: 80518B010DD77C82D19106, 50FF5CAA365F4A70 + 12: 6E579A2173C861B6F37B4CD3, 81E3E5ABBA8F0292 + 13: 5B04829880A72C38871C7021F3, 6B26F463708A3294 + 14: 934177878E9A9A9FB4DEB3895922, EBC1C32F0A2A3E96 + 15: 07AF486D1C458AAB2DBF13C3243FAD, 87288E41A9E64089 + 16: 84059283DF9A2A8563E7AF69235F26DF, 351652A0DBCE9D6E + +EAX-anubis (16 byte key) + 0: , 8E20F19D9BA22ABA09FB86FDE6B9EF38 + 1: 3B, F4201E546A9160F989191942EC8FD1D3 + 2: 9F38, 4E3CEAE3E1CB954E021A10E814B71732 + 3: 4F4769, 3E8F35A6A5B11200E9F1AA38590066CD + 4: AB41F5FC, EC4C97A8892AAF5433106D4AC8A49843 + 5: 414F95D61B, BF831E34D1E3FECB973A8C730ECA2E6D + 6: 4798322F06D1, 005BBC30BFEDBE6463536C4F80D1A071 + 7: F256B6CD1BF4F5, 468A28F0661884B846B191B530C8D064 + 8: 90906F27A633ADDE, 6D9200A37A7F6A456CB103673184C2E5 + 9: 16CD3C17C9B4EAB135, 6D716E23D7B35109F55B036EDFA7742E + 10: 7AD1C22F1F06298DFB25, B076990F8193543C8F3185D3792BCE56 + 11: 0476F2ABCD057FE6FEE39D, BB2876DB18C00038FADBBD9B264ACC3C + 12: B69EDE336407DBC2EE735857, AB63E5906116A8BE22C52B5DA31B1839 + 13: C3864C1354065A56470669E602, C72BFD3A0BC73BFF051C9AB2F0DFED93 + 14: 296D8F183A59020D33890420DD7B, C9D90B9EB42C32EDCF6223587D1598A6 + 15: 256ED8E9D982616680559979BDF2E9, 179FE4E7BA7E966050D35900317E9916 + 16: D4ED8F30FF9C0470D75B3B16750A3AE4, 5D50F05BB270A292DFF9F67A3BA84675 + 17: 40CDEB6388274143CA3C4F6020BD9A4875, B27C7DFB1BFBB3FCCEE0171852C7924E + 18: 54EF262EC1801D505C7629D038654EBA0594, 9D2060FCD0A2C577511C7752ADE60BBE + 19: F39EE54A37F16DD38B624D7AB8F0D9CBD4B981, BC056C7D2C09D813703CDD63C1C69F44 + 20: F4E7AD474FCA153ABD670E43081ED09EB2C4CC1A, F244BD4D630272F0D98FCA04226C04F1 + 21: 039ECC36A0A16273E7246CA1FF19D213AC87B53F29, 3056DB6916C925DF220B6C9980EE141A + 22: 7DE1DCDEF01447CA2FE83375A48DD84E4A7CB7C01992, 79AFEA4816EAF8DAC8A5E93960F1594F + 23: A886C4B914BF0983003272F226F9B2197EF2DC05ACDDE0, B59D85A0FDA5FA4422F7203C055B97A9 + 24: 00B3E1E91448E250AAFB695C0643A6577AB453EFECFABF53, 4A7EFF1CBC1AB535122A017203616D85 + 25: 85E972E774D66D0531E40B8FE9E264A77B50FA883AB0943080, B18E164BF89B7E7AB0DC256DFEC7C72F + 26: 004849E39334969B392CB0CF3FDEFB3D792DCBBC15F8328C7EDC, 3C51295711F5F878DE8F0B2B5A26A227 + 27: A0BAD6C2264AB1578993BA49E59D4598822FFED20A57D88F756FF1, 2EB9D525697A419A10DB2A84AEEA5FBC + 28: C34DD806EAB5AD823D78BCA78A7709A705FC94ECC521A367D76C9588, 3C57580C7903039D645C06DBAF07B477 + 29: C447EC77512938CF7862388C32AF22ACE6B5E4CBAA998BE4F5CBC4D215, 43425D09B7ACFD90371C08953946A955 + 30: 2C16993AAE624CBA4CDAF34FE3D368559E6BE548292B281439866375013B, 3B7360C3FA8FB1C15D19F567153CB46C + 31: 538E5DFAF14854A786851E4165F2E01CDDA963E318FCE4FB58E31A6B5CFC33, 2F8EA13B7A6873FE556CA535ABA0968B + 32: 5E29CDB7D9695A110043E9C260104BDF020A3A2A139D4112E918AB584BDD7EDA, 9133213AA7BCF062D2BD37F866683D3F + +EAX-khazad (16 byte key) + 0: , 75968E54452F6781 + 1: 95, ADAF5949F09B5A22 + 2: 6B8F, A06B201947424A11 + 3: 5BE668, 3251416625DF347A + 4: 5A92E82B, 33E25772427D9786 + 5: 62F9F2ABCC, DE714F5F5D17D6D0 + 6: 0E3CD825BD8D, A7991C8CB8975ED9 + 7: 4AD0D999503AAD, 53A827D7886F7227 + 8: BB08E6FAED1DAEE8, 91A118749B7AB9F3 + 9: 16E30CB12E20D18495, F8F8B8C1280158F9 + 10: 616DBCC6346959D89E4A, 506BF35A70297D53 + 11: F86B022D4B28FDB1F0B7D3, EA42220C805FD759 + 12: 9B8A3D9CDBADD9BBCCCD2B28, BB478D3CE9A229C9 + 13: CDC4AB4EF2D5B46E87827241F0, 658EDB9497A91823 + 14: 1A113D96B21B4AEBDB13E34C381A, 63AD0C4084AC84B0 + 15: 14DA751E5AF7E01F35B3CE74EE1ACF, 3C76AB64E1724DCE + 16: A13BBC7E408D2C550634CBC64690B8FE, 3D4BBC0C76536730 + diff --git a/src/libs/3rdparty/botan/doc/examples/ecdsa.cpp b/src/libs/3rdparty/botan/doc/examples/ecdsa.cpp new file mode 100644 index 00000000000..065203a946a --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/ecdsa.cpp @@ -0,0 +1,57 @@ +#include +#include +#include +#include + +#include +#include + +using namespace Botan; + +int main() + { + Botan::LibraryInitializer init; + + try + { + AutoSeeded_RNG rng; + + EC_Domain_Params params = get_EC_Dom_Pars_by_oid("1.3.132.0.8"); + + ECDSA_PrivateKey ecdsa(rng, params); + + ECDSA_PublicKey ecdsa_pub = ecdsa; + + /* + std::cout << params.get_curve().get_p() << "\n"; + std::cout << params.get_order() << "\n"; + std::cout << X509::PEM_encode(ecdsa); + std::cout << PKCS8::PEM_encode(ecdsa); + */ + + std::auto_ptr signer(get_pk_signer(ecdsa, "EMSA1(SHA-256)")); + + const char* message = "Hello World"; + + signer->update((const byte*)message, strlen(message)); + + SecureVector sig = signer->signature(rng); + + std::cout << sig.size() << "\n"; + + std::auto_ptr verifier( + get_pk_verifier(ecdsa_pub, "EMSA1(SHA-256)")); + + verifier->update((const byte*)message, strlen(message)); + + bool ok = verifier->check_signature(sig); + if(ok) + std::cout << "Signature valid\n"; + else + std::cout << "Bad signature\n"; + } + catch(std::exception& e) + { + std::cout << e.what() << "\n"; + } + } diff --git a/src/libs/3rdparty/botan/doc/examples/encrypt.cpp b/src/libs/3rdparty/botan/doc/examples/encrypt.cpp new file mode 100644 index 00000000000..348ee8d39e7 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/encrypt.cpp @@ -0,0 +1,179 @@ +/* +Encrypt a file using a block cipher in CBC mode. Compresses the plaintext +with Zlib, MACs with HMAC(SHA-1). Stores the block cipher used in the file, +so you don't have to specify it when decrypting. + +What a real application would do (and what this example should do), is test for +the presence of the Zlib module, and use it only if it's available. Then add +some marker to the stream so the other side knows whether or not the plaintext +was compressed. Bonus points for supporting multiple compression schemes. + +Another flaw is that is stores the entire ciphertext in memory, so if the file +you're encrypting is 1 Gb... you better have a lot of RAM. + +Based on the base64 example, of all things + +Written by Jack Lloyd (lloyd@randombit.net) on August 5, 2002 + +This file is in the public domain +*/ +#include +#include +#include +#include +#include +#include + +#include + +#if defined(BOTAN_HAS_COMPRESSOR_ZLIB) + #include +#endif + +using namespace Botan; + +std::string b64_encode(const SecureVector&); + +int main(int argc, char* argv[]) + { + if(argc < 2) + { + std::cout << "Usage: " << argv[0] << " [-c algo] -p passphrase file\n" + " -p : Use this passphrase to encrypt\n" + " -c : Encrypt with block cipher 'algo' (default 3DES)\n"; + return 1; + } + + Botan::LibraryInitializer init; + + std::string algo = "TripleDES"; + std::string filename, passphrase; + + // Holy hell, argument processing is a PITA + for(int j = 1; argv[j] != 0; j++) + { + if(std::strcmp(argv[j], "-c") == 0) + { + if(argv[j+1]) + { + algo = argv[j+1]; + j++; + } + else + { + std::cout << "No argument for -c option" << std::endl; + return 1; + } + } + else if(std::strcmp(argv[j], "-p") == 0) + { + if(argv[j+1]) + { + passphrase = argv[j+1]; + j++; + } + else + { + std::cout << "No argument for -p option" << std::endl; + return 1; + } + } + else + { + if(filename != "") + { + std::cout << "You can only specify one file at a time\n"; + return 1; + } + filename = argv[j]; + } + } + + if(passphrase == "") + { + std::cout << "You have to specify a passphrase!" << std::endl; + return 1; + } + + std::ifstream in(filename.c_str()); + if(!in) + { + std::cout << "ERROR: couldn't open " << filename << std::endl; + return 1; + } + + std::string outfile = filename + ".enc"; + std::ofstream out(outfile.c_str()); + if(!out) + { + std::cout << "ERROR: couldn't open " << outfile << std::endl; + return 1; + } + + try + { + if(!have_block_cipher(algo)) + { + std::cout << "Don't know about the block cipher \"" << algo << "\"\n"; + return 1; + } + + const u32bit key_len = max_keylength_of(algo); + const u32bit iv_len = block_size_of(algo); + + AutoSeeded_RNG rng; + + std::auto_ptr s2k(get_s2k("PBKDF2(SHA-1)")); + s2k->set_iterations(8192); + s2k->new_random_salt(rng, 8); + + SymmetricKey bc_key = s2k->derive_key(key_len, "BLK" + passphrase); + InitializationVector iv = s2k->derive_key(iv_len, "IVL" + passphrase); + SymmetricKey mac_key = s2k->derive_key(16, "MAC" + passphrase); + + // Just to be all fancy we even write a (simple) header. + out << "-------- ENCRYPTED FILE --------" << std::endl; + out << algo << std::endl; + out << b64_encode(s2k->current_salt()) << std::endl; + + Pipe pipe(new Fork( + new Chain(new MAC_Filter("HMAC(SHA-1)", mac_key), + new Base64_Encoder + ), + new Chain( +#ifdef BOTAN_HAS_COMPRESSOR_ZLIB + new Zlib_Compression, +#endif + get_cipher(algo + "/CBC", bc_key, iv, ENCRYPTION), + new Base64_Encoder(true) + ) + ) + ); + + pipe.start_msg(); + in >> pipe; + pipe.end_msg(); + + out << pipe.read_all_as_string(0) << std::endl; + out << pipe.read_all_as_string(1); + + } + catch(Algorithm_Not_Found) + { + std::cout << "Don't know about the block cipher \"" << algo << "\"\n"; + return 1; + } + catch(std::exception& e) + { + std::cout << "Exception caught: " << e.what() << std::endl; + return 1; + } + return 0; + } + +std::string b64_encode(const SecureVector& in) + { + Pipe pipe(new Base64_Encoder); + pipe.process_msg(in); + return pipe.read_all_as_string(); + } diff --git a/src/libs/3rdparty/botan/doc/examples/encrypt2.cpp b/src/libs/3rdparty/botan/doc/examples/encrypt2.cpp new file mode 100644 index 00000000000..4af0cf019ea --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/encrypt2.cpp @@ -0,0 +1,55 @@ +#include +#include +#include +#include + +#include + +using namespace Botan; + +int main() + { + Botan::LibraryInitializer init; + + AutoSeeded_RNG rng; + + std::string passphrase = "secret"; + + std::ifstream infile("readme.txt"); + std::ofstream outfile("readme.txt.enc"); + + PKCS5_PBKDF2 pbkdf2(new HMAC(new SHA_160)); + + pbkdf2.set_iterations(4096); + pbkdf2.new_random_salt(rng, 8); + SecureVector the_salt = pbkdf2.current_salt(); + + SecureVector master_key = pbkdf2.derive_key(48, passphrase).bits_of(); + + KDF* kdf = get_kdf("KDF2(SHA-1)"); + + SymmetricKey key = kdf->derive_key(20, master_key, "cipher key"); + SymmetricKey mac_key = kdf->derive_key(20, master_key, "hmac key"); + InitializationVector iv = kdf->derive_key(8, master_key, "cipher iv"); + + Pipe pipe(new Fork( + new Chain( + get_cipher("Blowfish/CBC/PKCS7", key, iv, ENCRYPTION), + new Base64_Encoder, + new DataSink_Stream(outfile) + ), + new Chain( + new MAC_Filter("HMAC(SHA-1)", mac_key), + new Hex_Encoder) + ) + ); + + outfile.write((const char*)the_salt.begin(), the_salt.size()); + + pipe.start_msg(); + infile >> pipe; + pipe.end_msg(); + + SecureVector hmac = pipe.read_all(1); + outfile.write((const char*)hmac.begin(), hmac.size()); + } diff --git a/src/libs/3rdparty/botan/doc/examples/factor.cpp b/src/libs/3rdparty/botan/doc/examples/factor.cpp new file mode 100644 index 00000000000..ff3c23c5d9e --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/factor.cpp @@ -0,0 +1,144 @@ +/* + Factor integers using a combination of trial division by small primes, + and Pollard's Rho algorithm +*/ +#include +#include +#include +using namespace Botan; + +#include +#include +#include + +// Pollard's Rho algorithm, as described in the MIT algorithms book + +// We use (x^2+x) mod n instead of (x*2-1) mod n as the random function, +// it _seems_ to lead to faster factorization for the values I tried. + +BigInt rho(const BigInt& n, RandomNumberGenerator& rng) + { + BigInt x = BigInt::random_integer(rng, 0, n-1); + BigInt y = x; + BigInt d = 0; + + Modular_Reducer mod_n(n); + + u32bit i = 1, k = 2; + while(true) + { + i++; + + if(i == 0) // overflow, bail out + break; + + x = mod_n.multiply((x + 1), x); + + d = gcd(y - x, n); + if(d != 1 && d != n) + return d; + + if(i == k) + { + y = x; + k = 2*k; + } + } + return 0; + } + +// Remove (and return) any small (< 2^16) factors +std::vector remove_small_factors(BigInt& n) + { + std::vector factors; + + while(n.is_even()) + { + factors.push_back(2); + n /= 2; + } + + for(u32bit j = 0; j != PRIME_TABLE_SIZE; j++) + { + if(n < PRIMES[j]) + break; + + BigInt x = gcd(n, PRIMES[j]); + + if(x != 1) + { + n /= x; + + u32bit occurs = 0; + while(x != 1) + { + x /= PRIMES[j]; + occurs++; + } + + for(u32bit k = 0; k != occurs; k++) + factors.push_back(PRIMES[j]); + } + } + + return factors; + } + +std::vector factorize(const BigInt& n_in, + RandomNumberGenerator& rng) + { + BigInt n = n_in; + std::vector factors = remove_small_factors(n); + + while(n != 1) + { + if(is_prime(n, rng)) + { + factors.push_back(n); + break; + } + + BigInt a_factor = 0; + while(a_factor == 0) + a_factor = rho(n, rng); + + std::vector rho_factored = factorize(a_factor, rng); + for(u32bit j = 0; j != rho_factored.size(); j++) + factors.push_back(rho_factored[j]); + + n /= a_factor; + } + return factors; + } + +int main(int argc, char* argv[]) + { + if(argc != 2) + { + std::cerr << "Usage: " << argv[0] << " integer\n"; + return 1; + } + + Botan::LibraryInitializer init; + + try + { + BigInt n(argv[1]); + + AutoSeeded_RNG rng; + + std::vector factors = factorize(n, rng); + std::sort(factors.begin(), factors.end()); + + std::cout << n << ": "; + for(u32bit j = 0; j != factors.size(); j++) + std::cout << factors[j] << " "; + std::cout << "\n"; + } + catch(std::exception& e) + { + std::cout << e.what() << std::endl; + return 1; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/gen_certs.cpp b/src/libs/3rdparty/botan/doc/examples/gen_certs.cpp new file mode 100644 index 00000000000..f635e1ccfdb --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/gen_certs.cpp @@ -0,0 +1,124 @@ +/* +* Generate a root CA plus httpd, dovecot, and postfix certs/keys +* +*/ + +#include +#include +#include +#include +#include + +using namespace Botan; + +#include +#include + +void fill_commoninfo(X509_Cert_Options& opts) + { + opts.country = "US"; + opts.organization = "randombit.net"; + opts.email = "admin@randombit.net"; + opts.locality = "Vermont"; + } + +X509_Certificate make_ca_cert(RandomNumberGenerator& rng, + const Private_Key& priv_key, + const X509_Time& now, + const X509_Time& later) + { + X509_Cert_Options opts; + fill_commoninfo(opts); + opts.common_name = "randombit.net CA"; + opts.start = now; + opts.end = later; + opts.CA_key(); + + return X509::create_self_signed_cert(opts, priv_key, rng); + } + +PKCS10_Request make_server_cert_req(const Private_Key& key, + const std::string& hostname, + RandomNumberGenerator& rng) + { + X509_Cert_Options opts; + opts.common_name = hostname; + fill_commoninfo(opts); + + opts.add_ex_constraint("PKIX.ServerAuth"); + + return X509::create_cert_req(opts, key, rng); + } + +void save_pair(const std::string& name, + const std::string& password, + const X509_Certificate& cert, + const Private_Key& key, + RandomNumberGenerator& rng) + { + std::string cert_fsname = name + "_cert.pem"; + std::string key_fsname = name + "_key.pem"; + + std::ofstream cert_out(cert_fsname.c_str()); + cert_out << cert.PEM_encode() << "\n"; + cert_out.close(); + + std::ofstream key_out(key_fsname.c_str()); + if(password != "") + key_out << PKCS8::PEM_encode(key, rng, password); + else + key_out << PKCS8::PEM_encode(key); + key_out.close(); + } + +int main() + { + const u32bit seconds_in_a_year = 31556926; + + const u32bit current_time = system_time(); + + X509_Time now = X509_Time(current_time); + X509_Time later = X509_Time(current_time + 4*seconds_in_a_year); + + LibraryInitializer init; + + AutoSeeded_RNG rng; + + RSA_PrivateKey ca_key(rng, 2048); + + X509_Certificate ca_cert = make_ca_cert(rng, ca_key, now, later); + + const std::string ca_password = "sekrit"; + + save_pair("ca", ca_password, ca_cert, ca_key, rng); + + X509_CA ca(ca_cert, ca_key); + + RSA_PrivateKey httpd_key(rng, 1536); + X509_Certificate httpd_cert = ca.sign_request( + make_server_cert_req(httpd_key, "www.randombit.net", rng), + rng, now, later); + + save_pair("httpd", "", httpd_cert, httpd_key, rng); + + RSA_PrivateKey bugzilla_key(rng, 1536); + X509_Certificate bugzilla_cert = ca.sign_request( + make_server_cert_req(bugzilla_key, "bugs.randombit.net", rng), + rng, now, later); + + save_pair("bugzilla", "", bugzilla_cert, bugzilla_key, rng); + + RSA_PrivateKey postfix_key(rng, 1536); + X509_Certificate postfix_cert = ca.sign_request( + make_server_cert_req(postfix_key, "mail.randombit.net", rng), + rng, now, later); + + save_pair("postfix", "", postfix_cert, postfix_key, rng); + + RSA_PrivateKey dovecot_key(rng, 1536); + X509_Certificate dovecot_cert = ca.sign_request( + make_server_cert_req(dovecot_key, "imap.randombit.net", rng), + rng, now, later); + + save_pair("dovecot", "", dovecot_cert, dovecot_key, rng); + } diff --git a/src/libs/3rdparty/botan/doc/examples/gtk/dsa.cpp b/src/libs/3rdparty/botan/doc/examples/gtk/dsa.cpp new file mode 100644 index 00000000000..dff547737a7 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/gtk/dsa.cpp @@ -0,0 +1,556 @@ +/* + This shows some of the details involved in a GUI application that uses + Botan. Actually most of the code is just dealing with GTK+, but it shows how + the password callback and pulse function stuff works. (See gtk_ui.cpp for the + acutal password callback code.) + + The major points of interest (assuming what you care about is how to use + Botan from a GUI, and not looking at my terrible GTK code) are gtk_ui.cpp + and, in this file, GTK_Pulse, gen_key(), and get_key(): + + gtk_ui.cpp and get_key() show how to get a passphrase from a user for + decrypting (well, in theory, anything), but in this case, PKCS #8 private + keys. Which is coincidentally the only thing Botan currently uses UI + objects for, though that will probably change eventually. GTK_UI does + double duty, for getting passphrases for encryption as well (in + do_save_key). + + gen_key() and GTK_Pulse show how to do an activity meter while doing a + long-term operation inside Botan. Since, typically, the only operations + which take a long time and can't be broken up into smaller parts are prime + generation/testing, that is currently where the pulse hooks are + called. It's certainly not the most general callback method in the world, + but it's general enough that it's usable without getting in the way too + much. The callbacks will eventually be extended to other parts of the + library (Pipe, maybe) where it's useful. + + This program is in the public domain. +*/ +#include +#include +#include + +#include +#include +#include +#include +#include +// we don't have a 'using namespace' here, so it's easy to grep for code that +// is actually dealing with the library (rather than messing around with GTK). + +#include +#include "gtk_ui.h" + +/************************************************* +* Pop up an message box * +*************************************************/ +static void show_dialog(const std::string& about_message, + const std::string& dialog_name) + { + GtkDialogFlags flags = + (GtkDialogFlags)(GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL); + + GtkWidget* dialog = gtk_dialog_new_with_buttons(dialog_name.c_str(), + NULL, flags, + GTK_STOCK_OK, + GTK_RESPONSE_NONE, + NULL); + GtkWidget* label = gtk_label_new(NULL); + gtk_label_set_markup(GTK_LABEL(label), about_message.c_str()); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); + + g_signal_connect_swapped(GTK_OBJECT(dialog), "response", + G_CALLBACK(gtk_widget_destroy), + GTK_OBJECT(dialog)); + + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); + gtk_widget_show_all(dialog); + } + +/************************************************* +* Pop up an About box * +*************************************************/ +static void show_about() + { + const std::string about_message = + "DSA Utility\n" + "\n" + "A simple application showing how to use Botan within a GUI.\n" + "It lets you generate or load keys, and sign text files.\n" + "\n" + "Send comments/questions to lloyd@randombit.net"; + + show_dialog(about_message, "About"); + } + +/************************************************* +* Pop up a help box * +*************************************************/ +static void show_help() + { + const std::string help_message = + "DSA Utility Help\n" + "\n" + "Simply, this is a (very) simple text editor, with the added ability\n" + "of being able to generate or read a DSA private key, and sign the\n" + "text buffer using that key.\n" + "\n" + "You can load, edit, and save text files as you would normally. If a\n" + "key is loaded (done using the commands in the Keys menu), you can\n" + "also use the Sign command (in the Signing menu) to generate a\n" + "signature for the current file. It will be displayed at the bottom\n" + "of the screen (if it has been calculated for the current buffer\n" + "contents), and can be saved using the \"Save Sig\" command.\n" + "\n" + "Signatures generated by this program can be verified using a the\n" + "dsa_ver example included in the Botan distribution.\n"; + + show_dialog(help_message, "Help"); + } + +/************************************************* +* Get and return a filename from the user * +*************************************************/ +static std::string get_filename(const std::string& title) + { + GtkWidget* dialog = gtk_file_selection_new(title.c_str()); + + /* Some window managers don't display the titles of transient windows, + put a message elsewhere for those people. + */ + GtkWidget* label = gtk_label_new(title.c_str()); + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); + + std::string fsname; + + gtk_widget_show(label); /* dialog_run won't show sub-widgets */ + if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) + fsname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(dialog)); + gtk_widget_destroy(dialog); + + /* If it's a directory, that's no good */ + if(fsname.size() && fsname[fsname.size()-1] == '/') + return ""; + + return fsname; + } + +/************************************************* +* Global state * +*************************************************/ +static Botan::DSA_PrivateKey* key = 0; // our key +static GtkTextBuffer* buffer = 0; // the text buffer +static std::string buffer_source; + // what file (if any) the buffer's data came from +static GtkWidget* sig_view = 0; // the signature + +/************************************************* +* Zap the currently set signature (if any) * +*************************************************/ +static void zap_sig() + { + gtk_editable_delete_text(GTK_EDITABLE(sig_view), 0, -1); + } + +/************************************************* +* Save the current key * +*************************************************/ +static void do_save_key(const std::string& title) + { + if(key == 0) + return; + + std::string filename = get_filename(title.c_str()); + + if(filename != "") + { + const std::string msg = "Select a passphrase to encrypt the key:"; + + std::ofstream out_priv(filename.c_str()); + + GTK_UI ui; + Botan::User_Interface::UI_Result result; + std::string passphrase = ui.get_passphrase(msg, result); + + if(result == Botan::User_Interface::OK) + out_priv << Botan::PKCS8::PEM_encode(*key, passphrase); + else + out_priv << Botan::PKCS8::PEM_encode(*key); + + // for testing + //std::cout << X509::PEM_encode(*key); + } + } + +/************************************************* +* Generate a signature for the text buffer * +*************************************************/ +static void sign_buffer() + { + /* No key? Ignore request. */ + if(key == 0) + return; + + /* same format as the text-mode dsa_sign example */ + Botan::Pipe pipe(new Botan::PK_Signer_Filter( + Botan::get_pk_signer(*key, "EMSA1(SHA-1)") + ), + new Botan::Base64_Encoder + ); + + /* It would probably be smart to do this a little bit at a time */ + GtkTextIter start, end; + gtk_text_buffer_get_bounds(buffer, &start, &end); + gchar* bits = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); + size_t length = strlen(bits); + + pipe.start_msg(); + pipe.write((unsigned char*)bits, length); + pipe.end_msg(); + + std::string sig = pipe.read_all_as_string(); + + zap_sig(); + + gint position = 0; + gtk_editable_insert_text(GTK_EDITABLE(sig_view), sig.c_str(), sig.length(), + &position); + + g_free(bits); + } + +/************************************************* +* GTK+ pulse callback * +*************************************************/ +class GTK_Pulse : public Botan::Library_State::UI + { + public: + void pulse(Botan::Pulse_Type); + }; + +void GTK_Pulse::pulse(Botan::Pulse_Type) + { + /* We need this to flush the updates, otherwise GTK+ will wait until we're + done with the computation before doing any updates (generally the right + thing, but not with a progress bar). + */ + + while(gtk_events_pending()) + gtk_main_iteration(); + } + +/************************************************* +* Actual do the pulse (as a GTK+ timeout func) * +*************************************************/ +static gboolean gtk_pulse_timeout(void* pbar) + { + GtkWidget* progress_bar = (GtkWidget*)pbar; + gtk_progress_bar_pulse(GTK_PROGRESS_BAR(progress_bar)); + return TRUE; /* keep calling us */ + } + +/************************************************* +* Generate a new key * +*************************************************/ +static void gen_key() + { + /* This gives a nice smooth progress bar, though we do use up quite a bit of + CPU for it. Keep in mind that if PULSE_INTERVAL is significantly less + than the average time between pulses from the library, the progress bar + will jerk around going slower or faster. Keep it at at least 50ms. + */ + const double PROGRESS_PER_PULSE = .01; /* % of bar */ + const guint32 PULSE_INTERVAL = 30; /* ms */ + + delete key; + + GtkDialogFlags flags = + (GtkDialogFlags)(GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL); + + GtkWidget* dialog = + gtk_dialog_new_with_buttons("Generating Key", NULL, flags, NULL); + + GtkWidget* label = gtk_label_new(" Generating new key, please wait... \n"); + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); + + GtkWidget* progress_bar = gtk_progress_bar_new(); + gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR(progress_bar), + PROGRESS_PER_PULSE); + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), progress_bar); + + guint timer_id = gtk_timeout_add(PULSE_INTERVAL, gtk_pulse_timeout, + progress_bar); + + gtk_widget_show_all(dialog); + + while(gtk_events_pending()) + gtk_main_iteration(); + + /* Register gtk_pulse so it will be called every so often when we embark + on our prime generation quest... + */ + /* this just updates the GUI; the GTK+ timeout function actually updates + the progress bar. That's because the amount of time between pulses + from the library is rather irregular, so the progress bar looks jerky. + */ + Botan::global_state().set_ui(new GTK_Pulse); + + /* Not generally recommended, since it's slow and there's not much point. + However, *because* it's slow, we'll want to put up a progress bar or + something, and part of this whole thing is to show how to do that and get + the pulse functions to do the right thing. + */ + Botan::DL_Group group(1024, Botan::DL_Group::DSA_Kosherizer); + key = new Botan::DSA_PrivateKey(group); + + gtk_timeout_remove(timer_id); + Botan::global_state().set_ui(0); // unset the pulse function + + gtk_widget_destroy(dialog); + + do_save_key("Save New Key"); + + /* new key, any old sigs are no longer useful */ + zap_sig(); + } + +/************************************************* +* Load up a key * +*************************************************/ +static void get_key() + { + std::string fsname = get_filename("Select a DSA Key"); + + if(fsname != "") + { + try { + delete key; + key = 0; + zap_sig(); + + /* + A GTK_UI is a subclass of User_Interface that pops up a dialog that + asks the user for a passphrase. It actually works quite well, + though the fixed upper limit on the passphrase size is not + ideal. Feel free to use it as-is or modify it however you like + (gtk_ui.* is public domain). + */ + GTK_UI ui; + Botan::PKCS8_PrivateKey* p8_key = Botan::PKCS8::load_key(fsname, ui); + key = dynamic_cast(p8_key); + if(!key) + show_dialog("The key in " + fsname + " is not a DSA key", + "Failure"); + } + catch(std::exception) + { + key = 0; // make sure it's not something random + show_dialog("Loading the key from " + fsname + " failed.", "Failure"); + } + } + } + +static void really_sign_buffer() + { + /* No key? Ask the user for one. */ + if(key == 0) + get_key(); + sign_buffer(); + } + +/************************************************* +* Clear the text buffer * +*************************************************/ +static void new_buffer() + { + /* + In theory, it would be nice to check if this was unsaved text and prompt + to save it. However, this really isn't supposed to be a GTK+ example, so + we won't. + */ + gtk_text_buffer_set_text(buffer, "", -1); + buffer_source = ""; + } + +/************************************************* +* Put the contents of a file into the buffer * +*************************************************/ +static void open_buffer() + { + std::string filename = get_filename("Select File"); + + if(filename == "") + return; + + std::ifstream in(filename.c_str()); + + new_buffer(); + buffer_source = filename; + + while(in.good()) + { + char buf[1024] = { 0 }; + + in.read(buf, 1024); + size_t got = in.gcount(); + + GtkTextIter iter; + gtk_text_buffer_get_end_iter(buffer, &iter); + gtk_text_buffer_insert(buffer, &iter, buf, got); + } + } + +/************************************************* +* Save the signature to a file * +*************************************************/ +static void save_sig() + { + std::string sig_file = buffer_source; + + /* No sig, nothing to save */ + const gchar* sig = gtk_entry_get_text(GTK_ENTRY(sig_view)); + if(strlen(sig) == 0) + return; + + if(sig_file == "") + sig_file = get_filename("Select Signature Output File"); + else + sig_file += ".sig"; + + std::ofstream out(sig_file.c_str()); + out << sig << std::endl; + } + +/************************************************* +* Save the current key * +*************************************************/ +static void save_key() + { + do_save_key("Save Current Key"); + } + +/************************************************* +* Common case of Save/Save As * +*************************************************/ +static void do_save(const std::string& filename) + { + std::ofstream out(filename.c_str()); + + GtkTextIter start, end; + gtk_text_buffer_get_bounds(buffer, &start, &end); + gchar* bits = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); + out.write(bits, strlen(bits)); + g_free(bits); + buffer_source = filename; + } + +/************************************************* +* Save the buffer * +*************************************************/ +static void save_buffer_as() + { + std::string filename = get_filename("Select Output File"); + if(filename != "") + do_save(filename); + } + +/************************************************* +* Save the buffer * +*************************************************/ +static void save_buffer() + { + if(buffer_source != "") + do_save(buffer_source); + else + save_buffer_as(); + } + +/************************************************* +* Make a menubar for the app * +*************************************************/ +static GtkWidget* make_menubar(GtkWidget *window) + { + static GtkItemFactoryEntry menu_items[] = { + { "/_File", NULL, NULL, 0, "", NULL }, + { "/File/_New", "N", new_buffer, 0, NULL, NULL }, + { "/File/_Open", "O", open_buffer, 0, NULL, NULL }, + { "/File/_Save", "S", save_buffer, 0, NULL, NULL }, + { "/File/Save _As", NULL, save_buffer_as, 0, NULL, NULL }, + { "/File/sep1", NULL, NULL, 0, "", NULL }, + { "/File/Save Sig", NULL, save_sig, 0, NULL, NULL }, + { "/File/sep2", NULL, NULL, 0, "", NULL }, + { "/File/_Quit", "Q", gtk_main_quit, 0, NULL, NULL }, + + { "/_Keys", NULL, NULL, 0, "", NULL }, + { "/Keys/Open", NULL, get_key, 0, NULL, NULL }, + { "/Keys/_Generate", NULL, gen_key, 0, NULL, NULL }, + { "/Keys/Save Current", NULL, save_key, 0, NULL, NULL }, + + { "/Signing", NULL, NULL, 0, "", NULL }, + { "/Signing/Sign", NULL, really_sign_buffer, 0, NULL, NULL }, + + { "/_Help", NULL, NULL, 0, "", NULL }, + { "/Help/Help", NULL, show_help, 0, NULL, NULL }, + { "/Help/sep1", NULL, NULL, 0, "", NULL }, + { "/Help/About", NULL, show_about, 0, NULL, NULL }, + }; + + GtkAccelGroup* accel_group = gtk_accel_group_new(); + GtkItemFactory* item_factory = + gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
    ", accel_group); + const gint nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); + gtk_item_factory_create_items(item_factory, nmenu_items, menu_items, NULL); + gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); + return gtk_item_factory_get_widget(item_factory, "
    "); + } + +int main(int argc, char *argv[]) + { + gtk_init(&argc, &argv); + + try { + Botan::LibraryInitializer init; + + /* Create a new top-level window */ + GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(window), "DSA Utility"); + gtk_signal_connect(GTK_OBJECT(window), "delete_event", + gtk_main_quit, NULL); + + /* Create the vbox to hold our stuff */ + GtkWidget* vbox = gtk_vbox_new(FALSE, 0); + gtk_container_border_width(GTK_CONTAINER(vbox), 1); + gtk_container_add(GTK_CONTAINER(window), vbox); + + /* Create the menu bar */ + GtkWidget *menubar = make_menubar(window); + + /* Create the entry that holds the signature */ + sig_view = gtk_entry_new(); + gtk_editable_set_editable(GTK_EDITABLE(sig_view), FALSE); + + /* Create the text box */ + GtkWidget* view = gtk_text_view_new(); + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); + + gtk_widget_set_size_request(view, 640, 480); + gtk_text_buffer_set_text(buffer, "Some initial contents.", -1); + + // Resign it on each change: fast enough, but probably not really useful + //g_signal_connect(G_OBJECT(buffer), "changed", sign_buffer, 0); + g_signal_connect(G_OBJECT(buffer), "changed", zap_sig, 0); + + gtk_container_add(GTK_CONTAINER(vbox), menubar); + gtk_container_add(GTK_CONTAINER(vbox), view); + gtk_container_add(GTK_CONTAINER(vbox), sig_view); + + gtk_widget_show_all(window); + + gtk_main(); + } + catch(std::exception& e) + { + std::cout << e.what() << std::endl; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/gtk/gtk_ui.cpp b/src/libs/3rdparty/botan/doc/examples/gtk/gtk_ui.cpp new file mode 100644 index 00000000000..515fbc51904 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/gtk/gtk_ui.cpp @@ -0,0 +1,78 @@ +/************************************************* +* GTK+ User Interface Source File * +*************************************************/ + +#include "gtk_ui.h" + +/************************************************* +* GTK+ Callback * +*************************************************/ +void GTK_UI::callback(GtkWidget* entry, gpointer passphrase_ptr) + { + const gchar *entry_text = gtk_entry_get_text(GTK_ENTRY(entry)); + char* passphrase = (char*)passphrase_ptr; + strcpy(passphrase, entry_text); + } + +/************************************************* +* Get a passphrase from the user * +*************************************************/ +std::string GTK_UI::get_passphrase(const std::string& what, + const std::string& source, + UI_Result& result) const + { + std::string msg = "A passphrase is needed to access the " + what; + if(source != "") msg += "\nin " + source; + return get_passphrase(msg, result); + } + +/************************************************* +* Get a passphrase from the user * +*************************************************/ +std::string GTK_UI::get_passphrase(const std::string& label_text, + UI_Result& result) const + { + const int MAX_PASSPHRASE = 64; + + GtkDialogFlags flags = + (GtkDialogFlags)(GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL); + + GtkWidget* dialog = gtk_dialog_new_with_buttons( + "Enter Passphrase", + NULL, flags, + GTK_STOCK_OK, GTK_RESPONSE_OK, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + NULL); + + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + + GtkWidget* label = gtk_label_new(label_text.c_str()); + + GtkWidget* entry = gtk_entry_new(); + gtk_entry_set_visibility(GTK_ENTRY(entry), 0); + gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE); + gtk_entry_set_max_length(GTK_ENTRY(entry), MAX_PASSPHRASE); + + char passphrase_buf[MAX_PASSPHRASE + 1] = { 0 }; + + gtk_signal_connect(GTK_OBJECT(entry), "activate", + GTK_SIGNAL_FUNC(callback), passphrase_buf); + + GtkWidget* vbox = gtk_vbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 0); + + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox, TRUE, TRUE, 0); + gtk_widget_show_all(vbox); + + /* Block until we get something back */ + result = CANCEL_ACTION; + if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) + result = OK; + + gtk_widget_destroy(dialog); + + if(result == OK) + return std::string(passphrase_buf); + return ""; + } diff --git a/src/libs/3rdparty/botan/doc/examples/gtk/gtk_ui.h b/src/libs/3rdparty/botan/doc/examples/gtk/gtk_ui.h new file mode 100644 index 00000000000..9ced83a811f --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/gtk/gtk_ui.h @@ -0,0 +1,25 @@ +/************************************************* +* GTK+ User Interface Header File * +*************************************************/ + +#ifndef BOTAN_EXT_GTK_UI__ +#define BOTAN_EXT_GTK_UI__ + +#include +#include + +/************************************************* +* GTK+ Passphrase Callback Object * +*************************************************/ +class GTK_UI : public Botan::User_Interface + { + public: + std::string get_passphrase(const std::string&, const std::string&, + UI_Result&) const; + + std::string get_passphrase(const std::string&, UI_Result&) const; + + static void callback(GtkWidget*, gpointer); + }; + +#endif diff --git a/src/libs/3rdparty/botan/doc/examples/gtk/readme.txt b/src/libs/3rdparty/botan/doc/examples/gtk/readme.txt new file mode 100644 index 00000000000..4f369116620 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/gtk/readme.txt @@ -0,0 +1,18 @@ + +This is an example of how to use Botan in a GUI. You need at least +Botan 1.6.0. + +You'll also need GTK+ 2.x (tested with GTK+ 2.10; should work with +most versions). Keep in mind that I was learning GTK as I was writing +this code, so it is not exactly the best GTK code you're likely to +see. + +dsa.cpp is the main GTK+ driver. It has some comments at the top which +point out major areas of interest. + +gtk_ui.* implement a User_Interface object that opens up a GTK+ dialog +box that asks the user for their passphrase. It works pretty well, the +only major deficiency is a fixed upper limit on the size of the +passphrase (currently 64). You may want to use this in your own code, +assuming you use GTK. If not, it should at least provide an outline +for writing a version for your favorite windowing system. diff --git a/src/libs/3rdparty/botan/doc/examples/hash.cpp b/src/libs/3rdparty/botan/doc/examples/hash.cpp new file mode 100644 index 00000000000..a97cd6082b5 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/hash.cpp @@ -0,0 +1,64 @@ +/* +Prints the message digest of files, using an arbitrary hash function +chosen by the user. This is less flexible that I might like, for example: + ./hash sha1 some_file [or md5 or sha-1 or ripemd160 or ...] +will not work, cause the name lookup is case-sensitive. Oh well... + +Written by Jack Lloyd (lloyd@randombit.net), on August 4, 2002 + - December 16, 2003: "Fixed" to accept "sha1" or "md5" as a hash name + +This file is in the public domain +*/ + +#include +#include +#include + +int main(int argc, char* argv[]) + { + if(argc < 3) + { + std::cout << "Usage: " << argv[0] << " digest " << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + std::string hash = argv[1]; + /* a couple of special cases, kind of a crock */ + if(hash == "sha1") hash = "SHA-1"; + if(hash == "md5") hash = "MD5"; + + try { + if(!Botan::have_hash(hash)) + { + std::cout << "Unknown hash \"" << argv[1] << "\"" << std::endl; + return 1; + } + + Botan::Pipe pipe(new Botan::Hash_Filter(hash), + new Botan::Hex_Encoder); + + int skipped = 0; + for(int j = 2; argv[j] != 0; j++) + { + std::ifstream file(argv[j]); + if(!file) + { + std::cout << "ERROR: could not open " << argv[j] << std::endl; + skipped++; + continue; + } + pipe.start_msg(); + file >> pipe; + pipe.end_msg(); + pipe.set_default_msg(j-2-skipped); + std::cout << pipe << " " << argv[j] << std::endl; + } + } + catch(std::exception& e) + { + std::cout << "Exception caught: " << e.what() << std::endl; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/hash_fd.cpp b/src/libs/3rdparty/botan/doc/examples/hash_fd.cpp new file mode 100644 index 00000000000..82ca2c3b4ba --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/hash_fd.cpp @@ -0,0 +1,71 @@ +/* +Written by Jack Lloyd (lloyd@randombit.net), on Prickle-Prickle, +the 10th of Bureaucracy, 3167. + +This file is in the public domain + +This is just like the normal hash application, but uses the Unix I/O system +calls instead of C++ iostreams. Previously, this version was much faster and +smaller, but GCC 3.1's libstdc++ seems to have been improved enough that the +difference is now fairly minimal. + +Nicely enough, doing the change required changing only about 3 lines of code. + +Note that this requires you to be on a machine running some sort of Unix. Well, +I guess any POSIX.1 compliant OS (in theory). +*/ + +#include +#include + +#if !defined(BOTAN_HAS_PIPE_UNIXFD_IO) + #error "You didn't compile the pipe_unixfd module into Botan" +#endif + +#include +#include + +int main(int argc, char* argv[]) + { + if(argc < 3) + { + std::cout << "Usage: " << argv[0] << " digest " << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + try + { + Botan::Pipe pipe(new Botan::Hash_Filter(argv[1]), + new Botan::Hex_Encoder); + + int skipped = 0; + for(int j = 2; argv[j] != 0; j++) + { + int file = open(argv[j], O_RDONLY); + if(file == -1) + { + std::cout << "ERROR: could not open " << argv[j] << std::endl; + skipped++; + continue; + } + pipe.start_msg(); + file >> pipe; + pipe.end_msg(); + close(file); + pipe.set_default_msg(j-2-skipped); + std::cout << pipe << " " << argv[j] << std::endl; + } + } + catch(Botan::Algorithm_Not_Found) + { + std::cout << "Don't know about the hash function \"" << argv[1] << "\"" + << std::endl; + } + catch(std::exception& e) + { + std::cout << "Exception caught: " << e.what() << std::endl; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/hash_quickly.cpp b/src/libs/3rdparty/botan/doc/examples/hash_quickly.cpp new file mode 100644 index 00000000000..e719a7178a7 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/hash_quickly.cpp @@ -0,0 +1,90 @@ +#include +#include +#include + +#include +#include +#include +#include +#include + +/* +Try to find the fastest SHA-1 implementation and use it to hash +files. In most programs this isn't worth the bother and +overhead. However with large amount of input, it is worth it. On tests +on a Core2 system with the SHA-1 SSE2 code enabled, over a few hundred +Mb or so the overhead paid for itself. + +Of course you could also just do this once and save it as an +application config, which is probably the smart thing to do. +*/ + +void set_fastest_implementation(const std::string& algo, + Botan::RandomNumberGenerator& rng, + double ms = 30) + { + Botan::Default_Benchmark_Timer timer; + + Botan::Algorithm_Factory& af = Botan::global_state().algorithm_factory(); + + std::map results = + Botan::algorithm_benchmark(algo, ms, timer, rng, af); + + std::string fastest_provider = ""; + double best_res = 0; + + for(std::map::iterator r = results.begin(); + r != results.end(); ++r) + { + std::cout << r->first << " @ " << r->second << " MiB/sec\n"; + + if(fastest_provider == "" || r->second > best_res) + { + fastest_provider = r->first; + best_res = r->second; + } + } + + std::cout << "Using " << fastest_provider << "\n"; + + af.set_preferred_provider(algo, fastest_provider); + } + +int main(int argc, char* argv[]) + { + if(argc <= 1) + { + std::cout << "Usage: " << argv[0] << " ...\n"; + return 1; + } + + Botan::LibraryInitializer init; + Botan::AutoSeeded_RNG rng; + + const std::string hash = "SHA-1"; + + set_fastest_implementation(hash, rng); + + // Here we intentionally use the 'old style' lookup interface + // which will also respect the provider settings. Or can use: + // global_state().algorithm_factory().make_hash_function(hash) + Botan::Pipe pipe( + new Botan::Hash_Filter(Botan::get_hash(hash)), + new Botan::Hex_Encoder + ); + + for(size_t i = 1; argv[i]; ++i) + { + std::ifstream in(argv[i]); + if(!in) + continue; + + pipe.start_msg(); + in >> pipe; + pipe.end_msg(); + + std::cout << argv[i] << " = " + << pipe.read_all_as_string(Botan::Pipe::LAST_MESSAGE) << "\n"; + + } + } diff --git a/src/libs/3rdparty/botan/doc/examples/hasher.cpp b/src/libs/3rdparty/botan/doc/examples/hasher.cpp new file mode 100644 index 00000000000..5ba982fc0fb --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/hasher.cpp @@ -0,0 +1,58 @@ +/* +A Botan example application which emulates a +poorly written version of "gpg --print-md" + +Written by Jack Lloyd (lloyd@randombit.net), quite a while ago (as of June +2001) + +This file is in the public domain +*/ +#include +#include +#include +#include + +int main(int argc, char* argv[]) + { + if(argc < 2) + { + std::cout << "Usage: " << argv[0] << " " << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + const int COUNT = 3; + std::string name[COUNT] = { "MD5", "SHA-1", "RIPEMD-160" }; + + for(int j = 1; argv[j] != 0; j++) + { + Botan::Filter* hash[COUNT] = { + new Botan::Chain(new Botan::Hash_Filter(name[0]), + new Botan::Hex_Encoder), + new Botan::Chain(new Botan::Hash_Filter(name[1]), + new Botan::Hex_Encoder), + new Botan::Chain(new Botan::Hash_Filter(name[2]), + new Botan::Hex_Encoder) + }; + + Botan::Pipe pipe(new Botan::Fork(hash, COUNT)); + + std::ifstream file(argv[j]); + if(!file) + { + std::cout << "ERROR: could not open " << argv[j] << std::endl; + continue; + } + pipe.start_msg(); + file >> pipe; + pipe.end_msg(); + file.close(); + for(int k = 0; k != COUNT; k++) + { + pipe.set_default_msg(k); + std::cout << name[k] << "(" << argv[j] << ") = " << pipe << std::endl; + } + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/hasher2.cpp b/src/libs/3rdparty/botan/doc/examples/hasher2.cpp new file mode 100644 index 00000000000..12d3c853d04 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/hasher2.cpp @@ -0,0 +1,72 @@ +/* +Identical to hasher.cpp, but uses Pipe in a different way. + +Note this tends to be much less efficient than hasher.cpp, because it does +three passes over the file. For a small file, it doesn't really matter. But for +a large file, or for something you can't re-read easily (socket, stdin, ...) +this is a bad idea. + +Written by Jack Lloyd (lloyd@randombit.net), Feb 8 2001 + +This file is in the public domain +*/ +#include +#include +#include +#include + +int main(int argc, char* argv[]) + { + if(argc < 2) + { + std::cout << "Usage: " << argv[0] << " " << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + const int COUNT = 3; + std::string name[COUNT] = { "MD5", "SHA-1", "RIPEMD-160" }; + + Botan::Pipe pipe; + + int skipped = 0; + for(int j = 1; argv[j] != 0; j++) + { + Botan::Filter* hash[COUNT] = { + new Botan::Hash_Filter(name[0]), + new Botan::Hash_Filter(name[1]), + new Botan::Hash_Filter(name[2]), + }; + + std::ifstream file(argv[j]); + if(!file) + { + std::cout << "ERROR: could not open " << argv[j] << std::endl; + skipped++; + continue; + } + for(int k = 0; k != COUNT; k++) + { + pipe.reset(); + pipe.append(hash[k]); + pipe.append(new Botan::Hex_Encoder); + pipe.start_msg(); + + // trickiness: the >> op reads until EOF, but seekg won't work + // unless we're in the "good" state (which EOF is not). + file.clear(); + file.seekg(0, std::ios::beg); + file >> pipe; + pipe.end_msg(); + } + file.close(); + for(int k = 0; k != COUNT; k++) + { + std::string out = pipe.read_all_as_string(COUNT*(j-1-skipped) + k); + std::cout << name[k] << "(" << argv[j] << ") = " << out << std::endl; + } + } + + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/make_prime.cpp b/src/libs/3rdparty/botan/doc/examples/make_prime.cpp new file mode 100644 index 00000000000..eaff1867f3d --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/make_prime.cpp @@ -0,0 +1,73 @@ +#include +#include +#include + +using namespace Botan; + +#include +#include +#include +#include + +int main() + { + Botan::LibraryInitializer init; + AutoSeeded_RNG rng; + + std::set primes; + + std::map bit_count; + + int not_new = 0; + + while(primes.size() < 10000) + { + u32bit start_cnt = primes.size(); + + u32bit bits = 18; + + if(rng.next_byte() % 128 == 0) + bits -= rng.next_byte() % (bits-2); + + bit_count[bits]++; + + //std::cout << "random_prime(" << bits << ")\n"; + + BigInt p = random_prime(rng, bits); + + if(p.bits() != bits) + { + std::cout << "Asked for " << bits << " got " << p + << " " << p.bits() << " bits\n"; + return 1; + } + + primes.insert(random_prime(rng, bits)); + + if(primes.size() != start_cnt) + std::cout << primes.size() << "\n"; + else + not_new++; + + //std::cout << "miss: " << not_new << "\n"; + + if(not_new % 100000 == 0) + { + for(std::map::iterator i = bit_count.begin(); + i != bit_count.end(); ++i) + std::cout << "bit_count[" << i->first << "] = " + << i->second << "\n"; + std::copy(primes.begin(), primes.end(), + std::ostream_iterator(std::cout, " ")); + } + } + + std::cout << "Generated all? primes\n"; + /* + for(u32bit j = 0; j != PRIME_TABLE_SIZE; ++j) + { + if(primes.count(PRIMES[j]) != 1) + std::cout << "Missing " << PRIMES[j] << "\n"; + } + */ + } diff --git a/src/libs/3rdparty/botan/doc/examples/passhash.cpp b/src/libs/3rdparty/botan/doc/examples/passhash.cpp new file mode 100644 index 00000000000..7f5bbc2bb2a --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/passhash.cpp @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include +#include + +using namespace Botan; + +std::string password_hash(const std::string& pass, + RandomNumberGenerator& rng); +bool password_hash_ok(const std::string& pass, const std::string& hash); + +int main(int argc, char* argv[]) + { + if(argc != 2 && argc != 3) + { + std::cerr << "Usage: " << argv[0] << " password\n"; + std::cerr << "Usage: " << argv[0] << " password hash\n"; + return 1; + } + + Botan::LibraryInitializer init; + + try + { + + if(argc == 2) + { + AutoSeeded_RNG rng; + + std::cout << "H('" << argv[1] << "') = " + << password_hash(argv[1], rng) << '\n'; + } + else + { + bool ok = password_hash_ok(argv[1], argv[2]); + if(ok) + std::cout << "Password and hash match\n"; + else + std::cout << "Password and hash do not match\n"; + } + } + catch(std::exception& e) + { + std::cerr << e.what() << '\n'; + return 1; + } + return 0; + } + +std::string password_hash(const std::string& pass, + RandomNumberGenerator& rng) + { + PKCS5_PBKDF2 kdf(new HMAC(new SHA_160)); + + kdf.set_iterations(10000); + kdf.new_random_salt(rng, 6); // 48 bits + + Pipe pipe(new Base64_Encoder); + pipe.start_msg(); + pipe.write(kdf.current_salt()); + pipe.write(kdf.derive_key(12, pass).bits_of()); + pipe.end_msg(); + + return pipe.read_all_as_string(); + } + +bool password_hash_ok(const std::string& pass, const std::string& hash) + { + Pipe pipe(new Base64_Decoder); + pipe.start_msg(); + pipe.write(hash); + pipe.end_msg(); + + SecureVector hash_bin = pipe.read_all(); + + PKCS5_PBKDF2 kdf(new HMAC(new SHA_160)); + + kdf.set_iterations(10000); + kdf.change_salt(hash_bin, 6); + + SecureVector cmp = kdf.derive_key(12, pass).bits_of(); + + return same_mem(cmp.begin(), hash_bin.begin() + 6, 12); + } diff --git a/src/libs/3rdparty/botan/doc/examples/pkcs10.cpp b/src/libs/3rdparty/botan/doc/examples/pkcs10.cpp new file mode 100644 index 00000000000..d719baf72dd --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/pkcs10.cpp @@ -0,0 +1,73 @@ +/* +Generate a 1024 bit RSA key, and then create a PKCS #10 certificate request for +that key. The private key will be stored as an encrypted PKCS #8 object, and +stored in another file. + +Written by Jack Lloyd (lloyd@randombit.net), April 7, 2003 + +This file is in the public domain +*/ +#include +#include +#include +#include +#include +using namespace Botan; + +#include +#include +#include + +int main(int argc, char* argv[]) + { + if(argc != 6) + { + std::cout << "Usage: " << argv[0] << + " passphrase name country_code organization email" << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + try + { + AutoSeeded_RNG rng; + + RSA_PrivateKey priv_key(rng, 1024); + // If you want a DSA key instead of RSA, comment out the above line and + // uncomment this one: + //DSA_PrivateKey priv_key(DL_Group("dsa/jce/1024")); + + std::ofstream key_file("private.pem"); + key_file << PKCS8::PEM_encode(priv_key, rng, argv[1]); + + X509_Cert_Options opts; + + opts.common_name = argv[2]; + opts.country = argv[3]; + opts.organization = argv[4]; + opts.email = argv[5]; + + /* Some hard-coded options, just to give you an idea of what's there */ + opts.challenge = "a fixed challenge passphrase"; + opts.locality = "Baltimore"; + opts.state = "MD"; + opts.org_unit = "Testing"; + opts.add_ex_constraint("PKIX.ClientAuth"); + opts.add_ex_constraint("PKIX.IPsecUser"); + opts.add_ex_constraint("PKIX.EmailProtection"); + + opts.xmpp = "someid@xmpp.org"; + + PKCS10_Request req = X509::create_cert_req(opts, priv_key, rng); + + std::ofstream req_file("req.pem"); + req_file << req.PEM_encode(); + } + catch(std::exception& e) + { + std::cout << e.what() << std::endl; + return 1; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/pqg_gen.cpp b/src/libs/3rdparty/botan/doc/examples/pqg_gen.cpp new file mode 100644 index 00000000000..e4b9598836c --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/pqg_gen.cpp @@ -0,0 +1,116 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +using namespace Botan; + +bool check(RandomNumberGenerator& rng, + std::map); + +int main() + { + try { + Botan::LibraryInitializer init("use_engines"); + + AutoSeeded_RNG rng; + + std::ifstream in("PQGGen.rsp"); + if(!in) + throw Exception("Can't open response file"); + + std::map inputs; + + while(in.good()) + { + std::string line; + std::getline(in, line); + + if(line == "" || line[0] == '[' || line[0] == '#') + continue; + + std::vector name_and_val = split_on(line, '='); + + if(name_and_val.size() != 2) + throw Decoding_Error("Unexpected input: " + line); + + name_and_val[0].erase(name_and_val[0].size()-1); + name_and_val[1].erase(0, 1); + + std::string name = name_and_val[0], value = name_and_val[1]; + + inputs[name] = value; + + if(name == "H") + { + bool result = check(rng, inputs); + std::cout << "." << std::flush; + if(result == false) + { + std::cout << " Check failed\n"; + + std::map::const_iterator i; + + for(i = inputs.begin(); i != inputs.end(); i++) + std::cout << i->first << " = " << i->second << "\n"; + + std::cout << "\n"; + } + + inputs.clear(); + } + } + } + catch(std::exception& e) + { + std::cout << e.what() << std::endl; + return 1; + } + return 0; + } + +bool check(RandomNumberGenerator& rng, + std::map inputs) + { + BigInt p("0x"+inputs["P"]), + q("0x"+inputs["Q"]), + g("0x"+inputs["G"]), + h("0x"+inputs["H"]); + + if(h < 1 || h >= p-1) return false; + + //u32bit c = to_u32bit(inputs["c"]); + + Pipe pipe(new Hex_Decoder); + pipe.process_msg(inputs["Seed"]); + SecureVector seed = pipe.read_all(); + + BigInt our_p, our_q; + + u32bit qbits = (p.bits() <= 1024) ? 160 : 256; + + Algorithm_Factory& af = global_state().algorithm_factory(); + + bool found = generate_dsa_primes(rng, af, our_p, our_q, + p.bits(), qbits, seed); + + if(!found) /* bad seed */ + return false; + + if(our_p != p) return false; + if(our_q != q) return false; + + BigInt our_g = power_mod(h, (p-1)/q, p); + + if(our_g != g) return false; + + return true; + } diff --git a/src/libs/3rdparty/botan/doc/examples/readme.txt b/src/libs/3rdparty/botan/doc/examples/readme.txt new file mode 100644 index 00000000000..48686db7161 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/readme.txt @@ -0,0 +1,77 @@ +This directory contains some simple example applications for the Botan crypto +library. If you want to see something a bit more complicated, check out the +stuff in the checks/ directory. Both it and the files in this directory are in +the public domain, and you may do with them however you please. + +The makefile assumes that you built the library with g++; you'll have to change +it if this assumption proves incorrect. + +Some of these examples will not build on all configurations of the library, +particularly 'bzip', 'encrypt', 'decrypt', and 'hash_fd', as they require +various extensions. + +The examples are fairly small (50-150 lines). And that's with argument +processing, I/O, error checking, etc (which counts for 40% or more of most of +them). This is partially to make them easy to understand, and partially because +I'm lazy. For the most part, the examples cover the stuff a 'regular' +application might need. + +Feel free to contribute new examples. You too can gain fame and fortune by +writing example apps for obscure libraries! + +The examples are: + +* X.509 examples +-------- +ca: A (very) simple CA application + +x509info: Prints some information about an X.509 certificate + +pkcs10: Generates a PKCS #10 certificate request for a 1024 bit RSA key + +self_sig: Generates a self-signed X.509v3 certificate with a 1024 bit RSA key +-------- + +* RSA examples (also uses X.509, PKCS #8, block ciphers, MACs, S2K algorithms) +-------- +rsa_kgen: Generate an RSA key, encrypt the private key with a passphrase, + output the keys to a pair of files +rsa_enc: Take a public key (generated by rsa_kgen) and encrypt a file + using CAST-128, MAC it with HMAC(SHA-1) +rsa_dec: Decrypt a file encrypted by rsa_enc + +* DSA examples (also uses X.509, PKCS #8) +-------- +dsa_kgen: Generates a DSA key, encrypts the private key with a passphrase + and stores it in PKCS #8 format. +dsa_sign: Produce a DSA signature for a file. Uses SHA-1 +dsa_ver: Verify a message signed with dsa_sign + +* Encryption examples +-------- +encrypt: Encrypt a file in CBC mode with a block cipher of your choice. Adds + a MAC for authentication, and compresses the plaintext with Zlib. + +decrypt: Decrypt the result of 'encrypt' + +xor_ciph: Shows how to add a new algorithm from application code + +* Hash function examples (also shows different methods of using Pipe) +-------- +hash: Print digests of files, using any chosen hash function + +hash_fd: Same as hash, except that it uses Unix file I/O. Requires the + pipe_unixfd extension + +hasher: Print MD5, SHA-1, and RIPEMD-160 digests of files + +hasher2: Same as hasher, just shows an alternate method + +stack: A demonstration of some more advanced Pipe functionality. Prints + MD5 hashes + +* Misc examples +-------- +base64: Simple base64 encoding/decoding tool + +bzip: Bzip2 compression/decompression. diff --git a/src/libs/3rdparty/botan/doc/examples/ressol.cpp b/src/libs/3rdparty/botan/doc/examples/ressol.cpp new file mode 100644 index 00000000000..43bb68d37e0 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/ressol.cpp @@ -0,0 +1,80 @@ +#include +#include +#include + +using namespace Botan; + +#include + +void test_ressol(const BigInt& p, RandomNumberGenerator& rng) + { + std::cout << p << std::endl; + + // const BigInt p_16 = p / 16; + + int noroot = 0, false_result = 0; + + for(int j = 0; j != 1000; ++j) + { + BigInt x = BigInt::random_integer(rng, 0, p); + //if(x % p_16 == 0) + //std::cout << "p = " << p << " x = " << x << "\n"; + + BigInt sqrt_x = ressol(x, p); + + if(sqrt_x < 0) + { + ++noroot; + continue; + } + + BigInt check = square(sqrt_x) % p; + + if(check != x % p) + { + std::cout << "FAIL " + << "x = " << x << "; " + << "p = " << p << "; " + << "s = " << sqrt_x << "; " + << "s^2%p = " << check << "\n"; + ++false_result; + } + } + /* + std::cout << "nomatch=" << nomatch << " " + << "noroot=" << noroot << " " + << "false=" << false_result << "\n"; + */ + } + +int main() + { + Botan::LibraryInitializer init; + AutoSeeded_RNG rng; + +#if 0 + std::cout << ressol(8, 17) << "\n"; + std::cout << ressol_orig(8, 17) << "\n"; +#endif + +#if 1 + for(int j = 16; j != 1024; ++j) + { + std::cout << "Round " << j << "\n"; + BigInt p = random_prime(rng, j); + test_ressol(p, rng); + //printf("%d\n", j); + + + } +#endif + /* + for(u32bit j = 9; j != PRIME_TABLE_SIZE; ++j) + { + std::cout << "PRIME[" << j << "] == " << PRIMES[j] << std::endl; + //printf("%d - ", PRIMES[j]); + test_ressol(PRIMES[j], rng); + //printf("\n"); + } + */ + } diff --git a/src/libs/3rdparty/botan/doc/examples/rng_test.cpp b/src/libs/3rdparty/botan/doc/examples/rng_test.cpp new file mode 100644 index 00000000000..8d4253a6ec7 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/rng_test.cpp @@ -0,0 +1,143 @@ +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace Botan; + +std::vector > read_file(const std::string&); + +SecureVector decode_hex(const std::string& in) + { + SecureVector result; + + try { + Botan::Pipe pipe(new Botan::Hex_Decoder); + pipe.process_msg(in); + result = pipe.read_all(); + } + catch(std::exception& e) + { + result.destroy(); + } + return result; + } + +std::string hex_encode(const byte in[], u32bit len) + { + Botan::Pipe pipe(new Botan::Hex_Encoder); + pipe.process_msg(in, len); + return pipe.read_all_as_string(); + } + +class Fixed_Output_RNG : public RandomNumberGenerator + { + public: + bool is_seeded() const { return !buf.empty(); } + + byte random() + { + if(buf.empty()) + throw std::runtime_error("Out of bytes"); + + byte out = buf.front(); + buf.pop_front(); + return out; + } + + void randomize(byte out[], u32bit len) throw() + { + for(u32bit j = 0; j != len; j++) + out[j] = random(); + } + + std::string name() const { return "Fixed_Output_RNG"; } + + void reseed(u32bit) {} + + void clear() throw() {} + + void add_entropy(const byte in[], u32bit len) + { + buf.insert(buf.end(), in, in + len); + } + + void add_entropy_source(EntropySource* es) { delete es; } + + Fixed_Output_RNG() {} + private: + std::deque buf; + }; + +void x931_tests(std::vector > vecs, + const std::string& cipher) + { + for(size_t j = 0; j != vecs.size(); ++j) + { + const std::string result = vecs[j].first; + const std::string input = vecs[j].second; + + ANSI_X931_RNG prng(get_block_cipher(cipher), + new Fixed_Output_RNG); + + SecureVector x = decode_hex(input); + prng.add_entropy(x.begin(), x.size()); + + SecureVector output(result.size() / 2); + prng.randomize(output, output.size()); + + if(decode_hex(result) != output) + std::cout << "FAIL"; + else + std::cout << "PASS"; + + std::cout << " Seed " << input << " " + << "Got " << hex_encode(output, output.size()) << " " + << "Exp " << result << "\n"; + } + + } + +int main() + { + Botan::LibraryInitializer init; + + x931_tests(read_file("ANSI931_AES128VST.txt.vst"), "AES-128"); + x931_tests(read_file("ANSI931_AES192VST.txt.vst"), "AES-192"); + x931_tests(read_file("ANSI931_AES256VST.txt.vst"), "AES-256"); + x931_tests(read_file("ANSI931_TDES2VST.txt.vst"), "TripleDES"); + x931_tests(read_file("ANSI931_TDES3VST.txt.vst"), "TripleDES"); + } + + +std::vector > +read_file(const std::string& fsname) + { + std::ifstream in(fsname.c_str()); + + std::vector > out; + + while(in.good()) + { + std::string line; + std::getline(in, line); + + if(line == "") + break; + + std::vector l; + boost::split(l, line, boost::is_any_of(":")); + + if(l.size() != 2) + throw std::runtime_error("Bad line " + line); + + out.push_back(std::make_pair(l[0], l[1])); + } + + return out; + } diff --git a/src/libs/3rdparty/botan/doc/examples/row_encryptor.cpp b/src/libs/3rdparty/botan/doc/examples/row_encryptor.cpp new file mode 100644 index 00000000000..1dac82f89de --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/row_encryptor.cpp @@ -0,0 +1,143 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace Botan; + +/** +Encrypt and decrypt small rows +*/ +class Row_Encryptor + { + public: + Row_Encryptor(const std::string& passphrase, + RandomNumberGenerator& rng); + + std::string encrypt(const std::string& input, + const MemoryRegion& salt); + + std::string decrypt(const std::string& input, + const MemoryRegion& salt); + + private: + Row_Encryptor(const Row_Encryptor&) {} + Row_Encryptor& operator=(const Row_Encryptor&) { return (*this); } + + Pipe enc_pipe, dec_pipe; + EAX_Encryption* eax_enc; // owned by enc_pipe + EAX_Decryption* eax_dec; // owned by dec_pipe; + }; + +Row_Encryptor::Row_Encryptor(const std::string& passphrase, + RandomNumberGenerator& rng) + { + std::auto_ptr s2k(get_s2k("PBKDF2(SHA-160)")); + + s2k->set_iterations(10000); + + s2k->new_random_salt(rng, 10); // 10 bytes == 80 bits + + SecureVector key = s2k->derive_key(32, passphrase).bits_of(); + + /* + Save pointers to the EAX objects so we can change the IV as needed + */ + + Algorithm_Factory& af = global_state().algorithm_factory(); + + const BlockCipher* proto = af.prototype_block_cipher("Serpent"); + + if(!proto) + throw std::runtime_error("Could not get a Serpent proto object"); + + enc_pipe.append(eax_enc = new EAX_Encryption(proto->clone())); + dec_pipe.append(eax_dec = new EAX_Decryption(proto->clone())); + + eax_enc->set_key(key); + eax_dec->set_key(key); + } + +std::string Row_Encryptor::encrypt(const std::string& input, + const MemoryRegion& salt) + { + eax_enc->set_iv(salt); + + enc_pipe.start_msg(); + enc_pipe.write(input); + enc_pipe.end_msg(); + + return enc_pipe.read_all_as_string(Pipe::LAST_MESSAGE); + } + +std::string Row_Encryptor::decrypt(const std::string& input, + const MemoryRegion& salt) + { + eax_dec->set_iv(salt); + + dec_pipe.start_msg(); + dec_pipe.write(input); + dec_pipe.end_msg(); + + return dec_pipe.read_all_as_string(Pipe::LAST_MESSAGE); + } + +/************************* + Test code follows: +*/ + +#include + +int main() + { + Botan::LibraryInitializer init; + + AutoSeeded_RNG rng; + + Row_Encryptor encryptor("secret passphrase", rng); + + std::vector original_inputs; + + for(u32bit i = 0; i != 15000; ++i) + { + std::ostringstream out; + + // This will actually generate variable length inputs (when + // there are leading 0s, which are skipped), which is good + // since it assures performance is OK across a mix of lengths + // TODO: Maybe randomize the length slightly? + + for(u32bit j = 0; j != 32; ++j) + out << std::hex << (int)rng.next_byte(); + + original_inputs.push_back(out.str()); + } + + std::vector encrypted_values; + MemoryVector salt(4); // keep out of loop to avoid excessive dynamic allocation + + for(u32bit i = 0; i != original_inputs.size(); ++i) + { + std::string input = original_inputs[i]; + store_le(i, salt); + + encrypted_values.push_back(encryptor.encrypt(input, salt)); + } + + for(u32bit i = 0; i != encrypted_values.size(); ++i) + { + std::string ciphertext = encrypted_values[i]; + store_le(i, salt); // NOTE: same salt value as previous loop (index value) + + std::string output = encryptor.decrypt(ciphertext, salt); + + if(output != original_inputs[i]) + std::cout << "BOOM " << i << "\n"; + } + + } diff --git a/src/libs/3rdparty/botan/doc/examples/rsa_dec.cpp b/src/libs/3rdparty/botan/doc/examples/rsa_dec.cpp new file mode 100644 index 00000000000..25ce33f4700 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/rsa_dec.cpp @@ -0,0 +1,127 @@ +/* +Decrypt an encrypted RSA private key. Then use that key to decrypt a +message. This program can decrypt messages generated by rsa_enc, and uses the +same key format as that generated by rsa_kgen. + +Written by Jack Lloyd (lloyd@randombit.net), June 3-5, 2002 + +This file is in the public domain +*/ + +#include +#include +#include +#include + +#include +#include // for get_kdf +#include +using namespace Botan; + +SecureVector b64_decode(const std::string&); +SymmetricKey derive_key(const std::string&, const SymmetricKey&, u32bit); + +const std::string SUFFIX = ".enc"; + +int main(int argc, char* argv[]) + { + if(argc != 4) + { + std::cout << "Usage: " << argv[0] << " keyfile messagefile passphrase" + << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + try + { + AutoSeeded_RNG rng; + + std::auto_ptr key( + PKCS8::load_key(argv[1], rng, argv[3])); + + RSA_PrivateKey* rsakey = dynamic_cast(key.get()); + if(!rsakey) + { + std::cout << "The loaded key is not a RSA key!\n"; + return 1; + } + + std::ifstream message(argv[2]); + if(!message) + { + std::cout << "Couldn't read the message file." << std::endl; + return 1; + } + + std::string outfile(argv[2]); + outfile = outfile.replace(outfile.find(SUFFIX), SUFFIX.length(), ""); + + std::ofstream plaintext(outfile.c_str()); + if(!plaintext) + { + std::cout << "Couldn't write the plaintext to " + << outfile << std::endl; + return 1; + } + + std::string enc_masterkey_str; + std::getline(message, enc_masterkey_str); + std::string mac_str; + std::getline(message, mac_str); + + SecureVector enc_masterkey = b64_decode(enc_masterkey_str); + + std::auto_ptr decryptor(get_pk_decryptor(*rsakey, + "EME1(SHA-1)")); + SecureVector masterkey = decryptor->decrypt(enc_masterkey); + + SymmetricKey cast_key = derive_key("CAST", masterkey, 16); + InitializationVector iv = derive_key("IV", masterkey, 8); + SymmetricKey mac_key = derive_key("MAC", masterkey, 16); + + Pipe pipe(new Base64_Decoder, + get_cipher("CAST-128/CBC/PKCS7", cast_key, iv, DECRYPTION), + new Fork( + 0, + new Chain( + new MAC_Filter("HMAC(SHA-1)", mac_key, 12), + new Base64_Encoder + ) + ) + ); + + pipe.start_msg(); + message >> pipe; + pipe.end_msg(); + + std::string our_mac = pipe.read_all_as_string(1); + + if(our_mac != mac_str) + std::cout << "WARNING: MAC in message failed to verify\n"; + + plaintext << pipe.read_all_as_string(0); + } + catch(std::exception& e) + { + std::cout << "Exception caught: " << e.what() << std::endl; + return 1; + } + return 0; + } + +SecureVector b64_decode(const std::string& in) + { + Pipe pipe(new Base64_Decoder); + pipe.process_msg(in); + return pipe.read_all(); + } + +SymmetricKey derive_key(const std::string& param, + const SymmetricKey& masterkey, + u32bit outputlength) + { + std::auto_ptr kdf(get_kdf("KDF2(SHA-1)")); + return kdf->derive_key(outputlength, masterkey.bits_of(), param); + } diff --git a/src/libs/3rdparty/botan/doc/examples/rsa_enc.cpp b/src/libs/3rdparty/botan/doc/examples/rsa_enc.cpp new file mode 100644 index 00000000000..f9b8c5561d2 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/rsa_enc.cpp @@ -0,0 +1,151 @@ +/* + Grab an RSA public key from the file given as an argument, grab a message + from another file, and encrypt the message. + + Algorithms used: + RSA with EME1(SHA-1) padding to encrypt the master key + CAST-128 in CBC mode with PKCS#7 padding to encrypt the message. + HMAC with SHA-1 is used to authenticate the message + + The keys+IV used are derived from the master key (the thing that's encrypted + with RSA) using KDF2(SHA-1). The 3 outputs of KDF2 are parameterized by P, + where P is "CAST", "IV" or "MAC", in order to make each key/IV unique. + + The format is: + 1) First line is the master key, encrypted with the recipients public key + using EME1(SHA-1), and then base64 encoded. + 2) Second line is the first 96 bits (12 bytes) of the HMAC(SHA-1) of + the _plaintext_ + 3) Following lines are base64 encoded ciphertext (CAST-128 as described), + each broken after ~72 characters. + +Written by Jack Lloyd (lloyd@randombit.net), June 3, 2002 + Updated to use KDF2, September 8, 2002 + Updated to read X.509 keys, October 21, 2002 + +This file is in the public domain +*/ + +#include +#include +#include +#include + +#include +#include +#include +using namespace Botan; + +std::string b64_encode(const SecureVector&); +SymmetricKey derive_key(const std::string&, const SymmetricKey&, u32bit); + +int main(int argc, char* argv[]) + { + if(argc != 3) + { + std::cout << "Usage: " << argv[0] << " keyfile messagefile" << std::endl; + return 1; + } + + std::ifstream message(argv[2]); + if(!message) + { + std::cout << "Couldn't read the message file." << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + std::string output_name(argv[2]); + output_name += ".enc"; + std::ofstream ciphertext(output_name.c_str()); + if(!ciphertext) + { + std::cout << "Couldn't write the ciphertext to " << output_name + << std::endl; + return 1; + } + + try { + std::auto_ptr key(X509::load_key(argv[1])); + RSA_PublicKey* rsakey = dynamic_cast(key.get()); + if(!rsakey) + { + std::cout << "The loaded key is not a RSA key!\n"; + return 1; + } + + AutoSeeded_RNG rng; + + std::auto_ptr encryptor(get_pk_encryptor(*rsakey, + "EME1(SHA-1)")); + + /* Generate the master key (the other keys are derived from this) + + Basically, make the key as large as can be encrypted by this key, up + to a limit of 256 bits. For 512 bit keys, the master key will be >160 + bits. A >600 bit key will use the full 256 bit master key. + + In theory, this is not enough, because we derive 16+16+8=40 bytes of + secrets (if you include the IV) using the master key, so they are not + statistically indepedent. Practically speaking I don't think this is + a problem. + */ + SymmetricKey masterkey(rng, + std::min(32U, encryptor->maximum_input_size())); + + SymmetricKey cast_key = derive_key("CAST", masterkey, 16); + SymmetricKey mac_key = derive_key("MAC", masterkey, 16); + SymmetricKey iv = derive_key("IV", masterkey, 8); + + SecureVector encrypted_key = + encryptor->encrypt(masterkey.bits_of(), rng); + + ciphertext << b64_encode(encrypted_key) << std::endl; + + Pipe pipe(new Fork( + new Chain( + get_cipher("CAST-128/CBC/PKCS7", cast_key, iv, + ENCRYPTION), + new Base64_Encoder(true) // true == do linebreaking + ), + new Chain( + new MAC_Filter("HMAC(SHA-1)", mac_key, 12), + new Base64_Encoder + ) + ) + ); + + pipe.start_msg(); + message >> pipe; + pipe.end_msg(); + + /* Write the MAC as the second line. That way we can pull it off right + from the start, and feed the rest of the file right into a pipe on the + decrypting end. + */ + + ciphertext << pipe.read_all_as_string(1) << std::endl; + ciphertext << pipe.read_all_as_string(0); + } + catch(std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + } + return 0; + } + +std::string b64_encode(const SecureVector& in) + { + Pipe pipe(new Base64_Encoder); + pipe.process_msg(in); + return pipe.read_all_as_string(); + } + +SymmetricKey derive_key(const std::string& param, + const SymmetricKey& masterkey, + u32bit outputlength) + { + std::auto_ptr kdf(get_kdf("KDF2(SHA-1)")); + return kdf->derive_key(outputlength, masterkey.bits_of(), param); + } diff --git a/src/libs/3rdparty/botan/doc/examples/rsa_kgen.cpp b/src/libs/3rdparty/botan/doc/examples/rsa_kgen.cpp new file mode 100644 index 00000000000..b7e90ef8a69 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/rsa_kgen.cpp @@ -0,0 +1,65 @@ +/* +Generate an RSA key of a specified bitlength, and put it into a pair of key +files. One is the public key in X.509 format (PEM encoded), the private key is +in PKCS #8 format (also PEM encoded). + +Written by Jack Lloyd (lloyd@randombit.net), June 2-3, 2002 + Updated to use X.509 and PKCS #8 on October 21, 2002 + +This file is in the public domain +*/ + +#include +#include +#include +#include +#include + +#include +#include +using namespace Botan; + +int main(int argc, char* argv[]) + { + if(argc != 2 && argc != 3) + { + std::cout << "Usage: " << argv[0] << " bitsize [passphrase]" + << std::endl; + return 1; + } + + u32bit bits = std::atoi(argv[1]); + if(bits < 1024 || bits > 4096) + { + std::cout << "Invalid argument for bitsize" << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + std::ofstream pub("rsapub.pem"); + std::ofstream priv("rsapriv.pem"); + if(!priv || !pub) + { + std::cout << "Couldn't write output files" << std::endl; + return 1; + } + + try + { + AutoSeeded_RNG rng; + + RSA_PrivateKey key(rng, bits); + pub << X509::PEM_encode(key); + + if(argc == 2) + priv << PKCS8::PEM_encode(key); + else + priv << PKCS8::PEM_encode(key, rng, argv[2]); + } + catch(std::exception& e) + { + std::cout << "Exception caught: " << e.what() << std::endl; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/rsa_manykey.cpp b/src/libs/3rdparty/botan/doc/examples/rsa_manykey.cpp new file mode 100644 index 00000000000..4122bc8efd4 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/rsa_manykey.cpp @@ -0,0 +1,36 @@ +/* +Generate a whole sequence of keys (for benchmarking) +*/ + +#include +#include +#include +#include +#include + +#include +#include +#include +using namespace Botan; + +int main() + { + Botan::LibraryInitializer init; + + AutoSeeded_RNG rng; + + for(u32bit j = 512; j <= 8192; j += 256) + { + std::cout << j << "..."; + + RSA_PrivateKey key(rng, j); + + std::ofstream priv(("rsa/" + to_string(j) + ".pem").c_str()); + priv << PKCS8::PEM_encode(key); + priv.close(); + + std::cout << " done" << std::endl; + } + + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/self_sig.cpp b/src/libs/3rdparty/botan/doc/examples/self_sig.cpp new file mode 100644 index 00000000000..0bf17e3bc9b --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/self_sig.cpp @@ -0,0 +1,79 @@ +/* +Generate a 1024 bit RSA key, and then create a self-signed X.509v3 certificate +with that key. If the do_CA variable is set to true, then it will be marked for +CA use, otherwise it will get extensions appropriate for use with a client +certificate. The private key is stored as an encrypted PKCS #8 object in +another file. + +Written by Jack Lloyd (lloyd@randombit.net), April 7, 2003 + +This file is in the public domain +*/ +#include +#include +#include +#include +using namespace Botan; + +#include +#include +#include + +int main(int argc, char* argv[]) + { + if(argc != 7) + { + std::cout << "Usage: " << argv[0] + << " passphrase [CA|user] name country_code organization email" + << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + std::string CA_flag = argv[2]; + bool do_CA = false; + + if(CA_flag == "CA") do_CA = true; + else if(CA_flag == "user") do_CA = false; + else + { + std::cout << "Bad flag for CA/user switch: " << CA_flag << std::endl; + return 1; + } + + try + { + AutoSeeded_RNG rng; + + RSA_PrivateKey key(rng, 1024); + + std::ofstream priv_key("private.pem"); + priv_key << PKCS8::PEM_encode(key, rng, argv[1]); + + X509_Cert_Options opts; + + opts.common_name = argv[3]; + opts.country = argv[4]; + opts.organization = argv[5]; + opts.email = argv[6]; + /* Fill in other values of opts here */ + + //opts.xmpp = "lloyd@randombit.net"; + + if(do_CA) + opts.CA_key(); + + X509_Certificate cert = X509::create_self_signed_cert(opts, key, rng); + + std::ofstream cert_file("cert.pem"); + cert_file << cert.PEM_encode(); + } + catch(std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + return 1; + } + + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/sig_gen.cpp b/src/libs/3rdparty/botan/doc/examples/sig_gen.cpp new file mode 100644 index 00000000000..6dd749097d3 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/sig_gen.cpp @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +using namespace Botan; + +bool check(std::map); + +int main() + { + try { + Botan::LibraryInitializer init; + + std::ifstream in("SigGen.rsp"); + if(!in) + throw Exception("Can't open response file"); + + std::map inputs; + + while(in.good()) + { + std::string line; + std::getline(in, line); + + if(line == "" || line[0] == '[' || line[0] == '#') + continue; + + std::vector name_and_val = split_on(line, '='); + + if(name_and_val.size() != 2) + throw Decoding_Error("Unexpected input: " + line); + + name_and_val[0].erase(name_and_val[0].size()-1); + name_and_val[1].erase(0, 1); + + std::string name = name_and_val[0], value = name_and_val[1]; + + inputs[name] = value; + + if(name == "S") + { + bool result = check(inputs); + if(result == false) + { + std::cout << " Check failed\n"; + + std::map::const_iterator i; + + for(i = inputs.begin(); i != inputs.end(); i++) + std::cout << i->first << " = " << i->second << "\n"; + } + inputs["Msg"] = inputs["R"] = inputs["S"] = ""; + } + } + } + catch(std::exception& e) + { + std::cout << e.what() << std::endl; + return 1; + } + return 0; + } + +bool check(std::map inputs) + { + BigInt p("0x"+inputs["P"]), + q("0x"+inputs["Q"]), + g("0x"+inputs["G"]), + y("0x"+inputs["Y"]); + + DSA_PublicKey key(DL_Group(p, q, g), y); + + Pipe pipe(new Hex_Decoder); + + pipe.process_msg(inputs["Msg"]); + pipe.start_msg(); + pipe.write(inputs["R"]); + pipe.write(inputs["S"] ); + pipe.end_msg(); + + std::auto_ptr verify(get_pk_verifier(key, "EMSA1(SHA-1)")); + + return verify->verify_message(pipe.read_all(0), pipe.read_all(1)); + } diff --git a/src/libs/3rdparty/botan/doc/examples/stack.cpp b/src/libs/3rdparty/botan/doc/examples/stack.cpp new file mode 100644 index 00000000000..1522b05f5f4 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/stack.cpp @@ -0,0 +1,86 @@ +/* +An Botan example application showing how to use the pop and prepend functions +of Pipe. Based on the md5 example. It's output should always be identical to +such. + +Written by Jack Lloyd (lloyd@randombit.net), Feb 3, 2002 + +This file is in the public domain +*/ + +#include +#include +#include + +int main(int argc, char* argv[]) + { + if(argc < 2) + { + std::cout << "Usage: " << argv[0] << " " << std::endl; + return 1; + } + + Botan::LibraryInitializer init; + + // this is a pretty vacuous example, but it's useful as a test + Botan::Pipe pipe; + + // CPS == Current Pipe Status, ie what Filters are set up + + pipe.prepend(new Botan::Hash_Filter("MD5")); + // CPS: MD5 + + pipe.prepend(new Botan::Hash_Filter("RIPEMD-160")); + // CPS: RIPEMD-160 | MD5 + + pipe.prepend(new Botan::Chain( + new Botan::Hash_Filter("RIPEMD-160"), + new Botan::Hash_Filter("RIPEMD-160"))); + // CPS: (RIPEMD-160 | RIPEMD-160) | RIPEMD-160 | MD5 + + pipe.pop(); // will pop everything inside the Chain as well as Chain itself + // CPS: RIPEMD-160 | MD5 + + pipe.pop(); // will get rid of the RIPEMD-160 Hash_Filter + // CPS: MD5 + + pipe.prepend(new Botan::Hash_Filter("SHA-1")); + // CPS: SHA-1 | MD5 + + pipe.append(new Botan::Hex_Encoder); + // CPS: SHA-1 | MD5 | Hex_Encoder + + pipe.prepend(new Botan::Hash_Filter("SHA-1")); + // CPS: SHA-1 | SHA-1 | MD5 | Hex_Encoder + + pipe.pop(); // Get rid of the Hash_Filter(SHA-1) + pipe.pop(); // Get rid of the other Hash_Filter(SHA-1) + // CPS: MD5 | Hex_Encoder + // The Hex_Encoder is safe because it is at the end of the Pipe, + // and pop() pulls off the Filter that is at the start. + + pipe.prepend(new Botan::Hash_Filter("RIPEMD-160")); + // CPS: RIPEMD-160 | MD5 | Hex_Encoder + + pipe.pop(); // Get rid of that last prepended Hash_Filter(RIPEMD-160) + // CPS: MD5 | Hex_Encoder + + int skipped = 0; + for(int j = 1; argv[j] != 0; j++) + { + std::ifstream file(argv[j]); + if(!file) + { + std::cout << "ERROR: could not open " << argv[j] << std::endl; + skipped++; + continue; + } + pipe.start_msg(); + file >> pipe; + pipe.end_msg(); + file.close(); + pipe.set_default_msg(j-1-skipped); + std::cout << pipe << " " << argv[j] << std::endl; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/test_es.cpp b/src/libs/3rdparty/botan/doc/examples/test_es.cpp new file mode 100644 index 00000000000..951d51ac7bb --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/test_es.cpp @@ -0,0 +1,115 @@ +#include +#include + +#if defined(BOTAN_HAS_ENTROPY_SRC_DEVICE) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_EGD) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_UNIX) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_BEOS) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_CAPI) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_WIN32) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_FTW) + #include +#endif + + +using namespace Botan; + +class Saver_Of_Bytes : public Entropy_Accumulator + { + public: + Saver_Of_Bytes(u32bit bits) : + Entropy_Accumulator(bits), outbuf(64), written(0) {} + + void add_bytes(const byte in[], u32bit length) + { + for(size_t i = 0; i != length; ++i) + outbuf[i % outbuf.size()] ^= in[i]; + + written += length; + } + + void trunc() { if(written < 64) outbuf.resize(written); } + + std::vector outbuf; + u32bit written; + }; + +void test_entropy_source(EntropySource* es) + { + // sometimes iostreams really is just a pain + + printf("Polling '%s':\n", es->name().c_str()); + + Saver_Of_Bytes accum(128); + + es->poll(accum); + + accum.trunc(); + + printf("Got %d bytes\n", accum.written); + for(size_t i = 0; i != accum.outbuf.size(); ++i) + printf("%02X", accum.outbuf[i]); + printf("\n"); + + delete es; + } + +int main() + { + Botan::LibraryInitializer init; + +#if defined(BOTAN_HAS_ENTROPY_SRC_DEVICE) + test_entropy_source( + new Device_EntropySource( + split_on("/dev/random:/dev/srandom:/dev/urandom", ':') + ) + ); +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_EGD) + test_entropy_source( + new EGD_EntropySource(split_on("/var/run/egd-pool:/dev/egd-pool", ':')) + ); +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_CAPI) + test_entropy_source(new Win32_CAPI_EntropySource); +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_FTW) + test_entropy_source(new FTW_EntropySource("/proc")); +#endif + + +#if defined(BOTAN_HAS_ENTROPY_SRC_WIN32) + test_entropy_source(new Win32_EntropySource); +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_BEOS) + test_entropy_source(new BeOS_EntropySource); +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_UNIX) + test_entropy_source( + new Unix_EntropySource(split_on("/bin:/sbin:/usr/bin:/usr/sbin", ':')) + ); +#endif + } diff --git a/src/libs/3rdparty/botan/doc/examples/x509info.cpp b/src/libs/3rdparty/botan/doc/examples/x509info.cpp new file mode 100644 index 00000000000..0e34f2fabff --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/x509info.cpp @@ -0,0 +1,154 @@ +/* + Read an X.509 certificate, and print various things about it + + Written by Jack Lloyd, March 23 2003 + - October 31, 2003: Prints the public key + - November 1, 2003: Removed the -d flag; it can tell automatically now + + This file is in the public domain +*/ +#include +#include +#include +using namespace Botan; + +#include +#include +#include + +std::string to_hex(const SecureVector& bin) + { + Pipe pipe(new Hex_Encoder); + pipe.process_msg(bin); + if(pipe.remaining()) + return pipe.read_all_as_string(); + else + return "(none)"; + } + +void do_print(const std::string& what, + const std::vector& vals) + { + if(vals.size() == 0) + return; + + std::cout << " " << what << ": "; + std::copy(vals.begin(), vals.end(), + std::ostream_iterator(std::cout, " ")); + std::cout << "\n"; + } + +void do_subject(const X509_Certificate& cert, const std::string& what) + { + do_print(what, cert.subject_info(what)); + } + +void do_issuer(const X509_Certificate& cert, const std::string& what) + { + do_print(what, cert.issuer_info(what)); + } + +int main(int argc, char* argv[]) + { + if(argc != 2) + { + std::cout << "Usage: " << argv[0] << " \n"; + return 1; + } + + Botan::LibraryInitializer init; + + try { + X509_Certificate cert(argv[1]); + + std::cout << "Version: " << cert.x509_version() << std::endl; + + std::cout << "Subject" << std::endl; + do_subject(cert, "Name"); + do_subject(cert, "Email"); + do_subject(cert, "Organization"); + do_subject(cert, "Organizational Unit"); + do_subject(cert, "Locality"); + do_subject(cert, "State"); + do_subject(cert, "Country"); + do_subject(cert, "IP"); + do_subject(cert, "DNS"); + do_subject(cert, "URI"); + do_subject(cert, "PKIX.XMPPAddr"); + + std::cout << "Issuer" << std::endl; + do_issuer(cert, "Name"); + do_issuer(cert, "Email"); + do_issuer(cert, "Organization"); + do_issuer(cert, "Organizational Unit"); + do_issuer(cert, "Locality"); + do_issuer(cert, "State"); + do_issuer(cert, "Country"); + do_issuer(cert, "IP"); + do_issuer(cert, "DNS"); + do_issuer(cert, "URI"); + + std::cout << "Validity" << std::endl; + + std::cout << " Not before: " << cert.start_time() << std::endl; + std::cout << " Not after: " << cert.end_time() << std::endl; + + std::cout << "Constraints" << std::endl; + Key_Constraints constraints = cert.constraints(); + if(constraints == NO_CONSTRAINTS) + std::cout << "No constraints" << std::endl; + else + { + if(constraints & DIGITAL_SIGNATURE) + std::cout << " Digital Signature\n"; + if(constraints & NON_REPUDIATION) + std::cout << " Non-Repuidation\n"; + if(constraints & KEY_ENCIPHERMENT) + std::cout << " Key Encipherment\n"; + if(constraints & DATA_ENCIPHERMENT) + std::cout << " Data Encipherment\n"; + if(constraints & KEY_AGREEMENT) + std::cout << " Key Agreement\n"; + if(constraints & KEY_CERT_SIGN) + std::cout << " Cert Sign\n"; + if(constraints & CRL_SIGN) + std::cout << " CRL Sign\n"; + } + + std::vector policies = cert.policies(); + if(policies.size()) + { + std::cout << "Policies: " << std::endl; + for(u32bit j = 0; j != policies.size(); j++) + std::cout << " " << policies[j] << std::endl; + } + + std::vector ex_constraints = cert.ex_constraints(); + if(ex_constraints.size()) + { + std::cout << "Extended Constraints: " << std::endl; + for(u32bit j = 0; j != ex_constraints.size(); j++) + std::cout << " " << ex_constraints[j] << std::endl; + } + + std::cout << "Signature algorithm: " << + OIDS::lookup(cert.signature_algorithm().oid) << std::endl; + + std::cout << "Serial: " + << to_hex(cert.serial_number()) << std::endl; + std::cout << "Authority keyid: " + << to_hex(cert.authority_key_id()) << std::endl; + std::cout << "Subject keyid: " + << to_hex(cert.subject_key_id()) << std::endl; + + X509_PublicKey* pubkey = cert.subject_public_key(); + std::cout << "Public Key:\n" << X509::PEM_encode(*pubkey); + delete pubkey; + } + catch(std::exception& e) + { + std::cout << e.what() << std::endl; + return 1; + } + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/examples/xor_ciph.cpp b/src/libs/3rdparty/botan/doc/examples/xor_ciph.cpp new file mode 100644 index 00000000000..6a914b15089 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/examples/xor_ciph.cpp @@ -0,0 +1,96 @@ +/* + An implementation of the highly secure (not) XOR cipher. AKA, how to write + and use your own cipher object. DO NOT make up your own ciphers. Please. + + Written by Jack Lloyd (lloyd@randombit.net) on Feb 17, 2004 + Update November 21 2008 for new algorithm factory in 1.8 + + This file is in the public domain +*/ + +#include +#include +using namespace Botan; + +class XOR_Cipher : public StreamCipher + { + public: + void clear() throw() { mask.destroy(); mask_pos = 0; } + + // what we want to call this cipher + std::string name() const { return "XOR"; } + + // return a new object of this type + StreamCipher* clone() const { return new XOR_Cipher; } + + XOR_Cipher() : StreamCipher(1, 32) { mask_pos = 0; } + private: + void cipher(const byte[], byte[], u32bit); + void key_schedule(const byte[], u32bit); + + SecureVector mask; + u32bit mask_pos; + }; + +void XOR_Cipher::cipher(const byte in[], byte out[], u32bit length) + { + for(u32bit j = 0; j != length; j++) + { + out[j] = in[j] ^ mask[mask_pos]; + mask_pos = (mask_pos + 1) % mask.size(); + } + } + +void XOR_Cipher::key_schedule(const byte key[], u32bit length) + { + mask.set(key, length); + } + +#include +#include +#include +#include +#include + +#include +#include +#include + +int main() + { + + Botan::LibraryInitializer init; + + global_state().algorithm_factory().add_stream_cipher(new XOR_Cipher, "app"); + + // a hex key value + SymmetricKey key("010203040506070809101112AAFF"); + + /* + Since stream ciphers are typically additive, the encryption and + decryption ops are the same, so this isn't terribly interesting. + + If this where a block cipher you would have to add a cipher mode and + padding method, such as "/CBC/PKCS7". + */ + Pipe enc(get_cipher("XOR", key, ENCRYPTION), new Hex_Encoder); + Pipe dec(new Hex_Decoder, get_cipher("XOR", key, DECRYPTION)); + + // I think the pigeons are actually asleep at midnight... + std::string secret = "The pigeon flys at midnight."; + + std::cout << "The secret message is '" << secret << "'" << std::endl; + + enc.process_msg(secret); + std::string cipher = enc.read_all_as_string(); + + std::cout << "The encrypted secret message is " << cipher << std::endl; + + dec.process_msg(cipher); + secret = dec.read_all_as_string(); + + std::cout << "The decrypted secret message is '" + << secret << "'" << std::endl; + + return 0; + } diff --git a/src/libs/3rdparty/botan/doc/fips140.tex b/src/libs/3rdparty/botan/doc/fips140.tex new file mode 100644 index 00000000000..8b200450807 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/fips140.tex @@ -0,0 +1,156 @@ +\documentclass{article} + +\setlength{\textwidth}{6.5in} +\setlength{\textheight}{9in} + +\setlength{\headheight}{0in} +\setlength{\topmargin}{0in} +\setlength{\headsep}{0in} + +\setlength{\oddsidemargin}{0in} +\setlength{\evensidemargin}{0in} + +\title{\textbf{Botan FIPS 140-2 Security Policy}} +\author{Jack Lloyd \\ + \texttt{lloyd@randombit.net}} +\date{} + +\newcommand{\filename}[1]{\texttt{#1}} +\newcommand{\module}[1]{\texttt{#1}} + +\newcommand{\type}[1]{\texttt{#1}} +\newcommand{\function}[1]{\textbf{#1}} +\newcommand{\macro}[1]{\texttt{#1}} + +\begin{document} + +\maketitle + +\tableofcontents + +\parskip=5pt +%\baselineskip=15pt + +\pagebreak + +\section{Introduction} + +\emph{Note that this is a draft, and almost certainly does not comply with what +FIPS 140-2 wants (also it's incomplete). In any case, there is no way for me to +afford paying the validation lab, so this is all theoretical.} + +\emph{I would welcome comments from people who are familiar with the FIPS 140 +process. I am currently basing this off a few dozen other security policies and +the FIPS itself.} + +\subsection{Purpose} + +This document is a security policy for the Botan C++ crypto library for use in +a FIPS 140-2 Level 1 validation process. It describes how to configure and use +the library to comply with the requirements of FIPS 140-2. + +This document is non-proprietary, and may be freely reproduced and distributed +in unmodified form. + +\subsection{Product Description} + +The Botan C++ crypto library (hereafter ``Botan'' or ``the library'') is an +open source C++ class library providing a general-purpose interface to a wide +variety of cryptographic algorithms and formats (such as X.509v3 and PKCS +\#10). It runs on most Win32 and POSIX-like systems, including Windows +NT/2000/XP, MacOS X, Linux, Solaris, FreeBSD, and QNX. However, only versions +running on \emph{(goal:)} Windows XP, Linux, and Solaris have been validated by +FIPS 140-2 at this time. + +\subsection{Algorithms} + +The library contains the following FIPS Approved algorithms: RSA, DSA, DES, +TripleDES, Skipjack, AES, SHA-1, HMAC, the X9.19 DES MAC, and the FIPS 186-2 +SHA-1 RNG. Other (non-Approved) algorithms, such as MD5 and Diffie-Hellman, are +also included. + +\section{Initialization} + +Certain tests are only performed if the flag ``fips140'' is passed as part of +the initialization process to the library (the argument to +\type{LibraryInitializer} or \function{Init::initialize}). Known answer tests +and key generation self-checks for RSA and DSA are always performed, regardless +of this setting. This flag must be passed by any application which desires +using the FIPS 140 mode of operation. + +\section{Roles and Services} + +Botan supports two roles, the User and the Crypto Officer. Authentication is +not performed by the module; all authentication is implicitly done by the +operating system. + +\subsection{User Role} + +The user has the ability to access the services of the module. This role is +implicitly selected whenever the module's services are accessed. + +\subsection{Crypto Officer Role} + +The crypto officer has all of the powers of the user, and in addition has the +power to install and uninstall the module and to configure the operating +system. This role is implicitly selected whenever these actions are performed. + +\section{Key Management} + +\subsection{Key Import/Export} + +Symmetric keys can be imported and exported in either unencrypted, encrypted, +or split-knowledge forms, as the application desires. Private keys for +asymmetric algorithms can be imported and exported as either encrypted or +unencrypted PKCS \#8 structures. The library natively supports PKCS \#5 +encryption with TripleDES for encrypting private keys. + +\subsection{Key Storage} + +In no case does the library itself import or export keys from/to an external +storage device; all such operations are done explicitly by the application. It +is the responsibly of the operator to ensure than any such operations comply +with the requirements of FIPS 140-2 Level 1. + +\subsection{Key Generation} + +Keys for symmetric algorithms (such as DES, AES, and HMAC) are generated by an +Approved RNG, by generating a random byte string of the appropriate size, and +using it as a key. + +DSA keys are generated as specified in FIPS 186-2 (or not?). RSA keys are +generated as specified in ANSI X9.31 (\emph{I think...}). Diffie-Hellman keys +are generated in a manner compatible with ANSI X9.42. All newly created DSA and +RSA keys are checked with a pairwise consistency test before being returned to +the caller. A pairwise consistency check can be performed on any RSA, DSA, or +Diffie-Hellman key by calling the \function{check\_key} member function with +an argument of \type{true}. + +\subsection{Key Establishment} + +Botan supports using RSA or Diffie-Hellman to establish keys. RSA can be used +with PKCS \#1 v1.5 or OAEP padding. None of these methods are FIPS Approved, +but Annex D of FIPS 140-2 allows for their use until such time as a FIPS +Approved asymmetric key establishment method is established. + +\subsection{Key Protection / Zeroization} + +Keys are protected against external access by the operating system's memory and +process protection mechanisms. If the library is used by multiple processes at +once, the OS virtual memory mechanisms ensure that each version will have it's +own data space (and thus, keys are not shared among multiple processes). + +All keys and other sensitive materials are zeroed in memory before being +released to the system. + +On Windows systems the \function{VirtualLock} system call is used to notify the +operating system that the memory containing potentially sensitive keying +material is not swapped to disk, preventing an attacker from applying disk +forenistics techniques to recovery data. + +On Unix systems, Botan allocates memory from file-backed memory mappings, which +are thoroughly erased when the memory is freed. + +\section{References} + +\end{document} diff --git a/src/libs/3rdparty/botan/doc/indent.el b/src/libs/3rdparty/botan/doc/indent.el new file mode 100644 index 00000000000..9811bf848fb --- /dev/null +++ b/src/libs/3rdparty/botan/doc/indent.el @@ -0,0 +1,57 @@ +; This Emacs Lips code defines the indentation style used in Botan. If doesn't +; get everything perfectly correct, but it's pretty close. Copy this code into +; your .emacs file, or use M-x eval-buffer. Make sure to also set +; indent-tabs-mode to nil so spaces are inserted instead. + +; This style is basically Whitesmiths style with 3 space indents (the Emacs +; "whitesmith" style seems more like a weird Whitesmiths/Allman mutant style). + +; To activate using this style, open the file you want to edit and run this: +; M-x c-set-style and then enter "botan". Alternately, put something +; like this in your .emacs file to make it the default style: + +; (add-hook 'c++-mode-common-hook +; (function (lambda() +; (c-add-style "botan" botan t)))) + +(setq botan '( + (c-basic-offset . 3) + (c-comment-only-line-offset . 0) + (c-offsets-alist + (c . 0) + (comment-intro . 0) + + (statement-block-intro . 0) + (statement-cont . +) + + (substatement . +) + (substatement-open . +) + + (block-open . +) + (block-close . 0) + + (defun-open . +) + (defun-close . 0) + (defun-block-intro . 0) + (func-decl-cont . +) + + (class-open . +) + (class-close . +) + (inclass . +) + (access-label . -) + (inline-open . +) + (inline-close . 0) + + (extern-lang-open . 0) + (extern-lang-close . 0) + (inextern-lang . 0) + + (statement-case-open +) + + (namespace-open . 0) + (namespace-close . 0) + (innamespace . 0) + + (label . 0) + ) +)) diff --git a/src/libs/3rdparty/botan/doc/insito_manual.pdf b/src/libs/3rdparty/botan/doc/insito_manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b071469920abeb55bbeaebe69ace08447051c430 GIT binary patch literal 150405 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 z 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 G8y5f*9l~b- literal 0 HcmV?d00001 diff --git a/src/libs/3rdparty/botan/doc/internals.tex b/src/libs/3rdparty/botan/doc/internals.tex new file mode 100644 index 00000000000..5b1650f6e5b --- /dev/null +++ b/src/libs/3rdparty/botan/doc/internals.tex @@ -0,0 +1,179 @@ +\documentclass{article} + +\setlength{\textwidth}{6.75in} % 1 inch side margins +\setlength{\textheight}{9in} % ~1 inch top and bottom margins + +\setlength{\headheight}{0in} +\setlength{\topmargin}{0in} +\setlength{\headsep}{0in} + +\setlength{\oddsidemargin}{0in} +\setlength{\evensidemargin}{0in} + +\title{Botan Internals} +\author{Jack Lloyd (lloyd@randombit.net)} +\date{August 20, 2006} + +\newcommand{\filename}[1]{\texttt{#1}} +\newcommand{\manpage}[2]{\texttt{#1}(#2)} + +\newcommand{\function}[1]{\textbf{#1}} +\newcommand{\type}[1]{\texttt{#1}} +\renewcommand{\arg}[1]{\textsl{#1}} + +\begin{document} + +\maketitle + +\tableofcontents + +\parskip=5pt + +\section{Introduction} + +This document is intended to document some of the trickier and/or more +complicated parts of Botan. This is not going to be terribly useful if +you just want to use the library, but for people wishing to understand +how it works, or contribute new code to it, it will hopefully prove +helpful. + +I've realized that a lot of things Botan does internally are pretty +hard to understand, and that a lot of things are only inside my head, +which is a bad place for them to be (things tend to get lost in there, +not to mention the possibility that I'll get hit by a truck next +week). + +This document is currently very incomplete. I'll be working on it as I +have time. + +\pagebreak + +\section{Filter} + +\type{Filter} is one of the core abstractions of the library. It is +used to represent any sort of transformation. Nearly all +\type{Filter}s are linear; they take input from a single source and +send their output (if any) to another single \type{Filter}. The one +exception is \type{Fanout\_Filter}, which uses friend access to +\type{Filter} in order to allow for multiple \type{Filter}s to attach +to its output. This special access is used by the Chain and Fork +filters; Chain encapsulates one or more \type{Filter}s into a single +Filter, and Fork sends its input to a set of several \type{Filter} +objects. + +The majority of the relations between filters is maintained by the +\type{Pipe} object which ``owns'' the \type{Filter}s. + +\section{Pipe} + +\type{Pipe} is, conceptually, a tree structure of \type{Filter} +objects. There is a single unique top, and an arbitrary number of +leaves (which are \type{SecureQueue} objects). \type{SecureQueue} is a +simple \type{Filter} that buffers its input. + +Writing into the pipe writes into the top of the tree. The filter at +the top of the tree writes its output into the next \type{Filter}, and +so on until eventually data trickles down into the bottommost +\type{Filter}s, where the data is stored for later retrieval. + +When a new message is started, \type{Pipe} searches through the tree +of \type{Filter}s and finds places where the \arg{next} field of the +\type{Filter} is NULL. This implies that it was the lowest layer of +the \type{Filter} tree that the user added. It then adds +\type{SecureQueue} objects onto these \type{Filter}s. These queues are +also stored in an deque; this is so \type{Pipe} can read from them +later without doing a tree traversal each time. + +\type{Pipe} will, if asked, destroy the existing tree structure, in +order to create a new one. However, the queue objects are not deleted, +because \type{Pipe} might be asked to read from them later (while +\type{Pipe} could delete all the messages in this case, the principle +of least astonishment suggested keeping them). + +What I wrote about \type{Pipe} keeing the queues in a deque is a +lie. Sort of. It keeps them in an object called +\type{Output\_Buffers}, which keeps them in a +deque. \type{Output\_Buffers} is intended to abstract away how message +queues are stored from \type{Pipe}. After a queue has been added to +the output buffers object, \type{Pipe} keeps no references to it +whatsoever; all access is mediated by the \type{Output\_Buffers}. +This allows queues which have been read to be deleted, rather than +leaving empty queue objects all over the place. + +\section{Library Initialization} + +WRITEME + +\section{Lookup Mechanism} + +Most objects know their name, and they know how to create a new copy +of themselves. We build mapping tables that map from an algorithm name +into a single instance of that algorithm. The tables themselves can be +found in \filename{src/lookup.cpp}. + +There are a set of functions named \function{add\_algorithm} that can +be used to populate the tables. We get something out of the table with +\function{retrieve\_x}, where x is the name of a type +(\texttt{block\_cipher}, \texttt{hash}, etc). This returns a const +pointer to the single unique instance of the algorithm that the lookup +tables know about. If it doesn't know about it, it falls back on +calling a function called \function{try\_to\_get\_x}. These functions +live in \filename{src/algolist.cpp}. They are mostly used to handle +algorithms which need (or at least can have) arguments passed to them, +like \type{HMAC} and \type{SAFER\_SK}. It will return NULL if it can't +find the algorithm at all. + +When it's asked for an algorithm it doesn't know about (ie, isn't in +the mapping tables), the retrieval functions will ask the try-to-get +functions if \emph{they} know about it. If they do, then the object +returned will be stored into the table for later retrieval. + +The functions \function{get\_x} call the retrieval functions. If we +get back NULL, an exception is thrown. Otherwise it will call the +\function{clone} method to get a new copy of the algorithm, which it +returns. + +The various functions like \function{output\_length\_of} call the +retrieval function for each type of object that the parameter in +question (in this case, \texttt{OUTPUT\_LENGTH}) might be meaningful +for. If it manages to get back an object, it will return (in this +case) the \texttt{OUTPUT\_LENGTH} field of the object. No allocations +are required to call this function: all of its operations work +directly on the copies living in the lookup tables. + +\section{Allocators} + +A big (slow) mess. + +\section{BigInt} + +Read ``Handbook of Applied Cryptography''. + +\section{PEM/BER Identification} + +We have a specific algorithm for figuring out if something is PEM or +BER. Previous versions (everything before 1.3.0) requried that the +caller specify which one it was, and they had to be right. Now we use +a hueristic (aka, an algorithm that sometimes doesn't work right) to +figure it out. If the first character is not 0x30 (equal to ASCII +'0'), then it can't possibly be BER (because everything we care about +is enclosed in an ASN.1 SEQUENCE, which for BER/DER is encoded as +beginning with 0x30). Roughly 99.9% of PEM blocks \emph{won't} have a +random 0 character in front of them, so we are mostly safe (unless +someone does it on purpose, in which case, please hit them for me). +But to be sure, if there is a 0, then we search the first \emph{N} +bytes of the block for the string ``-----BEGIN ``, which marks the +typical start of a PEM block. The specific \emph{N} depends on the +variable ``base/pem\_search'', which defaults to 4 kilobytes. + +So, you can actually fool it either way: that a PEM file is really +BER, or that a BER file is actually PEM. To fool it that a BER file is +PEM, just have the string ``-----BEGIN `` somewhere (I can't imagine +this string shows up in certificates or CRLs too often, so if it is +there it means somebody is being a jerk). If a file starts with 0 and +has at least ``base/pem\_search'' byte more junk in the way, it won't +notice that its PEM at all. In either case, of course, the loading +will fail, and you'll get a nice exception saying that the decoding +failed. + +\end{document} diff --git a/src/libs/3rdparty/botan/doc/license.txt b/src/libs/3rdparty/botan/doc/license.txt new file mode 100644 index 00000000000..9d1067cc1c7 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/license.txt @@ -0,0 +1,40 @@ +Botan (http://botan.randombit.net/) is distributed under these terms: + +Copyright (C) 1999-2009 Jack Lloyd + 2001 Peter J Jones + 2004-2007 Justin Karneges + 2005 Matthew Gregan + 2005-2006 Matt Johnston + 2006 Luca Piccarreta + 2007 Yves Jerschow + 2007-2008 FlexSecure GmbH + 2007-2008 Technische Universitat Darmstadt + 2007-2008 Falko Strenzke + 2007-2008 Martin Doering + 2007 Manuel Hartl + 2007 Christoph Ludwig + 2007 Patrick Sona +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 AUTHOR(S) "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 AUTHOR(S) OR CONTRIBUTOR(S) BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/libs/3rdparty/botan/doc/log.txt b/src/libs/3rdparty/botan/doc/log.txt new file mode 100644 index 00000000000..97476c38186 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/log.txt @@ -0,0 +1,1323 @@ + +* 1.8.8, 2009-11-03 + - Alter Skein-512 to match the tweaked 1.2 specification + - Fix use of inline asm for access to x86 bswap function + - Allow building the library without AES enabled + - Add 'powerpc64' alias to ppc64 arch for Gentoo ebuild + +* 1.8.7, 2009-09-09 + - Fix processing multiple messages in XTS mode + - Add --no-autoload option to configure.py, for minimized builds + +* 1.8.6, 2009-08-13 + - Add Cryptobox, a set of simple password-based encryption routines + - Only read world-readable files when walking /proc for entropy + - Fix building with TR1 disabled + - Fix x86 bswap support for Visual C++ + - Fixes for compilation under Sun C++ + - Add support for Dragonfly BSD (contributed by Patrick Georgi) + - Add support for the Open64 C++ compiler + - Build fixes for MIPS systems running Linux + - Minor changes to license, now equivalent to the FreeBSD/NetBSD license + +* 1.8.5, 2009-07-23 + - Change configure.py to work on stock Python 2.4 + - Avoid a crash in Skein_512::add_data processing a zero-length input + - Small build fixes for SPARC, ARM, and HP-PA processors + - The test suite now returns an error code from main() if any tests failed + +* 1.8.4, 2009-07-12 + - Fix a bug in nonce generation in the Miller-Rabin test + +* 1.8.3, 2009-07-11 + - Add a new Python configuration script + - Add the Skein-512 SHA-3 candidate hash function + - Add the XTS block cipher mode from IEEE P1619 + - Fix random_prime when generating a prime of less than 7 bits + - Improve handling of low-entropy situations during PRNG seeding + - Change random device polling to prefer /dev/urandom over /dev/random + - Use an input insensitive implementation of same_mem instead of memcmp + - Correct DataSource::discard_next to return the number of discarded bytes + - Provide a default value for AutoSeeded_RNG::reseed + - Fix Gentoo bug 272242 + +* 1.8.2, 2009-04-07 + - Make entropy polling more flexible and in most cases faster + - GOST 28147 now supports multiple sbox parameters + - Added the GOST 34.11 hash function + - Fix botan-config problems on MacOS X + +* 1.8.1, 2009-01-20 + - Avoid a valgrind warning in es_unix.cpp on 32-bit Linux + - Fix memory leak in PKCS8 load_key and encrypt_key + - Relicense api.tex from CC-By-SA 2.5 to BSD + - Fix botan-config on MacOS X, Solaris + +* 1.8.0, 2008-12-08 + - Fix compilation on Solaris with GCC + +* 1.7.24, 2008-12-01 + - Fix a compatibility problem with SHA-512/EMSA3 signature padding + - Fix bug preventing EGD/PRNGD entropy poller from working + - Fix integer overflow in Pooling_Allocator::get_more_core (bug id #27) + - Add EMSA3_Raw, a variant of EMSA3 called CKM_RSA_PKCS in PKCS #11 + - Add support for SHA-224 in EMSA2 and EMSA3 PK signature padding schemes + - Add many more test vectors for RSA with EMSA2, EMSA3, and EMSA4 + - Wrap private structs in SSE2 SHA-1 code in anonymous namespace + - Change configure.pl's CPU autodetection output to be more consistent + - Disable using OpenSSL's AES due to crashes of unknown cause + - Fix warning in /proc walking entropy poller + - Fix compilation with IBM XLC for Cell 0.9-200709 + +* 1.7.23, 2008-11-23 + - Change to use TR1 (thus enabling ECDSA) with GCC and ICC + - Optimize almost all hash functions, especially MD4 and Tiger + - Add configure.pl options --{with,without}-{bzip2,zlib,openssl,gnump} + - Change Timer to be pure virtual, and add ANSI_Clock_Timer + - Cache socket descriptors in the EGD entropy source + - Avoid bogging down startup in /proc walking entropy source + - Remove Buffered_EntropySource helper class + - Add a Default_Benchmark_Timer typedef in benchmark.h + - Add examples using benchmark.h and Algorithm_Factory + - Add ECC tests from InSiTo + - Minor documentation updates + +* 1.7.22, 2008-11-17 + - Add provider preferences to Algorithm_Factory + - Fix memory leaks in PBE_PKCS5v20 and get_pbe introduced in 1.7.21 + - Optimize AES encryption and decryption (about 10% faster) + - Enable SSE2 optimized SHA-1 implementation on Intel Prescott CPUs + - Fix nanoseconds overflow in benchmark code + - Remove Engine::add_engine + +* 1.7.21, 2008-11-11 + - Make algorithm lookup much more configuable + - Add facilities for runtime performance testing of algorithms + - Drop use of entropy estimation in the PRNGs + - Increase intervals between HMAC_RNG automatic reseeding + - Drop InitializerOptions class, all options but thread safety + +* 1.7.20, 2008-11-09 + - Namespace pkg-config file by major and minor versions + - Cache device descriptors in Device_EntropySource + - Split base.h into {block_cipher,stream_cipher,mac,hash}.h + - Removed get_mgf function from lookup.h + +* 1.7.19, 2008-11-06 + - Add HMAC_RNG, based on a design by Hugo Krawczyk + - Optimized the Turing stream cipher (about 20% faster on x86-64) + - Modify Randpool's reseeding algorithm to poll more sources + - Add a new AutoSeeded_RNG in auto_rng.h + - OpenPGP_S2K changed to take hash object instead of name + - Add automatic identification for Intel's Prescott processors + +* 1.7.18, 2008-10-22 + - Add Doxygen comments from InSiTo + - Add ECDSA and ECKAEG benchmarks + - Add configure.pl switch --with-tr1-implementation + - Fix configure.pl's --with-endian and --with-unaligned-mem options + - Added support for pkg-config + - Optimize byteswap with x86 inline asm for Visual C++ by Yves Jerschow + - Use const references to avoid copying overhead in CurveGFp, GFpModulus + +* 1.7.17, 2008-10-12 + - Add missing ECDSA object identifiers + - Fix error in x86 and x86-64 assembler affecting GF(p) math + - Remove Boost dependency from GF(p) math + - Modify botan-config to not print -L/usr/lib or -L/usr/local/lib + - Add BOTAN_DLL macro to over 30 classes missing it + - Rename the two SHA-2 base classes for consistency + +* 1.7.16, 2008-10-09 + - Add several missing pieces needed for ECDSA and ECKAEG + - Add Card Verifiable Certificates from InSiTo + - Add SHA-224 from InSiTo + - Add BSI variant of EMSA1 from InSiTo + - Add GF(p) and ECDSA tests from InSiTo + - Split ECDSA and ECKAEG into distinct modules + - Allow OpenSSL and GNU MP engines to be built with public key algos disabled + - Rename sha256.h to sha2_32.h and sha_64.h to sha2_64.h + +* 1.7.15, 2008-10-07 + - Add GF(p) arithmetic from InSiTo + - Add ECDSA and ECKAEG implementations from InSiTo + - Minimize internal dependencies, allowing for smaller build configurations + - Add new User Manual and Architecture Guide from FlexSecure GmbH + - Alter configure.pl options for better autotools compatibility + - Update build instructions for recent changes to configure.pl + - Fix CPU detection using /proc/cpuinfo + +* 1.7.14, 2008-09-30 + - Split library into parts allowing modular builds + - Add (very preliminary) CMS support to the main library + - Some constructors now require object pointers instead of names + - Support multiple implementations of the same algorithm + - Build support for Pentium-M processors, from Derek Scherger + - Build support for MinGW/MSYS, from Zbigniew Zagorski + - Use inline assembly for bswap on 32-bit x86 + +* 1.7.13, 2008-09-27 + - Add SSLv3 MAC, SSLv3 PRF, and TLS v1.0 PRF from Ajisai + - Allow all examples to compile even if compression not enabled + - Make CMAC's polynomial doubling operation a public class method + - Use the -m64 flag when compiling with Sun Forte on x86-64 + - Clean up and slightly optimize CMAC::final_result + +* 1.7.12, 2008-09-18 + - Add x86 assembly for Visual Studio C++, by Luca Piccarreta + - Add a Perl XS module, by Vaclav Ovsik + - Add SWIG-based wrapper for Botan + - Add SSE2 implementation of SHA-1, by Dean Gaudet + - Remove the BigInt::sig_words cache due to bugs + - Combined the 4 Blowfish sboxes, suggested by Yves Jerschow + - Changed BigInt::grow_by and BigInt::grow_to to be non-const + - Add private assignment operators to classes that don't support assignment + - Benchmark RSA encryption and signatures + - Added test programs for random_prime and ressol + - Add high resolution timers for IA-64, HP-PA, S390x + - Reduce use of the RNG during benchmarks + - Fix builds on STI Cell PPU + - Add support for IBM's XLC compiler + - Add IETF 8192 bit MODP group + +* 1.7.11, 2008-09-11 + - Added the Salsa20 stream cipher + - Optimized Montgomery reduction, Karatsuba squaring + - Added 16x16->32 word Comba multiplication and squaring + - Use a much larger Karatsuba cutoff point + - Remove bigint_mul_add_words + - Inlined several BigInt functions + - Add useful information to the generated build.h + - Rename alg_{ia32,amd64} modules to asm_{ia32,amd64} + - Fix the Windows build + +* 1.7.10, 2008-09-05 + - Public key benchmarks run using a selection of random keys + - New benchmark timer options are clock_gettime, gettimeofday, times, clock + - Including reinterpret_cast optimization for xor_buf in default header + - Split byte swapping and word rotation functions into distinct headers + - Add IETF modp 6144 group and 2048 and 3072 bit DSS groups + - Optimizes BigInt right shift + - Add aliases in DL_Group::Format enum + - BigInt now caches the significant word count + +* 1.7.9, 2008-08-27 + - Make clear() in most algorithm base classes a pure virtual + - Add noexec stack marker for GNU linker in assembly code + - Avoid string operations in ressol + - Compilation fixes for MinGW and Visual Studio C++ 2008 + - Some autoconfiguration fixes for Windows + +* 1.6.5, 2008-08-27 + - Add noexec stack marker for GNU linker in assembly code + - Fix autoconfiguration problem on x86 with GCC 4.2 and 4.3 + +* 1.7.8, 2008-07-15 + - Added the block cipher Noekeon + - Remove global deref_alias function + - X509_Store takes timeout options as constructor arguments + - Add Shanks-Tonelli algorithm, contributed by FlexSecure GmbH + - Extend random_prime() for generating primes of any bit length + - Remove Config class + - Allow adding new entropy via base RNG interface + - Reseeding a X9.31 PRNG also reseeds the underlying PRNG + +* 1.7.7, 2008-06-28 + - Remove the global PRNG object + - The PK filter objects were removed + - Add a test suite for the ANSI X9.31 PRNG + - Much cleaner and (mostly) thread-safe reimplementation of es_ftw + - Remove both default arguments to ANSI_X931_RNG's constructor + - Remove the randomizing version of OctetString::change + - Make the cipher and MAC to use in Randpool configurable + - Move RandomNumberGenerator declaration to rng.h + - RSA_PrivateKey will not generate keys smaller than 1024 bits + - Fix an error decoding BER UNIVERSAL types with special taggings + +* 1.7.6, 2008-05-05 + - Initial support for Windows DLLs, from Joel Low + - Reset the position pointer when a new block is generated in X9.32 PRNG + - Timer objects are now treated as entropy sources + - Moved several ASN.1-related enums from enums.h to an appropriate header + - Removed the AEP module, due to inability to test + - Removed Global_RNG and rng.h + - Removed system_clock + - Removed Library_State::UI and the pulse callback logic + +* 1.7.5, 2008-04-12 + - The API of X509_CA::sign_request was altered to avoid race conditions + - New type Pipe::message_id to represent the Pipe message number + - Remove the Named_Mutex_Holder for a small performance gain + - Removed several unused or rarely used functions from Config + - Ignore spaces inside of a decimal string in BigInt::decode + - Allow using a std::istream to initialize a DataSource_Stream object + - Fix compilation problem in zlib compression module + - The chunk sized used by Pooling_Allocator is now a compile time setting + - The size of random blinding factors is now a compile time setting + - The install target no longer tries to set a particular owner/group + +* 1.7.4, 2008-03-10 + - Use unaligned memory read/writes on systems that allow it, for performance + - Assembly for x86-64 for accessing the bswap instruction + - Use larger buffers in ARC4 and WiderWAKE for significant throughput increase + - Unroll loops in SHA-160 for a few percent increase in performance + - Fix compilation with GCC 3.2 in es_ftw and es_unix + - Build fix for NetBSD systems + - Prevent es_dev from being built except on Unix systems + +* 1.6.4, 2008-03-08 + - Fix a compilation problem with Visual Studio C++ 2003 + +* 1.7.3, 2008-01-23 + - New invocation syntax for configure.pl with several new options + - Support for IPv4 addresses in a subject alternative name + - New fast poll for the generic Unix entropy source (es_unix) + - The es_file entropy source has been replaced by the es_dev module + - The malloc allocator does not inherit from Pooling_Allocator anymore + - The path that es_unix will search in are now fully user-configurable + - Truncate X9.42 PRF output rather than allow counter overflow + - PowerPC is now assumed to be big-endian + +* 1.7.2, 2007-10-13 + - Initialize the global library state lazily + - Add plain CBC-MAC for backwards compatibility with old systems + - Clean up some of the self test code + - Throw a sensible exception if a DL_Group is not found + - Truncate KDF2 output rather than allowing counter overflow + - Add newly assigned OIDs for SHA-2 and DSA with SHA-224/256 + - Fix a Visual Studio compilation problem in x509stat.cpp + +* 1.6.3, 2007-07-23 + - Fix a race condition in the algorithm lookup cache + - Fix problems building the memory pool on some versions of Visual C++ + +* 1.7.1, 2007-07-23 + - Fix a race condition in the algorithm object cache + - HMAC key schedule optimization + - The build header sets a macro defining endianness, if known + - New word load/store abstraction allowing further optimization + - Modify most of the library to avoid use the C-style casts + - Use higher resolution timers in symmetric benchmarks + +* 1.7.0, 2007-05-19 + - DSA parameter generation now follows FIPS 186-3 + - Added OIDs for Rabin-Williams and Nyberg-Rueppel + - Somewhat better support for out of tree builds + - Minor optimizations for RC2 and Tiger + - Documentation updates + - Update the todo list + +* 1.6.2, 2007-03-24 + - Fix autodection on Athlon64s running Linux + - Fix builds on QNX and compilers using STLport + - Remove a call to abort() that crept into production + +* 1.6.1, 2007-01-20 + - Fix some base64 decoder bugs + - Add a new option to base64 encoding, to always append a newline + - Fix some build problems under Visual Studio with debug enabled + - Fix a bug in BER_Decoder that was triggered under some compilers + +* 1.6.0, 2006-12-17 + - Minor cleanups versus 1.5.13 + +* 1.5.13, 2006-12-10 + - Compilation fixes for the bzip2, zlib, and GNU MP modules + - Better support for Intel C++ and EKOpath C++ on x86-64 + +* 1.5.12, 2006-10-27 + - Cleanups in the initialization routines + - Add some x86-64 assembly for multiply-add + - Fix problems generating very small (below 384 bit) RSA keys + - Support out of tree builds + - Bring some of the documentation up to date + - More improvements to the Python bindings + +* 1.5.11, 2006-09-10 + - Removed the Algorithm base class + - Various cleanups in the public key inheritance hierarchy + - Major overhaul of the configure/build setup + - Added x86 assembler implementations of Serpent and low-level MPI code + - Optimizations for the SHA-1 x86 assembler + - Various improvements to the Python wrappers + - Work around a Visual Studio compiler bug + +* 1.5.10, 2006-08-13 + - Add x86 assembler versions of MD4, MD5, and SHA-1 + - Expand InitializerOptions' language to support on/off switches + - Fix definition of OID 2.5.4.8; was accidentally changed in 1.5.9 + - Fix possible resource leaks in the mmap allocator + - Slightly optimized buffering in MDx_HashFunction + - Initialization failures are dealt with somewhat better + - Add an example implementing Pollard's Rho algorithm + - Better option handling in the test/benchmark tool + - Expand the xor_ciph example to support longer keys + - Some updates to the documentation + +* 1.5.9, 2006-07-12 + - Fixed bitrot in the AEP engine + - Fix support for marking certificate/CRL extensions as critical + - Significant cleanups in the library state / initialization code + - LibraryInitializer takes an explicit InitializerOptions object + - Make Mutex_Factory an abstract class, add Default_Mutex_Factory + - Change configuration access to using global_state() + - Add support for global named mutexes throughout the library + - Add some STL wrappers for the delete operator + - Change how certificates are created to be more flexible and general + +* 1.5.8, 2006-06-23 + - Many internal cleanups to the X.509 cert/CRL code + - Allow for application code to support new X.509 extensions + - Change the return type of X509_Certificate::{subject,issuer}_info + - Allow for alternate character set handling mechanisms + - Fix a bug that was slowing squaring performance somewhat + - Fix a very hard to hit overflow bug in the C version of word3_muladd + - Minor cleanups to the assembler modules + - Disable es_unix module on FreeBSD due to build problem on FreeBSD 6.1 + - Support for GCC 2.95.x has been dropped in this release + +* 1.5.7, 2006-05-28 + - Further, major changes to the BER/DER coding system + - Updated the Qt mutex module to use Mutex_Factory + - Moved the library global state object into an anonymous namespace + - Drop the Visual C++ x86 assembly module due to bugs + +* 1.5.6, 2006-03-01 + - The low-level DER/BER coding system was redesigned and rewritten + - Portions of the certificate code were cleaned up internally + - Use macros to substantially clean up the GCC assembly code + - Added 32-bit x86 assembly for Visual C++ (by Luca Piccarreta) + - Avoid a couple of spurious warnings under Visual C++ + - Some slight cleanups in X509_PublicKey::key_id + +* 1.5.5, 2006-02-04 + - Fixed a potential infinite loop in the memory pool code (Matt Johnston) + - Made Pooling_Allocator::Memory_Block an actual class of sorts + - Some small optimizations to the division and modulo computations + - Cleaned up the implementation of some of the BigInt operators + - Reduced use of dynamic memory allocation in low-level BigInt functions + - A few simplifications in the Randpool mixing function + - Removed power(), as it was not particularly useful (or fast) + - Fixed some annoying bugs in the benchmark code + - Added a real credits file + +* 1.5.4, 2006-01-29 + - Integrated x86 and amd64 assembly code, contributed by Luca Piccarreta + - Fixed a memory access off-by-one in the Karatsuba code + - Changed Pooling_Allocator's free list search to a log(N) algorithm + - Merged ModularReducer with its only subclass, Barrett_Reducer + - Fixed sign-handling bugs in some of the division and modulo code + - Renamed the module description files to modinfo.txt + - Further cleanups in the initialization code + - Removed BigInt::add and BigInt::sub + - Merged all the division-related functions into just divide() + - Modified the functions to allow for better optimizations + - Made the number of bits polled from an EntropySource user configurable + - Avoid including in + - Fixed some build problems with Sun Forte + - Removed some dead code from bigint_modop + - Fix the definition of same_mem + +* 1.5.3, 2006-01-24 + - Many optimizations in the low-level multiple precision integer code + - Added hooks for assembly implementations of the MPI code + - Support for the X.509 issuer alternative name extension in new certs + - Fixed a bug in the decompression modules; found and patched by Matt Johnston + - New Windows mutex module (mux_win32), by Luca Piccarreta + - Changed the Windows timer module to use QueryPerformanceCounter + - mem_pool.cpp was using std::set iterators instead of std::multiset ones + - Fixed a bug in X509_CA preventing users from disabling particular extensions + - Fixed the mp_asm64 module, which was entirely broken in 1.5.2 + - Fixed some module build problems on FreeBSD and Tru64 + +* 1.4.12, 2006-01-15 + - Fixed an off-by-one memory read in MISTY1::key() + - Fixed a nasty memory leak in Output_Buffers::retire() + - Changed maximum HMAC keylength to 1024 bits + - Fixed a build problem in the hardware timer module on 64-bit PowerPC + +* 1.5.2, 2006-01-15 + - Fixed an off-by-one memory read in MISTY1::key() + - Fixed a nasty memory leak in Output_Buffers::retire() + - Reimplemented the memory allocator from scratch + - Improved memory caching in Montgomery exponentiation + - Optimizations for multiple precision addition and subtraction + - Fixed a build problem in the hardware timer module on 64-bit PowerPC + - Changed default Karatsuba cutoff to 12 words (was 14) + - Removed MemoryRegion::bits(), which was unused and incorrect + - Changed maximum HMAC keylength to 1024 bits + - Various minor Makefile and build system changes + - Avoid using std::min in to bypass Windows libc macro pollution + - Switched checks/clock.cpp back to using clock() by default + - Enabled the symmetric algorithm tests, which were accidentally off in 1.5.1 + - Removed the Default_Mutex's unused clone() member function + +* 1.5.1, 2006-01-08 + - Implemented Montgomery exponentiation + - Implemented generalized Karatsuba multiplication and squaring + - Implemented Comba squaring for 4, 6, and 8 word inputs + - Added new Modular_Exponentiator and Power_Mod classes + - Removed FixedBase_Exp and FixedExponent_Exp + - Fixed a performance regression in get_allocator introduced in 1.5.0 + - Engines can now offer S2K algorithms and block cipher padding methods + - Merged the remaining global 'algolist' code into Default_Engine + - The low-level MPI code is linked as C again + - Replaced BigInt's get_nibble with the more general get_substring + - Some documentation updates + +* 1.5.0, 2006-01-01 + - Moved all global/shared library state into a single object + - Mutex objects are created through mutex factories instead of a global + - Removed ::get_mutex(), ::initialize_mutex(), and Mutex::clone() + - Removed the RNG_Quality enum entirely + - There is now only a single global-use PRNG + - Removed the no_aliases and no_oids options for LibraryInitializer + - Removed the deprecated algorithms SEAL, ISAAC, and HAVAL + - Change es_ftw to use unbuffered I/O + +* 1.4.11, 2005-12-31 + - Changed Whirlpool diffusion matrix to match updated algorithm spec + - Fixed several engine module build errors introduced in 1.4.10 + - Fixed two build problems in es_capi; reported by Matthew Gregan + - Added a constructor to DataSource_Memory taking a std::string + - Placing the same Filter in multiple Pipes triggers an exception + - The configure script accepts --docdir and --libdir + - Merged doc/rngs.txt into the main API document + - Thanks to Joel Low for several bug reports on early tarballs of 1.4.11 + +* 1.4.10, 2005-12-18 + - Added an implementation of KASUMI, the block cipher used in 3G phones + - Refactored Pipe; output queues are now managed by a distinct class + - Made certain Filter facilities only available to subclasses of Fanout_Filter + - There is no longer any overhead in Pipe for a message that has been read out + - It is now possible to generate RSA keys as small as 128 bits + - Changed some of the core classes to derive from Algorithm as a virtual base + - Changed Randpool to use HMAC instead of a plain hash as the mixing function + - Fixed a bug in the allocators; found and fixed by Matthew Gregan + - Enabled the use of binary file I/O, when requested by the application + - The OpenSSL engine's block cipher code was missing some deallocation calls + - Disabled the es_ftw module on NetBSD, due to header problems there + - Fixed a problem preventing tm_hard from building on MacOS X on PowerPC + - Some cleanups for the modules that use inline assembler + - config.h is now stored in build/ instead of build/include/botan/ + - The header util.h was split into bit_ops.h, parsing.h, and util.h + - Cleaned up some redundant include directives + +* 1.4.9, 2005-11-06 + - Added the IBM-created AES candidate algorithm MARS + - Added the South Korean block cipher SEED + - Added the stream cipher Turing + - Added the new hash function FORK-256 + - Deprecated the ISAAC stream cipher + - Twofish and RC6 are significantly faster with GCC + - Much better support for 64-bit PowerPC + - Added support for high-resolution PowerPC timers + - Fixed a bug in the configure script causing problems on FreeBSD + - Changed ANSI X9.31 to support arbitrary block ciphers + - Make the configure script a bit less noisy + - Added more test vectors for some algorithms, including all the AES finalists + - Various cosmetic source code cleanups + +* 1.4.8, 2005-10-16 + - Resolved a bad performance problem in the allocators; fix by Matt Johnston + - Worked around a Visual Studio 2003 compilation problem introduced in 1.4.7 + - Renamed OMAC to CMAC to match the official NIST naming + - Added single byte versions of update() to PK_Signer and PK_Verifier + - Removed the unused reverse_bits and reverse_bytes functions + +* 1.4.7, 2005-09-25 + - Fixed major performance problems with recent versions of GNU C++ + - Added an implementation of the X9.31 PRNG + - Removed the X9.17 and FIPS 186-2 PRNG algorithms + - Changed defaults to use X9.31 PRNGs as global PRNG objects + - Documentation updates to reflect the PRNG changes + - Some cleanups related to the engine code + - Removed two useless headers, base_eng.h and secalloc.h + - Removed PK_Verifier::valid_signature + - Fixed configure/build system bugs affecting MacOS X builds + - Added support for the EKOPath x86-64 compiler + - Added missing destructor for BlockCipherModePaddingMethod + - Fix some build problems with Visual C++ 2005 beta + - Fix some build problems with Visual C++ 2003 Workshop + +* 1.4.6, 2005-03-13 + - Fix an error in the shutdown code introduced in 1.4.5 + - Setting base/pkcs8_tries to 0 disables the builtin fail-out + - Support for XMPP identifiers in X.509 certificates + - Duplicate entries in X.509 DNs are removed + - More fixes for Borland C++, from Friedemann Kleint + - Add a workaround for buggy iostreams + +* 1.4.5, 2005-02-26 + - Add support for AES encryption of private keys + - Minor fixes for PBES2 parameter decoding + - Internal cleanups for global state variables + - GCC 3.x version detection was broken in non-English locales + - Work around a Sun Forte bug affecting mem_pool.h + - Several fixes for Borland C++ 5.5, from Friedemann Kleint + - Removed inclusion of init.h into base.h + - Fixed a major bug in reading from certificate stores + - Cleaned up a couple of mutex leaks + - Removed some left-over debugging code + - Removed SSL3_MAC, SSL3_PRF, and TLS_PRF + +* 1.4.4, 2004-12-02 + - Further tweaks to the pooling allocator + - Modified EMSA3 to support SSL/TLS signatures + - Changes to support Qt/QCA, from Justin Karneges + - Moved mux_qt module code into mod_qt + - Fixes for HP-UX from Mike Desjardins + +* 1.4.3, 2004-11-06 + - Split up SecureAllocator into Allocator and Pooling_Allocator + - Memory locking allocators are more likely to be used + - Fixed the placement of includes in some modules + - Fixed broken installation procedure + - Fixes in configure script to support alternate install programs + - Modules can specify the minimum version they support + +* 1.4.2, 2004-10-31 + - Fixed a major CRL handling bug + - Cipher and hash operations can be offloaded to engines + - Added support for cipher and hash offload in OpenSSL engine + - Improvements for 64-bit CPUs without a widening multiply instruction + - Support for SHA2-* and Whirlpool with EMSA2 + - Fixed a long-standing build problem with conflicting include files + - Fixed some examples that hadn't been updated for 1.4.x + - Portability fixes for Solaris, *BSD, HP-UX, and others + - Lots of fixes and cleanups in the configure script + - Updated the Gentoo ebuild file + +* 1.4.1, 2004-10-10 + - Fixed major errors in the X.509 and PKCS #8 copy_key functions + - Added a LAST_MESSAGE meta-message number for Pipe + - Added new aliases (3DES and DES-EDE) for Triple-DES + - Added some new functions to PK_Verifier + - Cleaned up the KDF interface + - Disabled tm_posix on *BSD due to header issues + - Fixed a build problem on PowerPC with GNU C++ pre-3.4 + +* 1.4.0, 2004-06-26 + - Added the FIPS 186 RNG back + - Added copy_key functions for X.509 public keys and PKCS #8 private keys + - Fixed PKCS #1 signatures with RIPEMD-128 + - Moved some code around to avoid warnings with Sun ONE compiler + - Fixed a bug in botan-config affecting OpenBSD + - Fixed some build problems on Tru64, HP-UX + - Fixed compile problems with Intel C++, Compaq C++ + +* 1.3.14, 2004-06-12 + - Added support for AEP's AEP1000/AEP2000 crypto cards + - Added a Mutex module using Qt, from Justin Karneges + - Added support for engine loading in LibraryInitializer + - Tweaked SecureAllocator, giving 20% better performance under heavy load + - Added timer and memory locking modules for Win32 (tm_win32, ml_win32) + - Renamed PK_Engine to Engine_Core + - Improved the Karatsuba cutoff points + - Fixes for compiling with GCC 3.4 and Sun C++ 5.5 + - Fixes for Linux/s390, OpenBSD, and Solaris + - Added support for Linux/s390x + - The configure script was totally broken for 'generic' OS + - Removed Montgomery reduction due to bugs + - Removed an unused header, pkcs8alg.h + - check --validate returns an error code if any tests failed + - Removed duplicate entry in Unix command list for es_unix + - Moved the Cert_Usage enumeration into X509_Store + - Added new timing methods for PK benchmarks, clock_gettime and RDTSC + - Fixed a few minor bugs in the configure script + - Removed some deprecated functions from x509cert.h and pkcs10.h + - Removed the 'minimal' module, has to be updated for Engine support + - Changed MP_WORD_BITS macro to BOTAN_MP_WORD_BITS to clean up namespace + - Documentation updates + +* 1.3.13, 2004-05-15 + - Major fixes for Cygwin builds + - Minor MacOS X install fixes + - The configure script is a little better at picking the right modules + - Removed ml_unix from the 'unix' module set for Cygwin compatibility + - Fixed a stupid compile problem in pkcs10.h + +* 1.3.12, 2004-05-02 + - Added ability to remove old entries from CRLs + - Swapped the first two arguments of X509_CA::update_crl() + - Added an < operator for MemoryRegion, so it can be used as a std::map key + - Changed X.509 searching by DNS name from substring to full string compares + - Renamed a few X509_Certificate and PKCS10_Request member functions + - Fixed a problem when decoding some PKCS #10 requests + - Hex_Decoder would not check inputs, reported by Vaclav Ovsik + - Changed default CRL expire time from 30 days to 7 days + - X509_CRL's default PEM header is now "X509 CRL", for OpenSSL compatibility + - Corrected errors in the API doc, fixes from Ken Perano + - More documentation about the Pipe/Filter code + +* 1.3.11, 2004-04-01 + - Fixed two show-stopping bugs in PKCS10_Request + - Added some sanity checks in Pipe/Filter + - The DNS and URI entries would get swapped in subjectAlternativeNames + - MAC_Filter is now willing to not take a key at creation time + - Setting the expiration times of certs and CRLs is more flexible + - Fixed problems building on AIX with GCC + - Fixed some problems in the tutorial pointed out by Dominik Vogt + - Documentation updates + +* 1.3.10, 2004-03-27 + - Added support for OpenPGP's ASCII armor format + - Cleaned up the RNG system; seeding is much more flexible + - Added simple autoconfiguration abilities to configure.pl + - Fixed a GCC 2.95.x compile problem + - Updated the example configuration file + - Documentation updates + +* 1.3.9, 2004-03-07 + - Added an engine using OpenSSL (requires 0.9.7 or later) + - X509_Certificate would lose email addresses stored in the DN + - Fixed a missing initialization in a BigInt constructor + - Fixed several Visual C++ compile problems + - Fixed some BeOS build problems + - Fixed the WiderWake benchmark + +* 1.3.8, 2003-12-30 + - Internal changes to PK algorithms to divide data and algorithms + - DSA/DH/NR/ElGamal constructors accept taking just the private key again + - ElGamal keys now support being imported/exported as ASN.1 objects + - Much more consistent and complete error checking in PK algorithms + - Support for arbitrary backends (engines) for PK operations + - Added Montgomery reductions + - Added an engine that uses GNU MP (requires 4.1 or later) + - Removed the obsolete mp_gmp module + - Moved several initialization/shutdown functions to init.h + - Major refactoring of the memory containers + - New non-locking container, MemoryVector + - Fixed 64-bit problems in BigInt::set_bit/clear_bit + - Renamed PK_Key::check_params() to check_key() + - Some incompatible changes to OctetString + - Added version checking macros in version.h + - Removed the fips140 module pending rewrite + - Added some functions and hooks to help GUIs + - Moved more shared code into MDx_HashFunction + - Added a policy hook for specifying the encoding of X.509 strings + +* 1.3.7, 2003-12-12 + - Fixed a big security problem in es_unix + - Fixed several stability problems in es_unix + - Expanded the list of programs es_unix will try to use + - SecureAllocator now only preallocates blocks in special cases + - Added a special case in Global_RNG::seed for forcing a full poll + - Removed the FIPS 186 RNG added in 1.3.5 pending further testing + - Configure updates for PowerPC CPUs + - Removed the (never tested) VAX support + - Added support for S/390 Linux + +* 1.3.6, 2003-12-07 + - Added a new module 'minimal', which disables most algorithms + - SecureAllocator allocates a few blocks at startup + - A few minor MPI cleanups + - RPM spec file cleanups and fixes + +* 1.3.5, 2003-11-30 + - Major improvements in ASN.1 string handling + - Added partial support for ASN.1 UTF8 STRINGs and BMP STRINGs + - Added partial support for the X.509v3 certificate policies extension + - Centralized the handling of character set information + - Added FIPS 140-2 startup self tests + - Added a module (fips140) for doing extra FIPS 140-2 tests + - Added FIPS 186-2 RNG + - Improved ASN.1 BIT STRING handling + - Removed a memory leak in PKCS10_Request + - The encoding of DirectoryString now follows PKIX guidelines + - Fixed some of the character set dependencies + - Fixed a DER encoding error for tags greater than 30 + - The BER decoder can now handle tags larger than 30 + - Fixed tm_hard.cpp to recognize SPARC on more systems + - Workarounds for a GCC 2.95.x bug in x509find.cpp + - RPM changed to install into /usr instead of /usr/local + - Added support for QNX + +* 1.2.8, 2003-11-21 + - Merged several important bug fixes from 1.3.x + +* 1.3.4, 2003-11-21 + - Added a module that does certain MPI operations using GNU MP + - Added the X9.42 Diffie-Hellman PRF + - The Zlib and Bzip2 objects now use custom allocators + - Added member functions for directly hashing/MACing SecureVectors + - Minor optimizations to the MPI addition and subtraction algorithms + - Some cleanups in the low-level MPI code + - Created separate AES-{128,192,256} objects + +* 1.3.3, 2003-11-17 + - The library can now be repeatedly initialized and shutdown without crashing + - Fixed an off-by-one error in the CTS code + - Fixed an error in the EMSA4 verification code + - Fixed a memory leak in mutex.cpp (pointed out by James Widener) + - Fixed a memory leak in Pthread_Mutex + - Fixed several memory leaks in the testing code + - Bulletproofed the EMSA/EME/KDF/MGF retrieval functions + - Minor cleanups in SecureAllocator + - Removed a needless mutex guarding the (stateless) global timer + - Fixed a piece of bash-specific code in botan-config + - X.509 objects report more information about decoding errors + - Cleaned up some of the exception handling + - Updated the example config file with new OIDSs + - Moved the build instructions into a separate document, building.tex + +* 1.3.2, 2003-11-13 + - Fixed a bug preventing DSA signatures from verifying on X.509 objects + - Made the X509_Store search routines more efficient and flexible + - Added a function to X509_PublicKey to do easy public/private key matching + - Added support for decoding indefinite length BER data + - Changed Pipe's peek() to take an offset + - Removed Filter::set_owns in favor of the new incr_owns function + - Removed BigInt::zero() and BigInt::one() + - Renamed the PEM related options from base/pem_* to pem/* + - Added an option to specify the line width when encoding PEM + - Removed the "rng/safe_longterm" option; it's always on now + - Changed the cipher used for RNG super-encryption from ARC4 to WiderWake4+1 + - Cleaned up the base64/hex encoders and decoders + - Added an ASN.1/BER decoder as an example + - AES had its internals marked 'public' in previous versions + - Changed the value of the ASN.1 NO_OBJECT enum + - Various new hacks in the configure script + - Removed the already nominal support for SunOS + +* 1.3.1, 2003-11-04 + - Generalized a few pieces of the DER encoder + - PKCS8::load_key would fail if handed an unencrypted key + - Added a failsafe so PKCS #8 key decoding can't go into an infinite loop + +* 1.3.0, 2003-11-02 + - Major redesign of the PKCS #8 private key import/export system + - Added a small amount of UI interface code for getting passphrases + - Added heuristics that tell if a key, cert, etc is stored as PEM or BER + - Removed CS-Cipher, SHARK, ThreeWay, MD5-MAC, and EMAC + - Removed certain deprecated constructors of RSA, DSA, DH, RW, NR + - Made PEM decoding more forgiving of extra text before the header + +* 1.2.7, 2003-10-31 + - Added support for reading configuration files + - Added constructors so NR and RW keys can be imported easily + - Fixed mp_asm64, which was completely broken in 1.2.6 + - Removed tm_hw_ia32 module; replaced by tm_hard + - Added support for loading certain oddly formed RSA certificates + - Fixed spelling of NON_REPUDIATION enum + - Renamed the option default_to_ca to v1_assume_ca + - Fixed a minor bug in X.509 certificate generation + - Fixed a latent bug in the OID lookup code + - Updated the RPM spec file + - Added to the tutorial + +* 1.2.6, 2003-07-04 + - Major performance increase for PK algorithms on most 64-bit systems + - Cleanups in the low-level MPI code to support asm implementations + - Fixed build problems with some versions of Compaq's C++ compiler + - Removed useless constructors for NR public and private keys + - Removed support for the patch_file directive in module files + - Removed several deprecated functions + +* 1.2.5, 2003-06-22 + - Fixed a tricky and long-standing memory leak in Pipe + - Major cleanups and fixes in the memory allocation system + - Removed alloc_mlock, which has been superseded by the ml_unix module + - Removed a denial of service vulnerability in X509_Store + - Fixed compilation problems with VS .NET 2003 and Codewarrior 8 + - Added another variant of PKCS8::load_key, taking a memory buffer + - Fixed various minor/obscure bugs which occurred when MP_WORD_BITS != 32 + - BigInt::operator%=(word) was a no-op if the input was a power of 2 + - Fixed portability problems in BigInt::to_u32bit + - Fixed major bugs in SSL3-MAC + - Cleaned up some messes in the PK algorithms + - Cleanups and extensions for OMAC and EAX + - Made changes to the entropy estimation function + - Added a 'beos' module set for use on BeOS + - Officially deprecated a few X509:: and PKCS8:: functions + - Moved the contents of primes.h to numthry.h + - Moved the contents of x509opt.h to x509self.h + - Removed the (empty) desx.h header + - Documentation updates + +* 1.2.4, 2003-05-29 + - Fixed a bug in EMSA1 affecting NR signature verification + - Fixed a few latent bugs in BigInt related to word size + - Removed an unused function, mp_add2_nc, from the MPI implementation + - Reorganized the core MPI files + +* 1.2.3, 2003-05-20 + - Fixed a bug that prevented DSA/NR key generation + - Fixed a bug that prevented importing some root CA certs + - Fixed a bug in the BER decoder when handing optional bit or byte strings + - Fixed the encoding of authorityKeyIdentifier in X509_CA + - Added a sanity check in PBKDF2 for zero length passphrases + - Added versions of X509::load_key and PKCS8::load_key that take a file name + - X509_CA generates 128 bit serial numbers now + - Added tests to check PK key generation + - Added a simplistic X.509 CA example + - Cleaned up some of the examples + +* 1.2.2, 2003-05-13 + - Add checks to prevent any BigInt bugs from revealing an RSA or RW key + - Changed the interface of Global_RNG::seed + - Major improvements for the es_unix module + - Added another Win32 entropy source, es_win32 + - The Win32 CryptoAPI entropy source can now poll multiple providers + - Improved the BeOS entropy source + - Renamed pipe_unixfd module to fd_unix + - Fixed a file descriptor leak in the EGD module + - Fixed a few locking bugs + +* 1.2.1, 2003-05-06 + - Added ANSI X9.23 compatible CBC padding + - Added an entropy source using Win32 CryptoAPI + - Removed the Pipe I/O operators taking a FILE* + - Moved the BigInt encoding/decoding functions into the BigInt class + - Integrated several fixes for VC++ 7 (from Hany Greiss) + - Fixed the configure.pl script for Windows builds + +* 1.2.0, 2003-04-28 + - Tweaked the Karatsuba cut-off points + - Increased the allowed keylength of HMAC and Blowfish + - Removed the 'mpi_ia32' module, pending rewrite + - Workaround a GCC 2.95.x bug in eme1.cpp + +* 1.1.13, 2003-04-22 + - Added OMAC + - Added EAX authenticated cipher mode + - Diffie-Hellman would not do blinding in some cases + - Optimized the OFB and CTR modes + - Corrected Skipjack's word ordering, as per NIST clarification + - Support for all subject/issuer attribute types required by RFC 3280 + - The removeFromCRL CRL reason code is now handled correctly + - Increased the flexibility of the allocators + - Renamed Rijndael to AES, created aes.h, deleted rijndael.h + - Removed support for the 'no_timer' LibraryInitializer option + - Removed 'es_pthr' module, pending further testing + - Cleaned up get_ciph.cpp + +* 1.1.12, 2003-04-15 + - Fixed a ASN.1 string encoding bug + - Fixed a pair of X509_DN encoding problems + - Base64_Decoder and Hex_Decoder can now validate input + - Removed support for the LibraryInitializer option 'egd_path' + - Added tests for DSA X.509 and PKCS #8 key formats + - Removed a long deprecated feature of DH_PrivateKey's constructor + - Updated the RPM .spec file + - Major documentation updates + +* 1.1.11, 2003-04-07 + - Added PKCS #10 certificate requests + - Changed X509_Store searching interface to be more flexible + - Added a generic Certificate_Store interface + - Added a function for generating self-signed X.509 certs + - Cleanups and changes to X509_CA + - New examples for PKCS #10 and self-signed certificates + - Some documentation updates + +* 1.1.10, 2003-04-03 + - X509_CA can now generate new X.509 CRLs + - Added blinding for RSA, RW, DH, and ElGamal to prevent timing attacks + - More certificate and CRL extensions/attributes are supported + - Better DN handling in X.509 certificates/CRLs + - Added a DataSink hierarchy (suggested by Jim Darby) + - Consolidated SecureAllocator and ManagedAllocator + - Many cleanups and generalizations + - Added a (slow) pthreads based EntropySource + - Fixed some threading bugs + +* 1.1.9, 2003-02-25 + - Added support for using X.509v2 CRLs + - Fixed several bugs in the path validation algorithm + - Certificates can be verified for a particular usage + - Algorithm for comparing distinguished names now follows X.509 + - Cleaned up the code for the es_beos, es_ftw, es_unix modules + - Documentation updates + +* 1.1.8, 2003-01-29 + - Fixes for the certificate path validation algorithm in X509_Store + - Fixed a bug affecting X509_Certificate::is_ca_cert() + - Added a general configuration interface for policy issues + - Cleanups and API changes in the X.509 CA, cert, and store code + - Made various options available for X509_CA users + - Changed X509_Time's interface to work around time_t problems + - Fixed a theoretical weakness in Randpool's entropy mixing function + - Fixed problems compiling with GCC 2.95.3 and GCC 2.96 + - Fixed a configure bug (reported by Jon Wilson) affecting MinGW + +* 1.1.7, 2003-01-12 + - Fixed an obscure but dangerous bug in SecureVector::swap + - Consolidated SHA-384 and SHA-512 to save code space + - Added SSL3-MAC and SSL3-PRF + - Documentation updates, including a new tutorial + +* 1.0.2, 2003-01-12 + - Fixed an obscure SEGFAULT causing bug in Pipe + - Fixed an obscure but dangerous bug in SecureVector::swap + +* 1.1.6, 2002-12-10 + - Initial support for X.509v3 certificates and CAs + - Major redesign/rewrite of the ASN.1 encoding/decoding code + - Added handling for DSA/NR signatures encoded as DER SEQUENCEs + - Documented the generic cipher lookup interface + - Added an (untested) entropy source for BeOS + - Various cleanups and bug fixes + +* 1.1.5, 2002-11-17 + - Added the discrete logarithm integrated encryption system (DLIES) + - Various optimizations for BigInt + - Added support for assembler optimizations in modules + - Added BigInt x86 optimizations module (mpi_ia32) + +* 1.1.4, 2002-11-10 + - Speedup of 15-30% for PK algorithms + - Implemented the PBES2 encryption scheme + - Fixed a potential bug in decoding RSA and RW private keys + - Changed the DL_Group class interface to handle different formats better + - Added support for PKCS #3 encoded DH parameters + - X9.42 DH parameters use a PEM label of 'X942 DH PARAMETERS' + - Added key pair consistency checking + - Fixed a compatibility problem with gcc 2.96 (pointed out by Hany Greiss) + - A botan-config script is generated at configure time + - Documentation updates + +* 1.1.3, 2002-11-03 + - Added a generic public/private key loading interface + - Fixed a small encoding bug in RSA, RW, and DH + - Changed the PK encryption/decryption interface classes + - ECB supports using padding methods + - Added a function-based interface for library initialization + - Added support for RIPEMD-128 and Tiger PKCS#1 v1.5 signatures + - The cipher mode benchmarks now use 128-bit AES instead of DES + - Removed some obsolete typedefs + - Removed OpenCL support (opencl.h, the OPENCL_* macros, etc) + - Added tests for PKCS #8 encoding/decoding + - Added more tests for ECB and CBC + +* 1.1.2, 2002-10-21 + - Support for PKCS #8 encoded RSA, DSA, and DH private keys + - Support for Diffie-Hellman X.509 public keys + - Major reorganization of how X.509 keys are handled + - Added PKCS #5 v2.0's PBES1 encryption scheme + - Added a generic cipher lookup interface + - Added the WiderWake4+1 stream cipher + - Added support for sync-able stream ciphers + - Added a 'paranoia level' option for the LibraryInitializer + - More security for RNG output meant for long term keys + - Added documentation for some of the new 1.1.x features + - CFB's feedback argument is now specified in bits + - Renamed CTR class to CTR_BE + - Updated the RSA and DSA examples to use X.509 and PKCS #8 key formats + +* 1.1.1, 2002-10-15 + - Added the Korean hash function HAS-160 + - Partial support for RSA and DSA X.509 public keys + - Added a mostly functional BER encoder/decoder + - Added support for non-deterministic MAC functions + - Initial support for PEM encoding/decoding + - Internal cleanups in the PK algorithms + - Several new convenience functions in Pipe + - Fixed two nasty bugs in Pipe + - Messed with the entropy sources for es_unix + - Discrete logarithm groups are checked for safety more closely now + - For compatibility with GnuPG, ElGamal now supports DSA-style groups + +* 1.1.0, 2002-09-14 + - Added entropy estimation to the RNGs + - Improved the overall design of both Randpool and ANSI_X917_RNG + - Added a separate RNG for nonce generation + - Added window exponentiation support in power_mod + - Added a get_s2k function and the PKCS #5 S2K algorithms + - Added the TLSv1 PRF + - Replaced BlockCipherModeIV typedef with InitializationVector class + - Renamed PK_Key_Agreement_Scheme to PK_Key_Agreement + - Renamed SHA1 -> SHA_160 and SHA2_x -> SHA_x + - Added support for RIPEMD-160 PKCS#1 v1.5 signatures + - Changed the key agreement scheme interface + - Changed the S2K and KDF interfaces + - Better SCAN compatibility for HAVAL, Tiger, MISTY1, SEAL, RC5, SAFER-SK + - Added support for variable-pass Tiger + - Major speedup for Rabin-Williams key generation + +* 1.0.1, 2002-09-14 + - Fixed a minor bug in Randpool::random() + - Added some new aliases and typedefs for 1.1.x compatibility + - The 4096-bit RSA benchmark key was decimal instead of hex + - EMAC was returning an incorrect name + +* 1.0.0, 2002-08-26 + - Octal I/O of BigInt is now supported + - Fixed portability problems in the es_egd module + - Generalized IV handling in the block cipher modes + - Added Karatsuba multiplication and k-ary exponentiation + - Fixed a problem in the multiplication routines + +* 0.9.2, 2002-08-18 + - DH_PrivateKey::public_value() was returning the wrong value + - Various BigInt optimizations + - The filters.h header now includes hex.h and base64.h + - Moved Counter mode to ctr.h + - Fixed a couple minor problems with VC++ 7 + - Fixed problems with the RPM spec file + +* 0.9.1, 2002-08-10 + - Grand rename from OpenCL to Botan + - Major optimizations for the PK algorithms + - Added ElGamal encryption + - Added Whirlpool + - Tweaked memory allocation parameters + - Improved the method of seeding the global RNG + - Moved pkcs1.h to eme_pkcs.h + - Added more test vectors for some algorithms + - Fixed error reporting in the BigInt tests + - Removed Default_Timer, it was pointless + - Added some new example applications + - Removed some old examples that weren't that interesting + - Documented the compression modules + +* 0.9.0, 2002-08-03 + - EMSA4 supports variable salt size + - PK_* can take a string naming the encoding method to use + - Started writing some internals documentation + +* 0.8.7, 2002-07-30 + - Fixed bugs in EME1 and EMSA4 + - Fixed a potential crash at shutdown + - Cipher modes returned an ill-formed name + - Removed various deprecated types and headers + - Cleaned up the Pipe interface a bit + - Minor additions to the documentation + - First stab at a Visual C++ makefile (doc/Makefile.vc7) + +* 0.8.6, 2002-07-25 + - Added EMSA4 (aka PSS) + - Brought the manual up to date; many corrections and additions + - Added a parallel hash function construction + - Lookup supports all available algorithms now + - Lazy initialization of the lookup tables + - Made more discrete logarithm groups available through get_dl_group() + - StreamCipher_Filter supports seeking (if the underlying cipher does) + - Minor optimization for GCD calculations + - Renamed SAFER_SK128 to SAFER_SK + - Removed many previously deprecated functions + - Some now-obsolete functions, headers, and types have been deprecated + - Fixed some bugs in DSA prime generation + - DL_Group had a constructor for DSA-style prime gen but it wasn't defined + - Reversed the ordering of the two arguments to SEAL's constructor + - Fixed a threading problem in the PK algorithms + - Fixed a minor memory leak in lookup.cpp + - Fixed pk_types.h (it was broken in 0.8.5) + - Made validation tests more verbose + - Updated the check and example applications + +* 0.8.5, 2002-07-21 + - Major changes to constructors for DL-based cryptosystems (DSA, NR, DH) + - Added a DL_Group class + - Reworking of the pubkey internals + - Support in lookup for aliases and PK algorithms + - Renamed CAST5 to CAST_128 and CAST256 to CAST_256 + - Added EMSA1 + - Reorganization of header files + - LibraryInitializer will install new allocator types if requested + - Fixed a bug in Diffie-Hellman key generation + - Did a workaround in pipe.cpp for GCC 2.95.x on Linux + - Removed some debugging code from init.cpp that made FTW ES useless + - Better checking for invalid arguments in the PK algorithms + - Reduced Base64 and Hex default line length (if line breaking is used) + - Fixes for HP's aCC compiler + - Cleanups in BigInt + +* 0.8.4, 2002-07-14 + - Added Nyberg-Rueppel signatures + - Added Diffie-Hellman key exchange (kex interface is subject to change) + - Added KDF2 + - Enhancements to the lookup API + - Many things formerly taking pointers to algorithms now take names + - Speedups for prime generation + - LibraryInitializer has support for seeding the global RNG + - Reduced SAFER-SK128 memory consumption + - Reversed the ordering of public and private key values in DSA constructor + - Fixed serious bugs in MemoryMapping_Allocator + - Fixed memory leak in Lion + - FTW_EntropySource was not closing the files it read + - Fixed line breaking problem in Hex_Encoder + +* 0.8.3, 2002-06-09 + - Added DSA and Rabin-Williams signature schemes + - Added EMSA3 + - Added PKCS#1 v1.5 encryption padding + - Added Filters for PK algorithms + - Added a Keyed_Filter class + - LibraryInitializer processes arguments now + - Major revamp of the PK interface classes + - Changed almost all of the Filters for non-template operation + - Changed HMAC, Lion, Luby-Rackoff to non-template classes + - Some fairly minor BigInt optimizations + - Added simple benchmarking for PK algorithms + - Added hooks for fixed base and fixed exponent modular exponentiation + - Added some examples for using RSA + - Numerous bugfixes and cleanups + - Documentation updates + +* 0.8.2, 2002-05-18 + - Added an (experimental) algorithm lookup interface + - Added code for directly testing BigInt + - Added SHA2-384 + - Optimized SHA2-512 + - Major optimization for Adler32 (thanks to Dan Nicolaescu) + - Various minor optimizations in BigInt and related areas + - Fixed two bugs in X9.19 MAC, both reported by Darren Starsmore + - Fixed a bug in BufferingFilter + - Made a few fixes for MacOS X + - Added a workaround in configure.pl for GCC 2.95.x + - Better support for PowerPC, ARM, and Alpha + - Some more cleanups + +* 0.8.1, 2002-05-06 + - Major code cleanup (check doc/deprecated.txt) + - Various bugs fixed, including several portability problems + - Renamed MessageAuthCode to MessageAuthenticationCode + - A replacement for X917 is in x917_rng.h + - Changed EMAC to non-template class + - Added ANSI X9.19 compatible CBC-MAC + - TripleDES now supports 128 bit keys + +* 0.8.0, 2002-04-24 + - Merged BigInt: many bugfixes and optimizations since alpha2 + - Added RSA (rsa.h) + - Added EMSA2 (emsa2.h) + - Lots of new interface code for public key algorithms (pk_base.h, pubkey.h) + - Changed some interfaces, including SymmetricKey, to support the global rng + - Fixed a serious bug in ManagedAllocator + - Renamed RIPEMD128 to RIPEMD_128 and RIPEMD160 to RIPEMD_160 + - Removed some deprecated stuff + - Added a global random number generator (rng.h) + - Added clone functions to most of the basic algorithms + - Added a library initializer class (init.h) + - Version macros in version.h + - Moved the base classes from opencl.h to base.h + - Renamed the bzip2 module to comp_bzip2 and zlib to comp_zlib + - Documentation updates for the new stuff (still incomplete) + - Many new deprecated things: check doc/deprecated.txt + +* 0.7.10, 2002-04-07 + - Added EGD_EntropySource module (es_egd) + - Added a file tree walking EntropySource (es_ftw) + - Added MemoryLocking_Allocator module (alloc_mlock) + - Renamed the pthr_mux, unix_rnd, and mmap_mem modules + - Changed timer mechanism; the clock method can be switched on the fly. + - Renamed MmapDisk_Allocator to MemoryMapping_Allocator + - Renamed ent_file.h to es_file.h (ent_file.h is around, but deprecated) + - Fixed several bugs in MemoryMapping_Allocator + - Added more default sources for Unix_EntropySource + - Changed SecureBuffer to use same allocation methods as SecureVector + - Added bigint_divcore into mp_core to support BigInt alpha2 release + - Removed some Pipe functions deprecated since 0.7.8 + - Some fixes for the configure program + +* 0.7.9, 2002-03-19 + - Memory allocation substantially revamped + - Added memory allocation method based on mmap(2) in the mmap_mem module + - Added ECB and CTS block cipher modes (ecb.h, cts.h) + - Added a Mutex interface (mutex.h) + - Added module pthr_mux, implementing the Mutex interface + - Added Threaded Filter interface (thr_filt.h) + - All algorithms can now by keyed with SymmetricKey objects + - More testing occurs with --validate (expected failures) + - Fixed two bugs reported by Hany Greiss, in Luby-Rackoff and RC6 + - Fixed a buffering bug in Bzip_Decompress and Zlib_Decompress + - Made X917 safer (and about 1/3 as fast) + - Documentation updates + +* 0.7.8, 2002-02-28 + - More capabilities for Pipe, inspired by SysV STREAMS, including peeking, + better buffering, and stack ops. NOT BACKWARDS COMPATIBLE: SEE DOCUMENTATION + - Added a BufferingFilter class + - Added popen() based EntropySource for generic Unix systems (unix_rnd) + - Moved 'devrand' module into main distribution (ent_file.h), renamed to + File_EntropySource, and changed interface somewhat. + - Made Randpool somewhat more conservative and also 25% faster + - Minor fixes and updates for the configure script + - Added some tweaks for memory allocation + - Documentation updates for the new Pipe interface + - Fixed various minor bugs + - Added a couple of new example programs (stack and hasher2) + +* 0.7.7, 2001-11-24 + - Filter::send now works in the constructor of a Filter subclass + - You may now have to include explicitly in some code + - Added preliminary PK infrastructure classes in pubkey.h and pkbase.h + - Enhancements to SecureVector (append, destroy functions) + - New infrastructure for secure memory allocation + - Added IEEE P1363 primitives MGF1, EME1, KDF1 + - Rijndael optimizations and cleanups + - Changed CipherMode to BlockCipherMode(B*) + - Fixed a nasty bug in pipe_unixfd + - Added portions of the BigInt code into the main library + - Support for VAX, SH, POWER, PowerPC-64, Intel C++ + +* 0.7.6, 2001-10-14 + - Fixed several serious bugs in SecureVector created in 0.7.5 + - Square optimizations + - Fixed shared objects on MacOS X and HP-UX + - Fixed static libs for KCC 4.0; works with KCC 3.4g as well + - Full support for Athlon and K6 processors using GCC + - Added a table of prime numbers < 2**16 (primes.h) + - Some minor documentation updates + +* 0.7.5, 2001-08-19 + - Split checksum.h into adler32.h, crc24.h, and crc32.h + - Split modes.h into cbc.h, cfb.h, and ofb.h + - CBC_wPadding* has been replaced by CBC_Encryption and CBC_Decryption + - Added OneAndZeros and NoPadding methods for CBC + - Added Lion, a very fast block cipher construction + - Added an S2K base class (s2k.h) and an OpenPGP_S2K class (pgp_s2k.h) + - Basic types (ciphers, hashes, etc) know their names now (call name()) + - Changed the EntropySource type somewhat + - Big speed-ups for ISAAC, Adler32, CRC24, and CRC32 + - Optimized CAST-256, DES, SAFER-SK, Serpent, SEAL, MD2, and RIPEMD-160 + - Some semantics of SecureVector have changed slightly + - The mlock module has been removed for the time being + - Added string handling functions for hashes and MACs + - Various non-user-visible cleanups + - Shared library soname is now set to the full version number + +* 0.7.4, 2001-07-15 + - New modules: Zlib, gettimeofday and x86 RTC timers, Unix I/O for Pipe + - Fixed a vast number of errors in the config script/makefile/specfile + - Pipe now has a stdio(3) interface as well as C++ iostreams + - ARC4 supports skipping the first N bytes of the cipher stream (ala MARK4) + - Bzip2 supports decompressing multiple concatenated streams, and flushing + - Added a simple 'overall average' score to the benchmarks + - Fixed a small bug in the POSIX timer module + - Removed a very-unlikely-to-occur bug in most of the hash functions + - filtbase.h now includes , not + - Minor documentation updates + +* 0.7.3, 2001-06-08 + - Fix build problems on Solaris/SPARC + - Fix build problems with Perl versions < 5.6 + - Fixed some stupid code that broke on a few compilers + - Added string handling functions to Pipe + - MISTY1 optimizations + +* 0.7.2, 2001-06-03 + - Build system supports modules + - Added modules for mlock, a /dev/random EntropySource, POSIX1.b timers + - Added Bzip2 compression filter, contributed by Peter Jones + - GNU make no longer required (tested with 4.4BSD pmake and Solaris make) + - Fixed minor bug in several of the hash functions + - Various other minor fixes and changes + - Updates to the documentation + +* 0.7.1, 2001-05-16 + - Rewrote configure script: more consistent and complete + - Made it easier to find out parameters of types at run time (opencl.h) + - New functions for finding the version being used (version.h) + - New SymmetricKey interface for Filters (symkey.h) + - InvalidKeyLength now records what the invalid key length was + - Optimized DES, CS-Cipher, MISTY1, Skipjack, XTEA + - Changed GOST to use correct S-box ordering (incompatible change) + - Benchmark code was almost totally rewritten + - Many more entries in the test vector file + - Fixed minor and idiotic bug in check.cpp + +* 0.7.0, 2001-03-01 + - First public release + diff --git a/src/libs/3rdparty/botan/doc/pgpkeys.asc b/src/libs/3rdparty/botan/doc/pgpkeys.asc new file mode 100644 index 00000000000..378230f32c6 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/pgpkeys.asc @@ -0,0 +1,83 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2.0.9 (GNU/Linux) + +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 +=QyrG +-----END PGP PUBLIC KEY BLOCK----- diff --git a/src/libs/3rdparty/botan/doc/scripts/comba.py b/src/libs/3rdparty/botan/doc/scripts/comba.py new file mode 100644 index 00000000000..ce3cfed77a5 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/scripts/comba.py @@ -0,0 +1,65 @@ +#!/usr/bin/python + +import sys + +def comba_indexes(N): + + indexes = [] + + for i in xrange(0, 2*N): + x = [] + + for j in xrange(max(0, i-N+1), min(N, i+1)): + x += [(j,i-j)] + indexes += [sorted(x)] + + return indexes + +def comba_sqr_indexes(N): + + indexes = [] + + for i in xrange(0, 2*N): + x = [] + + for j in xrange(max(0, i-N+1), min(N, i+1)): + if j < i-j: + x += [(j,i-j)] + else: + x += [(i-j,j)] + indexes += [sorted(x)] + + return indexes + +def comba_multiply_code(N): + indexes = comba_indexes(N) + + for (i,idx) in zip(range(0, len(indexes)), indexes): + for pair in idx: + print "word3_muladd(&w2, &w1, &w0, x[%2d], y[%2d]);" % (pair) + print "z[%2d] = w0; w0 = w1; w1 = w2; w2 = 0;" % (i) + +def comba_square_code(N): + indexes = comba_sqr_indexes(N) + + for (rnd,idx) in zip(range(0, len(indexes)), indexes): + for (i,pair) in zip(range(0, len(idx)), idx): + if pair[0] == pair[1]: + print " word3_muladd(&w2, &w1, &w0, x[%2d], x[%2d]);" % (pair) + elif i % 2 == 0: + print " word3_muladd_2(&w2, &w1, &w0, x[%2d], x[%2d]);" % (pair[0], pair[1]) + if rnd < len(idx)-2: + print " z[%2d] = w0; w0 = w1; w1 = w2; w2 = 0;\n" % (rnd) + elif rnd == len(idx)-1: + print " z[%2d] = w0;\n" % (rnd) + else: + print " z[%2d] = w1;\n" % (rnd) + +def main(args = None): + if args is None: + args = sys.argv + #comba_square_code(int(args[1])) + comba_multiply_code(int(args[1])) + +if __name__ == '__main__': + sys.exit(main()) diff --git a/src/libs/3rdparty/botan/doc/scripts/combine_bmarks.pl b/src/libs/3rdparty/botan/doc/scripts/combine_bmarks.pl new file mode 100644 index 00000000000..b6436496e85 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/scripts/combine_bmarks.pl @@ -0,0 +1,120 @@ +#!/usr/bin/perl -w + +use strict; + +my %results; +my %pk; + +my %pk_algos; +my %algos; + +my %filename_to_desc; + +for my $filename (@ARGV) { + + open IN, "<$filename" or die "Couldn't read $filename ($!)\n"; + + my $desc = ; + chomp $desc; + + $results{$desc} = {}; + + while() { + if(/(.*): +(.*) Mbytes\/sec/) { + $results{$desc}{$1} = $2; + $algos{$1} = undef; + } + if(/(.*): (.*) ops \/ second \((.*)\)/) { + my $alg = "$1"; + $alg = "$alg $3" if defined($3); + $pk{$desc}{$alg} = $2; + $pk_algos{$alg} = undef; + } + } +} + + +sub print_table { + my @columns = sort keys %results; + + print "\n

    All results are in MiB / second:\n"; + print "\n\n"; + + my %col_index = (); + + my $line = "\n"; + + print $line; + + $line = ''; + + foreach my $algo (sort keys %algos) { + $line = "
    Algorithm "; + + foreach my $col (@columns) { + $col_index{$col} = length($line); + $line .= "" . $col . " "; + } + + $line .= "\n
    $algo "; + + for my $col (@columns) { + my $result = $results{$col}{$algo}; + $result = "-" if not defined($result); + + $result = "$result"; + + $line .= ' ' while(length($line) < ($col_index{$col})); + $line .= $result; + + } + + print $line, "\n"; + $line = ''; + } + + print "
    \n"; +} + + +sub print_pk_table { + my @columns = sort keys %pk; + + print "\n

    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 hKv+qvf}I^#aY +/* include other headers here */ + +int main() + { + LibraryInitializer init; + /* now do stuff */ + return 0; + } +\end{verbatim} + +\section{Hashing a File} + +\section{Symmetric Cryptography} + +\subsection{Encryption with a passphrase} + +Probably the most common crypto problem is encrypting a file (or some data that +is in-memory) using a passphrase. There are a million ways to do this, most of +them bad. In particular, you have to protect against weak passphrases, +people reusing a passphrase many times, accidental and deliberate modification, +and a dozen other potential problems. + +We'll start with a simple method that is commonly used, and show the problems +that can arise. Each subsequent solution will modify the previous one to +prevent one or more common problems, until we arrive at a good version. + +In these examples, we'll always use Serpent in Cipher-Block Chaining +(CBC) mode. Whenever we need a hash function, we'll use SHA-256, since +that is a common and well-known hash that is thought to be secure. + +In all examples, we choose to derive the Initialization Vector (IV) from the +passphrase. Another (probably more common) alternative is to generate the IV +randomly and include it at the beginning of the message. Either way is +acceptable, and can be secure. The method used here was chosen to make for more +interesting examples (because it's harder to get right), and may not be an +appropriate choice for some environments. + +First, some notation. The passphrase is stored as a \type{std::string} named +\variable{passphrase}. The input and output files (\variable{infile} and +\variable{outfile}) are of types \type{std::ifstream} and \type{std::ofstream} +(respectively). + +\subsubsection{First try} + +We hash the passphrase with SHA-256, and use the resulting hash to key +Serpent. To generate the IV, we prepend a single '0' character to the +passphrase, hash it, and truncate it to 16 bytes (which is Serpent's +block size). + +\begin{verbatim} + HashFunction* hash = get_hash("SHA-256"); + + SymmetricKey key = hash->process(passphrase); + SecureVector raw_iv = hash->process('0' + passphrase); + InitializationVector iv(raw_iv, 16); + + Pipe pipe(get_cipher("Serpent/CBC/PKCS7", key, iv, ENCRYPTION)); + + pipe.start_msg(); + infile >> pipe; + pipe.end_msg(); + outfile << pipe; +\end{verbatim} + +\subsubsection{Problem 1: Buffering} + +There is a problem with the above code, if the input file is fairly large as +compared to available memory. Specifically, all the encrypted data is stored +in memory, and then flushed to \variable{outfile} in a single go at the very +end. If the input file is big (say, a gigabyte), this will be most problematic. + +The solution is to use a \type{DataSink} to handle the output for us (writing +to \arg{outfile} will be implicit with writing to the \type{Pipe}). We can do +this by replacing the last few lines with: + +\begin{verbatim} + Pipe pipe(get_cipher("Serpent/CBC/PKCS7", key, iv, ENCRYPTION), + new DataSink_Stream(outfile)); + + pipe.start_msg(); + infile >> pipe; + pipe.end_msg(); +\end{verbatim} + +\subsubsection{Problem 2: Deriving the key and IV} + +Hash functions like SHA-256 are deterministic; if the same passphrase +is supplied twice, then the key (and in our case, the IV) will be the +same. This is very dangerous, and could easily open the whole system +up to attack. What we need to do is introduce a salt (or nonce) into +the generation of the key from the passphrase. This will mean that the +key will not be the same each time the same passphrase is typed in by +a user. + +There is another problem with using a bare hash function to derive +keys. While it's inconceivable (based on our current understanding of +thermodynamics and theories of computation) that an attacker could +brute-force a 256-bit key, it would be fairly simple for them to +compute the SHA-256 hashes of various common passwords ('password', +the name of the dog, the significant other's middle name, favorite +sports team) and try those as keys. So we want to slow the attacker +down if we can, and an easy way to do that is to iterate the hash +function a bunch of times (say, 1024 to 4096 times). This will involve +only a small amount of effort for a legitimate user (since they only +have to compute the hashes once, when they type in their passphrase), +but an attacker, trying out a large list of potential passphrases, +will be seriously annoyed (and slowed down) by this. + +In this iteration of the example, we'll kill these two birds with one +stone, and derive the key from the passphrase using a S2K (string to +key) algorithm (these are also often called PBKDF algorithms, for +Password-Based Key Derivation Function). In this example, we use +PBKDF2 with Hash Message Authentication Code (HMAC(SHA-256)), which is +specified in PKCS \#5. We replace the first four lines of code from +the first example with: + +\begin{verbatim} + S2K* s2k = get_s2k("PBKDF2(SHA-256)"); + // hard-coded iteration count for simplicity; should be sufficient + s2k->set_iterations(4096); + // 8 octets == 64-bit salt; again, good enough + s2k->new_random_salt(8); + SecureVector the_salt = s2k->current_salt(); + + // 48 octets == 32 for key + 16 for IV + SecureVector key_and_IV = s2k->derive_key(48, passphrase).bits_of(); + + SymmetricKey key(key_and_IV, 32); + InitializationVector iv(key_and_IV + 32, 16); +\end{verbatim} + +To complete the example, we have to remember to write out the salt (stored in +\variable{the\_salt}) at the beginning of the file. The receiving side needs to +know this value in order to restore it (by calling the \variable{s2k} object's +\function{change\_salt} function) so it can derive the same key and IV from the +passphrase. + +\subsubsection{Problem 3: Protecting against modification} + +As it is, an attacker can undetectably alter the message while it is +in transit. It is vital to remember that encryption does not imply +authentication (except when using special modes that are specifically +designed to provide authentication along with encryption, like OCB and +EAX). For this purpose, we will append a message authentication code +to the encrypted message. Specifically, we will generate an extra 256 +bits of key data, and use it to key the ``HMAC(SHA-256)'' MAC +function. We don't want to have the MAC and the cipher to share the +same key; that is very much a no-no. + +\begin{verbatim} + // 80 octets == 32 for cipher key + 16 for IV + 32 for hmac key + SecureVector keys_and_IV = s2k->derive_key(80, passphrase); + + SymmetricKey key(keys_and_IV, 32); + InitializationVector iv(keys_and_IV + 32, 16); + SymmetricKey mac_key(keys_and_IV + 32 + 16, 32); + + Pipe pipe(new Fork( + new Chain( + get_cipher("Serpent/CBC/PKCS7", key, iv, ENCRYPTION), + new DataSink_Stream(outfile) + ), + new MAC_Filter("HMAC(SHA-256)", mac_key) + ) + ); + + pipe.start_msg(); + infile >> pipe; + pipe.end_msg(); + + // now read the MAC from message #2. Message numbers start from 0 + SecureVector hmac = pipe.read_all(1); + outfile.write((const char*)hmac.ptr(), hmac.size()); +\end{verbatim} + +The receiver can check the size of the file (in bytes), and since it knows how +long the MAC is, can figure out how many bytes of ciphertext there are. Then it +reads in that many bytes, sending them to a Serpent/CBC decryption object +(which could be obtained by calling \verb|get_cipher| with an argument of +\type{DECRYPTION} instead of \type{ENCRYPTION}), and storing the final bytes to +authenticate the message with. + +\subsubsection{Problem 4: Cleaning up the key generation} + +The method used to derive the keys and IV is rather inelegant, and it would be +nice to clean that up a bit, algorithmically speaking. A nice solution for this +is to generate a master key from the passphrase and salt, and then generate the +two keys and the IV (the cryptovariables) from that. + +Starting from the master key, we derive the cryptovariables using a KDF +algorithm, which is designed, among other things, to ``separate'' keys so that +we can derive several different keys from the single master key. For this +purpose, we will use KDF2, which is a generally useful KDF function (defined in +IEEE 1363a, among other standards). The use of different labels (``cipher +key'', etc) makes sure that each of the three derived variables will have +different values. + +\begin{verbatim} + S2K* s2k = get_s2k("PBKDF2(SHA-256)"); + // hard-coded iteration count for simplicity; should be sufficient + s2k->set_iterations(4096); + // 8 octet == 64-bit salt; again, good enough + s2k->new_random_salt(8); + // store the salt so we can write it to a file later + SecureVector the_salt = s2k->current_salt(); + + SymmetricKey master_key = s2k->derive_key(48, passphrase); + + KDF* kdf = get_kdf("KDF2(SHA-256)"); + + SymmetricKey key = kdf->derive_key(32, master_key, "cipher key"); + SymmetricKey mac_key = kdf->derive_key(32, master_key, "hmac key"); + InitializationVector iv = kdf->derive_key(16, master_key, "cipher iv"); +\end{verbatim} + +\subsubsection{Final version} + +Here is the final version of the encryption code, with all the changes we've +made: + +\begin{verbatim} + S2K* s2k = get_s2k("PBKDF2(SHA-256)"); + s2k->set_iterations(4096); + s2k->new_random_salt(8); + SecureVector the_salt = s2k->current_salt(); + + SymmetricKey master_key = s2k->derive_key(48, passphrase); + + KDF* kdf = get_kdf("KDF2(SHA-256)"); + + SymmetricKey key = kdf->derive_key(32, master_key, "cipher key"); + SymmetricKey mac_key = kdf->derive_key(32, masterkey, "hmac key"); + InitializationVector iv = kdf->derive_key(16, masterkey, "cipher iv"); + + Pipe pipe(new Fork( + new Chain( + get_cipher("Serpent/CBC/PKCS7", key, iv, ENCRYPTION), + new DataSink_Stream(outfile) + ), + new MAC_Filter("HMAC(SHA-256)", mac_key) + ) + ); + + outfile.write((const char*)the_salt.ptr(), the_salt.size()); + + pipe.start_msg(); + infile >> pipe; + pipe.end_msg(); + + SecureVector hmac = pipe.read_all(1); + outfile.write((const char*)hmac.ptr(), hmac.size()); +\end{verbatim} + +\subsubsection{Another buffering technique} + +Sometimes the use of \type{DataSink\_Stream} is not practical for whatever +reason. In this case, an alternate buffering mechanism might be useful. Here is +some code which will write all the processed data as quickly as possible, so +that memory pressure is reduced in the case of large inputs. + +\begin{verbatim} + pipe.start_msg(); + SecureBuffer buffer; + while(infile.good()) + { + infile.read((char*)buffer.ptr(), buffer.size()); + u32bit got_from_infile = infile.gcount(); + pipe.write(buffer, got_from_infile); + + if(infile.eof()) + pipe.end_msg(); + + while(pipe.remaining() > 0) + { + u32bit buffered = pipe.read(buffer, buffer.size()); + outfile.write((const char*)buffer.ptr(), buffered); + } + } + if(infile.bad() || (infile.fail() && !infile.eof())) + throw Some_Exception(); +\end{verbatim} + +\pagebreak + +\subsection{Authentication} + +After doing the encryption routines, doing message authentication keyed off a +passphrase is not very difficult. In fact it's much easier than the encryption +case, for the following reasons: a) we only need one key, and b) we don't have +to store anything, so all the input can be done in a single step without +worrying about it taking up a lot of memory if the input file is large. + +In this case, we'll hex-encode the salt and the MAC, and output them both to +standard output (the salt followed by the MAC). + +\begin{verbatim} + S2K* s2k = get_s2k("PBKDF2(SHA-256)"); + s2k->set_iterations(4096); + s2k->new_random_salt(8); + OctetString the_salt = s2k->current_salt(); + + SymmetricKey hmac_key = s2k->derive_key(32, passphrase); + + Pipe pipe(new MAC_Filter("HMAC(SHA-256)", mac_key), + new Hex_Encoder + ); + + std::cout << the_salt.to_string(); // hex encoded + + pipe.start_msg(); + infile >> pipe; + pipe.end_msg(); + std::cout << pipe.read_all_as_string() << std::endl; +\end{verbatim} + +\subsection{User Authentication} + +Doing user authentication off a shared passphrase is fairly easy. Essentially, +a challenge-response protocol is used - the server sends a random challenge, +and the client responds with an appropriate response to the challenge. The idea +is that only someone who knows the passphrase can generate or check to see if a +response is valid. + +Let's say we use 160-bit (20 byte) challenges, which seems fairly +reasonable. We can create this challenge using the global random +number generator (RNG): + +\begin{verbatim} + byte challenge[20]; + Global_RNG::randomize(challenge, sizeof(challenge), Nonce); + // send challenge to client +\end{verbatim} + +After reading the challenge, the client generates a response based on +the challenge and the passphrase. In this case, we will do it by +repeatedly hashing the challenge, the passphrase, and (if applicable) +the previous digest. We iterate this construction 4096 times, to make +brute force attacks on the passphrase hard to do. Since we are already +using 160-bit challenges, a 160-bit response seems warranted, so we'll +use SHA-1. + +\begin{verbatim} + HashFunction* hash = get_hash("SHA-1"); + SecureVector digest; + for(u32bit j = 0; j != 4096; j++) + { + hash->update(digest, digest.size()); + hash->update(passphrase); + hash->update(challenge, challenge.size()); + digest = hash->final(); + } + delete hash; + // send value of digest to the server +\end{verbatim} + +Upon receiving the response from the client, the server computes what the +response should have been based on the challenge it sent out, and the +passphrase. If the two responses match, the client is authenticated. +Otherwise, it is not. + +An alternate method is to use PBKDF2 again, using the challenge as the salt. In +this case, the response could (for example) be the hash of the key produced by +PBKDF2. There is no reason to have an explicit iteration loop, as PBKDF2 is +designed to prevent dictionary attacks (assuming PBKDF2 is set up for a large +iteration count internally). + +\pagebreak + +\section{Public Key Cryptography} + +\subsection{Basic Operations} + +In this section, we'll assume we have a \type{X509\_PublicKey*} named +\arg{pubkey}, and, if necessary, a private key type (a +\type{PKCS8\_PrivateKey*}) named \arg{privkey}. A description of these types, +how to create them, and related details appears later in this tutorial. In this +section, we will use various functions that are defined in +\filename{look\_pk.h} -- you will have to include this header explicitly. + +\subsubsection{Encryption} + +Basically, pick an encoding method, create a \type{PK\_Encryptor} (with +\function{get\_pk\_encryptor}()), and use it. But first we have to make sure +the public key can actually be used for public key encryption. For encryption +(and decryption), the key could be RSA, ElGamal, or (in future versions) some +other public key encryption scheme, like Rabin or an elliptic curve scheme. + +\begin{verbatim} + PK_Encrypting_Key* key = dynamic_cast(pubkey); + if(!key) + error(); + PK_Encryptor* enc = get_pk_encryptor(*key, "EME1(SHA-256)"); + + byte msg[] = { /* ... */ }; + + // will also accept a SecureVector as input + SecureVector ciphertext = enc->encrypt(msg, sizeof(msg)); +\end{verbatim} + +\subsubsection{Decryption} + +This is essentially the same as the encryption operation, but using a private +key instead. One major difference is that the decryption operation can fail due +to the fact that the ciphertext was invalid (most common padding schemes, such +as ``EME1(SHA-256)'', include various pieces of redundancy, which are checked +after decryption). + +\begin{verbatim} + PK_Decrypting_Key* key = dynamic_cast(privkey); + if(!key) + error(); + PK_Decryptor* dec = get_pk_decryptor(*key, "EME1(SHA-256)"); + + byte msg[] = { /* ... */ }; + + SecureVector plaintext; + + try { + // will also accept a SecureVector as input + plaintext = dec->decrypt(msg, sizeof(msg)); + } + catch(Decoding_Error) + { + /* the ciphertext was invalid */ + } +\end{verbatim} + +\subsubsection{Signature Generation} + +There is one difficulty with signature generation that does not occur with +encryption or decryption. Specifically, there are various padding methods which +can be useful for different signature algorithms, and not all are appropriate +for all signature schemes. The following table breaks down what algorithms +support which encodings: + +\begin{tabular}{|c|c|c|} \hline +Signature Algorithm & Usable Encoding Methods & Preferred Encoding(s) \\ \hline +DSA / NR & EMSA1 & EMSA1 \\ \hline +RSA & EMSA1, EMSA2, EMSA3, EMSA4 & EMSA3, EMSA4 \\ \hline +Rabin-Williams & EMSA2, EMSA4 & EMSA2, EMSA4 \\ \hline +\end{tabular} + +For new applications, use EMSA4 with both RSA and Rabin-Williams, as it is +significantly more secure than the alternatives. However, most current +applications/libraries only support EMSA2 with Rabin-Williams and EMSA3 with +RSA. Given this, you may be forced to use less secure encoding methods for the +near future. In these examples, we punt on the problem, and hard-code using +EMSA1 with SHA-256. + +\begin{verbatim} + PK_Signing_Key* key = dynamic_cast(privkey); + if(!key) + error(); + PK_Signer* signer = get_pk_signer(*key, "EMSA1(SHA-256)"); + + byte msg[] = { /* ... */ }; + + /* + You can also repeatedly call update(const byte[], u32bit), followed + by a call to signature(), which will return the final signature of + all the data that was passed through update(). sign_message() is + just a stub that calls update() once, and returns the value of + signature(). + */ + + SecureVector signature = signer->sign_message(msg, sizeof(msg)); +\end{verbatim} + +\pagebreak + +\subsubsection{Signature Verification} + +In addition to all the problems with choosing the correct padding method, +there is yet another complication with verifying a signature. Namely, there are +two varieties of signature algorithms - those providing message recovery (that +is, the value that was signed can be directly recovered by someone verifying +the signature), and those without message recovery (the verify operation simply +returns if the signature was valid, without telling you exactly what was +signed). This leads to two slightly different implementations of the +verification operation, which user code has to work with. As you can see +however, the implementation is still not at all difficult. + +\begin{verbatim} + PK_Verifier* verifier = 0; + + PK_Verifying_with_MR_Key* key1 = + dynamic_cast(pubkey); + PK_Verifying_wo_MR_Key* key2 = + dynamic_cast(pubkey); + + if(key1) + verifier = get_pk_verifier(*key1, "EMSA1(SHA-256)"); + else if(key2) + verifier = get_pk_verifier(*key2, "EMSA1(SHA-256)"); + else + error(); + + byte msg[] = { /* ... */ }; + byte sig[] = { /* ... */ }; + + /* + Like PK_Signer, you can also do repeated calls to + void update(const byte some_data[], u32bit length) + followed by a call to + bool check_signature(const byte the_sig[], u32bit length) + which will return true (valid signature) or false (bad signature). + The function verify_message() is a simple wrapper around update() and + check_signature(). + + */ + bool is_valid = verifier->verify_message(msg, sizeof(msg), sig, sizeof(sig)); +\end{verbatim} + +\subsubsection{Key Agreement} + +WRITEME + +\pagebreak + +\subsection{Working with Keys} + +\subsubsection{Reading Public Keys (X.509 format)} + +There are two separate ways to read X.509 public keys. Remember that the X.509 +public keys are simply that: public keys. There is no associated information +(such as the owner of that key) included with the public key itself. If you +need that kind of information, you'll need to use X.509 certificates. + +However, there are surely times when a simple public key is sufficient. The +most obvious is when the key is implicitly trusted, for example if access +and/or modification of it is controlled by something else (like filesystem +ACLs). In other cases, it is a perfectly reasonable proposition to use them +over the network as an anonymous key exchange mechanism. This is, admittedly, +vulnerable to man-in-the-middle attacks, but it's simple enough that it's hard +to mess up (see, for example, Peter Guttman's paper ``Lessons Learned in +Implementing and Deploying Crypto Software'' in Usenix '02). + +The way to load a key is basically to set up a \type{DataSource} and then call +\function{X509::load\_key}, which will return a \type{X509\_PublicKey*}. For +example: + +\begin{verbatim} + DataSource_Stream somefile("somefile.pem"); // has 3 public keys + X509_PublicKey* key1 = X509::load_key(somefile); + X509_PublicKey* key2 = X509::load_key(somefile); + X509_PublicKey* key3 = X509::load_key(somefile); + // Now we have them all loaded. Huzah! +\end{verbatim} + +At this point you can use \function{dynamic\_cast} to find the operations the +key supports (by seeing if a cast to \type{PK\_Encrypting\_Key}, +\type{PK\_Verifying\_with\_MR\_Key}, or \type{PK\_Verifying\_wo\_MR\_Key} +succeeds). + +There is a variant of \function{X509::load\_key} (and of +\function{PKCS8::load\_key}, described in the next section) which take a +filename (as a \type{std::string}). These are just convenience functions which +create the appropriate \type{DataSource} for you and call the main +\function{X509::load\_key}. + +\subsubsection{Reading Private Keys (PKCS \#8 format)} + +This is very similar to reading raw public keys, with the difference that the +key may be encrypted with a user passphrase: + +\begin{verbatim} + // rng is a RandomNumberGenerator, like AutoSeeded_RNG + + DataSource_Stream somefile("somefile"); + std::string a_passphrase = /* get from the user */ + PKCS8_PrivateKey* key = PKCS8::load_key(somefile, rng, a_passphrase); +\end{verbatim} + +You can, by the way, convert a \type{PKCS8\_PrivateKey} to a +\type{X509\_PublicKey} simply by casting it (with \function{dynamic\_cast}), as +the private key type is derived from \type{X509\_PublicKey}. As with +\type{X509\_PublicKey}, you can use \function{dynamic\_cast} to figure out what +operations the private key is capable of; in particular, you can attempt to +cast it to \type{PK\_Decrypting\_Key}, \type{PK\_Signing\_Key}, or +\type{PK\_Key\_Agreement\_Key}. + +Sometimes you can get away with having a static passphrase passed to +\function{load\_key}. Typically, however, you'll have to do some user +interaction to get the appropriate passphrase. In that case you'll want to use +the \type{UI} related interface, which is fully described in the API +documentation. + +\subsubsection{Generating New Private Keys} + +Generate a new private key is the one operation which requires you to +explicitly name the type of key you are working with. There are (currently) two +kinds of public key algorithms in Botan: ones based on the integer +factorization (IF) problem (RSA and Rabin-Williams), and ones based on the +discrete logarithm (DL) problem (DSA, Diffie-Hellman, Nyberg-Rueppel, and +ElGamal). Since discrete logarithm parameters (primes and generators) can be +shared among many keys, there is the notion of these being a combined type +(called \type{DL\_Group}). + +To create a new DL-based private key, simply pass a desired \type{DL\_Group} to +the constructor of the private key - a new public/private key pair will be +generated. Since in IF-based algorithms, the modulus used isn't shared by other +keys, we don't use this notion. You can create a new key by passing in a +\type{u32bit} telling how long (in bits) the key should be. + +There are quite a few ways to get a \type{DL\_Group} object. The best is to use +the function \function{get\_dl\_group}, which takes a string naming a group; it +will either return that group, if it knows about it, or throw an +exception. Names it knows about include ``IETF-n'' where n is 768, 1024, 1536, +2048, 3072, or 4096, and ``DSA-n'', where n is 512, 768, or 1024. The IETF +groups are the ones specified for use with IPSec, and the DSA ones are the +default DSA parameters specified by Java's JCE. For DSA and Nyberg-Rueppel, use +the ``DSA-n'' groups, and for Diffie-Hellman and ElGamal, use the ``IETF-n'' +groups. + +You can also generate a new random group. This is not recommend, because it is +very slow, particularly for ``safe'' primes, which are needed for +Diffie-Hellman and ElGamal. + +Some examples: + +\begin{verbatim} + RSA_PrivateKey rsa1(512); // 512-bit RSA key + RSA_PrivateKey rsa2(2048); // 2048-bit RSA key + + RW_PrivateKey rw1(1024); // 1024-bit Rabin-Williams key + RW_PrivateKey rw2(1536); // 1536-bit Rabin-Williams key + + DSA_PrivateKey dsa(get_dl_group("DSA-512")); // 512-bit DSA key + DH_PrivateKey dh(get_dl_group("IETF-4096")); // 4096-bit DH key + NR_PrivateKey nr(get_dl_group("DSA-1024")); // 1024-bit NR key + ElGamal_PrivateKey elg(get_dl_group("IETF-1536")); // 1536-bit ElGamal key +\end{verbatim} + +To export your newly created private key, use the PKCS \#8 routines in +\filename{pkcs8.h}: + +\begin{verbatim} + std::string a_passphrase = /* get from the user */ + std::string the_key = PKCS8::PEM_encode(rsa2, a_passphrase); +\end{verbatim} + +You can read the key back in using \function{PKCS8::load\_key}, described in +the section ``Reading Private Keys (PKCS \#8 format)'', above. Unfortunately, +this only works with keys that have an assigned algorithm identifier and +standardized format. Currently this is only the RSA, DSA, DH, and ElGamal +algorithms, though RW and NR keys can also be imported and exported by +assigning them an OID (this can be done either through a configuration file, or +by calling the function \function{OIDS::add\_oid} in \filename{oids.h}). Be +aware that the OID and format for ElGamal keys is not exactly standard, but +there does exist at least one other crypto library which will accept the +format. + +The raw public can be exported using: + +\begin{verbatim} + std::string the_public_key = X509::PEM_encode(rsa2); +\end{verbatim} + +\pagebreak + +\section{X.509v3 Certificates} + +Using certificates is rather complicated, so only the very basic mechanisms are +going to be covered here. The section ``Setting up a CA'' goes into reasonable +detail about CRLs and certificate requests, but there is a lot that isn't +covered (else this section would get quite long and complicated). + +\subsection{Importing and Exporting Certificates} + +Importing and exporting X.509 certificates is easy. Simply call the constructor +with either a \type{DataSource\&}, or the name of a file: + +\begin{verbatim} + X509_Certificate cert1("cert1.pem"); + + /* This file contains two certificates, concatenated */ + DataSource_Stream in("certs2_and_3.pem"); + + X509_Certificate cert2(in); // read the first cert + X509_Certificate cert3(in); // read the second cert +\end{verbatim} + +Exporting the certificate is a simple matter of calling the member function +\function{PEM\_encode}(), which returns a \type{std::string} containing the +certificate in PEM encoding. + +\begin{verbatim} + std::cout << cert3.PEM_encode(); + some_ostream_object << cert1.PEM_encode(); + std::string cert2_str = cert2.PEM_encode(); +\end{verbatim} + +\subsection{Verifying Certificates} + +Verifying a certificate requires that we build up a chain of trust, starting +from the root (usually a commercial CA), down through some number of +intermediate CAs, and finally reaching the actual certificate in +question. Thus, to verify, we actually have to have all those certificates +on hand (or at the very least, know where we can get the ones we need). + +The class which handles both storing certificates, and verifying them, is +called \type{X509\_Store}. We'll start by assuming that we have all the +certificates we need, and just want to verify a cert. This is done by calling +the member function \function{validate\_cert}, which takes the +\type{X509\_Certificate} in question, and an optional argument of type +\type{Cert\_Usage} (which is ignored here; read the section in the API doc +titled ``Verifying Certificates for information). It returns an enum; +\type{X509\_Code}, which, for most purposes, is either \type{VERIFIED}, or +something else (which specifies what circumstance caused the certificate to be +considered invalid). Really, that's it. + +Now, how to let \type{X509\_Store} know about all those certificates and CRLs +we have lying around? The simplest method is to add them directly, using the +functions \function{add\_cert}, \function{add\_certs}, +\function{add\_trusted\_certs}, and \function{add\_crl}; for details, consult +the API doc or read the \filename{x509stor.h} header. There is also a much more +elegant and powerful method: \type{Certificate\_Store}s. A certificate store +refers to an object that knows how to retrieve certificates from some external +source (a file, an LDAP directory, a HTTP server, a SQL database, or anything +else). By calling the function \function{add\_new\_certstore}, you can register +a new certificate store, which \type{X509\_Store} will use to find certificates +it needs. Thus, you can get away with only adding whichever root CA cert(s) you +want to use, letting some online source handle the storage of all intermediate +X.509 certificates. The API documentation has a more complete discussion of +\type{Certificate\_Store}. + +\subsection{Setting up a CA} + +WRITEME + +\pagebreak + +\section{Special Topics} + +This chapter is for subjects that don't really fit into the API documentation +or into other chapters of the tutorial. + +\subsection{GUIs} + +There is nothing particularly special about using Botan in a GUI-based +application. However there are a few tricky spots, as well as a few ways to +take advantage of an event-based application. + +\subsubsection{Initialization} + +Generally you will create the \type{LibraryInitializer} somewhere in +\texttt{main}, before entering the event loop. One problem is that some GUI +libraries take over \texttt{main} and drop you right into the event loop; the +question then is how to initialize the library? The simplest way is probably to +have a static flag that marks if you have already initialized the library or +not. When you enter the event loop, check to see if this flag has not been set, +and if so, initialize the library using the function-based initializers. Using +\type{LibraryInitializer} obviously won't work in this case, since it would be +destroyed as soon as the current event handler finished. You then deinitialize +the library whenever your application is signaled to quit. + +\subsubsection{Interacting With the Library} + +In the simple case, the user will do stuff asynchronously, and then in response +your code will do things like encrypt a file or whatever, which can all be done +synchronously, since the data is right there for you. An application doing +something like this is basically going to look exactly like a command line +application that uses Botan, the only major difference being that the calls to +the library are inside event handlers. + +Much harder is something like an SSH client, where you're acting as a layer +between two asynchronous things (the user and the network). This actually isn't +restricted to GUIs at all (text-mode SSH clients have to deal with most of the +same problems), but it is probably more common with a GUI app. The following +discussion is fairly vague, but hopefully somewhat useful. + +There are a few facilities in Botan that are primarily designed to be used by +applications based on an event loop. See the section ``User Interfaces'' in the +main API doc for details. + +\subsubsection{Entropy} + +One nice advantage of using a GUI is opening a new method of gathering entropy +for the library. This is especially handy on Windows, where the available +sources of entropy are pretty questionable. In many versions, +\texttt{CryptGenRandom} is really rather poor, and the Toolhelp functions may +not provide much data on a small system (such as a handheld). For example, in +GTK+, you can use the following callback to get information about mouse +movements: + +\begin{verbatim} +static gint add_entropy(GtkWidget* widget, GdkEventMotion* event) + { + if(event) + Global_RNG::add_entropy(event, sizeof(GdkEventMotion)); + return FALSE; + } +\end{verbatim} + +And then register it with your main GTK window (presumably named +\variable{window}) as follows: + +\begin{verbatim} +gtk_signal_connect(GTK_OBJECT(window), "motion_notify_event", + GTK_SIGNAL_FUNC(add_entropy), NULL); + +gtk_widget_set_events(window, GDK_POINTER_MOTION_MASK); +\end{verbatim} + +Even though we're catching all mouse movements, and hashing the results into +the entropy pool, this doesn't use up more than a few percent of even a +relatively slow desktop CPU. Note that in the case of using X over a network, +catching all mouse events would cause large amounts of X traffic over the +network, which might make your application slow, or even unusable (I haven't +tried it, though). + +This could be made nicer if the collection function did something like +calculating deltas between each run, storing them into a buffer, and then when +enough of them have been added, hashing them and send them all to the PRNG in +one shot. This would not only reduce load, but also prevent the PRNG from +overestimating the amount of entropy it's getting, since its estimates don't +(can't) take history into account. For example, you could move the mouse back +and forth one pixel, and the PRNG would think it was getting a full load of +entropy each time, when actually it was getting (at best) a bit or two. + +\end{document} diff --git a/src/libs/3rdparty/botan/readme.txt b/src/libs/3rdparty/botan/readme.txt new file mode 100644 index 00000000000..965de00cfa0 --- /dev/null +++ b/src/libs/3rdparty/botan/readme.txt @@ -0,0 +1,44 @@ +Botan 1.8.8 2009-11-03 + +Botan is a C++ class library for performing a wide variety of +cryptographic operations. + +I consider this release the best version available, and recommend all +users upgrade from 1.6 or earlier versions as soon as possible. Some +APIs have changed incompatibly since the 1.6 release series, but most +applications should work as-is or with only simple modifications. + +Botan is under a BSD-like license, the details of which can be found +in license.txt. More information about the authors and contributors +can be found in credits.txt and thanks.txt. All of these files are +included in the doc/ directory of the source distribution. + +You can file bugs in Bugzilla, which can be accessed at + http://www.randombit.net/bugzilla/ +or by sending a report to the botan-devel mailing list + http://lists.randombit.net/mailman/listinfo/botan-devel/ + +In the doc directory, there should be a set of PDFs, including + +building.pdf - build instructions +api.pdf - the API reference manual +tutorial.pdf - a set of simple examples and tutorials + +A set of example programs can be found in the doc/examples directory. + +Some higher level cryptographic protocols are implemented using +Botan in: + +- NetSieben SSH Library (SSHv2) + http://www.netsieben.com/products/ssh/ +- Ajisai (SSLv3/TLSv1) + http://www.randombit.net/code/ajisai/ + +Check the project's website at http://botan.randombit.net/ for +announcements and new releases. If you'll be developing code using +this library, consider joining the mailing lists to keep up to date +with changes and new releases. + +As always, feel free to contact me with any questions or comments. + +-Jack Lloyd (lloyd@randombit.net) diff --git a/src/libs/3rdparty/botan/src/algo_factory/algo_cache.h b/src/libs/3rdparty/botan/src/algo_factory/algo_cache.h new file mode 100644 index 00000000000..17ea9964a1c --- /dev/null +++ b/src/libs/3rdparty/botan/src/algo_factory/algo_cache.h @@ -0,0 +1,224 @@ +/** +* An algorithm cache (used by Algorithm_Factory) +*/ + +#ifndef BOTAN_ALGORITHM_CACHE_TEMPLATE_H__ +#define BOTAN_ALGORITHM_CACHE_TEMPLATE_H__ + +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* @param prov_name a provider name +* @return weight for this provider +*/ +u32bit static_provider_weight(const std::string& prov_name); + +/** +* Algorithm_Cache (used by Algorithm_Factory) +*/ +template +class Algorithm_Cache + { + public: + const T* get(const std::string& algo_spec, + const std::string& pref_provider); + + /** + * Add a new algorithm implementation to the cache + */ + void add(T* algo, + const std::string& requested_name, + const std::string& provider_name); + + /** + * Set the preferred provider + */ + void set_preferred_provider(const std::string& algo_spec, + const std::string& provider); + + /** + * Return the list of providers of this algorithm + */ + std::vector providers_of(const std::string& algo_name); + + Algorithm_Cache(Mutex* m) : mutex(m) {} + ~Algorithm_Cache(); + private: + typedef typename std::map >::iterator + algorithms_iterator; + + typedef typename std::map::iterator provider_iterator; + + algorithms_iterator find_algorithm(const std::string& algo_spec); + + Mutex* mutex; + std::map aliases; + std::map pref_providers; + std::map > algorithms; + }; + +/** +* Look for an algorithm implementation in the cache, also checking aliases +* Assumes object lock is held +*/ +template +typename Algorithm_Cache::algorithms_iterator +Algorithm_Cache::find_algorithm(const std::string& algo_spec) + { + algorithms_iterator algo = algorithms.find(algo_spec); + + // Not found? Check if a known alias + if(algo == algorithms.end()) + { + std::map::const_iterator alias = + aliases.find(algo_spec); + + if(alias != aliases.end()) + algo = algorithms.find(alias->second); + } + + return algo; + } + +/** +* Look for an algorithm implementation by a particular provider +*/ +template +const T* Algorithm_Cache::get(const std::string& algo_spec, + const std::string& requested_provider) + { + Mutex_Holder lock(mutex); + + algorithms_iterator algo = find_algorithm(algo_spec); + if(algo == algorithms.end()) // algo not found at all (no providers) + return 0; + + // If a provider is requested specifically, return it or fail entirely + if(requested_provider != "") + { + provider_iterator prov = algo->second.find(requested_provider); + if(prov != algo->second.end()) + return prov->second; + return 0; + } + + const T* prototype = 0; + std::string prototype_provider; + u32bit prototype_prov_weight = 0; + + const std::string pref_provider = search_map(pref_providers, algo_spec); + + for(provider_iterator i = algo->second.begin(); i != algo->second.end(); ++i) + { + const std::string prov_name = i->first; + const u32bit prov_weight = static_provider_weight(prov_name); + + // preferred prov exists, return immediately + if(prov_name == pref_provider) + return i->second; + + if(prototype == 0 || prov_weight > prototype_prov_weight) + { + prototype = i->second; + prototype_provider = i->first; + prototype_prov_weight = prov_weight; + } + } + + return prototype; + } + +/** +* Add an implementation to the cache +*/ +template +void Algorithm_Cache::add(T* algo, + const std::string& requested_name, + const std::string& provider) + { + if(!algo) + return; + + Mutex_Holder lock(mutex); + + delete algorithms[algo->name()][provider]; + algorithms[algo->name()][provider] = algo; + + if(algo->name() != requested_name && + aliases.find(requested_name) == aliases.end()) + { + aliases[requested_name] = algo->name(); + } + } + +/** +* Find the providers of this algo (if any) +*/ +template std::vector +Algorithm_Cache::providers_of(const std::string& algo_name) + { + Mutex_Holder lock(mutex); + + std::vector providers; + + algorithms_iterator algo = find_algorithm(algo_name); + + if(algo != algorithms.end()) + { + provider_iterator provider = algo->second.begin(); + + while(provider != algo->second.end()) + { + providers.push_back(provider->first); + ++provider; + } + } + + return providers; + } + +/** +* Set the preferred provider for an algorithm +*/ +template +void Algorithm_Cache::set_preferred_provider(const std::string& algo_spec, + const std::string& provider) + { + Mutex_Holder lock(mutex); + + pref_providers[algo_spec] = provider; + } + +/** +* Algorithm_Cache Destructor +*/ +template +Algorithm_Cache::~Algorithm_Cache() + { + algorithms_iterator algo = algorithms.begin(); + + while(algo != algorithms.end()) + { + provider_iterator provider = algo->second.begin(); + + while(provider != algo->second.end()) + { + delete provider->second; + ++provider; + } + + ++algo; + } + + delete mutex; + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/algo_factory/algo_factory.cpp b/src/libs/3rdparty/botan/src/algo_factory/algo_factory.cpp new file mode 100644 index 00000000000..269c58c3b61 --- /dev/null +++ b/src/libs/3rdparty/botan/src/algo_factory/algo_factory.cpp @@ -0,0 +1,286 @@ +/* +Algorithm Factory +(C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +namespace Botan { + +namespace { + +/** +* Template functions for the factory prototype/search algorithm +*/ +template +T* engine_get_algo(Engine* engine, const SCAN_Name& request, + Algorithm_Factory& af) + { return 0; } + +template<> +BlockCipher* engine_get_algo(Engine* engine, const SCAN_Name& request, + Algorithm_Factory& af) + { return engine->find_block_cipher(request, af); } + +template<> +StreamCipher* engine_get_algo(Engine* engine, const SCAN_Name& request, + Algorithm_Factory& af) + { return engine->find_stream_cipher(request, af); } + +template<> +HashFunction* engine_get_algo(Engine* engine, const SCAN_Name& request, + Algorithm_Factory& af) + { return engine->find_hash(request, af); } + +template<> +MessageAuthenticationCode* engine_get_algo(Engine* engine, + const SCAN_Name& request, + Algorithm_Factory& af) + { return engine->find_mac(request, af); } + +template +const T* factory_prototype(const std::string& algo_spec, + const std::string& provider, + const std::vector& engines, + Algorithm_Factory& af, + Algorithm_Cache* cache) + { + if(const T* cache_hit = cache->get(algo_spec, provider)) + return cache_hit; + + SCAN_Name scan_name(algo_spec); + for(u32bit i = 0; i != engines.size(); ++i) + { + if(provider == "" || engines[i]->provider_name() == provider) + { + T* impl = engine_get_algo(engines[i], scan_name, af); + if(impl) + cache->add(impl, algo_spec, engines[i]->provider_name()); + } + } + + return cache->get(algo_spec, provider); + } + +} + +/** +* Setup caches +*/ +Algorithm_Factory::Algorithm_Factory(const std::vector& engines_in, + Mutex_Factory& mf) + { + engines = engines_in; + + block_cipher_cache = new Algorithm_Cache(mf.make()); + stream_cipher_cache = new Algorithm_Cache(mf.make()); + hash_cache = new Algorithm_Cache(mf.make()); + mac_cache = new Algorithm_Cache(mf.make()); + } + +/** +* Delete all engines +*/ +Algorithm_Factory::~Algorithm_Factory() + { + std::for_each(engines.begin(), engines.end(), del_fun()); + + delete block_cipher_cache; + delete stream_cipher_cache; + delete hash_cache; + delete mac_cache; + } + +/** +* Set the preferred provider for an algorithm +*/ +void Algorithm_Factory::set_preferred_provider(const std::string& algo_spec, + const std::string& provider) + { + if(prototype_block_cipher(algo_spec)) + block_cipher_cache->set_preferred_provider(algo_spec, provider); + else if(prototype_stream_cipher(algo_spec)) + stream_cipher_cache->set_preferred_provider(algo_spec, provider); + else if(prototype_hash_function(algo_spec)) + hash_cache->set_preferred_provider(algo_spec, provider); + else if(prototype_mac(algo_spec)) + mac_cache->set_preferred_provider(algo_spec, provider); + } + +/** +* Get an engine out of the list +*/ +Engine* Algorithm_Factory::get_engine_n(u32bit n) const + { + if(n >= engines.size()) + return 0; + return engines[n]; + } + +/** +* Return the possible providers of a request +* Note: assumes you don't have different types by the same name +*/ +std::vector +Algorithm_Factory::providers_of(const std::string& algo_spec) + { + /* The checks with if(prototype_X(algo_spec)) have the effect of + forcing a full search, since otherwise there might not be any + providers at all in the cache. + */ + + if(prototype_block_cipher(algo_spec)) + return block_cipher_cache->providers_of(algo_spec); + else if(prototype_stream_cipher(algo_spec)) + return stream_cipher_cache->providers_of(algo_spec); + else if(prototype_hash_function(algo_spec)) + return hash_cache->providers_of(algo_spec); + else if(prototype_mac(algo_spec)) + return mac_cache->providers_of(algo_spec); + else + return std::vector(); + } + +/** +* Return the prototypical block cipher corresponding to this request +*/ +const BlockCipher* +Algorithm_Factory::prototype_block_cipher(const std::string& algo_spec, + const std::string& provider) + { + return factory_prototype(algo_spec, provider, engines, + *this, block_cipher_cache); + } + +/** +* Return the prototypical stream cipher corresponding to this request +*/ +const StreamCipher* +Algorithm_Factory::prototype_stream_cipher(const std::string& algo_spec, + const std::string& provider) + { + return factory_prototype(algo_spec, provider, engines, + *this, stream_cipher_cache); + } + +/** +* Return the prototypical object corresponding to this request (if found) +*/ +const HashFunction* +Algorithm_Factory::prototype_hash_function(const std::string& algo_spec, + const std::string& provider) + { + return factory_prototype(algo_spec, provider, engines, + *this, hash_cache); + } + +/** +* Return the prototypical object corresponding to this request +*/ +const MessageAuthenticationCode* +Algorithm_Factory::prototype_mac(const std::string& algo_spec, + const std::string& provider) + { + return factory_prototype(algo_spec, provider, + engines, + *this, mac_cache); + } + +/** +* Return a new block cipher corresponding to this request +*/ +BlockCipher* +Algorithm_Factory::make_block_cipher(const std::string& algo_spec, + const std::string& provider) + { + if(const BlockCipher* proto = prototype_block_cipher(algo_spec, provider)) + return proto->clone(); + throw Algorithm_Not_Found(algo_spec); + } + +/** +* Return a new stream cipher corresponding to this request +*/ +StreamCipher* +Algorithm_Factory::make_stream_cipher(const std::string& algo_spec, + const std::string& provider) + { + if(const StreamCipher* proto = prototype_stream_cipher(algo_spec, provider)) + return proto->clone(); + throw Algorithm_Not_Found(algo_spec); + } + +/** +* Return a new object corresponding to this request +*/ +HashFunction* +Algorithm_Factory::make_hash_function(const std::string& algo_spec, + const std::string& provider) + { + if(const HashFunction* proto = prototype_hash_function(algo_spec, provider)) + return proto->clone(); + throw Algorithm_Not_Found(algo_spec); + } + +/** +* Return a new object corresponding to this request +*/ +MessageAuthenticationCode* +Algorithm_Factory::make_mac(const std::string& algo_spec, + const std::string& provider) + { + if(const MessageAuthenticationCode* proto = prototype_mac(algo_spec, provider)) + return proto->clone(); + throw Algorithm_Not_Found(algo_spec); + } + +/** +* Add a new block cipher +*/ +void Algorithm_Factory::add_block_cipher(BlockCipher* block_cipher, + const std::string& provider) + { + block_cipher_cache->add(block_cipher, block_cipher->name(), provider); + } + +/** +* Add a new stream cipher +*/ +void Algorithm_Factory::add_stream_cipher(StreamCipher* stream_cipher, + const std::string& provider) + { + stream_cipher_cache->add(stream_cipher, stream_cipher->name(), provider); + } + +/** +* Add a new hash +*/ +void Algorithm_Factory::add_hash_function(HashFunction* hash, + const std::string& provider) + { + hash_cache->add(hash, hash->name(), provider); + } + +/** +* Add a new mac +*/ +void Algorithm_Factory::add_mac(MessageAuthenticationCode* mac, + const std::string& provider) + { + mac_cache->add(mac, mac->name(), provider); + } + +} diff --git a/src/libs/3rdparty/botan/src/algo_factory/algo_factory.h b/src/libs/3rdparty/botan/src/algo_factory/algo_factory.h new file mode 100644 index 00000000000..73e592013e5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/algo_factory/algo_factory.h @@ -0,0 +1,132 @@ +/** +* Algorithm Factory +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ALGORITHM_FACTORY_H__ +#define BOTAN_ALGORITHM_FACTORY_H__ + +#include +#include +#include + +namespace Botan { + +/** +* Forward declarations (don't need full definitions here) +*/ +class BlockCipher; +class StreamCipher; +class HashFunction; +class MessageAuthenticationCode; + +template class Algorithm_Cache; + +class Engine; + +/** +* Algorithm Factory +*/ +class BOTAN_DLL Algorithm_Factory + { + public: + /** + * Constructor + * @param engines_in the list of engines to use + * @param mf a mutex factory + */ + Algorithm_Factory(const std::vector& engines_in, + Mutex_Factory& mf); + + /** + * Destructor + */ + ~Algorithm_Factory(); + + /* + * Provider management + */ + std::vector providers_of(const std::string& algo_spec); + + void set_preferred_provider(const std::string& algo_spec, + const std::string& provider); + + /* + * Block cipher operations + */ + const BlockCipher* + prototype_block_cipher(const std::string& algo_spec, + const std::string& provider = ""); + + BlockCipher* make_block_cipher(const std::string& algo_spec, + const std::string& provider = ""); + + void add_block_cipher(BlockCipher* hash, const std::string& provider); + + /* + * Stream cipher operations + */ + const StreamCipher* + prototype_stream_cipher(const std::string& algo_spec, + const std::string& provider = ""); + + StreamCipher* make_stream_cipher(const std::string& algo_spec, + const std::string& provider = ""); + + void add_stream_cipher(StreamCipher* hash, const std::string& provider); + + /* + * Hash function operations + */ + const HashFunction* + prototype_hash_function(const std::string& algo_spec, + const std::string& provider = ""); + + HashFunction* make_hash_function(const std::string& algo_spec, + const std::string& provider = ""); + + void add_hash_function(HashFunction* hash, const std::string& provider); + + /* + * MAC operations + */ + const MessageAuthenticationCode* + prototype_mac(const std::string& algo_spec, + const std::string& provider = ""); + + MessageAuthenticationCode* make_mac(const std::string& algo_spec, + const std::string& provider = ""); + + void add_mac(MessageAuthenticationCode* mac, + const std::string& provider); + + /* + * Deprecated + */ + class BOTAN_DLL Engine_Iterator + { + public: + class Engine* next() { return af.get_engine_n(n++); } + Engine_Iterator(const Algorithm_Factory& a) : af(a) { n = 0; } + private: + const Algorithm_Factory& af; + u32bit n; + }; + friend class Engine_Iterator; + + private: + class Engine* get_engine_n(u32bit) const; + + std::vector engines; + + Algorithm_Cache* block_cipher_cache; + Algorithm_Cache* stream_cipher_cache; + Algorithm_Cache* hash_cache; + Algorithm_Cache* mac_cache; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/algo_factory/info.txt b/src/libs/3rdparty/botan/src/algo_factory/info.txt new file mode 100644 index 00000000000..dfc42230a5d --- /dev/null +++ b/src/libs/3rdparty/botan/src/algo_factory/info.txt @@ -0,0 +1,21 @@ +realname "Algorithm Factory" + +load_on auto + +define ALGORITHM_FACTORY + + +algo_factory.cpp +algo_factory.h +algo_cache.h +prov_weight.cpp + + + +block +engine +hash +mac +mutex +stream + diff --git a/src/libs/3rdparty/botan/src/algo_factory/prov_weight.cpp b/src/libs/3rdparty/botan/src/algo_factory/prov_weight.cpp new file mode 100644 index 00000000000..a55a8b1e69a --- /dev/null +++ b/src/libs/3rdparty/botan/src/algo_factory/prov_weight.cpp @@ -0,0 +1,33 @@ +/** +* Default provider weights for Algorithm_Cache +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/** +* Return a static provider weighing +*/ +u32bit static_provider_weight(const std::string& prov_name) + { + /* + * Prefer asm over C++, but prefer anything over OpenSSL or GNU MP; to use + * them, set the provider explicitly for the algorithms you want + */ + + if(prov_name == "core") return 5; + if(prov_name == "ia32") return 6; + if(prov_name == "amd64") return 7; + if(prov_name == "sse2") return 8; + + if(prov_name == "openssl") return 2; + if(prov_name == "gmp") return 1; + + return 0; // other + } + +} diff --git a/src/libs/3rdparty/botan/src/alloc/alloc_mmap/info.txt b/src/libs/3rdparty/botan/src/alloc/alloc_mmap/info.txt new file mode 100644 index 00000000000..65d9b297774 --- /dev/null +++ b/src/libs/3rdparty/botan/src/alloc/alloc_mmap/info.txt @@ -0,0 +1,30 @@ +realname "Disk Based Allocation System" + +define ALLOC_MMAP +modset unix + +load_on auto + + +mmap_mem.cpp +mmap_mem.h + + + +linux +freebsd +dragonfly +openbsd +netbsd +solaris +qnx +darwin +tru64 + +# Only without -ansi, otherwise can't get mkstemp +#cygwin + + + +mem_pool + diff --git a/src/libs/3rdparty/botan/src/alloc/alloc_mmap/mmap_mem.cpp b/src/libs/3rdparty/botan/src/alloc/alloc_mmap/mmap_mem.cpp new file mode 100644 index 00000000000..546da7a81a4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/alloc/alloc_mmap/mmap_mem.cpp @@ -0,0 +1,124 @@ +/* +* Memory Mapping Allocator +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifndef MAP_FAILED + #define MAP_FAILED -1 +#endif + +namespace Botan { + +namespace { + +/* +* MemoryMapping_Allocator Exception +*/ +class MemoryMapping_Failed : public Exception + { + public: + MemoryMapping_Failed(const std::string& msg) : + Exception("MemoryMapping_Allocator: " + msg) {} + }; + +} + +/* +* Memory Map a File into Memory +*/ +void* MemoryMapping_Allocator::alloc_block(u32bit n) + { + class TemporaryFile + { + public: + int get_fd() const { return fd; } + const std::string path() const { return filepath; } + + TemporaryFile(const std::string& base) + { + const std::string path = base + "XXXXXX"; + + filepath = new char[path.length() + 1]; + std::strcpy(filepath, path.c_str()); + + mode_t old_umask = ::umask(077); + fd = ::mkstemp(filepath); + ::umask(old_umask); + } + + ~TemporaryFile() + { + delete[] filepath; + if(fd != -1 && ::close(fd) == -1) + throw MemoryMapping_Failed("Could not close file"); + } + private: + int fd; + char* filepath; + }; + + TemporaryFile file("/tmp/botan_"); + + if(file.get_fd() == -1) + throw MemoryMapping_Failed("Could not create file"); + + if(::unlink(file.path().c_str())) + throw MemoryMapping_Failed("Could not unlink file '" + file.path() + "'"); + + if(::lseek(file.get_fd(), n-1, SEEK_SET) < 0) + throw MemoryMapping_Failed("Could not seek file"); + + if(::write(file.get_fd(), "\0", 1) != 1) + throw MemoryMapping_Failed("Could not write to file"); + +#ifndef MAP_NOSYNC + #define MAP_NOSYNC 0 +#endif + + void* ptr = ::mmap(0, n, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_NOSYNC, + file.get_fd(), 0); + + if(ptr == static_cast(MAP_FAILED)) + throw MemoryMapping_Failed("Could not map file"); + + return ptr; + } + +/* +* Remove a Memory Mapping +*/ +void MemoryMapping_Allocator::dealloc_block(void* ptr, u32bit n) + { + if(ptr == 0) + return; + + const byte PATTERNS[] = { 0x00, 0xFF, 0xAA, 0x55, 0x73, 0x8C, 0x5F, 0xA0, + 0x6E, 0x91, 0x30, 0xCF, 0xD3, 0x2C, 0xAC, 0x00 }; + + for(u32bit j = 0; j != sizeof(PATTERNS); j++) + { + std::memset(ptr, PATTERNS[j], n); + + if(::msync(ptr, n, MS_SYNC)) + throw MemoryMapping_Failed("Sync operation failed"); + } + + if(::munmap(ptr, n)) + throw MemoryMapping_Failed("Could not unmap file"); + } + +} diff --git a/src/libs/3rdparty/botan/src/alloc/alloc_mmap/mmap_mem.h b/src/libs/3rdparty/botan/src/alloc/alloc_mmap/mmap_mem.h new file mode 100644 index 00000000000..bef166a1615 --- /dev/null +++ b/src/libs/3rdparty/botan/src/alloc/alloc_mmap/mmap_mem.h @@ -0,0 +1,30 @@ +/* +* Memory Mapping Allocator +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MMAP_ALLOCATOR_H__ +#define BOTAN_MMAP_ALLOCATOR_H__ + +#include + +namespace Botan { + +/* +* Memory Mapping Allocator +*/ +class BOTAN_DLL MemoryMapping_Allocator : public Pooling_Allocator + { + public: + MemoryMapping_Allocator(Mutex* m) : Pooling_Allocator(m) {} + std::string type() const { return "mmap"; } + private: + void* alloc_block(u32bit); + void dealloc_block(void*, u32bit); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/alloc/allocate.h b/src/libs/3rdparty/botan/src/alloc/allocate.h new file mode 100644 index 00000000000..180f2c02141 --- /dev/null +++ b/src/libs/3rdparty/botan/src/alloc/allocate.h @@ -0,0 +1,37 @@ +/* +* Allocator +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ALLOCATOR_H__ +#define BOTAN_ALLOCATOR_H__ + +#include +#include + +namespace Botan { + +/* +* Allocator Interface +*/ +class BOTAN_DLL Allocator + { + public: + static Allocator* get(bool); + + virtual void* allocate(u32bit) = 0; + virtual void deallocate(void*, u32bit) = 0; + + virtual std::string type() const = 0; + + virtual void init() {} + virtual void destroy() {} + + virtual ~Allocator() {} + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/alloc/info.txt b/src/libs/3rdparty/botan/src/alloc/info.txt new file mode 100644 index 00000000000..fa50aa09f49 --- /dev/null +++ b/src/libs/3rdparty/botan/src/alloc/info.txt @@ -0,0 +1,8 @@ +realname "Allocator" + +load_on auto + + +allocate.h +secmem.h + diff --git a/src/libs/3rdparty/botan/src/alloc/mem_pool/info.txt b/src/libs/3rdparty/botan/src/alloc/mem_pool/info.txt new file mode 100644 index 00000000000..0a762ccc4af --- /dev/null +++ b/src/libs/3rdparty/botan/src/alloc/mem_pool/info.txt @@ -0,0 +1,12 @@ +realname "Memory Pool Allocator" + +load_on auto + + +mem_pool.cpp +mem_pool.h + + + +mutex + diff --git a/src/libs/3rdparty/botan/src/alloc/mem_pool/mem_pool.cpp b/src/libs/3rdparty/botan/src/alloc/mem_pool/mem_pool.cpp new file mode 100644 index 00000000000..38e0c3285ff --- /dev/null +++ b/src/libs/3rdparty/botan/src/alloc/mem_pool/mem_pool.cpp @@ -0,0 +1,265 @@ +/* +* Pooling Allocator +* (C) 1999-2008 Jack Lloyd +* 2005 Matthew Gregan +* 2005-2006 Matt Johnston +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Memory Allocation Exception +*/ +struct Memory_Exhaustion : public std::bad_alloc + { + const char* what() const throw() + { return "Ran out of memory, allocation failed"; } + }; + +} + +/* +* Memory_Block Constructor +*/ +Pooling_Allocator::Memory_Block::Memory_Block(void* buf) + { + buffer = static_cast(buf); + bitmap = 0; + buffer_end = buffer + (BLOCK_SIZE * BITMAP_SIZE); + } + +/* +* See if ptr is contained by this block +*/ +bool Pooling_Allocator::Memory_Block::contains(void* ptr, + u32bit length) const throw() + { + return ((buffer <= ptr) && + (buffer_end >= static_cast(ptr) + length * BLOCK_SIZE)); + } + +/* +* Allocate some memory, if possible +*/ +byte* Pooling_Allocator::Memory_Block::alloc(u32bit n) throw() + { + if(n == 0 || n > BITMAP_SIZE) + return 0; + + if(n == BITMAP_SIZE) + { + if(bitmap) + return 0; + else + { + bitmap = ~bitmap; + return buffer; + } + } + + bitmap_type mask = (static_cast(1) << n) - 1; + u32bit offset = 0; + + while(bitmap & mask) + { + mask <<= 1; + ++offset; + + if((bitmap & mask) == 0) + break; + if(mask >> 63) + break; + } + + if(bitmap & mask) + return 0; + + bitmap |= mask; + return buffer + offset * BLOCK_SIZE; + } + +/* +* Mark this memory as free, if we own it +*/ +void Pooling_Allocator::Memory_Block::free(void* ptr, u32bit blocks) throw() + { + clear_mem(static_cast(ptr), blocks * BLOCK_SIZE); + + const u32bit offset = (static_cast(ptr) - buffer) / BLOCK_SIZE; + + if(offset == 0 && blocks == BITMAP_SIZE) + bitmap = ~bitmap; + else + { + for(u32bit j = 0; j != blocks; ++j) + bitmap &= ~(static_cast(1) << (j+offset)); + } + } + +/* +* Pooling_Allocator Constructor +*/ +Pooling_Allocator::Pooling_Allocator(Mutex* m) : mutex(m) + { + last_used = blocks.begin(); + } + +/* +* Pooling_Allocator Destructor +*/ +Pooling_Allocator::~Pooling_Allocator() + { + delete mutex; + if(blocks.size()) + throw Invalid_State("Pooling_Allocator: Never released memory"); + } + +/* +* Free all remaining memory +*/ +void Pooling_Allocator::destroy() + { + Mutex_Holder lock(mutex); + + blocks.clear(); + + for(u32bit j = 0; j != allocated.size(); ++j) + dealloc_block(allocated[j].first, allocated[j].second); + allocated.clear(); + } + +/* +* Allocation +*/ +void* Pooling_Allocator::allocate(u32bit n) + { + const u32bit BITMAP_SIZE = Memory_Block::bitmap_size(); + const u32bit BLOCK_SIZE = Memory_Block::block_size(); + + Mutex_Holder lock(mutex); + + if(n <= BITMAP_SIZE * BLOCK_SIZE) + { + const u32bit block_no = round_up(n, BLOCK_SIZE) / BLOCK_SIZE; + + byte* mem = allocate_blocks(block_no); + if(mem) + return mem; + + get_more_core(BOTAN_MEM_POOL_CHUNK_SIZE); + + mem = allocate_blocks(block_no); + if(mem) + return mem; + + throw Memory_Exhaustion(); + } + + void* new_buf = alloc_block(n); + if(new_buf) + return new_buf; + + throw Memory_Exhaustion(); + } + +/* +* Deallocation +*/ +void Pooling_Allocator::deallocate(void* ptr, u32bit n) + { + const u32bit BITMAP_SIZE = Memory_Block::bitmap_size(); + const u32bit BLOCK_SIZE = Memory_Block::block_size(); + + if(ptr == 0 && n == 0) + return; + + Mutex_Holder lock(mutex); + + if(n > BITMAP_SIZE * BLOCK_SIZE) + dealloc_block(ptr, n); + else + { + const u32bit block_no = round_up(n, BLOCK_SIZE) / BLOCK_SIZE; + + std::vector::iterator i = + std::lower_bound(blocks.begin(), blocks.end(), Memory_Block(ptr)); + + if(i == blocks.end() || !i->contains(ptr, block_no)) + throw Invalid_State("Pointer released to the wrong allocator"); + + i->free(ptr, block_no); + } + } + +/* +* Try to get some memory from an existing block +*/ +byte* Pooling_Allocator::allocate_blocks(u32bit n) + { + if(blocks.empty()) + return 0; + + std::vector::iterator i = last_used; + + do + { + byte* mem = i->alloc(n); + if(mem) + { + last_used = i; + return mem; + } + + ++i; + if(i == blocks.end()) + i = blocks.begin(); + } + while(i != last_used); + + return 0; + } + +/* +* Allocate more memory for the pool +*/ +void Pooling_Allocator::get_more_core(u32bit in_bytes) + { + const u32bit BITMAP_SIZE = Memory_Block::bitmap_size(); + const u32bit BLOCK_SIZE = Memory_Block::block_size(); + + const u32bit TOTAL_BLOCK_SIZE = BLOCK_SIZE * BITMAP_SIZE; + + // upper bound on allocation is 1 MiB + in_bytes = std::min(in_bytes, 1024 * 1024); + + const u32bit in_blocks = round_up(in_bytes, BLOCK_SIZE) / TOTAL_BLOCK_SIZE; + const u32bit to_allocate = in_blocks * TOTAL_BLOCK_SIZE; + + void* ptr = alloc_block(to_allocate); + if(ptr == 0) + throw Memory_Exhaustion(); + + allocated.push_back(std::make_pair(ptr, to_allocate)); + + for(u32bit j = 0; j != in_blocks; ++j) + { + byte* byte_ptr = static_cast(ptr); + blocks.push_back(Memory_Block(byte_ptr + j * TOTAL_BLOCK_SIZE)); + } + + std::sort(blocks.begin(), blocks.end()); + last_used = std::lower_bound(blocks.begin(), blocks.end(), + Memory_Block(ptr)); + } + +} diff --git a/src/libs/3rdparty/botan/src/alloc/mem_pool/mem_pool.h b/src/libs/3rdparty/botan/src/alloc/mem_pool/mem_pool.h new file mode 100644 index 00000000000..a57800972b2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/alloc/mem_pool/mem_pool.h @@ -0,0 +1,74 @@ +/* +* Pooling Allocator +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_POOLING_ALLOCATOR_H__ +#define BOTAN_POOLING_ALLOCATOR_H__ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Pooling Allocator +*/ +class BOTAN_DLL Pooling_Allocator : public Allocator + { + public: + void* allocate(u32bit); + void deallocate(void*, u32bit); + + void destroy(); + + Pooling_Allocator(Mutex*); + ~Pooling_Allocator(); + private: + void get_more_core(u32bit); + byte* allocate_blocks(u32bit); + + virtual void* alloc_block(u32bit) = 0; + virtual void dealloc_block(void*, u32bit) = 0; + + class BOTAN_DLL Memory_Block + { + public: + Memory_Block(void*); + + static u32bit bitmap_size() { return BITMAP_SIZE; } + static u32bit block_size() { return BLOCK_SIZE; } + + bool contains(void*, u32bit) const throw(); + byte* alloc(u32bit) throw(); + void free(void*, u32bit) throw(); + + bool operator<(const Memory_Block& other) const + { + if(buffer < other.buffer && other.buffer < buffer_end) + return false; + return (buffer < other.buffer); + } + private: + typedef u64bit bitmap_type; + static const u32bit BITMAP_SIZE = 8 * sizeof(bitmap_type); + static const u32bit BLOCK_SIZE = 64; + + bitmap_type bitmap; + byte* buffer, *buffer_end; + }; + + std::vector blocks; + std::vector::iterator last_used; + std::vector > allocated; + Mutex* mutex; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/alloc/secmem.h b/src/libs/3rdparty/botan/src/alloc/secmem.h new file mode 100644 index 00000000000..d64a376ca0c --- /dev/null +++ b/src/libs/3rdparty/botan/src/alloc/secmem.h @@ -0,0 +1,438 @@ +/* +* Secure Memory Buffers +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SECURE_MEMORY_BUFFERS_H__ +#define BOTAN_SECURE_MEMORY_BUFFERS_H__ + +#include +#include +#include + +namespace Botan { + +/** +* This class represents variable length memory buffers. +*/ +template +class MemoryRegion + { + public: + /** + * Find out the size of the buffer, i.e. how many objects of type T it + * contains. + * @return the size of the buffer + */ + u32bit size() const { return used; } + + /** + * Find out whether this buffer is empty. + * @return true if the buffer is empty, false otherwise + */ + bool is_empty() const { return (used == 0); } + + /** + * Find out whether this buffer is non-empty + * @return true if the buffer is non-empty, false otherwise + */ + bool has_items() const { return (used != 0); } + + /** + * Get a pointer to the first element in the buffer. + * @return a pointer to the first element in the buffer + */ + operator T* () { return buf; } + + /** + * Get a constant pointer to the first element in the buffer. + * @return a constant pointer to the first element in the buffer + */ + operator const T* () const { return buf; } + + /** + * Get a pointer to the first element in the buffer. + * @return a pointer to the first element in the buffer + */ + T* begin() { return buf; } + + /** + * Get a constant pointer to the first element in the buffer. + * @return a constant pointer to the first element in the buffer + */ + const T* begin() const { return buf; } + + /** + * Get a pointer to the last element in the buffer. + * @return a pointer to the last element in the buffer + */ + T* end() { return (buf + size()); } + + /** + * Get a constant pointer to the last element in the buffer. + * @return a constant pointer to the last element in the buffer + */ + const T* end() const { return (buf + size()); } + + /** + * Check two buffers for equality. + * @return true iff the content of both buffers is byte-wise equal + */ + bool operator==(const MemoryRegion& other) const + { + return (size() == other.size() && + same_mem(buf, other.buf, size())); + } + + /** + * Compare two buffers lexicographically. + * @return true if this buffer is lexicographically smaller than other. + */ + bool operator<(const MemoryRegion& other) const; + + /** + * Check two buffers for inequality. + * @return false if the content of both buffers is byte-wise equal, true + * otherwise. + */ + bool operator!=(const MemoryRegion& in) const + { return (!(*this == in)); } + + /** + * Copy the contents of another buffer into this buffer. + * The former contents of *this are discarded. + * @param in the buffer to copy the contents from. + * @return a reference to *this + */ + MemoryRegion& operator=(const MemoryRegion& in) + { if(this != &in) set(in); return (*this); } + + /** + * The use of this function is discouraged because of the risk of memory + * errors. Use MemoryRegion::set() + * instead. + * Copy the contents of an array of objects of type T into this buffer. + * The former contents of *this are discarded. + * The length of *this must be at least n, otherwise memory errors occur. + * @param in the array to copy the contents from + * @param n the length of in + */ + void copy(const T in[], u32bit n) + { copy(0, in, n); } + + /** + * The use of this function is discouraged because of the risk of memory + * errors. Use MemoryRegion::set() + * instead. + * Copy the contents of an array of objects of type T into this buffer. + * The former contents of *this are discarded. + * The length of *this must be at least n, otherwise memory errors occur. + * @param off the offset position inside this buffer to start inserting + * the copied bytes + * @param in the array to copy the contents from + * @param n the length of in + */ + void copy(u32bit off, const T in[], u32bit n) + { copy_mem(buf + off, in, (n > size() - off) ? (size() - off) : n); } + + /** + * Set the contents of this according to the argument. The size of + * *this is increased if necessary. + * @param in the array of objects of type T to copy the contents from + * @param n the size of array in + */ + void set(const T in[], u32bit n) { create(n); copy(in, n); } + + /** + * Set the contents of this according to the argument. The size of + * *this is increased if necessary. + * @param in the buffer to copy the contents from + */ + void set(const MemoryRegion& in) { set(in.begin(), in.size()); } + + /** + * Append data to the end of this buffer. + * @param data the array containing the data to append + * @param n the size of the array data + */ + void append(const T data[], u32bit n) + { grow_to(size()+n); copy(size() - n, data, n); } + + /** + * Append a single element. + * @param x the element to append + */ + void append(T x) { append(&x, 1); } + + /** + * Append data to the end of this buffer. + * @param data the buffer containing the data to append + */ + void append(const MemoryRegion& x) { append(x.begin(), x.size()); } + + /** + * Zeroise the bytes of this buffer. The length remains unchanged. + */ + void clear() { clear_mem(buf, allocated); } + + /** + * Reset this buffer to an empty buffer with size zero. + */ + void destroy() { create(0); } + + /** + * Reset this buffer to a buffer of specified length. The content will be + * initialized to zero bytes. + * @param n the new length of the buffer + */ + void create(u32bit n); + + /** + * Preallocate memory, so that this buffer can grow up to size n without + * having to perform any actual memory allocations. (This is + * the same principle as for std::vector::reserve().) + */ + void grow_to(u32bit N); + + /** + * Swap this buffer with another object. + */ + void swap(MemoryRegion& other); + + ~MemoryRegion() { deallocate(buf, allocated); } + protected: + MemoryRegion() { buf = 0; alloc = 0; used = allocated = 0; } + MemoryRegion(const MemoryRegion& other) + { + buf = 0; + used = allocated = 0; + alloc = other.alloc; + set(other.buf, other.used); + } + + void init(bool locking, u32bit length = 0) + { alloc = Allocator::get(locking); create(length); } + private: + T* allocate(u32bit n) + { + return static_cast(alloc->allocate(sizeof(T)*n)); + } + + void deallocate(T* p, u32bit n) + { alloc->deallocate(p, sizeof(T)*n); } + + T* buf; + u32bit used; + u32bit allocated; + Allocator* alloc; + }; + +/* +* Create a new buffer +*/ +template +void MemoryRegion::create(u32bit n) + { + if(n <= allocated) { clear(); used = n; return; } + deallocate(buf, allocated); + buf = allocate(n); + allocated = used = n; + } + +/* +* Increase the size of the buffer +*/ +template +void MemoryRegion::grow_to(u32bit n) + { + if(n > used && n <= allocated) + { + clear_mem(buf + used, n - used); + used = n; + return; + } + else if(n > allocated) + { + T* new_buf = allocate(n); + copy_mem(new_buf, buf, used); + deallocate(buf, allocated); + buf = new_buf; + allocated = used = n; + } + } + +/* +* Compare this buffer with another one +*/ +template +bool MemoryRegion::operator<(const MemoryRegion& in) const + { + if(size() < in.size()) return true; + if(size() > in.size()) return false; + + for(u32bit j = 0; j != size(); j++) + { + if(buf[j] < in[j]) return true; + if(buf[j] > in[j]) return false; + } + + return false; + } + +/* +* Swap this buffer with another one +*/ +template +void MemoryRegion::swap(MemoryRegion& x) + { + std::swap(buf, x.buf); + std::swap(used, x.used); + std::swap(allocated, x.allocated); + std::swap(alloc, x.alloc); + } + +/** +* This class represents variable length buffers that do not +* make use of memory locking. +*/ +template +class MemoryVector : public MemoryRegion + { + public: + /** + * Copy the contents of another buffer into this buffer. + * @param in the buffer to copy the contents from + * @return a reference to *this + */ + MemoryVector& operator=(const MemoryRegion& in) + { if(this != &in) set(in); return (*this); } + + /** + * Create a buffer of the specified length. + * @param n the length of the buffer to create. + + */ + MemoryVector(u32bit n = 0) { MemoryRegion::init(false, n); } + + /** + * Create a buffer with the specified contents. + * @param in the array containing the data to be initially copied + * into the newly created buffer + * @param n the size of the arry in + */ + MemoryVector(const T in[], u32bit n) + { MemoryRegion::init(false); set(in, n); } + + /** + * Copy constructor. + */ + MemoryVector(const MemoryRegion& in) + { MemoryRegion::init(false); set(in); } + + /** + * Create a buffer whose content is the concatenation of two other + * buffers. + * @param in1 the first part of the new contents + * @param in2 the contents to be appended to in1 + */ + MemoryVector(const MemoryRegion& in1, const MemoryRegion& in2) + { MemoryRegion::init(false); set(in1); append(in2); } + }; + +/** +* This class represents variable length buffers using the operating +* systems capability to lock memory, i.e. keeping it from being +* swapped out to disk. In this way, a security hole allowing attackers +* to find swapped out secret keys is closed. Please refer to +* Botan::InitializerOptions::secure_memory() for restrictions and +* further details. +*/ +template +class SecureVector : public MemoryRegion + { + public: + /** + * Copy the contents of another buffer into this buffer. + * @param in the buffer to copy the contents from + * @return a reference to *this + */ + SecureVector& operator=(const MemoryRegion& in) + { if(this != &in) set(in); return (*this); } + + /** + * Create a buffer of the specified length. + * @param n the length of the buffer to create. + + */ + SecureVector(u32bit n = 0) { MemoryRegion::init(true, n); } + + /** + * Create a buffer with the specified contents. + * @param in the array containing the data to be initially copied + * into the newly created buffer + * @param n the size of the array in + */ + SecureVector(const T in[], u32bit n) + { MemoryRegion::init(true); set(in, n); } + + /** + * Create a buffer with contents specified contents. + * @param in the buffer holding the contents that will be + * copied into the newly created buffer. + */ + SecureVector(const MemoryRegion& in) + { MemoryRegion::init(true); set(in); } + + /** + * Create a buffer whose content is the concatenation of two other + * buffers. + * @param in1 the first part of the new contents + * @param in2 the contents to be appended to in1 + */ + SecureVector(const MemoryRegion& in1, const MemoryRegion& in2) + { MemoryRegion::init(true); set(in1); append(in2); } + }; + +/** +* This class represents fixed length buffers using the operating +* systems capability to lock memory, i.e. keeping it from being +* swapped out to disk. In this way, a security hole allowing attackers +* to find swapped out secret keys is closed. Please refer to +* Botan::InitializerOptions::secure_memory() for restrictions and +* further details. +*/ +template +class SecureBuffer : public MemoryRegion + { + public: + /** + * Copy the contents of another buffer into this buffer. + * @param in the buffer to copy the contents from + * @return a reference to *this + */ + SecureBuffer& operator=(const SecureBuffer& in) + { if(this != &in) set(in); return (*this); } + + /** + * Create a buffer of the length L. + */ + SecureBuffer() { MemoryRegion::init(true, L); } + + /** + * Create a buffer of size L with the specified contents. + * @param in the array containing the data to be initially copied + * into the newly created buffer + * @param n the size of the array in + */ + SecureBuffer(const T in[], u32bit n) + { MemoryRegion::init(true, L); copy(in, n); } + private: + SecureBuffer& operator=(const MemoryRegion& in) + { if(this != &in) set(in); return (*this); } + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/alloc/system_alloc/defalloc.cpp b/src/libs/3rdparty/botan/src/alloc/system_alloc/defalloc.cpp new file mode 100644 index 00000000000..8791c74e41e --- /dev/null +++ b/src/libs/3rdparty/botan/src/alloc/system_alloc/defalloc.cpp @@ -0,0 +1,100 @@ +/* +* Basic Allocators +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Perform Memory Allocation +*/ +void* do_malloc(u32bit n, bool do_lock) + { + void* ptr = std::malloc(n); + + if(!ptr) + return 0; + + if(do_lock) + lock_mem(ptr, n); + + std::memset(ptr, 0, n); + return ptr; + } + +/* +* Perform Memory Deallocation +*/ +void do_free(void* ptr, u32bit n, bool do_lock) + { + if(!ptr) + return; + + std::memset(ptr, 0, n); + if(do_lock) + unlock_mem(ptr, n); + + std::free(ptr); + } + +} + +/* +* Malloc_Allocator's Allocation +*/ +void* Malloc_Allocator::allocate(u32bit n) + { + return do_malloc(n, false); + } + +/* +* Malloc_Allocator's Deallocation +*/ +void Malloc_Allocator::deallocate(void* ptr, u32bit n) + { + do_free(ptr, n, false); + } + +/* +* Locking_Allocator's Allocation +*/ +void* Locking_Allocator::alloc_block(u32bit n) + { + return do_malloc(n, true); + } + +/* +* Locking_Allocator's Deallocation +*/ +void Locking_Allocator::dealloc_block(void* ptr, u32bit n) + { + do_free(ptr, n, true); + } + +/* +* Get an allocator +*/ +Allocator* Allocator::get(bool locking) + { + std::string type = ""; + if(!locking) + type = "malloc"; + + Allocator* alloc = global_state().get_allocator(type); + if(alloc) + return alloc; + + throw Exception("Couldn't find an allocator to use in get_allocator"); + } + +} diff --git a/src/libs/3rdparty/botan/src/alloc/system_alloc/defalloc.h b/src/libs/3rdparty/botan/src/alloc/system_alloc/defalloc.h new file mode 100644 index 00000000000..627e8df7055 --- /dev/null +++ b/src/libs/3rdparty/botan/src/alloc/system_alloc/defalloc.h @@ -0,0 +1,43 @@ +/* +* Basic Allocators +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BASIC_ALLOC_H__ +#define BOTAN_BASIC_ALLOC_H__ + +#include + +namespace Botan { + +/* +* Malloc Allocator +*/ +class BOTAN_DLL Malloc_Allocator : public Allocator + { + public: + void* allocate(u32bit); + void deallocate(void*, u32bit); + + std::string type() const { return "malloc"; } + }; + +/* +* Locking Allocator +*/ +class BOTAN_DLL Locking_Allocator : public Pooling_Allocator + { + public: + Locking_Allocator(Mutex* m) : Pooling_Allocator(m) {} + + std::string type() const { return "locking"; } + private: + void* alloc_block(u32bit); + void dealloc_block(void*, u32bit); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/alloc/system_alloc/info.txt b/src/libs/3rdparty/botan/src/alloc/system_alloc/info.txt new file mode 100644 index 00000000000..5fade38cff2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/alloc/system_alloc/info.txt @@ -0,0 +1,13 @@ +realname "Default (Malloc) Allocators" + +load_on auto + + +defalloc.cpp +defalloc.h + + + +libstate +mem_pool + diff --git a/src/libs/3rdparty/botan/src/asn1/alg_id.cpp b/src/libs/3rdparty/botan/src/asn1/alg_id.cpp new file mode 100644 index 00000000000..94709ba160e --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/alg_id.cpp @@ -0,0 +1,103 @@ +/* +* Algorithm Identifier +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Create an AlgorithmIdentifier +*/ +AlgorithmIdentifier::AlgorithmIdentifier(const OID& alg_id, + const MemoryRegion& param) + { + oid = alg_id; + parameters = param; + } + +/* +* Create an AlgorithmIdentifier +*/ +AlgorithmIdentifier::AlgorithmIdentifier(const std::string& alg_id, + const MemoryRegion& param) + { + oid = OIDS::lookup(alg_id); + parameters = param; + } + +/* +* Create an AlgorithmIdentifier +*/ +AlgorithmIdentifier::AlgorithmIdentifier(const OID& alg_id, + Encoding_Option option) + { + const byte DER_NULL[] = { 0x05, 0x00 }; + + oid = alg_id; + if(option == USE_NULL_PARAM) + parameters.append(DER_NULL, sizeof(DER_NULL)); + } + +/* +* Create an AlgorithmIdentifier +*/ +AlgorithmIdentifier::AlgorithmIdentifier(const std::string& alg_id, + Encoding_Option option) + { + const byte DER_NULL[] = { 0x05, 0x00 }; + + oid = OIDS::lookup(alg_id); + if(option == USE_NULL_PARAM) + parameters.append(DER_NULL, sizeof(DER_NULL)); + } + +/* +* Compare two AlgorithmIdentifiers +*/ +bool operator==(const AlgorithmIdentifier& a1, const AlgorithmIdentifier& a2) + { + if(a1.oid != a2.oid) + return false; + if(a1.parameters != a2.parameters) + return false; + return true; + } + +/* +* Compare two AlgorithmIdentifiers +*/ +bool operator!=(const AlgorithmIdentifier& a1, const AlgorithmIdentifier& a2) + { + return !(a1 == a2); + } + +/* +* DER encode an AlgorithmIdentifier +*/ +void AlgorithmIdentifier::encode_into(DER_Encoder& codec) const + { + codec.start_cons(SEQUENCE) + .encode(oid) + .raw_bytes(parameters) + .end_cons(); + } + +/* +* Decode a BER encoded AlgorithmIdentifier +*/ +void AlgorithmIdentifier::decode_from(BER_Decoder& codec) + { + codec.start_cons(SEQUENCE) + .decode(oid) + .raw_bytes(parameters) + .end_cons(); + } + +} diff --git a/src/libs/3rdparty/botan/src/asn1/alg_id.h b/src/libs/3rdparty/botan/src/asn1/alg_id.h new file mode 100644 index 00000000000..4a1ad2f30dd --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/alg_id.h @@ -0,0 +1,49 @@ +/* +* Algorithm Identifier +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ALGORITHM_IDENTIFIER_H__ +#define BOTAN_ALGORITHM_IDENTIFIER_H__ + +#include +#include +#include + +namespace Botan { + +/* +* Algorithm Identifier +*/ +class BOTAN_DLL AlgorithmIdentifier : public ASN1_Object + { + public: + enum Encoding_Option { USE_NULL_PARAM }; + + void encode_into(class DER_Encoder&) const; + void decode_from(class BER_Decoder&); + + AlgorithmIdentifier() {} + AlgorithmIdentifier(const OID&, Encoding_Option); + AlgorithmIdentifier(const std::string&, Encoding_Option); + + AlgorithmIdentifier(const OID&, const MemoryRegion&); + AlgorithmIdentifier(const std::string&, const MemoryRegion&); + + OID oid; + SecureVector parameters; + }; + +/* +* Comparison Operations +*/ +bool BOTAN_DLL operator==(const AlgorithmIdentifier&, + const AlgorithmIdentifier&); +bool BOTAN_DLL operator!=(const AlgorithmIdentifier&, + const AlgorithmIdentifier&); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/asn1/asn1_alt.cpp b/src/libs/3rdparty/botan/src/asn1/asn1_alt.cpp new file mode 100644 index 00000000000..41974eef6cd --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/asn1_alt.cpp @@ -0,0 +1,228 @@ +/* +* AlternativeName +* (C) 1999-2007 Jack Lloyd +* 2007 Yves Jerschow +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Create an AlternativeName +*/ +AlternativeName::AlternativeName(const std::string& email_addr, + const std::string& uri, + const std::string& dns, + const std::string& ip) + { + add_attribute("RFC822", email_addr); + add_attribute("DNS", dns); + add_attribute("URI", uri); + add_attribute("IP", ip); + } + +/* +* Add an attribute to an alternative name +*/ +void AlternativeName::add_attribute(const std::string& type, + const std::string& str) + { + if(type == "" || str == "") + return; + + typedef std::multimap::iterator iter; + std::pair range = alt_info.equal_range(type); + for(iter j = range.first; j != range.second; ++j) + if(j->second == str) + return; + + multimap_insert(alt_info, type, str); + } + +/* +* Add an OtherName field +*/ +void AlternativeName::add_othername(const OID& oid, const std::string& value, + ASN1_Tag type) + { + if(value == "") + return; + multimap_insert(othernames, oid, ASN1_String(value, type)); + } + +/* +* Get the attributes of this alternative name +*/ +std::multimap AlternativeName::get_attributes() const + { + return alt_info; + } + +/* +* Get the otherNames +*/ +std::multimap AlternativeName::get_othernames() const + { + return othernames; + } + +/* +* Return all of the alternative names +*/ +std::multimap AlternativeName::contents() const + { + std::multimap names; + + typedef std::multimap::const_iterator rdn_iter; + for(rdn_iter j = alt_info.begin(); j != alt_info.end(); ++j) + multimap_insert(names, j->first, j->second); + + typedef std::multimap::const_iterator on_iter; + for(on_iter j = othernames.begin(); j != othernames.end(); ++j) + multimap_insert(names, OIDS::lookup(j->first), j->second.value()); + + return names; + } + +/* +* Return if this object has anything useful +*/ +bool AlternativeName::has_items() const + { + return (alt_info.size() > 0 || othernames.size() > 0); + } + +namespace { + +/* +* DER encode an AlternativeName entry +*/ +void encode_entries(DER_Encoder& encoder, + const std::multimap& attr, + const std::string& type, ASN1_Tag tagging) + { + typedef std::multimap::const_iterator iter; + + std::pair range = attr.equal_range(type); + for(iter j = range.first; j != range.second; ++j) + { + if(type == "RFC822" || type == "DNS" || type == "URI") + { + ASN1_String asn1_string(j->second, IA5_STRING); + encoder.add_object(tagging, CONTEXT_SPECIFIC, asn1_string.iso_8859()); + } + else if(type == "IP") + { + u32bit ip = string_to_ipv4(j->second); + byte ip_buf[4] = { 0 }; + store_be(ip, ip_buf); + encoder.add_object(tagging, CONTEXT_SPECIFIC, ip_buf, 4); + } + } + } + +} + +/* +* DER encode an AlternativeName extension +*/ +void AlternativeName::encode_into(DER_Encoder& der) const + { + der.start_cons(SEQUENCE); + + encode_entries(der, alt_info, "RFC822", ASN1_Tag(1)); + encode_entries(der, alt_info, "DNS", ASN1_Tag(2)); + encode_entries(der, alt_info, "URI", ASN1_Tag(6)); + encode_entries(der, alt_info, "IP", ASN1_Tag(7)); + + std::multimap::const_iterator i; + for(i = othernames.begin(); i != othernames.end(); ++i) + { + der.start_explicit(0) + .encode(i->first) + .start_explicit(0) + .encode(i->second) + .end_explicit() + .end_explicit(); + } + + der.end_cons(); + } + +/* +* Decode a BER encoded AlternativeName +*/ +void AlternativeName::decode_from(BER_Decoder& source) + { + BER_Decoder names = source.start_cons(SEQUENCE); + + while(names.more_items()) + { + BER_Object obj = names.get_next_object(); + if((obj.class_tag != CONTEXT_SPECIFIC) && + (obj.class_tag != (CONTEXT_SPECIFIC | CONSTRUCTED))) + continue; + + ASN1_Tag tag = obj.type_tag; + + if(tag == 0) + { + BER_Decoder othername(obj.value); + + OID oid; + othername.decode(oid); + if(othername.more_items()) + { + BER_Object othername_value_outer = othername.get_next_object(); + othername.verify_end(); + + if(othername_value_outer.type_tag != ASN1_Tag(0) || + othername_value_outer.class_tag != + (CONTEXT_SPECIFIC | CONSTRUCTED) + ) + throw Decoding_Error("Invalid tags on otherName value"); + + BER_Decoder othername_value_inner(othername_value_outer.value); + + BER_Object value = othername_value_inner.get_next_object(); + othername_value_inner.verify_end(); + + ASN1_Tag value_type = value.type_tag; + + if(is_string_type(value_type) && value.class_tag == UNIVERSAL) + add_othername(oid, ASN1::to_string(value), value_type); + } + } + else if(tag == 1 || tag == 2 || tag == 6) + { + const std::string value = Charset::transcode(ASN1::to_string(obj), + LATIN1_CHARSET, + LOCAL_CHARSET); + + if(tag == 1) add_attribute("RFC822", value); + if(tag == 2) add_attribute("DNS", value); + if(tag == 6) add_attribute("URI", value); + } + else if(tag == 7) + { + if(obj.value.size() == 4) + { + u32bit ip = load_be(obj.value.begin(), 0); + add_attribute("IP", ipv4_to_string(ip)); + } + } + + } + } + +} diff --git a/src/libs/3rdparty/botan/src/asn1/asn1_att.cpp b/src/libs/3rdparty/botan/src/asn1/asn1_att.cpp new file mode 100644 index 00000000000..c8d771e2571 --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/asn1_att.cpp @@ -0,0 +1,60 @@ +/* +* Attribute +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Create an Attribute +*/ +Attribute::Attribute(const OID& attr_oid, const MemoryRegion& attr_value) + { + oid = attr_oid; + parameters = attr_value; + } + +/* +* Create an Attribute +*/ +Attribute::Attribute(const std::string& attr_oid, + const MemoryRegion& attr_value) + { + oid = OIDS::lookup(attr_oid); + parameters = attr_value; + } + +/* +* DER encode a Attribute +*/ +void Attribute::encode_into(DER_Encoder& codec) const + { + codec.start_cons(SEQUENCE) + .encode(oid) + .start_cons(SET) + .raw_bytes(parameters) + .end_cons() + .end_cons(); + } + +/* +* Decode a BER encoded Attribute +*/ +void Attribute::decode_from(BER_Decoder& codec) + { + codec.start_cons(SEQUENCE) + .decode(oid) + .start_cons(SET) + .raw_bytes(parameters) + .end_cons() + .end_cons(); + } + +} diff --git a/src/libs/3rdparty/botan/src/asn1/asn1_dn.cpp b/src/libs/3rdparty/botan/src/asn1/asn1_dn.cpp new file mode 100644 index 00000000000..c5a132d85fe --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/asn1_dn.cpp @@ -0,0 +1,304 @@ +/* +* X509_DN +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Create an empty X509_DN +*/ +X509_DN::X509_DN() + { + } + +/* +* Create an X509_DN +*/ +X509_DN::X509_DN(const std::multimap& args) + { + std::multimap::const_iterator j; + for(j = args.begin(); j != args.end(); ++j) + add_attribute(j->first, j->second); + } + +/* +* Create an X509_DN +*/ +X509_DN::X509_DN(const std::multimap& args) + { + std::multimap::const_iterator j; + for(j = args.begin(); j != args.end(); ++j) + add_attribute(OIDS::lookup(j->first), j->second); + } + +/* +* Add an attribute to a X509_DN +*/ +void X509_DN::add_attribute(const std::string& type, + const std::string& str) + { + OID oid = OIDS::lookup(type); + add_attribute(oid, str); + } + +/* +* Add an attribute to a X509_DN +*/ +void X509_DN::add_attribute(const OID& oid, const std::string& str) + { + if(str == "") + return; + + typedef std::multimap::iterator rdn_iter; + + std::pair range = dn_info.equal_range(oid); + for(rdn_iter j = range.first; j != range.second; ++j) + if(j->second.value() == str) + return; + + multimap_insert(dn_info, oid, ASN1_String(str)); + dn_bits.destroy(); + } + +/* +* Get the attributes of this X509_DN +*/ +std::multimap X509_DN::get_attributes() const + { + typedef std::multimap::const_iterator rdn_iter; + + std::multimap retval; + for(rdn_iter j = dn_info.begin(); j != dn_info.end(); ++j) + multimap_insert(retval, j->first, j->second.value()); + return retval; + } + +/* +* Get the contents of this X.500 Name +*/ +std::multimap X509_DN::contents() const + { + typedef std::multimap::const_iterator rdn_iter; + + std::multimap retval; + for(rdn_iter j = dn_info.begin(); j != dn_info.end(); ++j) + multimap_insert(retval, OIDS::lookup(j->first), j->second.value()); + return retval; + } + +/* +* Get a single attribute type +*/ +std::vector X509_DN::get_attribute(const std::string& attr) const + { + typedef std::multimap::const_iterator rdn_iter; + + const OID oid = OIDS::lookup(deref_info_field(attr)); + std::pair range = dn_info.equal_range(oid); + + std::vector values; + for(rdn_iter j = range.first; j != range.second; ++j) + values.push_back(j->second.value()); + return values; + } + +/* +* Handle the decoding operation of a DN +*/ +void X509_DN::do_decode(const MemoryRegion& bits) + { + BER_Decoder sequence(bits); + + while(sequence.more_items()) + { + BER_Decoder rdn = sequence.start_cons(SET); + + while(rdn.more_items()) + { + OID oid; + ASN1_String str; + + rdn.start_cons(SEQUENCE) + .decode(oid) + .decode(str) + .verify_end() + .end_cons(); + + add_attribute(oid, str.value()); + } + } + + dn_bits = bits; + } + +/* +* Return the BER encoded data, if any +*/ +MemoryVector X509_DN::get_bits() const + { + return dn_bits; + } + +/* +* Deref aliases in a subject/issuer info request +*/ +std::string X509_DN::deref_info_field(const std::string& info) + { + if(info == "Name" || info == "CommonName") return "X520.CommonName"; + if(info == "SerialNumber") return "X520.SerialNumber"; + if(info == "Country") return "X520.Country"; + if(info == "Organization") return "X520.Organization"; + if(info == "Organizational Unit" || info == "OrgUnit") + return "X520.OrganizationalUnit"; + if(info == "Locality") return "X520.Locality"; + if(info == "State" || info == "Province") return "X520.State"; + if(info == "Email") return "RFC822"; + return info; + } + +/* +* Compare two X509_DNs for equality +*/ +bool operator==(const X509_DN& dn1, const X509_DN& dn2) + { + typedef std::multimap::const_iterator rdn_iter; + + std::multimap attr1 = dn1.get_attributes(); + std::multimap attr2 = dn2.get_attributes(); + + if(attr1.size() != attr2.size()) return false; + + rdn_iter p1 = attr1.begin(); + rdn_iter p2 = attr2.begin(); + + while(true) + { + if(p1 == attr1.end() && p2 == attr2.end()) + break; + if(p1 == attr1.end()) return false; + if(p2 == attr2.end()) return false; + if(p1->first != p2->first) return false; + if(!x500_name_cmp(p1->second, p2->second)) + return false; + ++p1; + ++p2; + } + return true; + } + +/* +* Compare two X509_DNs for inequality +*/ +bool operator!=(const X509_DN& dn1, const X509_DN& dn2) + { + return !(dn1 == dn2); + } + +/* +* Compare two X509_DNs +*/ +bool operator<(const X509_DN& dn1, const X509_DN& dn2) + { + typedef std::multimap::const_iterator rdn_iter; + + std::multimap attr1 = dn1.get_attributes(); + std::multimap attr2 = dn2.get_attributes(); + + if(attr1.size() < attr2.size()) return true; + if(attr1.size() > attr2.size()) return false; + + for(rdn_iter p1 = attr1.begin(); p1 != attr1.end(); ++p1) + { + std::multimap::const_iterator p2; + p2 = attr2.find(p1->first); + if(p2 == attr2.end()) return false; + if(p1->second > p2->second) return false; + if(p1->second < p2->second) return true; + } + return false; + } + +namespace { + +/* +* DER encode a RelativeDistinguishedName +*/ +void do_ava(DER_Encoder& encoder, + const std::multimap& dn_info, + ASN1_Tag string_type, const std::string& oid_str, + bool must_exist = false) + { + typedef std::multimap::const_iterator rdn_iter; + + const OID oid = OIDS::lookup(oid_str); + const bool exists = (dn_info.find(oid) != dn_info.end()); + + if(!exists && must_exist) + throw Encoding_Error("X509_DN: No entry for " + oid_str); + if(!exists) return; + + std::pair range = dn_info.equal_range(oid); + + for(rdn_iter j = range.first; j != range.second; ++j) + { + encoder.start_cons(SET) + .start_cons(SEQUENCE) + .encode(oid) + .encode(ASN1_String(j->second, string_type)) + .end_cons() + .end_cons(); + } + } + +} + +/* +* DER encode a DistinguishedName +*/ +void X509_DN::encode_into(DER_Encoder& der) const + { + std::multimap dn_info = get_attributes(); + + der.start_cons(SEQUENCE); + + if(dn_bits.has_items()) + der.raw_bytes(dn_bits); + else + { + do_ava(der, dn_info, PRINTABLE_STRING, "X520.Country", true); + do_ava(der, dn_info, DIRECTORY_STRING, "X520.State"); + do_ava(der, dn_info, DIRECTORY_STRING, "X520.Locality"); + do_ava(der, dn_info, DIRECTORY_STRING, "X520.Organization"); + do_ava(der, dn_info, DIRECTORY_STRING, "X520.OrganizationalUnit"); + do_ava(der, dn_info, DIRECTORY_STRING, "X520.CommonName", true); + do_ava(der, dn_info, PRINTABLE_STRING, "X520.SerialNumber"); + } + + der.end_cons(); + } + +/* +* Decode a BER encoded DistinguishedName +*/ +void X509_DN::decode_from(BER_Decoder& source) + { + dn_info.clear(); + + source.start_cons(SEQUENCE) + .raw_bytes(dn_bits) + .end_cons(); + + do_decode(dn_bits); + } + +} diff --git a/src/libs/3rdparty/botan/src/asn1/asn1_int.cpp b/src/libs/3rdparty/botan/src/asn1/asn1_int.cpp new file mode 100644 index 00000000000..5e18f3961ae --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/asn1_int.cpp @@ -0,0 +1,68 @@ +/* +* ASN.1 Internals +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* BER Decoding Exceptions +*/ +BER_Decoding_Error::BER_Decoding_Error(const std::string& str) : + Decoding_Error("BER: " + str) {} + +BER_Bad_Tag::BER_Bad_Tag(const std::string& str, ASN1_Tag tag) : + BER_Decoding_Error(str + ": " + to_string(tag)) {} + +BER_Bad_Tag::BER_Bad_Tag(const std::string& str, + ASN1_Tag tag1, ASN1_Tag tag2) : + BER_Decoding_Error(str + ": " + to_string(tag1) + "/" + to_string(tag2)) {} + +namespace ASN1 { + +/* +* Put some arbitrary bytes into a SEQUENCE +*/ +SecureVector put_in_sequence(const MemoryRegion& contents) + { + return DER_Encoder() + .start_cons(SEQUENCE) + .raw_bytes(contents) + .end_cons() + .get_contents(); + } + +/* +* Convert a BER object into a string object +*/ +std::string to_string(const BER_Object& obj) + { + return std::string(reinterpret_cast(obj.value.begin()), + obj.value.size()); + } + +/* +* Do heuristic tests for BER data +*/ +bool maybe_BER(DataSource& source) + { + byte first_byte; + if(!source.peek_byte(first_byte)) + throw Stream_IO_Error("ASN1::maybe_BER: Source was empty"); + + if(first_byte == (SEQUENCE | CONSTRUCTED)) + return true; + return false; + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/asn1/asn1_int.h b/src/libs/3rdparty/botan/src/asn1/asn1_int.h new file mode 100644 index 00000000000..619f45b5334 --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/asn1_int.h @@ -0,0 +1,108 @@ +/* +* ASN.1 Internals +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ASN1_H__ +#define BOTAN_ASN1_H__ + +#include +#include + +namespace Botan { + +/* +* ASN.1 Type and Class Tags +*/ +enum ASN1_Tag { + UNIVERSAL = 0x00, + APPLICATION = 0x40, + CONTEXT_SPECIFIC = 0x80, + PRIVATE = 0xC0, + + CONSTRUCTED = 0x20, + + EOC = 0x00, + BOOLEAN = 0x01, + INTEGER = 0x02, + BIT_STRING = 0x03, + OCTET_STRING = 0x04, + NULL_TAG = 0x05, + OBJECT_ID = 0x06, + ENUMERATED = 0x0A, + SEQUENCE = 0x10, + SET = 0x11, + + UTF8_STRING = 0x0C, + NUMERIC_STRING = 0x12, + PRINTABLE_STRING = 0x13, + T61_STRING = 0x14, + IA5_STRING = 0x16, + VISIBLE_STRING = 0x1A, + BMP_STRING = 0x1E, + + UTC_TIME = 0x17, + GENERALIZED_TIME = 0x18, + + NO_OBJECT = 0xFF00, + DIRECTORY_STRING = 0xFF01 +}; + +/* +* Basic ASN.1 Object Interface +*/ +class BOTAN_DLL ASN1_Object + { + public: + virtual void encode_into(class DER_Encoder&) const = 0; + virtual void decode_from(class BER_Decoder&) = 0; + virtual ~ASN1_Object() {} + }; + +/* +* BER Encoded Object +*/ +class BOTAN_DLL BER_Object + { + public: + void assert_is_a(ASN1_Tag, ASN1_Tag); + + ASN1_Tag type_tag, class_tag; + SecureVector value; + }; + +/* +* ASN.1 Utility Functions +*/ +class DataSource; + +namespace ASN1 { + +SecureVector put_in_sequence(const MemoryRegion&); +std::string to_string(const BER_Object&); +bool maybe_BER(DataSource&); + +} + +/* +* General BER Decoding Error Exception +*/ +struct BER_Decoding_Error : public Decoding_Error + { + BER_Decoding_Error(const std::string&); + }; + +/* +* Exception For Incorrect BER Taggings +*/ +struct BER_Bad_Tag : public BER_Decoding_Error + { + BER_Bad_Tag(const std::string&, ASN1_Tag); + BER_Bad_Tag(const std::string&, ASN1_Tag, ASN1_Tag); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/asn1/asn1_obj.h b/src/libs/3rdparty/botan/src/asn1/asn1_obj.h new file mode 100644 index 00000000000..ea21c475f1e --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/asn1_obj.h @@ -0,0 +1,160 @@ +/* +* Common ASN.1 Objects +* (C) 1999-2007 Jack Lloyd +* 2007 Yves Jerschow +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ASN1_OBJ_H__ +#define BOTAN_ASN1_OBJ_H__ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Attribute +*/ +class BOTAN_DLL Attribute : public ASN1_Object + { + public: + void encode_into(class DER_Encoder&) const; + void decode_from(class BER_Decoder&); + + OID oid; + MemoryVector parameters; + + Attribute() {} + Attribute(const OID&, const MemoryRegion&); + Attribute(const std::string&, const MemoryRegion&); + }; + +/* +* X.509 Time +*/ +class BOTAN_DLL X509_Time : public ASN1_Object + { + public: + void encode_into(class DER_Encoder&) const; + void decode_from(class BER_Decoder&); + + std::string as_string() const; + std::string readable_string() const; + bool time_is_set() const; + + s32bit cmp(const X509_Time&) const; + + void set_to(const std::string&); + void set_to(const std::string&, ASN1_Tag); + + X509_Time(u64bit); + X509_Time(const std::string& = ""); + X509_Time(const std::string&, ASN1_Tag); + private: + bool passes_sanity_check() const; + u32bit year, month, day, hour, minute, second; + ASN1_Tag tag; + }; + +/* +* Simple String +*/ +class BOTAN_DLL ASN1_String : public ASN1_Object + { + public: + void encode_into(class DER_Encoder&) const; + void decode_from(class BER_Decoder&); + + std::string value() const; + std::string iso_8859() const; + + ASN1_Tag tagging() const; + + ASN1_String(const std::string& = ""); + ASN1_String(const std::string&, ASN1_Tag); + private: + std::string iso_8859_str; + ASN1_Tag tag; + }; + +/* +* Distinguished Name +*/ +class BOTAN_DLL X509_DN : public ASN1_Object + { + public: + void encode_into(class DER_Encoder&) const; + void decode_from(class BER_Decoder&); + + std::multimap get_attributes() const; + std::vector get_attribute(const std::string&) const; + + std::multimap contents() const; + + void add_attribute(const std::string&, const std::string&); + void add_attribute(const OID&, const std::string&); + + static std::string deref_info_field(const std::string&); + + void do_decode(const MemoryRegion&); + MemoryVector get_bits() const; + + X509_DN(); + X509_DN(const std::multimap&); + X509_DN(const std::multimap&); + private: + std::multimap dn_info; + MemoryVector dn_bits; + }; + +/* +* Alternative Name +*/ +class BOTAN_DLL AlternativeName : public ASN1_Object + { + public: + void encode_into(class DER_Encoder&) const; + void decode_from(class BER_Decoder&); + + std::multimap contents() const; + + void add_attribute(const std::string&, const std::string&); + std::multimap get_attributes() const; + + void add_othername(const OID&, const std::string&, ASN1_Tag); + std::multimap get_othernames() const; + + bool has_items() const; + + AlternativeName(const std::string& = "", const std::string& = "", + const std::string& = "", const std::string& = ""); + private: + std::multimap alt_info; + std::multimap othernames; + }; + +/* +* Comparison Operations +*/ +bool BOTAN_DLL operator==(const X509_Time&, const X509_Time&); +bool BOTAN_DLL operator!=(const X509_Time&, const X509_Time&); +bool BOTAN_DLL operator<=(const X509_Time&, const X509_Time&); +bool BOTAN_DLL operator>=(const X509_Time&, const X509_Time&); + +bool BOTAN_DLL operator==(const X509_DN&, const X509_DN&); +bool BOTAN_DLL operator!=(const X509_DN&, const X509_DN&); +bool BOTAN_DLL operator<(const X509_DN&, const X509_DN&); + +/* +* Helper Functions +*/ +bool BOTAN_DLL is_string_type(ASN1_Tag); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/asn1/asn1_oid.cpp b/src/libs/3rdparty/botan/src/asn1/asn1_oid.cpp new file mode 100644 index 00000000000..531ceb9b238 --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/asn1_oid.cpp @@ -0,0 +1,176 @@ +/* +* ASN.1 OID +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* ASN.1 OID Constructor +*/ +OID::OID(const std::string& oid_str) + { + if(oid_str != "") + { + id = parse_asn1_oid(oid_str); + if(id.size() < 2 || id[0] > 2) + throw Invalid_OID(oid_str); + if((id[0] == 0 || id[0] == 1) && id[1] > 39) + throw Invalid_OID(oid_str); + } + } + +/* +* Clear the current OID +*/ +void OID::clear() + { + id.clear(); + } + +/* +* Return this OID as a string +*/ +std::string OID::as_string() const + { + std::string oid_str; + for(u32bit j = 0; j != id.size(); ++j) + { + oid_str += to_string(id[j]); + if(j != id.size() - 1) + oid_str += '.'; + } + return oid_str; + } + +/* +* OID equality comparison +*/ +bool OID::operator==(const OID& oid) const + { + if(id.size() != oid.id.size()) + return false; + for(u32bit j = 0; j != id.size(); ++j) + if(id[j] != oid.id[j]) + return false; + return true; + } + +/* +* Append another component to the OID +*/ +OID& OID::operator+=(u32bit component) + { + id.push_back(component); + return (*this); + } + +/* +* Append another component to the OID +*/ +OID operator+(const OID& oid, u32bit component) + { + OID new_oid(oid); + new_oid += component; + return new_oid; + } + +/* +* OID inequality comparison +*/ +bool operator!=(const OID& a, const OID& b) + { + return !(a == b); + } + +/* +* Compare two OIDs +*/ +bool operator<(const OID& a, const OID& b) + { + std::vector oid1 = a.get_id(); + std::vector oid2 = b.get_id(); + + if(oid1.size() < oid2.size()) + return true; + if(oid1.size() > oid2.size()) + return false; + for(u32bit j = 0; j != oid1.size(); ++j) + { + if(oid1[j] < oid2[j]) + return true; + if(oid1[j] > oid2[j]) + return false; + } + return false; + } + +/* +* DER encode an OBJECT IDENTIFIER +*/ +void OID::encode_into(DER_Encoder& der) const + { + if(id.size() < 2) + throw Invalid_Argument("OID::encode_into: OID is invalid"); + + MemoryVector encoding; + encoding.append(40 * id[0] + id[1]); + + for(u32bit j = 2; j != id.size(); ++j) + { + if(id[j] == 0) + encoding.append(0); + else + { + u32bit blocks = high_bit(id[j]) + 6; + blocks = (blocks - (blocks % 7)) / 7; + + for(u32bit k = 0; k != blocks - 1; ++k) + encoding.append(0x80 | ((id[j] >> 7*(blocks-k-1)) & 0x7F)); + encoding.append(id[j] & 0x7F); + } + } + der.add_object(OBJECT_ID, UNIVERSAL, encoding); + } + +/* +* Decode a BER encoded OBJECT IDENTIFIER +*/ +void OID::decode_from(BER_Decoder& decoder) + { + BER_Object obj = decoder.get_next_object(); + if(obj.type_tag != OBJECT_ID || obj.class_tag != UNIVERSAL) + throw BER_Bad_Tag("Error decoding OID, unknown tag", + obj.type_tag, obj.class_tag); + if(obj.value.size() < 2) + throw BER_Decoding_Error("OID encoding is too short"); + + + clear(); + id.push_back(obj.value[0] / 40); + id.push_back(obj.value[0] % 40); + + u32bit j = 0; + while(j != obj.value.size() - 1) + { + u32bit component = 0; + while(j != obj.value.size() - 1) + { + ++j; + component = (component << 7) + (obj.value[j] & 0x7F); + if(!(obj.value[j] & 0x80)) + break; + } + id.push_back(component); + } + } + +} diff --git a/src/libs/3rdparty/botan/src/asn1/asn1_oid.h b/src/libs/3rdparty/botan/src/asn1/asn1_oid.h new file mode 100644 index 00000000000..e6d077beeac --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/asn1_oid.h @@ -0,0 +1,96 @@ +/* +* ASN.1 OID +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ASN1_OID_H__ +#define BOTAN_ASN1_OID_H__ + +#include +#include +#include + +namespace Botan { + +/** +* This class represents ASN.1 object identifiers. +*/ +class BOTAN_DLL OID : public ASN1_Object + { + public: + void encode_into(class DER_Encoder&) const; + void decode_from(class BER_Decoder&); + + /** + * Find out whether this OID is empty + * @return true is no OID value is set + */ + bool is_empty() const { return id.size() == 0; } + + /** + * Get this OID as list (vector) of its components. + * @return a vector representing this OID + */ + std::vector get_id() const { return id; } + + /** + * Get this OID as a string + * @return a string representing this OID + */ + std::string as_string() const; + + /** + * Compare two OIDs. + * @return true if they are equal, false otherwise + */ + bool operator==(const OID&) const; + + /** + * Reset this instance to an empty OID. + */ + void clear(); + + /** + * Add a component to this OID. + * @param new_comp the new component to add to the end of this OID + * @return a reference to *this + */ + OID& operator+=(u32bit new_comp); + + /** + * Construct an OID from a string. + * @param str a string in the form "a.b.c" etc., where a,b,c are numbers + */ + OID(const std::string& str = ""); + private: + std::vector id; + }; + +/** +* Append another component onto the OID. +* @param oid the OID to add the new component to +* @param new_comp the new component to add +*/ +OID operator+(const OID& oid, u32bit new_comp); + +/** +* Compare two OIDs. +* @param a the first OID +* @param b the second OID +* @return true if a is not equal to b +*/ +bool operator!=(const OID& a, const OID& b); + +/** +* Compare two OIDs. +* @param a the first OID +* @param b the second OID +* @return true if a is lexicographically smaller than b +*/ +bool operator<(const OID& a, const OID& b); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/asn1/asn1_str.cpp b/src/libs/3rdparty/botan/src/asn1/asn1_str.cpp new file mode 100644 index 00000000000..25782e23917 --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/asn1_str.cpp @@ -0,0 +1,160 @@ +/* +* Simple ASN.1 String Types +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Choose an encoding for the string +*/ +ASN1_Tag choose_encoding(const std::string& str, + const std::string& type) + { + static const byte IS_PRINTABLE[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }; + + for(u32bit j = 0; j != str.size(); ++j) + { + if(!IS_PRINTABLE[static_cast(str[j])]) + { + if(type == "utf8") return UTF8_STRING; + if(type == "latin1") return T61_STRING; + throw Invalid_Argument("choose_encoding: Bad string type " + type); + } + } + return PRINTABLE_STRING; + } + +} + +/* +* Check if type is a known ASN.1 string type +*/ +bool is_string_type(ASN1_Tag tag) + { + if(tag == NUMERIC_STRING || tag == PRINTABLE_STRING || + tag == VISIBLE_STRING || tag == T61_STRING || tag == IA5_STRING || + tag == UTF8_STRING || tag == BMP_STRING) + return true; + return false; + } + +/* +* Create an ASN1_String +*/ +ASN1_String::ASN1_String(const std::string& str, ASN1_Tag t) : tag(t) + { + iso_8859_str = Charset::transcode(str, LOCAL_CHARSET, LATIN1_CHARSET); + + if(tag == DIRECTORY_STRING) + tag = choose_encoding(iso_8859_str, "latin1"); + + if(tag != NUMERIC_STRING && + tag != PRINTABLE_STRING && + tag != VISIBLE_STRING && + tag != T61_STRING && + tag != IA5_STRING && + tag != UTF8_STRING && + tag != BMP_STRING) + throw Invalid_Argument("ASN1_String: Unknown string type " + + to_string(tag)); + } + +/* +* Create an ASN1_String +*/ +ASN1_String::ASN1_String(const std::string& str) + { + iso_8859_str = Charset::transcode(str, LOCAL_CHARSET, LATIN1_CHARSET); + tag = choose_encoding(iso_8859_str, "latin1"); + } + +/* +* Return this string in ISO 8859-1 encoding +*/ +std::string ASN1_String::iso_8859() const + { + return iso_8859_str; + } + +/* +* Return this string in local encoding +*/ +std::string ASN1_String::value() const + { + return Charset::transcode(iso_8859_str, LATIN1_CHARSET, LOCAL_CHARSET); + } + +/* +* Return the type of this string object +*/ +ASN1_Tag ASN1_String::tagging() const + { + return tag; + } + +/* +* DER encode an ASN1_String +*/ +void ASN1_String::encode_into(DER_Encoder& encoder) const + { + std::string value = iso_8859(); + if(tagging() == UTF8_STRING) + value = Charset::transcode(value, LATIN1_CHARSET, UTF8_CHARSET); + encoder.add_object(tagging(), UNIVERSAL, value); + } + +/* +* Decode a BER encoded ASN1_String +*/ +void ASN1_String::decode_from(BER_Decoder& source) + { + BER_Object obj = source.get_next_object(); + + Character_Set charset_is; + + if(obj.type_tag == BMP_STRING) + charset_is = UCS2_CHARSET; + else if(obj.type_tag == UTF8_STRING) + charset_is = UTF8_CHARSET; + else + charset_is = LATIN1_CHARSET; + + *this = ASN1_String( + Charset::transcode(ASN1::to_string(obj), charset_is, LOCAL_CHARSET), + obj.type_tag); + } + +} diff --git a/src/libs/3rdparty/botan/src/asn1/asn1_tm.cpp b/src/libs/3rdparty/botan/src/asn1/asn1_tm.cpp new file mode 100644 index 00000000000..f85ea128be3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/asn1_tm.cpp @@ -0,0 +1,297 @@ +/* +* X.509 Time Types +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Convert a time_t to a struct tm +*/ +std::tm get_tm(u64bit timer) + { + std::time_t time_val = static_cast(timer); + + std::tm* tm_p = std::gmtime(&time_val); + if(tm_p == 0) + throw Encoding_Error("X509_Time: gmtime could not encode " + + to_string(timer)); + return (*tm_p); + } + +} + +/* +* Create an X509_Time +*/ +X509_Time::X509_Time(const std::string& time_str) + { + set_to(time_str); + } + +/* +* Create an X509_Time +*/ +X509_Time::X509_Time(u64bit timer) + { + std::tm time_info = get_tm(timer); + + year = time_info.tm_year + 1900; + month = time_info.tm_mon + 1; + day = time_info.tm_mday; + hour = time_info.tm_hour; + minute = time_info.tm_min; + second = time_info.tm_sec; + + if(year >= 2050) + tag = GENERALIZED_TIME; + else + tag = UTC_TIME; + } + +/* +* Create an X509_Time +*/ +X509_Time::X509_Time(const std::string& t_spec, ASN1_Tag t) : tag(t) + { + set_to(t_spec, tag); + } + +/* +* Set the time with a human readable string +*/ +void X509_Time::set_to(const std::string& time_str) + { + if(time_str == "") + { + year = month = day = hour = minute = second = 0; + return; + } + + std::vector params; + std::string current; + + for(u32bit j = 0; j != time_str.size(); ++j) + { + if(Charset::is_digit(time_str[j])) + current += time_str[j]; + else + { + if(current != "") + params.push_back(current); + current.clear(); + } + } + if(current != "") + params.push_back(current); + + if(params.size() < 3 || params.size() > 6) + throw Invalid_Argument("Invalid time specification " + time_str); + + year = to_u32bit(params[0]); + month = to_u32bit(params[1]); + day = to_u32bit(params[2]); + hour = (params.size() >= 4) ? to_u32bit(params[3]) : 0; + minute = (params.size() >= 5) ? to_u32bit(params[4]) : 0; + second = (params.size() == 6) ? to_u32bit(params[5]) : 0; + + if(year >= 2050) + tag = GENERALIZED_TIME; + else + tag = UTC_TIME; + + if(!passes_sanity_check()) + throw Invalid_Argument("Invalid time specification " + time_str); + } + +/* +* Set the time with an ISO time format string +*/ +void X509_Time::set_to(const std::string& t_spec, ASN1_Tag tag) + { + if(tag != GENERALIZED_TIME && tag != UTC_TIME) + throw Invalid_Argument("X509_Time: Invalid tag " + to_string(tag)); + if(tag == GENERALIZED_TIME && t_spec.size() != 13 && t_spec.size() != 15) + throw Invalid_Argument("Invalid GeneralizedTime: " + t_spec); + if(tag == UTC_TIME && t_spec.size() != 11 && t_spec.size() != 13) + throw Invalid_Argument("Invalid UTCTime: " + t_spec); + if(t_spec[t_spec.size()-1] != 'Z') + throw Invalid_Argument("Invalid time encoding: " + t_spec); + + const u32bit YEAR_SIZE = (tag == UTC_TIME) ? 2 : 4; + + std::vector params; + std::string current; + + for(u32bit j = 0; j != YEAR_SIZE; ++j) + current += t_spec[j]; + params.push_back(current); + current.clear(); + + for(u32bit j = YEAR_SIZE; j != t_spec.size() - 1; ++j) + { + current += t_spec[j]; + if(current.size() == 2) + { + params.push_back(current); + current.clear(); + } + } + + year = to_u32bit(params[0]); + month = to_u32bit(params[1]); + day = to_u32bit(params[2]); + hour = to_u32bit(params[3]); + minute = to_u32bit(params[4]); + second = (params.size() == 6) ? to_u32bit(params[5]) : 0; + + if(tag == UTC_TIME) + { + if(year >= 50) year += 1900; + else year += 2000; + } + + if(!passes_sanity_check()) + throw Invalid_Argument("Invalid time specification " + t_spec); + } + +/* +* DER encode a X509_Time +*/ +void X509_Time::encode_into(DER_Encoder& der) const + { + if(tag != GENERALIZED_TIME && tag != UTC_TIME) + throw Invalid_Argument("X509_Time: Bad encoding tag"); + der.add_object(tag, UNIVERSAL, + Charset::transcode(as_string(), + LOCAL_CHARSET, LATIN1_CHARSET)); + } + +/* +* Decode a BER encoded X509_Time +*/ +void X509_Time::decode_from(BER_Decoder& source) + { + BER_Object ber_time = source.get_next_object(); + set_to(Charset::transcode(ASN1::to_string(ber_time), + LATIN1_CHARSET, LOCAL_CHARSET), + ber_time.type_tag); + } + +/* +* Return a string representation of the time +*/ +std::string X509_Time::as_string() const + { + if(time_is_set() == false) + throw Invalid_State("X509_Time::as_string: No time set"); + + std::string asn1rep; + if(tag == GENERALIZED_TIME) + asn1rep = to_string(year, 4); + else + { + if(year < 1950 || year >= 2050) + throw Encoding_Error("X509_Time: The time " + readable_string() + + " cannot be encoded as a UTCTime"); + u32bit asn1year = (year >= 2000) ? (year - 2000) : (year - 1900); + asn1rep = to_string(asn1year, 2); + } + asn1rep += to_string(month, 2) + to_string(day, 2); + asn1rep += to_string(hour, 2) + to_string(minute, 2) + to_string(second, 2); + asn1rep += "Z"; + return asn1rep; + } + +/* +* Return if the time has been set somehow +*/ +bool X509_Time::time_is_set() const + { + return (year != 0); + } + +/* +* Return a human readable string representation +*/ +std::string X509_Time::readable_string() const + { + if(time_is_set() == false) + throw Invalid_State("X509_Time::readable_string: No time set"); + + std::string readable; + readable += to_string(year, 4) + "/"; + readable += to_string(month ) + "/"; + readable += to_string(day ) + " "; + readable += to_string(hour ) + ":"; + readable += to_string(minute, 2) + ":"; + readable += to_string(second, 2) + " UTC"; + return readable; + } + +/* +* Do a general sanity check on the time +*/ +bool X509_Time::passes_sanity_check() const + { + if(year < 1950 || year > 2100) + return false; + if(month == 0 || month > 12) + return false; + if(day == 0 || day > 31) + return false; + if(hour >= 24 || minute > 60 || second > 60) + return false; + return true; + } + +/* +* Compare this time against another +*/ +s32bit X509_Time::cmp(const X509_Time& other) const + { + if(time_is_set() == false) + throw Invalid_State("X509_Time::cmp: No time set"); + + const s32bit EARLIER = -1, LATER = 1, SAME_TIME = 0; + + if(year < other.year) return EARLIER; + if(year > other.year) return LATER; + if(month < other.month) return EARLIER; + if(month > other.month) return LATER; + if(day < other.day) return EARLIER; + if(day > other.day) return LATER; + if(hour < other.hour) return EARLIER; + if(hour > other.hour) return LATER; + if(minute < other.minute) return EARLIER; + if(minute > other.minute) return LATER; + if(second < other.second) return EARLIER; + if(second > other.second) return LATER; + + return SAME_TIME; + } + +/* +* Compare two X509_Times for in various ways +*/ +bool operator==(const X509_Time& t1, const X509_Time& t2) + { return (t1.cmp(t2) == 0); } +bool operator!=(const X509_Time& t1, const X509_Time& t2) + { return (t1.cmp(t2) != 0); } +bool operator<=(const X509_Time& t1, const X509_Time& t2) + { return (t1.cmp(t2) <= 0); } +bool operator>=(const X509_Time& t1, const X509_Time& t2) + { return (t1.cmp(t2) >= 0); } + +} diff --git a/src/libs/3rdparty/botan/src/asn1/ber_dec.cpp b/src/libs/3rdparty/botan/src/asn1/ber_dec.cpp new file mode 100644 index 00000000000..ce604665238 --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/ber_dec.cpp @@ -0,0 +1,471 @@ +/* +* BER Decoder +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* BER decode an ASN.1 type tag +*/ +u32bit decode_tag(DataSource* ber, ASN1_Tag& type_tag, ASN1_Tag& class_tag) + { + byte b; + if(!ber->read_byte(b)) + { + class_tag = type_tag = NO_OBJECT; + return 0; + } + + if((b & 0x1F) != 0x1F) + { + type_tag = ASN1_Tag(b & 0x1F); + class_tag = ASN1_Tag(b & 0xE0); + return 1; + } + + u32bit tag_bytes = 1; + class_tag = ASN1_Tag(b & 0xE0); + + u32bit tag_buf = 0; + while(true) + { + if(!ber->read_byte(b)) + throw BER_Decoding_Error("Long-form tag truncated"); + if(tag_buf & 0xFF000000) + throw BER_Decoding_Error("Long-form tag overflowed 32 bits"); + ++tag_bytes; + tag_buf = (tag_buf << 7) | (b & 0x7F); + if((b & 0x80) == 0) break; + } + type_tag = ASN1_Tag(tag_buf); + return tag_bytes; + } + +/* +* Find the EOC marker +*/ +u32bit find_eoc(DataSource*); + +/* +* BER decode an ASN.1 length field +*/ +u32bit decode_length(DataSource* ber, u32bit& field_size) + { + byte b; + if(!ber->read_byte(b)) + throw BER_Decoding_Error("Length field not found"); + field_size = 1; + if((b & 0x80) == 0) + return b; + + field_size += (b & 0x7F); + if(field_size == 1) return find_eoc(ber); + if(field_size > 5) + throw BER_Decoding_Error("Length field is too large"); + + u32bit length = 0; + + for(u32bit j = 0; j != field_size - 1; ++j) + { + if(get_byte(0, length) != 0) + throw BER_Decoding_Error("Field length overflow"); + if(!ber->read_byte(b)) + throw BER_Decoding_Error("Corrupted length field"); + length = (length << 8) | b; + } + return length; + } + +/* +* BER decode an ASN.1 length field +*/ +u32bit decode_length(DataSource* ber) + { + u32bit dummy; + return decode_length(ber, dummy); + } + +/* +* Find the EOC marker +*/ +u32bit find_eoc(DataSource* ber) + { + SecureVector buffer(DEFAULT_BUFFERSIZE), data; + + while(true) + { + const u32bit got = ber->peek(buffer, buffer.size(), data.size()); + if(got == 0) + break; + data.append(buffer, got); + } + + DataSource_Memory source(data); + data.destroy(); + + u32bit length = 0; + while(true) + { + ASN1_Tag type_tag, class_tag; + u32bit tag_size = decode_tag(&source, type_tag, class_tag); + if(type_tag == NO_OBJECT) + break; + + u32bit length_size = 0; + u32bit item_size = decode_length(&source, length_size); + source.discard_next(item_size); + + length += item_size + length_size + tag_size; + + if(type_tag == EOC) + break; + } + return length; + } + +} + +/* +* Check a type invariant on BER data +*/ +void BER_Object::assert_is_a(ASN1_Tag type_tag, ASN1_Tag class_tag) + { + if(this->type_tag != type_tag || this->class_tag != class_tag) + throw BER_Decoding_Error("Tag mismatch when decoding"); + } + +/* +* Check if more objects are there +*/ +bool BER_Decoder::more_items() const + { + if(source->end_of_data() && (pushed.type_tag == NO_OBJECT)) + return false; + return true; + } + +/* +* Verify that no bytes remain in the source +*/ +BER_Decoder& BER_Decoder::verify_end() + { + if(!source->end_of_data() || (pushed.type_tag != NO_OBJECT)) + throw Invalid_State("BER_Decoder::verify_end called, but data remains"); + return (*this); + } + +/* +* Save all the bytes remaining in the source +*/ +BER_Decoder& BER_Decoder::raw_bytes(MemoryRegion& out) + { + out.destroy(); + byte buf; + while(source->read_byte(buf)) + out.append(buf); + return (*this); + } + +/* +* Discard all the bytes remaining in the source +*/ +BER_Decoder& BER_Decoder::discard_remaining() + { + byte buf; + while(source->read_byte(buf)) + ; + return (*this); + } + +/* +* Return the BER encoding of the next object +*/ +BER_Object BER_Decoder::get_next_object() + { + BER_Object next; + + if(pushed.type_tag != NO_OBJECT) + { + next = pushed; + pushed.class_tag = pushed.type_tag = NO_OBJECT; + return next; + } + + decode_tag(source, next.type_tag, next.class_tag); + if(next.type_tag == NO_OBJECT) + return next; + + u32bit length = decode_length(source); + next.value.create(length); + if(source->read(next.value, length) != length) + throw BER_Decoding_Error("Value truncated"); + + if(next.type_tag == EOC && next.class_tag == UNIVERSAL) + return get_next_object(); + + return next; + } + +/* +* Push a object back into the stream +*/ +void BER_Decoder::push_back(const BER_Object& obj) + { + if(pushed.type_tag != NO_OBJECT) + throw Invalid_State("BER_Decoder: Only one push back is allowed"); + pushed = obj; + } + +/* +* Begin decoding a CONSTRUCTED type +*/ +BER_Decoder BER_Decoder::start_cons(ASN1_Tag type_tag, + ASN1_Tag class_tag) + { + BER_Object obj = get_next_object(); + obj.assert_is_a(type_tag, ASN1_Tag(class_tag | CONSTRUCTED)); + + BER_Decoder result(obj.value, obj.value.size()); + result.parent = this; + return result; + } + +/* +* Finish decoding a CONSTRUCTED type +*/ +BER_Decoder& BER_Decoder::end_cons() + { + if(!parent) + throw Invalid_State("BER_Decoder::end_cons called with NULL parent"); + if(!source->end_of_data()) + throw Decoding_Error("BER_Decoder::end_cons called with data left"); + return (*parent); + } + +/* +* BER_Decoder Constructor +*/ +BER_Decoder::BER_Decoder(DataSource& src) + { + source = &src; + owns = false; + pushed.type_tag = pushed.class_tag = NO_OBJECT; + parent = 0; + } + +/* +* BER_Decoder Constructor + */ +BER_Decoder::BER_Decoder(const byte data[], u32bit length) + { + source = new DataSource_Memory(data, length); + owns = true; + pushed.type_tag = pushed.class_tag = NO_OBJECT; + parent = 0; + } + +/* +* BER_Decoder Constructor +*/ +BER_Decoder::BER_Decoder(const MemoryRegion& data) + { + source = new DataSource_Memory(data); + owns = true; + pushed.type_tag = pushed.class_tag = NO_OBJECT; + parent = 0; + } + +/* +* BER_Decoder Copy Constructor +*/ +BER_Decoder::BER_Decoder(const BER_Decoder& other) + { + source = other.source; + owns = false; + if(other.owns) + { + other.owns = false; + owns = true; + } + pushed.type_tag = pushed.class_tag = NO_OBJECT; + parent = other.parent; + } + +/* +* BER_Decoder Destructor +*/ +BER_Decoder::~BER_Decoder() + { + if(owns) + delete source; + source = 0; + } + +/* +* Request for an object to decode itself +*/ +BER_Decoder& BER_Decoder::decode(ASN1_Object& obj) + { + obj.decode_from(*this); + return (*this); + } + +/* +* Decode a BER encoded NULL +*/ +BER_Decoder& BER_Decoder::decode_null() + { + BER_Object obj = get_next_object(); + obj.assert_is_a(NULL_TAG, UNIVERSAL); + if(obj.value.size()) + throw BER_Decoding_Error("NULL object had nonzero size"); + return (*this); + } + +/* +* Decode a BER encoded BOOLEAN +*/ +BER_Decoder& BER_Decoder::decode(bool& out) + { + return decode(out, BOOLEAN, UNIVERSAL); + } + +/* +* Decode a small BER encoded INTEGER +*/ +BER_Decoder& BER_Decoder::decode(u32bit& out) + { + return decode(out, INTEGER, UNIVERSAL); + } + +/* +* Decode a BER encoded INTEGER +*/ +BER_Decoder& BER_Decoder::decode(BigInt& out) + { + return decode(out, INTEGER, UNIVERSAL); + } + +/* +* Decode a BER encoded BOOLEAN +*/ +BER_Decoder& BER_Decoder::decode(bool& out, + ASN1_Tag type_tag, ASN1_Tag class_tag) + { + BER_Object obj = get_next_object(); + obj.assert_is_a(type_tag, class_tag); + + if(obj.value.size() != 1) + throw BER_Decoding_Error("BER boolean value had invalid size"); + + out = (obj.value[0]) ? true : false; + return (*this); + } + +/* +* Decode a small BER encoded INTEGER +*/ +BER_Decoder& BER_Decoder::decode(u32bit& out, + ASN1_Tag type_tag, ASN1_Tag class_tag) + { + BigInt integer; + decode(integer, type_tag, class_tag); + out = integer.to_u32bit(); + return (*this); + } + +/* +* Decode a BER encoded INTEGER +*/ +BER_Decoder& BER_Decoder::decode(BigInt& out, + ASN1_Tag type_tag, ASN1_Tag class_tag) + { + BER_Object obj = get_next_object(); + obj.assert_is_a(type_tag, class_tag); + + if(obj.value.is_empty()) + out = 0; + else + { + const bool negative = (obj.value[0] & 0x80) ? true : false; + + if(negative) + { + for(u32bit j = obj.value.size(); j > 0; --j) + if(obj.value[j-1]--) + break; + for(u32bit j = 0; j != obj.value.size(); ++j) + obj.value[j] = ~obj.value[j]; + } + + out = BigInt(obj.value, obj.value.size()); + + if(negative) + out.flip_sign(); + } + + return (*this); + } + +/* +* BER decode a BIT STRING or OCTET STRING +*/ +BER_Decoder& BER_Decoder::decode(MemoryRegion& out, ASN1_Tag real_type) + { + return decode(out, real_type, real_type, UNIVERSAL); + } + +/* +* BER decode a BIT STRING or OCTET STRING +*/ +BER_Decoder& BER_Decoder::decode(MemoryRegion& buffer, + ASN1_Tag real_type, + ASN1_Tag type_tag, ASN1_Tag class_tag) + { + if(real_type != OCTET_STRING && real_type != BIT_STRING) + throw BER_Bad_Tag("Bad tag for {BIT,OCTET} STRING", real_type); + + BER_Object obj = get_next_object(); + obj.assert_is_a(type_tag, class_tag); + + if(real_type == OCTET_STRING) + buffer = obj.value; + else + { + if(obj.value[0] >= 8) + throw BER_Decoding_Error("Bad number of unused bits in BIT STRING"); + buffer.set(obj.value + 1, obj.value.size() - 1); + } + return (*this); + } + +/* +* Decode an OPTIONAL string type +*/ +BER_Decoder& BER_Decoder::decode_optional_string(MemoryRegion& out, + ASN1_Tag real_type, + u16bit type_no) + { + BER_Object obj = get_next_object(); + + ASN1_Tag type_tag = static_cast(type_no); + + out.clear(); + push_back(obj); + + if(obj.type_tag == type_tag && obj.class_tag == CONTEXT_SPECIFIC) + decode(out, real_type, type_tag, CONTEXT_SPECIFIC); + + return (*this); + } + +} diff --git a/src/libs/3rdparty/botan/src/asn1/ber_dec.h b/src/libs/3rdparty/botan/src/asn1/ber_dec.h new file mode 100644 index 00000000000..2e38af30187 --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/ber_dec.h @@ -0,0 +1,122 @@ +/* +* BER Decoder +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BER_DECODER_H__ +#define BOTAN_BER_DECODER_H__ + +#include +#include + +namespace Botan { + +/* +* BER Decoding Object +*/ +class BOTAN_DLL BER_Decoder + { + public: + BER_Object get_next_object(); + void push_back(const BER_Object&); + + bool more_items() const; + BER_Decoder& verify_end(); + BER_Decoder& discard_remaining(); + + BER_Decoder start_cons(ASN1_Tag, ASN1_Tag = UNIVERSAL); + BER_Decoder& end_cons(); + + BER_Decoder& raw_bytes(MemoryRegion&); + + BER_Decoder& decode_null(); + BER_Decoder& decode(bool&); + BER_Decoder& decode(u32bit&); + BER_Decoder& decode(class BigInt&); + BER_Decoder& decode(MemoryRegion&, ASN1_Tag); + + BER_Decoder& decode(bool&, ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC); + BER_Decoder& decode(u32bit&, ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC); + BER_Decoder& decode(class BigInt&, + ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC); + BER_Decoder& decode(MemoryRegion&, ASN1_Tag, + ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC); + + BER_Decoder& decode(class ASN1_Object&); + + template + BER_Decoder& decode_optional(T&, ASN1_Tag, ASN1_Tag, const T& = T()); + + template + BER_Decoder& decode_list(std::vector&, bool = true); + + BER_Decoder& decode_optional_string(MemoryRegion&, + ASN1_Tag, u16bit); + + BER_Decoder(DataSource&); + BER_Decoder(const byte[], u32bit); + BER_Decoder(const MemoryRegion&); + BER_Decoder(const BER_Decoder&); + ~BER_Decoder(); + private: + BER_Decoder& operator=(const BER_Decoder&) { return (*this); } + + BER_Decoder* parent; + DataSource* source; + BER_Object pushed; + mutable bool owns; + }; + +/* +* Decode an OPTIONAL or DEFAULT element +*/ +template +BER_Decoder& BER_Decoder::decode_optional(T& out, + ASN1_Tag type_tag, + ASN1_Tag class_tag, + const T& default_value) + { + BER_Object obj = get_next_object(); + + if(obj.type_tag == type_tag && obj.class_tag == class_tag) + { + if(class_tag & CONSTRUCTED) + BER_Decoder(obj.value).decode(out).verify_end(); + else + { + push_back(obj); + decode(out, type_tag, class_tag); + } + } + else + { + out = default_value; + push_back(obj); + } + + return (*this); + } + +/* +* Decode a list of homogenously typed values +*/ +template +BER_Decoder& BER_Decoder::decode_list(std::vector& vec, bool clear_it) + { + if(clear_it) + vec.clear(); + + while(more_items()) + { + T value; + decode(value); + vec.push_back(value); + } + return (*this); + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/asn1/der_enc.cpp b/src/libs/3rdparty/botan/src/asn1/der_enc.cpp new file mode 100644 index 00000000000..bee26943117 --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/der_enc.cpp @@ -0,0 +1,393 @@ +/* +* DER Encoder +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* DER encode an ASN.1 type tag +*/ +SecureVector encode_tag(ASN1_Tag type_tag, ASN1_Tag class_tag) + { + if((class_tag | 0xE0) != 0xE0) + throw Encoding_Error("DER_Encoder: Invalid class tag " + + to_string(class_tag)); + + SecureVector encoded_tag; + if(type_tag <= 30) + encoded_tag.append(static_cast(type_tag | class_tag)); + else + { + u32bit blocks = high_bit(type_tag) + 6; + blocks = (blocks - (blocks % 7)) / 7; + + encoded_tag.append(class_tag | 0x1F); + for(u32bit k = 0; k != blocks - 1; ++k) + encoded_tag.append(0x80 | ((type_tag >> 7*(blocks-k-1)) & 0x7F)); + encoded_tag.append(type_tag & 0x7F); + } + + return encoded_tag; + } + +/* +* DER encode an ASN.1 length field +*/ +SecureVector encode_length(u32bit length) + { + SecureVector encoded_length; + if(length <= 127) + encoded_length.append(static_cast(length)); + else + { + const u32bit top_byte = significant_bytes(length); + encoded_length.append(static_cast(0x80 | top_byte)); + for(u32bit j = 4-top_byte; j != 4; ++j) + encoded_length.append(get_byte(j, length)); + } + return encoded_length; + } + +} + +/* +* Return the encoded SEQUENCE/SET +*/ +SecureVector DER_Encoder::DER_Sequence::get_contents() + { + const ASN1_Tag real_class_tag = ASN1_Tag(class_tag | CONSTRUCTED); + + SecureVector encoded_tag = encode_tag(type_tag, real_class_tag); + + if(type_tag == SET) + { + std::sort(set_contents.begin(), set_contents.end()); + for(u32bit j = 0; j != set_contents.size(); ++j) + contents.append(set_contents[j]); + set_contents.clear(); + } + + SecureVector encoded_length = encode_length(contents.size()); + + SecureVector retval; + retval.append(encoded_tag); + retval.append(encoded_length); + retval.append(contents); + contents.destroy(); + return retval; + } + +/* +* Add an encoded value to the SEQUENCE/SET +*/ +void DER_Encoder::DER_Sequence::add_bytes(const byte data[], u32bit length) + { + if(type_tag == SET) + set_contents.push_back(SecureVector(data, length)); + else + contents.append(data, length); + } + +/* +* Return the type and class taggings +*/ +ASN1_Tag DER_Encoder::DER_Sequence::tag_of() const + { + return ASN1_Tag(type_tag | class_tag); + } + +/* +* DER_Sequence Constructor +*/ +DER_Encoder::DER_Sequence::DER_Sequence(ASN1_Tag t1, ASN1_Tag t2) : + type_tag(t1), class_tag(t2) + { + } + +/* +* Return the encoded contents +*/ +SecureVector DER_Encoder::get_contents() + { + if(subsequences.size() != 0) + throw Invalid_State("DER_Encoder: Sequence hasn't been marked done"); + + SecureVector retval; + retval = contents; + contents.destroy(); + return retval; + } + +/* +* Start a new ASN.1 SEQUENCE/SET/EXPLICIT +*/ +DER_Encoder& DER_Encoder::start_cons(ASN1_Tag type_tag, + ASN1_Tag class_tag) + { + subsequences.push_back(DER_Sequence(type_tag, class_tag)); + return (*this); + } + +/* +* Finish the current ASN.1 SEQUENCE/SET/EXPLICIT +*/ +DER_Encoder& DER_Encoder::end_cons() + { + if(subsequences.empty()) + throw Invalid_State("DER_Encoder::end_cons: No such sequence"); + + SecureVector seq = subsequences[subsequences.size()-1].get_contents(); + subsequences.pop_back(); + raw_bytes(seq); + return (*this); + } + +/* +* Start a new ASN.1 EXPLICIT encoding +*/ +DER_Encoder& DER_Encoder::start_explicit(u16bit type_no) + { + ASN1_Tag type_tag = static_cast(type_no); + + if(type_tag == SET) + throw Internal_Error("DER_Encoder.start_explicit(SET); cannot perform"); + + return start_cons(type_tag, CONTEXT_SPECIFIC); + } + +/* +* Finish the current ASN.1 EXPLICIT encoding +*/ +DER_Encoder& DER_Encoder::end_explicit() + { + return end_cons(); + } + +/* +* Write raw bytes into the stream +*/ +DER_Encoder& DER_Encoder::raw_bytes(const MemoryRegion& val) + { + return raw_bytes(val.begin(), val.size()); + } + +/* +* Write raw bytes into the stream +*/ +DER_Encoder& DER_Encoder::raw_bytes(const byte bytes[], u32bit length) + { + if(subsequences.size()) + subsequences[subsequences.size()-1].add_bytes(bytes, length); + else + contents.append(bytes, length); + + return (*this); + } + +/* +* Encode a NULL object +*/ +DER_Encoder& DER_Encoder::encode_null() + { + return add_object(NULL_TAG, UNIVERSAL, 0, 0); + } + +/* +* DER encode a BOOLEAN +*/ +DER_Encoder& DER_Encoder::encode(bool is_true) + { + return encode(is_true, BOOLEAN, UNIVERSAL); + } + +/* +* DER encode a small INTEGER +*/ +DER_Encoder& DER_Encoder::encode(u32bit n) + { + return encode(BigInt(n), INTEGER, UNIVERSAL); + } + +/* +* DER encode a small INTEGER +*/ +DER_Encoder& DER_Encoder::encode(const BigInt& n) + { + return encode(n, INTEGER, UNIVERSAL); + } + +/* +* DER encode an OCTET STRING or BIT STRING +*/ +DER_Encoder& DER_Encoder::encode(const MemoryRegion& bytes, + ASN1_Tag real_type) + { + return encode(bytes.begin(), bytes.size(), + real_type, real_type, UNIVERSAL); + } + +/* +* Encode this object +*/ +DER_Encoder& DER_Encoder::encode(const byte bytes[], u32bit length, + ASN1_Tag real_type) + { + return encode(bytes, length, real_type, real_type, UNIVERSAL); + } + +/* +* DER encode a BOOLEAN +*/ +DER_Encoder& DER_Encoder::encode(bool is_true, + ASN1_Tag type_tag, ASN1_Tag class_tag) + { + byte val = is_true ? 0xFF : 0x00; + return add_object(type_tag, class_tag, &val, 1); + } + +/* +* DER encode a small INTEGER +*/ +DER_Encoder& DER_Encoder::encode(u32bit n, + ASN1_Tag type_tag, ASN1_Tag class_tag) + { + return encode(BigInt(n), type_tag, class_tag); + } + +/* +* DER encode an INTEGER +*/ +DER_Encoder& DER_Encoder::encode(const BigInt& n, + ASN1_Tag type_tag, ASN1_Tag class_tag) + { + if(n == 0) + return add_object(type_tag, class_tag, 0); + + bool extra_zero = (n.bits() % 8 == 0); + SecureVector contents(extra_zero + n.bytes()); + BigInt::encode(contents.begin() + extra_zero, n); + if(n < 0) + { + for(u32bit j = 0; j != contents.size(); ++j) + contents[j] = ~contents[j]; + for(u32bit j = contents.size(); j > 0; --j) + if(++contents[j-1]) + break; + } + + return add_object(type_tag, class_tag, contents); + } + +/* +* DER encode an OCTET STRING or BIT STRING +*/ +DER_Encoder& DER_Encoder::encode(const MemoryRegion& bytes, + ASN1_Tag real_type, + ASN1_Tag type_tag, ASN1_Tag class_tag) + { + return encode(bytes.begin(), bytes.size(), + real_type, type_tag, class_tag); + } + +/* +* DER encode an OCTET STRING or BIT STRING +*/ +DER_Encoder& DER_Encoder::encode(const byte bytes[], u32bit length, + ASN1_Tag real_type, + ASN1_Tag type_tag, ASN1_Tag class_tag) + { + if(real_type != OCTET_STRING && real_type != BIT_STRING) + throw Invalid_Argument("DER_Encoder: Invalid tag for byte/bit string"); + + if(real_type == BIT_STRING) + { + SecureVector encoded; + encoded.append(0); + encoded.append(bytes, length); + return add_object(type_tag, class_tag, encoded); + } + else + return add_object(type_tag, class_tag, bytes, length); + } + +/* +* Conditionally write some values to the stream +*/ +DER_Encoder& DER_Encoder::encode_if(bool cond, DER_Encoder& codec) + { + if(cond) + return raw_bytes(codec.get_contents()); + return (*this); + } + +/* +* Request for an object to encode itself +*/ +DER_Encoder& DER_Encoder::encode(const ASN1_Object& obj) + { + obj.encode_into(*this); + return (*this); + } + +/* +* Write the encoding of the byte(s) +*/ +DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, + const byte rep[], u32bit length) + { + SecureVector encoded_tag = encode_tag(type_tag, class_tag); + SecureVector encoded_length = encode_length(length); + + SecureVector buffer; + buffer.append(encoded_tag); + buffer.append(encoded_length); + buffer.append(rep, length); + + return raw_bytes(buffer); + } + +/* +* Write the encoding of the byte(s) +*/ +DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, + const MemoryRegion& rep_buf) + { + const byte* rep = rep_buf.begin(); + const u32bit rep_len = rep_buf.size(); + return add_object(type_tag, class_tag, rep, rep_len); + } + +/* +* Write the encoding of the byte(s) +*/ +DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, + const std::string& rep_str) + { + const byte* rep = reinterpret_cast(rep_str.data()); + const u32bit rep_len = rep_str.size(); + return add_object(type_tag, class_tag, rep, rep_len); + } + +/* +* Write the encoding of the byte +*/ +DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, + ASN1_Tag class_tag, byte rep) + { + return add_object(type_tag, class_tag, &rep, 1); + } + +} diff --git a/src/libs/3rdparty/botan/src/asn1/der_enc.h b/src/libs/3rdparty/botan/src/asn1/der_enc.h new file mode 100644 index 00000000000..23b5297e56b --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/der_enc.h @@ -0,0 +1,91 @@ +/* +* DER Encoder +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DER_ENCODER_H__ +#define BOTAN_DER_ENCODER_H__ + +#include +#include + +namespace Botan { + +/* +* General DER Encoding Object +*/ +class BOTAN_DLL DER_Encoder + { + public: + SecureVector get_contents(); + + DER_Encoder& start_cons(ASN1_Tag, ASN1_Tag = UNIVERSAL); + DER_Encoder& end_cons(); + + DER_Encoder& start_explicit(u16bit); + DER_Encoder& end_explicit(); + + DER_Encoder& raw_bytes(const byte[], u32bit); + DER_Encoder& raw_bytes(const MemoryRegion&); + + DER_Encoder& encode_null(); + DER_Encoder& encode(bool); + DER_Encoder& encode(u32bit); + DER_Encoder& encode(const class BigInt&); + DER_Encoder& encode(const MemoryRegion&, ASN1_Tag); + DER_Encoder& encode(const byte[], u32bit, ASN1_Tag); + + DER_Encoder& encode(bool, ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC); + DER_Encoder& encode(u32bit, ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC); + DER_Encoder& encode(const class BigInt&, ASN1_Tag, + ASN1_Tag = CONTEXT_SPECIFIC); + DER_Encoder& encode(const MemoryRegion&, ASN1_Tag, + ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC); + DER_Encoder& encode(const byte[], u32bit, ASN1_Tag, + ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC); + + template + DER_Encoder& encode_optional(const T& value, const T& default_value) + { + if(value != default_value) + encode(value); + return (*this); + } + + template + DER_Encoder& encode_list(const std::vector& values) + { + for(u32bit j = 0; j != values.size(); ++j) + encode(values[j]); + return (*this); + } + + DER_Encoder& encode(const class ASN1_Object&); + DER_Encoder& encode_if(bool, DER_Encoder&); + + DER_Encoder& add_object(ASN1_Tag, ASN1_Tag, const byte[], u32bit); + DER_Encoder& add_object(ASN1_Tag, ASN1_Tag, const MemoryRegion&); + DER_Encoder& add_object(ASN1_Tag, ASN1_Tag, const std::string&); + DER_Encoder& add_object(ASN1_Tag, ASN1_Tag, byte); + private: + class DER_Sequence + { + public: + ASN1_Tag tag_of() const; + SecureVector get_contents(); + void add_bytes(const byte[], u32bit); + DER_Sequence(ASN1_Tag, ASN1_Tag); + private: + ASN1_Tag type_tag, class_tag; + SecureVector contents; + std::vector< SecureVector > set_contents; + }; + SecureVector contents; + std::vector subsequences; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/asn1/info.txt b/src/libs/3rdparty/botan/src/asn1/info.txt new file mode 100644 index 00000000000..7b8110c10d1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/asn1/info.txt @@ -0,0 +1,31 @@ +realname "ASN.1/BER/DER module" + +define ASN1 + +load_on auto + + +alg_id.cpp +asn1_alt.cpp +asn1_att.cpp +asn1_dn.cpp +asn1_int.cpp +asn1_oid.cpp +asn1_str.cpp +asn1_tm.cpp +ber_dec.cpp +der_enc.cpp +alg_id.h +asn1_int.h +asn1_obj.h +asn1_oid.h +ber_dec.h +der_enc.h + + + +alloc +bigint +filters +oid_lookup + diff --git a/src/libs/3rdparty/botan/src/benchmark/benchmark.cpp b/src/libs/3rdparty/botan/src/benchmark/benchmark.cpp new file mode 100644 index 00000000000..01e3b94f356 --- /dev/null +++ b/src/libs/3rdparty/botan/src/benchmark/benchmark.cpp @@ -0,0 +1,189 @@ +/** +* Runtime benchmarking +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/** +* Benchmark BufferedComputation (hash or MAC) +*/ +std::pair bench_buf_comp(BufferedComputation* buf_comp, + Timer& timer, + u64bit nanoseconds_max, + const byte buf[], u32bit buf_len) + { + const u64bit start = timer.clock(); + u64bit nanoseconds_used = 0; + u64bit reps = 0; + + while(nanoseconds_used < nanoseconds_max) + { + buf_comp->update(buf, buf_len); + ++reps; + nanoseconds_used = timer.clock() - start; + } + + return std::make_pair(reps * buf_len, nanoseconds_used); + } + +/** +* Benchmark block cipher +*/ +std::pair +bench_block_cipher(BlockCipher* block_cipher, + Timer& timer, + u64bit nanoseconds_max, + byte buf[], u32bit buf_len) + { + const u64bit start = timer.clock(); + u64bit nanoseconds_used = 0; + u64bit reps = 0; + + const u32bit in_blocks = buf_len / block_cipher->BLOCK_SIZE; + + while(nanoseconds_used < nanoseconds_max) + { + for(u32bit i = 0; i != in_blocks; ++i) + block_cipher->encrypt(buf + block_cipher->BLOCK_SIZE * i); + + ++reps; + nanoseconds_used = timer.clock() - start; + } + + return std::make_pair(reps * in_blocks * block_cipher->BLOCK_SIZE, + nanoseconds_used); + } + +/** +* Benchmark stream +*/ +std::pair +bench_stream_cipher(StreamCipher* stream_cipher, + Timer& timer, + u64bit nanoseconds_max, + byte buf[], u32bit buf_len) + { + const u64bit start = timer.clock(); + u64bit nanoseconds_used = 0; + u64bit reps = 0; + + while(nanoseconds_used < nanoseconds_max) + { + stream_cipher->encrypt(buf, buf_len); + ++reps; + nanoseconds_used = timer.clock() - start; + } + + return std::make_pair(reps * buf_len, nanoseconds_used); + } + +/** +* Benchmark hash +*/ +std::pair +bench_hash(HashFunction* hash, Timer& timer, + u64bit nanoseconds_max, + const byte buf[], u32bit buf_len) + { + return bench_buf_comp(hash, timer, nanoseconds_max, buf, buf_len); + } + +/** +* Benchmark MAC +*/ +std::pair +bench_mac(MessageAuthenticationCode* mac, + Timer& timer, + u64bit nanoseconds_max, + const byte buf[], u32bit buf_len) + { + mac->set_key(buf, mac->MAXIMUM_KEYLENGTH); + return bench_buf_comp(mac, timer, nanoseconds_max, buf, buf_len); + } + +} + +std::map +algorithm_benchmark(const std::string& name, + u32bit milliseconds, + Timer& timer, + RandomNumberGenerator& rng, + Algorithm_Factory& af) + { + std::vector providers = af.providers_of(name); + std::map all_results; + + if(providers.empty()) // no providers, nothing to do + return all_results; + + const u64bit ns_per_provider = + ((u64bit)milliseconds * 1000 * 1000) / providers.size(); + + std::vector buf(16 * 1024); + rng.randomize(&buf[0], buf.size()); + + for(u32bit i = 0; i != providers.size(); ++i) + { + const std::string provider = providers[i]; + + std::pair results(0, 0); + + if(const BlockCipher* proto = + af.prototype_block_cipher(name, provider)) + { + std::auto_ptr block_cipher(proto->clone()); + results = bench_block_cipher(block_cipher.get(), timer, + ns_per_provider, + &buf[0], buf.size()); + } + else if(const StreamCipher* proto = + af.prototype_stream_cipher(name, provider)) + { + std::auto_ptr stream_cipher(proto->clone()); + results = bench_stream_cipher(stream_cipher.get(), timer, + ns_per_provider, + &buf[0], buf.size()); + } + else if(const HashFunction* proto = + af.prototype_hash_function(name, provider)) + { + std::auto_ptr hash(proto->clone()); + results = bench_hash(hash.get(), timer, ns_per_provider, + &buf[0], buf.size()); + } + else if(const MessageAuthenticationCode* proto = + af.prototype_mac(name, provider)) + { + std::auto_ptr mac(proto->clone()); + results = bench_mac(mac.get(), timer, ns_per_provider, + &buf[0], buf.size()); + } + + if(results.first && results.second) + { + /* 953.67 == 1000 * 1000 * 1000 / 1024 / 1024 - the conversion + factor from bytes per nanosecond to mebibytes per second. + */ + double speed = (953.67 * results.first) / results.second; + all_results[provider] = speed; + } + } + + return all_results; + } + +} diff --git a/src/libs/3rdparty/botan/src/benchmark/benchmark.h b/src/libs/3rdparty/botan/src/benchmark/benchmark.h new file mode 100644 index 00000000000..272cfdfa22d --- /dev/null +++ b/src/libs/3rdparty/botan/src/benchmark/benchmark.h @@ -0,0 +1,59 @@ +/** +* Runtime benchmarking +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_RUNTIME_BENCHMARK_H__ +#define BOTAN_RUNTIME_BENCHMARK_H__ + +#include +#include +#include +#include +#include + +/** +* Choose some sort of default timer implementation to use, since some +* (like hardware tick counters and current Win32 timer) are not +* reliable for benchmarking. +*/ +#if defined(BOTAN_HAS_TIMER_POSIX) + #include +#elif defined(BOTAN_HAS_TIMER_UNIX) + #include +#endif + +namespace Botan { + +#if defined(BOTAN_HAS_TIMER_POSIX) + typedef POSIX_Timer Default_Benchmark_Timer; +#elif defined(BOTAN_HAS_TIMER_UNIX) + typedef Unix_Timer Default_Benchmark_Timer; +#else + /* I have not had good success using clock(), the results seem + * pretty bogus, but as a last resort it works. + */ + typedef ANSI_Clock_Timer Default_Benchmark_Timer; +#endif + +/** +* Algorithm benchmark +* @param name the name of the algorithm to test (cipher, hash, or MAC) +* @param milliseconds total time for the benchmark to run +* @param timer the timer to use +* @param rng the rng to use to generate random inputs +* @param af the algorithm factory used to create objects +* @return results a map from provider to speed in mebibytes per second +*/ +std::map +algorithm_benchmark(const std::string& name, + u32bit milliseconds, + Timer& timer, + RandomNumberGenerator& rng, + Algorithm_Factory& af); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/benchmark/info.txt b/src/libs/3rdparty/botan/src/benchmark/info.txt new file mode 100644 index 00000000000..0fbcdb2dea4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/benchmark/info.txt @@ -0,0 +1,21 @@ +realname "Benchmarking" + +define RUNTIME_BENCHMARKING + +load_on auto + + +benchmark.cpp +benchmark.h + + + +algo_factory +block +buf_comp +hash +mac +rng +stream +timer + diff --git a/src/libs/3rdparty/botan/src/block/aes/aes.cpp b/src/libs/3rdparty/botan/src/block/aes/aes.cpp new file mode 100644 index 00000000000..9072b507b16 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/aes/aes.cpp @@ -0,0 +1,257 @@ +/** +* AES +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/** +* AES Encryption +*/ +void AES::enc(const byte in[], byte out[]) const + { + const u32bit* TE0 = TE; + const u32bit* TE1 = TE + 256; + const u32bit* TE2 = TE + 512; + const u32bit* TE3 = TE + 768; + + u32bit T0 = load_be(in, 0) ^ EK[0]; + u32bit T1 = load_be(in, 1) ^ EK[1]; + u32bit T2 = load_be(in, 2) ^ EK[2]; + u32bit T3 = load_be(in, 3) ^ EK[3]; + + u32bit B0, B1, B2, B3; + B0 = TE0[get_byte(0, T0)] ^ TE1[get_byte(1, T1)] ^ + TE2[get_byte(2, T2)] ^ TE3[get_byte(3, T3)] ^ EK[4]; + B1 = TE0[get_byte(0, T1)] ^ TE1[get_byte(1, T2)] ^ + TE2[get_byte(2, T3)] ^ TE3[get_byte(3, T0)] ^ EK[5]; + B2 = TE0[get_byte(0, T2)] ^ TE1[get_byte(1, T3)] ^ + TE2[get_byte(2, T0)] ^ TE3[get_byte(3, T1)] ^ EK[6]; + B3 = TE0[get_byte(0, T3)] ^ TE1[get_byte(1, T0)] ^ + TE2[get_byte(2, T1)] ^ TE3[get_byte(3, T2)] ^ EK[7]; + + for(u32bit j = 2; j != ROUNDS; j += 2) + { + const u32bit K0 = EK[4*j]; + const u32bit K1 = EK[4*j+1]; + const u32bit K2 = EK[4*j+2]; + const u32bit K3 = EK[4*j+3]; + + T0 = TE0[get_byte(0, B0)] ^ TE1[get_byte(1, B1)] ^ + TE2[get_byte(2, B2)] ^ TE3[get_byte(3, B3)] ^ K0; + T1 = TE0[get_byte(0, B1)] ^ TE1[get_byte(1, B2)] ^ + TE2[get_byte(2, B3)] ^ TE3[get_byte(3, B0)] ^ K1; + T2 = TE0[get_byte(0, B2)] ^ TE1[get_byte(1, B3)] ^ + TE2[get_byte(2, B0)] ^ TE3[get_byte(3, B1)] ^ K2; + T3 = TE0[get_byte(0, B3)] ^ TE1[get_byte(1, B0)] ^ + TE2[get_byte(2, B1)] ^ TE3[get_byte(3, B2)] ^ K3; + + const u32bit K4 = EK[4*(j+1)+0]; + const u32bit K5 = EK[4*(j+1)+1]; + const u32bit K6 = EK[4*(j+1)+2]; + const u32bit K7 = EK[4*(j+1)+3]; + + B0 = TE0[get_byte(0, T0)] ^ TE1[get_byte(1, T1)] ^ + TE2[get_byte(2, T2)] ^ TE3[get_byte(3, T3)] ^ K4; + B1 = TE0[get_byte(0, T1)] ^ TE1[get_byte(1, T2)] ^ + TE2[get_byte(2, T3)] ^ TE3[get_byte(3, T0)] ^ K5; + B2 = TE0[get_byte(0, T2)] ^ TE1[get_byte(1, T3)] ^ + TE2[get_byte(2, T0)] ^ TE3[get_byte(3, T1)] ^ K6; + B3 = TE0[get_byte(0, T3)] ^ TE1[get_byte(1, T0)] ^ + TE2[get_byte(2, T1)] ^ TE3[get_byte(3, T2)] ^ K7; + } + + /* + Joseph Bonneau and Ilya Mironov's paper + + Cache-Collision Timing Attacks Against AES describes an attack + that can recover AES keys with as few as 213 samples. + + """In addition to OpenSSL v. 0.9.8.(a), which was used in our + experiments, the AES implementations of Crypto++ 5.2.1 and + LibTomCrypt 1.09 use the original Rijndael C implementation with + very few changes and are highly vulnerable. The AES implementations + in libgcrypt v. 1.2.2 and Botan v. 1.4.2 are also vulnerable, but + use a smaller byte-wide final table which lessens the effectiveness + of the attacks.""" + */ + out[ 0] = SE[get_byte(0, B0)] ^ ME[0]; + out[ 1] = SE[get_byte(1, B1)] ^ ME[1]; + out[ 2] = SE[get_byte(2, B2)] ^ ME[2]; + out[ 3] = SE[get_byte(3, B3)] ^ ME[3]; + out[ 4] = SE[get_byte(0, B1)] ^ ME[4]; + out[ 5] = SE[get_byte(1, B2)] ^ ME[5]; + out[ 6] = SE[get_byte(2, B3)] ^ ME[6]; + out[ 7] = SE[get_byte(3, B0)] ^ ME[7]; + out[ 8] = SE[get_byte(0, B2)] ^ ME[8]; + out[ 9] = SE[get_byte(1, B3)] ^ ME[9]; + out[10] = SE[get_byte(2, B0)] ^ ME[10]; + out[11] = SE[get_byte(3, B1)] ^ ME[11]; + out[12] = SE[get_byte(0, B3)] ^ ME[12]; + out[13] = SE[get_byte(1, B0)] ^ ME[13]; + out[14] = SE[get_byte(2, B1)] ^ ME[14]; + out[15] = SE[get_byte(3, B2)] ^ ME[15]; + } + +/** +* AES Decryption +*/ +void AES::dec(const byte in[], byte out[]) const + { + const u32bit* TD0 = TD; + const u32bit* TD1 = TD + 256; + const u32bit* TD2 = TD + 512; + const u32bit* TD3 = TD + 768; + + u32bit T0 = load_be(in, 0) ^ DK[0]; + u32bit T1 = load_be(in, 1) ^ DK[1]; + u32bit T2 = load_be(in, 2) ^ DK[2]; + u32bit T3 = load_be(in, 3) ^ DK[3]; + + u32bit B0, B1, B2, B3; + B0 = TD0[get_byte(0, T0)] ^ TD1[get_byte(1, T3)] ^ + TD2[get_byte(2, T2)] ^ TD3[get_byte(3, T1)] ^ DK[4]; + B1 = TD0[get_byte(0, T1)] ^ TD1[get_byte(1, T0)] ^ + TD2[get_byte(2, T3)] ^ TD3[get_byte(3, T2)] ^ DK[5]; + B2 = TD0[get_byte(0, T2)] ^ TD1[get_byte(1, T1)] ^ + TD2[get_byte(2, T0)] ^ TD3[get_byte(3, T3)] ^ DK[6]; + B3 = TD0[get_byte(0, T3)] ^ TD1[get_byte(1, T2)] ^ + TD2[get_byte(2, T1)] ^ TD3[get_byte(3, T0)] ^ DK[7]; + + for(u32bit j = 2; j != ROUNDS; j += 2) + { + const u32bit K0 = DK[4*j+0]; + const u32bit K1 = DK[4*j+1]; + const u32bit K2 = DK[4*j+2]; + const u32bit K3 = DK[4*j+3]; + + T0 = TD0[get_byte(0, B0)] ^ TD1[get_byte(1, B3)] ^ + TD2[get_byte(2, B2)] ^ TD3[get_byte(3, B1)] ^ K0; + T1 = TD0[get_byte(0, B1)] ^ TD1[get_byte(1, B0)] ^ + TD2[get_byte(2, B3)] ^ TD3[get_byte(3, B2)] ^ K1; + T2 = TD0[get_byte(0, B2)] ^ TD1[get_byte(1, B1)] ^ + TD2[get_byte(2, B0)] ^ TD3[get_byte(3, B3)] ^ K2; + T3 = TD0[get_byte(0, B3)] ^ TD1[get_byte(1, B2)] ^ + TD2[get_byte(2, B1)] ^ TD3[get_byte(3, B0)] ^ K3; + + const u32bit K4 = DK[4*(j+1)+0]; + const u32bit K5 = DK[4*(j+1)+1]; + const u32bit K6 = DK[4*(j+1)+2]; + const u32bit K7 = DK[4*(j+1)+3]; + + B0 = TD0[get_byte(0, T0)] ^ TD1[get_byte(1, T3)] ^ + TD2[get_byte(2, T2)] ^ TD3[get_byte(3, T1)] ^ K4; + B1 = TD0[get_byte(0, T1)] ^ TD1[get_byte(1, T0)] ^ + TD2[get_byte(2, T3)] ^ TD3[get_byte(3, T2)] ^ K5; + B2 = TD0[get_byte(0, T2)] ^ TD1[get_byte(1, T1)] ^ + TD2[get_byte(2, T0)] ^ TD3[get_byte(3, T3)] ^ K6; + B3 = TD0[get_byte(0, T3)] ^ TD1[get_byte(1, T2)] ^ + TD2[get_byte(2, T1)] ^ TD3[get_byte(3, T0)] ^ K7; + } + + out[ 0] = SD[get_byte(0, B0)] ^ MD[0]; + out[ 1] = SD[get_byte(1, B3)] ^ MD[1]; + out[ 2] = SD[get_byte(2, B2)] ^ MD[2]; + out[ 3] = SD[get_byte(3, B1)] ^ MD[3]; + out[ 4] = SD[get_byte(0, B1)] ^ MD[4]; + out[ 5] = SD[get_byte(1, B0)] ^ MD[5]; + out[ 6] = SD[get_byte(2, B3)] ^ MD[6]; + out[ 7] = SD[get_byte(3, B2)] ^ MD[7]; + out[ 8] = SD[get_byte(0, B2)] ^ MD[8]; + out[ 9] = SD[get_byte(1, B1)] ^ MD[9]; + out[10] = SD[get_byte(2, B0)] ^ MD[10]; + out[11] = SD[get_byte(3, B3)] ^ MD[11]; + out[12] = SD[get_byte(0, B3)] ^ MD[12]; + out[13] = SD[get_byte(1, B2)] ^ MD[13]; + out[14] = SD[get_byte(2, B1)] ^ MD[14]; + out[15] = SD[get_byte(3, B0)] ^ MD[15]; + } + +/** +* AES Key Schedule +*/ +void AES::key_schedule(const byte key[], u32bit length) + { + static const u32bit RC[10] = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, + 0x40000000, 0x80000000, 0x1B000000, 0x36000000 }; + ROUNDS = (length / 4) + 6; + + SecureBuffer XEK, XDK; + + const u32bit X = length / 4; + for(u32bit j = 0; j != X; ++j) + XEK[j] = load_be(key, j); + + for(u32bit j = X; j < 4*(ROUNDS+1); j += X) + { + XEK[j] = XEK[j-X] ^ S(rotate_left(XEK[j-1], 8)) ^ RC[(j-X)/X]; + for(u32bit k = 1; k != X; ++k) + { + if(X == 8 && k == 4) + XEK[j+k] = XEK[j+k-X] ^ S(XEK[j+k-1]); + else + XEK[j+k] = XEK[j+k-X] ^ XEK[j+k-1]; + } + } + + for(u32bit j = 0; j != 4*(ROUNDS+1); j += 4) + { + XDK[j ] = XEK[4*ROUNDS-j ]; + XDK[j+1] = XEK[4*ROUNDS-j+1]; + XDK[j+2] = XEK[4*ROUNDS-j+2]; + XDK[j+3] = XEK[4*ROUNDS-j+3]; + } + + for(u32bit j = 4; j != length + 24; ++j) + XDK[j] = TD[SE[get_byte(0, XDK[j])] + 0] ^ + TD[SE[get_byte(1, XDK[j])] + 256] ^ + TD[SE[get_byte(2, XDK[j])] + 512] ^ + TD[SE[get_byte(3, XDK[j])] + 768]; + + for(u32bit j = 0; j != 4; ++j) + { + store_be(XEK[j+4*ROUNDS], ME + 4*j); + store_be(XEK[j], MD + 4*j); + } + + EK.copy(XEK, length + 24); + DK.copy(XDK, length + 24); + } + +/** +* AES Byte Substitution +*/ +u32bit AES::S(u32bit input) + { + return make_u32bit(SE[get_byte(0, input)], SE[get_byte(1, input)], + SE[get_byte(2, input)], SE[get_byte(3, input)]); + } + +/** +* AES Constructor +*/ +AES::AES(u32bit key_size) : BlockCipher(16, key_size) + { + if(key_size != 16 && key_size != 24 && key_size != 32) + throw Invalid_Key_Length(name(), key_size); + ROUNDS = (key_size / 4) + 6; + } + +/** +* Clear memory of sensitive data +*/ +void AES::clear() throw() + { + EK.clear(); + DK.clear(); + ME.clear(); + MD.clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/aes/aes.h b/src/libs/3rdparty/botan/src/block/aes/aes.h new file mode 100644 index 00000000000..05e2e3123ab --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/aes/aes.h @@ -0,0 +1,81 @@ +/** +* AES +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_AES_H__ +#define BOTAN_AES_H__ + +#include + +namespace Botan { + +/** +* Rijndael aka AES +*/ +class BOTAN_DLL AES : public BlockCipher + { + public: + void clear() throw(); + std::string name() const { return "AES"; } + BlockCipher* clone() const { return new AES; } + AES() : BlockCipher(16, 16, 32, 8) { ROUNDS = 14; } + AES(u32bit); + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + static u32bit S(u32bit); + + static const byte SE[256]; + static const byte SD[256]; + static const u32bit TE[1024]; + static const u32bit TD[1024]; + + u32bit ROUNDS; + + SecureBuffer EK; + SecureBuffer ME; + + SecureBuffer DK; + SecureBuffer MD; + }; + +/** +* AES-128 +*/ +class BOTAN_DLL AES_128 : public AES + { + public: + std::string name() const { return "AES-128"; } + BlockCipher* clone() const { return new AES_128; } + AES_128() : AES(16) {} + }; + +/** +* AES-192 +*/ +class BOTAN_DLL AES_192 : public AES + { + public: + std::string name() const { return "AES-192"; } + BlockCipher* clone() const { return new AES_192; } + AES_192() : AES(24) {} + }; + +/** +* AES-256 +*/ +class BOTAN_DLL AES_256 : public AES + { + public: + std::string name() const { return "AES-256"; } + BlockCipher* clone() const { return new AES_256; } + AES_256() : AES(32) {} + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/aes/aes_tab.cpp b/src/libs/3rdparty/botan/src/block/aes/aes_tab.cpp new file mode 100644 index 00000000000..d42a2cd6043 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/aes/aes_tab.cpp @@ -0,0 +1,406 @@ +/* +* S-Box and Diffusion Tables for AES +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +const byte AES::SE[256] = { + 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, + 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, + 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, + 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, + 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, + 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, + 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, + 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, + 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, + 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, + 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, + 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, + 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, + 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, + 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, + 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, + 0xB0, 0x54, 0xBB, 0x16 }; + +const byte AES::SD[256] = { + 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, + 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, + 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, + 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, + 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, + 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, + 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, + 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, + 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, + 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, + 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, + 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, + 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, + 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, + 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, + 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, + 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, + 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, + 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, + 0x55, 0x21, 0x0C, 0x7D }; + +const u32bit AES::TE[1024] = { + 0xC66363A5, 0xF87C7C84, 0xEE777799, 0xF67B7B8D, 0xFFF2F20D, 0xD66B6BBD, + 0xDE6F6FB1, 0x91C5C554, 0x60303050, 0x02010103, 0xCE6767A9, 0x562B2B7D, + 0xE7FEFE19, 0xB5D7D762, 0x4DABABE6, 0xEC76769A, 0x8FCACA45, 0x1F82829D, + 0x89C9C940, 0xFA7D7D87, 0xEFFAFA15, 0xB25959EB, 0x8E4747C9, 0xFBF0F00B, + 0x41ADADEC, 0xB3D4D467, 0x5FA2A2FD, 0x45AFAFEA, 0x239C9CBF, 0x53A4A4F7, + 0xE4727296, 0x9BC0C05B, 0x75B7B7C2, 0xE1FDFD1C, 0x3D9393AE, 0x4C26266A, + 0x6C36365A, 0x7E3F3F41, 0xF5F7F702, 0x83CCCC4F, 0x6834345C, 0x51A5A5F4, + 0xD1E5E534, 0xF9F1F108, 0xE2717193, 0xABD8D873, 0x62313153, 0x2A15153F, + 0x0804040C, 0x95C7C752, 0x46232365, 0x9DC3C35E, 0x30181828, 0x379696A1, + 0x0A05050F, 0x2F9A9AB5, 0x0E070709, 0x24121236, 0x1B80809B, 0xDFE2E23D, + 0xCDEBEB26, 0x4E272769, 0x7FB2B2CD, 0xEA75759F, 0x1209091B, 0x1D83839E, + 0x582C2C74, 0x341A1A2E, 0x361B1B2D, 0xDC6E6EB2, 0xB45A5AEE, 0x5BA0A0FB, + 0xA45252F6, 0x763B3B4D, 0xB7D6D661, 0x7DB3B3CE, 0x5229297B, 0xDDE3E33E, + 0x5E2F2F71, 0x13848497, 0xA65353F5, 0xB9D1D168, 0x00000000, 0xC1EDED2C, + 0x40202060, 0xE3FCFC1F, 0x79B1B1C8, 0xB65B5BED, 0xD46A6ABE, 0x8DCBCB46, + 0x67BEBED9, 0x7239394B, 0x944A4ADE, 0x984C4CD4, 0xB05858E8, 0x85CFCF4A, + 0xBBD0D06B, 0xC5EFEF2A, 0x4FAAAAE5, 0xEDFBFB16, 0x864343C5, 0x9A4D4DD7, + 0x66333355, 0x11858594, 0x8A4545CF, 0xE9F9F910, 0x04020206, 0xFE7F7F81, + 0xA05050F0, 0x783C3C44, 0x259F9FBA, 0x4BA8A8E3, 0xA25151F3, 0x5DA3A3FE, + 0x804040C0, 0x058F8F8A, 0x3F9292AD, 0x219D9DBC, 0x70383848, 0xF1F5F504, + 0x63BCBCDF, 0x77B6B6C1, 0xAFDADA75, 0x42212163, 0x20101030, 0xE5FFFF1A, + 0xFDF3F30E, 0xBFD2D26D, 0x81CDCD4C, 0x180C0C14, 0x26131335, 0xC3ECEC2F, + 0xBE5F5FE1, 0x359797A2, 0x884444CC, 0x2E171739, 0x93C4C457, 0x55A7A7F2, + 0xFC7E7E82, 0x7A3D3D47, 0xC86464AC, 0xBA5D5DE7, 0x3219192B, 0xE6737395, + 0xC06060A0, 0x19818198, 0x9E4F4FD1, 0xA3DCDC7F, 0x44222266, 0x542A2A7E, + 0x3B9090AB, 0x0B888883, 0x8C4646CA, 0xC7EEEE29, 0x6BB8B8D3, 0x2814143C, + 0xA7DEDE79, 0xBC5E5EE2, 0x160B0B1D, 0xADDBDB76, 0xDBE0E03B, 0x64323256, + 0x743A3A4E, 0x140A0A1E, 0x924949DB, 0x0C06060A, 0x4824246C, 0xB85C5CE4, + 0x9FC2C25D, 0xBDD3D36E, 0x43ACACEF, 0xC46262A6, 0x399191A8, 0x319595A4, + 0xD3E4E437, 0xF279798B, 0xD5E7E732, 0x8BC8C843, 0x6E373759, 0xDA6D6DB7, + 0x018D8D8C, 0xB1D5D564, 0x9C4E4ED2, 0x49A9A9E0, 0xD86C6CB4, 0xAC5656FA, + 0xF3F4F407, 0xCFEAEA25, 0xCA6565AF, 0xF47A7A8E, 0x47AEAEE9, 0x10080818, + 0x6FBABAD5, 0xF0787888, 0x4A25256F, 0x5C2E2E72, 0x381C1C24, 0x57A6A6F1, + 0x73B4B4C7, 0x97C6C651, 0xCBE8E823, 0xA1DDDD7C, 0xE874749C, 0x3E1F1F21, + 0x964B4BDD, 0x61BDBDDC, 0x0D8B8B86, 0x0F8A8A85, 0xE0707090, 0x7C3E3E42, + 0x71B5B5C4, 0xCC6666AA, 0x904848D8, 0x06030305, 0xF7F6F601, 0x1C0E0E12, + 0xC26161A3, 0x6A35355F, 0xAE5757F9, 0x69B9B9D0, 0x17868691, 0x99C1C158, + 0x3A1D1D27, 0x279E9EB9, 0xD9E1E138, 0xEBF8F813, 0x2B9898B3, 0x22111133, + 0xD26969BB, 0xA9D9D970, 0x078E8E89, 0x339494A7, 0x2D9B9BB6, 0x3C1E1E22, + 0x15878792, 0xC9E9E920, 0x87CECE49, 0xAA5555FF, 0x50282878, 0xA5DFDF7A, + 0x038C8C8F, 0x59A1A1F8, 0x09898980, 0x1A0D0D17, 0x65BFBFDA, 0xD7E6E631, + 0x844242C6, 0xD06868B8, 0x824141C3, 0x299999B0, 0x5A2D2D77, 0x1E0F0F11, + 0x7BB0B0CB, 0xA85454FC, 0x6DBBBBD6, 0x2C16163A, 0xA5C66363, 0x84F87C7C, + 0x99EE7777, 0x8DF67B7B, 0x0DFFF2F2, 0xBDD66B6B, 0xB1DE6F6F, 0x5491C5C5, + 0x50603030, 0x03020101, 0xA9CE6767, 0x7D562B2B, 0x19E7FEFE, 0x62B5D7D7, + 0xE64DABAB, 0x9AEC7676, 0x458FCACA, 0x9D1F8282, 0x4089C9C9, 0x87FA7D7D, + 0x15EFFAFA, 0xEBB25959, 0xC98E4747, 0x0BFBF0F0, 0xEC41ADAD, 0x67B3D4D4, + 0xFD5FA2A2, 0xEA45AFAF, 0xBF239C9C, 0xF753A4A4, 0x96E47272, 0x5B9BC0C0, + 0xC275B7B7, 0x1CE1FDFD, 0xAE3D9393, 0x6A4C2626, 0x5A6C3636, 0x417E3F3F, + 0x02F5F7F7, 0x4F83CCCC, 0x5C683434, 0xF451A5A5, 0x34D1E5E5, 0x08F9F1F1, + 0x93E27171, 0x73ABD8D8, 0x53623131, 0x3F2A1515, 0x0C080404, 0x5295C7C7, + 0x65462323, 0x5E9DC3C3, 0x28301818, 0xA1379696, 0x0F0A0505, 0xB52F9A9A, + 0x090E0707, 0x36241212, 0x9B1B8080, 0x3DDFE2E2, 0x26CDEBEB, 0x694E2727, + 0xCD7FB2B2, 0x9FEA7575, 0x1B120909, 0x9E1D8383, 0x74582C2C, 0x2E341A1A, + 0x2D361B1B, 0xB2DC6E6E, 0xEEB45A5A, 0xFB5BA0A0, 0xF6A45252, 0x4D763B3B, + 0x61B7D6D6, 0xCE7DB3B3, 0x7B522929, 0x3EDDE3E3, 0x715E2F2F, 0x97138484, + 0xF5A65353, 0x68B9D1D1, 0x00000000, 0x2CC1EDED, 0x60402020, 0x1FE3FCFC, + 0xC879B1B1, 0xEDB65B5B, 0xBED46A6A, 0x468DCBCB, 0xD967BEBE, 0x4B723939, + 0xDE944A4A, 0xD4984C4C, 0xE8B05858, 0x4A85CFCF, 0x6BBBD0D0, 0x2AC5EFEF, + 0xE54FAAAA, 0x16EDFBFB, 0xC5864343, 0xD79A4D4D, 0x55663333, 0x94118585, + 0xCF8A4545, 0x10E9F9F9, 0x06040202, 0x81FE7F7F, 0xF0A05050, 0x44783C3C, + 0xBA259F9F, 0xE34BA8A8, 0xF3A25151, 0xFE5DA3A3, 0xC0804040, 0x8A058F8F, + 0xAD3F9292, 0xBC219D9D, 0x48703838, 0x04F1F5F5, 0xDF63BCBC, 0xC177B6B6, + 0x75AFDADA, 0x63422121, 0x30201010, 0x1AE5FFFF, 0x0EFDF3F3, 0x6DBFD2D2, + 0x4C81CDCD, 0x14180C0C, 0x35261313, 0x2FC3ECEC, 0xE1BE5F5F, 0xA2359797, + 0xCC884444, 0x392E1717, 0x5793C4C4, 0xF255A7A7, 0x82FC7E7E, 0x477A3D3D, + 0xACC86464, 0xE7BA5D5D, 0x2B321919, 0x95E67373, 0xA0C06060, 0x98198181, + 0xD19E4F4F, 0x7FA3DCDC, 0x66442222, 0x7E542A2A, 0xAB3B9090, 0x830B8888, + 0xCA8C4646, 0x29C7EEEE, 0xD36BB8B8, 0x3C281414, 0x79A7DEDE, 0xE2BC5E5E, + 0x1D160B0B, 0x76ADDBDB, 0x3BDBE0E0, 0x56643232, 0x4E743A3A, 0x1E140A0A, + 0xDB924949, 0x0A0C0606, 0x6C482424, 0xE4B85C5C, 0x5D9FC2C2, 0x6EBDD3D3, + 0xEF43ACAC, 0xA6C46262, 0xA8399191, 0xA4319595, 0x37D3E4E4, 0x8BF27979, + 0x32D5E7E7, 0x438BC8C8, 0x596E3737, 0xB7DA6D6D, 0x8C018D8D, 0x64B1D5D5, + 0xD29C4E4E, 0xE049A9A9, 0xB4D86C6C, 0xFAAC5656, 0x07F3F4F4, 0x25CFEAEA, + 0xAFCA6565, 0x8EF47A7A, 0xE947AEAE, 0x18100808, 0xD56FBABA, 0x88F07878, + 0x6F4A2525, 0x725C2E2E, 0x24381C1C, 0xF157A6A6, 0xC773B4B4, 0x5197C6C6, + 0x23CBE8E8, 0x7CA1DDDD, 0x9CE87474, 0x213E1F1F, 0xDD964B4B, 0xDC61BDBD, + 0x860D8B8B, 0x850F8A8A, 0x90E07070, 0x427C3E3E, 0xC471B5B5, 0xAACC6666, + 0xD8904848, 0x05060303, 0x01F7F6F6, 0x121C0E0E, 0xA3C26161, 0x5F6A3535, + 0xF9AE5757, 0xD069B9B9, 0x91178686, 0x5899C1C1, 0x273A1D1D, 0xB9279E9E, + 0x38D9E1E1, 0x13EBF8F8, 0xB32B9898, 0x33221111, 0xBBD26969, 0x70A9D9D9, + 0x89078E8E, 0xA7339494, 0xB62D9B9B, 0x223C1E1E, 0x92158787, 0x20C9E9E9, + 0x4987CECE, 0xFFAA5555, 0x78502828, 0x7AA5DFDF, 0x8F038C8C, 0xF859A1A1, + 0x80098989, 0x171A0D0D, 0xDA65BFBF, 0x31D7E6E6, 0xC6844242, 0xB8D06868, + 0xC3824141, 0xB0299999, 0x775A2D2D, 0x111E0F0F, 0xCB7BB0B0, 0xFCA85454, + 0xD66DBBBB, 0x3A2C1616, 0x63A5C663, 0x7C84F87C, 0x7799EE77, 0x7B8DF67B, + 0xF20DFFF2, 0x6BBDD66B, 0x6FB1DE6F, 0xC55491C5, 0x30506030, 0x01030201, + 0x67A9CE67, 0x2B7D562B, 0xFE19E7FE, 0xD762B5D7, 0xABE64DAB, 0x769AEC76, + 0xCA458FCA, 0x829D1F82, 0xC94089C9, 0x7D87FA7D, 0xFA15EFFA, 0x59EBB259, + 0x47C98E47, 0xF00BFBF0, 0xADEC41AD, 0xD467B3D4, 0xA2FD5FA2, 0xAFEA45AF, + 0x9CBF239C, 0xA4F753A4, 0x7296E472, 0xC05B9BC0, 0xB7C275B7, 0xFD1CE1FD, + 0x93AE3D93, 0x266A4C26, 0x365A6C36, 0x3F417E3F, 0xF702F5F7, 0xCC4F83CC, + 0x345C6834, 0xA5F451A5, 0xE534D1E5, 0xF108F9F1, 0x7193E271, 0xD873ABD8, + 0x31536231, 0x153F2A15, 0x040C0804, 0xC75295C7, 0x23654623, 0xC35E9DC3, + 0x18283018, 0x96A13796, 0x050F0A05, 0x9AB52F9A, 0x07090E07, 0x12362412, + 0x809B1B80, 0xE23DDFE2, 0xEB26CDEB, 0x27694E27, 0xB2CD7FB2, 0x759FEA75, + 0x091B1209, 0x839E1D83, 0x2C74582C, 0x1A2E341A, 0x1B2D361B, 0x6EB2DC6E, + 0x5AEEB45A, 0xA0FB5BA0, 0x52F6A452, 0x3B4D763B, 0xD661B7D6, 0xB3CE7DB3, + 0x297B5229, 0xE33EDDE3, 0x2F715E2F, 0x84971384, 0x53F5A653, 0xD168B9D1, + 0x00000000, 0xED2CC1ED, 0x20604020, 0xFC1FE3FC, 0xB1C879B1, 0x5BEDB65B, + 0x6ABED46A, 0xCB468DCB, 0xBED967BE, 0x394B7239, 0x4ADE944A, 0x4CD4984C, + 0x58E8B058, 0xCF4A85CF, 0xD06BBBD0, 0xEF2AC5EF, 0xAAE54FAA, 0xFB16EDFB, + 0x43C58643, 0x4DD79A4D, 0x33556633, 0x85941185, 0x45CF8A45, 0xF910E9F9, + 0x02060402, 0x7F81FE7F, 0x50F0A050, 0x3C44783C, 0x9FBA259F, 0xA8E34BA8, + 0x51F3A251, 0xA3FE5DA3, 0x40C08040, 0x8F8A058F, 0x92AD3F92, 0x9DBC219D, + 0x38487038, 0xF504F1F5, 0xBCDF63BC, 0xB6C177B6, 0xDA75AFDA, 0x21634221, + 0x10302010, 0xFF1AE5FF, 0xF30EFDF3, 0xD26DBFD2, 0xCD4C81CD, 0x0C14180C, + 0x13352613, 0xEC2FC3EC, 0x5FE1BE5F, 0x97A23597, 0x44CC8844, 0x17392E17, + 0xC45793C4, 0xA7F255A7, 0x7E82FC7E, 0x3D477A3D, 0x64ACC864, 0x5DE7BA5D, + 0x192B3219, 0x7395E673, 0x60A0C060, 0x81981981, 0x4FD19E4F, 0xDC7FA3DC, + 0x22664422, 0x2A7E542A, 0x90AB3B90, 0x88830B88, 0x46CA8C46, 0xEE29C7EE, + 0xB8D36BB8, 0x143C2814, 0xDE79A7DE, 0x5EE2BC5E, 0x0B1D160B, 0xDB76ADDB, + 0xE03BDBE0, 0x32566432, 0x3A4E743A, 0x0A1E140A, 0x49DB9249, 0x060A0C06, + 0x246C4824, 0x5CE4B85C, 0xC25D9FC2, 0xD36EBDD3, 0xACEF43AC, 0x62A6C462, + 0x91A83991, 0x95A43195, 0xE437D3E4, 0x798BF279, 0xE732D5E7, 0xC8438BC8, + 0x37596E37, 0x6DB7DA6D, 0x8D8C018D, 0xD564B1D5, 0x4ED29C4E, 0xA9E049A9, + 0x6CB4D86C, 0x56FAAC56, 0xF407F3F4, 0xEA25CFEA, 0x65AFCA65, 0x7A8EF47A, + 0xAEE947AE, 0x08181008, 0xBAD56FBA, 0x7888F078, 0x256F4A25, 0x2E725C2E, + 0x1C24381C, 0xA6F157A6, 0xB4C773B4, 0xC65197C6, 0xE823CBE8, 0xDD7CA1DD, + 0x749CE874, 0x1F213E1F, 0x4BDD964B, 0xBDDC61BD, 0x8B860D8B, 0x8A850F8A, + 0x7090E070, 0x3E427C3E, 0xB5C471B5, 0x66AACC66, 0x48D89048, 0x03050603, + 0xF601F7F6, 0x0E121C0E, 0x61A3C261, 0x355F6A35, 0x57F9AE57, 0xB9D069B9, + 0x86911786, 0xC15899C1, 0x1D273A1D, 0x9EB9279E, 0xE138D9E1, 0xF813EBF8, + 0x98B32B98, 0x11332211, 0x69BBD269, 0xD970A9D9, 0x8E89078E, 0x94A73394, + 0x9BB62D9B, 0x1E223C1E, 0x87921587, 0xE920C9E9, 0xCE4987CE, 0x55FFAA55, + 0x28785028, 0xDF7AA5DF, 0x8C8F038C, 0xA1F859A1, 0x89800989, 0x0D171A0D, + 0xBFDA65BF, 0xE631D7E6, 0x42C68442, 0x68B8D068, 0x41C38241, 0x99B02999, + 0x2D775A2D, 0x0F111E0F, 0xB0CB7BB0, 0x54FCA854, 0xBBD66DBB, 0x163A2C16, + 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, + 0x6F6FB1DE, 0xC5C55491, 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, + 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, 0xCACA458F, 0x82829D1F, + 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, + 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, + 0x727296E4, 0xC0C05B9B, 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, + 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, 0x34345C68, 0xA5A5F451, + 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, + 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, + 0x05050F0A, 0x9A9AB52F, 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, + 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, 0x09091B12, 0x83839E1D, + 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, + 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, + 0x2F2F715E, 0x84849713, 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, + 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, 0x6A6ABED4, 0xCBCB468D, + 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, + 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, + 0x33335566, 0x85859411, 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, + 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, 0x5151F3A2, 0xA3A3FE5D, + 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, + 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, + 0xF3F30EFD, 0xD2D26DBF, 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, + 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, 0xC4C45793, 0xA7A7F255, + 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, + 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, + 0x9090AB3B, 0x8888830B, 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, + 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, 0xE0E03BDB, 0x32325664, + 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, + 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, + 0xE4E437D3, 0x79798BF2, 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, + 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, 0x6C6CB4D8, 0x5656FAAC, + 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, + 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, + 0xB4B4C773, 0xC6C65197, 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, + 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, 0x707090E0, 0x3E3E427C, + 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, + 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, + 0x1D1D273A, 0x9E9EB927, 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, + 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, 0x9B9BB62D, 0x1E1E223C, + 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, + 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, + 0x4242C684, 0x6868B8D0, 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, + 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C }; + +const u32bit AES::TD[1024] = { + 0x51F4A750, 0x7E416553, 0x1A17A4C3, 0x3A275E96, 0x3BAB6BCB, 0x1F9D45F1, + 0xACFA58AB, 0x4BE30393, 0x2030FA55, 0xAD766DF6, 0x88CC7691, 0xF5024C25, + 0x4FE5D7FC, 0xC52ACBD7, 0x26354480, 0xB562A38F, 0xDEB15A49, 0x25BA1B67, + 0x45EA0E98, 0x5DFEC0E1, 0xC32F7502, 0x814CF012, 0x8D4697A3, 0x6BD3F9C6, + 0x038F5FE7, 0x15929C95, 0xBF6D7AEB, 0x955259DA, 0xD4BE832D, 0x587421D3, + 0x49E06929, 0x8EC9C844, 0x75C2896A, 0xF48E7978, 0x99583E6B, 0x27B971DD, + 0xBEE14FB6, 0xF088AD17, 0xC920AC66, 0x7DCE3AB4, 0x63DF4A18, 0xE51A3182, + 0x97513360, 0x62537F45, 0xB16477E0, 0xBB6BAE84, 0xFE81A01C, 0xF9082B94, + 0x70486858, 0x8F45FD19, 0x94DE6C87, 0x527BF8B7, 0xAB73D323, 0x724B02E2, + 0xE31F8F57, 0x6655AB2A, 0xB2EB2807, 0x2FB5C203, 0x86C57B9A, 0xD33708A5, + 0x302887F2, 0x23BFA5B2, 0x02036ABA, 0xED16825C, 0x8ACF1C2B, 0xA779B492, + 0xF307F2F0, 0x4E69E2A1, 0x65DAF4CD, 0x0605BED5, 0xD134621F, 0xC4A6FE8A, + 0x342E539D, 0xA2F355A0, 0x058AE132, 0xA4F6EB75, 0x0B83EC39, 0x4060EFAA, + 0x5E719F06, 0xBD6E1051, 0x3E218AF9, 0x96DD063D, 0xDD3E05AE, 0x4DE6BD46, + 0x91548DB5, 0x71C45D05, 0x0406D46F, 0x605015FF, 0x1998FB24, 0xD6BDE997, + 0x894043CC, 0x67D99E77, 0xB0E842BD, 0x07898B88, 0xE7195B38, 0x79C8EEDB, + 0xA17C0A47, 0x7C420FE9, 0xF8841EC9, 0x00000000, 0x09808683, 0x322BED48, + 0x1E1170AC, 0x6C5A724E, 0xFD0EFFFB, 0x0F853856, 0x3DAED51E, 0x362D3927, + 0x0A0FD964, 0x685CA621, 0x9B5B54D1, 0x24362E3A, 0x0C0A67B1, 0x9357E70F, + 0xB4EE96D2, 0x1B9B919E, 0x80C0C54F, 0x61DC20A2, 0x5A774B69, 0x1C121A16, + 0xE293BA0A, 0xC0A02AE5, 0x3C22E043, 0x121B171D, 0x0E090D0B, 0xF28BC7AD, + 0x2DB6A8B9, 0x141EA9C8, 0x57F11985, 0xAF75074C, 0xEE99DDBB, 0xA37F60FD, + 0xF701269F, 0x5C72F5BC, 0x44663BC5, 0x5BFB7E34, 0x8B432976, 0xCB23C6DC, + 0xB6EDFC68, 0xB8E4F163, 0xD731DCCA, 0x42638510, 0x13972240, 0x84C61120, + 0x854A247D, 0xD2BB3DF8, 0xAEF93211, 0xC729A16D, 0x1D9E2F4B, 0xDCB230F3, + 0x0D8652EC, 0x77C1E3D0, 0x2BB3166C, 0xA970B999, 0x119448FA, 0x47E96422, + 0xA8FC8CC4, 0xA0F03F1A, 0x567D2CD8, 0x223390EF, 0x87494EC7, 0xD938D1C1, + 0x8CCAA2FE, 0x98D40B36, 0xA6F581CF, 0xA57ADE28, 0xDAB78E26, 0x3FADBFA4, + 0x2C3A9DE4, 0x5078920D, 0x6A5FCC9B, 0x547E4662, 0xF68D13C2, 0x90D8B8E8, + 0x2E39F75E, 0x82C3AFF5, 0x9F5D80BE, 0x69D0937C, 0x6FD52DA9, 0xCF2512B3, + 0xC8AC993B, 0x10187DA7, 0xE89C636E, 0xDB3BBB7B, 0xCD267809, 0x6E5918F4, + 0xEC9AB701, 0x834F9AA8, 0xE6956E65, 0xAAFFE67E, 0x21BCCF08, 0xEF15E8E6, + 0xBAE79BD9, 0x4A6F36CE, 0xEA9F09D4, 0x29B07CD6, 0x31A4B2AF, 0x2A3F2331, + 0xC6A59430, 0x35A266C0, 0x744EBC37, 0xFC82CAA6, 0xE090D0B0, 0x33A7D815, + 0xF104984A, 0x41ECDAF7, 0x7FCD500E, 0x1791F62F, 0x764DD68D, 0x43EFB04D, + 0xCCAA4D54, 0xE49604DF, 0x9ED1B5E3, 0x4C6A881B, 0xC12C1FB8, 0x4665517F, + 0x9D5EEA04, 0x018C355D, 0xFA877473, 0xFB0B412E, 0xB3671D5A, 0x92DBD252, + 0xE9105633, 0x6DD64713, 0x9AD7618C, 0x37A10C7A, 0x59F8148E, 0xEB133C89, + 0xCEA927EE, 0xB761C935, 0xE11CE5ED, 0x7A47B13C, 0x9CD2DF59, 0x55F2733F, + 0x1814CE79, 0x73C737BF, 0x53F7CDEA, 0x5FFDAA5B, 0xDF3D6F14, 0x7844DB86, + 0xCAAFF381, 0xB968C43E, 0x3824342C, 0xC2A3405F, 0x161DC372, 0xBCE2250C, + 0x283C498B, 0xFF0D9541, 0x39A80171, 0x080CB3DE, 0xD8B4E49C, 0x6456C190, + 0x7BCB8461, 0xD532B670, 0x486C5C74, 0xD0B85742, 0x5051F4A7, 0x537E4165, + 0xC31A17A4, 0x963A275E, 0xCB3BAB6B, 0xF11F9D45, 0xABACFA58, 0x934BE303, + 0x552030FA, 0xF6AD766D, 0x9188CC76, 0x25F5024C, 0xFC4FE5D7, 0xD7C52ACB, + 0x80263544, 0x8FB562A3, 0x49DEB15A, 0x6725BA1B, 0x9845EA0E, 0xE15DFEC0, + 0x02C32F75, 0x12814CF0, 0xA38D4697, 0xC66BD3F9, 0xE7038F5F, 0x9515929C, + 0xEBBF6D7A, 0xDA955259, 0x2DD4BE83, 0xD3587421, 0x2949E069, 0x448EC9C8, + 0x6A75C289, 0x78F48E79, 0x6B99583E, 0xDD27B971, 0xB6BEE14F, 0x17F088AD, + 0x66C920AC, 0xB47DCE3A, 0x1863DF4A, 0x82E51A31, 0x60975133, 0x4562537F, + 0xE0B16477, 0x84BB6BAE, 0x1CFE81A0, 0x94F9082B, 0x58704868, 0x198F45FD, + 0x8794DE6C, 0xB7527BF8, 0x23AB73D3, 0xE2724B02, 0x57E31F8F, 0x2A6655AB, + 0x07B2EB28, 0x032FB5C2, 0x9A86C57B, 0xA5D33708, 0xF2302887, 0xB223BFA5, + 0xBA02036A, 0x5CED1682, 0x2B8ACF1C, 0x92A779B4, 0xF0F307F2, 0xA14E69E2, + 0xCD65DAF4, 0xD50605BE, 0x1FD13462, 0x8AC4A6FE, 0x9D342E53, 0xA0A2F355, + 0x32058AE1, 0x75A4F6EB, 0x390B83EC, 0xAA4060EF, 0x065E719F, 0x51BD6E10, + 0xF93E218A, 0x3D96DD06, 0xAEDD3E05, 0x464DE6BD, 0xB591548D, 0x0571C45D, + 0x6F0406D4, 0xFF605015, 0x241998FB, 0x97D6BDE9, 0xCC894043, 0x7767D99E, + 0xBDB0E842, 0x8807898B, 0x38E7195B, 0xDB79C8EE, 0x47A17C0A, 0xE97C420F, + 0xC9F8841E, 0x00000000, 0x83098086, 0x48322BED, 0xAC1E1170, 0x4E6C5A72, + 0xFBFD0EFF, 0x560F8538, 0x1E3DAED5, 0x27362D39, 0x640A0FD9, 0x21685CA6, + 0xD19B5B54, 0x3A24362E, 0xB10C0A67, 0x0F9357E7, 0xD2B4EE96, 0x9E1B9B91, + 0x4F80C0C5, 0xA261DC20, 0x695A774B, 0x161C121A, 0x0AE293BA, 0xE5C0A02A, + 0x433C22E0, 0x1D121B17, 0x0B0E090D, 0xADF28BC7, 0xB92DB6A8, 0xC8141EA9, + 0x8557F119, 0x4CAF7507, 0xBBEE99DD, 0xFDA37F60, 0x9FF70126, 0xBC5C72F5, + 0xC544663B, 0x345BFB7E, 0x768B4329, 0xDCCB23C6, 0x68B6EDFC, 0x63B8E4F1, + 0xCAD731DC, 0x10426385, 0x40139722, 0x2084C611, 0x7D854A24, 0xF8D2BB3D, + 0x11AEF932, 0x6DC729A1, 0x4B1D9E2F, 0xF3DCB230, 0xEC0D8652, 0xD077C1E3, + 0x6C2BB316, 0x99A970B9, 0xFA119448, 0x2247E964, 0xC4A8FC8C, 0x1AA0F03F, + 0xD8567D2C, 0xEF223390, 0xC787494E, 0xC1D938D1, 0xFE8CCAA2, 0x3698D40B, + 0xCFA6F581, 0x28A57ADE, 0x26DAB78E, 0xA43FADBF, 0xE42C3A9D, 0x0D507892, + 0x9B6A5FCC, 0x62547E46, 0xC2F68D13, 0xE890D8B8, 0x5E2E39F7, 0xF582C3AF, + 0xBE9F5D80, 0x7C69D093, 0xA96FD52D, 0xB3CF2512, 0x3BC8AC99, 0xA710187D, + 0x6EE89C63, 0x7BDB3BBB, 0x09CD2678, 0xF46E5918, 0x01EC9AB7, 0xA8834F9A, + 0x65E6956E, 0x7EAAFFE6, 0x0821BCCF, 0xE6EF15E8, 0xD9BAE79B, 0xCE4A6F36, + 0xD4EA9F09, 0xD629B07C, 0xAF31A4B2, 0x312A3F23, 0x30C6A594, 0xC035A266, + 0x37744EBC, 0xA6FC82CA, 0xB0E090D0, 0x1533A7D8, 0x4AF10498, 0xF741ECDA, + 0x0E7FCD50, 0x2F1791F6, 0x8D764DD6, 0x4D43EFB0, 0x54CCAA4D, 0xDFE49604, + 0xE39ED1B5, 0x1B4C6A88, 0xB8C12C1F, 0x7F466551, 0x049D5EEA, 0x5D018C35, + 0x73FA8774, 0x2EFB0B41, 0x5AB3671D, 0x5292DBD2, 0x33E91056, 0x136DD647, + 0x8C9AD761, 0x7A37A10C, 0x8E59F814, 0x89EB133C, 0xEECEA927, 0x35B761C9, + 0xEDE11CE5, 0x3C7A47B1, 0x599CD2DF, 0x3F55F273, 0x791814CE, 0xBF73C737, + 0xEA53F7CD, 0x5B5FFDAA, 0x14DF3D6F, 0x867844DB, 0x81CAAFF3, 0x3EB968C4, + 0x2C382434, 0x5FC2A340, 0x72161DC3, 0x0CBCE225, 0x8B283C49, 0x41FF0D95, + 0x7139A801, 0xDE080CB3, 0x9CD8B4E4, 0x906456C1, 0x617BCB84, 0x70D532B6, + 0x74486C5C, 0x42D0B857, 0xA75051F4, 0x65537E41, 0xA4C31A17, 0x5E963A27, + 0x6BCB3BAB, 0x45F11F9D, 0x58ABACFA, 0x03934BE3, 0xFA552030, 0x6DF6AD76, + 0x769188CC, 0x4C25F502, 0xD7FC4FE5, 0xCBD7C52A, 0x44802635, 0xA38FB562, + 0x5A49DEB1, 0x1B6725BA, 0x0E9845EA, 0xC0E15DFE, 0x7502C32F, 0xF012814C, + 0x97A38D46, 0xF9C66BD3, 0x5FE7038F, 0x9C951592, 0x7AEBBF6D, 0x59DA9552, + 0x832DD4BE, 0x21D35874, 0x692949E0, 0xC8448EC9, 0x896A75C2, 0x7978F48E, + 0x3E6B9958, 0x71DD27B9, 0x4FB6BEE1, 0xAD17F088, 0xAC66C920, 0x3AB47DCE, + 0x4A1863DF, 0x3182E51A, 0x33609751, 0x7F456253, 0x77E0B164, 0xAE84BB6B, + 0xA01CFE81, 0x2B94F908, 0x68587048, 0xFD198F45, 0x6C8794DE, 0xF8B7527B, + 0xD323AB73, 0x02E2724B, 0x8F57E31F, 0xAB2A6655, 0x2807B2EB, 0xC2032FB5, + 0x7B9A86C5, 0x08A5D337, 0x87F23028, 0xA5B223BF, 0x6ABA0203, 0x825CED16, + 0x1C2B8ACF, 0xB492A779, 0xF2F0F307, 0xE2A14E69, 0xF4CD65DA, 0xBED50605, + 0x621FD134, 0xFE8AC4A6, 0x539D342E, 0x55A0A2F3, 0xE132058A, 0xEB75A4F6, + 0xEC390B83, 0xEFAA4060, 0x9F065E71, 0x1051BD6E, 0x8AF93E21, 0x063D96DD, + 0x05AEDD3E, 0xBD464DE6, 0x8DB59154, 0x5D0571C4, 0xD46F0406, 0x15FF6050, + 0xFB241998, 0xE997D6BD, 0x43CC8940, 0x9E7767D9, 0x42BDB0E8, 0x8B880789, + 0x5B38E719, 0xEEDB79C8, 0x0A47A17C, 0x0FE97C42, 0x1EC9F884, 0x00000000, + 0x86830980, 0xED48322B, 0x70AC1E11, 0x724E6C5A, 0xFFFBFD0E, 0x38560F85, + 0xD51E3DAE, 0x3927362D, 0xD9640A0F, 0xA621685C, 0x54D19B5B, 0x2E3A2436, + 0x67B10C0A, 0xE70F9357, 0x96D2B4EE, 0x919E1B9B, 0xC54F80C0, 0x20A261DC, + 0x4B695A77, 0x1A161C12, 0xBA0AE293, 0x2AE5C0A0, 0xE0433C22, 0x171D121B, + 0x0D0B0E09, 0xC7ADF28B, 0xA8B92DB6, 0xA9C8141E, 0x198557F1, 0x074CAF75, + 0xDDBBEE99, 0x60FDA37F, 0x269FF701, 0xF5BC5C72, 0x3BC54466, 0x7E345BFB, + 0x29768B43, 0xC6DCCB23, 0xFC68B6ED, 0xF163B8E4, 0xDCCAD731, 0x85104263, + 0x22401397, 0x112084C6, 0x247D854A, 0x3DF8D2BB, 0x3211AEF9, 0xA16DC729, + 0x2F4B1D9E, 0x30F3DCB2, 0x52EC0D86, 0xE3D077C1, 0x166C2BB3, 0xB999A970, + 0x48FA1194, 0x642247E9, 0x8CC4A8FC, 0x3F1AA0F0, 0x2CD8567D, 0x90EF2233, + 0x4EC78749, 0xD1C1D938, 0xA2FE8CCA, 0x0B3698D4, 0x81CFA6F5, 0xDE28A57A, + 0x8E26DAB7, 0xBFA43FAD, 0x9DE42C3A, 0x920D5078, 0xCC9B6A5F, 0x4662547E, + 0x13C2F68D, 0xB8E890D8, 0xF75E2E39, 0xAFF582C3, 0x80BE9F5D, 0x937C69D0, + 0x2DA96FD5, 0x12B3CF25, 0x993BC8AC, 0x7DA71018, 0x636EE89C, 0xBB7BDB3B, + 0x7809CD26, 0x18F46E59, 0xB701EC9A, 0x9AA8834F, 0x6E65E695, 0xE67EAAFF, + 0xCF0821BC, 0xE8E6EF15, 0x9BD9BAE7, 0x36CE4A6F, 0x09D4EA9F, 0x7CD629B0, + 0xB2AF31A4, 0x23312A3F, 0x9430C6A5, 0x66C035A2, 0xBC37744E, 0xCAA6FC82, + 0xD0B0E090, 0xD81533A7, 0x984AF104, 0xDAF741EC, 0x500E7FCD, 0xF62F1791, + 0xD68D764D, 0xB04D43EF, 0x4D54CCAA, 0x04DFE496, 0xB5E39ED1, 0x881B4C6A, + 0x1FB8C12C, 0x517F4665, 0xEA049D5E, 0x355D018C, 0x7473FA87, 0x412EFB0B, + 0x1D5AB367, 0xD25292DB, 0x5633E910, 0x47136DD6, 0x618C9AD7, 0x0C7A37A1, + 0x148E59F8, 0x3C89EB13, 0x27EECEA9, 0xC935B761, 0xE5EDE11C, 0xB13C7A47, + 0xDF599CD2, 0x733F55F2, 0xCE791814, 0x37BF73C7, 0xCDEA53F7, 0xAA5B5FFD, + 0x6F14DF3D, 0xDB867844, 0xF381CAAF, 0xC43EB968, 0x342C3824, 0x405FC2A3, + 0xC372161D, 0x250CBCE2, 0x498B283C, 0x9541FF0D, 0x017139A8, 0xB3DE080C, + 0xE49CD8B4, 0xC1906456, 0x84617BCB, 0xB670D532, 0x5C74486C, 0x5742D0B8, + 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, + 0xFA58ABAC, 0xE303934B, 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, + 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, 0xB15A49DE, 0xBA1B6725, + 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, + 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, + 0xE0692949, 0xC9C8448E, 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, + 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, 0xDF4A1863, 0x1A3182E5, + 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, + 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, + 0x1F8F57E3, 0x55AB2A66, 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, + 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, 0xCF1C2B8A, 0x79B492A7, + 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, + 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, + 0x719F065E, 0x6E1051BD, 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, + 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, 0x98FB2419, 0xBDE997D6, + 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, + 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, + 0x1170AC1E, 0x5A724E6C, 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, + 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, 0x0A67B10C, 0x57E70F93, + 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, + 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, + 0xB6A8B92D, 0x1EA9C814, 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, + 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, 0x4329768B, 0x23C6DCCB, + 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, + 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, + 0x8652EC0D, 0xC1E3D077, 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, + 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, 0x494EC787, 0x38D1C1D9, + 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, + 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, + 0x39F75E2E, 0xC3AFF582, 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, + 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, 0x267809CD, 0x5918F46E, + 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, + 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, + 0xA59430C6, 0xA266C035, 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, + 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, 0x4DD68D76, 0xEFB04D43, + 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, + 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, + 0x105633E9, 0xD647136D, 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, + 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, 0xD2DF599C, 0xF2733F55, + 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, + 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, + 0x3C498B28, 0x0D9541FF, 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, + 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0 }; + +} diff --git a/src/libs/3rdparty/botan/src/block/aes/info.txt b/src/libs/3rdparty/botan/src/block/aes/info.txt new file mode 100644 index 00000000000..2803ccc4e73 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/aes/info.txt @@ -0,0 +1,11 @@ +realname "AES" + +define AES + +load_on auto + + +aes.cpp +aes.h +aes_tab.cpp + diff --git a/src/libs/3rdparty/botan/src/block/block_cipher.h b/src/libs/3rdparty/botan/src/block/block_cipher.h new file mode 100644 index 00000000000..01c45af0421 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/block_cipher.h @@ -0,0 +1,100 @@ +/** +* Block Cipher Base Class +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BLOCK_CIPHER_H__ +#define BOTAN_BLOCK_CIPHER_H__ + +#include + +namespace Botan { + +/** +* This class represents a block cipher object. +* +* It would be very useful to extend this interface to support the +* encryption of multiple blocks at a time. This could help +* performance, wrt cache effects in the software implementations, and +* could be a big deal when supporting block ciphers implemented as +* hardware devices. It could be used by implementations of ECB, and +* more importantly counter mode (which most designs are moving to, due +* to the parallelism possible in counter mode which is not the case +* with feedback-based modes like CBC). +* +* Probable future API here: +* virtual void encrypt_n(const byte in[], byte out[], +* u32bit blocks) const = 0; +* virtual void decrypt_n(const byte in[], byte out[], +* u32bit blocks) const = 0; +*/ +class BOTAN_DLL BlockCipher : public SymmetricAlgorithm + { + public: + /** + * The block size of this algorithm. + */ + const u32bit BLOCK_SIZE; + + /** + * Encrypt a block. + * @param in The plaintext block to be encrypted as a byte array. + * Must be of length BLOCK_SIZE. + * @param out The byte array designated to hold the encrypted block. + * Must be of length BLOCK_SIZE. + */ + void encrypt(const byte in[], byte out[]) const { enc(in, out); } + + /** + * Decrypt a block. + * @param in The ciphertext block to be decypted as a byte array. + * Must be of length BLOCK_SIZE. + * @param out The byte array designated to hold the decrypted block. + * Must be of length BLOCK_SIZE. + */ + void decrypt(const byte in[], byte out[]) const { dec(in, out); } + + /** + * Encrypt a block. + * @param in The plaintext block to be encrypted as a byte array. + * Must be of length BLOCK_SIZE. Will hold the result when the function + * has finished. + */ + void encrypt(byte block[]) const { enc(block, block); } + + /** + * Decrypt a block. + * @param in The ciphertext block to be decrypted as a byte array. + * Must be of length BLOCK_SIZE. Will hold the result when the function + * has finished. + */ + void decrypt(byte block[]) const { dec(block, block); } + + /** + * Get a new object representing the same algorithm as *this + */ + virtual BlockCipher* clone() const = 0; + + /** + * Zeroize internal state + */ + virtual void clear() throw() = 0; + + BlockCipher(u32bit block_size, + u32bit key_min, + u32bit key_max = 0, + u32bit key_mod = 1) : + SymmetricAlgorithm(key_min, key_max, key_mod), + BLOCK_SIZE(block_size) {} + + virtual ~BlockCipher() {} + private: + virtual void enc(const byte[], byte[]) const = 0; + virtual void dec(const byte[], byte[]) const = 0; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/blowfish/blfs_tab.cpp b/src/libs/3rdparty/botan/src/block/blowfish/blfs_tab.cpp new file mode 100644 index 00000000000..070fa6c69e1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/blowfish/blfs_tab.cpp @@ -0,0 +1,190 @@ +/* +* S-Box and P-Box Tables for Blowfish +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +const u32bit Blowfish::P_INIT[18] = { + 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0, + 0x082EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, + 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, 0x9216D5D9, 0x8979FB1B }; + +const u32bit Blowfish::S_INIT[1024] = { + 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96, + 0xBA7C9045, 0xF12C7F99, 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, + 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, 0x0D95748F, 0x728EB658, + 0x718BCD58, 0x82154AEE, 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, + 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, 0x8E79DCB0, 0x603A180E, + 0x6C9E0E8B, 0xB01E8A3E, 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, + 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, 0x55CA396A, 0x2AAB10B6, + 0xB4CC5C34, 0x1141E8CE, 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, + 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, 0xAFD6BA33, 0x6C24CF5C, + 0x7A325381, 0x28958677, 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, + 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, 0xEF845D5D, 0xE98575B1, + 0xDC262302, 0xEB651B88, 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, + 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, 0x21C66842, 0xF6E96C9A, + 0x670C9C61, 0xABD388F0, 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, + 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, 0xA1F1651D, 0x39AF0176, + 0x66CA593E, 0x82430E88, 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, + 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, 0x4ED3AA62, 0x363F7706, + 0x1BFEDF72, 0x429B023D, 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, + 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, 0xE3FE501A, 0xB6794C3B, + 0x976CE0BD, 0x04C006BA, 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, + 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, 0x6DFC511F, 0x9B30952C, + 0xCC814544, 0xAF5EBD09, 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, + 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, 0x5579C0BD, 0x1A60320A, + 0xD6A100C6, 0x402C7279, 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, + 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, 0x323DB5FA, 0xFD238760, + 0x53317B48, 0x3E00DF82, 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, + 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, 0x695B27B0, 0xBBCA58C8, + 0xE1FFA35D, 0xB8F011A0, 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, + 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, 0xE1DDF2DA, 0xA4CB7E33, + 0x62FB1341, 0xCEE4C6E8, 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, + 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, 0xD08ED1D0, 0xAFC725E0, + 0x8E3C5B2F, 0x8E7594B7, 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, + 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, 0x2F2F2218, 0xBE0E1777, + 0xEA752DFE, 0x8B021FA1, 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, + 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, 0x165FA266, 0x80957705, + 0x93CC7314, 0x211A1477, 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, + 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, 0x00250E2D, 0x2071B35E, + 0x226800BB, 0x57B8E0AF, 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, + 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, 0x83260376, 0x6295CFA9, + 0x11C81968, 0x4E734A41, 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, + 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, 0x08BA6FB5, 0x571BE91F, + 0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, + 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A, 0x4B7A70E9, 0xB5B32944, + 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, + 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, 0x193602A5, 0x75094C29, + 0xA0591340, 0xE4183A3E, 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, + 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, 0x4CDD2086, 0x8470EB26, + 0x6382E9C6, 0x021ECC5E, 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, + 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, 0x3E07841C, 0x7FDEAE5C, + 0x8E7D44EC, 0x5716F2B8, 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, + 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, 0xD19113F9, 0x7CA92FF6, + 0x94324773, 0x22F54701, 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, + 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, 0xE238CD99, 0x3BEA0E2F, + 0x3280BBA1, 0x183EB331, 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, + 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, 0xDE9A771F, 0xD9930810, + 0xB38BAE12, 0xDCCF3F2E, 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, + 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, 0xEC7AEC3A, 0xDB851DFA, + 0x63094366, 0xC464C3D2, 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, + 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, 0x71DFF89E, 0x10314E55, + 0x81AC77D6, 0x5F11199B, 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, + 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, 0x86E34570, 0xEAE96FB1, + 0x860E5E0A, 0x5A3E2AB3, 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, + 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, 0xC6150EBA, 0x94E2EA78, + 0xA5FC3C53, 0x1E0A2DF4, 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, + 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, 0xE3BC4595, 0xA67BC883, + 0xB17F37D1, 0x018CFF28, 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, + 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, 0x1521B628, 0x29076170, + 0xECDD4775, 0x619F1510, 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, + 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, 0xEECC86BC, 0x60622CA7, + 0x9CAB5CAB, 0xB2F3846E, 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, + 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, 0x9B540B19, 0x875FA099, + 0x95F7997E, 0x623D7DA8, 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, + 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, 0x57F584A5, 0x1B227263, + 0x9B83C3FF, 0x1AC24696, 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, + 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, 0x5D4A14D9, 0xE864B7E3, + 0x42105D14, 0x203E13E0, 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, + 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, 0xD81E799E, 0x86854DC7, + 0xE44B476A, 0x3D816250, 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, + 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, 0x095BBF00, 0xAD19489D, + 0x1462B174, 0x23820E00, 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, + 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, 0x7CDE3759, 0xCBEE7460, + 0x4085F2A7, 0xCE77326E, 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, + 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, 0x9E447A2E, 0xC3453484, + 0xFDD56705, 0x0E1E9EC9, 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, + 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, 0x153E21E7, 0x8FB03D4A, + 0xE6E39F2B, 0xDB83ADF7, 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, + 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, 0xD4082471, 0x3320F46A, + 0x43B7D4B7, 0x500061AF, 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, + 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, 0xBFBC09EC, 0x03BD9785, + 0x7FAC6DD0, 0x31CB8504, 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, + 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, 0x68DC1462, 0xD7486900, + 0x680EC0A4, 0x27A18DEE, 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, + 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, 0x20FE9E35, 0xD9F385B9, + 0xEE39D7AB, 0x3B124E8B, 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, + 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, 0xFB0AF54E, 0xD8FEB397, + 0x454056AC, 0xBA489527, 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, + 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, 0xA62A4A56, 0x3F3125F9, + 0x5EF47E1C, 0x9029317C, 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, + 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, 0x07F9C9EE, 0x41041F0F, + 0x404779A4, 0x5D886E17, 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, + 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, 0x0E12B4C2, 0x02E1329E, + 0xAF664FD1, 0xCAD18115, 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, + 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, 0xD0127845, 0x95B794FD, + 0x647D0862, 0xE7CCF5F0, 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, + 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, 0xA812DC60, 0xA1EBDDF8, + 0x991BE14C, 0xDB6E6B0D, 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, + 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, 0x667B9FFB, 0xCEDB7D9C, + 0xA091CF0B, 0xD9155EA3, 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, + 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, 0x6842ADA7, 0xC66A2B3B, + 0x12754CCC, 0x782EF11C, 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, + 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, 0x44421659, 0x0A121386, + 0xD90CEC6E, 0xD5ABEA2A, 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, + 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, 0xD1FD8346, 0xF6381FB0, + 0x7745AE04, 0xD736FCCC, 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, + 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, 0x4E58F48F, 0xF2DDFDA2, + 0xF474EF38, 0x8789BDC2, 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, + 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, 0x466E598E, 0x20B45770, + 0x8CD55591, 0xC902DE4C, 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, + 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, 0xE85A1F02, 0x09F0BE8C, + 0x4A99A025, 0x1D6EFE10, 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, + 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, 0x50115E01, 0xA70683FA, + 0xA002B5C4, 0x0DE6D027, 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, + 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, 0x11E69ED7, 0x2338EA63, + 0x53C2DD94, 0xC2C21634, 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, + 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, 0x86E3725F, 0x724D9DB9, + 0x1AC15BB4, 0xD39EB8FC, 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, + 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, 0x6FD5C7E7, 0x56E14EC4, + 0x362ABFCE, 0xDDC6C837, 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0, + 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, 0x5CB0679E, 0x4FA33742, + 0xD3822740, 0x99BC9BBE, 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, + 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, 0x5748AB2F, 0xBC946E79, + 0xC6A376D2, 0x6549C2C8, 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, + 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, 0xA1FAD5F0, 0x6A2D519A, + 0x63EF8CE2, 0x9A86EE22, 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, + 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, 0x2826A2F9, 0xA73A3AE1, + 0x4BA99586, 0xEF5562E9, 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, + 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, 0xE990FD5A, 0x9E34D797, + 0x2CF0B7D9, 0x022B8B51, 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, + 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, 0xE029AC71, 0xE019A5E6, + 0x47B0ACFD, 0xED93FA9B, 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, + 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, 0x15056DD4, 0x88F46DBA, + 0x03A16125, 0x0564F0BD, 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, + 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, 0x7533D928, 0xB155FDF5, + 0x03563482, 0x8ABA3CBB, 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, + 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, 0xEA7A90C2, 0xFB3E7BCE, + 0x5121CE64, 0x774FBE32, 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, + 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, 0xB39A460A, 0x6445C0DD, + 0x586CDECF, 0x1C20C8AE, 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, + 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, 0x72EACEA8, 0xFA6484BB, + 0x8D6612AE, 0xBF3C6F47, 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, + 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, 0x4040CB08, 0x4EB4E2CC, + 0x34D2466A, 0x0115AF84, 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, + 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, 0x611560B1, 0xE7933FDC, + 0xBB3A792B, 0x344525BD, 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, + 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, 0x1A908749, 0xD44FBD9A, + 0xD0DADECB, 0xD50ADA38, 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, + 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, 0xBF97222C, 0x15E6FC2A, + 0x0F91FC71, 0x9B941525, 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, + 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, 0xE0EC6E0E, 0x1698DB3B, + 0x4C98A0BE, 0x3278E964, 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, + 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, 0xDF359F8D, 0x9B992F2E, + 0xE60B6F47, 0x0FE3F11D, 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, + 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, 0xF523F357, 0xA6327623, + 0x93A83531, 0x56CCCD02, 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, + 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, 0xE6C6C7BD, 0x327A140A, + 0x45E1D006, 0xC3F27B9A, 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, + 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, 0x53113EC0, 0x1640E3D3, + 0x38ABBD60, 0x2547ADF0, 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, + 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, 0x1948C25C, 0x02FB8A8C, + 0x01C36AE4, 0xD6EBE1F9, 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, + 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 }; + +} diff --git a/src/libs/3rdparty/botan/src/block/blowfish/blowfish.cpp b/src/libs/3rdparty/botan/src/block/blowfish/blowfish.cpp new file mode 100644 index 00000000000..b0599d6c53a --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/blowfish/blowfish.cpp @@ -0,0 +1,125 @@ +/* +* Blowfish +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Blowfish Encryption +*/ +void Blowfish::enc(const byte in[], byte out[]) const + { + const u32bit* S1 = S + 0; + const u32bit* S2 = S + 256; + const u32bit* S3 = S + 512; + const u32bit* S4 = S + 768; + + u32bit L = load_be(in, 0); + u32bit R = load_be(in, 1); + + for(u32bit j = 0; j != 16; j += 2) + { + L ^= P[j]; + R ^= ((S1[get_byte(0, L)] + S2[get_byte(1, L)]) ^ + S3[get_byte(2, L)]) + S4[get_byte(3, L)]; + + R ^= P[j+1]; + L ^= ((S1[get_byte(0, R)] + S2[get_byte(1, R)]) ^ + S3[get_byte(2, R)]) + S4[get_byte(3, R)]; + } + + L ^= P[16]; R ^= P[17]; + + store_be(out, R, L); + } + +/* +* Blowfish Decryption +*/ +void Blowfish::dec(const byte in[], byte out[]) const + { + const u32bit* S1 = S + 0; + const u32bit* S2 = S + 256; + const u32bit* S3 = S + 512; + const u32bit* S4 = S + 768; + + u32bit L = load_be(in, 0); + u32bit R = load_be(in, 1); + + for(u32bit j = 17; j != 1; j -= 2) + { + L ^= P[j]; + R ^= ((S1[get_byte(0, L)] + S2[get_byte(1, L)]) ^ + S3[get_byte(2, L)]) + S4[get_byte(3, L)]; + + R ^= P[j-1]; + L ^= ((S1[get_byte(0, R)] + S2[get_byte(1, R)]) ^ + S3[get_byte(2, R)]) + S4[get_byte(3, R)]; + } + + L ^= P[1]; R ^= P[0]; + + store_be(out, R, L); + } + +/* +* Blowfish Key Schedule +*/ +void Blowfish::key_schedule(const byte key[], u32bit length) + { + clear(); + + for(u32bit j = 0, k = 0; j != 18; ++j, k += 4) + P[j] ^= make_u32bit(key[(k ) % length], key[(k+1) % length], + key[(k+2) % length], key[(k+3) % length]); + + u32bit L = 0, R = 0; + generate_sbox(P, 18, L, R); + generate_sbox(S, 1024, L, R); + } + +/* +* Generate one of the Sboxes +*/ +void Blowfish::generate_sbox(u32bit Box[], u32bit size, + u32bit& L, u32bit& R) const + { + const u32bit* S1 = S + 0; + const u32bit* S2 = S + 256; + const u32bit* S3 = S + 512; + const u32bit* S4 = S + 768; + + for(u32bit j = 0; j != size; j += 2) + { + for(u32bit k = 0; k != 16; k += 2) + { + L ^= P[k]; + R ^= ((S1[get_byte(0, L)] + S2[get_byte(1, L)]) ^ + S3[get_byte(2, L)]) + S4[get_byte(3, L)]; + + R ^= P[k+1]; + L ^= ((S1[get_byte(0, R)] + S2[get_byte(1, R)]) ^ + S3[get_byte(2, R)]) + S4[get_byte(3, R)]; + } + + u32bit T = R; R = L ^ P[16]; L = T ^ P[17]; + Box[j] = L; Box[j+1] = R; + } + } + +/* +* Clear memory of sensitive data +*/ +void Blowfish::clear() throw() + { + P.copy(P_INIT, 18); + S.copy(S_INIT, 1024); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/blowfish/blowfish.h b/src/libs/3rdparty/botan/src/block/blowfish/blowfish.h new file mode 100644 index 00000000000..f0f26418d2f --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/blowfish/blowfish.h @@ -0,0 +1,40 @@ +/* +* Blowfish +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BLOWFISH_H__ +#define BOTAN_BLOWFISH_H__ + +#include + +namespace Botan { + +/* +* Blowfish +*/ +class BOTAN_DLL Blowfish : public BlockCipher + { + public: + void clear() throw(); + std::string name() const { return "Blowfish"; } + BlockCipher* clone() const { return new Blowfish; } + Blowfish() : BlockCipher(8, 1, 56) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + void generate_sbox(u32bit[], u32bit, u32bit&, u32bit&) const; + + static const u32bit P_INIT[18]; + static const u32bit S_INIT[1024]; + + SecureBuffer S; + SecureBuffer P; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/blowfish/info.txt b/src/libs/3rdparty/botan/src/block/blowfish/info.txt new file mode 100644 index 00000000000..0a9d2adc29f --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/blowfish/info.txt @@ -0,0 +1,11 @@ +realname "Blowfish" + +define BLOWFISH + +load_on auto + + +blfs_tab.cpp +blowfish.cpp +blowfish.h + diff --git a/src/libs/3rdparty/botan/src/block/cast/cast128.cpp b/src/libs/3rdparty/botan/src/block/cast/cast128.cpp new file mode 100644 index 00000000000..046638ab9b8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/cast/cast128.cpp @@ -0,0 +1,172 @@ +/* +* CAST-128 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* CAST-128 Round Type 1 +*/ +inline void R1(u32bit& L, u32bit R, u32bit MK, u32bit RK) + { + u32bit T = rotate_left(MK + R, RK); + L ^= (CAST_SBOX1[get_byte(0, T)] ^ CAST_SBOX2[get_byte(1, T)]) - + CAST_SBOX3[get_byte(2, T)] + CAST_SBOX4[get_byte(3, T)]; + } + +/* +* CAST-128 Round Type 2 +*/ +inline void R2(u32bit& L, u32bit R, u32bit MK, u32bit RK) + { + u32bit T = rotate_left(MK ^ R, RK); + L ^= (CAST_SBOX1[get_byte(0, T)] - CAST_SBOX2[get_byte(1, T)] + + CAST_SBOX3[get_byte(2, T)]) ^ CAST_SBOX4[get_byte(3, T)]; + } + +/* +* CAST-128 Round Type 3 +*/ +inline void R3(u32bit& L, u32bit R, u32bit MK, u32bit RK) + { + u32bit T = rotate_left(MK - R, RK); + L ^= ((CAST_SBOX1[get_byte(0, T)] + CAST_SBOX2[get_byte(1, T)]) ^ + CAST_SBOX3[get_byte(2, T)]) - CAST_SBOX4[get_byte(3, T)]; + } + +} + +/* +* CAST-128 Encryption +*/ +void CAST_128::enc(const byte in[], byte out[]) const + { + u32bit L = load_be(in, 0); + u32bit R = load_be(in, 1); + + R1(L, R, MK[ 0], RK[ 0]); + R2(R, L, MK[ 1], RK[ 1]); + R3(L, R, MK[ 2], RK[ 2]); + R1(R, L, MK[ 3], RK[ 3]); + R2(L, R, MK[ 4], RK[ 4]); + R3(R, L, MK[ 5], RK[ 5]); + R1(L, R, MK[ 6], RK[ 6]); + R2(R, L, MK[ 7], RK[ 7]); + R3(L, R, MK[ 8], RK[ 8]); + R1(R, L, MK[ 9], RK[ 9]); + R2(L, R, MK[10], RK[10]); + R3(R, L, MK[11], RK[11]); + R1(L, R, MK[12], RK[12]); + R2(R, L, MK[13], RK[13]); + R3(L, R, MK[14], RK[14]); + R1(R, L, MK[15], RK[15]); + + store_be(out, R, L); + } + +/* +* CAST-128 Decryption +*/ +void CAST_128::dec(const byte in[], byte out[]) const + { + u32bit L = load_be(in, 0); + u32bit R = load_be(in, 1); + + R1(L, R, MK[15], RK[15]); + R3(R, L, MK[14], RK[14]); + R2(L, R, MK[13], RK[13]); + R1(R, L, MK[12], RK[12]); + R3(L, R, MK[11], RK[11]); + R2(R, L, MK[10], RK[10]); + R1(L, R, MK[ 9], RK[ 9]); + R3(R, L, MK[ 8], RK[ 8]); + R2(L, R, MK[ 7], RK[ 7]); + R1(R, L, MK[ 6], RK[ 6]); + R3(L, R, MK[ 5], RK[ 5]); + R2(R, L, MK[ 4], RK[ 4]); + R1(L, R, MK[ 3], RK[ 3]); + R3(R, L, MK[ 2], RK[ 2]); + R2(L, R, MK[ 1], RK[ 1]); + R1(R, L, MK[ 0], RK[ 0]); + + store_be(out, R, L); + } + +/* +* CAST-128 Key Schedule +*/ +void CAST_128::key_schedule(const byte key[], u32bit length) + { + clear(); + SecureBuffer X; + for(u32bit j = 0; j != length; ++j) + X[j/4] = (X[j/4] << 8) + key[j]; + + key_schedule(MK, X); + key_schedule(RK, X); + + for(u32bit j = 0; j != 16; ++j) + RK[j] %= 32; + } + +/* +* S-Box Based Key Expansion +*/ +void CAST_128::key_schedule(u32bit K[16], u32bit X[4]) + { + class ByteReader + { + public: + byte operator()(u32bit i) { return (X[i/4] >> (8*(3 - (i%4)))); } + ByteReader(const u32bit* x) : X(x) {} + private: + const u32bit* X; + }; + + SecureBuffer Z; + ByteReader x(X), z(Z); + + Z[0] = X[0] ^ S5[x(13)] ^ S6[x(15)] ^ S7[x(12)] ^ S8[x(14)] ^ S7[x( 8)]; + Z[1] = X[2] ^ S5[z( 0)] ^ S6[z( 2)] ^ S7[z( 1)] ^ S8[z( 3)] ^ S8[x(10)]; + Z[2] = X[3] ^ S5[z( 7)] ^ S6[z( 6)] ^ S7[z( 5)] ^ S8[z( 4)] ^ S5[x( 9)]; + Z[3] = X[1] ^ S5[z(10)] ^ S6[z( 9)] ^ S7[z(11)] ^ S8[z( 8)] ^ S6[x(11)]; + K[ 0] = S5[z( 8)] ^ S6[z( 9)] ^ S7[z( 7)] ^ S8[z( 6)] ^ S5[z( 2)]; + K[ 1] = S5[z(10)] ^ S6[z(11)] ^ S7[z( 5)] ^ S8[z( 4)] ^ S6[z( 6)]; + K[ 2] = S5[z(12)] ^ S6[z(13)] ^ S7[z( 3)] ^ S8[z( 2)] ^ S7[z( 9)]; + K[ 3] = S5[z(14)] ^ S6[z(15)] ^ S7[z( 1)] ^ S8[z( 0)] ^ S8[z(12)]; + X[0] = Z[2] ^ S5[z( 5)] ^ S6[z( 7)] ^ S7[z( 4)] ^ S8[z( 6)] ^ S7[z( 0)]; + X[1] = Z[0] ^ S5[x( 0)] ^ S6[x( 2)] ^ S7[x( 1)] ^ S8[x( 3)] ^ S8[z( 2)]; + X[2] = Z[1] ^ S5[x( 7)] ^ S6[x( 6)] ^ S7[x( 5)] ^ S8[x( 4)] ^ S5[z( 1)]; + X[3] = Z[3] ^ S5[x(10)] ^ S6[x( 9)] ^ S7[x(11)] ^ S8[x( 8)] ^ S6[z( 3)]; + K[ 4] = S5[x( 3)] ^ S6[x( 2)] ^ S7[x(12)] ^ S8[x(13)] ^ S5[x( 8)]; + K[ 5] = S5[x( 1)] ^ S6[x( 0)] ^ S7[x(14)] ^ S8[x(15)] ^ S6[x(13)]; + K[ 6] = S5[x( 7)] ^ S6[x( 6)] ^ S7[x( 8)] ^ S8[x( 9)] ^ S7[x( 3)]; + K[ 7] = S5[x( 5)] ^ S6[x( 4)] ^ S7[x(10)] ^ S8[x(11)] ^ S8[x( 7)]; + Z[0] = X[0] ^ S5[x(13)] ^ S6[x(15)] ^ S7[x(12)] ^ S8[x(14)] ^ S7[x( 8)]; + Z[1] = X[2] ^ S5[z( 0)] ^ S6[z( 2)] ^ S7[z( 1)] ^ S8[z( 3)] ^ S8[x(10)]; + Z[2] = X[3] ^ S5[z( 7)] ^ S6[z( 6)] ^ S7[z( 5)] ^ S8[z( 4)] ^ S5[x( 9)]; + Z[3] = X[1] ^ S5[z(10)] ^ S6[z( 9)] ^ S7[z(11)] ^ S8[z( 8)] ^ S6[x(11)]; + K[ 8] = S5[z( 3)] ^ S6[z( 2)] ^ S7[z(12)] ^ S8[z(13)] ^ S5[z( 9)]; + K[ 9] = S5[z( 1)] ^ S6[z( 0)] ^ S7[z(14)] ^ S8[z(15)] ^ S6[z(12)]; + K[10] = S5[z( 7)] ^ S6[z( 6)] ^ S7[z( 8)] ^ S8[z( 9)] ^ S7[z( 2)]; + K[11] = S5[z( 5)] ^ S6[z( 4)] ^ S7[z(10)] ^ S8[z(11)] ^ S8[z( 6)]; + X[0] = Z[2] ^ S5[z( 5)] ^ S6[z( 7)] ^ S7[z( 4)] ^ S8[z( 6)] ^ S7[z( 0)]; + X[1] = Z[0] ^ S5[x( 0)] ^ S6[x( 2)] ^ S7[x( 1)] ^ S8[x( 3)] ^ S8[z( 2)]; + X[2] = Z[1] ^ S5[x( 7)] ^ S6[x( 6)] ^ S7[x( 5)] ^ S8[x( 4)] ^ S5[z( 1)]; + X[3] = Z[3] ^ S5[x(10)] ^ S6[x( 9)] ^ S7[x(11)] ^ S8[x( 8)] ^ S6[z( 3)]; + K[12] = S5[x( 8)] ^ S6[x( 9)] ^ S7[x( 7)] ^ S8[x( 6)] ^ S5[x( 3)]; + K[13] = S5[x(10)] ^ S6[x(11)] ^ S7[x( 5)] ^ S8[x( 4)] ^ S6[x( 7)]; + K[14] = S5[x(12)] ^ S6[x(13)] ^ S7[x( 3)] ^ S8[x( 2)] ^ S7[x( 8)]; + K[15] = S5[x(14)] ^ S6[x(15)] ^ S7[x( 1)] ^ S8[x( 0)] ^ S8[x(13)]; + } + +} diff --git a/src/libs/3rdparty/botan/src/block/cast/cast128.h b/src/libs/3rdparty/botan/src/block/cast/cast128.h new file mode 100644 index 00000000000..68048148239 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/cast/cast128.h @@ -0,0 +1,47 @@ +/* +* CAST-128 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CAST128_H__ +#define BOTAN_CAST128_H__ + +#include + +namespace Botan { + +/* +* CAST-128 +*/ +class BOTAN_DLL CAST_128 : public BlockCipher + { + public: + void clear() throw() { MK.clear(); RK.clear(); } + std::string name() const { return "CAST-128"; } + BlockCipher* clone() const { return new CAST_128; } + CAST_128() : BlockCipher(8, 11, 16) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + static void key_schedule(u32bit[16], u32bit[4]); + + static const u32bit S5[256]; + static const u32bit S6[256]; + static const u32bit S7[256]; + static const u32bit S8[256]; + + SecureBuffer MK, RK; + }; + +extern const u32bit CAST_SBOX1[256]; +extern const u32bit CAST_SBOX2[256]; +extern const u32bit CAST_SBOX3[256]; +extern const u32bit CAST_SBOX4[256]; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/cast/cast256.cpp b/src/libs/3rdparty/botan/src/block/cast/cast256.cpp new file mode 100644 index 00000000000..22ff876fa0a --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/cast/cast256.cpp @@ -0,0 +1,165 @@ +/* +* CAST-256 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* CAST-256 Round Type 1 +*/ +void round1(u32bit& out, u32bit in, u32bit mask, u32bit rot) + { + u32bit temp = rotate_left(mask + in, rot); + out ^= (CAST_SBOX1[get_byte(0, temp)] ^ CAST_SBOX2[get_byte(1, temp)]) - + CAST_SBOX3[get_byte(2, temp)] + CAST_SBOX4[get_byte(3, temp)]; + } + +/* +* CAST-256 Round Type 2 +*/ +void round2(u32bit& out, u32bit in, u32bit mask, u32bit rot) + { + u32bit temp = rotate_left(mask ^ in, rot); + out ^= (CAST_SBOX1[get_byte(0, temp)] - CAST_SBOX2[get_byte(1, temp)] + + CAST_SBOX3[get_byte(2, temp)]) ^ CAST_SBOX4[get_byte(3, temp)]; + } + +/* +* CAST-256 Round Type 3 +*/ +void round3(u32bit& out, u32bit in, u32bit mask, u32bit rot) + { + u32bit temp = rotate_left(mask - in, rot); + out ^= ((CAST_SBOX1[get_byte(0, temp)] + CAST_SBOX2[get_byte(1, temp)]) ^ + CAST_SBOX3[get_byte(2, temp)]) - CAST_SBOX4[get_byte(3, temp)]; + } + +} + +/* +* CAST-256 Encryption +*/ +void CAST_256::enc(const byte in[], byte out[]) const + { + u32bit A = load_be(in, 0); + u32bit B = load_be(in, 1); + u32bit C = load_be(in, 2); + u32bit D = load_be(in, 3); + + round1(C, D, MK[ 0], RK[ 0]); round2(B, C, MK[ 1], RK[ 1]); + round3(A, B, MK[ 2], RK[ 2]); round1(D, A, MK[ 3], RK[ 3]); + round1(C, D, MK[ 4], RK[ 4]); round2(B, C, MK[ 5], RK[ 5]); + round3(A, B, MK[ 6], RK[ 6]); round1(D, A, MK[ 7], RK[ 7]); + round1(C, D, MK[ 8], RK[ 8]); round2(B, C, MK[ 9], RK[ 9]); + round3(A, B, MK[10], RK[10]); round1(D, A, MK[11], RK[11]); + round1(C, D, MK[12], RK[12]); round2(B, C, MK[13], RK[13]); + round3(A, B, MK[14], RK[14]); round1(D, A, MK[15], RK[15]); + round1(C, D, MK[16], RK[16]); round2(B, C, MK[17], RK[17]); + round3(A, B, MK[18], RK[18]); round1(D, A, MK[19], RK[19]); + round1(C, D, MK[20], RK[20]); round2(B, C, MK[21], RK[21]); + round3(A, B, MK[22], RK[22]); round1(D, A, MK[23], RK[23]); + round1(D, A, MK[27], RK[27]); round3(A, B, MK[26], RK[26]); + round2(B, C, MK[25], RK[25]); round1(C, D, MK[24], RK[24]); + round1(D, A, MK[31], RK[31]); round3(A, B, MK[30], RK[30]); + round2(B, C, MK[29], RK[29]); round1(C, D, MK[28], RK[28]); + round1(D, A, MK[35], RK[35]); round3(A, B, MK[34], RK[34]); + round2(B, C, MK[33], RK[33]); round1(C, D, MK[32], RK[32]); + round1(D, A, MK[39], RK[39]); round3(A, B, MK[38], RK[38]); + round2(B, C, MK[37], RK[37]); round1(C, D, MK[36], RK[36]); + round1(D, A, MK[43], RK[43]); round3(A, B, MK[42], RK[42]); + round2(B, C, MK[41], RK[41]); round1(C, D, MK[40], RK[40]); + round1(D, A, MK[47], RK[47]); round3(A, B, MK[46], RK[46]); + round2(B, C, MK[45], RK[45]); round1(C, D, MK[44], RK[44]); + + store_be(out, A, B, C, D); + } + +/* +* CAST-256 Decryption +*/ +void CAST_256::dec(const byte in[], byte out[]) const + { + u32bit A = load_be(in, 0); + u32bit B = load_be(in, 1); + u32bit C = load_be(in, 2); + u32bit D = load_be(in, 3); + + round1(C, D, MK[44], RK[44]); round2(B, C, MK[45], RK[45]); + round3(A, B, MK[46], RK[46]); round1(D, A, MK[47], RK[47]); + round1(C, D, MK[40], RK[40]); round2(B, C, MK[41], RK[41]); + round3(A, B, MK[42], RK[42]); round1(D, A, MK[43], RK[43]); + round1(C, D, MK[36], RK[36]); round2(B, C, MK[37], RK[37]); + round3(A, B, MK[38], RK[38]); round1(D, A, MK[39], RK[39]); + round1(C, D, MK[32], RK[32]); round2(B, C, MK[33], RK[33]); + round3(A, B, MK[34], RK[34]); round1(D, A, MK[35], RK[35]); + round1(C, D, MK[28], RK[28]); round2(B, C, MK[29], RK[29]); + round3(A, B, MK[30], RK[30]); round1(D, A, MK[31], RK[31]); + round1(C, D, MK[24], RK[24]); round2(B, C, MK[25], RK[25]); + round3(A, B, MK[26], RK[26]); round1(D, A, MK[27], RK[27]); + round1(D, A, MK[23], RK[23]); round3(A, B, MK[22], RK[22]); + round2(B, C, MK[21], RK[21]); round1(C, D, MK[20], RK[20]); + round1(D, A, MK[19], RK[19]); round3(A, B, MK[18], RK[18]); + round2(B, C, MK[17], RK[17]); round1(C, D, MK[16], RK[16]); + round1(D, A, MK[15], RK[15]); round3(A, B, MK[14], RK[14]); + round2(B, C, MK[13], RK[13]); round1(C, D, MK[12], RK[12]); + round1(D, A, MK[11], RK[11]); round3(A, B, MK[10], RK[10]); + round2(B, C, MK[ 9], RK[ 9]); round1(C, D, MK[ 8], RK[ 8]); + round1(D, A, MK[ 7], RK[ 7]); round3(A, B, MK[ 6], RK[ 6]); + round2(B, C, MK[ 5], RK[ 5]); round1(C, D, MK[ 4], RK[ 4]); + round1(D, A, MK[ 3], RK[ 3]); round3(A, B, MK[ 2], RK[ 2]); + round2(B, C, MK[ 1], RK[ 1]); round1(C, D, MK[ 0], RK[ 0]); + + store_be(out, A, B, C, D); + } + +/* +* CAST-256 Key Schedule +*/ +void CAST_256::key_schedule(const byte key[], u32bit length) + { + SecureBuffer TMP; + for(u32bit j = 0; j != length; ++j) + TMP[j/4] = (TMP[j/4] << 8) + key[j]; + + u32bit A = TMP[0], B = TMP[1], C = TMP[2], D = TMP[3], + E = TMP[4], F = TMP[5], G = TMP[6], H = TMP[7]; + for(u32bit j = 0; j != 48; j += 4) + { + round1(G, H, KEY_MASK[4*j+ 0], KEY_ROT[(4*j+ 0) % 32]); + round2(F, G, KEY_MASK[4*j+ 1], KEY_ROT[(4*j+ 1) % 32]); + round3(E, F, KEY_MASK[4*j+ 2], KEY_ROT[(4*j+ 2) % 32]); + round1(D, E, KEY_MASK[4*j+ 3], KEY_ROT[(4*j+ 3) % 32]); + round2(C, D, KEY_MASK[4*j+ 4], KEY_ROT[(4*j+ 4) % 32]); + round3(B, C, KEY_MASK[4*j+ 5], KEY_ROT[(4*j+ 5) % 32]); + round1(A, B, KEY_MASK[4*j+ 6], KEY_ROT[(4*j+ 6) % 32]); + round2(H, A, KEY_MASK[4*j+ 7], KEY_ROT[(4*j+ 7) % 32]); + round1(G, H, KEY_MASK[4*j+ 8], KEY_ROT[(4*j+ 8) % 32]); + round2(F, G, KEY_MASK[4*j+ 9], KEY_ROT[(4*j+ 9) % 32]); + round3(E, F, KEY_MASK[4*j+10], KEY_ROT[(4*j+10) % 32]); + round1(D, E, KEY_MASK[4*j+11], KEY_ROT[(4*j+11) % 32]); + round2(C, D, KEY_MASK[4*j+12], KEY_ROT[(4*j+12) % 32]); + round3(B, C, KEY_MASK[4*j+13], KEY_ROT[(4*j+13) % 32]); + round1(A, B, KEY_MASK[4*j+14], KEY_ROT[(4*j+14) % 32]); + round2(H, A, KEY_MASK[4*j+15], KEY_ROT[(4*j+15) % 32]); + + RK[j ] = (A % 32); + RK[j+1] = (C % 32); + RK[j+2] = (E % 32); + RK[j+3] = (G % 32); + MK[j ] = H; + MK[j+1] = F; + MK[j+2] = D; + MK[j+3] = B; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/block/cast/cast256.h b/src/libs/3rdparty/botan/src/block/cast/cast256.h new file mode 100644 index 00000000000..cd48edd5e75 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/cast/cast256.h @@ -0,0 +1,44 @@ +/* +* CAST-256 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CAST256_H__ +#define BOTAN_CAST256_H__ + +#include + +namespace Botan { + +/* +* CAST-256 +*/ +class BOTAN_DLL CAST_256 : public BlockCipher + { + public: + void clear() throw() { MK.clear(); RK.clear(); } + std::string name() const { return "CAST-256"; } + BlockCipher* clone() const { return new CAST_256; } + CAST_256() : BlockCipher(16, 4, 32, 4) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + static const u32bit KEY_MASK[192]; + static const byte KEY_ROT[32]; + + SecureBuffer MK; + SecureBuffer RK; + }; + +extern const u32bit CAST_SBOX1[256]; +extern const u32bit CAST_SBOX2[256]; +extern const u32bit CAST_SBOX3[256]; +extern const u32bit CAST_SBOX4[256]; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/cast/cast_tab.cpp b/src/libs/3rdparty/botan/src/block/cast/cast_tab.cpp new file mode 100644 index 00000000000..61c8437138e --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/cast/cast_tab.cpp @@ -0,0 +1,412 @@ +/* +* S-Box Tables for CAST-128 and CAST-256 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +const u32bit CAST_SBOX1[256] = { + 0x30FB40D4, 0x9FA0FF0B, 0x6BECCD2F, 0x3F258C7A, 0x1E213F2F, 0x9C004DD3, + 0x6003E540, 0xCF9FC949, 0xBFD4AF27, 0x88BBBDB5, 0xE2034090, 0x98D09675, + 0x6E63A0E0, 0x15C361D2, 0xC2E7661D, 0x22D4FF8E, 0x28683B6F, 0xC07FD059, + 0xFF2379C8, 0x775F50E2, 0x43C340D3, 0xDF2F8656, 0x887CA41A, 0xA2D2BD2D, + 0xA1C9E0D6, 0x346C4819, 0x61B76D87, 0x22540F2F, 0x2ABE32E1, 0xAA54166B, + 0x22568E3A, 0xA2D341D0, 0x66DB40C8, 0xA784392F, 0x004DFF2F, 0x2DB9D2DE, + 0x97943FAC, 0x4A97C1D8, 0x527644B7, 0xB5F437A7, 0xB82CBAEF, 0xD751D159, + 0x6FF7F0ED, 0x5A097A1F, 0x827B68D0, 0x90ECF52E, 0x22B0C054, 0xBC8E5935, + 0x4B6D2F7F, 0x50BB64A2, 0xD2664910, 0xBEE5812D, 0xB7332290, 0xE93B159F, + 0xB48EE411, 0x4BFF345D, 0xFD45C240, 0xAD31973F, 0xC4F6D02E, 0x55FC8165, + 0xD5B1CAAD, 0xA1AC2DAE, 0xA2D4B76D, 0xC19B0C50, 0x882240F2, 0x0C6E4F38, + 0xA4E4BFD7, 0x4F5BA272, 0x564C1D2F, 0xC59C5319, 0xB949E354, 0xB04669FE, + 0xB1B6AB8A, 0xC71358DD, 0x6385C545, 0x110F935D, 0x57538AD5, 0x6A390493, + 0xE63D37E0, 0x2A54F6B3, 0x3A787D5F, 0x6276A0B5, 0x19A6FCDF, 0x7A42206A, + 0x29F9D4D5, 0xF61B1891, 0xBB72275E, 0xAA508167, 0x38901091, 0xC6B505EB, + 0x84C7CB8C, 0x2AD75A0F, 0x874A1427, 0xA2D1936B, 0x2AD286AF, 0xAA56D291, + 0xD7894360, 0x425C750D, 0x93B39E26, 0x187184C9, 0x6C00B32D, 0x73E2BB14, + 0xA0BEBC3C, 0x54623779, 0x64459EAB, 0x3F328B82, 0x7718CF82, 0x59A2CEA6, + 0x04EE002E, 0x89FE78E6, 0x3FAB0950, 0x325FF6C2, 0x81383F05, 0x6963C5C8, + 0x76CB5AD6, 0xD49974C9, 0xCA180DCF, 0x380782D5, 0xC7FA5CF6, 0x8AC31511, + 0x35E79E13, 0x47DA91D0, 0xF40F9086, 0xA7E2419E, 0x31366241, 0x051EF495, + 0xAA573B04, 0x4A805D8D, 0x548300D0, 0x00322A3C, 0xBF64CDDF, 0xBA57A68E, + 0x75C6372B, 0x50AFD341, 0xA7C13275, 0x915A0BF5, 0x6B54BFAB, 0x2B0B1426, + 0xAB4CC9D7, 0x449CCD82, 0xF7FBF265, 0xAB85C5F3, 0x1B55DB94, 0xAAD4E324, + 0xCFA4BD3F, 0x2DEAA3E2, 0x9E204D02, 0xC8BD25AC, 0xEADF55B3, 0xD5BD9E98, + 0xE31231B2, 0x2AD5AD6C, 0x954329DE, 0xADBE4528, 0xD8710F69, 0xAA51C90F, + 0xAA786BF6, 0x22513F1E, 0xAA51A79B, 0x2AD344CC, 0x7B5A41F0, 0xD37CFBAD, + 0x1B069505, 0x41ECE491, 0xB4C332E6, 0x032268D4, 0xC9600ACC, 0xCE387E6D, + 0xBF6BB16C, 0x6A70FB78, 0x0D03D9C9, 0xD4DF39DE, 0xE01063DA, 0x4736F464, + 0x5AD328D8, 0xB347CC96, 0x75BB0FC3, 0x98511BFB, 0x4FFBCC35, 0xB58BCF6A, + 0xE11F0ABC, 0xBFC5FE4A, 0xA70AEC10, 0xAC39570A, 0x3F04442F, 0x6188B153, + 0xE0397A2E, 0x5727CB79, 0x9CEB418F, 0x1CACD68D, 0x2AD37C96, 0x0175CB9D, + 0xC69DFF09, 0xC75B65F0, 0xD9DB40D8, 0xEC0E7779, 0x4744EAD4, 0xB11C3274, + 0xDD24CB9E, 0x7E1C54BD, 0xF01144F9, 0xD2240EB1, 0x9675B3FD, 0xA3AC3755, + 0xD47C27AF, 0x51C85F4D, 0x56907596, 0xA5BB15E6, 0x580304F0, 0xCA042CF1, + 0x011A37EA, 0x8DBFAADB, 0x35BA3E4A, 0x3526FFA0, 0xC37B4D09, 0xBC306ED9, + 0x98A52666, 0x5648F725, 0xFF5E569D, 0x0CED63D0, 0x7C63B2CF, 0x700B45E1, + 0xD5EA50F1, 0x85A92872, 0xAF1FBDA7, 0xD4234870, 0xA7870BF3, 0x2D3B4D79, + 0x42E04198, 0x0CD0EDE7, 0x26470DB8, 0xF881814C, 0x474D6AD7, 0x7C0C5E5C, + 0xD1231959, 0x381B7298, 0xF5D2F4DB, 0xAB838653, 0x6E2F1E23, 0x83719C9E, + 0xBD91E046, 0x9A56456E, 0xDC39200C, 0x20C8C571, 0x962BDA1C, 0xE1E696FF, + 0xB141AB08, 0x7CCA89B9, 0x1A69E783, 0x02CC4843, 0xA2F7C579, 0x429EF47D, + 0x427B169C, 0x5AC9F049, 0xDD8F0F00, 0x5C8165BF }; + +const u32bit CAST_SBOX2[256] = { + 0x1F201094, 0xEF0BA75B, 0x69E3CF7E, 0x393F4380, 0xFE61CF7A, 0xEEC5207A, + 0x55889C94, 0x72FC0651, 0xADA7EF79, 0x4E1D7235, 0xD55A63CE, 0xDE0436BA, + 0x99C430EF, 0x5F0C0794, 0x18DCDB7D, 0xA1D6EFF3, 0xA0B52F7B, 0x59E83605, + 0xEE15B094, 0xE9FFD909, 0xDC440086, 0xEF944459, 0xBA83CCB3, 0xE0C3CDFB, + 0xD1DA4181, 0x3B092AB1, 0xF997F1C1, 0xA5E6CF7B, 0x01420DDB, 0xE4E7EF5B, + 0x25A1FF41, 0xE180F806, 0x1FC41080, 0x179BEE7A, 0xD37AC6A9, 0xFE5830A4, + 0x98DE8B7F, 0x77E83F4E, 0x79929269, 0x24FA9F7B, 0xE113C85B, 0xACC40083, + 0xD7503525, 0xF7EA615F, 0x62143154, 0x0D554B63, 0x5D681121, 0xC866C359, + 0x3D63CF73, 0xCEE234C0, 0xD4D87E87, 0x5C672B21, 0x071F6181, 0x39F7627F, + 0x361E3084, 0xE4EB573B, 0x602F64A4, 0xD63ACD9C, 0x1BBC4635, 0x9E81032D, + 0x2701F50C, 0x99847AB4, 0xA0E3DF79, 0xBA6CF38C, 0x10843094, 0x2537A95E, + 0xF46F6FFE, 0xA1FF3B1F, 0x208CFB6A, 0x8F458C74, 0xD9E0A227, 0x4EC73A34, + 0xFC884F69, 0x3E4DE8DF, 0xEF0E0088, 0x3559648D, 0x8A45388C, 0x1D804366, + 0x721D9BFD, 0xA58684BB, 0xE8256333, 0x844E8212, 0x128D8098, 0xFED33FB4, + 0xCE280AE1, 0x27E19BA5, 0xD5A6C252, 0xE49754BD, 0xC5D655DD, 0xEB667064, + 0x77840B4D, 0xA1B6A801, 0x84DB26A9, 0xE0B56714, 0x21F043B7, 0xE5D05860, + 0x54F03084, 0x066FF472, 0xA31AA153, 0xDADC4755, 0xB5625DBF, 0x68561BE6, + 0x83CA6B94, 0x2D6ED23B, 0xECCF01DB, 0xA6D3D0BA, 0xB6803D5C, 0xAF77A709, + 0x33B4A34C, 0x397BC8D6, 0x5EE22B95, 0x5F0E5304, 0x81ED6F61, 0x20E74364, + 0xB45E1378, 0xDE18639B, 0x881CA122, 0xB96726D1, 0x8049A7E8, 0x22B7DA7B, + 0x5E552D25, 0x5272D237, 0x79D2951C, 0xC60D894C, 0x488CB402, 0x1BA4FE5B, + 0xA4B09F6B, 0x1CA815CF, 0xA20C3005, 0x8871DF63, 0xB9DE2FCB, 0x0CC6C9E9, + 0x0BEEFF53, 0xE3214517, 0xB4542835, 0x9F63293C, 0xEE41E729, 0x6E1D2D7C, + 0x50045286, 0x1E6685F3, 0xF33401C6, 0x30A22C95, 0x31A70850, 0x60930F13, + 0x73F98417, 0xA1269859, 0xEC645C44, 0x52C877A9, 0xCDFF33A6, 0xA02B1741, + 0x7CBAD9A2, 0x2180036F, 0x50D99C08, 0xCB3F4861, 0xC26BD765, 0x64A3F6AB, + 0x80342676, 0x25A75E7B, 0xE4E6D1FC, 0x20C710E6, 0xCDF0B680, 0x17844D3B, + 0x31EEF84D, 0x7E0824E4, 0x2CCB49EB, 0x846A3BAE, 0x8FF77888, 0xEE5D60F6, + 0x7AF75673, 0x2FDD5CDB, 0xA11631C1, 0x30F66F43, 0xB3FAEC54, 0x157FD7FA, + 0xEF8579CC, 0xD152DE58, 0xDB2FFD5E, 0x8F32CE19, 0x306AF97A, 0x02F03EF8, + 0x99319AD5, 0xC242FA0F, 0xA7E3EBB0, 0xC68E4906, 0xB8DA230C, 0x80823028, + 0xDCDEF3C8, 0xD35FB171, 0x088A1BC8, 0xBEC0C560, 0x61A3C9E8, 0xBCA8F54D, + 0xC72FEFFA, 0x22822E99, 0x82C570B4, 0xD8D94E89, 0x8B1C34BC, 0x301E16E6, + 0x273BE979, 0xB0FFEAA6, 0x61D9B8C6, 0x00B24869, 0xB7FFCE3F, 0x08DC283B, + 0x43DAF65A, 0xF7E19798, 0x7619B72F, 0x8F1C9BA4, 0xDC8637A0, 0x16A7D3B1, + 0x9FC393B7, 0xA7136EEB, 0xC6BCC63E, 0x1A513742, 0xEF6828BC, 0x520365D6, + 0x2D6A77AB, 0x3527ED4B, 0x821FD216, 0x095C6E2E, 0xDB92F2FB, 0x5EEA29CB, + 0x145892F5, 0x91584F7F, 0x5483697B, 0x2667A8CC, 0x85196048, 0x8C4BACEA, + 0x833860D4, 0x0D23E0F9, 0x6C387E8A, 0x0AE6D249, 0xB284600C, 0xD835731D, + 0xDCB1C647, 0xAC4C56EA, 0x3EBD81B3, 0x230EABB0, 0x6438BC87, 0xF0B5B1FA, + 0x8F5EA2B3, 0xFC184642, 0x0A036B7A, 0x4FB089BD, 0x649DA589, 0xA345415E, + 0x5C038323, 0x3E5D3BB9, 0x43D79572, 0x7E6DD07C, 0x06DFDF1E, 0x6C6CC4EF, + 0x7160A539, 0x73BFBE70, 0x83877605, 0x4523ECF1 }; + +const u32bit CAST_SBOX3[256] = { + 0x8DEFC240, 0x25FA5D9F, 0xEB903DBF, 0xE810C907, 0x47607FFF, 0x369FE44B, + 0x8C1FC644, 0xAECECA90, 0xBEB1F9BF, 0xEEFBCAEA, 0xE8CF1950, 0x51DF07AE, + 0x920E8806, 0xF0AD0548, 0xE13C8D83, 0x927010D5, 0x11107D9F, 0x07647DB9, + 0xB2E3E4D4, 0x3D4F285E, 0xB9AFA820, 0xFADE82E0, 0xA067268B, 0x8272792E, + 0x553FB2C0, 0x489AE22B, 0xD4EF9794, 0x125E3FBC, 0x21FFFCEE, 0x825B1BFD, + 0x9255C5ED, 0x1257A240, 0x4E1A8302, 0xBAE07FFF, 0x528246E7, 0x8E57140E, + 0x3373F7BF, 0x8C9F8188, 0xA6FC4EE8, 0xC982B5A5, 0xA8C01DB7, 0x579FC264, + 0x67094F31, 0xF2BD3F5F, 0x40FFF7C1, 0x1FB78DFC, 0x8E6BD2C1, 0x437BE59B, + 0x99B03DBF, 0xB5DBC64B, 0x638DC0E6, 0x55819D99, 0xA197C81C, 0x4A012D6E, + 0xC5884A28, 0xCCC36F71, 0xB843C213, 0x6C0743F1, 0x8309893C, 0x0FEDDD5F, + 0x2F7FE850, 0xD7C07F7E, 0x02507FBF, 0x5AFB9A04, 0xA747D2D0, 0x1651192E, + 0xAF70BF3E, 0x58C31380, 0x5F98302E, 0x727CC3C4, 0x0A0FB402, 0x0F7FEF82, + 0x8C96FDAD, 0x5D2C2AAE, 0x8EE99A49, 0x50DA88B8, 0x8427F4A0, 0x1EAC5790, + 0x796FB449, 0x8252DC15, 0xEFBD7D9B, 0xA672597D, 0xADA840D8, 0x45F54504, + 0xFA5D7403, 0xE83EC305, 0x4F91751A, 0x925669C2, 0x23EFE941, 0xA903F12E, + 0x60270DF2, 0x0276E4B6, 0x94FD6574, 0x927985B2, 0x8276DBCB, 0x02778176, + 0xF8AF918D, 0x4E48F79E, 0x8F616DDF, 0xE29D840E, 0x842F7D83, 0x340CE5C8, + 0x96BBB682, 0x93B4B148, 0xEF303CAB, 0x984FAF28, 0x779FAF9B, 0x92DC560D, + 0x224D1E20, 0x8437AA88, 0x7D29DC96, 0x2756D3DC, 0x8B907CEE, 0xB51FD240, + 0xE7C07CE3, 0xE566B4A1, 0xC3E9615E, 0x3CF8209D, 0x6094D1E3, 0xCD9CA341, + 0x5C76460E, 0x00EA983B, 0xD4D67881, 0xFD47572C, 0xF76CEDD9, 0xBDA8229C, + 0x127DADAA, 0x438A074E, 0x1F97C090, 0x081BDB8A, 0x93A07EBE, 0xB938CA15, + 0x97B03CFF, 0x3DC2C0F8, 0x8D1AB2EC, 0x64380E51, 0x68CC7BFB, 0xD90F2788, + 0x12490181, 0x5DE5FFD4, 0xDD7EF86A, 0x76A2E214, 0xB9A40368, 0x925D958F, + 0x4B39FFFA, 0xBA39AEE9, 0xA4FFD30B, 0xFAF7933B, 0x6D498623, 0x193CBCFA, + 0x27627545, 0x825CF47A, 0x61BD8BA0, 0xD11E42D1, 0xCEAD04F4, 0x127EA392, + 0x10428DB7, 0x8272A972, 0x9270C4A8, 0x127DE50B, 0x285BA1C8, 0x3C62F44F, + 0x35C0EAA5, 0xE805D231, 0x428929FB, 0xB4FCDF82, 0x4FB66A53, 0x0E7DC15B, + 0x1F081FAB, 0x108618AE, 0xFCFD086D, 0xF9FF2889, 0x694BCC11, 0x236A5CAE, + 0x12DECA4D, 0x2C3F8CC5, 0xD2D02DFE, 0xF8EF5896, 0xE4CF52DA, 0x95155B67, + 0x494A488C, 0xB9B6A80C, 0x5C8F82BC, 0x89D36B45, 0x3A609437, 0xEC00C9A9, + 0x44715253, 0x0A874B49, 0xD773BC40, 0x7C34671C, 0x02717EF6, 0x4FEB5536, + 0xA2D02FFF, 0xD2BF60C4, 0xD43F03C0, 0x50B4EF6D, 0x07478CD1, 0x006E1888, + 0xA2E53F55, 0xB9E6D4BC, 0xA2048016, 0x97573833, 0xD7207D67, 0xDE0F8F3D, + 0x72F87B33, 0xABCC4F33, 0x7688C55D, 0x7B00A6B0, 0x947B0001, 0x570075D2, + 0xF9BB88F8, 0x8942019E, 0x4264A5FF, 0x856302E0, 0x72DBD92B, 0xEE971B69, + 0x6EA22FDE, 0x5F08AE2B, 0xAF7A616D, 0xE5C98767, 0xCF1FEBD2, 0x61EFC8C2, + 0xF1AC2571, 0xCC8239C2, 0x67214CB8, 0xB1E583D1, 0xB7DC3E62, 0x7F10BDCE, + 0xF90A5C38, 0x0FF0443D, 0x606E6DC6, 0x60543A49, 0x5727C148, 0x2BE98A1D, + 0x8AB41738, 0x20E1BE24, 0xAF96DA0F, 0x68458425, 0x99833BE5, 0x600D457D, + 0x282F9350, 0x8334B362, 0xD91D1120, 0x2B6D8DA0, 0x642B1E31, 0x9C305A00, + 0x52BCE688, 0x1B03588A, 0xF7BAEFD5, 0x4142ED9C, 0xA4315C11, 0x83323EC5, + 0xDFEF4636, 0xA133C501, 0xE9D3531C, 0xEE353783 }; + +const u32bit CAST_SBOX4[256] = { + 0x9DB30420, 0x1FB6E9DE, 0xA7BE7BEF, 0xD273A298, 0x4A4F7BDB, 0x64AD8C57, + 0x85510443, 0xFA020ED1, 0x7E287AFF, 0xE60FB663, 0x095F35A1, 0x79EBF120, + 0xFD059D43, 0x6497B7B1, 0xF3641F63, 0x241E4ADF, 0x28147F5F, 0x4FA2B8CD, + 0xC9430040, 0x0CC32220, 0xFDD30B30, 0xC0A5374F, 0x1D2D00D9, 0x24147B15, + 0xEE4D111A, 0x0FCA5167, 0x71FF904C, 0x2D195FFE, 0x1A05645F, 0x0C13FEFE, + 0x081B08CA, 0x05170121, 0x80530100, 0xE83E5EFE, 0xAC9AF4F8, 0x7FE72701, + 0xD2B8EE5F, 0x06DF4261, 0xBB9E9B8A, 0x7293EA25, 0xCE84FFDF, 0xF5718801, + 0x3DD64B04, 0xA26F263B, 0x7ED48400, 0x547EEBE6, 0x446D4CA0, 0x6CF3D6F5, + 0x2649ABDF, 0xAEA0C7F5, 0x36338CC1, 0x503F7E93, 0xD3772061, 0x11B638E1, + 0x72500E03, 0xF80EB2BB, 0xABE0502E, 0xEC8D77DE, 0x57971E81, 0xE14F6746, + 0xC9335400, 0x6920318F, 0x081DBB99, 0xFFC304A5, 0x4D351805, 0x7F3D5CE3, + 0xA6C866C6, 0x5D5BCCA9, 0xDAEC6FEA, 0x9F926F91, 0x9F46222F, 0x3991467D, + 0xA5BF6D8E, 0x1143C44F, 0x43958302, 0xD0214EEB, 0x022083B8, 0x3FB6180C, + 0x18F8931E, 0x281658E6, 0x26486E3E, 0x8BD78A70, 0x7477E4C1, 0xB506E07C, + 0xF32D0A25, 0x79098B02, 0xE4EABB81, 0x28123B23, 0x69DEAD38, 0x1574CA16, + 0xDF871B62, 0x211C40B7, 0xA51A9EF9, 0x0014377B, 0x041E8AC8, 0x09114003, + 0xBD59E4D2, 0xE3D156D5, 0x4FE876D5, 0x2F91A340, 0x557BE8DE, 0x00EAE4A7, + 0x0CE5C2EC, 0x4DB4BBA6, 0xE756BDFF, 0xDD3369AC, 0xEC17B035, 0x06572327, + 0x99AFC8B0, 0x56C8C391, 0x6B65811C, 0x5E146119, 0x6E85CB75, 0xBE07C002, + 0xC2325577, 0x893FF4EC, 0x5BBFC92D, 0xD0EC3B25, 0xB7801AB7, 0x8D6D3B24, + 0x20C763EF, 0xC366A5FC, 0x9C382880, 0x0ACE3205, 0xAAC9548A, 0xECA1D7C7, + 0x041AFA32, 0x1D16625A, 0x6701902C, 0x9B757A54, 0x31D477F7, 0x9126B031, + 0x36CC6FDB, 0xC70B8B46, 0xD9E66A48, 0x56E55A79, 0x026A4CEB, 0x52437EFF, + 0x2F8F76B4, 0x0DF980A5, 0x8674CDE3, 0xEDDA04EB, 0x17A9BE04, 0x2C18F4DF, + 0xB7747F9D, 0xAB2AF7B4, 0xEFC34D20, 0x2E096B7C, 0x1741A254, 0xE5B6A035, + 0x213D42F6, 0x2C1C7C26, 0x61C2F50F, 0x6552DAF9, 0xD2C231F8, 0x25130F69, + 0xD8167FA2, 0x0418F2C8, 0x001A96A6, 0x0D1526AB, 0x63315C21, 0x5E0A72EC, + 0x49BAFEFD, 0x187908D9, 0x8D0DBD86, 0x311170A7, 0x3E9B640C, 0xCC3E10D7, + 0xD5CAD3B6, 0x0CAEC388, 0xF73001E1, 0x6C728AFF, 0x71EAE2A1, 0x1F9AF36E, + 0xCFCBD12F, 0xC1DE8417, 0xAC07BE6B, 0xCB44A1D8, 0x8B9B0F56, 0x013988C3, + 0xB1C52FCA, 0xB4BE31CD, 0xD8782806, 0x12A3A4E2, 0x6F7DE532, 0x58FD7EB6, + 0xD01EE900, 0x24ADFFC2, 0xF4990FC5, 0x9711AAC5, 0x001D7B95, 0x82E5E7D2, + 0x109873F6, 0x00613096, 0xC32D9521, 0xADA121FF, 0x29908415, 0x7FBB977F, + 0xAF9EB3DB, 0x29C9ED2A, 0x5CE2A465, 0xA730F32C, 0xD0AA3FE8, 0x8A5CC091, + 0xD49E2CE7, 0x0CE454A9, 0xD60ACD86, 0x015F1919, 0x77079103, 0xDEA03AF6, + 0x78A8565E, 0xDEE356DF, 0x21F05CBE, 0x8B75E387, 0xB3C50651, 0xB8A5C3EF, + 0xD8EEB6D2, 0xE523BE77, 0xC2154529, 0x2F69EFDF, 0xAFE67AFB, 0xF470C4B2, + 0xF3E0EB5B, 0xD6CC9876, 0x39E4460C, 0x1FDA8538, 0x1987832F, 0xCA007367, + 0xA99144F8, 0x296B299E, 0x492FC295, 0x9266BEAB, 0xB5676E69, 0x9BD3DDDA, + 0xDF7E052F, 0xDB25701C, 0x1B5E51EE, 0xF65324E6, 0x6AFCE36C, 0x0316CC04, + 0x8644213E, 0xB7DC59D0, 0x7965291F, 0xCCD6FD43, 0x41823979, 0x932BCDF6, + 0xB657C34D, 0x4EDFD282, 0x7AE5290C, 0x3CB9536B, 0x851E20FE, 0x9833557E, + 0x13ECF0B0, 0xD3FFB372, 0x3F85C5C1, 0x0AEF7ED2 }; + +const u32bit CAST_128::S5[256] = { + 0x7EC90C04, 0x2C6E74B9, 0x9B0E66DF, 0xA6337911, 0xB86A7FFF, 0x1DD358F5, + 0x44DD9D44, 0x1731167F, 0x08FBF1FA, 0xE7F511CC, 0xD2051B00, 0x735ABA00, + 0x2AB722D8, 0x386381CB, 0xACF6243A, 0x69BEFD7A, 0xE6A2E77F, 0xF0C720CD, + 0xC4494816, 0xCCF5C180, 0x38851640, 0x15B0A848, 0xE68B18CB, 0x4CAADEFF, + 0x5F480A01, 0x0412B2AA, 0x259814FC, 0x41D0EFE2, 0x4E40B48D, 0x248EB6FB, + 0x8DBA1CFE, 0x41A99B02, 0x1A550A04, 0xBA8F65CB, 0x7251F4E7, 0x95A51725, + 0xC106ECD7, 0x97A5980A, 0xC539B9AA, 0x4D79FE6A, 0xF2F3F763, 0x68AF8040, + 0xED0C9E56, 0x11B4958B, 0xE1EB5A88, 0x8709E6B0, 0xD7E07156, 0x4E29FEA7, + 0x6366E52D, 0x02D1C000, 0xC4AC8E05, 0x9377F571, 0x0C05372A, 0x578535F2, + 0x2261BE02, 0xD642A0C9, 0xDF13A280, 0x74B55BD2, 0x682199C0, 0xD421E5EC, + 0x53FB3CE8, 0xC8ADEDB3, 0x28A87FC9, 0x3D959981, 0x5C1FF900, 0xFE38D399, + 0x0C4EFF0B, 0x062407EA, 0xAA2F4FB1, 0x4FB96976, 0x90C79505, 0xB0A8A774, + 0xEF55A1FF, 0xE59CA2C2, 0xA6B62D27, 0xE66A4263, 0xDF65001F, 0x0EC50966, + 0xDFDD55BC, 0x29DE0655, 0x911E739A, 0x17AF8975, 0x32C7911C, 0x89F89468, + 0x0D01E980, 0x524755F4, 0x03B63CC9, 0x0CC844B2, 0xBCF3F0AA, 0x87AC36E9, + 0xE53A7426, 0x01B3D82B, 0x1A9E7449, 0x64EE2D7E, 0xCDDBB1DA, 0x01C94910, + 0xB868BF80, 0x0D26F3FD, 0x9342EDE7, 0x04A5C284, 0x636737B6, 0x50F5B616, + 0xF24766E3, 0x8ECA36C1, 0x136E05DB, 0xFEF18391, 0xFB887A37, 0xD6E7F7D4, + 0xC7FB7DC9, 0x3063FCDF, 0xB6F589DE, 0xEC2941DA, 0x26E46695, 0xB7566419, + 0xF654EFC5, 0xD08D58B7, 0x48925401, 0xC1BACB7F, 0xE5FF550F, 0xB6083049, + 0x5BB5D0E8, 0x87D72E5A, 0xAB6A6EE1, 0x223A66CE, 0xC62BF3CD, 0x9E0885F9, + 0x68CB3E47, 0x086C010F, 0xA21DE820, 0xD18B69DE, 0xF3F65777, 0xFA02C3F6, + 0x407EDAC3, 0xCBB3D550, 0x1793084D, 0xB0D70EBA, 0x0AB378D5, 0xD951FB0C, + 0xDED7DA56, 0x4124BBE4, 0x94CA0B56, 0x0F5755D1, 0xE0E1E56E, 0x6184B5BE, + 0x580A249F, 0x94F74BC0, 0xE327888E, 0x9F7B5561, 0xC3DC0280, 0x05687715, + 0x646C6BD7, 0x44904DB3, 0x66B4F0A3, 0xC0F1648A, 0x697ED5AF, 0x49E92FF6, + 0x309E374F, 0x2CB6356A, 0x85808573, 0x4991F840, 0x76F0AE02, 0x083BE84D, + 0x28421C9A, 0x44489406, 0x736E4CB8, 0xC1092910, 0x8BC95FC6, 0x7D869CF4, + 0x134F616F, 0x2E77118D, 0xB31B2BE1, 0xAA90B472, 0x3CA5D717, 0x7D161BBA, + 0x9CAD9010, 0xAF462BA2, 0x9FE459D2, 0x45D34559, 0xD9F2DA13, 0xDBC65487, + 0xF3E4F94E, 0x176D486F, 0x097C13EA, 0x631DA5C7, 0x445F7382, 0x175683F4, + 0xCDC66A97, 0x70BE0288, 0xB3CDCF72, 0x6E5DD2F3, 0x20936079, 0x459B80A5, + 0xBE60E2DB, 0xA9C23101, 0xEBA5315C, 0x224E42F2, 0x1C5C1572, 0xF6721B2C, + 0x1AD2FFF3, 0x8C25404E, 0x324ED72F, 0x4067B7FD, 0x0523138E, 0x5CA3BC78, + 0xDC0FD66E, 0x75922283, 0x784D6B17, 0x58EBB16E, 0x44094F85, 0x3F481D87, + 0xFCFEAE7B, 0x77B5FF76, 0x8C2302BF, 0xAAF47556, 0x5F46B02A, 0x2B092801, + 0x3D38F5F7, 0x0CA81F36, 0x52AF4A8A, 0x66D5E7C0, 0xDF3B0874, 0x95055110, + 0x1B5AD7A8, 0xF61ED5AD, 0x6CF6E479, 0x20758184, 0xD0CEFA65, 0x88F7BE58, + 0x4A046826, 0x0FF6F8F3, 0xA09C7F70, 0x5346ABA0, 0x5CE96C28, 0xE176EDA3, + 0x6BAC307F, 0x376829D2, 0x85360FA9, 0x17E3FE2A, 0x24B79767, 0xF5A96B20, + 0xD6CD2595, 0x68FF1EBF, 0x7555442C, 0xF19F06BE, 0xF9E0659A, 0xEEB9491D, + 0x34010718, 0xBB30CAB8, 0xE822FE15, 0x88570983, 0x750E6249, 0xDA627E55, + 0x5E76FFA8, 0xB1534546, 0x6D47DE08, 0xEFE9E7D4 }; + +const u32bit CAST_128::S6[256] = { + 0xF6FA8F9D, 0x2CAC6CE1, 0x4CA34867, 0xE2337F7C, 0x95DB08E7, 0x016843B4, + 0xECED5CBC, 0x325553AC, 0xBF9F0960, 0xDFA1E2ED, 0x83F0579D, 0x63ED86B9, + 0x1AB6A6B8, 0xDE5EBE39, 0xF38FF732, 0x8989B138, 0x33F14961, 0xC01937BD, + 0xF506C6DA, 0xE4625E7E, 0xA308EA99, 0x4E23E33C, 0x79CBD7CC, 0x48A14367, + 0xA3149619, 0xFEC94BD5, 0xA114174A, 0xEAA01866, 0xA084DB2D, 0x09A8486F, + 0xA888614A, 0x2900AF98, 0x01665991, 0xE1992863, 0xC8F30C60, 0x2E78EF3C, + 0xD0D51932, 0xCF0FEC14, 0xF7CA07D2, 0xD0A82072, 0xFD41197E, 0x9305A6B0, + 0xE86BE3DA, 0x74BED3CD, 0x372DA53C, 0x4C7F4448, 0xDAB5D440, 0x6DBA0EC3, + 0x083919A7, 0x9FBAEED9, 0x49DBCFB0, 0x4E670C53, 0x5C3D9C01, 0x64BDB941, + 0x2C0E636A, 0xBA7DD9CD, 0xEA6F7388, 0xE70BC762, 0x35F29ADB, 0x5C4CDD8D, + 0xF0D48D8C, 0xB88153E2, 0x08A19866, 0x1AE2EAC8, 0x284CAF89, 0xAA928223, + 0x9334BE53, 0x3B3A21BF, 0x16434BE3, 0x9AEA3906, 0xEFE8C36E, 0xF890CDD9, + 0x80226DAE, 0xC340A4A3, 0xDF7E9C09, 0xA694A807, 0x5B7C5ECC, 0x221DB3A6, + 0x9A69A02F, 0x68818A54, 0xCEB2296F, 0x53C0843A, 0xFE893655, 0x25BFE68A, + 0xB4628ABC, 0xCF222EBF, 0x25AC6F48, 0xA9A99387, 0x53BDDB65, 0xE76FFBE7, + 0xE967FD78, 0x0BA93563, 0x8E342BC1, 0xE8A11BE9, 0x4980740D, 0xC8087DFC, + 0x8DE4BF99, 0xA11101A0, 0x7FD37975, 0xDA5A26C0, 0xE81F994F, 0x9528CD89, + 0xFD339FED, 0xB87834BF, 0x5F04456D, 0x22258698, 0xC9C4C83B, 0x2DC156BE, + 0x4F628DAA, 0x57F55EC5, 0xE2220ABE, 0xD2916EBF, 0x4EC75B95, 0x24F2C3C0, + 0x42D15D99, 0xCD0D7FA0, 0x7B6E27FF, 0xA8DC8AF0, 0x7345C106, 0xF41E232F, + 0x35162386, 0xE6EA8926, 0x3333B094, 0x157EC6F2, 0x372B74AF, 0x692573E4, + 0xE9A9D848, 0xF3160289, 0x3A62EF1D, 0xA787E238, 0xF3A5F676, 0x74364853, + 0x20951063, 0x4576698D, 0xB6FAD407, 0x592AF950, 0x36F73523, 0x4CFB6E87, + 0x7DA4CEC0, 0x6C152DAA, 0xCB0396A8, 0xC50DFE5D, 0xFCD707AB, 0x0921C42F, + 0x89DFF0BB, 0x5FE2BE78, 0x448F4F33, 0x754613C9, 0x2B05D08D, 0x48B9D585, + 0xDC049441, 0xC8098F9B, 0x7DEDE786, 0xC39A3373, 0x42410005, 0x6A091751, + 0x0EF3C8A6, 0x890072D6, 0x28207682, 0xA9A9F7BE, 0xBF32679D, 0xD45B5B75, + 0xB353FD00, 0xCBB0E358, 0x830F220A, 0x1F8FB214, 0xD372CF08, 0xCC3C4A13, + 0x8CF63166, 0x061C87BE, 0x88C98F88, 0x6062E397, 0x47CF8E7A, 0xB6C85283, + 0x3CC2ACFB, 0x3FC06976, 0x4E8F0252, 0x64D8314D, 0xDA3870E3, 0x1E665459, + 0xC10908F0, 0x513021A5, 0x6C5B68B7, 0x822F8AA0, 0x3007CD3E, 0x74719EEF, + 0xDC872681, 0x073340D4, 0x7E432FD9, 0x0C5EC241, 0x8809286C, 0xF592D891, + 0x08A930F6, 0x957EF305, 0xB7FBFFBD, 0xC266E96F, 0x6FE4AC98, 0xB173ECC0, + 0xBC60B42A, 0x953498DA, 0xFBA1AE12, 0x2D4BD736, 0x0F25FAAB, 0xA4F3FCEB, + 0xE2969123, 0x257F0C3D, 0x9348AF49, 0x361400BC, 0xE8816F4A, 0x3814F200, + 0xA3F94043, 0x9C7A54C2, 0xBC704F57, 0xDA41E7F9, 0xC25AD33A, 0x54F4A084, + 0xB17F5505, 0x59357CBE, 0xEDBD15C8, 0x7F97C5AB, 0xBA5AC7B5, 0xB6F6DEAF, + 0x3A479C3A, 0x5302DA25, 0x653D7E6A, 0x54268D49, 0x51A477EA, 0x5017D55B, + 0xD7D25D88, 0x44136C76, 0x0404A8C8, 0xB8E5A121, 0xB81A928A, 0x60ED5869, + 0x97C55B96, 0xEAEC991B, 0x29935913, 0x01FDB7F1, 0x088E8DFA, 0x9AB6F6F5, + 0x3B4CBF9F, 0x4A5DE3AB, 0xE6051D35, 0xA0E1D855, 0xD36B4CF1, 0xF544EDEB, + 0xB0E93524, 0xBEBB8FBD, 0xA2D762CF, 0x49C92F54, 0x38B5F331, 0x7128A454, + 0x48392905, 0xA65B1DB8, 0x851C97BD, 0xD675CF2F }; + +const u32bit CAST_128::S7[256] = { + 0x85E04019, 0x332BF567, 0x662DBFFF, 0xCFC65693, 0x2A8D7F6F, 0xAB9BC912, + 0xDE6008A1, 0x2028DA1F, 0x0227BCE7, 0x4D642916, 0x18FAC300, 0x50F18B82, + 0x2CB2CB11, 0xB232E75C, 0x4B3695F2, 0xB28707DE, 0xA05FBCF6, 0xCD4181E9, + 0xE150210C, 0xE24EF1BD, 0xB168C381, 0xFDE4E789, 0x5C79B0D8, 0x1E8BFD43, + 0x4D495001, 0x38BE4341, 0x913CEE1D, 0x92A79C3F, 0x089766BE, 0xBAEEADF4, + 0x1286BECF, 0xB6EACB19, 0x2660C200, 0x7565BDE4, 0x64241F7A, 0x8248DCA9, + 0xC3B3AD66, 0x28136086, 0x0BD8DFA8, 0x356D1CF2, 0x107789BE, 0xB3B2E9CE, + 0x0502AA8F, 0x0BC0351E, 0x166BF52A, 0xEB12FF82, 0xE3486911, 0xD34D7516, + 0x4E7B3AFF, 0x5F43671B, 0x9CF6E037, 0x4981AC83, 0x334266CE, 0x8C9341B7, + 0xD0D854C0, 0xCB3A6C88, 0x47BC2829, 0x4725BA37, 0xA66AD22B, 0x7AD61F1E, + 0x0C5CBAFA, 0x4437F107, 0xB6E79962, 0x42D2D816, 0x0A961288, 0xE1A5C06E, + 0x13749E67, 0x72FC081A, 0xB1D139F7, 0xF9583745, 0xCF19DF58, 0xBEC3F756, + 0xC06EBA30, 0x07211B24, 0x45C28829, 0xC95E317F, 0xBC8EC511, 0x38BC46E9, + 0xC6E6FA14, 0xBAE8584A, 0xAD4EBC46, 0x468F508B, 0x7829435F, 0xF124183B, + 0x821DBA9F, 0xAFF60FF4, 0xEA2C4E6D, 0x16E39264, 0x92544A8B, 0x009B4FC3, + 0xABA68CED, 0x9AC96F78, 0x06A5B79A, 0xB2856E6E, 0x1AEC3CA9, 0xBE838688, + 0x0E0804E9, 0x55F1BE56, 0xE7E5363B, 0xB3A1F25D, 0xF7DEBB85, 0x61FE033C, + 0x16746233, 0x3C034C28, 0xDA6D0C74, 0x79AAC56C, 0x3CE4E1AD, 0x51F0C802, + 0x98F8F35A, 0x1626A49F, 0xEED82B29, 0x1D382FE3, 0x0C4FB99A, 0xBB325778, + 0x3EC6D97B, 0x6E77A6A9, 0xCB658B5C, 0xD45230C7, 0x2BD1408B, 0x60C03EB7, + 0xB9068D78, 0xA33754F4, 0xF430C87D, 0xC8A71302, 0xB96D8C32, 0xEBD4E7BE, + 0xBE8B9D2D, 0x7979FB06, 0xE7225308, 0x8B75CF77, 0x11EF8DA4, 0xE083C858, + 0x8D6B786F, 0x5A6317A6, 0xFA5CF7A0, 0x5DDA0033, 0xF28EBFB0, 0xF5B9C310, + 0xA0EAC280, 0x08B9767A, 0xA3D9D2B0, 0x79D34217, 0x021A718D, 0x9AC6336A, + 0x2711FD60, 0x438050E3, 0x069908A8, 0x3D7FEDC4, 0x826D2BEF, 0x4EEB8476, + 0x488DCF25, 0x36C9D566, 0x28E74E41, 0xC2610ACA, 0x3D49A9CF, 0xBAE3B9DF, + 0xB65F8DE6, 0x92AEAF64, 0x3AC7D5E6, 0x9EA80509, 0xF22B017D, 0xA4173F70, + 0xDD1E16C3, 0x15E0D7F9, 0x50B1B887, 0x2B9F4FD5, 0x625ABA82, 0x6A017962, + 0x2EC01B9C, 0x15488AA9, 0xD716E740, 0x40055A2C, 0x93D29A22, 0xE32DBF9A, + 0x058745B9, 0x3453DC1E, 0xD699296E, 0x496CFF6F, 0x1C9F4986, 0xDFE2ED07, + 0xB87242D1, 0x19DE7EAE, 0x053E561A, 0x15AD6F8C, 0x66626C1C, 0x7154C24C, + 0xEA082B2A, 0x93EB2939, 0x17DCB0F0, 0x58D4F2AE, 0x9EA294FB, 0x52CF564C, + 0x9883FE66, 0x2EC40581, 0x763953C3, 0x01D6692E, 0xD3A0C108, 0xA1E7160E, + 0xE4F2DFA6, 0x693ED285, 0x74904698, 0x4C2B0EDD, 0x4F757656, 0x5D393378, + 0xA132234F, 0x3D321C5D, 0xC3F5E194, 0x4B269301, 0xC79F022F, 0x3C997E7E, + 0x5E4F9504, 0x3FFAFBBD, 0x76F7AD0E, 0x296693F4, 0x3D1FCE6F, 0xC61E45BE, + 0xD3B5AB34, 0xF72BF9B7, 0x1B0434C0, 0x4E72B567, 0x5592A33D, 0xB5229301, + 0xCFD2A87F, 0x60AEB767, 0x1814386B, 0x30BCC33D, 0x38A0C07D, 0xFD1606F2, + 0xC363519B, 0x589DD390, 0x5479F8E6, 0x1CB8D647, 0x97FD61A9, 0xEA7759F4, + 0x2D57539D, 0x569A58CF, 0xE84E63AD, 0x462E1B78, 0x6580F87E, 0xF3817914, + 0x91DA55F4, 0x40A230F3, 0xD1988F35, 0xB6E318D2, 0x3FFA50BC, 0x3D40F021, + 0xC3C0BDAE, 0x4958C24C, 0x518F36B2, 0x84B1D370, 0x0FEDCE83, 0x878DDADA, + 0xF2A279C7, 0x94E01BE8, 0x90716F4B, 0x954B8AA3 }; + +const u32bit CAST_128::S8[256] = { + 0xE216300D, 0xBBDDFFFC, 0xA7EBDABD, 0x35648095, 0x7789F8B7, 0xE6C1121B, + 0x0E241600, 0x052CE8B5, 0x11A9CFB0, 0xE5952F11, 0xECE7990A, 0x9386D174, + 0x2A42931C, 0x76E38111, 0xB12DEF3A, 0x37DDDDFC, 0xDE9ADEB1, 0x0A0CC32C, + 0xBE197029, 0x84A00940, 0xBB243A0F, 0xB4D137CF, 0xB44E79F0, 0x049EEDFD, + 0x0B15A15D, 0x480D3168, 0x8BBBDE5A, 0x669DED42, 0xC7ECE831, 0x3F8F95E7, + 0x72DF191B, 0x7580330D, 0x94074251, 0x5C7DCDFA, 0xABBE6D63, 0xAA402164, + 0xB301D40A, 0x02E7D1CA, 0x53571DAE, 0x7A3182A2, 0x12A8DDEC, 0xFDAA335D, + 0x176F43E8, 0x71FB46D4, 0x38129022, 0xCE949AD4, 0xB84769AD, 0x965BD862, + 0x82F3D055, 0x66FB9767, 0x15B80B4E, 0x1D5B47A0, 0x4CFDE06F, 0xC28EC4B8, + 0x57E8726E, 0x647A78FC, 0x99865D44, 0x608BD593, 0x6C200E03, 0x39DC5FF6, + 0x5D0B00A3, 0xAE63AFF2, 0x7E8BD632, 0x70108C0C, 0xBBD35049, 0x2998DF04, + 0x980CF42A, 0x9B6DF491, 0x9E7EDD53, 0x06918548, 0x58CB7E07, 0x3B74EF2E, + 0x522FFFB1, 0xD24708CC, 0x1C7E27CD, 0xA4EB215B, 0x3CF1D2E2, 0x19B47A38, + 0x424F7618, 0x35856039, 0x9D17DEE7, 0x27EB35E6, 0xC9AFF67B, 0x36BAF5B8, + 0x09C467CD, 0xC18910B1, 0xE11DBF7B, 0x06CD1AF8, 0x7170C608, 0x2D5E3354, + 0xD4DE495A, 0x64C6D006, 0xBCC0C62C, 0x3DD00DB3, 0x708F8F34, 0x77D51B42, + 0x264F620F, 0x24B8D2BF, 0x15C1B79E, 0x46A52564, 0xF8D7E54E, 0x3E378160, + 0x7895CDA5, 0x859C15A5, 0xE6459788, 0xC37BC75F, 0xDB07BA0C, 0x0676A3AB, + 0x7F229B1E, 0x31842E7B, 0x24259FD7, 0xF8BEF472, 0x835FFCB8, 0x6DF4C1F2, + 0x96F5B195, 0xFD0AF0FC, 0xB0FE134C, 0xE2506D3D, 0x4F9B12EA, 0xF215F225, + 0xA223736F, 0x9FB4C428, 0x25D04979, 0x34C713F8, 0xC4618187, 0xEA7A6E98, + 0x7CD16EFC, 0x1436876C, 0xF1544107, 0xBEDEEE14, 0x56E9AF27, 0xA04AA441, + 0x3CF7C899, 0x92ECBAE6, 0xDD67016D, 0x151682EB, 0xA842EEDF, 0xFDBA60B4, + 0xF1907B75, 0x20E3030F, 0x24D8C29E, 0xE139673B, 0xEFA63FB8, 0x71873054, + 0xB6F2CF3B, 0x9F326442, 0xCB15A4CC, 0xB01A4504, 0xF1E47D8D, 0x844A1BE5, + 0xBAE7DFDC, 0x42CBDA70, 0xCD7DAE0A, 0x57E85B7A, 0xD53F5AF6, 0x20CF4D8C, + 0xCEA4D428, 0x79D130A4, 0x3486EBFB, 0x33D3CDDC, 0x77853B53, 0x37EFFCB5, + 0xC5068778, 0xE580B3E6, 0x4E68B8F4, 0xC5C8B37E, 0x0D809EA2, 0x398FEB7C, + 0x132A4F94, 0x43B7950E, 0x2FEE7D1C, 0x223613BD, 0xDD06CAA2, 0x37DF932B, + 0xC4248289, 0xACF3EBC3, 0x5715F6B7, 0xEF3478DD, 0xF267616F, 0xC148CBE4, + 0x9052815E, 0x5E410FAB, 0xB48A2465, 0x2EDA7FA4, 0xE87B40E4, 0xE98EA084, + 0x5889E9E1, 0xEFD390FC, 0xDD07D35B, 0xDB485694, 0x38D7E5B2, 0x57720101, + 0x730EDEBC, 0x5B643113, 0x94917E4F, 0x503C2FBA, 0x646F1282, 0x7523D24A, + 0xE0779695, 0xF9C17A8F, 0x7A5B2121, 0xD187B896, 0x29263A4D, 0xBA510CDF, + 0x81F47C9F, 0xAD1163ED, 0xEA7B5965, 0x1A00726E, 0x11403092, 0x00DA6D77, + 0x4A0CDD61, 0xAD1F4603, 0x605BDFB0, 0x9EEDC364, 0x22EBE6A8, 0xCEE7D28A, + 0xA0E736A0, 0x5564A6B9, 0x10853209, 0xC7EB8F37, 0x2DE705CA, 0x8951570F, + 0xDF09822B, 0xBD691A6C, 0xAA12E4F2, 0x87451C0F, 0xE0F6A27A, 0x3ADA4819, + 0x4CF1764F, 0x0D771C2B, 0x67CDB156, 0x350D8384, 0x5938FA0F, 0x42399EF3, + 0x36997B07, 0x0E84093D, 0x4AA93E61, 0x8360D87B, 0x1FA98B0C, 0x1149382C, + 0xE97625A5, 0x0614D1B7, 0x0E25244B, 0x0C768347, 0x589E8D82, 0x0D2059D1, + 0xA466BB1E, 0xF8DA0A82, 0x04F19130, 0xBA6E4EC0, 0x99265164, 0x1EE7230D, + 0x50B2AD80, 0xEAEE6801, 0x8DB2A283, 0xEA8BF59E }; + +const u32bit CAST_256::KEY_MASK[192] = { + 0x5A827999, 0xC95C653A, 0x383650DB, 0xA7103C7C, 0x15EA281D, 0x84C413BE, + 0xF39DFF5F, 0x6277EB00, 0xD151D6A1, 0x402BC242, 0xAF05ADE3, 0x1DDF9984, + 0x8CB98525, 0xFB9370C6, 0x6A6D5C67, 0xD9474808, 0x482133A9, 0xB6FB1F4A, + 0x25D50AEB, 0x94AEF68C, 0x0388E22D, 0x7262CDCE, 0xE13CB96F, 0x5016A510, + 0xBEF090B1, 0x2DCA7C52, 0x9CA467F3, 0x0B7E5394, 0x7A583F35, 0xE9322AD6, + 0x580C1677, 0xC6E60218, 0x35BFEDB9, 0xA499D95A, 0x1373C4FB, 0x824DB09C, + 0xF1279C3D, 0x600187DE, 0xCEDB737F, 0x3DB55F20, 0xAC8F4AC1, 0x1B693662, + 0x8A432203, 0xF91D0DA4, 0x67F6F945, 0xD6D0E4E6, 0x45AAD087, 0xB484BC28, + 0x235EA7C9, 0x9238936A, 0x01127F0B, 0x6FEC6AAC, 0xDEC6564D, 0x4DA041EE, + 0xBC7A2D8F, 0x2B541930, 0x9A2E04D1, 0x0907F072, 0x77E1DC13, 0xE6BBC7B4, + 0x5595B355, 0xC46F9EF6, 0x33498A97, 0xA2237638, 0x10FD61D9, 0x7FD74D7A, + 0xEEB1391B, 0x5D8B24BC, 0xCC65105D, 0x3B3EFBFE, 0xAA18E79F, 0x18F2D340, + 0x87CCBEE1, 0xF6A6AA82, 0x65809623, 0xD45A81C4, 0x43346D65, 0xB20E5906, + 0x20E844A7, 0x8FC23048, 0xFE9C1BE9, 0x6D76078A, 0xDC4FF32B, 0x4B29DECC, + 0xBA03CA6D, 0x28DDB60E, 0x97B7A1AF, 0x06918D50, 0x756B78F1, 0xE4456492, + 0x531F5033, 0xC1F93BD4, 0x30D32775, 0x9FAD1316, 0x0E86FEB7, 0x7D60EA58, + 0xEC3AD5F9, 0x5B14C19A, 0xC9EEAD3B, 0x38C898DC, 0xA7A2847D, 0x167C701E, + 0x85565BBF, 0xF4304760, 0x630A3301, 0xD1E41EA2, 0x40BE0A43, 0xAF97F5E4, + 0x1E71E185, 0x8D4BCD26, 0xFC25B8C7, 0x6AFFA468, 0xD9D99009, 0x48B37BAA, + 0xB78D674B, 0x266752EC, 0x95413E8D, 0x041B2A2E, 0x72F515CF, 0xE1CF0170, + 0x50A8ED11, 0xBF82D8B2, 0x2E5CC453, 0x9D36AFF4, 0x0C109B95, 0x7AEA8736, + 0xE9C472D7, 0x589E5E78, 0xC7784A19, 0x365235BA, 0xA52C215B, 0x14060CFC, + 0x82DFF89D, 0xF1B9E43E, 0x6093CFDF, 0xCF6DBB80, 0x3E47A721, 0xAD2192C2, + 0x1BFB7E63, 0x8AD56A04, 0xF9AF55A5, 0x68894146, 0xD7632CE7, 0x463D1888, + 0xB5170429, 0x23F0EFCA, 0x92CADB6B, 0x01A4C70C, 0x707EB2AD, 0xDF589E4E, + 0x4E3289EF, 0xBD0C7590, 0x2BE66131, 0x9AC04CD2, 0x099A3873, 0x78742414, + 0xE74E0FB5, 0x5627FB56, 0xC501E6F7, 0x33DBD298, 0xA2B5BE39, 0x118FA9DA, + 0x8069957B, 0xEF43811C, 0x5E1D6CBD, 0xCCF7585E, 0x3BD143FF, 0xAAAB2FA0, + 0x19851B41, 0x885F06E2, 0xF738F283, 0x6612DE24, 0xD4ECC9C5, 0x43C6B566, + 0xB2A0A107, 0x217A8CA8, 0x90547849, 0xFF2E63EA, 0x6E084F8B, 0xDCE23B2C, + 0x4BBC26CD, 0xBA96126E, 0x296FFE0F, 0x9849E9B0, 0x0723D551, 0x75FDC0F2, + 0xE4D7AC93, 0x53B19834, 0xC28B83D5, 0x31656F76, 0xA03F5B17, 0x0F1946B8 }; + +const byte CAST_256::KEY_ROT[32] = { + 0x13, 0x04, 0x15, 0x06, 0x17, 0x08, 0x19, 0x0A, 0x1B, 0x0C, 0x1D, 0x0E, + 0x1F, 0x10, 0x01, 0x12, 0x03, 0x14, 0x05, 0x16, 0x07, 0x18, 0x09, 0x1A, + 0x0B, 0x1C, 0x0D, 0x1E, 0x0F, 0x00, 0x11, 0x02 }; + +} diff --git a/src/libs/3rdparty/botan/src/block/cast/info.txt b/src/libs/3rdparty/botan/src/block/cast/info.txt new file mode 100644 index 00000000000..73d3f900f71 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/cast/info.txt @@ -0,0 +1,13 @@ +realname "CAST" + +define CAST + +load_on auto + + +cast128.cpp +cast128.h +cast256.cpp +cast256.h +cast_tab.cpp + diff --git a/src/libs/3rdparty/botan/src/block/des/des.cpp b/src/libs/3rdparty/botan/src/block/des/des.cpp new file mode 100644 index 00000000000..37520e0fca5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/des/des.cpp @@ -0,0 +1,265 @@ +/* +* DES +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace { + +/* +* DES Key Schedule +*/ +void des_key_schedule(u32bit round_key[32], const byte key[8]) + { + static const byte ROT[16] = { 1, 1, 2, 2, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 2, 2, 1 }; + + u32bit C = ((key[7] & 0x80) << 20) | ((key[6] & 0x80) << 19) | + ((key[5] & 0x80) << 18) | ((key[4] & 0x80) << 17) | + ((key[3] & 0x80) << 16) | ((key[2] & 0x80) << 15) | + ((key[1] & 0x80) << 14) | ((key[0] & 0x80) << 13) | + ((key[7] & 0x40) << 13) | ((key[6] & 0x40) << 12) | + ((key[5] & 0x40) << 11) | ((key[4] & 0x40) << 10) | + ((key[3] & 0x40) << 9) | ((key[2] & 0x40) << 8) | + ((key[1] & 0x40) << 7) | ((key[0] & 0x40) << 6) | + ((key[7] & 0x20) << 6) | ((key[6] & 0x20) << 5) | + ((key[5] & 0x20) << 4) | ((key[4] & 0x20) << 3) | + ((key[3] & 0x20) << 2) | ((key[2] & 0x20) << 1) | + ((key[1] & 0x20) ) | ((key[0] & 0x20) >> 1) | + ((key[7] & 0x10) >> 1) | ((key[6] & 0x10) >> 2) | + ((key[5] & 0x10) >> 3) | ((key[4] & 0x10) >> 4); + u32bit D = ((key[7] & 0x02) << 26) | ((key[6] & 0x02) << 25) | + ((key[5] & 0x02) << 24) | ((key[4] & 0x02) << 23) | + ((key[3] & 0x02) << 22) | ((key[2] & 0x02) << 21) | + ((key[1] & 0x02) << 20) | ((key[0] & 0x02) << 19) | + ((key[7] & 0x04) << 17) | ((key[6] & 0x04) << 16) | + ((key[5] & 0x04) << 15) | ((key[4] & 0x04) << 14) | + ((key[3] & 0x04) << 13) | ((key[2] & 0x04) << 12) | + ((key[1] & 0x04) << 11) | ((key[0] & 0x04) << 10) | + ((key[7] & 0x08) << 8) | ((key[6] & 0x08) << 7) | + ((key[5] & 0x08) << 6) | ((key[4] & 0x08) << 5) | + ((key[3] & 0x08) << 4) | ((key[2] & 0x08) << 3) | + ((key[1] & 0x08) << 2) | ((key[0] & 0x08) << 1) | + ((key[3] & 0x10) >> 1) | ((key[2] & 0x10) >> 2) | + ((key[1] & 0x10) >> 3) | ((key[0] & 0x10) >> 4); + + for(u32bit j = 0; j != 16; ++j) + { + C = ((C << ROT[j]) | (C >> (28-ROT[j]))) & 0x0FFFFFFF; + D = ((D << ROT[j]) | (D >> (28-ROT[j]))) & 0x0FFFFFFF; + round_key[2*j ] = ((C & 0x00000010) << 22) | ((C & 0x00000800) << 17) | + ((C & 0x00000020) << 16) | ((C & 0x00004004) << 15) | + ((C & 0x00000200) << 11) | ((C & 0x00020000) << 10) | + ((C & 0x01000000) >> 6) | ((C & 0x00100000) >> 4) | + ((C & 0x00010000) << 3) | ((C & 0x08000000) >> 2) | + ((C & 0x00800000) << 1) | ((D & 0x00000010) << 8) | + ((D & 0x00000002) << 7) | ((D & 0x00000001) << 2) | + ((D & 0x00000200) ) | ((D & 0x00008000) >> 2) | + ((D & 0x00000088) >> 3) | ((D & 0x00001000) >> 7) | + ((D & 0x00080000) >> 9) | ((D & 0x02020000) >> 14) | + ((D & 0x00400000) >> 21); + round_key[2*j+1] = ((C & 0x00000001) << 28) | ((C & 0x00000082) << 18) | + ((C & 0x00002000) << 14) | ((C & 0x00000100) << 10) | + ((C & 0x00001000) << 9) | ((C & 0x00040000) << 6) | + ((C & 0x02400000) << 4) | ((C & 0x00008000) << 2) | + ((C & 0x00200000) >> 1) | ((C & 0x04000000) >> 10) | + ((D & 0x00000020) << 6) | ((D & 0x00000100) ) | + ((D & 0x00000800) >> 1) | ((D & 0x00000040) >> 3) | + ((D & 0x00010000) >> 4) | ((D & 0x00000400) >> 5) | + ((D & 0x00004000) >> 10) | ((D & 0x04000000) >> 13) | + ((D & 0x00800000) >> 14) | ((D & 0x00100000) >> 18) | + ((D & 0x01000000) >> 24) | ((D & 0x08000000) >> 26); + } + } + +/* +* DES Encryption +*/ +void des_encrypt(u32bit& L, u32bit& R, + const u32bit round_key[32]) + { + for(u32bit j = 0; j != 16; j += 2) + { + u32bit T0, T1; + + T0 = rotate_right(R, 4) ^ round_key[2*j]; + T1 = R ^ round_key[2*j + 1]; + + L ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ + DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ + DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ + DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; + + T0 = rotate_right(L, 4) ^ round_key[2*j + 2]; + T1 = L ^ round_key[2*j + 3]; + + R ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ + DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ + DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ + DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; + } + } + +/* +* DES Decryption +*/ +void des_decrypt(u32bit& L, u32bit& R, + const u32bit round_key[32]) + { + for(u32bit j = 16; j != 0; j -= 2) + { + u32bit T0, T1; + + T0 = rotate_right(R, 4) ^ round_key[2*j - 2]; + T1 = R ^ round_key[2*j - 1]; + + L ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ + DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ + DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ + DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; + + T0 = rotate_right(L, 4) ^ round_key[2*j - 4]; + T1 = L ^ round_key[2*j - 3]; + + R ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ + DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ + DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ + DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; + } + } + +} + +/* +* DES Encryption +*/ +void DES::enc(const byte in[], byte out[]) const + { + u64bit T = (DES_IPTAB1[in[0]] ) | (DES_IPTAB1[in[1]] << 1) | + (DES_IPTAB1[in[2]] << 2) | (DES_IPTAB1[in[3]] << 3) | + (DES_IPTAB1[in[4]] << 4) | (DES_IPTAB1[in[5]] << 5) | + (DES_IPTAB1[in[6]] << 6) | (DES_IPTAB2[in[7]] ); + + u32bit L = static_cast(T >> 32); + u32bit R = static_cast(T); + + des_encrypt(L, R, round_key); + + T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | + (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | + (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | + (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); + + T = rotate_left(T, 32); + + store_be(T, out); + } + +/* +* DES Decryption +*/ +void DES::dec(const byte in[], byte out[]) const + { + u64bit T = (DES_IPTAB1[in[0]] ) | (DES_IPTAB1[in[1]] << 1) | + (DES_IPTAB1[in[2]] << 2) | (DES_IPTAB1[in[3]] << 3) | + (DES_IPTAB1[in[4]] << 4) | (DES_IPTAB1[in[5]] << 5) | + (DES_IPTAB1[in[6]] << 6) | (DES_IPTAB2[in[7]] ); + + u32bit L = static_cast(T >> 32); + u32bit R = static_cast(T); + + des_decrypt(L, R, round_key); + + T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | + (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | + (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | + (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); + + T = rotate_left(T, 32); + + store_be(T, out); + } + +/* +* DES Key Schedule +*/ +void DES::key_schedule(const byte key[], u32bit) + { + des_key_schedule(round_key.begin(), key); + } + +/* +* TripleDES Encryption +*/ +void TripleDES::enc(const byte in[], byte out[]) const + { + u64bit T = (DES_IPTAB1[in[0]] ) | (DES_IPTAB1[in[1]] << 1) | + (DES_IPTAB1[in[2]] << 2) | (DES_IPTAB1[in[3]] << 3) | + (DES_IPTAB1[in[4]] << 4) | (DES_IPTAB1[in[5]] << 5) | + (DES_IPTAB1[in[6]] << 6) | (DES_IPTAB2[in[7]] ); + + u32bit L = static_cast(T >> 32); + u32bit R = static_cast(T); + + des_encrypt(L, R, round_key); + des_decrypt(R, L, round_key + 32); + des_encrypt(L, R, round_key + 64); + + T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | + (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | + (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | + (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); + + T = rotate_left(T, 32); + + store_be(T, out); + } + +/* +* TripleDES Decryption +*/ +void TripleDES::dec(const byte in[], byte out[]) const + { + u64bit T = (DES_IPTAB1[in[0]] ) | (DES_IPTAB1[in[1]] << 1) | + (DES_IPTAB1[in[2]] << 2) | (DES_IPTAB1[in[3]] << 3) | + (DES_IPTAB1[in[4]] << 4) | (DES_IPTAB1[in[5]] << 5) | + (DES_IPTAB1[in[6]] << 6) | (DES_IPTAB2[in[7]] ); + + u32bit L = static_cast(T >> 32); + u32bit R = static_cast(T); + + des_decrypt(L, R, round_key + 64); + des_encrypt(R, L, round_key + 32); + des_decrypt(L, R, round_key); + + T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | + (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | + (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | + (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); + + T = rotate_left(T, 32); + + store_be(T, out); + } + +/* +* TripleDES Key Schedule +*/ +void TripleDES::key_schedule(const byte key[], u32bit length) + { + des_key_schedule(&round_key[0], key); + des_key_schedule(&round_key[32], key + 8); + + if(length == 24) + des_key_schedule(&round_key[64], key + 16); + else + copy_mem(&round_key[64], round_key.begin(), 32); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/des/des.h b/src/libs/3rdparty/botan/src/block/des/des.h new file mode 100644 index 00000000000..6fa59de5e06 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/des/des.h @@ -0,0 +1,70 @@ +/* +* DES +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DES_H__ +#define BOTAN_DES_H__ + +#include + +namespace Botan { + +/* +* DES +*/ +class BOTAN_DLL DES : public BlockCipher + { + public: + void clear() throw() { round_key.clear(); } + std::string name() const { return "DES"; } + BlockCipher* clone() const { return new DES; } + DES() : BlockCipher(8, 8) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + SecureBuffer round_key; + }; + +/* +* Triple DES +*/ +class BOTAN_DLL TripleDES : public BlockCipher + { + public: + void clear() throw() { round_key.clear(); } + std::string name() const { return "TripleDES"; } + BlockCipher* clone() const { return new TripleDES; } + TripleDES() : BlockCipher(8, 16, 24, 8) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + SecureBuffer round_key; + }; + +/* +* DES Tables +*/ +extern const u32bit DES_SPBOX1[256]; +extern const u32bit DES_SPBOX2[256]; +extern const u32bit DES_SPBOX3[256]; +extern const u32bit DES_SPBOX4[256]; +extern const u32bit DES_SPBOX5[256]; +extern const u32bit DES_SPBOX6[256]; +extern const u32bit DES_SPBOX7[256]; +extern const u32bit DES_SPBOX8[256]; + +extern const u64bit DES_IPTAB1[256]; +extern const u64bit DES_IPTAB2[256]; +extern const u64bit DES_FPTAB1[256]; +extern const u64bit DES_FPTAB2[256]; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/des/des_tab.cpp b/src/libs/3rdparty/botan/src/block/des/des_tab.cpp new file mode 100644 index 00000000000..b46ca30630a --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/des/des_tab.cpp @@ -0,0 +1,636 @@ +/* +* Substitution/Permutation Tables for DES +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +const u32bit DES_SPBOX1[256] = { + 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, + 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, + 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, + 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, + 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, + 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, + 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, + 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, + 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, + 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, + 0x00010004, 0x00010400, 0x00000000, 0x01010004, 0x01010400, 0x00000000, + 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, + 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, + 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, + 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, + 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, + 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, + 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, + 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, + 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, + 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, + 0x00000000, 0x01010004, 0x01010400, 0x00000000, 0x00010000, 0x01010404, + 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, + 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, + 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, + 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, + 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, + 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, + 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, + 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, + 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, + 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004, + 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, + 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, + 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, + 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, + 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, + 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, + 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, + 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, + 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, + 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, + 0x00010004, 0x00010400, 0x00000000, 0x01010004 }; + +const u32bit DES_SPBOX2[256] = { + 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, + 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, + 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, + 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, + 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, + 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, + 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, + 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, + 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, + 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, + 0x80000000, 0x80100020, 0x80108020, 0x00108000, 0x80108020, 0x80008000, + 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, + 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, + 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, + 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, + 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, + 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, + 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, + 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, + 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, + 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, + 0x80108020, 0x00108000, 0x80108020, 0x80008000, 0x00008000, 0x00108020, + 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, + 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, + 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, + 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, + 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, + 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, + 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, + 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, + 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, + 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000, + 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, + 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, + 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, + 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, + 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, + 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, + 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, + 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, + 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, + 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, + 0x80000000, 0x80100020, 0x80108020, 0x00108000 }; + +const u32bit DES_SPBOX3[256] = { + 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, + 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, + 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, + 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, + 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, + 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, + 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, + 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, + 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, + 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, + 0x00020208, 0x00000008, 0x08020008, 0x00020200, 0x00000208, 0x08020200, + 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, + 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, + 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, + 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, + 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, + 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, + 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, + 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, + 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, + 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, + 0x08020008, 0x00020200, 0x00000208, 0x08020200, 0x00000000, 0x08020008, + 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, + 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, + 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, + 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, + 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, + 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, + 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, + 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, + 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, + 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200, + 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, + 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, + 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, + 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, + 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, + 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, + 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, + 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, + 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, + 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, + 0x00020208, 0x00000008, 0x08020008, 0x00020200 }; + +const u32bit DES_SPBOX4[256] = { + 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, + 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, + 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, + 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, + 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, + 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, + 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, + 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, + 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, + 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, + 0x00000080, 0x00800000, 0x00002000, 0x00802080, 0x00802001, 0x00002081, + 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, + 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, + 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, + 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, + 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, + 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, + 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, + 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, + 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, + 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, + 0x00002000, 0x00802080, 0x00802001, 0x00002081, 0x00002081, 0x00000080, + 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, + 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, + 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, + 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, + 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, + 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, + 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, + 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, + 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, + 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080, + 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, + 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, + 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, + 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, + 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, + 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, + 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, + 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, + 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, + 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, + 0x00000080, 0x00800000, 0x00002000, 0x00802080 }; + +const u32bit DES_SPBOX5[256] = { + 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, + 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, + 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, + 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, + 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, + 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, + 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, + 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, + 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, + 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, + 0x00000000, 0x40080000, 0x02080100, 0x40000100, 0x00000100, 0x02080100, + 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, + 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, + 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, + 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, + 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, + 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, + 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, + 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, + 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, + 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, + 0x02080100, 0x40000100, 0x00000100, 0x02080100, 0x02080000, 0x42000100, + 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, + 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, + 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, + 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, + 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, + 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, + 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, + 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, + 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, + 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100, + 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, + 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, + 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, + 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, + 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, + 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, + 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, + 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, + 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, + 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, + 0x00000000, 0x40080000, 0x02080100, 0x40000100 }; + +const u32bit DES_SPBOX6[256] = { + 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, + 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, + 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, + 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, + 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, + 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, + 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, + 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, + 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, + 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, + 0x20404000, 0x20000000, 0x00400010, 0x20004010, 0x20000010, 0x20400000, + 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, + 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, + 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, + 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, + 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, + 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, + 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, + 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, + 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, + 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, + 0x00400010, 0x20004010, 0x20000010, 0x20400000, 0x00004000, 0x20404010, + 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, + 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, + 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, + 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, + 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, + 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, + 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, + 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, + 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, + 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010, + 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, + 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, + 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, + 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, + 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, + 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, + 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, + 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, + 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, + 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, + 0x20404000, 0x20000000, 0x00400010, 0x20004010 }; + +const u32bit DES_SPBOX7[256] = { + 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, + 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, + 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, + 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, + 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, + 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, + 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, + 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, + 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, + 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, + 0x04000002, 0x04000800, 0x00000800, 0x00200002, 0x00200000, 0x04200002, + 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, + 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, + 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, + 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, + 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, + 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, + 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, + 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, + 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, + 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, + 0x00000800, 0x00200002, 0x00200000, 0x04200002, 0x04000802, 0x00000000, + 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, + 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, + 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, + 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, + 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, + 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, + 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, + 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, + 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, + 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002, + 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, + 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, + 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, + 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, + 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, + 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, + 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, + 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, + 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, + 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, + 0x04000002, 0x04000800, 0x00000800, 0x00200002 }; + +const u32bit DES_SPBOX8[256] = { + 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, + 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, + 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, + 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, + 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, + 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, + 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, + 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, + 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, + 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, + 0x00001040, 0x00040040, 0x10000000, 0x10041000, 0x10001040, 0x00001000, + 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, + 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, + 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, + 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, + 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, + 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, + 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, + 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, + 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, + 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, + 0x10000000, 0x10041000, 0x10001040, 0x00001000, 0x00040000, 0x10041040, + 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, + 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, + 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, + 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, + 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, + 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, + 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, + 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, + 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, + 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000, + 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, + 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, + 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, + 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, + 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, + 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, + 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, + 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, + 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, + 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, + 0x00001040, 0x00040040, 0x10000000, 0x10041000 }; + +const u64bit DES_IPTAB1[256] = { +0x0000000000000000, 0x0000000200000000, 0x0000000000000002, 0x0000000200000002, +0x0000020000000000, 0x0000020200000000, 0x0000020000000002, 0x0000020200000002, +0x0000000000000200, 0x0000000200000200, 0x0000000000000202, 0x0000000200000202, +0x0000020000000200, 0x0000020200000200, 0x0000020000000202, 0x0000020200000202, +0x0002000000000000, 0x0002000200000000, 0x0002000000000002, 0x0002000200000002, +0x0002020000000000, 0x0002020200000000, 0x0002020000000002, 0x0002020200000002, +0x0002000000000200, 0x0002000200000200, 0x0002000000000202, 0x0002000200000202, +0x0002020000000200, 0x0002020200000200, 0x0002020000000202, 0x0002020200000202, +0x0000000000020000, 0x0000000200020000, 0x0000000000020002, 0x0000000200020002, +0x0000020000020000, 0x0000020200020000, 0x0000020000020002, 0x0000020200020002, +0x0000000000020200, 0x0000000200020200, 0x0000000000020202, 0x0000000200020202, +0x0000020000020200, 0x0000020200020200, 0x0000020000020202, 0x0000020200020202, +0x0002000000020000, 0x0002000200020000, 0x0002000000020002, 0x0002000200020002, +0x0002020000020000, 0x0002020200020000, 0x0002020000020002, 0x0002020200020002, +0x0002000000020200, 0x0002000200020200, 0x0002000000020202, 0x0002000200020202, +0x0002020000020200, 0x0002020200020200, 0x0002020000020202, 0x0002020200020202, +0x0200000000000000, 0x0200000200000000, 0x0200000000000002, 0x0200000200000002, +0x0200020000000000, 0x0200020200000000, 0x0200020000000002, 0x0200020200000002, +0x0200000000000200, 0x0200000200000200, 0x0200000000000202, 0x0200000200000202, +0x0200020000000200, 0x0200020200000200, 0x0200020000000202, 0x0200020200000202, +0x0202000000000000, 0x0202000200000000, 0x0202000000000002, 0x0202000200000002, +0x0202020000000000, 0x0202020200000000, 0x0202020000000002, 0x0202020200000002, +0x0202000000000200, 0x0202000200000200, 0x0202000000000202, 0x0202000200000202, +0x0202020000000200, 0x0202020200000200, 0x0202020000000202, 0x0202020200000202, +0x0200000000020000, 0x0200000200020000, 0x0200000000020002, 0x0200000200020002, +0x0200020000020000, 0x0200020200020000, 0x0200020000020002, 0x0200020200020002, +0x0200000000020200, 0x0200000200020200, 0x0200000000020202, 0x0200000200020202, +0x0200020000020200, 0x0200020200020200, 0x0200020000020202, 0x0200020200020202, +0x0202000000020000, 0x0202000200020000, 0x0202000000020002, 0x0202000200020002, +0x0202020000020000, 0x0202020200020000, 0x0202020000020002, 0x0202020200020002, +0x0202000000020200, 0x0202000200020200, 0x0202000000020202, 0x0202000200020202, +0x0202020000020200, 0x0202020200020200, 0x0202020000020202, 0x0202020200020202, +0x0000000002000000, 0x0000000202000000, 0x0000000002000002, 0x0000000202000002, +0x0000020002000000, 0x0000020202000000, 0x0000020002000002, 0x0000020202000002, +0x0000000002000200, 0x0000000202000200, 0x0000000002000202, 0x0000000202000202, +0x0000020002000200, 0x0000020202000200, 0x0000020002000202, 0x0000020202000202, +0x0002000002000000, 0x0002000202000000, 0x0002000002000002, 0x0002000202000002, +0x0002020002000000, 0x0002020202000000, 0x0002020002000002, 0x0002020202000002, +0x0002000002000200, 0x0002000202000200, 0x0002000002000202, 0x0002000202000202, +0x0002020002000200, 0x0002020202000200, 0x0002020002000202, 0x0002020202000202, +0x0000000002020000, 0x0000000202020000, 0x0000000002020002, 0x0000000202020002, +0x0000020002020000, 0x0000020202020000, 0x0000020002020002, 0x0000020202020002, +0x0000000002020200, 0x0000000202020200, 0x0000000002020202, 0x0000000202020202, +0x0000020002020200, 0x0000020202020200, 0x0000020002020202, 0x0000020202020202, +0x0002000002020000, 0x0002000202020000, 0x0002000002020002, 0x0002000202020002, +0x0002020002020000, 0x0002020202020000, 0x0002020002020002, 0x0002020202020002, +0x0002000002020200, 0x0002000202020200, 0x0002000002020202, 0x0002000202020202, +0x0002020002020200, 0x0002020202020200, 0x0002020002020202, 0x0002020202020202, +0x0200000002000000, 0x0200000202000000, 0x0200000002000002, 0x0200000202000002, +0x0200020002000000, 0x0200020202000000, 0x0200020002000002, 0x0200020202000002, +0x0200000002000200, 0x0200000202000200, 0x0200000002000202, 0x0200000202000202, +0x0200020002000200, 0x0200020202000200, 0x0200020002000202, 0x0200020202000202, +0x0202000002000000, 0x0202000202000000, 0x0202000002000002, 0x0202000202000002, +0x0202020002000000, 0x0202020202000000, 0x0202020002000002, 0x0202020202000002, +0x0202000002000200, 0x0202000202000200, 0x0202000002000202, 0x0202000202000202, +0x0202020002000200, 0x0202020202000200, 0x0202020002000202, 0x0202020202000202, +0x0200000002020000, 0x0200000202020000, 0x0200000002020002, 0x0200000202020002, +0x0200020002020000, 0x0200020202020000, 0x0200020002020002, 0x0200020202020002, +0x0200000002020200, 0x0200000202020200, 0x0200000002020202, 0x0200000202020202, +0x0200020002020200, 0x0200020202020200, 0x0200020002020202, 0x0200020202020202, +0x0202000002020000, 0x0202000202020000, 0x0202000002020002, 0x0202000202020002, +0x0202020002020000, 0x0202020202020000, 0x0202020002020002, 0x0202020202020002, +0x0202000002020200, 0x0202000202020200, 0x0202000002020202, 0x0202000202020202, +0x0202020002020200, 0x0202020202020200, 0x0202020002020202, 0x0202020202020202 }; + +const u64bit DES_IPTAB2[256] = { +0x0000000000000000, 0x0000010000000000, 0x0000000000000100, 0x0000010000000100, +0x0001000000000000, 0x0001010000000000, 0x0001000000000100, 0x0001010000000100, +0x0000000000010000, 0x0000010000010000, 0x0000000000010100, 0x0000010000010100, +0x0001000000010000, 0x0001010000010000, 0x0001000000010100, 0x0001010000010100, +0x0100000000000000, 0x0100010000000000, 0x0100000000000100, 0x0100010000000100, +0x0101000000000000, 0x0101010000000000, 0x0101000000000100, 0x0101010000000100, +0x0100000000010000, 0x0100010000010000, 0x0100000000010100, 0x0100010000010100, +0x0101000000010000, 0x0101010000010000, 0x0101000000010100, 0x0101010000010100, +0x0000000001000000, 0x0000010001000000, 0x0000000001000100, 0x0000010001000100, +0x0001000001000000, 0x0001010001000000, 0x0001000001000100, 0x0001010001000100, +0x0000000001010000, 0x0000010001010000, 0x0000000001010100, 0x0000010001010100, +0x0001000001010000, 0x0001010001010000, 0x0001000001010100, 0x0001010001010100, +0x0100000001000000, 0x0100010001000000, 0x0100000001000100, 0x0100010001000100, +0x0101000001000000, 0x0101010001000000, 0x0101000001000100, 0x0101010001000100, +0x0100000001010000, 0x0100010001010000, 0x0100000001010100, 0x0100010001010100, +0x0101000001010000, 0x0101010001010000, 0x0101000001010100, 0x0101010001010100, +0x0000000100000000, 0x0000010100000000, 0x0000000100000100, 0x0000010100000100, +0x0001000100000000, 0x0001010100000000, 0x0001000100000100, 0x0001010100000100, +0x0000000100010000, 0x0000010100010000, 0x0000000100010100, 0x0000010100010100, +0x0001000100010000, 0x0001010100010000, 0x0001000100010100, 0x0001010100010100, +0x0100000100000000, 0x0100010100000000, 0x0100000100000100, 0x0100010100000100, +0x0101000100000000, 0x0101010100000000, 0x0101000100000100, 0x0101010100000100, +0x0100000100010000, 0x0100010100010000, 0x0100000100010100, 0x0100010100010100, +0x0101000100010000, 0x0101010100010000, 0x0101000100010100, 0x0101010100010100, +0x0000000101000000, 0x0000010101000000, 0x0000000101000100, 0x0000010101000100, +0x0001000101000000, 0x0001010101000000, 0x0001000101000100, 0x0001010101000100, +0x0000000101010000, 0x0000010101010000, 0x0000000101010100, 0x0000010101010100, +0x0001000101010000, 0x0001010101010000, 0x0001000101010100, 0x0001010101010100, +0x0100000101000000, 0x0100010101000000, 0x0100000101000100, 0x0100010101000100, +0x0101000101000000, 0x0101010101000000, 0x0101000101000100, 0x0101010101000100, +0x0100000101010000, 0x0100010101010000, 0x0100000101010100, 0x0100010101010100, +0x0101000101010000, 0x0101010101010000, 0x0101000101010100, 0x0101010101010100, +0x0000000000000001, 0x0000010000000001, 0x0000000000000101, 0x0000010000000101, +0x0001000000000001, 0x0001010000000001, 0x0001000000000101, 0x0001010000000101, +0x0000000000010001, 0x0000010000010001, 0x0000000000010101, 0x0000010000010101, +0x0001000000010001, 0x0001010000010001, 0x0001000000010101, 0x0001010000010101, +0x0100000000000001, 0x0100010000000001, 0x0100000000000101, 0x0100010000000101, +0x0101000000000001, 0x0101010000000001, 0x0101000000000101, 0x0101010000000101, +0x0100000000010001, 0x0100010000010001, 0x0100000000010101, 0x0100010000010101, +0x0101000000010001, 0x0101010000010001, 0x0101000000010101, 0x0101010000010101, +0x0000000001000001, 0x0000010001000001, 0x0000000001000101, 0x0000010001000101, +0x0001000001000001, 0x0001010001000001, 0x0001000001000101, 0x0001010001000101, +0x0000000001010001, 0x0000010001010001, 0x0000000001010101, 0x0000010001010101, +0x0001000001010001, 0x0001010001010001, 0x0001000001010101, 0x0001010001010101, +0x0100000001000001, 0x0100010001000001, 0x0100000001000101, 0x0100010001000101, +0x0101000001000001, 0x0101010001000001, 0x0101000001000101, 0x0101010001000101, +0x0100000001010001, 0x0100010001010001, 0x0100000001010101, 0x0100010001010101, +0x0101000001010001, 0x0101010001010001, 0x0101000001010101, 0x0101010001010101, +0x0000000100000001, 0x0000010100000001, 0x0000000100000101, 0x0000010100000101, +0x0001000100000001, 0x0001010100000001, 0x0001000100000101, 0x0001010100000101, +0x0000000100010001, 0x0000010100010001, 0x0000000100010101, 0x0000010100010101, +0x0001000100010001, 0x0001010100010001, 0x0001000100010101, 0x0001010100010101, +0x0100000100000001, 0x0100010100000001, 0x0100000100000101, 0x0100010100000101, +0x0101000100000001, 0x0101010100000001, 0x0101000100000101, 0x0101010100000101, +0x0100000100010001, 0x0100010100010001, 0x0100000100010101, 0x0100010100010101, +0x0101000100010001, 0x0101010100010001, 0x0101000100010101, 0x0101010100010101, +0x0000000101000001, 0x0000010101000001, 0x0000000101000101, 0x0000010101000101, +0x0001000101000001, 0x0001010101000001, 0x0001000101000101, 0x0001010101000101, +0x0000000101010001, 0x0000010101010001, 0x0000000101010101, 0x0000010101010101, +0x0001000101010001, 0x0001010101010001, 0x0001000101010101, 0x0001010101010101, +0x0100000101000001, 0x0100010101000001, 0x0100000101000101, 0x0100010101000101, +0x0101000101000001, 0x0101010101000001, 0x0101000101000101, 0x0101010101000101, +0x0100000101010001, 0x0100010101010001, 0x0100000101010101, 0x0100010101010101, +0x0101000101010001, 0x0101010101010001, 0x0101000101010101, 0x0101010101010101 }; + +const u64bit DES_FPTAB1[256] = { +0x0000000000000000, 0x0000000100000000, 0x0000000004000000, 0x0000000104000000, +0x0000000000040000, 0x0000000100040000, 0x0000000004040000, 0x0000000104040000, +0x0000000000000400, 0x0000000100000400, 0x0000000004000400, 0x0000000104000400, +0x0000000000040400, 0x0000000100040400, 0x0000000004040400, 0x0000000104040400, +0x0000000000000004, 0x0000000100000004, 0x0000000004000004, 0x0000000104000004, +0x0000000000040004, 0x0000000100040004, 0x0000000004040004, 0x0000000104040004, +0x0000000000000404, 0x0000000100000404, 0x0000000004000404, 0x0000000104000404, +0x0000000000040404, 0x0000000100040404, 0x0000000004040404, 0x0000000104040404, +0x0400000000000000, 0x0400000100000000, 0x0400000004000000, 0x0400000104000000, +0x0400000000040000, 0x0400000100040000, 0x0400000004040000, 0x0400000104040000, +0x0400000000000400, 0x0400000100000400, 0x0400000004000400, 0x0400000104000400, +0x0400000000040400, 0x0400000100040400, 0x0400000004040400, 0x0400000104040400, +0x0400000000000004, 0x0400000100000004, 0x0400000004000004, 0x0400000104000004, +0x0400000000040004, 0x0400000100040004, 0x0400000004040004, 0x0400000104040004, +0x0400000000000404, 0x0400000100000404, 0x0400000004000404, 0x0400000104000404, +0x0400000000040404, 0x0400000100040404, 0x0400000004040404, 0x0400000104040404, +0x0004000000000000, 0x0004000100000000, 0x0004000004000000, 0x0004000104000000, +0x0004000000040000, 0x0004000100040000, 0x0004000004040000, 0x0004000104040000, +0x0004000000000400, 0x0004000100000400, 0x0004000004000400, 0x0004000104000400, +0x0004000000040400, 0x0004000100040400, 0x0004000004040400, 0x0004000104040400, +0x0004000000000004, 0x0004000100000004, 0x0004000004000004, 0x0004000104000004, +0x0004000000040004, 0x0004000100040004, 0x0004000004040004, 0x0004000104040004, +0x0004000000000404, 0x0004000100000404, 0x0004000004000404, 0x0004000104000404, +0x0004000000040404, 0x0004000100040404, 0x0004000004040404, 0x0004000104040404, +0x0404000000000000, 0x0404000100000000, 0x0404000004000000, 0x0404000104000000, +0x0404000000040000, 0x0404000100040000, 0x0404000004040000, 0x0404000104040000, +0x0404000000000400, 0x0404000100000400, 0x0404000004000400, 0x0404000104000400, +0x0404000000040400, 0x0404000100040400, 0x0404000004040400, 0x0404000104040400, +0x0404000000000004, 0x0404000100000004, 0x0404000004000004, 0x0404000104000004, +0x0404000000040004, 0x0404000100040004, 0x0404000004040004, 0x0404000104040004, +0x0404000000000404, 0x0404000100000404, 0x0404000004000404, 0x0404000104000404, +0x0404000000040404, 0x0404000100040404, 0x0404000004040404, 0x0404000104040404, +0x0000040000000000, 0x0000040100000000, 0x0000040004000000, 0x0000040104000000, +0x0000040000040000, 0x0000040100040000, 0x0000040004040000, 0x0000040104040000, +0x0000040000000400, 0x0000040100000400, 0x0000040004000400, 0x0000040104000400, +0x0000040000040400, 0x0000040100040400, 0x0000040004040400, 0x0000040104040400, +0x0000040000000004, 0x0000040100000004, 0x0000040004000004, 0x0000040104000004, +0x0000040000040004, 0x0000040100040004, 0x0000040004040004, 0x0000040104040004, +0x0000040000000404, 0x0000040100000404, 0x0000040004000404, 0x0000040104000404, +0x0000040000040404, 0x0000040100040404, 0x0000040004040404, 0x0000040104040404, +0x0400040000000000, 0x0400040100000000, 0x0400040004000000, 0x0400040104000000, +0x0400040000040000, 0x0400040100040000, 0x0400040004040000, 0x0400040104040000, +0x0400040000000400, 0x0400040100000400, 0x0400040004000400, 0x0400040104000400, +0x0400040000040400, 0x0400040100040400, 0x0400040004040400, 0x0400040104040400, +0x0400040000000004, 0x0400040100000004, 0x0400040004000004, 0x0400040104000004, +0x0400040000040004, 0x0400040100040004, 0x0400040004040004, 0x0400040104040004, +0x0400040000000404, 0x0400040100000404, 0x0400040004000404, 0x0400040104000404, +0x0400040000040404, 0x0400040100040404, 0x0400040004040404, 0x0400040104040404, +0x0004040000000000, 0x0004040100000000, 0x0004040004000000, 0x0004040104000000, +0x0004040000040000, 0x0004040100040000, 0x0004040004040000, 0x0004040104040000, +0x0004040000000400, 0x0004040100000400, 0x0004040004000400, 0x0004040104000400, +0x0004040000040400, 0x0004040100040400, 0x0004040004040400, 0x0004040104040400, +0x0004040000000004, 0x0004040100000004, 0x0004040004000004, 0x0004040104000004, +0x0004040000040004, 0x0004040100040004, 0x0004040004040004, 0x0004040104040004, +0x0004040000000404, 0x0004040100000404, 0x0004040004000404, 0x0004040104000404, +0x0004040000040404, 0x0004040100040404, 0x0004040004040404, 0x0004040104040404, +0x0404040000000000, 0x0404040100000000, 0x0404040004000000, 0x0404040104000000, +0x0404040000040000, 0x0404040100040000, 0x0404040004040000, 0x0404040104040000, +0x0404040000000400, 0x0404040100000400, 0x0404040004000400, 0x0404040104000400, +0x0404040000040400, 0x0404040100040400, 0x0404040004040400, 0x0404040104040400, +0x0404040000000004, 0x0404040100000004, 0x0404040004000004, 0x0404040104000004, +0x0404040000040004, 0x0404040100040004, 0x0404040004040004, 0x0404040104040004, +0x0404040000000404, 0x0404040100000404, 0x0404040004000404, 0x0404040104000404, +0x0404040000040404, 0x0404040100040404, 0x0404040004040404, 0x0404040104040404 }; + +const u64bit DES_FPTAB2[256] = { +0x0000000000000000, 0x0000004000000000, 0x0000000001000000, 0x0000004001000000, +0x0000000000010000, 0x0000004000010000, 0x0000000001010000, 0x0000004001010000, +0x0000000000000100, 0x0000004000000100, 0x0000000001000100, 0x0000004001000100, +0x0000000000010100, 0x0000004000010100, 0x0000000001010100, 0x0000004001010100, +0x0000000000000001, 0x0000004000000001, 0x0000000001000001, 0x0000004001000001, +0x0000000000010001, 0x0000004000010001, 0x0000000001010001, 0x0000004001010001, +0x0000000000000101, 0x0000004000000101, 0x0000000001000101, 0x0000004001000101, +0x0000000000010101, 0x0000004000010101, 0x0000000001010101, 0x0000004001010101, +0x0100000000000000, 0x0100004000000000, 0x0100000001000000, 0x0100004001000000, +0x0100000000010000, 0x0100004000010000, 0x0100000001010000, 0x0100004001010000, +0x0100000000000100, 0x0100004000000100, 0x0100000001000100, 0x0100004001000100, +0x0100000000010100, 0x0100004000010100, 0x0100000001010100, 0x0100004001010100, +0x0100000000000001, 0x0100004000000001, 0x0100000001000001, 0x0100004001000001, +0x0100000000010001, 0x0100004000010001, 0x0100000001010001, 0x0100004001010001, +0x0100000000000101, 0x0100004000000101, 0x0100000001000101, 0x0100004001000101, +0x0100000000010101, 0x0100004000010101, 0x0100000001010101, 0x0100004001010101, +0x0001000000000000, 0x0001004000000000, 0x0001000001000000, 0x0001004001000000, +0x0001000000010000, 0x0001004000010000, 0x0001000001010000, 0x0001004001010000, +0x0001000000000100, 0x0001004000000100, 0x0001000001000100, 0x0001004001000100, +0x0001000000010100, 0x0001004000010100, 0x0001000001010100, 0x0001004001010100, +0x0001000000000001, 0x0001004000000001, 0x0001000001000001, 0x0001004001000001, +0x0001000000010001, 0x0001004000010001, 0x0001000001010001, 0x0001004001010001, +0x0001000000000101, 0x0001004000000101, 0x0001000001000101, 0x0001004001000101, +0x0001000000010101, 0x0001004000010101, 0x0001000001010101, 0x0001004001010101, +0x0101000000000000, 0x0101004000000000, 0x0101000001000000, 0x0101004001000000, +0x0101000000010000, 0x0101004000010000, 0x0101000001010000, 0x0101004001010000, +0x0101000000000100, 0x0101004000000100, 0x0101000001000100, 0x0101004001000100, +0x0101000000010100, 0x0101004000010100, 0x0101000001010100, 0x0101004001010100, +0x0101000000000001, 0x0101004000000001, 0x0101000001000001, 0x0101004001000001, +0x0101000000010001, 0x0101004000010001, 0x0101000001010001, 0x0101004001010001, +0x0101000000000101, 0x0101004000000101, 0x0101000001000101, 0x0101004001000101, +0x0101000000010101, 0x0101004000010101, 0x0101000001010101, 0x0101004001010101, +0x0000010000000000, 0x0000014000000000, 0x0000010001000000, 0x0000014001000000, +0x0000010000010000, 0x0000014000010000, 0x0000010001010000, 0x0000014001010000, +0x0000010000000100, 0x0000014000000100, 0x0000010001000100, 0x0000014001000100, +0x0000010000010100, 0x0000014000010100, 0x0000010001010100, 0x0000014001010100, +0x0000010000000001, 0x0000014000000001, 0x0000010001000001, 0x0000014001000001, +0x0000010000010001, 0x0000014000010001, 0x0000010001010001, 0x0000014001010001, +0x0000010000000101, 0x0000014000000101, 0x0000010001000101, 0x0000014001000101, +0x0000010000010101, 0x0000014000010101, 0x0000010001010101, 0x0000014001010101, +0x0100010000000000, 0x0100014000000000, 0x0100010001000000, 0x0100014001000000, +0x0100010000010000, 0x0100014000010000, 0x0100010001010000, 0x0100014001010000, +0x0100010000000100, 0x0100014000000100, 0x0100010001000100, 0x0100014001000100, +0x0100010000010100, 0x0100014000010100, 0x0100010001010100, 0x0100014001010100, +0x0100010000000001, 0x0100014000000001, 0x0100010001000001, 0x0100014001000001, +0x0100010000010001, 0x0100014000010001, 0x0100010001010001, 0x0100014001010001, +0x0100010000000101, 0x0100014000000101, 0x0100010001000101, 0x0100014001000101, +0x0100010000010101, 0x0100014000010101, 0x0100010001010101, 0x0100014001010101, +0x0001010000000000, 0x0001014000000000, 0x0001010001000000, 0x0001014001000000, +0x0001010000010000, 0x0001014000010000, 0x0001010001010000, 0x0001014001010000, +0x0001010000000100, 0x0001014000000100, 0x0001010001000100, 0x0001014001000100, +0x0001010000010100, 0x0001014000010100, 0x0001010001010100, 0x0001014001010100, +0x0001010000000001, 0x0001014000000001, 0x0001010001000001, 0x0001014001000001, +0x0001010000010001, 0x0001014000010001, 0x0001010001010001, 0x0001014001010001, +0x0001010000000101, 0x0001014000000101, 0x0001010001000101, 0x0001014001000101, +0x0001010000010101, 0x0001014000010101, 0x0001010001010101, 0x0001014001010101, +0x0101010000000000, 0x0101014000000000, 0x0101010001000000, 0x0101014001000000, +0x0101010000010000, 0x0101014000010000, 0x0101010001010000, 0x0101014001010000, +0x0101010000000100, 0x0101014000000100, 0x0101010001000100, 0x0101014001000100, +0x0101010000010100, 0x0101014000010100, 0x0101010001010100, 0x0101014001010100, +0x0101010000000001, 0x0101014000000001, 0x0101010001000001, 0x0101014001000001, +0x0101010000010001, 0x0101014000010001, 0x0101010001010001, 0x0101014001010001, +0x0101010000000101, 0x0101014000000101, 0x0101010001000101, 0x0101014001000101, +0x0101010000010101, 0x0101014000010101, 0x0101010001010101, 0x0101014001010101 }; + +} diff --git a/src/libs/3rdparty/botan/src/block/des/desx.cpp b/src/libs/3rdparty/botan/src/block/des/desx.cpp new file mode 100644 index 00000000000..e557901d34b --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/des/desx.cpp @@ -0,0 +1,43 @@ +/* +* DES +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* DESX Encryption +*/ +void DESX::enc(const byte in[], byte out[]) const + { + xor_buf(out, in, K1.begin(), BLOCK_SIZE); + des.encrypt(out); + xor_buf(out, K2.begin(), BLOCK_SIZE); + } + +/* +* DESX Decryption +*/ +void DESX::dec(const byte in[], byte out[]) const + { + xor_buf(out, in, K2.begin(), BLOCK_SIZE); + des.decrypt(out); + xor_buf(out, K1.begin(), BLOCK_SIZE); + } + +/* +* DESX Key Schedule +*/ +void DESX::key_schedule(const byte key[], u32bit) + { + K1.copy(key, 8); + des.set_key(key + 8, 8); + K2.copy(key + 16, 8); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/des/desx.h b/src/libs/3rdparty/botan/src/block/des/desx.h new file mode 100644 index 00000000000..49ecc2421b0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/des/desx.h @@ -0,0 +1,35 @@ +/* +* DESX +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DESX_H__ +#define BOTAN_DESX_H__ + +#include + +namespace Botan { + +/* +* DESX +*/ +class BOTAN_DLL DESX : public BlockCipher + { + public: + void clear() throw() { des.clear(); K1.clear(); K2.clear(); } + std::string name() const { return "DESX"; } + BlockCipher* clone() const { return new DESX; } + DESX() : BlockCipher(8, 24) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + SecureBuffer K1, K2; + DES des; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/des/info.txt b/src/libs/3rdparty/botan/src/block/des/info.txt new file mode 100644 index 00000000000..ed05979c98b --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/des/info.txt @@ -0,0 +1,13 @@ +realname "DES" + +define DES + +load_on auto + + +des.cpp +des.h +des_tab.cpp +desx.h +desx.cpp + diff --git a/src/libs/3rdparty/botan/src/block/gost_28147/gost_28147.cpp b/src/libs/3rdparty/botan/src/block/gost_28147/gost_28147.cpp new file mode 100644 index 00000000000..bfd092c5643 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/gost_28147/gost_28147.cpp @@ -0,0 +1,139 @@ +/* +* GOST 28147-89 +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +byte GOST_28147_89_Params::sbox_entry(u32bit row, u32bit col) const + { + byte x = sboxes[4 * col + (row / 2)]; + + return (row % 2 == 0) ? (x >> 4) : (x & 0x0F); + } + +GOST_28147_89_Params::GOST_28147_89_Params(const std::string& n) : name(n) + { + // Encoded in the packed fromat from RFC 4357 + + // GostR3411_94_TestParamSet (OID 1.2.643.2.2.31.0) + static const byte GOST_R_3411_TEST_PARAMS[64] = { + 0x4E, 0x57, 0x64, 0xD1, 0xAB, 0x8D, 0xCB, 0xBF, 0x94, 0x1A, 0x7A, + 0x4D, 0x2C, 0xD1, 0x10, 0x10, 0xD6, 0xA0, 0x57, 0x35, 0x8D, 0x38, + 0xF2, 0xF7, 0x0F, 0x49, 0xD1, 0x5A, 0xEA, 0x2F, 0x8D, 0x94, 0x62, + 0xEE, 0x43, 0x09, 0xB3, 0xF4, 0xA6, 0xA2, 0x18, 0xC6, 0x98, 0xE3, + 0xC1, 0x7C, 0xE5, 0x7E, 0x70, 0x6B, 0x09, 0x66, 0xF7, 0x02, 0x3C, + 0x8B, 0x55, 0x95, 0xBF, 0x28, 0x39, 0xB3, 0x2E, 0xCC }; + + // GostR3411-94-CryptoProParamSet (OID 1.2.643.2.2.31.1) + static const byte GOST_R_3411_CRYPTOPRO_PARAMS[64] = { + 0xA5, 0x74, 0x77, 0xD1, 0x4F, 0xFA, 0x66, 0xE3, 0x54, 0xC7, 0x42, + 0x4A, 0x60, 0xEC, 0xB4, 0x19, 0x82, 0x90, 0x9D, 0x75, 0x1D, 0x4F, + 0xC9, 0x0B, 0x3B, 0x12, 0x2F, 0x54, 0x79, 0x08, 0xA0, 0xAF, 0xD1, + 0x3E, 0x1A, 0x38, 0xC7, 0xB1, 0x81, 0xC6, 0xE6, 0x56, 0x05, 0x87, + 0x03, 0x25, 0xEB, 0xFE, 0x9C, 0x6D, 0xF8, 0x6D, 0x2E, 0xAB, 0xDE, + 0x20, 0xBA, 0x89, 0x3C, 0x92, 0xF8, 0xD3, 0x53, 0xBC }; + + if(name == "R3411_94_TestParam") + sboxes = GOST_R_3411_TEST_PARAMS; + else if(name == "R3411_CryptoPro") + sboxes = GOST_R_3411_CRYPTOPRO_PARAMS; + else + throw Invalid_Argument("GOST_28147_89_Params: Unknown " + name); + } + +/* +* GOST Constructor +*/ +GOST_28147_89::GOST_28147_89(const GOST_28147_89_Params& param) : + BlockCipher(8, 32) + { + // Convert the parallel 4x4 sboxes into larger word-based sboxes + for(size_t i = 0; i != 4; ++i) + for(size_t j = 0; j != 256; ++j) + { + u32bit T = (param.sbox_entry(2*i , j % 16)) | + (param.sbox_entry(2*i+1, j / 16) << 4); + SBOX[256*i+j] = rotate_left(T, (11+8*i) % 32); + } + } + +/* +* Two rounds of GOST +*/ +#define GOST_2ROUND(N1, N2, R1, R2) \ + do { \ + u32bit T0 = N1 + EK[R1]; \ + N2 ^= SBOX[get_byte(3, T0)] | \ + SBOX[get_byte(2, T0)+256] | \ + SBOX[get_byte(1, T0)+512] | \ + SBOX[get_byte(0, T0)+768]; \ + \ + u32bit T1 = N2 + EK[R2]; \ + N1 ^= SBOX[get_byte(3, T1)] | \ + SBOX[get_byte(2, T1)+256] | \ + SBOX[get_byte(1, T1)+512] | \ + SBOX[get_byte(0, T1)+768]; \ + } while(0) + +/* +* GOST Encryption +*/ +void GOST_28147_89::enc(const byte in[], byte out[]) const + { + u32bit N1 = load_le(in, 0), N2 = load_le(in, 1); + + for(size_t i = 0; i != 3; ++i) + { + GOST_2ROUND(N1, N2, 0, 1); + GOST_2ROUND(N1, N2, 2, 3); + GOST_2ROUND(N1, N2, 4, 5); + GOST_2ROUND(N1, N2, 6, 7); + } + + GOST_2ROUND(N1, N2, 7, 6); + GOST_2ROUND(N1, N2, 5, 4); + GOST_2ROUND(N1, N2, 3, 2); + GOST_2ROUND(N1, N2, 1, 0); + + store_le(out, N2, N1); + } + +/* +* GOST Decryption +*/ +void GOST_28147_89::dec(const byte in[], byte out[]) const + { + u32bit N1 = load_le(in, 0), N2 = load_le(in, 1); + + GOST_2ROUND(N1, N2, 0, 1); + GOST_2ROUND(N1, N2, 2, 3); + GOST_2ROUND(N1, N2, 4, 5); + GOST_2ROUND(N1, N2, 6, 7); + + for(size_t i = 0; i != 3; ++i) + { + GOST_2ROUND(N1, N2, 7, 6); + GOST_2ROUND(N1, N2, 5, 4); + GOST_2ROUND(N1, N2, 3, 2); + GOST_2ROUND(N1, N2, 1, 0); + } + + store_le(out, N2, N1); + } + +/* +* GOST Key Schedule +*/ +void GOST_28147_89::key_schedule(const byte key[], u32bit) + { + for(u32bit j = 0; j != 8; ++j) + EK[j] = load_le(key, j); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/gost_28147/gost_28147.h b/src/libs/3rdparty/botan/src/block/gost_28147/gost_28147.h new file mode 100644 index 00000000000..96d24c6699e --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/gost_28147/gost_28147.h @@ -0,0 +1,67 @@ +/* +* GOST 28147-89 +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_GOST_28147_89_H__ +#define BOTAN_GOST_28147_89_H__ + +#include + +namespace Botan { + +class GOST_28147_89_Params; + +/** +* The GOST 28147-89 block cipher uses a set of 4 bit Sboxes, however +* the standard does not actually define these Sboxes; they are +* considered a local configuration issue. Several different sets are +* used. +*/ +class GOST_28147_89_Params + { + public: + byte sbox_entry(u32bit row, u32bit col) const; + + std::string param_name() const { return name; } + + /** + * Default GOST parameters are the ones given in GOST R 34.11 for + * testing purposes; these sboxes are also used by Crypto++, and, + * at least according to Wikipedia, the Central Bank of Russian Federation + */ + GOST_28147_89_Params(const std::string& name = "R3411_94_TestParam"); + private: + const byte* sboxes; + std::string name; + }; + +/** +* GOST 28147-89 +*/ +class BOTAN_DLL GOST_28147_89 : public BlockCipher + { + public: + void clear() throw() { EK.clear(); } + + std::string name() const { return "GOST-28147-89"; } + BlockCipher* clone() const { return new GOST_28147_89(SBOX); } + + GOST_28147_89(const GOST_28147_89_Params& params); + private: + GOST_28147_89(const SecureBuffer& other_SBOX) : + BlockCipher(8, 32), SBOX(other_SBOX) {} + + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + SecureBuffer SBOX; + SecureBuffer EK; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/gost_28147/info.txt b/src/libs/3rdparty/botan/src/block/gost_28147/info.txt new file mode 100644 index 00000000000..6e187fd48b6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/gost_28147/info.txt @@ -0,0 +1,10 @@ +realname "GOST 28147-89" + +define GOST_28147_89 + +load_on auto + + +gost_28147.cpp +gost_28147.h + diff --git a/src/libs/3rdparty/botan/src/block/idea/idea.cpp b/src/libs/3rdparty/botan/src/block/idea/idea.cpp new file mode 100644 index 00000000000..5bbe470876c --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/idea/idea.cpp @@ -0,0 +1,174 @@ +/* +* IDEA +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace { + +/* +* Multiplication modulo 65537 +*/ +inline u16bit mul(u16bit x, u16bit y) + { + if(x && y) + { + u32bit T = static_cast(x) * y; + x = static_cast(T >> 16); + y = static_cast(T & 0xFFFF); + return static_cast(y - x + ((y < x) ? 1 : 0)); + } + else + return static_cast(1 - x - y); + } + +/* +* Find multiplicative inverses modulo 65537 +*/ +u16bit mul_inv(u16bit x) + { + if(x <= 1) + return x; + + u16bit t0 = static_cast(65537 / x), t1 = 1; + u16bit y = static_cast(65537 % x); + + while(y != 1) + { + u16bit q = x / y; + x %= y; + t1 += q * t0; + + if(x == 1) + return t1; + + q = y / x; + y %= x; + t0 += q * t1; + } + return (1 - t0); + } + +} + +/* +* IDEA Encryption +*/ +void IDEA::enc(const byte in[], byte out[]) const + { + u16bit X1 = load_be(in, 0); + u16bit X2 = load_be(in, 1); + u16bit X3 = load_be(in, 2); + u16bit X4 = load_be(in, 3); + + for(u32bit j = 0; j != 8; ++j) + { + X1 = mul(X1, EK[6*j+0]); + X2 += EK[6*j+1]; + X3 += EK[6*j+2]; + X4 = mul(X4, EK[6*j+3]); + + u16bit T0 = X3; + X3 = mul(X3 ^ X1, EK[6*j+4]); + + u16bit T1 = X2; + X2 = mul((X2 ^ X4) + X3, EK[6*j+5]); + X3 += X2; + + X1 ^= X2; + X4 ^= X3; + X2 ^= T0; + X3 ^= T1; + } + + X1 = mul(X1, EK[48]); + X2 += EK[50]; + X3 += EK[49]; + X4 = mul(X4, EK[51]); + + store_be(out, X1, X3, X2, X4); + } + +/* +* IDEA Decryption +*/ +void IDEA::dec(const byte in[], byte out[]) const + { + u16bit X1 = load_be(in, 0); + u16bit X2 = load_be(in, 1); + u16bit X3 = load_be(in, 2); + u16bit X4 = load_be(in, 3); + + for(u32bit j = 0; j != 8; ++j) + { + X1 = mul(X1, DK[6*j+0]); + X2 += DK[6*j+1]; + X3 += DK[6*j+2]; + X4 = mul(X4, DK[6*j+3]); + + u16bit T0 = X3; + X3 = mul(X3 ^ X1, DK[6*j+4]); + + u16bit T1 = X2; + X2 = mul((X2 ^ X4) + X3, DK[6*j+5]); + X3 += X2; + + X1 ^= X2; + X4 ^= X3; + X2 ^= T0; + X3 ^= T1; + } + + X1 = mul(X1, DK[48]); + X2 += DK[50]; + X3 += DK[49]; + X4 = mul(X4, DK[51]); + + store_be(out, X1, X3, X2, X4); + } + +/* +* IDEA Key Schedule +*/ +void IDEA::key_schedule(const byte key[], u32bit) + { + for(u32bit j = 0; j != 8; ++j) + EK[j] = load_be(key, j); + + for(u32bit j = 1, k = 8, offset = 0; k != 52; j %= 8, ++j, ++k) + { + EK[j+7+offset] = static_cast((EK[(j % 8) + offset] << 9) | + (EK[((j+1) % 8) + offset] >> 7)); + offset += (j == 8) ? 8 : 0; + } + + DK[51] = mul_inv(EK[3]); + DK[50] = -EK[2]; + DK[49] = -EK[1]; + DK[48] = mul_inv(EK[0]); + + for(u32bit j = 1, k = 4, counter = 47; j != 8; ++j, k += 6) + { + DK[counter--] = EK[k+1]; + DK[counter--] = EK[k]; + DK[counter--] = mul_inv(EK[k+5]); + DK[counter--] = -EK[k+3]; + DK[counter--] = -EK[k+4]; + DK[counter--] = mul_inv(EK[k+2]); + } + + DK[5] = EK[47]; + DK[4] = EK[46]; + DK[3] = mul_inv(EK[51]); + DK[2] = -EK[50]; + DK[1] = -EK[49]; + DK[0] = mul_inv(EK[48]); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/idea/idea.h b/src/libs/3rdparty/botan/src/block/idea/idea.h new file mode 100644 index 00000000000..2c53cd0e46d --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/idea/idea.h @@ -0,0 +1,34 @@ +/* +* IDEA +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_IDEA_H__ +#define BOTAN_IDEA_H__ + +#include + +namespace Botan { + +/* +* IDEA +*/ +class BOTAN_DLL IDEA : public BlockCipher + { + public: + void clear() throw() { EK.clear(); DK.clear(); } + std::string name() const { return "IDEA"; } + BlockCipher* clone() const { return new IDEA; } + IDEA() : BlockCipher(8, 16) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + SecureBuffer EK, DK; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/idea/info.txt b/src/libs/3rdparty/botan/src/block/idea/info.txt new file mode 100644 index 00000000000..2da3ffb4380 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/idea/info.txt @@ -0,0 +1,10 @@ +realname "IDEA" + +define IDEA + +load_on auto + + +idea.cpp +idea.h + diff --git a/src/libs/3rdparty/botan/src/block/info.txt b/src/libs/3rdparty/botan/src/block/info.txt new file mode 100644 index 00000000000..ff48fb04af2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/info.txt @@ -0,0 +1,13 @@ +realname "Block Ciphers" + +load_on auto + +define BLOCK_CIPHER + + +block_cipher.h + + + +sym_algo + diff --git a/src/libs/3rdparty/botan/src/block/kasumi/info.txt b/src/libs/3rdparty/botan/src/block/kasumi/info.txt new file mode 100644 index 00000000000..8ea879b6de1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/kasumi/info.txt @@ -0,0 +1,10 @@ +realname "Kasumi" + +define KASUMI + +load_on auto + + +kasumi.cpp +kasumi.h + diff --git a/src/libs/3rdparty/botan/src/block/kasumi/kasumi.cpp b/src/libs/3rdparty/botan/src/block/kasumi/kasumi.cpp new file mode 100644 index 00000000000..e051ddefbc8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/kasumi/kasumi.cpp @@ -0,0 +1,215 @@ +/* +* KASUMI +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* KASUMI S-Boxes +*/ +const byte KASUMI_SBOX_S7[128] = { + 0x36, 0x32, 0x3E, 0x38, 0x16, 0x22, 0x5E, 0x60, 0x26, 0x06, 0x3F, 0x5D, + 0x02, 0x12, 0x7B, 0x21, 0x37, 0x71, 0x27, 0x72, 0x15, 0x43, 0x41, 0x0C, + 0x2F, 0x49, 0x2E, 0x1B, 0x19, 0x6F, 0x7C, 0x51, 0x35, 0x09, 0x79, 0x4F, + 0x34, 0x3C, 0x3A, 0x30, 0x65, 0x7F, 0x28, 0x78, 0x68, 0x46, 0x47, 0x2B, + 0x14, 0x7A, 0x48, 0x3D, 0x17, 0x6D, 0x0D, 0x64, 0x4D, 0x01, 0x10, 0x07, + 0x52, 0x0A, 0x69, 0x62, 0x75, 0x74, 0x4C, 0x0B, 0x59, 0x6A, 0x00, 0x7D, + 0x76, 0x63, 0x56, 0x45, 0x1E, 0x39, 0x7E, 0x57, 0x70, 0x33, 0x11, 0x05, + 0x5F, 0x0E, 0x5A, 0x54, 0x5B, 0x08, 0x23, 0x67, 0x20, 0x61, 0x1C, 0x42, + 0x66, 0x1F, 0x1A, 0x2D, 0x4B, 0x04, 0x55, 0x5C, 0x25, 0x4A, 0x50, 0x31, + 0x44, 0x1D, 0x73, 0x2C, 0x40, 0x6B, 0x6C, 0x18, 0x6E, 0x53, 0x24, 0x4E, + 0x2A, 0x13, 0x0F, 0x29, 0x58, 0x77, 0x3B, 0x03 }; + +const u16bit KASUMI_SBOX_S9[512] = { + 0x00A7, 0x00EF, 0x00A1, 0x017B, 0x0187, 0x014E, 0x0009, 0x0152, 0x0026, + 0x00E2, 0x0030, 0x0166, 0x01C4, 0x0181, 0x005A, 0x018D, 0x00B7, 0x00FD, + 0x0093, 0x014B, 0x019F, 0x0154, 0x0033, 0x016A, 0x0132, 0x01F4, 0x0106, + 0x0052, 0x00D8, 0x009F, 0x0164, 0x00B1, 0x00AF, 0x00F1, 0x01E9, 0x0025, + 0x00CE, 0x0011, 0x0000, 0x014D, 0x002C, 0x00FE, 0x017A, 0x003A, 0x008F, + 0x00DC, 0x0051, 0x0190, 0x005F, 0x0003, 0x013B, 0x00F5, 0x0036, 0x00EB, + 0x00DA, 0x0195, 0x01D8, 0x0108, 0x00AC, 0x01EE, 0x0173, 0x0122, 0x018F, + 0x004C, 0x00A5, 0x00C5, 0x018B, 0x0079, 0x0101, 0x01E0, 0x01A7, 0x00D4, + 0x00F0, 0x001C, 0x01CE, 0x00B0, 0x0196, 0x01FB, 0x0120, 0x00DF, 0x01F5, + 0x0197, 0x00F9, 0x0109, 0x0059, 0x00BA, 0x00DD, 0x01AC, 0x00A4, 0x004A, + 0x01B8, 0x00C4, 0x01CA, 0x01A5, 0x015E, 0x00A3, 0x00E8, 0x009E, 0x0086, + 0x0162, 0x000D, 0x00FA, 0x01EB, 0x008E, 0x00BF, 0x0045, 0x00C1, 0x01A9, + 0x0098, 0x00E3, 0x016E, 0x0087, 0x0158, 0x012C, 0x0114, 0x00F2, 0x01B5, + 0x0140, 0x0071, 0x0116, 0x000B, 0x00F3, 0x0057, 0x013D, 0x0024, 0x005D, + 0x01F0, 0x001B, 0x01E7, 0x01BE, 0x01E2, 0x0029, 0x0044, 0x009C, 0x01C9, + 0x0083, 0x0146, 0x0193, 0x0153, 0x0014, 0x0027, 0x0073, 0x01BA, 0x007C, + 0x01DB, 0x0180, 0x01FC, 0x0035, 0x0070, 0x00AA, 0x01DF, 0x0097, 0x007E, + 0x00A9, 0x0049, 0x010C, 0x0117, 0x0141, 0x00A8, 0x016C, 0x016B, 0x0124, + 0x002E, 0x01F3, 0x0189, 0x0147, 0x0144, 0x0018, 0x01C8, 0x010B, 0x009D, + 0x01CC, 0x01E8, 0x01AA, 0x0135, 0x00E5, 0x01B7, 0x01FA, 0x00D0, 0x010F, + 0x015D, 0x0191, 0x01B2, 0x00EC, 0x0010, 0x00D1, 0x0167, 0x0034, 0x0038, + 0x0078, 0x00C7, 0x0115, 0x01D1, 0x01A0, 0x00FC, 0x011F, 0x00F6, 0x0006, + 0x0053, 0x0131, 0x01A4, 0x0159, 0x0099, 0x01F6, 0x0041, 0x003D, 0x00F4, + 0x011A, 0x00AD, 0x00DE, 0x01A2, 0x0043, 0x0182, 0x0170, 0x0105, 0x0065, + 0x01DC, 0x0123, 0x00C3, 0x01AE, 0x0031, 0x004F, 0x00A6, 0x014A, 0x0118, + 0x017F, 0x0175, 0x0080, 0x017E, 0x0198, 0x009B, 0x01EF, 0x016F, 0x0184, + 0x0112, 0x006B, 0x01CB, 0x01A1, 0x003E, 0x01C6, 0x0084, 0x00E1, 0x00CB, + 0x013C, 0x00EA, 0x000E, 0x012D, 0x005B, 0x01F7, 0x011E, 0x01A8, 0x00D3, + 0x015B, 0x0133, 0x008C, 0x0176, 0x0023, 0x0067, 0x007D, 0x01AB, 0x0013, + 0x00D6, 0x01C5, 0x0092, 0x01F2, 0x013A, 0x01BC, 0x00E6, 0x0100, 0x0149, + 0x00C6, 0x011D, 0x0032, 0x0074, 0x004E, 0x019A, 0x000A, 0x00CD, 0x01FE, + 0x00AB, 0x00E7, 0x002D, 0x008B, 0x01D3, 0x001D, 0x0056, 0x01F9, 0x0020, + 0x0048, 0x001A, 0x0156, 0x0096, 0x0139, 0x01EA, 0x01AF, 0x00EE, 0x019B, + 0x0145, 0x0095, 0x01D9, 0x0028, 0x0077, 0x00AE, 0x0163, 0x00B9, 0x00E9, + 0x0185, 0x0047, 0x01C0, 0x0111, 0x0174, 0x0037, 0x006E, 0x00B2, 0x0142, + 0x000C, 0x01D5, 0x0188, 0x0171, 0x00BE, 0x0001, 0x006D, 0x0177, 0x0089, + 0x00B5, 0x0058, 0x004B, 0x0134, 0x0104, 0x01E4, 0x0062, 0x0110, 0x0172, + 0x0113, 0x019C, 0x006F, 0x0150, 0x013E, 0x0004, 0x01F8, 0x01EC, 0x0103, + 0x0130, 0x004D, 0x0151, 0x01B3, 0x0015, 0x0165, 0x012F, 0x014C, 0x01E3, + 0x0012, 0x002F, 0x0055, 0x0019, 0x01F1, 0x01DA, 0x0121, 0x0064, 0x010D, + 0x0128, 0x01DE, 0x010E, 0x006A, 0x001F, 0x0068, 0x01B1, 0x0054, 0x019E, + 0x01E6, 0x018A, 0x0060, 0x0063, 0x009A, 0x01FF, 0x0094, 0x019D, 0x0169, + 0x0199, 0x00FF, 0x00A2, 0x00D7, 0x012E, 0x00C9, 0x010A, 0x015F, 0x0157, + 0x0090, 0x01B9, 0x016D, 0x006C, 0x012A, 0x00FB, 0x0022, 0x00B6, 0x01FD, + 0x008A, 0x00D2, 0x014F, 0x0085, 0x0137, 0x0160, 0x0148, 0x008D, 0x018C, + 0x015A, 0x007B, 0x013F, 0x01C2, 0x0119, 0x01AD, 0x00E4, 0x01BB, 0x01E1, + 0x005C, 0x0194, 0x01E5, 0x01A6, 0x00F8, 0x0129, 0x0017, 0x00D5, 0x0082, + 0x01D2, 0x0016, 0x00D9, 0x011B, 0x0046, 0x0126, 0x0168, 0x01A3, 0x007F, + 0x0138, 0x0179, 0x0007, 0x01D4, 0x00C2, 0x0002, 0x0075, 0x0127, 0x01CF, + 0x0102, 0x00E0, 0x01BF, 0x00F7, 0x00BB, 0x0050, 0x018E, 0x011C, 0x0161, + 0x0069, 0x0186, 0x012B, 0x01D7, 0x01D6, 0x00B8, 0x0039, 0x00C8, 0x015C, + 0x003F, 0x00CC, 0x00BC, 0x0021, 0x01C3, 0x0061, 0x001E, 0x0136, 0x00DB, + 0x005E, 0x00A0, 0x0081, 0x01ED, 0x0040, 0x00B3, 0x0107, 0x0066, 0x00BD, + 0x00CF, 0x0072, 0x0192, 0x01B6, 0x01DD, 0x0183, 0x007A, 0x00C0, 0x002A, + 0x017D, 0x0005, 0x0091, 0x0076, 0x00B4, 0x01C1, 0x0125, 0x0143, 0x0088, + 0x017C, 0x002B, 0x0042, 0x003C, 0x01C7, 0x0155, 0x01BD, 0x00CA, 0x01B0, + 0x0008, 0x00ED, 0x000F, 0x0178, 0x01B4, 0x01D0, 0x003B, 0x01CD }; + +/* +* KASUMI FI Function +*/ +u16bit FI(u16bit I, u16bit K) + { + u16bit D9 = (I >> 7); + byte D7 = (I & 0x7F); + D9 = KASUMI_SBOX_S9[D9] ^ D7; + D7 = KASUMI_SBOX_S7[D7] ^ (D9 & 0x7F); + + D7 ^= (K >> 9); + D9 = KASUMI_SBOX_S9[D9 ^ (K & 0x1FF)] ^ D7; + D7 = KASUMI_SBOX_S7[D7] ^ (D9 & 0x7F); + return (D7 << 9) | D9; + } + +} + +/* +* KASUMI Encryption +*/ +void KASUMI::enc(const byte in[], byte out[]) const + { + u16bit B0 = load_be(in, 0); + u16bit B1 = load_be(in, 1); + u16bit B2 = load_be(in, 2); + u16bit B3 = load_be(in, 3); + + for(u32bit j = 0; j != 8; j += 2) + { + const u16bit* K = EK + 8*j; + + u16bit R = B1 ^ (rotate_left(B0, 1) & K[0]); + u16bit L = B0 ^ (rotate_left(R, 1) | K[1]); + + L = FI(L ^ K[ 2], K[ 3]) ^ R; + R = FI(R ^ K[ 4], K[ 5]) ^ L; + L = FI(L ^ K[ 6], K[ 7]) ^ R; + + R = B2 ^= R; + L = B3 ^= L; + + R = FI(R ^ K[10], K[11]) ^ L; + L = FI(L ^ K[12], K[13]) ^ R; + R = FI(R ^ K[14], K[15]) ^ L; + + R ^= (rotate_left(L, 1) & K[8]); + L ^= (rotate_left(R, 1) | K[9]); + + B0 ^= L; + B1 ^= R; + } + + store_be(out, B0, B1, B2, B3); + } + +/* +* KASUMI Decryption +*/ +void KASUMI::dec(const byte in[], byte out[]) const + { + u16bit B0 = load_be(in, 0); + u16bit B1 = load_be(in, 1); + u16bit B2 = load_be(in, 2); + u16bit B3 = load_be(in, 3); + + for(u32bit j = 0; j != 8; j += 2) + { + const u16bit* K = EK + 8*(6-j); + + u16bit L = B2, R = B3; + + L = FI(L ^ K[10], K[11]) ^ R; + R = FI(R ^ K[12], K[13]) ^ L; + L = FI(L ^ K[14], K[15]) ^ R; + + L ^= (rotate_left(R, 1) & K[8]); + R ^= (rotate_left(L, 1) | K[9]); + + R = B0 ^= R; + L = B1 ^= L; + + L ^= (rotate_left(R, 1) & K[0]); + R ^= (rotate_left(L, 1) | K[1]); + + R = FI(R ^ K[2], K[3]) ^ L; + L = FI(L ^ K[4], K[5]) ^ R; + R = FI(R ^ K[6], K[7]) ^ L; + + B2 ^= L; + B3 ^= R; + } + + store_be(out, B0, B1, B2, B3); + } + +/* +* KASUMI Key Schedule +*/ +void KASUMI::key_schedule(const byte key[], u32bit) + { + static const u16bit RC[] = { 0x0123, 0x4567, 0x89AB, 0xCDEF, + 0xFEDC, 0xBA98, 0x7654, 0x3210 }; + + SecureBuffer K; + for(u32bit j = 0; j != 8; ++j) + { + K[j] = load_be(key, j); + K[j+8] = K[j] ^ RC[j]; + } + + for(u32bit j = 0; j != 8; ++j) + { + EK[8*j ] = rotate_left(K[(j+0) % 8 ], 2); + EK[8*j+1] = rotate_left(K[(j+2) % 8 + 8], 1); + EK[8*j+2] = rotate_left(K[(j+1) % 8 ], 5); + EK[8*j+3] = K[(j+4) % 8 + 8]; + EK[8*j+4] = rotate_left(K[(j+5) % 8 ], 8); + EK[8*j+5] = K[(j+3) % 8 + 8]; + EK[8*j+6] = rotate_left(K[(j+6) % 8 ], 13); + EK[8*j+7] = K[(j+7) % 8 + 8]; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/block/kasumi/kasumi.h b/src/libs/3rdparty/botan/src/block/kasumi/kasumi.h new file mode 100644 index 00000000000..df49fa9eb48 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/kasumi/kasumi.h @@ -0,0 +1,36 @@ +/* +* KASUMI +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_KASUMI_H__ +#define BOTAN_KASUMI_H__ + +#include + +namespace Botan { + +/* +* KASUMI +*/ +class BOTAN_DLL KASUMI : public BlockCipher + { + public: + void clear() throw() { EK.clear(); } + std::string name() const { return "KASUMI"; } + BlockCipher* clone() const { return new KASUMI; } + + KASUMI() : BlockCipher(8, 16) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + SecureBuffer EK; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/lion/info.txt b/src/libs/3rdparty/botan/src/block/lion/info.txt new file mode 100644 index 00000000000..81ef5851142 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/lion/info.txt @@ -0,0 +1,15 @@ +realname "Lion" + +define LION + +load_on auto + + +lion.cpp +lion.h + + + +hash +stream + diff --git a/src/libs/3rdparty/botan/src/block/lion/lion.cpp b/src/libs/3rdparty/botan/src/block/lion/lion.cpp new file mode 100644 index 00000000000..c7cdf6d13c5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/lion/lion.cpp @@ -0,0 +1,114 @@ +/* +* Lion +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Lion Encryption +*/ +void Lion::enc(const byte in[], byte out[]) const + { + SecureVector buffer(LEFT_SIZE); + + xor_buf(buffer, in, key1, LEFT_SIZE); + cipher->set_key(buffer, LEFT_SIZE); + cipher->encrypt(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE); + + hash->update(out + LEFT_SIZE, RIGHT_SIZE); + hash->final(buffer); + xor_buf(out, in, buffer, LEFT_SIZE); + + xor_buf(buffer, out, key2, LEFT_SIZE); + cipher->set_key(buffer, LEFT_SIZE); + cipher->encrypt(out + LEFT_SIZE, RIGHT_SIZE); + } + +/* +* Lion Decryption +*/ +void Lion::dec(const byte in[], byte out[]) const + { + SecureVector buffer(LEFT_SIZE); + + xor_buf(buffer, in, key2, LEFT_SIZE); + cipher->set_key(buffer, LEFT_SIZE); + cipher->encrypt(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE); + + hash->update(out + LEFT_SIZE, RIGHT_SIZE); + hash->final(buffer); + xor_buf(out, in, buffer, LEFT_SIZE); + + xor_buf(buffer, out, key1, LEFT_SIZE); + cipher->set_key(buffer, LEFT_SIZE); + cipher->encrypt(out + LEFT_SIZE, RIGHT_SIZE); + } + +/* +* Lion Key Schedule +*/ +void Lion::key_schedule(const byte key[], u32bit length) + { + clear(); + + key1.copy(key, length / 2); + key2.copy(key + length / 2, length / 2); + } + +/* +* Return the name of this type +*/ +std::string Lion::name() const + { + return "Lion(" + hash->name() + "," + + cipher->name() + "," + + to_string(BLOCK_SIZE) + ")"; + } + +/* +* Return a clone of this object +*/ +BlockCipher* Lion::clone() const + { + return new Lion(hash->clone(), cipher->clone(), BLOCK_SIZE); + } + +/* +* Clear memory of sensitive data +*/ +void Lion::clear() throw() + { + hash->clear(); + cipher->clear(); + key1.clear(); + key2.clear(); + } + +/* +* Lion Constructor +*/ +Lion::Lion(HashFunction* hash_in, StreamCipher* sc_in, u32bit block_len) : + BlockCipher(std::max(2*hash_in->OUTPUT_LENGTH + 1, block_len), + 2, 2*hash_in->OUTPUT_LENGTH, 2), + LEFT_SIZE(hash_in->OUTPUT_LENGTH), + RIGHT_SIZE(BLOCK_SIZE - LEFT_SIZE), + hash(hash_in), + cipher(sc_in) + { + if(2*LEFT_SIZE + 1 > BLOCK_SIZE) + throw Invalid_Argument(name() + ": Chosen block size is too small"); + if(!cipher->valid_keylength(LEFT_SIZE)) + throw Exception(name() + ": This stream/hash combination is invalid"); + + key1.create(LEFT_SIZE); + key2.create(LEFT_SIZE); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/lion/lion.h b/src/libs/3rdparty/botan/src/block/lion/lion.h new file mode 100644 index 00000000000..5bc4e72c060 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/lion/lion.h @@ -0,0 +1,43 @@ +/* +* Lion +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_LION_H__ +#define BOTAN_LION_H__ + +#include +#include +#include + +namespace Botan { + +/* +* Lion +*/ +class BOTAN_DLL Lion : public BlockCipher + { + public: + void clear() throw(); + std::string name() const; + BlockCipher* clone() const; + + Lion(HashFunction*, StreamCipher*, u32bit); + ~Lion() { delete hash; delete cipher; } + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + const u32bit LEFT_SIZE, RIGHT_SIZE; + + HashFunction* hash; + StreamCipher* cipher; + SecureVector key1, key2; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/lubyrack/info.txt b/src/libs/3rdparty/botan/src/block/lubyrack/info.txt new file mode 100644 index 00000000000..a478526f42a --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/lubyrack/info.txt @@ -0,0 +1,14 @@ +realname "Luby-Rackoff" + +define LUBY_RACKOFF + +load_on auto + + +lubyrack.cpp +lubyrack.h + + + +hash + diff --git a/src/libs/3rdparty/botan/src/block/lubyrack/lubyrack.cpp b/src/libs/3rdparty/botan/src/block/lubyrack/lubyrack.cpp new file mode 100644 index 00000000000..a9d2b1db2e3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/lubyrack/lubyrack.cpp @@ -0,0 +1,116 @@ +/* +* Luby-Rackoff +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Luby-Rackoff Encryption +*/ +void LubyRackoff::enc(const byte in[], byte out[]) const + { + const u32bit len = hash->OUTPUT_LENGTH; + + SecureVector buffer(len); + hash->update(K1); + hash->update(in, len); + hash->final(buffer); + xor_buf(out + len, in + len, buffer, len); + + hash->update(K2); + hash->update(out + len, len); + hash->final(buffer); + xor_buf(out, in, buffer, len); + + hash->update(K1); + hash->update(out, len); + hash->final(buffer); + xor_buf(out + len, buffer, len); + + hash->update(K2); + hash->update(out + len, len); + hash->final(buffer); + xor_buf(out, buffer, len); + } + +/* +* Luby-Rackoff Decryption +*/ +void LubyRackoff::dec(const byte in[], byte out[]) const + { + const u32bit len = hash->OUTPUT_LENGTH; + + SecureVector buffer(len); + hash->update(K2); + hash->update(in + len, len); + hash->final(buffer); + xor_buf(out, in, buffer, len); + + hash->update(K1); + hash->update(out, len); + hash->final(buffer); + xor_buf(out + len, in + len, buffer, len); + + hash->update(K2); + hash->update(out + len, len); + hash->final(buffer); + xor_buf(out, buffer, len); + + hash->update(K1); + hash->update(out, len); + hash->final(buffer); + xor_buf(out + len, buffer, len); + } + +/* +* Luby-Rackoff Key Schedule +*/ +void LubyRackoff::key_schedule(const byte key[], u32bit length) + { + K1.set(key, length / 2); + K2.set(key + length / 2, length / 2); + } + +/* +* Clear memory of sensitive data +*/ +void LubyRackoff::clear() throw() + { + K1.clear(); + K2.clear(); + hash->clear(); + } + +/* +* Return a clone of this object +*/ +BlockCipher* LubyRackoff::clone() const + { + return new LubyRackoff(hash->clone()); + } + +/* +* Return the name of this type +*/ +std::string LubyRackoff::name() const + { + return "Luby-Rackoff(" + hash->name() + ")"; + } + +/* +* Luby-Rackoff Constructor +*/ +LubyRackoff::LubyRackoff(HashFunction* h) : + BlockCipher(2 * (h ? h->OUTPUT_LENGTH: 0), + 2, 32, 2), + hash(h) + { + } + +} diff --git a/src/libs/3rdparty/botan/src/block/lubyrack/lubyrack.h b/src/libs/3rdparty/botan/src/block/lubyrack/lubyrack.h new file mode 100644 index 00000000000..ebde31304f4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/lubyrack/lubyrack.h @@ -0,0 +1,38 @@ +/* +* Luby-Rackoff +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_LUBY_RACKOFF_H__ +#define BOTAN_LUBY_RACKOFF_H__ + +#include +#include + +namespace Botan { + +/* +* Luby-Rackoff +*/ +class BOTAN_DLL LubyRackoff : public BlockCipher + { + public: + void clear() throw(); + std::string name() const; + BlockCipher* clone() const; + + LubyRackoff(HashFunction* hash); + ~LubyRackoff() { delete hash; } + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + HashFunction* hash; + SecureVector K1, K2; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/mars/info.txt b/src/libs/3rdparty/botan/src/block/mars/info.txt new file mode 100644 index 00000000000..b0ad8af9ce6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/mars/info.txt @@ -0,0 +1,11 @@ +realname "MARS" + +define MARS + +load_on auto + + +mars.cpp +mars.h +mars_tab.cpp + diff --git a/src/libs/3rdparty/botan/src/block/mars/mars.cpp b/src/libs/3rdparty/botan/src/block/mars/mars.cpp new file mode 100644 index 00000000000..08c8409c5df --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/mars/mars.cpp @@ -0,0 +1,276 @@ +/* +* MARS +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Generate a mask for runs of bits +*/ +u32bit gen_mask(u32bit input) + { + u32bit mask = 0; + + for(u32bit j = 2; j != 31; ++j) + { + u32bit region = (input >> (j-1)) & 0x07; + + if(region == 0x00 || region == 0x07) + { + u32bit low = (j < 9) ? 0 : (j - 9); + u32bit high = (j < 23) ? j : 23; + + for(u32bit k = low; k != high; ++k) + { + u32bit value = (input >> k) & 0x3FF; + + if(value == 0 || value == 0x3FF) + { + mask |= 1 << j; + break; + } + } + } + } + + return mask; + } + +} + +/* +* MARS Encryption +*/ +void MARS::enc(const byte in[], byte out[]) const + { + u32bit A = load_le(in, 0) + EK[0]; + u32bit B = load_le(in, 1) + EK[1]; + u32bit C = load_le(in, 2) + EK[2]; + u32bit D = load_le(in, 3) + EK[3]; + + forward_mix(A, B, C, D); + + encrypt_round(A, B, C, D, 0); + encrypt_round(B, C, D, A, 1); + encrypt_round(C, D, A, B, 2); + encrypt_round(D, A, B, C, 3); + encrypt_round(A, B, C, D, 4); + encrypt_round(B, C, D, A, 5); + encrypt_round(C, D, A, B, 6); + encrypt_round(D, A, B, C, 7); + + encrypt_round(A, D, C, B, 8); + encrypt_round(B, A, D, C, 9); + encrypt_round(C, B, A, D, 10); + encrypt_round(D, C, B, A, 11); + encrypt_round(A, D, C, B, 12); + encrypt_round(B, A, D, C, 13); + encrypt_round(C, B, A, D, 14); + encrypt_round(D, C, B, A, 15); + + reverse_mix(A, B, C, D); + + A -= EK[36]; B -= EK[37]; C -= EK[38]; D -= EK[39]; + + store_le(out, A, B, C, D); + } + +/* +* MARS Decryption +*/ +void MARS::dec(const byte in[], byte out[]) const + { + u32bit A = load_le(in, 3) + EK[39]; + u32bit B = load_le(in, 2) + EK[38]; + u32bit C = load_le(in, 1) + EK[37]; + u32bit D = load_le(in, 0) + EK[36]; + + forward_mix(A, B, C, D); + + decrypt_round(A, B, C, D, 15); + decrypt_round(B, C, D, A, 14); + decrypt_round(C, D, A, B, 13); + decrypt_round(D, A, B, C, 12); + decrypt_round(A, B, C, D, 11); + decrypt_round(B, C, D, A, 10); + decrypt_round(C, D, A, B, 9); + decrypt_round(D, A, B, C, 8); + + decrypt_round(A, D, C, B, 7); + decrypt_round(B, A, D, C, 6); + decrypt_round(C, B, A, D, 5); + decrypt_round(D, C, B, A, 4); + decrypt_round(A, D, C, B, 3); + decrypt_round(B, A, D, C, 2); + decrypt_round(C, B, A, D, 1); + decrypt_round(D, C, B, A, 0); + + reverse_mix(A, B, C, D); + + A -= EK[3]; B -= EK[2]; C -= EK[1]; D -= EK[0]; + + store_le(out, D, C, B, A); + } + +/* +* MARS Forward Mixing Operation +*/ +void MARS::forward_mix(u32bit& A, u32bit& B, u32bit& C, u32bit& D) + { + for(u32bit j = 0; j != 2; ++j) + { + B ^= SBOX[get_byte(3, A)]; B += SBOX[get_byte(2, A) + 256]; + C += SBOX[get_byte(1, A)]; D ^= SBOX[get_byte(0, A) + 256]; + A = rotate_right(A, 24) + D; + + C ^= SBOX[get_byte(3, B)]; C += SBOX[get_byte(2, B) + 256]; + D += SBOX[get_byte(1, B)]; A ^= SBOX[get_byte(0, B) + 256]; + B = rotate_right(B, 24) + C; + + D ^= SBOX[get_byte(3, C)]; D += SBOX[get_byte(2, C) + 256]; + A += SBOX[get_byte(1, C)]; B ^= SBOX[get_byte(0, C) + 256]; + C = rotate_right(C, 24); + + A ^= SBOX[get_byte(3, D)]; A += SBOX[get_byte(2, D) + 256]; + B += SBOX[get_byte(1, D)]; C ^= SBOX[get_byte(0, D) + 256]; + D = rotate_right(D, 24); + } + } + +/* +* MARS Reverse Mixing Operation +*/ +void MARS::reverse_mix(u32bit& A, u32bit& B, u32bit& C, u32bit& D) + { + for(u32bit j = 0; j != 2; ++j) + { + B ^= SBOX[get_byte(3, A) + 256]; C -= SBOX[get_byte(0, A)]; + D -= SBOX[get_byte(1, A) + 256]; D ^= SBOX[get_byte(2, A)]; + A = rotate_left(A, 24); + + C ^= SBOX[get_byte(3, B) + 256]; D -= SBOX[get_byte(0, B)]; + A -= SBOX[get_byte(1, B) + 256]; A ^= SBOX[get_byte(2, B)]; + C -= (B = rotate_left(B, 24)); + + D ^= SBOX[get_byte(3, C) + 256]; A -= SBOX[get_byte(0, C)]; + B -= SBOX[get_byte(1, C) + 256]; B ^= SBOX[get_byte(2, C)]; + C = rotate_left(C, 24); + D -= A; + + A ^= SBOX[get_byte(3, D) + 256]; B -= SBOX[get_byte(0, D)]; + C -= SBOX[get_byte(1, D) + 256]; C ^= SBOX[get_byte(2, D)]; + D = rotate_left(D, 24); + } + } + +/* +* MARS Encryption Round +*/ +void MARS::encrypt_round(u32bit& A, u32bit& B, u32bit& C, u32bit& D, + u32bit round) const + { + u32bit X, Y, Z; + X = A + EK[2*round + 4]; + A = rotate_left(A, 13); + Y = A * EK[2*round + 5]; + Z = SBOX[X % 512]; + Y = rotate_left(Y, 5); + Z ^= Y; + C += rotate_left(X, Y % 32); + Y = rotate_left(Y, 5); + Z ^= Y; + D ^= Y; + B += rotate_left(Z, Y % 32); + } + +/* +* MARS Decryption Round +*/ +void MARS::decrypt_round(u32bit& A, u32bit& B, u32bit& C, u32bit& D, + u32bit round) const + { + u32bit X, Y, Z; + Y = A * EK[2*round + 5]; + A = rotate_right(A, 13); + X = A + EK[2*round + 4]; + Z = SBOX[X % 512]; + Y = rotate_left(Y, 5); + Z ^= Y; + C -= rotate_left(X, Y % 32); + Y = rotate_left(Y, 5); + Z ^= Y; + D ^= Y; + B -= rotate_left(Z, Y % 32); + } + +/* +* MARS Key Schedule +*/ +void MARS::key_schedule(const byte key[], u32bit length) + { + SecureBuffer T; + for(u32bit j = 0; j != length / 4; ++j) + T[j] = load_le(key, j); + T[length / 4] = length / 4; + + for(u32bit j = 0; j != 4; ++j) + { + T[ 0] ^= rotate_left(T[ 8] ^ T[13], 3) ^ (j ); + T[ 1] ^= rotate_left(T[ 9] ^ T[14], 3) ^ (j + 4); + T[ 2] ^= rotate_left(T[10] ^ T[ 0], 3) ^ (j + 8); + T[ 3] ^= rotate_left(T[11] ^ T[ 1], 3) ^ (j + 12); + T[ 4] ^= rotate_left(T[12] ^ T[ 2], 3) ^ (j + 16); + T[ 5] ^= rotate_left(T[13] ^ T[ 3], 3) ^ (j + 20); + T[ 6] ^= rotate_left(T[14] ^ T[ 4], 3) ^ (j + 24); + T[ 7] ^= rotate_left(T[ 0] ^ T[ 5], 3) ^ (j + 28); + T[ 8] ^= rotate_left(T[ 1] ^ T[ 6], 3) ^ (j + 32); + T[ 9] ^= rotate_left(T[ 2] ^ T[ 7], 3) ^ (j + 36); + T[10] ^= rotate_left(T[ 3] ^ T[ 8], 3) ^ (j + 40); + T[11] ^= rotate_left(T[ 4] ^ T[ 9], 3) ^ (j + 44); + T[12] ^= rotate_left(T[ 5] ^ T[10], 3) ^ (j + 48); + T[13] ^= rotate_left(T[ 6] ^ T[11], 3) ^ (j + 52); + T[14] ^= rotate_left(T[ 7] ^ T[12], 3) ^ (j + 56); + + for(u32bit k = 0; k != 4; ++k) + { + T[ 0] = rotate_left(T[ 0] + SBOX[T[14] % 512], 9); + T[ 1] = rotate_left(T[ 1] + SBOX[T[ 0] % 512], 9); + T[ 2] = rotate_left(T[ 2] + SBOX[T[ 1] % 512], 9); + T[ 3] = rotate_left(T[ 3] + SBOX[T[ 2] % 512], 9); + T[ 4] = rotate_left(T[ 4] + SBOX[T[ 3] % 512], 9); + T[ 5] = rotate_left(T[ 5] + SBOX[T[ 4] % 512], 9); + T[ 6] = rotate_left(T[ 6] + SBOX[T[ 5] % 512], 9); + T[ 7] = rotate_left(T[ 7] + SBOX[T[ 6] % 512], 9); + T[ 8] = rotate_left(T[ 8] + SBOX[T[ 7] % 512], 9); + T[ 9] = rotate_left(T[ 9] + SBOX[T[ 8] % 512], 9); + T[10] = rotate_left(T[10] + SBOX[T[ 9] % 512], 9); + T[11] = rotate_left(T[11] + SBOX[T[10] % 512], 9); + T[12] = rotate_left(T[12] + SBOX[T[11] % 512], 9); + T[13] = rotate_left(T[13] + SBOX[T[12] % 512], 9); + T[14] = rotate_left(T[14] + SBOX[T[13] % 512], 9); + } + + EK[10*j + 0] = T[ 0]; EK[10*j + 1] = T[ 4]; EK[10*j + 2] = T[ 8]; + EK[10*j + 3] = T[12]; EK[10*j + 4] = T[ 1]; EK[10*j + 5] = T[ 5]; + EK[10*j + 6] = T[ 9]; EK[10*j + 7] = T[13]; EK[10*j + 8] = T[ 2]; + EK[10*j + 9] = T[ 6]; + } + + for(u32bit j = 5; j != 37; j += 2) + { + u32bit key3 = EK[j] & 3; + EK[j] |= 3; + EK[j] ^= rotate_left(SBOX[265 + key3], EK[j-1] % 32) & gen_mask(EK[j]); + } + } + +} diff --git a/src/libs/3rdparty/botan/src/block/mars/mars.h b/src/libs/3rdparty/botan/src/block/mars/mars.h new file mode 100644 index 00000000000..ca49695afca --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/mars/mars.h @@ -0,0 +1,38 @@ +/* +* MARS +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MARS_H__ +#define BOTAN_MARS_H__ + +#include + +namespace Botan { + +class BOTAN_DLL MARS : public BlockCipher + { + public: + void clear() throw() { EK.clear(); } + std::string name() const { return "MARS"; } + BlockCipher* clone() const { return new MARS; } + MARS() : BlockCipher(16, 16, 32, 4) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + void encrypt_round(u32bit&, u32bit&, u32bit&, u32bit&, u32bit) const; + void decrypt_round(u32bit&, u32bit&, u32bit&, u32bit&, u32bit) const; + static void forward_mix(u32bit&, u32bit&, u32bit&, u32bit&); + static void reverse_mix(u32bit&, u32bit&, u32bit&, u32bit&); + + static const u32bit SBOX[512]; + SecureBuffer EK; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/mars/mars_tab.cpp b/src/libs/3rdparty/botan/src/block/mars/mars_tab.cpp new file mode 100644 index 00000000000..fb8f3454252 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/mars/mars_tab.cpp @@ -0,0 +1,100 @@ +/* +* S-Box Table for MARS +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +const u32bit MARS::SBOX[512] = { + 0x09D0C479, 0x28C8FFE0, 0x84AA6C39, 0x9DAD7287, 0x7DFF9BE3, 0xD4268361, + 0xC96DA1D4, 0x7974CC93, 0x85D0582E, 0x2A4B5705, 0x1CA16A62, 0xC3BD279D, + 0x0F1F25E5, 0x5160372F, 0xC695C1FB, 0x4D7FF1E4, 0xAE5F6BF4, 0x0D72EE46, + 0xFF23DE8A, 0xB1CF8E83, 0xF14902E2, 0x3E981E42, 0x8BF53EB6, 0x7F4BF8AC, + 0x83631F83, 0x25970205, 0x76AFE784, 0x3A7931D4, 0x4F846450, 0x5C64C3F6, + 0x210A5F18, 0xC6986A26, 0x28F4E826, 0x3A60A81C, 0xD340A664, 0x7EA820C4, + 0x526687C5, 0x7EDDD12B, 0x32A11D1D, 0x9C9EF086, 0x80F6E831, 0xAB6F04AD, + 0x56FB9B53, 0x8B2E095C, 0xB68556AE, 0xD2250B0D, 0x294A7721, 0xE21FB253, + 0xAE136749, 0xE82AAE86, 0x93365104, 0x99404A66, 0x78A784DC, 0xB69BA84B, + 0x04046793, 0x23DB5C1E, 0x46CAE1D6, 0x2FE28134, 0x5A223942, 0x1863CD5B, + 0xC190C6E3, 0x07DFB846, 0x6EB88816, 0x2D0DCC4A, 0xA4CCAE59, 0x3798670D, + 0xCBFA9493, 0x4F481D45, 0xEAFC8CA8, 0xDB1129D6, 0xB0449E20, 0x0F5407FB, + 0x6167D9A8, 0xD1F45763, 0x4DAA96C3, 0x3BEC5958, 0xABABA014, 0xB6CCD201, + 0x38D6279F, 0x02682215, 0x8F376CD5, 0x092C237E, 0xBFC56593, 0x32889D2C, + 0x854B3E95, 0x05BB9B43, 0x7DCD5DCD, 0xA02E926C, 0xFAE527E5, 0x36A1C330, + 0x3412E1AE, 0xF257F462, 0x3C4F1D71, 0x30A2E809, 0x68E5F551, 0x9C61BA44, + 0x5DED0AB8, 0x75CE09C8, 0x9654F93E, 0x698C0CCA, 0x243CB3E4, 0x2B062B97, + 0x0F3B8D9E, 0x00E050DF, 0xFC5D6166, 0xE35F9288, 0xC079550D, 0x0591AEE8, + 0x8E531E74, 0x75FE3578, 0x2F6D829A, 0xF60B21AE, 0x95E8EB8D, 0x6699486B, + 0x901D7D9B, 0xFD6D6E31, 0x1090ACEF, 0xE0670DD8, 0xDAB2E692, 0xCD6D4365, + 0xE5393514, 0x3AF345F0, 0x6241FC4D, 0x460DA3A3, 0x7BCF3729, 0x8BF1D1E0, + 0x14AAC070, 0x1587ED55, 0x3AFD7D3E, 0xD2F29E01, 0x29A9D1F6, 0xEFB10C53, + 0xCF3B870F, 0xB414935C, 0x664465ED, 0x024ACAC7, 0x59A744C1, 0x1D2936A7, + 0xDC580AA6, 0xCF574CA8, 0x040A7A10, 0x6CD81807, 0x8A98BE4C, 0xACCEA063, + 0xC33E92B5, 0xD1E0E03D, 0xB322517E, 0x2092BD13, 0x386B2C4A, 0x52E8DD58, + 0x58656DFB, 0x50820371, 0x41811896, 0xE337EF7E, 0xD39FB119, 0xC97F0DF6, + 0x68FEA01B, 0xA150A6E5, 0x55258962, 0xEB6FF41B, 0xD7C9CD7A, 0xA619CD9E, + 0xBCF09576, 0x2672C073, 0xF003FB3C, 0x4AB7A50B, 0x1484126A, 0x487BA9B1, + 0xA64FC9C6, 0xF6957D49, 0x38B06A75, 0xDD805FCD, 0x63D094CF, 0xF51C999E, + 0x1AA4D343, 0xB8495294, 0xCE9F8E99, 0xBFFCD770, 0xC7C275CC, 0x378453A7, + 0x7B21BE33, 0x397F41BD, 0x4E94D131, 0x92CC1F98, 0x5915EA51, 0x99F861B7, + 0xC9980A88, 0x1D74FD5F, 0xB0A495F8, 0x614DEED0, 0xB5778EEA, 0x5941792D, + 0xFA90C1F8, 0x33F824B4, 0xC4965372, 0x3FF6D550, 0x4CA5FEC0, 0x8630E964, + 0x5B3FBBD6, 0x7DA26A48, 0xB203231A, 0x04297514, 0x2D639306, 0x2EB13149, + 0x16A45272, 0x532459A0, 0x8E5F4872, 0xF966C7D9, 0x07128DC0, 0x0D44DB62, + 0xAFC8D52D, 0x06316131, 0xD838E7CE, 0x1BC41D00, 0x3A2E8C0F, 0xEA83837E, + 0xB984737D, 0x13BA4891, 0xC4F8B949, 0xA6D6ACB3, 0xA215CDCE, 0x8359838B, + 0x6BD1AA31, 0xF579DD52, 0x21B93F93, 0xF5176781, 0x187DFDDE, 0xE94AEB76, + 0x2B38FD54, 0x431DE1DA, 0xAB394825, 0x9AD3048F, 0xDFEA32AA, 0x659473E3, + 0x623F7863, 0xF3346C59, 0xAB3AB685, 0x3346A90B, 0x6B56443E, 0xC6DE01F8, + 0x8D421FC0, 0x9B0ED10C, 0x88F1A1E9, 0x54C1F029, 0x7DEAD57B, 0x8D7BA426, + 0x4CF5178A, 0x551A7CCA, 0x1A9A5F08, 0xFCD651B9, 0x25605182, 0xE11FC6C3, + 0xB6FD9676, 0x337B3027, 0xB7C8EB14, 0x9E5FD030, 0x6B57E354, 0xAD913CF7, + 0x7E16688D, 0x58872A69, 0x2C2FC7DF, 0xE389CCC6, 0x30738DF1, 0x0824A734, + 0xE1797A8B, 0xA4A8D57B, 0x5B5D193B, 0xC8A8309B, 0x73F9A978, 0x73398D32, + 0x0F59573E, 0xE9DF2B03, 0xE8A5B6C8, 0x848D0704, 0x98DF93C2, 0x720A1DC3, + 0x684F259A, 0x943BA848, 0xA6370152, 0x863B5EA3, 0xD17B978B, 0x6D9B58EF, + 0x0A700DD4, 0xA73D36BF, 0x8E6A0829, 0x8695BC14, 0xE35B3447, 0x933AC568, + 0x8894B022, 0x2F511C27, 0xDDFBCC3C, 0x006662B6, 0x117C83FE, 0x4E12B414, + 0xC2BCA766, 0x3A2FEC10, 0xF4562420, 0x55792E2A, 0x46F5D857, 0xCEDA25CE, + 0xC3601D3B, 0x6C00AB46, 0xEFAC9C28, 0xB3C35047, 0x611DFEE3, 0x257C3207, + 0xFDD58482, 0x3B14D84F, 0x23BECB64, 0xA075F3A3, 0x088F8EAD, 0x07ADF158, + 0x7796943C, 0xFACABF3D, 0xC09730CD, 0xF7679969, 0xDA44E9ED, 0x2C854C12, + 0x35935FA3, 0x2F057D9F, 0x690624F8, 0x1CB0BAFD, 0x7B0DBDC6, 0x810F23BB, + 0xFA929A1A, 0x6D969A17, 0x6742979B, 0x74AC7D05, 0x010E65C4, 0x86A3D963, + 0xF907B5A0, 0xD0042BD3, 0x158D7D03, 0x287A8255, 0xBBA8366F, 0x096EDC33, + 0x21916A7B, 0x77B56B86, 0x951622F9, 0xA6C5E650, 0x8CEA17D1, 0xCD8C62BC, + 0xA3D63433, 0x358A68FD, 0x0F9B9D3C, 0xD6AA295B, 0xFE33384A, 0xC000738E, + 0xCD67EB2F, 0xE2EB6DC2, 0x97338B02, 0x06C9F246, 0x419CF1AD, 0x2B83C045, + 0x3723F18A, 0xCB5B3089, 0x160BEAD7, 0x5D494656, 0x35F8A74B, 0x1E4E6C9E, + 0x000399BD, 0x67466880, 0xB4174831, 0xACF423B2, 0xCA815AB3, 0x5A6395E7, + 0x302A67C5, 0x8BDB446B, 0x108F8FA4, 0x10223EDA, 0x92B8B48B, 0x7F38D0EE, + 0xAB2701D4, 0x0262D415, 0xAF224A30, 0xB3D88ABA, 0xF8B2C3AF, 0xDAF7EF70, + 0xCC97D3B7, 0xE9614B6C, 0x2BAEBFF4, 0x70F687CF, 0x386C9156, 0xCE092EE5, + 0x01E87DA6, 0x6CE91E6A, 0xBB7BCC84, 0xC7922C20, 0x9D3B71FD, 0x060E41C6, + 0xD7590F15, 0x4E03BB47, 0x183C198E, 0x63EEB240, 0x2DDBF49A, 0x6D5CBA54, + 0x923750AF, 0xF9E14236, 0x7838162B, 0x59726C72, 0x81B66760, 0xBB2926C1, + 0x48A0CE0D, 0xA6C0496D, 0xAD43507B, 0x718D496A, 0x9DF057AF, 0x44B1BDE6, + 0x054356DC, 0xDE7CED35, 0xD51A138B, 0x62088CC9, 0x35830311, 0xC96EFCA2, + 0x686F86EC, 0x8E77CB68, 0x63E1D6B8, 0xC80F9778, 0x79C491FD, 0x1B4C67F2, + 0x72698D7D, 0x5E368C31, 0xF7D95E2E, 0xA1D3493F, 0xDCD9433E, 0x896F1552, + 0x4BC4CA7A, 0xA6D1BAF4, 0xA5A96DCC, 0x0BEF8B46, 0xA169FDA7, 0x74DF40B7, + 0x4E208804, 0x9A756607, 0x038E87C8, 0x20211E44, 0x8B7AD4BF, 0xC6403F35, + 0x1848E36D, 0x80BDB038, 0x1E62891C, 0x643D2107, 0xBF04D6F8, 0x21092C8C, + 0xF644F389, 0x0778404E, 0x7B78ADB8, 0xA2C52D53, 0x42157ABE, 0xA2253E2E, + 0x7BF3F4AE, 0x80F594F9, 0x953194E7, 0x77EB92ED, 0xB3816930, 0xDA8D9336, + 0xBF447469, 0xF26D9483, 0xEE6FAED5, 0x71371235, 0xDE425F73, 0xB4E59F43, + 0x7DBE2D4E, 0x2D37B185, 0x49DC9A63, 0x98C39D98, 0x1301C9A2, 0x389B1BBF, + 0x0C18588D, 0xA421C1BA, 0x7AA3865C, 0x71E08558, 0x3C5CFCAA, 0x7D239CA4, + 0x0297D9DD, 0xD7DC2830, 0x4B37802B, 0x7428AB54, 0xAEEE0347, 0x4B3FBB85, + 0x692F2F08, 0x134E578E, 0x36D9E0BF, 0xAE8B5FCF, 0xEDB93ECF, 0x2B27248E, + 0x170EB1EF, 0x7DC57FD6, 0x1E760F16, 0xB1136601, 0x864E1B9B, 0xD7EA7319, + 0x3AB871BD, 0xCFA4D76F, 0xE31BD782, 0x0DBEB469, 0xABB96061, 0x5370F85D, + 0xFFB07E37, 0xDA30D0FB, 0xEBC977B6, 0x0B98B40F, 0x3A4D0FE6, 0xDF4FC26B, + 0x159CF22A, 0xC298D6E2, 0x2B78EF6A, 0x61A94AC0, 0xAB561187, 0x14EEA0F0, + 0xDF0D4164, 0x19AF70EE }; + +} diff --git a/src/libs/3rdparty/botan/src/block/misty1/info.txt b/src/libs/3rdparty/botan/src/block/misty1/info.txt new file mode 100644 index 00000000000..d45058bd491 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/misty1/info.txt @@ -0,0 +1,10 @@ +realname "MISTY-1" + +define MISTY1 + +load_on auto + + +misty1.cpp +misty1.h + diff --git a/src/libs/3rdparty/botan/src/block/misty1/misty1.cpp b/src/libs/3rdparty/botan/src/block/misty1/misty1.cpp new file mode 100644 index 00000000000..a35ff584d78 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/misty1/misty1.cpp @@ -0,0 +1,249 @@ +/* +* MISTY1 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +static const byte MISTY1_SBOX_S7[128] = { + 0x1B, 0x32, 0x33, 0x5A, 0x3B, 0x10, 0x17, 0x54, 0x5B, 0x1A, 0x72, 0x73, + 0x6B, 0x2C, 0x66, 0x49, 0x1F, 0x24, 0x13, 0x6C, 0x37, 0x2E, 0x3F, 0x4A, + 0x5D, 0x0F, 0x40, 0x56, 0x25, 0x51, 0x1C, 0x04, 0x0B, 0x46, 0x20, 0x0D, + 0x7B, 0x35, 0x44, 0x42, 0x2B, 0x1E, 0x41, 0x14, 0x4B, 0x79, 0x15, 0x6F, + 0x0E, 0x55, 0x09, 0x36, 0x74, 0x0C, 0x67, 0x53, 0x28, 0x0A, 0x7E, 0x38, + 0x02, 0x07, 0x60, 0x29, 0x19, 0x12, 0x65, 0x2F, 0x30, 0x39, 0x08, 0x68, + 0x5F, 0x78, 0x2A, 0x4C, 0x64, 0x45, 0x75, 0x3D, 0x59, 0x48, 0x03, 0x57, + 0x7C, 0x4F, 0x62, 0x3C, 0x1D, 0x21, 0x5E, 0x27, 0x6A, 0x70, 0x4D, 0x3A, + 0x01, 0x6D, 0x6E, 0x63, 0x18, 0x77, 0x23, 0x05, 0x26, 0x76, 0x00, 0x31, + 0x2D, 0x7A, 0x7F, 0x61, 0x50, 0x22, 0x11, 0x06, 0x47, 0x16, 0x52, 0x4E, + 0x71, 0x3E, 0x69, 0x43, 0x34, 0x5C, 0x58, 0x7D }; + +static const u16bit MISTY1_SBOX_S9[512] = { + 0x01C3, 0x00CB, 0x0153, 0x019F, 0x01E3, 0x00E9, 0x00FB, 0x0035, 0x0181, + 0x00B9, 0x0117, 0x01EB, 0x0133, 0x0009, 0x002D, 0x00D3, 0x00C7, 0x014A, + 0x0037, 0x007E, 0x00EB, 0x0164, 0x0193, 0x01D8, 0x00A3, 0x011E, 0x0055, + 0x002C, 0x001D, 0x01A2, 0x0163, 0x0118, 0x014B, 0x0152, 0x01D2, 0x000F, + 0x002B, 0x0030, 0x013A, 0x00E5, 0x0111, 0x0138, 0x018E, 0x0063, 0x00E3, + 0x00C8, 0x01F4, 0x001B, 0x0001, 0x009D, 0x00F8, 0x01A0, 0x016D, 0x01F3, + 0x001C, 0x0146, 0x007D, 0x00D1, 0x0082, 0x01EA, 0x0183, 0x012D, 0x00F4, + 0x019E, 0x01D3, 0x00DD, 0x01E2, 0x0128, 0x01E0, 0x00EC, 0x0059, 0x0091, + 0x0011, 0x012F, 0x0026, 0x00DC, 0x00B0, 0x018C, 0x010F, 0x01F7, 0x00E7, + 0x016C, 0x00B6, 0x00F9, 0x00D8, 0x0151, 0x0101, 0x014C, 0x0103, 0x00B8, + 0x0154, 0x012B, 0x01AE, 0x0017, 0x0071, 0x000C, 0x0047, 0x0058, 0x007F, + 0x01A4, 0x0134, 0x0129, 0x0084, 0x015D, 0x019D, 0x01B2, 0x01A3, 0x0048, + 0x007C, 0x0051, 0x01CA, 0x0023, 0x013D, 0x01A7, 0x0165, 0x003B, 0x0042, + 0x00DA, 0x0192, 0x00CE, 0x00C1, 0x006B, 0x009F, 0x01F1, 0x012C, 0x0184, + 0x00FA, 0x0196, 0x01E1, 0x0169, 0x017D, 0x0031, 0x0180, 0x010A, 0x0094, + 0x01DA, 0x0186, 0x013E, 0x011C, 0x0060, 0x0175, 0x01CF, 0x0067, 0x0119, + 0x0065, 0x0068, 0x0099, 0x0150, 0x0008, 0x0007, 0x017C, 0x00B7, 0x0024, + 0x0019, 0x00DE, 0x0127, 0x00DB, 0x00E4, 0x01A9, 0x0052, 0x0109, 0x0090, + 0x019C, 0x01C1, 0x0028, 0x01B3, 0x0135, 0x016A, 0x0176, 0x00DF, 0x01E5, + 0x0188, 0x00C5, 0x016E, 0x01DE, 0x01B1, 0x00C3, 0x01DF, 0x0036, 0x00EE, + 0x01EE, 0x00F0, 0x0093, 0x0049, 0x009A, 0x01B6, 0x0069, 0x0081, 0x0125, + 0x000B, 0x005E, 0x00B4, 0x0149, 0x01C7, 0x0174, 0x003E, 0x013B, 0x01B7, + 0x008E, 0x01C6, 0x00AE, 0x0010, 0x0095, 0x01EF, 0x004E, 0x00F2, 0x01FD, + 0x0085, 0x00FD, 0x00F6, 0x00A0, 0x016F, 0x0083, 0x008A, 0x0156, 0x009B, + 0x013C, 0x0107, 0x0167, 0x0098, 0x01D0, 0x01E9, 0x0003, 0x01FE, 0x00BD, + 0x0122, 0x0089, 0x00D2, 0x018F, 0x0012, 0x0033, 0x006A, 0x0142, 0x00ED, + 0x0170, 0x011B, 0x00E2, 0x014F, 0x0158, 0x0131, 0x0147, 0x005D, 0x0113, + 0x01CD, 0x0079, 0x0161, 0x01A5, 0x0179, 0x009E, 0x01B4, 0x00CC, 0x0022, + 0x0132, 0x001A, 0x00E8, 0x0004, 0x0187, 0x01ED, 0x0197, 0x0039, 0x01BF, + 0x01D7, 0x0027, 0x018B, 0x00C6, 0x009C, 0x00D0, 0x014E, 0x006C, 0x0034, + 0x01F2, 0x006E, 0x00CA, 0x0025, 0x00BA, 0x0191, 0x00FE, 0x0013, 0x0106, + 0x002F, 0x01AD, 0x0172, 0x01DB, 0x00C0, 0x010B, 0x01D6, 0x00F5, 0x01EC, + 0x010D, 0x0076, 0x0114, 0x01AB, 0x0075, 0x010C, 0x01E4, 0x0159, 0x0054, + 0x011F, 0x004B, 0x00C4, 0x01BE, 0x00F7, 0x0029, 0x00A4, 0x000E, 0x01F0, + 0x0077, 0x004D, 0x017A, 0x0086, 0x008B, 0x00B3, 0x0171, 0x00BF, 0x010E, + 0x0104, 0x0097, 0x015B, 0x0160, 0x0168, 0x00D7, 0x00BB, 0x0066, 0x01CE, + 0x00FC, 0x0092, 0x01C5, 0x006F, 0x0016, 0x004A, 0x00A1, 0x0139, 0x00AF, + 0x00F1, 0x0190, 0x000A, 0x01AA, 0x0143, 0x017B, 0x0056, 0x018D, 0x0166, + 0x00D4, 0x01FB, 0x014D, 0x0194, 0x019A, 0x0087, 0x01F8, 0x0123, 0x00A7, + 0x01B8, 0x0141, 0x003C, 0x01F9, 0x0140, 0x002A, 0x0155, 0x011A, 0x01A1, + 0x0198, 0x00D5, 0x0126, 0x01AF, 0x0061, 0x012E, 0x0157, 0x01DC, 0x0072, + 0x018A, 0x00AA, 0x0096, 0x0115, 0x00EF, 0x0045, 0x007B, 0x008D, 0x0145, + 0x0053, 0x005F, 0x0178, 0x00B2, 0x002E, 0x0020, 0x01D5, 0x003F, 0x01C9, + 0x01E7, 0x01AC, 0x0044, 0x0038, 0x0014, 0x00B1, 0x016B, 0x00AB, 0x00B5, + 0x005A, 0x0182, 0x01C8, 0x01D4, 0x0018, 0x0177, 0x0064, 0x00CF, 0x006D, + 0x0100, 0x0199, 0x0130, 0x015A, 0x0005, 0x0120, 0x01BB, 0x01BD, 0x00E0, + 0x004F, 0x00D6, 0x013F, 0x01C4, 0x012A, 0x0015, 0x0006, 0x00FF, 0x019B, + 0x00A6, 0x0043, 0x0088, 0x0050, 0x015F, 0x01E8, 0x0121, 0x0073, 0x017E, + 0x00BC, 0x00C2, 0x00C9, 0x0173, 0x0189, 0x01F5, 0x0074, 0x01CC, 0x01E6, + 0x01A8, 0x0195, 0x001F, 0x0041, 0x000D, 0x01BA, 0x0032, 0x003D, 0x01D1, + 0x0080, 0x00A8, 0x0057, 0x01B9, 0x0162, 0x0148, 0x00D9, 0x0105, 0x0062, + 0x007A, 0x0021, 0x01FF, 0x0112, 0x0108, 0x01C0, 0x00A9, 0x011D, 0x01B0, + 0x01A6, 0x00CD, 0x00F3, 0x005C, 0x0102, 0x005B, 0x01D9, 0x0144, 0x01F6, + 0x00AD, 0x00A5, 0x003A, 0x01CB, 0x0136, 0x017F, 0x0046, 0x00E1, 0x001E, + 0x01DD, 0x00E6, 0x0137, 0x01FA, 0x0185, 0x008C, 0x008F, 0x0040, 0x01B5, + 0x00BE, 0x0078, 0x0000, 0x00AC, 0x0110, 0x015E, 0x0124, 0x0002, 0x01BC, + 0x00A2, 0x00EA, 0x0070, 0x01FC, 0x0116, 0x015C, 0x004C, 0x01C2 }; + +/* +* MISTY1 FI Function +*/ +u16bit FI(u16bit input, u16bit key7, u16bit key9) + { + u16bit D9 = input >> 7, D7 = input & 0x7F; + D9 = MISTY1_SBOX_S9[D9] ^ D7; + D7 = (MISTY1_SBOX_S7[D7] ^ key7 ^ D9) & 0x7F; + D9 = MISTY1_SBOX_S9[D9 ^ key9] ^ D7; + return static_cast((D7 << 9) | D9); + } + +} + +/* +* MISTY1 Encryption +*/ +void MISTY1::enc(const byte in[], byte out[]) const + { + u16bit B0 = load_be(in, 0); + u16bit B1 = load_be(in, 1); + u16bit B2 = load_be(in, 2); + u16bit B3 = load_be(in, 3); + + for(u32bit j = 0; j != 12; j += 3) + { + const u16bit* RK = EK + 8 * j; + + B1 ^= B0 & RK[0]; + B0 ^= B1 | RK[1]; + B3 ^= B2 & RK[2]; + B2 ^= B3 | RK[3]; + + u32bit T0, T1; + + T0 = FI(B0 ^ RK[ 4], RK[ 5], RK[ 6]) ^ B1; + T1 = FI(B1 ^ RK[ 7], RK[ 8], RK[ 9]) ^ T0; + T0 = FI(T0 ^ RK[10], RK[11], RK[12]) ^ T1; + + B2 ^= T1 ^ RK[13]; + B3 ^= T0; + + T0 = FI(B2 ^ RK[14], RK[15], RK[16]) ^ B3; + T1 = FI(B3 ^ RK[17], RK[18], RK[19]) ^ T0; + T0 = FI(T0 ^ RK[20], RK[21], RK[22]) ^ T1; + + B0 ^= T1 ^ RK[23]; + B1 ^= T0; + } + + B1 ^= B0 & EK[96]; + B0 ^= B1 | EK[97]; + B3 ^= B2 & EK[98]; + B2 ^= B3 | EK[99]; + + store_be(out, B2, B3, B0, B1); + } + +/* +* MISTY1 Decryption +*/ +void MISTY1::dec(const byte in[], byte out[]) const + { + u16bit B0 = load_be(in, 2); + u16bit B1 = load_be(in, 3); + u16bit B2 = load_be(in, 0); + u16bit B3 = load_be(in, 1); + + for(u32bit j = 0; j != 12; j += 3) + { + const u16bit* RK = DK + 8 * j; + + B2 ^= B3 | RK[0]; + B3 ^= B2 & RK[1]; + B0 ^= B1 | RK[2]; + B1 ^= B0 & RK[3]; + + u32bit T0, T1; + + T0 = FI(B2 ^ RK[ 4], RK[ 5], RK[ 6]) ^ B3; + T1 = FI(B3 ^ RK[ 7], RK[ 8], RK[ 9]) ^ T0; + T0 = FI(T0 ^ RK[10], RK[11], RK[12]) ^ T1; + + B0 ^= T1 ^ RK[13]; + B1 ^= T0; + + T0 = FI(B0 ^ RK[14], RK[15], RK[16]) ^ B1; + T1 = FI(B1 ^ RK[17], RK[18], RK[19]) ^ T0; + T0 = FI(T0 ^ RK[20], RK[21], RK[22]) ^ T1; + + B2 ^= T1 ^ RK[23]; + B3 ^= T0; + } + + B2 ^= B3 | DK[96]; + B3 ^= B2 & DK[97]; + B0 ^= B1 | DK[98]; + B1 ^= B0 & DK[99]; + + store_be(out, B0, B1, B2, B3); + } + +/* +* MISTY1 Key Schedule +*/ +void MISTY1::key_schedule(const byte key[], u32bit length) + { + SecureBuffer KS; + for(u32bit j = 0; j != length / 2; ++j) + KS[j] = load_be(key, j); + + for(u32bit j = 0; j != 8; ++j) + { + KS[j+ 8] = FI(KS[j], KS[(j+1) % 8] >> 9, KS[(j+1) % 8] & 0x1FF); + KS[j+16] = KS[j+8] >> 9; + KS[j+24] = KS[j+8] & 0x1FF; + } + + /* + * Precomputed indexes for the orderings of the subkeys (MISTY1 reuses + * values) + */ + static const byte EK_ORDER[100] = { + 0x00, 0x0E, 0x0A, 0x04, 0x00, 0x15, 0x1D, 0x02, 0x11, 0x19, 0x07, 0x13, + 0x1B, 0x04, 0x01, 0x16, 0x1E, 0x03, 0x12, 0x1A, 0x00, 0x14, 0x1C, 0x05, + 0x01, 0x0F, 0x0B, 0x05, 0x02, 0x17, 0x1F, 0x04, 0x13, 0x1B, 0x01, 0x15, + 0x1D, 0x06, 0x03, 0x10, 0x18, 0x05, 0x14, 0x1C, 0x02, 0x16, 0x1E, 0x07, + 0x02, 0x08, 0x0C, 0x06, 0x04, 0x11, 0x19, 0x06, 0x15, 0x1D, 0x03, 0x17, + 0x1F, 0x00, 0x05, 0x12, 0x1A, 0x07, 0x16, 0x1E, 0x04, 0x10, 0x18, 0x01, + 0x03, 0x09, 0x0D, 0x07, 0x06, 0x13, 0x1B, 0x00, 0x17, 0x1F, 0x05, 0x11, + 0x19, 0x02, 0x07, 0x14, 0x1C, 0x01, 0x10, 0x18, 0x06, 0x12, 0x1A, 0x03, + 0x04, 0x0A, 0x0E, 0x00 }; + + static const byte DK_ORDER[100] = { + 0x00, 0x0E, 0x0A, 0x04, 0x07, 0x14, 0x1C, 0x01, 0x10, 0x18, 0x06, 0x12, + 0x1A, 0x03, 0x06, 0x13, 0x1B, 0x00, 0x17, 0x1F, 0x05, 0x11, 0x19, 0x02, + 0x07, 0x0D, 0x09, 0x03, 0x05, 0x12, 0x1A, 0x07, 0x16, 0x1E, 0x04, 0x10, + 0x18, 0x01, 0x04, 0x11, 0x19, 0x06, 0x15, 0x1D, 0x03, 0x17, 0x1F, 0x00, + 0x06, 0x0C, 0x08, 0x02, 0x03, 0x10, 0x18, 0x05, 0x14, 0x1C, 0x02, 0x16, + 0x1E, 0x07, 0x02, 0x17, 0x1F, 0x04, 0x13, 0x1B, 0x01, 0x15, 0x1D, 0x06, + 0x05, 0x0B, 0x0F, 0x01, 0x01, 0x16, 0x1E, 0x03, 0x12, 0x1A, 0x00, 0x14, + 0x1C, 0x05, 0x00, 0x15, 0x1D, 0x02, 0x11, 0x19, 0x07, 0x13, 0x1B, 0x04, + 0x04, 0x0A, 0x0E, 0x00 }; + + for(u32bit j = 0; j != 100; ++j) + { + EK[j] = KS[EK_ORDER[j]]; + DK[j] = KS[DK_ORDER[j]]; + } + } + +/* +* MISTY1 Constructor +*/ +MISTY1::MISTY1(u32bit rounds) : BlockCipher(8, 16) + { + if(rounds != 8) + throw Invalid_Argument("MISTY1: Invalid number of rounds: " + + to_string(rounds)); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/misty1/misty1.h b/src/libs/3rdparty/botan/src/block/misty1/misty1.h new file mode 100644 index 00000000000..62d4f856fa3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/misty1/misty1.h @@ -0,0 +1,35 @@ +/** +* MISTY1 +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MISTY1_H__ +#define BOTAN_MISTY1_H__ + +#include + +namespace Botan { + +/** +* MISTY1 +*/ +class BOTAN_DLL MISTY1 : public BlockCipher + { + public: + void clear() throw() { EK.clear(); DK.clear(); } + std::string name() const { return "MISTY1"; } + BlockCipher* clone() const { return new MISTY1; } + MISTY1(u32bit = 8); + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + SecureBuffer EK, DK; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/noekeon/info.txt b/src/libs/3rdparty/botan/src/block/noekeon/info.txt new file mode 100644 index 00000000000..8025c20739d --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/noekeon/info.txt @@ -0,0 +1,10 @@ +realname "Noekeon" + +define NOEKEON + +load_on auto + + +noekeon.cpp +noekeon.h + diff --git a/src/libs/3rdparty/botan/src/block/noekeon/noekeon.cpp b/src/libs/3rdparty/botan/src/block/noekeon/noekeon.cpp new file mode 100644 index 00000000000..90eb9ad2bcc --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/noekeon/noekeon.cpp @@ -0,0 +1,198 @@ +/* +* Noekeon +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Noekeon's Theta Operation +*/ +inline void theta(u32bit& A0, u32bit& A1, + u32bit& A2, u32bit& A3, + const u32bit EK[4]) + { + u32bit T = A0 ^ A2; + T ^= rotate_left(T, 8) ^ rotate_right(T, 8); + A1 ^= T; + A3 ^= T; + + A0 ^= EK[0]; + A1 ^= EK[1]; + A2 ^= EK[2]; + A3 ^= EK[3]; + + T = A1 ^ A3; + T ^= rotate_left(T, 8) ^ rotate_right(T, 8); + A0 ^= T; + A2 ^= T; + } + +/* +* Theta With Null Key +*/ +inline void theta(u32bit& A0, u32bit& A1, + u32bit& A2, u32bit& A3) + { + u32bit T = A0 ^ A2; + T ^= rotate_left(T, 8) ^ rotate_right(T, 8); + A1 ^= T; + A3 ^= T; + + T = A1 ^ A3; + T ^= rotate_left(T, 8) ^ rotate_right(T, 8); + A0 ^= T; + A2 ^= T; + } + +/* +* Noekeon's Gamma S-Box Layer +*/ +inline void gamma(u32bit& A0, u32bit& A1, u32bit& A2, u32bit& A3) + { + A1 ^= ~A3 & ~A2; + A0 ^= A2 & A1; + + u32bit T = A3; + A3 = A0; + A0 = T; + + A2 ^= A0 ^ A1 ^ A3; + + A1 ^= ~A3 & ~A2; + A0 ^= A2 & A1; + } + +} + +/* +* Noekeon Round Constants +*/ +const byte Noekeon::RC[] = { + 0x80, 0x1B, 0x36, 0x6C, 0xD8, 0xAB, 0x4D, 0x9A, + 0x2F, 0x5E, 0xBC, 0x63, 0xC6, 0x97, 0x35, 0x6A, + 0xD4 }; + +/* +* Noekeon Encryption +*/ +void Noekeon::enc(const byte in[], byte out[]) const + { + u32bit A0 = load_be(in, 0); + u32bit A1 = load_be(in, 1); + u32bit A2 = load_be(in, 2); + u32bit A3 = load_be(in, 3); + + for(u32bit j = 0; j != 16; ++j) + { + A0 ^= RC[j]; + theta(A0, A1, A2, A3, EK); + + A1 = rotate_left(A1, 1); + A2 = rotate_left(A2, 5); + A3 = rotate_left(A3, 2); + + gamma(A0, A1, A2, A3); + + A1 = rotate_right(A1, 1); + A2 = rotate_right(A2, 5); + A3 = rotate_right(A3, 2); + } + + A0 ^= RC[16]; + theta(A0, A1, A2, A3, EK); + + store_be(out, A0, A1, A2, A3); + } + +/* +* Noekeon Encryption +*/ +void Noekeon::dec(const byte in[], byte out[]) const + { + u32bit A0 = load_be(in, 0); + u32bit A1 = load_be(in, 1); + u32bit A2 = load_be(in, 2); + u32bit A3 = load_be(in, 3); + + for(u32bit j = 16; j != 0; --j) + { + theta(A0, A1, A2, A3, DK); + A0 ^= RC[j]; + + A1 = rotate_left(A1, 1); + A2 = rotate_left(A2, 5); + A3 = rotate_left(A3, 2); + + gamma(A0, A1, A2, A3); + + A1 = rotate_right(A1, 1); + A2 = rotate_right(A2, 5); + A3 = rotate_right(A3, 2); + } + + theta(A0, A1, A2, A3, DK); + A0 ^= RC[0]; + + store_be(out, A0, A1, A2, A3); + } + +/* +* Noekeon Key Schedule +*/ +void Noekeon::key_schedule(const byte key[], u32bit) + { + u32bit A0 = load_be(key, 0); + u32bit A1 = load_be(key, 1); + u32bit A2 = load_be(key, 2); + u32bit A3 = load_be(key, 3); + + for(u32bit j = 0; j != 16; ++j) + { + A0 ^= RC[j]; + theta(A0, A1, A2, A3); + + A1 = rotate_left(A1, 1); + A2 = rotate_left(A2, 5); + A3 = rotate_left(A3, 2); + + gamma(A0, A1, A2, A3); + + A1 = rotate_right(A1, 1); + A2 = rotate_right(A2, 5); + A3 = rotate_right(A3, 2); + } + + A0 ^= RC[16]; + + DK[0] = A0; + DK[1] = A1; + DK[2] = A2; + DK[3] = A3; + + theta(A0, A1, A2, A3); + + EK[0] = A0; + EK[1] = A1; + EK[2] = A2; + EK[3] = A3; + } + +/* +* Clear memory of sensitive data +*/ +void Noekeon::clear() throw() + { + EK.clear(); + DK.clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/noekeon/noekeon.h b/src/libs/3rdparty/botan/src/block/noekeon/noekeon.h new file mode 100644 index 00000000000..893892446ee --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/noekeon/noekeon.h @@ -0,0 +1,37 @@ +/* +* Noekeon +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_NOEKEON_H__ +#define BOTAN_NOEKEON_H__ + +#include + +namespace Botan { + +/* +* Noekeon +*/ +class BOTAN_DLL Noekeon : public BlockCipher + { + public: + void clear() throw(); + std::string name() const { return "Noekeon"; } + BlockCipher* clone() const { return new Noekeon; } + Noekeon() : BlockCipher(16, 16) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + static const byte RC[17]; + + SecureBuffer EK, DK; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/rc2/info.txt b/src/libs/3rdparty/botan/src/block/rc2/info.txt new file mode 100644 index 00000000000..099141de747 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/rc2/info.txt @@ -0,0 +1,10 @@ +realname "RC2" + +define RC2 + +load_on auto + + +rc2.cpp +rc2.h + diff --git a/src/libs/3rdparty/botan/src/block/rc2/rc2.cpp b/src/libs/3rdparty/botan/src/block/rc2/rc2.cpp new file mode 100644 index 00000000000..5827bdb6858 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/rc2/rc2.cpp @@ -0,0 +1,163 @@ +/* +* RC2 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* RC2 Encryption +*/ +void RC2::enc(const byte in[], byte out[]) const + { + u16bit R0 = load_le(in, 0); + u16bit R1 = load_le(in, 1); + u16bit R2 = load_le(in, 2); + u16bit R3 = load_le(in, 3); + + for(u32bit j = 0; j != 16; ++j) + { + R0 += (R1 & ~R3) + (R2 & R3) + K[4*j]; + R0 = rotate_left(R0, 1); + + R1 += (R2 & ~R0) + (R3 & R0) + K[4*j + 1]; + R1 = rotate_left(R1, 2); + + R2 += (R3 & ~R1) + (R0 & R1) + K[4*j + 2]; + R2 = rotate_left(R2, 3); + + R3 += (R0 & ~R2) + (R1 & R2) + K[4*j + 3]; + R3 = rotate_left(R3, 5); + + if(j == 4 || j == 10) + { + R0 += K[R3 % 64]; + R1 += K[R0 % 64]; + R2 += K[R1 % 64]; + R3 += K[R2 % 64]; + } + } + + store_le(out, R0, R1, R2, R3); + } + +/* +* RC2 Decryption +*/ +void RC2::dec(const byte in[], byte out[]) const + { + u16bit R0 = load_le(in, 0); + u16bit R1 = load_le(in, 1); + u16bit R2 = load_le(in, 2); + u16bit R3 = load_le(in, 3); + + for(u32bit j = 0; j != 16; ++j) + { + R3 = rotate_right(R3, 5); + R3 -= (R0 & ~R2) + (R1 & R2) + K[63 - (4*j + 0)]; + + R2 = rotate_right(R2, 3); + R2 -= (R3 & ~R1) + (R0 & R1) + K[63 - (4*j + 1)]; + + R1 = rotate_right(R1, 2); + R1 -= (R2 & ~R0) + (R3 & R0) + K[63 - (4*j + 2)]; + + R0 = rotate_right(R0, 1); + R0 -= (R1 & ~R3) + (R2 & R3) + K[63 - (4*j + 3)]; + + if(j == 4 || j == 10) + { + R3 -= K[R2 % 64]; + R2 -= K[R1 % 64]; + R1 -= K[R0 % 64]; + R0 -= K[R3 % 64]; + } + } + + store_le(out, R0, R1, R2, R3); + } + +/* +* RC2 Key Schedule +*/ +void RC2::key_schedule(const byte key[], u32bit length) + { + static const byte TABLE[256] = { + 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, 0x28, 0xE9, 0xFD, 0x79, + 0x4A, 0xA0, 0xD8, 0x9D, 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, + 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, 0x17, 0x9A, 0x59, 0xF5, + 0x87, 0xB3, 0x4F, 0x13, 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, + 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, 0xF0, 0x95, 0x21, 0x22, + 0x5C, 0x6B, 0x4E, 0x82, 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, + 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, 0x12, 0x75, 0xCA, 0x1F, + 0x3B, 0xBE, 0xE4, 0xD1, 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, + 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, 0x27, 0xF2, 0x1D, 0x9B, + 0xBC, 0x94, 0x43, 0x03, 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, + 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, 0x08, 0xE8, 0xEA, 0xDE, + 0x80, 0x52, 0xEE, 0xF7, 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, + 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, 0x4B, 0x9F, 0xD0, 0x5E, + 0x04, 0x18, 0xA4, 0xEC, 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, + 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, 0x99, 0x7C, 0x3A, 0x85, + 0x23, 0xB8, 0xB4, 0x7A, 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, + 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, 0x05, 0xDF, 0x29, 0x10, + 0x67, 0x6C, 0xBA, 0xC9, 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, + 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, 0x0D, 0x38, 0x34, 0x1B, + 0xAB, 0x33, 0xFF, 0xB0, 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, + 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, 0x0A, 0xA6, 0x20, 0x68, + 0xFE, 0x7F, 0xC1, 0xAD }; + + SecureBuffer L; + L.copy(key, length); + + for(u32bit j = length; j != 128; ++j) + L[j] = TABLE[(L[j-1] + L[j-length]) % 256]; + L[128-length] = TABLE[L[128-length]]; + for(s32bit j = 127-length; j >= 0; --j) + L[j] = TABLE[L[j+1] ^ L[j+length]]; + + for(u32bit j = 0; j != 64; ++j) + K[j] = load_le(L, j); + } + +/* +* Return the code of the effective key bits +*/ +byte RC2::EKB_code(u32bit ekb) + { + const byte EKB[256] = { + 0xBD, 0x56, 0xEA, 0xF2, 0xA2, 0xF1, 0xAC, 0x2A, 0xB0, 0x93, 0xD1, 0x9C, + 0x1B, 0x33, 0xFD, 0xD0, 0x30, 0x04, 0xB6, 0xDC, 0x7D, 0xDF, 0x32, 0x4B, + 0xF7, 0xCB, 0x45, 0x9B, 0x31, 0xBB, 0x21, 0x5A, 0x41, 0x9F, 0xE1, 0xD9, + 0x4A, 0x4D, 0x9E, 0xDA, 0xA0, 0x68, 0x2C, 0xC3, 0x27, 0x5F, 0x80, 0x36, + 0x3E, 0xEE, 0xFB, 0x95, 0x1A, 0xFE, 0xCE, 0xA8, 0x34, 0xA9, 0x13, 0xF0, + 0xA6, 0x3F, 0xD8, 0x0C, 0x78, 0x24, 0xAF, 0x23, 0x52, 0xC1, 0x67, 0x17, + 0xF5, 0x66, 0x90, 0xE7, 0xE8, 0x07, 0xB8, 0x60, 0x48, 0xE6, 0x1E, 0x53, + 0xF3, 0x92, 0xA4, 0x72, 0x8C, 0x08, 0x15, 0x6E, 0x86, 0x00, 0x84, 0xFA, + 0xF4, 0x7F, 0x8A, 0x42, 0x19, 0xF6, 0xDB, 0xCD, 0x14, 0x8D, 0x50, 0x12, + 0xBA, 0x3C, 0x06, 0x4E, 0xEC, 0xB3, 0x35, 0x11, 0xA1, 0x88, 0x8E, 0x2B, + 0x94, 0x99, 0xB7, 0x71, 0x74, 0xD3, 0xE4, 0xBF, 0x3A, 0xDE, 0x96, 0x0E, + 0xBC, 0x0A, 0xED, 0x77, 0xFC, 0x37, 0x6B, 0x03, 0x79, 0x89, 0x62, 0xC6, + 0xD7, 0xC0, 0xD2, 0x7C, 0x6A, 0x8B, 0x22, 0xA3, 0x5B, 0x05, 0x5D, 0x02, + 0x75, 0xD5, 0x61, 0xE3, 0x18, 0x8F, 0x55, 0x51, 0xAD, 0x1F, 0x0B, 0x5E, + 0x85, 0xE5, 0xC2, 0x57, 0x63, 0xCA, 0x3D, 0x6C, 0xB4, 0xC5, 0xCC, 0x70, + 0xB2, 0x91, 0x59, 0x0D, 0x47, 0x20, 0xC8, 0x4F, 0x58, 0xE0, 0x01, 0xE2, + 0x16, 0x38, 0xC4, 0x6F, 0x3B, 0x0F, 0x65, 0x46, 0xBE, 0x7E, 0x2D, 0x7B, + 0x82, 0xF9, 0x40, 0xB5, 0x1D, 0x73, 0xF8, 0xEB, 0x26, 0xC7, 0x87, 0x97, + 0x25, 0x54, 0xB1, 0x28, 0xAA, 0x98, 0x9D, 0xA5, 0x64, 0x6D, 0x7A, 0xD4, + 0x10, 0x81, 0x44, 0xEF, 0x49, 0xD6, 0xAE, 0x2E, 0xDD, 0x76, 0x5C, 0x2F, + 0xA7, 0x1C, 0xC9, 0x09, 0x69, 0x9A, 0x83, 0xCF, 0x29, 0x39, 0xB9, 0xE9, + 0x4C, 0xFF, 0x43, 0xAB }; + + if(ekb < 256) + return EKB[ekb]; + else + throw Encoding_Error("RC2::EKB_code: EKB is too large"); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/rc2/rc2.h b/src/libs/3rdparty/botan/src/block/rc2/rc2.h new file mode 100644 index 00000000000..cb6f58f046a --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/rc2/rc2.h @@ -0,0 +1,37 @@ +/* +* RC2 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_RC2_H__ +#define BOTAN_RC2_H__ + +#include + +namespace Botan { + +/* +* RC2 +*/ +class BOTAN_DLL RC2 : public BlockCipher + { + public: + static byte EKB_code(u32bit); + + void clear() throw() { K.clear(); } + std::string name() const { return "RC2"; } + BlockCipher* clone() const { return new RC2; } + RC2() : BlockCipher(8, 1, 32) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + SecureBuffer K; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/rc5/info.txt b/src/libs/3rdparty/botan/src/block/rc5/info.txt new file mode 100644 index 00000000000..4a150c3b020 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/rc5/info.txt @@ -0,0 +1,10 @@ +realname "RC5" + +define RC5 + +load_on auto + + +rc5.cpp +rc5.h + diff --git a/src/libs/3rdparty/botan/src/block/rc5/rc5.cpp b/src/libs/3rdparty/botan/src/block/rc5/rc5.cpp new file mode 100644 index 00000000000..5d83d5a4e23 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/rc5/rc5.cpp @@ -0,0 +1,103 @@ +/* +* RC5 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* RC5 Encryption +*/ +void RC5::enc(const byte in[], byte out[]) const + { + u32bit A = load_le(in, 0), B = load_le(in, 1); + + A += S[0]; B += S[1]; + for(u32bit j = 0; j != ROUNDS; j += 4) + { + A = rotate_left(A ^ B, B % 32) + S[2*j+2]; + B = rotate_left(B ^ A, A % 32) + S[2*j+3]; + A = rotate_left(A ^ B, B % 32) + S[2*j+4]; + B = rotate_left(B ^ A, A % 32) + S[2*j+5]; + A = rotate_left(A ^ B, B % 32) + S[2*j+6]; + B = rotate_left(B ^ A, A % 32) + S[2*j+7]; + A = rotate_left(A ^ B, B % 32) + S[2*j+8]; + B = rotate_left(B ^ A, A % 32) + S[2*j+9]; + } + + store_le(out, A, B); + } + +/* +* RC5 Decryption +*/ +void RC5::dec(const byte in[], byte out[]) const + { + u32bit A = load_le(in, 0), B = load_le(in, 1); + + for(u32bit j = ROUNDS; j != 0; j -= 4) + { + B = rotate_right(B - S[2*j+1], A % 32) ^ A; + A = rotate_right(A - S[2*j ], B % 32) ^ B; + B = rotate_right(B - S[2*j-1], A % 32) ^ A; + A = rotate_right(A - S[2*j-2], B % 32) ^ B; + B = rotate_right(B - S[2*j-3], A % 32) ^ A; + A = rotate_right(A - S[2*j-4], B % 32) ^ B; + B = rotate_right(B - S[2*j-5], A % 32) ^ A; + A = rotate_right(A - S[2*j-6], B % 32) ^ B; + } + B -= S[1]; A -= S[0]; + + store_le(out, A, B); + } + +/* +* RC5 Key Schedule +*/ +void RC5::key_schedule(const byte key[], u32bit length) + { + const u32bit WORD_KEYLENGTH = (((length - 1) / 4) + 1), + MIX_ROUNDS = 3*std::max(WORD_KEYLENGTH, S.size()); + S[0] = 0xB7E15163; + for(u32bit j = 1; j != S.size(); ++j) + S[j] = S[j-1] + 0x9E3779B9; + + SecureBuffer K; + for(s32bit j = length-1; j >= 0; --j) + K[j/4] = (K[j/4] << 8) + key[j]; + for(u32bit j = 0, A = 0, B = 0; j != MIX_ROUNDS; ++j) + { + A = rotate_left(S[j % S.size()] + A + B, 3); + B = rotate_left(K[j % WORD_KEYLENGTH] + A + B, (A + B) % 32); + S[j % S.size()] = A; + K[j % WORD_KEYLENGTH] = B; + } + } + +/* +* Return the name of this type +*/ +std::string RC5::name() const + { + return "RC5(" + to_string(ROUNDS) + ")"; + } + +/* +* RC5 Constructor +*/ +RC5::RC5(u32bit r) : BlockCipher(8, 1, 32), ROUNDS(r) + { + if(ROUNDS < 8 || ROUNDS > 32 || (ROUNDS % 4 != 0)) + throw Invalid_Argument(name() + ": Invalid number of rounds"); + S.create(2*ROUNDS + 2); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/rc5/rc5.h b/src/libs/3rdparty/botan/src/block/rc5/rc5.h new file mode 100644 index 00000000000..083224720b9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/rc5/rc5.h @@ -0,0 +1,35 @@ +/* +* RC5 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_RC5_H__ +#define BOTAN_RC5_H__ + +#include + +namespace Botan { + +/* +* RC5 +*/ +class BOTAN_DLL RC5 : public BlockCipher + { + public: + void clear() throw() { S.clear(); } + std::string name() const; + BlockCipher* clone() const { return new RC5(ROUNDS); } + RC5(u32bit); + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + SecureVector S; + const u32bit ROUNDS; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/rc6/info.txt b/src/libs/3rdparty/botan/src/block/rc6/info.txt new file mode 100644 index 00000000000..1457e78c189 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/rc6/info.txt @@ -0,0 +1,10 @@ +realname "RC6" + +define RC6 + +load_on auto + + +rc6.cpp +rc6.h + diff --git a/src/libs/3rdparty/botan/src/block/rc6/rc6.cpp b/src/libs/3rdparty/botan/src/block/rc6/rc6.cpp new file mode 100644 index 00000000000..3b30ea93a10 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/rc6/rc6.cpp @@ -0,0 +1,122 @@ +/* +* RC6 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* RC6 Encryption +*/ +void RC6::enc(const byte in[], byte out[]) const + { + u32bit A = load_le(in, 0); + u32bit B = load_le(in, 1); + u32bit C = load_le(in, 2); + u32bit D = load_le(in, 3); + + B += S[0]; D += S[1]; + + for(u32bit j = 0; j != 20; j += 4) + { + u32bit T1, T2; + + T1 = rotate_left(B*(2*B+1), 5); + T2 = rotate_left(D*(2*D+1), 5); + A = rotate_left(A ^ T1, T2 % 32) + S[2*j+2]; + C = rotate_left(C ^ T2, T1 % 32) + S[2*j+3]; + + T1 = rotate_left(C*(2*C+1), 5); + T2 = rotate_left(A*(2*A+1), 5); + B = rotate_left(B ^ T1, T2 % 32) + S[2*j+4]; + D = rotate_left(D ^ T2, T1 % 32) + S[2*j+5]; + + T1 = rotate_left(D*(2*D+1), 5); + T2 = rotate_left(B*(2*B+1), 5); + C = rotate_left(C ^ T1, T2 % 32) + S[2*j+6]; + A = rotate_left(A ^ T2, T1 % 32) + S[2*j+7]; + + T1 = rotate_left(A*(2*A+1), 5); + T2 = rotate_left(C*(2*C+1), 5); + D = rotate_left(D ^ T1, T2 % 32) + S[2*j+8]; + B = rotate_left(B ^ T2, T1 % 32) + S[2*j+9]; + } + + A += S[42]; C += S[43]; + + store_le(out, A, B, C, D); + } + +/* +* RC6 Decryption +*/ +void RC6::dec(const byte in[], byte out[]) const + { + u32bit A = load_le(in, 0); + u32bit B = load_le(in, 1); + u32bit C = load_le(in, 2); + u32bit D = load_le(in, 3); + + C -= S[43]; A -= S[42]; + + for(u32bit j = 0; j != 20; j += 4) + { + u32bit T1, T2; + + T1 = rotate_left(A*(2*A+1), 5); + T2 = rotate_left(C*(2*C+1), 5); + B = rotate_right(B - S[41 - 2*j], T1 % 32) ^ T2; + D = rotate_right(D - S[40 - 2*j], T2 % 32) ^ T1; + + T1 = rotate_left(D*(2*D+1), 5); + T2 = rotate_left(B*(2*B+1), 5); + A = rotate_right(A - S[39 - 2*j], T1 % 32) ^ T2; + C = rotate_right(C - S[38 - 2*j], T2 % 32) ^ T1; + + T1 = rotate_left(C*(2*C+1), 5); + T2 = rotate_left(A*(2*A+1), 5); + D = rotate_right(D - S[37 - 2*j], T1 % 32) ^ T2; + B = rotate_right(B - S[36 - 2*j], T2 % 32) ^ T1; + + T1 = rotate_left(B*(2*B+1), 5); + T2 = rotate_left(D*(2*D+1), 5); + C = rotate_right(C - S[35 - 2*j], T1 % 32) ^ T2; + A = rotate_right(A - S[34 - 2*j], T2 % 32) ^ T1; + } + + D -= S[1]; B -= S[0]; + + store_le(out, A, B, C, D); + } + +/* +* RC6 Key Schedule +*/ +void RC6::key_schedule(const byte key[], u32bit length) + { + const u32bit WORD_KEYLENGTH = (((length - 1) / 4) + 1), + MIX_ROUNDS = 3*std::max(WORD_KEYLENGTH, S.size()); + S[0] = 0xB7E15163; + for(u32bit j = 1; j != S.size(); ++j) + S[j] = S[j-1] + 0x9E3779B9; + + SecureBuffer K; + for(s32bit j = length-1; j >= 0; --j) + K[j/4] = (K[j/4] << 8) + key[j]; + for(u32bit j = 0, A = 0, B = 0; j != MIX_ROUNDS; ++j) + { + A = rotate_left(S[j % S.size()] + A + B, 3); + B = rotate_left(K[j % WORD_KEYLENGTH] + A + B, (A + B) % 32); + S[j % S.size()] = A; + K[j % WORD_KEYLENGTH] = B; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/block/rc6/rc6.h b/src/libs/3rdparty/botan/src/block/rc6/rc6.h new file mode 100644 index 00000000000..cb2800be731 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/rc6/rc6.h @@ -0,0 +1,35 @@ +/* +* RC6 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_RC6_H__ +#define BOTAN_RC6_H__ + +#include + +namespace Botan { + +/* +* RC6 +*/ +class BOTAN_DLL RC6 : public BlockCipher + { + public: + void clear() throw() { S.clear(); } + std::string name() const { return "RC6"; } + BlockCipher* clone() const { return new RC6; } + RC6() : BlockCipher(16, 1, 32) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + SecureBuffer S; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/safer/info.txt b/src/libs/3rdparty/botan/src/block/safer/info.txt new file mode 100644 index 00000000000..973cbff19bc --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/safer/info.txt @@ -0,0 +1,11 @@ +realname "SAFER" + +define SAFER + +load_on auto + + +safe_tab.cpp +safer_sk.cpp +safer_sk.h + diff --git a/src/libs/3rdparty/botan/src/block/safer/safe_tab.cpp b/src/libs/3rdparty/botan/src/block/safer/safe_tab.cpp new file mode 100644 index 00000000000..e265a40eb65 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/safer/safe_tab.cpp @@ -0,0 +1,121 @@ +/* +* S-Box Tables for SAFER-SK +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +const byte SAFER_SK::EXP[256] = { + 0x01, 0x2D, 0xE2, 0x93, 0xBE, 0x45, 0x15, 0xAE, 0x78, 0x03, 0x87, 0xA4, + 0xB8, 0x38, 0xCF, 0x3F, 0x08, 0x67, 0x09, 0x94, 0xEB, 0x26, 0xA8, 0x6B, + 0xBD, 0x18, 0x34, 0x1B, 0xBB, 0xBF, 0x72, 0xF7, 0x40, 0x35, 0x48, 0x9C, + 0x51, 0x2F, 0x3B, 0x55, 0xE3, 0xC0, 0x9F, 0xD8, 0xD3, 0xF3, 0x8D, 0xB1, + 0xFF, 0xA7, 0x3E, 0xDC, 0x86, 0x77, 0xD7, 0xA6, 0x11, 0xFB, 0xF4, 0xBA, + 0x92, 0x91, 0x64, 0x83, 0xF1, 0x33, 0xEF, 0xDA, 0x2C, 0xB5, 0xB2, 0x2B, + 0x88, 0xD1, 0x99, 0xCB, 0x8C, 0x84, 0x1D, 0x14, 0x81, 0x97, 0x71, 0xCA, + 0x5F, 0xA3, 0x8B, 0x57, 0x3C, 0x82, 0xC4, 0x52, 0x5C, 0x1C, 0xE8, 0xA0, + 0x04, 0xB4, 0x85, 0x4A, 0xF6, 0x13, 0x54, 0xB6, 0xDF, 0x0C, 0x1A, 0x8E, + 0xDE, 0xE0, 0x39, 0xFC, 0x20, 0x9B, 0x24, 0x4E, 0xA9, 0x98, 0x9E, 0xAB, + 0xF2, 0x60, 0xD0, 0x6C, 0xEA, 0xFA, 0xC7, 0xD9, 0x00, 0xD4, 0x1F, 0x6E, + 0x43, 0xBC, 0xEC, 0x53, 0x89, 0xFE, 0x7A, 0x5D, 0x49, 0xC9, 0x32, 0xC2, + 0xF9, 0x9A, 0xF8, 0x6D, 0x16, 0xDB, 0x59, 0x96, 0x44, 0xE9, 0xCD, 0xE6, + 0x46, 0x42, 0x8F, 0x0A, 0xC1, 0xCC, 0xB9, 0x65, 0xB0, 0xD2, 0xC6, 0xAC, + 0x1E, 0x41, 0x62, 0x29, 0x2E, 0x0E, 0x74, 0x50, 0x02, 0x5A, 0xC3, 0x25, + 0x7B, 0x8A, 0x2A, 0x5B, 0xF0, 0x06, 0x0D, 0x47, 0x6F, 0x70, 0x9D, 0x7E, + 0x10, 0xCE, 0x12, 0x27, 0xD5, 0x4C, 0x4F, 0xD6, 0x79, 0x30, 0x68, 0x36, + 0x75, 0x7D, 0xE4, 0xED, 0x80, 0x6A, 0x90, 0x37, 0xA2, 0x5E, 0x76, 0xAA, + 0xC5, 0x7F, 0x3D, 0xAF, 0xA5, 0xE5, 0x19, 0x61, 0xFD, 0x4D, 0x7C, 0xB7, + 0x0B, 0xEE, 0xAD, 0x4B, 0x22, 0xF5, 0xE7, 0x73, 0x23, 0x21, 0xC8, 0x05, + 0xE1, 0x66, 0xDD, 0xB3, 0x58, 0x69, 0x63, 0x56, 0x0F, 0xA1, 0x31, 0x95, + 0x17, 0x07, 0x3A, 0x28 }; + +const byte SAFER_SK::LOG[512] = { + 0x80, 0x00, 0xB0, 0x09, 0x60, 0xEF, 0xB9, 0xFD, 0x10, 0x12, 0x9F, 0xE4, + 0x69, 0xBA, 0xAD, 0xF8, 0xC0, 0x38, 0xC2, 0x65, 0x4F, 0x06, 0x94, 0xFC, + 0x19, 0xDE, 0x6A, 0x1B, 0x5D, 0x4E, 0xA8, 0x82, 0x70, 0xED, 0xE8, 0xEC, + 0x72, 0xB3, 0x15, 0xC3, 0xFF, 0xAB, 0xB6, 0x47, 0x44, 0x01, 0xAC, 0x25, + 0xC9, 0xFA, 0x8E, 0x41, 0x1A, 0x21, 0xCB, 0xD3, 0x0D, 0x6E, 0xFE, 0x26, + 0x58, 0xDA, 0x32, 0x0F, 0x20, 0xA9, 0x9D, 0x84, 0x98, 0x05, 0x9C, 0xBB, + 0x22, 0x8C, 0x63, 0xE7, 0xC5, 0xE1, 0x73, 0xC6, 0xAF, 0x24, 0x5B, 0x87, + 0x66, 0x27, 0xF7, 0x57, 0xF4, 0x96, 0xB1, 0xB7, 0x5C, 0x8B, 0xD5, 0x54, + 0x79, 0xDF, 0xAA, 0xF6, 0x3E, 0xA3, 0xF1, 0x11, 0xCA, 0xF5, 0xD1, 0x17, + 0x7B, 0x93, 0x83, 0xBC, 0xBD, 0x52, 0x1E, 0xEB, 0xAE, 0xCC, 0xD6, 0x35, + 0x08, 0xC8, 0x8A, 0xB4, 0xE2, 0xCD, 0xBF, 0xD9, 0xD0, 0x50, 0x59, 0x3F, + 0x4D, 0x62, 0x34, 0x0A, 0x48, 0x88, 0xB5, 0x56, 0x4C, 0x2E, 0x6B, 0x9E, + 0xD2, 0x3D, 0x3C, 0x03, 0x13, 0xFB, 0x97, 0x51, 0x75, 0x4A, 0x91, 0x71, + 0x23, 0xBE, 0x76, 0x2A, 0x5F, 0xF9, 0xD4, 0x55, 0x0B, 0xDC, 0x37, 0x31, + 0x16, 0x74, 0xD7, 0x77, 0xA7, 0xE6, 0x07, 0xDB, 0xA4, 0x2F, 0x46, 0xF3, + 0x61, 0x45, 0x67, 0xE3, 0x0C, 0xA2, 0x3B, 0x1C, 0x85, 0x18, 0x04, 0x1D, + 0x29, 0xA0, 0x8F, 0xB2, 0x5A, 0xD8, 0xA6, 0x7E, 0xEE, 0x8D, 0x53, 0x4B, + 0xA1, 0x9A, 0xC1, 0x0E, 0x7A, 0x49, 0xA5, 0x2C, 0x81, 0xC4, 0xC7, 0x36, + 0x2B, 0x7F, 0x43, 0x95, 0x33, 0xF2, 0x6C, 0x68, 0x6D, 0xF0, 0x02, 0x28, + 0xCE, 0xDD, 0x9B, 0xEA, 0x5E, 0x99, 0x7C, 0x14, 0x86, 0xCF, 0xE5, 0x42, + 0xB8, 0x40, 0x78, 0x2D, 0x3A, 0xE9, 0x64, 0x1F, 0x92, 0x90, 0x7D, 0x39, + 0x6F, 0xE0, 0x89, 0x30, 0x80, 0x00, 0xB0, 0x09, 0x60, 0xEF, 0xB9, 0xFD, + 0x10, 0x12, 0x9F, 0xE4, 0x69, 0xBA, 0xAD, 0xF8, 0xC0, 0x38, 0xC2, 0x65, + 0x4F, 0x06, 0x94, 0xFC, 0x19, 0xDE, 0x6A, 0x1B, 0x5D, 0x4E, 0xA8, 0x82, + 0x70, 0xED, 0xE8, 0xEC, 0x72, 0xB3, 0x15, 0xC3, 0xFF, 0xAB, 0xB6, 0x47, + 0x44, 0x01, 0xAC, 0x25, 0xC9, 0xFA, 0x8E, 0x41, 0x1A, 0x21, 0xCB, 0xD3, + 0x0D, 0x6E, 0xFE, 0x26, 0x58, 0xDA, 0x32, 0x0F, 0x20, 0xA9, 0x9D, 0x84, + 0x98, 0x05, 0x9C, 0xBB, 0x22, 0x8C, 0x63, 0xE7, 0xC5, 0xE1, 0x73, 0xC6, + 0xAF, 0x24, 0x5B, 0x87, 0x66, 0x27, 0xF7, 0x57, 0xF4, 0x96, 0xB1, 0xB7, + 0x5C, 0x8B, 0xD5, 0x54, 0x79, 0xDF, 0xAA, 0xF6, 0x3E, 0xA3, 0xF1, 0x11, + 0xCA, 0xF5, 0xD1, 0x17, 0x7B, 0x93, 0x83, 0xBC, 0xBD, 0x52, 0x1E, 0xEB, + 0xAE, 0xCC, 0xD6, 0x35, 0x08, 0xC8, 0x8A, 0xB4, 0xE2, 0xCD, 0xBF, 0xD9, + 0xD0, 0x50, 0x59, 0x3F, 0x4D, 0x62, 0x34, 0x0A, 0x48, 0x88, 0xB5, 0x56, + 0x4C, 0x2E, 0x6B, 0x9E, 0xD2, 0x3D, 0x3C, 0x03, 0x13, 0xFB, 0x97, 0x51, + 0x75, 0x4A, 0x91, 0x71, 0x23, 0xBE, 0x76, 0x2A, 0x5F, 0xF9, 0xD4, 0x55, + 0x0B, 0xDC, 0x37, 0x31, 0x16, 0x74, 0xD7, 0x77, 0xA7, 0xE6, 0x07, 0xDB, + 0xA4, 0x2F, 0x46, 0xF3, 0x61, 0x45, 0x67, 0xE3, 0x0C, 0xA2, 0x3B, 0x1C, + 0x85, 0x18, 0x04, 0x1D, 0x29, 0xA0, 0x8F, 0xB2, 0x5A, 0xD8, 0xA6, 0x7E, + 0xEE, 0x8D, 0x53, 0x4B, 0xA1, 0x9A, 0xC1, 0x0E, 0x7A, 0x49, 0xA5, 0x2C, + 0x81, 0xC4, 0xC7, 0x36, 0x2B, 0x7F, 0x43, 0x95, 0x33, 0xF2, 0x6C, 0x68, + 0x6D, 0xF0, 0x02, 0x28, 0xCE, 0xDD, 0x9B, 0xEA, 0x5E, 0x99, 0x7C, 0x14, + 0x86, 0xCF, 0xE5, 0x42, 0xB8, 0x40, 0x78, 0x2D, 0x3A, 0xE9, 0x64, 0x1F, + 0x92, 0x90, 0x7D, 0x39, 0x6F, 0xE0, 0x89, 0x30 }; + +const byte SAFER_SK::BIAS[208] = { + 0x16, 0x73, 0x3B, 0x1E, 0x8E, 0x70, 0xBD, 0x86, 0x47, 0x7E, 0x24, 0x56, + 0xF1, 0x77, 0x88, 0x46, 0xB1, 0xBA, 0xA3, 0xB7, 0x10, 0x0A, 0xC5, 0x37, + 0xC9, 0x5A, 0x28, 0xAC, 0x64, 0xA5, 0xEC, 0xAB, 0xC6, 0x67, 0x95, 0x58, + 0x0D, 0xF8, 0x9A, 0xF6, 0x66, 0xDC, 0x05, 0x3D, 0xD3, 0x8A, 0xC3, 0xD8, + 0x6A, 0xE9, 0x36, 0x49, 0x43, 0xBF, 0xEB, 0xD4, 0x9B, 0x68, 0xA0, 0x65, + 0x5D, 0x57, 0x92, 0x1F, 0x71, 0x5C, 0xBB, 0x22, 0xC1, 0xBE, 0x7B, 0xBC, + 0x63, 0x94, 0x5F, 0x2A, 0x61, 0xB8, 0x34, 0x32, 0xFD, 0xFB, 0x17, 0x40, + 0xE6, 0x51, 0x1D, 0x41, 0x8F, 0x29, 0xDD, 0x04, 0x80, 0xDE, 0xE7, 0x31, + 0x7F, 0x01, 0xA2, 0xF7, 0x39, 0xDA, 0x6F, 0x23, 0xFE, 0x3A, 0xD0, 0x1C, + 0xD1, 0x30, 0x3E, 0x12, 0xCD, 0x0F, 0xE0, 0xA8, 0xAF, 0x82, 0x59, 0x2C, + 0x7D, 0xAD, 0xB2, 0xEF, 0xC2, 0x87, 0xCE, 0x75, 0x13, 0x02, 0x90, 0x4F, + 0x2E, 0x72, 0x33, 0x85, 0x8D, 0xCF, 0xA9, 0x81, 0xE2, 0xC4, 0x27, 0x2F, + 0x7A, 0x9F, 0x52, 0xE1, 0x15, 0x38, 0x2B, 0xFC, 0x42, 0xC7, 0x08, 0xE4, + 0x09, 0x55, 0x5E, 0x8C, 0x76, 0x60, 0xFF, 0xDF, 0xD7, 0x98, 0xFA, 0x0B, + 0x00, 0x1A, 0xF9, 0xA6, 0xB9, 0xE8, 0x9E, 0x62, 0xD9, 0x91, 0x50, 0xD2, + 0xEE, 0x18, 0xB4, 0x07, 0xEA, 0x5B, 0xA4, 0xC8, 0x0E, 0xCB, 0x48, 0x69, + 0x4E, 0x9C, 0x35, 0x79, 0x45, 0x4D, 0x54, 0xE5, 0x3C, 0x0C, 0x4A, 0x8B, + 0x3F, 0xCC, 0xA7, 0xDB }; + +const byte SAFER_SK::KEY_INDEX[208] = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0B, 0x0C, 0x0D, 0x0E, + 0x0F, 0x10, 0x11, 0x09, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x01, + 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08, + 0x00, 0x01, 0x02, 0x03, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, + 0x07, 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x11, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x00, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x09, 0x0A, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x01, 0x02, 0x0E, 0x0F, 0x10, 0x11, + 0x09, 0x0A, 0x0B, 0x0C, 0x06, 0x07, 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x08, 0x00, 0x01, 0x02, + 0x03, 0x04, 0x05, 0x06, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0B, 0x0C, 0x0D, 0x0E, + 0x0F, 0x10, 0x11, 0x09, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x01, + 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08, + 0x00, 0x01, 0x02, 0x03, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, + 0x07, 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x11, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F }; + +} diff --git a/src/libs/3rdparty/botan/src/block/safer/safer_sk.cpp b/src/libs/3rdparty/botan/src/block/safer/safer_sk.cpp new file mode 100644 index 00000000000..f72c4773bf2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/safer/safer_sk.cpp @@ -0,0 +1,115 @@ +/* +* SAFER-SK +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* SAFER-SK Encryption +*/ +void SAFER_SK::enc(const byte in[], byte out[]) const + { + byte A = in[0], B = in[1], C = in[2], D = in[3], + E = in[4], F = in[5], G = in[6], H = in[7], X, Y; + for(u32bit j = 0; j != 16*ROUNDS; j += 16) + { + A = EXP[A ^ EK[j ]]; B = LOG[B + EK[j+1]]; + C = LOG[C + EK[j+2]]; D = EXP[D ^ EK[j+3]]; + E = EXP[E ^ EK[j+4]]; F = LOG[F + EK[j+5]]; + G = LOG[G + EK[j+6]]; H = EXP[H ^ EK[j+7]]; + A += EK[j+ 8]; B ^= EK[j+ 9]; C ^= EK[j+10]; D += EK[j+11]; + E += EK[j+12]; F ^= EK[j+13]; G ^= EK[j+14]; H += EK[j+15]; + B += A; D += C; F += E; H += G; A += B; C += D; E += F; G += H; + C += A; G += E; D += B; H += F; A += C; E += G; B += D; F += H; + H += D; Y = D + H; D = B + F; X = B + D; B = A + E; + A += B; F = C + G; E = C + F; C = X; G = Y; + } + out[0] = A ^ EK[16*ROUNDS+0]; out[1] = B + EK[16*ROUNDS+1]; + out[2] = C + EK[16*ROUNDS+2]; out[3] = D ^ EK[16*ROUNDS+3]; + out[4] = E ^ EK[16*ROUNDS+4]; out[5] = F + EK[16*ROUNDS+5]; + out[6] = G + EK[16*ROUNDS+6]; out[7] = H ^ EK[16*ROUNDS+7]; + } + +/* +* SAFER-SK Decryption +*/ +void SAFER_SK::dec(const byte in[], byte out[]) const + { + byte A = in[0], B = in[1], C = in[2], D = in[3], + E = in[4], F = in[5], G = in[6], H = in[7]; + A ^= EK[16*ROUNDS+0]; B -= EK[16*ROUNDS+1]; C -= EK[16*ROUNDS+2]; + D ^= EK[16*ROUNDS+3]; E ^= EK[16*ROUNDS+4]; F -= EK[16*ROUNDS+5]; + G -= EK[16*ROUNDS+6]; H ^= EK[16*ROUNDS+7]; + for(s32bit j = 16*(ROUNDS-1); j >= 0; j -= 16) + { + byte T = E; E = B; B = C; C = T; T = F; F = D; D = G; G = T; + A -= E; B -= F; C -= G; D -= H; E -= A; F -= B; G -= C; H -= D; + A -= C; E -= G; B -= D; F -= H; C -= A; G -= E; D -= B; H -= F; + A -= B; C -= D; E -= F; G -= H; B -= A; D -= C; F -= E; H -= G; + A = LOG[A - EK[j+8 ] + 256]; B = EXP[B ^ EK[j+9 ]]; + C = EXP[C ^ EK[j+10]]; D = LOG[D - EK[j+11] + 256]; + E = LOG[E - EK[j+12] + 256]; F = EXP[F ^ EK[j+13]]; + G = EXP[G ^ EK[j+14]]; H = LOG[H - EK[j+15] + 256]; + A ^= EK[j+0]; B -= EK[j+1]; C -= EK[j+2]; D ^= EK[j+3]; + E ^= EK[j+4]; F -= EK[j+5]; G -= EK[j+6]; H ^= EK[j+7]; + } + out[0] = A; out[1] = B; out[2] = C; out[3] = D; + out[4] = E; out[5] = F; out[6] = G; out[7] = H; + } + +/* +* SAFER-SK Key Schedule +*/ +void SAFER_SK::key_schedule(const byte key[], u32bit) + { + SecureBuffer KB; + + for(u32bit j = 0; j != 8; ++j) + { + KB[ 8] ^= KB[j] = rotate_left(key[j], 5); + KB[17] ^= KB[j+9] = EK[j] = key[j+8]; + } + for(u32bit j = 0; j != ROUNDS; ++j) + { + for(u32bit k = 0; k != 18; ++k) + KB[k] = rotate_left(KB[k], 6); + for(u32bit k = 0; k != 16; ++k) + EK[16*j+k+8] = KB[KEY_INDEX[16*j+k]] + BIAS[16*j+k]; + } + } + +/* +* Return the name of this type +*/ +std::string SAFER_SK::name() const + { + return "SAFER-SK(" + to_string(ROUNDS) + ")"; + } + +/* +* Return a clone of this object +*/ +BlockCipher* SAFER_SK::clone() const + { + return new SAFER_SK(ROUNDS); + } + +/* +* SAFER-SK Constructor +*/ +SAFER_SK::SAFER_SK(u32bit rounds) : BlockCipher(8, 16), + EK(16 * rounds + 8), ROUNDS(rounds) + { + if(ROUNDS > 13 || ROUNDS == 0) + throw Invalid_Argument(name() + ": Invalid number of rounds"); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/safer/safer_sk.h b/src/libs/3rdparty/botan/src/block/safer/safer_sk.h new file mode 100644 index 00000000000..e52c5837cd6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/safer/safer_sk.h @@ -0,0 +1,40 @@ +/* +* SAFER-SK +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SAFER_SK_H__ +#define BOTAN_SAFER_SK_H__ + +#include + +namespace Botan { + +/* +* SAFER-SK +*/ +class BOTAN_DLL SAFER_SK : public BlockCipher + { + public: + void clear() throw() { EK.clear(); } + std::string name() const; + BlockCipher* clone() const; + SAFER_SK(u32bit); + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + static const byte EXP[256]; + static const byte LOG[512]; + static const byte BIAS[208]; + static const byte KEY_INDEX[208]; + SecureVector EK; + const u32bit ROUNDS; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/seed/info.txt b/src/libs/3rdparty/botan/src/block/seed/info.txt new file mode 100644 index 00000000000..d04979335c9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/seed/info.txt @@ -0,0 +1,11 @@ +realname "SEED" + +define SEED + +load_on auto + + +seed.cpp +seed.h +seed_tab.cpp + diff --git a/src/libs/3rdparty/botan/src/block/seed/seed.cpp b/src/libs/3rdparty/botan/src/block/seed/seed.cpp new file mode 100644 index 00000000000..b06a7cd7745 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/seed/seed.cpp @@ -0,0 +1,127 @@ +/* +* SEED +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* SEED G Function +*/ +u32bit SEED::G_FUNC::operator()(u32bit X) const + { + return (S0[get_byte(3, X)] ^ S1[get_byte(2, X)] ^ + S2[get_byte(1, X)] ^ S3[get_byte(0, X)]); + } + +/* +* SEED Encryption +*/ +void SEED::enc(const byte in[], byte out[]) const + { + u32bit B0 = load_be(in, 0); + u32bit B1 = load_be(in, 1); + u32bit B2 = load_be(in, 2); + u32bit B3 = load_be(in, 3); + + G_FUNC G; + + for(u32bit j = 0; j != 16; j += 2) + { + u32bit T0, T1; + + T0 = B2 ^ K[2*j]; + T1 = G(B2 ^ B3 ^ K[2*j+1]); + T0 = G(T1 + T0); + T1 = G(T1 + T0); + B1 ^= T1; + B0 ^= T0 + T1; + + T0 = B0 ^ K[2*j+2]; + T1 = G(B0 ^ B1 ^ K[2*j+3]); + T0 = G(T1 + T0); + T1 = G(T1 + T0); + B3 ^= T1; + B2 ^= T0 + T1; + } + + store_be(out, B2, B3, B0, B1); + } + +/* +* SEED Decryption +*/ +void SEED::dec(const byte in[], byte out[]) const + { + u32bit B0 = load_be(in, 0); + u32bit B1 = load_be(in, 1); + u32bit B2 = load_be(in, 2); + u32bit B3 = load_be(in, 3); + + G_FUNC G; + + for(u32bit j = 0; j != 16; j += 2) + { + u32bit T0, T1; + + T0 = B2 ^ K[30-2*j]; + T1 = G(B2 ^ B3 ^ K[31-2*j]); + T0 = G(T1 + T0); + T1 = G(T1 + T0); + B1 ^= T1; + B0 ^= T0 + T1; + + T0 = B0 ^ K[28-2*j]; + T1 = G(B0 ^ B1 ^ K[29-2*j]); + T0 = G(T1 + T0); + T1 = G(T1 + T0); + B3 ^= T1; + B2 ^= T0 + T1; + } + + store_be(out, B2, B3, B0, B1); + } + +/* +* SEED Key Schedule +*/ +void SEED::key_schedule(const byte key[], u32bit) + { + const u32bit RC[16] = { + 0x9E3779B9, 0x3C6EF373, 0x78DDE6E6, 0xF1BBCDCC, + 0xE3779B99, 0xC6EF3733, 0x8DDE6E67, 0x1BBCDCCF, + 0x3779B99E, 0x6EF3733C, 0xDDE6E678, 0xBBCDCCF1, + 0x779B99E3, 0xEF3733C6, 0xDE6E678D, 0xBCDCCF1B + }; + + SecureBuffer WK; + + for(u32bit j = 0; j != 4; ++j) + WK[j] = load_be(key, j); + + G_FUNC G; + + for(u32bit j = 0; j != 16; j += 2) + { + K[2*j ] = G(WK[0] + WK[2] - RC[j]); + K[2*j+1] = G(WK[1] - WK[3] + RC[j]) ^ K[2*j]; + + byte T = get_byte(3, WK[0]); + WK[0] = (WK[0] >> 8) | (get_byte(3, WK[1]) << 24); + WK[1] = (WK[1] >> 8) | (T << 24); + + K[2*j+2] = G(WK[0] + WK[2] - RC[j+1]); + K[2*j+3] = G(WK[1] - WK[3] + RC[j+1]) ^ K[2*j+2]; + + T = get_byte(0, WK[3]); + WK[3] = (WK[3] << 8) | get_byte(0, WK[2]); + WK[2] = (WK[2] << 8) | T; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/block/seed/seed.h b/src/libs/3rdparty/botan/src/block/seed/seed.h new file mode 100644 index 00000000000..54c25d5807d --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/seed/seed.h @@ -0,0 +1,43 @@ +/* +* SEED +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SEED_H__ +#define BOTAN_SEED_H__ + +#include + +namespace Botan { + +/* +* SEED +*/ +class BOTAN_DLL SEED : public BlockCipher + { + public: + void clear() throw() { K.clear(); } + std::string name() const { return "SEED"; } + BlockCipher* clone() const { return new SEED; } + SEED() : BlockCipher(16, 16) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + class G_FUNC + { + public: + u32bit operator()(u32bit) const; + private: + static const u32bit S0[256], S1[256], S2[256], S3[256]; + }; + + SecureBuffer K; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/seed/seed_tab.cpp b/src/libs/3rdparty/botan/src/block/seed/seed_tab.cpp new file mode 100644 index 00000000000..6ada36e5222 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/seed/seed_tab.cpp @@ -0,0 +1,192 @@ +/* +* S-Box Tables for SEED +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +const u32bit SEED::G_FUNC::S0[256] = { + 0x2989A1A8, 0x05858184, 0x16C6D2D4, 0x13C3D3D0, 0x14445054, 0x1D0D111C, + 0x2C8CA0AC, 0x25052124, 0x1D4D515C, 0x03434340, 0x18081018, 0x1E0E121C, + 0x11415150, 0x3CCCF0FC, 0x0ACAC2C8, 0x23436360, 0x28082028, 0x04444044, + 0x20002020, 0x1D8D919C, 0x20C0E0E0, 0x22C2E2E0, 0x08C8C0C8, 0x17071314, + 0x2585A1A4, 0x0F8F838C, 0x03030300, 0x3B4B7378, 0x3B8BB3B8, 0x13031310, + 0x12C2D2D0, 0x2ECEE2EC, 0x30407070, 0x0C8C808C, 0x3F0F333C, 0x2888A0A8, + 0x32023230, 0x1DCDD1DC, 0x36C6F2F4, 0x34447074, 0x2CCCE0EC, 0x15859194, + 0x0B0B0308, 0x17475354, 0x1C4C505C, 0x1B4B5358, 0x3D8DB1BC, 0x01010100, + 0x24042024, 0x1C0C101C, 0x33437370, 0x18889098, 0x10001010, 0x0CCCC0CC, + 0x32C2F2F0, 0x19C9D1D8, 0x2C0C202C, 0x27C7E3E4, 0x32427270, 0x03838380, + 0x1B8B9398, 0x11C1D1D0, 0x06868284, 0x09C9C1C8, 0x20406060, 0x10405050, + 0x2383A3A0, 0x2BCBE3E8, 0x0D0D010C, 0x3686B2B4, 0x1E8E929C, 0x0F4F434C, + 0x3787B3B4, 0x1A4A5258, 0x06C6C2C4, 0x38487078, 0x2686A2A4, 0x12021210, + 0x2F8FA3AC, 0x15C5D1D4, 0x21416160, 0x03C3C3C0, 0x3484B0B4, 0x01414140, + 0x12425250, 0x3D4D717C, 0x0D8D818C, 0x08080008, 0x1F0F131C, 0x19899198, + 0x00000000, 0x19091118, 0x04040004, 0x13435350, 0x37C7F3F4, 0x21C1E1E0, + 0x3DCDF1FC, 0x36467274, 0x2F0F232C, 0x27072324, 0x3080B0B0, 0x0B8B8388, + 0x0E0E020C, 0x2B8BA3A8, 0x2282A2A0, 0x2E4E626C, 0x13839390, 0x0D4D414C, + 0x29496168, 0x3C4C707C, 0x09090108, 0x0A0A0208, 0x3F8FB3BC, 0x2FCFE3EC, + 0x33C3F3F0, 0x05C5C1C4, 0x07878384, 0x14041014, 0x3ECEF2FC, 0x24446064, + 0x1ECED2DC, 0x2E0E222C, 0x0B4B4348, 0x1A0A1218, 0x06060204, 0x21012120, + 0x2B4B6368, 0x26466264, 0x02020200, 0x35C5F1F4, 0x12829290, 0x0A8A8288, + 0x0C0C000C, 0x3383B3B0, 0x3E4E727C, 0x10C0D0D0, 0x3A4A7278, 0x07474344, + 0x16869294, 0x25C5E1E4, 0x26062224, 0x00808080, 0x2D8DA1AC, 0x1FCFD3DC, + 0x2181A1A0, 0x30003030, 0x37073334, 0x2E8EA2AC, 0x36063234, 0x15051114, + 0x22022220, 0x38083038, 0x34C4F0F4, 0x2787A3A4, 0x05454144, 0x0C4C404C, + 0x01818180, 0x29C9E1E8, 0x04848084, 0x17879394, 0x35053134, 0x0BCBC3C8, + 0x0ECEC2CC, 0x3C0C303C, 0x31417170, 0x11011110, 0x07C7C3C4, 0x09898188, + 0x35457174, 0x3BCBF3F8, 0x1ACAD2D8, 0x38C8F0F8, 0x14849094, 0x19495158, + 0x02828280, 0x04C4C0C4, 0x3FCFF3FC, 0x09494148, 0x39093138, 0x27476364, + 0x00C0C0C0, 0x0FCFC3CC, 0x17C7D3D4, 0x3888B0B8, 0x0F0F030C, 0x0E8E828C, + 0x02424240, 0x23032320, 0x11819190, 0x2C4C606C, 0x1BCBD3D8, 0x2484A0A4, + 0x34043034, 0x31C1F1F0, 0x08484048, 0x02C2C2C0, 0x2F4F636C, 0x3D0D313C, + 0x2D0D212C, 0x00404040, 0x3E8EB2BC, 0x3E0E323C, 0x3C8CB0BC, 0x01C1C1C0, + 0x2A8AA2A8, 0x3A8AB2B8, 0x0E4E424C, 0x15455154, 0x3B0B3338, 0x1CCCD0DC, + 0x28486068, 0x3F4F737C, 0x1C8C909C, 0x18C8D0D8, 0x0A4A4248, 0x16465254, + 0x37477374, 0x2080A0A0, 0x2DCDE1EC, 0x06464244, 0x3585B1B4, 0x2B0B2328, + 0x25456164, 0x3ACAF2F8, 0x23C3E3E0, 0x3989B1B8, 0x3181B1B0, 0x1F8F939C, + 0x1E4E525C, 0x39C9F1F8, 0x26C6E2E4, 0x3282B2B0, 0x31013130, 0x2ACAE2E8, + 0x2D4D616C, 0x1F4F535C, 0x24C4E0E4, 0x30C0F0F0, 0x0DCDC1CC, 0x08888088, + 0x16061214, 0x3A0A3238, 0x18485058, 0x14C4D0D4, 0x22426260, 0x29092128, + 0x07070304, 0x33033330, 0x28C8E0E8, 0x1B0B1318, 0x05050104, 0x39497178, + 0x10809090, 0x2A4A6268, 0x2A0A2228, 0x1A8A9298 }; + +const u32bit SEED::G_FUNC::S1[256] = { + 0x38380830, 0xE828C8E0, 0x2C2D0D21, 0xA42686A2, 0xCC0FCFC3, 0xDC1ECED2, + 0xB03383B3, 0xB83888B0, 0xAC2F8FA3, 0x60204060, 0x54154551, 0xC407C7C3, + 0x44044440, 0x6C2F4F63, 0x682B4B63, 0x581B4B53, 0xC003C3C3, 0x60224262, + 0x30330333, 0xB43585B1, 0x28290921, 0xA02080A0, 0xE022C2E2, 0xA42787A3, + 0xD013C3D3, 0x90118191, 0x10110111, 0x04060602, 0x1C1C0C10, 0xBC3C8CB0, + 0x34360632, 0x480B4B43, 0xEC2FCFE3, 0x88088880, 0x6C2C4C60, 0xA82888A0, + 0x14170713, 0xC404C4C0, 0x14160612, 0xF434C4F0, 0xC002C2C2, 0x44054541, + 0xE021C1E1, 0xD416C6D2, 0x3C3F0F33, 0x3C3D0D31, 0x8C0E8E82, 0x98188890, + 0x28280820, 0x4C0E4E42, 0xF436C6F2, 0x3C3E0E32, 0xA42585A1, 0xF839C9F1, + 0x0C0D0D01, 0xDC1FCFD3, 0xD818C8D0, 0x282B0B23, 0x64264662, 0x783A4A72, + 0x24270723, 0x2C2F0F23, 0xF031C1F1, 0x70324272, 0x40024242, 0xD414C4D0, + 0x40014141, 0xC000C0C0, 0x70334373, 0x64274763, 0xAC2C8CA0, 0x880B8B83, + 0xF437C7F3, 0xAC2D8DA1, 0x80008080, 0x1C1F0F13, 0xC80ACAC2, 0x2C2C0C20, + 0xA82A8AA2, 0x34340430, 0xD012C2D2, 0x080B0B03, 0xEC2ECEE2, 0xE829C9E1, + 0x5C1D4D51, 0x94148490, 0x18180810, 0xF838C8F0, 0x54174753, 0xAC2E8EA2, + 0x08080800, 0xC405C5C1, 0x10130313, 0xCC0DCDC1, 0x84068682, 0xB83989B1, + 0xFC3FCFF3, 0x7C3D4D71, 0xC001C1C1, 0x30310131, 0xF435C5F1, 0x880A8A82, + 0x682A4A62, 0xB03181B1, 0xD011C1D1, 0x20200020, 0xD417C7D3, 0x00020202, + 0x20220222, 0x04040400, 0x68284860, 0x70314171, 0x04070703, 0xD81BCBD3, + 0x9C1D8D91, 0x98198991, 0x60214161, 0xBC3E8EB2, 0xE426C6E2, 0x58194951, + 0xDC1DCDD1, 0x50114151, 0x90108090, 0xDC1CCCD0, 0x981A8A92, 0xA02383A3, + 0xA82B8BA3, 0xD010C0D0, 0x80018181, 0x0C0F0F03, 0x44074743, 0x181A0A12, + 0xE023C3E3, 0xEC2CCCE0, 0x8C0D8D81, 0xBC3F8FB3, 0x94168692, 0x783B4B73, + 0x5C1C4C50, 0xA02282A2, 0xA02181A1, 0x60234363, 0x20230323, 0x4C0D4D41, + 0xC808C8C0, 0x9C1E8E92, 0x9C1C8C90, 0x383A0A32, 0x0C0C0C00, 0x2C2E0E22, + 0xB83A8AB2, 0x6C2E4E62, 0x9C1F8F93, 0x581A4A52, 0xF032C2F2, 0x90128292, + 0xF033C3F3, 0x48094941, 0x78384870, 0xCC0CCCC0, 0x14150511, 0xF83BCBF3, + 0x70304070, 0x74354571, 0x7C3F4F73, 0x34350531, 0x10100010, 0x00030303, + 0x64244460, 0x6C2D4D61, 0xC406C6C2, 0x74344470, 0xD415C5D1, 0xB43484B0, + 0xE82ACAE2, 0x08090901, 0x74364672, 0x18190911, 0xFC3ECEF2, 0x40004040, + 0x10120212, 0xE020C0E0, 0xBC3D8DB1, 0x04050501, 0xF83ACAF2, 0x00010101, + 0xF030C0F0, 0x282A0A22, 0x5C1E4E52, 0xA82989A1, 0x54164652, 0x40034343, + 0x84058581, 0x14140410, 0x88098981, 0x981B8B93, 0xB03080B0, 0xE425C5E1, + 0x48084840, 0x78394971, 0x94178793, 0xFC3CCCF0, 0x1C1E0E12, 0x80028282, + 0x20210121, 0x8C0C8C80, 0x181B0B13, 0x5C1F4F53, 0x74374773, 0x54144450, + 0xB03282B2, 0x1C1D0D11, 0x24250521, 0x4C0F4F43, 0x00000000, 0x44064642, + 0xEC2DCDE1, 0x58184850, 0x50124252, 0xE82BCBE3, 0x7C3E4E72, 0xD81ACAD2, + 0xC809C9C1, 0xFC3DCDF1, 0x30300030, 0x94158591, 0x64254561, 0x3C3C0C30, + 0xB43686B2, 0xE424C4E0, 0xB83B8BB3, 0x7C3C4C70, 0x0C0E0E02, 0x50104050, + 0x38390931, 0x24260622, 0x30320232, 0x84048480, 0x68294961, 0x90138393, + 0x34370733, 0xE427C7E3, 0x24240420, 0xA42484A0, 0xC80BCBC3, 0x50134353, + 0x080A0A02, 0x84078783, 0xD819C9D1, 0x4C0C4C40, 0x80038383, 0x8C0F8F83, + 0xCC0ECEC2, 0x383B0B33, 0x480A4A42, 0xB43787B3 }; + +const u32bit SEED::G_FUNC::S2[256] = { + 0xA1A82989, 0x81840585, 0xD2D416C6, 0xD3D013C3, 0x50541444, 0x111C1D0D, + 0xA0AC2C8C, 0x21242505, 0x515C1D4D, 0x43400343, 0x10181808, 0x121C1E0E, + 0x51501141, 0xF0FC3CCC, 0xC2C80ACA, 0x63602343, 0x20282808, 0x40440444, + 0x20202000, 0x919C1D8D, 0xE0E020C0, 0xE2E022C2, 0xC0C808C8, 0x13141707, + 0xA1A42585, 0x838C0F8F, 0x03000303, 0x73783B4B, 0xB3B83B8B, 0x13101303, + 0xD2D012C2, 0xE2EC2ECE, 0x70703040, 0x808C0C8C, 0x333C3F0F, 0xA0A82888, + 0x32303202, 0xD1DC1DCD, 0xF2F436C6, 0x70743444, 0xE0EC2CCC, 0x91941585, + 0x03080B0B, 0x53541747, 0x505C1C4C, 0x53581B4B, 0xB1BC3D8D, 0x01000101, + 0x20242404, 0x101C1C0C, 0x73703343, 0x90981888, 0x10101000, 0xC0CC0CCC, + 0xF2F032C2, 0xD1D819C9, 0x202C2C0C, 0xE3E427C7, 0x72703242, 0x83800383, + 0x93981B8B, 0xD1D011C1, 0x82840686, 0xC1C809C9, 0x60602040, 0x50501040, + 0xA3A02383, 0xE3E82BCB, 0x010C0D0D, 0xB2B43686, 0x929C1E8E, 0x434C0F4F, + 0xB3B43787, 0x52581A4A, 0xC2C406C6, 0x70783848, 0xA2A42686, 0x12101202, + 0xA3AC2F8F, 0xD1D415C5, 0x61602141, 0xC3C003C3, 0xB0B43484, 0x41400141, + 0x52501242, 0x717C3D4D, 0x818C0D8D, 0x00080808, 0x131C1F0F, 0x91981989, + 0x00000000, 0x11181909, 0x00040404, 0x53501343, 0xF3F437C7, 0xE1E021C1, + 0xF1FC3DCD, 0x72743646, 0x232C2F0F, 0x23242707, 0xB0B03080, 0x83880B8B, + 0x020C0E0E, 0xA3A82B8B, 0xA2A02282, 0x626C2E4E, 0x93901383, 0x414C0D4D, + 0x61682949, 0x707C3C4C, 0x01080909, 0x02080A0A, 0xB3BC3F8F, 0xE3EC2FCF, + 0xF3F033C3, 0xC1C405C5, 0x83840787, 0x10141404, 0xF2FC3ECE, 0x60642444, + 0xD2DC1ECE, 0x222C2E0E, 0x43480B4B, 0x12181A0A, 0x02040606, 0x21202101, + 0x63682B4B, 0x62642646, 0x02000202, 0xF1F435C5, 0x92901282, 0x82880A8A, + 0x000C0C0C, 0xB3B03383, 0x727C3E4E, 0xD0D010C0, 0x72783A4A, 0x43440747, + 0x92941686, 0xE1E425C5, 0x22242606, 0x80800080, 0xA1AC2D8D, 0xD3DC1FCF, + 0xA1A02181, 0x30303000, 0x33343707, 0xA2AC2E8E, 0x32343606, 0x11141505, + 0x22202202, 0x30383808, 0xF0F434C4, 0xA3A42787, 0x41440545, 0x404C0C4C, + 0x81800181, 0xE1E829C9, 0x80840484, 0x93941787, 0x31343505, 0xC3C80BCB, + 0xC2CC0ECE, 0x303C3C0C, 0x71703141, 0x11101101, 0xC3C407C7, 0x81880989, + 0x71743545, 0xF3F83BCB, 0xD2D81ACA, 0xF0F838C8, 0x90941484, 0x51581949, + 0x82800282, 0xC0C404C4, 0xF3FC3FCF, 0x41480949, 0x31383909, 0x63642747, + 0xC0C000C0, 0xC3CC0FCF, 0xD3D417C7, 0xB0B83888, 0x030C0F0F, 0x828C0E8E, + 0x42400242, 0x23202303, 0x91901181, 0x606C2C4C, 0xD3D81BCB, 0xA0A42484, + 0x30343404, 0xF1F031C1, 0x40480848, 0xC2C002C2, 0x636C2F4F, 0x313C3D0D, + 0x212C2D0D, 0x40400040, 0xB2BC3E8E, 0x323C3E0E, 0xB0BC3C8C, 0xC1C001C1, + 0xA2A82A8A, 0xB2B83A8A, 0x424C0E4E, 0x51541545, 0x33383B0B, 0xD0DC1CCC, + 0x60682848, 0x737C3F4F, 0x909C1C8C, 0xD0D818C8, 0x42480A4A, 0x52541646, + 0x73743747, 0xA0A02080, 0xE1EC2DCD, 0x42440646, 0xB1B43585, 0x23282B0B, + 0x61642545, 0xF2F83ACA, 0xE3E023C3, 0xB1B83989, 0xB1B03181, 0x939C1F8F, + 0x525C1E4E, 0xF1F839C9, 0xE2E426C6, 0xB2B03282, 0x31303101, 0xE2E82ACA, + 0x616C2D4D, 0x535C1F4F, 0xE0E424C4, 0xF0F030C0, 0xC1CC0DCD, 0x80880888, + 0x12141606, 0x32383A0A, 0x50581848, 0xD0D414C4, 0x62602242, 0x21282909, + 0x03040707, 0x33303303, 0xE0E828C8, 0x13181B0B, 0x01040505, 0x71783949, + 0x90901080, 0x62682A4A, 0x22282A0A, 0x92981A8A }; + +const u32bit SEED::G_FUNC::S3[256] = { + 0x08303838, 0xC8E0E828, 0x0D212C2D, 0x86A2A426, 0xCFC3CC0F, 0xCED2DC1E, + 0x83B3B033, 0x88B0B838, 0x8FA3AC2F, 0x40606020, 0x45515415, 0xC7C3C407, + 0x44404404, 0x4F636C2F, 0x4B63682B, 0x4B53581B, 0xC3C3C003, 0x42626022, + 0x03333033, 0x85B1B435, 0x09212829, 0x80A0A020, 0xC2E2E022, 0x87A3A427, + 0xC3D3D013, 0x81919011, 0x01111011, 0x06020406, 0x0C101C1C, 0x8CB0BC3C, + 0x06323436, 0x4B43480B, 0xCFE3EC2F, 0x88808808, 0x4C606C2C, 0x88A0A828, + 0x07131417, 0xC4C0C404, 0x06121416, 0xC4F0F434, 0xC2C2C002, 0x45414405, + 0xC1E1E021, 0xC6D2D416, 0x0F333C3F, 0x0D313C3D, 0x8E828C0E, 0x88909818, + 0x08202828, 0x4E424C0E, 0xC6F2F436, 0x0E323C3E, 0x85A1A425, 0xC9F1F839, + 0x0D010C0D, 0xCFD3DC1F, 0xC8D0D818, 0x0B23282B, 0x46626426, 0x4A72783A, + 0x07232427, 0x0F232C2F, 0xC1F1F031, 0x42727032, 0x42424002, 0xC4D0D414, + 0x41414001, 0xC0C0C000, 0x43737033, 0x47636427, 0x8CA0AC2C, 0x8B83880B, + 0xC7F3F437, 0x8DA1AC2D, 0x80808000, 0x0F131C1F, 0xCAC2C80A, 0x0C202C2C, + 0x8AA2A82A, 0x04303434, 0xC2D2D012, 0x0B03080B, 0xCEE2EC2E, 0xC9E1E829, + 0x4D515C1D, 0x84909414, 0x08101818, 0xC8F0F838, 0x47535417, 0x8EA2AC2E, + 0x08000808, 0xC5C1C405, 0x03131013, 0xCDC1CC0D, 0x86828406, 0x89B1B839, + 0xCFF3FC3F, 0x4D717C3D, 0xC1C1C001, 0x01313031, 0xC5F1F435, 0x8A82880A, + 0x4A62682A, 0x81B1B031, 0xC1D1D011, 0x00202020, 0xC7D3D417, 0x02020002, + 0x02222022, 0x04000404, 0x48606828, 0x41717031, 0x07030407, 0xCBD3D81B, + 0x8D919C1D, 0x89919819, 0x41616021, 0x8EB2BC3E, 0xC6E2E426, 0x49515819, + 0xCDD1DC1D, 0x41515011, 0x80909010, 0xCCD0DC1C, 0x8A92981A, 0x83A3A023, + 0x8BA3A82B, 0xC0D0D010, 0x81818001, 0x0F030C0F, 0x47434407, 0x0A12181A, + 0xC3E3E023, 0xCCE0EC2C, 0x8D818C0D, 0x8FB3BC3F, 0x86929416, 0x4B73783B, + 0x4C505C1C, 0x82A2A022, 0x81A1A021, 0x43636023, 0x03232023, 0x4D414C0D, + 0xC8C0C808, 0x8E929C1E, 0x8C909C1C, 0x0A32383A, 0x0C000C0C, 0x0E222C2E, + 0x8AB2B83A, 0x4E626C2E, 0x8F939C1F, 0x4A52581A, 0xC2F2F032, 0x82929012, + 0xC3F3F033, 0x49414809, 0x48707838, 0xCCC0CC0C, 0x05111415, 0xCBF3F83B, + 0x40707030, 0x45717435, 0x4F737C3F, 0x05313435, 0x00101010, 0x03030003, + 0x44606424, 0x4D616C2D, 0xC6C2C406, 0x44707434, 0xC5D1D415, 0x84B0B434, + 0xCAE2E82A, 0x09010809, 0x46727436, 0x09111819, 0xCEF2FC3E, 0x40404000, + 0x02121012, 0xC0E0E020, 0x8DB1BC3D, 0x05010405, 0xCAF2F83A, 0x01010001, + 0xC0F0F030, 0x0A22282A, 0x4E525C1E, 0x89A1A829, 0x46525416, 0x43434003, + 0x85818405, 0x04101414, 0x89818809, 0x8B93981B, 0x80B0B030, 0xC5E1E425, + 0x48404808, 0x49717839, 0x87939417, 0xCCF0FC3C, 0x0E121C1E, 0x82828002, + 0x01212021, 0x8C808C0C, 0x0B13181B, 0x4F535C1F, 0x47737437, 0x44505414, + 0x82B2B032, 0x0D111C1D, 0x05212425, 0x4F434C0F, 0x00000000, 0x46424406, + 0xCDE1EC2D, 0x48505818, 0x42525012, 0xCBE3E82B, 0x4E727C3E, 0xCAD2D81A, + 0xC9C1C809, 0xCDF1FC3D, 0x00303030, 0x85919415, 0x45616425, 0x0C303C3C, + 0x86B2B436, 0xC4E0E424, 0x8BB3B83B, 0x4C707C3C, 0x0E020C0E, 0x40505010, + 0x09313839, 0x06222426, 0x02323032, 0x84808404, 0x49616829, 0x83939013, + 0x07333437, 0xC7E3E427, 0x04202424, 0x84A0A424, 0xCBC3C80B, 0x43535013, + 0x0A02080A, 0x87838407, 0xC9D1D819, 0x4C404C0C, 0x83838003, 0x8F838C0F, + 0xCEC2CC0E, 0x0B33383B, 0x4A42480A, 0x87B3B437 }; + +} diff --git a/src/libs/3rdparty/botan/src/block/serpent/info.txt b/src/libs/3rdparty/botan/src/block/serpent/info.txt new file mode 100644 index 00000000000..baaccbf012f --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/serpent/info.txt @@ -0,0 +1,10 @@ +realname "Serpent" + +define SERPENT + +load_on auto + + +serpent.cpp +serpent.h + diff --git a/src/libs/3rdparty/botan/src/block/serpent/serpent.cpp b/src/libs/3rdparty/botan/src/block/serpent/serpent.cpp new file mode 100644 index 00000000000..df7592feaa3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/serpent/serpent.cpp @@ -0,0 +1,369 @@ +/* +* Serpent +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Serpent Encryption S-Box 1 +*/ +inline void SBoxE1(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T3 ^= T0; T4 = T1; T1 &= T3; T4 ^= T2; T1 ^= T0; T0 |= T3; T0 ^= T4; + T4 ^= T3; T3 ^= T2; T2 |= T1; T2 ^= T4; T4 = ~T4; T4 |= T1; T1 ^= T3; + T1 ^= T4; T3 |= T0; T1 ^= T3; T4 ^= T3; + B0 = T1; B1 = T4; B2 = T2; B3 = T0; + } + +/* +* Serpent Encryption S-Box 2 +*/ +inline void SBoxE2(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T0 = ~T0; T2 = ~T2; T4 = T0; T0 &= T1; T2 ^= T0; T0 |= T3; T3 ^= T2; + T1 ^= T0; T0 ^= T4; T4 |= T1; T1 ^= T3; T2 |= T0; T2 &= T4; T0 ^= T1; + T1 &= T2; T1 ^= T0; T0 &= T2; T0 ^= T4; + B0 = T2; B1 = T0; B2 = T3; B3 = T1; + } + +/* +* Serpent Encryption S-Box 3 +*/ +inline void SBoxE3(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T4 = T0; T0 &= T2; T0 ^= T3; T2 ^= T1; T2 ^= T0; T3 |= T4; T3 ^= T1; + T4 ^= T2; T1 = T3; T3 |= T4; T3 ^= T0; T0 &= T1; T4 ^= T0; T1 ^= T3; + T1 ^= T4; T4 = ~T4; + B0 = T2; B1 = T3; B2 = T1; B3 = T4; + } + +/* +* Serpent Encryption S-Box 4 +*/ +inline void SBoxE4(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T4 = T0; T0 |= T3; T3 ^= T1; T1 &= T4; T4 ^= T2; T2 ^= T3; T3 &= T0; + T4 |= T1; T3 ^= T4; T0 ^= T1; T4 &= T0; T1 ^= T3; T4 ^= T2; T1 |= T0; + T1 ^= T2; T0 ^= T3; T2 = T1; T1 |= T3; T1 ^= T0; + B0 = T1; B1 = T2; B2 = T3; B3 = T4; + } + +/* +* Serpent Encryption S-Box 5 +*/ +inline void SBoxE5(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T1 ^= T3; T3 = ~T3; T2 ^= T3; T3 ^= T0; T4 = T1; T1 &= T3; T1 ^= T2; + T4 ^= T3; T0 ^= T4; T2 &= T4; T2 ^= T0; T0 &= T1; T3 ^= T0; T4 |= T1; + T4 ^= T0; T0 |= T3; T0 ^= T2; T2 &= T3; T0 = ~T0; T4 ^= T2; + B0 = T1; B1 = T4; B2 = T0; B3 = T3; + } + +/* +* Serpent Encryption S-Box 6 +*/ +inline void SBoxE6(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T0 ^= T1; T1 ^= T3; T3 = ~T3; T4 = T1; T1 &= T0; T2 ^= T3; T1 ^= T2; + T2 |= T4; T4 ^= T3; T3 &= T1; T3 ^= T0; T4 ^= T1; T4 ^= T2; T2 ^= T0; + T0 &= T3; T2 = ~T2; T0 ^= T4; T4 |= T3; T2 ^= T4; + B0 = T1; B1 = T3; B2 = T0; B3 = T2; + } + +/* +* Serpent Encryption S-Box 7 +*/ +inline void SBoxE7(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T2 = ~T2; T4 = T3; T3 &= T0; T0 ^= T4; T3 ^= T2; T2 |= T4; T1 ^= T3; + T2 ^= T0; T0 |= T1; T2 ^= T1; T4 ^= T0; T0 |= T3; T0 ^= T2; T4 ^= T3; + T4 ^= T0; T3 = ~T3; T2 &= T4; T2 ^= T3; + B0 = T0; B1 = T1; B2 = T4; B3 = T2; + } + +/* +* Serpent Encryption S-Box 8 +*/ +inline void SBoxE8(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T4 = T1; T1 |= T2; T1 ^= T3; T4 ^= T2; T2 ^= T1; T3 |= T4; T3 &= T0; + T4 ^= T2; T3 ^= T1; T1 |= T4; T1 ^= T0; T0 |= T4; T0 ^= T2; T1 ^= T4; + T2 ^= T1; T1 &= T0; T1 ^= T4; T2 = ~T2; T2 |= T0; T4 ^= T2; + B0 = T4; B1 = T3; B2 = T1; B3 = T0; + } + +/* +* Serpent Decryption S-Box 1 +*/ +inline void SBoxD1(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T2 = ~T2; T4 = T1; T1 |= T0; T4 = ~T4; T1 ^= T2; T2 |= T4; T1 ^= T3; + T0 ^= T4; T2 ^= T0; T0 &= T3; T4 ^= T0; T0 |= T1; T0 ^= T2; T3 ^= T4; + T2 ^= T1; T3 ^= T0; T3 ^= T1; T2 &= T3; T4 ^= T2; + B0 = T0; B1 = T4; B2 = T1; B3 = T3; + } + +/* +* Serpent Decryption S-Box 2 +*/ +inline void SBoxD2(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T4 = T1; T1 ^= T3; T3 &= T1; T4 ^= T2; T3 ^= T0; T0 |= T1; T2 ^= T3; + T0 ^= T4; T0 |= T2; T1 ^= T3; T0 ^= T1; T1 |= T3; T1 ^= T0; T4 = ~T4; + T4 ^= T1; T1 |= T0; T1 ^= T0; T1 |= T4; T3 ^= T1; + B0 = T4; B1 = T0; B2 = T3; B3 = T2; + } + +/* +* Serpent Decryption S-Box 3 +*/ +inline void SBoxD3(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T2 ^= T3; T3 ^= T0; T4 = T3; T3 &= T2; T3 ^= T1; T1 |= T2; T1 ^= T4; + T4 &= T3; T2 ^= T3; T4 &= T0; T4 ^= T2; T2 &= T1; T2 |= T0; T3 = ~T3; + T2 ^= T3; T0 ^= T3; T0 &= T1; T3 ^= T4; T3 ^= T0; + B0 = T1; B1 = T4; B2 = T2; B3 = T3; + } + +/* +* Serpent Decryption S-Box 4 +*/ +inline void SBoxD4(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T4 = T2; T2 ^= T1; T0 ^= T2; T4 &= T2; T4 ^= T0; T0 &= T1; T1 ^= T3; + T3 |= T4; T2 ^= T3; T0 ^= T3; T1 ^= T4; T3 &= T2; T3 ^= T1; T1 ^= T0; + T1 |= T2; T0 ^= T3; T1 ^= T4; T0 ^= T1; + B0 = T2; B1 = T1; B2 = T3; B3 = T0; + } + +/* +* Serpent Decryption S-Box 5 +*/ +inline void SBoxD5(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T4 = T2; T2 &= T3; T2 ^= T1; T1 |= T3; T1 &= T0; T4 ^= T2; T4 ^= T1; + T1 &= T2; T0 = ~T0; T3 ^= T4; T1 ^= T3; T3 &= T0; T3 ^= T2; T0 ^= T1; + T2 &= T0; T3 ^= T0; T2 ^= T4; T2 |= T3; T3 ^= T0; T2 ^= T1; + B0 = T0; B1 = T3; B2 = T2; B3 = T4; + } + +/* +* Serpent Decryption S-Box 6 +*/ +inline void SBoxD6(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T1 = ~T1; T4 = T3; T2 ^= T1; T3 |= T0; T3 ^= T2; T2 |= T1; T2 &= T0; + T4 ^= T3; T2 ^= T4; T4 |= T0; T4 ^= T1; T1 &= T2; T1 ^= T3; T4 ^= T2; + T3 &= T4; T4 ^= T1; T3 ^= T4; T4 = ~T4; T3 ^= T0; + B0 = T1; B1 = T4; B2 = T3; B3 = T2; + } + +/* +* Serpent Decryption S-Box 7 +*/ +inline void SBoxD7(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T0 ^= T2; T4 = T2; T2 &= T0; T4 ^= T3; T2 = ~T2; T3 ^= T1; T2 ^= T3; + T4 |= T0; T0 ^= T2; T3 ^= T4; T4 ^= T1; T1 &= T3; T1 ^= T0; T0 ^= T3; + T0 |= T2; T3 ^= T1; T4 ^= T0; + B0 = T1; B1 = T2; B2 = T4; B3 = T3; + } + +/* +* Serpent Decryption S-Box 8 +*/ +inline void SBoxD8(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; + T4 = T2; T2 ^= T0; T0 &= T3; T4 |= T3; T2 = ~T2; T3 ^= T1; T1 |= T0; + T0 ^= T2; T2 &= T4; T3 &= T4; T1 ^= T2; T2 ^= T0; T0 |= T2; T4 ^= T1; + T0 ^= T3; T3 ^= T4; T4 |= T0; T3 ^= T2; T4 ^= T2; + B0 = T3; B1 = T0; B2 = T1; B3 = T4; + } + +/* +* Serpent's Linear Transformation +*/ +inline void transform(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + B0 = rotate_left(B0, 13); B2 = rotate_left(B2, 3); + B1 ^= B0 ^ B2; B3 ^= B2 ^ (B0 << 3); + B1 = rotate_left(B1, 1); B3 = rotate_left(B3, 7); + B0 ^= B1 ^ B3; B2 ^= B3 ^ (B1 << 7); + B0 = rotate_left(B0, 5); B2 = rotate_left(B2, 22); + } + +/* +* Serpent's Inverse Linear Transformation +*/ +inline void i_transform(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) + { + B2 = rotate_right(B2, 22); B0 = rotate_right(B0, 5); + B2 ^= B3 ^ (B1 << 7); B0 ^= B1 ^ B3; + B3 = rotate_right(B3, 7); B1 = rotate_right(B1, 1); + B3 ^= B2 ^ (B0 << 3); B1 ^= B0 ^ B2; + B2 = rotate_right(B2, 3); B0 = rotate_right(B0, 13); + } + +} + +/* +* XOR a key block with a data block +*/ +#define key_xor(round, B0, B1, B2, B3) \ + B0 ^= round_key[4*round ]; \ + B1 ^= round_key[4*round+1]; \ + B2 ^= round_key[4*round+2]; \ + B3 ^= round_key[4*round+3]; + +/* +* Serpent Encryption +*/ +void Serpent::enc(const byte in[], byte out[]) const + { + u32bit B0 = load_le(in, 0); + u32bit B1 = load_le(in, 1); + u32bit B2 = load_le(in, 2); + u32bit B3 = load_le(in, 3); + + key_xor( 0,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor( 1,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor( 2,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor( 3,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor( 4,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor( 5,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor( 6,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor( 7,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor( 8,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor( 9,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(10,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(11,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(12,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(13,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(14,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(15,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(16,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(17,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(18,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(19,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(20,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(21,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(22,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(23,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(24,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(25,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(26,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(27,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(28,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(29,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(30,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); + key_xor(31,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); key_xor(32,B0,B1,B2,B3); + + store_le(out, B0, B1, B2, B3); + } + +/* +* Serpent Decryption +*/ +void Serpent::dec(const byte in[], byte out[]) const + { + u32bit B0 = load_le(in, 0); + u32bit B1 = load_le(in, 1); + u32bit B2 = load_le(in, 2); + u32bit B3 = load_le(in, 3); + + key_xor(32,B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(31,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(30,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(29,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(28,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(27,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(26,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor(25,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor(24,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(23,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(22,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(21,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(20,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(19,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(18,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor(17,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor(16,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(15,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(14,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(13,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(12,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(11,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(10,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 9,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 8,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor( 7,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor( 6,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor( 5,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor( 4,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor( 3,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor( 2,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 1,B0,B1,B2,B3); + i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 0,B0,B1,B2,B3); + + store_le(out, B0, B1, B2, B3); + } + +/* +* Serpent Key Schedule +*/ +void Serpent::key_schedule(const byte key[], u32bit length) + { + const u32bit PHI = 0x9E3779B9; + + SecureBuffer W; + for(u32bit j = 0; j != length / 4; ++j) + W[j] = load_le(key, j); + + W[length / 4] |= u32bit(1) << ((length%4)*8); + for(u32bit j = 8; j != 140; ++j) + W[j] = rotate_left(W[j-8] ^ W[j-5] ^ W[j-3] ^ W[j-1] ^ PHI ^ (j-8), 11); + SBoxE4(W[ 8],W[ 9],W[ 10],W[ 11]); SBoxE3(W[ 12],W[ 13],W[ 14],W[ 15]); + SBoxE2(W[ 16],W[ 17],W[ 18],W[ 19]); SBoxE1(W[ 20],W[ 21],W[ 22],W[ 23]); + SBoxE8(W[ 24],W[ 25],W[ 26],W[ 27]); SBoxE7(W[ 28],W[ 29],W[ 30],W[ 31]); + SBoxE6(W[ 32],W[ 33],W[ 34],W[ 35]); SBoxE5(W[ 36],W[ 37],W[ 38],W[ 39]); + SBoxE4(W[ 40],W[ 41],W[ 42],W[ 43]); SBoxE3(W[ 44],W[ 45],W[ 46],W[ 47]); + SBoxE2(W[ 48],W[ 49],W[ 50],W[ 51]); SBoxE1(W[ 52],W[ 53],W[ 54],W[ 55]); + SBoxE8(W[ 56],W[ 57],W[ 58],W[ 59]); SBoxE7(W[ 60],W[ 61],W[ 62],W[ 63]); + SBoxE6(W[ 64],W[ 65],W[ 66],W[ 67]); SBoxE5(W[ 68],W[ 69],W[ 70],W[ 71]); + SBoxE4(W[ 72],W[ 73],W[ 74],W[ 75]); SBoxE3(W[ 76],W[ 77],W[ 78],W[ 79]); + SBoxE2(W[ 80],W[ 81],W[ 82],W[ 83]); SBoxE1(W[ 84],W[ 85],W[ 86],W[ 87]); + SBoxE8(W[ 88],W[ 89],W[ 90],W[ 91]); SBoxE7(W[ 92],W[ 93],W[ 94],W[ 95]); + SBoxE6(W[ 96],W[ 97],W[ 98],W[ 99]); SBoxE5(W[100],W[101],W[102],W[103]); + SBoxE4(W[104],W[105],W[106],W[107]); SBoxE3(W[108],W[109],W[110],W[111]); + SBoxE2(W[112],W[113],W[114],W[115]); SBoxE1(W[116],W[117],W[118],W[119]); + SBoxE8(W[120],W[121],W[122],W[123]); SBoxE7(W[124],W[125],W[126],W[127]); + SBoxE6(W[128],W[129],W[130],W[131]); SBoxE5(W[132],W[133],W[134],W[135]); + SBoxE4(W[136],W[137],W[138],W[139]); + round_key.copy(W + 8, 132); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/serpent/serpent.h b/src/libs/3rdparty/botan/src/block/serpent/serpent.h new file mode 100644 index 00000000000..5b9be257f3e --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/serpent/serpent.h @@ -0,0 +1,35 @@ +/* +* Serpent +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SERPENT_H__ +#define BOTAN_SERPENT_H__ + +#include + +namespace Botan { + +/* +* Serpent +*/ +class BOTAN_DLL Serpent : public BlockCipher + { + public: + void clear() throw() { round_key.clear(); } + std::string name() const { return "Serpent"; } + BlockCipher* clone() const { return new Serpent; } + Serpent() : BlockCipher(16, 16, 32, 8) {} + protected: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + SecureBuffer round_key; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/serpent_ia32/info.txt b/src/libs/3rdparty/botan/src/block/serpent_ia32/info.txt new file mode 100644 index 00000000000..ea050629996 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/serpent_ia32/info.txt @@ -0,0 +1,35 @@ +realname "Serpent (IA-32)" + +define SERPENT_IA32 + +load_on asm_ok + + +serp_ia32_imp.S +serp_ia32.cpp +serp_ia32.h + + + +ia32 + + + +gcc +icc + + +# ELF systems + +linux +freebsd +dragonfly +netbsd +openbsd +solaris + + + +asm_ia32 +serpent + diff --git a/src/libs/3rdparty/botan/src/block/serpent_ia32/serp_ia32.cpp b/src/libs/3rdparty/botan/src/block/serpent_ia32/serp_ia32.cpp new file mode 100644 index 00000000000..37dd4e63791 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/serpent_ia32/serp_ia32.cpp @@ -0,0 +1,51 @@ +/* +* IA-32 Serpent +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +extern "C" { + +void botan_serpent_ia32_encrypt(const byte[16], byte[16], const u32bit[132]); +void botan_serpent_ia32_decrypt(const byte[16], byte[16], const u32bit[132]); +void botan_serpent_ia32_key_schedule(u32bit[140]); + +} + +/* +* Serpent Encryption +*/ +void Serpent_IA32::enc(const byte in[], byte out[]) const + { + botan_serpent_ia32_encrypt(in, out, round_key); + } + +/* +* Serpent Decryption +*/ +void Serpent_IA32::dec(const byte in[], byte out[]) const + { + botan_serpent_ia32_decrypt(in, out, round_key); + } + +/* +* Serpent Key Schedule +*/ +void Serpent_IA32::key_schedule(const byte key[], u32bit length) + { + SecureBuffer W; + for(u32bit j = 0; j != length / 4; ++j) + W[j] = make_u32bit(key[4*j+3], key[4*j+2], key[4*j+1], key[4*j]); + W[length / 4] |= u32bit(1) << ((length%4)*8); + + botan_serpent_ia32_key_schedule(W); + round_key.copy(W + 8, 132); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/serpent_ia32/serp_ia32.h b/src/libs/3rdparty/botan/src/block/serpent_ia32/serp_ia32.h new file mode 100644 index 00000000000..565e9889dc0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/serpent_ia32/serp_ia32.h @@ -0,0 +1,30 @@ +/* +* Serpent (IA-32) +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SERPENT_IA32_H__ +#define BOTAN_SERPENT_IA32_H__ + +#include + +namespace Botan { + +/* +* Serpent +*/ +class BOTAN_DLL Serpent_IA32 : public Serpent + { + public: + BlockCipher* clone() const { return new Serpent_IA32; } + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/serpent_ia32/serp_ia32_imp.S b/src/libs/3rdparty/botan/src/block/serpent_ia32/serp_ia32_imp.S new file mode 100644 index 00000000000..9e50f8cdcd1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/serpent_ia32/serp_ia32_imp.S @@ -0,0 +1,669 @@ +/* +* Serpent Source File +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +START_LISTING(serp_ia32.S) + +#define SBOX_E1(A, B, C, D, T) \ + XOR(D, A) ; \ + ASSIGN(T, B) ; \ + AND(B, D) ; \ + XOR(T, C) ; \ + XOR(B, A) ; \ + OR(A, D) ; \ + XOR(A, T) ; \ + XOR(T, D) ; \ + XOR(D, C) ; \ + OR(C, B) ; \ + XOR(C, T) ; \ + NOT(T) ; \ + OR(T, B) ; \ + XOR(B, D) ; \ + XOR(B, T) ; \ + OR(D, A) ; \ + XOR(B, D) ; \ + XOR(T, D) ; \ + ASSIGN(D, A) ; \ + ASSIGN(A, B) ; \ + ASSIGN(B, T) ; + +#define SBOX_E2(A, B, C, D, T) \ + NOT(A) ; \ + NOT(C) ; \ + ASSIGN(T, A) ; \ + AND(A, B) ; \ + XOR(C, A) ; \ + OR(A, D) ; \ + XOR(D, C) ; \ + XOR(B, A) ; \ + XOR(A, T) ; \ + OR(T, B) ; \ + XOR(B, D) ; \ + OR(C, A) ; \ + AND(C, T) ; \ + XOR(A, B) ; \ + AND(B, C) ; \ + XOR(B, A) ; \ + AND(A, C) ; \ + XOR(T, A) ; \ + ASSIGN(A, C) ; \ + ASSIGN(C, D) ; \ + ASSIGN(D, B) ; \ + ASSIGN(B, T) ; + +#define SBOX_E3(A, B, C, D, T) \ + ASSIGN(T, A) ; \ + AND(A, C) ; \ + XOR(A, D) ; \ + XOR(C, B) ; \ + XOR(C, A) ; \ + OR(D, T) ; \ + XOR(D, B) ; \ + XOR(T, C) ; \ + ASSIGN(B, D) ; \ + OR(D, T) ; \ + XOR(D, A) ; \ + AND(A, B) ; \ + XOR(T, A) ; \ + XOR(B, D) ; \ + XOR(B, T) ; \ + NOT(T) ; \ + ASSIGN(A, C) ; \ + ASSIGN(C, B) ; \ + ASSIGN(B, D) ; \ + ASSIGN(D, T) ; + +#define SBOX_E4(A, B, C, D, T) \ + ASSIGN(T, A) ; \ + OR(A, D) ; \ + XOR(D, B) ; \ + AND(B, T) ; \ + XOR(T, C) ; \ + XOR(C, D) ; \ + AND(D, A) ; \ + OR(T, B) ; \ + XOR(D, T) ; \ + XOR(A, B) ; \ + AND(T, A) ; \ + XOR(B, D) ; \ + XOR(T, C) ; \ + OR(B, A) ; \ + XOR(B, C) ; \ + XOR(A, D) ; \ + ASSIGN(C, B) ; \ + OR(B, D) ; \ + XOR(B, A) ; \ + ASSIGN(A, B) ; \ + ASSIGN(B, C) ; \ + ASSIGN(C, D) ; \ + ASSIGN(D, T) ; + +#define SBOX_E5(A, B, C, D, T) \ + XOR(B, D) ; \ + NOT(D) ; \ + XOR(C, D) ; \ + XOR(D, A) ; \ + ASSIGN(T, B) ; \ + AND(B, D) ; \ + XOR(B, C) ; \ + XOR(T, D) ; \ + XOR(A, T) ; \ + AND(C, T) ; \ + XOR(C, A) ; \ + AND(A, B) ; \ + XOR(D, A) ; \ + OR(T, B) ; \ + XOR(T, A) ; \ + OR(A, D) ; \ + XOR(A, C) ; \ + AND(C, D) ; \ + NOT(A) ; \ + XOR(T, C) ; \ + ASSIGN(C, A) ; \ + ASSIGN(A, B) ; \ + ASSIGN(B, T) ; + +#define SBOX_E6(A, B, C, D, T) \ + XOR(A, B) ; \ + XOR(B, D) ; \ + NOT(D) ; \ + ASSIGN(T, B) ; \ + AND(B, A) ; \ + XOR(C, D) ; \ + XOR(B, C) ; \ + OR(C, T) ; \ + XOR(T, D) ; \ + AND(D, B) ; \ + XOR(D, A) ; \ + XOR(T, B) ; \ + XOR(T, C) ; \ + XOR(C, A) ; \ + AND(A, D) ; \ + NOT(C) ; \ + XOR(A, T) ; \ + OR(T, D) ; \ + XOR(T, C) ; \ + ASSIGN(C, A) ; \ + ASSIGN(A, B) ; \ + ASSIGN(B, D) ; \ + ASSIGN(D, T) ; + +#define SBOX_E7(A, B, C, D, T) \ + NOT(C) ; \ + ASSIGN(T, D) ; \ + AND(D, A) ; \ + XOR(A, T) ; \ + XOR(D, C) ; \ + OR(C, T) ; \ + XOR(B, D) ; \ + XOR(C, A) ; \ + OR(A, B) ; \ + XOR(C, B) ; \ + XOR(T, A) ; \ + OR(A, D) ; \ + XOR(A, C) ; \ + XOR(T, D) ; \ + XOR(T, A) ; \ + NOT(D) ; \ + AND(C, T) ; \ + XOR(C, D) ; \ + ASSIGN(D, C) ; \ + ASSIGN(C, T) ; + +#define SBOX_E8(A, B, C, D, T) \ + ASSIGN(T, B) ; \ + OR(B, C) ; \ + XOR(B, D) ; \ + XOR(T, C) ; \ + XOR(C, B) ; \ + OR(D, T) ; \ + AND(D, A) ; \ + XOR(T, C) ; \ + XOR(D, B) ; \ + OR(B, T) ; \ + XOR(B, A) ; \ + OR(A, T) ; \ + XOR(A, C) ; \ + XOR(B, T) ; \ + XOR(C, B) ; \ + AND(B, A) ; \ + XOR(B, T) ; \ + NOT(C) ; \ + OR(C, A) ; \ + XOR(T, C) ; \ + ASSIGN(C, B) ; \ + ASSIGN(B, D) ; \ + ASSIGN(D, A) ; \ + ASSIGN(A, T) ; + +#define SBOX_D1(A, B, C, D, T) \ + NOT(C) ; \ + ASSIGN(T, B) ; \ + OR(B, A) ; \ + NOT(T) ; \ + XOR(B, C) ; \ + OR(C, T) ; \ + XOR(B, D) ; \ + XOR(A, T) ; \ + XOR(C, A) ; \ + AND(A, D) ; \ + XOR(T, A) ; \ + OR(A, B) ; \ + XOR(A, C) ; \ + XOR(D, T) ; \ + XOR(C, B) ; \ + XOR(D, A) ; \ + XOR(D, B) ; \ + AND(C, D) ; \ + XOR(T, C) ; \ + ASSIGN(C, B) ; \ + ASSIGN(B, T) ; + +#define SBOX_D2(A, B, C, D, T) \ + ASSIGN(T, B) ; \ + XOR(B, D) ; \ + AND(D, B) ; \ + XOR(T, C) ; \ + XOR(D, A) ; \ + OR(A, B) ; \ + XOR(C, D) ; \ + XOR(A, T) ; \ + OR(A, C) ; \ + XOR(B, D) ; \ + XOR(A, B) ; \ + OR(B, D) ; \ + XOR(B, A) ; \ + NOT(T) ; \ + XOR(T, B) ; \ + OR(B, A) ; \ + XOR(B, A) ; \ + OR(B, T) ; \ + XOR(D, B) ; \ + ASSIGN(B, A) ; \ + ASSIGN(A, T) ; \ + ASSIGN(T, D) ; \ + ASSIGN(D, C) ; \ + ASSIGN(C, T) ; + +#define SBOX_D3(A, B, C, D, T) \ + XOR(C, D) ; \ + XOR(D, A) ; \ + ASSIGN(T, D) ; \ + AND(D, C) ; \ + XOR(D, B) ; \ + OR(B, C) ; \ + XOR(B, T) ; \ + AND(T, D) ; \ + XOR(C, D) ; \ + AND(T, A) ; \ + XOR(T, C) ; \ + AND(C, B) ; \ + OR(C, A) ; \ + NOT(D) ; \ + XOR(C, D) ; \ + XOR(A, D) ; \ + AND(A, B) ; \ + XOR(D, T) ; \ + XOR(D, A) ; \ + ASSIGN(A, B) ; \ + ASSIGN(B, T) ; + +#define SBOX_D4(A, B, C, D, T) \ + ASSIGN(T, C) ; \ + XOR(C, B) ; \ + XOR(A, C) ; \ + AND(T, C) ; \ + XOR(T, A) ; \ + AND(A, B) ; \ + XOR(B, D) ; \ + OR(D, T) ; \ + XOR(C, D) ; \ + XOR(A, D) ; \ + XOR(B, T) ; \ + AND(D, C) ; \ + XOR(D, B) ; \ + XOR(B, A) ; \ + OR(B, C) ; \ + XOR(A, D) ; \ + XOR(B, T) ; \ + XOR(A, B) ; \ + ASSIGN(T, A) ; \ + ASSIGN(A, C) ; \ + ASSIGN(C, D) ; \ + ASSIGN(D, T) ; + +#define SBOX_D5(A, B, C, D, T) \ + ASSIGN(T, C) ; \ + AND(C, D) ; \ + XOR(C, B) ; \ + OR(B, D) ; \ + AND(B, A) ; \ + XOR(T, C) ; \ + XOR(T, B) ; \ + AND(B, C) ; \ + NOT(A) ; \ + XOR(D, T) ; \ + XOR(B, D) ; \ + AND(D, A) ; \ + XOR(D, C) ; \ + XOR(A, B) ; \ + AND(C, A) ; \ + XOR(D, A) ; \ + XOR(C, T) ; \ + OR(C, D) ; \ + XOR(D, A) ; \ + XOR(C, B) ; \ + ASSIGN(B, D) ; \ + ASSIGN(D, T) ; + +#define SBOX_D6(A, B, C, D, T) \ + NOT(B) ; \ + ASSIGN(T, D) ; \ + XOR(C, B) ; \ + OR(D, A) ; \ + XOR(D, C) ; \ + OR(C, B) ; \ + AND(C, A) ; \ + XOR(T, D) ; \ + XOR(C, T) ; \ + OR(T, A) ; \ + XOR(T, B) ; \ + AND(B, C) ; \ + XOR(B, D) ; \ + XOR(T, C) ; \ + AND(D, T) ; \ + XOR(T, B) ; \ + XOR(D, T) ; \ + NOT(T) ; \ + XOR(D, A) ; \ + ASSIGN(A, B) ; \ + ASSIGN(B, T) ; \ + ASSIGN(T, D) ; \ + ASSIGN(D, C) ; \ + ASSIGN(C, T) ; + +#define SBOX_D7(A, B, C, D, T) \ + XOR(A, C) ; \ + ASSIGN(T, C) ; \ + AND(C, A) ; \ + XOR(T, D) ; \ + NOT(C) ; \ + XOR(D, B) ; \ + XOR(C, D) ; \ + OR(T, A) ; \ + XOR(A, C) ; \ + XOR(D, T) ; \ + XOR(T, B) ; \ + AND(B, D) ; \ + XOR(B, A) ; \ + XOR(A, D) ; \ + OR(A, C) ; \ + XOR(D, B) ; \ + XOR(T, A) ; \ + ASSIGN(A, B) ; \ + ASSIGN(B, C) ; \ + ASSIGN(C, T) ; + +#define SBOX_D8(A, B, C, D, T) \ + ASSIGN(T, C) ; \ + XOR(C, A) ; \ + AND(A, D) ; \ + OR(T, D) ; \ + NOT(C) ; \ + XOR(D, B) ; \ + OR(B, A) ; \ + XOR(A, C) ; \ + AND(C, T) ; \ + AND(D, T) ; \ + XOR(B, C) ; \ + XOR(C, A) ; \ + OR(A, C) ; \ + XOR(T, B) ; \ + XOR(A, D) ; \ + XOR(D, T) ; \ + OR(T, A) ; \ + XOR(D, C) ; \ + XOR(T, C) ; \ + ASSIGN(C, B) ; \ + ASSIGN(B, A) ; \ + ASSIGN(A, D) ; \ + ASSIGN(D, T) ; + +#define TRANSFORM(A, B, C, D, T) \ + ROTL_IMM(A, 13) ; \ + ROTL_IMM(C, 3) ; \ + SHL2_3(T, A) ; \ + XOR(B, A) ; \ + XOR(D, C) ; \ + XOR(B, C) ; \ + XOR(D, T) ; \ + ROTL_IMM(B, 1) ; \ + ROTL_IMM(D, 7) ; \ + ASSIGN(T, B) ; \ + SHL_IMM(T, 7) ; \ + XOR(A, B) ; \ + XOR(C, D) ; \ + XOR(A, D) ; \ + XOR(C, T) ; \ + ROTL_IMM(A, 5) ; \ + ROTL_IMM(C, 22) ; + +#define I_TRANSFORM(A, B, C, D, T) \ + ROTR_IMM(C, 22) ; \ + ROTR_IMM(A, 5) ; \ + ASSIGN(T, B) ; \ + SHL_IMM(T, 7) ; \ + XOR(A, B) ; \ + XOR(C, D) ; \ + XOR(A, D) ; \ + XOR(C, T) ; \ + ROTR_IMM(D, 7) ; \ + ROTR_IMM(B, 1) ; \ + SHL2_3(T, A) ; \ + XOR(B, C) ; \ + XOR(D, C) ; \ + XOR(B, A) ; \ + XOR(D, T) ; \ + ROTR_IMM(C, 3) ; \ + ROTR_IMM(A, 13) ; + +#define KEY_XOR(A, B, C, D, N) \ + XOR(A, ARRAY4(EDI, (4*N ))) ; \ + XOR(B, ARRAY4(EDI, (4*N+1))) ; \ + XOR(C, ARRAY4(EDI, (4*N+2))) ; \ + XOR(D, ARRAY4(EDI, (4*N+3))) ; + +/* +* Serpent Encryption +*/ +START_FUNCTION(botan_serpent_ia32_encrypt) + SPILL_REGS() +#define PUSHED 4 + + ASSIGN(EBP, ARG(1)) /* input block */ + ASSIGN(EAX, ARRAY4(EBP, 0)) + ASSIGN(EBX, ARRAY4(EBP, 1)) + ASSIGN(ECX, ARRAY4(EBP, 2)) + ASSIGN(EDX, ARRAY4(EBP, 3)) + + ASSIGN(EDI, ARG(3)) /* round keys */ + ZEROIZE(EBP) + +#define E_ROUND(A, B, C, D, T, N, SBOX) \ + KEY_XOR(A, B, C, D, N) \ + SBOX(A, B, C, D, T) \ + TRANSFORM(A, B, C, D, T) + + + E_ROUND(EAX, EBX, ECX, EDX, EBP, 0, SBOX_E1) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 1, SBOX_E2) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 2, SBOX_E3) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 3, SBOX_E4) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 4, SBOX_E5) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 5, SBOX_E6) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 6, SBOX_E7) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 7, SBOX_E8) + + E_ROUND(EAX, EBX, ECX, EDX, EBP, 8, SBOX_E1) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 9, SBOX_E2) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 10, SBOX_E3) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 11, SBOX_E4) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 12, SBOX_E5) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 13, SBOX_E6) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 14, SBOX_E7) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 15, SBOX_E8) + + E_ROUND(EAX, EBX, ECX, EDX, EBP, 16, SBOX_E1) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 17, SBOX_E2) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 18, SBOX_E3) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 19, SBOX_E4) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 20, SBOX_E5) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 21, SBOX_E6) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 22, SBOX_E7) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 23, SBOX_E8) + + E_ROUND(EAX, EBX, ECX, EDX, EBP, 24, SBOX_E1) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 25, SBOX_E2) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 26, SBOX_E3) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 27, SBOX_E4) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 28, SBOX_E5) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 29, SBOX_E6) + E_ROUND(EAX, EBX, ECX, EDX, EBP, 30, SBOX_E7) + + KEY_XOR(EAX, EBX, ECX, EDX, 31) + SBOX_E8(EAX, EBX, ECX, EDX, EBP) + KEY_XOR(EAX, EBX, ECX, EDX, 32) + + ASSIGN(EBP, ARG(2)) /* output block */ + ASSIGN(ARRAY4(EBP, 0), EAX) + ASSIGN(ARRAY4(EBP, 1), EBX) + ASSIGN(ARRAY4(EBP, 2), ECX) + ASSIGN(ARRAY4(EBP, 3), EDX) + + RESTORE_REGS() +#undef PUSHED +END_FUNCTION(botan_serpent_ia32_encrypt) + +/* +* Serpent Decryption +*/ +START_FUNCTION(botan_serpent_ia32_decrypt) + SPILL_REGS() +#define PUSHED 4 + + ASSIGN(EBP, ARG(1)) /* input block */ + ASSIGN(EAX, ARRAY4(EBP, 0)) + ASSIGN(EBX, ARRAY4(EBP, 1)) + ASSIGN(ECX, ARRAY4(EBP, 2)) + ASSIGN(EDX, ARRAY4(EBP, 3)) + + ASSIGN(EDI, ARG(3)) /* round keys */ + + ZEROIZE(EBP) + +#define D_ROUND(A, B, C, D, T, N, SBOX) \ + I_TRANSFORM(A, B, C, D, T) \ + SBOX(A, B, C, D, T) \ + KEY_XOR(A, B, C, D, N) \ + + KEY_XOR(EAX, EBX, ECX, EDX, 32) + SBOX_D8(EAX, EBX, ECX, EDX, EBP) + KEY_XOR(EAX, EBX, ECX, EDX, 31) + + D_ROUND(EAX, EBX, ECX, EDX, EBP, 30, SBOX_D7) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 29, SBOX_D6) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 28, SBOX_D5) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 27, SBOX_D4) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 26, SBOX_D3) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 25, SBOX_D2) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 24, SBOX_D1) + + D_ROUND(EAX, EBX, ECX, EDX, EBP, 23, SBOX_D8) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 22, SBOX_D7) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 21, SBOX_D6) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 20, SBOX_D5) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 19, SBOX_D4) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 18, SBOX_D3) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 17, SBOX_D2) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 16, SBOX_D1) + + D_ROUND(EAX, EBX, ECX, EDX, EBP, 15, SBOX_D8) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 14, SBOX_D7) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 13, SBOX_D6) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 12, SBOX_D5) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 11, SBOX_D4) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 10, SBOX_D3) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 9, SBOX_D2) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 8, SBOX_D1) + + D_ROUND(EAX, EBX, ECX, EDX, EBP, 7, SBOX_D8) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 6, SBOX_D7) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 5, SBOX_D6) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 4, SBOX_D5) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 3, SBOX_D4) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 2, SBOX_D3) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 1, SBOX_D2) + D_ROUND(EAX, EBX, ECX, EDX, EBP, 0, SBOX_D1) + + ASSIGN(EBP, ARG(2)) /* output block */ + ASSIGN(ARRAY4(EBP, 0), EAX) + ASSIGN(ARRAY4(EBP, 1), EBX) + ASSIGN(ARRAY4(EBP, 2), ECX) + ASSIGN(ARRAY4(EBP, 3), EDX) + + RESTORE_REGS() +#undef PUSHED +END_FUNCTION(botan_serpent_ia32_decrypt) + +/* +* Serpent Key Schedule +*/ +START_FUNCTION(botan_serpent_ia32_key_schedule) + SPILL_REGS() +#define PUSHED 4 + + ASSIGN(EDI, ARG(1)) /* round keys */ + ASSIGN(ESI, IMM(8)) + ADD_IMM(EDI, 32) + +START_LOOP(.EXPANSION) + ASSIGN(EAX, ARRAY4(EDI, -1)) + ASSIGN(EBX, ARRAY4(EDI, -3)) + ASSIGN(ECX, ARRAY4(EDI, -5)) + ASSIGN(EDX, ARRAY4(EDI, -8)) + + ASSIGN(EBP, ESI) + SUB_IMM(EBP, 8) + XOR(EBP, IMM(0x9E3779B9)) + XOR(EAX, EBX) + XOR(ECX, EDX) + XOR(EAX, EBP) + XOR(EAX, ECX) + + ROTL_IMM(EAX, 11) + + ASSIGN(ARRAY4(EDI, 0), EAX) + + ADD_IMM(ESI, 1) + ADD_IMM(EDI, 4) +LOOP_UNTIL_EQ(ESI, 140, .EXPANSION) + + ASSIGN(EDI, ARG(1)) /* round keys */ + +#define LOAD_AND_SBOX(MSG, SBOX) \ + ASSIGN(EAX, ARRAY4(EDI, (4*MSG+ 8))) ; \ + ASSIGN(EBX, ARRAY4(EDI, (4*MSG+ 9))) ; \ + ASSIGN(ECX, ARRAY4(EDI, (4*MSG+10))) ; \ + ASSIGN(EDX, ARRAY4(EDI, (4*MSG+11))) ; \ + SBOX(EAX, EBX, ECX, EDX, EBP) ; \ + ASSIGN(ARRAY4(EDI, (4*MSG+ 8)), EAX) ; \ + ASSIGN(ARRAY4(EDI, (4*MSG+ 9)), EBX) ; \ + ASSIGN(ARRAY4(EDI, (4*MSG+10)), ECX) ; \ + ASSIGN(ARRAY4(EDI, (4*MSG+11)), EDX) + + LOAD_AND_SBOX( 0, SBOX_E4) + LOAD_AND_SBOX( 1, SBOX_E3) + LOAD_AND_SBOX( 2, SBOX_E2) + LOAD_AND_SBOX( 3, SBOX_E1) + + LOAD_AND_SBOX( 4, SBOX_E8) + LOAD_AND_SBOX( 5, SBOX_E7) + LOAD_AND_SBOX( 6, SBOX_E6) + LOAD_AND_SBOX( 7, SBOX_E5) + LOAD_AND_SBOX( 8, SBOX_E4) + LOAD_AND_SBOX( 9, SBOX_E3) + LOAD_AND_SBOX(10, SBOX_E2) + LOAD_AND_SBOX(11, SBOX_E1) + + LOAD_AND_SBOX(12, SBOX_E8) + LOAD_AND_SBOX(13, SBOX_E7) + LOAD_AND_SBOX(14, SBOX_E6) + LOAD_AND_SBOX(15, SBOX_E5) + LOAD_AND_SBOX(16, SBOX_E4) + LOAD_AND_SBOX(17, SBOX_E3) + LOAD_AND_SBOX(18, SBOX_E2) + LOAD_AND_SBOX(19, SBOX_E1) + + LOAD_AND_SBOX(20, SBOX_E8) + LOAD_AND_SBOX(21, SBOX_E7) + LOAD_AND_SBOX(22, SBOX_E6) + LOAD_AND_SBOX(23, SBOX_E5) + LOAD_AND_SBOX(24, SBOX_E4) + LOAD_AND_SBOX(25, SBOX_E3) + LOAD_AND_SBOX(26, SBOX_E2) + LOAD_AND_SBOX(27, SBOX_E1) + + LOAD_AND_SBOX(28, SBOX_E8) + LOAD_AND_SBOX(29, SBOX_E7) + LOAD_AND_SBOX(30, SBOX_E6) + LOAD_AND_SBOX(31, SBOX_E5) + LOAD_AND_SBOX(32, SBOX_E4) + + RESTORE_REGS() +#undef PUSHED +END_FUNCTION(botan_serpent_ia32_key_schedule) diff --git a/src/libs/3rdparty/botan/src/block/skipjack/info.txt b/src/libs/3rdparty/botan/src/block/skipjack/info.txt new file mode 100644 index 00000000000..4b38d6d2804 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/skipjack/info.txt @@ -0,0 +1,10 @@ +realname "Skipjack" + +define SKIPJACK + +load_on auto + + +skipjack.cpp +skipjack.h + diff --git a/src/libs/3rdparty/botan/src/block/skipjack/skipjack.cpp b/src/libs/3rdparty/botan/src/block/skipjack/skipjack.cpp new file mode 100644 index 00000000000..f5ffc861ef1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/skipjack/skipjack.cpp @@ -0,0 +1,162 @@ +/* +* Skipjack +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Skipjack Encryption +*/ +void Skipjack::enc(const byte in[], byte out[]) const + { + u16bit W1 = load_le(in, 3); + u16bit W2 = load_le(in, 2); + u16bit W3 = load_le(in, 1); + u16bit W4 = load_le(in, 0); + + step_A(W1,W4, 1); step_A(W4,W3, 2); step_A(W3,W2, 3); step_A(W2,W1, 4); + step_A(W1,W4, 5); step_A(W4,W3, 6); step_A(W3,W2, 7); step_A(W2,W1, 8); + + step_B(W1,W2, 9); step_B(W4,W1,10); step_B(W3,W4,11); step_B(W2,W3,12); + step_B(W1,W2,13); step_B(W4,W1,14); step_B(W3,W4,15); step_B(W2,W3,16); + + step_A(W1,W4,17); step_A(W4,W3,18); step_A(W3,W2,19); step_A(W2,W1,20); + step_A(W1,W4,21); step_A(W4,W3,22); step_A(W3,W2,23); step_A(W2,W1,24); + + step_B(W1,W2,25); step_B(W4,W1,26); step_B(W3,W4,27); step_B(W2,W3,28); + step_B(W1,W2,29); step_B(W4,W1,30); step_B(W3,W4,31); step_B(W2,W3,32); + + store_le(out, W4, W3, W2, W1); + } + +/* +* Skipjack Decryption +*/ +void Skipjack::dec(const byte in[], byte out[]) const + { + u16bit W1 = load_le(in, 3); + u16bit W2 = load_le(in, 2); + u16bit W3 = load_le(in, 1); + u16bit W4 = load_le(in, 0); + + step_Bi(W2,W3,32); step_Bi(W3,W4,31); step_Bi(W4,W1,30); step_Bi(W1,W2,29); + step_Bi(W2,W3,28); step_Bi(W3,W4,27); step_Bi(W4,W1,26); step_Bi(W1,W2,25); + + step_Ai(W1,W2,24); step_Ai(W2,W3,23); step_Ai(W3,W4,22); step_Ai(W4,W1,21); + step_Ai(W1,W2,20); step_Ai(W2,W3,19); step_Ai(W3,W4,18); step_Ai(W4,W1,17); + + step_Bi(W2,W3,16); step_Bi(W3,W4,15); step_Bi(W4,W1,14); step_Bi(W1,W2,13); + step_Bi(W2,W3,12); step_Bi(W3,W4,11); step_Bi(W4,W1,10); step_Bi(W1,W2, 9); + + step_Ai(W1,W2, 8); step_Ai(W2,W3, 7); step_Ai(W3,W4, 6); step_Ai(W4,W1, 5); + step_Ai(W1,W2, 4); step_Ai(W2,W3, 3); step_Ai(W3,W4, 2); step_Ai(W4,W1, 1); + + store_le(out, W4, W3, W2, W1); + } + +/* +* Skipjack Stepping Rule 'A' +*/ +void Skipjack::step_A(u16bit& W1, u16bit& W4, u32bit round) const + { + byte G1 = get_byte(0, W1), G2 = get_byte(1, W1), G3; + G3 = FTABLE[(4 * round - 4) % 10][G2] ^ G1; + G1 = FTABLE[(4 * round - 3) % 10][G3] ^ G2; + G2 = FTABLE[(4 * round - 2) % 10][G1] ^ G3; + G3 = FTABLE[(4 * round - 1) % 10][G2] ^ G1; + W1 = make_u16bit(G2, G3); + W4 ^= W1 ^ round; + } + +/* +* Skipjack Stepping Rule 'B' +*/ +void Skipjack::step_B(u16bit& W1, u16bit& W2, u32bit round) const + { + W2 ^= W1 ^ round; + byte G1 = get_byte(0, W1), G2 = get_byte(1, W1), G3; + G3 = FTABLE[(4 * round - 4) % 10][G2] ^ G1; + G1 = FTABLE[(4 * round - 3) % 10][G3] ^ G2; + G2 = FTABLE[(4 * round - 2) % 10][G1] ^ G3; + G3 = FTABLE[(4 * round - 1) % 10][G2] ^ G1; + W1 = make_u16bit(G2, G3); + } + +/* +* Skipjack Invserse Stepping Rule 'A' +*/ +void Skipjack::step_Ai(u16bit& W1, u16bit& W2, u32bit round) const + { + W1 ^= W2 ^ round; + byte G1 = get_byte(1, W2), G2 = get_byte(0, W2), G3; + G3 = FTABLE[(4 * round - 1) % 10][G2] ^ G1; + G1 = FTABLE[(4 * round - 2) % 10][G3] ^ G2; + G2 = FTABLE[(4 * round - 3) % 10][G1] ^ G3; + G3 = FTABLE[(4 * round - 4) % 10][G2] ^ G1; + W2 = make_u16bit(G3, G2); + } + +/* +* Skipjack Invserse Stepping Rule 'B' +*/ +void Skipjack::step_Bi(u16bit& W2, u16bit& W3, u32bit round) const + { + byte G1 = get_byte(1, W2), G2 = get_byte(0, W2), G3; + G3 = FTABLE[(4 * round - 1) % 10][G2] ^ G1; + G1 = FTABLE[(4 * round - 2) % 10][G3] ^ G2; + G2 = FTABLE[(4 * round - 3) % 10][G1] ^ G3; + G3 = FTABLE[(4 * round - 4) % 10][G2] ^ G1; + W2 = make_u16bit(G3, G2); + W3 ^= W2 ^ round; + } + +/* +* Skipjack Key Schedule +*/ +void Skipjack::key_schedule(const byte key[], u32bit) + { + static const byte F[256] = { + 0xA3, 0xD7, 0x09, 0x83, 0xF8, 0x48, 0xF6, 0xF4, 0xB3, 0x21, 0x15, 0x78, + 0x99, 0xB1, 0xAF, 0xF9, 0xE7, 0x2D, 0x4D, 0x8A, 0xCE, 0x4C, 0xCA, 0x2E, + 0x52, 0x95, 0xD9, 0x1E, 0x4E, 0x38, 0x44, 0x28, 0x0A, 0xDF, 0x02, 0xA0, + 0x17, 0xF1, 0x60, 0x68, 0x12, 0xB7, 0x7A, 0xC3, 0xE9, 0xFA, 0x3D, 0x53, + 0x96, 0x84, 0x6B, 0xBA, 0xF2, 0x63, 0x9A, 0x19, 0x7C, 0xAE, 0xE5, 0xF5, + 0xF7, 0x16, 0x6A, 0xA2, 0x39, 0xB6, 0x7B, 0x0F, 0xC1, 0x93, 0x81, 0x1B, + 0xEE, 0xB4, 0x1A, 0xEA, 0xD0, 0x91, 0x2F, 0xB8, 0x55, 0xB9, 0xDA, 0x85, + 0x3F, 0x41, 0xBF, 0xE0, 0x5A, 0x58, 0x80, 0x5F, 0x66, 0x0B, 0xD8, 0x90, + 0x35, 0xD5, 0xC0, 0xA7, 0x33, 0x06, 0x65, 0x69, 0x45, 0x00, 0x94, 0x56, + 0x6D, 0x98, 0x9B, 0x76, 0x97, 0xFC, 0xB2, 0xC2, 0xB0, 0xFE, 0xDB, 0x20, + 0xE1, 0xEB, 0xD6, 0xE4, 0xDD, 0x47, 0x4A, 0x1D, 0x42, 0xED, 0x9E, 0x6E, + 0x49, 0x3C, 0xCD, 0x43, 0x27, 0xD2, 0x07, 0xD4, 0xDE, 0xC7, 0x67, 0x18, + 0x89, 0xCB, 0x30, 0x1F, 0x8D, 0xC6, 0x8F, 0xAA, 0xC8, 0x74, 0xDC, 0xC9, + 0x5D, 0x5C, 0x31, 0xA4, 0x70, 0x88, 0x61, 0x2C, 0x9F, 0x0D, 0x2B, 0x87, + 0x50, 0x82, 0x54, 0x64, 0x26, 0x7D, 0x03, 0x40, 0x34, 0x4B, 0x1C, 0x73, + 0xD1, 0xC4, 0xFD, 0x3B, 0xCC, 0xFB, 0x7F, 0xAB, 0xE6, 0x3E, 0x5B, 0xA5, + 0xAD, 0x04, 0x23, 0x9C, 0x14, 0x51, 0x22, 0xF0, 0x29, 0x79, 0x71, 0x7E, + 0xFF, 0x8C, 0x0E, 0xE2, 0x0C, 0xEF, 0xBC, 0x72, 0x75, 0x6F, 0x37, 0xA1, + 0xEC, 0xD3, 0x8E, 0x62, 0x8B, 0x86, 0x10, 0xE8, 0x08, 0x77, 0x11, 0xBE, + 0x92, 0x4F, 0x24, 0xC5, 0x32, 0x36, 0x9D, 0xCF, 0xF3, 0xA6, 0xBB, 0xAC, + 0x5E, 0x6C, 0xA9, 0x13, 0x57, 0x25, 0xB5, 0xE3, 0xBD, 0xA8, 0x3A, 0x01, + 0x05, 0x59, 0x2A, 0x46 }; + + for(u32bit j = 0; j != 10; ++j) + for(u32bit k = 0; k != 256; ++k) + FTABLE[j][k] = F[k ^ key[9-j]]; + } + +/* +* Clear memory of sensitive data +*/ +void Skipjack::clear() throw() + { + for(u32bit j = 0; j != 10; ++j) + FTABLE[j].clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/skipjack/skipjack.h b/src/libs/3rdparty/botan/src/block/skipjack/skipjack.h new file mode 100644 index 00000000000..231cd9c872f --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/skipjack/skipjack.h @@ -0,0 +1,38 @@ +/* +* Skipjack +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SKIPJACK_H__ +#define BOTAN_SKIPJACK_H__ + +#include + +namespace Botan { + +/* +* Skipjack +*/ +class BOTAN_DLL Skipjack : public BlockCipher + { + public: + void clear() throw(); + std::string name() const { return "Skipjack"; } + BlockCipher* clone() const { return new Skipjack; } + Skipjack() : BlockCipher(8, 10) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + void step_A(u16bit&, u16bit&, u32bit) const; + void step_B(u16bit&, u16bit&, u32bit) const; + void step_Ai(u16bit&, u16bit&, u32bit) const; + void step_Bi(u16bit&, u16bit&, u32bit) const; + SecureBuffer FTABLE[10]; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/square/info.txt b/src/libs/3rdparty/botan/src/block/square/info.txt new file mode 100644 index 00000000000..a206979237b --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/square/info.txt @@ -0,0 +1,11 @@ +realname "Square" + +define SQUARE + +load_on auto + + +sqr_tab.cpp +square.cpp +square.h + diff --git a/src/libs/3rdparty/botan/src/block/square/sqr_tab.cpp b/src/libs/3rdparty/botan/src/block/square/sqr_tab.cpp new file mode 100644 index 00000000000..331bf3ea1ee --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/square/sqr_tab.cpp @@ -0,0 +1,460 @@ +/* +* S-Box and Diffusion Tables for Square +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +const byte Square::SE[256] = { +0xB1, 0xCE, 0xC3, 0x95, 0x5A, 0xAD, 0xE7, 0x02, 0x4D, 0x44, 0xFB, 0x91, 0x0C, +0x87, 0xA1, 0x50, 0xCB, 0x67, 0x54, 0xDD, 0x46, 0x8F, 0xE1, 0x4E, 0xF0, 0xFD, +0xFC, 0xEB, 0xF9, 0xC4, 0x1A, 0x6E, 0x5E, 0xF5, 0xCC, 0x8D, 0x1C, 0x56, 0x43, +0xFE, 0x07, 0x61, 0xF8, 0x75, 0x59, 0xFF, 0x03, 0x22, 0x8A, 0xD1, 0x13, 0xEE, +0x88, 0x00, 0x0E, 0x34, 0x15, 0x80, 0x94, 0xE3, 0xED, 0xB5, 0x53, 0x23, 0x4B, +0x47, 0x17, 0xA7, 0x90, 0x35, 0xAB, 0xD8, 0xB8, 0xDF, 0x4F, 0x57, 0x9A, 0x92, +0xDB, 0x1B, 0x3C, 0xC8, 0x99, 0x04, 0x8E, 0xE0, 0xD7, 0x7D, 0x85, 0xBB, 0x40, +0x2C, 0x3A, 0x45, 0xF1, 0x42, 0x65, 0x20, 0x41, 0x18, 0x72, 0x25, 0x93, 0x70, +0x36, 0x05, 0xF2, 0x0B, 0xA3, 0x79, 0xEC, 0x08, 0x27, 0x31, 0x32, 0xB6, 0x7C, +0xB0, 0x0A, 0x73, 0x5B, 0x7B, 0xB7, 0x81, 0xD2, 0x0D, 0x6A, 0x26, 0x9E, 0x58, +0x9C, 0x83, 0x74, 0xB3, 0xAC, 0x30, 0x7A, 0x69, 0x77, 0x0F, 0xAE, 0x21, 0xDE, +0xD0, 0x2E, 0x97, 0x10, 0xA4, 0x98, 0xA8, 0xD4, 0x68, 0x2D, 0x62, 0x29, 0x6D, +0x16, 0x49, 0x76, 0xC7, 0xE8, 0xC1, 0x96, 0x37, 0xE5, 0xCA, 0xF4, 0xE9, 0x63, +0x12, 0xC2, 0xA6, 0x14, 0xBC, 0xD3, 0x28, 0xAF, 0x2F, 0xE6, 0x24, 0x52, 0xC6, +0xA0, 0x09, 0xBD, 0x8C, 0xCF, 0x5D, 0x11, 0x5F, 0x01, 0xC5, 0x9F, 0x3D, 0xA2, +0x9B, 0xC9, 0x3B, 0xBE, 0x51, 0x19, 0x1F, 0x3F, 0x5C, 0xB2, 0xEF, 0x4A, 0xCD, +0xBF, 0xBA, 0x6F, 0x64, 0xD9, 0xF3, 0x3E, 0xB4, 0xAA, 0xDC, 0xD5, 0x06, 0xC0, +0x7E, 0xF6, 0x66, 0x6C, 0x84, 0x71, 0x38, 0xB9, 0x1D, 0x7F, 0x9D, 0x48, 0x8B, +0x2A, 0xDA, 0xA5, 0x33, 0x82, 0x39, 0xD6, 0x78, 0x86, 0xFA, 0xE4, 0x2B, 0xA9, +0x1E, 0x89, 0x60, 0x6B, 0xEA, 0x55, 0x4C, 0xF7, 0xE2 }; + +const byte Square::SD[256] = { +0x35, 0xBE, 0x07, 0x2E, 0x53, 0x69, 0xDB, 0x28, 0x6F, 0xB7, 0x76, 0x6B, 0x0C, +0x7D, 0x36, 0x8B, 0x92, 0xBC, 0xA9, 0x32, 0xAC, 0x38, 0x9C, 0x42, 0x63, 0xC8, +0x1E, 0x4F, 0x24, 0xE5, 0xF7, 0xC9, 0x61, 0x8D, 0x2F, 0x3F, 0xB3, 0x65, 0x7F, +0x70, 0xAF, 0x9A, 0xEA, 0xF5, 0x5B, 0x98, 0x90, 0xB1, 0x87, 0x71, 0x72, 0xED, +0x37, 0x45, 0x68, 0xA3, 0xE3, 0xEF, 0x5C, 0xC5, 0x50, 0xC1, 0xD6, 0xCA, 0x5A, +0x62, 0x5F, 0x26, 0x09, 0x5D, 0x14, 0x41, 0xE8, 0x9D, 0xCE, 0x40, 0xFD, 0x08, +0x17, 0x4A, 0x0F, 0xC7, 0xB4, 0x3E, 0x12, 0xFC, 0x25, 0x4B, 0x81, 0x2C, 0x04, +0x78, 0xCB, 0xBB, 0x20, 0xBD, 0xF9, 0x29, 0x99, 0xA8, 0xD3, 0x60, 0xDF, 0x11, +0x97, 0x89, 0x7E, 0xFA, 0xE0, 0x9B, 0x1F, 0xD2, 0x67, 0xE2, 0x64, 0x77, 0x84, +0x2B, 0x9E, 0x8A, 0xF1, 0x6D, 0x88, 0x79, 0x74, 0x57, 0xDD, 0xE6, 0x39, 0x7B, +0xEE, 0x83, 0xE1, 0x58, 0xF2, 0x0D, 0x34, 0xF8, 0x30, 0xE9, 0xB9, 0x23, 0x54, +0x15, 0x44, 0x0B, 0x4D, 0x66, 0x3A, 0x03, 0xA2, 0x91, 0x94, 0x52, 0x4C, 0xC3, +0x82, 0xE7, 0x80, 0xC0, 0xB6, 0x0E, 0xC2, 0x6C, 0x93, 0xEC, 0xAB, 0x43, 0x95, +0xF6, 0xD8, 0x46, 0x86, 0x05, 0x8C, 0xB0, 0x75, 0x00, 0xCC, 0x85, 0xD7, 0x3D, +0x73, 0x7A, 0x48, 0xE4, 0xD1, 0x59, 0xAD, 0xB8, 0xC6, 0xD0, 0xDC, 0xA1, 0xAA, +0x02, 0x1D, 0xBF, 0xB5, 0x9F, 0x51, 0xC4, 0xA5, 0x10, 0x22, 0xCF, 0x01, 0xBA, +0x8F, 0x31, 0x7C, 0xAE, 0x96, 0xDA, 0xF0, 0x56, 0x47, 0xD4, 0xEB, 0x4E, 0xD9, +0x13, 0x8E, 0x49, 0x55, 0x16, 0xFF, 0x3B, 0xF4, 0xA4, 0xB2, 0x06, 0xA0, 0xA7, +0xFB, 0x1B, 0x6E, 0x3C, 0x33, 0xCD, 0x18, 0x5E, 0x6A, 0xD5, 0xA6, 0x21, 0xDE, +0xFE, 0x2A, 0x1C, 0xF3, 0x0A, 0x1A, 0x19, 0x27, 0x2D }; + +const byte Square::Log[256] = { +0x00, 0x00, 0x01, 0x86, 0x02, 0x0D, 0x87, 0x4C, 0x03, 0xD2, 0x0E, 0xAE, 0x88, +0x22, 0x4D, 0x93, 0x04, 0x1A, 0xD3, 0xCB, 0x0F, 0x98, 0xAF, 0xA8, 0x89, 0xF0, +0x23, 0x59, 0x4E, 0x35, 0x94, 0x09, 0x05, 0x8F, 0x1B, 0x6E, 0xD4, 0x39, 0xCC, +0xBB, 0x10, 0x68, 0x99, 0x77, 0xB0, 0xDF, 0xA9, 0x72, 0x8A, 0xFA, 0xF1, 0xA0, +0x24, 0x52, 0x5A, 0x60, 0x4F, 0x2F, 0x36, 0xDC, 0x95, 0x32, 0x0A, 0x1F, 0x06, +0xA5, 0x90, 0x49, 0x1C, 0x5D, 0x6F, 0xB8, 0xD5, 0xC1, 0x3A, 0xB5, 0xCD, 0x63, +0xBC, 0x3D, 0x11, 0x44, 0x69, 0x81, 0x9A, 0x27, 0x78, 0xC4, 0xB1, 0xE6, 0xE0, +0xEA, 0xAA, 0x55, 0x73, 0xD8, 0x8B, 0xF6, 0xFB, 0x16, 0xF2, 0xF4, 0xA1, 0x40, +0x25, 0x42, 0x53, 0xE4, 0x5B, 0xA3, 0x61, 0xBF, 0x50, 0xF8, 0x30, 0x2D, 0x37, +0x8D, 0xDD, 0x66, 0x96, 0x18, 0x33, 0xEE, 0x0B, 0xFD, 0x20, 0xD0, 0x07, 0x57, +0xA6, 0xC9, 0x91, 0xAC, 0x4A, 0x84, 0x1D, 0xDA, 0x5E, 0x9E, 0x70, 0x75, 0xB9, +0x6C, 0xD6, 0xE8, 0xC2, 0x7F, 0x3B, 0xB3, 0xB6, 0x47, 0xCE, 0xEC, 0x64, 0x2B, +0xBD, 0xE2, 0x3E, 0x14, 0x12, 0x29, 0x45, 0x7D, 0x6A, 0x9C, 0x82, 0xC7, 0x9B, +0xC6, 0x28, 0x7C, 0x79, 0x7A, 0xC5, 0x7B, 0xB2, 0x46, 0xE7, 0x7E, 0xE1, 0x13, +0xEB, 0x2A, 0xAB, 0x83, 0x56, 0xC8, 0x74, 0x6B, 0xD9, 0x9D, 0x8C, 0x65, 0xF7, +0x2C, 0xFC, 0xCF, 0x17, 0xED, 0xF3, 0x3F, 0xF5, 0x15, 0xA2, 0xBE, 0x41, 0xE3, +0x26, 0xC3, 0x43, 0x80, 0x54, 0xD7, 0xE5, 0xE9, 0x5C, 0xB7, 0xA4, 0x48, 0x62, +0x3C, 0xC0, 0xB4, 0x51, 0x5F, 0xF9, 0x9F, 0x31, 0x1E, 0x2E, 0xDB, 0x38, 0xBA, +0x8E, 0x6D, 0xDE, 0x71, 0x67, 0x76, 0x97, 0xA7, 0x19, 0xCA, 0x34, 0x08, 0xEF, +0x58, 0x0C, 0x4B, 0xFE, 0x85, 0x21, 0x92, 0xD1, 0xAD }; + +const byte Square::ALog[255] = { +0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xF5, 0x1F, 0x3E, 0x7C, 0xF8, +0x05, 0x0A, 0x14, 0x28, 0x50, 0xA0, 0xB5, 0x9F, 0xCB, 0x63, 0xC6, 0x79, 0xF2, +0x11, 0x22, 0x44, 0x88, 0xE5, 0x3F, 0x7E, 0xFC, 0x0D, 0x1A, 0x34, 0x68, 0xD0, +0x55, 0xAA, 0xA1, 0xB7, 0x9B, 0xC3, 0x73, 0xE6, 0x39, 0x72, 0xE4, 0x3D, 0x7A, +0xF4, 0x1D, 0x3A, 0x74, 0xE8, 0x25, 0x4A, 0x94, 0xDD, 0x4F, 0x9E, 0xC9, 0x67, +0xCE, 0x69, 0xD2, 0x51, 0xA2, 0xB1, 0x97, 0xDB, 0x43, 0x86, 0xF9, 0x07, 0x0E, +0x1C, 0x38, 0x70, 0xE0, 0x35, 0x6A, 0xD4, 0x5D, 0xBA, 0x81, 0xF7, 0x1B, 0x36, +0x6C, 0xD8, 0x45, 0x8A, 0xE1, 0x37, 0x6E, 0xDC, 0x4D, 0x9A, 0xC1, 0x77, 0xEE, +0x29, 0x52, 0xA4, 0xBD, 0x8F, 0xEB, 0x23, 0x46, 0x8C, 0xED, 0x2F, 0x5E, 0xBC, +0x8D, 0xEF, 0x2B, 0x56, 0xAC, 0xAD, 0xAF, 0xAB, 0xA3, 0xB3, 0x93, 0xD3, 0x53, +0xA6, 0xB9, 0x87, 0xFB, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x75, 0xEA, +0x21, 0x42, 0x84, 0xFD, 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0x15, 0x2A, 0x54, 0xA8, +0xA5, 0xBF, 0x8B, 0xE3, 0x33, 0x66, 0xCC, 0x6D, 0xDA, 0x41, 0x82, 0xF1, 0x17, +0x2E, 0x5C, 0xB8, 0x85, 0xFF, 0x0B, 0x16, 0x2C, 0x58, 0xB0, 0x95, 0xDF, 0x4B, +0x96, 0xD9, 0x47, 0x8E, 0xE9, 0x27, 0x4E, 0x9C, 0xCD, 0x6F, 0xDE, 0x49, 0x92, +0xD1, 0x57, 0xAE, 0xA9, 0xA7, 0xBB, 0x83, 0xF3, 0x13, 0x26, 0x4C, 0x98, 0xC5, +0x7F, 0xFE, 0x09, 0x12, 0x24, 0x48, 0x90, 0xD5, 0x5F, 0xBE, 0x89, 0xE7, 0x3B, +0x76, 0xEC, 0x2D, 0x5A, 0xB4, 0x9D, 0xCF, 0x6B, 0xD6, 0x59, 0xB2, 0x91, 0xD7, +0x5B, 0xB6, 0x99, 0xC7, 0x7B, 0xF6, 0x19, 0x32, 0x64, 0xC8, 0x65, 0xCA, 0x61, +0xC2, 0x71, 0xE2, 0x31, 0x62, 0xC4, 0x7D, 0xFA }; + +const u32bit Square::TE0[256] = { +0x97B1B126, 0x69CECEA7, 0x73C3C3B0, 0xDF95954A, 0xB45A5AEE, 0xAFADAD02, +0x3BE7E7DC, 0x04020206, 0x9A4D4DD7, 0x884444CC, 0x03FBFBF8, 0xD7919146, +0x180C0C14, 0xFB87877C, 0xB7A1A116, 0xA05050F0, 0x63CBCBA8, 0xCE6767A9, +0xA85454FC, 0x4FDDDD92, 0x8C4646CA, 0xEB8F8F64, 0x37E1E1D6, 0x9C4E4ED2, +0x15F0F0E5, 0x0FFDFDF2, 0x0DFCFCF1, 0x23EBEBC8, 0x07F9F9FE, 0x7DC4C4B9, +0x341A1A2E, 0xDC6E6EB2, 0xBC5E5EE2, 0x1FF5F5EA, 0x6DCCCCA1, 0xEF8D8D62, +0x381C1C24, 0xAC5656FA, 0x864343C5, 0x09FEFEF7, 0x0E070709, 0xC26161A3, +0x05F8F8FD, 0xEA75759F, 0xB25959EB, 0x0BFFFFF4, 0x06030305, 0x44222266, +0xE18A8A6B, 0x57D1D186, 0x26131335, 0x29EEEEC7, 0xE588886D, 0x00000000, +0x1C0E0E12, 0x6834345C, 0x2A15153F, 0xF5808075, 0xDD949449, 0x33E3E3D0, +0x2FEDEDC2, 0x9FB5B52A, 0xA65353F5, 0x46232365, 0x964B4BDD, 0x8E4747C9, +0x2E171739, 0xBBA7A71C, 0xD5909045, 0x6A35355F, 0xA3ABAB08, 0x45D8D89D, +0x85B8B83D, 0x4BDFDF94, 0x9E4F4FD1, 0xAE5757F9, 0xC19A9A5B, 0xD1929243, +0x43DBDB98, 0x361B1B2D, 0x783C3C44, 0x65C8C8AD, 0xC799995E, 0x0804040C, +0xE98E8E67, 0x35E0E0D5, 0x5BD7D78C, 0xFA7D7D87, 0xFF85857A, 0x83BBBB38, +0x804040C0, 0x582C2C74, 0x743A3A4E, 0x8A4545CF, 0x17F1F1E6, 0x844242C6, +0xCA6565AF, 0x40202060, 0x824141C3, 0x30181828, 0xE4727296, 0x4A25256F, +0xD3939340, 0xE0707090, 0x6C36365A, 0x0A05050F, 0x11F2F2E3, 0x160B0B1D, +0xB3A3A310, 0xF279798B, 0x2DECECC1, 0x10080818, 0x4E272769, 0x62313153, +0x64323256, 0x99B6B62F, 0xF87C7C84, 0x95B0B025, 0x140A0A1E, 0xE6737395, +0xB65B5BED, 0xF67B7B8D, 0x9BB7B72C, 0xF7818176, 0x51D2D283, 0x1A0D0D17, +0xD46A6ABE, 0x4C26266A, 0xC99E9E57, 0xB05858E8, 0xCD9C9C51, 0xF3838370, +0xE874749C, 0x93B3B320, 0xADACAC01, 0x60303050, 0xF47A7A8E, 0xD26969BB, +0xEE777799, 0x1E0F0F11, 0xA9AEAE07, 0x42212163, 0x49DEDE97, 0x55D0D085, +0x5C2E2E72, 0xDB97974C, 0x20101030, 0xBDA4A419, 0xC598985D, 0xA5A8A80D, +0x5DD4D489, 0xD06868B8, 0x5A2D2D77, 0xC46262A6, 0x5229297B, 0xDA6D6DB7, +0x2C16163A, 0x924949DB, 0xEC76769A, 0x7BC7C7BC, 0x25E8E8CD, 0x77C1C1B6, +0xD996964F, 0x6E373759, 0x3FE5E5DA, 0x61CACAAB, 0x1DF4F4E9, 0x27E9E9CE, +0xC66363A5, 0x24121236, 0x71C2C2B3, 0xB9A6A61F, 0x2814143C, 0x8DBCBC31, +0x53D3D380, 0x50282878, 0xABAFAF04, 0x5E2F2F71, 0x39E6E6DF, 0x4824246C, +0xA45252F6, 0x79C6C6BF, 0xB5A0A015, 0x1209091B, 0x8FBDBD32, 0xED8C8C61, +0x6BCFCFA4, 0xBA5D5DE7, 0x22111133, 0xBE5F5FE1, 0x02010103, 0x7FC5C5BA, +0xCB9F9F54, 0x7A3D3D47, 0xB1A2A213, 0xC39B9B58, 0x67C9C9AE, 0x763B3B4D, +0x89BEBE37, 0xA25151F3, 0x3219192B, 0x3E1F1F21, 0x7E3F3F41, 0xB85C5CE4, +0x91B2B223, 0x2BEFEFC4, 0x944A4ADE, 0x6FCDCDA2, 0x8BBFBF34, 0x81BABA3B, +0xDE6F6FB1, 0xC86464AC, 0x47D9D99E, 0x13F3F3E0, 0x7C3E3E42, 0x9DB4B429, +0xA1AAAA0B, 0x4DDCDC91, 0x5FD5D58A, 0x0C06060A, 0x75C0C0B5, 0xFC7E7E82, +0x19F6F6EF, 0xCC6666AA, 0xD86C6CB4, 0xFD848479, 0xE2717193, 0x70383848, +0x87B9B93E, 0x3A1D1D27, 0xFE7F7F81, 0xCF9D9D52, 0x904848D8, 0xE38B8B68, +0x542A2A7E, 0x41DADA9B, 0xBFA5A51A, 0x66333355, 0xF1828273, 0x7239394B, +0x59D6D68F, 0xF0787888, 0xF986867F, 0x01FAFAFB, 0x3DE4E4D9, 0x562B2B7D, +0xA7A9A90E, 0x3C1E1E22, 0xE789896E, 0xC06060A0, 0xD66B6BBD, 0x21EAEACB, +0xAA5555FF, 0x984C4CD4, 0x1BF7F7EC, 0x31E2E2D3 }; + +const u32bit Square::TE1[256] = { +0x2697B1B1, 0xA769CECE, 0xB073C3C3, 0x4ADF9595, 0xEEB45A5A, 0x02AFADAD, +0xDC3BE7E7, 0x06040202, 0xD79A4D4D, 0xCC884444, 0xF803FBFB, 0x46D79191, +0x14180C0C, 0x7CFB8787, 0x16B7A1A1, 0xF0A05050, 0xA863CBCB, 0xA9CE6767, +0xFCA85454, 0x924FDDDD, 0xCA8C4646, 0x64EB8F8F, 0xD637E1E1, 0xD29C4E4E, +0xE515F0F0, 0xF20FFDFD, 0xF10DFCFC, 0xC823EBEB, 0xFE07F9F9, 0xB97DC4C4, +0x2E341A1A, 0xB2DC6E6E, 0xE2BC5E5E, 0xEA1FF5F5, 0xA16DCCCC, 0x62EF8D8D, +0x24381C1C, 0xFAAC5656, 0xC5864343, 0xF709FEFE, 0x090E0707, 0xA3C26161, +0xFD05F8F8, 0x9FEA7575, 0xEBB25959, 0xF40BFFFF, 0x05060303, 0x66442222, +0x6BE18A8A, 0x8657D1D1, 0x35261313, 0xC729EEEE, 0x6DE58888, 0x00000000, +0x121C0E0E, 0x5C683434, 0x3F2A1515, 0x75F58080, 0x49DD9494, 0xD033E3E3, +0xC22FEDED, 0x2A9FB5B5, 0xF5A65353, 0x65462323, 0xDD964B4B, 0xC98E4747, +0x392E1717, 0x1CBBA7A7, 0x45D59090, 0x5F6A3535, 0x08A3ABAB, 0x9D45D8D8, +0x3D85B8B8, 0x944BDFDF, 0xD19E4F4F, 0xF9AE5757, 0x5BC19A9A, 0x43D19292, +0x9843DBDB, 0x2D361B1B, 0x44783C3C, 0xAD65C8C8, 0x5EC79999, 0x0C080404, +0x67E98E8E, 0xD535E0E0, 0x8C5BD7D7, 0x87FA7D7D, 0x7AFF8585, 0x3883BBBB, +0xC0804040, 0x74582C2C, 0x4E743A3A, 0xCF8A4545, 0xE617F1F1, 0xC6844242, +0xAFCA6565, 0x60402020, 0xC3824141, 0x28301818, 0x96E47272, 0x6F4A2525, +0x40D39393, 0x90E07070, 0x5A6C3636, 0x0F0A0505, 0xE311F2F2, 0x1D160B0B, +0x10B3A3A3, 0x8BF27979, 0xC12DECEC, 0x18100808, 0x694E2727, 0x53623131, +0x56643232, 0x2F99B6B6, 0x84F87C7C, 0x2595B0B0, 0x1E140A0A, 0x95E67373, +0xEDB65B5B, 0x8DF67B7B, 0x2C9BB7B7, 0x76F78181, 0x8351D2D2, 0x171A0D0D, +0xBED46A6A, 0x6A4C2626, 0x57C99E9E, 0xE8B05858, 0x51CD9C9C, 0x70F38383, +0x9CE87474, 0x2093B3B3, 0x01ADACAC, 0x50603030, 0x8EF47A7A, 0xBBD26969, +0x99EE7777, 0x111E0F0F, 0x07A9AEAE, 0x63422121, 0x9749DEDE, 0x8555D0D0, +0x725C2E2E, 0x4CDB9797, 0x30201010, 0x19BDA4A4, 0x5DC59898, 0x0DA5A8A8, +0x895DD4D4, 0xB8D06868, 0x775A2D2D, 0xA6C46262, 0x7B522929, 0xB7DA6D6D, +0x3A2C1616, 0xDB924949, 0x9AEC7676, 0xBC7BC7C7, 0xCD25E8E8, 0xB677C1C1, +0x4FD99696, 0x596E3737, 0xDA3FE5E5, 0xAB61CACA, 0xE91DF4F4, 0xCE27E9E9, +0xA5C66363, 0x36241212, 0xB371C2C2, 0x1FB9A6A6, 0x3C281414, 0x318DBCBC, +0x8053D3D3, 0x78502828, 0x04ABAFAF, 0x715E2F2F, 0xDF39E6E6, 0x6C482424, +0xF6A45252, 0xBF79C6C6, 0x15B5A0A0, 0x1B120909, 0x328FBDBD, 0x61ED8C8C, +0xA46BCFCF, 0xE7BA5D5D, 0x33221111, 0xE1BE5F5F, 0x03020101, 0xBA7FC5C5, +0x54CB9F9F, 0x477A3D3D, 0x13B1A2A2, 0x58C39B9B, 0xAE67C9C9, 0x4D763B3B, +0x3789BEBE, 0xF3A25151, 0x2B321919, 0x213E1F1F, 0x417E3F3F, 0xE4B85C5C, +0x2391B2B2, 0xC42BEFEF, 0xDE944A4A, 0xA26FCDCD, 0x348BBFBF, 0x3B81BABA, +0xB1DE6F6F, 0xACC86464, 0x9E47D9D9, 0xE013F3F3, 0x427C3E3E, 0x299DB4B4, +0x0BA1AAAA, 0x914DDCDC, 0x8A5FD5D5, 0x0A0C0606, 0xB575C0C0, 0x82FC7E7E, +0xEF19F6F6, 0xAACC6666, 0xB4D86C6C, 0x79FD8484, 0x93E27171, 0x48703838, +0x3E87B9B9, 0x273A1D1D, 0x81FE7F7F, 0x52CF9D9D, 0xD8904848, 0x68E38B8B, +0x7E542A2A, 0x9B41DADA, 0x1ABFA5A5, 0x55663333, 0x73F18282, 0x4B723939, +0x8F59D6D6, 0x88F07878, 0x7FF98686, 0xFB01FAFA, 0xD93DE4E4, 0x7D562B2B, +0x0EA7A9A9, 0x223C1E1E, 0x6EE78989, 0xA0C06060, 0xBDD66B6B, 0xCB21EAEA, +0xFFAA5555, 0xD4984C4C, 0xEC1BF7F7, 0xD331E2E2 }; + +const u32bit Square::TE2[256] = { +0xB12697B1, 0xCEA769CE, 0xC3B073C3, 0x954ADF95, 0x5AEEB45A, 0xAD02AFAD, +0xE7DC3BE7, 0x02060402, 0x4DD79A4D, 0x44CC8844, 0xFBF803FB, 0x9146D791, +0x0C14180C, 0x877CFB87, 0xA116B7A1, 0x50F0A050, 0xCBA863CB, 0x67A9CE67, +0x54FCA854, 0xDD924FDD, 0x46CA8C46, 0x8F64EB8F, 0xE1D637E1, 0x4ED29C4E, +0xF0E515F0, 0xFDF20FFD, 0xFCF10DFC, 0xEBC823EB, 0xF9FE07F9, 0xC4B97DC4, +0x1A2E341A, 0x6EB2DC6E, 0x5EE2BC5E, 0xF5EA1FF5, 0xCCA16DCC, 0x8D62EF8D, +0x1C24381C, 0x56FAAC56, 0x43C58643, 0xFEF709FE, 0x07090E07, 0x61A3C261, +0xF8FD05F8, 0x759FEA75, 0x59EBB259, 0xFFF40BFF, 0x03050603, 0x22664422, +0x8A6BE18A, 0xD18657D1, 0x13352613, 0xEEC729EE, 0x886DE588, 0x00000000, +0x0E121C0E, 0x345C6834, 0x153F2A15, 0x8075F580, 0x9449DD94, 0xE3D033E3, +0xEDC22FED, 0xB52A9FB5, 0x53F5A653, 0x23654623, 0x4BDD964B, 0x47C98E47, +0x17392E17, 0xA71CBBA7, 0x9045D590, 0x355F6A35, 0xAB08A3AB, 0xD89D45D8, +0xB83D85B8, 0xDF944BDF, 0x4FD19E4F, 0x57F9AE57, 0x9A5BC19A, 0x9243D192, +0xDB9843DB, 0x1B2D361B, 0x3C44783C, 0xC8AD65C8, 0x995EC799, 0x040C0804, +0x8E67E98E, 0xE0D535E0, 0xD78C5BD7, 0x7D87FA7D, 0x857AFF85, 0xBB3883BB, +0x40C08040, 0x2C74582C, 0x3A4E743A, 0x45CF8A45, 0xF1E617F1, 0x42C68442, +0x65AFCA65, 0x20604020, 0x41C38241, 0x18283018, 0x7296E472, 0x256F4A25, +0x9340D393, 0x7090E070, 0x365A6C36, 0x050F0A05, 0xF2E311F2, 0x0B1D160B, +0xA310B3A3, 0x798BF279, 0xECC12DEC, 0x08181008, 0x27694E27, 0x31536231, +0x32566432, 0xB62F99B6, 0x7C84F87C, 0xB02595B0, 0x0A1E140A, 0x7395E673, +0x5BEDB65B, 0x7B8DF67B, 0xB72C9BB7, 0x8176F781, 0xD28351D2, 0x0D171A0D, +0x6ABED46A, 0x266A4C26, 0x9E57C99E, 0x58E8B058, 0x9C51CD9C, 0x8370F383, +0x749CE874, 0xB32093B3, 0xAC01ADAC, 0x30506030, 0x7A8EF47A, 0x69BBD269, +0x7799EE77, 0x0F111E0F, 0xAE07A9AE, 0x21634221, 0xDE9749DE, 0xD08555D0, +0x2E725C2E, 0x974CDB97, 0x10302010, 0xA419BDA4, 0x985DC598, 0xA80DA5A8, +0xD4895DD4, 0x68B8D068, 0x2D775A2D, 0x62A6C462, 0x297B5229, 0x6DB7DA6D, +0x163A2C16, 0x49DB9249, 0x769AEC76, 0xC7BC7BC7, 0xE8CD25E8, 0xC1B677C1, +0x964FD996, 0x37596E37, 0xE5DA3FE5, 0xCAAB61CA, 0xF4E91DF4, 0xE9CE27E9, +0x63A5C663, 0x12362412, 0xC2B371C2, 0xA61FB9A6, 0x143C2814, 0xBC318DBC, +0xD38053D3, 0x28785028, 0xAF04ABAF, 0x2F715E2F, 0xE6DF39E6, 0x246C4824, +0x52F6A452, 0xC6BF79C6, 0xA015B5A0, 0x091B1209, 0xBD328FBD, 0x8C61ED8C, +0xCFA46BCF, 0x5DE7BA5D, 0x11332211, 0x5FE1BE5F, 0x01030201, 0xC5BA7FC5, +0x9F54CB9F, 0x3D477A3D, 0xA213B1A2, 0x9B58C39B, 0xC9AE67C9, 0x3B4D763B, +0xBE3789BE, 0x51F3A251, 0x192B3219, 0x1F213E1F, 0x3F417E3F, 0x5CE4B85C, +0xB22391B2, 0xEFC42BEF, 0x4ADE944A, 0xCDA26FCD, 0xBF348BBF, 0xBA3B81BA, +0x6FB1DE6F, 0x64ACC864, 0xD99E47D9, 0xF3E013F3, 0x3E427C3E, 0xB4299DB4, +0xAA0BA1AA, 0xDC914DDC, 0xD58A5FD5, 0x060A0C06, 0xC0B575C0, 0x7E82FC7E, +0xF6EF19F6, 0x66AACC66, 0x6CB4D86C, 0x8479FD84, 0x7193E271, 0x38487038, +0xB93E87B9, 0x1D273A1D, 0x7F81FE7F, 0x9D52CF9D, 0x48D89048, 0x8B68E38B, +0x2A7E542A, 0xDA9B41DA, 0xA51ABFA5, 0x33556633, 0x8273F182, 0x394B7239, +0xD68F59D6, 0x7888F078, 0x867FF986, 0xFAFB01FA, 0xE4D93DE4, 0x2B7D562B, +0xA90EA7A9, 0x1E223C1E, 0x896EE789, 0x60A0C060, 0x6BBDD66B, 0xEACB21EA, +0x55FFAA55, 0x4CD4984C, 0xF7EC1BF7, 0xE2D331E2 }; + +const u32bit Square::TE3[256] = { +0xB1B12697, 0xCECEA769, 0xC3C3B073, 0x95954ADF, 0x5A5AEEB4, 0xADAD02AF, +0xE7E7DC3B, 0x02020604, 0x4D4DD79A, 0x4444CC88, 0xFBFBF803, 0x919146D7, +0x0C0C1418, 0x87877CFB, 0xA1A116B7, 0x5050F0A0, 0xCBCBA863, 0x6767A9CE, +0x5454FCA8, 0xDDDD924F, 0x4646CA8C, 0x8F8F64EB, 0xE1E1D637, 0x4E4ED29C, +0xF0F0E515, 0xFDFDF20F, 0xFCFCF10D, 0xEBEBC823, 0xF9F9FE07, 0xC4C4B97D, +0x1A1A2E34, 0x6E6EB2DC, 0x5E5EE2BC, 0xF5F5EA1F, 0xCCCCA16D, 0x8D8D62EF, +0x1C1C2438, 0x5656FAAC, 0x4343C586, 0xFEFEF709, 0x0707090E, 0x6161A3C2, +0xF8F8FD05, 0x75759FEA, 0x5959EBB2, 0xFFFFF40B, 0x03030506, 0x22226644, +0x8A8A6BE1, 0xD1D18657, 0x13133526, 0xEEEEC729, 0x88886DE5, 0x00000000, +0x0E0E121C, 0x34345C68, 0x15153F2A, 0x808075F5, 0x949449DD, 0xE3E3D033, +0xEDEDC22F, 0xB5B52A9F, 0x5353F5A6, 0x23236546, 0x4B4BDD96, 0x4747C98E, +0x1717392E, 0xA7A71CBB, 0x909045D5, 0x35355F6A, 0xABAB08A3, 0xD8D89D45, +0xB8B83D85, 0xDFDF944B, 0x4F4FD19E, 0x5757F9AE, 0x9A9A5BC1, 0x929243D1, +0xDBDB9843, 0x1B1B2D36, 0x3C3C4478, 0xC8C8AD65, 0x99995EC7, 0x04040C08, +0x8E8E67E9, 0xE0E0D535, 0xD7D78C5B, 0x7D7D87FA, 0x85857AFF, 0xBBBB3883, +0x4040C080, 0x2C2C7458, 0x3A3A4E74, 0x4545CF8A, 0xF1F1E617, 0x4242C684, +0x6565AFCA, 0x20206040, 0x4141C382, 0x18182830, 0x727296E4, 0x25256F4A, +0x939340D3, 0x707090E0, 0x36365A6C, 0x05050F0A, 0xF2F2E311, 0x0B0B1D16, +0xA3A310B3, 0x79798BF2, 0xECECC12D, 0x08081810, 0x2727694E, 0x31315362, +0x32325664, 0xB6B62F99, 0x7C7C84F8, 0xB0B02595, 0x0A0A1E14, 0x737395E6, +0x5B5BEDB6, 0x7B7B8DF6, 0xB7B72C9B, 0x818176F7, 0xD2D28351, 0x0D0D171A, +0x6A6ABED4, 0x26266A4C, 0x9E9E57C9, 0x5858E8B0, 0x9C9C51CD, 0x838370F3, +0x74749CE8, 0xB3B32093, 0xACAC01AD, 0x30305060, 0x7A7A8EF4, 0x6969BBD2, +0x777799EE, 0x0F0F111E, 0xAEAE07A9, 0x21216342, 0xDEDE9749, 0xD0D08555, +0x2E2E725C, 0x97974CDB, 0x10103020, 0xA4A419BD, 0x98985DC5, 0xA8A80DA5, +0xD4D4895D, 0x6868B8D0, 0x2D2D775A, 0x6262A6C4, 0x29297B52, 0x6D6DB7DA, +0x16163A2C, 0x4949DB92, 0x76769AEC, 0xC7C7BC7B, 0xE8E8CD25, 0xC1C1B677, +0x96964FD9, 0x3737596E, 0xE5E5DA3F, 0xCACAAB61, 0xF4F4E91D, 0xE9E9CE27, +0x6363A5C6, 0x12123624, 0xC2C2B371, 0xA6A61FB9, 0x14143C28, 0xBCBC318D, +0xD3D38053, 0x28287850, 0xAFAF04AB, 0x2F2F715E, 0xE6E6DF39, 0x24246C48, +0x5252F6A4, 0xC6C6BF79, 0xA0A015B5, 0x09091B12, 0xBDBD328F, 0x8C8C61ED, +0xCFCFA46B, 0x5D5DE7BA, 0x11113322, 0x5F5FE1BE, 0x01010302, 0xC5C5BA7F, +0x9F9F54CB, 0x3D3D477A, 0xA2A213B1, 0x9B9B58C3, 0xC9C9AE67, 0x3B3B4D76, +0xBEBE3789, 0x5151F3A2, 0x19192B32, 0x1F1F213E, 0x3F3F417E, 0x5C5CE4B8, +0xB2B22391, 0xEFEFC42B, 0x4A4ADE94, 0xCDCDA26F, 0xBFBF348B, 0xBABA3B81, +0x6F6FB1DE, 0x6464ACC8, 0xD9D99E47, 0xF3F3E013, 0x3E3E427C, 0xB4B4299D, +0xAAAA0BA1, 0xDCDC914D, 0xD5D58A5F, 0x06060A0C, 0xC0C0B575, 0x7E7E82FC, +0xF6F6EF19, 0x6666AACC, 0x6C6CB4D8, 0x848479FD, 0x717193E2, 0x38384870, +0xB9B93E87, 0x1D1D273A, 0x7F7F81FE, 0x9D9D52CF, 0x4848D890, 0x8B8B68E3, +0x2A2A7E54, 0xDADA9B41, 0xA5A51ABF, 0x33335566, 0x828273F1, 0x39394B72, +0xD6D68F59, 0x787888F0, 0x86867FF9, 0xFAFAFB01, 0xE4E4D93D, 0x2B2B7D56, +0xA9A90EA7, 0x1E1E223C, 0x89896EE7, 0x6060A0C0, 0x6B6BBDD6, 0xEAEACB21, +0x5555FFAA, 0x4C4CD498, 0xF7F7EC1B, 0xE2E2D331 }; + +const u32bit Square::TD0[256] = { +0xE368BC02, 0x5585620C, 0x2A3F2331, 0x61AB13F7, 0x98D46D72, 0x21CB9A19, +0x3C22A461, 0x459D3DCD, 0x05FDB423, 0x2BC4075F, 0x9B2C01C0, 0x3DD9800F, +0x486C5C74, 0xF97F7E85, 0xF173AB1F, 0xB6EDDE0E, 0x283C6BED, 0x4997781A, +0x9F2A918D, 0xC9579F33, 0xA907A8AA, 0xA50DED7D, 0x7C422D8F, 0x764DB0C9, +0x4D91E857, 0xCEA963CC, 0xB4EE96D2, 0x3028E1B6, 0x0DF161B9, 0xBD196726, +0x419BAD80, 0xC0A06EC7, 0x5183F241, 0x92DBF034, 0x6FA21EFC, 0x8F32CE4C, +0x13E03373, 0x69A7C66D, 0xE56D6493, 0xBF1A2FFA, 0xBB1CBFB7, 0x587403B5, +0xE76E2C4F, 0x5D89B796, 0xE89C052A, 0x446619A3, 0x342E71FB, 0x0FF22965, +0xFE81827A, 0xB11322F1, 0xA30835EC, 0xCD510F7E, 0xFF7AA614, 0x5C7293F8, +0x2FC29712, 0xF370E3C3, 0x992F491C, 0xD1431568, 0xC2A3261B, 0x88CC32B3, +0x8ACF7A6F, 0xB0E8069F, 0x7A47F51E, 0xD2BB79DA, 0xE6950821, 0x4398E55C, +0xD0B83106, 0x11E37BAF, 0x7E416553, 0xCCAA2B10, 0xD8B4E49C, 0x6456A7D4, +0xFB7C3659, 0x724B2084, 0xEA9F4DF6, 0x6A5FAADF, 0x2DC1DFCE, 0x70486858, +0xCAAFF381, 0x0605D891, 0x5A774B69, 0x94DE28A5, 0x39DF1042, 0x813BC347, +0xFC82CAA6, 0x23C8D2C5, 0x03F86CB2, 0x080CD59A, 0xDAB7AC40, 0x7DB909E1, +0x3824342C, 0xCF5247A2, 0xDCB274D1, 0x63A85B2B, 0x35D55595, 0x479E7511, +0x15E5EBE2, 0x4B9430C6, 0x4A6F14A8, 0x91239C86, 0x4C6ACC39, 0x5F8AFF4A, +0x0406904D, 0xEE99DDBB, 0x1E1152CA, 0xAAFFC418, 0xEB646998, 0x07FEFCFF, +0x8B345E01, 0x567D0EBE, 0xBAE79BD9, 0x4263C132, 0x75B5DC7B, 0x97264417, +0x67AECB66, 0x95250CCB, 0xEC9A9567, 0x57862AD0, 0x60503799, 0xB8E4D305, +0x65AD83BA, 0x19EFAE35, 0xA4F6C913, 0xC15B4AA9, 0x873E1BD6, 0xA0F0595E, +0x18148A5B, 0xAF02703B, 0xAB04E076, 0xDD4950BF, 0xDF4A1863, 0xC6A5B656, +0x853D530A, 0xFA871237, 0x77B694A7, 0x4665517F, 0xED61B109, 0x1BECE6E9, +0xD5458525, 0xF5753B52, 0x7FBA413D, 0x27CE4288, 0xB2EB4E43, 0xD6BDE997, +0x527B9EF3, 0x62537F45, 0x2C3AFBA0, 0x7BBCD170, 0xB91FF76B, 0x121B171D, +0xFD79EEC8, 0x3A277CF0, 0x0C0A45D7, 0x96DD6079, 0x2233F6AB, 0xACFA1C89, +0xC8ACBB5D, 0xA10B7D30, 0xD4BEA14B, 0xBEE10B94, 0x25CD0A54, 0x547E4662, +0xA2F31182, 0x17E6A33E, 0x263566E6, 0xC3580275, 0x83388B9B, 0x7844BDC2, +0x020348DC, 0x4F92A08B, 0x2E39B37C, 0x4E6984E5, 0xF0888F71, 0x362D3927, +0x9CD2FD3F, 0x01FB246E, 0x893716DD, 0x00000000, 0xF68D57E0, 0xE293986C, +0x744EF815, 0x9320D45A, 0xAD0138E7, 0xD3405DB4, 0x1A17C287, 0xB3106A2D, +0x5078D62F, 0xF48E1F3C, 0xA70EA5A1, 0x71B34C36, 0x9AD725AE, 0x5E71DB24, +0x161D8750, 0xEF62F9D5, 0x8D318690, 0x1C121A16, 0xA6F581CF, 0x5B8C6F07, +0x37D61D49, 0x6E593A92, 0x84C67764, 0x86C53FB8, 0xD746CDF9, 0xE090D0B0, +0x29C74F83, 0xE49640FD, 0x0E090D0B, 0x6DA15620, 0x8EC9EA22, 0xDB4C882E, +0xF776738E, 0xB515B2BC, 0x10185FC1, 0x322BA96A, 0x6BA48EB1, 0xAEF95455, +0x406089EE, 0x6655EF08, 0xE9672144, 0x3E21ECBD, 0x2030BE77, 0xF28BC7AD, +0x80C0E729, 0x141ECF8C, 0xBCE24348, 0xC4A6FE8A, 0x31D3C5D8, 0xB716FA60, +0x5380BA9D, 0xD94FC0F2, 0x1DE93E78, 0x24362E3A, 0xE16BF4DE, 0xCB54D7EF, +0x09F7F1F4, 0x82C3AFF5, 0x0BF4B928, 0x9D29D951, 0xC75E9238, 0xF8845AEB, +0x90D8B8E8, 0xDEB13C0D, 0x33D08D04, 0x685CE203, 0xC55DDAE4, 0x3BDC589E, +0x0A0F9D46, 0x3FDAC8D3, 0x598F27DB, 0xA8FC8CC4, 0x79BF99AC, 0x6C5A724E, +0x8CCAA2FE, 0x9ED1B5E3, 0x1FEA76A4, 0x73B004EA }; + +const u32bit Square::TD1[256] = { +0x02E368BC, 0x0C558562, 0x312A3F23, 0xF761AB13, 0x7298D46D, 0x1921CB9A, +0x613C22A4, 0xCD459D3D, 0x2305FDB4, 0x5F2BC407, 0xC09B2C01, 0x0F3DD980, +0x74486C5C, 0x85F97F7E, 0x1FF173AB, 0x0EB6EDDE, 0xED283C6B, 0x1A499778, +0x8D9F2A91, 0x33C9579F, 0xAAA907A8, 0x7DA50DED, 0x8F7C422D, 0xC9764DB0, +0x574D91E8, 0xCCCEA963, 0xD2B4EE96, 0xB63028E1, 0xB90DF161, 0x26BD1967, +0x80419BAD, 0xC7C0A06E, 0x415183F2, 0x3492DBF0, 0xFC6FA21E, 0x4C8F32CE, +0x7313E033, 0x6D69A7C6, 0x93E56D64, 0xFABF1A2F, 0xB7BB1CBF, 0xB5587403, +0x4FE76E2C, 0x965D89B7, 0x2AE89C05, 0xA3446619, 0xFB342E71, 0x650FF229, +0x7AFE8182, 0xF1B11322, 0xECA30835, 0x7ECD510F, 0x14FF7AA6, 0xF85C7293, +0x122FC297, 0xC3F370E3, 0x1C992F49, 0x68D14315, 0x1BC2A326, 0xB388CC32, +0x6F8ACF7A, 0x9FB0E806, 0x1E7A47F5, 0xDAD2BB79, 0x21E69508, 0x5C4398E5, +0x06D0B831, 0xAF11E37B, 0x537E4165, 0x10CCAA2B, 0x9CD8B4E4, 0xD46456A7, +0x59FB7C36, 0x84724B20, 0xF6EA9F4D, 0xDF6A5FAA, 0xCE2DC1DF, 0x58704868, +0x81CAAFF3, 0x910605D8, 0x695A774B, 0xA594DE28, 0x4239DF10, 0x47813BC3, +0xA6FC82CA, 0xC523C8D2, 0xB203F86C, 0x9A080CD5, 0x40DAB7AC, 0xE17DB909, +0x2C382434, 0xA2CF5247, 0xD1DCB274, 0x2B63A85B, 0x9535D555, 0x11479E75, +0xE215E5EB, 0xC64B9430, 0xA84A6F14, 0x8691239C, 0x394C6ACC, 0x4A5F8AFF, +0x4D040690, 0xBBEE99DD, 0xCA1E1152, 0x18AAFFC4, 0x98EB6469, 0xFF07FEFC, +0x018B345E, 0xBE567D0E, 0xD9BAE79B, 0x324263C1, 0x7B75B5DC, 0x17972644, +0x6667AECB, 0xCB95250C, 0x67EC9A95, 0xD057862A, 0x99605037, 0x05B8E4D3, +0xBA65AD83, 0x3519EFAE, 0x13A4F6C9, 0xA9C15B4A, 0xD6873E1B, 0x5EA0F059, +0x5B18148A, 0x3BAF0270, 0x76AB04E0, 0xBFDD4950, 0x63DF4A18, 0x56C6A5B6, +0x0A853D53, 0x37FA8712, 0xA777B694, 0x7F466551, 0x09ED61B1, 0xE91BECE6, +0x25D54585, 0x52F5753B, 0x3D7FBA41, 0x8827CE42, 0x43B2EB4E, 0x97D6BDE9, +0xF3527B9E, 0x4562537F, 0xA02C3AFB, 0x707BBCD1, 0x6BB91FF7, 0x1D121B17, +0xC8FD79EE, 0xF03A277C, 0xD70C0A45, 0x7996DD60, 0xAB2233F6, 0x89ACFA1C, +0x5DC8ACBB, 0x30A10B7D, 0x4BD4BEA1, 0x94BEE10B, 0x5425CD0A, 0x62547E46, +0x82A2F311, 0x3E17E6A3, 0xE6263566, 0x75C35802, 0x9B83388B, 0xC27844BD, +0xDC020348, 0x8B4F92A0, 0x7C2E39B3, 0xE54E6984, 0x71F0888F, 0x27362D39, +0x3F9CD2FD, 0x6E01FB24, 0xDD893716, 0x00000000, 0xE0F68D57, 0x6CE29398, +0x15744EF8, 0x5A9320D4, 0xE7AD0138, 0xB4D3405D, 0x871A17C2, 0x2DB3106A, +0x2F5078D6, 0x3CF48E1F, 0xA1A70EA5, 0x3671B34C, 0xAE9AD725, 0x245E71DB, +0x50161D87, 0xD5EF62F9, 0x908D3186, 0x161C121A, 0xCFA6F581, 0x075B8C6F, +0x4937D61D, 0x926E593A, 0x6484C677, 0xB886C53F, 0xF9D746CD, 0xB0E090D0, +0x8329C74F, 0xFDE49640, 0x0B0E090D, 0x206DA156, 0x228EC9EA, 0x2EDB4C88, +0x8EF77673, 0xBCB515B2, 0xC110185F, 0x6A322BA9, 0xB16BA48E, 0x55AEF954, +0xEE406089, 0x086655EF, 0x44E96721, 0xBD3E21EC, 0x772030BE, 0xADF28BC7, +0x2980C0E7, 0x8C141ECF, 0x48BCE243, 0x8AC4A6FE, 0xD831D3C5, 0x60B716FA, +0x9D5380BA, 0xF2D94FC0, 0x781DE93E, 0x3A24362E, 0xDEE16BF4, 0xEFCB54D7, +0xF409F7F1, 0xF582C3AF, 0x280BF4B9, 0x519D29D9, 0x38C75E92, 0xEBF8845A, +0xE890D8B8, 0x0DDEB13C, 0x0433D08D, 0x03685CE2, 0xE4C55DDA, 0x9E3BDC58, +0x460A0F9D, 0xD33FDAC8, 0xDB598F27, 0xC4A8FC8C, 0xAC79BF99, 0x4E6C5A72, +0xFE8CCAA2, 0xE39ED1B5, 0xA41FEA76, 0xEA73B004 }; + +const u32bit Square::TD2[256] = { +0xBC02E368, 0x620C5585, 0x23312A3F, 0x13F761AB, 0x6D7298D4, 0x9A1921CB, +0xA4613C22, 0x3DCD459D, 0xB42305FD, 0x075F2BC4, 0x01C09B2C, 0x800F3DD9, +0x5C74486C, 0x7E85F97F, 0xAB1FF173, 0xDE0EB6ED, 0x6BED283C, 0x781A4997, +0x918D9F2A, 0x9F33C957, 0xA8AAA907, 0xED7DA50D, 0x2D8F7C42, 0xB0C9764D, +0xE8574D91, 0x63CCCEA9, 0x96D2B4EE, 0xE1B63028, 0x61B90DF1, 0x6726BD19, +0xAD80419B, 0x6EC7C0A0, 0xF2415183, 0xF03492DB, 0x1EFC6FA2, 0xCE4C8F32, +0x337313E0, 0xC66D69A7, 0x6493E56D, 0x2FFABF1A, 0xBFB7BB1C, 0x03B55874, +0x2C4FE76E, 0xB7965D89, 0x052AE89C, 0x19A34466, 0x71FB342E, 0x29650FF2, +0x827AFE81, 0x22F1B113, 0x35ECA308, 0x0F7ECD51, 0xA614FF7A, 0x93F85C72, +0x97122FC2, 0xE3C3F370, 0x491C992F, 0x1568D143, 0x261BC2A3, 0x32B388CC, +0x7A6F8ACF, 0x069FB0E8, 0xF51E7A47, 0x79DAD2BB, 0x0821E695, 0xE55C4398, +0x3106D0B8, 0x7BAF11E3, 0x65537E41, 0x2B10CCAA, 0xE49CD8B4, 0xA7D46456, +0x3659FB7C, 0x2084724B, 0x4DF6EA9F, 0xAADF6A5F, 0xDFCE2DC1, 0x68587048, +0xF381CAAF, 0xD8910605, 0x4B695A77, 0x28A594DE, 0x104239DF, 0xC347813B, +0xCAA6FC82, 0xD2C523C8, 0x6CB203F8, 0xD59A080C, 0xAC40DAB7, 0x09E17DB9, +0x342C3824, 0x47A2CF52, 0x74D1DCB2, 0x5B2B63A8, 0x559535D5, 0x7511479E, +0xEBE215E5, 0x30C64B94, 0x14A84A6F, 0x9C869123, 0xCC394C6A, 0xFF4A5F8A, +0x904D0406, 0xDDBBEE99, 0x52CA1E11, 0xC418AAFF, 0x6998EB64, 0xFCFF07FE, +0x5E018B34, 0x0EBE567D, 0x9BD9BAE7, 0xC1324263, 0xDC7B75B5, 0x44179726, +0xCB6667AE, 0x0CCB9525, 0x9567EC9A, 0x2AD05786, 0x37996050, 0xD305B8E4, +0x83BA65AD, 0xAE3519EF, 0xC913A4F6, 0x4AA9C15B, 0x1BD6873E, 0x595EA0F0, +0x8A5B1814, 0x703BAF02, 0xE076AB04, 0x50BFDD49, 0x1863DF4A, 0xB656C6A5, +0x530A853D, 0x1237FA87, 0x94A777B6, 0x517F4665, 0xB109ED61, 0xE6E91BEC, +0x8525D545, 0x3B52F575, 0x413D7FBA, 0x428827CE, 0x4E43B2EB, 0xE997D6BD, +0x9EF3527B, 0x7F456253, 0xFBA02C3A, 0xD1707BBC, 0xF76BB91F, 0x171D121B, +0xEEC8FD79, 0x7CF03A27, 0x45D70C0A, 0x607996DD, 0xF6AB2233, 0x1C89ACFA, +0xBB5DC8AC, 0x7D30A10B, 0xA14BD4BE, 0x0B94BEE1, 0x0A5425CD, 0x4662547E, +0x1182A2F3, 0xA33E17E6, 0x66E62635, 0x0275C358, 0x8B9B8338, 0xBDC27844, +0x48DC0203, 0xA08B4F92, 0xB37C2E39, 0x84E54E69, 0x8F71F088, 0x3927362D, +0xFD3F9CD2, 0x246E01FB, 0x16DD8937, 0x00000000, 0x57E0F68D, 0x986CE293, +0xF815744E, 0xD45A9320, 0x38E7AD01, 0x5DB4D340, 0xC2871A17, 0x6A2DB310, +0xD62F5078, 0x1F3CF48E, 0xA5A1A70E, 0x4C3671B3, 0x25AE9AD7, 0xDB245E71, +0x8750161D, 0xF9D5EF62, 0x86908D31, 0x1A161C12, 0x81CFA6F5, 0x6F075B8C, +0x1D4937D6, 0x3A926E59, 0x776484C6, 0x3FB886C5, 0xCDF9D746, 0xD0B0E090, +0x4F8329C7, 0x40FDE496, 0x0D0B0E09, 0x56206DA1, 0xEA228EC9, 0x882EDB4C, +0x738EF776, 0xB2BCB515, 0x5FC11018, 0xA96A322B, 0x8EB16BA4, 0x5455AEF9, +0x89EE4060, 0xEF086655, 0x2144E967, 0xECBD3E21, 0xBE772030, 0xC7ADF28B, +0xE72980C0, 0xCF8C141E, 0x4348BCE2, 0xFE8AC4A6, 0xC5D831D3, 0xFA60B716, +0xBA9D5380, 0xC0F2D94F, 0x3E781DE9, 0x2E3A2436, 0xF4DEE16B, 0xD7EFCB54, +0xF1F409F7, 0xAFF582C3, 0xB9280BF4, 0xD9519D29, 0x9238C75E, 0x5AEBF884, +0xB8E890D8, 0x3C0DDEB1, 0x8D0433D0, 0xE203685C, 0xDAE4C55D, 0x589E3BDC, +0x9D460A0F, 0xC8D33FDA, 0x27DB598F, 0x8CC4A8FC, 0x99AC79BF, 0x724E6C5A, +0xA2FE8CCA, 0xB5E39ED1, 0x76A41FEA, 0x04EA73B0 }; + +const u32bit Square::TD3[256] = { +0x68BC02E3, 0x85620C55, 0x3F23312A, 0xAB13F761, 0xD46D7298, 0xCB9A1921, +0x22A4613C, 0x9D3DCD45, 0xFDB42305, 0xC4075F2B, 0x2C01C09B, 0xD9800F3D, +0x6C5C7448, 0x7F7E85F9, 0x73AB1FF1, 0xEDDE0EB6, 0x3C6BED28, 0x97781A49, +0x2A918D9F, 0x579F33C9, 0x07A8AAA9, 0x0DED7DA5, 0x422D8F7C, 0x4DB0C976, +0x91E8574D, 0xA963CCCE, 0xEE96D2B4, 0x28E1B630, 0xF161B90D, 0x196726BD, +0x9BAD8041, 0xA06EC7C0, 0x83F24151, 0xDBF03492, 0xA21EFC6F, 0x32CE4C8F, +0xE0337313, 0xA7C66D69, 0x6D6493E5, 0x1A2FFABF, 0x1CBFB7BB, 0x7403B558, +0x6E2C4FE7, 0x89B7965D, 0x9C052AE8, 0x6619A344, 0x2E71FB34, 0xF229650F, +0x81827AFE, 0x1322F1B1, 0x0835ECA3, 0x510F7ECD, 0x7AA614FF, 0x7293F85C, +0xC297122F, 0x70E3C3F3, 0x2F491C99, 0x431568D1, 0xA3261BC2, 0xCC32B388, +0xCF7A6F8A, 0xE8069FB0, 0x47F51E7A, 0xBB79DAD2, 0x950821E6, 0x98E55C43, +0xB83106D0, 0xE37BAF11, 0x4165537E, 0xAA2B10CC, 0xB4E49CD8, 0x56A7D464, +0x7C3659FB, 0x4B208472, 0x9F4DF6EA, 0x5FAADF6A, 0xC1DFCE2D, 0x48685870, +0xAFF381CA, 0x05D89106, 0x774B695A, 0xDE28A594, 0xDF104239, 0x3BC34781, +0x82CAA6FC, 0xC8D2C523, 0xF86CB203, 0x0CD59A08, 0xB7AC40DA, 0xB909E17D, +0x24342C38, 0x5247A2CF, 0xB274D1DC, 0xA85B2B63, 0xD5559535, 0x9E751147, +0xE5EBE215, 0x9430C64B, 0x6F14A84A, 0x239C8691, 0x6ACC394C, 0x8AFF4A5F, +0x06904D04, 0x99DDBBEE, 0x1152CA1E, 0xFFC418AA, 0x646998EB, 0xFEFCFF07, +0x345E018B, 0x7D0EBE56, 0xE79BD9BA, 0x63C13242, 0xB5DC7B75, 0x26441797, +0xAECB6667, 0x250CCB95, 0x9A9567EC, 0x862AD057, 0x50379960, 0xE4D305B8, +0xAD83BA65, 0xEFAE3519, 0xF6C913A4, 0x5B4AA9C1, 0x3E1BD687, 0xF0595EA0, +0x148A5B18, 0x02703BAF, 0x04E076AB, 0x4950BFDD, 0x4A1863DF, 0xA5B656C6, +0x3D530A85, 0x871237FA, 0xB694A777, 0x65517F46, 0x61B109ED, 0xECE6E91B, +0x458525D5, 0x753B52F5, 0xBA413D7F, 0xCE428827, 0xEB4E43B2, 0xBDE997D6, +0x7B9EF352, 0x537F4562, 0x3AFBA02C, 0xBCD1707B, 0x1FF76BB9, 0x1B171D12, +0x79EEC8FD, 0x277CF03A, 0x0A45D70C, 0xDD607996, 0x33F6AB22, 0xFA1C89AC, +0xACBB5DC8, 0x0B7D30A1, 0xBEA14BD4, 0xE10B94BE, 0xCD0A5425, 0x7E466254, +0xF31182A2, 0xE6A33E17, 0x3566E626, 0x580275C3, 0x388B9B83, 0x44BDC278, +0x0348DC02, 0x92A08B4F, 0x39B37C2E, 0x6984E54E, 0x888F71F0, 0x2D392736, +0xD2FD3F9C, 0xFB246E01, 0x3716DD89, 0x00000000, 0x8D57E0F6, 0x93986CE2, +0x4EF81574, 0x20D45A93, 0x0138E7AD, 0x405DB4D3, 0x17C2871A, 0x106A2DB3, +0x78D62F50, 0x8E1F3CF4, 0x0EA5A1A7, 0xB34C3671, 0xD725AE9A, 0x71DB245E, +0x1D875016, 0x62F9D5EF, 0x3186908D, 0x121A161C, 0xF581CFA6, 0x8C6F075B, +0xD61D4937, 0x593A926E, 0xC6776484, 0xC53FB886, 0x46CDF9D7, 0x90D0B0E0, +0xC74F8329, 0x9640FDE4, 0x090D0B0E, 0xA156206D, 0xC9EA228E, 0x4C882EDB, +0x76738EF7, 0x15B2BCB5, 0x185FC110, 0x2BA96A32, 0xA48EB16B, 0xF95455AE, +0x6089EE40, 0x55EF0866, 0x672144E9, 0x21ECBD3E, 0x30BE7720, 0x8BC7ADF2, +0xC0E72980, 0x1ECF8C14, 0xE24348BC, 0xA6FE8AC4, 0xD3C5D831, 0x16FA60B7, +0x80BA9D53, 0x4FC0F2D9, 0xE93E781D, 0x362E3A24, 0x6BF4DEE1, 0x54D7EFCB, +0xF7F1F409, 0xC3AFF582, 0xF4B9280B, 0x29D9519D, 0x5E9238C7, 0x845AEBF8, +0xD8B8E890, 0xB13C0DDE, 0xD08D0433, 0x5CE20368, 0x5DDAE4C5, 0xDC589E3B, +0x0F9D460A, 0xDAC8D33F, 0x8F27DB59, 0xFC8CC4A8, 0xBF99AC79, 0x5A724E6C, +0xCAA2FE8C, 0xD1B5E39E, 0xEA76A41F, 0xB004EA73 }; + +} diff --git a/src/libs/3rdparty/botan/src/block/square/square.cpp b/src/libs/3rdparty/botan/src/block/square/square.cpp new file mode 100644 index 00000000000..cb226542dad --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/square/square.cpp @@ -0,0 +1,187 @@ +/* +* Square +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Square Encryption +*/ +void Square::enc(const byte in[], byte out[]) const + { + u32bit T0, T1, T2, T3, B0, B1, B2, B3; + B0 = TE0[in[ 0] ^ ME[ 0]] ^ TE1[in[ 4] ^ ME[ 4]] ^ + TE2[in[ 8] ^ ME[ 8]] ^ TE3[in[12] ^ ME[12]] ^ EK[0]; + B1 = TE0[in[ 1] ^ ME[ 1]] ^ TE1[in[ 5] ^ ME[ 5]] ^ + TE2[in[ 9] ^ ME[ 9]] ^ TE3[in[13] ^ ME[13]] ^ EK[1]; + B2 = TE0[in[ 2] ^ ME[ 2]] ^ TE1[in[ 6] ^ ME[ 6]] ^ + TE2[in[10] ^ ME[10]] ^ TE3[in[14] ^ ME[14]] ^ EK[2]; + B3 = TE0[in[ 3] ^ ME[ 3]] ^ TE1[in[ 7] ^ ME[ 7]] ^ + TE2[in[11] ^ ME[11]] ^ TE3[in[15] ^ ME[15]] ^ EK[3]; + for(u32bit j = 1; j != 7; j += 2) + { + T0 = TE0[get_byte(0, B0)] ^ TE1[get_byte(0, B1)] ^ + TE2[get_byte(0, B2)] ^ TE3[get_byte(0, B3)] ^ EK[4*j+0]; + T1 = TE0[get_byte(1, B0)] ^ TE1[get_byte(1, B1)] ^ + TE2[get_byte(1, B2)] ^ TE3[get_byte(1, B3)] ^ EK[4*j+1]; + T2 = TE0[get_byte(2, B0)] ^ TE1[get_byte(2, B1)] ^ + TE2[get_byte(2, B2)] ^ TE3[get_byte(2, B3)] ^ EK[4*j+2]; + T3 = TE0[get_byte(3, B0)] ^ TE1[get_byte(3, B1)] ^ + TE2[get_byte(3, B2)] ^ TE3[get_byte(3, B3)] ^ EK[4*j+3]; + B0 = TE0[get_byte(0, T0)] ^ TE1[get_byte(0, T1)] ^ + TE2[get_byte(0, T2)] ^ TE3[get_byte(0, T3)] ^ EK[4*j+4]; + B1 = TE0[get_byte(1, T0)] ^ TE1[get_byte(1, T1)] ^ + TE2[get_byte(1, T2)] ^ TE3[get_byte(1, T3)] ^ EK[4*j+5]; + B2 = TE0[get_byte(2, T0)] ^ TE1[get_byte(2, T1)] ^ + TE2[get_byte(2, T2)] ^ TE3[get_byte(2, T3)] ^ EK[4*j+6]; + B3 = TE0[get_byte(3, T0)] ^ TE1[get_byte(3, T1)] ^ + TE2[get_byte(3, T2)] ^ TE3[get_byte(3, T3)] ^ EK[4*j+7]; + } + out[ 0] = SE[get_byte(0, B0)] ^ ME[16]; + out[ 1] = SE[get_byte(0, B1)] ^ ME[17]; + out[ 2] = SE[get_byte(0, B2)] ^ ME[18]; + out[ 3] = SE[get_byte(0, B3)] ^ ME[19]; + out[ 4] = SE[get_byte(1, B0)] ^ ME[20]; + out[ 5] = SE[get_byte(1, B1)] ^ ME[21]; + out[ 6] = SE[get_byte(1, B2)] ^ ME[22]; + out[ 7] = SE[get_byte(1, B3)] ^ ME[23]; + out[ 8] = SE[get_byte(2, B0)] ^ ME[24]; + out[ 9] = SE[get_byte(2, B1)] ^ ME[25]; + out[10] = SE[get_byte(2, B2)] ^ ME[26]; + out[11] = SE[get_byte(2, B3)] ^ ME[27]; + out[12] = SE[get_byte(3, B0)] ^ ME[28]; + out[13] = SE[get_byte(3, B1)] ^ ME[29]; + out[14] = SE[get_byte(3, B2)] ^ ME[30]; + out[15] = SE[get_byte(3, B3)] ^ ME[31]; + } + +/* +* Square Decryption +*/ +void Square::dec(const byte in[], byte out[]) const + { + u32bit T0, T1, T2, T3, B0, B1, B2, B3; + B0 = TD0[in[ 0] ^ MD[ 0]] ^ TD1[in[ 4] ^ MD[ 4]] ^ + TD2[in[ 8] ^ MD[ 8]] ^ TD3[in[12] ^ MD[12]] ^ DK[0]; + B1 = TD0[in[ 1] ^ MD[ 1]] ^ TD1[in[ 5] ^ MD[ 5]] ^ + TD2[in[ 9] ^ MD[ 9]] ^ TD3[in[13] ^ MD[13]] ^ DK[1]; + B2 = TD0[in[ 2] ^ MD[ 2]] ^ TD1[in[ 6] ^ MD[ 6]] ^ + TD2[in[10] ^ MD[10]] ^ TD3[in[14] ^ MD[14]] ^ DK[2]; + B3 = TD0[in[ 3] ^ MD[ 3]] ^ TD1[in[ 7] ^ MD[ 7]] ^ + TD2[in[11] ^ MD[11]] ^ TD3[in[15] ^ MD[15]] ^ DK[3]; + for(u32bit j = 1; j != 7; j += 2) + { + T0 = TD0[get_byte(0, B0)] ^ TD1[get_byte(0, B1)] ^ + TD2[get_byte(0, B2)] ^ TD3[get_byte(0, B3)] ^ DK[4*j+0]; + T1 = TD0[get_byte(1, B0)] ^ TD1[get_byte(1, B1)] ^ + TD2[get_byte(1, B2)] ^ TD3[get_byte(1, B3)] ^ DK[4*j+1]; + T2 = TD0[get_byte(2, B0)] ^ TD1[get_byte(2, B1)] ^ + TD2[get_byte(2, B2)] ^ TD3[get_byte(2, B3)] ^ DK[4*j+2]; + T3 = TD0[get_byte(3, B0)] ^ TD1[get_byte(3, B1)] ^ + TD2[get_byte(3, B2)] ^ TD3[get_byte(3, B3)] ^ DK[4*j+3]; + B0 = TD0[get_byte(0, T0)] ^ TD1[get_byte(0, T1)] ^ + TD2[get_byte(0, T2)] ^ TD3[get_byte(0, T3)] ^ DK[4*j+4]; + B1 = TD0[get_byte(1, T0)] ^ TD1[get_byte(1, T1)] ^ + TD2[get_byte(1, T2)] ^ TD3[get_byte(1, T3)] ^ DK[4*j+5]; + B2 = TD0[get_byte(2, T0)] ^ TD1[get_byte(2, T1)] ^ + TD2[get_byte(2, T2)] ^ TD3[get_byte(2, T3)] ^ DK[4*j+6]; + B3 = TD0[get_byte(3, T0)] ^ TD1[get_byte(3, T1)] ^ + TD2[get_byte(3, T2)] ^ TD3[get_byte(3, T3)] ^ DK[4*j+7]; + } + out[ 0] = SD[get_byte(0, B0)] ^ MD[16]; + out[ 1] = SD[get_byte(0, B1)] ^ MD[17]; + out[ 2] = SD[get_byte(0, B2)] ^ MD[18]; + out[ 3] = SD[get_byte(0, B3)] ^ MD[19]; + out[ 4] = SD[get_byte(1, B0)] ^ MD[20]; + out[ 5] = SD[get_byte(1, B1)] ^ MD[21]; + out[ 6] = SD[get_byte(1, B2)] ^ MD[22]; + out[ 7] = SD[get_byte(1, B3)] ^ MD[23]; + out[ 8] = SD[get_byte(2, B0)] ^ MD[24]; + out[ 9] = SD[get_byte(2, B1)] ^ MD[25]; + out[10] = SD[get_byte(2, B2)] ^ MD[26]; + out[11] = SD[get_byte(2, B3)] ^ MD[27]; + out[12] = SD[get_byte(3, B0)] ^ MD[28]; + out[13] = SD[get_byte(3, B1)] ^ MD[29]; + out[14] = SD[get_byte(3, B2)] ^ MD[30]; + out[15] = SD[get_byte(3, B3)] ^ MD[31]; + } + +/* +* Square Key Schedule +*/ +void Square::key_schedule(const byte key[], u32bit) + { + SecureBuffer XEK, XDK; + for(u32bit j = 0; j != 4; ++j) + XEK[j] = load_be(key, j); + for(u32bit j = 0; j != 8; ++j) + { + XEK[4*j+4] = XEK[4*j ] ^ rotate_left(XEK[4*j+3], 8) ^ (0x01000000 << j); + XEK[4*j+5] = XEK[4*j+1] ^ XEK[4*j+4]; + XEK[4*j+6] = XEK[4*j+2] ^ XEK[4*j+5]; + XEK[4*j+7] = XEK[4*j+3] ^ XEK[4*j+6]; + XDK.copy(28 - 4*j, XEK + 4*(j+1), 4); + transform(XEK + 4*j); + } + for(u32bit j = 0; j != 4; ++j) + for(u32bit k = 0; k != 4; ++k) + { + ME[4*j+k ] = get_byte(k, XEK[j ]); + ME[4*j+k+16] = get_byte(k, XEK[j+32]); + MD[4*j+k ] = get_byte(k, XDK[j ]); + MD[4*j+k+16] = get_byte(k, XEK[j ]); + } + EK.copy(XEK + 4, 28); + DK.copy(XDK + 4, 28); + } + +/* +* Square's Inverse Linear Transformation +*/ +void Square::transform(u32bit round_key[4]) + { + static const byte G[4][4] = { + { 0x02, 0x01, 0x01, 0x03 }, + { 0x03, 0x02, 0x01, 0x01 }, + { 0x01, 0x03, 0x02, 0x01 }, + { 0x01, 0x01, 0x03, 0x02 } }; + + for(u32bit j = 0; j != 4; ++j) + { + SecureBuffer A, B; + + store_be(round_key[j], A); + + for(u32bit k = 0; k != 4; ++k) + for(u32bit l = 0; l != 4; ++l) + { + const byte a = A[l]; + const byte b = G[l][k]; + + if(a && b) + B[k] ^= ALog[(Log[a] + Log[b]) % 255]; + } + + round_key[j] = load_be(B.begin(), 0); + } + } + +/* +* Clear memory of sensitive data +*/ +void Square::clear() throw() + { + EK.clear(); + DK.clear(); + ME.clear(); + MD.clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/square/square.h b/src/libs/3rdparty/botan/src/block/square/square.h new file mode 100644 index 00000000000..94a1fc3701d --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/square/square.h @@ -0,0 +1,52 @@ +/* +* Square +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SQUARE_H__ +#define BOTAN_SQUARE_H__ + +#include + +namespace Botan { + +/* +* Square +*/ +class BOTAN_DLL Square : public BlockCipher + { + public: + void clear() throw(); + std::string name() const { return "Square"; } + BlockCipher* clone() const { return new Square; } + Square() : BlockCipher(16, 16) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + static void transform(u32bit[4]); + + static const byte SE[256]; + static const byte SD[256]; + static const byte Log[256]; + static const byte ALog[255]; + + static const u32bit TE0[256]; + static const u32bit TE1[256]; + static const u32bit TE2[256]; + static const u32bit TE3[256]; + static const u32bit TD0[256]; + static const u32bit TD1[256]; + static const u32bit TD2[256]; + static const u32bit TD3[256]; + + SecureBuffer EK, DK; + SecureBuffer ME, MD; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/tea/info.txt b/src/libs/3rdparty/botan/src/block/tea/info.txt new file mode 100644 index 00000000000..6a0e76b15bc --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/tea/info.txt @@ -0,0 +1,10 @@ +realname "TEA" + +define TEA + +load_on auto + + +tea.cpp +tea.h + diff --git a/src/libs/3rdparty/botan/src/block/tea/tea.cpp b/src/libs/3rdparty/botan/src/block/tea/tea.cpp new file mode 100644 index 00000000000..2b4212d9c52 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/tea/tea.cpp @@ -0,0 +1,58 @@ +/* +* TEA +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* TEA Encryption +*/ +void TEA::enc(const byte in[], byte out[]) const + { + u32bit L = load_be(in, 0), R = load_be(in, 1); + + u32bit S = 0; + for(u32bit j = 0; j != 32; ++j) + { + S += 0x9E3779B9; + L += ((R << 4) + K[0]) ^ (R + S) ^ ((R >> 5) + K[1]); + R += ((L << 4) + K[2]) ^ (L + S) ^ ((L >> 5) + K[3]); + } + + store_be(out, L, R); + } + +/* +* TEA Decryption +*/ +void TEA::dec(const byte in[], byte out[]) const + { + u32bit L = load_be(in, 0), R = load_be(in, 1); + + u32bit S = 0xC6EF3720; + for(u32bit j = 0; j != 32; ++j) + { + R -= ((L << 4) + K[2]) ^ (L + S) ^ ((L >> 5) + K[3]); + L -= ((R << 4) + K[0]) ^ (R + S) ^ ((R >> 5) + K[1]); + S -= 0x9E3779B9; + } + + store_be(out, L, R); + } + +/* +* TEA Key Schedule +*/ +void TEA::key_schedule(const byte key[], u32bit) + { + for(u32bit j = 0; j != 4; ++j) + K[j] = load_be(key, j); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/tea/tea.h b/src/libs/3rdparty/botan/src/block/tea/tea.h new file mode 100644 index 00000000000..8ddf3e33002 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/tea/tea.h @@ -0,0 +1,34 @@ +/* +* TEA +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_TEA_H__ +#define BOTAN_TEA_H__ + +#include + +namespace Botan { + +/* +* TEA +*/ +class BOTAN_DLL TEA : public BlockCipher + { + public: + void clear() throw() { K.clear(); } + std::string name() const { return "TEA"; } + BlockCipher* clone() const { return new TEA; } + TEA() : BlockCipher(8, 16) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + SecureBuffer K; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/twofish/info.txt b/src/libs/3rdparty/botan/src/block/twofish/info.txt new file mode 100644 index 00000000000..35639d858dc --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/twofish/info.txt @@ -0,0 +1,11 @@ +realname "Twofish" + +define TWOFISH + +load_on auto + + +two_tab.cpp +twofish.cpp +twofish.h + diff --git a/src/libs/3rdparty/botan/src/block/twofish/two_tab.cpp b/src/libs/3rdparty/botan/src/block/twofish/two_tab.cpp new file mode 100644 index 00000000000..19ba58de69d --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/twofish/two_tab.cpp @@ -0,0 +1,293 @@ +/* +* S-Box and MDS Tables for Twofish +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +const byte Twofish::Q0[256] = { + 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, 0x9A, 0x92, 0x80, 0x78, + 0xE4, 0xDD, 0xD1, 0x38, 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, + 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, 0xF2, 0xD0, 0x8B, 0x30, + 0x84, 0x54, 0xDF, 0x23, 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, + 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, 0xA6, 0xEB, 0xA5, 0xBE, + 0x16, 0x0C, 0xE3, 0x61, 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, + 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, 0xE1, 0xE6, 0xBD, 0x45, + 0xE2, 0xF4, 0xB6, 0x66, 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, + 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, 0xEA, 0x77, 0x39, 0xAF, + 0x33, 0xC9, 0x62, 0x71, 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, + 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, 0xA1, 0x1D, 0xAA, 0xED, + 0x06, 0x70, 0xB2, 0xD2, 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, + 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, 0x9E, 0x9C, 0x52, 0x1B, + 0x5F, 0x93, 0x0A, 0xEF, 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, + 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, 0x2A, 0xCE, 0xCB, 0x2F, + 0xFC, 0x97, 0x05, 0x7A, 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, + 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, 0xB8, 0xDA, 0xB0, 0x17, + 0x55, 0x1F, 0x8A, 0x7D, 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, + 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, 0x6E, 0x50, 0xDE, 0x68, + 0x65, 0xBC, 0xDB, 0xF8, 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, + 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, 0x6F, 0x9D, 0x36, 0x42, + 0x4A, 0x5E, 0xC1, 0xE0 }; + +const byte Twofish::Q1[256] = { + 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, 0x4A, 0xD3, 0xE6, 0x6B, + 0x45, 0x7D, 0xE8, 0x4B, 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, + 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, 0x5E, 0xBA, 0xAE, 0x5B, + 0x8A, 0x00, 0xBC, 0x9D, 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, + 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, 0xB2, 0x73, 0x4C, 0x54, + 0x92, 0x74, 0x36, 0x51, 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, + 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, 0x13, 0x95, 0x9C, 0xC7, + 0x24, 0x46, 0x3B, 0x70, 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, + 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, 0x03, 0x6F, 0x08, 0xBF, + 0x40, 0xE7, 0x2B, 0xE2, 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, + 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, 0x66, 0x94, 0xA1, 0x1D, + 0x3D, 0xF0, 0xDE, 0xB3, 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, + 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, 0x81, 0x88, 0xEE, 0x21, + 0xC4, 0x1A, 0xEB, 0xD9, 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, + 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, 0x4F, 0xF2, 0x65, 0x8E, + 0x78, 0x5C, 0x58, 0x19, 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, + 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, 0xCE, 0xE9, 0x68, 0x44, + 0xE0, 0x4D, 0x43, 0x69, 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, + 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, 0x22, 0xC9, 0xC0, 0x9B, + 0x89, 0xD4, 0xED, 0xAB, 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, + 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, 0x16, 0x25, 0x86, 0x56, + 0x55, 0x09, 0xBE, 0x91 }; + +const byte Twofish::RS[32] = { + 0x01, 0xA4, 0x02, 0xA4, 0xA4, 0x56, 0xA1, 0x55, 0x55, 0x82, 0xFC, 0x87, + 0x87, 0xF3, 0xC1, 0x5A, 0x5A, 0x1E, 0x47, 0x58, 0x58, 0xC6, 0xAE, 0xDB, + 0xDB, 0x68, 0x3D, 0x9E, 0x9E, 0xE5, 0x19, 0x03 }; + +const byte Twofish::EXP_TO_POLY[255] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x4D, 0x9A, 0x79, 0xF2, + 0xA9, 0x1F, 0x3E, 0x7C, 0xF8, 0xBD, 0x37, 0x6E, 0xDC, 0xF5, 0xA7, 0x03, + 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xCD, 0xD7, 0xE3, 0x8B, 0x5B, 0xB6, + 0x21, 0x42, 0x84, 0x45, 0x8A, 0x59, 0xB2, 0x29, 0x52, 0xA4, 0x05, 0x0A, + 0x14, 0x28, 0x50, 0xA0, 0x0D, 0x1A, 0x34, 0x68, 0xD0, 0xED, 0x97, 0x63, + 0xC6, 0xC1, 0xCF, 0xD3, 0xEB, 0x9B, 0x7B, 0xF6, 0xA1, 0x0F, 0x1E, 0x3C, + 0x78, 0xF0, 0xAD, 0x17, 0x2E, 0x5C, 0xB8, 0x3D, 0x7A, 0xF4, 0xA5, 0x07, + 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x8D, 0x57, 0xAE, 0x11, 0x22, 0x44, 0x88, + 0x5D, 0xBA, 0x39, 0x72, 0xE4, 0x85, 0x47, 0x8E, 0x51, 0xA2, 0x09, 0x12, + 0x24, 0x48, 0x90, 0x6D, 0xDA, 0xF9, 0xBF, 0x33, 0x66, 0xCC, 0xD5, 0xE7, + 0x83, 0x4B, 0x96, 0x61, 0xC2, 0xC9, 0xDF, 0xF3, 0xAB, 0x1B, 0x36, 0x6C, + 0xD8, 0xFD, 0xB7, 0x23, 0x46, 0x8C, 0x55, 0xAA, 0x19, 0x32, 0x64, 0xC8, + 0xDD, 0xF7, 0xA3, 0x0B, 0x16, 0x2C, 0x58, 0xB0, 0x2D, 0x5A, 0xB4, 0x25, + 0x4A, 0x94, 0x65, 0xCA, 0xD9, 0xFF, 0xB3, 0x2B, 0x56, 0xAC, 0x15, 0x2A, + 0x54, 0xA8, 0x1D, 0x3A, 0x74, 0xE8, 0x9D, 0x77, 0xEE, 0x91, 0x6F, 0xDE, + 0xF1, 0xAF, 0x13, 0x26, 0x4C, 0x98, 0x7D, 0xFA, 0xB9, 0x3F, 0x7E, 0xFC, + 0xB5, 0x27, 0x4E, 0x9C, 0x75, 0xEA, 0x99, 0x7F, 0xFE, 0xB1, 0x2F, 0x5E, + 0xBC, 0x35, 0x6A, 0xD4, 0xE5, 0x87, 0x43, 0x86, 0x41, 0x82, 0x49, 0x92, + 0x69, 0xD2, 0xE9, 0x9F, 0x73, 0xE6, 0x81, 0x4F, 0x9E, 0x71, 0xE2, 0x89, + 0x5F, 0xBE, 0x31, 0x62, 0xC4, 0xC5, 0xC7, 0xC3, 0xCB, 0xDB, 0xFB, 0xBB, + 0x3B, 0x76, 0xEC, 0x95, 0x67, 0xCE, 0xD1, 0xEF, 0x93, 0x6B, 0xD6, 0xE1, + 0x8F, 0x53, 0xA6 }; + +const byte Twofish::POLY_TO_EXP[255] = { + 0x00, 0x01, 0x17, 0x02, 0x2E, 0x18, 0x53, 0x03, 0x6A, 0x2F, 0x93, 0x19, + 0x34, 0x54, 0x45, 0x04, 0x5C, 0x6B, 0xB6, 0x30, 0xA6, 0x94, 0x4B, 0x1A, + 0x8C, 0x35, 0x81, 0x55, 0xAA, 0x46, 0x0D, 0x05, 0x24, 0x5D, 0x87, 0x6C, + 0x9B, 0xB7, 0xC1, 0x31, 0x2B, 0xA7, 0xA3, 0x95, 0x98, 0x4C, 0xCA, 0x1B, + 0xE6, 0x8D, 0x73, 0x36, 0xCD, 0x82, 0x12, 0x56, 0x62, 0xAB, 0xF0, 0x47, + 0x4F, 0x0E, 0xBD, 0x06, 0xD4, 0x25, 0xD2, 0x5E, 0x27, 0x88, 0x66, 0x6D, + 0xD6, 0x9C, 0x79, 0xB8, 0x08, 0xC2, 0xDF, 0x32, 0x68, 0x2C, 0xFD, 0xA8, + 0x8A, 0xA4, 0x5A, 0x96, 0x29, 0x99, 0x22, 0x4D, 0x60, 0xCB, 0xE4, 0x1C, + 0x7B, 0xE7, 0x3B, 0x8E, 0x9E, 0x74, 0xF4, 0x37, 0xD8, 0xCE, 0xF9, 0x83, + 0x6F, 0x13, 0xB2, 0x57, 0xE1, 0x63, 0xDC, 0xAC, 0xC4, 0xF1, 0xAF, 0x48, + 0x0A, 0x50, 0x42, 0x0F, 0xBA, 0xBE, 0xC7, 0x07, 0xDE, 0xD5, 0x78, 0x26, + 0x65, 0xD3, 0xD1, 0x5F, 0xE3, 0x28, 0x21, 0x89, 0x59, 0x67, 0xFC, 0x6E, + 0xB1, 0xD7, 0xF8, 0x9D, 0xF3, 0x7A, 0x3A, 0xB9, 0xC6, 0x09, 0x41, 0xC3, + 0xAE, 0xE0, 0xDB, 0x33, 0x44, 0x69, 0x92, 0x2D, 0x52, 0xFE, 0x16, 0xA9, + 0x0C, 0x8B, 0x80, 0xA5, 0x4A, 0x5B, 0xB5, 0x97, 0xC9, 0x2A, 0xA2, 0x9A, + 0xC0, 0x23, 0x86, 0x4E, 0xBC, 0x61, 0xEF, 0xCC, 0x11, 0xE5, 0x72, 0x1D, + 0x3D, 0x7C, 0xEB, 0xE8, 0xE9, 0x3C, 0xEA, 0x8F, 0x7D, 0x9F, 0xEC, 0x75, + 0x1E, 0xF5, 0x3E, 0x38, 0xF6, 0xD9, 0x3F, 0xCF, 0x76, 0xFA, 0x1F, 0x84, + 0xA0, 0x70, 0xED, 0x14, 0x90, 0xB3, 0x7E, 0x58, 0xFB, 0xE2, 0x20, 0x64, + 0xD0, 0xDD, 0x77, 0xAD, 0xDA, 0xC5, 0x40, 0xF2, 0x39, 0xB0, 0xF7, 0x49, + 0xB4, 0x0B, 0x7F, 0x51, 0x15, 0x43, 0x91, 0x10, 0x71, 0xBB, 0xEE, 0xBF, + 0x85, 0xC8, 0xA1 }; + +const u32bit Twofish::MDS0[256] = { + 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, + 0xE2E22BFB, 0x9E9EFAC8, 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, + 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, 0x3C3C57D6, 0x93938A32, + 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, + 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, + 0xB0B0B306, 0x7575DE3F, 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, + 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, 0xAEAE2C6D, 0x7F7FABC1, + 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, + 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, + 0x3131272C, 0x808065A3, 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, + 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, 0x2A2A3638, 0xC4C49CB0, + 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, + 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, + 0x6767C027, 0xE9E9AF8C, 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, + 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, 0x29294CCA, 0xF0F035E3, + 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, + 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, + 0xC8C81DC3, 0x9999FFCC, 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, + 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, 0xB5B53D79, 0x09090F0C, + 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, + 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, + 0xEDEDD07A, 0x4343FC17, 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, + 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, 0x5656E70B, 0xE3E3DA72, + 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, + 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, + 0x8181942A, 0x91910149, 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, + 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, 0x7878AEC5, 0xC5C56D39, + 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, + 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, + 0x55559DF9, 0x7E7E5A48, 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, + 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, 0x0606F48D, 0x404086E5, + 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, + 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, + 0x2D2D333C, 0x3030D6A5, 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, + 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, 0xD9D97929, 0x8686912E, + 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, + 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, + 0xC1C112CF, 0x8585EBDC, 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, + 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, 0xABABA212, 0x6F6F3EA2, + 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, + 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, + 0x04047FF6, 0x272746C2, 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, + 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91 }; + +const u32bit Twofish::MDS1[256] = { + 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, + 0xA3658080, 0x76DFE4E4, 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, + 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, 0x0D54E6E6, 0xC6432020, + 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, + 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, + 0x94B1FBFB, 0x485A7E7E, 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, + 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, 0x1945FDFD, 0x5BA33A3A, + 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, + 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, + 0x9B53AAAA, 0x7C635D5D, 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, + 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, 0xC0F09090, 0x8CAFE9E9, + 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, + 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, + 0xB499C3C3, 0xF1975B5B, 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, + 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, 0xCCFF9999, 0x95EA1414, + 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, + 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, + 0xBF7E9595, 0xBA207D7D, 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, + 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, 0x81FB0F0F, 0x793DB5B5, + 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, + 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, + 0x86135050, 0xE730F7F7, 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, + 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, 0x410B9F9F, 0x7B8B0202, + 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, + 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, + 0xB1C72B2B, 0xAB6F8E8E, 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, + 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, 0x91EF1313, 0x85FE0808, + 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, + 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, + 0x6929A9A9, 0x647D4F4F, 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, + 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, 0xAC87D1D1, 0x7F8E0505, + 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, + 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, + 0x4C5F7979, 0x02B6B7B7, 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, + 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, 0x57AC3333, 0xC718CFCF, + 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, + 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, + 0x99E51D1D, 0x34392323, 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, + 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, 0xC8FA9E9E, 0xA882D6D6, + 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, + 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, + 0x0FE25151, 0x00000000, 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, + 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8 }; + +const u32bit Twofish::MDS2[256] = { + 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, + 0xE2FBE22B, 0x9EC89EFA, 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, + 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, 0x3CD63C57, 0x9332938A, + 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, + 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, + 0xB006B0B3, 0x753F75DE, 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, + 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, 0xAE6DAE2C, 0x7FC17FAB, + 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, + 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, + 0x312C3127, 0x80A38065, 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, + 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, 0x2A382A36, 0xC4B0C49C, + 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, + 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, + 0x672767C0, 0xE98CE9AF, 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, + 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, 0x29CA294C, 0xF0E3F035, + 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, + 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, + 0xC8C3C81D, 0x99CC99FF, 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, + 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, 0xB579B53D, 0x090C090F, + 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, + 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, + 0xED7AEDD0, 0x431743FC, 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, + 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, 0x560B56E7, 0xE372E3DA, + 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, + 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, + 0x812A8194, 0x91499101, 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, + 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, 0x78C578AE, 0xC539C56D, + 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, + 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, + 0x55F9559D, 0x7E487E5A, 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, + 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, 0x068D06F4, 0x40E54086, + 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, + 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, + 0x2D3C2D33, 0x30A530D6, 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, + 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, 0xD929D979, 0x862E8691, + 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, + 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, + 0xC1CFC112, 0x85DC85EB, 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, + 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, 0xAB12ABA2, 0x6FA26F3E, + 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, + 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, + 0x04F6047F, 0x27C22746, 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, + 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF }; + +const u32bit Twofish::MDS3[256] = { + 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, + 0x6580A365, 0xDFE476DF, 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, + 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, 0x54E60D54, 0x4320C643, + 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, + 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, + 0xB1FB94B1, 0x5A7E485A, 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, + 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, 0x45FD1945, 0xA33A5BA3, + 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, + 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, + 0x53AA9B53, 0x635D7C63, 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, + 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, 0xF090C0F0, 0xAFE98CAF, + 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, + 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, + 0x99C3B499, 0x975BF197, 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, + 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, 0xFF99CCFF, 0xEA1495EA, + 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, + 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, + 0x7E95BF7E, 0x207DBA20, 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, + 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, 0xFB0F81FB, 0x3DB5793D, + 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, + 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, + 0x13508613, 0x30F7E730, 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, + 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, 0x0B9F410B, 0x8B027B8B, + 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, + 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, + 0xC72BB1C7, 0x6F8EAB6F, 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, + 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, 0xEF1391EF, 0xFE0885FE, + 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, + 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, + 0x29A96929, 0x7D4F647D, 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, + 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, 0x87D1AC87, 0x8E057F8E, + 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, + 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, + 0x5F794C5F, 0xB6B702B6, 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, + 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, 0xAC3357AC, 0x18CFC718, + 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, + 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, + 0xE51D99E5, 0x39233439, 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, + 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, 0xFA9EC8FA, 0x82D6A882, + 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, + 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, + 0xE2510FE2, 0x00000000, 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, + 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8 }; + +} diff --git a/src/libs/3rdparty/botan/src/block/twofish/twofish.cpp b/src/libs/3rdparty/botan/src/block/twofish/twofish.cpp new file mode 100644 index 00000000000..9784b00a273 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/twofish/twofish.cpp @@ -0,0 +1,218 @@ +/* +* Twofish +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Twofish Encryption +*/ +void Twofish::enc(const byte in[], byte out[]) const + { + u32bit A = load_le(in, 0) ^ round_key[0]; + u32bit B = load_le(in, 1) ^ round_key[1]; + u32bit C = load_le(in, 2) ^ round_key[2]; + u32bit D = load_le(in, 3) ^ round_key[3]; + + for(u32bit j = 0; j != 16; j += 2) + { + u32bit X, Y; + + X = SBox0[get_byte(3, A)] ^ SBox1[get_byte(2, A)] ^ + SBox2[get_byte(1, A)] ^ SBox3[get_byte(0, A)]; + Y = SBox0[get_byte(0, B)] ^ SBox1[get_byte(3, B)] ^ + SBox2[get_byte(2, B)] ^ SBox3[get_byte(1, B)]; + X += Y; + Y += X + round_key[2*j + 9]; + X += round_key[2*j + 8]; + + C = rotate_right(C ^ X, 1); + D = rotate_left(D, 1) ^ Y; + + X = SBox0[get_byte(3, C)] ^ SBox1[get_byte(2, C)] ^ + SBox2[get_byte(1, C)] ^ SBox3[get_byte(0, C)]; + Y = SBox0[get_byte(0, D)] ^ SBox1[get_byte(3, D)] ^ + SBox2[get_byte(2, D)] ^ SBox3[get_byte(1, D)]; + X += Y; + Y += X + round_key[2*j + 11]; + X += round_key[2*j + 10]; + + A = rotate_right(A ^ X, 1); + B = rotate_left(B, 1) ^ Y; + } + + C ^= round_key[4]; + D ^= round_key[5]; + A ^= round_key[6]; + B ^= round_key[7]; + + store_le(out, C, D, A, B); + } + +/* +* Twofish Decryption +*/ +void Twofish::dec(const byte in[], byte out[]) const + { + u32bit A = load_le(in, 0) ^ round_key[4]; + u32bit B = load_le(in, 1) ^ round_key[5]; + u32bit C = load_le(in, 2) ^ round_key[6]; + u32bit D = load_le(in, 3) ^ round_key[7]; + + for(u32bit j = 0; j != 16; j += 2) + { + u32bit X, Y; + + X = SBox0[get_byte(3, A)] ^ SBox1[get_byte(2, A)] ^ + SBox2[get_byte(1, A)] ^ SBox3[get_byte(0, A)]; + Y = SBox0[get_byte(0, B)] ^ SBox1[get_byte(3, B)] ^ + SBox2[get_byte(2, B)] ^ SBox3[get_byte(1, B)]; + X += Y; + Y += X + round_key[39 - 2*j]; + X += round_key[38 - 2*j]; + + C = rotate_left(C, 1) ^ X; + D = rotate_right(D ^ Y, 1); + + X = SBox0[get_byte(3, C)] ^ SBox1[get_byte(2, C)] ^ + SBox2[get_byte(1, C)] ^ SBox3[get_byte(0, C)]; + Y = SBox0[get_byte(0, D)] ^ SBox1[get_byte(3, D)] ^ + SBox2[get_byte(2, D)] ^ SBox3[get_byte(1, D)]; + X += Y; + Y += X + round_key[37 - 2*j]; + X += round_key[36 - 2*j]; + + A = rotate_left(A, 1) ^ X; + B = rotate_right(B ^ Y, 1); + } + + C ^= round_key[0]; + D ^= round_key[1]; + A ^= round_key[2]; + B ^= round_key[3]; + + store_le(out, C, D, A, B); + } + +/* +* Twofish Key Schedule +*/ +void Twofish::key_schedule(const byte key[], u32bit length) + { + SecureBuffer S; + + for(u32bit j = 0; j != length; ++j) + rs_mul(S + 4*(j/8), key[j], j); + + if(length == 16) + { + for(u32bit j = 0; j != 256; ++j) + { + SBox0[j] = MDS0[Q0[Q0[j]^S[ 0]]^S[ 4]]; + SBox1[j] = MDS1[Q0[Q1[j]^S[ 1]]^S[ 5]]; + SBox2[j] = MDS2[Q1[Q0[j]^S[ 2]]^S[ 6]]; + SBox3[j] = MDS3[Q1[Q1[j]^S[ 3]]^S[ 7]]; + } + for(u32bit j = 0; j != 40; j += 2) + { + u32bit X = MDS0[Q0[Q0[j ]^key[ 8]]^key[ 0]] ^ + MDS1[Q0[Q1[j ]^key[ 9]]^key[ 1]] ^ + MDS2[Q1[Q0[j ]^key[10]]^key[ 2]] ^ + MDS3[Q1[Q1[j ]^key[11]]^key[ 3]]; + u32bit Y = MDS0[Q0[Q0[j+1]^key[12]]^key[ 4]] ^ + MDS1[Q0[Q1[j+1]^key[13]]^key[ 5]] ^ + MDS2[Q1[Q0[j+1]^key[14]]^key[ 6]] ^ + MDS3[Q1[Q1[j+1]^key[15]]^key[ 7]]; + Y = rotate_left(Y, 8); X += Y; Y += X; + round_key[j] = X; round_key[j+1] = rotate_left(Y, 9); + } + } + else if(length == 24) + { + for(u32bit j = 0; j != 256; ++j) + { + SBox0[j] = MDS0[Q0[Q0[Q1[j]^S[ 0]]^S[ 4]]^S[ 8]]; + SBox1[j] = MDS1[Q0[Q1[Q1[j]^S[ 1]]^S[ 5]]^S[ 9]]; + SBox2[j] = MDS2[Q1[Q0[Q0[j]^S[ 2]]^S[ 6]]^S[10]]; + SBox3[j] = MDS3[Q1[Q1[Q0[j]^S[ 3]]^S[ 7]]^S[11]]; + } + for(u32bit j = 0; j != 40; j += 2) + { + u32bit X = MDS0[Q0[Q0[Q1[j ]^key[16]]^key[ 8]]^key[ 0]] ^ + MDS1[Q0[Q1[Q1[j ]^key[17]]^key[ 9]]^key[ 1]] ^ + MDS2[Q1[Q0[Q0[j ]^key[18]]^key[10]]^key[ 2]] ^ + MDS3[Q1[Q1[Q0[j ]^key[19]]^key[11]]^key[ 3]]; + u32bit Y = MDS0[Q0[Q0[Q1[j+1]^key[20]]^key[12]]^key[ 4]] ^ + MDS1[Q0[Q1[Q1[j+1]^key[21]]^key[13]]^key[ 5]] ^ + MDS2[Q1[Q0[Q0[j+1]^key[22]]^key[14]]^key[ 6]] ^ + MDS3[Q1[Q1[Q0[j+1]^key[23]]^key[15]]^key[ 7]]; + Y = rotate_left(Y, 8); X += Y; Y += X; + round_key[j] = X; round_key[j+1] = rotate_left(Y, 9); + } + } + else if(length == 32) + { + for(u32bit j = 0; j != 256; ++j) + { + SBox0[j] = MDS0[Q0[Q0[Q1[Q1[j]^S[ 0]]^S[ 4]]^S[ 8]]^S[12]]; + SBox1[j] = MDS1[Q0[Q1[Q1[Q0[j]^S[ 1]]^S[ 5]]^S[ 9]]^S[13]]; + SBox2[j] = MDS2[Q1[Q0[Q0[Q0[j]^S[ 2]]^S[ 6]]^S[10]]^S[14]]; + SBox3[j] = MDS3[Q1[Q1[Q0[Q1[j]^S[ 3]]^S[ 7]]^S[11]]^S[15]]; + } + for(u32bit j = 0; j != 40; j += 2) + { + u32bit X = MDS0[Q0[Q0[Q1[Q1[j ]^key[24]]^key[16]]^key[ 8]]^key[ 0]] ^ + MDS1[Q0[Q1[Q1[Q0[j ]^key[25]]^key[17]]^key[ 9]]^key[ 1]] ^ + MDS2[Q1[Q0[Q0[Q0[j ]^key[26]]^key[18]]^key[10]]^key[ 2]] ^ + MDS3[Q1[Q1[Q0[Q1[j ]^key[27]]^key[19]]^key[11]]^key[ 3]]; + u32bit Y = MDS0[Q0[Q0[Q1[Q1[j+1]^key[28]]^key[20]]^key[12]]^key[ 4]] ^ + MDS1[Q0[Q1[Q1[Q0[j+1]^key[29]]^key[21]]^key[13]]^key[ 5]] ^ + MDS2[Q1[Q0[Q0[Q0[j+1]^key[30]]^key[22]]^key[14]]^key[ 6]] ^ + MDS3[Q1[Q1[Q0[Q1[j+1]^key[31]]^key[23]]^key[15]]^key[ 7]]; + Y = rotate_left(Y, 8); X += Y; Y += X; + round_key[j] = X; round_key[j+1] = rotate_left(Y, 9); + } + } + } + +/* +* Do one column of the RS matrix multiplcation +*/ +void Twofish::rs_mul(byte S[4], byte key, u32bit offset) + { + if(key) + { + byte X = POLY_TO_EXP[key - 1]; + + byte RS1 = RS[(4*offset ) % 32]; + byte RS2 = RS[(4*offset+1) % 32]; + byte RS3 = RS[(4*offset+2) % 32]; + byte RS4 = RS[(4*offset+3) % 32]; + + S[0] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS1 - 1]) % 255]; + S[1] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS2 - 1]) % 255]; + S[2] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS3 - 1]) % 255]; + S[3] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS4 - 1]) % 255]; + } + } + +/* +* Clear memory of sensitive data +*/ +void Twofish::clear() throw() + { + SBox0.clear(); + SBox1.clear(); + SBox2.clear(); + SBox3.clear(); + round_key.clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/block/twofish/twofish.h b/src/libs/3rdparty/botan/src/block/twofish/twofish.h new file mode 100644 index 00000000000..0640e32f8ef --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/twofish/twofish.h @@ -0,0 +1,48 @@ +/* +* Twofish +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_TWOFISH_H__ +#define BOTAN_TWOFISH_H__ + +#include + +namespace Botan { + +/* +* Twofish +*/ +class BOTAN_DLL Twofish : public BlockCipher + { + public: + void clear() throw(); + std::string name() const { return "Twofish"; } + BlockCipher* clone() const { return new Twofish; } + Twofish() : BlockCipher(16, 16, 32, 8) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + + static void rs_mul(byte[4], byte, u32bit); + + static const u32bit MDS0[256]; + static const u32bit MDS1[256]; + static const u32bit MDS2[256]; + static const u32bit MDS3[256]; + static const byte Q0[256]; + static const byte Q1[256]; + static const byte RS[32]; + static const byte EXP_TO_POLY[255]; + static const byte POLY_TO_EXP[255]; + + SecureBuffer SBox0, SBox1, SBox2, SBox3; + SecureBuffer round_key; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/block/xtea/info.txt b/src/libs/3rdparty/botan/src/block/xtea/info.txt new file mode 100644 index 00000000000..0120a3bced9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/xtea/info.txt @@ -0,0 +1,10 @@ +realname "XTEA" + +define XTEA + +load_on auto + + +xtea.cpp +xtea.h + diff --git a/src/libs/3rdparty/botan/src/block/xtea/xtea.cpp b/src/libs/3rdparty/botan/src/block/xtea/xtea.cpp new file mode 100644 index 00000000000..5047f659454 --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/xtea/xtea.cpp @@ -0,0 +1,64 @@ +/* +* XTEA +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* XTEA Encryption +*/ +void XTEA::enc(const byte in[], byte out[]) const + { + u32bit L = load_be(in, 0), R = load_be(in, 1); + + for(u32bit j = 0; j != 32; ++j) + { + L += (((R << 4) ^ (R >> 5)) + R) ^ EK[2*j]; + R += (((L << 4) ^ (L >> 5)) + L) ^ EK[2*j+1]; + } + + store_be(out, L, R); + } + +/* +* XTEA Decryption +*/ +void XTEA::dec(const byte in[], byte out[]) const + { + u32bit L = load_be(in, 0), R = load_be(in, 1); + + for(u32bit j = 0; j != 32; ++j) + { + R -= (((L << 4) ^ (L >> 5)) + L) ^ EK[63 - 2*j]; + L -= (((R << 4) ^ (R >> 5)) + R) ^ EK[62 - 2*j]; + } + + store_be(out, L, R); + } + +/* +* XTEA Key Schedule +*/ +void XTEA::key_schedule(const byte key[], u32bit) + { + SecureBuffer UK; + for(u32bit i = 0; i != 4; ++i) + UK[i] = load_be(key, i); + + u32bit D = 0; + for(u32bit i = 0; i != 64; i += 2) + { + EK[i ] = D + UK[D % 4]; + D += 0x9E3779B9; + EK[i+1] = D + UK[(D >> 11) % 4]; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/block/xtea/xtea.h b/src/libs/3rdparty/botan/src/block/xtea/xtea.h new file mode 100644 index 00000000000..d9c6066cb3f --- /dev/null +++ b/src/libs/3rdparty/botan/src/block/xtea/xtea.h @@ -0,0 +1,34 @@ +/* +* XTEA +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_XTEA_H__ +#define BOTAN_XTEA_H__ + +#include + +namespace Botan { + +/* +* XTEA +*/ +class BOTAN_DLL XTEA : public BlockCipher + { + public: + void clear() throw() { EK.clear(); } + std::string name() const { return "XTEA"; } + BlockCipher* clone() const { return new XTEA; } + XTEA() : BlockCipher(8, 16) {} + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + SecureBuffer EK; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/build-data/arch/alpha.txt b/src/libs/3rdparty/botan/src/build-data/arch/alpha.txt new file mode 100644 index 00000000000..60b2643967d --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/alpha.txt @@ -0,0 +1,31 @@ +realname "DEC Alpha" + +default_submodel alpha-ev4 +endian little + + +axp +alphaaxp + + + +alpha-ev4 +alpha-ev5 +alpha-ev56 +alpha-pca56 +alpha-ev6 +alpha-ev67 +alpha-ev68 +alpha-ev7 + + + +alphaev4 -> alpha-ev4 +alphaev5 -> alpha-ev5 +alphaev56 -> alpha-ev56 +alphapca56 -> alpha-pca56 +alphaev6 -> alpha-ev6 +alphaev67 -> alpha-ev67 +alphaev68 -> alpha-ev68 +alphaev7 -> alpha-ev7 + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/amd64.txt b/src/libs/3rdparty/botan/src/build-data/arch/amd64.txt new file mode 100644 index 00000000000..216588e7be3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/amd64.txt @@ -0,0 +1,27 @@ +realname "x86-64" + +default_submodel opteron + +endian little +unaligned ok + + +x86-64 +x86_64 # for RPM + + + +opteron +em64t +core2 + + + +core2duo -> core2 +intelcore2 -> core2 +intelcore2duo -> core2 + +amdopteron -> opteron +athlon64 -> opteron +k8 -> opteron + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/arm.txt b/src/libs/3rdparty/botan/src/build-data/arch/arm.txt new file mode 100644 index 00000000000..c6be4ad46d7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/arm.txt @@ -0,0 +1,23 @@ +realname "ARM" + +default_submodel arm2 + + +arm2 +arm3 +arm6 +arm7 +arm8 +arm9 +strongarm +strongarm110 +strongarm1100 +xscale + + + +sa110 -> strongarm110 +sa1100 -> strongarm1100 +strongarm1110 -> strongarm1100 +armv5tel -> xscale + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/hitachi-sh.txt b/src/libs/3rdparty/botan/src/build-data/arch/hitachi-sh.txt new file mode 100644 index 00000000000..8e9f7eee35c --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/hitachi-sh.txt @@ -0,0 +1,11 @@ +realname "Hitachi SH" + +default_submodel hitachi-sh1 + + +hitachi-sh1 +hitachi-sh2 +hitachi-sh3 +hitachi-sh3e +hitachi-sh4 + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/hppa.txt b/src/libs/3rdparty/botan/src/build-data/arch/hppa.txt new file mode 100644 index 00000000000..4cdd4088967 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/hppa.txt @@ -0,0 +1,17 @@ +realname "HP-PA" + +default_submodel hppa1.0 + + +hp-pa +parisc +pa-risc +hp-parisc +hp-pa-risc + + + +hppa1.0 +hppa1.1 +hppa2.0 + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/ia32.txt b/src/libs/3rdparty/botan/src/build-data/arch/ia32.txt new file mode 100644 index 00000000000..aafcf9a774e --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/ia32.txt @@ -0,0 +1,60 @@ +realname "IA-32" + +default_submodel i386 + +endian little +unaligned ok + + +x86 +ix86 +80x86 +i86pc # for Solaris + + + +i386 +i486 +i586 +i686 +pentium2 +pentium3 +pentium4 +pentium-m +prescott +k6 +athlon + + + +pentium -> i586 +pentiumpro -> i686 +pentium_pro -> i686 +pentium2 -> pentium2 +pentiumii -> pentium2 +pentium3 -> pentium3 +pentiumiii -> pentium3 + +x86family5 -> i586 +x86family6 -> i686 + +pentiumm -> pentium-m +intelpentiumm -> pentium-m + +intelpentium4 -> pentium4 + +duron -> athlon +athlon-xp -> athlon +k7 -> athlon + +p2 -> i686 +p3 -> i686 +p4 -> pentium4 + +intelcput2250 -> prescott +intelcput2300 -> prescott +intelcput2400 -> prescott +intelcput2500 -> prescott +intelcput2600 -> prescott +intelcput2700 -> prescott + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/ia64.txt b/src/libs/3rdparty/botan/src/build-data/arch/ia64.txt new file mode 100644 index 00000000000..7ca84c0073f --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/ia64.txt @@ -0,0 +1,15 @@ +realname "IA-64" + +# This is safe: only affects tuning, not ISA +default_submodel itanium2 + + +merced +itanium + + + +itanium1 +itanium2 +mckinley + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/m68k.txt b/src/libs/3rdparty/botan/src/build-data/arch/m68k.txt new file mode 100644 index 00000000000..27f246abc90 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/m68k.txt @@ -0,0 +1,15 @@ +realname "Motorola 680x0" + +default_submodel 68020 + + +680x0 +68k + + + +68020 +68030 +68040 +68060 + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/mips32.txt b/src/libs/3rdparty/botan/src/build-data/arch/mips32.txt new file mode 100644 index 00000000000..9846c8fb27c --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/mips32.txt @@ -0,0 +1,22 @@ +realname "MIPS" + +default_submodel r3000 + + +mips +mipsel # For Debian + + + +r3000 +r6000 + + + +r3k -> r3000 +r6k -> r6000 + +# These are for RPM +mipsbe -> r3000 +mipsle -> r3000 + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/mips64.txt b/src/libs/3rdparty/botan/src/build-data/arch/mips64.txt new file mode 100644 index 00000000000..dbb49d0285e --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/mips64.txt @@ -0,0 +1,22 @@ +realname "MIPS64" + +default_submodel r4400 + + +r4000 +r4100 +r4300 +r4400 +r4600 +r4560 +r5000 +r8000 +r10000 + + + +r4k -> r4000 +r5k -> r5000 +r8k -> r8000 +r10k -> r10000 + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/ppc.txt b/src/libs/3rdparty/botan/src/build-data/arch/ppc.txt new file mode 100644 index 00000000000..16112f38900 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/ppc.txt @@ -0,0 +1,24 @@ +realname "PowerPC" + +endian big + +default_submodel ppc604 + + +powerpc + + + +g3 -> ppc740 +g4 -> ppc7450 + + + +ppc601 +ppc603 +ppc604 +ppc740 +ppc750 +ppc7400 +ppc7450 + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/ppc64.txt b/src/libs/3rdparty/botan/src/build-data/arch/ppc64.txt new file mode 100644 index 00000000000..7c8944faf86 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/ppc64.txt @@ -0,0 +1,26 @@ +realname "PowerPC 64" + +endian big + +default_submodel power4 + + +powerpc64 + + + +g5 -> ppc970 + + + +rs64a +ppc970 +power3 +power4 +power5 +cellppu + + + +cellbroadbandengine -> cellppu + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/s390.txt b/src/libs/3rdparty/botan/src/build-data/arch/s390.txt new file mode 100644 index 00000000000..392f5139720 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/s390.txt @@ -0,0 +1,7 @@ +realname "S/390 31-bit" + +default_submodel s390 + + +s390 + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/s390x.txt b/src/libs/3rdparty/botan/src/build-data/arch/s390x.txt new file mode 100644 index 00000000000..49fb0bda765 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/s390x.txt @@ -0,0 +1,7 @@ +realname "S/390 64-bit" + +default_submodel s390x + + +s390x + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/sparc32.txt b/src/libs/3rdparty/botan/src/build-data/arch/sparc32.txt new file mode 100644 index 00000000000..6b752df870b --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/sparc32.txt @@ -0,0 +1,34 @@ +realname "SPARC" + +# V7 doesn't have integer multiply, so it will be bitterly slow for some things +# (especially BigInt). Also, it's fairly rare nowadays, so we default to V8. +default_submodel sparc32-v8 + +endian big + + +sparc + + + +sparc32-v7 +sparc32-v8 +sparc32-v9 + + + +cypress -> sparc32-v7 +supersparc -> sparc32-v8 +hypersparc -> sparc32-v8 +microsparc -> sparc32-v8 +sparclite -> sparc32-v8 + +sparcv7 -> sparc32-v7 +sparcv8 -> sparc32-v8 +sparcv9 -> sparc32-v9 + +sparc-v7 -> sparc32-v7 +sparc-v8 -> sparc32-v8 +sparc-v9 -> sparc32-v9 + + diff --git a/src/libs/3rdparty/botan/src/build-data/arch/sparc64.txt b/src/libs/3rdparty/botan/src/build-data/arch/sparc64.txt new file mode 100644 index 00000000000..c0575efc40c --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/arch/sparc64.txt @@ -0,0 +1,15 @@ +realname "SPARC64" + +default_submodel sparc64-ultra + + +sparc64-ultra +sparc64-ultra2 +sparc64-ultra3 + + + +ultrasparc -> sparc64-ultra +ultrasparc2 -> sparc64-ultra2 +ultrasparc3 -> sparc64-ultra3 + diff --git a/src/libs/3rdparty/botan/src/build-data/botan-config.in b/src/libs/3rdparty/botan/src/build-data/botan-config.in new file mode 100644 index 00000000000..f3fa3db94e4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/botan-config.in @@ -0,0 +1,69 @@ +#!/bin/sh + +# For normal builds: +guess_prefix=`dirname \`dirname $0\`` +includedir=%{includedir} +libdir=%{libdir} + +# For workspace builds: +#guess_prefix=`dirname $0` +#includedir=build/include +#libdir= + +install_prefix=%{prefix} +prefix= + +usage() +{ + echo "$0 [--prefix[=DIR]] [--version] [--libs] [--cflags]" + exit 1 +} + +if test $# -eq 0; then + usage +fi + +if test `echo $guess_prefix | cut -c 1` = "/"; then + prefix=$guess_prefix +else + prefix=$install_prefix +fi + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + case "$1" in + --prefix=*) + prefix=$optarg + ;; + --prefix) + echo $prefix + ;; + --version) + echo %{version} + exit 0 + ;; + --cflags) + if [ $prefix != "/usr" -a $prefix != "/usr/local" ] + then + echo -I$prefix/$includedir + fi + ;; + --libs) + if [ $prefix != "/usr" -a $prefix != "/usr/local" ] + then + echo -L$prefix/$libdir -lbotan %{link_to} + else + echo -lbotan %{link_to} + fi + ;; + *) + usage + ;; + esac + shift +done + +exit 0 diff --git a/src/libs/3rdparty/botan/src/build-data/botan.doxy.in b/src/libs/3rdparty/botan/src/build-data/botan.doxy.in new file mode 100644 index 00000000000..87d6e58eb2e --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/botan.doxy.in @@ -0,0 +1,233 @@ +# Doxyfile 1.5.4 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = Botan +PROJECT_NUMBER = %{version} +OUTPUT_DIRECTORY = doc/doxygen +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = YES +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = NO +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = YES +WARNINGS = YES +WARN_IF_UNDOCUMENTED = NO +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = src +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = YES +INLINE_SOURCES = YES +STRIP_CODE_COMMENTS = NO +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +REFERENCES_LINK_SOURCE = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +HTML_DYNAMIC_SECTIONS = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = YES +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/src/libs/3rdparty/botan/src/build-data/botan.pc.in b/src/libs/3rdparty/botan/src/build-data/botan.pc.in new file mode 100644 index 00000000000..70ed65d706f --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/botan.pc.in @@ -0,0 +1,12 @@ +prefix=%{prefix} +exec_prefix=${prefix} +libdir=${prefix}/%{libdir} +includedir=${prefix}/include + +Name: Botan +Description: Multi-platform C++ crypto library +Version: %{version} + +Libs: -L${libdir} -lbotan +Libs.private: %{link_to} +Cflags: -I${includedir} diff --git a/src/libs/3rdparty/botan/src/build-data/buildh.in b/src/libs/3rdparty/botan/src/build-data/buildh.in new file mode 100644 index 00000000000..e4ab0f44b80 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/buildh.in @@ -0,0 +1,66 @@ + +#ifndef BOTAN_BUILD_CONFIG_H__ +#define BOTAN_BUILD_CONFIG_H__ + +/* This file was automatically generated %{timestamp} UTC */ + +#define BOTAN_VERSION_MAJOR %{version_major} +#define BOTAN_VERSION_MINOR %{version_minor} +#define BOTAN_VERSION_PATCH %{version_patch} + +#ifndef BOTAN_DLL + #define BOTAN_DLL %{dll_export_flags} +#endif + +/* Chunk sizes */ +#define BOTAN_DEFAULT_BUFFER_SIZE 4096 +#define BOTAN_MEM_POOL_CHUNK_SIZE 64*1024 + +/* BigInt toggles */ +#define BOTAN_MP_WORD_BITS %{mp_bits} +#define BOTAN_KARAT_MUL_THRESHOLD 32 +#define BOTAN_KARAT_SQR_THRESHOLD 32 +#define BOTAN_PRIVATE_KEY_OP_BLINDING_BITS 64 + +/* PK key consistency checking toggles */ +#define BOTAN_PUBLIC_KEY_STRONG_CHECKS_ON_LOAD 1 +#define BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_LOAD 1 +#define BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_GENERATE 1 + +/* Should we use GCC-style inline assembler? */ +#if !defined(BOTAN_USE_GCC_INLINE_ASM) && defined(__GNUG__) + #define BOTAN_USE_GCC_INLINE_ASM 1 +#endif + +#ifndef BOTAN_USE_GCC_INLINE_ASM + #define BOTAN_USE_GCC_INLINE_ASM 0 +#endif + +/* Target identification and feature test macros */ +%{target_os_defines} + +%{target_cpu_defines} + +%{target_compiler_defines} + +/* Module definitions */ +%{module_defines} + +/* Local configuration options */ +%{local_config} + +/* +%{user}@%{hostname} ran '%{command_line}' + +Target +------- +Compiler: %{cc} %{lib_opt} %{mach_opt} +Arch: %{submodel}/%{arch} +OS: %{os} + +Modules +------- +%{mod_list} +*/ + +#endif diff --git a/src/libs/3rdparty/botan/src/build-data/cc/bcc.txt b/src/libs/3rdparty/botan/src/build-data/cc/bcc.txt new file mode 100644 index 00000000000..df09daff092 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/bcc.txt @@ -0,0 +1,31 @@ +realname "Borland C++" + +binary_name "bcc32" + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +lib_opt_flags "-O2" +check_opt_flags "-O2" +debug_flags "" +no_debug_flags "" +lang_flags "-tWR -tWM -tWC" +warning_flags "-w" + +dll_import_flags "" +dll_export_flags "" + +ar_command "tlib /C /P256" + +makefile_style nmake + + +i486 -> "/G4" +i586 -> "/G5" +i686 -> "/G6" +athlon -> "/G6" +pentium4 -> "/G6" + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/compaq.txt b/src/libs/3rdparty/botan/src/build-data/cc/compaq.txt new file mode 100644 index 00000000000..66d3a5219cd --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/compaq.txt @@ -0,0 +1,29 @@ +realname "Compaq C++" + +binary_name "cxx" + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +# -O3 and up seem to be unhappy with Botan +lib_opt_flags "-O2" +check_opt_flags "-O2" +debug_flags "-g" +no_debug_flags "" +lang_flags "-std ansi -D__USE_STD_IOSTREAM" + +dll_import_flags "" +dll_export_flags "" + +makefile_style unix + + +default -> "$(CXX) -shared -soname $(SONAME)" + + + +alpha -> "-arch=SUBMODEL" alpha- + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/ekopath.txt b/src/libs/3rdparty/botan/src/build-data/cc/ekopath.txt new file mode 100644 index 00000000000..ca247105975 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/ekopath.txt @@ -0,0 +1,40 @@ +realname "PathScale EKOPath C++" + +binary_name "pathCC" + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +lib_opt_flags "-O3 -OPT:Ofast:alias=disjoint" +check_opt_flags "-O2" +lang_flags "-D_REENTRANT -ansi -Wno-long-long" +warning_flags "-W -Wall" + +ar_command "pathCC -ar -o" + +shared_flags "-fPIC" +debug_flags "-g" + +dll_import_flags "" +dll_export_flags "" + +makefile_style unix + + +default -> "$(CXX) -shared -fPIC -Wl,-soname,$(SONAME)" + + + +athlon -> "-mcpu=athlon" +pentium4 -> "-mcpu=pentium4" + +opteron -> "-mcpu=opteron" +em64t -> "-mcpu=em64t" +core2 -> "-mcpu=core" + +ia32 -> "-mcpu=anyx86" +amd64 -> "-mcpu=athlon64" + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/gcc.txt b/src/libs/3rdparty/botan/src/build-data/cc/gcc.txt new file mode 100644 index 00000000000..978ed6d58d0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/gcc.txt @@ -0,0 +1,89 @@ +realname "GNU C++" + +binary_name "g++" + +compiler_has_tr1 yes + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +lang_flags "-D_REENTRANT -ansi -Wno-long-long" +warning_flags "-W -Wall" +#warning_flags "-Wextra -Wall -Wstrict-aliasing -Wstrict-overflow=5 -Wcast-align -Wmissing-declarations -Wno-unused-parameter" + +lib_opt_flags "-O2 -finline-functions" +check_opt_flags "-O2" +shared_flags "-fPIC" +debug_flags "-g" + +dll_import_flags "" +dll_export_flags "" + +makefile_style unix + + +# The default works for GNU ld and several other Unix linkers +default -> "$(CXX) -shared -fPIC -Wl,-soname,$(SONAME)" + +# AIX doesn't seem to have soname support (weird...) +aix -> "$(CXX) -shared -fPIC" + +darwin -> "$(CXX) -dynamiclib -fPIC -install_name $(SONAME)" +hpux -> "$(CXX) -shared -fPIC -Wl,+h,$(SONAME)" +solaris -> "$(CXX) -shared -fPIC -Wl,-h,$(SONAME)" +# Gotta use ld directly on BeOS, their GCC is busted +beos -> "ld -shared -h $(SONAME)" + + + +# Specializations first (they don't need to be, just clearer) +i386 -> "-mtune=i686 -momit-leaf-frame-pointer" +r10000 -> "-mips4" +alpha-ev67 -> "-mcpu=ev6" # FIXME: GCC 3.1 and on has -march=ev67 +alpha-ev68 -> "-mcpu=ev6" +alpha-ev7 -> "-mcpu=ev6" +ppc601 -> "-mpowerpc -mcpu=601" +sparc64-ultra3 -> "-mcpu=v9 -mtune=ultrasparc3" + +em64t -> "-march=nocona -momit-leaf-frame-pointer" +cellppu -> "" + +# Default family options (SUBMODEL is substitued with the real submodel) +# Anything after the quotes is what should be *removed* from the submodel name +# before it's put into SUBMODEL. +alpha -> "-mcpu=SUBMODEL" alpha- +amd64 -> "-march=SUBMODEL -momit-leaf-frame-pointer" +arm -> "-mcpu=SUBMODEL" +ia32 -> "-march=SUBMODEL -momit-leaf-frame-pointer" +ia64 -> "-mtune=SUBMODEL" +hppa -> "-march=SUBMODEL" hppa +m68k -> "-mSUBMODEL" +hitachi-sh -> "-mSUBMODEL" hitachi-sh +sparc32 -> "-mcpu=SUBMODEL -Wa,-xarch=v8plus" sparc32- +sparc64 -> "-mcpu=v9 -mtune=ultrasparc" +mips32 -> "-mips1 -mcpu=SUBMODEL" mips32- +mips64 -> "-mips3 -mcpu=SUBMODEL" mips64- +ppc -> "-mcpu=SUBMODEL" ppc +ppc64 -> "-mcpu=SUBMODEL" ppc + + +# Note that the 'linking' bit means "use this for both compiling *and* linking" + +amd64 -> "-m64" +mips64 -> "-mabi=64" +s390 -> "-m31" +s390x -> "-m64" +sparc32 -> "-m32 -mno-app-regs" +sparc64 -> "-m64 -mno-app-regs" +ppc64 -> "-m64" + +# This should probably be used on most/all targets, but the docs are incomplete +openbsd -> "-pthread" +freebsd -> "-pthread" +dragonfly -> "-pthread" +netbsd -> "-pthread -D_NETBSD_SOURCE" +qnx -> "-fexceptions -D_QNX_SOURCE" + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/hpcc.txt b/src/libs/3rdparty/botan/src/build-data/cc/hpcc.txt new file mode 100644 index 00000000000..284e92ca64d --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/hpcc.txt @@ -0,0 +1,32 @@ +realname "HP-UX C++" + +binary_name "aCC" + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +lib_opt_flags "+O2" +check_opt_flags "+O2" +debug_flags "-g" +no_debug_flags "" +lang_flags "-AA -ext +eh -z" +warning_flags "" # +w +shared_flags "+Z" + +dll_import_flags "" +dll_export_flags "" + +makefile_style unix + + +hppa1.0 -> "+DAportable" +hppa1.1 -> "+DA1.1" +hppa2.0 -> "+DA2.0W" + + + +default -> "$(CXX) +Z -b -Wl,+h,$(SONAME)" # Documented in cc(1), but not CC(1) (?) + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/icc.txt b/src/libs/3rdparty/botan/src/build-data/cc/icc.txt new file mode 100644 index 00000000000..7d8e9682f43 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/icc.txt @@ -0,0 +1,35 @@ +realname "Intel C++" + +binary_name "icpc" + +compiler_has_tr1 yes + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +lib_opt_flags "-O2 -ip -unroll" +check_opt_flags "-O2" +debug_flags "-g" +no_debug_flags "-fomit-frame-pointer" +lang_flags "" +warning_flags "-w1" +shared_flags "-fPIC" + +dll_import_flags "" +dll_export_flags "" + +makefile_style unix + + +pentium3 -> "-march=pentium3" +pentium4 -> "-march=pentium4" +pentium-m -> "-march=pentium3" +core2 -> "-march=core2" + + + +default -> "$(CXX) -fPIC -shared" + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/kai.txt b/src/libs/3rdparty/botan/src/build-data/cc/kai.txt new file mode 100644 index 00000000000..8585e54e0d9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/kai.txt @@ -0,0 +1,30 @@ +realname "KAI C++" + +binary_name "KCC" + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +ar_command "KCC -o" + +lib_opt_flags "+K3 --inline_auto_space_time=65 --abstract_pointer" +check_opt_flags "+K3" +lang_flags "-D__KAI_STRICT" +debug_flags "-g" +no_debug_flags "" + +dll_import_flags "" +dll_export_flags "" + +makefile_style unix + + +default -> "$(CXX) --soname $(SONAME)" + + + +all -> "--one_per" + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/mipspro.txt b/src/libs/3rdparty/botan/src/build-data/cc/mipspro.txt new file mode 100644 index 00000000000..b75fc4fb394 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/mipspro.txt @@ -0,0 +1,42 @@ +realname "SGI MIPSPro C++" + +binary_name "CC" + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +lib_opt_flags "-O3 -OPT:alias=TYPED" +check_opt_flags "-O3 -OPT:alias=TYPED" +debug_flags "-g3" +no_debug_flags "" +shared_flags "-KPIC" +lang_flags "-ansi -LANG:ansi-for-init-scope=ON" +# Disabled, because, while my code is fine, it warns about a lot of it's own +# headers +#warning_flags "-fullwarn" + +dll_import_flags "" +dll_export_flags "" + +makefile_style unix + + +default -> "$(CXX) -shared -Wl,-soname,$(SONAME)" + + + +mips32 -> "-mips1" +mips64 -> "-mips3" + +mips64-r5000 -> "-mips4 -r5000" +mips64-r8000 -> "-mips4 -r8000" +mips64-r10000 -> "-mips4 -r10000" + + + +mips32 -> "-n32" +mips64 -> "-64" + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/msvc.txt b/src/libs/3rdparty/botan/src/build-data/cc/msvc.txt new file mode 100644 index 00000000000..68e4517f843 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/msvc.txt @@ -0,0 +1,27 @@ +realname "Visual C++" + +binary_name "cl.exe" + +compile_option "/nologo /c " +output_to_option "/Fo" +add_include_dir_option "/I" +add_lib_dir_option "-L" +add_lib_option "" + +lib_opt_flags "/O2" +check_opt_flags "/O2" +debug_flags "/Zi" +no_debug_flags "" +lang_flags "/EHsc /GR /D_CONSOLE" +warning_flags "" + +dll_import_flags "__declspec(dllimport)" +dll_export_flags "__declspec(dllexport)" + +ar_command "lib" + +makefile_style nmake + + +default -> "link /DLL" + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/open64.txt b/src/libs/3rdparty/botan/src/build-data/cc/open64.txt new file mode 100644 index 00000000000..b7c1e9e99d8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/open64.txt @@ -0,0 +1,30 @@ +realname "Open64" + +binary_name "openCC" + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +lib_opt_flags "-O3 -OPT:alias=TYPED" +check_opt_flags "-O3 -OPT:alias=TYPED" +debug_flags "-g3" +no_debug_flags "-fomit-frame-pointer" +shared_flags "-fPIC" +lang_flags "-ansi -LANG:ansi-for-init-scope=ON" +warning_flags "-Wall -W" + +dll_import_flags "" +dll_export_flags "" + +makefile_style unix + + +default -> "$(CXX) -shared -Wl,-soname,$(SONAME)" + + + +amd64 -> "-m64" + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/pgi.txt b/src/libs/3rdparty/botan/src/build-data/cc/pgi.txt new file mode 100644 index 00000000000..35f46647793 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/pgi.txt @@ -0,0 +1,31 @@ +realname "Portland Group C++" + +binary_name "pgCC" + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +lib_opt_flags "-fast -Minline" +check_opt_flags "-fast" +shared_flags "-fPIC" + +dll_import_flags "" +dll_export_flags "" + +makefile_style unix + + +linux -> "$(CXX) -shared -fPIC -Wl,-soname,$(SONAME)" +solaris -> "$(CXX) -G -fPIC -Wl,-h,$(SONAME)" + + + +i586 -> "-tp p5" +i686 -> "-tp p6" +athlon -> "-tp k7" +pentium4 -> "-tp p6" +ia32 -> "-tp px" + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/sgipro64.txt b/src/libs/3rdparty/botan/src/build-data/cc/sgipro64.txt new file mode 100644 index 00000000000..28132ffcce7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/sgipro64.txt @@ -0,0 +1,30 @@ +realname "SGI Pro64" + +binary_name "sgiCC" + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +lib_opt_flags "-O3 -OPT:alias=TYPED" +check_opt_flags "-O3 -OPT:alias=TYPED" +debug_flags "-g3" +no_debug_flags "" +shared_flags "-KPIC" +lang_flags "-ansi -LANG:ansi-for-init-scope=ON" +warning_flags "-Wall -W" + +dll_import_flags "" +dll_export_flags "" + +makefile_style unix + + +default -> "$(CXX) -shared -Wl,-soname,$(SONAME)" + + + + + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/sunwspro.txt b/src/libs/3rdparty/botan/src/build-data/cc/sunwspro.txt new file mode 100644 index 00000000000..e1bc0b26fc0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/sunwspro.txt @@ -0,0 +1,47 @@ +realname "Sun Workshop Pro C++" + +binary_name "CC" + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +# The compiler supports up to -xO5, but anything higher than -xO2 causes +# incorrect results, infinite loops, other badness. :( +lib_opt_flags "-xO2" +check_opt_flags "-xO2" +debug_flags "-g" +no_debug_flags "" +shared_flags "-KPIC" +warning_flags "+w" +lang_flags "+p -D__EXTENSIONS__" + +dll_import_flags "" +dll_export_flags "" + +makefile_style unix + + +default -> "$(CXX) -G -h$(SONAME)" + + + +i386 -> "-xtarget=486" +i486 -> "-xtarget=486" +i586 -> "-xtarget=pentium" +i686 -> "-xtarget=pentium_pro" +pentium4 -> "-xtarget=pentium_pro" +k6 -> "-xtarget=pentium" + +sparc32-v9 -> "-xchip=ultra -xarch=v8" + +sparc32 -> "-xchip=ultra -xarch=SUBMODEL" sparc32- +sparc64 -> "-xchip=SUBMODEL" sparc64- + + + +sparc64 -> "-xarch=v9" +amd64 -> "-m64" + diff --git a/src/libs/3rdparty/botan/src/build-data/cc/xlc.txt b/src/libs/3rdparty/botan/src/build-data/cc/xlc.txt new file mode 100644 index 00000000000..64b88842117 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/cc/xlc.txt @@ -0,0 +1,29 @@ +realname "IBM XL C/C++" + +binary_name "xlC" + +compile_option "-c " +output_to_option "-o " +add_include_dir_option "-I" +add_lib_dir_option "-L" +add_lib_option "-l" + +lib_opt_flags "-O2" +check_opt_flags "-O2" +lang_flags "" +debug_flags "-g" +no_debug_flags "" + +dll_import_flags "" +dll_export_flags "" + +makefile_style unix + + +cellppu -> "-qarch=cell" +ppc970 -> "-qarch=ppc970" +power4 -> "-qarch=pwr4" +power5 -> "-qarch=pwr5" + +cellppu -> "-qarch=cell" + diff --git a/src/libs/3rdparty/botan/src/build-data/makefile/nmake.in b/src/libs/3rdparty/botan/src/build-data/makefile/nmake.in new file mode 100644 index 00000000000..34c864e9361 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/makefile/nmake.in @@ -0,0 +1,107 @@ +################################################## +# Compiler Options # +################################################## +CXX = %{cc} +LIB_OPT = %{lib_opt} +CHECK_OPT = %{check_opt} +MACH_OPT = %{mach_opt} +LANG_FLAGS = %{lang_flags} +WARN_FLAGS = %{warn_flags} +LINK_TO = %{link_to} + +################################################## +# Version Numbers # +################################################## +VERSION = %{version} + +################################################## +# Installation Settings # +################################################## +DESTDIR = %{prefix} + +LIBDIR = $(DESTDIR)\%{libdir} +HEADERDIR = $(DESTDIR)\%{includedir}\botan +DOCDIR = $(DESTDIR)\%{docdir}\Botan-$(VERSION) + +################################################## +# Aliases for Common Programs # +################################################## +AR = %{ar_command} +CD = @cd +ECHO = @echo +INSTALL = %{install_cmd_exec} +INSTALL_CMD = %{install_cmd_exec} +MKDIR = @md +MKDIR_INSTALL = @md +RM = @del /Q +RMDIR = @rmdir + +################################################## +# File Lists # +################################################## +CHECK = check + +DOCS = %{doc_files} + +HEADERS = %{include_files} + +LIBOBJS = %{lib_objs} + +CHECKOBJS = %{check_objs} + +LIB_FLAGS = $(LIB_OPT) $(MACH_OPT) $(LANG_FLAGS) $(WARN_FLAGS) +CHECK_FLAGS = $(CHECK_OPT) $(LANG_FLAGS) $(WARN_FLAGS) + +LIBRARIES = $(STATIC_LIB) + +LIBNAME = libbotan +STATIC_LIB = $(LIBNAME).%{static_suffix} + +all: $(LIBRARIES) + +################################################## +# Build Commands # +################################################## +%{lib_build_cmds} + +%{check_build_cmds} + +################################################## +# Link Commands # +################################################## + +# Link for Borland? +#ilink32 -L$(BCB)\lib -w -c -x -Gn -ap -Tpe c0x32.obj \ +# $(CHECKOBJS),check.exe,,$(LINK_TO) $(STATIC_LIB) + +$(CHECK): $(LIBRARIES) $(CHECKOBJS) + link /OUT:$@.exe $(CHECKOBJS) $(STATIC_LIB) $(LINK_TO) + +$(STATIC_LIB): $(LIBOBJS) + $(AR) /OUT:$@ /NAME:BOTAN-$(VERSION) $(LIBOBJS) + +################################################## +# Misc Targets # +################################################## +static: $(STATIC_LIB) + +################################################## +# Fake Targets # +################################################## +clean: + $(RM) %{build_dir}\lib\* %{build_dir}\checks\* + $(RM) $(LIBRARIES) $(CHECK) + +distclean: clean + $(RM) %{build_dir}\build.h + $(RM) %{build_dir}\include\botan\* + $(RMDIR) %{build_dir}\include\botan %{build_dir}\include + $(RMDIR) %{build_dir}\lib %{build_dir}\checks + $(RMDIR) %{build_dir} + $(RM) Makefile + +################################################## +# Install Commands # +################################################## +install: $(LIBRARIES) + $(ECHO) "Install command not implemented" diff --git a/src/libs/3rdparty/botan/src/build-data/makefile/unix.in b/src/libs/3rdparty/botan/src/build-data/makefile/unix.in new file mode 100644 index 00000000000..a48a5a17e46 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/makefile/unix.in @@ -0,0 +1,121 @@ +################################################## +# Compiler Options # +################################################## +CXX = %{cc} +LIB_OPT = %{lib_opt} +CHECK_OPT = %{check_opt} +MACH_OPT = %{mach_opt} +LANG_FLAGS = %{lang_flags} +WARN_FLAGS = %{warn_flags} +LINK_TO = %{link_to} + +################################################## +# Version Numbers # +################################################## +VERSION = %{version} + +################################################## +# Installation Settings # +################################################## +DESTDIR = %{prefix} + +BINDIR = $(DESTDIR)/bin +LIBDIR = $(DESTDIR)/%{libdir} +HEADERDIR = $(DESTDIR)/%{includedir}/botan +DOCDIR = $(DESTDIR)/%{docdir}/Botan-$(VERSION) +PKGCONF_DIR = $(LIBDIR)/pkgconfig + +CONFIG_SCRIPT = %{botan_config} +PKGCONFIG = %{botan_pkgconfig} + +################################################## +# Aliases for Common Programs # +################################################## +AR = %{ar_command} +CD = @cd +ECHO = @echo +INSTALL_CMD_EXEC = %{install_cmd_exec} +INSTALL_CMD_DATA = %{install_cmd_data} +LN = ln -fs +MKDIR = @mkdir +MKDIR_INSTALL = @umask 022; mkdir -p -m 755 +RANLIB = %{ranlib_command} +RM = @rm -f +RM_R = @rm -rf + +################################################## +# File Lists # +################################################## +CHECK = %{check_prefix}check + +DOCS = %{doc_files} + +HEADERS = %{include_files} + +LIBOBJS = %{lib_objs} + +CHECKOBJS = %{check_objs} + +LIB_FLAGS = $(LIB_OPT) $(MACH_OPT) $(LANG_FLAGS) $(WARN_FLAGS) +CHECK_FLAGS = $(CHECK_OPT) $(LANG_FLAGS) $(WARN_FLAGS) + +LIBRARIES = $(STATIC_LIB) + +LIBNAME = %{lib_prefix}libbotan +STATIC_LIB = $(LIBNAME).a + +all: $(LIBRARIES) + +################################################## +# Build Commands # +################################################## +%{lib_build_cmds} + +%{check_build_cmds} + +################################################## +# Link Commands # +################################################## +$(CHECK): $(LIBRARIES) $(CHECKOBJS) + $(CXX) $(CHECKOBJS) -L. libbotan.a $(LINK_TO) -o $(CHECK) + +$(STATIC_LIB): $(LIBOBJS) + $(RM) $(STATIC_LIB) + $(AR) $(STATIC_LIB) $(LIBOBJS) + $(RANLIB) $(STATIC_LIB) + +################################################## +# Fake Targets # +################################################## +.PHONY = doxygen clean distclean install static + +static: $(STATIC_LIB) + +doxygen: + doxygen %{doc_src_dir}/botan.doxy + +clean: + $(RM_R) %{build_dir}/lib/* %{build_dir}/checks/* + $(RM) $(LIBRARIES) $(SYMLINK) $(CHECK) + +distclean: clean + $(RM_R) %{build_dir} + $(RM_R) %{doc_src_dir}/doxygen %{doc_src_dir}/botan.doxy + $(RM) Makefile $(CONFIG_SCRIPT) $(PKGCONFIG) + +install: $(LIBRARIES) + $(ECHO) "Installing Botan into $(DESTDIR)... " + $(MKDIR_INSTALL) $(DOCDIR) + $(MKDIR_INSTALL) $(HEADERDIR) + $(MKDIR_INSTALL) $(LIBDIR) + $(MKDIR_INSTALL) $(BINDIR) + $(MKDIR_INSTALL) $(PKGCONF_DIR) + for i in $(DOCS); do \ + $(INSTALL_CMD_DATA) $$i $(DOCDIR); \ + done + for i in $(HEADERS); do \ + $(INSTALL_CMD_DATA) $$i $(HEADERDIR); \ + done + $(INSTALL_CMD_DATA) $(STATIC_LIB) $(LIBDIR) + $(INSTALL_CMD_EXEC) $(CONFIG_SCRIPT) $(BINDIR) + $(INSTALL_CMD_DATA) $(PKGCONFIG) $(PKGCONF_DIR) diff --git a/src/libs/3rdparty/botan/src/build-data/makefile/unix_shr.in b/src/libs/3rdparty/botan/src/build-data/makefile/unix_shr.in new file mode 100644 index 00000000000..f718d11603c --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/makefile/unix_shr.in @@ -0,0 +1,137 @@ +################################################## +# Compiler Options # +################################################## +CXX = %{cc} +LIB_OPT = %{lib_opt} +CHECK_OPT = %{check_opt} +MACH_OPT = %{mach_opt} +LANG_FLAGS = %{lang_flags} +WARN_FLAGS = %{warn_flags} +SO_OBJ_FLAGS = %{shared_flags} +SO_LINK_CMD = %{so_link} +LINK_TO = %{link_to} + +################################################## +# Version Numbers # +################################################## +VERSION = %{version} +SO_VERSION = %{so_version} + +################################################## +# Installation Settings # +################################################## +DESTDIR = %{prefix} + +BINDIR = $(DESTDIR)/bin +LIBDIR = $(DESTDIR)/%{libdir} +HEADERDIR = $(DESTDIR)/%{includedir}/botan +DOCDIR = $(DESTDIR)/%{docdir}/Botan-$(VERSION) +PKGCONF_DIR = $(LIBDIR)/pkgconfig + +CONFIG_SCRIPT = %{botan_config} +PKGCONFIG = %{botan_pkgconfig} + +################################################## +# Aliases for Common Programs # +################################################## +AR = %{ar_command} +CD = @cd +ECHO = @echo +INSTALL_CMD_EXEC = %{install_cmd_exec} +INSTALL_CMD_DATA = %{install_cmd_data} +LN = ln -fs +MKDIR = @mkdir +MKDIR_INSTALL = @umask 022; mkdir -p -m 755 +RANLIB = %{ranlib_command} +RM = @rm -f +RM_R = @rm -rf + +################################################## +# File Lists # +################################################## +CHECK = %{check_prefix}check + +DOCS = %{doc_files} + +HEADERS = %{include_files} + +LIBOBJS = %{lib_objs} + +CHECKOBJS = %{check_objs} + +LIB_FLAGS = $(LIB_OPT) $(MACH_OPT) $(LANG_FLAGS) $(WARN_FLAGS) $(SO_OBJ_FLAGS) +CHECK_FLAGS = $(CHECK_OPT) $(LANG_FLAGS) $(WARN_FLAGS) + +LIBRARIES = $(STATIC_LIB) $(SHARED_LIB) + +LIBNAME = %{lib_prefix}libbotan +STATIC_LIB = $(LIBNAME).a + +SHARED_LIB = $(LIBNAME)-$(SO_VERSION).%{so_suffix} +SONAME = $(LIBNAME)-$(SO_VERSION).%{so_suffix} + +SYMLINK = libbotan.%{so_suffix} + +all: $(LIBRARIES) + +################################################## +# Build Commands # +################################################## +%{lib_build_cmds} + +%{check_build_cmds} + +################################################## +# Link Commands # +################################################## +$(CHECK): $(LIBRARIES) $(CHECKOBJS) + $(CXX) $(LDFLAGS) $(CHECKOBJS) -o $(CHECK) -L. -lbotan-%{so_version} $(LINK_TO) + +$(STATIC_LIB): $(LIBOBJS) + $(RM) $(STATIC_LIB) + $(AR) $(STATIC_LIB) $(LIBOBJS) + $(RANLIB) $(STATIC_LIB) + +$(SHARED_LIB): $(LIBOBJS) + $(SO_LINK_CMD) $(LDFLAGS) $(LIBOBJS) -o $(SHARED_LIB) $(LINK_TO) + $(LN) $(SHARED_LIB) $(SYMLINK) + +################################################## +# Fake Targets # +################################################## +.PHONY = doxygen clean distclean install static shared + +static: $(STATIC_LIB) + +shared: $(SHARED_LIB) + +doxygen: + doxygen %{doc_src_dir}/botan.doxy + +clean: + $(RM_R) %{build_dir}/lib/* %{build_dir}/checks/* + $(RM) $(LIBRARIES) $(SYMLINK) $(CHECK) + +distclean: clean + $(RM_R) %{build_dir} + $(RM_R) %{doc_src_dir}/doxygen %{doc_src_dir}/botan.doxy + $(RM) Makefile $(CONFIG_SCRIPT) $(PKGCONFIG) + +install: $(LIBRARIES) + $(ECHO) "Installing Botan into $(DESTDIR)... " + $(MKDIR_INSTALL) $(DOCDIR) + $(MKDIR_INSTALL) $(HEADERDIR) + $(MKDIR_INSTALL) $(LIBDIR) + $(MKDIR_INSTALL) $(BINDIR) + $(MKDIR_INSTALL) $(PKGCONF_DIR) + for i in $(DOCS); do \ + $(INSTALL_CMD_DATA) $$i $(DOCDIR); \ + done + for i in $(HEADERS); do \ + $(INSTALL_CMD_DATA) $$i $(HEADERDIR); \ + done + $(INSTALL_CMD_DATA) $(STATIC_LIB) $(LIBDIR) + $(INSTALL_CMD_EXEC) $(CONFIG_SCRIPT) $(BINDIR) + $(INSTALL_CMD_EXEC) $(SHARED_LIB) $(LIBDIR) + $(INSTALL_CMD_DATA) $(PKGCONFIG) $(PKGCONF_DIR) + $(CD) $(LIBDIR); $(LN) $(SHARED_LIB) $(SYMLINK) diff --git a/src/libs/3rdparty/botan/src/build-data/os/aix.txt b/src/libs/3rdparty/botan/src/build-data/os/aix.txt new file mode 100644 index 00000000000..cec81858077 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/aix.txt @@ -0,0 +1,7 @@ +realname "AIX" + +os_type unix + + +all + diff --git a/src/libs/3rdparty/botan/src/build-data/os/beos.txt b/src/libs/3rdparty/botan/src/build-data/os/beos.txt new file mode 100644 index 00000000000..2b12792bb68 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/beos.txt @@ -0,0 +1,16 @@ +realname "BeOS" + +os_type beos + +install_root /boot/beos +header_dir ../develop/headers +lib_dir system/lib +doc_dir documentation + + +all + + + +haiku + diff --git a/src/libs/3rdparty/botan/src/build-data/os/cygwin.txt b/src/libs/3rdparty/botan/src/build-data/os/cygwin.txt new file mode 100644 index 00000000000..c2aadea9844 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/cygwin.txt @@ -0,0 +1,13 @@ +realname "Cygwin" + +os_type unix + +install_root c:\Botan +doc_dir docs + +# Cygwin supports shared libs fine, but there are problems with making a Botan +# shared library when libraries it depends on are static-only (such as libz). +# So until I can figure out a work-around, it's disabled. + +#all + diff --git a/src/libs/3rdparty/botan/src/build-data/os/darwin.txt b/src/libs/3rdparty/botan/src/build-data/os/darwin.txt new file mode 100644 index 00000000000..29862121608 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/darwin.txt @@ -0,0 +1,19 @@ +realname "Darwin / MacOS X" + +os_type unix + +so_suffix dylib + +# It doesn't have the 's' option; you need to use needs ranlib +ar_command "ar cr" +ar_needs_ranlib yes + +doc_dir doc + + +all + + + +macosx + diff --git a/src/libs/3rdparty/botan/src/build-data/os/defaults.txt b/src/libs/3rdparty/botan/src/build-data/os/defaults.txt new file mode 100644 index 00000000000..5648643a905 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/defaults.txt @@ -0,0 +1,19 @@ +# Defaults are for a Unix box, since that's what most of OS variants are. It +# would be nice to have generic 'windows', 'beos', 'unix', etc targets to +# handle defaults for those classes of OSes, though Unix is by far the most +# varied/fragmented + +obj_suffix o +so_suffix so +static_suffix a + +ar_command "ar crs" +ar_needs_ranlib no + +install_root /usr/local +header_dir include +lib_dir lib +doc_dir share/doc + +install_cmd_data "install -m 644" +install_cmd_exec "install -m 755" diff --git a/src/libs/3rdparty/botan/src/build-data/os/dragonfly.txt b/src/libs/3rdparty/botan/src/build-data/os/dragonfly.txt new file mode 100644 index 00000000000..7e366343590 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/dragonfly.txt @@ -0,0 +1,11 @@ +realname "DragonFly" + +os_type unix + + +posix_mlock + + + +all + diff --git a/src/libs/3rdparty/botan/src/build-data/os/freebsd.txt b/src/libs/3rdparty/botan/src/build-data/os/freebsd.txt new file mode 100644 index 00000000000..ea96b0c8890 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/freebsd.txt @@ -0,0 +1,11 @@ +realname "FreeBSD" + +os_type unix + + +posix_mlock + + + +all + diff --git a/src/libs/3rdparty/botan/src/build-data/os/hpux.txt b/src/libs/3rdparty/botan/src/build-data/os/hpux.txt new file mode 100644 index 00000000000..6e17d3b7340 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/hpux.txt @@ -0,0 +1,13 @@ +realname "HP-UX" + +os_type unix + +so_suffix sl + + +all + + + +hp-ux + diff --git a/src/libs/3rdparty/botan/src/build-data/os/irix.txt b/src/libs/3rdparty/botan/src/build-data/os/irix.txt new file mode 100644 index 00000000000..fd8b4328778 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/irix.txt @@ -0,0 +1,7 @@ +realname "IRIX" + +os_type unix + + +all + diff --git a/src/libs/3rdparty/botan/src/build-data/os/linux.txt b/src/libs/3rdparty/botan/src/build-data/os/linux.txt new file mode 100644 index 00000000000..53528511a89 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/linux.txt @@ -0,0 +1,12 @@ +realname "Linux" + +os_type unix + + +posix_mlock + + +# Is this correct? + +all + diff --git a/src/libs/3rdparty/botan/src/build-data/os/mingw.txt b/src/libs/3rdparty/botan/src/build-data/os/mingw.txt new file mode 100644 index 00000000000..eb25017fc0f --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/mingw.txt @@ -0,0 +1,22 @@ +realname "MS Windows (MinGW)" +os_type windows + +obj_suffix o +so_suffix dll +static_suffix a + +ar_command "ar crs" +ar_needs_ranlib yes + +install_root /mingw +header_dir include +lib_dir lib +doc_dir share/doc + +install_cmd_data "install -m 644" +install_cmd_exec "install -m 755" + + +msys +mingw32 + diff --git a/src/libs/3rdparty/botan/src/build-data/os/netbsd.txt b/src/libs/3rdparty/botan/src/build-data/os/netbsd.txt new file mode 100644 index 00000000000..435d8f5e867 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/netbsd.txt @@ -0,0 +1,7 @@ +realname "NetBSD" + +os_type unix + + +all + diff --git a/src/libs/3rdparty/botan/src/build-data/os/openbsd.txt b/src/libs/3rdparty/botan/src/build-data/os/openbsd.txt new file mode 100644 index 00000000000..cb44bd115d0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/openbsd.txt @@ -0,0 +1,7 @@ +realname "OpenBSD" + +os_type unix + + +all + diff --git a/src/libs/3rdparty/botan/src/build-data/os/qnx.txt b/src/libs/3rdparty/botan/src/build-data/os/qnx.txt new file mode 100644 index 00000000000..28bc8dea911 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/qnx.txt @@ -0,0 +1,7 @@ +realname "QNX" + +os_type unix + + +all + diff --git a/src/libs/3rdparty/botan/src/build-data/os/solaris.txt b/src/libs/3rdparty/botan/src/build-data/os/solaris.txt new file mode 100644 index 00000000000..8610b489831 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/solaris.txt @@ -0,0 +1,15 @@ +realname "Solaris" + +os_type unix + + +posix_mlock + + + +all + + + +sunos + diff --git a/src/libs/3rdparty/botan/src/build-data/os/tru64.txt b/src/libs/3rdparty/botan/src/build-data/os/tru64.txt new file mode 100644 index 00000000000..e320c1df4d6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/tru64.txt @@ -0,0 +1,11 @@ +realname "Tru64" + +os_type unix + + +all + + + +osf1 + diff --git a/src/libs/3rdparty/botan/src/build-data/os/windows.txt b/src/libs/3rdparty/botan/src/build-data/os/windows.txt new file mode 100644 index 00000000000..a04d609b8cb --- /dev/null +++ b/src/libs/3rdparty/botan/src/build-data/os/windows.txt @@ -0,0 +1,26 @@ +realname "MS Windows" + +os_type windows + +obj_suffix obj +so_suffix dll +static_suffix lib + +install_root c:\Botan +doc_dir docs + +install_cmd_data "copy" +install_cmd_exec "copy" + + +win32_virtual_lock + + + +msvc + + + +win32 +MSWin32 + diff --git a/src/libs/3rdparty/botan/src/cert/cvc/asn1_eac_str.cpp b/src/libs/3rdparty/botan/src/cert/cvc/asn1_eac_str.cpp new file mode 100644 index 00000000000..a306ffb0120 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/asn1_eac_str.cpp @@ -0,0 +1,130 @@ +/* +* Simple ASN.1 String Types +* (C) 2007 FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Create an ASN1_EAC_String +*/ +ASN1_EAC_String::ASN1_EAC_String(const std::string& str, ASN1_Tag t) : tag(t) + { + iso_8859_str = Charset::transcode(str, LOCAL_CHARSET, LATIN1_CHARSET); + if (!sanity_check()) + { + throw Invalid_Argument("attempted to construct ASN1_EAC_String with illegal characters"); + } + } + +/* +* Return this string in ISO 8859-1 encoding +*/ +std::string ASN1_EAC_String::iso_8859() const + { + return iso_8859_str; + } + +/* +* Return this string in local encoding +*/ +std::string ASN1_EAC_String::value() const + { + return Charset::transcode(iso_8859_str, LATIN1_CHARSET, LOCAL_CHARSET); + } + +/* +* Return the type of this string object +*/ +ASN1_Tag ASN1_EAC_String::tagging() const + { + return tag; + } + +/* +* DER encode an ASN1_EAC_String +*/ +void ASN1_EAC_String::encode_into(DER_Encoder& encoder) const + { + std::string value = iso_8859(); + encoder.add_object(tagging(), APPLICATION, value); + } + +/* +* Decode a BER encoded ASN1_EAC_String +*/ +void ASN1_EAC_String::decode_from(BER_Decoder& source) + { + BER_Object obj = source.get_next_object(); + if (obj.type_tag != this->tag) + { + + std::string message("decoding type mismatch for ASN1_EAC_String, tag is "); + std::stringstream ss; + std::string str_is; + ss << std::hex << obj.type_tag; + ss >> str_is; + message.append(str_is); + message.append(", while it should be "); + std::stringstream ss2; + std::string str_should; + ss2 << std::hex << this->tag; + ss2 >> str_should; + message.append(str_should); + throw Decoding_Error(message); + } + Character_Set charset_is; + charset_is = LATIN1_CHARSET; + + try + { + *this = ASN1_EAC_String( + Charset::transcode(ASN1::to_string(obj), charset_is, LOCAL_CHARSET), + obj.type_tag); + } + catch (Invalid_Argument inv_arg) + { + throw Decoding_Error(std::string("error while decoding ASN1_EAC_String: ") + std::string(inv_arg.what())); + } + } + +// checks for compliance to the alphabet defined in TR-03110 v1.10, 2007-08-20 +// p. 43 +bool ASN1_EAC_String::sanity_check() const + { + const byte* rep = reinterpret_cast(iso_8859_str.data()); + const u32bit rep_len = iso_8859_str.size(); + for (u32bit i=0; i= 0x7F) && (rep[i] < 0xA0))) + { + return false; + } + } + return true; + } + +bool operator==(const ASN1_EAC_String& lhs, const ASN1_EAC_String& rhs) + { + return (lhs.iso_8859() == rhs.iso_8859()); + } + +ASN1_Car::ASN1_Car(std::string const& str) + : ASN1_EAC_String(str, ASN1_Tag(2)) + {} + +ASN1_Chr::ASN1_Chr(std::string const& str) + : ASN1_EAC_String(str, ASN1_Tag(32)) + {} + +} diff --git a/src/libs/3rdparty/botan/src/cert/cvc/asn1_eac_tm.cpp b/src/libs/3rdparty/botan/src/cert/cvc/asn1_eac_tm.cpp new file mode 100644 index 00000000000..05533b52021 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/asn1_eac_tm.cpp @@ -0,0 +1,361 @@ +/* +* EAC Time Types +* (C) 2007 FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Convert a time_t to a struct tm +*/ +std::tm get_tm(u64bit timer) + { + std::time_t time_val = static_cast(timer); + + std::tm* tm_p = std::gmtime(&time_val); + if (tm_p == 0) + throw Encoding_Error("EAC_Time: gmtime could not encode " + + to_string(timer)); + return (*tm_p); + } +SecureVector enc_two_digit(u32bit in) + { + SecureVector result; + in %= 100; + if (in < 10) + { + result.append(0x00); + } + else + { + u32bit y_first_pos = (in - (in%10))/10; + result.append(static_cast(y_first_pos)); + } + u32bit y_sec_pos = in%10; + result.append(static_cast(y_sec_pos)); + return result; + } +u32bit dec_two_digit(byte b1, byte b2) + { + u32bit upper = (u32bit)b1; + u32bit lower = (u32bit)b2; + if (upper > 9 || lower > 9) + { + throw Invalid_Argument("u32bit dec_two_digit(byte b1, byte b2): value too large"); + } + return upper*10 + lower; + + } +} + +/* +* Create an EAC_Time +*/ +EAC_Time::EAC_Time(u64bit timer, ASN1_Tag t) + :tag(t) + { + std::tm time_info = get_tm(timer); + + year = time_info.tm_year + 1900; + month = time_info.tm_mon + 1; + day = time_info.tm_mday; + + } + +/* +* Create an EAC_Time +*/ +EAC_Time::EAC_Time(const std::string& t_spec, ASN1_Tag t) + :tag(t) + { + set_to(t_spec); + } +/* +* Create an EAC_Time +*/ +EAC_Time::EAC_Time(u32bit y, u32bit m, u32bit d, ASN1_Tag t) + : year(y), + month(m), + day(d), + tag(t) + { + } + +/* +* Set the time with a human readable string +*/ +void EAC_Time::set_to(const std::string& time_str) + { + if (time_str == "") + { + year = month = day = 0; + return; + } + + std::vector params; + std::string current; + + for (u32bit j = 0; j != time_str.size(); ++j) + { + if (Charset::is_digit(time_str[j])) + current += time_str[j]; + else + { + if (current != "") + params.push_back(current); + current.clear(); + } + } + if (current != "") + params.push_back(current); + + if (params.size() != 3) + throw Invalid_Argument("Invalid time specification " + time_str); + + year = to_u32bit(params[0]); + month = to_u32bit(params[1]); + day = to_u32bit(params[2]); + + if (!passes_sanity_check()) + throw Invalid_Argument("Invalid time specification " + time_str); + } + + +/* +* DER encode a EAC_Time +*/ +void EAC_Time::encode_into(DER_Encoder& der) const + { + der.add_object(tag, APPLICATION, + encoded_eac_time()); + } + +/* +* Return a string representation of the time +*/ +std::string EAC_Time::as_string() const + { + if (time_is_set() == false) + throw Invalid_State("EAC_Time::as_string: No time set"); + + std::string asn1rep; + asn1rep = to_string(year, 2); + + asn1rep += to_string(month, 2) + to_string(day, 2); + + return asn1rep; + } + +/* +* Return if the time has been set somehow +*/ +bool EAC_Time::time_is_set() const + { + return (year != 0); + } + +/* +* Return a human readable string representation +*/ +std::string EAC_Time::readable_string() const + { + if (time_is_set() == false) + throw Invalid_State("EAC_Time::readable_string: No time set"); + + std::string readable; + readable += to_string(year, 2) + "/"; + readable += to_string(month, 2) + "/"; + readable += to_string(day, 2) + " "; + + return readable; + } + +/* +* Do a general sanity check on the time +*/ +bool EAC_Time::passes_sanity_check() const + { + if (year < 2000 || year > 2099) + return false; + if (month == 0 || month > 12) + return false; + if (day == 0 || day > 31) + return false; + + return true; + } + +/****************************************** +* modification functions +******************************************/ + +void EAC_Time::add_years(u32bit years) + { + year += years; + } +void EAC_Time::add_months(u32bit months) + { + year += months/12; + month += months % 12; + if(month > 12) + { + year += 1; + month -= 12; + } + } + + +/* +* Compare this time against another +*/ +s32bit EAC_Time::cmp(const EAC_Time& other) const + { + if (time_is_set() == false) + throw Invalid_State("EAC_Time::cmp: No time set"); + + const s32bit EARLIER = -1, LATER = 1, SAME_TIME = 0; + + if (year < other.year) return EARLIER; + if (year > other.year) return LATER; + if (month < other.month) return EARLIER; + if (month > other.month) return LATER; + if (day < other.day) return EARLIER; + if (day > other.day) return LATER; + + return SAME_TIME; + } + +/* +* Compare two EAC_Times for in various ways +*/ +bool operator==(const EAC_Time& t1, const EAC_Time& t2) + { + return (t1.cmp(t2) == 0); + } +bool operator!=(const EAC_Time& t1, const EAC_Time& t2) + { + return (t1.cmp(t2) != 0); + } +bool operator<=(const EAC_Time& t1, const EAC_Time& t2) + { + return (t1.cmp(t2) <= 0); + } +bool operator>=(const EAC_Time& t1, const EAC_Time& t2) + { + return (t1.cmp(t2) >= 0); + } +bool operator>(const EAC_Time& t1, const EAC_Time& t2) + { + return (t1.cmp(t2) > 0); + } +bool operator<(const EAC_Time& t1, const EAC_Time& t2) + { + return (t1.cmp(t2) < 0); + } + +/* +* Decode a BER encoded EAC_Time +*/ +void EAC_Time::decode_from(BER_Decoder& source) + { + BER_Object obj = source.get_next_object(); + if (obj.type_tag != this->tag) + { + std::string message("decoding type mismatch for EAC_Time, tag is "); + std::stringstream ss; + std::string str_is; + ss << std::hex << obj.type_tag; + ss >> str_is; + message.append(str_is); + message.append(", while it should be "); + std::stringstream ss2; + std::string str_should; + ss2 << std::hex << this->tag; + ss2 >> str_should; + message.append(str_should); + throw Decoding_Error(message); + + } + if (obj.value.size() != 6) + { + throw Decoding_Error("EAC_Time decoding failed"); + } + try + { + u32bit tmp_year = dec_two_digit(obj.value[0], obj.value[1]); + u32bit tmp_mon = dec_two_digit(obj.value[2], obj.value[3]); + u32bit tmp_day = dec_two_digit(obj.value[4], obj.value[5]); + year = tmp_year + 2000; + month = tmp_mon; + day = tmp_day; + } + catch (Invalid_Argument) + { + throw Decoding_Error("EAC_Time decoding failed"); + } + + } + +u32bit EAC_Time::get_year() const + { + return year; + } +u32bit EAC_Time::get_month() const + { + return month; + } +u32bit EAC_Time::get_day() const + { + return day; + } + +/* +* make the value an octet string for encoding +*/ +SecureVector EAC_Time::encoded_eac_time() const + { + SecureVector result; + result.append(enc_two_digit(year)); + result.append(enc_two_digit(month)); + result.append(enc_two_digit(day)); + return result; + } + +ASN1_Ced::ASN1_Ced(std::string const& str) + : EAC_Time(str, ASN1_Tag(37)) + {} + +ASN1_Ced::ASN1_Ced(u64bit val) + : EAC_Time(val, ASN1_Tag(37)) + {} + +ASN1_Ced::ASN1_Ced(EAC_Time const& other) + : EAC_Time(other.get_year(), other.get_month(), other.get_day(), ASN1_Tag(37)) + {} + +ASN1_Cex::ASN1_Cex(std::string const& str) + : EAC_Time(str, ASN1_Tag(36)) + {} + +ASN1_Cex::ASN1_Cex(u64bit val) + : EAC_Time(val, ASN1_Tag(36)) + {} + +ASN1_Cex::ASN1_Cex(EAC_Time const& other) + : EAC_Time(other.get_year(), other.get_month(), other.get_day(), ASN1_Tag(36)) + {} + +} diff --git a/src/libs/3rdparty/botan/src/cert/cvc/cvc_ado.cpp b/src/libs/3rdparty/botan/src/cert/cvc/cvc_ado.cpp new file mode 100644 index 00000000000..6e1484e90b1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/cvc_ado.cpp @@ -0,0 +1,135 @@ +/* +* CVC Certificate Constructor +* (C) 2007 FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +EAC1_1_ADO::EAC1_1_ADO(std::tr1::shared_ptr in) + { + init(in); + do_decode(); + } + +EAC1_1_ADO::EAC1_1_ADO(const std::string& in) + { + std::tr1::shared_ptr stream(new DataSource_Stream(in, true)); + init(stream); + do_decode(); + } + +void EAC1_1_ADO::force_decode() + { + SecureVector inner_cert; + BER_Decoder(tbs_bits) + .start_cons(ASN1_Tag(33)) + .raw_bytes(inner_cert) + .end_cons() + .decode(m_car) + .verify_end(); + + SecureVector req_bits = DER_Encoder() + .start_cons(ASN1_Tag(33), APPLICATION) + .raw_bytes(inner_cert) + .end_cons() + .get_contents(); + + std::tr1::shared_ptr req_source(new DataSource_Memory(req_bits)); + m_req = EAC1_1_Req(req_source); + sig_algo = m_req.sig_algo; + } + +MemoryVector EAC1_1_ADO::make_signed( + std::auto_ptr signer, + const MemoryRegion& tbs_bits, + RandomNumberGenerator& rng) + { + SecureVector concat_sig = + EAC1_1_obj::make_signature(signer.get(), tbs_bits, rng); + assert(concat_sig.size() % 2 == 0); + MemoryVector result = DER_Encoder() + .start_cons(ASN1_Tag(7), APPLICATION) + .raw_bytes(tbs_bits) + .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) + .end_cons() + .get_contents(); + return result; + } + +ASN1_Car EAC1_1_ADO::get_car() const + { + return m_car; + } + +void EAC1_1_ADO::decode_info(SharedPtrConverter source, + SecureVector & res_tbs_bits, + ECDSA_Signature & res_sig) + { + SecureVector concat_sig; + SecureVector cert_inner_bits; + ASN1_Car car; + BER_Decoder(*source.get_ptr().get()) + .start_cons(ASN1_Tag(7)) + .start_cons(ASN1_Tag(33)) + .raw_bytes(cert_inner_bits) + .end_cons() + .decode(car) + .decode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) + .end_cons(); + + SecureVector enc_cert = DER_Encoder() + .start_cons(ASN1_Tag(33), APPLICATION) + .raw_bytes(cert_inner_bits) + .end_cons() + .get_contents(); + SecureVector enc_car = DER_Encoder() + .encode(car) + .get_contents(); + res_tbs_bits = enc_cert; + res_tbs_bits.append(enc_car); + res_sig = decode_concatenation(concat_sig); + + + } +void EAC1_1_ADO::encode(Pipe& out, X509_Encoding encoding) const + { + SecureVector concat_sig(EAC1_1_obj::m_sig.get_concatenation()); + SecureVector der = DER_Encoder() + .start_cons(ASN1_Tag(7), APPLICATION) + .raw_bytes(tbs_bits) + .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) + .end_cons() + .get_contents(); + if(encoding == PEM) + throw Invalid_Argument("EAC1_1_ADO::encode() cannot PEM encode an EAC object"); + else + out.write(der); + } + +SecureVector EAC1_1_ADO::tbs_data() const + { + return tbs_bits; + } + +bool EAC1_1_ADO::operator==(EAC1_1_ADO const& rhs) const + { + assert(((this->m_req == rhs.m_req) && (this->tbs_data() == rhs.tbs_data())) || + ((this->m_req != rhs.m_req) && (this->tbs_data() != rhs.tbs_data()))); + return (this->get_concat_sig() == rhs.get_concat_sig() + && this->tbs_data() == rhs.tbs_data() + && this->get_car() == rhs.get_car()); + } + +EAC1_1_Req EAC1_1_ADO::get_request() const + { + return m_req; + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/cvc/cvc_ado.h b/src/libs/3rdparty/botan/src/cert/cvc/cvc_ado.h new file mode 100644 index 00000000000..2c4f3ce7006 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/cvc_ado.h @@ -0,0 +1,101 @@ +/* +* EAC1_1 CVC ADO +* (C) 2008 Falko Strenzke +* strenzke@flexsecure.de +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EAC_CVC_ADO_H__ +#define BOTAN_EAC_CVC_ADO_H__ + +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents a TR03110 (EAC) v1.1 CVC ADO request +*/ + + // CRTP continuation from EAC1_1_obj +class BOTAN_DLL EAC1_1_ADO : public EAC1_1_obj + { + public: + friend class EAC1_1_obj; + + /** + * Construct a CVC ADO request from a DER encoded CVC ADO request file. + * @param str the path to the DER encoded file + */ + EAC1_1_ADO(const std::string& str); + + /** + * Construct a CVC ADO request from a data source + * @param source the data source + */ + EAC1_1_ADO(std::tr1::shared_ptr source); + + /** + * Create a signed CVC ADO request from to be signed (TBS) data + * @param signer the signer used to sign the CVC ADO request + * @param tbs_bits the TBS data to sign + */ + static MemoryVector make_signed( + std::auto_ptr signer, + const MemoryRegion& tbs_bits, + RandomNumberGenerator& rng); + + /** + * Get the CAR of this CVC ADO request + * @result the CAR of this CVC ADO request + */ + ASN1_Car get_car() const; + + /** + * Get the CVC request contained in this object. + * @result the CVC request inside this CVC ADO request + */ + EAC1_1_Req get_request() const; + + /** + * Encode this object into a pipe. Only DER is supported. + * @param out the pipe to encode this object into + * @param encoding the encoding type to use, must be DER + */ + void encode(Pipe& out, X509_Encoding encoding) const; + + bool operator==(EAC1_1_ADO const& rhs) const; + + /** + * Get the TBS data of this CVC ADO request. + * @result the TBS data + */ + SecureVector tbs_data() const; + + virtual ~EAC1_1_ADO() {} + private: + ASN1_Car m_car; + EAC1_1_Req m_req; + + void force_decode(); + static void decode_info(SharedPtrConverter source, + SecureVector & res_tbs_bits, + ECDSA_Signature & res_sig); + }; + +inline bool operator!=(EAC1_1_ADO const& lhs, EAC1_1_ADO const& rhs) + { + return (!(lhs == rhs)); + } + +} + +#endif + + diff --git a/src/libs/3rdparty/botan/src/cert/cvc/cvc_ca.cpp b/src/libs/3rdparty/botan/src/cert/cvc/cvc_ca.cpp new file mode 100644 index 00000000000..638d3f984cf --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/cvc_ca.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include +namespace Botan { + +EAC1_1_CVC EAC1_1_CVC_CA::make_cert(std::auto_ptr signer, + MemoryRegion const& public_key, + ASN1_Car const& car, + ASN1_Chr const& chr, + byte holder_auth_templ, + ASN1_Ced ced, + ASN1_Cex cex, + RandomNumberGenerator& rng) + { + OID chat_oid(OIDS::lookup("CertificateHolderAuthorizationTemplate")); + MemoryVector enc_chat_val; + enc_chat_val.append(holder_auth_templ); + + MemoryVector enc_cpi; + enc_cpi.append(0x00); + MemoryVector tbs = DER_Encoder() + .encode(enc_cpi, OCTET_STRING, ASN1_Tag(41), APPLICATION) // cpi + .encode(car) + .raw_bytes(public_key) + .encode(chr) + .start_cons(ASN1_Tag(76), APPLICATION) + .encode(chat_oid) + .encode(enc_chat_val, OCTET_STRING, ASN1_Tag(19), APPLICATION) + .end_cons() + .encode(ced) + .encode(cex) + .get_contents(); + + MemoryVector signed_cert = + EAC1_1_CVC::make_signed(signer, + EAC1_1_CVC::build_cert_body(tbs), + rng); + + std::tr1::shared_ptr source(new DataSource_Memory(signed_cert)); + + return EAC1_1_CVC(source); + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/cvc/cvc_ca.h b/src/libs/3rdparty/botan/src/cert/cvc/cvc_ca.h new file mode 100644 index 00000000000..3ec307bb302 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/cvc_ca.h @@ -0,0 +1,51 @@ +/* +* EAC1.1 CVC Certificate Authority +* (C) 2007 FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CVC_CA_H__ +#define BOTAN_CVC_CA_H__ + +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents a CVC CA. +*/ +class BOTAN_DLL EAC1_1_CVC_CA + { + public: + + /** + * Create an arbitrary EAC 1.1 CVC. + * The desired key encoding must be set within the key (if applicable). + * @param signer the signer used to sign the certificate + * @param public_key the DER encoded public key to appear in + * the certificate + * @param car the CAR of the certificate + * @param chr the CHR of the certificate + * @param holder_auth_templ the holder authorization value byte to + * appear in the CHAT of the certificate + * @param ced the CED to appear in the certificate + * @param ced the CEX to appear in the certificate + */ + static EAC1_1_CVC make_cert(std::auto_ptr signer, + MemoryRegion const& public_key, + ASN1_Car const& car, + ASN1_Chr const& chr, + byte holder_auth_templ, + ASN1_Ced ced, + ASN1_Cex cex, + RandomNumberGenerator& rng); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/cvc/cvc_cert.cpp b/src/libs/3rdparty/botan/src/cert/cvc/cvc_cert.cpp new file mode 100644 index 00000000000..d2be12df8ea --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/cvc_cert.cpp @@ -0,0 +1,102 @@ +/* + (C) 2007 FlexSecure GmbH + 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +ASN1_Car EAC1_1_CVC::get_car() const + { + return m_car; + } + +ASN1_Ced EAC1_1_CVC::get_ced() const + { + return m_ced; + } +ASN1_Cex EAC1_1_CVC::get_cex() const + { + return m_cex; + } +u32bit EAC1_1_CVC::get_chat_value() const + { + return m_chat_val; + } + +/* +* Decode the TBSCertificate data +*/ +void EAC1_1_CVC::force_decode() + { + SecureVector enc_pk; + SecureVector enc_chat_val; + u32bit cpi; + BER_Decoder tbs_cert(tbs_bits); + tbs_cert.decode(cpi, ASN1_Tag(41), APPLICATION) + .decode(m_car) + .start_cons(ASN1_Tag(73)) + .raw_bytes(enc_pk) + .end_cons() + .decode(m_chr) + .start_cons(ASN1_Tag(76)) + .decode(m_chat_oid) + .decode(enc_chat_val, OCTET_STRING, ASN1_Tag(19), APPLICATION) + .end_cons() + .decode(m_ced) + .decode(m_cex) + .verify_end(); + + if(enc_chat_val.size() != 1) + throw Decoding_Error("CertificateHolderAuthorizationValue was not of length 1"); + + if(cpi != 0) + throw Decoding_Error("EAC1_1 certificateΒ΄s cpi was not 0"); + + // FIXME: PK algos have no notion of EAC encoder/decoder currently +#if 0 + ECDSA_PublicKey tmp_pk; + std::auto_ptr dec = tmp_pk.cvc_eac1_1_decoder(); + sig_algo = dec->public_key(enc_pk); + + + m_pk = tmp_pk; + m_chat_val = enc_chat_val[0]; + self_signed = false; + if(m_car.iso_8859() == m_chr.iso_8859()) + { + self_signed= true; + } +#endif + } + +/* +* CVC Certificate Constructor +*/ +EAC1_1_CVC::EAC1_1_CVC(std::tr1::shared_ptr& in) + { + init(in); + self_signed = false; + do_decode(); + } + +EAC1_1_CVC::EAC1_1_CVC(const std::string& in) + { + std::tr1::shared_ptr stream(new DataSource_Stream(in, true)); + init(stream); + self_signed = false; + do_decode(); + } + +bool EAC1_1_CVC::operator==(EAC1_1_CVC const& rhs) const + { + return (tbs_data() == rhs.tbs_data() + && get_concat_sig() == rhs.get_concat_sig()); + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/cvc/cvc_cert.h b/src/libs/3rdparty/botan/src/cert/cvc/cvc_cert.h new file mode 100644 index 00000000000..17671d33277 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/cvc_cert.h @@ -0,0 +1,94 @@ +/* +* EAC1_1 CVC +* (C) 2008 Falko Strenzke +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CVC_EAC_H__ +#define BOTAN_CVC_EAC_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents TR03110 (EAC) v1.1 CV Certificates +*/ +class BOTAN_DLL EAC1_1_CVC : public EAC1_1_gen_CVC//Signed_Object + { + public: + friend class EAC1_1_obj; + + /** + * Get the CAR of the certificate. + * @result the CAR of the certificate + */ + ASN1_Car get_car() const; + + /** + * Get the CED of this certificate. + * @result the CED this certificate + */ + ASN1_Ced get_ced() const; + + /** + * Get the CEX of this certificate. + * @result the CEX this certificate + */ + ASN1_Cex get_cex() const; + + /** + * Get the CHAT value. + * @result the CHAT value + */ + u32bit get_chat_value() const; + + bool operator==(const EAC1_1_CVC&) const; + + /** + * Construct a CVC from a data source + * @param source the data source + */ + EAC1_1_CVC(std::tr1::shared_ptr& source); + + /** + * Construct a CVC from a file + * @param str the path to the certificate file + */ + EAC1_1_CVC(const std::string& str); + + virtual ~EAC1_1_CVC() {} + private: + void force_decode(); + friend class EAC1_1_CVC_CA; + EAC1_1_CVC() {} + + ASN1_Car m_car; + ASN1_Ced m_ced; + ASN1_Cex m_cex; + byte m_chat_val; + OID m_chat_oid; + }; + +/* +* Comparison +*/ +inline bool operator!=(EAC1_1_CVC const& lhs, EAC1_1_CVC const& rhs) + { + return !(lhs == rhs); + } + +} + +#endif + diff --git a/src/libs/3rdparty/botan/src/cert/cvc/cvc_gen_cert.h b/src/libs/3rdparty/botan/src/cert/cvc/cvc_gen_cert.h new file mode 100644 index 00000000000..4a788026ccc --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/cvc_gen_cert.h @@ -0,0 +1,177 @@ +/* +* EAC1_1 general CVC +* (C) 2008 Falko Strenzke +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EAC_CVC_GEN_CERT_H__ +#define BOTAN_EAC_CVC_GEN_CERT_H__ + +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents TR03110 (EAC) v1.1 generalized CV Certificates +*/ +template +class BOTAN_DLL EAC1_1_gen_CVC : public EAC1_1_obj // CRTP continuation from EAC1_1_obj + { + friend class EAC1_1_obj; + + public: + + /** + * Get this certificates public key. + * @result this certificates public key + */ + std::auto_ptr subject_public_key() const; + + /** + * Find out whether this object is self signed. + * @result true if this object is self signed + */ + bool is_self_signed() const; + + /** + * Get the CHR of the certificate. + * @result the CHR of the certificate + */ + ASN1_Chr get_chr() const; + + /** + * Put the DER encoded version of this object into a pipe. PEM + * is not supported. + * @param out the pipe to push the DER encoded version into + * @param encoding the encoding to use. Must be DER. + */ + void encode(Pipe& out, X509_Encoding encoding) const; + + /** + * Get the to-be-signed (TBS) data of this object. + * @result the TBS data of this object + */ + SecureVector tbs_data() const; + + /** + * Build the DER encoded certifcate body of an object + * @param tbs the data to be signed + * @result the correctly encoded body of the object + */ + static SecureVector build_cert_body(MemoryRegion const& tbs); + + /** + * Create a signed generalized CVC object. + * @param signer the signer used to sign this object + * @param tbs_bits the body the generalized CVC object to be signed + * @result the DER encoded signed generalized CVC object + */ + static MemoryVector make_signed( + std::auto_ptr signer, + const MemoryRegion& tbs_bits, + RandomNumberGenerator& rng); + virtual ~EAC1_1_gen_CVC() + {} + + protected: + ECDSA_PublicKey m_pk; // public key + ASN1_Chr m_chr; + bool self_signed; + + static void decode_info(SharedPtrConverter source, + SecureVector & res_tbs_bits, + ECDSA_Signature & res_sig); + + }; + +template ASN1_Chr EAC1_1_gen_CVC::get_chr() const + { + return m_chr; + } + +template bool EAC1_1_gen_CVC::is_self_signed() const + { + return self_signed; + } + +template MemoryVector EAC1_1_gen_CVC::make_signed( + std::auto_ptr signer, + const MemoryRegion& tbs_bits, + RandomNumberGenerator& rng) // static + { + SecureVector concat_sig = EAC1_1_obj::make_signature(signer.get(), tbs_bits, rng); + assert(concat_sig.size() % 2 == 0); + return DER_Encoder() + .start_cons(ASN1_Tag(33), APPLICATION) + .raw_bytes(tbs_bits) + .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) + .end_cons() + .get_contents(); + } + +template std::auto_ptr EAC1_1_gen_CVC::subject_public_key() const + { + return std::auto_ptr(new ECDSA_PublicKey(m_pk)); + } + +template SecureVector EAC1_1_gen_CVC::build_cert_body(MemoryRegion const& tbs) + { + return DER_Encoder() + .start_cons(ASN1_Tag(78), APPLICATION) + .raw_bytes(tbs) + .end_cons().get_contents(); + } + +template SecureVector EAC1_1_gen_CVC::tbs_data() const + { + return build_cert_body(EAC1_1_obj::tbs_bits); + } + +template void EAC1_1_gen_CVC::encode(Pipe& out, X509_Encoding encoding) const + { + SecureVector concat_sig(EAC1_1_obj::m_sig.get_concatenation()); + SecureVector der = DER_Encoder() + .start_cons(ASN1_Tag(33), APPLICATION) + .start_cons(ASN1_Tag(78), APPLICATION) + .raw_bytes(EAC1_1_obj::tbs_bits) + .end_cons() + .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) + .end_cons() + .get_contents(); + + if (encoding == PEM) + throw Invalid_Argument("EAC1_1_gen_CVC::encode() cannot PEM encode an EAC object"); + else + out.write(der); + } + +template +void EAC1_1_gen_CVC::decode_info( + SharedPtrConverter source, + SecureVector & res_tbs_bits, + ECDSA_Signature & res_sig) + { + SecureVector concat_sig; + BER_Decoder(*source.get_shared().get()) + .start_cons(ASN1_Tag(33)) + .start_cons(ASN1_Tag(78)) + .raw_bytes(res_tbs_bits) + .end_cons() + .decode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) + .end_cons(); + res_sig = decode_concatenation(concat_sig); + } + +} + +#endif + + diff --git a/src/libs/3rdparty/botan/src/cert/cvc/cvc_key.h b/src/libs/3rdparty/botan/src/cert/cvc/cvc_key.h new file mode 100644 index 00000000000..67b6cef1760 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/cvc_key.h @@ -0,0 +1,54 @@ +/* +* EAC CVC Public Key +* (C) 2008 FlexSecure Gmbh +* Falko Strenzke +* strenzke@flexsecure.de +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EAC1_1_CVC_PUBLIC_KEY_H__ +#define BOTAN_EAC1_1_CVC_PUBLIC_KEY_H__ + +#include +#include +#include + +namespace Botan { + +/** +* This class represents EAC 1.1 CVC public key encoders. +*/ +class BOTAN_DLL EAC1_1_CVC_Encoder + { + public: + /** + * Get the DER encoded CVC public key. + * @param alg_id the algorithm identifier to use in the encoding + * @return the DER encoded public key + */ + virtual MemoryVector + public_key(const AlgorithmIdentifier& enc) const = 0; + + virtual ~EAC1_1_CVC_Encoder() {} + }; + +/** +* This class represents EAC 1.1 CVC public key decoders. +*/ +class BOTAN_DLL EAC1_1_CVC_Decoder + { + public: + /** + * Decode a CVC public key. + * @param enc the DER encoded public key to decode + * @return the algorithm identifier found in the encoded public key + */ + virtual AlgorithmIdentifier const + public_key(const MemoryRegion& enc) = 0; + + virtual ~EAC1_1_CVC_Decoder() {} + }; +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/cvc/cvc_req.cpp b/src/libs/3rdparty/botan/src/cert/cvc/cvc_req.cpp new file mode 100644 index 00000000000..70a44bacd79 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/cvc_req.cpp @@ -0,0 +1,68 @@ +/* + (C) 2007 FlexSecure GmbH + 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +bool EAC1_1_Req::operator==(EAC1_1_Req const& rhs) const + { + return (this->tbs_data() == rhs.tbs_data() + && this->get_concat_sig() == rhs.get_concat_sig()); + } + +void EAC1_1_Req::force_decode() + { + SecureVector enc_pk; + BER_Decoder tbs_cert(tbs_bits); + u32bit cpi; + tbs_cert.decode(cpi, ASN1_Tag(41), APPLICATION) + .start_cons(ASN1_Tag(73)) + .raw_bytes(enc_pk) + .end_cons() + .decode(m_chr) + .verify_end(); + if(cpi != 0) + { + throw Decoding_Error("EAC1_1 requestΒ΄s cpi was not 0"); + } + + // FIXME: No EAC support in ECDSA +#if 0 + ECDSA_PublicKey tmp_pk; + std::auto_ptr dec = tmp_pk.cvc_eac1_1_decoder(); + sig_algo = dec->public_key(enc_pk); + m_pk = tmp_pk; +#endif + } + +EAC1_1_Req::EAC1_1_Req(std::tr1::shared_ptr in) + { + init(in); + self_signed = true; + do_decode(); + } + +EAC1_1_Req::EAC1_1_Req(const std::string& in) + { + std::tr1::shared_ptr stream(new DataSource_Stream(in, true)); + init(stream); + self_signed = true; + do_decode(); + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/cvc/cvc_req.h b/src/libs/3rdparty/botan/src/cert/cvc/cvc_req.h new file mode 100644 index 00000000000..8599f539d32 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/cvc_req.h @@ -0,0 +1,63 @@ +/* +* EAC1_1 CVC Request +* (C) 2008 Falko Strenzke +* strenzke@flexsecure.de +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EAC_CVC_REQ_H__ +#define BOTAN_EAC_CVC_REQ_H__ + +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents TR03110 v1.1 EAC CV Certificate Requests. +*/ +class BOTAN_DLL EAC1_1_Req : public EAC1_1_gen_CVC + { + public: + friend class EAC1_1_Req_CA; + friend class EAC1_1_ADO; + friend class EAC1_1_obj; + + /** + * Compare for equality with other + * @param other compare for equality with this object + */ + bool operator==(const EAC1_1_Req& other) const; + + /** + * Construct a CVC request from a data source. + * @param source the data source + */ + EAC1_1_Req(std::tr1::shared_ptr source); + + /** + * Construct a CVC request from a DER encoded CVC reqeust file. + * @param str the path to the DER encoded file + */ + EAC1_1_Req(const std::string& str); + + virtual ~EAC1_1_Req(){} + private: + void force_decode(); + EAC1_1_Req() {} + }; + +/* +* Comparison Operator +*/ +inline bool operator!=(EAC1_1_Req const& lhs, EAC1_1_Req const& rhs) + { + return !(lhs == rhs); + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/cvc/cvc_self.cpp b/src/libs/3rdparty/botan/src/cert/cvc/cvc_self.cpp new file mode 100644 index 00000000000..91ea387246b --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/cvc_self.cpp @@ -0,0 +1,327 @@ +/* + (C) 2007 FlexSecure GmbH + 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/******************************* +* cvc CHAT values +*******************************/ +enum CHAT_values{ + CVCA = 0xC0, + DVCA_domestic = 0x80, + DVCA_foreign = 0x40, + IS = 0x00, + + IRIS = 0x02, + FINGERPRINT = 0x01 +}; + +std::string padding_and_hash_from_oid(OID const& oid) + { + std::string padding_and_hash = OIDS::lookup(oid); // use the hash + assert(padding_and_hash.substr(0,6) == "ECDSA/"); // can only be ECDSA for now + assert(padding_and_hash.find("/",0) == 5); + padding_and_hash.erase(0, padding_and_hash.find("/",0) + 1); + return padding_and_hash; + } +std::string fixed_len_seqnr(u32bit seqnr, u32bit len) + { + std::stringstream ss; + std::string result; + ss << seqnr; + ss >> result; + if (result.size() > len) + { + throw Invalid_Argument("fixed_len_seqnr(): number too high to be encoded in provided length"); + } + while (result.size() < len) + { + result.insert(0,"0"); + } + return result; + } + +} +namespace CVC_EAC +{ + +EAC1_1_CVC create_self_signed_cert(Private_Key const& key, + EAC1_1_CVC_Options const& opt, + RandomNumberGenerator& rng) + { + // NOTE: we ignore + // the value + // of opt.chr + ECDSA_PrivateKey const* priv_key = dynamic_cast(&key); + + if (priv_key == 0) + { + throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); + } + + ASN1_Chr chr(opt.car.value()); + + AlgorithmIdentifier sig_algo; + std::string padding_and_hash(eac_cvc_emsa + "(" + opt.hash_alg + ")"); + sig_algo.oid = OIDS::lookup(priv_key->algo_name() + "/" + padding_and_hash); + sig_algo = AlgorithmIdentifier(sig_algo.oid, AlgorithmIdentifier::USE_NULL_PARAM); + + std::auto_ptr signer(get_pk_signer(*priv_key, padding_and_hash)); + +#if 0 // FIXME + std::auto_ptr enc(priv_key->cvc_eac1_1_encoder()); + MemoryVector enc_public_key = enc->public_key(sig_algo); +#else + MemoryVector enc_public_key; +#endif + + return EAC1_1_CVC_CA::make_cert(signer, enc_public_key, opt.car, chr, opt.holder_auth_templ, opt.ced, opt.cex, rng); + + } + +EAC1_1_Req create_cvc_req(Private_Key const& key, + ASN1_Chr const& chr, + std::string const& hash_alg, + RandomNumberGenerator& rng) + { + + ECDSA_PrivateKey const* priv_key = dynamic_cast(&key); + if (priv_key == 0) + { + throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); + } + AlgorithmIdentifier sig_algo; + std::string padding_and_hash(eac_cvc_emsa + "(" + hash_alg + ")"); + sig_algo.oid = OIDS::lookup(priv_key->algo_name() + "/" + padding_and_hash); + sig_algo = AlgorithmIdentifier(sig_algo.oid, AlgorithmIdentifier::USE_NULL_PARAM); + + std::auto_ptr signer(get_pk_signer(*priv_key, padding_and_hash)); + +#if 0 // FIXME + std::auto_ptr enc(priv_key->cvc_eac1_1_encoder()); + MemoryVector enc_public_key = enc->public_key(sig_algo); +#else + MemoryVector enc_public_key; +#endif + + MemoryVector enc_cpi; + enc_cpi.append(0x00); + MemoryVector tbs = DER_Encoder() + .encode(enc_cpi, OCTET_STRING, ASN1_Tag(41), APPLICATION) + .raw_bytes(enc_public_key) + .encode(chr) + .get_contents(); + + MemoryVector signed_cert = EAC1_1_gen_CVC::make_signed(signer, EAC1_1_gen_CVC::build_cert_body(tbs), rng); + std::tr1::shared_ptr source(new DataSource_Memory(signed_cert)); + return EAC1_1_Req(source); + } + +EAC1_1_ADO create_ado_req(Private_Key const& key, + EAC1_1_Req const& req, + ASN1_Car const& car, + RandomNumberGenerator& rng) + { + + ECDSA_PrivateKey const* priv_key = dynamic_cast(&key); + if (priv_key == 0) + { + throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); + } + std::string padding_and_hash = padding_and_hash_from_oid(req.signature_algorithm().oid); + std::auto_ptr signer(get_pk_signer(*priv_key, padding_and_hash)); + SecureVector tbs_bits = req.BER_encode(); + tbs_bits.append(DER_Encoder().encode(car).get_contents()); + MemoryVector signed_cert = EAC1_1_ADO::make_signed(signer, tbs_bits, rng); + std::tr1::shared_ptr source(new DataSource_Memory(signed_cert)); + return EAC1_1_ADO(source); + } + +} // namespace CVC_EAC +namespace DE_EAC +{ + +EAC1_1_CVC create_cvca(Private_Key const& key, + std::string const& hash, + ASN1_Car const& car, bool iris, bool fingerpr, + u32bit cvca_validity_months, + RandomNumberGenerator& rng) + { + ECDSA_PrivateKey const* priv_key = dynamic_cast(&key); + if (priv_key == 0) + { + throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); + } + EAC1_1_CVC_Options opts; + opts.car = car; + const u64bit current_time = system_time(); + + opts.ced = ASN1_Ced(current_time); + opts.cex = ASN1_Cex(opts.ced); + opts.cex.add_months(cvca_validity_months); + opts.holder_auth_templ = (CVCA | (iris * IRIS) | (fingerpr * FINGERPRINT)); + opts.hash_alg = hash; + return Botan::CVC_EAC::create_self_signed_cert(*priv_key, opts, rng); + } + + + +EAC1_1_CVC link_cvca(EAC1_1_CVC const& signer, + Private_Key const& key, + EAC1_1_CVC const& signee, + RandomNumberGenerator& rng) + { + ECDSA_PrivateKey const* priv_key = dynamic_cast(&key); + if (priv_key == 0) + { + throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); + } + ASN1_Ced ced(system_time()); + ASN1_Cex cex(signee.get_cex()); + if (*static_cast(&ced) > *static_cast(&cex)) + { + std::string detail("link_cvca(): validity periods of provided certificates don't overlap: currend time = ced = "); + detail += ced.as_string(); + detail += ", signee.cex = "; + detail += cex.as_string(); + throw Invalid_Argument(detail); + } + if (signer.signature_algorithm() != signee.signature_algorithm()) + { + throw Invalid_Argument("link_cvca(): signature algorithms of signer and signee donΒ΄t match"); + } + AlgorithmIdentifier sig_algo = signer.signature_algorithm(); + std::string padding_and_hash = padding_and_hash_from_oid(sig_algo.oid); + std::auto_ptr pk_signer(get_pk_signer(*priv_key, padding_and_hash)); + std::auto_ptr pk = signee.subject_public_key(); + ECDSA_PublicKey* subj_pk = dynamic_cast(pk.get()); + subj_pk->set_parameter_encoding(ENC_EXPLICIT); + +#if 0 // FIXME + std::auto_ptr enc(subj_pk->cvc_eac1_1_encoder()); + MemoryVector enc_public_key = enc->public_key(sig_algo); +#else + MemoryVector enc_public_key; +#endif + + return EAC1_1_CVC_CA::make_cert(pk_signer, enc_public_key, + signer.get_car(), + signee.get_chr(), + signer.get_chat_value(), + ced, + cex, + rng); + } + +EAC1_1_CVC sign_request(EAC1_1_CVC const& signer_cert, + Private_Key const& key, + EAC1_1_Req const& signee, + u32bit seqnr, + u32bit seqnr_len, + bool domestic, + u32bit dvca_validity_months, + u32bit ca_is_validity_months, + RandomNumberGenerator& rng) + { + ECDSA_PrivateKey const* priv_key = dynamic_cast(&key); + if (priv_key == 0) + { + throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); + } + std::string chr_str = signee.get_chr().value(); + chr_str.append(fixed_len_seqnr(seqnr, seqnr_len)); + ASN1_Chr chr(chr_str); + std::string padding_and_hash = padding_and_hash_from_oid(signee.signature_algorithm().oid); + std::auto_ptr pk_signer(get_pk_signer(*priv_key, padding_and_hash)); + std::auto_ptr pk = signee.subject_public_key(); + ECDSA_PublicKey* subj_pk = dynamic_cast(pk.get()); + std::auto_ptr signer_pk = signer_cert.subject_public_key(); + + // for the case that the domain parameters are not set... + // (we use those from the signer because they must fit) + subj_pk->set_domain_parameters(priv_key->domain_parameters()); + + subj_pk->set_parameter_encoding(ENC_IMPLICITCA); + +#if 0 // FIXME + std::auto_ptr enc(subj_pk->cvc_eac1_1_encoder()); + MemoryVector enc_public_key = enc->public_key(sig_algo); +#else + MemoryVector enc_public_key; +#endif + + AlgorithmIdentifier sig_algo(signer_cert.signature_algorithm()); + const u64bit current_time = system_time(); + ASN1_Ced ced(current_time); + u32bit chat_val; + u32bit chat_low = signer_cert.get_chat_value() & 0x3; // take the chat rights from signer + ASN1_Cex cex(ced); + if ((signer_cert.get_chat_value() & CVCA) == CVCA) + { + // we sign a dvca + cex.add_months(dvca_validity_months); + if (domestic) + { + chat_val = DVCA_domestic | chat_low; + } + else + { + chat_val = DVCA_foreign | chat_low; + } + } + else if ((signer_cert.get_chat_value() & DVCA_domestic) == DVCA_domestic || + (signer_cert.get_chat_value() & DVCA_foreign) == DVCA_foreign) + { + cex.add_months(ca_is_validity_months); + chat_val = IS | chat_low; + } + else + { + throw Invalid_Argument("sign_request(): encountered illegal value for CHAT"); + // (IS cannot sign certificates) + } + return EAC1_1_CVC_CA::make_cert(pk_signer, enc_public_key, + ASN1_Car(signer_cert.get_chr().iso_8859()), + chr, + chat_val, + ced, + cex, + rng); + } + +EAC1_1_Req create_cvc_req(Private_Key const& prkey, + ASN1_Chr const& chr, + std::string const& hash_alg, + RandomNumberGenerator& rng) + { + ECDSA_PrivateKey const* priv_key = dynamic_cast(&prkey); + if (priv_key == 0) + { + throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); + } + ECDSA_PrivateKey key(*priv_key); + key.set_parameter_encoding(ENC_IMPLICITCA); + return Botan::CVC_EAC::create_cvc_req(key, chr, hash_alg, rng); + } + +} // namespace DE_EAC + +} diff --git a/src/libs/3rdparty/botan/src/cert/cvc/cvc_self.h b/src/libs/3rdparty/botan/src/cert/cvc/cvc_self.h new file mode 100644 index 00000000000..db23547b91b --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/cvc_self.h @@ -0,0 +1,167 @@ +/* +* CVC Self-Signed Certificate +* (C) 2007 FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CVC_EAC_SELF_H__ +#define BOTAN_CVC_EAC_SELF_H__ + +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents a set of options used for the creation of CVC certificates +*/ +class BOTAN_DLL EAC1_1_CVC_Options + { + public: + + ASN1_Car car; + ASN1_Chr chr; + byte holder_auth_templ; + ASN1_Ced ced; + ASN1_Cex cex; + std::string hash_alg; + }; + +/** +* This namespace represents general EAC 1.1 convenience functions. +*/ +namespace CVC_EAC { + +/** +* Create a selfsigned CVCA +* @param rng the rng to use +* @param key the ECDSA private key to be used to sign the certificate +* @param opts used to set several parameters. Necessary are: +* car, holder_auth_templ, hash_alg, ced, cex and hash_alg +* @result the self signed certificate +*/ + +EAC1_1_CVC create_self_signed_cert(Private_Key const& key, + EAC1_1_CVC_Options const& opts, + RandomNumberGenerator& rng); +/** +* Create a CVC request. The key encoding will be according to the provided private key. +* @param priv_key the private key associated with the requesting entity +* @param chr the chr to appear in the certificate (to be provided without +* sequence number) +* @param hash_alg the string defining the hash algorithm to be used for the creation +* of the signature +* @param rng the rng to use +* @result the new request +*/ +EAC1_1_Req create_cvc_req(Private_Key const& priv_key, + ASN1_Chr const& chr, + std::string const& hash_alg, + RandomNumberGenerator& rng); + +/** +* Create an ADO from a request object. +* @param priv_key the private key used to sign the ADO +* @param req the request forming the body of the ADO +* @param car the CAR forming the body of the ADO, i.e. the +* CHR of the entity associated with the provided private key +* @param rng the rng to use +*/ +EAC1_1_ADO create_ado_req(Private_Key const& priv_key, + EAC1_1_Req const& req, + ASN1_Car const& car, + RandomNumberGenerator& rng); +} +/** +* This namespace represents EAC 1.1 CVC convenience functions following the specific german +* requirements. +*/ +namespace DE_EAC { + +/** +* Create a CVCA certificate. +* @param priv_key the private key associated with the CVCA certificate +* to be created +* @param hash the string identifying the hash algorithm to be used +* for signing the certificate to be created +* @param car the CAR of the certificate to be created +* @param iris indicates whether the entity associated with the certificate +* shall be entitled to read the biometrical iris image +* @param fingerpr indicates whether the entity associated with the certificate +* shall be entitled to read the biometrical fingerprint image +* @param rng the rng to use +* @result the CVCA certificate created +*/ +EAC1_1_CVC create_cvca(Private_Key const& priv_key, + std::string const& hash, + ASN1_Car const& car, + bool iris, + bool fingerpr, + u32bit cvca_validity_months, + RandomNumberGenerator& rng); + +/** +* Create a link certificate between two CVCA certificates. The key +* encoding will be implicitCA. +* @param signer the cvca certificate associated with the signing +* entity +* @param priv_key the private key associated with the signer +* @param to_be_signed the certificate which whose CAR/CHR will be +* the holder of the link certificate +* @param rng a random number generator +*/ +EAC1_1_CVC link_cvca(EAC1_1_CVC const& signer, + Private_Key const& priv_key, + EAC1_1_CVC const& to_be_signed, + RandomNumberGenerator& rng); + +/** +* Create a CVC request. The key encoding will be implicitCA. +* @param priv_key the private key associated with the requesting entity +* @param chr the chr to appear in the certificate (to be provided without +* sequence number) +* @param hash_alg the string defining the hash algorithm to be used for the creation +* of the signature +* @param rng a random number generator +* @result the new request +*/ +EAC1_1_Req create_cvc_req(Private_Key const& priv_key, + ASN1_Chr const& chr, + std::string const& hash_alg, + RandomNumberGenerator& rng); + +/** +* Sign a CVC request. +* @param signer_cert the certificate of the signing entity +* @param priv_key the private key of the signing entity +* @param req the request to be signed +* @param seqnr the sequence number of the certificate to be created +* @param seqnr_len the number of digits the sequence number will be +* encoded in +* @param domestic indicates whether to sign a domestic or a foreign certificate: +* set to true for domestic +* @param rng a random number generator +* @result the new certificate +* +**/ +EAC1_1_CVC sign_request(EAC1_1_CVC const& signer_cert, + Private_Key const& priv_key, + EAC1_1_Req const& req, + u32bit seqnr, + u32bit seqnr_len, + bool domestic, + u32bit dvca_validity_months, + u32bit ca_is_validity_months, + RandomNumberGenerator& rng); +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/cvc/eac_asn_obj.h b/src/libs/3rdparty/botan/src/cert/cvc/eac_asn_obj.h new file mode 100644 index 00000000000..3e70f6b7434 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/eac_asn_obj.h @@ -0,0 +1,244 @@ +/* +* EAC ASN.1 Objects +* (C) 2007-2008 FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EAC_ASN1_OBJ_H__ +#define BOTAN_EAC_ASN1_OBJ_H__ + +#include +#include +#include + +namespace Botan { + +/** +* This class represents CVC EAC Time objects. +* It only models year, month and day. Only limited sanity checks of +* the inputted date value are performed. +*/ +class BOTAN_DLL EAC_Time : public ASN1_Object + { + public: + void encode_into(class DER_Encoder&) const; + void decode_from(class BER_Decoder&); + + /** + * Get a this objects value as a string. + * @return the date string + */ + std::string as_string() const; + + /** + * Get a this objects value as a readable formatted string. + * @return the date string + */ + std::string readable_string() const; + + /** + * Find out whether this object's values have been set. + * @return true if this object's internal values are set + */ + bool time_is_set() const; + + /** + * Compare this to another EAC_Time object. + * @return -1 if this object's date is earlier than + * other, +1 in the opposite case, and 0 if both dates are + * equal. + */ + s32bit cmp(const EAC_Time& other) const; + + /** + * Set this' value by a string value. + * @param str a string in the format "yyyy mm dd", + * e.g. "2007 08 01" + */ + void set_to(const std::string& str); + //void set_to(const std::string&, ASN1_Tag); + + /** + * Add the specified number of years to this. + * @param years the number of years to add + */ + void add_years(u32bit years); + + /** + * Add the specified number of months to this. + * @param months the number of months to add + */ + void add_months(u32bit months); + + /** + * Get the year value of this objects. + * @return the year value + */ + u32bit get_year() const; + + /** + * Get the month value of this objects. + * @return the month value + */ + u32bit get_month() const; + + /** + * Get the day value of this objects. + * @return the day value + */ + u32bit get_day() const; + + EAC_Time(u64bit, ASN1_Tag t = ASN1_Tag(0)); + //EAC_Time(const std::string& = ""); + EAC_Time(const std::string&, ASN1_Tag = ASN1_Tag(0)); + EAC_Time(u32bit year, u32bit month, u32bit day, ASN1_Tag = ASN1_Tag(0)); + + virtual ~EAC_Time() {} + private: + SecureVector encoded_eac_time() const; + bool passes_sanity_check() const; + u32bit year, month, day; + ASN1_Tag tag; + }; + +/** +* This class represents CVC CEDs. Only limited sanity checks of +* the inputted date value are performed. +*/ +class BOTAN_DLL ASN1_Ced : public EAC_Time + { + public: + /** + * Construct a CED from a string value. + * @param str a string in the format "yyyy mm dd", + * e.g. "2007 08 01" + */ + ASN1_Ced(std::string const& str = ""); + + /** + * Construct a CED from a timer value. + * @param time the number of seconds elapsed midnight, 1st + * January 1970 GMT (or 7pm, 31st December 1969 EST) up to the + * desired date + */ + ASN1_Ced(u64bit time); + + /** + * Copy constructor (for general EAC_Time objects). + * @param other the object to copy from + */ + ASN1_Ced(EAC_Time const& other); + //ASN1_Ced(ASN1_Cex const& cex); + }; + + +/** +* This class represents CVC CEXs. Only limited sanity checks of +* the inputted date value are performed. +*/ +class BOTAN_DLL ASN1_Cex : public EAC_Time + { + public: + /** + * Construct a CED from a string value. + * @param str a string in the format "yyyy mm dd", + * e.g. "2007 08 01" + */ + ASN1_Cex(std::string const& str=""); + + /** + * Construct a CED from a timer value. + * @param time the number of seconds elapsed + * midnight, 1st + * January 1970 GMT (or 7pm, 31st December 1969 EST) + * up to the desired date + */ + ASN1_Cex(u64bit time); + + /** + * Copy constructor (for general EAC_Time objects). + * @param other the object to copy from + */ + ASN1_Cex(EAC_Time const& other); + //ASN1_Cex(ASN1_Ced const& ced); + }; + +/** +* Base class for car/chr of cv certificates. +*/ +class BOTAN_DLL ASN1_EAC_String: public ASN1_Object + { + public: + void encode_into(class DER_Encoder&) const; + void decode_from(class BER_Decoder&); + + /** + * Get this objects string value. + * @return the string value + */ + std::string value() const; + + /** + * Get this objects string value. + * @return the string value in iso8859 encoding + */ + std::string iso_8859() const; + + ASN1_Tag tagging() const; + ASN1_EAC_String(const std::string& str, ASN1_Tag the_tag); + + virtual ~ASN1_EAC_String() {} + protected: + bool sanity_check() const; + private: + std::string iso_8859_str; + ASN1_Tag tag; + }; + +/** +* This class represents CARs of CVCs. (String tagged with 2) +*/ +class BOTAN_DLL ASN1_Car : public ASN1_EAC_String + { + public: + /** + * Create a CAR with the specified content. + * @param str the CAR value + */ + ASN1_Car(std::string const& str = ""); + }; + +/** +* This class represents CHRs of CVCs (tag 32) +*/ +class BOTAN_DLL ASN1_Chr : public ASN1_EAC_String + { + public: + /** + * Create a CHR with the specified content. + * @param str the CHR value + */ + ASN1_Chr(std::string const& str = ""); + }; + +/* +* Comparison Operations +*/ +bool operator==(const EAC_Time&, const EAC_Time&); +bool operator!=(const EAC_Time&, const EAC_Time&); +bool operator<=(const EAC_Time&, const EAC_Time&); +bool operator>=(const EAC_Time&, const EAC_Time&); +bool operator>(const EAC_Time&, const EAC_Time&); +bool operator<(const EAC_Time&, const EAC_Time&); + +bool operator==(const ASN1_EAC_String&, const ASN1_EAC_String&); +inline bool operator!=(const ASN1_EAC_String& lhs, const ASN1_EAC_String& rhs) + { + return !(lhs == rhs); + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/cvc/eac_obj.h b/src/libs/3rdparty/botan/src/cert/cvc/eac_obj.h new file mode 100644 index 00000000000..04afd7e596d --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/eac_obj.h @@ -0,0 +1,131 @@ +/* +* EAC1_1 objects +* (C) 2008 Falko Strenzke +* strenzke@flexsecure.de +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EAC_OBJ_H__ +#define BOTAN_EAC_OBJ_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +const std::string eac_cvc_emsa("EMSA1_BSI"); + +/* +* TR03110 v1.1 EAC CV Certificate +*/ +template // CRTP is used enable the call sequence: +class BOTAN_DLL EAC1_1_obj : public EAC_Signed_Object + { + // data members first: + protected: + + ECDSA_Signature m_sig; + + // member functions here: + public: + /** + * Return the signature as a concatenation of the encoded parts. + * @result the concatenated signature + */ + SecureVector get_concat_sig() const; + + /** + * Verify the signature of this objects. + * @param pub_key the public key to verify the signature with + * @result true if the verification succeeded + */ + virtual bool check_signature(Public_Key& pub_key) const; + + protected: + void init(SharedPtrConverter in); + + static SecureVector make_signature(PK_Signer* signer, + const MemoryRegion& tbs_bits, + RandomNumberGenerator& rng); + + virtual ~EAC1_1_obj(){} + + }; + +template SecureVector EAC1_1_obj::get_concat_sig() const + { + return m_sig.get_concatenation(); + } + +template SecureVector +EAC1_1_obj::make_signature(PK_Signer* signer, + const MemoryRegion& tbs_bits, + RandomNumberGenerator& rng) + { + // this is the signature as a der sequence + SecureVector seq_sig = signer->sign_message(tbs_bits, rng); + + ECDSA_Signature sig(decode_seq(seq_sig)); + SecureVector concat_sig(sig.get_concatenation()); + return concat_sig; + } + +template void EAC1_1_obj::init(SharedPtrConverter in) + { + try + { + Derived::decode_info(in.get_shared(), tbs_bits, m_sig); + } + catch(Decoding_Error) + { + throw Decoding_Error(PEM_label_pref + " decoding failed"); + } + } + +template +bool EAC1_1_obj::check_signature(Public_Key& pub_key) const + { + try + { + std::vector sig_info = + split_on(OIDS::lookup(sig_algo.oid), '/'); + + if(sig_info.size() != 2 || sig_info[0] != pub_key.algo_name()) + { + return false; + } + + std::string padding = sig_info[1]; + Signature_Format format = + (pub_key.message_parts() >= 2) ? DER_SEQUENCE : IEEE_1363; + + if(!dynamic_cast(&pub_key)) + return false; + + std::auto_ptr enc(new ECDSA_Signature_Encoder(&m_sig)); + SecureVector seq_sig = enc->signature_bits(); + SecureVector to_sign = tbs_data(); + + PK_Verifying_wo_MR_Key& sig_key = dynamic_cast(pub_key); + std::auto_ptr verifier(get_pk_verifier(sig_key, padding, format)); + return verifier->verify_message(to_sign, seq_sig); + } + catch(...) + { + return false; + } + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/cvc/ecdsa_sig.cpp b/src/libs/3rdparty/botan/src/cert/cvc/ecdsa_sig.cpp new file mode 100644 index 00000000000..c33a4550add --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/ecdsa_sig.cpp @@ -0,0 +1,64 @@ + +#include +#include + +namespace Botan { + +ECDSA_Signature::ECDSA_Signature(const BigInt& r, const BigInt& s) + : m_r(r), + m_s(s) + {} + +ECDSA_Signature::ECDSA_Signature(const ECDSA_Signature& other) + : m_r(other.m_r), m_s(other.m_s) + {} + +ECDSA_Signature const& ECDSA_Signature::operator=(const ECDSA_Signature& other) + { + m_r = other.m_r; + m_s = other.m_s; + return *this; + } + +bool operator==(const ECDSA_Signature& lhs, const ECDSA_Signature& rhs) + { + return (lhs.get_r() == rhs.get_r() && lhs.get_s() == rhs.get_s()); + } + +SecureVector const ECDSA_Signature::get_concatenation() const + { + u32bit enc_len = m_r > m_s ? m_r.bytes() : m_s.bytes(); // use the larger + + SecureVector sv_r = BigInt::encode_1363(m_r, enc_len); + SecureVector sv_s = BigInt::encode_1363(m_s, enc_len); + + SecureVector result(sv_r); + result.append(sv_s); + return result; + } + +ECDSA_Signature const decode_seq(MemoryRegion const& seq) + { + ECDSA_Signature sig; + + std::auto_ptr dec(new ECDSA_Signature_Decoder(&sig)); + dec->signature_bits(seq); + return sig; + } + +ECDSA_Signature const decode_concatenation(MemoryRegion const& concat) + { + if(concat.size() % 2 != 0) + throw Invalid_Argument("Erroneous length of signature"); + + u32bit rs_len = concat.size()/2; + SecureVector sv_r; + SecureVector sv_s; + sv_r.set(concat.begin(), rs_len); + sv_s.set(&concat[rs_len], rs_len); + BigInt r = BigInt::decode(sv_r, sv_r.size()); + BigInt s = BigInt::decode(sv_s, sv_s.size()); + return ECDSA_Signature(r, s); + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/cvc/ecdsa_sig.h b/src/libs/3rdparty/botan/src/cert/cvc/ecdsa_sig.h new file mode 100644 index 00000000000..15015c76d4f --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/ecdsa_sig.h @@ -0,0 +1,88 @@ +/* +* ECDSA +* (C) 2007 Falko Strenzke, FlexSecure GmbH +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ECDSA_SIGNATURE_H__ +#define BOTAN_ECDSA_SIGNATURE_H__ + +#include +#include +#include + +namespace Botan { + +class BOTAN_DLL ECDSA_Signature + { + public: + friend class ECDSA_Signature_Decoder; + + ECDSA_Signature() {} + ECDSA_Signature(const BigInt& r, const BigInt& s); + ECDSA_Signature(ECDSA_Signature const& other); + ECDSA_Signature const& operator=(ECDSA_Signature const& other); + + const BigInt& get_r() const { return m_r; } + const BigInt& get_s() const { return m_s; } + + /** + * return the r||s + */ + SecureVector const get_concatenation() const; + private: + BigInt m_r; + BigInt m_s; + }; + +/* Equality of ECDSA_Signature */ +bool operator==(const ECDSA_Signature& lhs, const ECDSA_Signature& rhs); +inline bool operator!=(const ECDSA_Signature& lhs, const ECDSA_Signature& rhs) + { + return !(lhs == rhs); + } + +class BOTAN_DLL ECDSA_Signature_Decoder + { + public: + void signature_bits(const MemoryRegion& bits) + { + BER_Decoder(bits) + .start_cons(SEQUENCE) + .decode(m_signature->m_r) + .decode(m_signature->m_s) + .verify_end() + .end_cons(); + } + ECDSA_Signature_Decoder(ECDSA_Signature* signature) : m_signature(signature) + {} + private: + ECDSA_Signature* m_signature; + }; + +class BOTAN_DLL ECDSA_Signature_Encoder + { + public: + MemoryVector signature_bits() const + { + return DER_Encoder() + .start_cons(SEQUENCE) + .encode(m_signature->get_r()) + .encode(m_signature->get_s()) + .end_cons() + .get_contents(); + } + ECDSA_Signature_Encoder(const ECDSA_Signature* signature) : m_signature(signature) + {} + private: + const ECDSA_Signature* m_signature; + }; + +ECDSA_Signature const decode_seq(MemoryRegion const& seq); +ECDSA_Signature const decode_concatenation(MemoryRegion const& concatenation); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/cvc/freestore.h b/src/libs/3rdparty/botan/src/cert/cvc/freestore.h new file mode 100644 index 00000000000..f95afa8021b --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/freestore.h @@ -0,0 +1,85 @@ +/** +* (C) 2007 Christoph Ludwig +* ludwig@fh-worms.de +**/ + +#ifndef BOTAN_FREESTORE_H__ +#define BOTAN_FREESTORE_H__ + +#include + +#if defined(BOTAN_USE_STD_TR1) + #include +#elif defined(BOTAN_USE_BOOST_TR1) + #include +#else + #error "Please choose a TR1 implementation in build.h" +#endif + +namespace Botan { + +/** +* This class is intended as an function call parameter type and +* enables convenient automatic conversions between plain and smart +* pointer types. It internally stores a SharedPointer which can be +* accessed. +* +* Distributed under the terms of the Botan license +*/ +template +class BOTAN_DLL SharedPtrConverter + { + public: + typedef std::tr1::shared_ptr SharedPtr; + + /** + * Construct a null pointer equivalent object. + */ + SharedPtrConverter() : ptr() {} + + /** + * Copy constructor. + */ + SharedPtrConverter(SharedPtrConverter const& other) : + ptr(other.ptr) {} + + /** + * Construct a converter object from another pointer type. + * @param p the pointer which shall be set as the internally stored + * pointer value of this converter. + */ + template + SharedPtrConverter(Ptr p) + : ptr(p) {} + + /** + * Get the internally stored shared pointer. + * @return the internally stored shared pointer + */ + SharedPtr const& get_ptr() const { return this->ptr; } + + /** + * Get the internally stored shared pointer. + * @return the internally stored shared pointer + */ + SharedPtr get_ptr() { return this->ptr; } + + /** + * Get the internally stored shared pointer. + * @return the internally stored shared pointer + */ + SharedPtr const& get_shared() const { return this->ptr; } + + /** + * Get the internally stored shared pointer. + * @return the internally stored shared pointer + */ + SharedPtr get_shared() { return this->ptr; } + + private: + SharedPtr ptr; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/cvc/info.txt b/src/libs/3rdparty/botan/src/cert/cvc/info.txt new file mode 100644 index 00000000000..e3e11f5fe68 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/info.txt @@ -0,0 +1,44 @@ +realname "Card Verifiable Certificates" + +define CARD_VERIFIABLE_CERTIFICATES + +uses_tr1 yes + +load_on auto + + +asn1_eac_str.cpp +asn1_eac_tm.cpp +ecdsa_sig.cpp +ecdsa_sig.h +cvc_ado.cpp +cvc_ado.h +cvc_ca.cpp +cvc_ca.h +cvc_cert.cpp +cvc_cert.h +cvc_gen_cert.h +cvc_key.h +cvc_req.cpp +cvc_req.h +cvc_self.cpp +cvc_self.h +eac_asn_obj.h +eac_obj.h +signed_obj.cpp +signed_obj.h +freestore.h + + + +asn1 +bigint +ecdsa +filters +libstate +oid_lookup +pem +pk_codecs +pubkey +x509 + diff --git a/src/libs/3rdparty/botan/src/cert/cvc/signed_obj.cpp b/src/libs/3rdparty/botan/src/cert/cvc/signed_obj.cpp new file mode 100644 index 00000000000..4a08ed0ac15 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/signed_obj.cpp @@ -0,0 +1,67 @@ +/* +* X.509 SIGNED Object +* (C) 1999-2007 Jack Lloyd +* 2007 FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Return a BER encoded X.509 object +*/ +SecureVector EAC_Signed_Object::BER_encode() const + { + Pipe ber; + ber.start_msg(); + encode(ber, RAW_BER); + ber.end_msg(); + return ber.read_all(); + } + +/* +* Return a PEM encoded X.509 object +*/ +std::string EAC_Signed_Object::PEM_encode() const + { + Pipe pem; + pem.start_msg(); + encode(pem, PEM); + pem.end_msg(); + return pem.read_all_as_string(); + } + +/* +* Return the algorithm used to sign this object +*/ +AlgorithmIdentifier EAC_Signed_Object::signature_algorithm() const + { + return sig_algo; + } + +/* +* Try to decode the actual information +*/ +void EAC_Signed_Object::do_decode() + { + try { + force_decode(); + } + catch(Decoding_Error& e) + { + const std::string what = e.what(); + throw Decoding_Error(PEM_label_pref + " decoding failed (" + + what.substr(23, std::string::npos) + ")"); + } + catch(Invalid_Argument& e) + { + const std::string what = e.what(); + throw Decoding_Error(PEM_label_pref + " decoding failed (" + + what.substr(7, std::string::npos) + ")"); + } + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/cvc/signed_obj.h b/src/libs/3rdparty/botan/src/cert/cvc/signed_obj.h new file mode 100644 index 00000000000..3c233d21b2f --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/cvc/signed_obj.h @@ -0,0 +1,93 @@ +/* +* EAC SIGNED Object +* (C) 2007 FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EAC_SIGNED_OBJECT_H__ +#define BOTAN_EAC_SIGNED_OBJECT_H__ + +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents abstract signed EAC object +*/ +class BOTAN_DLL EAC_Signed_Object + { + public: + /** + * Get the TBS (to-be-signed) data in this object. + * @return the DER encoded TBS data of this object + */ + virtual SecureVector tbs_data() const = 0; + + /** + * Get the signature of this object as a concatenation, i.e. if the + * signature consists of multiple parts (like in the case of ECDSA) + * these will be concatenated. + * @return the signature as a concatenation of its parts + */ + + /* + NOTE: this is here only because abstract signature objects have + not yet been introduced + */ + virtual SecureVector get_concat_sig() const = 0; + + /** + * Get the signature algorithm identifier used to sign this object. + * @result the signature algorithm identifier + */ + AlgorithmIdentifier signature_algorithm() const; + + /** + * Check the signature of this object. + * @param key the public key associated with this signed object + * @return true if the signature was created by the private key + * associated with this public key + */ + virtual bool check_signature(class Public_Key&) const = 0; + + /** + * Write this object DER encoded into a specified pipe. + * @param pipe the pipe to write the encoded object to + * @param enc the encoding type to use + */ + virtual void encode(Pipe&, X509_Encoding = PEM) const = 0; + + /** + * BER encode this object. + * @return the result containing the BER representation of this object. + */ + SecureVector BER_encode() const; + + /** + * PEM encode this object. + * @return the result containing the PEM representation of this object. + */ + std::string PEM_encode() const; + + virtual ~EAC_Signed_Object() {} + protected: + void do_decode(); + EAC_Signed_Object() {} + + AlgorithmIdentifier sig_algo; + SecureVector tbs_bits; + std::string PEM_label_pref; + std::vector PEM_labels_allowed; + private: + virtual void force_decode() = 0; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/x509/certstor.cpp b/src/libs/3rdparty/botan/src/cert/x509/certstor.cpp new file mode 100644 index 00000000000..96f2699dfeb --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/certstor.cpp @@ -0,0 +1,48 @@ +/* +* Certificate Store +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Search by name +*/ +std::vector +Certificate_Store::by_name(const std::string&) const + { + return std::vector(); + } + +/* +* Search by email +*/ +std::vector +Certificate_Store::by_email(const std::string&) const + { + return std::vector(); + } + +/* +* Search by X.500 distinguished name +*/ +std::vector +Certificate_Store::by_dn(const X509_DN&) const + { + return std::vector(); + } + +/* +* Find any CRLs that might be useful +*/ +std::vector +Certificate_Store::get_crls_for(const X509_Certificate&) const + { + return std::vector(); + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/x509/certstor.h b/src/libs/3rdparty/botan/src/cert/x509/certstor.h new file mode 100644 index 00000000000..d5004e366c2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/certstor.h @@ -0,0 +1,39 @@ +/* +* Certificate Store +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CERT_STORE_H__ +#define BOTAN_CERT_STORE_H__ + +#include +#include + +namespace Botan { + +/* +* Certificate Store Interface +*/ +class BOTAN_DLL Certificate_Store + { + public: + virtual std::vector + by_SKID(const MemoryRegion&) const = 0; + + virtual std::vector by_name(const std::string&) const; + virtual std::vector by_email(const std::string&) const; + virtual std::vector by_dn(const X509_DN&) const; + + virtual std::vector + get_crls_for(const X509_Certificate&) const; + + virtual Certificate_Store* clone() const = 0; + + virtual ~Certificate_Store() {} + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/x509/crl_ent.cpp b/src/libs/3rdparty/botan/src/cert/x509/crl_ent.cpp new file mode 100644 index 00000000000..afea8cf6bbb --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/crl_ent.cpp @@ -0,0 +1,107 @@ +/* +* CRL Entry +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Create a CRL_Entry +*/ +CRL_Entry::CRL_Entry(bool t_on_unknown_crit) : + throw_on_unknown_critical(t_on_unknown_crit) + { + reason = UNSPECIFIED; + } + +/* +* Create a CRL_Entry +*/ +CRL_Entry::CRL_Entry(const X509_Certificate& cert, CRL_Code why) : + throw_on_unknown_critical(false) + { + serial = cert.serial_number(); + time = X509_Time(system_time()); + reason = why; + } + +/* +* Compare two CRL_Entrys for equality +*/ +bool operator==(const CRL_Entry& a1, const CRL_Entry& a2) + { + if(a1.serial_number() != a2.serial_number()) + return false; + if(a1.expire_time() != a2.expire_time()) + return false; + if(a1.reason_code() != a2.reason_code()) + return false; + return true; + } + +/* +* Compare two CRL_Entrys for inequality +*/ +bool operator!=(const CRL_Entry& a1, const CRL_Entry& a2) + { + return !(a1 == a2); + } + +/* +* Compare two CRL_Entrys +*/ +bool operator<(const CRL_Entry& a1, const CRL_Entry& a2) + { + return (a1.expire_time().cmp(a2.expire_time()) < 0); + } + +/* +* DER encode a CRL_Entry +*/ +void CRL_Entry::encode_into(DER_Encoder& der) const + { + Extensions extensions; + + extensions.add(new Cert_Extension::CRL_ReasonCode(reason)); + + der.start_cons(SEQUENCE) + .encode(BigInt::decode(serial, serial.size())) + .encode(time) + .encode(extensions) + .end_cons(); + } + +/* +* Decode a BER encoded CRL_Entry +*/ +void CRL_Entry::decode_from(BER_Decoder& source) + { + BigInt serial_number_bn; + + source.start_cons(SEQUENCE) + .decode(serial_number_bn) + .decode(time); + + if(source.more_items()) + { + Extensions extensions(throw_on_unknown_critical); + source.decode(extensions); + Data_Store info; + extensions.contents_to(info, info); + reason = CRL_Code(info.get1_u32bit("X509v3.CRLReasonCode")); + } + + serial = BigInt::encode(serial_number_bn); + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/x509/crl_ent.h b/src/libs/3rdparty/botan/src/cert/x509/crl_ent.h new file mode 100644 index 00000000000..050356c8445 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/crl_ent.h @@ -0,0 +1,78 @@ +/* +* CRL Entry +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CRL_ENTRY_H__ +#define BOTAN_CRL_ENTRY_H__ + +#include + +namespace Botan { + +/** +* This class represents CRL entries +*/ +class BOTAN_DLL CRL_Entry : public ASN1_Object + { + public: + void encode_into(class DER_Encoder&) const; + void decode_from(class BER_Decoder&); + + /** + * Get the serial number of the certificate associated with this entry. + * @return the certificate's serial number + */ + MemoryVector serial_number() const { return serial; } + + /** + * Get the revocation date of the certificate associated with this entry + * @return the certificate's revocation date + */ + X509_Time expire_time() const { return time; } + + /** + * Get the entries reason code + * @return the reason code + */ + CRL_Code reason_code() const { return reason; } + + /** + * Construct an empty CRL entry. + */ + CRL_Entry(bool throw_on_unknown_critical_extension = false); + + /** + * Construct an CRL entry. + * @param cert the certificate to revoke + * @param reason the reason code to set in the entry + */ + CRL_Entry(const X509_Certificate&, CRL_Code = UNSPECIFIED); + + private: + bool throw_on_unknown_critical; + MemoryVector serial; + X509_Time time; + CRL_Code reason; + }; + +/** +* Test two CRL entries for equality in all fields. +*/ +BOTAN_DLL bool operator==(const CRL_Entry&, const CRL_Entry&); + +/** +* Test two CRL entries for inequality in at least one field. +*/ +BOTAN_DLL bool operator!=(const CRL_Entry&, const CRL_Entry&); + +/** +* Order two entries based on the revocation date. +*/ +BOTAN_DLL bool operator<(const CRL_Entry&, const CRL_Entry&); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/x509/info.txt b/src/libs/3rdparty/botan/src/cert/x509/info.txt new file mode 100644 index 00000000000..552e2aacb23 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/info.txt @@ -0,0 +1,45 @@ +realname "X.509" + +define X509 + +load_on auto + + +certstor.h +certstor.cpp +crl_ent.cpp +crl_ent.h +pkcs10.h +pkcs10.cpp +x509_ca.cpp +x509_ca.h +x509_crl.cpp +x509_crl.h +x509_ext.cpp +x509_ext.h +x509_obj.cpp +x509_obj.h +x509cert.cpp +x509cert.h +x509find.cpp +x509find.h +x509opt.cpp +x509self.cpp +x509self.h +x509stor.cpp +x509stor.h + + + +asn1 +bigint +datastor +filters +libstate +oid_lookup +pem +pk_codecs +pubkey +rng +sha1 + diff --git a/src/libs/3rdparty/botan/src/cert/x509/pkcs10.cpp b/src/libs/3rdparty/botan/src/cert/x509/pkcs10.cpp new file mode 100644 index 00000000000..5617cece4f1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/pkcs10.cpp @@ -0,0 +1,200 @@ +/* +* PKCS #10 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* PKCS10_Request Constructor +*/ +PKCS10_Request::PKCS10_Request(DataSource& in) : + X509_Object(in, "CERTIFICATE REQUEST/NEW CERTIFICATE REQUEST") + { + do_decode(); + } + +/* +* PKCS10_Request Constructor +*/ +PKCS10_Request::PKCS10_Request(const std::string& in) : + X509_Object(in, "CERTIFICATE REQUEST/NEW CERTIFICATE REQUEST") + { + do_decode(); + } + +/* +* Deocde the CertificateRequestInfo +*/ +void PKCS10_Request::force_decode() + { + BER_Decoder cert_req_info(tbs_bits); + + u32bit version; + cert_req_info.decode(version); + if(version != 0) + throw Decoding_Error("Unknown version code in PKCS #10 request: " + + to_string(version)); + + X509_DN dn_subject; + cert_req_info.decode(dn_subject); + + info.add(dn_subject.contents()); + + BER_Object public_key = cert_req_info.get_next_object(); + if(public_key.type_tag != SEQUENCE || public_key.class_tag != CONSTRUCTED) + throw BER_Bad_Tag("PKCS10_Request: Unexpected tag for public key", + public_key.type_tag, public_key.class_tag); + + info.add("X509.Certificate.public_key", + PEM_Code::encode( + ASN1::put_in_sequence(public_key.value), + "PUBLIC KEY" + ) + ); + + BER_Object attr_bits = cert_req_info.get_next_object(); + + if(attr_bits.type_tag == 0 && + attr_bits.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) + { + BER_Decoder attributes(attr_bits.value); + while(attributes.more_items()) + { + Attribute attr; + attributes.decode(attr); + handle_attribute(attr); + } + attributes.verify_end(); + } + else if(attr_bits.type_tag != NO_OBJECT) + throw BER_Bad_Tag("PKCS10_Request: Unexpected tag for attributes", + attr_bits.type_tag, attr_bits.class_tag); + + cert_req_info.verify_end(); + + X509_Code sig_check = X509_Store::check_sig(*this, subject_public_key()); + if(sig_check != VERIFIED) + throw Decoding_Error("PKCS #10 request: Bad signature detected"); + } + +/* +* Handle attributes in a PKCS #10 request +*/ +void PKCS10_Request::handle_attribute(const Attribute& attr) + { + BER_Decoder value(attr.parameters); + + if(attr.oid == OIDS::lookup("PKCS9.EmailAddress")) + { + ASN1_String email; + value.decode(email); + info.add("RFC822", email.value()); + } + else if(attr.oid == OIDS::lookup("PKCS9.ChallengePassword")) + { + ASN1_String challenge_password; + value.decode(challenge_password); + info.add("PKCS9.ChallengePassword", challenge_password.value()); + } + else if(attr.oid == OIDS::lookup("PKCS9.ExtensionRequest")) + { + Extensions extensions; + value.decode(extensions).verify_end(); + + Data_Store issuer_info; + extensions.contents_to(info, issuer_info); + } + } + +/* +* Return the challenge password (if any) +*/ +std::string PKCS10_Request::challenge_password() const + { + return info.get1("PKCS9.ChallengePassword"); + } + +/* +* Return the name of the requestor +*/ +X509_DN PKCS10_Request::subject_dn() const + { + return create_dn(info); + } + +/* +* Return the public key of the requestor +*/ +MemoryVector PKCS10_Request::raw_public_key() const + { + DataSource_Memory source(info.get1("X509.Certificate.public_key")); + return PEM_Code::decode_check_label(source, "PUBLIC KEY"); + } + +/* +* Return the public key of the requestor +*/ +Public_Key* PKCS10_Request::subject_public_key() const + { + DataSource_Memory source(info.get1("X509.Certificate.public_key")); + return X509::load_key(source); + } + +/* +* Return the alternative names of the requestor +*/ +AlternativeName PKCS10_Request::subject_alt_name() const + { + return create_alt_name(info); + } + +/* +* Return the key constraints (if any) +*/ +Key_Constraints PKCS10_Request::constraints() const + { + return Key_Constraints(info.get1_u32bit("X509v3.KeyUsage", NO_CONSTRAINTS)); + } + +/* +* Return the extendend key constraints (if any) +*/ +std::vector PKCS10_Request::ex_constraints() const + { + std::vector oids = info.get("X509v3.ExtendedKeyUsage"); + + std::vector result; + for(u32bit j = 0; j != oids.size(); ++j) + result.push_back(OID(oids[j])); + return result; + } + +/* +* Return is a CA certificate is requested +*/ +bool PKCS10_Request::is_CA() const + { + return info.get1_u32bit("X509v3.BasicConstraints.is_ca"); + } + +/* +* Return the desired path limit (if any) +*/ +u32bit PKCS10_Request::path_limit() const + { + return info.get1_u32bit("X509v3.BasicConstraints.path_constraint", 0); + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/x509/pkcs10.h b/src/libs/3rdparty/botan/src/cert/x509/pkcs10.h new file mode 100644 index 00000000000..9b435de5257 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/pkcs10.h @@ -0,0 +1,101 @@ +/* +* PKCS #10 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PKCS10_H__ +#define BOTAN_PKCS10_H__ + +#include +#include +#include +#include + +namespace Botan { + +/** +* PKCS #10 Certificate Request. +*/ +class BOTAN_DLL PKCS10_Request : public X509_Object + { + public: + /** + * Get the subject public key. + * @return the subject public key + */ + Public_Key* subject_public_key() const; + + /** + * Get the raw DER encoded public key. + * @return the raw DER encoded public key + */ + MemoryVector raw_public_key() const; + + /** + * Get the subject DN. + * @return the subject DN + */ + X509_DN subject_dn() const; + + /** + * Get the subject alternative name. + * @return the subject alternative name. + */ + AlternativeName subject_alt_name() const; + + /** + * Get the key constraints for the key associated with this + * PKCS#10 object. + * @return the key constraints + */ + Key_Constraints constraints() const; + + /** + * Get the extendend key constraints (if any). + * @return the extended key constraints + */ + std::vector ex_constraints() const; + + /** + * Find out whether this is a CA request. + * @result true if it is a CA request, false otherwise. + */ + bool is_CA() const; + + /** + * Return the constraint on the path length defined + * in the BasicConstraints extension. + * @return the path limit + */ + u32bit path_limit() const; + + /** + * Get the challenge password for this request + * @return the challenge password for this request + */ + std::string challenge_password() const; + + /** + * Create a PKCS#10 Request from a data source. + * @param source the data source providing the DER encoded request + */ + PKCS10_Request(DataSource& source); + + /** + * Create a PKCS#10 Request from a file. + * @param filename the name of the file containing the DER or PEM + * encoded request file + */ + PKCS10_Request(const std::string& filename); + private: + void force_decode(); + void handle_attribute(const Attribute&); + + Data_Store info; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509_ca.cpp b/src/libs/3rdparty/botan/src/cert/x509/x509_ca.cpp new file mode 100644 index 00000000000..41e314724ab --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509_ca.cpp @@ -0,0 +1,284 @@ +/* +* X.509 Certificate Authority +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Load the certificate and private key +*/ +X509_CA::X509_CA(const X509_Certificate& c, + const Private_Key& key) : cert(c) + { + const Private_Key* key_pointer = &key; + if(!dynamic_cast(key_pointer)) + throw Invalid_Argument("X509_CA: " + key.algo_name() + " cannot sign"); + + if(!cert.is_CA_cert()) + throw Invalid_Argument("X509_CA: This certificate is not for a CA"); + + signer = choose_sig_format(key, ca_sig_algo); + } + +/* +* Sign a PKCS #10 certificate request +*/ +X509_Certificate X509_CA::sign_request(const PKCS10_Request& req, + RandomNumberGenerator& rng, + const X509_Time& not_before, + const X509_Time& not_after) + { + Key_Constraints constraints; + if(req.is_CA()) + constraints = Key_Constraints(KEY_CERT_SIGN | CRL_SIGN); + else + { + std::auto_ptr key(req.subject_public_key()); + constraints = X509::find_constraints(*key, req.constraints()); + } + + Extensions extensions; + + extensions.add(new Cert_Extension::Authority_Key_ID(cert.subject_key_id())); + extensions.add(new Cert_Extension::Subject_Key_ID(req.raw_public_key())); + + extensions.add( + new Cert_Extension::Basic_Constraints(req.is_CA(), req.path_limit())); + + extensions.add(new Cert_Extension::Key_Usage(constraints)); + extensions.add( + new Cert_Extension::Extended_Key_Usage(req.ex_constraints())); + + extensions.add( + new Cert_Extension::Subject_Alternative_Name(req.subject_alt_name())); + + return make_cert(signer, rng, ca_sig_algo, req.raw_public_key(), + not_before, not_after, + cert.subject_dn(), req.subject_dn(), + extensions); + } + +/* +* Create a new certificate +*/ +X509_Certificate X509_CA::make_cert(PK_Signer* signer, + RandomNumberGenerator& rng, + const AlgorithmIdentifier& sig_algo, + const MemoryRegion& pub_key, + const X509_Time& not_before, + const X509_Time& not_after, + const X509_DN& issuer_dn, + const X509_DN& subject_dn, + const Extensions& extensions) + { + const u32bit X509_CERT_VERSION = 3; + const u32bit SERIAL_BITS = 128; + + BigInt serial_no(rng, SERIAL_BITS); + + DataSource_Memory source(X509_Object::make_signed(signer, rng, sig_algo, + DER_Encoder().start_cons(SEQUENCE) + .start_explicit(0) + .encode(X509_CERT_VERSION-1) + .end_explicit() + + .encode(serial_no) + + .encode(sig_algo) + .encode(issuer_dn) + + .start_cons(SEQUENCE) + .encode(not_before) + .encode(not_after) + .end_cons() + + .encode(subject_dn) + .raw_bytes(pub_key) + + .start_explicit(3) + .start_cons(SEQUENCE) + .encode(extensions) + .end_cons() + .end_explicit() + .end_cons() + .get_contents() + )); + + return X509_Certificate(source); + } + +/* +* Create a new, empty CRL +*/ +X509_CRL X509_CA::new_crl(RandomNumberGenerator& rng, + u32bit next_update) const + { + std::vector empty; + return make_crl(empty, 1, next_update, rng); + } + +/* +* Update a CRL with new entries +*/ +X509_CRL X509_CA::update_crl(const X509_CRL& crl, + const std::vector& new_revoked, + RandomNumberGenerator& rng, + u32bit next_update) const + { + std::vector already_revoked = crl.get_revoked(); + std::vector all_revoked; + + X509_Store store; + store.add_cert(cert, true); + if(store.add_crl(crl) != VERIFIED) + throw Invalid_Argument("X509_CA::update_crl: Invalid CRL provided"); + + std::set > removed_from_crl; + for(u32bit j = 0; j != new_revoked.size(); ++j) + { + if(new_revoked[j].reason_code() == DELETE_CRL_ENTRY) + removed_from_crl.insert(new_revoked[j].serial_number()); + else + all_revoked.push_back(new_revoked[j]); + } + + for(u32bit j = 0; j != already_revoked.size(); ++j) + { + std::set >::const_iterator i; + i = removed_from_crl.find(already_revoked[j].serial_number()); + + if(i == removed_from_crl.end()) + all_revoked.push_back(already_revoked[j]); + } + std::sort(all_revoked.begin(), all_revoked.end()); + + std::vector cert_list; + std::unique_copy(all_revoked.begin(), all_revoked.end(), + std::back_inserter(cert_list)); + + return make_crl(cert_list, crl.crl_number() + 1, next_update, rng); + } + +/* +* Create a CRL +*/ +X509_CRL X509_CA::make_crl(const std::vector& revoked, + u32bit crl_number, u32bit next_update, + RandomNumberGenerator& rng) const + { + const u32bit X509_CRL_VERSION = 2; + + if(next_update == 0) + next_update = timespec_to_u32bit("7d"); + + // Totally stupid: ties encoding logic to the return of std::time!! + const u64bit current_time = system_time(); + + Extensions extensions; + extensions.add( + new Cert_Extension::Authority_Key_ID(cert.subject_key_id())); + extensions.add(new Cert_Extension::CRL_Number(crl_number)); + + DataSource_Memory source(X509_Object::make_signed(signer, rng, ca_sig_algo, + DER_Encoder().start_cons(SEQUENCE) + .encode(X509_CRL_VERSION-1) + .encode(ca_sig_algo) + .encode(cert.issuer_dn()) + .encode(X509_Time(current_time)) + .encode(X509_Time(current_time + next_update)) + .encode_if(revoked.size() > 0, + DER_Encoder() + .start_cons(SEQUENCE) + .encode_list(revoked) + .end_cons() + ) + .start_explicit(0) + .start_cons(SEQUENCE) + .encode(extensions) + .end_cons() + .end_explicit() + .end_cons() + .get_contents() + )); + + return X509_CRL(source); + } + +/* +* Return the CA's certificate +*/ +X509_Certificate X509_CA::ca_certificate() const + { + return cert; + } + +/* +* X509_CA Destructor +*/ +X509_CA::~X509_CA() + { + delete signer; + } + +/* +* Choose a signing format for the key +*/ +PK_Signer* choose_sig_format(const Private_Key& key, + AlgorithmIdentifier& sig_algo) + { + std::string padding; + Signature_Format format; + + const std::string algo_name = key.algo_name(); + + if(algo_name == "RSA") + { + padding = "EMSA3(SHA-160)"; + format = IEEE_1363; + } + else if(algo_name == "DSA") + { + padding = "EMSA1(SHA-160)"; + format = DER_SEQUENCE; + } + else if(algo_name == "ECDSA") + { + padding = "EMSA1_BSI(SHA-160)"; + format = IEEE_1363; + } + else + throw Invalid_Argument("Unknown X.509 signing key type: " + algo_name); + + sig_algo.oid = OIDS::lookup(algo_name + "/" + padding); + + std::auto_ptr encoding(key.x509_encoder()); + if(!encoding.get()) + throw Encoding_Error("Key " + algo_name + " does not support " + "X.509 encoding"); + + sig_algo.parameters = encoding->alg_id().parameters; + + const PK_Signing_Key& sig_key = dynamic_cast(key); + + return get_pk_signer(sig_key, padding, format); + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509_ca.h b/src/libs/3rdparty/botan/src/cert/x509/x509_ca.h new file mode 100644 index 00000000000..ef2a8d134f2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509_ca.h @@ -0,0 +1,108 @@ +/* +* X.509 Certificate Authority +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_X509_CA_H__ +#define BOTAN_X509_CA_H__ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents X.509 Certificate Authorities (CAs). +*/ +class BOTAN_DLL X509_CA + { + public: + + /** + * Sign a PKCS#10 Request. + * @param req the request to sign + * @param rng the rng to use + * @param not_before the starting time for the certificate + * @param not_after the expiration time for the certificate + * @return the resulting certificate + */ + X509_Certificate sign_request(const PKCS10_Request& req, + RandomNumberGenerator& rng, + const X509_Time& not_before, + const X509_Time& not_after); + + /** + * Get the certificate of this CA. + * @return the CA certificate + */ + X509_Certificate ca_certificate() const; + + /** + * Create a new and empty CRL for this CA. + * @param rng the random number generator to use + * @param next_update the time to set in next update in seconds + * as the offset from the current time + * @return the new CRL + */ + X509_CRL new_crl(RandomNumberGenerator& rng, u32bit = 0) const; + + /** + * Create a new CRL by with additional entries. + * @param last_crl the last CRL of this CA to add the new entries to + * @param new_entries contains the new CRL entries to be added to the CRL + * @param rng the random number generator to use + * @param next_update the time to set in next update in seconds + * as the offset from the current time + */ + X509_CRL update_crl(const X509_CRL& last_crl, + const std::vector& new_entries, + RandomNumberGenerator& rng, + u32bit next_update = 0) const; + + static X509_Certificate make_cert(PK_Signer*, + RandomNumberGenerator&, + const AlgorithmIdentifier&, + const MemoryRegion&, + const X509_Time&, const X509_Time&, + const X509_DN&, const X509_DN&, + const Extensions&); + + /** + * Create a new CA object. + * @param ca_certificate the certificate of the CA + * @param key the private key of the CA + */ + X509_CA(const X509_Certificate& ca_certificate, const Private_Key& key); + ~X509_CA(); + private: + X509_CA(const X509_CA&) {} + X509_CA& operator=(const X509_CA&) { return (*this); } + + X509_CRL make_crl(const std::vector&, + u32bit, u32bit, RandomNumberGenerator&) const; + + AlgorithmIdentifier ca_sig_algo; + X509_Certificate cert; + PK_Signer* signer; + }; + +/** +* Choose the default signature format for a certain public key signature +* scheme. +* @param key will be the key to choose a padding scheme for +* @param alg_id will be set to the chosen scheme +* @return A PK_Signer object for generating signatures +*/ +BOTAN_DLL PK_Signer* choose_sig_format(const Private_Key& key, + AlgorithmIdentifier& alg_id); + + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509_crl.cpp b/src/libs/3rdparty/botan/src/cert/x509/x509_crl.cpp new file mode 100644 index 00000000000..f6a344dba72 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509_crl.cpp @@ -0,0 +1,147 @@ +/* +* X.509 CRL +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Load a X.509 CRL +*/ +X509_CRL::X509_CRL(DataSource& in, bool touc) : + X509_Object(in, "X509 CRL/CRL"), throw_on_unknown_critical(touc) + { + do_decode(); + } + +/* +* Load a X.509 CRL +*/ +X509_CRL::X509_CRL(const std::string& in, bool touc) : + X509_Object(in, "CRL/X509 CRL"), throw_on_unknown_critical(touc) + { + do_decode(); + } + +/* +* Decode the TBSCertList data +*/ +void X509_CRL::force_decode() + { + BER_Decoder tbs_crl(tbs_bits); + + u32bit version; + tbs_crl.decode_optional(version, INTEGER, UNIVERSAL); + + if(version != 0 && version != 1) + throw X509_CRL_Error("Unknown X.509 CRL version " + + to_string(version+1)); + + AlgorithmIdentifier sig_algo_inner; + tbs_crl.decode(sig_algo_inner); + + if(sig_algo != sig_algo_inner) + throw X509_CRL_Error("Algorithm identifier mismatch"); + + X509_DN dn_issuer; + tbs_crl.decode(dn_issuer); + info.add(dn_issuer.contents()); + + X509_Time start, end; + tbs_crl.decode(start).decode(end); + info.add("X509.CRL.start", start.readable_string()); + info.add("X509.CRL.end", end.readable_string()); + + BER_Object next = tbs_crl.get_next_object(); + + if(next.type_tag == SEQUENCE && next.class_tag == CONSTRUCTED) + { + BER_Decoder cert_list(next.value); + + while(cert_list.more_items()) + { + CRL_Entry entry(throw_on_unknown_critical); + cert_list.decode(entry); + revoked.push_back(entry); + } + next = tbs_crl.get_next_object(); + } + + if(next.type_tag == 0 && + next.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) + { + BER_Decoder crl_options(next.value); + + Extensions extensions(throw_on_unknown_critical); + + crl_options.decode(extensions).verify_end(); + + extensions.contents_to(info, info); + + next = tbs_crl.get_next_object(); + } + + if(next.type_tag != NO_OBJECT) + throw X509_CRL_Error("Unknown tag in CRL"); + + tbs_crl.verify_end(); + } + +/* +* Return the list of revoked certificates +*/ +std::vector X509_CRL::get_revoked() const + { + return revoked; + } + +/* +* Return the distinguished name of the issuer +*/ +X509_DN X509_CRL::issuer_dn() const + { + return create_dn(info); + } + +/* +* Return the key identifier of the issuer +*/ +MemoryVector X509_CRL::authority_key_id() const + { + return info.get1_memvec("X509v3.AuthorityKeyIdentifier"); + } + +/* +* Return the CRL number of this CRL +*/ +u32bit X509_CRL::crl_number() const + { + return info.get1_u32bit("X509v3.CRLNumber"); + } + +/* +* Return the issue data of the CRL +*/ +X509_Time X509_CRL::this_update() const + { + return info.get1("X509.CRL.start"); + } + +/* +* Return the date when a new CRL will be issued +*/ +X509_Time X509_CRL::next_update() const + { + return info.get1("X509.CRL.end"); + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509_crl.h b/src/libs/3rdparty/botan/src/cert/x509/x509_crl.h new file mode 100644 index 00000000000..6caef42cc87 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509_crl.h @@ -0,0 +1,90 @@ +/* +* X.509 CRL +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_X509_CRL_H__ +#define BOTAN_X509_CRL_H__ + +#include +#include +#include + +namespace Botan { + +/** +* This class represents X.509 Certificate Revocation Lists (CRLs). +*/ +class BOTAN_DLL X509_CRL : public X509_Object + { + public: + /** + * This class represents CRL related errors. + */ + struct X509_CRL_Error : public Exception + { + X509_CRL_Error(const std::string& error) : + Exception("X509_CRL: " + error) {} + }; + + /** + * Get the entries of this CRL in the form of a vector. + * @return a vector containing the entries of this CRL. + */ + std::vector get_revoked() const; + + /** + * Get the issuer DN of this CRL. + * @return the CRLs issuer DN + */ + X509_DN issuer_dn() const; + + /** + * Get the AuthorityKeyIdentifier of this CRL. + * @return this CRLs AuthorityKeyIdentifier + */ + MemoryVector authority_key_id() const; + + /** + * Get the serial number of this CRL. + * @return the CRLs serial number + */ + u32bit crl_number() const; + + /** + * Get the CRL's thisUpdate value. + * @return the CRLs thisUpdate + */ + X509_Time this_update() const; + + /** + * Get the CRL's nextUpdate value. + * @return the CRLs nextdUpdate + */ + X509_Time next_update() const; + + /** + * Construct a CRL from a data source. + * @param source the data source providing the DER or PEM encoded CRL. + */ + X509_CRL(DataSource&, bool throw_on_unknown_critical = false); + + /** + * Construct a CRL from a file containing the DER or PEM encoded CRL. + * @param filename the name of the CRL file + */ + X509_CRL(const std::string& filename, + bool throw_on_unknown_critical = false); + private: + void force_decode(); + + bool throw_on_unknown_critical; + std::vector revoked; + Data_Store info; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509_ext.cpp b/src/libs/3rdparty/botan/src/cert/x509/x509_ext.cpp new file mode 100644 index 00000000000..5e07cbd27e4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509_ext.cpp @@ -0,0 +1,581 @@ +/* +* X.509 Certificate Extensions +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* List of X.509 Certificate Extensions +*/ +Certificate_Extension* Extensions::get_extension(const OID& oid) + { +#define X509_EXTENSION(NAME, TYPE) \ + if(OIDS::name_of(oid, NAME)) \ + return new Cert_Extension::TYPE(); + + X509_EXTENSION("X509v3.KeyUsage", Key_Usage); + X509_EXTENSION("X509v3.BasicConstraints", Basic_Constraints); + X509_EXTENSION("X509v3.SubjectKeyIdentifier", Subject_Key_ID); + X509_EXTENSION("X509v3.AuthorityKeyIdentifier", Authority_Key_ID); + X509_EXTENSION("X509v3.ExtendedKeyUsage", Extended_Key_Usage); + X509_EXTENSION("X509v3.IssuerAlternativeName", Issuer_Alternative_Name); + X509_EXTENSION("X509v3.SubjectAlternativeName", Subject_Alternative_Name); + X509_EXTENSION("X509v3.CRLNumber", CRL_Number); + X509_EXTENSION("X509v3.CertificatePolicies", Certificate_Policies); + + return 0; + } + +/* +* Extensions Copy Constructor +*/ +Extensions::Extensions(const Extensions& extensions) : ASN1_Object() + { + *this = extensions; + } + +/* +* Extensions Assignment Operator +*/ +Extensions& Extensions::operator=(const Extensions& other) + { + for(u32bit j = 0; j != extensions.size(); ++j) + delete extensions[j]; + extensions.clear(); + + for(u32bit j = 0; j != other.extensions.size(); ++j) + extensions.push_back(other.extensions[j]->copy()); + + return (*this); + } + +/* +* Return the OID of this extension +*/ +OID Certificate_Extension::oid_of() const + { + return OIDS::lookup(oid_name()); + } + +/* +* Encode an Extensions list +*/ +void Extensions::encode_into(DER_Encoder& to_object) const + { + for(u32bit j = 0; j != extensions.size(); ++j) + { + const Certificate_Extension* ext = extensions[j]; + + std::string setting; + + if(ext->config_id() != "") + setting = global_state().option("x509/exts/" + ext->config_id()); + + if(setting == "") + setting = "yes"; + + if(setting != "yes" && setting != "no" && setting != "critical") + throw Invalid_Argument("X509_CA:: Invalid value for option " + "x509/exts/" + ext->config_id() + " of " + + setting); + + bool is_critical = (setting == "critical"); + bool should_encode = ext->should_encode() && (setting != "no"); + + if(should_encode) + { + to_object.start_cons(SEQUENCE) + .encode(ext->oid_of()) + .encode_optional(is_critical, false) + .encode(ext->encode_inner(), OCTET_STRING) + .end_cons(); + } + } + } + +/* +* Decode a list of Extensions +*/ +void Extensions::decode_from(BER_Decoder& from_source) + { + for(u32bit j = 0; j != extensions.size(); ++j) + delete extensions[j]; + extensions.clear(); + + BER_Decoder sequence = from_source.start_cons(SEQUENCE); + while(sequence.more_items()) + { + OID oid; + MemoryVector value; + bool critical; + + sequence.start_cons(SEQUENCE) + .decode(oid) + .decode_optional(critical, BOOLEAN, UNIVERSAL, false) + .decode(value, OCTET_STRING) + .verify_end() + .end_cons(); + + Certificate_Extension* ext = get_extension(oid); + + if(!ext) + { + if(!critical || !should_throw) + continue; + + throw Decoding_Error("Encountered unknown X.509 extension marked " + "as critical; OID = " + oid.as_string()); + } + + ext->decode_inner(value); + + extensions.push_back(ext); + } + sequence.verify_end(); + } + +/* +* Write the extensions to an info store +*/ +void Extensions::contents_to(Data_Store& subject_info, + Data_Store& issuer_info) const + { + for(u32bit j = 0; j != extensions.size(); ++j) + extensions[j]->contents_to(subject_info, issuer_info); + } + +/* +* Delete an Extensions list +*/ +Extensions::~Extensions() + { + for(u32bit j = 0; j != extensions.size(); ++j) + delete extensions[j]; + } + +namespace Cert_Extension { + +/* +* Checked accessor for the path_limit member +*/ +u32bit Basic_Constraints::get_path_limit() const + { + if(!is_ca) + throw Invalid_State("Basic_Constraints::get_path_limit: Not a CA"); + return path_limit; + } + +/* +* Encode the extension +*/ +MemoryVector Basic_Constraints::encode_inner() const + { + return DER_Encoder() + .start_cons(SEQUENCE) + .encode_if(is_ca, + DER_Encoder() + .encode(is_ca) + .encode_optional(path_limit, NO_CERT_PATH_LIMIT) + ) + .end_cons() + .get_contents(); + } + +/* +* Decode the extension +*/ +void Basic_Constraints::decode_inner(const MemoryRegion& in) + { + BER_Decoder(in) + .start_cons(SEQUENCE) + .decode_optional(is_ca, BOOLEAN, UNIVERSAL, false) + .decode_optional(path_limit, INTEGER, UNIVERSAL, NO_CERT_PATH_LIMIT) + .verify_end() + .end_cons(); + + if(is_ca == false) + path_limit = 0; + } + +/* +* Return a textual representation +*/ +void Basic_Constraints::contents_to(Data_Store& subject, Data_Store&) const + { + subject.add("X509v3.BasicConstraints.is_ca", (is_ca ? 1 : 0)); + subject.add("X509v3.BasicConstraints.path_constraint", path_limit); + } + +/* +* Encode the extension +*/ +MemoryVector Key_Usage::encode_inner() const + { + if(constraints == NO_CONSTRAINTS) + throw Encoding_Error("Cannot encode zero usage constraints"); + + const u32bit unused_bits = low_bit(constraints) - 1; + + SecureVector der; + der.append(BIT_STRING); + der.append(2 + ((unused_bits < 8) ? 1 : 0)); + der.append(unused_bits % 8); + der.append((constraints >> 8) & 0xFF); + if(constraints & 0xFF) + der.append(constraints & 0xFF); + + return der; + } + +/* +* Decode the extension +*/ +void Key_Usage::decode_inner(const MemoryRegion& in) + { + BER_Decoder ber(in); + + BER_Object obj = ber.get_next_object(); + + if(obj.type_tag != BIT_STRING || obj.class_tag != UNIVERSAL) + throw BER_Bad_Tag("Bad tag for usage constraint", + obj.type_tag, obj.class_tag); + + if(obj.value.size() != 2 && obj.value.size() != 3) + throw BER_Decoding_Error("Bad size for BITSTRING in usage constraint"); + + if(obj.value[0] >= 8) + throw BER_Decoding_Error("Invalid unused bits in usage constraint"); + + obj.value[obj.value.size()-1] &= (0xFF << obj.value[0]); + + u16bit usage = 0; + for(u32bit j = 1; j != obj.value.size(); ++j) + usage = (obj.value[j] << 8) | usage; + + constraints = Key_Constraints(usage); + } + +/* +* Return a textual representation +*/ +void Key_Usage::contents_to(Data_Store& subject, Data_Store&) const + { + subject.add("X509v3.KeyUsage", constraints); + } + +/* +* Encode the extension +*/ +MemoryVector Subject_Key_ID::encode_inner() const + { + return DER_Encoder().encode(key_id, OCTET_STRING).get_contents(); + } + +/* +* Decode the extension +*/ +void Subject_Key_ID::decode_inner(const MemoryRegion& in) + { + BER_Decoder(in).decode(key_id, OCTET_STRING).verify_end(); + } + +/* +* Return a textual representation +*/ +void Subject_Key_ID::contents_to(Data_Store& subject, Data_Store&) const + { + subject.add("X509v3.SubjectKeyIdentifier", key_id); + } + +/* +* Subject_Key_ID Constructor +*/ +Subject_Key_ID::Subject_Key_ID(const MemoryRegion& pub_key) + { + SHA_160 hash; + key_id = hash.process(pub_key); + } + +/* +* Encode the extension +*/ +MemoryVector Authority_Key_ID::encode_inner() const + { + return DER_Encoder() + .start_cons(SEQUENCE) + .encode(key_id, OCTET_STRING, ASN1_Tag(0), CONTEXT_SPECIFIC) + .end_cons() + .get_contents(); + } + +/* +* Decode the extension +*/ +void Authority_Key_ID::decode_inner(const MemoryRegion& in) + { + BER_Decoder(in) + .start_cons(SEQUENCE) + .decode_optional_string(key_id, OCTET_STRING, 0); + } + +/* +* Return a textual representation +*/ +void Authority_Key_ID::contents_to(Data_Store&, Data_Store& issuer) const + { + if(key_id.size()) + issuer.add("X509v3.AuthorityKeyIdentifier", key_id); + } + +/* +* Encode the extension +*/ +MemoryVector Alternative_Name::encode_inner() const + { + return DER_Encoder().encode(alt_name).get_contents(); + } + +/* +* Decode the extension +*/ +void Alternative_Name::decode_inner(const MemoryRegion& in) + { + BER_Decoder(in).decode(alt_name); + } + +/* +* Return a textual representation +*/ +void Alternative_Name::contents_to(Data_Store& subject_info, + Data_Store& issuer_info) const + { + std::multimap contents = + get_alt_name().contents(); + + if(oid_name_str == "X509v3.SubjectAlternativeName") + subject_info.add(contents); + else if(oid_name_str == "X509v3.IssuerAlternativeName") + issuer_info.add(contents); + else + throw Internal_Error("In Alternative_Name, unknown type " + + oid_name_str); + } + +/* +* Alternative_Name Constructor +*/ +Alternative_Name::Alternative_Name(const AlternativeName& alt_name, + const std::string& oid_name_str, + const std::string& config_name_str) + { + this->alt_name = alt_name; + this->oid_name_str = oid_name_str; + this->config_name_str = config_name_str; + } + +/* +* Subject_Alternative_Name Constructor +*/ +Subject_Alternative_Name::Subject_Alternative_Name( + const AlternativeName& name) : + + Alternative_Name(name, "X509v3.SubjectAlternativeName", + "subject_alternative_name") + { + } + +/* +* Issuer_Alternative_Name Constructor +*/ +Issuer_Alternative_Name::Issuer_Alternative_Name(const AlternativeName& name) : + Alternative_Name(name, "X509v3.IssuerAlternativeName", + "issuer_alternative_name") + { + } + +/* +* Encode the extension +*/ +MemoryVector Extended_Key_Usage::encode_inner() const + { + return DER_Encoder() + .start_cons(SEQUENCE) + .encode_list(oids) + .end_cons() + .get_contents(); + } + +/* +* Decode the extension +*/ +void Extended_Key_Usage::decode_inner(const MemoryRegion& in) + { + BER_Decoder(in) + .start_cons(SEQUENCE) + .decode_list(oids) + .end_cons(); + } + +/* +* Return a textual representation +*/ +void Extended_Key_Usage::contents_to(Data_Store& subject, Data_Store&) const + { + for(u32bit j = 0; j != oids.size(); ++j) + subject.add("X509v3.ExtendedKeyUsage", oids[j].as_string()); + } + +namespace { + +/* +* A policy specifier +*/ +class Policy_Information : public ASN1_Object + { + public: + OID oid; + + void encode_into(DER_Encoder& codec) const + { + codec.start_cons(SEQUENCE) + .encode(oid) + .end_cons(); + } + + void decode_from(BER_Decoder& codec) + { + codec.start_cons(SEQUENCE) + .decode(oid) + .discard_remaining() + .end_cons(); + } + }; + +} + +/* +* Encode the extension +*/ +MemoryVector Certificate_Policies::encode_inner() const + { + throw Exception("Certificate_Policies::encode_inner: Bugged"); + + std::vector policies; + + return DER_Encoder() + .start_cons(SEQUENCE) + .encode_list(policies) + .end_cons() + .get_contents(); + } + +/* +* Decode the extension +*/ +void Certificate_Policies::decode_inner(const MemoryRegion& in) + { + std::vector policies; + + BER_Decoder(in) + .start_cons(SEQUENCE) + .decode_list(policies) + .end_cons(); + } + +/* +* Return a textual representation +*/ +void Certificate_Policies::contents_to(Data_Store& info, Data_Store&) const + { + for(u32bit j = 0; j != oids.size(); ++j) + info.add("X509v3.ExtendedKeyUsage", oids[j].as_string()); + } + +/* +* Checked accessor for the crl_number member +*/ +u32bit CRL_Number::get_crl_number() const + { + if(!has_value) + throw Invalid_State("CRL_Number::get_crl_number: Not set"); + return crl_number; + } + +/* +* Copy a CRL_Number extension +*/ +CRL_Number* CRL_Number::copy() const + { + if(!has_value) + throw Invalid_State("CRL_Number::copy: Not set"); + return new CRL_Number(crl_number); + } + +/* +* Encode the extension +*/ +MemoryVector CRL_Number::encode_inner() const + { + return DER_Encoder().encode(crl_number).get_contents(); + } + +/* +* Decode the extension +*/ +void CRL_Number::decode_inner(const MemoryRegion& in) + { + BER_Decoder(in).decode(crl_number); + } + +/* +* Return a textual representation +*/ +void CRL_Number::contents_to(Data_Store& info, Data_Store&) const + { + info.add("X509v3.CRLNumber", crl_number); + } + +/* +* Encode the extension +*/ +MemoryVector CRL_ReasonCode::encode_inner() const + { + return DER_Encoder() + .encode(static_cast(reason), ENUMERATED, UNIVERSAL) + .get_contents(); + } + +/* +* Decode the extension +*/ +void CRL_ReasonCode::decode_inner(const MemoryRegion& in) + { + u32bit reason_code = 0; + BER_Decoder(in).decode(reason_code, ENUMERATED, UNIVERSAL); + reason = static_cast(reason_code); + } + +/* +* Return a textual representation +*/ +void CRL_ReasonCode::contents_to(Data_Store& info, Data_Store&) const + { + info.add("X509v3.CRLReasonCode", reason); + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509_ext.h b/src/libs/3rdparty/botan/src/cert/x509/x509_ext.h new file mode 100644 index 00000000000..108215ee75a --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509_ext.h @@ -0,0 +1,317 @@ +/* +* X.509 Certificate Extensions +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_X509_EXTENSIONS_H__ +#define BOTAN_X509_EXTENSIONS_H__ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* X.509 Certificate Extension +*/ +class BOTAN_DLL Certificate_Extension + { + public: + OID oid_of() const; + + virtual Certificate_Extension* copy() const = 0; + + virtual void contents_to(Data_Store&, Data_Store&) const = 0; + virtual std::string config_id() const = 0; + virtual std::string oid_name() const = 0; + + virtual ~Certificate_Extension() {} + protected: + friend class Extensions; + virtual bool should_encode() const { return true; } + virtual MemoryVector encode_inner() const = 0; + virtual void decode_inner(const MemoryRegion&) = 0; + }; + +/* +* X.509 Certificate Extension List +*/ +class BOTAN_DLL Extensions : public ASN1_Object + { + public: + void encode_into(class DER_Encoder&) const; + void decode_from(class BER_Decoder&); + + void contents_to(Data_Store&, Data_Store&) const; + + void add(Certificate_Extension* extn) + { extensions.push_back(extn); } + + Extensions& operator=(const Extensions&); + + Extensions(const Extensions&); + Extensions(bool st = true) : should_throw(st) {} + ~Extensions(); + private: + static Certificate_Extension* get_extension(const OID&); + + std::vector extensions; + bool should_throw; + }; + +namespace Cert_Extension { + +/* +* Basic Constraints Extension +*/ +class BOTAN_DLL Basic_Constraints : public Certificate_Extension + { + public: + Basic_Constraints* copy() const + { return new Basic_Constraints(is_ca, path_limit); } + + Basic_Constraints(bool ca = false, u32bit limit = 0) : + is_ca(ca), path_limit(limit) {} + + bool get_is_ca() const { return is_ca; } + u32bit get_path_limit() const; + private: + std::string config_id() const { return "basic_constraints"; } + std::string oid_name() const { return "X509v3.BasicConstraints"; } + + MemoryVector encode_inner() const; + void decode_inner(const MemoryRegion&); + void contents_to(Data_Store&, Data_Store&) const; + + bool is_ca; + u32bit path_limit; + }; + +/* +* Key Usage Constraints Extension +*/ +class BOTAN_DLL Key_Usage : public Certificate_Extension + { + public: + Key_Usage* copy() const { return new Key_Usage(constraints); } + + Key_Usage(Key_Constraints c = NO_CONSTRAINTS) : constraints(c) {} + + Key_Constraints get_constraints() const { return constraints; } + private: + std::string config_id() const { return "key_usage"; } + std::string oid_name() const { return "X509v3.KeyUsage"; } + + bool should_encode() const { return (constraints != NO_CONSTRAINTS); } + MemoryVector encode_inner() const; + void decode_inner(const MemoryRegion&); + void contents_to(Data_Store&, Data_Store&) const; + + Key_Constraints constraints; + }; + +/* +* Subject Key Identifier Extension +*/ +class BOTAN_DLL Subject_Key_ID : public Certificate_Extension + { + public: + Subject_Key_ID* copy() const { return new Subject_Key_ID(key_id); } + + Subject_Key_ID() {} + Subject_Key_ID(const MemoryRegion&); + + MemoryVector get_key_id() const { return key_id; } + private: + std::string config_id() const { return "subject_key_id"; } + std::string oid_name() const { return "X509v3.SubjectKeyIdentifier"; } + + bool should_encode() const { return (key_id.size() > 0); } + MemoryVector encode_inner() const; + void decode_inner(const MemoryRegion&); + void contents_to(Data_Store&, Data_Store&) const; + + MemoryVector key_id; + }; + +/* +* Authority Key Identifier Extension +*/ +class BOTAN_DLL Authority_Key_ID : public Certificate_Extension + { + public: + Authority_Key_ID* copy() const { return new Authority_Key_ID(key_id); } + + Authority_Key_ID() {} + Authority_Key_ID(const MemoryRegion& k) : key_id(k) {} + + MemoryVector get_key_id() const { return key_id; } + private: + std::string config_id() const { return "authority_key_id"; } + std::string oid_name() const { return "X509v3.AuthorityKeyIdentifier"; } + + bool should_encode() const { return (key_id.size() > 0); } + MemoryVector encode_inner() const; + void decode_inner(const MemoryRegion&); + void contents_to(Data_Store&, Data_Store&) const; + + MemoryVector key_id; + }; + +/* +* Alternative Name Extension Base Class +*/ +class BOTAN_DLL Alternative_Name : public Certificate_Extension + { + public: + AlternativeName get_alt_name() const { return alt_name; } + + protected: + Alternative_Name(const AlternativeName&, + const std::string&, const std::string&); + + Alternative_Name(const std::string&, const std::string&); + private: + std::string config_id() const { return config_name_str; } + std::string oid_name() const { return oid_name_str; } + + bool should_encode() const { return alt_name.has_items(); } + MemoryVector encode_inner() const; + void decode_inner(const MemoryRegion&); + void contents_to(Data_Store&, Data_Store&) const; + + std::string config_name_str, oid_name_str; + AlternativeName alt_name; + }; + +/* +* Subject Alternative Name Extension +*/ +class BOTAN_DLL Subject_Alternative_Name : public Alternative_Name + { + public: + Subject_Alternative_Name* copy() const + { return new Subject_Alternative_Name(get_alt_name()); } + + Subject_Alternative_Name(const AlternativeName& = AlternativeName()); + }; + +/* +* Issuer Alternative Name Extension +*/ +class BOTAN_DLL Issuer_Alternative_Name : public Alternative_Name + { + public: + Issuer_Alternative_Name* copy() const + { return new Issuer_Alternative_Name(get_alt_name()); } + + Issuer_Alternative_Name(const AlternativeName& = AlternativeName()); + }; + +/* +* Extended Key Usage Extension +*/ +class BOTAN_DLL Extended_Key_Usage : public Certificate_Extension + { + public: + Extended_Key_Usage* copy() const { return new Extended_Key_Usage(oids); } + + Extended_Key_Usage() {} + Extended_Key_Usage(const std::vector& o) : oids(o) {} + + std::vector get_oids() const { return oids; } + private: + std::string config_id() const { return "extended_key_usage"; } + std::string oid_name() const { return "X509v3.ExtendedKeyUsage"; } + + bool should_encode() const { return (oids.size() > 0); } + MemoryVector encode_inner() const; + void decode_inner(const MemoryRegion&); + void contents_to(Data_Store&, Data_Store&) const; + + std::vector oids; + }; + +/* +* Certificate Policies Extension +*/ +class BOTAN_DLL Certificate_Policies : public Certificate_Extension + { + public: + Certificate_Policies* copy() const + { return new Certificate_Policies(oids); } + + Certificate_Policies() {} + Certificate_Policies(const std::vector& o) : oids(o) {} + + std::vector get_oids() const { return oids; } + private: + std::string config_id() const { return "policy_info"; } + std::string oid_name() const { return "X509v3.CertificatePolicies"; } + + bool should_encode() const { return (oids.size() > 0); } + MemoryVector encode_inner() const; + void decode_inner(const MemoryRegion&); + void contents_to(Data_Store&, Data_Store&) const; + + std::vector oids; + }; + +/* +* CRL Number Extension +*/ +class BOTAN_DLL CRL_Number : public Certificate_Extension + { + public: + CRL_Number* copy() const; + + CRL_Number() : has_value(false), crl_number(0) {} + CRL_Number(u32bit n) : has_value(true), crl_number(n) {} + + u32bit get_crl_number() const; + private: + std::string config_id() const { return "crl_number"; } + std::string oid_name() const { return "X509v3.CRLNumber"; } + + bool should_encode() const { return has_value; } + MemoryVector encode_inner() const; + void decode_inner(const MemoryRegion&); + void contents_to(Data_Store&, Data_Store&) const; + + bool has_value; + u32bit crl_number; + }; + +/* +* CRL Entry Reason Code Extension +*/ +class BOTAN_DLL CRL_ReasonCode : public Certificate_Extension + { + public: + CRL_ReasonCode* copy() const { return new CRL_ReasonCode(reason); } + + CRL_ReasonCode(CRL_Code r = UNSPECIFIED) : reason(r) {} + + CRL_Code get_reason() const { return reason; } + private: + std::string config_id() const { return "crl_reason"; } + std::string oid_name() const { return "X509v3.ReasonCode"; } + + bool should_encode() const { return (reason != UNSPECIFIED); } + MemoryVector encode_inner() const; + void decode_inner(const MemoryRegion&); + void contents_to(Data_Store&, Data_Store&) const; + + CRL_Code reason; + }; + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509_obj.cpp b/src/libs/3rdparty/botan/src/cert/x509/x509_obj.cpp new file mode 100644 index 00000000000..31b4a309f97 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509_obj.cpp @@ -0,0 +1,235 @@ +/* +* X.509 SIGNED Object +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Create a generic X.509 object +*/ +X509_Object::X509_Object(DataSource& stream, const std::string& labels) + { + init(stream, labels); + } + +/* +* Createa a generic X.509 object +*/ +X509_Object::X509_Object(const std::string& file, const std::string& labels) + { + DataSource_Stream stream(file, true); + init(stream, labels); + } + +/* +* Read a PEM or BER X.509 object +*/ +void X509_Object::init(DataSource& in, const std::string& labels) + { + PEM_labels_allowed = split_on(labels, '/'); + if(PEM_labels_allowed.size() < 1) + throw Invalid_Argument("Bad labels argument to X509_Object"); + + PEM_label_pref = PEM_labels_allowed[0]; + std::sort(PEM_labels_allowed.begin(), PEM_labels_allowed.end()); + + try { + if(ASN1::maybe_BER(in) && !PEM_Code::matches(in)) + decode_info(in); + else + { + std::string got_label; + DataSource_Memory ber(PEM_Code::decode(in, got_label)); + + if(!std::binary_search(PEM_labels_allowed.begin(), + PEM_labels_allowed.end(), got_label)) + throw Decoding_Error("Invalid PEM label: " + got_label); + decode_info(ber); + } + } + catch(Decoding_Error) + { + throw Decoding_Error(PEM_label_pref + " decoding failed"); + } + } + +/* +* Read a BER encoded X.509 object +*/ +void X509_Object::decode_info(DataSource& source) + { + BER_Decoder(source) + .start_cons(SEQUENCE) + .start_cons(SEQUENCE) + .raw_bytes(tbs_bits) + .end_cons() + .decode(sig_algo) + .decode(sig, BIT_STRING) + .verify_end() + .end_cons(); + } + +/* +* Return a BER or PEM encoded X.509 object +*/ +void X509_Object::encode(Pipe& out, X509_Encoding encoding) const + { + SecureVector der = DER_Encoder() + .start_cons(SEQUENCE) + .start_cons(SEQUENCE) + .raw_bytes(tbs_bits) + .end_cons() + .encode(sig_algo) + .encode(sig, BIT_STRING) + .end_cons() + .get_contents(); + + if(encoding == PEM) + out.write(PEM_Code::encode(der, PEM_label_pref)); + else + out.write(der); + } + +/* +* Return a BER encoded X.509 object +*/ +SecureVector X509_Object::BER_encode() const + { + Pipe ber; + ber.start_msg(); + encode(ber, RAW_BER); + ber.end_msg(); + return ber.read_all(); + } + +/* +* Return a PEM encoded X.509 object +*/ +std::string X509_Object::PEM_encode() const + { + Pipe pem; + pem.start_msg(); + encode(pem, PEM); + pem.end_msg(); + return pem.read_all_as_string(); + } + +/* +* Return the TBS data +*/ +SecureVector X509_Object::tbs_data() const + { + return ASN1::put_in_sequence(tbs_bits); + } + +/* +* Return the signature of this object +*/ +SecureVector X509_Object::signature() const + { + return sig; + } + +/* +* Return the algorithm used to sign this object +*/ +AlgorithmIdentifier X509_Object::signature_algorithm() const + { + return sig_algo; + } + +/* +* Check the signature on an object +*/ +bool X509_Object::check_signature(Public_Key& pub_key) const + { + try { + std::vector sig_info = + split_on(OIDS::lookup(sig_algo.oid), '/'); + + if(sig_info.size() != 2 || sig_info[0] != pub_key.algo_name()) + return false; + + std::string padding = sig_info[1]; + Signature_Format format = + (pub_key.message_parts() >= 2) ? DER_SEQUENCE : IEEE_1363; + + std::auto_ptr verifier; + + if(dynamic_cast(&pub_key)) + { + PK_Verifying_with_MR_Key& sig_key = + dynamic_cast(pub_key); + verifier.reset(get_pk_verifier(sig_key, padding, format)); + } + else if(dynamic_cast(&pub_key)) + { + PK_Verifying_wo_MR_Key& sig_key = + dynamic_cast(pub_key); + verifier.reset(get_pk_verifier(sig_key, padding, format)); + } + else + return false; + + return verifier->verify_message(tbs_data(), signature()); + } + catch(...) + { + return false; + } + } + +/* +* Apply the X.509 SIGNED macro +*/ +MemoryVector X509_Object::make_signed(PK_Signer* signer, + RandomNumberGenerator& rng, + const AlgorithmIdentifier& algo, + const MemoryRegion& tbs_bits) + { + return DER_Encoder() + .start_cons(SEQUENCE) + .raw_bytes(tbs_bits) + .encode(algo) + .encode(signer->sign_message(tbs_bits, rng), BIT_STRING) + .end_cons() + .get_contents(); + } + +/* +* Try to decode the actual information +*/ +void X509_Object::do_decode() + { + try { + force_decode(); + } + catch(Decoding_Error& e) + { + const std::string what = e.what(); + throw Decoding_Error(PEM_label_pref + " decoding failed (" + + what.substr(23, std::string::npos) + ")"); + } + catch(Invalid_Argument& e) + { + const std::string what = e.what(); + throw Decoding_Error(PEM_label_pref + " decoding failed (" + + what.substr(7, std::string::npos) + ")"); + } + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509_obj.h b/src/libs/3rdparty/botan/src/cert/x509/x509_obj.h new file mode 100644 index 00000000000..c7f92fa9daa --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509_obj.h @@ -0,0 +1,67 @@ +/* +* X.509 SIGNED Object +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_X509_OBJECT_H__ +#define BOTAN_X509_OBJECT_H__ + +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents abstract X.509 signed objects as +* in the X.500 SIGNED macro +*/ +class BOTAN_DLL X509_Object + { + public: + SecureVector tbs_data() const; + SecureVector signature() const; + AlgorithmIdentifier signature_algorithm() const; + + /** + * Create a signed X509 object. + * @param signer the signer used to sign the object + * @param rng the random number generator to use + * @param alg_id the algorithm identifier of the signature scheme + * @param tbs the tbs bits to be signed + * @return the signed X509 object + */ + static MemoryVector make_signed(class PK_Signer* signer, + RandomNumberGenerator& rng, + const AlgorithmIdentifier& alg_id, + const MemoryRegion& tbs); + + bool check_signature(class Public_Key&) const; + + void encode(Pipe&, X509_Encoding = PEM) const; + SecureVector BER_encode() const; + std::string PEM_encode() const; + + X509_Object(DataSource&, const std::string&); + X509_Object(const std::string&, const std::string&); + virtual ~X509_Object() {} + protected: + void do_decode(); + X509_Object() {} + AlgorithmIdentifier sig_algo; + SecureVector tbs_bits, sig; + private: + virtual void force_decode() = 0; + void init(DataSource&, const std::string&); + void decode_info(DataSource&); + std::vector PEM_labels_allowed; + std::string PEM_label_pref; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509cert.cpp b/src/libs/3rdparty/botan/src/cert/x509/x509cert.cpp new file mode 100644 index 00000000000..ac5839fb691 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509cert.cpp @@ -0,0 +1,366 @@ +/* +* X.509 Certificates +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Lookup each OID in the vector +*/ +std::vector lookup_oids(const std::vector& in) + { + std::vector out; + + std::vector::const_iterator i = in.begin(); + while(i != in.end()) + { + out.push_back(OIDS::lookup(OID(*i))); + ++i; + } + return out; + } + +} + +/* +* X509_Certificate Constructor +*/ +X509_Certificate::X509_Certificate(DataSource& in) : + X509_Object(in, "CERTIFICATE/X509 CERTIFICATE") + { + self_signed = false; + do_decode(); + } + +/* +* X509_Certificate Constructor +*/ +X509_Certificate::X509_Certificate(const std::string& in) : + X509_Object(in, "CERTIFICATE/X509 CERTIFICATE") + { + self_signed = false; + do_decode(); + } + +/* +* Decode the TBSCertificate data +*/ +void X509_Certificate::force_decode() + { + u32bit version; + BigInt serial_bn; + AlgorithmIdentifier sig_algo_inner; + X509_DN dn_issuer, dn_subject; + X509_Time start, end; + + BER_Decoder tbs_cert(tbs_bits); + + tbs_cert.decode_optional(version, ASN1_Tag(0), + ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) + .decode(serial_bn) + .decode(sig_algo_inner) + .decode(dn_issuer) + .start_cons(SEQUENCE) + .decode(start) + .decode(end) + .verify_end() + .end_cons() + .decode(dn_subject); + + if(version > 2) + throw Decoding_Error("Unknown X.509 cert version " + to_string(version)); + if(sig_algo != sig_algo_inner) + throw Decoding_Error("Algorithm identifier mismatch"); + + self_signed = (dn_subject == dn_issuer); + + subject.add(dn_subject.contents()); + issuer.add(dn_issuer.contents()); + + BER_Object public_key = tbs_cert.get_next_object(); + if(public_key.type_tag != SEQUENCE || public_key.class_tag != CONSTRUCTED) + throw BER_Bad_Tag("X509_Certificate: Unexpected tag for public key", + public_key.type_tag, public_key.class_tag); + + MemoryVector v2_issuer_key_id, v2_subject_key_id; + + tbs_cert.decode_optional_string(v2_issuer_key_id, BIT_STRING, 1); + tbs_cert.decode_optional_string(v2_subject_key_id, BIT_STRING, 2); + + BER_Object v3_exts_data = tbs_cert.get_next_object(); + if(v3_exts_data.type_tag == 3 && + v3_exts_data.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) + { + Extensions extensions; + + BER_Decoder(v3_exts_data.value).decode(extensions).verify_end(); + + extensions.contents_to(subject, issuer); + } + else if(v3_exts_data.type_tag != NO_OBJECT) + throw BER_Bad_Tag("Unknown tag in X.509 cert", + v3_exts_data.type_tag, v3_exts_data.class_tag); + + if(tbs_cert.more_items()) + throw Decoding_Error("TBSCertificate has more items that expected"); + + subject.add("X509.Certificate.version", version); + subject.add("X509.Certificate.serial", BigInt::encode(serial_bn)); + subject.add("X509.Certificate.start", start.readable_string()); + subject.add("X509.Certificate.end", end.readable_string()); + + issuer.add("X509.Certificate.v2.key_id", v2_issuer_key_id); + subject.add("X509.Certificate.v2.key_id", v2_subject_key_id); + + subject.add("X509.Certificate.public_key", + PEM_Code::encode( + ASN1::put_in_sequence(public_key.value), + "PUBLIC KEY" + ) + ); + + if(is_CA_cert() && + !subject.has_value("X509v3.BasicConstraints.path_constraint")) + { + u32bit limit = (x509_version() < 3) ? NO_CERT_PATH_LIMIT : 0; + subject.add("X509v3.BasicConstraints.path_constraint", limit); + } + } + +/* +* Return the X.509 version in use +*/ +u32bit X509_Certificate::x509_version() const + { + return (subject.get1_u32bit("X509.Certificate.version") + 1); + } + +/* +* Return the time this cert becomes valid +*/ +std::string X509_Certificate::start_time() const + { + return subject.get1("X509.Certificate.start"); + } + +/* +* Return the time this cert becomes invalid +*/ +std::string X509_Certificate::end_time() const + { + return subject.get1("X509.Certificate.end"); + } + +/* +* Return information about the subject +*/ +std::vector +X509_Certificate::subject_info(const std::string& what) const + { + return subject.get(X509_DN::deref_info_field(what)); + } + +/* +* Return information about the issuer +*/ +std::vector +X509_Certificate::issuer_info(const std::string& what) const + { + return issuer.get(X509_DN::deref_info_field(what)); + } + +/* +* Return the public key in this certificate +*/ +Public_Key* X509_Certificate::subject_public_key() const + { + DataSource_Memory source(subject.get1("X509.Certificate.public_key")); + return X509::load_key(source); + } + +/* +* Check if the certificate is for a CA +*/ +bool X509_Certificate::is_CA_cert() const + { + if(!subject.get1_u32bit("X509v3.BasicConstraints.is_ca")) + return false; + if((constraints() & KEY_CERT_SIGN) || (constraints() == NO_CONSTRAINTS)) + return true; + return false; + } + +/* +* Return the path length constraint +*/ +u32bit X509_Certificate::path_limit() const + { + return subject.get1_u32bit("X509v3.BasicConstraints.path_constraint", 0); + } + +/* +* Return the key usage constraints +*/ +Key_Constraints X509_Certificate::constraints() const + { + return Key_Constraints(subject.get1_u32bit("X509v3.KeyUsage", + NO_CONSTRAINTS)); + } + +/* +* Return the list of extended key usage OIDs +*/ +std::vector X509_Certificate::ex_constraints() const + { + return lookup_oids(subject.get("X509v3.ExtendedKeyUsage")); + } + +/* +* Return the list of certificate policies +*/ +std::vector X509_Certificate::policies() const + { + return lookup_oids(subject.get("X509v3.CertificatePolicies")); + } + +/* +* Return the authority key id +*/ +MemoryVector X509_Certificate::authority_key_id() const + { + return issuer.get1_memvec("X509v3.AuthorityKeyIdentifier"); + } + +/* +* Return the subject key id +*/ +MemoryVector X509_Certificate::subject_key_id() const + { + return subject.get1_memvec("X509v3.SubjectKeyIdentifier"); + } + +/* +* Return the certificate serial number +*/ +MemoryVector X509_Certificate::serial_number() const + { + return subject.get1_memvec("X509.Certificate.serial"); + } + +/* +* Return the distinguished name of the issuer +*/ +X509_DN X509_Certificate::issuer_dn() const + { + return create_dn(issuer); + } + +/* +* Return the distinguished name of the subject +*/ +X509_DN X509_Certificate::subject_dn() const + { + return create_dn(subject); + } + +/* +* Compare two certificates for equality +*/ +bool X509_Certificate::operator==(const X509_Certificate& other) const + { + return (sig == other.sig && + sig_algo == other.sig_algo && + self_signed == other.self_signed && + issuer == other.issuer && + subject == other.subject); + } + +/* +* X.509 Certificate Comparison +*/ +bool operator!=(const X509_Certificate& cert1, const X509_Certificate& cert2) + { + return !(cert1 == cert2); + } + +/* +* Create and populate a X509_DN +*/ +X509_DN create_dn(const Data_Store& info) + { + class DN_Matcher : public Data_Store::Matcher + { + public: + bool operator()(const std::string& key, const std::string&) const + { + if(key.find("X520.") != std::string::npos) + return true; + return false; + } + }; + + std::multimap names = + info.search_with(DN_Matcher()); + + X509_DN dn; + + std::multimap::iterator j; + for(j = names.begin(); j != names.end(); ++j) + dn.add_attribute(j->first, j->second); + + return dn; + } + +/* +* Create and populate an AlternativeName +*/ +AlternativeName create_alt_name(const Data_Store& info) + { + class AltName_Matcher : public Data_Store::Matcher + { + public: + bool operator()(const std::string& key, const std::string&) const + { + for(u32bit j = 0; j != matches.size(); ++j) + if(key.compare(matches[j]) == 0) + return true; + return false; + } + + AltName_Matcher(const std::string& match_any_of) + { + matches = split_on(match_any_of, '/'); + } + private: + std::vector matches; + }; + + std::multimap names = + info.search_with(AltName_Matcher("RFC822/DNS/URI/IP")); + + AlternativeName alt_name; + + std::multimap::iterator j; + for(j = names.begin(); j != names.end(); ++j) + alt_name.add_attribute(j->first, j->second); + + return alt_name; + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509cert.h b/src/libs/3rdparty/botan/src/cert/x509/x509cert.h new file mode 100644 index 00000000000..4a9d11f7fa7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509cert.h @@ -0,0 +1,185 @@ +/* +* X.509 Certificates +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_X509_CERTS_H__ +#define BOTAN_X509_CERTS_H__ + +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents X.509 Certificate +*/ +class BOTAN_DLL X509_Certificate : public X509_Object + { + public: + /** + * Get the public key associated with this certificate. + * @return the subject public key of this certificate + */ + Public_Key* subject_public_key() const; + + /** + * Get the issuer certificate DN. + * @return the issuer DN of this certificate + */ + X509_DN issuer_dn() const; + + /** + * Get the subject certificate DN. + * @return the subject DN of this certificate + */ + X509_DN subject_dn() const; + + /** + * Get a value for a specific subject_info parameter name. + * @param name the name of the paramter to look up. Possible names are + * "X509.Certificate.version", "X509.Certificate.serial", + * "X509.Certificate.start", "X509.Certificate.end", + * "X509.Certificate.v2.key_id", "X509.Certificate.public_key", + * "X509v3.BasicConstraints.path_constraint", + * "X509v3.BasicConstraints.is_ca", "X509v3.ExtendedKeyUsage", + * "X509v3.CertificatePolicies", "X509v3.SubjectKeyIdentifier" or + * "X509.Certificate.serial". + * @return the value(s) of the specified parameter + */ + std::vector subject_info(const std::string& name) const; + + /** + * Get a value for a specific subject_info parameter name. + * @param name the name of the paramter to look up. Possible names are + * "X509.Certificate.v2.key_id" or "X509v3.AuthorityKeyIdentifier". + * @return the value(s) of the specified parameter + */ + std::vector issuer_info(const std::string& name) const; + + /** + * Get the notBefore of the certificate. + * @return the notBefore of the certificate + */ + std::string start_time() const; + + /** + * Get the notAfter of the certificate. + * @return the notAfter of the certificate + */ + std::string end_time() const; + + /** + * Get the X509 version of this certificate object. + * @return the X509 version + */ + u32bit x509_version() const; + + /** + * Get the serial number of this certificate. + * @return the certificates serial number + */ + MemoryVector serial_number() const; + + /** + * Get the DER encoded AuthorityKeyIdentifier of this certificate. + * @return the DER encoded AuthorityKeyIdentifier + */ + MemoryVector authority_key_id() const; + + /** + * Get the DER encoded SubjectKeyIdentifier of this certificate. + * @return the DER encoded SubjectKeyIdentifier + */ + MemoryVector subject_key_id() const; + + /** + * Check whether this certificate is self signed. + * @return true if this certificate is self signed + */ + bool is_self_signed() const { return self_signed; } + + /** + * Check whether this certificate is a CA certificate. + * @return true if this certificate is a CA certificate + */ + bool is_CA_cert() const; + + /** + * Get the path limit as defined in the BasicConstraints extension of + * this certificate. + * @return the path limit + */ + u32bit path_limit() const; + + /** + * Get the key constraints as defined in the KeyUsage extension of this + * certificate. + * @return the key constraints + */ + Key_Constraints constraints() const; + + /** + * Get the key constraints as defined in the ExtendedKeyUsage + * extension of this + * certificate. + * @return the key constraints + */ + std::vector ex_constraints() const; + + /** + * Get the policies as defined in the CertificatePolicies extension + * of this certificate. + * @return the certificate policies + */ + std::vector policies() const; + + /** + * Check to certificates for equality. + * @return true both certificates are (binary) equal + */ + bool operator==(const X509_Certificate& other) const; + + /** + * Create a certificate from a data source providing the DER or + * PEM encoded certificate. + * @param source the data source + */ + X509_Certificate(DataSource& source); + + /** + * Create a certificate from a file containing the DER or PEM + * encoded certificate. + * @param filename the name of the certificate file + */ + X509_Certificate(const std::string& filename); + private: + void force_decode(); + friend class X509_CA; + X509_Certificate() {} + + Data_Store subject, issuer; + bool self_signed; + }; + +/** +* Check two certificates for inequality +* @return true if the arguments represent different certificates, +* false if they are binary identical +*/ +BOTAN_DLL bool operator!=(const X509_Certificate&, const X509_Certificate&); + +/* +* Data Store Extraction Operations +*/ +BOTAN_DLL X509_DN create_dn(const Data_Store&); +BOTAN_DLL AlternativeName create_alt_name(const Data_Store&); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509find.cpp b/src/libs/3rdparty/botan/src/cert/x509/x509find.cpp new file mode 100644 index 00000000000..257367da9f5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509find.cpp @@ -0,0 +1,111 @@ +/* +* X.509 Certificate Store Searching +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Compare based on case-insensive substrings +*/ +bool substring_match(const std::string& searching_for, + const std::string& found) + { + if(std::search(found.begin(), found.end(), searching_for.begin(), + searching_for.end(), Charset::caseless_cmp) != found.end()) + return true; + return false; + } + +/* +* Compare based on case-insensive match +*/ +bool ignore_case(const std::string& searching_for, const std::string& found) + { + if(searching_for.size() != found.size()) + return false; + + return std::equal(found.begin(), found.end(), + searching_for.begin(), Charset::caseless_cmp); + } + +} + +/* +* Search based on the contents of a DN entry +*/ +bool DN_Check::match(const X509_Certificate& cert) const + { + std::vector info = cert.subject_info(dn_entry); + + for(u32bit j = 0; j != info.size(); ++j) + if(compare(info[j], looking_for)) + return true; + return false; + } + +/* +* DN_Check Constructor +*/ +DN_Check::DN_Check(const std::string& dn_entry, const std::string& looking_for, + compare_fn func) + { + this->dn_entry = dn_entry; + this->looking_for = looking_for; + compare = func; + } + +/* +* DN_Check Constructor +*/ +DN_Check::DN_Check(const std::string& dn_entry, const std::string& looking_for, + Search_Type method) + { + this->dn_entry = dn_entry; + this->looking_for = looking_for; + + if(method == SUBSTRING_MATCHING) + compare = &substring_match; + else if(method == IGNORE_CASE) + compare = &ignore_case; + else + throw Invalid_Argument("Unknown method argument to DN_Check()"); + } + +/* +* Match by issuer and serial number +*/ +bool IandS_Match::match(const X509_Certificate& cert) const + { + if(cert.serial_number() != serial) + return false; + return (cert.issuer_dn() == issuer); + } + +/* +* IandS_Match Constructor +*/ +IandS_Match::IandS_Match(const X509_DN& issuer, + const MemoryRegion& serial) + { + this->issuer = issuer; + this->serial = serial; + } + +/* +* Match by subject key identifier +*/ +bool SKID_Match::match(const X509_Certificate& cert) const + { + return (cert.subject_key_id() == skid); + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509find.h b/src/libs/3rdparty/botan/src/cert/x509/x509find.h new file mode 100644 index 00000000000..a7a84c7a55f --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509find.h @@ -0,0 +1,60 @@ +/* +* X.509 Certificate Store Searching +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_X509_CERT_STORE_SEARCH_H__ +#define BOTAN_X509_CERT_STORE_SEARCH_H__ + +#include + +namespace Botan { + +/* +* Search based on the contents of a DN entry +*/ +class BOTAN_DLL DN_Check : public X509_Store::Search_Func + { + public: + typedef bool (*compare_fn)(const std::string&, const std::string&); + enum Search_Type { SUBSTRING_MATCHING, IGNORE_CASE }; + + bool match(const X509_Certificate& cert) const; + + DN_Check(const std::string&, const std::string&, compare_fn); + DN_Check(const std::string&, const std::string&, Search_Type); + private: + std::string dn_entry, looking_for; + compare_fn compare; + }; + +/* +* Search for a certificate by issuer/serial +*/ +class BOTAN_DLL IandS_Match : public X509_Store::Search_Func + { + public: + bool match(const X509_Certificate& cert) const; + IandS_Match(const X509_DN&, const MemoryRegion&); + private: + X509_DN issuer; + MemoryVector serial; + }; + +/* +* Search for a certificate by subject keyid +*/ +class BOTAN_DLL SKID_Match : public X509_Store::Search_Func + { + public: + bool match(const X509_Certificate& cert) const; + SKID_Match(const MemoryRegion& s) : skid(s) {} + private: + MemoryVector skid; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509opt.cpp b/src/libs/3rdparty/botan/src/cert/x509/x509opt.cpp new file mode 100644 index 00000000000..de9d589a399 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509opt.cpp @@ -0,0 +1,108 @@ +/* +* X.509 Certificate Options +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Set when the certificate should become valid +*/ +void X509_Cert_Options::not_before(const std::string& time_string) + { + start = X509_Time(time_string); + } + +/* +* Set when the certificate should expire +*/ +void X509_Cert_Options::not_after(const std::string& time_string) + { + end = X509_Time(time_string); + } + +/* +* Set key constraint information +*/ +void X509_Cert_Options::add_constraints(Key_Constraints usage) + { + constraints = usage; + } + +/* +* Set key constraint information +*/ +void X509_Cert_Options::add_ex_constraint(const OID& oid) + { + ex_constraints.push_back(oid); + } + +/* +* Set key constraint information +*/ +void X509_Cert_Options::add_ex_constraint(const std::string& oid_str) + { + ex_constraints.push_back(OIDS::lookup(oid_str)); + } + +/* +* Mark this certificate for CA usage +*/ +void X509_Cert_Options::CA_key(u32bit limit) + { + is_CA = true; + path_limit = limit; + } + +/* +* Do basic sanity checks +*/ +void X509_Cert_Options::sanity_check() const + { + if(common_name == "" || country == "") + throw Encoding_Error("X.509 certificate: name and country MUST be set"); + if(country.size() != 2) + throw Encoding_Error("Invalid ISO country code: " + country); + if(start >= end) + throw Encoding_Error("X509_Cert_Options: invalid time constraints"); + } + +/* +* Initialize the certificate options +*/ +X509_Cert_Options::X509_Cert_Options(const std::string& initial_opts, + u32bit expiration_time_in_seconds) + { + is_CA = false; + path_limit = 0; + constraints = NO_CONSTRAINTS; + + const u32bit now = system_time(); + + start = X509_Time(now); + end = X509_Time(now + expiration_time_in_seconds); + + if(initial_opts == "") + return; + + std::vector parsed = split_on(initial_opts, '/'); + + if(parsed.size() > 4) + throw Invalid_Argument("X.509 cert options: Too many names: " + + initial_opts); + + if(parsed.size() >= 1) common_name = parsed[0]; + if(parsed.size() >= 2) country = parsed[1]; + if(parsed.size() >= 3) organization = parsed[2]; + if(parsed.size() == 4) org_unit = parsed[3]; + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509self.cpp b/src/libs/3rdparty/botan/src/cert/x509/x509self.cpp new file mode 100644 index 00000000000..8afb22a7e82 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509self.cpp @@ -0,0 +1,176 @@ +/* +* PKCS #10/Self Signed Cert Creation +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Shared setup for self-signed items +*/ +MemoryVector shared_setup(const X509_Cert_Options& opts, + const Private_Key& key) + { + const Private_Key* key_pointer = &key; + if(!dynamic_cast(key_pointer)) + throw Invalid_Argument("Key type " + key.algo_name() + " cannot sign"); + + opts.sanity_check(); + + Pipe key_encoder; + key_encoder.start_msg(); + X509::encode(key, key_encoder, RAW_BER); + key_encoder.end_msg(); + + return key_encoder.read_all(); + } + +/* +* Load information from the X509_Cert_Options +*/ +void load_info(const X509_Cert_Options& opts, X509_DN& subject_dn, + AlternativeName& subject_alt) + { + subject_dn.add_attribute("X520.CommonName", opts.common_name); + subject_dn.add_attribute("X520.Country", opts.country); + subject_dn.add_attribute("X520.State", opts.state); + subject_dn.add_attribute("X520.Locality", opts.locality); + subject_dn.add_attribute("X520.Organization", opts.organization); + subject_dn.add_attribute("X520.OrganizationalUnit", opts.org_unit); + subject_dn.add_attribute("X520.SerialNumber", opts.serial_number); + subject_alt = AlternativeName(opts.email, opts.uri, opts.dns, opts.ip); + subject_alt.add_othername(OIDS::lookup("PKIX.XMPPAddr"), + opts.xmpp, UTF8_STRING); + } + +} + +namespace X509 { + +/* +* Create a new self-signed X.509 certificate +*/ +X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, + const Private_Key& key, + RandomNumberGenerator& rng) + { + AlgorithmIdentifier sig_algo; + X509_DN subject_dn; + AlternativeName subject_alt; + + MemoryVector pub_key = shared_setup(opts, key); + std::auto_ptr signer(choose_sig_format(key, sig_algo)); + load_info(opts, subject_dn, subject_alt); + + Key_Constraints constraints; + if(opts.is_CA) + constraints = Key_Constraints(KEY_CERT_SIGN | CRL_SIGN); + else + constraints = find_constraints(key, opts.constraints); + + Extensions extensions; + + extensions.add(new Cert_Extension::Subject_Key_ID(pub_key)); + extensions.add(new Cert_Extension::Key_Usage(constraints)); + extensions.add( + new Cert_Extension::Extended_Key_Usage(opts.ex_constraints)); + extensions.add( + new Cert_Extension::Subject_Alternative_Name(subject_alt)); + extensions.add( + new Cert_Extension::Basic_Constraints(opts.is_CA, opts.path_limit)); + + return X509_CA::make_cert(signer.get(), rng, sig_algo, pub_key, + opts.start, opts.end, + subject_dn, subject_dn, + extensions); + } + +/* +* Create a PKCS #10 certificate request +*/ +PKCS10_Request create_cert_req(const X509_Cert_Options& opts, + const Private_Key& key, + RandomNumberGenerator& rng) + { + AlgorithmIdentifier sig_algo; + X509_DN subject_dn; + AlternativeName subject_alt; + + MemoryVector pub_key = shared_setup(opts, key); + std::auto_ptr signer(choose_sig_format(key, sig_algo)); + load_info(opts, subject_dn, subject_alt); + + const u32bit PKCS10_VERSION = 0; + + Extensions extensions; + + extensions.add( + new Cert_Extension::Basic_Constraints(opts.is_CA, opts.path_limit)); + extensions.add( + new Cert_Extension::Key_Usage( + opts.is_CA ? Key_Constraints(KEY_CERT_SIGN | CRL_SIGN) : + find_constraints(key, opts.constraints) + ) + ); + extensions.add( + new Cert_Extension::Extended_Key_Usage(opts.ex_constraints)); + extensions.add( + new Cert_Extension::Subject_Alternative_Name(subject_alt)); + + DER_Encoder tbs_req; + + tbs_req.start_cons(SEQUENCE) + .encode(PKCS10_VERSION) + .encode(subject_dn) + .raw_bytes(pub_key) + .start_explicit(0); + + if(opts.challenge != "") + { + ASN1_String challenge(opts.challenge, DIRECTORY_STRING); + + tbs_req.encode( + Attribute("PKCS9.ChallengePassword", + DER_Encoder().encode(challenge).get_contents() + ) + ); + } + + tbs_req.encode( + Attribute("PKCS9.ExtensionRequest", + DER_Encoder() + .start_cons(SEQUENCE) + .encode(extensions) + .end_cons() + .get_contents() + ) + ) + .end_explicit() + .end_cons(); + + DataSource_Memory source( + X509_Object::make_signed(signer.get(), + rng, + sig_algo, + tbs_req.get_contents()) + ); + + return PKCS10_Request(source); + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509self.h b/src/libs/3rdparty/botan/src/cert/x509/x509self.h new file mode 100644 index 00000000000..bd3e291799c --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509self.h @@ -0,0 +1,198 @@ +/* +* X.509 Self-Signed Certificate +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_X509_SELF_H__ +#define BOTAN_X509_SELF_H__ + +#include +#include +#include + +namespace Botan { + +/** +* Options for X.509 certificates. +*/ +class BOTAN_DLL X509_Cert_Options + { + public: + /** + * the subject common name + */ + std::string common_name; + + /** + * the subject counry + */ + std::string country; + + /** + * the subject organization + */ + std::string organization; + + /** + * the subject organizational unit + */ + std::string org_unit; + + /** + * the subject locality + */ + std::string locality; + + /** + * the subject state + */ + std::string state; + + /** + * the subject serial number + */ + std::string serial_number; + + /** + * the subject email adress + */ + std::string email; + + /** + * the subject URI + */ + std::string uri; + + /** + * the subject IPv4 address + */ + std::string ip; + + /** + * the subject DNS + */ + std::string dns; + + /** + * the subject XMPP + */ + std::string xmpp; + + /** + * the subject challenge password + */ + std::string challenge; + + /** + * the subject notBefore + */ + X509_Time start; + /** + * the subject notAfter + */ + X509_Time end; + + /** + * Indicates whether the certificate request + */ + bool is_CA; + + /** + * Indicates the BasicConstraints path limit + */ + u32bit path_limit; + + /** + * The key constraints for the subject public key + */ + Key_Constraints constraints; + + /** + * The key extended constraints for the subject public key + */ + std::vector ex_constraints; + + /** + * Check the options set in this object for validity. + */ + void sanity_check() const; + + /** + * Mark the certificate as a CA certificate and set the path limit. + * @param limit the path limit to be set in the BasicConstraints extension. + */ + void CA_key(u32bit limit = 1); + + /** + * Set the notBefore of the certificate. + * @param time the notBefore value of the certificate + */ + void not_before(const std::string& time); + + /** + * Set the notAfter of the certificate. + * @param time the notAfter value of the certificate + */ + void not_after(const std::string& time); + + /** + * Add the key constraints of the KeyUsage extension. + * @param constr the constraints to set + */ + void add_constraints(Key_Constraints constr); + + /** + * Add constraints to the ExtendedKeyUsage extension. + * @param oid the oid to add + */ + void add_ex_constraint(const OID& oid); + + /** + * Add constraints to the ExtendedKeyUsage extension. + * @param name the name to look up the oid to add + */ + void add_ex_constraint(const std::string& name); + + /** + * Construct a new options object + * @param opts define the common name of this object. An example for this + * parameter would be "common_name/country/organization/organizational_unit". + * @param expire_time the expiration time (from the current clock in seconds) + */ + X509_Cert_Options(const std::string& opts = "", + u32bit expire_time = 365 * 24 * 60 * 60); + }; + +namespace X509 { + +/** +* Create a self-signed X.509 certificate. +* @param opts the options defining the certificate to create +* @param key the private key used for signing, i.e. the key +* associated with this self-signed certificate +* @param rng the rng to use +* @return the newly created self-signed certificate +*/ +BOTAN_DLL X509_Certificate +create_self_signed_cert(const X509_Cert_Options& opts, + const Private_Key& key, + RandomNumberGenerator& rng); + +/** +* Create a PKCS#10 certificate request. +* @param opts the options defining the request to create +* @param key the key used to sign this request +* @param rng the rng to use +* @return the newly created PKCS#10 request +*/ +BOTAN_DLL PKCS10_Request create_cert_req(const X509_Cert_Options& opts, + const Private_Key& key, + RandomNumberGenerator& rng); + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509stor.cpp b/src/libs/3rdparty/botan/src/cert/x509/x509stor.cpp new file mode 100644 index 00000000000..cb61bc2d293 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509stor.cpp @@ -0,0 +1,695 @@ +/* +* X.509 Certificate Store +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Do a validity check +*/ +s32bit validity_check(const X509_Time& start, const X509_Time& end, + u64bit current_time, u32bit slack) + { + const s32bit NOT_YET_VALID = -1, VALID_TIME = 0, EXPIRED = 1; + + if(start.cmp(current_time + slack) > 0) + return NOT_YET_VALID; + if(end.cmp(current_time - slack) < 0) + return EXPIRED; + return VALID_TIME; + } + +/* +* Compare the value of unique ID fields +*/ +bool compare_ids(const MemoryVector& id1, + const MemoryVector& id2) + { + if(!id1.size() || !id2.size()) + return true; + return (id1 == id2); + } + +/* +* Check a particular usage restriction +*/ +bool check_usage(const X509_Certificate& cert, X509_Store::Cert_Usage usage, + X509_Store::Cert_Usage check_for, Key_Constraints constraints) + { + if((usage & check_for) == 0) + return true; + if(cert.constraints() == NO_CONSTRAINTS) + return true; + if(cert.constraints() & constraints) + return true; + return false; + } + +/* +* Check a particular usage restriction +*/ +bool check_usage(const X509_Certificate& cert, X509_Store::Cert_Usage usage, + X509_Store::Cert_Usage check_for, + const std::string& usage_oid) + { + if((usage & check_for) == 0) + return true; + + const std::vector constraints = cert.ex_constraints(); + + if(constraints.empty()) + return true; + + return std::binary_search(constraints.begin(), constraints.end(), + usage_oid); + } + +/* +* Check the usage restrictions +*/ +X509_Code usage_check(const X509_Certificate& cert, + X509_Store::Cert_Usage usage) + { + if(usage == X509_Store::ANY) + return VERIFIED; + + if(!check_usage(cert, usage, X509_Store::CRL_SIGNING, CRL_SIGN)) + return CA_CERT_NOT_FOR_CRL_ISSUER; + + if(!check_usage(cert, usage, X509_Store::TLS_SERVER, "PKIX.ServerAuth")) + return INVALID_USAGE; + if(!check_usage(cert, usage, X509_Store::TLS_CLIENT, "PKIX.ClientAuth")) + return INVALID_USAGE; + if(!check_usage(cert, usage, X509_Store::CODE_SIGNING, "PKIX.CodeSigning")) + return INVALID_USAGE; + if(!check_usage(cert, usage, X509_Store::EMAIL_PROTECTION, + "PKIX.EmailProtection")) + return INVALID_USAGE; + if(!check_usage(cert, usage, X509_Store::TIME_STAMPING, + "PKIX.TimeStamping")) + return INVALID_USAGE; + + return VERIFIED; + } + +} + +/* +* Define equality for revocation data +*/ +bool X509_Store::CRL_Data::operator==(const CRL_Data& other) const + { + if(issuer != other.issuer) + return false; + if(serial != other.serial) + return false; + return compare_ids(auth_key_id, other.auth_key_id); + } + +/* +* Define inequality for revocation data +*/ +bool X509_Store::CRL_Data::operator!=(const CRL_Data& other) const + { + return !((*this) == other); + } + +/* +* Define an ordering for revocation data +*/ +bool X509_Store::CRL_Data::operator<(const X509_Store::CRL_Data& other) const + { + if(*this == other) + return false; + + const MemoryVector& serial1 = serial; + const MemoryVector& key_id1 = auth_key_id; + const MemoryVector& serial2 = other.serial; + const MemoryVector& key_id2 = other.auth_key_id; + + if(compare_ids(key_id1, key_id2) == false) + { + if(std::lexicographical_compare(key_id1.begin(), key_id1.end(), + key_id2.begin(), key_id2.end())) + return true; + + if(std::lexicographical_compare(key_id2.begin(), key_id2.end(), + key_id1.begin(), key_id1.end())) + return false; + } + + if(compare_ids(serial1, serial2) == false) + { + if(std::lexicographical_compare(serial1.begin(), serial1.end(), + serial2.begin(), serial2.end())) + return true; + + if(std::lexicographical_compare(serial2.begin(), serial2.end(), + serial1.begin(), serial1.end())) + return false; + } + + return (issuer < other.issuer); + } + +/* +* X509_Store Constructor +*/ +X509_Store::X509_Store(u32bit slack, u32bit cache_timeout) + { + revoked_info_valid = true; + + validation_cache_timeout = cache_timeout; + time_slack = slack; + } + +/* +* X509_Store Copy Constructor +*/ +X509_Store::X509_Store(const X509_Store& other) + { + certs = other.certs; + revoked = other.revoked; + revoked_info_valid = other.revoked_info_valid; + for(u32bit j = 0; j != other.stores.size(); ++j) + stores[j] = other.stores[j]->clone(); + time_slack = other.time_slack; + } + +/* +* X509_Store Destructor +*/ +X509_Store::~X509_Store() + { + for(u32bit j = 0; j != stores.size(); ++j) + delete stores[j]; + } + +/* +* Verify a certificate's authenticity +*/ +X509_Code X509_Store::validate_cert(const X509_Certificate& cert, + Cert_Usage cert_usage) + { + recompute_revoked_info(); + + std::vector indexes; + X509_Code chaining_result = construct_cert_chain(cert, indexes); + if(chaining_result != VERIFIED) + return chaining_result; + + const u64bit current_time = system_time(); + + s32bit time_check = validity_check(cert.start_time(), cert.end_time(), + current_time, time_slack); + if(time_check < 0) return CERT_NOT_YET_VALID; + else if(time_check > 0) return CERT_HAS_EXPIRED; + + X509_Code sig_check_result = check_sig(cert, certs[indexes[0]]); + if(sig_check_result != VERIFIED) + return sig_check_result; + + if(is_revoked(cert)) + return CERT_IS_REVOKED; + + for(u32bit j = 0; j != indexes.size() - 1; ++j) + { + const X509_Certificate& current_cert = certs[indexes[j]].cert; + + time_check = validity_check(current_cert.start_time(), + current_cert.end_time(), + current_time, + time_slack); + + if(time_check < 0) return CERT_NOT_YET_VALID; + else if(time_check > 0) return CERT_HAS_EXPIRED; + + sig_check_result = check_sig(certs[indexes[j]], certs[indexes[j+1]]); + if(sig_check_result != VERIFIED) + return sig_check_result; + } + + return usage_check(cert, cert_usage); + } + +/* +* Find this certificate +*/ +u32bit X509_Store::find_cert(const X509_DN& subject_dn, + const MemoryRegion& subject_key_id) const + { + for(u32bit j = 0; j != certs.size(); ++j) + { + const X509_Certificate& this_cert = certs[j].cert; + if(compare_ids(this_cert.subject_key_id(), subject_key_id) && + this_cert.subject_dn() == subject_dn) + return j; + } + return NO_CERT_FOUND; + } + +/* +* Find the parent of this certificate +*/ +u32bit X509_Store::find_parent_of(const X509_Certificate& cert) + { + const X509_DN issuer_dn = cert.issuer_dn(); + const MemoryVector auth_key_id = cert.authority_key_id(); + + u32bit index = find_cert(issuer_dn, auth_key_id); + + if(index != NO_CERT_FOUND) + return index; + + if(auth_key_id.size()) + { + for(u32bit j = 0; j != stores.size(); ++j) + { + std::vector got = stores[j]->by_SKID(auth_key_id); + + if(got.empty()) + continue; + + for(u32bit k = 0; k != got.size(); ++k) + add_cert(got[k]); + return find_cert(issuer_dn, auth_key_id); + } + } + + return NO_CERT_FOUND; + } + +/* +* Construct a chain of certificate relationships +*/ +X509_Code X509_Store::construct_cert_chain(const X509_Certificate& end_cert, + std::vector& indexes, + bool need_full_chain) + { + u32bit parent = find_parent_of(end_cert); + + while(true) + { + if(parent == NO_CERT_FOUND) + return CERT_ISSUER_NOT_FOUND; + indexes.push_back(parent); + + if(certs[parent].is_verified(validation_cache_timeout)) + if(certs[parent].verify_result() != VERIFIED) + return certs[parent].verify_result(); + + const X509_Certificate& parent_cert = certs[parent].cert; + if(!parent_cert.is_CA_cert()) + return CA_CERT_NOT_FOR_CERT_ISSUER; + + if(certs[parent].is_trusted()) + break; + if(parent_cert.is_self_signed()) + return CANNOT_ESTABLISH_TRUST; + + if(parent_cert.path_limit() < indexes.size() - 1) + return CERT_CHAIN_TOO_LONG; + + parent = find_parent_of(parent_cert); + } + + if(need_full_chain) + return VERIFIED; + + while(true) + { + if(indexes.size() < 2) + break; + + const u32bit cert = indexes.back(); + + if(certs[cert].is_verified(validation_cache_timeout)) + { + if(certs[cert].verify_result() != VERIFIED) + throw Internal_Error("X509_Store::construct_cert_chain"); + indexes.pop_back(); + } + else + break; + } + + const u32bit last_cert = indexes.back(); + const u32bit parent_of_last_cert = find_parent_of(certs[last_cert].cert); + if(parent_of_last_cert == NO_CERT_FOUND) + return CERT_ISSUER_NOT_FOUND; + indexes.push_back(parent_of_last_cert); + + return VERIFIED; + } + +/* +* Check the CAs signature on a certificate +*/ +X509_Code X509_Store::check_sig(const Cert_Info& cert_info, + const Cert_Info& ca_cert_info) const + { + if(cert_info.is_verified(validation_cache_timeout)) + return cert_info.verify_result(); + + const X509_Certificate& cert = cert_info.cert; + const X509_Certificate& ca_cert = ca_cert_info.cert; + + X509_Code verify_code = check_sig(cert, ca_cert.subject_public_key()); + + cert_info.set_result(verify_code); + + return verify_code; + } + +/* +* Check a CA's signature +*/ +X509_Code X509_Store::check_sig(const X509_Object& object, Public_Key* key) + { + std::auto_ptr pub_key(key); + std::auto_ptr verifier; + + try { + std::vector sig_info = + split_on(OIDS::lookup(object.signature_algorithm().oid), '/'); + + if(sig_info.size() != 2 || sig_info[0] != pub_key->algo_name()) + return SIGNATURE_ERROR; + + std::string padding = sig_info[1]; + Signature_Format format; + if(key->message_parts() >= 2) format = DER_SEQUENCE; + else format = IEEE_1363; + + if(dynamic_cast(pub_key.get())) + { + PK_Verifying_with_MR_Key* sig_key = + dynamic_cast(pub_key.get()); + verifier.reset(get_pk_verifier(*sig_key, padding, format)); + } + else if(dynamic_cast(pub_key.get())) + { + PK_Verifying_wo_MR_Key* sig_key = + dynamic_cast(pub_key.get()); + verifier.reset(get_pk_verifier(*sig_key, padding, format)); + } + else + return CA_CERT_CANNOT_SIGN; + + bool valid = verifier->verify_message(object.tbs_data(), + object.signature()); + + if(valid) + return VERIFIED; + else + return SIGNATURE_ERROR; + } + catch(Decoding_Error) { return CERT_FORMAT_ERROR; } + catch(Exception) {} + + return UNKNOWN_X509_ERROR; + } + +/* +* Recompute the revocation status of the certs +*/ +void X509_Store::recompute_revoked_info() const + { + if(revoked_info_valid) + return; + + for(u32bit j = 0; j != certs.size(); ++j) + { + if((certs[j].is_verified(validation_cache_timeout)) && + (certs[j].verify_result() != VERIFIED)) + continue; + + if(is_revoked(certs[j].cert)) + certs[j].set_result(CERT_IS_REVOKED); + } + + revoked_info_valid = true; + } + +/* +* Check if a certificate is revoked +*/ +bool X509_Store::is_revoked(const X509_Certificate& cert) const + { + CRL_Data revoked_info; + revoked_info.issuer = cert.issuer_dn(); + revoked_info.serial = cert.serial_number(); + revoked_info.auth_key_id = cert.authority_key_id(); + + if(std::binary_search(revoked.begin(), revoked.end(), revoked_info)) + return true; + return false; + } + +/* +* Retrieve all the certificates in the store +*/ +std::vector +X509_Store::get_certs(const Search_Func& search) const + { + std::vector found_certs; + for(u32bit j = 0; j != certs.size(); ++j) + { + if(search.match(certs[j].cert)) + found_certs.push_back(certs[j].cert); + } + return found_certs; + } + +/* +* Construct a path back to a root for this cert +*/ +std::vector +X509_Store::get_cert_chain(const X509_Certificate& cert) + { + std::vector result; + std::vector indexes; + X509_Code chaining_result = construct_cert_chain(cert, indexes, true); + + if(chaining_result != VERIFIED) + throw Invalid_State("X509_Store::get_cert_chain: Can't construct chain"); + + for(u32bit j = 0; j != indexes.size(); ++j) + result.push_back(certs[indexes[j]].cert); + return result; + } + +/* +* Add a certificate store to the list of stores +*/ +void X509_Store::add_new_certstore(Certificate_Store* certstore) + { + stores.push_back(certstore); + } + +/* +* Add a certificate to the store +*/ +void X509_Store::add_cert(const X509_Certificate& cert, bool trusted) + { + if(trusted && !cert.is_self_signed()) + throw Invalid_Argument("X509_Store: Trusted certs must be self-signed"); + + if(find_cert(cert.subject_dn(), cert.subject_key_id()) == NO_CERT_FOUND) + { + revoked_info_valid = false; + Cert_Info info(cert, trusted); + certs.push_back(info); + } + else if(trusted) + { + for(u32bit j = 0; j != certs.size(); ++j) + { + const X509_Certificate& this_cert = certs[j].cert; + if(this_cert == cert) + certs[j].trusted = trusted; + } + } + } + +/* +* Add one or more certificates to the store +*/ +void X509_Store::do_add_certs(DataSource& source, bool trusted) + { + while(!source.end_of_data()) + { + try { + X509_Certificate cert(source); + add_cert(cert, trusted); + } + catch(Decoding_Error) {} + catch(Invalid_Argument) {} + } + } + +/* +* Add one or more certificates to the store +*/ +void X509_Store::add_certs(DataSource& source) + { + do_add_certs(source, false); + } + +/* +* Add one or more certificates to the store +*/ +void X509_Store::add_trusted_certs(DataSource& source) + { + do_add_certs(source, true); + } + +/* +* Add one or more certificates to the store +*/ +X509_Code X509_Store::add_crl(const X509_CRL& crl) + { + s32bit time_check = validity_check(crl.this_update(), crl.next_update(), + system_time(), time_slack); + + if(time_check < 0) return CRL_NOT_YET_VALID; + else if(time_check > 0) return CRL_HAS_EXPIRED; + + u32bit cert_index = NO_CERT_FOUND; + + for(u32bit j = 0; j != certs.size(); ++j) + { + const X509_Certificate& this_cert = certs[j].cert; + if(compare_ids(this_cert.subject_key_id(), crl.authority_key_id())) + { + if(this_cert.subject_dn() == crl.issuer_dn()) + cert_index = j; + } + } + + if(cert_index == NO_CERT_FOUND) + return CRL_ISSUER_NOT_FOUND; + + const X509_Certificate& ca_cert = certs[cert_index].cert; + + X509_Code verify_result = validate_cert(ca_cert, CRL_SIGNING); + if(verify_result != VERIFIED) + return verify_result; + + verify_result = check_sig(crl, ca_cert.subject_public_key()); + if(verify_result != VERIFIED) + return verify_result; + + std::vector revoked_certs = crl.get_revoked(); + + for(u32bit j = 0; j != revoked_certs.size(); ++j) + { + CRL_Data revoked_info; + revoked_info.issuer = crl.issuer_dn(); + revoked_info.serial = revoked_certs[j].serial_number(); + revoked_info.auth_key_id = crl.authority_key_id(); + + std::vector::iterator p = + std::find(revoked.begin(), revoked.end(), revoked_info); + + if(revoked_certs[j].reason_code() == REMOVE_FROM_CRL) + { + if(p == revoked.end()) continue; + revoked.erase(p); + } + else + { + if(p != revoked.end()) continue; + revoked.push_back(revoked_info); + } + } + + std::sort(revoked.begin(), revoked.end()); + revoked_info_valid = false; + + return VERIFIED; + } + +/* +* PEM encode the set of certificates +*/ +std::string X509_Store::PEM_encode() const + { + std::string cert_store; + for(u32bit j = 0; j != certs.size(); ++j) + cert_store += certs[j].cert.PEM_encode(); + return cert_store; + } + +/* +* Create a Cert_Info structure +*/ +X509_Store::Cert_Info::Cert_Info(const X509_Certificate& c, + bool t) : cert(c), trusted(t) + { + checked = false; + result = UNKNOWN_X509_ERROR; + last_checked = 0; + } + +/* +* Return the verification results +*/ +X509_Code X509_Store::Cert_Info::verify_result() const + { + if(!checked) + throw Invalid_State("Cert_Info::verify_result() called; not checked"); + return result; + } + +/* +* Set the verification results +*/ +void X509_Store::Cert_Info::set_result(X509_Code code) const + { + result = code; + last_checked = system_time(); + checked = true; + } + +/* +* Check if this certificate can be trusted +*/ +bool X509_Store::Cert_Info::is_trusted() const + { + return trusted; + } + +/* +* Check if this certificate has been verified +*/ +bool X509_Store::Cert_Info::is_verified(u32bit timeout) const + { + if(!checked) + return false; + if(result != VERIFIED && result != CERT_NOT_YET_VALID) + return true; + + const u64bit current_time = system_time(); + + if(current_time > last_checked + timeout) + checked = false; + + return checked; + } + +} diff --git a/src/libs/3rdparty/botan/src/cert/x509/x509stor.h b/src/libs/3rdparty/botan/src/cert/x509/x509stor.h new file mode 100644 index 00000000000..4e60378836d --- /dev/null +++ b/src/libs/3rdparty/botan/src/cert/x509/x509stor.h @@ -0,0 +1,143 @@ +/* +* X.509 Certificate Store +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_X509_CERT_STORE_H__ +#define BOTAN_X509_CERT_STORE_H__ + +#include +#include +#include + +namespace Botan { + +/* +* X.509 Certificate Validation Result +*/ +enum X509_Code { + VERIFIED, + UNKNOWN_X509_ERROR, + CANNOT_ESTABLISH_TRUST, + CERT_CHAIN_TOO_LONG, + SIGNATURE_ERROR, + POLICY_ERROR, + INVALID_USAGE, + + CERT_FORMAT_ERROR, + CERT_ISSUER_NOT_FOUND, + CERT_NOT_YET_VALID, + CERT_HAS_EXPIRED, + CERT_IS_REVOKED, + + CRL_FORMAT_ERROR, + CRL_ISSUER_NOT_FOUND, + CRL_NOT_YET_VALID, + CRL_HAS_EXPIRED, + + CA_CERT_CANNOT_SIGN, + CA_CERT_NOT_FOR_CERT_ISSUER, + CA_CERT_NOT_FOR_CRL_ISSUER +}; + +/* +* X.509 Certificate Store +*/ +class BOTAN_DLL X509_Store + { + public: + class BOTAN_DLL Search_Func + { + public: + virtual bool match(const X509_Certificate&) const = 0; + virtual ~Search_Func() {} + }; + + enum Cert_Usage { + ANY = 0x00, + TLS_SERVER = 0x01, + TLS_CLIENT = 0x02, + CODE_SIGNING = 0x04, + EMAIL_PROTECTION = 0x08, + TIME_STAMPING = 0x10, + CRL_SIGNING = 0x20 + }; + + X509_Code validate_cert(const X509_Certificate&, Cert_Usage = ANY); + + std::vector get_certs(const Search_Func&) const; + std::vector get_cert_chain(const X509_Certificate&); + std::string PEM_encode() const; + + /* + * Made CRL_Data public for XLC for Cell 0.9, otherwise cannot + * instantiate member variable std::vector revoked + */ + class BOTAN_DLL CRL_Data + { + public: + X509_DN issuer; + MemoryVector serial, auth_key_id; + bool operator==(const CRL_Data&) const; + bool operator!=(const CRL_Data&) const; + bool operator<(const CRL_Data&) const; + }; + + X509_Code add_crl(const X509_CRL&); + void add_cert(const X509_Certificate&, bool = false); + void add_certs(DataSource&); + void add_trusted_certs(DataSource&); + + void add_new_certstore(Certificate_Store*); + + static X509_Code check_sig(const X509_Object&, Public_Key*); + + X509_Store(u32bit time_slack = 24*60*60, + u32bit cache_results = 30*60); + + X509_Store(const X509_Store&); + ~X509_Store(); + private: + X509_Store& operator=(const X509_Store&) { return (*this); } + + class BOTAN_DLL Cert_Info + { + public: + bool is_verified(u32bit timeout) const; + bool is_trusted() const; + X509_Code verify_result() const; + void set_result(X509_Code) const; + Cert_Info(const X509_Certificate&, bool = false); + + X509_Certificate cert; + bool trusted; + private: + mutable bool checked; + mutable X509_Code result; + mutable u64bit last_checked; + }; + + u32bit find_cert(const X509_DN&, const MemoryRegion&) const; + X509_Code check_sig(const Cert_Info&, const Cert_Info&) const; + void recompute_revoked_info() const; + + void do_add_certs(DataSource&, bool); + X509_Code construct_cert_chain(const X509_Certificate&, + std::vector&, bool = false); + + u32bit find_parent_of(const X509_Certificate&); + bool is_revoked(const X509_Certificate&) const; + + static const u32bit NO_CERT_FOUND = 0xFFFFFFFF; + std::vector certs; + std::vector revoked; + std::vector stores; + u32bit time_slack, validation_cache_timeout; + mutable bool revoked_info_valid; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/checksum/adler32/adler32.cpp b/src/libs/3rdparty/botan/src/checksum/adler32/adler32.cpp new file mode 100644 index 00000000000..c66943b88a2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/checksum/adler32/adler32.cpp @@ -0,0 +1,74 @@ +/* +* Adler32 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Adler32 Checksum +*/ +void Adler32::hash(const byte input[], u32bit length) + { + u32bit S1x = S1, S2x = S2; + while(length >= 16) + { + S1x += input[ 0]; S2x += S1x; + S1x += input[ 1]; S2x += S1x; + S1x += input[ 2]; S2x += S1x; + S1x += input[ 3]; S2x += S1x; + S1x += input[ 4]; S2x += S1x; + S1x += input[ 5]; S2x += S1x; + S1x += input[ 6]; S2x += S1x; + S1x += input[ 7]; S2x += S1x; + S1x += input[ 8]; S2x += S1x; + S1x += input[ 9]; S2x += S1x; + S1x += input[10]; S2x += S1x; + S1x += input[11]; S2x += S1x; + S1x += input[12]; S2x += S1x; + S1x += input[13]; S2x += S1x; + S1x += input[14]; S2x += S1x; + S1x += input[15]; S2x += S1x; + input += 16; + length -= 16; + } + for(u32bit j = 0; j != length; ++j) + { + S1x += input[j]; S2x += S1x; + } + S1x %= 65521; + S2x %= 65521; + S1 = S1x; + S2 = S2x; + } + +/* +* Update an Adler32 Checksum +*/ +void Adler32::add_data(const byte input[], u32bit length) + { + const u32bit PROCESS_AMOUNT = 5552; + while(length >= PROCESS_AMOUNT) + { + hash(input, PROCESS_AMOUNT); + input += PROCESS_AMOUNT; + length -= PROCESS_AMOUNT; + } + hash(input, length); + } + +/* +* Finalize an Adler32 Checksum +*/ +void Adler32::final_result(byte output[]) + { + store_be(output, S2, S1); + clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/checksum/adler32/adler32.h b/src/libs/3rdparty/botan/src/checksum/adler32/adler32.h new file mode 100644 index 00000000000..98a28bc81da --- /dev/null +++ b/src/libs/3rdparty/botan/src/checksum/adler32/adler32.h @@ -0,0 +1,35 @@ +/* +* Adler32 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ADLER32_H__ +#define BOTAN_ADLER32_H__ + +#include + +namespace Botan { + +/* +* Adler32 +*/ +class BOTAN_DLL Adler32 : public HashFunction + { + public: + void clear() throw() { S1 = 1; S2 = 0; } + std::string name() const { return "Adler32"; } + HashFunction* clone() const { return new Adler32; } + Adler32() : HashFunction(4) { clear(); } + ~Adler32() { clear(); } + private: + void add_data(const byte[], u32bit); + void final_result(byte[]); + void hash(const byte[], u32bit); + u16bit S1, S2; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/checksum/adler32/info.txt b/src/libs/3rdparty/botan/src/checksum/adler32/info.txt new file mode 100644 index 00000000000..76662cdec89 --- /dev/null +++ b/src/libs/3rdparty/botan/src/checksum/adler32/info.txt @@ -0,0 +1,14 @@ +realname "Adler32" + +define ADLER32 + +load_on auto + + +adler32.cpp +adler32.h + + + +hash + diff --git a/src/libs/3rdparty/botan/src/checksum/crc24/crc24.cpp b/src/libs/3rdparty/botan/src/checksum/crc24/crc24.cpp new file mode 100644 index 00000000000..e50b4d33e3f --- /dev/null +++ b/src/libs/3rdparty/botan/src/checksum/crc24/crc24.cpp @@ -0,0 +1,100 @@ +/* +* CRC24 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Update a CRC24 Checksum +*/ +void CRC24::add_data(const byte input[], u32bit length) + { + const u32bit TABLE[256] = { + 0x00000000, 0x00864CFB, 0x008AD50D, 0x000C99F6, 0x0093E6E1, 0x0015AA1A, + 0x001933EC, 0x009F7F17, 0x00A18139, 0x0027CDC2, 0x002B5434, 0x00AD18CF, + 0x003267D8, 0x00B42B23, 0x00B8B2D5, 0x003EFE2E, 0x00C54E89, 0x00430272, + 0x004F9B84, 0x00C9D77F, 0x0056A868, 0x00D0E493, 0x00DC7D65, 0x005A319E, + 0x0064CFB0, 0x00E2834B, 0x00EE1ABD, 0x00685646, 0x00F72951, 0x007165AA, + 0x007DFC5C, 0x00FBB0A7, 0x000CD1E9, 0x008A9D12, 0x008604E4, 0x0000481F, + 0x009F3708, 0x00197BF3, 0x0015E205, 0x0093AEFE, 0x00AD50D0, 0x002B1C2B, + 0x002785DD, 0x00A1C926, 0x003EB631, 0x00B8FACA, 0x00B4633C, 0x00322FC7, + 0x00C99F60, 0x004FD39B, 0x00434A6D, 0x00C50696, 0x005A7981, 0x00DC357A, + 0x00D0AC8C, 0x0056E077, 0x00681E59, 0x00EE52A2, 0x00E2CB54, 0x006487AF, + 0x00FBF8B8, 0x007DB443, 0x00712DB5, 0x00F7614E, 0x0019A3D2, 0x009FEF29, + 0x009376DF, 0x00153A24, 0x008A4533, 0x000C09C8, 0x0000903E, 0x0086DCC5, + 0x00B822EB, 0x003E6E10, 0x0032F7E6, 0x00B4BB1D, 0x002BC40A, 0x00AD88F1, + 0x00A11107, 0x00275DFC, 0x00DCED5B, 0x005AA1A0, 0x00563856, 0x00D074AD, + 0x004F0BBA, 0x00C94741, 0x00C5DEB7, 0x0043924C, 0x007D6C62, 0x00FB2099, + 0x00F7B96F, 0x0071F594, 0x00EE8A83, 0x0068C678, 0x00645F8E, 0x00E21375, + 0x0015723B, 0x00933EC0, 0x009FA736, 0x0019EBCD, 0x008694DA, 0x0000D821, + 0x000C41D7, 0x008A0D2C, 0x00B4F302, 0x0032BFF9, 0x003E260F, 0x00B86AF4, + 0x002715E3, 0x00A15918, 0x00ADC0EE, 0x002B8C15, 0x00D03CB2, 0x00567049, + 0x005AE9BF, 0x00DCA544, 0x0043DA53, 0x00C596A8, 0x00C90F5E, 0x004F43A5, + 0x0071BD8B, 0x00F7F170, 0x00FB6886, 0x007D247D, 0x00E25B6A, 0x00641791, + 0x00688E67, 0x00EEC29C, 0x003347A4, 0x00B50B5F, 0x00B992A9, 0x003FDE52, + 0x00A0A145, 0x0026EDBE, 0x002A7448, 0x00AC38B3, 0x0092C69D, 0x00148A66, + 0x00181390, 0x009E5F6B, 0x0001207C, 0x00876C87, 0x008BF571, 0x000DB98A, + 0x00F6092D, 0x007045D6, 0x007CDC20, 0x00FA90DB, 0x0065EFCC, 0x00E3A337, + 0x00EF3AC1, 0x0069763A, 0x00578814, 0x00D1C4EF, 0x00DD5D19, 0x005B11E2, + 0x00C46EF5, 0x0042220E, 0x004EBBF8, 0x00C8F703, 0x003F964D, 0x00B9DAB6, + 0x00B54340, 0x00330FBB, 0x00AC70AC, 0x002A3C57, 0x0026A5A1, 0x00A0E95A, + 0x009E1774, 0x00185B8F, 0x0014C279, 0x00928E82, 0x000DF195, 0x008BBD6E, + 0x00872498, 0x00016863, 0x00FAD8C4, 0x007C943F, 0x00700DC9, 0x00F64132, + 0x00693E25, 0x00EF72DE, 0x00E3EB28, 0x0065A7D3, 0x005B59FD, 0x00DD1506, + 0x00D18CF0, 0x0057C00B, 0x00C8BF1C, 0x004EF3E7, 0x00426A11, 0x00C426EA, + 0x002AE476, 0x00ACA88D, 0x00A0317B, 0x00267D80, 0x00B90297, 0x003F4E6C, + 0x0033D79A, 0x00B59B61, 0x008B654F, 0x000D29B4, 0x0001B042, 0x0087FCB9, + 0x001883AE, 0x009ECF55, 0x009256A3, 0x00141A58, 0x00EFAAFF, 0x0069E604, + 0x00657FF2, 0x00E33309, 0x007C4C1E, 0x00FA00E5, 0x00F69913, 0x0070D5E8, + 0x004E2BC6, 0x00C8673D, 0x00C4FECB, 0x0042B230, 0x00DDCD27, 0x005B81DC, + 0x0057182A, 0x00D154D1, 0x0026359F, 0x00A07964, 0x00ACE092, 0x002AAC69, + 0x00B5D37E, 0x00339F85, 0x003F0673, 0x00B94A88, 0x0087B4A6, 0x0001F85D, + 0x000D61AB, 0x008B2D50, 0x00145247, 0x00921EBC, 0x009E874A, 0x0018CBB1, + 0x00E37B16, 0x006537ED, 0x0069AE1B, 0x00EFE2E0, 0x00709DF7, 0x00F6D10C, + 0x00FA48FA, 0x007C0401, 0x0042FA2F, 0x00C4B6D4, 0x00C82F22, 0x004E63D9, + 0x00D11CCE, 0x00575035, 0x005BC9C3, 0x00DD8538 }; + + u32bit tmp = crc; + while(length >= 16) + { + tmp = TABLE[((tmp >> 16) ^ input[ 0]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[ 1]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[ 2]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[ 3]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[ 4]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[ 5]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[ 6]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[ 7]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[ 8]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[ 9]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[10]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[11]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[12]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[13]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[14]) & 0xFF] ^ (tmp << 8); + tmp = TABLE[((tmp >> 16) ^ input[15]) & 0xFF] ^ (tmp << 8); + input += 16; + length -= 16; + } + for(u32bit j = 0; j != length; ++j) + tmp = TABLE[((tmp >> 16) ^ input[j]) & 0xFF] ^ (tmp << 8); + crc = tmp; + } + +/* +* Finalize a CRC24 Checksum +*/ +void CRC24::final_result(byte output[]) + { + for(u32bit j = 0; j != 3; ++j) + output[j] = get_byte(j+1, crc); + clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/checksum/crc24/crc24.h b/src/libs/3rdparty/botan/src/checksum/crc24/crc24.h new file mode 100644 index 00000000000..bca4d0e8965 --- /dev/null +++ b/src/libs/3rdparty/botan/src/checksum/crc24/crc24.h @@ -0,0 +1,34 @@ +/* +* CRC24 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CRC24_H__ +#define BOTAN_CRC24_H__ + +#include + +namespace Botan { + +/* +* CRC24 +*/ +class BOTAN_DLL CRC24 : public HashFunction + { + public: + void clear() throw() { crc = 0xB704CE; } + std::string name() const { return "CRC24"; } + HashFunction* clone() const { return new CRC24; } + CRC24() : HashFunction(3) { clear(); } + ~CRC24() { clear(); } + private: + void add_data(const byte[], u32bit); + void final_result(byte[]); + u32bit crc; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/checksum/crc24/info.txt b/src/libs/3rdparty/botan/src/checksum/crc24/info.txt new file mode 100644 index 00000000000..33b86a9daf5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/checksum/crc24/info.txt @@ -0,0 +1,14 @@ +realname "CRC-24" + +define CRC24 + +load_on auto + + +crc24.cpp +crc24.h + + + +hash + diff --git a/src/libs/3rdparty/botan/src/checksum/crc32/crc32.cpp b/src/libs/3rdparty/botan/src/checksum/crc32/crc32.cpp new file mode 100644 index 00000000000..42462096f01 --- /dev/null +++ b/src/libs/3rdparty/botan/src/checksum/crc32/crc32.cpp @@ -0,0 +1,102 @@ +/* +* CRC32 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Update a CRC32 Checksum +*/ +void CRC32::add_data(const byte input[], u32bit length) + { + const u32bit TABLE[256] = { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, + 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, + 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, + 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, + 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, + 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, + 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, + 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, + 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, + 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, + 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, + 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, + 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, + 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, + 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, + 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, + 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, + 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, + 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, + 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, + 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, + 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, + 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, + 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, + 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, + 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, + 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, + 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, + 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, + 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, + 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, + 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, + 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D }; + + u32bit tmp = crc; + while(length >= 16) + { + tmp = TABLE[(tmp ^ input[ 0]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[ 1]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[ 2]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[ 3]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[ 4]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[ 5]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[ 6]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[ 7]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[ 8]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[ 9]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[10]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[11]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[12]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[13]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[14]) & 0xFF] ^ (tmp >> 8); + tmp = TABLE[(tmp ^ input[15]) & 0xFF] ^ (tmp >> 8); + input += 16; + length -= 16; + } + + for(u32bit j = 0; j != length; ++j) + tmp = TABLE[(tmp ^ input[j]) & 0xFF] ^ (tmp >> 8); + + crc = tmp; + } + +/* +* Finalize a CRC32 Checksum +*/ +void CRC32::final_result(byte output[]) + { + crc ^= 0xFFFFFFFF; + store_be(crc, output); + clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/checksum/crc32/crc32.h b/src/libs/3rdparty/botan/src/checksum/crc32/crc32.h new file mode 100644 index 00000000000..390fb100eac --- /dev/null +++ b/src/libs/3rdparty/botan/src/checksum/crc32/crc32.h @@ -0,0 +1,34 @@ +/* +* CRC32 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CRC32_H__ +#define BOTAN_CRC32_H__ + +#include + +namespace Botan { + +/* +* CRC32 +*/ +class BOTAN_DLL CRC32 : public HashFunction + { + public: + void clear() throw() { crc = 0xFFFFFFFF; } + std::string name() const { return "CRC32"; } + HashFunction* clone() const { return new CRC32; } + CRC32() : HashFunction(4) { clear(); } + ~CRC32() { clear(); } + private: + void add_data(const byte[], u32bit); + void final_result(byte[]); + u32bit crc; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/checksum/crc32/info.txt b/src/libs/3rdparty/botan/src/checksum/crc32/info.txt new file mode 100644 index 00000000000..15933b37591 --- /dev/null +++ b/src/libs/3rdparty/botan/src/checksum/crc32/info.txt @@ -0,0 +1,14 @@ +realname "CRC-32" + +define CRC32 + +load_on auto + + +crc32.cpp +crc32.h + + + +hash + diff --git a/src/libs/3rdparty/botan/src/cms/cms_algo.cpp b/src/libs/3rdparty/botan/src/cms/cms_algo.cpp new file mode 100644 index 00000000000..748aa73daec --- /dev/null +++ b/src/libs/3rdparty/botan/src/cms/cms_algo.cpp @@ -0,0 +1,164 @@ +/* +* CMS Algorithm Specific Code +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +#if defined(BOTAN_HAS_RC2) + #include +#endif + +namespace Botan { + +namespace { + +/* +* Wrap a key as specified in RFC 3217 +*/ +SecureVector do_rfc3217_wrap(RandomNumberGenerator& rng, + const std::string& cipher_name, + const SymmetricKey& kek, + const SecureVector& input) + { + class Flip_Bytes : public Filter + { + public: + void write(const byte data[], u32bit length) + { + buf.append(data, length); + } + void end_msg() + { + for(u32bit j = 0; j != buf.size(); j++) + send(buf[buf.size()-j-1]); + buf.destroy(); + } + Flip_Bytes(const SecureVector& prefix) { buf.append(prefix); } + private: + SecureVector buf; + }; + + Algorithm_Factory& af = global_state().algorithm_factory(); + + const BlockCipher* cipher = af.prototype_block_cipher(cipher_name); + + if(!cipher || cipher->BLOCK_SIZE != 8) + throw Encoding_Error("do_rfc3217_wrap: Bad cipher: " + cipher_name); + + Pipe icv(new Hash_Filter(new SHA_160, 8)); + icv.process_msg(input); + + InitializationVector iv(rng, 8); + InitializationVector fixed("4ADDA22C79E82105"); + + Pipe pipe(new CBC_Encryption(cipher->clone(), new Null_Padding, kek, iv), + new Flip_Bytes(iv.bits_of()), + new CBC_Encryption(cipher->clone(), new Null_Padding, kek, iv)); + + pipe.start_msg(); + pipe.write(input); + pipe.write(icv.read_all()); + pipe.end_msg(); + return pipe.read_all(); + } + +} + +/* +* Wrap a CEK with a KEK +*/ +SecureVector CMS_Encoder::wrap_key(RandomNumberGenerator& rng, + const std::string& cipher, + const SymmetricKey& cek, + const SymmetricKey& kek) + { +#if defined(BOTAN_HAS_DES) + if(cipher == "TripleDES") + { + SymmetricKey cek_parity = cek; + cek_parity.set_odd_parity(); + return do_rfc3217_wrap(rng, cipher, kek, cek_parity.bits_of()); + } +#endif + +#if defined(BOTAN_HAS_RC2) || defined(BOTAN_HAS_CAST) + if(cipher == "RC2" || cipher == "CAST-128") + { + if(kek.length() != 16) + throw Encoding_Error("CMS: 128-bit KEKs must be used with " + cipher); + + SecureVector lcekpad; + lcekpad.append((byte)cek.length()); + lcekpad.append(cek.bits_of()); + while(lcekpad.size() % 8) + lcekpad.append(rng.next_byte()); + return do_rfc3217_wrap(rng, cipher, kek, lcekpad); + } +#endif + + throw Invalid_Argument("CMS_Encoder::wrap: Unknown cipher " + cipher); + } + +/* +* Encode the parameters for an encryption algo +*/ +SecureVector CMS_Encoder::encode_params(const std::string& cipher, + const SymmetricKey& key, + const InitializationVector& iv) + { + DER_Encoder encoder; + +#if defined(BOTAN_HAS_RC2) + if(cipher == "RC2") + { + encoder.start_cons(SEQUENCE). + encode((u32bit)RC2::EKB_code(8*key.length())). + encode(iv.bits_of(), OCTET_STRING). + end_cons(); + return encoder.get_contents(); + } +#endif + + if(cipher == "CAST-128") + { + encoder.start_cons(SEQUENCE). + encode(iv.bits_of(), OCTET_STRING). + encode(8*key.length()). + end_cons(); + } + else + encoder.encode(iv.bits_of(), OCTET_STRING); + + return encoder.get_contents(); + } + +/* +* Generate a CEK or KEK for the cipher +*/ +SymmetricKey CMS_Encoder::setup_key(RandomNumberGenerator& rng, + const std::string& cipher) + { + u32bit keysize = 0; + + if(cipher == "TripleDES") keysize = 24; + if(cipher == "RC2") keysize = 16; + if(cipher == "CAST-128") keysize = 16; + + if(keysize == 0) + throw Invalid_Argument("CMS: Cannot encrypt with cipher " + cipher); + + SymmetricKey key(rng, keysize); + if(cipher == "DES" || cipher == "TripleDES") + key.set_odd_parity(); + return key; + } + +} diff --git a/src/libs/3rdparty/botan/src/cms/cms_comp.cpp b/src/libs/3rdparty/botan/src/cms/cms_comp.cpp new file mode 100644 index 00000000000..b11cf909b20 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cms/cms_comp.cpp @@ -0,0 +1,107 @@ +/* +* CMS Compression +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +#if defined(BOTAN_HAS_COMPRESSOR_ZLIB) + #include +#endif + +namespace Botan { + +/* +* Compress a message +*/ +void CMS_Encoder::compress(const std::string& algo) + { + if(!CMS_Encoder::can_compress_with(algo)) + throw Invalid_Argument("CMS_Encoder: Cannot compress with " + algo); + + Filter* compressor = 0; + +#if defined(BOTAN_HAS_COMPRESSOR_ZLIB) + if(algo == "Zlib") compressor = new Zlib_Compression; +#endif + + if(compressor == 0) + throw Internal_Error("CMS: Couldn't get ahold of a compressor"); + + Pipe pipe(compressor); + pipe.process_msg(data); + SecureVector compressed = pipe.read_all(); + + DER_Encoder encoder; + encoder.start_cons(SEQUENCE). + encode((u32bit)0). + encode(AlgorithmIdentifier("Compression." + algo, + MemoryVector())). + raw_bytes(make_econtent(compressed, type)). + end_cons(); + + add_layer("CMS.CompressedData", encoder); + } + +/* +* See if the named compression algo is available +*/ +bool CMS_Encoder::can_compress_with(const std::string& algo) + { + if(algo == "") + throw Invalid_Algorithm_Name("Empty string to can_compress_with"); + +#if defined(BOTAN_HAS_COMPRESSOR_ZLIB) + if(algo == "Zlib") + return true; +#endif + + return false; + } + +/* +* Decompress a message +*/ +void CMS_Decoder::decompress(BER_Decoder& decoder) + { + u32bit version; + AlgorithmIdentifier comp_algo; + + BER_Decoder comp_info = decoder.start_cons(SEQUENCE); + + comp_info.decode(version); + if(version != 0) + throw Decoding_Error("CMS: Unknown version for CompressedData"); + + comp_info.decode(comp_algo); + read_econtent(comp_info); + comp_info.end_cons(); + + Filter* decompressor = 0; + + info = comp_algo.oid.as_string(); + +#if defined(BOTAN_HAS_COMPRESSOR_ZLIB) + if(comp_algo.oid == OIDS::lookup("Compression.Zlib")) + { + decompressor = new Zlib_Decompression; + info = "Zlib"; + } +#endif + + if(!decompressor) + status = FAILURE; + + Pipe pipe(decompressor); + pipe.process_msg(data); + data = pipe.read_all(); + } + +} diff --git a/src/libs/3rdparty/botan/src/cms/cms_dalg.cpp b/src/libs/3rdparty/botan/src/cms/cms_dalg.cpp new file mode 100644 index 00000000000..7ed793f4f98 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cms/cms_dalg.cpp @@ -0,0 +1,276 @@ +/* +* CMS Decoding Operations +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Compute the hash of some content +*/ +SecureVector hash_of(const SecureVector& content, + const AlgorithmIdentifier& hash_algo, + std::string& hash_name) + { + hash_name = OIDS::lookup(hash_algo.oid); + + Algorithm_Factory& af = global_state().algorithm_factory(); + + std::auto_ptr hash_fn(af.make_hash_function(hash_name)); + return hash_fn->process(content); + } + +/* +* Find a cert based on SignerIdentifier +*/ +std::vector get_cert(BER_Decoder& signer_info, + X509_Store& store) + { + BER_Object id = signer_info.get_next_object(); + + std::vector found; + + if(id.type_tag == SEQUENCE && id.class_tag == CONSTRUCTED) + { + X509_DN issuer; + BigInt serial; + BER_Decoder iands(id.value); + iands.decode(issuer); + iands.decode(serial); + + found = store.get_certs(IandS_Match(issuer, BigInt::encode(serial))); + } + else if(id.type_tag == 0 && id.class_tag == CONSTRUCTED) + found = store.get_certs(SKID_Match(id.value)); + else + throw Decoding_Error("CMS: Unknown tag for cert identifier"); + + // verify cert if found + + if(found.size() > 1) + throw Internal_Error("CMS: Found more than one match in get_cert"); + return found; + } + +/* +* Read OriginatorInfo +*/ +void read_orig_info(BER_Decoder& info, X509_Store& store) + { + BER_Object next = info.get_next_object(); + + if(next.type_tag == 0 && + next.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) + { + DataSource_Memory certs(next.value); + while(!certs.end_of_data()) + { + // FIXME: can be attribute certs too + // FIXME: DoS? + X509_Certificate cert(certs); + store.add_cert(cert); + } + next = info.get_next_object(); + } + if(next.type_tag == 1 && + next.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) + { + DataSource_Memory crls(next.value); + while(!crls.end_of_data()) + { + // FIXME: DoS? + X509_CRL crl(crls); + store.add_crl(crl); + } + next = info.get_next_object(); + } + info.push_back(next); + } + +/* +* Decode any Attributes, and check type +*/ +SecureVector decode_attributes(BER_Decoder& ber, const OID& type, + bool& bad_attributes) + { + BER_Object obj = ber.get_next_object(); + SecureVector digest; + + bool got_digest = false; + bool got_content_type = false; + + if(obj.type_tag == 0 && + obj.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) + ber.push_back(obj); + else + { + BER_Decoder attributes(obj.value); + while(attributes.more_items()) + { + Attribute attr; + attributes.decode(attr); + BER_Decoder attr_value(attr.parameters); + + if(attr.oid == OIDS::lookup("PKCS9.MessageDigest")) + { + got_digest = true; + attr_value.decode(digest, OCTET_STRING); + } + else if(attr.oid == OIDS::lookup("PKCS9.ContentType")) + { + got_content_type = true; + OID inner_type; + attr_value.decode(inner_type); + if(inner_type != type) + bad_attributes = true; + } + else + throw Decoding_Error("Unknown/unhandled CMS attribute found: " + + OIDS::lookup(attr.oid)); + } + + if(!got_digest || !got_content_type) + bad_attributes = true; + } + + return digest; + } + +} + +/* +* Decode this layer of CMS encoding +*/ +void CMS_Decoder::decode_layer() + { + try { + if(status == FAILURE) + throw Invalid_State("CMS: Decoder is in FAILURE state"); + + status = GOOD; + info = ""; + + type = next_type; + + if(type == OIDS::lookup("CMS.DataContent")) + return; + + BER_Decoder decoder(data); + if(type == OIDS::lookup("CMS.CompressedData")) + decompress(decoder); + else if(type == OIDS::lookup("CMS.DigestedData")) + { + u32bit version; + AlgorithmIdentifier hash_algo; + SecureVector digest; + + BER_Decoder hash_info = decoder.start_cons(SEQUENCE); + + hash_info.decode(version); + if(version != 0 && version != 2) + throw Decoding_Error("CMS: Unknown version for DigestedData"); + + hash_info.decode(hash_algo); + read_econtent(hash_info); + hash_info.decode(digest, OCTET_STRING); + hash_info.end_cons(); + + if(digest != hash_of(data, hash_algo, info)) + status = BAD; + } + else if(type == OIDS::lookup("CMS.SignedData")) + { +#if 1 + throw Exception("FIXME: not implemented"); +#else + u32bit version; + + BER_Decoder sig_info = BER::get_subsequence(decoder); + BER::decode(sig_info, version); + if(version != 1 && version != 3) + throw Decoding_Error("CMS: Unknown version for SignedData"); + BER::get_subset(sig_info); // hash algos (do something with these?) + read_econtent(sig_info); + read_orig_info(sig_info, store); + + BER_Decoder signer_infos = BER::get_subset(sig_info); + while(signer_infos.more_items()) + { + AlgorithmIdentifier sig_algo, hash_algo; + SecureVector signature, digest; + u32bit version; + + BER_Decoder signer_info = BER::get_subsequence(signer_infos); + BER::decode(signer_info, version); + if(version != 1 && version != 3) + throw Decoding_Error("CMS: Unknown version for SignerInfo"); + + std::vector certs = get_cert(signer_info, store); + if(certs.size() == 0) { status = NO_KEY; continue; } + + BER::decode(signer_info, hash_algo); + bool bad_attr = false; + digest = decode_attributes(signer_info, next_type, bad_attr); + if(bad_attr) { status = BAD; continue; } + BER::decode(signer_info, sig_algo); + BER::decode(signer_info, signature, OCTET_STRING); + // unsigned attributes + signer_info.verify_end(); + + if(digest.has_items()) + { + std::string hash; + if(digest != hash_of(data, hash_algo, hash)) + { + status = BAD; + continue; + } + status = check_sig(signed_attr, sig_algo, signature, certs[0]); + } + else + status = check_sig(data, sig_algo, signature, certs[0]); + + if(status == BAD) + continue; + + // fix this (gets only last signer, for one thing) + // maybe some way for the user to get all certs that signed the + // message? that would be useful + info = "CN=" + cert.subject_info("CommonName") + + ",O=" + cert.subject_info("Organization") + + ",OU=" + cert.subject_info("Organizational Unit"); + } +#endif + } + else if(type == OIDS::lookup("CMS.EnvelopedData")) + { + throw Exception("FIXME: not implemented"); + } + else if(type == OIDS::lookup("CMS.AuthenticatedData")) + { + throw Exception("FIXME: not implemented"); + } + else + throw Decoding_Error("CMS: Unknown content ID " + type.as_string()); + } + catch(std::exception) + { + status = FAILURE; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/cms/cms_dec.cpp b/src/libs/3rdparty/botan/src/cms/cms_dec.cpp new file mode 100644 index 00000000000..222399f6c80 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cms/cms_dec.cpp @@ -0,0 +1,127 @@ +/* +* CMS Decoding +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* CMS_Decoder Constructor +*/ +CMS_Decoder::CMS_Decoder(DataSource& in, const X509_Store& x509store, + User_Interface& ui_ref, PKCS8_PrivateKey* key) : + ui(ui_ref), store(x509store) + { + status = GOOD; + + add_key(key); + + if(ASN1::maybe_BER(in) && !PEM_Code::matches(in)) + initial_read(in); + else + { + DataSource_Memory ber(PEM_Code::decode_check_label(in, "PKCS7")); + initial_read(ber); + } + } + +/* +* Read the outermost ContentInfo +*/ +void CMS_Decoder::initial_read(DataSource&) + { + // FIXME... + + /* + BER_Decoder decoder(in); + BER_Decoder content_info = decoder.start_cons(SEQUENCE); + + content_info.decode(next_type); + + + BER_Decoder content_type = BER::get_subsequence(content_info, ASN1_Tag(0)); + data = content_type.get_remaining(); + */ + + decode_layer(); + } + +/* +* Add another private key to use +*/ +void CMS_Decoder::add_key(PKCS8_PrivateKey* key) + { + if(!key) + return; + +#if 0 + for(u32bit j = 0; j != keys.size(); j++) + if(keys[j]->key_id() == key->key_id()) + return; +#endif + + keys.push_back(key); + } + +/* +* Return the status information +*/ +CMS_Decoder::Status CMS_Decoder::layer_status() const + { + return status; + } + +/* +* Return the final data content +*/ +std::string CMS_Decoder::get_data() const + { + if(layer_type() != DATA) + throw Invalid_State("CMS: Cannot retrieve data from non-DATA layer"); + return std::string((const char*)data.begin(), data.size()); + } + +/* +* Return the content type of this layer +*/ +CMS_Decoder::Content_Type CMS_Decoder::layer_type() const + { + if(type == OIDS::lookup("CMS.DataContent")) return DATA; + if(type == OIDS::lookup("CMS.EnvelopedData")) return ENVELOPED; + if(type == OIDS::lookup("CMS.CompressedData")) return COMPRESSED; + if(type == OIDS::lookup("CMS.SignedData")) return SIGNED; + if(type == OIDS::lookup("CMS.AuthenticatedData")) return AUTHENTICATED; + if(type == OIDS::lookup("CMS.DigestedData")) return DIGESTED; + return UNKNOWN; + } + +/* +* Return some information about this layer +*/ +std::string CMS_Decoder::layer_info() const + { + return info; + } + +/* +* Return some information about this layer +*/ +void CMS_Decoder::read_econtent(BER_Decoder& decoder) + { + BER_Decoder econtent_info = decoder.start_cons(SEQUENCE); + econtent_info.decode(next_type); + + // FIXME + //BER_Decoder econtent = BER::get_subsequence(econtent_info, ASN1_Tag(0)); + //econtent.decode(data, OCTET_STRING); + } + +} diff --git a/src/libs/3rdparty/botan/src/cms/cms_dec.h b/src/libs/3rdparty/botan/src/cms/cms_dec.h new file mode 100644 index 00000000000..75b61c9cb3c --- /dev/null +++ b/src/libs/3rdparty/botan/src/cms/cms_dec.h @@ -0,0 +1,65 @@ +/* +* CMS Decoding +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CMS_DECODER_H__ +#define BOTAN_CMS_DECODER_H__ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* CMS Decoding Operation +*/ +class BOTAN_DLL CMS_Decoder + { + public: + enum Status { GOOD, BAD, NO_KEY, FAILURE }; + + enum Content_Type { DATA, UNKNOWN, COMPRESSED, ENVELOPED, SIGNED, + AUTHENTICATED, DIGESTED }; + + Status layer_status() const; + Content_Type layer_type() const; + std::string layer_info() const; + std::string layer_algo() const; + std::string get_data() const; + std::vector get_certs() const; + std::vector get_crls() const; + + void next_layer() { decode_layer(); } + + void add_key(PKCS8_PrivateKey*); + + CMS_Decoder(DataSource&, const X509_Store&, User_Interface&, + PKCS8_PrivateKey* = 0); + private: + std::string get_passphrase(const std::string&); + void read_econtent(BER_Decoder&); + void initial_read(DataSource&); + void decode_layer(); + void decompress(BER_Decoder&); + + User_Interface& ui; + + X509_Store store; + std::vector passphrases; + std::vector keys; + + OID type, next_type; + SecureVector data; + Status status; + std::string info; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cms/cms_ealg.cpp b/src/libs/3rdparty/botan/src/cms/cms_ealg.cpp new file mode 100644 index 00000000000..2970e8e798f --- /dev/null +++ b/src/libs/3rdparty/botan/src/cms/cms_ealg.cpp @@ -0,0 +1,401 @@ +/* +* CMS Encoding Operations +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Choose an algorithm +*/ +std::string choose_algo(const std::string& user_algo, + const std::string& default_algo) + { + if(user_algo == "") + return global_state().deref_alias(default_algo); + return global_state().deref_alias(user_algo); + } + +/* +* Encode a SignerIdentifier/RecipientIdentifier +*/ +DER_Encoder& encode_si(DER_Encoder& der, const X509_Certificate& cert, + bool use_skid_encoding = false) + { + if(cert.subject_key_id().size() && use_skid_encoding) + der.encode(cert.subject_key_id(), OCTET_STRING, ASN1_Tag(0)); + else + { + der.start_cons(SEQUENCE). + encode(cert.issuer_dn()). + encode(BigInt::decode(cert.serial_number())). + end_cons(); + } + + return der; + } + +/* +* Compute the hash of some content +*/ +SecureVector hash_of(const SecureVector& content, + const std::string& hash_name) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + std::auto_ptr hash_fn(af.make_hash_function(hash_name)); + return hash_fn->process(content); + } + +/* +* Encode Attributes containing info on content +*/ +SecureVector encode_attr(const SecureVector& data, + const std::string& type, + const std::string& hash) + { + SecureVector digest = hash_of(data, hash); + + DER_Encoder encoder; + encoder.encode(OIDS::lookup(type)); + Attribute content_type("PKCS9.ContentType", encoder.get_contents()); + + encoder.encode(digest, OCTET_STRING); + Attribute message_digest("PKCS9.MessageDigest", encoder.get_contents()); + + encoder.start_cons(SET) + .encode(content_type) + .encode(message_digest) + .end_cons(); + + return encoder.get_contents(); + } + +} + +/* +* Encrypt a message +*/ +void CMS_Encoder::encrypt(RandomNumberGenerator& rng, + const X509_Certificate& to, + const std::string user_cipher) + { + const std::string cipher = choose_algo(user_cipher, "TripleDES"); + + std::auto_ptr key(to.subject_public_key()); + const std::string algo = key->algo_name(); + + Key_Constraints constraints = to.constraints(); + + if(algo == "RSA") + { + if(constraints != NO_CONSTRAINTS && !(constraints & KEY_ENCIPHERMENT)) + throw Invalid_Argument("CMS: Constraints not set for encryption"); + + PK_Encrypting_Key* enc_key = dynamic_cast(key.get()); + if(enc_key == 0) + throw Internal_Error("CMS_Encoder::encrypt: " + algo + + " can't encrypt"); + + encrypt_ktri(rng, to, enc_key, cipher); + } + else if(algo == "DH") + { + if(constraints != NO_CONSTRAINTS && !(constraints & KEY_AGREEMENT)) + throw Invalid_Argument("CMS: Constraints not set for key agreement"); + + encrypt_kari(rng, to, key.get(), cipher); + } + else + throw Invalid_Argument("Unknown CMS PK encryption algorithm " + algo); + } + +/* +* Encrypt a message with a key transport algo +*/ +void CMS_Encoder::encrypt_ktri(RandomNumberGenerator& rng, + const X509_Certificate& to, + PK_Encrypting_Key* pub_key, + const std::string& cipher) + { + const std::string padding = "EME-PKCS1-v1_5"; + const std::string pk_algo = pub_key->algo_name(); + std::auto_ptr enc(get_pk_encryptor(*pub_key, padding)); + + SymmetricKey cek = setup_key(rng, cipher); + + AlgorithmIdentifier alg_id(OIDS::lookup(pk_algo + '/' + padding), + AlgorithmIdentifier::USE_NULL_PARAM); + + DER_Encoder encoder; + + encoder.start_cons(SEQUENCE) + .encode((u32bit)0) + .start_cons(SET) + .start_cons(SEQUENCE) + .encode((u32bit)0); + encode_si(encoder, to) + .encode(alg_id) + .encode(enc->encrypt(cek.bits_of(), rng), OCTET_STRING) + .end_cons() + .end_cons() + .raw_bytes(do_encrypt(rng, cek, cipher)) + .end_cons(); + + add_layer("CMS.EnvelopedData", encoder); + } + +/* +* Encrypt a message with a key agreement algo +*/ +void CMS_Encoder::encrypt_kari(RandomNumberGenerator&, + const X509_Certificate&, + X509_PublicKey*, + const std::string&) + { + throw Exception("FIXME: unimplemented"); + +#if 0 + SymmetricKey cek = setup_key(rng, cipher); + + DER_Encoder encoder; + encoder.start_cons(SEQUENCE); + encoder.encode(2); + encoder.start_cons(SET); + encoder.start_sequence(ASN1_Tag(1)); + encoder.encode(3); + encode_si(encoder, to); + encoder.encode(AlgorithmIdentifier(pk_algo + "/" + padding)); + encoder.encode(encrypted_cek, OCTET_STRING); + encoder.end_cons(); + encoder.end_cons(); + encoder.raw_bytes(do_encrypt(rng, cek, cipher)); + encoder.end_cons(); + + add_layer("CMS.EnvelopedData", encoder); +#endif + } + +/* +* Encrypt a message with a shared key +*/ +void CMS_Encoder::encrypt(RandomNumberGenerator& rng, + const SymmetricKey& kek, + const std::string& user_cipher) + { + throw Exception("FIXME: untested"); + + const std::string cipher = choose_algo(user_cipher, "TripleDES"); + SymmetricKey cek = setup_key(rng, cipher); + + SecureVector kek_id; // FIXME: ? + + DER_Encoder encoder; + + encoder.start_cons(SEQUENCE) + .encode((u32bit)2) + .start_explicit(ASN1_Tag(2)) + .encode((u32bit)4) + .start_cons(SEQUENCE) + .encode(kek_id, OCTET_STRING) + .end_cons() + .encode(AlgorithmIdentifier(OIDS::lookup("KeyWrap." + cipher), + AlgorithmIdentifier::USE_NULL_PARAM)) + .encode(wrap_key(rng, cipher, cek, kek), OCTET_STRING) + .end_cons() + .raw_bytes(do_encrypt(rng, cek, cipher)) + .end_cons(); + + add_layer("CMS.EnvelopedData", encoder); + } + +/* +* Encrypt a message with a passphrase +*/ +void CMS_Encoder::encrypt(RandomNumberGenerator&, + const std::string&, + const std::string& user_cipher) + { + const std::string cipher = choose_algo(user_cipher, "TripleDES"); + throw Exception("FIXME: unimplemented"); + /* + SymmetricKey cek = setup_key(key); + + DER_Encoder encoder; + encoder.start_cons(SEQUENCE); + encoder.encode(0); + encoder.raw_bytes(do_encrypt(rng, cek, cipher)); + encoder.end_cons(); + + add_layer("CMS.EnvelopedData", encoder); + */ + } + +/* +* Encrypt the content with the chosen key/cipher +*/ +SecureVector CMS_Encoder::do_encrypt(RandomNumberGenerator& rng, + const SymmetricKey& key, + const std::string& cipher_name) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + + const BlockCipher* cipher = af.prototype_block_cipher(cipher_name); + + if(!cipher) + throw Invalid_Argument("CMS: Can't encrypt with non-existent cipher " + cipher_name); + + if(!OIDS::have_oid(cipher->name() + "/CBC")) + throw Encoding_Error("CMS: No OID assigned for " + cipher_name + "/CBC"); + + InitializationVector iv(rng, cipher->BLOCK_SIZE); + + AlgorithmIdentifier content_cipher; + content_cipher.oid = OIDS::lookup(cipher->name() + "/CBC"); + content_cipher.parameters = encode_params(cipher->name(), key, iv); + + Pipe pipe(new CBC_Encryption(cipher->clone(), new PKCS7_Padding, key, iv)); + + pipe.process_msg(data); + + DER_Encoder encoder; + encoder.start_cons(SEQUENCE); + encoder.encode(OIDS::lookup(type)); + encoder.encode(content_cipher); + encoder.encode(pipe.read_all(), OCTET_STRING, ASN1_Tag(0)); + encoder.end_cons(); + + return encoder.get_contents(); + } + +/* +* Sign a message +*/ +void CMS_Encoder::sign(const X509_Certificate& cert, + const PKCS8_PrivateKey& key, + RandomNumberGenerator& rng, + const std::vector& chain, + const std::string& hash, + const std::string& pad_algo) + { + std::string padding = pad_algo + "(" + hash + ")"; + + // FIXME: Add new get_format() func to PK_Signing_Key, PK_Verifying_*_Key + Signature_Format format = IEEE_1363; + + const PK_Signing_Key& sig_key = dynamic_cast(key); + std::auto_ptr signer(get_pk_signer(sig_key, padding, format)); + + AlgorithmIdentifier sig_algo(OIDS::lookup(key.algo_name() + "/" + padding), + AlgorithmIdentifier::USE_NULL_PARAM); + + SecureVector signed_attr = encode_attr(data, type, hash); + signer->update(signed_attr); + SecureVector signature = signer->signature(rng); + signed_attr[0] = 0xA0; + + const u32bit SI_VERSION = cert.subject_key_id().size() ? 3 : 1; + const u32bit CMS_VERSION = (type != "CMS.DataContent") ? 3 : SI_VERSION; + + DER_Encoder encoder; + + encoder.start_cons(SEQUENCE) + .encode(CMS_VERSION) + .start_cons(SET) + .encode(AlgorithmIdentifier(OIDS::lookup(hash), + AlgorithmIdentifier::USE_NULL_PARAM)) + .end_cons() + .raw_bytes(make_econtent(data, type)); + + encoder.start_cons(ASN1_Tag(0), CONTEXT_SPECIFIC); + for(u32bit j = 0; j != chain.size(); j++) + encoder.raw_bytes(chain[j].BER_encode()); + encoder.raw_bytes(cert.BER_encode()).end_cons(); + + encoder.start_cons(SET) + .start_cons(SEQUENCE) + .encode(SI_VERSION); + encode_si(encoder, cert, ((SI_VERSION == 3) ? true : false)) + .encode( + AlgorithmIdentifier(OIDS::lookup(hash), + AlgorithmIdentifier::USE_NULL_PARAM) + ) + .raw_bytes(signed_attr) + .encode(sig_algo) + .encode(signature, OCTET_STRING) + .end_cons() + .end_cons() + .end_cons(); + + add_layer("CMS.SignedData", encoder); + } + +/* +* Digest a message +*/ +void CMS_Encoder::digest(const std::string& user_hash) + { + const std::string hash = choose_algo(user_hash, "SHA-1"); + if(!OIDS::have_oid(hash)) + throw Encoding_Error("CMS: No OID assigned for " + hash); + + const u32bit VERSION = (type != "CMS.DataContent") ? 2 : 0; + + DER_Encoder encoder; + encoder.start_cons(SEQUENCE) + .encode(VERSION) + .encode(AlgorithmIdentifier(OIDS::lookup(hash), + AlgorithmIdentifier::USE_NULL_PARAM)) + .raw_bytes(make_econtent(data, type)) + .encode(hash_of(data, hash), OCTET_STRING) + .end_cons(); + + add_layer("CMS.DigestedData", encoder); + } + +/* +* MAC a message with an encrypted key +*/ +void CMS_Encoder::authenticate(const X509_Certificate&, + const std::string& mac_algo) + { + const std::string mac = choose_algo(mac_algo, "HMAC(SHA-1)"); + throw Exception("FIXME: unimplemented"); + } + +/* +* MAC a message with a shared key +*/ +void CMS_Encoder::authenticate(const SymmetricKey&, + const std::string& mac_algo) + { + const std::string mac = choose_algo(mac_algo, "HMAC(SHA-1)"); + throw Exception("FIXME: unimplemented"); + } + +/* +* MAC a message with a passphrase +*/ +void CMS_Encoder::authenticate(const std::string&, + const std::string& mac_algo) + { + const std::string mac = choose_algo(mac_algo, "HMAC(SHA-1)"); + throw Exception("FIXME: unimplemented"); + } + +} diff --git a/src/libs/3rdparty/botan/src/cms/cms_enc.cpp b/src/libs/3rdparty/botan/src/cms/cms_enc.cpp new file mode 100644 index 00000000000..2413676d7d7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cms/cms_enc.cpp @@ -0,0 +1,86 @@ +/* +* CMS Encoding Base +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Setup the intitial layer of CMS data +*/ +void CMS_Encoder::set_data(const byte buf[], u32bit length) + { + if(data.has_items()) + throw Invalid_State("Cannot call CMS_Encoder::set_data here"); + + data.set(buf, length); + type = "CMS.DataContent"; + } + +/* +* Setup the intitial layer of CMS data +*/ +void CMS_Encoder::set_data(const std::string& str) + { + set_data((const byte*)str.c_str(), str.length()); + } + +/* +* Finalize and return the CMS encoded data +*/ +SecureVector CMS_Encoder::get_contents() + { + DER_Encoder encoder; + + encoder.start_cons(SEQUENCE). + encode(OIDS::lookup(type)). + start_explicit(0). + raw_bytes(data). + end_explicit(). + end_cons(); + + data.clear(); + + return encoder.get_contents(); + } + +/* +* Add a new layer of encapsulation +*/ +void CMS_Encoder::add_layer(const std::string& oid, DER_Encoder& new_layer) + { + data = new_layer.get_contents(); + type = oid; + } + +/* +* Return the PEM-encoded data +*/ +std::string CMS_Encoder::PEM_contents() + { + return PEM_Code::encode(get_contents(), "PKCS7"); + } + +/* +* Make an EncapsulatedContentInfo +*/ +SecureVector CMS_Encoder::make_econtent(const SecureVector& data, + const std::string& type) + { + return DER_Encoder().start_cons(SEQUENCE). + encode(OIDS::lookup(type)). + start_explicit(0). + encode(data, OCTET_STRING). + end_explicit(). + end_cons(). + get_contents(); + } + +} diff --git a/src/libs/3rdparty/botan/src/cms/cms_enc.h b/src/libs/3rdparty/botan/src/cms/cms_enc.h new file mode 100644 index 00000000000..6fdd2b7264f --- /dev/null +++ b/src/libs/3rdparty/botan/src/cms/cms_enc.h @@ -0,0 +1,92 @@ +/* +* CMS Encoding +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CMS_ENCODER_H__ +#define BOTAN_CMS_ENCODER_H__ + +#include +#include +#include +#include + +namespace Botan { + +/* +* CMS Encoding Operation +*/ +class BOTAN_DLL CMS_Encoder + { + public: + + void encrypt(RandomNumberGenerator&, + const X509_Certificate&, const std::string = ""); + + void encrypt(RandomNumberGenerator& rng, + const std::string&, const std::string& = ""); + + void encrypt(RandomNumberGenerator& rng, + const SymmetricKey&, const std::string& = ""); + + void authenticate(const X509_Certificate&, const std::string& = ""); + void authenticate(const std::string&, const std::string& = ""); + void authenticate(const SymmetricKey&, const std::string& = ""); + + void sign(const X509_Certificate& cert, + const PKCS8_PrivateKey& key, + RandomNumberGenerator& rng, + const std::vector& cert_chain, + const std::string& hash, + const std::string& padding); + + void digest(const std::string& = ""); + + void compress(const std::string&); + static bool can_compress_with(const std::string&); + + SecureVector get_contents(); + std::string PEM_contents(); + + void set_data(const std::string&); + void set_data(const byte[], u32bit); + + CMS_Encoder(const std::string& str) { set_data(str); } + CMS_Encoder(const byte buf[], u32bit length) { set_data(buf, length); } + private: + void add_layer(const std::string&, DER_Encoder&); + + void encrypt_ktri(RandomNumberGenerator&, + const X509_Certificate&, PK_Encrypting_Key*, + const std::string&); + void encrypt_kari(RandomNumberGenerator&, + const X509_Certificate&, X509_PublicKey*, + const std::string&); + + SecureVector do_encrypt(RandomNumberGenerator& rng, + const SymmetricKey&, const std::string&); + + static SecureVector make_econtent(const SecureVector&, + const std::string&); + + static SymmetricKey setup_key(RandomNumberGenerator& rng, + const std::string&); + + static SecureVector wrap_key(RandomNumberGenerator& rng, + const std::string&, + const SymmetricKey&, + const SymmetricKey&); + + static SecureVector encode_params(const std::string&, + const SymmetricKey&, + const InitializationVector&); + + SecureVector data; + std::string type; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cms/info.txt b/src/libs/3rdparty/botan/src/cms/info.txt new file mode 100644 index 00000000000..82c31b56412 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cms/info.txt @@ -0,0 +1,31 @@ +realname "CMS" + +define CMS + +load_on auto + + +cms_algo.cpp +cms_comp.cpp +cms_dalg.cpp +cms_dec.cpp +cms_dec.h +cms_ealg.cpp +cms_enc.cpp +cms_enc.h + + + +asn1 +bigint +cbc +filters +hash +libstate +oid_lookup +pem +pk_codecs +sha1 +sym_algo +x509 + diff --git a/src/libs/3rdparty/botan/src/codec/base64/b64_char.cpp b/src/libs/3rdparty/botan/src/codec/base64/b64_char.cpp new file mode 100644 index 00000000000..e5722a0fda6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/base64/b64_char.cpp @@ -0,0 +1,47 @@ +/* +* Base64 Codec Character Tables +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Base64 Encoder Lookup Table +*/ +const byte Base64_Encoder::BIN_TO_BASE64[64] = { +0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, +0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, +0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, +0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, +0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F }; + +/* +* Base64 Decoder Lookup Table +*/ +const byte Base64_Decoder::BASE64_TO_BIN[256] = { +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x80, 0x3F, 0x34, 0x35, 0x36, 0x37, +0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, +0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, +0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, +0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; + +} diff --git a/src/libs/3rdparty/botan/src/codec/base64/base64.cpp b/src/libs/3rdparty/botan/src/codec/base64/base64.cpp new file mode 100644 index 00000000000..dfcc1cae734 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/base64/base64.cpp @@ -0,0 +1,228 @@ +/* +* Base64 Encoder/Decoder +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Base64_Encoder Constructor +*/ +Base64_Encoder::Base64_Encoder(bool breaks, u32bit length, bool t_n) : + line_length(breaks ? length : 0), trailing_newline(t_n) + { + in.create(48); + out.create(4); + + counter = position = 0; + } + +/* +* Base64 Encoding Operation +*/ +void Base64_Encoder::encode(const byte in[3], byte out[4]) + { + out[0] = BIN_TO_BASE64[((in[0] & 0xFC) >> 2)]; + out[1] = BIN_TO_BASE64[((in[0] & 0x03) << 4) | (in[1] >> 4)]; + out[2] = BIN_TO_BASE64[((in[1] & 0x0F) << 2) | (in[2] >> 6)]; + out[3] = BIN_TO_BASE64[((in[2] & 0x3F) )]; + } + +/* +* Encode and send a block +*/ +void Base64_Encoder::encode_and_send(const byte block[], u32bit length) + { + for(u32bit j = 0; j != length; j += 3) + { + encode(block + j, out); + do_output(out, 4); + } + } + +/* +* Handle the output +*/ +void Base64_Encoder::do_output(const byte input[], u32bit length) + { + if(line_length == 0) + send(input, length); + else + { + u32bit remaining = length, offset = 0; + while(remaining) + { + u32bit sent = std::min(line_length - counter, remaining); + send(input + offset, sent); + counter += sent; + remaining -= sent; + offset += sent; + if(counter == line_length) + { + send('\n'); + counter = 0; + } + } + } + } + +/* +* Convert some data into Base64 +*/ +void Base64_Encoder::write(const byte input[], u32bit length) + { + in.copy(position, input, length); + if(position + length >= in.size()) + { + encode_and_send(in, in.size()); + input += (in.size() - position); + length -= (in.size() - position); + while(length >= in.size()) + { + encode_and_send(input, in.size()); + input += in.size(); + length -= in.size(); + } + in.copy(input, length); + position = 0; + } + position += length; + } + +/* +* Flush buffers +*/ +void Base64_Encoder::end_msg() + { + u32bit start_of_last_block = 3 * (position / 3), + left_over = position % 3; + encode_and_send(in, start_of_last_block); + + if(left_over) + { + SecureBuffer remainder(in + start_of_last_block, left_over); + + encode(remainder, out); + + u32bit empty_bits = 8 * (3 - left_over), index = 4 - 1; + while(empty_bits >= 8) + { + out[index--] = '='; + empty_bits -= 6; + } + + do_output(out, 4); + } + + if(trailing_newline || (counter && line_length)) + send('\n'); + + counter = position = 0; + } + +/* +* Base64_Decoder Constructor +*/ +Base64_Decoder::Base64_Decoder(Decoder_Checking c) : checking(c) + { + in.create(48); + out.create(3); + position = 0; + } + +/* +* Check if a character is a valid Base64 char +*/ +bool Base64_Decoder::is_valid(byte in) + { + return (BASE64_TO_BIN[in] != 0x80); + } + +/* +* Base64 Decoding Operation +*/ +void Base64_Decoder::decode(const byte in[4], byte out[3]) + { + out[0] = ((BASE64_TO_BIN[in[0]] << 2) | (BASE64_TO_BIN[in[1]] >> 4)); + out[1] = ((BASE64_TO_BIN[in[1]] << 4) | (BASE64_TO_BIN[in[2]] >> 2)); + out[2] = ((BASE64_TO_BIN[in[2]] << 6) | (BASE64_TO_BIN[in[3]])); + } + +/* +* Decode and send a block +*/ +void Base64_Decoder::decode_and_send(const byte block[], u32bit length) + { + for(u32bit j = 0; j != length; j += 4) + { + decode(block + j, out); + send(out, 3); + } + } + +/* +* Handle processing an invalid character +*/ +void Base64_Decoder::handle_bad_char(byte c) + { + if(c == '=' || checking == NONE) + return; + + if((checking == IGNORE_WS) && Charset::is_space(c)) + return; + + throw Decoding_Error( + std::string("Base64_Decoder: Invalid base64 character '") + + static_cast(c) + "'" + ); + } + +/* +* Convert some data from Base64 +*/ +void Base64_Decoder::write(const byte input[], u32bit length) + { + for(u32bit j = 0; j != length; ++j) + { + if(is_valid(input[j])) + in[position++] = input[j]; + else + handle_bad_char(input[j]); + + if(position == in.size()) + { + decode_and_send(in, in.size()); + position = 0; + } + } + } + +/* +* Flush buffers +*/ +void Base64_Decoder::end_msg() + { + if(position != 0) + { + u32bit start_of_last_block = 4 * (position / 4), + left_over = position % 4; + decode_and_send(in, start_of_last_block); + + if(left_over) + { + SecureBuffer remainder(in + start_of_last_block, left_over); + decode(remainder, out); + send(out, ((left_over == 1) ? (1) : (left_over - 1))); + } + } + position = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/codec/base64/base64.h b/src/libs/3rdparty/botan/src/codec/base64/base64.h new file mode 100644 index 00000000000..aca02da14a7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/base64/base64.h @@ -0,0 +1,94 @@ +/* +* Base64 Encoder/Decoder +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BASE64_H__ +#define BOTAN_BASE64_H__ + +#include + +namespace Botan { + +/** +* This class represents a Base64 encoder. +*/ +class BOTAN_DLL Base64_Encoder : public Filter + { + public: + static void encode(const byte in[3], byte out[4]); + + /** + * Input a part of a message to the encoder. + * @param input the message to input as a byte array + * @param length the length of the byte array input + */ + void write(const byte input[], u32bit length); + + /** + * Inform the Encoder that the current message shall be closed. + */ + void end_msg(); + + /** + * Create a base64 encoder. + * @param breaks whether to use line breaks in the Streamcipheroutput + * @param length the length of the lines of the output + * @param t_n whether to use a trailing newline + */ + Base64_Encoder(bool breaks = false, u32bit length = 72, + bool t_n = false); + private: + void encode_and_send(const byte[], u32bit); + void do_output(const byte[], u32bit); + static const byte BIN_TO_BASE64[64]; + + const u32bit line_length; + const bool trailing_newline; + SecureVector in, out; + u32bit position, counter; + }; + +/** +* This object represents a Base64 decoder. +*/ +class BOTAN_DLL Base64_Decoder : public Filter + { + public: + static void decode(const byte input[4], byte output[3]); + + static bool is_valid(byte); + + /** + * Input a part of a message to the decoder. + * @param input the message to input as a byte array + * @param length the length of the byte array input + */ + void write(const byte input[], u32bit length); + + /** + * Inform the Encoder that the current message shall be closed. + */ + void end_msg(); + + /** + * Create a base64 encoder. + * @param checking the type of checking that shall be performed by + * the decoder + */ + Base64_Decoder(Decoder_Checking checking = NONE); + private: + void decode_and_send(const byte[], u32bit); + void handle_bad_char(byte); + static const byte BASE64_TO_BIN[256]; + + const Decoder_Checking checking; + SecureVector in, out; + u32bit position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/codec/base64/info.txt b/src/libs/3rdparty/botan/src/codec/base64/info.txt new file mode 100644 index 00000000000..d4ed80976b2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/base64/info.txt @@ -0,0 +1,15 @@ +realname "Base64 Codec" + +define BASE64_CODEC + +load_on auto + + +base64.cpp +b64_char.cpp +base64.h + + + +filters + diff --git a/src/libs/3rdparty/botan/src/codec/bzip2/bzip2.cpp b/src/libs/3rdparty/botan/src/codec/bzip2/bzip2.cpp new file mode 100644 index 00000000000..4cdca53559c --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/bzip2/bzip2.cpp @@ -0,0 +1,275 @@ +/* +* Bzip Compressor +* (C) 2001 Peter J Jones +* 2001-2007 Jack Lloyd +* 2006 Matt Johnston +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +#include +#include +#define BZ_NO_STDIO +#include + +namespace Botan { + +namespace { + +/* +* Allocation Information for Bzip +*/ +class Bzip_Alloc_Info + { + public: + std::map current_allocs; + Allocator* alloc; + + Bzip_Alloc_Info() { alloc = Allocator::get(false); } + }; + +/* +* Allocation Function for Bzip +*/ +void* bzip_malloc(void* info_ptr, int n, int size) + { + Bzip_Alloc_Info* info = static_cast(info_ptr); + void* ptr = info->alloc->allocate(n * size); + info->current_allocs[ptr] = n * size; + return ptr; + } + +/* +* Allocation Function for Bzip +*/ +void bzip_free(void* info_ptr, void* ptr) + { + Bzip_Alloc_Info* info = static_cast(info_ptr); + std::map::const_iterator i = info->current_allocs.find(ptr); + if(i == info->current_allocs.end()) + throw Invalid_Argument("bzip_free: Got pointer not allocated by us"); + info->alloc->deallocate(ptr, i->second); + } + +} + +/* +* Wrapper Type for Bzip2 Stream +*/ +class Bzip_Stream + { + public: + bz_stream stream; + + Bzip_Stream() + { + std::memset(&stream, 0, sizeof(bz_stream)); + stream.bzalloc = bzip_malloc; + stream.bzfree = bzip_free; + stream.opaque = new Bzip_Alloc_Info; + } + ~Bzip_Stream() + { + Bzip_Alloc_Info* info = static_cast(stream.opaque); + delete info; + std::memset(&stream, 0, sizeof(bz_stream)); + } + }; + +/* +* Bzip_Compression Constructor +*/ +Bzip_Compression::Bzip_Compression(u32bit l) : + level((l >= 9) ? 9 : l), buffer(DEFAULT_BUFFERSIZE) + { + bz = 0; + } + +/* +* Start Compressing with Bzip +*/ +void Bzip_Compression::start_msg() + { + clear(); + bz = new Bzip_Stream; + if(BZ2_bzCompressInit(&(bz->stream), level, 0, 0) != BZ_OK) + throw Exception("Bzip_Compression: Memory allocation error"); + } + +/* +* Compress Input with Bzip +*/ +void Bzip_Compression::write(const byte input[], u32bit length) + { + bz->stream.next_in = reinterpret_cast(const_cast(input)); + bz->stream.avail_in = length; + + while(bz->stream.avail_in != 0) + { + bz->stream.next_out = reinterpret_cast(buffer.begin()); + bz->stream.avail_out = buffer.size(); + BZ2_bzCompress(&(bz->stream), BZ_RUN); + send(buffer, buffer.size() - bz->stream.avail_out); + } + } + +/* +* Finish Compressing with Bzip +*/ +void Bzip_Compression::end_msg() + { + bz->stream.next_in = 0; + bz->stream.avail_in = 0; + + int rc = BZ_OK; + while(rc != BZ_STREAM_END) + { + bz->stream.next_out = reinterpret_cast(buffer.begin()); + bz->stream.avail_out = buffer.size(); + rc = BZ2_bzCompress(&(bz->stream), BZ_FINISH); + send(buffer, buffer.size() - bz->stream.avail_out); + } + clear(); + } + +/* +* Flush the Bzip Compressor +*/ +void Bzip_Compression::flush() + { + bz->stream.next_in = 0; + bz->stream.avail_in = 0; + + int rc = BZ_OK; + while(rc != BZ_RUN_OK) + { + bz->stream.next_out = reinterpret_cast(buffer.begin()); + bz->stream.avail_out = buffer.size(); + rc = BZ2_bzCompress(&(bz->stream), BZ_FLUSH); + send(buffer, buffer.size() - bz->stream.avail_out); + } + } + +/* +* Clean up Compression Context +*/ +void Bzip_Compression::clear() + { + if(!bz) return; + BZ2_bzCompressEnd(&(bz->stream)); + delete bz; + bz = 0; + } + +/* +* Bzip_Decompression Constructor +*/ +Bzip_Decompression::Bzip_Decompression(bool s) : + small_mem(s), buffer(DEFAULT_BUFFERSIZE) + { + no_writes = true; + bz = 0; + } + +/* +* Decompress Input with Bzip +*/ +void Bzip_Decompression::write(const byte input_arr[], u32bit length) + { + if(length) no_writes = false; + + char* input = reinterpret_cast(const_cast(input_arr)); + + bz->stream.next_in = input; + bz->stream.avail_in = length; + + while(bz->stream.avail_in != 0) + { + bz->stream.next_out = reinterpret_cast(buffer.begin()); + bz->stream.avail_out = buffer.size(); + + int rc = BZ2_bzDecompress(&(bz->stream)); + + if(rc != BZ_OK && rc != BZ_STREAM_END) + { + clear(); + if(rc == BZ_DATA_ERROR) + throw Decoding_Error("Bzip_Decompression: Data integrity error"); + if(rc == BZ_DATA_ERROR_MAGIC) + throw Decoding_Error("Bzip_Decompression: Invalid input"); + if(rc == BZ_MEM_ERROR) + throw Exception("Bzip_Decompression: Memory allocation error"); + throw Exception("Bzip_Decompression: Unknown decompress error"); + } + + send(buffer, buffer.size() - bz->stream.avail_out); + + if(rc == BZ_STREAM_END) + { + u32bit read_from_block = length - bz->stream.avail_in; + start_msg(); + bz->stream.next_in = input + read_from_block; + bz->stream.avail_in = length - read_from_block; + input += read_from_block; + length -= read_from_block; + } + } + } + +/* +* Start Decompressing with Bzip +*/ +void Bzip_Decompression::start_msg() + { + clear(); + bz = new Bzip_Stream; + + if(BZ2_bzDecompressInit(&(bz->stream), 0, small_mem) != BZ_OK) + throw Exception("Bzip_Decompression: Memory allocation error"); + + no_writes = true; + } + +/* +* Finish Decompressing with Bzip +*/ +void Bzip_Decompression::end_msg() + { + if(no_writes) return; + bz->stream.next_in = 0; + bz->stream.avail_in = 0; + + int rc = BZ_OK; + while(rc != BZ_STREAM_END) + { + bz->stream.next_out = reinterpret_cast(buffer.begin()); + bz->stream.avail_out = buffer.size(); + rc = BZ2_bzDecompress(&(bz->stream)); + + if(rc != BZ_OK && rc != BZ_STREAM_END) + { + clear(); + throw Exception("Bzip_Decompression: Error finalizing decompression"); + } + + send(buffer, buffer.size() - bz->stream.avail_out); + } + + clear(); + } + +/* +* Clean up Decompression Context +*/ +void Bzip_Decompression::clear() + { + if(!bz) return; + BZ2_bzDecompressEnd(&(bz->stream)); + delete bz; + bz = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/codec/bzip2/bzip2.h b/src/libs/3rdparty/botan/src/codec/bzip2/bzip2.h new file mode 100644 index 00000000000..f42263537bf --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/bzip2/bzip2.h @@ -0,0 +1,61 @@ +/* +* Bzip Compressor +* (C) 2001 Peter J Jones +* 2001-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BZIP2_H__ +#define BOTAN_BZIP2_H__ + +#include + +namespace Botan { + +/* +* Bzip Compression Filter +*/ +class BOTAN_DLL Bzip_Compression : public Filter + { + public: + void write(const byte input[], u32bit length); + void start_msg(); + void end_msg(); + + void flush(); + + Bzip_Compression(u32bit = 9); + ~Bzip_Compression() { clear(); } + private: + void clear(); + + const u32bit level; + SecureVector buffer; + class Bzip_Stream* bz; + }; + +/* +* Bzip Decompression Filter +*/ +class BOTAN_DLL Bzip_Decompression : public Filter + { + public: + void write(const byte input[], u32bit length); + void start_msg(); + void end_msg(); + + Bzip_Decompression(bool = false); + ~Bzip_Decompression() { clear(); } + private: + void clear(); + + const bool small_mem; + SecureVector buffer; + class Bzip_Stream* bz; + bool no_writes; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/codec/bzip2/info.txt b/src/libs/3rdparty/botan/src/codec/bzip2/info.txt new file mode 100644 index 00000000000..1be84e4054a --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/bzip2/info.txt @@ -0,0 +1,21 @@ +# This module was written by Peter J. Jones + +realname "Bzip2 Compressor" + +define COMPRESSOR_BZIP2 +modset compression + +load_on request + + +bzip2.h +bzip2.cpp + + + +all -> bz2 + + + +filters + diff --git a/src/libs/3rdparty/botan/src/codec/hex/hex.cpp b/src/libs/3rdparty/botan/src/codec/hex/hex.cpp new file mode 100644 index 00000000000..fbacc278b7e --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/hex/hex.cpp @@ -0,0 +1,191 @@ +/* +* Hex Encoder/Decoder +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Hex_Encoder Constructor +*/ +Hex_Encoder::Hex_Encoder(bool breaks, u32bit length, Case c) : + casing(c), line_length(breaks ? length : 0) + { + in.create(64); + out.create(2*in.size()); + counter = position = 0; + } + +/* +* Hex_Encoder Constructor +*/ +Hex_Encoder::Hex_Encoder(Case c) : casing(c), line_length(0) + { + in.create(64); + out.create(2*in.size()); + counter = position = 0; + } + +/* +* Hex Encoding Operation +*/ +void Hex_Encoder::encode(byte in, byte out[2], Hex_Encoder::Case casing) + { + const byte* BIN_TO_HEX = ((casing == Uppercase) ? BIN_TO_HEX_UPPER : + BIN_TO_HEX_LOWER); + + out[0] = BIN_TO_HEX[((in >> 4) & 0x0F)]; + out[1] = BIN_TO_HEX[((in ) & 0x0F)]; + } + +/* +* Encode and send a block +*/ +void Hex_Encoder::encode_and_send(const byte block[], u32bit length) + { + for(u32bit j = 0; j != length; ++j) + encode(block[j], out + 2*j, casing); + + if(line_length == 0) + send(out, 2*length); + else + { + u32bit remaining = 2*length, offset = 0; + while(remaining) + { + u32bit sent = std::min(line_length - counter, remaining); + send(out + offset, sent); + counter += sent; + remaining -= sent; + offset += sent; + if(counter == line_length) + { + send('\n'); + counter = 0; + } + } + } + } + +/* +* Convert some data into hex format +*/ +void Hex_Encoder::write(const byte input[], u32bit length) + { + in.copy(position, input, length); + if(position + length >= in.size()) + { + encode_and_send(in, in.size()); + input += (in.size() - position); + length -= (in.size() - position); + while(length >= in.size()) + { + encode_and_send(input, in.size()); + input += in.size(); + length -= in.size(); + } + in.copy(input, length); + position = 0; + } + position += length; + } + +/* +* Flush buffers +*/ +void Hex_Encoder::end_msg() + { + encode_and_send(in, position); + if(counter && line_length) + send('\n'); + counter = position = 0; + } + +/* +* Hex_Decoder Constructor +*/ +Hex_Decoder::Hex_Decoder(Decoder_Checking c) : checking(c) + { + in.create(64); + out.create(in.size() / 2); + position = 0; + } + +/* +* Check if a character is a valid hex char +*/ +bool Hex_Decoder::is_valid(byte in) + { + return (HEX_TO_BIN[in] != 0x80); + } + +/* +* Handle processing an invalid character +*/ +void Hex_Decoder::handle_bad_char(byte c) + { + if(checking == NONE) + return; + + if((checking == IGNORE_WS) && Charset::is_space(c)) + return; + + throw Decoding_Error("Hex_Decoder: Invalid hex character: " + + to_string(c)); + } + +/* +* Hex Decoding Operation +*/ +byte Hex_Decoder::decode(const byte hex[2]) + { + return ((HEX_TO_BIN[hex[0]] << 4) | HEX_TO_BIN[hex[1]]); + } + +/* +* Decode and send a block +*/ +void Hex_Decoder::decode_and_send(const byte block[], u32bit length) + { + for(u32bit j = 0; j != length / 2; ++j) + out[j] = decode(block + 2*j); + send(out, length / 2); + } + +/* +* Convert some data from hex format +*/ +void Hex_Decoder::write(const byte input[], u32bit length) + { + for(u32bit j = 0; j != length; ++j) + { + if(is_valid(input[j])) + in[position++] = input[j]; + else + handle_bad_char(input[j]); + if(position == in.size()) + { + decode_and_send(in, in.size()); + position = 0; + } + } + } + +/* +* Flush buffers +*/ +void Hex_Decoder::end_msg() + { + decode_and_send(in, position); + position = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/codec/hex/hex.h b/src/libs/3rdparty/botan/src/codec/hex/hex.h new file mode 100644 index 00000000000..035bf4ef973 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/hex/hex.h @@ -0,0 +1,90 @@ +/* +* Hex Encoder/Decoder +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_HEX_H__ +#define BOTAN_HEX_H__ + +#include + +namespace Botan { + +/** +* This class represents a hex encoder. It encodes byte arrays to hex strings. +*/ +class BOTAN_DLL Hex_Encoder : public Filter + { + public: + /** + * Whether to use uppercase or lowercase letters for the encoded string. + */ + enum Case { Uppercase, Lowercase }; + + /** + Encode a single byte into two hex characters + */ + static void encode(byte in, byte out[2], Case the_case = Uppercase); + + void write(const byte in[], u32bit length); + void end_msg(); + + /** + * Create a hex encoder. + * @param the_case the case to use in the encoded strings. + */ + Hex_Encoder(Case the_case); + + /** + * Create a hex encoder. + * @param newlines should newlines be used + * @param line_length if newlines are used, how long are lines + * @param the_case the case to use in the encoded strings + */ + Hex_Encoder(bool newlines = false, + u32bit line_length = 72, + Case the_case = Uppercase); + private: + void encode_and_send(const byte[], u32bit); + static const byte BIN_TO_HEX_UPPER[16]; + static const byte BIN_TO_HEX_LOWER[16]; + + const Case casing; + const u32bit line_length; + SecureVector in, out; + u32bit position, counter; + }; + +/** +* This class represents a hex decoder. It converts hex strings to byte arrays. +*/ +class BOTAN_DLL Hex_Decoder : public Filter + { + public: + static byte decode(const byte[2]); + static bool is_valid(byte); + + void write(const byte[], u32bit); + void end_msg(); + + /** + * Construct a Hex Decoder using the specified + * character checking. + * @param checking the checking to use during decoding. + */ + Hex_Decoder(Decoder_Checking checking = NONE); + private: + void decode_and_send(const byte[], u32bit); + void handle_bad_char(byte); + static const byte HEX_TO_BIN[256]; + + const Decoder_Checking checking; + SecureVector in, out; + u32bit position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/codec/hex/hex_char.cpp b/src/libs/3rdparty/botan/src/codec/hex/hex_char.cpp new file mode 100644 index 00000000000..c28efc5f7e9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/hex/hex_char.cpp @@ -0,0 +1,48 @@ +/* +* Hex Character Table +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Hex Encoder Lookup Tables +*/ +const byte Hex_Encoder::BIN_TO_HEX_UPPER[16] = { +0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, +0x44, 0x45, 0x46 }; + +const byte Hex_Encoder::BIN_TO_HEX_LOWER[16] = { +0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, +0x64, 0x65, 0x66 }; + +/* +* Hex Decoder Lookup Table +*/ +const byte Hex_Decoder::HEX_TO_BIN[256] = { +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x01, 0x02, 0x03, +0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; + +} diff --git a/src/libs/3rdparty/botan/src/codec/hex/info.txt b/src/libs/3rdparty/botan/src/codec/hex/info.txt new file mode 100644 index 00000000000..512a5de8bd1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/hex/info.txt @@ -0,0 +1,15 @@ +realname "Hex Codec" + +define HEX_CODEC + +load_on auto + + +hex.cpp +hex_char.cpp +hex.h + + + +filters + diff --git a/src/libs/3rdparty/botan/src/codec/openpgp/info.txt b/src/libs/3rdparty/botan/src/codec/openpgp/info.txt new file mode 100644 index 00000000000..6b30850d006 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/openpgp/info.txt @@ -0,0 +1,15 @@ +realname "OpenPGP Codec" + +define OPENPGP_CODEC + +load_on auto + + +openpgp.cpp +openpgp.h + + + +crc24 +filters + diff --git a/src/libs/3rdparty/botan/src/codec/openpgp/openpgp.cpp b/src/libs/3rdparty/botan/src/codec/openpgp/openpgp.cpp new file mode 100644 index 00000000000..7f9cf5f9c8e --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/openpgp/openpgp.cpp @@ -0,0 +1,197 @@ +/* +* OpenPGP +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +namespace OpenPGP { + +/* +* OpenPGP Base64 encoding +*/ +std::string encode(const byte input[], u32bit length, + const std::string& label, + const std::map& headers) + { + const std::string PGP_HEADER = "-----BEGIN PGP " + label + "-----\n"; + const std::string PGP_TRAILER = "-----END PGP " + label + "-----\n"; + const u32bit PGP_WIDTH = 64; + + std::string pgp_encoded = PGP_HEADER; + + if(headers.find("Version") != headers.end()) + pgp_encoded += "Version: " + headers.find("Version")->second + '\n'; + + std::map::const_iterator i = headers.begin(); + while(i != headers.end()) + { + if(i->first != "Version") + pgp_encoded += i->first + ": " + i->second + '\n'; + ++i; + } + pgp_encoded += '\n'; + + Pipe pipe(new Fork( + new Base64_Encoder(true, PGP_WIDTH), + new Chain(new Hash_Filter(new CRC24), new Base64_Encoder) + ) + ); + + pipe.process_msg(input, length); + + pgp_encoded += pipe.read_all_as_string(0); + pgp_encoded += '=' + pipe.read_all_as_string(1) + '\n'; + pgp_encoded += PGP_TRAILER; + + return pgp_encoded; + } + +/* +* OpenPGP Base64 encoding +*/ +std::string encode(const byte input[], u32bit length, + const std::string& type) + { + std::map empty; + return encode(input, length, type, empty); + } + +/* +* OpenPGP Base64 decoding +*/ +SecureVector decode(DataSource& source, std::string& label, + std::map& headers) + { + const u32bit RANDOM_CHAR_LIMIT = 5; + + const std::string PGP_HEADER1 = "-----BEGIN PGP "; + const std::string PGP_HEADER2 = "-----"; + u32bit position = 0; + + while(position != PGP_HEADER1.length()) + { + byte b; + if(!source.read_byte(b)) + throw Decoding_Error("PGP: No PGP header found"); + if(b == PGP_HEADER1[position]) + ++position; + else if(position >= RANDOM_CHAR_LIMIT) + throw Decoding_Error("PGP: Malformed PGP header"); + else + position = 0; + } + position = 0; + while(position != PGP_HEADER2.length()) + { + byte b; + if(!source.read_byte(b)) + throw Decoding_Error("PGP: No PGP header found"); + if(b == PGP_HEADER2[position]) + ++position; + else if(position) + throw Decoding_Error("PGP: Malformed PGP header"); + + if(position == 0) + label += static_cast(b); + } + + headers.clear(); + bool end_of_headers = false; + while(!end_of_headers) + { + std::string this_header; + byte b = 0; + while(b != '\n') + { + if(!source.read_byte(b)) + throw Decoding_Error("PGP: Bad armor header"); + if(b != '\n') + this_header += static_cast(b); + } + + end_of_headers = true; + for(u32bit j = 0; j != this_header.length(); ++j) + if(!Charset::is_space(this_header[j])) + end_of_headers = false; + + if(!end_of_headers) + { + std::string::size_type pos = this_header.find(": "); + if(pos == std::string::npos) + throw Decoding_Error("OpenPGP: Bad headers"); + + std::string key = this_header.substr(0, pos); + std::string value = this_header.substr(pos + 2, std::string::npos); + headers[key] = value; + } + } + + Pipe base64(new Base64_Decoder, + new Fork(0, + new Chain(new Hash_Filter(new CRC24), + new Base64_Encoder) + ) + ); + base64.start_msg(); + + const std::string PGP_TRAILER = "-----END PGP " + label + "-----"; + position = 0; + bool newline_seen = 0; + std::string crc; + while(position != PGP_TRAILER.length()) + { + byte b; + if(!source.read_byte(b)) + throw Decoding_Error("PGP: No PGP trailer found"); + if(b == PGP_TRAILER[position]) + ++position; + else if(position) + throw Decoding_Error("PGP: Malformed PGP trailer"); + + if(b == '=' && newline_seen) + { + while(b != '\n') + { + if(!source.read_byte(b)) + throw Decoding_Error("PGP: Bad CRC tail"); + if(b != '\n') + crc += static_cast(b); + } + } + else if(b == '\n') + newline_seen = true; + else if(position == 0) + { + base64.write(b); + newline_seen = false; + } + } + base64.end_msg(); + + if(crc != "" && crc != base64.read_all_as_string(1)) + throw Decoding_Error("PGP: Corrupt CRC"); + + return base64.read_all(); + } + +/* +* OpenPGP Base64 decoding +*/ +SecureVector decode(DataSource& source, std::string& label) + { + std::map ignored; + return decode(source, label, ignored); + } + +} + +} + diff --git a/src/libs/3rdparty/botan/src/codec/openpgp/openpgp.h b/src/libs/3rdparty/botan/src/codec/openpgp/openpgp.h new file mode 100644 index 00000000000..890fcf0e31d --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/openpgp/openpgp.h @@ -0,0 +1,34 @@ +/* +* OpenPGP +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_OPENPGP_H__ +#define BOTAN_OPENPGP_H__ + +#include +#include +#include + +namespace Botan { + +namespace OpenPGP { + +/* +* OpenPGP Base64 encoding/decoding +*/ +BOTAN_DLL std::string encode(const byte[], u32bit, const std::string&, + const std::map&); +BOTAN_DLL SecureVector decode(DataSource&, std::string&, + std::map&); + +BOTAN_DLL std::string encode(const byte[], u32bit, const std::string&); +BOTAN_DLL SecureVector decode(DataSource&, std::string&); + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/codec/pem/info.txt b/src/libs/3rdparty/botan/src/codec/pem/info.txt new file mode 100644 index 00000000000..bbe8d4c70b2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/pem/info.txt @@ -0,0 +1,15 @@ +realname "PEM Codec" + +define PEM_CODEC + +load_on auto + + +pem.cpp +pem.h + + + +base64 +filters + diff --git a/src/libs/3rdparty/botan/src/codec/pem/pem.cpp b/src/libs/3rdparty/botan/src/codec/pem/pem.cpp new file mode 100644 index 00000000000..5141bee2197 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/pem/pem.cpp @@ -0,0 +1,143 @@ +/* +* PEM Encoding/Decoding +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace PEM_Code { + +/* +* PEM encode BER/DER-encoded objects +*/ +std::string encode(const byte der[], u32bit length, const std::string& label, + u32bit width) + { + const std::string PEM_HEADER = "-----BEGIN " + label + "-----\n"; + const std::string PEM_TRAILER = "-----END " + label + "-----\n"; + + Pipe pipe(new Base64_Encoder(true, width)); + pipe.process_msg(der, length); + return (PEM_HEADER + pipe.read_all_as_string() + PEM_TRAILER); + } + +/* +* PEM encode BER/DER-encoded objects +*/ +std::string encode(const MemoryRegion& data, const std::string& label, + u32bit width) + { + return encode(data, data.size(), label, width); + } + +/* +* Decode PEM down to raw BER/DER +*/ +SecureVector decode_check_label(DataSource& source, + const std::string& label_want) + { + std::string label_got; + SecureVector ber = decode(source, label_got); + if(label_got != label_want) + throw Decoding_Error("PEM: Label mismatch, wanted " + label_want + + ", got " + label_got); + return ber; + } + +/* +* Decode PEM down to raw BER/DER +*/ +SecureVector decode(DataSource& source, std::string& label) + { + const u32bit RANDOM_CHAR_LIMIT = 8; + + const std::string PEM_HEADER1 = "-----BEGIN "; + const std::string PEM_HEADER2 = "-----"; + u32bit position = 0; + + while(position != PEM_HEADER1.length()) + { + byte b; + if(!source.read_byte(b)) + throw Decoding_Error("PEM: No PEM header found"); + if(b == PEM_HEADER1[position]) + ++position; + else if(position >= RANDOM_CHAR_LIMIT) + throw Decoding_Error("PEM: Malformed PEM header"); + else + position = 0; + } + position = 0; + while(position != PEM_HEADER2.length()) + { + byte b; + if(!source.read_byte(b)) + throw Decoding_Error("PEM: No PEM header found"); + if(b == PEM_HEADER2[position]) + ++position; + else if(position) + throw Decoding_Error("PEM: Malformed PEM header"); + + if(position == 0) + label += static_cast(b); + } + + Pipe base64(new Base64_Decoder); + base64.start_msg(); + + const std::string PEM_TRAILER = "-----END " + label + "-----"; + position = 0; + while(position != PEM_TRAILER.length()) + { + byte b; + if(!source.read_byte(b)) + throw Decoding_Error("PEM: No PEM trailer found"); + if(b == PEM_TRAILER[position]) + ++position; + else if(position) + throw Decoding_Error("PEM: Malformed PEM trailer"); + + if(position == 0) + base64.write(b); + } + base64.end_msg(); + return base64.read_all(); + } + +/* +* Search for a PEM signature +*/ +bool matches(DataSource& source, const std::string& extra, + u32bit search_range) + { + const std::string PEM_HEADER = "-----BEGIN " + extra; + + SecureVector search_buf(search_range); + u32bit got = source.peek(search_buf, search_buf.size(), 0); + + if(got < PEM_HEADER.length()) + return false; + + u32bit index = 0; + + for(u32bit j = 0; j != got; ++j) + { + if(search_buf[j] == PEM_HEADER[index]) + ++index; + else + index = 0; + if(index == PEM_HEADER.size()) + return true; + } + return false; + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/codec/pem/pem.h b/src/libs/3rdparty/botan/src/codec/pem/pem.h new file mode 100644 index 00000000000..9fe8acb8738 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/pem/pem.h @@ -0,0 +1,35 @@ +/* +* PEM Encoding/Decoding +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PEM_H__ +#define BOTAN_PEM_H__ + +#include + +namespace Botan { + +namespace PEM_Code { + +/* +* PEM Encoding/Decoding +*/ +BOTAN_DLL std::string encode(const byte[], u32bit, + const std::string&, u32bit = 64); +BOTAN_DLL std::string encode(const MemoryRegion&, + const std::string&, u32bit = 64); + +BOTAN_DLL SecureVector decode(DataSource&, std::string&); +BOTAN_DLL SecureVector decode_check_label(DataSource&, + const std::string&); +BOTAN_DLL bool matches(DataSource&, const std::string& = "", + u32bit search_range = 4096); + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/codec/zlib/info.txt b/src/libs/3rdparty/botan/src/codec/zlib/info.txt new file mode 100644 index 00000000000..9b1c35d8455 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/zlib/info.txt @@ -0,0 +1,23 @@ +realname "Zlib Compressor" +#realname "Zlib/Gzip Compressor" + +define COMPRESSOR_ZLIB +#define COMPRESSOR_ZLIB,COMPRESSOR_GZIP + +load_on request +modset compression + + +zlib.h +zlib.cpp +#gzip.h +#gzip.cpp + + + +all -> z + + + +filters + diff --git a/src/libs/3rdparty/botan/src/codec/zlib/zlib.cpp b/src/libs/3rdparty/botan/src/codec/zlib/zlib.cpp new file mode 100644 index 00000000000..246e32924a8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/zlib/zlib.cpp @@ -0,0 +1,287 @@ +/* +* Zlib Compressor +* (C) 2001 Peter J Jones +* 2001-2007 Jack Lloyd +* 2006 Matt Johnston +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Allocation Information for Zlib +*/ +class Zlib_Alloc_Info + { + public: + std::map current_allocs; + Allocator* alloc; + + Zlib_Alloc_Info() { alloc = Allocator::get(false); } + }; + +/* +* Allocation Function for Zlib +*/ +void* zlib_malloc(void* info_ptr, unsigned int n, unsigned int size) + { + Zlib_Alloc_Info* info = static_cast(info_ptr); + void* ptr = info->alloc->allocate(n * size); + info->current_allocs[ptr] = n * size; + return ptr; + } + +/* +* Allocation Function for Zlib +*/ +void zlib_free(void* info_ptr, void* ptr) + { + Zlib_Alloc_Info* info = static_cast(info_ptr); + std::map::const_iterator i = info->current_allocs.find(ptr); + if(i == info->current_allocs.end()) + throw Invalid_Argument("zlib_free: Got pointer not allocated by us"); + info->alloc->deallocate(ptr, i->second); + } + +} + +/* +* Wrapper Type for Zlib z_stream +*/ +class Zlib_Stream + { + public: + z_stream stream; + + Zlib_Stream() + { + std::memset(&stream, 0, sizeof(z_stream)); + stream.zalloc = zlib_malloc; + stream.zfree = zlib_free; + stream.opaque = new Zlib_Alloc_Info; + } + ~Zlib_Stream() + { + Zlib_Alloc_Info* info = static_cast(stream.opaque); + delete info; + std::memset(&stream, 0, sizeof(z_stream)); + } + }; + +/* +* Zlib_Compression Constructor +*/ +Zlib_Compression::Zlib_Compression(u32bit l) : + level((l >= 9) ? 9 : l), buffer(DEFAULT_BUFFERSIZE) + { + zlib = 0; + } + +/* +* Start Compressing with Zlib +*/ +void Zlib_Compression::start_msg() + { + clear(); + zlib = new Zlib_Stream; + if(deflateInit(&(zlib->stream), level) != Z_OK) + throw Exception("Zlib_Compression: Memory allocation error"); + } + +/* +* Compress Input with Zlib +*/ +void Zlib_Compression::write(const byte input[], u32bit length) + { + zlib->stream.next_in = static_cast(const_cast(input)); + zlib->stream.avail_in = length; + + while(zlib->stream.avail_in != 0) + { + zlib->stream.next_out = static_cast(buffer.begin()); + zlib->stream.avail_out = buffer.size(); + deflate(&(zlib->stream), Z_NO_FLUSH); + send(buffer.begin(), buffer.size() - zlib->stream.avail_out); + } + } + +/* +* Finish Compressing with Zlib +*/ +void Zlib_Compression::end_msg() + { + zlib->stream.next_in = 0; + zlib->stream.avail_in = 0; + + int rc = Z_OK; + while(rc != Z_STREAM_END) + { + zlib->stream.next_out = reinterpret_cast(buffer.begin()); + zlib->stream.avail_out = buffer.size(); + rc = deflate(&(zlib->stream), Z_FINISH); + send(buffer.begin(), buffer.size() - zlib->stream.avail_out); + } + clear(); + } + +/* +* Flush the Zlib Compressor +*/ +void Zlib_Compression::flush() + { + zlib->stream.next_in = 0; + zlib->stream.avail_in = 0; + + while(true) + { + zlib->stream.avail_out = buffer.size(); + + zlib->stream.next_out = reinterpret_cast(buffer.begin()); + + + deflate(&(zlib->stream), Z_FULL_FLUSH); + send(buffer.begin(), buffer.size() - zlib->stream.avail_out); + if(zlib->stream.avail_out == buffer.size()) break; + } + } + +/* +* Clean up Compression Context +*/ +void Zlib_Compression::clear() + { + if(zlib) + { + deflateEnd(&(zlib->stream)); + delete zlib; + zlib = 0; + } + + buffer.clear(); + } + +/* +* Zlib_Decompression Constructor +*/ +Zlib_Decompression::Zlib_Decompression() : buffer(DEFAULT_BUFFERSIZE) + { + zlib = 0; + no_writes = true; + } + +/* +* Start Decompressing with Zlib +*/ +void Zlib_Decompression::start_msg() + { + clear(); + zlib = new Zlib_Stream; + if(inflateInit(&(zlib->stream)) != Z_OK) + throw Exception("Zlib_Decompression: Memory allocation error"); + } + +/* +* Decompress Input with Zlib +*/ +void Zlib_Decompression::write(const byte input_arr[], u32bit length) + { + if(length) no_writes = false; + + // non-const needed by zlib api :( + Bytef* input = reinterpret_cast(const_cast(input_arr)); + + zlib->stream.next_in = input; + zlib->stream.avail_in = length; + + while(zlib->stream.avail_in != 0) + { + zlib->stream.next_out = reinterpret_cast(buffer.begin()); + zlib->stream.avail_out = buffer.size(); + + int rc = inflate(&(zlib->stream), Z_SYNC_FLUSH); + + if(rc != Z_OK && rc != Z_STREAM_END) + { + clear(); + if(rc == Z_DATA_ERROR) + throw Decoding_Error("Zlib_Decompression: Data integrity error"); + if(rc == Z_NEED_DICT) + throw Decoding_Error("Zlib_Decompression: Need preset dictionary"); + if(rc == Z_MEM_ERROR) + throw Exception("Zlib_Decompression: Memory allocation error"); + throw Exception("Zlib_Decompression: Unknown decompress error"); + } + + send(buffer.begin(), buffer.size() - zlib->stream.avail_out); + + if(rc == Z_STREAM_END) + { + u32bit read_from_block = length - zlib->stream.avail_in; + start_msg(); + + zlib->stream.next_in = input + read_from_block; + zlib->stream.avail_in = length - read_from_block; + + input += read_from_block; + length -= read_from_block; + } + } + } + +/* +* Finish Decompressing with Zlib +*/ +void Zlib_Decompression::end_msg() + { + if(no_writes) return; + zlib->stream.next_in = 0; + zlib->stream.avail_in = 0; + + int rc = Z_OK; + + while(rc != Z_STREAM_END) + { + zlib->stream.next_out = reinterpret_cast(buffer.begin()); + zlib->stream.avail_out = buffer.size(); + rc = inflate(&(zlib->stream), Z_SYNC_FLUSH); + + if(rc != Z_OK && rc != Z_STREAM_END) + { + clear(); + throw Exception("Zlib_Decompression: Error finalizing decompression"); + } + + send(buffer.begin(), buffer.size() - zlib->stream.avail_out); + } + + clear(); + } + +/* +* Clean up Decompression Context +*/ +void Zlib_Decompression::clear() + { + no_writes = true; + + if(zlib) + { + inflateEnd(&(zlib->stream)); + delete zlib; + zlib = 0; + } + + buffer.clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/codec/zlib/zlib.h b/src/libs/3rdparty/botan/src/codec/zlib/zlib.h new file mode 100644 index 00000000000..4a7f3bc806a --- /dev/null +++ b/src/libs/3rdparty/botan/src/codec/zlib/zlib.h @@ -0,0 +1,58 @@ +/* +* Zlib Compressor +* (C) 2001 Peter J Jones +* 2001-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ZLIB_H__ +#define BOTAN_ZLIB_H__ + +#include + +namespace Botan { + +/* +* Zlib Compression Filter +*/ +class BOTAN_DLL Zlib_Compression : public Filter + { + public: + void write(const byte input[], u32bit length); + void start_msg(); + void end_msg(); + + void flush(); + + Zlib_Compression(u32bit = 6); + ~Zlib_Compression() { clear(); } + private: + void clear(); + const u32bit level; + SecureVector buffer; + class Zlib_Stream* zlib; + }; + +/* +* Zlib Decompression Filter +*/ +class BOTAN_DLL Zlib_Decompression : public Filter + { + public: + void write(const byte input[], u32bit length); + void start_msg(); + void end_msg(); + + Zlib_Decompression(); + ~Zlib_Decompression() { clear(); } + private: + void clear(); + SecureVector buffer; + class Zlib_Stream* zlib; + bool no_writes; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cryptobox/cryptobox.cpp b/src/libs/3rdparty/botan/src/cryptobox/cryptobox.cpp new file mode 100644 index 00000000000..c27bbaffa62 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cryptobox/cryptobox.cpp @@ -0,0 +1,146 @@ +/* +* Cryptobox Message Routines +* (C) 2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace CryptoBox { + +namespace { + +/* +First 24 bits of SHA-256("Botan Cryptobox"), followed by 8 0 bits +for later use as flags, etc if needed +*/ +const u32bit CRYPTOBOX_VERSION_CODE = 0xEFC22400; + +const u32bit VERSION_CODE_LEN = 4; +const u32bit CIPHER_KEY_LEN = 32; +const u32bit CIPHER_IV_LEN = 16; +const u32bit MAC_KEY_LEN = 32; +const u32bit MAC_OUTPUT_LEN = 20; +const u32bit PBKDF_SALT_LEN = 10; +const u32bit PBKDF_ITERATIONS = 8 * 1024; + +const u32bit PBKDF_OUTPUT_LEN = CIPHER_KEY_LEN + CIPHER_IV_LEN + MAC_KEY_LEN; + +} + +std::string encrypt(const byte input[], u32bit input_len, + const std::string& passphrase, + RandomNumberGenerator& rng) + { + SecureVector pbkdf_salt(PBKDF_SALT_LEN); + rng.randomize(pbkdf_salt.begin(), pbkdf_salt.size()); + + PKCS5_PBKDF2 pbkdf(new HMAC(new SHA_512)); + pbkdf.change_salt(pbkdf_salt.begin(), pbkdf_salt.size()); + pbkdf.set_iterations(PBKDF_ITERATIONS); + + OctetString mk = pbkdf.derive_key(PBKDF_OUTPUT_LEN, passphrase); + + SymmetricKey cipher_key(mk.begin(), CIPHER_KEY_LEN); + SymmetricKey mac_key(mk.begin() + CIPHER_KEY_LEN, MAC_KEY_LEN); + InitializationVector iv(mk.begin() + CIPHER_KEY_LEN + MAC_KEY_LEN, + CIPHER_IV_LEN); + + Pipe pipe(new CTR_BE(new Serpent, cipher_key, iv), + new Fork( + 0, + new MAC_Filter(new HMAC(new SHA_512), + mac_key, MAC_OUTPUT_LEN))); + + pipe.process_msg(input, input_len); + + /* + Output format is: + version # (4 bytes) + salt (10 bytes) + mac (20 bytes) + ciphertext + */ + u32bit ciphertext_len = pipe.remaining(0); + + SecureVector out_buf; + + for(u32bit i = 0; i != VERSION_CODE_LEN; ++i) + out_buf.append(get_byte(i, CRYPTOBOX_VERSION_CODE)); + + out_buf.append(pbkdf_salt.begin(), pbkdf_salt.size()); + + out_buf.grow_to(out_buf.size() + MAC_OUTPUT_LEN + ciphertext_len); + pipe.read(out_buf + VERSION_CODE_LEN + PBKDF_SALT_LEN, MAC_OUTPUT_LEN, 1); + pipe.read(out_buf + VERSION_CODE_LEN + PBKDF_SALT_LEN + MAC_OUTPUT_LEN, + ciphertext_len, 0); + + return PEM_Code::encode(out_buf.begin(), out_buf.size(), + "BOTAN CRYPTOBOX MESSAGE"); + } + +std::string decrypt(const byte input[], u32bit input_len, + const std::string& passphrase) + { + DataSource_Memory input_src(input, input_len); + SecureVector ciphertext = + PEM_Code::decode_check_label(input_src, + "BOTAN CRYPTOBOX MESSAGE"); + + if(ciphertext.size() < (VERSION_CODE_LEN + PBKDF_SALT_LEN + MAC_OUTPUT_LEN)) + throw Decoding_Error("Invalid CryptoBox input"); + + for(u32bit i = 0; i != VERSION_CODE_LEN; ++i) + if(ciphertext[i] != get_byte(i, CRYPTOBOX_VERSION_CODE)) + throw Decoding_Error("Bad CryptoBox version"); + + SecureVector pbkdf_salt(ciphertext + VERSION_CODE_LEN, PBKDF_SALT_LEN); + + PKCS5_PBKDF2 pbkdf(new HMAC(new SHA_512)); + pbkdf.change_salt(pbkdf_salt.begin(), pbkdf_salt.size()); + pbkdf.set_iterations(PBKDF_ITERATIONS); + + OctetString mk = pbkdf.derive_key(PBKDF_OUTPUT_LEN, passphrase); + + SymmetricKey cipher_key(mk.begin(), CIPHER_KEY_LEN); + SymmetricKey mac_key(mk.begin() + CIPHER_KEY_LEN, MAC_KEY_LEN); + InitializationVector iv(mk.begin() + CIPHER_KEY_LEN + MAC_KEY_LEN, + CIPHER_IV_LEN); + + Pipe pipe(new Fork( + new CTR_BE(new Serpent, cipher_key, iv), + new MAC_Filter(new HMAC(new SHA_512), + mac_key, MAC_OUTPUT_LEN))); + + const u32bit ciphertext_offset = + VERSION_CODE_LEN + PBKDF_SALT_LEN + MAC_OUTPUT_LEN; + + pipe.process_msg(ciphertext + ciphertext_offset, + ciphertext.size() - ciphertext_offset); + + byte computed_mac[MAC_OUTPUT_LEN]; + pipe.read(computed_mac, MAC_OUTPUT_LEN, 1); + + if(!same_mem(computed_mac, ciphertext + VERSION_CODE_LEN + PBKDF_SALT_LEN, + MAC_OUTPUT_LEN)) + throw Integrity_Failure("CryptoBox integrity failure"); + + return pipe.read_all_as_string(0); + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/cryptobox/cryptobox.h b/src/libs/3rdparty/botan/src/cryptobox/cryptobox.h new file mode 100644 index 00000000000..a30cb244aed --- /dev/null +++ b/src/libs/3rdparty/botan/src/cryptobox/cryptobox.h @@ -0,0 +1,42 @@ +/* +* Cryptobox Message Routines +* (C) 2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CRYPTOBOX_H__ +#define BOTAN_CRYPTOBOX_H__ + +#include +#include + +namespace Botan { + +namespace CryptoBox { + +/** +* Encrypt a message +* @param input the input data +* @param input_len the length of input in bytes +* @param passphrase the passphrase used to encrypt the message +* @param rng a ref to a random number generator, such as AutoSeeded_RNG +*/ +BOTAN_DLL std::string encrypt(const byte input[], u32bit input_len, + const std::string& passphrase, + RandomNumberGenerator& rng); + +/** +* Decrypt a message encrypted with CryptoBox::encrypt +* @param input the input data +* @param input_len the length of input in bytes +* @param passphrase the passphrase used to encrypt the message +*/ +BOTAN_DLL std::string decrypt(const byte input[], u32bit input_len, + const std::string& passphrase); + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/cryptobox/info.txt b/src/libs/3rdparty/botan/src/cryptobox/info.txt new file mode 100644 index 00000000000..b9b98060fe2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/cryptobox/info.txt @@ -0,0 +1,22 @@ +realname "Crypto Box" + +load_on auto + +define CRYPTO_BOX + + +cryptobox.h +cryptobox.cpp + + + +filters +ctr +hmac +rng +serpent +sha2 +base64 +pbkdf2 +pem + diff --git a/src/libs/3rdparty/botan/src/engine/amd64_eng/eng_amd64.cpp b/src/libs/3rdparty/botan/src/engine/amd64_eng/eng_amd64.cpp new file mode 100644 index 00000000000..eed2cf3032a --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/amd64_eng/eng_amd64.cpp @@ -0,0 +1,27 @@ +/** +* AMD64 Assembly Implementation Engine +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +#if defined(BOTAN_HAS_SHA1_AMD64) + #include +#endif + +namespace Botan { + +HashFunction* AMD64_Assembler_Engine::find_hash(const SCAN_Name& request, + Algorithm_Factory&) const + { +#if defined(BOTAN_HAS_SHA1_AMD64) + if(request.algo_name() == "SHA-160") + return new SHA_160_AMD64; +#endif + + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/amd64_eng/eng_amd64.h b/src/libs/3rdparty/botan/src/engine/amd64_eng/eng_amd64.h new file mode 100644 index 00000000000..528291fed7d --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/amd64_eng/eng_amd64.h @@ -0,0 +1,26 @@ +/** +* x86-64 Assembly Implementation Engines +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_AMD64_ASM_ENGINE_H__ +#define BOTAN_AMD64_ASM_ENGINE_H__ + +#include + +namespace Botan { + +class BOTAN_DLL AMD64_Assembler_Engine : public Engine + { + public: + std::string provider_name() const { return "amd64"; } + private: + HashFunction* find_hash(const SCAN_Name& reqeust, + Algorithm_Factory&) const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/engine/amd64_eng/info.txt b/src/libs/3rdparty/botan/src/engine/amd64_eng/info.txt new file mode 100644 index 00000000000..47f89144579 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/amd64_eng/info.txt @@ -0,0 +1,10 @@ +realname "AMD64 Assembler Engine" + +define ENGINE_AMD64_ASSEMBLER + +load_on dep + + +eng_amd64.cpp +eng_amd64.h + diff --git a/src/libs/3rdparty/botan/src/engine/def_engine/def_eng.h b/src/libs/3rdparty/botan/src/engine/def_engine/def_eng.h new file mode 100644 index 00000000000..2d71454802e --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/def_engine/def_eng.h @@ -0,0 +1,83 @@ +/* +* Default Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DEFAULT_ENGINE_H__ +#define BOTAN_DEFAULT_ENGINE_H__ + +#include + +namespace Botan { + +/* +* Default Engine +*/ +class BOTAN_DLL Default_Engine : public Engine + { + public: + std::string provider_name() const { return "core"; } + +#if defined(BOTAN_HAS_IF_PUBLIC_KEY_FAMILY) + IF_Operation* if_op(const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_DSA) + DSA_Operation* dsa_op(const DL_Group&, const BigInt&, + const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + NR_Operation* nr_op(const DL_Group&, const BigInt&, const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_ELGAMAL) + ELG_Operation* elg_op(const DL_Group&, const BigInt&, + const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + DH_Operation* dh_op(const DL_Group&, const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_ECDSA) + virtual ECDSA_Operation* ecdsa_op(const EC_Domain_Params&, + const BigInt&, + const PointGFp&) const; +#endif + +#if defined(BOTAN_HAS_ECKAEG) + virtual ECKAEG_Operation* eckaeg_op(const EC_Domain_Params&, + const BigInt&, + const PointGFp&) const; +#endif + + Modular_Exponentiator* mod_exp(const BigInt&, + Power_Mod::Usage_Hints) const; + + virtual bool can_add_algorithms() { return true; } + + Keyed_Filter* get_cipher(const std::string&, Cipher_Dir, + Algorithm_Factory&); + + private: + BlockCipher* find_block_cipher(const SCAN_Name&, + Algorithm_Factory&) const; + + StreamCipher* find_stream_cipher(const SCAN_Name&, + Algorithm_Factory&) const; + + HashFunction* find_hash(const SCAN_Name& reqeust, + Algorithm_Factory&) const; + + MessageAuthenticationCode* find_mac(const SCAN_Name& reqeust, + Algorithm_Factory&) const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/engine/def_engine/def_mode.cpp b/src/libs/3rdparty/botan/src/engine/def_engine/def_mode.cpp new file mode 100644 index 00000000000..2b093a0a367 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/def_engine/def_mode.cpp @@ -0,0 +1,209 @@ +/* +* Default Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +#if defined(BOTAN_HAS_ECB) + #include +#endif + +#if defined(BOTAN_HAS_CBC) + #include +#endif + +#if defined(BOTAN_HAS_CTS) + #include +#endif + +#if defined(BOTAN_HAS_CFB) + #include +#endif + +#if defined(BOTAN_HAS_OFB) + #include +#endif + +#if defined(BOTAN_HAS_CTR) + #include +#endif + +#if defined(BOTAN_HAS_EAX) + #include +#endif + +#if defined(BOTAN_HAS_XTS) + #include +#endif + +namespace Botan { + +namespace { + +/** +* Get a block cipher padding method by name +*/ +BlockCipherModePaddingMethod* get_bc_pad(const std::string& algo_spec) + { + SCAN_Name request(algo_spec); + +#if defined(BOTAN_HAS_CIPHER_MODE_PADDING) + if(request.algo_name() == "PKCS7") + return new PKCS7_Padding; + + if(request.algo_name() == "OneAndZeros") + return new OneAndZeros_Padding; + + if(request.algo_name() == "X9.23") + return new ANSI_X923_Padding; + + if(request.algo_name() == "NoPadding") + return new Null_Padding; +#endif + + throw Algorithm_Not_Found(algo_spec); + } + +} + +/* +* Get a cipher object +*/ +Keyed_Filter* Default_Engine::get_cipher(const std::string& algo_spec, + Cipher_Dir direction, + Algorithm_Factory& af) + { + std::vector algo_parts = split_on(algo_spec, '/'); + if(algo_parts.empty()) + throw Invalid_Algorithm_Name(algo_spec); + + const std::string cipher_name = algo_parts[0]; + + // check if it is a stream cipher first (easy case) + const StreamCipher* stream_cipher = af.prototype_stream_cipher(cipher_name); + if(stream_cipher) + return new StreamCipher_Filter(stream_cipher->clone()); + + const BlockCipher* block_cipher = af.prototype_block_cipher(cipher_name); + if(!block_cipher) + return 0; + + if(algo_parts.size() != 2 && algo_parts.size() != 3) + return 0; + + std::string mode = algo_parts[1]; + u32bit bits = 0; + + if(mode.find("CFB") != std::string::npos || + mode.find("EAX") != std::string::npos) + { + std::vector algo_info = parse_algorithm_name(mode); + mode = algo_info[0]; + if(algo_info.size() == 1) + bits = 8*block_cipher->BLOCK_SIZE; + else if(algo_info.size() == 2) + bits = to_u32bit(algo_info[1]); + else + throw Invalid_Algorithm_Name(algo_spec); + } + + std::string padding; + if(algo_parts.size() == 3) + padding = algo_parts[2]; + else + padding = (mode == "CBC") ? "PKCS7" : "NoPadding"; + + if(mode == "ECB" && padding == "CTS") + return 0; + else if((mode != "CBC" && mode != "ECB") && padding != "NoPadding") + throw Invalid_Algorithm_Name(algo_spec); + +#if defined(BOTAN_HAS_OFB) + if(mode == "OFB") + return new OFB(block_cipher->clone()); +#endif + +#if defined(BOTAN_HAS_CTR) + if(mode == "CTR-BE") + return new CTR_BE(block_cipher->clone()); +#endif + +#if defined(BOTAN_HAS_ECB) + if(mode == "ECB") + { + if(direction == ENCRYPTION) + return new ECB_Encryption(block_cipher->clone(), get_bc_pad(padding)); + else + return new ECB_Decryption(block_cipher->clone(), get_bc_pad(padding)); + } +#endif + +#if defined(BOTAN_HAS_CFB) + if(mode == "CFB") + { + if(direction == ENCRYPTION) + return new CFB_Encryption(block_cipher->clone(), bits); + else + return new CFB_Decryption(block_cipher->clone(), bits); + } +#endif + + if(mode == "CBC") + { + if(padding == "CTS") + { +#if defined(BOTAN_HAS_CTS) + if(direction == ENCRYPTION) + return new CTS_Encryption(block_cipher->clone()); + else + return new CTS_Decryption(block_cipher->clone()); +#else + return 0; +#endif + } + +#if defined(BOTAN_HAS_CBC) + if(direction == ENCRYPTION) + return new CBC_Encryption(block_cipher->clone(), + get_bc_pad(padding)); + else + return new CBC_Decryption(block_cipher->clone(), + get_bc_pad(padding)); +#else + return 0; +#endif + } + +#if defined(BOTAN_HAS_EAX) + if(mode == "EAX") + { + if(direction == ENCRYPTION) + return new EAX_Encryption(block_cipher->clone(), bits); + else + return new EAX_Decryption(block_cipher->clone(), bits); + } +#endif + +#if defined(BOTAN_HAS_XTS) + if(mode == "XTS") + { + if(direction == ENCRYPTION) + return new XTS_Encryption(block_cipher->clone()); + else + return new XTS_Decryption(block_cipher->clone()); + } +#endif + + throw Algorithm_Not_Found("get_mode: " + cipher_name + "/" + + mode + "/" + padding); + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/def_engine/def_pk_ops.cpp b/src/libs/3rdparty/botan/src/engine/def_engine/def_pk_ops.cpp new file mode 100644 index 00000000000..31dce7a74bb --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/def_engine/def_pk_ops.cpp @@ -0,0 +1,121 @@ +/* +* PK Operations +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +#if defined(BOTAN_HAS_IF_PUBLIC_KEY_FAMILY) + #include +#endif + +#if defined(BOTAN_HAS_DSA) + #include +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + #include +#endif + +#if defined(BOTAN_HAS_ELGAMAL) + #include +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + #include +#endif + +#if defined(BOTAN_HAS_ECDSA) + #include +#endif + +#if defined(BOTAN_HAS_ECKAEG) + #include +#endif + +namespace Botan { + +#if defined(BOTAN_HAS_IF_PUBLIC_KEY_FAMILY) +/* +* Acquire an IF op +*/ +IF_Operation* Default_Engine::if_op(const BigInt& e, const BigInt& n, + const BigInt& d, const BigInt& p, + const BigInt& q, const BigInt& d1, + const BigInt& d2, const BigInt& c) const + { + return new Default_IF_Op(e, n, d, p, q, d1, d2, c); + } +#endif + +#if defined(BOTAN_HAS_DSA) +/* +* Acquire a DSA op +*/ +DSA_Operation* Default_Engine::dsa_op(const DL_Group& group, const BigInt& y, + const BigInt& x) const + { + return new Default_DSA_Op(group, y, x); + } +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) +/* +* Acquire a NR op +*/ +NR_Operation* Default_Engine::nr_op(const DL_Group& group, const BigInt& y, + const BigInt& x) const + { + return new Default_NR_Op(group, y, x); + } +#endif + +#if defined(BOTAN_HAS_ELGAMAL) +/* +* Acquire an ElGamal op +*/ +ELG_Operation* Default_Engine::elg_op(const DL_Group& group, const BigInt& y, + const BigInt& x) const + { + return new Default_ELG_Op(group, y, x); + } +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) +/* +* Acquire a DH op +*/ +DH_Operation* Default_Engine::dh_op(const DL_Group& group, + const BigInt& x) const + { + return new Default_DH_Op(group, x); + } +#endif + +#if defined(BOTAN_HAS_ECDSA) +/* +* Acquire a ECDSA op +*/ +ECDSA_Operation* Default_Engine::ecdsa_op(const EC_Domain_Params& dom_pars, + const BigInt& priv_key, + const PointGFp& pub_key) const + { + return new Default_ECDSA_Op(dom_pars, priv_key, pub_key); + } +#endif + +#if defined(BOTAN_HAS_ECKAEG) +/* +* Acquire a ECKAEG op +*/ +ECKAEG_Operation* Default_Engine::eckaeg_op(const EC_Domain_Params& dom_pars, + const BigInt& priv_key, + const PointGFp& pub_key) const + { + return new Default_ECKAEG_Op(dom_pars, priv_key, pub_key); + } +#endif + +} diff --git a/src/libs/3rdparty/botan/src/engine/def_engine/def_powm.cpp b/src/libs/3rdparty/botan/src/engine/def_engine/def_powm.cpp new file mode 100644 index 00000000000..9e7a88a1a8f --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/def_engine/def_powm.cpp @@ -0,0 +1,24 @@ +/* +* Modular Exponentiation +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Choose a modular exponentation algorithm +*/ +Modular_Exponentiator* +Default_Engine::mod_exp(const BigInt& n, Power_Mod::Usage_Hints hints) const + { + if(n.is_odd()) + return new Montgomery_Exponentiator(n, hints); + return new Fixed_Window_Exponentiator(n, hints); + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/def_engine/info.txt b/src/libs/3rdparty/botan/src/engine/def_engine/info.txt new file mode 100644 index 00000000000..fd31ee2d04e --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/def_engine/info.txt @@ -0,0 +1,24 @@ +realname "Default Engine" + +define DEFAULT_ENGINE + +load_on auto + + +def_eng.h +def_mode.cpp +def_pk_ops.cpp +def_powm.cpp +lookup_block.cpp +lookup_hash.cpp +lookup_mac.cpp +lookup_stream.cpp + + + +algo_factory +filters +libstate +mode_pad +numbertheory + diff --git a/src/libs/3rdparty/botan/src/engine/def_engine/lookup_block.cpp b/src/libs/3rdparty/botan/src/engine/def_engine/lookup_block.cpp new file mode 100644 index 00000000000..7ee5f5810f3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/def_engine/lookup_block.cpp @@ -0,0 +1,264 @@ +/* +* Block Cipher Lookup +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +#if defined(BOTAN_HAS_AES) + #include +#endif + +#if defined(BOTAN_HAS_BLOWFISH) + #include +#endif + +#if defined(BOTAN_HAS_CAST) + #include + #include +#endif + +#if defined(BOTAN_HAS_DES) + #include + #include +#endif + +#if defined(BOTAN_HAS_GOST_28147_89) + #include +#endif + +#if defined(BOTAN_HAS_IDEA) + #include +#endif + +#if defined(BOTAN_HAS_KASUMI) + #include +#endif + +#if defined(BOTAN_HAS_LION) + #include +#endif + +#if defined(BOTAN_HAS_LUBY_RACKOFF) + #include +#endif + +#if defined(BOTAN_HAS_MARS) + #include +#endif + +#if defined(BOTAN_HAS_MISTY1) + #include +#endif + +#if defined(BOTAN_HAS_NOEKEON) + #include +#endif + +#if defined(BOTAN_HAS_RC2) + #include +#endif + +#if defined(BOTAN_HAS_RC5) + #include +#endif + +#if defined(BOTAN_HAS_RC6) + #include +#endif + +#if defined(BOTAN_HAS_SAFER) + #include +#endif + +#if defined(BOTAN_HAS_SEED) + #include +#endif + +#if defined(BOTAN_HAS_SERPENT) + #include +#endif + +#if defined(BOTAN_HAS_SKIPJACK) + #include +#endif + +#if defined(BOTAN_HAS_SQUARE) + #include +#endif + +#if defined(BOTAN_HAS_TEA) + #include +#endif + +#if defined(BOTAN_HAS_TWOFISH) + #include +#endif + +#if defined(BOTAN_HAS_XTEA) + #include +#endif + +namespace Botan { + +/* +* Look for an algorithm with this name +*/ +BlockCipher* +Default_Engine::find_block_cipher(const SCAN_Name& request, + Algorithm_Factory& af) const + { + +#if defined(BOTAN_HAS_AES) + if(request.algo_name() == "AES") + return new AES; + if(request.algo_name() == "AES-128") + return new AES_128; + if(request.algo_name() == "AES-192") + return new AES_192; + if(request.algo_name() == "AES-256") + return new AES_256; +#endif + +#if defined(BOTAN_HAS_BLOWFISH) + if(request.algo_name() == "Blowfish") + return new Blowfish; +#endif + +#if defined(BOTAN_HAS_CAST) + if(request.algo_name() == "CAST-128") + return new CAST_128; + if(request.algo_name() == "CAST-256") + return new CAST_256; +#endif + +#if defined(BOTAN_HAS_DES) + if(request.algo_name() == "DES") + return new DES; + if(request.algo_name() == "DESX") + return new DESX; + if(request.algo_name() == "TripleDES") + return new TripleDES; +#endif + +#if defined(BOTAN_HAS_GOST_28147_89) + if(request.algo_name() == "GOST-28147-89") + return new GOST_28147_89(request.arg(0, "R3411_94_TestParam")); +#endif + +#if defined(BOTAN_HAS_IDEA) + if(request.algo_name() == "IDEA") + return new IDEA; +#endif + +#if defined(BOTAN_HAS_KASUMI) + if(request.algo_name() == "KASUMI") + return new KASUMI; +#endif + +#if defined(BOTAN_HAS_MARS) + if(request.algo_name() == "MARS") + return new MARS; +#endif + +#if defined(BOTAN_HAS_MISTY1) + if(request.algo_name() == "MISTY1") + return new MISTY1(request.arg_as_u32bit(0, 8)); +#endif + +#if defined(BOTAN_HAS_NOEKEON) + if(request.algo_name() == "Noekeon") + return new Noekeon; +#endif + +#if defined(BOTAN_HAS_RC2) + if(request.algo_name() == "RC2") + return new RC2; +#endif + +#if defined(BOTAN_HAS_RC5) + if(request.algo_name() == "RC5") + return new RC5(request.arg_as_u32bit(0, 12)); +#endif + +#if defined(BOTAN_HAS_RC6) + if(request.algo_name() == "RC6") + return new RC6; +#endif + +#if defined(BOTAN_HAS_SAFER) + if(request.algo_name() == "SAFER-SK") + return new SAFER_SK(request.arg_as_u32bit(0, 10)); +#endif + +#if defined(BOTAN_HAS_SEED) + if(request.algo_name() == "SEED") + return new SEED; +#endif + +#if defined(BOTAN_HAS_SERPENT) + if(request.algo_name() == "Serpent") + return new Serpent; +#endif + +#if defined(BOTAN_HAS_SKIPJACK) + if(request.algo_name() == "Skipjack") + return new Skipjack; +#endif + +#if defined(BOTAN_HAS_SQUARE) + if(request.algo_name() == "Square") + return new Square; +#endif + +#if defined(BOTAN_HAS_TEA) + if(request.algo_name() == "TEA") + return new TEA; +#endif + +#if defined(BOTAN_HAS_TWOFISH) + if(request.algo_name() == "Twofish") + return new Twofish; +#endif + +#if defined(BOTAN_HAS_XTEA) + if(request.algo_name() == "XTEA") + return new XTEA; +#endif + +#if defined(BOTAN_HAS_LUBY_RACKOFF) + if(request.algo_name() == "Luby-Rackoff" && request.arg_count() == 1) + { + const HashFunction* hash = af.prototype_hash_function(request.arg(0)); + + if(hash) + return new LubyRackoff(hash->clone()); + } +#endif + +#if defined(BOTAN_HAS_LION) + if(request.algo_name() == "Lion" && request.arg_count_between(2, 3)) + { + const u32bit block_size = request.arg_as_u32bit(2, 1024); + + const HashFunction* hash = + af.prototype_hash_function(request.arg(0)); + + const StreamCipher* stream_cipher = + af.prototype_stream_cipher(request.arg(1)); + + if(!hash || !stream_cipher) + return 0; + + return new Lion(hash->clone(), stream_cipher->clone(), block_size); + } +#endif + + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/def_engine/lookup_hash.cpp b/src/libs/3rdparty/botan/src/engine/def_engine/lookup_hash.cpp new file mode 100644 index 00000000000..58136fc5a4b --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/def_engine/lookup_hash.cpp @@ -0,0 +1,209 @@ +/* +* Hash Algorithms Lookup +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +#if defined(BOTAN_HAS_ADLER32) + #include +#endif + +#if defined(BOTAN_HAS_CRC24) + #include +#endif + +#if defined(BOTAN_HAS_CRC32) + #include +#endif + +#if defined(BOTAN_HAS_FORK_256) + #include +#endif + +#if defined(BOTAN_HAS_GOST_34_11) + #include +#endif + +#if defined(BOTAN_HAS_HAS_160) + #include +#endif + +#if defined(BOTAN_HAS_MD2) + #include +#endif + +#if defined(BOTAN_HAS_MD4) + #include +#endif + +#if defined(BOTAN_HAS_MD5) + #include +#endif + +#if defined(BOTAN_HAS_RIPEMD_128) + #include +#endif + +#if defined(BOTAN_HAS_RIPEMD_160) + #include +#endif + +#if defined(BOTAN_HAS_SHA1) + #include +#endif + +#if defined(BOTAN_HAS_SHA2) + #include + #include +#endif + +#if defined(BOTAN_HAS_SKEIN_512) + #include +#endif + +#if defined(BOTAN_HAS_TIGER) + #include +#endif + +#if defined(BOTAN_HAS_WHIRLPOOL) + #include +#endif + +#if defined(BOTAN_HAS_PARALLEL_HASH) + #include +#endif + +namespace Botan { + +/* +* Look for an algorithm with this name +*/ +HashFunction* +Default_Engine::find_hash(const SCAN_Name& request, + Algorithm_Factory& af) const + { +#if defined(BOTAN_HAS_ADLER32) + if(request.algo_name() == "Adler32") + return new Adler32; +#endif + +#if defined(BOTAN_HAS_CRC24) + if(request.algo_name() == "CRC24") + return new CRC24; +#endif + +#if defined(BOTAN_HAS_CRC32) + if(request.algo_name() == "CRC32") + return new CRC32; +#endif + +#if defined(BOTAN_HAS_FORK_256) + if(request.algo_name() == "FORK-256") + return new FORK_256; +#endif + +#if defined(BOTAN_HAS_GOST_34_11) + if(request.algo_name() == "GOST-34.11") + return new GOST_34_11; +#endif + +#if defined(BOTAN_HAS_HAS_160) + if(request.algo_name() == "HAS-160") + return new HAS_160; +#endif + +#if defined(BOTAN_HAS_MD2) + if(request.algo_name() == "MD2") + return new MD2; +#endif + +#if defined(BOTAN_HAS_MD4) + if(request.algo_name() == "MD4") + return new MD4; +#endif + +#if defined(BOTAN_HAS_MD5) + if(request.algo_name() == "MD5") + return new MD5; +#endif + +#if defined(BOTAN_HAS_RIPEMD_128) + if(request.algo_name() == "RIPEMD-128") + return new RIPEMD_128; +#endif + +#if defined(BOTAN_HAS_RIPEMD_160) + if(request.algo_name() == "RIPEMD-160") + return new RIPEMD_160; +#endif + +#if defined(BOTAN_HAS_SHA1) + if(request.algo_name() == "SHA-160") + return new SHA_160; +#endif + +#if defined(BOTAN_HAS_SHA2) + if(request.algo_name() == "SHA-224") + return new SHA_224; + if(request.algo_name() == "SHA-256") + return new SHA_256; + if(request.algo_name() == "SHA-384") + return new SHA_384; + if(request.algo_name() == "SHA-512") + return new SHA_512; +#endif + +#if defined(BOTAN_HAS_TIGER) + if(request.algo_name() == "Tiger") + return new Tiger(request.arg_as_u32bit(0, 24), // hash output + request.arg_as_u32bit(1, 3)); // # passes +#endif + +#if defined(BOTAN_HAS_SKEIN_512) + if(request.algo_name() == "Skein-512") + return new Skein_512(request.arg_as_u32bit(0, 512), + request.arg(1, "")); +#endif + +#if defined(BOTAN_HAS_WHIRLPOOL) + if(request.algo_name() == "Whirlpool") + return new Whirlpool; +#endif + +#if defined(BOTAN_HAS_PARALLEL_HASH) + + if(request.algo_name() == "Parallel") + { + std::vector hash_prototypes; + + /* First pass, just get the prototypes (no memory allocation). Then + if all were found, replace each prototype with a newly created clone + */ + for(size_t i = 0; i != request.arg_count(); ++i) + { + const HashFunction* hash = af.prototype_hash_function(request.arg(i)); + if(!hash) + return 0; + + hash_prototypes.push_back(hash); + } + + std::vector hashes; + for(size_t i = 0; i != hash_prototypes.size(); ++i) + hashes.push_back(hash_prototypes[i]->clone()); + + return new Parallel(hashes); + } + +#endif + + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/def_engine/lookup_mac.cpp b/src/libs/3rdparty/botan/src/engine/def_engine/lookup_mac.cpp new file mode 100644 index 00000000000..3fef12b59f7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/def_engine/lookup_mac.cpp @@ -0,0 +1,70 @@ +/* +* MAC Lookup +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +#if defined(BOTAN_HAS_CBC_MAC) + #include +#endif + +#if defined(BOTAN_HAS_CMAC) + #include +#endif + +#if defined(BOTAN_HAS_HMAC) + #include +#endif + +#if defined(BOTAN_HAS_SSL3_MAC) + #include +#endif + +#if defined(BOTAN_HAS_ANSI_X919_MAC) + #include +#endif + +namespace Botan { + +/* +* Look for an algorithm with this name +*/ +MessageAuthenticationCode* +Default_Engine::find_mac(const SCAN_Name& request, + Algorithm_Factory& af) const + { + +#if defined(BOTAN_HAS_CBC_MAC) + if(request.algo_name() == "CBC-MAC" && request.arg_count() == 1) + return new CBC_MAC(af.make_block_cipher(request.arg(0))); +#endif + +#if defined(BOTAN_HAS_CMAC) + if(request.algo_name() == "CMAC" && request.arg_count() == 1) + return new CMAC(af.make_block_cipher(request.arg(0))); +#endif + +#if defined(BOTAN_HAS_HMAC) + if(request.algo_name() == "HMAC" && request.arg_count() == 1) + return new HMAC(af.make_hash_function(request.arg(0))); +#endif + +#if defined(BOTAN_HAS_SSL3_MAC) + if(request.algo_name() == "SSL3-MAC" && request.arg_count() == 1) + return new SSL3_MAC(af.make_hash_function(request.arg(0))); +#endif + +#if defined(BOTAN_HAS_ANSI_X919_MAC) + if(request.algo_name() == "X9.19-MAC" && request.arg_count() == 0) + return new ANSI_X919_MAC(af.make_block_cipher("DES")); +#endif + + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/def_engine/lookup_stream.cpp b/src/libs/3rdparty/botan/src/engine/def_engine/lookup_stream.cpp new file mode 100644 index 00000000000..e2f1b32b8fd --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/def_engine/lookup_stream.cpp @@ -0,0 +1,61 @@ +/* +* Stream Cipher Lookup +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +#if defined(BOTAN_HAS_ARC4) + #include +#endif + +#if defined(BOTAN_HAS_SALSA20) + #include +#endif + +#if defined(BOTAN_HAS_TURING) + #include +#endif + +#if defined(BOTAN_HAS_WID_WAKE) + #include +#endif + +namespace Botan { + +/* +* Look for an algorithm with this name +*/ +StreamCipher* +Default_Engine::find_stream_cipher(const SCAN_Name& request, + Algorithm_Factory&) const + { +#if defined(BOTAN_HAS_ARC4) + if(request.algo_name() == "ARC4") + return new ARC4(request.arg_as_u32bit(0, 0)); + if(request.algo_name() == "RC4_drop") + return new ARC4(768); +#endif + +#if defined(BOTAN_HAS_SALSA20) + if(request.algo_name() == "Salsa20") + return new Salsa20; +#endif + +#if defined(BOTAN_HAS_TURING) + if(request.algo_name() == "Turing") + return new Turing; +#endif + +#if defined(BOTAN_HAS_WID_WAKE) + if(request.algo_name() == "WiderWake4+1-BE") + return new WiderWake_41_BE; +#endif + + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/engine.h b/src/libs/3rdparty/botan/src/engine/engine.h new file mode 100644 index 00000000000..66a159e38c8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/engine.h @@ -0,0 +1,140 @@ +/* +* Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENGINE_H__ +#define BOTAN_ENGINE_H__ + +#include + +#include +#include +#include +#include +#include + +#include +#include + +#if defined(BOTAN_HAS_IF_PUBLIC_KEY_FAMILY) + #include +#endif + +#if defined(BOTAN_HAS_DSA) + #include +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + #include +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + #include +#endif + +#if defined(BOTAN_HAS_ELGAMAL) + #include +#endif + +#if defined(BOTAN_HAS_ECDSA) + #include + #include +#endif + +#if defined(BOTAN_HAS_ECKAEG) + #include + #include +#endif + +namespace Botan { + +class Algorithm_Factory; +class Keyed_Filter; + +/* +* Engine Base Class +*/ +class BOTAN_DLL Engine + { + public: + virtual ~Engine() {} + + virtual std::string provider_name() const = 0; + + // Lookup functions + virtual BlockCipher* + find_block_cipher(const SCAN_Name&, Algorithm_Factory&) const + { return 0; } + + virtual StreamCipher* + find_stream_cipher(const SCAN_Name&, Algorithm_Factory&) const + { return 0; } + + virtual HashFunction* + find_hash(const SCAN_Name&, Algorithm_Factory&) const + { return 0; } + + virtual MessageAuthenticationCode* + find_mac(const SCAN_Name&, Algorithm_Factory&) const + { return 0; } + + virtual Modular_Exponentiator* + mod_exp(const BigInt&, Power_Mod::Usage_Hints) const + { return 0; } + + virtual Keyed_Filter* get_cipher(const std::string&, + Cipher_Dir, + Algorithm_Factory&) + { return 0; } + +#if defined(BOTAN_HAS_IF_PUBLIC_KEY_FAMILY) + virtual IF_Operation* if_op(const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&) const + { return 0; } +#endif + +#if defined(BOTAN_HAS_DSA) + virtual DSA_Operation* dsa_op(const DL_Group&, const BigInt&, + const BigInt&) const + { return 0; } +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + virtual NR_Operation* nr_op(const DL_Group&, const BigInt&, + const BigInt&) const + { return 0; } +#endif + +#if defined(BOTAN_HAS_ELGAMAL) + virtual ELG_Operation* elg_op(const DL_Group&, const BigInt&, + const BigInt&) const + { return 0; } +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + virtual DH_Operation* dh_op(const DL_Group&, const BigInt&) const + { return 0; } +#endif + +#if defined(BOTAN_HAS_ECDSA) + virtual ECDSA_Operation* ecdsa_op(const EC_Domain_Params&, + const BigInt&, + const PointGFp&) const + { return 0; } +#endif + +#if defined(BOTAN_HAS_ECKAEG) + virtual ECKAEG_Operation* eckaeg_op(const EC_Domain_Params&, + const BigInt&, + const PointGFp&) const + { return 0; } +#endif + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/engine/gnump/eng_gmp.h b/src/libs/3rdparty/botan/src/engine/gnump/eng_gmp.h new file mode 100644 index 00000000000..6a52b7e5135 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/gnump/eng_gmp.h @@ -0,0 +1,57 @@ +/* +* GMP Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENGINE_GMP_H__ +#define BOTAN_ENGINE_GMP_H__ + +#include + +namespace Botan { + +/* +* GMP Engine +*/ +class BOTAN_DLL GMP_Engine : public Engine + { + public: + std::string provider_name() const { return "gmp"; } + +#if defined(BOTAN_HAS_IF_PUBLIC_KEY_FAMILY) + IF_Operation* if_op(const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_DSA) + DSA_Operation* dsa_op(const DL_Group&, const BigInt&, + const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + NR_Operation* nr_op(const DL_Group&, const BigInt&, const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_ELGAMAL) + ELG_Operation* elg_op(const DL_Group&, const BigInt&, + const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + DH_Operation* dh_op(const DL_Group&, const BigInt&) const; +#endif + + Modular_Exponentiator* mod_exp(const BigInt&, + Power_Mod::Usage_Hints) const; + + GMP_Engine(); + private: + static void set_memory_hooks(); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/engine/gnump/gmp_dh.cpp b/src/libs/3rdparty/botan/src/engine/gnump/gmp_dh.cpp new file mode 100644 index 00000000000..b332402686e --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/gnump/gmp_dh.cpp @@ -0,0 +1,53 @@ +/* +* GMP Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) +namespace { + +/* +* GMP DH Operation +*/ +class GMP_DH_Op : public DH_Operation + { + public: + BigInt agree(const BigInt& i) const; + DH_Operation* clone() const { return new GMP_DH_Op(*this); } + + GMP_DH_Op(const DL_Group& group, const BigInt& x_bn) : + x(x_bn), p(group.get_p()) {} + private: + GMP_MPZ x, p; + }; + +/* +* GMP DH Key Agreement Operation +*/ +BigInt GMP_DH_Op::agree(const BigInt& i_bn) const + { + GMP_MPZ i(i_bn); + mpz_powm(i.value, i.value, x.value, p.value); + return i.to_bigint(); + } + +} + +/* +* Acquire a DH op +*/ +DH_Operation* GMP_Engine::dh_op(const DL_Group& group, const BigInt& x) const + { + return new GMP_DH_Op(group, x); + } +#endif + +} diff --git a/src/libs/3rdparty/botan/src/engine/gnump/gmp_dsa.cpp b/src/libs/3rdparty/botan/src/engine/gnump/gmp_dsa.cpp new file mode 100644 index 00000000000..69a9c3e9cbb --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/gnump/gmp_dsa.cpp @@ -0,0 +1,124 @@ +/* +* GMP DSA Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +#if defined(BOTAN_HAS_DSA) + +namespace { + +/* +* GMP DSA Operation +*/ +class GMP_DSA_Op : public DSA_Operation + { + public: + bool verify(const byte[], u32bit, const byte[], u32bit) const; + SecureVector sign(const byte[], u32bit, const BigInt&) const; + + DSA_Operation* clone() const { return new GMP_DSA_Op(*this); } + + GMP_DSA_Op(const DL_Group& group, const BigInt& y1, const BigInt& x1) : + x(x1), y(y1), p(group.get_p()), q(group.get_q()), g(group.get_g()) {} + private: + const GMP_MPZ x, y, p, q, g; + }; + +/* +* GMP DSA Verify Operation +*/ +bool GMP_DSA_Op::verify(const byte msg[], u32bit msg_len, + const byte sig[], u32bit sig_len) const + { + const u32bit q_bytes = q.bytes(); + + if(sig_len != 2*q_bytes || msg_len > q_bytes) + return false; + + GMP_MPZ r(sig, q_bytes); + GMP_MPZ s(sig + q_bytes, q_bytes); + GMP_MPZ i(msg, msg_len); + + if(mpz_cmp_ui(r.value, 0) <= 0 || mpz_cmp(r.value, q.value) >= 0) + return false; + if(mpz_cmp_ui(s.value, 0) <= 0 || mpz_cmp(s.value, q.value) >= 0) + return false; + + if(mpz_invert(s.value, s.value, q.value) == 0) + return false; + + GMP_MPZ si; + mpz_mul(si.value, s.value, i.value); + mpz_mod(si.value, si.value, q.value); + mpz_powm(si.value, g.value, si.value, p.value); + + GMP_MPZ sr; + mpz_mul(sr.value, s.value, r.value); + mpz_mod(sr.value, sr.value, q.value); + mpz_powm(sr.value, y.value, sr.value, p.value); + + mpz_mul(si.value, si.value, sr.value); + mpz_mod(si.value, si.value, p.value); + mpz_mod(si.value, si.value, q.value); + + if(mpz_cmp(si.value, r.value) == 0) + return true; + return false; + } + +/* +* GMP DSA Sign Operation +*/ +SecureVector GMP_DSA_Op::sign(const byte in[], u32bit length, + const BigInt& k_bn) const + { + if(mpz_cmp_ui(x.value, 0) == 0) + throw Internal_Error("GMP_DSA_Op::sign: No private key"); + + GMP_MPZ i(in, length); + GMP_MPZ k(k_bn); + + GMP_MPZ r; + mpz_powm(r.value, g.value, k.value, p.value); + mpz_mod(r.value, r.value, q.value); + + mpz_invert(k.value, k.value, q.value); + + GMP_MPZ s; + mpz_mul(s.value, x.value, r.value); + mpz_add(s.value, s.value, i.value); + mpz_mul(s.value, s.value, k.value); + mpz_mod(s.value, s.value, q.value); + + if(mpz_cmp_ui(r.value, 0) == 0 || mpz_cmp_ui(s.value, 0) == 0) + throw Internal_Error("GMP_DSA_Op::sign: r or s was zero"); + + const u32bit q_bytes = q.bytes(); + + SecureVector output(2*q_bytes); + r.encode(output, q_bytes); + s.encode(output + q_bytes, q_bytes); + return output; + } + +} + +/* +* Acquire a DSA op +*/ +DSA_Operation* GMP_Engine::dsa_op(const DL_Group& group, const BigInt& y, + const BigInt& x) const + { + return new GMP_DSA_Op(group, y, x); + } +#endif + +} diff --git a/src/libs/3rdparty/botan/src/engine/gnump/gmp_elg.cpp b/src/libs/3rdparty/botan/src/engine/gnump/gmp_elg.cpp new file mode 100644 index 00000000000..ee109f1d645 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/gnump/gmp_elg.cpp @@ -0,0 +1,92 @@ +/* +* GMP ElGamal Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +#if defined(BOTAN_HAS_ELGAMAL) + +namespace { + +/* +* GMP ElGamal Operation +*/ +class GMP_ELG_Op : public ELG_Operation + { + public: + SecureVector encrypt(const byte[], u32bit, const BigInt&) const; + BigInt decrypt(const BigInt&, const BigInt&) const; + + ELG_Operation* clone() const { return new GMP_ELG_Op(*this); } + + GMP_ELG_Op(const DL_Group& group, const BigInt& y1, const BigInt& x1) : + x(x1), y(y1), g(group.get_g()), p(group.get_p()) {} + private: + GMP_MPZ x, y, g, p; + }; + +/* +* GMP ElGamal Encrypt Operation +*/ +SecureVector GMP_ELG_Op::encrypt(const byte in[], u32bit length, + const BigInt& k_bn) const + { + GMP_MPZ i(in, length); + + if(mpz_cmp(i.value, p.value) >= 0) + throw Invalid_Argument("GMP_ELG_Op: Input is too large"); + + GMP_MPZ a, b, k(k_bn); + + mpz_powm(a.value, g.value, k.value, p.value); + mpz_powm(b.value, y.value, k.value, p.value); + mpz_mul(b.value, b.value, i.value); + mpz_mod(b.value, b.value, p.value); + + const u32bit p_bytes = p.bytes(); + SecureVector output(2*p_bytes); + a.encode(output, p_bytes); + b.encode(output + p_bytes, p_bytes); + return output; + } + +/* +* GMP ElGamal Decrypt Operation +*/ +BigInt GMP_ELG_Op::decrypt(const BigInt& a_bn, const BigInt& b_bn) const + { + if(mpz_cmp_ui(x.value, 0) == 0) + throw Internal_Error("GMP_ELG_Op::decrypt: No private key"); + + GMP_MPZ a(a_bn), b(b_bn); + + if(mpz_cmp(a.value, p.value) >= 0 || mpz_cmp(b.value, p.value) >= 0) + throw Invalid_Argument("GMP_ELG_Op: Invalid message"); + + mpz_powm(a.value, a.value, x.value, p.value); + mpz_invert(a.value, a.value, p.value); + mpz_mul(a.value, a.value, b.value); + mpz_mod(a.value, a.value, p.value); + return a.to_bigint(); + } + +} + +/* +* Acquire an ElGamal op +*/ +ELG_Operation* GMP_Engine::elg_op(const DL_Group& group, const BigInt& y, + const BigInt& x) const + { + return new GMP_ELG_Op(group, y, x); + } +#endif + +} diff --git a/src/libs/3rdparty/botan/src/engine/gnump/gmp_if.cpp b/src/libs/3rdparty/botan/src/engine/gnump/gmp_if.cpp new file mode 100644 index 00000000000..b96f2ddaca3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/gnump/gmp_if.cpp @@ -0,0 +1,81 @@ +/* +* GMP IF Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +#if defined(BOTAN_HAS_IF_PUBLIC_KEY_FAMILY) + +namespace { + +/* +* GMP IF Operation +*/ +class GMP_IF_Op : public IF_Operation + { + public: + BigInt public_op(const BigInt&) const; + BigInt private_op(const BigInt&) const; + + IF_Operation* clone() const { return new GMP_IF_Op(*this); } + + GMP_IF_Op(const BigInt& e_bn, const BigInt& n_bn, const BigInt&, + const BigInt& p_bn, const BigInt& q_bn, const BigInt& d1_bn, + const BigInt& d2_bn, const BigInt& c_bn) : + e(e_bn), n(n_bn), p(p_bn), q(q_bn), d1(d1_bn), d2(d2_bn), c(c_bn) {} + private: + const GMP_MPZ e, n, p, q, d1, d2, c; + }; + +/* +* GMP IF Public Operation +*/ +BigInt GMP_IF_Op::public_op(const BigInt& i_bn) const + { + GMP_MPZ i(i_bn); + mpz_powm(i.value, i.value, e.value, n.value); + return i.to_bigint(); + } + +/* +* GMP IF Private Operation +*/ +BigInt GMP_IF_Op::private_op(const BigInt& i_bn) const + { + if(mpz_cmp_ui(p.value, 0) == 0) + throw Internal_Error("GMP_IF_Op::private_op: No private key"); + + GMP_MPZ j1, j2, h(i_bn); + + mpz_powm(j1.value, h.value, d1.value, p.value); + mpz_powm(j2.value, h.value, d2.value, q.value); + mpz_sub(h.value, j1.value, j2.value); + mpz_mul(h.value, h.value, c.value); + mpz_mod(h.value, h.value, p.value); + mpz_mul(h.value, h.value, q.value); + mpz_add(h.value, h.value, j2.value); + return h.to_bigint(); + } + +} + +/* +* Acquire an IF op +*/ +IF_Operation* GMP_Engine::if_op(const BigInt& e, const BigInt& n, + const BigInt& d, const BigInt& p, + const BigInt& q, const BigInt& d1, + const BigInt& d2, const BigInt& c) const + { + return new GMP_IF_Op(e, n, d, p, q, d1, d2, c); + } +#endif + +} diff --git a/src/libs/3rdparty/botan/src/engine/gnump/gmp_mem.cpp b/src/libs/3rdparty/botan/src/engine/gnump/gmp_mem.cpp new file mode 100644 index 00000000000..89a1ed2d47a --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/gnump/gmp_mem.cpp @@ -0,0 +1,70 @@ +/* +* GNU MP Memory Handlers +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Allocator used by GNU MP +*/ +Allocator* gmp_alloc = 0; + +/* +* Allocation Function for GNU MP +*/ +void* gmp_malloc(size_t n) + { + return gmp_alloc->allocate(n); + } + +/* +* Reallocation Function for GNU MP +*/ +void* gmp_realloc(void* ptr, size_t old_n, size_t new_n) + { + void* new_buf = gmp_alloc->allocate(new_n); + std::memcpy(new_buf, ptr, std::min(old_n, new_n)); + gmp_alloc->deallocate(ptr, old_n); + return new_buf; + } + +/* +* Deallocation Function for GNU MP +*/ +void gmp_free(void* ptr, size_t n) + { + gmp_alloc->deallocate(ptr, n); + } + +} + +/* +* Set the GNU MP memory functions +*/ +void GMP_Engine::set_memory_hooks() + { + if(gmp_alloc == 0) + { + gmp_alloc = Allocator::get(true); + mp_set_memory_functions(gmp_malloc, gmp_realloc, gmp_free); + } + } + +/* +* GMP_Engine Constructor +*/ +GMP_Engine::GMP_Engine() + { + set_memory_hooks(); + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/gnump/gmp_nr.cpp b/src/libs/3rdparty/botan/src/engine/gnump/gmp_nr.cpp new file mode 100644 index 00000000000..4aeb09fe2aa --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/gnump/gmp_nr.cpp @@ -0,0 +1,107 @@ +/* +* GMP NR Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + +namespace { + +/* +* GMP NR Operation +*/ +class GMP_NR_Op : public NR_Operation + { + public: + SecureVector verify(const byte[], u32bit) const; + SecureVector sign(const byte[], u32bit, const BigInt&) const; + + NR_Operation* clone() const { return new GMP_NR_Op(*this); } + + GMP_NR_Op(const DL_Group& group, const BigInt& y1, const BigInt& x1) : + x(x1), y(y1), p(group.get_p()), q(group.get_q()), g(group.get_g()) {} + private: + const GMP_MPZ x, y, p, q, g; + }; + +/* +* GMP NR Verify Operation +*/ +SecureVector GMP_NR_Op::verify(const byte sig[], u32bit sig_len) const + { + const u32bit q_bytes = q.bytes(); + + if(sig_len != 2*q_bytes) + return false; + + GMP_MPZ c(sig, q_bytes); + GMP_MPZ d(sig + q_bytes, q_bytes); + + if(mpz_cmp_ui(c.value, 0) <= 0 || mpz_cmp(c.value, q.value) >= 0 || + mpz_cmp(d.value, q.value) >= 0) + throw Invalid_Argument("GMP_NR_Op::verify: Invalid signature"); + + GMP_MPZ i1, i2; + mpz_powm(i1.value, g.value, d.value, p.value); + mpz_powm(i2.value, y.value, c.value, p.value); + mpz_mul(i1.value, i1.value, i2.value); + mpz_mod(i1.value, i1.value, p.value); + mpz_sub(i1.value, c.value, i1.value); + mpz_mod(i1.value, i1.value, q.value); + return BigInt::encode(i1.to_bigint()); + } + +/* +* GMP NR Sign Operation +*/ +SecureVector GMP_NR_Op::sign(const byte in[], u32bit length, + const BigInt& k_bn) const + { + if(mpz_cmp_ui(x.value, 0) == 0) + throw Internal_Error("GMP_NR_Op::sign: No private key"); + + GMP_MPZ f(in, length); + GMP_MPZ k(k_bn); + + if(mpz_cmp(f.value, q.value) >= 0) + throw Invalid_Argument("GMP_NR_Op::sign: Input is out of range"); + + GMP_MPZ c, d; + mpz_powm(c.value, g.value, k.value, p.value); + mpz_add(c.value, c.value, f.value); + mpz_mod(c.value, c.value, q.value); + mpz_mul(d.value, x.value, c.value); + mpz_sub(d.value, k.value, d.value); + mpz_mod(d.value, d.value, q.value); + + if(mpz_cmp_ui(c.value, 0) == 0) + throw Internal_Error("Default_NR_Op::sign: c was zero"); + + const u32bit q_bytes = q.bytes(); + SecureVector output(2*q_bytes); + c.encode(output, q_bytes); + d.encode(output + q_bytes, q_bytes); + return output; + } + +} + +/* +* Acquire a NR op +*/ +NR_Operation* GMP_Engine::nr_op(const DL_Group& group, const BigInt& y, + const BigInt& x) const + { + return new GMP_NR_Op(group, y, x); + } +#endif + +} diff --git a/src/libs/3rdparty/botan/src/engine/gnump/gmp_powm.cpp b/src/libs/3rdparty/botan/src/engine/gnump/gmp_powm.cpp new file mode 100644 index 00000000000..687aed88a3e --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/gnump/gmp_powm.cpp @@ -0,0 +1,53 @@ +/* +* GMP Modular Exponentiation +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace { + +/* +* GMP Modular Exponentiator +*/ +class GMP_Modular_Exponentiator : public Modular_Exponentiator + { + public: + void set_base(const BigInt& b) { base = b; } + void set_exponent(const BigInt& e) { exp = e; } + BigInt execute() const; + Modular_Exponentiator* copy() const + { return new GMP_Modular_Exponentiator(*this); } + + GMP_Modular_Exponentiator(const BigInt& n) : mod(n) {} + private: + GMP_MPZ base, exp, mod; + }; + +/* +* Compute the result +*/ +BigInt GMP_Modular_Exponentiator::execute() const + { + GMP_MPZ r; + mpz_powm(r.value, base.value, exp.value, mod.value); + return r.to_bigint(); + } + +} + +/* +* Return the GMP-based modular exponentiator +*/ +Modular_Exponentiator* GMP_Engine::mod_exp(const BigInt& n, + Power_Mod::Usage_Hints) const + { + return new GMP_Modular_Exponentiator(n); + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/gnump/gmp_wrap.cpp b/src/libs/3rdparty/botan/src/engine/gnump/gmp_wrap.cpp new file mode 100644 index 00000000000..735fc70701f --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/gnump/gmp_wrap.cpp @@ -0,0 +1,98 @@ +/* +* GMP Wrapper +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +#define GNU_MP_VERSION_CODE_FOR(a,b,c) ((a << 16) | (b << 8) | (c)) + +#define GNU_MP_VERSION_CODE \ + GNU_MP_VERSION_CODE_FOR(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, \ + __GNU_MP_VERSION_PATCHLEVEL) + +#if GNU_MP_VERSION_CODE < GNU_MP_VERSION_CODE_FOR(4,1,0) + #error Your GNU MP install is too old, upgrade to 4.1 or later +#endif + +namespace Botan { + +/* +* GMP_MPZ Constructor +*/ +GMP_MPZ::GMP_MPZ(const BigInt& in) + { + mpz_init(value); + if(in != 0) + mpz_import(value, in.sig_words(), -1, sizeof(word), 0, 0, in.data()); + } + +/* +* GMP_MPZ Constructor +*/ +GMP_MPZ::GMP_MPZ(const byte in[], u32bit length) + { + mpz_init(value); + mpz_import(value, length, 1, 1, 0, 0, in); + } + +/* +* GMP_MPZ Copy Constructor +*/ +GMP_MPZ::GMP_MPZ(const GMP_MPZ& other) + { + mpz_init_set(value, other.value); + } + +/* +* GMP_MPZ Destructor +*/ +GMP_MPZ::~GMP_MPZ() + { + mpz_clear(value); + } + +/* +* GMP_MPZ Assignment Operator +*/ +GMP_MPZ& GMP_MPZ::operator=(const GMP_MPZ& other) + { + mpz_set(value, other.value); + return (*this); + } + +/* +* Export the mpz_t as a bytestring +*/ +void GMP_MPZ::encode(byte out[], u32bit length) const + { + size_t dummy = 0; + mpz_export(out + (length - bytes()), &dummy, 1, 1, 0, 0, value); + } + +/* +* Return the number of significant bytes +*/ +u32bit GMP_MPZ::bytes() const + { + return ((mpz_sizeinbase(value, 2) + 7) / 8); + } + +/* +* GMP to BigInt Conversions +*/ +BigInt GMP_MPZ::to_bigint() const + { + BigInt out(BigInt::Positive, (bytes() + sizeof(word) - 1) / sizeof(word)); + size_t dummy = 0; + mpz_export(out.get_reg(), &dummy, -1, sizeof(word), 0, 0, value); + + if(mpz_sgn(value) < 0) + out.flip_sign(); + + return out; + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/gnump/gmp_wrap.h b/src/libs/3rdparty/botan/src/engine/gnump/gmp_wrap.h new file mode 100644 index 00000000000..11a51c87dcf --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/gnump/gmp_wrap.h @@ -0,0 +1,38 @@ +/* +* GMP MPZ Wrapper +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_GMP_MPZ_WRAP_H__ +#define BOTAN_GMP_MPZ_WRAP_H__ + +#include +#include + +namespace Botan { + +/* +* Lightweight GMP mpz_t Wrapper +*/ +class BOTAN_DLL GMP_MPZ + { + public: + mpz_t value; + + BigInt to_bigint() const; + void encode(byte[], u32bit) const; + u32bit bytes() const; + + GMP_MPZ& operator=(const GMP_MPZ&); + + GMP_MPZ(const GMP_MPZ&); + GMP_MPZ(const BigInt& = 0); + GMP_MPZ(const byte[], u32bit); + ~GMP_MPZ(); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/engine/gnump/info.txt b/src/libs/3rdparty/botan/src/engine/gnump/info.txt new file mode 100644 index 00000000000..67a9bcd7082 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/gnump/info.txt @@ -0,0 +1,26 @@ +realname "GMP Engine" + +define ENGINE_GNU_MP + +load_on request + + +all -> gmp + + + +eng_gmp.h +gmp_dh.cpp +gmp_dsa.cpp +gmp_elg.cpp +gmp_if.cpp +gmp_mem.cpp +gmp_nr.cpp +gmp_powm.cpp +gmp_wrap.cpp +gmp_wrap.h + + + +bigint + diff --git a/src/libs/3rdparty/botan/src/engine/ia32_eng/eng_ia32.cpp b/src/libs/3rdparty/botan/src/engine/ia32_eng/eng_ia32.cpp new file mode 100644 index 00000000000..6ff2a4be45a --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/ia32_eng/eng_ia32.cpp @@ -0,0 +1,62 @@ +/* +* Assembly Implementation Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +#if defined(BOTAN_HAS_SERPENT_IA32) + #include +#endif + +#if defined(BOTAN_HAS_MD4_IA32) + #include +#endif + +#if defined(BOTAN_HAS_MD5_IA32) + #include +#endif + +#if defined(BOTAN_HAS_SHA1_IA32) + #include +#endif + +namespace Botan { + +BlockCipher* +IA32_Assembler_Engine::find_block_cipher(const SCAN_Name& request, + Algorithm_Factory&) const + { +#if defined(BOTAN_HAS_SERPENT_IA32) + if(request.algo_name() == "Serpent") + return new Serpent_IA32; +#endif + + return 0; + } + +HashFunction* +IA32_Assembler_Engine::find_hash(const SCAN_Name& request, + Algorithm_Factory&) const + { +#if defined(BOTAN_HAS_MD4_IA32) + if(request.algo_name() == "MD4") + return new MD4_IA32; +#endif + +#if defined(BOTAN_HAS_MD5_IA32) + if(request.algo_name() == "MD5") + return new MD5_IA32; +#endif + +#if defined(BOTAN_HAS_SHA1_IA32) + if(request.algo_name() == "SHA-160") + return new SHA_160_IA32; +#endif + + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/ia32_eng/eng_ia32.h b/src/libs/3rdparty/botan/src/engine/ia32_eng/eng_ia32.h new file mode 100644 index 00000000000..b7cb4824a5a --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/ia32_eng/eng_ia32.h @@ -0,0 +1,29 @@ +/** +* IA-32 Assembly Implementation Engines +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_IA32_ASM_ENGINE_H__ +#define BOTAN_IA32_ASM_ENGINE_H__ + +#include + +namespace Botan { + +class BOTAN_DLL IA32_Assembler_Engine : public Engine + { + public: + std::string provider_name() const { return "ia32"; } + private: + BlockCipher* find_block_cipher(const SCAN_Name&, + Algorithm_Factory&) const; + + HashFunction* find_hash(const SCAN_Name& reqeust, + Algorithm_Factory&) const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/engine/ia32_eng/info.txt b/src/libs/3rdparty/botan/src/engine/ia32_eng/info.txt new file mode 100644 index 00000000000..3bf2a7f2b97 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/ia32_eng/info.txt @@ -0,0 +1,10 @@ +realname "IA32 Assembler Engine" + +define ENGINE_IA32_ASSEMBLER + +load_on dep + + +eng_ia32.cpp +eng_ia32.h + diff --git a/src/libs/3rdparty/botan/src/engine/info.txt b/src/libs/3rdparty/botan/src/engine/info.txt new file mode 100644 index 00000000000..eef3c03b68f --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/info.txt @@ -0,0 +1,18 @@ +realname "Engines" + +define ENGINES + +load_on auto + + +engine.h + + + +block +hash +libstate +mac +numbertheory +stream + diff --git a/src/libs/3rdparty/botan/src/engine/openssl/arc4_openssl.cpp b/src/libs/3rdparty/botan/src/engine/openssl/arc4_openssl.cpp new file mode 100644 index 00000000000..08ed3eb10c3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/arc4_openssl.cpp @@ -0,0 +1,82 @@ +/* +* OpenSSL ARC4 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/** +* ARC4 as implemented by OpenSSL +*/ +class ARC4_OpenSSL : public StreamCipher + { + public: + void clear() throw() { std::memset(&state, 0, sizeof(state)); } + std::string name() const; + StreamCipher* clone() const { return new ARC4_OpenSSL(SKIP); } + + ARC4_OpenSSL(u32bit s = 0) : StreamCipher(1, 32), SKIP(s) { clear(); } + ~ARC4_OpenSSL() { clear(); } + private: + void cipher(const byte[], byte[], u32bit); + void key_schedule(const byte[], u32bit); + + const u32bit SKIP; + RC4_KEY state; + }; + +/* +* Return the name of this type +*/ +std::string ARC4_OpenSSL::name() const + { + if(SKIP == 0) return "ARC4"; + if(SKIP == 256) return "MARK-4"; + else return "RC4_skip(" + to_string(SKIP) + ")"; + } + +/* +* ARC4 Key Schedule +*/ +void ARC4_OpenSSL::key_schedule(const byte key[], u32bit length) + { + RC4_set_key(&state, length, key); + byte dummy = 0; + for(u32bit j = 0; j != SKIP; j++) + RC4(&state, 1, &dummy, &dummy); + } + +/* +* ARC4 Encryption +*/ +void ARC4_OpenSSL::cipher(const byte in[], byte out[], u32bit length) + { + RC4(&state, length, in, out); + } + +} + +/** +* Look for an OpenSSL-suported stream cipher (ARC4) +*/ +StreamCipher* +OpenSSL_Engine::find_stream_cipher(const SCAN_Name& request, + Algorithm_Factory&) const + { + if(request.algo_name() == "ARC4") + return new ARC4_OpenSSL(request.arg_as_u32bit(0, 0)); + if(request.algo_name() == "RC4_drop") + return new ARC4_OpenSSL(768); + + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/openssl/bn_powm.cpp b/src/libs/3rdparty/botan/src/engine/openssl/bn_powm.cpp new file mode 100644 index 00000000000..7b836d170a9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/bn_powm.cpp @@ -0,0 +1,54 @@ +/* +* OpenSSL Modular Exponentiation +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace { + +/* +* OpenSSL Modular Exponentiator +*/ +class OpenSSL_Modular_Exponentiator : public Modular_Exponentiator + { + public: + void set_base(const BigInt& b) { base = b; } + void set_exponent(const BigInt& e) { exp = e; } + BigInt execute() const; + Modular_Exponentiator* copy() const + { return new OpenSSL_Modular_Exponentiator(*this); } + + OpenSSL_Modular_Exponentiator(const BigInt& n) : mod(n) {} + private: + OSSL_BN base, exp, mod; + OSSL_BN_CTX ctx; + }; + +/* +* Compute the result +*/ +BigInt OpenSSL_Modular_Exponentiator::execute() const + { + OSSL_BN r; + BN_mod_exp(r.value, base.value, exp.value, mod.value, ctx.value); + return r.to_bigint(); + } + +} + +/* +* Return the OpenSSL-based modular exponentiator +*/ +Modular_Exponentiator* OpenSSL_Engine::mod_exp(const BigInt& n, + Power_Mod::Usage_Hints) const + { + return new OpenSSL_Modular_Exponentiator(n); + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/openssl/bn_wrap.cpp b/src/libs/3rdparty/botan/src/engine/openssl/bn_wrap.cpp new file mode 100644 index 00000000000..e1cfe3f95b5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/bn_wrap.cpp @@ -0,0 +1,116 @@ +/* +* OpenSSL BN Wrapper +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* OSSL_BN Constructor +*/ +OSSL_BN::OSSL_BN(const BigInt& in) + { + value = BN_new(); + SecureVector encoding = BigInt::encode(in); + if(in != 0) + BN_bin2bn(encoding, encoding.size(), value); + } + +/* +* OSSL_BN Constructor +*/ +OSSL_BN::OSSL_BN(const byte in[], u32bit length) + { + value = BN_new(); + BN_bin2bn(in, length, value); + } + +/* +* OSSL_BN Copy Constructor +*/ +OSSL_BN::OSSL_BN(const OSSL_BN& other) + { + value = BN_dup(other.value); + } + +/* +* OSSL_BN Destructor +*/ +OSSL_BN::~OSSL_BN() + { + BN_clear_free(value); + } + +/* +* OSSL_BN Assignment Operator +*/ +OSSL_BN& OSSL_BN::operator=(const OSSL_BN& other) + { + BN_copy(value, other.value); + return (*this); + } + +/* +* Export the BIGNUM as a bytestring +*/ +void OSSL_BN::encode(byte out[], u32bit length) const + { + BN_bn2bin(value, out + (length - bytes())); + } + +/* +* Return the number of significant bytes +*/ +u32bit OSSL_BN::bytes() const + { + return BN_num_bytes(value); + } + +/* +* OpenSSL to BigInt Conversions +*/ +BigInt OSSL_BN::to_bigint() const + { + SecureVector out(bytes()); + BN_bn2bin(value, out); + return BigInt::decode(out); + } + +/* +* OSSL_BN_CTX Constructor +*/ +OSSL_BN_CTX::OSSL_BN_CTX() + { + value = BN_CTX_new(); + } + +/* +* OSSL_BN_CTX Copy Constructor +*/ +OSSL_BN_CTX::OSSL_BN_CTX(const OSSL_BN_CTX&) + { + value = BN_CTX_new(); + } + +/* +* OSSL_BN_CTX Destructor +*/ +OSSL_BN_CTX::~OSSL_BN_CTX() + { + BN_CTX_free(value); + } + +/* +* OSSL_BN_CTX Assignment Operator +*/ +OSSL_BN_CTX& OSSL_BN_CTX::operator=(const OSSL_BN_CTX&) + { + value = BN_CTX_new(); + return (*this); + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/openssl/bn_wrap.h b/src/libs/3rdparty/botan/src/engine/openssl/bn_wrap.h new file mode 100644 index 00000000000..4d18be1b5f0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/bn_wrap.h @@ -0,0 +1,53 @@ +/* +* OpenSSL BN Wrapper +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_OPENSSL_BN_WRAP_H__ +#define BOTAN_OPENSSL_BN_WRAP_H__ + +#include +#include + +namespace Botan { + +/* +* Lightweight OpenSSL BN Wrapper +*/ +class BOTAN_DLL OSSL_BN + { + public: + BIGNUM* value; + + BigInt to_bigint() const; + void encode(byte[], u32bit) const; + u32bit bytes() const; + + OSSL_BN& operator=(const OSSL_BN&); + + OSSL_BN(const OSSL_BN&); + OSSL_BN(const BigInt& = 0); + OSSL_BN(const byte[], u32bit); + ~OSSL_BN(); + }; + +/* +* Lightweight OpenSSL BN_CTX Wrapper +*/ +class BOTAN_DLL OSSL_BN_CTX + { + public: + BN_CTX* value; + + OSSL_BN_CTX& operator=(const OSSL_BN_CTX&); + + OSSL_BN_CTX(); + OSSL_BN_CTX(const OSSL_BN_CTX&); + ~OSSL_BN_CTX(); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/engine/openssl/eng_ossl.h b/src/libs/3rdparty/botan/src/engine/openssl/eng_ossl.h new file mode 100644 index 00000000000..7105546dd71 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/eng_ossl.h @@ -0,0 +1,64 @@ +/* +* OpenSSL Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENGINE_OPENSSL_H__ +#define BOTAN_ENGINE_OPENSSL_H__ + +#include + +namespace Botan { + +/* +* OpenSSL Engine +*/ +class BOTAN_DLL OpenSSL_Engine : public Engine + { + public: + /** + * Return the provider name ("openssl") + */ + std::string provider_name() const { return "openssl"; } + +#if defined(BOTAN_HAS_IF_PUBLIC_KEY_FAMILY) + IF_Operation* if_op(const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_DSA) + DSA_Operation* dsa_op(const DL_Group&, const BigInt&, + const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + NR_Operation* nr_op(const DL_Group&, const BigInt&, const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_ELGAMAL) + ELG_Operation* elg_op(const DL_Group&, const BigInt&, + const BigInt&) const; +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + DH_Operation* dh_op(const DL_Group&, const BigInt&) const; +#endif + + Modular_Exponentiator* mod_exp(const BigInt&, + Power_Mod::Usage_Hints) const; + private: + BlockCipher* find_block_cipher(const SCAN_Name&, + Algorithm_Factory&) const; + + StreamCipher* find_stream_cipher(const SCAN_Name&, + Algorithm_Factory&) const; + + HashFunction* find_hash(const SCAN_Name&, Algorithm_Factory&) const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/engine/openssl/info.txt b/src/libs/3rdparty/botan/src/engine/openssl/info.txt new file mode 100644 index 00000000000..3f2f1ab14ac --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/info.txt @@ -0,0 +1,28 @@ +realname "OpenSSL Engine" + +define ENGINE_OPENSSL + +load_on request + + +all -> crypto + + + +arc4_openssl.cpp +bn_powm.cpp +bn_wrap.cpp +bn_wrap.h +eng_ossl.h +ossl_bc.cpp +ossl_dh.cpp +ossl_dsa.cpp +ossl_elg.cpp +ossl_if.cpp +ossl_md.cpp +ossl_nr.cpp + + + +bigint + diff --git a/src/libs/3rdparty/botan/src/engine/openssl/ossl_bc.cpp b/src/libs/3rdparty/botan/src/engine/openssl/ossl_bc.cpp new file mode 100644 index 00000000000..4d3761adbaa --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/ossl_bc.cpp @@ -0,0 +1,200 @@ +/* +* OpenSSL Block Cipher +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace { + +/* +* EVP Block Cipher +*/ +class EVP_BlockCipher : public BlockCipher + { + public: + void clear() throw(); + std::string name() const { return cipher_name; } + BlockCipher* clone() const; + EVP_BlockCipher(const EVP_CIPHER*, const std::string&); + EVP_BlockCipher(const EVP_CIPHER*, const std::string&, + u32bit, u32bit, u32bit); + + ~EVP_BlockCipher(); + private: + void enc(const byte[], byte[]) const; + void dec(const byte[], byte[]) const; + void key_schedule(const byte[], u32bit); + std::string cipher_name; + mutable EVP_CIPHER_CTX encrypt, decrypt; + }; + +/* +* EVP Block Cipher Constructor +*/ +EVP_BlockCipher::EVP_BlockCipher(const EVP_CIPHER* algo, + const std::string& algo_name) : + BlockCipher(EVP_CIPHER_block_size(algo), EVP_CIPHER_key_length(algo)), + cipher_name(algo_name) + { + if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE) + throw Invalid_Argument("EVP_BlockCipher: Non-ECB EVP was passed in"); + + EVP_CIPHER_CTX_init(&encrypt); + EVP_CIPHER_CTX_init(&decrypt); + + EVP_EncryptInit_ex(&encrypt, algo, 0, 0, 0); + EVP_DecryptInit_ex(&decrypt, algo, 0, 0, 0); + + EVP_CIPHER_CTX_set_padding(&encrypt, 0); + EVP_CIPHER_CTX_set_padding(&decrypt, 0); + } + +/* +* EVP Block Cipher Constructor +*/ +EVP_BlockCipher::EVP_BlockCipher(const EVP_CIPHER* algo, + const std::string& algo_name, + u32bit key_min, u32bit key_max, + u32bit key_mod) : + BlockCipher(EVP_CIPHER_block_size(algo), key_min, key_max, key_mod), + cipher_name(algo_name) + { + if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE) + throw Invalid_Argument("EVP_BlockCipher: Non-ECB EVP was passed in"); + + EVP_CIPHER_CTX_init(&encrypt); + EVP_CIPHER_CTX_init(&decrypt); + + EVP_EncryptInit_ex(&encrypt, algo, 0, 0, 0); + EVP_DecryptInit_ex(&decrypt, algo, 0, 0, 0); + + EVP_CIPHER_CTX_set_padding(&encrypt, 0); + EVP_CIPHER_CTX_set_padding(&decrypt, 0); + } + +/* +* EVP Block Cipher Destructor +*/ +EVP_BlockCipher::~EVP_BlockCipher() + { + EVP_CIPHER_CTX_cleanup(&encrypt); + EVP_CIPHER_CTX_cleanup(&decrypt); + } + +/* +* Encrypt a block +*/ +void EVP_BlockCipher::enc(const byte in[], byte out[]) const + { + int out_len = 0; + EVP_EncryptUpdate(&encrypt, out, &out_len, in, BLOCK_SIZE); + } + +/* +* Decrypt a block +*/ +void EVP_BlockCipher::dec(const byte in[], byte out[]) const + { + int out_len = 0; + EVP_DecryptUpdate(&decrypt, out, &out_len, in, BLOCK_SIZE); + } + +/* +* Set the key +*/ +void EVP_BlockCipher::key_schedule(const byte key[], u32bit length) + { + SecureVector full_key(key, length); + + if(cipher_name == "TripleDES" && length == 16) + full_key.append(key, 8); + else + if(EVP_CIPHER_CTX_set_key_length(&encrypt, length) == 0 || + EVP_CIPHER_CTX_set_key_length(&decrypt, length) == 0) + throw Invalid_Argument("EVP_BlockCipher: Bad key length for " + + cipher_name); + + if(cipher_name == "RC2") + { + EVP_CIPHER_CTX_ctrl(&encrypt, EVP_CTRL_SET_RC2_KEY_BITS, length*8, 0); + EVP_CIPHER_CTX_ctrl(&decrypt, EVP_CTRL_SET_RC2_KEY_BITS, length*8, 0); + } + + EVP_EncryptInit_ex(&encrypt, 0, 0, full_key.begin(), 0); + EVP_DecryptInit_ex(&decrypt, 0, 0, full_key.begin(), 0); + } + +/* +* Return a clone of this object +*/ +BlockCipher* EVP_BlockCipher::clone() const + { + return new EVP_BlockCipher(EVP_CIPHER_CTX_cipher(&encrypt), + cipher_name, MINIMUM_KEYLENGTH, + MAXIMUM_KEYLENGTH, KEYLENGTH_MULTIPLE); + } + +/* +* Clear memory of sensitive data +*/ +void EVP_BlockCipher::clear() throw() + { + const EVP_CIPHER* algo = EVP_CIPHER_CTX_cipher(&encrypt); + + EVP_CIPHER_CTX_cleanup(&encrypt); + EVP_CIPHER_CTX_cleanup(&decrypt); + EVP_CIPHER_CTX_init(&encrypt); + EVP_CIPHER_CTX_init(&decrypt); + EVP_EncryptInit_ex(&encrypt, algo, 0, 0, 0); + EVP_DecryptInit_ex(&decrypt, algo, 0, 0, 0); + EVP_CIPHER_CTX_set_padding(&encrypt, 0); + EVP_CIPHER_CTX_set_padding(&decrypt, 0); + } + +} + +/* +* Look for an algorithm with this name +*/ +BlockCipher* +OpenSSL_Engine::find_block_cipher(const SCAN_Name& request, + Algorithm_Factory&) const + { +#define HANDLE_EVP_CIPHER(NAME, EVP) \ + if(request.algo_name() == NAME && request.arg_count() == 0) \ + return new EVP_BlockCipher(EVP, NAME); + +#define HANDLE_EVP_CIPHER_KEYLEN(NAME, EVP, MIN, MAX, MOD) \ + if(request.algo_name() == NAME && request.arg_count() == 0) \ + return new EVP_BlockCipher(EVP, NAME, MIN, MAX, MOD); + +#if 0 + /* + Using OpenSSL's AES causes crashes inside EVP on x86-64 with OpenSSL 0.9.8g + cause is unknown + */ + HANDLE_EVP_CIPHER("AES-128", EVP_aes_128_ecb()); + HANDLE_EVP_CIPHER("AES-192", EVP_aes_192_ecb()); + HANDLE_EVP_CIPHER("AES-256", EVP_aes_256_ecb()); +#endif + + HANDLE_EVP_CIPHER("DES", EVP_des_ecb()); + HANDLE_EVP_CIPHER_KEYLEN("TripleDES", EVP_des_ede3_ecb(), 16, 24, 8); + + HANDLE_EVP_CIPHER_KEYLEN("Blowfish", EVP_bf_ecb(), 1, 56, 1); + HANDLE_EVP_CIPHER_KEYLEN("CAST-128", EVP_cast5_ecb(), 1, 16, 1); + HANDLE_EVP_CIPHER_KEYLEN("RC2", EVP_rc2_ecb(), 1, 32, 1); + +#undef HANDLE_EVP_CIPHER +#undef HANDLE_EVP_CIPHER_KEYLEN + + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/openssl/ossl_dh.cpp b/src/libs/3rdparty/botan/src/engine/openssl/ossl_dh.cpp new file mode 100644 index 00000000000..72eab8a4833 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/ossl_dh.cpp @@ -0,0 +1,60 @@ +/* +* OpenSSL Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +#if OPENSSL_VERSION_NUMBER < 0x0090700F + #error Your OpenSSL install is too old, upgrade to 0.9.7 or later +#endif + +namespace Botan { + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + +namespace { + +/* +* OpenSSL DH Operation +*/ +class OpenSSL_DH_Op : public DH_Operation + { + public: + BigInt agree(const BigInt& i) const; + DH_Operation* clone() const { return new OpenSSL_DH_Op(*this); } + + OpenSSL_DH_Op(const DL_Group& group, const BigInt& x_bn) : + x(x_bn), p(group.get_p()) {} + private: + OSSL_BN x, p; + OSSL_BN_CTX ctx; + }; + +/* +* OpenSSL DH Key Agreement Operation +*/ +BigInt OpenSSL_DH_Op::agree(const BigInt& i_bn) const + { + OSSL_BN i(i_bn), r; + BN_mod_exp(r.value, i.value, x.value, p.value, ctx.value); + return r.to_bigint(); + } + +} + +/* +* Acquire a DH op +*/ +DH_Operation* OpenSSL_Engine::dh_op(const DL_Group& group, + const BigInt& x) const + { + return new OpenSSL_DH_Op(group, x); + } +#endif + +} diff --git a/src/libs/3rdparty/botan/src/engine/openssl/ossl_dsa.cpp b/src/libs/3rdparty/botan/src/engine/openssl/ossl_dsa.cpp new file mode 100644 index 00000000000..bfffb879628 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/ossl_dsa.cpp @@ -0,0 +1,126 @@ +/* +* OpenSSL DSA Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +#if OPENSSL_VERSION_NUMBER < 0x0090700F + #error Your OpenSSL install is too old, upgrade to 0.9.7 or later +#endif + +namespace Botan { + +#if defined(BOTAN_HAS_DSA) + +namespace { + +/* +* OpenSSL DSA Operation +*/ +class OpenSSL_DSA_Op : public DSA_Operation + { + public: + bool verify(const byte[], u32bit, const byte[], u32bit) const; + SecureVector sign(const byte[], u32bit, const BigInt&) const; + + DSA_Operation* clone() const { return new OpenSSL_DSA_Op(*this); } + + OpenSSL_DSA_Op(const DL_Group& group, const BigInt& y1, + const BigInt& x1) : + x(x1), y(y1), p(group.get_p()), q(group.get_q()), g(group.get_g()) {} + private: + const OSSL_BN x, y, p, q, g; + OSSL_BN_CTX ctx; + }; + +/* +* OpenSSL DSA Verify Operation +*/ +bool OpenSSL_DSA_Op::verify(const byte msg[], u32bit msg_len, + const byte sig[], u32bit sig_len) const + { + const u32bit q_bytes = q.bytes(); + + if(sig_len != 2*q_bytes || msg_len > q_bytes) + return false; + + OSSL_BN r(sig, q_bytes); + OSSL_BN s(sig + q_bytes, q_bytes); + OSSL_BN i(msg, msg_len); + + if(BN_is_zero(r.value) || BN_cmp(r.value, q.value) >= 0) + return false; + if(BN_is_zero(s.value) || BN_cmp(s.value, q.value) >= 0) + return false; + + if(BN_mod_inverse(s.value, s.value, q.value, ctx.value) == 0) + return false; + + OSSL_BN si; + BN_mod_mul(si.value, s.value, i.value, q.value, ctx.value); + BN_mod_exp(si.value, g.value, si.value, p.value, ctx.value); + + OSSL_BN sr; + BN_mod_mul(sr.value, s.value, r.value, q.value, ctx.value); + BN_mod_exp(sr.value, y.value, sr.value, p.value, ctx.value); + + BN_mod_mul(si.value, si.value, sr.value, p.value, ctx.value); + BN_nnmod(si.value, si.value, q.value, ctx.value); + + if(BN_cmp(si.value, r.value) == 0) + return true; + return false; + } + +/* +* OpenSSL DSA Sign Operation +*/ +SecureVector OpenSSL_DSA_Op::sign(const byte in[], u32bit length, + const BigInt& k_bn) const + { + if(BN_is_zero(x.value)) + throw Internal_Error("OpenSSL_DSA_Op::sign: No private key"); + + OSSL_BN i(in, length); + OSSL_BN k(k_bn); + + OSSL_BN r; + BN_mod_exp(r.value, g.value, k.value, p.value, ctx.value); + BN_nnmod(r.value, r.value, q.value, ctx.value); + + BN_mod_inverse(k.value, k.value, q.value, ctx.value); + + OSSL_BN s; + BN_mul(s.value, x.value, r.value, ctx.value); + BN_add(s.value, s.value, i.value); + BN_mod_mul(s.value, s.value, k.value, q.value, ctx.value); + + if(BN_is_zero(r.value) || BN_is_zero(s.value)) + throw Internal_Error("OpenSSL_DSA_Op::sign: r or s was zero"); + + const u32bit q_bytes = q.bytes(); + + SecureVector output(2*q_bytes); + r.encode(output, q_bytes); + s.encode(output + q_bytes, q_bytes); + return output; + } + +} + +/* +* Acquire a DSA op +*/ +DSA_Operation* OpenSSL_Engine::dsa_op(const DL_Group& group, const BigInt& y, + const BigInt& x) const + { + return new OpenSSL_DSA_Op(group, y, x); + } +#endif + +} diff --git a/src/libs/3rdparty/botan/src/engine/openssl/ossl_elg.cpp b/src/libs/3rdparty/botan/src/engine/openssl/ossl_elg.cpp new file mode 100644 index 00000000000..aefda9a1e41 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/ossl_elg.cpp @@ -0,0 +1,95 @@ +/* +* OpenSSL Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +#if OPENSSL_VERSION_NUMBER < 0x0090700F + #error Your OpenSSL install is too old, upgrade to 0.9.7 or later +#endif + +namespace Botan { + +#if defined(BOTAN_HAS_ELGAMAL) + +namespace { + +/* +* OpenSSL ElGamal Operation +*/ +class OpenSSL_ELG_Op : public ELG_Operation + { + public: + SecureVector encrypt(const byte[], u32bit, const BigInt&) const; + BigInt decrypt(const BigInt&, const BigInt&) const; + + ELG_Operation* clone() const { return new OpenSSL_ELG_Op(*this); } + OpenSSL_ELG_Op(const DL_Group& group, const BigInt& y1, + const BigInt& x1) : + x(x1), y(y1), g(group.get_g()), p(group.get_p()) {} + private: + OSSL_BN x, y, g, p; + OSSL_BN_CTX ctx; + }; + +/* +* OpenSSL ElGamal Encrypt Operation +*/ +SecureVector OpenSSL_ELG_Op::encrypt(const byte in[], u32bit length, + const BigInt& k_bn) const + { + OSSL_BN i(in, length); + + if(BN_cmp(i.value, p.value) >= 0) + throw Invalid_Argument("OpenSSL_ELG_Op: Input is too large"); + + OSSL_BN a, b, k(k_bn); + + BN_mod_exp(a.value, g.value, k.value, p.value, ctx.value); + BN_mod_exp(b.value, y.value, k.value, p.value, ctx.value); + BN_mod_mul(b.value, b.value, i.value, p.value, ctx.value); + + const u32bit p_bytes = p.bytes(); + SecureVector output(2*p_bytes); + a.encode(output, p_bytes); + b.encode(output + p_bytes, p_bytes); + return output; + } + +/* +* OpenSSL ElGamal Decrypt Operation +*/ +BigInt OpenSSL_ELG_Op::decrypt(const BigInt& a_bn, const BigInt& b_bn) const + { + if(BN_is_zero(x.value)) + throw Internal_Error("OpenSSL_ELG_Op::decrypt: No private key"); + + OSSL_BN a(a_bn), b(b_bn), t; + + if(BN_cmp(a.value, p.value) >= 0 || BN_cmp(b.value, p.value) >= 0) + throw Invalid_Argument("OpenSSL_ELG_Op: Invalid message"); + + BN_mod_exp(t.value, a.value, x.value, p.value, ctx.value); + BN_mod_inverse(a.value, t.value, p.value, ctx.value); + BN_mod_mul(a.value, a.value, b.value, p.value, ctx.value); + return a.to_bigint(); + } + +} + +/* +* Acquire an ElGamal op +*/ +ELG_Operation* OpenSSL_Engine::elg_op(const DL_Group& group, const BigInt& y, + const BigInt& x) const + { + return new OpenSSL_ELG_Op(group, y, x); + } +#endif + +} diff --git a/src/libs/3rdparty/botan/src/engine/openssl/ossl_if.cpp b/src/libs/3rdparty/botan/src/engine/openssl/ossl_if.cpp new file mode 100644 index 00000000000..bbc10d54980 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/ossl_if.cpp @@ -0,0 +1,85 @@ +/* +* OpenSSL IF Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +#if OPENSSL_VERSION_NUMBER < 0x0090700F + #error Your OpenSSL install is too old, upgrade to 0.9.7 or later +#endif + +namespace Botan { + +#if defined(BOTAN_HAS_IF_PUBLIC_KEY_FAMILY) + +namespace { + +/* +* OpenSSL IF Operation +*/ +class OpenSSL_IF_Op : public IF_Operation + { + public: + BigInt public_op(const BigInt&) const; + BigInt private_op(const BigInt&) const; + + IF_Operation* clone() const { return new OpenSSL_IF_Op(*this); } + + OpenSSL_IF_Op(const BigInt& e_bn, const BigInt& n_bn, const BigInt&, + const BigInt& p_bn, const BigInt& q_bn, const BigInt& d1_bn, + const BigInt& d2_bn, const BigInt& c_bn) : + e(e_bn), n(n_bn), p(p_bn), q(q_bn), d1(d1_bn), d2(d2_bn), c(c_bn) {} + private: + const OSSL_BN e, n, p, q, d1, d2, c; + OSSL_BN_CTX ctx; + }; + +/* +* OpenSSL IF Public Operation +*/ +BigInt OpenSSL_IF_Op::public_op(const BigInt& i_bn) const + { + OSSL_BN i(i_bn), r; + BN_mod_exp(r.value, i.value, e.value, n.value, ctx.value); + return r.to_bigint(); + } + +/* +* OpenSSL IF Private Operation +*/ +BigInt OpenSSL_IF_Op::private_op(const BigInt& i_bn) const + { + if(BN_is_zero(p.value)) + throw Internal_Error("OpenSSL_IF_Op::private_op: No private key"); + + OSSL_BN j1, j2, h(i_bn); + + BN_mod_exp(j1.value, h.value, d1.value, p.value, ctx.value); + BN_mod_exp(j2.value, h.value, d2.value, q.value, ctx.value); + BN_sub(h.value, j1.value, j2.value); + BN_mod_mul(h.value, h.value, c.value, p.value, ctx.value); + BN_mul(h.value, h.value, q.value, ctx.value); + BN_add(h.value, h.value, j2.value); + return h.to_bigint(); + } + +} + +/* +* Acquire an IF op +*/ +IF_Operation* OpenSSL_Engine::if_op(const BigInt& e, const BigInt& n, + const BigInt& d, const BigInt& p, + const BigInt& q, const BigInt& d1, + const BigInt& d2, const BigInt& c) const + { + return new OpenSSL_IF_Op(e, n, d, p, q, d1, d2, c); + } +#endif + +} diff --git a/src/libs/3rdparty/botan/src/engine/openssl/ossl_md.cpp b/src/libs/3rdparty/botan/src/engine/openssl/ossl_md.cpp new file mode 100644 index 00000000000..7c8fb678c9c --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/ossl_md.cpp @@ -0,0 +1,126 @@ +/* +* OpenSSL Hash Functions +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace { + +/* +* EVP Hash Function +*/ +class EVP_HashFunction : public HashFunction + { + public: + void clear() throw(); + std::string name() const { return algo_name; } + HashFunction* clone() const; + EVP_HashFunction(const EVP_MD*, const std::string&); + ~EVP_HashFunction(); + private: + void add_data(const byte[], u32bit); + void final_result(byte[]); + + std::string algo_name; + EVP_MD_CTX md; + }; + +/* +* Update an EVP Hash Calculation +*/ +void EVP_HashFunction::add_data(const byte input[], u32bit length) + { + EVP_DigestUpdate(&md, input, length); + } + +/* +* Finalize an EVP Hash Calculation +*/ +void EVP_HashFunction::final_result(byte output[]) + { + EVP_DigestFinal_ex(&md, output, 0); + const EVP_MD* algo = EVP_MD_CTX_md(&md); + EVP_DigestInit_ex(&md, algo, 0); + } + +/* +* Clear memory of sensitive data +*/ +void EVP_HashFunction::clear() throw() + { + const EVP_MD* algo = EVP_MD_CTX_md(&md); + EVP_DigestInit_ex(&md, algo, 0); + } + +/* +* Return a clone of this object +*/ +HashFunction* EVP_HashFunction::clone() const + { + const EVP_MD* algo = EVP_MD_CTX_md(&md); + return new EVP_HashFunction(algo, name()); + } + +/* +* Create an EVP hash function +*/ +EVP_HashFunction::EVP_HashFunction(const EVP_MD* algo, + const std::string& name) : + HashFunction(EVP_MD_size(algo), EVP_MD_block_size(algo)), + algo_name(name) + { + EVP_MD_CTX_init(&md); + EVP_DigestInit_ex(&md, algo, 0); + } + +/* +* Destroy an EVP hash function +*/ +EVP_HashFunction::~EVP_HashFunction() + { + EVP_MD_CTX_cleanup(&md); + } + +} + +/* +* Look for an algorithm with this name +*/ +HashFunction* OpenSSL_Engine::find_hash(const SCAN_Name& request, + Algorithm_Factory&) const + { +#ifndef OPENSSL_NO_SHA + if(request.algo_name() == "SHA-160") + return new EVP_HashFunction(EVP_sha1(), "SHA-160"); +#endif + +#ifndef OPENSSL_NO_MD2 + if(request.algo_name() == "MD2") + return new EVP_HashFunction(EVP_md2(), "MD2"); +#endif + +#ifndef OPENSSL_NO_MD4 + if(request.algo_name() == "MD4") + return new EVP_HashFunction(EVP_md4(), "MD4"); +#endif + +#ifndef OPENSSL_NO_MD5 + if(request.algo_name() == "MD5") + return new EVP_HashFunction(EVP_md5(), "MD5"); +#endif + +#ifndef OPENSSL_NO_RIPEMD + if(request.algo_name() == "RIPEMD-160") + return new EVP_HashFunction(EVP_ripemd160(), "RIPEMD-160"); +#endif + + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/openssl/ossl_nr.cpp b/src/libs/3rdparty/botan/src/engine/openssl/ossl_nr.cpp new file mode 100644 index 00000000000..532e4b8be40 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/openssl/ossl_nr.cpp @@ -0,0 +1,113 @@ +/* +* OpenSSL NR Engine +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +#if OPENSSL_VERSION_NUMBER < 0x0090700F + #error Your OpenSSL install is too old, upgrade to 0.9.7 or later +#endif + +namespace Botan { + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + +namespace { + +/* +* OpenSSL NR Operation +*/ +class OpenSSL_NR_Op : public NR_Operation + { + public: + SecureVector verify(const byte[], u32bit) const; + SecureVector sign(const byte[], u32bit, const BigInt&) const; + + NR_Operation* clone() const { return new OpenSSL_NR_Op(*this); } + + OpenSSL_NR_Op(const DL_Group& group, const BigInt& y1, + const BigInt& x1) : + x(x1), y(y1), p(group.get_p()), q(group.get_q()), g(group.get_g()) {} + private: + const OSSL_BN x, y, p, q, g; + OSSL_BN_CTX ctx; + }; + +/* +* OpenSSL NR Verify Operation +*/ +SecureVector OpenSSL_NR_Op::verify(const byte sig[], + u32bit sig_len) const + { + const u32bit q_bytes = q.bytes(); + + if(sig_len != 2*q_bytes) + return false; + + OSSL_BN c(sig, q_bytes); + OSSL_BN d(sig + q_bytes, q_bytes); + + if(BN_is_zero(c.value) || BN_cmp(c.value, q.value) >= 0 || + BN_cmp(d.value, q.value) >= 0) + throw Invalid_Argument("OpenSSL_NR_Op::verify: Invalid signature"); + + OSSL_BN i1, i2; + BN_mod_exp(i1.value, g.value, d.value, p.value, ctx.value); + BN_mod_exp(i2.value, y.value, c.value, p.value, ctx.value); + BN_mod_mul(i1.value, i1.value, i2.value, p.value, ctx.value); + BN_sub(i1.value, c.value, i1.value); + BN_nnmod(i1.value, i1.value, q.value, ctx.value); + return BigInt::encode(i1.to_bigint()); + } + +/* +* OpenSSL NR Sign Operation +*/ +SecureVector OpenSSL_NR_Op::sign(const byte in[], u32bit length, + const BigInt& k_bn) const + { + if(BN_is_zero(x.value)) + throw Internal_Error("OpenSSL_NR_Op::sign: No private key"); + + OSSL_BN f(in, length); + OSSL_BN k(k_bn); + + if(BN_cmp(f.value, q.value) >= 0) + throw Invalid_Argument("OpenSSL_NR_Op::sign: Input is out of range"); + + OSSL_BN c, d; + BN_mod_exp(c.value, g.value, k.value, p.value, ctx.value); + BN_add(c.value, c.value, f.value); + BN_nnmod(c.value, c.value, q.value, ctx.value); + BN_mul(d.value, x.value, c.value, ctx.value); + BN_sub(d.value, k.value, d.value); + BN_nnmod(d.value, d.value, q.value, ctx.value); + + if(BN_is_zero(c.value)) + throw Internal_Error("Default_NR_Op::sign: c was zero"); + + const u32bit q_bytes = q.bytes(); + SecureVector output(2*q_bytes); + c.encode(output, q_bytes); + d.encode(output + q_bytes, q_bytes); + return output; + } + +} + +/* +* Acquire a NR op +*/ +NR_Operation* OpenSSL_Engine::nr_op(const DL_Group& group, const BigInt& y, + const BigInt& x) const + { + return new OpenSSL_NR_Op(group, y, x); + } +#endif + +} diff --git a/src/libs/3rdparty/botan/src/engine/sse2_eng/eng_sse2.cpp b/src/libs/3rdparty/botan/src/engine/sse2_eng/eng_sse2.cpp new file mode 100644 index 00000000000..c738b3d961d --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/sse2_eng/eng_sse2.cpp @@ -0,0 +1,27 @@ +/** +* SSE2 Assembly Engine +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +#if defined(BOTAN_HAS_SHA1_SSE2) + #include +#endif + +namespace Botan { + +HashFunction* SSE2_Assembler_Engine::find_hash(const SCAN_Name& request, + Algorithm_Factory&) const + { +#if defined(BOTAN_HAS_SHA1_SSE2) + if(request.algo_name() == "SHA-160") + return new SHA_160_SSE2; +#endif + + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/engine/sse2_eng/eng_sse2.h b/src/libs/3rdparty/botan/src/engine/sse2_eng/eng_sse2.h new file mode 100644 index 00000000000..129697e8fee --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/sse2_eng/eng_sse2.h @@ -0,0 +1,26 @@ +/** +* SSE2 Assembly Engine +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SSE2_ASM_ENGINE_H__ +#define BOTAN_SSE2_ASM_ENGINE_H__ + +#include + +namespace Botan { + +class BOTAN_DLL SSE2_Assembler_Engine : public Engine + { + public: + std::string provider_name() const { return "sse2"; } + private: + HashFunction* find_hash(const SCAN_Name& reqeust, + Algorithm_Factory&) const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/engine/sse2_eng/info.txt b/src/libs/3rdparty/botan/src/engine/sse2_eng/info.txt new file mode 100644 index 00000000000..6242c7fee37 --- /dev/null +++ b/src/libs/3rdparty/botan/src/engine/sse2_eng/info.txt @@ -0,0 +1,15 @@ +realname "SSE2 Assembler Engine" + +define ENGINE_SSE2_ASSEMBLER + +load_on dep + + +eng_sse2.cpp +eng_sse2.h + + + +ia32 +amd64 + diff --git a/src/libs/3rdparty/botan/src/entropy/beos_stats/es_beos.cpp b/src/libs/3rdparty/botan/src/entropy/beos_stats/es_beos.cpp new file mode 100644 index 00000000000..18eca5511e3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/beos_stats/es_beos.cpp @@ -0,0 +1,65 @@ +/** +* BeOS EntropySource +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +#include +#include +#include + +namespace Botan { + +/** +* BeOS entropy poll +*/ +void BeOS_EntropySource::poll(Entropy_Accumulator& accum) + { + system_info info_sys; + get_system_info(&info_sys); + accum.add(info_sys, 2); + + key_info info_key; // current state of the keyboard + get_key_info(&info_key); + accum.add(info_key, 0); + + accum.add(idle_time(), 0); + + team_info info_team; + int32 cookie_team = 0; + + while(get_next_team_info(&cookie_team, &info_team) == B_OK) + { + accum.add(info_team, 2); + + team_id id = info_team.team; + int32 cookie = 0; + + thread_info info_thr; + while(get_next_thread_info(id, &cookie, &info_thr) == B_OK) + accum.add(info_thr, 1); + + cookie = 0; + image_info info_img; + while(get_next_image_info(id, &cookie, &info_img) == B_OK) + accum.add(info_img, 1); + + cookie = 0; + sem_info info_sem; + while(get_next_sem_info(id, &cookie, &info_sem) == B_OK) + accum.add(info_sem, 1); + + cookie = 0; + area_info info_area; + while(get_next_area_info(id, &cookie, &info_area) == B_OK) + accum.add(info_area, 2); + + if(accum.polling_goal_achieved()) + break; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/entropy/beos_stats/es_beos.h b/src/libs/3rdparty/botan/src/entropy/beos_stats/es_beos.h new file mode 100644 index 00000000000..be80ad340f0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/beos_stats/es_beos.h @@ -0,0 +1,28 @@ +/** +* BeOS EntropySource +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENTROPY_SRC_BEOS_H__ +#define BOTAN_ENTROPY_SRC_BEOS_H__ + +#include + +namespace Botan { + +/** +* BeOS Entropy Source +*/ +class BOTAN_DLL BeOS_EntropySource : public EntropySource + { + private: + std::string name() const { return "BeOS Statistics"; } + + void poll(Entropy_Accumulator& accum); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/entropy/beos_stats/info.txt b/src/libs/3rdparty/botan/src/entropy/beos_stats/info.txt new file mode 100644 index 00000000000..a7e62cfb3b7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/beos_stats/info.txt @@ -0,0 +1,19 @@ +realname "BeOS Entropy Source" + +define ENTROPY_SRC_BEOS +modset beos + +load_on auto + + +es_beos.h +es_beos.cpp + + + +beos + + + +beos -> root,be + diff --git a/src/libs/3rdparty/botan/src/entropy/cryptoapi_rng/es_capi.cpp b/src/libs/3rdparty/botan/src/entropy/cryptoapi_rng/es_capi.cpp new file mode 100644 index 00000000000..a70b52044cc --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/cryptoapi_rng/es_capi.cpp @@ -0,0 +1,93 @@ +/* +* Win32 CryptoAPI EntropySource +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +namespace { + +class CSP_Handle + { + public: + CSP_Handle(u64bit capi_provider) + { + valid = false; + DWORD prov_type = (DWORD)capi_provider; + + if(CryptAcquireContext(&handle, 0, 0, + prov_type, CRYPT_VERIFYCONTEXT)) + valid = true; + } + + ~CSP_Handle() + { + if(is_valid()) + CryptReleaseContext(handle, 0); + } + + u32bit gen_random(byte out[], u32bit n) const + { + if(is_valid() && CryptGenRandom(handle, n, out)) + return n; + return 0; + } + + bool is_valid() const { return valid; } + + HCRYPTPROV get_handle() const { return handle; } + private: + HCRYPTPROV handle; + bool valid; + }; + +} + +/** +* Gather Entropy from Win32 CAPI +*/ +void Win32_CAPI_EntropySource::poll(Entropy_Accumulator& accum) + { + MemoryRegion& io_buffer = accum.get_io_buffer(32); + + for(u32bit j = 0; j != prov_types.size(); ++j) + { + CSP_Handle csp(prov_types[j]); + + u32bit got = csp.gen_random(io_buffer.begin(), io_buffer.size()); + + if(got) + { + accum.add(io_buffer.begin(), io_buffer.size(), 8); + break; + } + } + } + +/** +* Win32_Capi_Entropysource Constructor +*/ +Win32_CAPI_EntropySource::Win32_CAPI_EntropySource(const std::string& provs) + { + std::vector capi_provs = split_on(provs, ':'); + + for(u32bit j = 0; j != capi_provs.size(); ++j) + { + if(capi_provs[j] == "RSA_FULL") prov_types.push_back(PROV_RSA_FULL); + if(capi_provs[j] == "INTEL_SEC") prov_types.push_back(PROV_INTEL_SEC); + if(capi_provs[j] == "FORTEZZA") prov_types.push_back(PROV_FORTEZZA); + if(capi_provs[j] == "RNG") prov_types.push_back(PROV_RNG); + } + + if(prov_types.size() == 0) + prov_types.push_back(PROV_RSA_FULL); + } + +} diff --git a/src/libs/3rdparty/botan/src/entropy/cryptoapi_rng/es_capi.h b/src/libs/3rdparty/botan/src/entropy/cryptoapi_rng/es_capi.h new file mode 100644 index 00000000000..55966d793a8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/cryptoapi_rng/es_capi.h @@ -0,0 +1,33 @@ +/* +* Win32 CAPI EntropySource +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENTROPY_SRC_WIN32_CAPI_H__ +#define BOTAN_ENTROPY_SRC_WIN32_CAPI_H__ + +#include +#include + +namespace Botan { + +/** +* Win32 CAPI Entropy Source +*/ +class BOTAN_DLL Win32_CAPI_EntropySource : public EntropySource + { + public: + std::string name() const { return "Win32 CryptoGenRandom"; } + + void poll(Entropy_Accumulator& accum); + + Win32_CAPI_EntropySource(const std::string& = ""); + private: + std::vector prov_types; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/entropy/cryptoapi_rng/info.txt b/src/libs/3rdparty/botan/src/entropy/cryptoapi_rng/info.txt new file mode 100644 index 00000000000..643c67d2edd --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/cryptoapi_rng/info.txt @@ -0,0 +1,21 @@ +realname "Win32 CryptoAPI Entropy Source" + +define ENTROPY_SRC_CAPI +load_on auto +modset win32 + + +es_capi.h +es_capi.cpp + + +# We'll just assume CAPI is there; this is OK except for 3.x, early versions +# of 95, and maybe NT 3.5 + +windows +cygwin + + + +windows -> advapi32.lib + diff --git a/src/libs/3rdparty/botan/src/entropy/dev_random/es_dev.cpp b/src/libs/3rdparty/botan/src/entropy/dev_random/es_dev.cpp new file mode 100644 index 00000000000..ef3074194ae --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/dev_random/es_dev.cpp @@ -0,0 +1,125 @@ +/* +* /dev/random EntropySource +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +#include +#include +#include +#include +#include + +namespace Botan { + +/** +Close the device, if open +*/ +void Device_EntropySource::Device_Reader::close() + { + if(fd > 0) { ::close(fd); fd = -1; } + } + +/** +Read bytes from a device file +*/ +u32bit Device_EntropySource::Device_Reader::get(byte out[], u32bit length, + u32bit ms_wait_time) + { + if(fd < 0) + return 0; + + if(fd >= FD_SETSIZE) + return 0; + + fd_set read_set; + FD_ZERO(&read_set); + FD_SET(fd, &read_set); + + struct ::timeval timeout; + + timeout.tv_sec = (ms_wait_time / 1000); + timeout.tv_usec = (ms_wait_time % 1000) * 1000; + + if(::select(fd + 1, &read_set, 0, 0, &timeout) < 0) + return 0; + + if(!(FD_ISSET(fd, &read_set))) + return 0; + + const ssize_t got = ::read(fd, out, length); + if(got <= 0) + return 0; + + return static_cast(got); + } + +/** +Attempt to open a device +*/ +Device_EntropySource::Device_Reader::fd_type +Device_EntropySource::Device_Reader::open(const std::string& pathname) + { +#ifndef O_NONBLOCK + #define O_NONBLOCK 0 +#endif + +#ifndef O_NOCTTY + #define O_NOCTTY 0 +#endif + + const int flags = O_RDONLY | O_NONBLOCK | O_NOCTTY; + return ::open(pathname.c_str(), flags); + } + +/** +Device_EntropySource constructor +Open a file descriptor to each (available) device in fsnames +*/ +Device_EntropySource::Device_EntropySource( + const std::vector& fsnames) + { + for(u32bit i = 0; i != fsnames.size(); ++i) + { + Device_Reader::fd_type fd = Device_Reader::open(fsnames[i]); + if(fd > 0) + devices.push_back(Device_Reader(fd)); + } + } + +/** +Device_EntropySource destructor: close all open devices +*/ +Device_EntropySource::~Device_EntropySource() + { + for(size_t i = 0; i != devices.size(); ++i) + devices[i].close(); + } + +/** +* Gather entropy from a RNG device +*/ +void Device_EntropySource::poll(Entropy_Accumulator& accum) + { + u32bit go_get = std::min(accum.desired_remaining_bits() / 8, 48); + + u32bit read_wait_ms = std::max(go_get, 1000); + MemoryRegion& io_buffer = accum.get_io_buffer(go_get); + + for(size_t i = 0; i != devices.size(); ++i) + { + u32bit got = devices[i].get(io_buffer.begin(), io_buffer.size(), + read_wait_ms); + + if(got) + { + accum.add(io_buffer.begin(), got, 8); + break; + } + } + } + +} diff --git a/src/libs/3rdparty/botan/src/entropy/dev_random/es_dev.h b/src/libs/3rdparty/botan/src/entropy/dev_random/es_dev.h new file mode 100644 index 00000000000..df9dbe1c1bd --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/dev_random/es_dev.h @@ -0,0 +1,53 @@ +/* +* /dev/random EntropySource +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENTROPY_SRC_DEVICE_H__ +#define BOTAN_ENTROPY_SRC_DEVICE_H__ + +#include +#include +#include + +namespace Botan { + +class BOTAN_DLL Device_EntropySource : public EntropySource + { + public: + std::string name() const { return "RNG Device Reader"; } + + void poll(Entropy_Accumulator& accum); + + Device_EntropySource(const std::vector& fsnames); + ~Device_EntropySource(); + private: + + /** + A class handling reading from a Unix character device + */ + class Device_Reader + { + public: + typedef int fd_type; + + // Does not own fd, a transient class + Device_Reader(fd_type device_fd) : fd(device_fd) {} + + void close(); + + u32bit get(byte out[], u32bit length, u32bit ms_wait_time); + + static fd_type open(const std::string& pathname); + private: + fd_type fd; + }; + + std::vector devices; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/entropy/dev_random/info.txt b/src/libs/3rdparty/botan/src/entropy/dev_random/info.txt new file mode 100644 index 00000000000..fddb7ac06c0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/dev_random/info.txt @@ -0,0 +1,28 @@ +realname "RNG Device Reader" + +define ENTROPY_SRC_DEVICE + +load_on auto +modset unix + + +es_dev.h +es_dev.cpp + + + +aix +beos +cygwin +darwin +freebsd +dragonfly +hpux +irix +linux +netbsd +openbsd +qnx +solaris +tru64 + diff --git a/src/libs/3rdparty/botan/src/entropy/egd/es_egd.cpp b/src/libs/3rdparty/botan/src/entropy/egd/es_egd.cpp new file mode 100644 index 00000000000..9e37f8f177b --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/egd/es_egd.cpp @@ -0,0 +1,156 @@ +/* +* EGD EntropySource +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#ifndef PF_LOCAL + #define PF_LOCAL PF_UNIX +#endif + +namespace Botan { + +EGD_EntropySource::EGD_Socket::EGD_Socket(const std::string& path) : + socket_path(path), m_fd(-1) + { + } + +/** +* Attempt a connection to an EGD/PRNGD socket +*/ +int EGD_EntropySource::EGD_Socket::open_socket(const std::string& path) + { + int fd = ::socket(PF_LOCAL, SOCK_STREAM, 0); + + if(fd >= 0) + { + sockaddr_un addr; + std::memset(&addr, 0, sizeof(addr)); + addr.sun_family = PF_LOCAL; + + if(sizeof(addr.sun_path) < path.length() + 1) + throw std::invalid_argument("EGD socket path is too long"); + + std::strcpy(addr.sun_path, path.c_str()); + + int len = sizeof(addr.sun_family) + std::strlen(addr.sun_path) + 1; + + if(::connect(fd, reinterpret_cast(&addr), len) < 0) + { + ::close(fd); + fd = -1; + } + } + + return fd; + } + +/** +* Attempt to read entropy from EGD +*/ +u32bit EGD_EntropySource::EGD_Socket::read(byte outbuf[], u32bit length) + { + if(length == 0) + return 0; + + if(m_fd < 0) + { + m_fd = open_socket(socket_path); + if(m_fd < 0) + return 0; + } + + try + { + // 1 == EGD command for non-blocking read + byte egd_read_command[2] = { + 1, static_cast(std::min(length, 255)) }; + + if(::write(m_fd, egd_read_command, 2) != 2) + throw std::runtime_error("Writing entropy read command to EGD failed"); + + byte out_len = 0; + if(::read(m_fd, &out_len, 1) != 1) + throw std::runtime_error("Reading response length from EGD failed"); + + if(out_len > egd_read_command[1]) + throw std::runtime_error("Bogus length field recieved from EGD"); + + ssize_t count = ::read(m_fd, outbuf, out_len); + + if(count != out_len) + throw std::runtime_error("Reading entropy result from EGD failed"); + + return static_cast(count); + } + catch(std::exception) + { + this->close(); + // Will attempt to reopen next poll + } + + return 0; + } + +void EGD_EntropySource::EGD_Socket::close() + { + if(m_fd > 0) + { + ::close(m_fd); + m_fd = -1; + } + } + +/** +* EGD_EntropySource constructor +*/ +EGD_EntropySource::EGD_EntropySource(const std::vector& paths) + { + for(size_t i = 0; i != paths.size(); ++i) + sockets.push_back(EGD_Socket(paths[i])); + } + +EGD_EntropySource::~EGD_EntropySource() + { + for(size_t i = 0; i != sockets.size(); ++i) + sockets[i].close(); + sockets.clear(); + } + +/** +* Gather Entropy from EGD +*/ +void EGD_EntropySource::poll(Entropy_Accumulator& accum) + { + u32bit go_get = std::min(accum.desired_remaining_bits() / 8, 32); + + MemoryRegion& io_buffer = accum.get_io_buffer(go_get); + + for(size_t i = 0; i != sockets.size(); ++i) + { + u32bit got = sockets[i].read(io_buffer.begin(), io_buffer.size()); + + if(got) + { + accum.add(io_buffer.begin(), got, 8); + break; + } + } + } + +} diff --git a/src/libs/3rdparty/botan/src/entropy/egd/es_egd.h b/src/libs/3rdparty/botan/src/entropy/egd/es_egd.h new file mode 100644 index 00000000000..5db65659d56 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/egd/es_egd.h @@ -0,0 +1,49 @@ +/** +* EGD EntropySource +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENTROPY_SRC_EGD_H__ +#define BOTAN_ENTROPY_SRC_EGD_H__ + +#include +#include +#include + +namespace Botan { + +/** +* EGD Entropy Source +*/ +class BOTAN_DLL EGD_EntropySource : public EntropySource + { + public: + std::string name() const { return "EGD/PRNGD"; } + + void poll(Entropy_Accumulator& accum); + + EGD_EntropySource(const std::vector&); + ~EGD_EntropySource(); + private: + class EGD_Socket + { + public: + EGD_Socket(const std::string& path); + + void close(); + u32bit read(byte outbuf[], u32bit length); + private: + static int open_socket(const std::string& path); + + std::string socket_path; + int m_fd; // cached fd + }; + + std::vector sockets; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/entropy/egd/info.txt b/src/libs/3rdparty/botan/src/entropy/egd/info.txt new file mode 100644 index 00000000000..85ba86c0043 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/egd/info.txt @@ -0,0 +1,32 @@ +realname "EGD Entropy Source" + +define ENTROPY_SRC_EGD + +load_on auto +modset unix + + +es_egd.h +es_egd.cpp + + + +solaris -> socket +qnx -> socket + + + +aix +cygwin +darwin +freebsd +dragonfly +hpux +irix +linux +netbsd +openbsd +qnx +solaris +tru64 + diff --git a/src/libs/3rdparty/botan/src/entropy/entropy_src.h b/src/libs/3rdparty/botan/src/entropy/entropy_src.h new file mode 100644 index 00000000000..a1a53fafb72 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/entropy_src.h @@ -0,0 +1,95 @@ +/** +* EntropySource +* (C) 2008-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENTROPY_SOURCE_BASE_H__ +#define BOTAN_ENTROPY_SOURCE_BASE_H__ + +#include +#include +#include + +namespace Botan { + +/** +* Class used to accumulate the poll results of EntropySources +*/ +class Entropy_Accumulator + { + public: + Entropy_Accumulator(u32bit goal) : + entropy_goal(goal), collected_bits(0) {} + + virtual ~Entropy_Accumulator() {} + + /** + @return cached I/O buffer for repeated polls + */ + MemoryRegion& get_io_buffer(u32bit size) + { io_buffer.create(size); return io_buffer; } + + u32bit bits_collected() const + { return static_cast(collected_bits); } + + bool polling_goal_achieved() const + { return (collected_bits >= entropy_goal); } + + u32bit desired_remaining_bits() const + { + if(collected_bits >= entropy_goal) + return 0; + return static_cast(entropy_goal - collected_bits); + } + + void add(const void* bytes, u32bit length, double entropy_bits_per_byte) + { + add_bytes(reinterpret_cast(bytes), length); + collected_bits += entropy_bits_per_byte * length; + } + + template + void add(const T& v, double entropy_bits_per_byte) + { + add(&v, sizeof(T), entropy_bits_per_byte); + } + private: + virtual void add_bytes(const byte bytes[], u32bit length) = 0; + + SecureVector io_buffer; + u32bit entropy_goal; + double collected_bits; + }; + +class Entropy_Accumulator_BufferedComputation : public Entropy_Accumulator + { + public: + Entropy_Accumulator_BufferedComputation(BufferedComputation& sink, + u32bit goal) : + Entropy_Accumulator(goal), entropy_sink(sink) {} + + private: + virtual void add_bytes(const byte bytes[], u32bit length) + { + entropy_sink.update(bytes, length); + } + + BufferedComputation& entropy_sink; + }; + +/** +* Abstract interface to a source of (hopefully unpredictable) system entropy +*/ +class BOTAN_DLL EntropySource + { + public: + virtual std::string name() const = 0; + virtual void poll(Entropy_Accumulator& accum) = 0; + virtual ~EntropySource() {} + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/entropy/info.txt b/src/libs/3rdparty/botan/src/entropy/info.txt new file mode 100644 index 00000000000..ec3be5f581e --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/info.txt @@ -0,0 +1,11 @@ +realname "Entropy Sources" + +load_on auto + + +entropy_src.h + + + +buf_comp + diff --git a/src/libs/3rdparty/botan/src/entropy/proc_walk/es_ftw.cpp b/src/libs/3rdparty/botan/src/entropy/proc_walk/es_ftw.cpp new file mode 100644 index 00000000000..2016f099a10 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/proc_walk/es_ftw.cpp @@ -0,0 +1,146 @@ +/* +* FTW EntropySource +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +#ifndef _POSIX_C_SOURCE + #define _POSIX_C_SOURCE 199309 +#endif + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +class Directory_Walker : public FTW_EntropySource::File_Descriptor_Source + { + public: + Directory_Walker(const std::string& root) { add_directory(root); } + ~Directory_Walker(); + + int next_fd(); + private: + void add_directory(const std::string&); + + std::deque > dirs; + }; + +void Directory_Walker::add_directory(const std::string& dirname) + { + DIR* dir = ::opendir(dirname.c_str()); + if(dir) + dirs.push_back(std::make_pair(dir, dirname)); + } + +Directory_Walker::~Directory_Walker() + { + while(dirs.size()) + { + ::closedir(dirs[0].first); + dirs.pop_front(); + } + } + +int Directory_Walker::next_fd() + { + while(dirs.size()) + { + std::pair dirinfo = dirs[0]; + + struct dirent* entry = ::readdir(dirinfo.first); + + if(!entry) + { + ::closedir(dirinfo.first); + dirs.pop_front(); + continue; + } + + const std::string filename = entry->d_name; + + if(filename == "." || filename == "..") + continue; + + const std::string full_path = dirinfo.second + '/' + filename; + + struct stat stat_buf; + if(::lstat(full_path.c_str(), &stat_buf) == -1) + continue; + + if(S_ISDIR(stat_buf.st_mode)) + add_directory(full_path); + else if(S_ISREG(stat_buf.st_mode) && (stat_buf.st_mode & S_IROTH)) + { + int fd = ::open(full_path.c_str(), O_RDONLY | O_NOCTTY); + + if(fd > 0) + return fd; + } + } + + return -1; + } + +} + +/** +* FTW_EntropySource Constructor +*/ +FTW_EntropySource::FTW_EntropySource(const std::string& p) : path(p) + { + dir = 0; + } + +/** +* FTW_EntropySource Destructor +*/ +FTW_EntropySource::~FTW_EntropySource() + { + delete dir; + } + +void FTW_EntropySource::poll(Entropy_Accumulator& accum) + { + const u32bit MAX_FILES_READ_PER_POLL = 1024; + + if(!dir) + dir = new Directory_Walker(path); + + MemoryRegion& io_buffer = accum.get_io_buffer(128); + + for(u32bit i = 0; i != MAX_FILES_READ_PER_POLL; ++i) + { + int fd = dir->next_fd(); + + // If we've exhaused this walk of the directory, halt the poll + if(fd == -1) + { + delete dir; + dir = 0; + break; + } + + ssize_t got = ::read(fd, io_buffer.begin(), io_buffer.size()); + ::close(fd); + + if(got > 0) + accum.add(io_buffer.begin(), got, .01); + + if(accum.polling_goal_achieved()) + break; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/entropy/proc_walk/es_ftw.h b/src/libs/3rdparty/botan/src/entropy/proc_walk/es_ftw.h new file mode 100644 index 00000000000..928a7b16ab8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/proc_walk/es_ftw.h @@ -0,0 +1,42 @@ +/* +* File Tree Walking EntropySource +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENTROPY_SRC_FTW_H__ +#define BOTAN_ENTROPY_SRC_FTW_H__ + +#include + +namespace Botan { + +/** +* File Tree Walking Entropy Source +*/ +class BOTAN_DLL FTW_EntropySource : public EntropySource + { + public: + std::string name() const { return "Proc Walker"; } + + void poll(Entropy_Accumulator& accum); + + FTW_EntropySource(const std::string& root_dir); + ~FTW_EntropySource(); + + class File_Descriptor_Source + { + public: + virtual int next_fd() = 0; + virtual ~File_Descriptor_Source() {} + }; + private: + + std::string path; + File_Descriptor_Source* dir; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/entropy/proc_walk/info.txt b/src/libs/3rdparty/botan/src/entropy/proc_walk/info.txt new file mode 100644 index 00000000000..db96ccdb823 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/proc_walk/info.txt @@ -0,0 +1,34 @@ +realname "File Tree Walking Entropy Source" + +define ENTROPY_SRC_FTW + +load_on auto +modset unix + + +es_ftw.h +es_ftw.cpp + + + +aix +cygwin +darwin +freebsd +dragonfly +hpux +irix +linux +openbsd +qnx +solaris +tru64 + +# Doesn't build on 2.0.2/x86 due to libc/libstdc++ header issues; no +# big deal since it has /dev/*random +#netbsd + + + +alloc + diff --git a/src/libs/3rdparty/botan/src/entropy/unix_procs/es_unix.cpp b/src/libs/3rdparty/botan/src/entropy/unix_procs/es_unix.cpp new file mode 100644 index 00000000000..fc5b026a4ea --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/unix_procs/es_unix.cpp @@ -0,0 +1,114 @@ +/* +* Unix EntropySource +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/** +* Sort ordering by priority +*/ +bool Unix_Program_Cmp(const Unix_Program& a, const Unix_Program& b) + { return (a.priority < b.priority); } + +} + +/** +* Unix_EntropySource Constructor +*/ +Unix_EntropySource::Unix_EntropySource(const std::vector& path) : + PATH(path) + { + add_default_sources(sources); + } + +/** +* Add sources to the list +*/ +void Unix_EntropySource::add_sources(const Unix_Program srcs[], u32bit count) + { + sources.insert(sources.end(), srcs, srcs + count); + std::sort(sources.begin(), sources.end(), Unix_Program_Cmp); + } + +/** +* Poll for entropy on a generic Unix system, first by grabbing various +* statistics (stat on common files, getrusage, etc), and then, if more +* is required, by exec'ing various programs like uname and rpcinfo and +* reading the output. +*/ +void Unix_EntropySource::poll(Entropy_Accumulator& accum) + { + const char* stat_targets[] = { + "/", + "/tmp", + "/var/tmp", + "/usr", + "/home", + "/etc/passwd", + ".", + "..", + 0 }; + + for(u32bit j = 0; stat_targets[j]; j++) + { + struct stat statbuf; + clear_mem(&statbuf, 1); + ::stat(stat_targets[j], &statbuf); + accum.add(&statbuf, sizeof(statbuf), .005); + } + + accum.add(::getpid(), 0); + accum.add(::getppid(), 0); + accum.add(::getuid(), 0); + accum.add(::geteuid(), 0); + accum.add(::getegid(), 0); + accum.add(::getpgrp(), 0); + accum.add(::getsid(0), 0); + + struct ::rusage usage; + ::getrusage(RUSAGE_SELF, &usage); + accum.add(usage, .005); + + ::getrusage(RUSAGE_CHILDREN, &usage); + accum.add(usage, .005); + + const u32bit MINIMAL_WORKING = 16; + + MemoryRegion& io_buffer = accum.get_io_buffer(DEFAULT_BUFFERSIZE); + + for(u32bit j = 0; j != sources.size(); j++) + { + DataSource_Command pipe(sources[j].name_and_args, PATH); + + u32bit got_from_src = 0; + + while(!pipe.end_of_data()) + { + u32bit got_this_loop = pipe.read(io_buffer, io_buffer.size()); + got_from_src += got_this_loop; + + accum.add(io_buffer.begin(), got_this_loop, .005); + } + + sources[j].working = (got_from_src >= MINIMAL_WORKING) ? true : false; + + if(accum.polling_goal_achieved()) + break; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/entropy/unix_procs/es_unix.h b/src/libs/3rdparty/botan/src/entropy/unix_procs/es_unix.h new file mode 100644 index 00000000000..1f8abb7849e --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/unix_procs/es_unix.h @@ -0,0 +1,39 @@ +/* +* Unix EntropySource +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENTROPY_SRC_UNIX_H__ +#define BOTAN_ENTROPY_SRC_UNIX_H__ + +#include +#include +#include + +namespace Botan { + +/** +* Unix Entropy Source +*/ +class BOTAN_DLL Unix_EntropySource : public EntropySource + { + public: + std::string name() const { return "Unix Entropy Source"; } + + void poll(Entropy_Accumulator& accum); + + void add_sources(const Unix_Program[], u32bit); + Unix_EntropySource(const std::vector& path); + private: + static void add_default_sources(std::vector&); + void fast_poll(Entropy_Accumulator& accum); + + const std::vector PATH; + std::vector sources; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/entropy/unix_procs/info.txt b/src/libs/3rdparty/botan/src/entropy/unix_procs/info.txt new file mode 100644 index 00000000000..928ec13b349 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/unix_procs/info.txt @@ -0,0 +1,33 @@ +realname "Generic Unix Entropy Source" + +define ENTROPY_SRC_UNIX +modset unix,beos + +load_on auto + + +es_unix.cpp +unix_src.cpp +unix_cmd.cpp +es_unix.h +unix_cmd.h + + + +aix +beos +cygwin +darwin +#freebsd +hpux +irix +linux +netbsd +qnx +solaris +tru64 + + + +filters + diff --git a/src/libs/3rdparty/botan/src/entropy/unix_procs/unix_cmd.cpp b/src/libs/3rdparty/botan/src/entropy/unix_procs/unix_cmd.cpp new file mode 100644 index 00000000000..1cae07e2673 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/unix_procs/unix_cmd.cpp @@ -0,0 +1,236 @@ +/* +* Unix Command Execution +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/** +* Attempt to execute the command +*/ +void do_exec(const std::vector& arg_list, + const std::vector& paths) + { + const u32bit args = arg_list.size() - 1; + + const char* arg1 = (args >= 1) ? arg_list[1].c_str() : 0; + const char* arg2 = (args >= 2) ? arg_list[2].c_str() : 0; + const char* arg3 = (args >= 3) ? arg_list[3].c_str() : 0; + const char* arg4 = (args >= 4) ? arg_list[4].c_str() : 0; + + for(u32bit j = 0; j != paths.size(); j++) + { + const std::string full_path = paths[j] + "/" + arg_list[0]; + const char* fsname = full_path.c_str(); + ::execl(fsname, fsname, arg1, arg2, arg3, arg4, NULL); + } + } + +} + +/** +* Local information about the pipe +*/ +struct pipe_wrapper + { + int fd; + pid_t pid; + pipe_wrapper() { fd = -1; pid = 0; } + }; + +/** +* Read from the pipe +*/ +u32bit DataSource_Command::read(byte buf[], u32bit length) + { + if(end_of_data()) + return 0; + + fd_set set; + FD_ZERO(&set); + FD_SET(pipe->fd, &set); + + struct ::timeval tv; + tv.tv_sec = 0; + tv.tv_usec = MAX_BLOCK_USECS; + + ssize_t got = 0; + if(::select(pipe->fd + 1, &set, 0, 0, &tv) == 1) + { + if(FD_ISSET(pipe->fd, &set)) + got = ::read(pipe->fd, buf, length); + } + + if(got <= 0) + { + shutdown_pipe(); + return 0; + } + + return static_cast(got); + } + +/** +* Peek at the pipe contents +*/ +u32bit DataSource_Command::peek(byte[], u32bit, u32bit) const + { + if(end_of_data()) + throw Invalid_State("DataSource_Command: Cannot peek when out of data"); + throw Stream_IO_Error("Cannot peek/seek on a command pipe"); + } + +/** +* Check if we reached EOF +*/ +bool DataSource_Command::end_of_data() const + { + return (pipe) ? false : true; + } + +/** +* Return the Unix file descriptor of the pipe +*/ +int DataSource_Command::fd() const + { + if(!pipe) + return -1; + return pipe->fd; + } + +/** +* Return a human-readable ID for this stream +*/ +std::string DataSource_Command::id() const + { + return "Unix command: " + arg_list[0]; + } + +/** +* Create the pipe +*/ +void DataSource_Command::create_pipe(const std::vector& paths) + { + bool found_something = false; + for(u32bit j = 0; j != paths.size(); j++) + { + const std::string full_path = paths[j] + "/" + arg_list[0]; + if(::access(full_path.c_str(), X_OK) == 0) + { + found_something = true; + break; + } + } + if(!found_something) + return; + + int pipe_fd[2]; + if(::pipe(pipe_fd) != 0) + return; + + pid_t pid = ::fork(); + + if(pid == -1) + { + ::close(pipe_fd[0]); + ::close(pipe_fd[1]); + } + else if(pid > 0) + { + pipe = new pipe_wrapper; + pipe->fd = pipe_fd[0]; + pipe->pid = pid; + ::close(pipe_fd[1]); + } + else + { + if(dup2(pipe_fd[1], STDOUT_FILENO) == -1) + ::exit(127); + if(close(pipe_fd[0]) != 0 || close(pipe_fd[1]) != 0) + ::exit(127); + if(close(STDERR_FILENO) != 0) + ::exit(127); + + do_exec(arg_list, paths); + ::exit(127); + } + } + +/** +* Shutdown the pipe +*/ +void DataSource_Command::shutdown_pipe() + { + if(pipe) + { + pid_t reaped = waitpid(pipe->pid, 0, WNOHANG); + + if(reaped == 0) + { + kill(pipe->pid, SIGTERM); + + struct ::timeval tv; + tv.tv_sec = 0; + tv.tv_usec = KILL_WAIT; + select(0, 0, 0, 0, &tv); + + reaped = ::waitpid(pipe->pid, 0, WNOHANG); + + if(reaped == 0) + { + ::kill(pipe->pid, SIGKILL); + do + reaped = ::waitpid(pipe->pid, 0, 0); + while(reaped == -1); + } + } + + ::close(pipe->fd); + delete pipe; + pipe = 0; + } + } + +/** +* DataSource_Command Constructor +*/ +DataSource_Command::DataSource_Command(const std::string& prog_and_args, + const std::vector& paths) : + MAX_BLOCK_USECS(100000), KILL_WAIT(10000) + { + arg_list = split_on(prog_and_args, ' '); + + if(arg_list.size() == 0) + throw Invalid_Argument("DataSource_Command: No command given"); + if(arg_list.size() > 5) + throw Invalid_Argument("DataSource_Command: Too many args"); + + pipe = 0; + create_pipe(paths); + } + +/** +* DataSource_Command Destructor +*/ +DataSource_Command::~DataSource_Command() + { + if(!end_of_data()) + shutdown_pipe(); + } + +} diff --git a/src/libs/3rdparty/botan/src/entropy/unix_procs/unix_cmd.h b/src/libs/3rdparty/botan/src/entropy/unix_procs/unix_cmd.h new file mode 100644 index 00000000000..aec189176d6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/unix_procs/unix_cmd.h @@ -0,0 +1,59 @@ +/** +* Unix Command Execution +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_UNIX_CMD_H__ +#define BOTAN_UNIX_CMD_H__ + +#include +#include +#include +#include + +namespace Botan { + +/** +* Unix Program Info +*/ +struct Unix_Program + { + Unix_Program(const char* n, u32bit p) + { name_and_args = n; priority = p; working = true; } + + std::string name_and_args; + u32bit priority; + bool working; + }; + +/** +* Command Output DataSource +*/ +class BOTAN_DLL DataSource_Command : public DataSource + { + public: + u32bit read(byte[], u32bit); + u32bit peek(byte[], u32bit, u32bit) const; + bool end_of_data() const; + std::string id() const; + + int fd() const; + + DataSource_Command(const std::string&, + const std::vector& paths); + ~DataSource_Command(); + private: + void create_pipe(const std::vector&); + void shutdown_pipe(); + + const u32bit MAX_BLOCK_USECS, KILL_WAIT; + + std::vector arg_list; + struct pipe_wrapper* pipe; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/entropy/unix_procs/unix_src.cpp b/src/libs/3rdparty/botan/src/entropy/unix_procs/unix_src.cpp new file mode 100644 index 00000000000..c843af6c2f1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/unix_procs/unix_src.cpp @@ -0,0 +1,61 @@ +/* +* Program List for Unix_EntropySource +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/** +* Default Commands for Entropy Gathering +*/ +void Unix_EntropySource::add_default_sources(std::vector& srcs) + { + srcs.push_back(Unix_Program("vmstat", 1)); + srcs.push_back(Unix_Program("vmstat -s", 1)); + srcs.push_back(Unix_Program("pfstat", 1)); + srcs.push_back(Unix_Program("netstat -in", 1)); + + srcs.push_back(Unix_Program("iostat", 2)); + srcs.push_back(Unix_Program("mpstat", 2)); + srcs.push_back(Unix_Program("nfsstat", 2)); + srcs.push_back(Unix_Program("portstat", 2)); + srcs.push_back(Unix_Program("arp -a -n", 2)); + srcs.push_back(Unix_Program("ifconfig -a", 2)); + srcs.push_back(Unix_Program("pstat -T", 2)); + srcs.push_back(Unix_Program("pstat -s", 2)); + srcs.push_back(Unix_Program("uname -a", 2)); + srcs.push_back(Unix_Program("uptime", 2)); + srcs.push_back(Unix_Program("ipcs -a", 2)); + srcs.push_back(Unix_Program("procinfo -a", 2)); + + srcs.push_back(Unix_Program("sysinfo", 3)); + srcs.push_back(Unix_Program("listarea", 3)); + srcs.push_back(Unix_Program("listdev", 3)); + + srcs.push_back(Unix_Program("who", 3)); + srcs.push_back(Unix_Program("finger", 3)); + srcs.push_back(Unix_Program("netstat -s", 3)); + srcs.push_back(Unix_Program("netstat -an", 3)); + srcs.push_back(Unix_Program("ps -A", 3)); + srcs.push_back(Unix_Program("mailstats", 3)); + srcs.push_back(Unix_Program("rpcinfo -p localhost", 3)); + + srcs.push_back(Unix_Program("dmesg", 4)); + srcs.push_back(Unix_Program("ls -alni /tmp", 4)); + srcs.push_back(Unix_Program("ls -alni /proc", 4)); + srcs.push_back(Unix_Program("df -l", 4)); + srcs.push_back(Unix_Program("last -5", 4)); + srcs.push_back(Unix_Program("pstat -f", 4)); + + srcs.push_back(Unix_Program("ps aux", 5)); + srcs.push_back(Unix_Program("ps -elf", 5)); + + srcs.push_back(Unix_Program("sar -A", 6)); + srcs.push_back(Unix_Program("lsof", 6)); + } + +} diff --git a/src/libs/3rdparty/botan/src/entropy/win32_stats/es_win32.cpp b/src/libs/3rdparty/botan/src/entropy/win32_stats/es_win32.cpp new file mode 100644 index 00000000000..a8e9e40f5e5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/win32_stats/es_win32.cpp @@ -0,0 +1,118 @@ +/** +* Win32 EntropySource +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/** +* Win32 poll using stats functions including Tooltip32 +*/ +void Win32_EntropySource::poll(Entropy_Accumulator& accum) + { + /* + First query a bunch of basic statistical stuff, though + don't count it for much in terms of contributed entropy. + */ + accum.add(GetTickCount(), 0); + accum.add(GetMessagePos(), 0); + accum.add(GetMessageTime(), 0); + accum.add(GetInputState(), 0); + accum.add(GetCurrentProcessId(), 0); + accum.add(GetCurrentThreadId(), 0); + + SYSTEM_INFO sys_info; + GetSystemInfo(&sys_info); + accum.add(sys_info, 1); + + MEMORYSTATUS mem_info; + GlobalMemoryStatus(&mem_info); + accum.add(mem_info, 1); + + POINT point; + GetCursorPos(&point); + accum.add(point, 1); + + GetCaretPos(&point); + accum.add(point, 1); + + LARGE_INTEGER perf_counter; + QueryPerformanceCounter(&perf_counter); + accum.add(perf_counter, 0); + + /* + Now use the Tooltip library to iterate throug various objects on + the system, including processes, threads, and heap objects. + */ + + HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); + +#define TOOLHELP32_ITER(DATA_TYPE, FUNC_FIRST, FUNC_NEXT) \ + if(!accum.polling_goal_achieved()) \ + { \ + DATA_TYPE info; \ + info.dwSize = sizeof(DATA_TYPE); \ + if(FUNC_FIRST(snapshot, &info)) \ + { \ + do \ + { \ + accum.add(info, 1); \ + } while(FUNC_NEXT(snapshot, &info)); \ + } \ + } + + TOOLHELP32_ITER(MODULEENTRY32, Module32First, Module32Next); + TOOLHELP32_ITER(PROCESSENTRY32, Process32First, Process32Next); + TOOLHELP32_ITER(THREADENTRY32, Thread32First, Thread32Next); + +#undef TOOLHELP32_ITER + + if(!accum.polling_goal_achieved()) + { + u32bit heap_lists_found = 0; + HEAPLIST32 heap_list; + heap_list.dwSize = sizeof(HEAPLIST32); + + const u32bit HEAP_LISTS_MAX = 32; + const u32bit HEAP_OBJS_PER_LIST = 128; + + if(Heap32ListFirst(snapshot, &heap_list)) + { + do + { + accum.add(heap_list, 1); + + if(++heap_lists_found > HEAP_LISTS_MAX) + break; + + u32bit heap_objs_found = 0; + HEAPENTRY32 heap_entry; + heap_entry.dwSize = sizeof(HEAPENTRY32); + if(Heap32First(&heap_entry, heap_list.th32ProcessID, + heap_list.th32HeapID)) + { + do + { + if(heap_objs_found++ > HEAP_OBJS_PER_LIST) + break; + accum.add(heap_entry, 1); + } while(Heap32Next(&heap_entry)); + } + + if(accum.polling_goal_achieved()) + break; + + } while(Heap32ListNext(snapshot, &heap_list)); + } + } + + CloseHandle(snapshot); + } + +} diff --git a/src/libs/3rdparty/botan/src/entropy/win32_stats/es_win32.h b/src/libs/3rdparty/botan/src/entropy/win32_stats/es_win32.h new file mode 100644 index 00000000000..0aa9054e3ab --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/win32_stats/es_win32.h @@ -0,0 +1,27 @@ +/** +* Win32 EntropySource +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENTROPY_SRC_WIN32_H__ +#define BOTAN_ENTROPY_SRC_WIN32_H__ + +#include + +namespace Botan { + +/** +* Win32 Entropy Source +*/ +class BOTAN_DLL Win32_EntropySource : public EntropySource + { + public: + std::string name() const { return "Win32 Statistics"; } + void poll(Entropy_Accumulator& accum); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/entropy/win32_stats/info.txt b/src/libs/3rdparty/botan/src/entropy/win32_stats/info.txt new file mode 100644 index 00000000000..ca71009238a --- /dev/null +++ b/src/libs/3rdparty/botan/src/entropy/win32_stats/info.txt @@ -0,0 +1,24 @@ +realname "Win32 Entropy Source" + +# Probably not much of an issue anymore +#note "This module will not run under NT4" + +define ENTROPY_SRC_WIN32 +modset win32 + +load_on auto + + +es_win32.h +es_win32.cpp + + + +windows +cygwin +mingw + + + +windows -> user32.lib + diff --git a/src/libs/3rdparty/botan/src/filters/algo_filt.cpp b/src/libs/3rdparty/botan/src/filters/algo_filt.cpp new file mode 100644 index 00000000000..23f7a20cfed --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/algo_filt.cpp @@ -0,0 +1,124 @@ +/* +* Filters +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* StreamCipher_Filter Constructor +*/ +StreamCipher_Filter::StreamCipher_Filter(const std::string& sc_name) : + buffer(DEFAULT_BUFFERSIZE) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + base_ptr = cipher = af.make_stream_cipher(sc_name); + } + +/* +* StreamCipher_Filter Constructor +*/ +StreamCipher_Filter::StreamCipher_Filter(StreamCipher* stream_cipher) : + buffer(DEFAULT_BUFFERSIZE) + { + base_ptr = cipher = stream_cipher; + } + +/* +* StreamCipher_Filter Constructor +*/ +StreamCipher_Filter::StreamCipher_Filter(const std::string& sc_name, + const SymmetricKey& key) : + buffer(DEFAULT_BUFFERSIZE) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + base_ptr = cipher = af.make_stream_cipher(sc_name); + cipher->set_key(key); + } + +/* +* Set the IV of a stream cipher +*/ +void StreamCipher_Filter::set_iv(const InitializationVector& iv) + { + cipher->resync(iv.begin(), iv.length()); + } + +/* +* Write data into a StreamCipher_Filter +*/ +void StreamCipher_Filter::write(const byte input[], u32bit length) + { + while(length) + { + u32bit copied = std::min(length, buffer.size()); + cipher->encrypt(input, buffer, copied); + send(buffer, copied); + input += copied; + length -= copied; + } + } + +/* +* Hash_Filter Constructor +*/ +Hash_Filter::Hash_Filter(const std::string& algo_spec, + u32bit len) : + OUTPUT_LENGTH(len) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + hash = af.make_hash_function(algo_spec); + } + +/* +* Complete a calculation by a Hash_Filter +*/ +void Hash_Filter::end_msg() + { + SecureVector output = hash->final(); + if(OUTPUT_LENGTH) + send(output, std::min(OUTPUT_LENGTH, output.size())); + else + send(output); + } + +/* +* MAC_Filter Constructor +*/ +MAC_Filter::MAC_Filter(const std::string& mac_name, u32bit len) : + OUTPUT_LENGTH(len) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + base_ptr = mac = af.make_mac(mac_name); + } + +/* +* MAC_Filter Constructor +*/ +MAC_Filter::MAC_Filter(const std::string& mac_name, const SymmetricKey& key, + u32bit len) : OUTPUT_LENGTH(len) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + base_ptr = mac = af.make_mac(mac_name); + mac->set_key(key); + } + +/* +* Complete a calculation by a MAC_Filter +*/ +void MAC_Filter::end_msg() + { + SecureVector output = mac->final(); + if(OUTPUT_LENGTH) + send(output, std::min(OUTPUT_LENGTH, output.size())); + else + send(output); + } + +} diff --git a/src/libs/3rdparty/botan/src/filters/basefilt.cpp b/src/libs/3rdparty/botan/src/filters/basefilt.cpp new file mode 100644 index 00000000000..02dbd8a737a --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/basefilt.cpp @@ -0,0 +1,74 @@ +/* +* Basic Filters +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Chain Constructor +*/ +Chain::Chain(Filter* f1, Filter* f2, Filter* f3, Filter* f4) + { + if(f1) { attach(f1); incr_owns(); } + if(f2) { attach(f2); incr_owns(); } + if(f3) { attach(f3); incr_owns(); } + if(f4) { attach(f4); incr_owns(); } + } + +/* +* Chain Constructor +*/ +Chain::Chain(Filter* filters[], u32bit count) + { + for(u32bit j = 0; j != count; ++j) + if(filters[j]) + { + attach(filters[j]); + incr_owns(); + } + } + +/* +* Fork Constructor +*/ +Fork::Fork(Filter* f1, Filter* f2, Filter* f3, Filter* f4) + { + Filter* filters[4] = { f1, f2, f3, f4 }; + set_next(filters, 4); + } + +/* +* Fork Constructor +*/ +Fork::Fork(Filter* filters[], u32bit count) + { + set_next(filters, count); + } + +/* +* Set the algorithm key +*/ +void Keyed_Filter::set_key(const SymmetricKey& key) + { + if(base_ptr) + base_ptr->set_key(key); + else + throw Invalid_State("Keyed_Filter::set_key: No base algorithm set"); + } + +/* +* Check if a keylength is valid +*/ +bool Keyed_Filter::valid_keylength(u32bit n) const + { + if(base_ptr) + return base_ptr->valid_keylength(n); + throw Invalid_State("Keyed_Filter::valid_keylength: No base algorithm set"); + } + +} diff --git a/src/libs/3rdparty/botan/src/filters/basefilt.h b/src/libs/3rdparty/botan/src/filters/basefilt.h new file mode 100644 index 00000000000..75625abb09c --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/basefilt.h @@ -0,0 +1,99 @@ +/* +* Basic Filters +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BASEFILT_H__ +#define BOTAN_BASEFILT_H__ + +#include +#include + +namespace Botan { + +/** +* This class represents Filter chains. A Filter chain is an ordered +* concatenation of Filters, the input to a Chain sequentially passes +* through all the Filters contained in the Chain. +*/ + +class BOTAN_DLL Chain : public Fanout_Filter + { + public: + void write(const byte input[], u32bit length) { send(input, length); } + + /** + * Construct a chain of up to four filters. The filters are set + * up in the same order as the arguments. + */ + Chain(Filter* = 0, Filter* = 0, Filter* = 0, Filter* = 0); + + /** + * Construct a chain from range of filters + * @param filter_arr the list of filters + * @param length how many filters + */ + Chain(Filter* filter_arr[], u32bit length); + }; + +/** +* This class represents a fork filter, whose purpose is to fork the +* flow of data. It causes an input message to result in n messages at +* the end of the filter, where n is the number of forks. +*/ +class BOTAN_DLL Fork : public Fanout_Filter + { + public: + void write(const byte input[], u32bit length) { send(input, length); } + void set_port(u32bit n) { Fanout_Filter::set_port(n); } + + /** + * Construct a Fork filter with up to four forks. + */ + Fork(Filter*, Filter*, Filter* = 0, Filter* = 0); + + /** + * Construct a Fork from range of filters + * @param filter_arr the list of filters + * @param length how many filters + */ + Fork(Filter* filter_arr[], u32bit length); + }; + +/** +* This class represents keyed filters, i.e. filters that have to be +* fed with a key in order to function. +*/ +class BOTAN_DLL Keyed_Filter : public Filter + { + public: + + /** + * Set the key of this filter. + * @param key the key to set + */ + virtual void set_key(const SymmetricKey& key); + + /** + * Set the initialization vector of this filter. + * @param iv the initialization vector to set + */ + virtual void set_iv(const InitializationVector&) {} + + /** + * Check whether a key length is valid for this filter. + * @param length the key length to be checked for validity + * @return true if the key length is valid, false otherwise + */ + virtual bool valid_keylength(u32bit length) const; + + Keyed_Filter() { base_ptr = 0; } + protected: + SymmetricAlgorithm* base_ptr; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/filters/buf_filt.cpp b/src/libs/3rdparty/botan/src/filters/buf_filt.cpp new file mode 100644 index 00000000000..53352b54a44 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/buf_filt.cpp @@ -0,0 +1,71 @@ +/* +* Buffering Filter +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Buffering_Filter Constructor +*/ +Buffering_Filter::Buffering_Filter(u32bit b, u32bit i) : INITIAL_BLOCK_SIZE(i), + BLOCK_SIZE(b) + { + initial_block_pos = block_pos = 0; + initial.create(INITIAL_BLOCK_SIZE); + block.create(BLOCK_SIZE); + } + +/* +* Reset the Buffering Filter +*/ +void Buffering_Filter::end_msg() + { + if(initial_block_pos != INITIAL_BLOCK_SIZE) + throw Exception("Buffering_Filter: Not enough data for first block"); + final_block(block, block_pos); + initial_block_pos = block_pos = 0; + initial.clear(); + block.clear(); + } + +/* +* Buffer input into blocks +*/ +void Buffering_Filter::write(const byte input[], u32bit length) + { + if(initial_block_pos != INITIAL_BLOCK_SIZE) + { + u32bit copied = std::min(INITIAL_BLOCK_SIZE - initial_block_pos, length); + initial.copy(initial_block_pos, input, copied); + input += copied; + length -= copied; + initial_block_pos += copied; + if(initial_block_pos == INITIAL_BLOCK_SIZE) + initial_block(initial); + } + block.copy(block_pos, input, length); + if(block_pos + length >= BLOCK_SIZE) + { + main_block(block); + input += (BLOCK_SIZE - block_pos); + length -= (BLOCK_SIZE - block_pos); + while(length >= BLOCK_SIZE) + { + main_block(input); + input += BLOCK_SIZE; + length -= BLOCK_SIZE; + } + block.copy(input, length); + block_pos = 0; + } + block_pos += length; + } + +} diff --git a/src/libs/3rdparty/botan/src/filters/buf_filt.h b/src/libs/3rdparty/botan/src/filters/buf_filt.h new file mode 100644 index 00000000000..ce3dbc926b8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/buf_filt.h @@ -0,0 +1,39 @@ +/* +* Buffering Filter +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BUFFERING_FILTER_H__ +#define BOTAN_BUFFERING_FILTER_H__ + +#include + +namespace Botan { + +/** +* Buffering_Filter: This class represents filters for operations that +* maintain an internal state. +*/ + +class BOTAN_DLL Buffering_Filter : public Filter + { + public: + void write(const byte[], u32bit); + virtual void end_msg(); + Buffering_Filter(u32bit, u32bit = 0); + virtual ~Buffering_Filter() {} + protected: + virtual void initial_block(const byte[]) {} + virtual void main_block(const byte[]) = 0; + virtual void final_block(const byte[], u32bit) = 0; + private: + const u32bit INITIAL_BLOCK_SIZE, BLOCK_SIZE; + SecureVector initial, block; + u32bit initial_block_pos, block_pos; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/filters/data_snk.cpp b/src/libs/3rdparty/botan/src/filters/data_snk.cpp new file mode 100644 index 00000000000..f8ee9f86e45 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/data_snk.cpp @@ -0,0 +1,62 @@ +/* +* DataSink +* (C) 1999-2007 Jack Lloyd +* 2005 Matthew Gregan +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Write to a stream +*/ +void DataSink_Stream::write(const byte out[], u32bit length) + { + sink->write(reinterpret_cast(out), length); + if(!sink->good()) + throw Stream_IO_Error("DataSink_Stream: Failure writing to " + + identifier); + } + +/* +* DataSink_Stream Constructor +*/ +DataSink_Stream::DataSink_Stream(std::ostream& out, + const std::string& name) : + identifier(name != "" ? name : ""), owner(false) + { + sink = &out; + } + +/* +* DataSink_Stream Constructor +*/ +DataSink_Stream::DataSink_Stream(const std::string& path, + bool use_binary) : + identifier(path), owner(true) + { + if(use_binary) + sink = new std::ofstream(path.c_str(), std::ios::binary); + else + sink = new std::ofstream(path.c_str()); + + if(!sink->good()) + throw Stream_IO_Error("DataSink_Stream: Failure opening " + path); + } + +/* +* DataSink_Stream Destructor +*/ +DataSink_Stream::~DataSink_Stream() + { + if(owner) + delete sink; + sink = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/filters/data_snk.h b/src/libs/3rdparty/botan/src/filters/data_snk.h new file mode 100644 index 00000000000..61ddf6e0d84 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/data_snk.h @@ -0,0 +1,65 @@ +/* +* DataSink +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DATA_SINK_H__ +#define BOTAN_DATA_SINK_H__ + +#include +#include + +namespace Botan { + +/** +* This class represents abstract data sink objects. +*/ +class BOTAN_DLL DataSink : public Filter + { + public: + bool attachable() { return false; } + DataSink() {} + virtual ~DataSink() {} + private: + DataSink& operator=(const DataSink&) { return (*this); } + DataSink(const DataSink&); + }; + +/** +* This class represents a data sink which writes its output to a stream. +*/ +class BOTAN_DLL DataSink_Stream : public DataSink + { + public: + void write(const byte[], u32bit); + + /** + * Construct a DataSink_Stream from a stream. + * @param stream the stream to write to + * @param name identifier + */ + DataSink_Stream(std::ostream& stream, + const std::string& name = ""); + + /** + * Construct a DataSink_Stream from a stream. + * @param file the name of the file to open a stream to + * @param use_binary indicates whether to treat the file + * as a binary file or not + */ + DataSink_Stream(const std::string& filename, + bool use_binary = false); + + ~DataSink_Stream(); + private: + const std::string identifier; + const bool owner; + + std::ostream* sink; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/filters/data_src.cpp b/src/libs/3rdparty/botan/src/filters/data_src.cpp new file mode 100644 index 00000000000..e6387c4ba39 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/data_src.cpp @@ -0,0 +1,207 @@ +/* +* DataSource +* (C) 1999-2007 Jack Lloyd +* 2005 Matthew Gregan +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +#include +#include + +namespace Botan { + +/* +* Read a single byte from the DataSource +*/ +u32bit DataSource::read_byte(byte& out) + { + return read(&out, 1); + } + +/* +* Peek a single byte from the DataSource +*/ +u32bit DataSource::peek_byte(byte& out) const + { + return peek(&out, 1, 0); + } + +/* +* Discard the next N bytes of the data +*/ +u32bit DataSource::discard_next(u32bit n) + { + u32bit discarded = 0; + byte dummy; + for(u32bit j = 0; j != n; ++j) + discarded += read_byte(dummy); + return discarded; + } + +/* +* Read from a memory buffer +*/ +u32bit DataSource_Memory::read(byte out[], u32bit length) + { + u32bit got = std::min(source.size() - offset, length); + copy_mem(out, source + offset, got); + offset += got; + return got; + } + +/* +* Peek into a memory buffer +*/ +u32bit DataSource_Memory::peek(byte out[], u32bit length, + u32bit peek_offset) const + { + const u32bit bytes_left = source.size() - offset; + if(peek_offset >= bytes_left) return 0; + + u32bit got = std::min(bytes_left - peek_offset, length); + copy_mem(out, source + offset + peek_offset, got); + return got; + } + +/* +* Check if the memory buffer is empty +*/ +bool DataSource_Memory::end_of_data() const + { + return (offset == source.size()); + } + +/* +* DataSource_Memory Constructor +*/ +DataSource_Memory::DataSource_Memory(const byte in[], u32bit length) + { + source.set(in, length); + offset = 0; + } + +/* +* DataSource_Memory Constructor +*/ +DataSource_Memory::DataSource_Memory(const MemoryRegion& in) + { + source = in; + offset = 0; + } + +/* +* DataSource_Memory Constructor +*/ +DataSource_Memory::DataSource_Memory(const std::string& in) + { + source.set(reinterpret_cast(in.data()), in.length()); + offset = 0; + } + +/* +* Read from a stream +*/ +u32bit DataSource_Stream::read(byte out[], u32bit length) + { + source->read(reinterpret_cast(out), length); + if(source->bad()) + throw Stream_IO_Error("DataSource_Stream::read: Source failure"); + + u32bit got = source->gcount(); + total_read += got; + return got; + } + +/* +* Peek into a stream +*/ +u32bit DataSource_Stream::peek(byte out[], u32bit length, u32bit offset) const + { + if(end_of_data()) + throw Invalid_State("DataSource_Stream: Cannot peek when out of data"); + + u32bit got = 0; + + if(offset) + { + SecureVector buf(offset); + source->read(reinterpret_cast(buf.begin()), buf.size()); + if(source->bad()) + throw Stream_IO_Error("DataSource_Stream::peek: Source failure"); + got = source->gcount(); + } + + if(got == offset) + { + source->read(reinterpret_cast(out), length); + if(source->bad()) + throw Stream_IO_Error("DataSource_Stream::peek: Source failure"); + got = source->gcount(); + } + + if(source->eof()) + source->clear(); + source->seekg(total_read, std::ios::beg); + + return got; + } + +/* +* Check if the stream is empty or in error +*/ +bool DataSource_Stream::end_of_data() const + { + return (!source->good()); + } + +/* +* Return a human-readable ID for this stream +*/ +std::string DataSource_Stream::id() const + { + return identifier; + } + +/* +* DataSource_Stream Constructor +*/ +DataSource_Stream::DataSource_Stream(const std::string& path, + bool use_binary) : + identifier(path), owner(true) + { + if(use_binary) + source = new std::ifstream(path.c_str(), std::ios::binary); + else + source = new std::ifstream(path.c_str()); + + if(!source->good()) + throw Stream_IO_Error("DataSource: Failure opening file " + path); + + total_read = 0; + } + +/* +* DataSource_Stream Constructor +*/ +DataSource_Stream::DataSource_Stream(std::istream& in, + const std::string& name) : + identifier(name), owner(false) + { + source = ∈ + total_read = 0; + } + +/* +* DataSource_Stream Destructor +*/ +DataSource_Stream::~DataSource_Stream() + { + if(owner) + delete source; + } + +} diff --git a/src/libs/3rdparty/botan/src/filters/data_src.h b/src/libs/3rdparty/botan/src/filters/data_src.h new file mode 100644 index 00000000000..e16217e0fbb --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/data_src.h @@ -0,0 +1,150 @@ +/* +* DataSource +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DATA_SRC_H__ +#define BOTAN_DATA_SRC_H__ + +#include +#include +#include + +namespace Botan { + +/** +* This class represents an abstract data source object. +*/ +class BOTAN_DLL DataSource + { + public: + /** + * Read from the source. Moves the internal offset so that + * every call to read will return a new portion of the source. + * @param out the byte array to write the result to + * @param length the length of the byte array out + * @return the length in bytes that was actually read and put + * into out + */ + virtual u32bit read(byte out[], u32bit length) = 0; + + /** + * Read from the source but do not modify the internal offset. Consecutive + * calls to peek() will return portions of the source starting at the same + * position. + * @param out the byte array to write the output to + * @param length the length of the byte array out + * @return the length in bytes that was actually read and put + * into out + */ + virtual u32bit peek(byte out[], u32bit length, + u32bit peek_offset) const = 0; + + /** + * Test whether the source still has data that can be read. + * @return true if there is still data to read, false otherwise + */ + virtual bool end_of_data() const = 0; + /** + * return the id of this data source + * @return the std::string representing the id of this data source + */ + virtual std::string id() const { return ""; } + + /** + * Read one byte. + * @param the byte to read to + * @return the length in bytes that was actually read and put + * into out + */ + u32bit read_byte(byte& out); + + /** + * Peek at one byte. + * @param the byte to read to + * @return the length in bytes that was actually read and put + * into out + */ + u32bit peek_byte(byte& out) const; + + /** + * Discard the next N bytes of the data + * @param N the number of bytes to discard + * @return the number of bytes actually discarded + */ + u32bit discard_next(u32bit N); + + DataSource() {} + virtual ~DataSource() {} + private: + DataSource& operator=(const DataSource&) { return (*this); } + DataSource(const DataSource&); + }; + +/** +* This class represents a Memory-Based DataSource +*/ +class BOTAN_DLL DataSource_Memory : public DataSource + { + public: + u32bit read(byte[], u32bit); + u32bit peek(byte[], u32bit, u32bit) const; + bool end_of_data() const; + + /** + * Construct a memory source that reads from a string + * @param in the string to read from + */ + DataSource_Memory(const std::string& in); + + /** + * Construct a memory source that reads from a byte array + * @param in the byte array to read from + * @param length the length of the byte array + */ + DataSource_Memory(const byte in[], u32bit length); + + /** + * Construct a memory source that reads from a MemoryRegion + * @param in the MemoryRegion to read from + */ + DataSource_Memory(const MemoryRegion& in); + private: + SecureVector source; + u32bit offset; + }; + +/** +* This class represents a Stream-Based DataSource. +*/ +class BOTAN_DLL DataSource_Stream : public DataSource + { + public: + u32bit read(byte[], u32bit); + u32bit peek(byte[], u32bit, u32bit) const; + bool end_of_data() const; + std::string id() const; + + DataSource_Stream(std::istream&, const std::string& id = ""); + + /** + * Construct a Stream-Based DataSource from file + * @param file the name of the file + * @param use_binary whether to treat the file as binary or not + */ + DataSource_Stream(const std::string& file, bool use_binary = false); + + ~DataSource_Stream(); + private: + const std::string identifier; + const bool owner; + + std::istream* source; + u32bit total_read; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/filters/fd_unix/fd_unix.cpp b/src/libs/3rdparty/botan/src/filters/fd_unix/fd_unix.cpp new file mode 100644 index 00000000000..7f19b0aeb69 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/fd_unix/fd_unix.cpp @@ -0,0 +1,53 @@ +/* +* Pipe I/O for Unix +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Write data from a pipe into a Unix fd +*/ +int operator<<(int fd, Pipe& pipe) + { + SecureVector buffer(DEFAULT_BUFFERSIZE); + while(pipe.remaining()) + { + u32bit got = pipe.read(buffer, buffer.size()); + u32bit position = 0; + while(got) + { + ssize_t ret = write(fd, buffer + position, got); + if(ret == -1) + throw Stream_IO_Error("Pipe output operator (unixfd) has failed"); + position += ret; + got -= ret; + } + } + return fd; + } + +/* +* Read data from a Unix fd into a pipe +*/ +int operator>>(int fd, Pipe& pipe) + { + SecureVector buffer(DEFAULT_BUFFERSIZE); + while(true) + { + ssize_t ret = read(fd, buffer, buffer.size()); + if(ret == 0) break; + if(ret == -1) + throw Stream_IO_Error("Pipe input operator (unixfd) has failed"); + pipe.write(buffer, ret); + } + return fd; + } + +} diff --git a/src/libs/3rdparty/botan/src/filters/fd_unix/fd_unix.h b/src/libs/3rdparty/botan/src/filters/fd_unix/fd_unix.h new file mode 100644 index 00000000000..0aed0092c22 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/fd_unix/fd_unix.h @@ -0,0 +1,23 @@ +/* +* Pipe I/O for Unix +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PIPE_UNIXFD_H__ +#define BOTAN_PIPE_UNIXFD_H__ + +#include + +namespace Botan { + +/* +* Unix I/O Operators for Pipe +*/ +int operator<<(int, Pipe&); +int operator>>(int, Pipe&); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/filters/fd_unix/info.txt b/src/libs/3rdparty/botan/src/filters/fd_unix/info.txt new file mode 100644 index 00000000000..d87978cb065 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/fd_unix/info.txt @@ -0,0 +1,28 @@ +realname "Unix I/O support for Pipe" + +define PIPE_UNIXFD_IO +modset unix,beos + +load_on auto + + +fd_unix.h +fd_unix.cpp + + + +aix +beos +cygwin +darwin +freebsd +dragonfly +hpux +irix +linux +netbsd +openbsd +qnx +solaris +tru64 + diff --git a/src/libs/3rdparty/botan/src/filters/filter.cpp b/src/libs/3rdparty/botan/src/filters/filter.cpp new file mode 100644 index 00000000000..4bf0ef912fb --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/filter.cpp @@ -0,0 +1,127 @@ +/* +* Filter +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Filter Constructor +*/ +Filter::Filter() + { + next.resize(1); + port_num = 0; + filter_owns = 0; + owned = false; + } + +/* +* Send data to all ports +*/ +void Filter::send(const byte input[], u32bit length) + { + bool nothing_attached = true; + for(u32bit j = 0; j != total_ports(); ++j) + if(next[j]) + { + if(write_queue.has_items()) + next[j]->write(write_queue, write_queue.size()); + next[j]->write(input, length); + nothing_attached = false; + } + if(nothing_attached) + write_queue.append(input, length); + else if(write_queue.has_items()) + write_queue.destroy(); + } + +/* +* Start a new message +*/ +void Filter::new_msg() + { + start_msg(); + for(u32bit j = 0; j != total_ports(); ++j) + if(next[j]) + next[j]->new_msg(); + } + +/* +* End the current message +*/ +void Filter::finish_msg() + { + end_msg(); + for(u32bit j = 0; j != total_ports(); ++j) + if(next[j]) + next[j]->finish_msg(); + } + +/* +* Attach a filter to the current port +*/ +void Filter::attach(Filter* new_filter) + { + if(new_filter) + { + Filter* last = this; + while(last->get_next()) + last = last->get_next(); + last->next[last->current_port()] = new_filter; + } + } + +/* +* Set the active port on a filter +*/ +void Filter::set_port(u32bit new_port) + { + if(new_port >= total_ports()) + throw Invalid_Argument("Filter: Invalid port number"); + port_num = new_port; + } + +/* +* Return the next Filter in the logical chain +*/ +Filter* Filter::get_next() const + { + if(port_num < next.size()) + return next[port_num]; + return 0; + } + +/* +* Set the next Filters +*/ +void Filter::set_next(Filter* filters[], u32bit size) + { + while(size && filters && filters[size-1] == 0) + --size; + + next.clear(); + next.resize(size); + + port_num = 0; + filter_owns = 0; + + for(u32bit j = 0; j != size; ++j) + next[j] = filters[j]; + } + +/* +* Return the total number of ports +*/ +u32bit Filter::total_ports() const + { + return next.size(); + } + +} diff --git a/src/libs/3rdparty/botan/src/filters/filter.h b/src/libs/3rdparty/botan/src/filters/filter.h new file mode 100644 index 00000000000..b13a36650cc --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/filter.h @@ -0,0 +1,113 @@ +/* +* Filter +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_FILTER_H__ +#define BOTAN_FILTER_H__ + +#include +#include + +namespace Botan { + +/** +* This class represents general abstract filter objects. +*/ +class BOTAN_DLL Filter + { + public: + + /** + * Write a portion of a message to this filter. + * @param input the input as a byte array + * @param length the length of the byte array input + */ + virtual void write(const byte input[], u32bit length) = 0; + + /** + * Start a new message. Must be closed by end_msg() before another + * message can be startet. + */ + virtual void start_msg() {} + + /** + * Tell the Filter that the current message shall be ended. + */ + virtual void end_msg() {} + + /** + * Check whether this filter is an attachable filter. + * @return true if this filter is attachable, false otherwise + */ + virtual bool attachable() { return true; } + + /** + * Start a new message in *this and all following filters. Only for + * internal use, not intended for use in client applications. + */ + void new_msg(); + + /** + * End a new message in *this and all following filters. Only for + * internal use, not intended for use in client applications. + */ + void finish_msg(); + + virtual ~Filter() {} + protected: + void send(const byte[], u32bit); + void send(byte input) { send(&input, 1); } + void send(const MemoryRegion& in) { send(in.begin(), in.size()); } + Filter(); + private: + Filter(const Filter&) {} + Filter& operator=(const Filter&) { return (*this); } + + friend class Pipe; + friend class Fanout_Filter; + + u32bit total_ports() const; + u32bit current_port() const { return port_num; } + void set_port(u32bit); + + u32bit owns() const { return filter_owns; } + + void attach(Filter*); + void set_next(Filter*[], u32bit); + Filter* get_next() const; + + SecureVector write_queue; + std::vector next; + u32bit port_num, filter_owns; + + // true if filter belongs to a pipe --> prohibit filter sharing! + bool owned; + }; + +/** +* This is the abstract Fanout_Filter base class. +**/ +class BOTAN_DLL Fanout_Filter : public Filter + { + protected: + void incr_owns() { ++filter_owns; } + + void set_port(u32bit n) { Filter::set_port(n); } + void set_next(Filter* f[], u32bit n) { Filter::set_next(f, n); } + void attach(Filter* f) { Filter::attach(f); } + }; + +/** +* The type of checking to be performed by decoders: +* NONE - no checks, IGNORE_WS - perform checks, but ignore +* whitespaces, FULL_CHECK - perform checks, also complain +* about white spaces. +*/ +enum Decoder_Checking { NONE, IGNORE_WS, FULL_CHECK }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/filters/filters.h b/src/libs/3rdparty/botan/src/filters/filters.h new file mode 100644 index 00000000000..725651f7de6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/filters.h @@ -0,0 +1,189 @@ +/* +* Filters +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_FILTERS_H__ +#define BOTAN_FILTERS_H__ + +#include +#include +#include +#include + +#include +#include +#include +#include + +#if defined(BOTAN_HAS_BASE64_CODEC) + #include +#endif + +#if defined(BOTAN_HAS_HEX_CODEC) + #include +#endif + +namespace Botan { + +/** +* Stream Cipher Filter. +*/ +class BOTAN_DLL StreamCipher_Filter : public Keyed_Filter + { + public: + + /** + * Seek in the stream. + * @param position the position to seek ahead + */ + void seek(u32bit position) { cipher->seek(position); } + + /** + * Find out whether the cipher underlying this filter supports + * resyncing. + * @return true if the cipher supports resyncing + */ + bool supports_resync() const { return (cipher->IV_LENGTH != 0); } + + /** + * Set the initialization vector for this filter. + * @param iv the initialization vector to set + */ + void set_iv(const InitializationVector& iv); + void write(const byte[], u32bit); + + /** + * Construct a stream cipher filter. + * @param cipher_obj a cipher object to use + */ + StreamCipher_Filter(StreamCipher* cipher_obj); + + /** + * Construct a stream cipher filter. + * @param cipher the name of the desired cipher + */ + StreamCipher_Filter(const std::string& cipher); + + /** + * Construct a stream cipher filter. + * @param cipher the name of the desired cipher + * @param key the key to use inside this filter + */ + StreamCipher_Filter(const std::string& cipher, const SymmetricKey& key); + + ~StreamCipher_Filter() { delete cipher; } + private: + SecureVector buffer; + StreamCipher* cipher; + }; + +/** +* Hash Filter. +*/ +class BOTAN_DLL Hash_Filter : public Filter + { + public: + void write(const byte input[], u32bit len) { hash->update(input, len); } + void end_msg(); + + /** + * Construct a hash filter. + * @param hash_fun the hash function to use + * @param len the output length of this filter. Leave the default + * value 0 if you want to use the full output of the hashfunction + * hash. Otherwise, specify a smaller value here so that the + * output of the hash algorithm will be cut off. + */ + Hash_Filter(HashFunction* hash_fun, u32bit len = 0) : + OUTPUT_LENGTH(len), hash(hash_fun) {} + + /** + * Construct a hash filter. + * @param request the name of the hash algorithm to use + * @param len the output length of this filter. Leave the default + * value 0 if you want to use the full output of the hashfunction + * hash. Otherwise, specify a smaller value here so that the + * output of the hash algorithm will be cut off. + */ + Hash_Filter(const std::string& request, u32bit len = 0); + + ~Hash_Filter() { delete hash; } + private: + const u32bit OUTPUT_LENGTH; + HashFunction* hash; + }; + +/** +* MessageAuthenticationCode Filter. +*/ +class BOTAN_DLL MAC_Filter : public Keyed_Filter + { + public: + void write(const byte input[], u32bit len) { mac->update(input, len); } + void end_msg(); + + /** + * Construct a MAC filter. The MAC key will be left empty. + * @param mac the MAC to use + * @param len the output length of this filter. Leave the default + * value 0 if you want to use the full output of the + * MAC. Otherwise, specify a smaller value here so that the + * output of the MAC will be cut off. + */ + MAC_Filter(MessageAuthenticationCode* mac_obj, + u32bit out_len = 0) : OUTPUT_LENGTH(out_len) + { + base_ptr = mac = mac_obj; + } + + /** + * Construct a MAC filter. + * @param mac the MAC to use + * @param key the MAC key to use + * @param len the output length of this filter. Leave the default + * value 0 if you want to use the full output of the + * MAC. Otherwise, specify a smaller value here so that the + * output of the MAC will be cut off. + */ + MAC_Filter(MessageAuthenticationCode* mac_obj, + const SymmetricKey& key, + u32bit out_len = 0) : OUTPUT_LENGTH(out_len) + { + base_ptr = mac = mac_obj; + mac->set_key(key); + } + + /** + * Construct a MAC filter. The MAC key will be left empty. + * @param mac the name of the MAC to use + * @param len the output length of this filter. Leave the default + * value 0 if you want to use the full output of the + * MAC. Otherwise, specify a smaller value here so that the + * output of the MAC will be cut off. + */ + MAC_Filter(const std::string& mac, u32bit len = 0); + + /** + * Construct a MAC filter. + * @param mac the name of the MAC to use + * @param key the MAC key to use + * @param len the output length of this filter. Leave the default + * value 0 if you want to use the full output of the + * MAC. Otherwise, specify a smaller value here so that the + * output of the MAC will be cut off. + */ + MAC_Filter(const std::string& mac, const SymmetricKey& key, + u32bit len = 0); + + ~MAC_Filter() { delete mac; } + private: + const u32bit OUTPUT_LENGTH; + MessageAuthenticationCode* mac; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/filters/info.txt b/src/libs/3rdparty/botan/src/filters/info.txt new file mode 100644 index 00000000000..79a92a9c545 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/info.txt @@ -0,0 +1,41 @@ +realname "Pipe/Filter" + +load_on auto + +define FILTERS + + +algo_filt.cpp +basefilt.cpp +basefilt.h +buf_filt.cpp +buf_filt.h +data_snk.cpp +data_snk.h +data_src.cpp +data_src.h +filter.cpp +filter.h +filters.h +out_buf.cpp +out_buf.h +pbe.h +pipe.cpp +pipe.h +pipe_io.cpp +pipe_rw.cpp +secqueue.cpp +secqueue.h + + + +alloc +asn1 +block +hash +libstate +mac +rng +stream +sym_algo + diff --git a/src/libs/3rdparty/botan/src/filters/out_buf.cpp b/src/libs/3rdparty/botan/src/filters/out_buf.cpp new file mode 100644 index 00000000000..6002f4fefb3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/out_buf.cpp @@ -0,0 +1,119 @@ +/* +* Pipe Output Buffer Source file +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Read data from a message +*/ +u32bit Output_Buffers::read(byte output[], u32bit length, + Pipe::message_id msg) + { + SecureQueue* q = get(msg); + if(q) + return q->read(output, length); + return 0; + } + +/* +* Peek at data in a message +*/ +u32bit Output_Buffers::peek(byte output[], u32bit length, + u32bit stream_offset, + Pipe::message_id msg) const + { + SecureQueue* q = get(msg); + if(q) + return q->peek(output, length, stream_offset); + return 0; + } + +/* +* Check available bytes in a message +*/ +u32bit Output_Buffers::remaining(Pipe::message_id msg) const + { + SecureQueue* q = get(msg); + if(q) + return q->size(); + return 0; + } + +/* +* Add a new output queue +*/ +void Output_Buffers::add(SecureQueue* queue) + { + if(!queue) + throw Internal_Error("Output_Buffers::add: Argument was NULL"); + + if(buffers.size() == buffers.max_size()) + throw Internal_Error("Output_Buffers::add: No more room in container"); + + buffers.push_back(queue); + } + +/* +* Retire old output queues +*/ +void Output_Buffers::retire() + { + while(buffers.size()) + { + if(buffers[0] == 0 || buffers[0]->size() == 0) + { + delete buffers[0]; + buffers.pop_front(); + offset = offset + Pipe::message_id(1); + } + else + break; + } + } + +/* +* Get a particular output queue +*/ +SecureQueue* Output_Buffers::get(Pipe::message_id msg) const + { + if(msg < offset) + return 0; + if(msg > message_count()) + throw Internal_Error("Output_Buffers::get: msg > size"); + + return buffers[msg-offset]; + } + +/* +* Return the total number of messages +*/ +Pipe::message_id Output_Buffers::message_count() const + { + return (offset + buffers.size()); + } + +/* +* Output_Buffers Constructor +*/ +Output_Buffers::Output_Buffers() + { + offset = 0; + } + +/* +* Output_Buffers Destructor +*/ +Output_Buffers::~Output_Buffers() + { + for(u32bit j = 0; j != buffers.size(); ++j) + delete buffers[j]; + } + +} diff --git a/src/libs/3rdparty/botan/src/filters/out_buf.h b/src/libs/3rdparty/botan/src/filters/out_buf.h new file mode 100644 index 00000000000..0baacda20c1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/out_buf.h @@ -0,0 +1,43 @@ +/* +* Output Buffer +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_OUTPUT_BUFFER_H__ +#define BOTAN_OUTPUT_BUFFER_H__ + +#include +#include +#include + +namespace Botan { + +/* +* Container of output buffers for Pipe +*/ +class BOTAN_DLL Output_Buffers + { + public: + u32bit read(byte[], u32bit, Pipe::message_id); + u32bit peek(byte[], u32bit, u32bit, Pipe::message_id) const; + u32bit remaining(Pipe::message_id) const; + + void add(class SecureQueue*); + void retire(); + + Pipe::message_id message_count() const; + + Output_Buffers(); + ~Output_Buffers(); + private: + class SecureQueue* get(Pipe::message_id) const; + + std::deque buffers; + Pipe::message_id offset; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/filters/pbe.h b/src/libs/3rdparty/botan/src/filters/pbe.h new file mode 100644 index 00000000000..f06d593d056 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/pbe.h @@ -0,0 +1,56 @@ +/* +* PBE +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PBE_BASE_H__ +#define BOTAN_PBE_BASE_H__ + +#include +#include +#include +#include + +namespace Botan { + +/** +* Password Based Encryption (PBE) Filter. +*/ +class BOTAN_DLL PBE : public Filter + { + public: + /** + * Set this filter's key. + * @param pw the password to be used for the encryption + */ + virtual void set_key(const std::string&) = 0; + + /** + * Create a new random salt value and set the default iterations value. + */ + virtual void new_params(RandomNumberGenerator& rng) = 0; + + /** + * DER encode the params (the number of iterations and the salt value) + * @return the encoded params + */ + virtual MemoryVector encode_params() const = 0; + + /** + * Decode params and use them inside this Filter. + * @param src a data source to read the encoded params from + */ + virtual void decode_params(DataSource&) = 0; + + /** + * Get this PBE's OID. + * @return the OID + */ + virtual OID get_oid() const = 0; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/filters/pipe.cpp b/src/libs/3rdparty/botan/src/filters/pipe.cpp new file mode 100644 index 00000000000..33824be2476 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/pipe.cpp @@ -0,0 +1,306 @@ +/* +* Pipe +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Constructor for Invalid_Message_Number +*/ +Pipe::Invalid_Message_Number::Invalid_Message_Number(const std::string& where, + message_id msg) + { + set_msg("Pipe::" + where + ": Invalid message number " + + to_string(msg)); + } + +namespace { + +/* +* A Filter that does nothing +*/ +class Null_Filter : public Filter + { + public: + void write(const byte input[], u32bit length) + { send(input, length); } + }; + +} + +/* +* Pipe Constructor +*/ +Pipe::Pipe(Filter* f1, Filter* f2, Filter* f3, Filter* f4) + { + init(); + append(f1); + append(f2); + append(f3); + append(f4); + } + +/* +* Pipe Constructor +*/ +Pipe::Pipe(Filter* filter_array[], u32bit count) + { + init(); + for(u32bit j = 0; j != count; ++j) + append(filter_array[j]); + } + +/* +* Pipe Destructor +*/ +Pipe::~Pipe() + { + destruct(pipe); + delete outputs; + } + +/* +* Initialize the Pipe +*/ +void Pipe::init() + { + outputs = new Output_Buffers; + pipe = 0; + default_read = 0; + inside_msg = false; + } + +/* +* Reset the Pipe +*/ +void Pipe::reset() + { + if(inside_msg) + throw Invalid_State("Pipe cannot be reset while it is processing"); + destruct(pipe); + pipe = 0; + inside_msg = false; + } + +/* +* Destroy the Pipe +*/ +void Pipe::destruct(Filter* to_kill) + { + if(!to_kill || dynamic_cast(to_kill)) + return; + for(u32bit j = 0; j != to_kill->total_ports(); ++j) + destruct(to_kill->next[j]); + delete to_kill; + } + +/* +* Test if the Pipe has any data in it +*/ +bool Pipe::end_of_data() const + { + return (remaining() == 0); + } + +/* +* Set the default read message +*/ +void Pipe::set_default_msg(message_id msg) + { + if(msg >= message_count()) + throw Invalid_Argument("Pipe::set_default_msg: msg number is too high"); + default_read = msg; + } + +/* +* Process a full message at once +*/ +void Pipe::process_msg(const byte input[], u32bit length) + { + start_msg(); + write(input, length); + end_msg(); + } + +/* +* Process a full message at once +*/ +void Pipe::process_msg(const MemoryRegion& input) + { + process_msg(input.begin(), input.size()); + } + +/* +* Process a full message at once +*/ +void Pipe::process_msg(const std::string& input) + { + process_msg(reinterpret_cast(input.data()), input.length()); + } + +/* +* Process a full message at once +*/ +void Pipe::process_msg(DataSource& input) + { + start_msg(); + write(input); + end_msg(); + } + +/* +* Start a new message +*/ +void Pipe::start_msg() + { + if(inside_msg) + throw Invalid_State("Pipe::start_msg: Message was already started"); + if(pipe == 0) + pipe = new Null_Filter; + find_endpoints(pipe); + pipe->new_msg(); + inside_msg = true; + } + +/* +* End the current message +*/ +void Pipe::end_msg() + { + if(!inside_msg) + throw Invalid_State("Pipe::end_msg: Message was already ended"); + pipe->finish_msg(); + clear_endpoints(pipe); + if(dynamic_cast(pipe)) + { + delete pipe; + pipe = 0; + } + inside_msg = false; + + outputs->retire(); + } + +/* +* Find the endpoints of the Pipe +*/ +void Pipe::find_endpoints(Filter* f) + { + for(u32bit j = 0; j != f->total_ports(); ++j) + if(f->next[j] && !dynamic_cast(f->next[j])) + find_endpoints(f->next[j]); + else + { + SecureQueue* q = new SecureQueue; + f->next[j] = q; + outputs->add(q); + } + } + +/* +* Remove the SecureQueues attached to the Filter +*/ +void Pipe::clear_endpoints(Filter* f) + { + if(!f) return; + for(u32bit j = 0; j != f->total_ports(); ++j) + { + if(f->next[j] && dynamic_cast(f->next[j])) + f->next[j] = 0; + clear_endpoints(f->next[j]); + } + } + +/* +* Append a Filter to the Pipe +*/ +void Pipe::append(Filter* filter) + { + if(inside_msg) + throw Invalid_State("Cannot append to a Pipe while it is processing"); + if(!filter) + return; + if(dynamic_cast(filter)) + throw Invalid_Argument("Pipe::append: SecureQueue cannot be used"); + if(filter->owned) + throw Invalid_Argument("Filters cannot be shared among multiple Pipes"); + + filter->owned = true; + + if(!pipe) pipe = filter; + else pipe->attach(filter); + } + +/* +* Prepend a Filter to the Pipe +*/ +void Pipe::prepend(Filter* filter) + { + if(inside_msg) + throw Invalid_State("Cannot prepend to a Pipe while it is processing"); + if(!filter) + return; + if(dynamic_cast(filter)) + throw Invalid_Argument("Pipe::prepend: SecureQueue cannot be used"); + if(filter->owned) + throw Invalid_Argument("Filters cannot be shared among multiple Pipes"); + + filter->owned = true; + + if(pipe) filter->attach(pipe); + pipe = filter; + } + +/* +* Pop a Filter off the Pipe +*/ +void Pipe::pop() + { + if(inside_msg) + throw Invalid_State("Cannot pop off a Pipe while it is processing"); + + if(!pipe) + return; + + if(pipe->total_ports() > 1) + throw Invalid_State("Cannot pop off a Filter with multiple ports"); + + Filter* f = pipe; + u32bit owns = f->owns(); + pipe = pipe->next[0]; + delete f; + + while(owns--) + { + f = pipe; + pipe = pipe->next[0]; + delete f; + } + } + +/* +* Return the number of messages in this Pipe +*/ +Pipe::message_id Pipe::message_count() const + { + return outputs->message_count(); + } + +/* +* Static Member Variables +*/ +const Pipe::message_id Pipe::LAST_MESSAGE = + static_cast(-2); + +const Pipe::message_id Pipe::DEFAULT_MESSAGE = + static_cast(-1); + +} diff --git a/src/libs/3rdparty/botan/src/filters/pipe.h b/src/libs/3rdparty/botan/src/filters/pipe.h new file mode 100644 index 00000000000..120f2fbdd1a --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/pipe.h @@ -0,0 +1,275 @@ +/* +* Pipe +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PIPE_H__ +#define BOTAN_PIPE_H__ + +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents pipe objects. +* A set of filters can be placed into a pipe, and information flows +* through the pipe until it reaches the end, where the output is +* collected for retrieval. If you're familiar with the Unix shell +* environment, this design will sound quite familiar. +*/ + +class BOTAN_DLL Pipe : public DataSource + { + public: + typedef u32bit message_id; + + class Invalid_Message_Number : public Invalid_Argument + { + public: + Invalid_Message_Number(const std::string&, message_id); + }; + + static const message_id LAST_MESSAGE; + static const message_id DEFAULT_MESSAGE; + + /** + * Write input to the pipe, i.e. to its first filter. + * @param in the byte array to write + * @param length the length of the byte array in + */ + void write(const byte in[], u32bit length); + + /** + * Write input to the pipe, i.e. to its first filter. + * @param in the MemoryRegion containing the data to write + */ + void write(const MemoryRegion& in); + + /** + * Write input to the pipe, i.e. to its first filter. + * @param in the string containing the data to write + */ + void write(const std::string& in); + + /** + * Write input to the pipe, i.e. to its first filter. + * @param in the DataSource to read the data from + */ + void write(DataSource& in); + + /** + * Write input to the pipe, i.e. to its first filter. + * @param in a single byte to be written + */ + void write(byte in); + + /** + * Perform start_msg(), write() and end_msg() sequentially. + * @param in the byte array containing the data to write + * @param length the length of the byte array to write + */ + void process_msg(const byte in[], u32bit length); + + /** + * Perform start_msg(), write() and end_msg() sequentially. + * @param in the MemoryRegion containing the data to write + */ + void process_msg(const MemoryRegion& in); + + /** + * Perform start_msg(), write() and end_msg() sequentially. + * @param in the string containing the data to write + */ + void process_msg(const std::string& in); + + /** + * Perform start_msg(), write() and end_msg() sequentially. + * @param in the DataSource providing the data to write + */ + void process_msg(DataSource& in); + + /** + * Find out how many bytes are ready to read. + * @param msg the number identifying the message + * for which the information is desired + * @return the number of bytes that can still be read + */ + u32bit remaining(message_id msg = DEFAULT_MESSAGE) const; + + /** + * Read the default message from the pipe. Moves the internal + * offset so that every call to read will return a new portion of + * the message. + * @param output the byte array to write the read bytes to + * @param length the length of the byte array output + * @return the number of bytes actually read into output + */ + u32bit read(byte output[], u32bit length); + + /** + * Read a specified message from the pipe. Moves the internal + * offset so that every call to read will return a new portion of + * the message. + * @param output the byte array to write the read bytes to + * @param length the length of the byte array output + * @param msg the number identifying the message to read from + * @return the number of bytes actually read into output + */ + u32bit read(byte output[], u32bit length, message_id msg); + + /** + * Read a single byte from the pipe. Moves the internal offset so that + * every call to read will return a new portion of the message. + * @param output the byte to write the result to + * @return the number of bytes actually read into output + */ + u32bit read(byte& output, message_id msg = DEFAULT_MESSAGE); + + /** + * Read the full contents of the pipe. + * @param msg the number identifying the message to read from + * @return a SecureVector holding the contents of the pipe + */ + SecureVector read_all(message_id msg = DEFAULT_MESSAGE); + + /** + * Read the full contents of the pipe. + * @param msg the number identifying the message to read from + * @return a string holding the contents of the pipe + */ + std::string read_all_as_string(message_id = DEFAULT_MESSAGE); + + /** Read from the default message but do not modify the internal + * offset. Consecutive calls to peek() will return portions of + * the message starting at the same position. + * @param output the byte array to write the peeked message part to + * @param length the length of the byte array output + * @param offset the offset from the current position in message + * @return the number of bytes actually peeked and written into output + */ + u32bit peek(byte output[], u32bit length, u32bit offset) const; + + /** Read from the specified message but do not modify the + * internal offset. Consecutive calls to peek() will return + * portions of the message starting at the same position. + * @param output the byte array to write the peeked message part to + * @param length the length of the byte array output + * @param offset the offset from the current position in message + * @param msg the number identifying the message to peek from + * @return the number of bytes actually peeked and written into output + */ + u32bit peek(byte output[], u32bit length, + u32bit offset, message_id msg) const; + + /** Read a single byte from the specified message but do not + * modify the internal offset. Consecutive calls to peek() will + * return portions of the message starting at the same position. + * @param output the byte to write the peeked message byte to + * @param offset the offset from the current position in message + * @param msg the number identifying the message to peek from + * @return the number of bytes actually peeked and written into output + */ + u32bit peek(byte& output, u32bit offset, + message_id msg = DEFAULT_MESSAGE) const; + + u32bit default_msg() const { return default_read; } + + /** + * Set the default message + * @param msg the number identifying the message which is going to + * be the new default message + */ + void set_default_msg(message_id msg); + + /** + * Get the number of messages the are in this pipe. + * @return the number of messages the are in this pipe + */ + message_id message_count() const; + + /** + * Test whether this pipe has any data that can be read from. + * @return true if there is more data to read, false otherwise + */ + bool end_of_data() const; + + /** + * Start a new message in the pipe. A potential other message in this pipe + * must be closed with end_msg() before this function may be called. + */ + void start_msg(); + + /** + * End the current message. + */ + void end_msg(); + + /** + * Insert a new filter at the front of the pipe + * @param filt the new filter to insert + */ + void prepend(Filter* filt); + + /** + * Insert a new filter at the back of the pipe + * @param filt the new filter to insert + */ + void append(Filter* filt); + + /** + * Remove the first filter at the front of the pipe. + */ + void pop(); + + /** + * Reset this pipe to an empty pipe. + */ + void reset(); + + /** + * Construct a Pipe of up to four filters. The filters are set up + * in the same order as the arguments. + */ + Pipe(Filter* = 0, Filter* = 0, Filter* = 0, Filter* = 0); + + /** + * Construct a Pipe from range of filters passed as an array + * @param filters the set of filters to use + * @param count the number of elements in filters + */ + Pipe(Filter* filters[], u32bit count); + ~Pipe(); + private: + Pipe(const Pipe&) : DataSource() {} + Pipe& operator=(const Pipe&) { return (*this); } + void init(); + void destruct(Filter*); + void find_endpoints(Filter*); + void clear_endpoints(Filter*); + + message_id get_message_no(const std::string&, message_id) const; + + Filter* pipe; + class Output_Buffers* outputs; + message_id default_read; + bool inside_msg; + }; + +/* +* I/O Operators for Pipe +*/ +BOTAN_DLL std::ostream& operator<<(std::ostream&, Pipe&); +BOTAN_DLL std::istream& operator>>(std::istream&, Pipe&); + +} + +#endif + +#if defined(BOTAN_HAS_PIPE_UNIXFD_IO) + #include +#endif diff --git a/src/libs/3rdparty/botan/src/filters/pipe_io.cpp b/src/libs/3rdparty/botan/src/filters/pipe_io.cpp new file mode 100644 index 00000000000..c57be6d5343 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/pipe_io.cpp @@ -0,0 +1,45 @@ +/* +* Pipe I/O +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Write data from a pipe into an ostream +*/ +std::ostream& operator<<(std::ostream& stream, Pipe& pipe) + { + SecureVector buffer(DEFAULT_BUFFERSIZE); + while(stream.good() && pipe.remaining()) + { + u32bit got = pipe.read(buffer, buffer.size()); + stream.write(reinterpret_cast(buffer.begin()), got); + } + if(!stream.good()) + throw Stream_IO_Error("Pipe output operator (iostream) has failed"); + return stream; + } + +/* +* Read data from an istream into a pipe +*/ +std::istream& operator>>(std::istream& stream, Pipe& pipe) + { + SecureVector buffer(DEFAULT_BUFFERSIZE); + while(stream.good()) + { + stream.read(reinterpret_cast(buffer.begin()), buffer.size()); + pipe.write(buffer, stream.gcount()); + } + if(stream.bad() || (stream.fail() && !stream.eof())) + throw Stream_IO_Error("Pipe input operator (iostream) has failed"); + return stream; + } + +} diff --git a/src/libs/3rdparty/botan/src/filters/pipe_rw.cpp b/src/libs/3rdparty/botan/src/filters/pipe_rw.cpp new file mode 100644 index 00000000000..41b57a716dc --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/pipe_rw.cpp @@ -0,0 +1,167 @@ +/* +* Pipe Reading/Writing +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Look up the canonical ID for a queue +*/ +Pipe::message_id Pipe::get_message_no(const std::string& func_name, + message_id msg) const + { + if(msg == DEFAULT_MESSAGE) + msg = default_msg(); + else if(msg == LAST_MESSAGE) + msg = message_count() - 1; + + if(msg >= message_count()) + throw Invalid_Message_Number(func_name, msg); + + return msg; + } + +/* +* Write into a Pipe +*/ +void Pipe::write(const byte input[], u32bit length) + { + if(!inside_msg) + throw Exception("Cannot write to a Pipe while it is not processing"); + pipe->write(input, length); + } + +/* +* Write into a Pipe +*/ +void Pipe::write(const MemoryRegion& input) + { + write(input.begin(), input.size()); + } + +/* +* Write a string into a Pipe +*/ +void Pipe::write(const std::string& str) + { + write(reinterpret_cast(str.data()), str.size()); + } + +/* +* Write a single byte into a Pipe +*/ +void Pipe::write(byte input) + { + write(&input, 1); + } + +/* +* Write the contents of a DataSource into a Pipe +*/ +void Pipe::write(DataSource& source) + { + SecureVector buffer(DEFAULT_BUFFERSIZE); + while(!source.end_of_data()) + { + u32bit got = source.read(buffer, buffer.size()); + write(buffer, got); + } + } + +/* +* Read some data from the pipe +*/ +u32bit Pipe::read(byte output[], u32bit length, message_id msg) + { + return outputs->read(output, length, get_message_no("read", msg)); + } + +/* +* Read some data from the pipe +*/ +u32bit Pipe::read(byte output[], u32bit length) + { + return read(output, length, DEFAULT_MESSAGE); + } + +/* +* Read a single byte from the pipe +*/ +u32bit Pipe::read(byte& out, message_id msg) + { + return read(&out, 1, msg); + } + +/* +* Return all data in the pipe +*/ +SecureVector Pipe::read_all(message_id msg) + { + msg = ((msg != DEFAULT_MESSAGE) ? msg : default_msg()); + SecureVector buffer(remaining(msg)); + read(buffer, buffer.size(), msg); + return buffer; + } + +/* +* Return all data in the pipe as a string +*/ +std::string Pipe::read_all_as_string(message_id msg) + { + msg = ((msg != DEFAULT_MESSAGE) ? msg : default_msg()); + SecureVector buffer(DEFAULT_BUFFERSIZE); + std::string str; + str.reserve(remaining(msg)); + + while(true) + { + u32bit got = read(buffer, buffer.size(), msg); + if(got == 0) + break; + str.append(reinterpret_cast(buffer.begin()), got); + } + + return str; + } + +/* +* Find out how many bytes are ready to read +*/ +u32bit Pipe::remaining(message_id msg) const + { + return outputs->remaining(get_message_no("remaining", msg)); + } + +/* +* Peek at some data in the pipe +*/ +u32bit Pipe::peek(byte output[], u32bit length, + u32bit offset, message_id msg) const + { + return outputs->peek(output, length, offset, get_message_no("peek", msg)); + } + +/* +* Peek at some data in the pipe +*/ +u32bit Pipe::peek(byte output[], u32bit length, u32bit offset) const + { + return peek(output, length, offset, DEFAULT_MESSAGE); + } + +/* +* Peek at a byte in the pipe +*/ +u32bit Pipe::peek(byte& out, u32bit offset, message_id msg) const + { + return peek(&out, 1, offset, msg); + } + +} diff --git a/src/libs/3rdparty/botan/src/filters/secqueue.cpp b/src/libs/3rdparty/botan/src/filters/secqueue.cpp new file mode 100644 index 00000000000..f63ef898cc3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/secqueue.cpp @@ -0,0 +1,205 @@ +/* +* SecureQueue +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* SecureQueueNode +*/ +class SecureQueueNode + { + public: + u32bit write(const byte input[], u32bit length) + { + u32bit copied = std::min(length, buffer.size() - end); + copy_mem(buffer + end, input, copied); + end += copied; + return copied; + } + u32bit read(byte output[], u32bit length) + { + u32bit copied = std::min(length, end - start); + copy_mem(output, buffer + start, copied); + start += copied; + return copied; + } + u32bit peek(byte output[], u32bit length, u32bit offset = 0) + { + const u32bit left = end - start; + if(offset >= left) return 0; + u32bit copied = std::min(length, left - offset); + copy_mem(output, buffer + start + offset, copied); + return copied; + } + u32bit size() const { return (end - start); } + SecureQueueNode() { next = 0; start = end = 0; } + ~SecureQueueNode() { next = 0; start = end = 0; } + private: + friend class SecureQueue; + SecureQueueNode* next; + SecureBuffer buffer; + u32bit start, end; + }; + +/* +* Create a SecureQueue +*/ +SecureQueue::SecureQueue() + { + set_next(0, 0); + head = tail = new SecureQueueNode; + } + +/* +* Copy a SecureQueue +*/ +SecureQueue::SecureQueue(const SecureQueue& input) : + Fanout_Filter(), DataSource() + { + set_next(0, 0); + + head = tail = new SecureQueueNode; + SecureQueueNode* temp = input.head; + while(temp) + { + write(temp->buffer + temp->start, temp->end - temp->start); + temp = temp->next; + } + } + +/* +* Destroy this SecureQueue +*/ +void SecureQueue::destroy() + { + SecureQueueNode* temp = head; + while(temp) + { + SecureQueueNode* holder = temp->next; + delete temp; + temp = holder; + } + head = tail = 0; + } + +/* +* Copy a SecureQueue +*/ +SecureQueue& SecureQueue::operator=(const SecureQueue& input) + { + destroy(); + head = tail = new SecureQueueNode; + SecureQueueNode* temp = input.head; + while(temp) + { + write(temp->buffer + temp->start, temp->end - temp->start); + temp = temp->next; + } + return (*this); + } + +/* +* Add some bytes to the queue +*/ +void SecureQueue::write(const byte input[], u32bit length) + { + if(!head) + head = tail = new SecureQueueNode; + while(length) + { + const u32bit n = tail->write(input, length); + input += n; + length -= n; + if(length) + { + tail->next = new SecureQueueNode; + tail = tail->next; + } + } + } + +/* +* Read some bytes from the queue +*/ +u32bit SecureQueue::read(byte output[], u32bit length) + { + u32bit got = 0; + while(length && head) + { + const u32bit n = head->read(output, length); + output += n; + got += n; + length -= n; + if(head->size() == 0) + { + SecureQueueNode* holder = head->next; + delete head; + head = holder; + } + } + return got; + } + +/* +* Read data, but do not remove it from queue +*/ +u32bit SecureQueue::peek(byte output[], u32bit length, u32bit offset) const + { + SecureQueueNode* current = head; + + while(offset && current) + { + if(offset >= current->size()) + { + offset -= current->size(); + current = current->next; + } + else + break; + } + + u32bit got = 0; + while(length && current) + { + const u32bit n = current->peek(output, length, offset); + offset = 0; + output += n; + got += n; + length -= n; + current = current->next; + } + return got; + } + +/* +* Return how many bytes the queue holds +*/ +u32bit SecureQueue::size() const + { + SecureQueueNode* current = head; + u32bit count = 0; + + while(current) + { + count += current->size(); + current = current->next; + } + return count; + } + +/* +* Test if the queue has any data in it +*/ +bool SecureQueue::end_of_data() const + { + return (size() == 0); + } + +} diff --git a/src/libs/3rdparty/botan/src/filters/secqueue.h b/src/libs/3rdparty/botan/src/filters/secqueue.h new file mode 100644 index 00000000000..fc1fc213aa5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/filters/secqueue.h @@ -0,0 +1,43 @@ +/* +* SecureQueue +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SECURE_QUEUE_H__ +#define BOTAN_SECURE_QUEUE_H__ + +#include +#include + +namespace Botan { + +/* +* SecureQueue +*/ +class BOTAN_DLL SecureQueue : public Fanout_Filter, public DataSource + { + public: + void write(const byte[], u32bit); + + u32bit read(byte[], u32bit); + u32bit peek(byte[], u32bit, u32bit = 0) const; + + bool end_of_data() const; + u32bit size() const; + bool attachable() { return false; } + + SecureQueue& operator=(const SecureQueue&); + SecureQueue(); + SecureQueue(const SecureQueue&); + ~SecureQueue() { destroy(); } + private: + void destroy(); + class SecureQueueNode* head; + class SecureQueueNode* tail; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/fork256/fork256.cpp b/src/libs/3rdparty/botan/src/hash/fork256/fork256.cpp new file mode 100644 index 00000000000..f80bff43a3f --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/fork256/fork256.cpp @@ -0,0 +1,149 @@ +/* +* FORK-256 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* FORK-256 Step Function +*/ +inline void step(u32bit& A, u32bit& B, u32bit& C, u32bit& D, + u32bit& E, u32bit& F, u32bit& G, u32bit& H, + u32bit M1, u32bit M2, u32bit D1, u32bit D2) + { + u32bit T0, T1; + + A += M1; T0 = A + (rotate_left(A, 7) ^ rotate_left(A, 22)); + A += D1; T1 = A ^ (rotate_left(A, 13) + rotate_left(A, 27)); + + B = (B + T0) ^ T1; + C = (C + rotate_left(T0, 5)) ^ rotate_left(T1, 9); + D = (D + rotate_left(T0, 17)) ^ rotate_left(T1, 21); + + E += M2; T0 = E ^ (rotate_left(E, 13) + rotate_left(E, 27)); + E += D2; T1 = E + (rotate_left(E, 7) ^ rotate_left(E, 22)); + + F = (F + T0) ^ T1; + G = (G + rotate_left(T0, 9)) ^ rotate_left(T1, 5); + H = (H + rotate_left(T0, 21)) ^ rotate_left(T1, 17); + } + +} + +/* +* FORK-256 Compression Function +*/ +void FORK_256::compress_n(const byte input[], u32bit blocks) + { + const u32bit DELTA[16] = { + 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, + 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, + 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174 + }; + + for(u32bit i = 0; i != blocks; ++i) + { + u32bit A1, B1, C1, D1, E1, F1, G1, H1; + u32bit A2, B2, C2, D2, E2, F2, G2, H2; + u32bit A3, B3, C3, D3, E3, F3, G3, H3; + u32bit A4, B4, C4, D4, E4, F4, G4, H4; + + A1 = A2 = A3 = A4 = digest[0]; + B1 = B2 = B3 = B4 = digest[1]; + C1 = C2 = C3 = C4 = digest[2]; + D1 = D2 = D3 = D4 = digest[3]; + E1 = E2 = E3 = E4 = digest[4]; + F1 = F2 = F3 = F4 = digest[5]; + G1 = G2 = G3 = G4 = digest[6]; + H1 = H2 = H3 = H4 = digest[7]; + + for(u32bit j = 0; j != 16; ++j) + M[j] = load_be(input, j); + input += HASH_BLOCK_SIZE; + + step(A1, B1, C1, D1, E1, F1, G1, H1, M[ 0], M[ 1], DELTA[ 0], DELTA[ 1]); + step(A2, B2, C2, D2, E2, F2, G2, H2, M[14], M[15], DELTA[15], DELTA[14]); + step(A3, B3, C3, D3, E3, F3, G3, H3, M[ 7], M[ 6], DELTA[ 1], DELTA[ 0]); + step(A4, B4, C4, D4, E4, F4, G4, H4, M[ 5], M[12], DELTA[14], DELTA[15]); + + step(H1, A1, B1, C1, D1, E1, F1, G1, M[ 2], M[ 3], DELTA[ 2], DELTA[ 3]); + step(H2, A2, B2, C2, D2, E2, F2, G2, M[11], M[ 9], DELTA[13], DELTA[12]); + step(H3, A3, B3, C3, D3, E3, F3, G3, M[10], M[14], DELTA[ 3], DELTA[ 2]); + step(H4, A4, B4, C4, D4, E4, F4, G4, M[ 1], M[ 8], DELTA[12], DELTA[13]); + + step(G1, H1, A1, B1, C1, D1, E1, F1, M[ 4], M[ 5], DELTA[ 4], DELTA[ 5]); + step(G2, H2, A2, B2, C2, D2, E2, F2, M[ 8], M[10], DELTA[11], DELTA[10]); + step(G3, H3, A3, B3, C3, D3, E3, F3, M[13], M[ 2], DELTA[ 5], DELTA[ 4]); + step(G4, H4, A4, B4, C4, D4, E4, F4, M[15], M[ 0], DELTA[10], DELTA[11]); + + step(F1, G1, H1, A1, B1, C1, D1, E1, M[ 6], M[ 7], DELTA[ 6], DELTA[ 7]); + step(F2, G2, H2, A2, B2, C2, D2, E2, M[ 3], M[ 4], DELTA[ 9], DELTA[ 8]); + step(F3, G3, H3, A3, B3, C3, D3, E3, M[ 9], M[12], DELTA[ 7], DELTA[ 6]); + step(F4, G4, H4, A4, B4, C4, D4, E4, M[13], M[11], DELTA[ 8], DELTA[ 9]); + + step(E1, F1, G1, H1, A1, B1, C1, D1, M[ 8], M[ 9], DELTA[ 8], DELTA[ 9]); + step(E2, F2, G2, H2, A2, B2, C2, D2, M[ 2], M[13], DELTA[ 7], DELTA[ 6]); + step(E3, F3, G3, H3, A3, B3, C3, D3, M[11], M[ 4], DELTA[ 9], DELTA[ 8]); + step(E4, F4, G4, H4, A4, B4, C4, D4, M[ 3], M[10], DELTA[ 6], DELTA[ 7]); + + step(D1, E1, F1, G1, H1, A1, B1, C1, M[10], M[11], DELTA[10], DELTA[11]); + step(D2, E2, F2, G2, H2, A2, B2, C2, M[ 0], M[ 5], DELTA[ 5], DELTA[ 4]); + step(D3, E3, F3, G3, H3, A3, B3, C3, M[15], M[ 8], DELTA[11], DELTA[10]); + step(D4, E4, F4, G4, H4, A4, B4, C4, M[ 9], M[ 2], DELTA[ 4], DELTA[ 5]); + + step(C1, D1, E1, F1, G1, H1, A1, B1, M[12], M[13], DELTA[12], DELTA[13]); + step(C2, D2, E2, F2, G2, H2, A2, B2, M[ 6], M[ 7], DELTA[ 3], DELTA[ 2]); + step(C3, D3, E3, F3, G3, H3, A3, B3, M[ 5], M[ 0], DELTA[13], DELTA[12]); + step(C4, D4, E4, F4, G4, H4, A4, B4, M[ 7], M[14], DELTA[ 2], DELTA[ 3]); + + step(B1, C1, D1, E1, F1, G1, H1, A1, M[14], M[15], DELTA[14], DELTA[15]); + step(B2, C2, D2, E2, F2, G2, H2, A2, M[12], M[ 1], DELTA[ 1], DELTA[ 0]); + step(B3, C3, D3, E3, F3, G3, H3, A3, M[ 1], M[ 3], DELTA[15], DELTA[14]); + step(B4, C4, D4, E4, F4, G4, H4, A4, M[ 4], M[ 6], DELTA[ 0], DELTA[ 1]); + + digest[0] += (A1 + A2) ^ (A3 + A4); + digest[1] += (B1 + B2) ^ (B3 + B4); + digest[2] += (C1 + C2) ^ (C3 + C4); + digest[3] += (D1 + D2) ^ (D3 + D4); + digest[4] += (E1 + E2) ^ (E3 + E4); + digest[5] += (F1 + F2) ^ (F3 + F4); + digest[6] += (G1 + G2) ^ (G3 + G4); + digest[7] += (H1 + H2) ^ (H3 + H4); + } + } + +/* +* Copy out the digest +*/ +void FORK_256::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; j += 4) + store_be(digest[j/4], output + j); + } + +/* +* Clear memory of sensitive data +*/ +void FORK_256::clear() throw() + { + MDx_HashFunction::clear(); + digest[0] = 0x6A09E667; + digest[1] = 0xBB67AE85; + digest[2] = 0x3C6EF372; + digest[3] = 0xA54FF53A; + digest[4] = 0x510E527F; + digest[5] = 0x9B05688C; + digest[6] = 0x1F83D9AB; + digest[7] = 0x5BE0CD19; + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/fork256/fork256.h b/src/libs/3rdparty/botan/src/hash/fork256/fork256.h new file mode 100644 index 00000000000..70d336cc98b --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/fork256/fork256.h @@ -0,0 +1,35 @@ +/* +* FORK-256 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_FORK_256_H__ +#define BOTAN_FORK_256_H__ + +#include + +namespace Botan { + +/* +* FORK-256 +*/ +class BOTAN_DLL FORK_256 : public MDx_HashFunction + { + public: + void clear() throw(); + std::string name() const { return "FORK-256"; } + HashFunction* clone() const { return new FORK_256; } + FORK_256() : MDx_HashFunction(32, 64, true, true) { clear(); } + private: + void compress_n(const byte[], u32bit blocks); + void copy_out(byte[]); + + SecureBuffer digest; + SecureBuffer M; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/fork256/info.txt b/src/libs/3rdparty/botan/src/hash/fork256/info.txt new file mode 100644 index 00000000000..ae0c9f1a479 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/fork256/info.txt @@ -0,0 +1,14 @@ +realname "FORK-256" + +define FORK_256 + +load_on auto + + +fork256.cpp +fork256.h + + + +mdx_hash + diff --git a/src/libs/3rdparty/botan/src/hash/gost_3411/gost_3411.cpp b/src/libs/3rdparty/botan/src/hash/gost_3411/gost_3411.cpp new file mode 100644 index 00000000000..3c7f5f92b62 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/gost_3411/gost_3411.cpp @@ -0,0 +1,236 @@ +/* +* GOST 34.11 +* (C) 2009 Jack Lloyd +*/ + +#include +#include +#include +#include + +namespace Botan { + +/** +* GOST 34.11 Constructor +*/ +GOST_34_11::GOST_34_11() : + HashFunction(32, 32), + cipher(GOST_28147_89_Params("R3411_CryptoPro")) + { + count = 0; + position = 0; + } + +void GOST_34_11::clear() throw() + { + cipher.clear(); + sum.clear(); + hash.clear(); + count = 0; + position = 0; + } + +/** +* Hash additional inputs +*/ +void GOST_34_11::add_data(const byte input[], u32bit length) + { + count += length; + + if(position) + { + buffer.copy(position, input, length); + + if(position + length >= HASH_BLOCK_SIZE) + { + compress_n(buffer.begin(), 1); + input += (HASH_BLOCK_SIZE - position); + length -= (HASH_BLOCK_SIZE - position); + position = 0; + } + } + + const u32bit full_blocks = length / HASH_BLOCK_SIZE; + const u32bit remaining = length % HASH_BLOCK_SIZE; + + if(full_blocks) + compress_n(input, full_blocks); + + buffer.copy(position, input + full_blocks * HASH_BLOCK_SIZE, remaining); + position += remaining; + } + +/** +* The GOST 34.11 compression function +*/ +void GOST_34_11::compress_n(const byte input[], u32bit blocks) + { + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0, carry = 0; j != 32; ++j) + { + u16bit s = sum[j] + input[32*i+j] + carry; + carry = get_byte(0, s); + sum[j] = get_byte(1, s); + } + + byte S[32] = { 0 }; + + u64bit U[4], V[4]; + + for(u32bit j = 0; j != 4; ++j) + { + U[j] = load_be(hash, j); + V[j] = load_be(input + 32*i, j); + } + + for(u32bit j = 0; j != 4; ++j) + { + byte key[32] = { 0 }; + + // P transformation + for(size_t k = 0; k != 4; ++k) + for(size_t l = 0; l != 8; ++l) + key[4*l+k] = get_byte(l, U[k]) ^ get_byte(l, V[k]); + + cipher.set_key(key, 32); + cipher.encrypt(hash + 8*j, S + 8*j); + + if(j == 3) + break; + + // A(x) + u64bit A_U = U[0]; + U[0] = U[1]; + U[1] = U[2]; + U[2] = U[3]; + U[3] = U[0] ^ A_U; + + if(j == 1) // C_3 + { + U[0] ^= 0x00FF00FF00FF00FF; + U[1] ^= 0xFF00FF00FF00FF00; + U[2] ^= 0x00FFFF00FF0000FF; + U[3] ^= 0xFF000000FFFF00FF; + } + + // A(A(x)) + u64bit AA_V_1 = V[0] ^ V[1]; + u64bit AA_V_2 = V[1] ^ V[2]; + V[0] = V[2]; + V[1] = V[3]; + V[2] = AA_V_1; + V[3] = AA_V_2; + } + + byte S2[32] = { 0 }; + + // 12 rounds of psi + S2[ 0] = S[24]; + S2[ 1] = S[25]; + S2[ 2] = S[26]; + S2[ 3] = S[27]; + S2[ 4] = S[28]; + S2[ 5] = S[29]; + S2[ 6] = S[30]; + S2[ 7] = S[31]; + S2[ 8] = S[ 0] ^ S[ 2] ^ S[ 4] ^ S[ 6] ^ S[24] ^ S[30]; + S2[ 9] = S[ 1] ^ S[ 3] ^ S[ 5] ^ S[ 7] ^ S[25] ^ S[31]; + S2[10] = S[ 0] ^ S[ 8] ^ S[24] ^ S[26] ^ S[30]; + S2[11] = S[ 1] ^ S[ 9] ^ S[25] ^ S[27] ^ S[31]; + S2[12] = S[ 0] ^ S[ 4] ^ S[ 6] ^ S[10] ^ S[24] ^ S[26] ^ S[28] ^ S[30]; + S2[13] = S[ 1] ^ S[ 5] ^ S[ 7] ^ S[11] ^ S[25] ^ S[27] ^ S[29] ^ S[31]; + S2[14] = S[ 0] ^ S[ 4] ^ S[ 8] ^ S[12] ^ S[24] ^ S[26] ^ S[28]; + S2[15] = S[ 1] ^ S[ 5] ^ S[ 9] ^ S[13] ^ S[25] ^ S[27] ^ S[29]; + S2[16] = S[ 2] ^ S[ 6] ^ S[10] ^ S[14] ^ S[26] ^ S[28] ^ S[30]; + S2[17] = S[ 3] ^ S[ 7] ^ S[11] ^ S[15] ^ S[27] ^ S[29] ^ S[31]; + S2[18] = S[ 0] ^ S[ 2] ^ S[ 6] ^ S[ 8] ^ S[12] ^ S[16] ^ S[24] ^ S[28]; + S2[19] = S[ 1] ^ S[ 3] ^ S[ 7] ^ S[ 9] ^ S[13] ^ S[17] ^ S[25] ^ S[29]; + S2[20] = S[ 2] ^ S[ 4] ^ S[ 8] ^ S[10] ^ S[14] ^ S[18] ^ S[26] ^ S[30]; + S2[21] = S[ 3] ^ S[ 5] ^ S[ 9] ^ S[11] ^ S[15] ^ S[19] ^ S[27] ^ S[31]; + S2[22] = S[ 0] ^ S[ 2] ^ S[10] ^ S[12] ^ S[16] ^ S[20] ^ S[24] ^ S[28] ^ S[30]; + S2[23] = S[ 1] ^ S[ 3] ^ S[11] ^ S[13] ^ S[17] ^ S[21] ^ S[25] ^ S[29] ^ S[31]; + S2[24] = S[ 0] ^ S[ 6] ^ S[12] ^ S[14] ^ S[18] ^ S[22] ^ S[24] ^ S[26]; + S2[25] = S[ 1] ^ S[ 7] ^ S[13] ^ S[15] ^ S[19] ^ S[23] ^ S[25] ^ S[27]; + S2[26] = S[ 2] ^ S[ 8] ^ S[14] ^ S[16] ^ S[20] ^ S[24] ^ S[26] ^ S[28]; + S2[27] = S[ 3] ^ S[ 9] ^ S[15] ^ S[17] ^ S[21] ^ S[25] ^ S[27] ^ S[29]; + S2[28] = S[ 4] ^ S[10] ^ S[16] ^ S[18] ^ S[22] ^ S[26] ^ S[28] ^ S[30]; + S2[29] = S[ 5] ^ S[11] ^ S[17] ^ S[19] ^ S[23] ^ S[27] ^ S[29] ^ S[31]; + S2[30] = S[ 0] ^ S[ 2] ^ S[ 4] ^ S[12] ^ S[18] ^ S[20] ^ S[28]; + S2[31] = S[ 1] ^ S[ 3] ^ S[ 5] ^ S[13] ^ S[19] ^ S[21] ^ S[29]; + + xor_buf(S, S2, input + 32*i, 32); + + S2[0] = S[0] ^ S[2] ^ S[4] ^ S[6] ^ S[24] ^ S[30]; + S2[1] = S[1] ^ S[3] ^ S[5] ^ S[7] ^ S[25] ^ S[31]; + + copy_mem(S, S+2, 30); + S[30] = S2[0]; + S[31] = S2[1]; + + xor_buf(S, hash, 32); + + // 61 rounds of psi + S2[ 0] = S[ 2] ^ S[ 6] ^ S[14] ^ S[20] ^ S[22] ^ S[26] ^ S[28] ^ S[30]; + S2[ 1] = S[ 3] ^ S[ 7] ^ S[15] ^ S[21] ^ S[23] ^ S[27] ^ S[29] ^ S[31]; + S2[ 2] = S[ 0] ^ S[ 2] ^ S[ 6] ^ S[ 8] ^ S[16] ^ S[22] ^ S[28]; + S2[ 3] = S[ 1] ^ S[ 3] ^ S[ 7] ^ S[ 9] ^ S[17] ^ S[23] ^ S[29]; + S2[ 4] = S[ 2] ^ S[ 4] ^ S[ 8] ^ S[10] ^ S[18] ^ S[24] ^ S[30]; + S2[ 5] = S[ 3] ^ S[ 5] ^ S[ 9] ^ S[11] ^ S[19] ^ S[25] ^ S[31]; + S2[ 6] = S[ 0] ^ S[ 2] ^ S[10] ^ S[12] ^ S[20] ^ S[24] ^ S[26] ^ S[30]; + S2[ 7] = S[ 1] ^ S[ 3] ^ S[11] ^ S[13] ^ S[21] ^ S[25] ^ S[27] ^ S[31]; + S2[ 8] = S[ 0] ^ S[ 6] ^ S[12] ^ S[14] ^ S[22] ^ S[24] ^ S[26] ^ S[28] ^ S[30]; + S2[ 9] = S[ 1] ^ S[ 7] ^ S[13] ^ S[15] ^ S[23] ^ S[25] ^ S[27] ^ S[29] ^ S[31]; + S2[10] = S[ 0] ^ S[ 4] ^ S[ 6] ^ S[ 8] ^ S[14] ^ S[16] ^ S[26] ^ S[28]; + S2[11] = S[ 1] ^ S[ 5] ^ S[ 7] ^ S[ 9] ^ S[15] ^ S[17] ^ S[27] ^ S[29]; + S2[12] = S[ 2] ^ S[ 6] ^ S[ 8] ^ S[10] ^ S[16] ^ S[18] ^ S[28] ^ S[30]; + S2[13] = S[ 3] ^ S[ 7] ^ S[ 9] ^ S[11] ^ S[17] ^ S[19] ^ S[29] ^ S[31]; + S2[14] = S[ 0] ^ S[ 2] ^ S[ 6] ^ S[ 8] ^ S[10] ^ S[12] ^ S[18] ^ S[20] ^ S[24]; + S2[15] = S[ 1] ^ S[ 3] ^ S[ 7] ^ S[ 9] ^ S[11] ^ S[13] ^ S[19] ^ S[21] ^ S[25]; + S2[16] = S[ 2] ^ S[ 4] ^ S[ 8] ^ S[10] ^ S[12] ^ S[14] ^ S[20] ^ S[22] ^ S[26]; + S2[17] = S[ 3] ^ S[ 5] ^ S[ 9] ^ S[11] ^ S[13] ^ S[15] ^ S[21] ^ S[23] ^ S[27]; + S2[18] = S[ 4] ^ S[ 6] ^ S[10] ^ S[12] ^ S[14] ^ S[16] ^ S[22] ^ S[24] ^ S[28]; + S2[19] = S[ 5] ^ S[ 7] ^ S[11] ^ S[13] ^ S[15] ^ S[17] ^ S[23] ^ S[25] ^ S[29]; + S2[20] = S[ 6] ^ S[ 8] ^ S[12] ^ S[14] ^ S[16] ^ S[18] ^ S[24] ^ S[26] ^ S[30]; + S2[21] = S[ 7] ^ S[ 9] ^ S[13] ^ S[15] ^ S[17] ^ S[19] ^ S[25] ^ S[27] ^ S[31]; + S2[22] = S[ 0] ^ S[ 2] ^ S[ 4] ^ S[ 6] ^ S[ 8] ^ S[10] ^ S[14] ^ S[16] ^ S[18] ^ S[20] ^ S[24] ^ S[26] ^ S[28] ^ S[30]; + S2[23] = S[ 1] ^ S[ 3] ^ S[ 5] ^ S[ 7] ^ S[ 9] ^ S[11] ^ S[15] ^ S[17] ^ S[19] ^ S[21] ^ S[25] ^ S[27] ^ S[29] ^ S[31]; + S2[24] = S[ 0] ^ S[ 8] ^ S[10] ^ S[12] ^ S[16] ^ S[18] ^ S[20] ^ S[22] ^ S[24] ^ S[26] ^ S[28]; + S2[25] = S[ 1] ^ S[ 9] ^ S[11] ^ S[13] ^ S[17] ^ S[19] ^ S[21] ^ S[23] ^ S[25] ^ S[27] ^ S[29]; + S2[26] = S[ 2] ^ S[10] ^ S[12] ^ S[14] ^ S[18] ^ S[20] ^ S[22] ^ S[24] ^ S[26] ^ S[28] ^ S[30]; + S2[27] = S[ 3] ^ S[11] ^ S[13] ^ S[15] ^ S[19] ^ S[21] ^ S[23] ^ S[25] ^ S[27] ^ S[29] ^ S[31]; + S2[28] = S[ 0] ^ S[ 2] ^ S[ 6] ^ S[12] ^ S[14] ^ S[16] ^ S[20] ^ S[22] ^ S[26] ^ S[28]; + S2[29] = S[ 1] ^ S[ 3] ^ S[ 7] ^ S[13] ^ S[15] ^ S[17] ^ S[21] ^ S[23] ^ S[27] ^ S[29]; + S2[30] = S[ 2] ^ S[ 4] ^ S[ 8] ^ S[14] ^ S[16] ^ S[18] ^ S[22] ^ S[24] ^ S[28] ^ S[30]; + S2[31] = S[ 3] ^ S[ 5] ^ S[ 9] ^ S[15] ^ S[17] ^ S[19] ^ S[23] ^ S[25] ^ S[29] ^ S[31]; + + hash.copy(S2, 32); + } + } + +/** +* Produce the final GOST 34.11 output +*/ +void GOST_34_11::final_result(byte out[]) + { + if(position) + { + clear_mem(buffer.begin() + position, buffer.size() - position); + compress_n(buffer, 1); + } + + SecureBuffer length_buf; + const u64bit bit_count = count * 8; + store_le(bit_count, length_buf); + + SecureBuffer sum_buf(sum); + + compress_n(length_buf, 1); + compress_n(sum_buf, 1); + + copy_mem(out, hash.begin(), 32); + + clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/gost_3411/gost_3411.h b/src/libs/3rdparty/botan/src/hash/gost_3411/gost_3411.h new file mode 100644 index 00000000000..c6955505245 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/gost_3411/gost_3411.h @@ -0,0 +1,41 @@ +/** +* GOST 34.11 +* (C) 2009 Jack Lloyd +*/ + +#ifndef BOTAN_GOST_3411_H__ +#define BOTAN_GOST_3411_H__ + +#include +#include + +namespace Botan { + +/** +* GOST 34.11 +*/ +class BOTAN_DLL GOST_34_11 : public HashFunction + { + public: + void clear() throw(); + std::string name() const { return "GOST-R-34.11-94" ; } + HashFunction* clone() const { return new GOST_34_11; } + + GOST_34_11(); + protected: + void compress_n(const byte input[], u32bit blocks); + + void add_data(const byte[], u32bit); + void final_result(byte[]); + + GOST_28147_89 cipher; + SecureBuffer buffer; + SecureBuffer sum; + SecureBuffer hash; + u64bit count; + u32bit position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/gost_3411/info.txt b/src/libs/3rdparty/botan/src/hash/gost_3411/info.txt new file mode 100644 index 00000000000..65b9475e183 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/gost_3411/info.txt @@ -0,0 +1,14 @@ +realname "GOST 34.11" + +define GOST_34_11 + +load_on auto + + +gost_3411.cpp +gost_3411.h + + + +gost_28147 + diff --git a/src/libs/3rdparty/botan/src/hash/has160/has160.cpp b/src/libs/3rdparty/botan/src/hash/has160/has160.cpp new file mode 100644 index 00000000000..9a505d31d6a --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/has160/has160.cpp @@ -0,0 +1,159 @@ +/* +* HAS-160 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* HAS-160 F1 Function +*/ +inline void F1(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, + u32bit msg, u32bit rot) + { + E += rotate_left(A, rot) + (D ^ (B & (C ^ D))) + msg; + B = rotate_left(B, 10); + } + +/* +* HAS-160 F2 Function +*/ +inline void F2(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, + u32bit msg, u32bit rot) + { + E += rotate_left(A, rot) + (B ^ C ^ D) + msg + 0x5A827999; + B = rotate_left(B, 17); + } + +/* +* HAS-160 F3 Function +*/ +inline void F3(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, + u32bit msg, u32bit rot) + { + E += rotate_left(A, rot) + (C ^ (B | ~D)) + msg + 0x6ED9EBA1; + B = rotate_left(B, 25); + } + +/* +* HAS-160 F4 Function +*/ +inline void F4(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, + u32bit msg, u32bit rot) + { + E += rotate_left(A, rot) + (B ^ C ^ D) + msg + 0x8F1BBCDC; + B = rotate_left(B, 30); + } + +} + +/* +* HAS-160 Compression Function +*/ +void HAS_160::compress_n(const byte input[], u32bit blocks) + { + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0; j != 16; ++j) + X[j] = load_le(input, j); + + u32bit A = digest[0], B = digest[1], C = digest[2], + D = digest[3], E = digest[4]; + + X[16] = X[ 0] ^ X[ 1] ^ X[ 2] ^ X[ 3]; + X[17] = X[ 4] ^ X[ 5] ^ X[ 6] ^ X[ 7]; + X[18] = X[ 8] ^ X[ 9] ^ X[10] ^ X[11]; + X[19] = X[12] ^ X[13] ^ X[14] ^ X[15]; + F1(A,B,C,D,E,X[18], 5); F1(E,A,B,C,D,X[ 0],11); + F1(D,E,A,B,C,X[ 1], 7); F1(C,D,E,A,B,X[ 2],15); + F1(B,C,D,E,A,X[ 3], 6); F1(A,B,C,D,E,X[19],13); + F1(E,A,B,C,D,X[ 4], 8); F1(D,E,A,B,C,X[ 5],14); + F1(C,D,E,A,B,X[ 6], 7); F1(B,C,D,E,A,X[ 7],12); + F1(A,B,C,D,E,X[16], 9); F1(E,A,B,C,D,X[ 8],11); + F1(D,E,A,B,C,X[ 9], 8); F1(C,D,E,A,B,X[10],15); + F1(B,C,D,E,A,X[11], 6); F1(A,B,C,D,E,X[17],12); + F1(E,A,B,C,D,X[12], 9); F1(D,E,A,B,C,X[13],14); + F1(C,D,E,A,B,X[14], 5); F1(B,C,D,E,A,X[15],13); + + X[16] = X[ 3] ^ X[ 6] ^ X[ 9] ^ X[12]; + X[17] = X[ 2] ^ X[ 5] ^ X[ 8] ^ X[15]; + X[18] = X[ 1] ^ X[ 4] ^ X[11] ^ X[14]; + X[19] = X[ 0] ^ X[ 7] ^ X[10] ^ X[13]; + F2(A,B,C,D,E,X[18], 5); F2(E,A,B,C,D,X[ 3],11); + F2(D,E,A,B,C,X[ 6], 7); F2(C,D,E,A,B,X[ 9],15); + F2(B,C,D,E,A,X[12], 6); F2(A,B,C,D,E,X[19],13); + F2(E,A,B,C,D,X[15], 8); F2(D,E,A,B,C,X[ 2],14); + F2(C,D,E,A,B,X[ 5], 7); F2(B,C,D,E,A,X[ 8],12); + F2(A,B,C,D,E,X[16], 9); F2(E,A,B,C,D,X[11],11); + F2(D,E,A,B,C,X[14], 8); F2(C,D,E,A,B,X[ 1],15); + F2(B,C,D,E,A,X[ 4], 6); F2(A,B,C,D,E,X[17],12); + F2(E,A,B,C,D,X[ 7], 9); F2(D,E,A,B,C,X[10],14); + F2(C,D,E,A,B,X[13], 5); F2(B,C,D,E,A,X[ 0],13); + + X[16] = X[ 5] ^ X[ 7] ^ X[12] ^ X[14]; + X[17] = X[ 0] ^ X[ 2] ^ X[ 9] ^ X[11]; + X[18] = X[ 4] ^ X[ 6] ^ X[13] ^ X[15]; + X[19] = X[ 1] ^ X[ 3] ^ X[ 8] ^ X[10]; + F3(A,B,C,D,E,X[18], 5); F3(E,A,B,C,D,X[12],11); + F3(D,E,A,B,C,X[ 5], 7); F3(C,D,E,A,B,X[14],15); + F3(B,C,D,E,A,X[ 7], 6); F3(A,B,C,D,E,X[19],13); + F3(E,A,B,C,D,X[ 0], 8); F3(D,E,A,B,C,X[ 9],14); + F3(C,D,E,A,B,X[ 2], 7); F3(B,C,D,E,A,X[11],12); + F3(A,B,C,D,E,X[16], 9); F3(E,A,B,C,D,X[ 4],11); + F3(D,E,A,B,C,X[13], 8); F3(C,D,E,A,B,X[ 6],15); + F3(B,C,D,E,A,X[15], 6); F3(A,B,C,D,E,X[17],12); + F3(E,A,B,C,D,X[ 8], 9); F3(D,E,A,B,C,X[ 1],14); + F3(C,D,E,A,B,X[10], 5); F3(B,C,D,E,A,X[ 3],13); + + X[16] = X[ 2] ^ X[ 7] ^ X[ 8] ^ X[13]; + X[17] = X[ 3] ^ X[ 4] ^ X[ 9] ^ X[14]; + X[18] = X[ 0] ^ X[ 5] ^ X[10] ^ X[15]; + X[19] = X[ 1] ^ X[ 6] ^ X[11] ^ X[12]; + F4(A,B,C,D,E,X[18], 5); F4(E,A,B,C,D,X[ 7],11); + F4(D,E,A,B,C,X[ 2], 7); F4(C,D,E,A,B,X[13],15); + F4(B,C,D,E,A,X[ 8], 6); F4(A,B,C,D,E,X[19],13); + F4(E,A,B,C,D,X[ 3], 8); F4(D,E,A,B,C,X[14],14); + F4(C,D,E,A,B,X[ 9], 7); F4(B,C,D,E,A,X[ 4],12); + F4(A,B,C,D,E,X[16], 9); F4(E,A,B,C,D,X[15],11); + F4(D,E,A,B,C,X[10], 8); F4(C,D,E,A,B,X[ 5],15); + F4(B,C,D,E,A,X[ 0], 6); F4(A,B,C,D,E,X[17],12); + F4(E,A,B,C,D,X[11], 9); F4(D,E,A,B,C,X[ 6],14); + F4(C,D,E,A,B,X[ 1], 5); F4(B,C,D,E,A,X[12],13); + + digest[0] += A; digest[1] += B; digest[2] += C; + digest[3] += D; digest[4] += E; + } + } + +/* +* Copy out the digest +*/ +void HAS_160::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; j += 4) + store_le(digest[j/4], output + j); + } + +/* +* Clear memory of sensitive data +*/ +void HAS_160::clear() throw() + { + MDx_HashFunction::clear(); + X.clear(); + digest[0] = 0x67452301; + digest[1] = 0xEFCDAB89; + digest[2] = 0x98BADCFE; + digest[3] = 0x10325476; + digest[4] = 0xC3D2E1F0; + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/has160/has160.h b/src/libs/3rdparty/botan/src/hash/has160/has160.h new file mode 100644 index 00000000000..44bb63b9d33 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/has160/has160.h @@ -0,0 +1,35 @@ +/* +* HAS-160 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_HAS_160_H__ +#define BOTAN_HAS_160_H__ + +#include + +namespace Botan { + +/* +* HAS-160 +*/ +class BOTAN_DLL HAS_160 : public MDx_HashFunction + { + public: + void clear() throw(); + std::string name() const { return "HAS-160"; } + HashFunction* clone() const { return new HAS_160; } + HAS_160() : MDx_HashFunction(20, 64, false, true) { clear(); } + private: + void compress_n(const byte[], u32bit blocks); + void copy_out(byte[]); + + SecureBuffer X; + SecureBuffer digest; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/has160/info.txt b/src/libs/3rdparty/botan/src/hash/has160/info.txt new file mode 100644 index 00000000000..a945f322517 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/has160/info.txt @@ -0,0 +1,14 @@ +realname "HAS-160" + +define HAS_160 + +load_on auto + + +has160.cpp +has160.h + + + +mdx_hash + diff --git a/src/libs/3rdparty/botan/src/hash/hash.h b/src/libs/3rdparty/botan/src/hash/hash.h new file mode 100644 index 00000000000..a30234be044 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/hash.h @@ -0,0 +1,52 @@ +/** +* Hash Function Base Class +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_HASH_FUNCTION_BASE_CLASS_H__ +#define BOTAN_HASH_FUNCTION_BASE_CLASS_H__ + +#include +#include + +namespace Botan { + +/** +* This class represents hash function (message digest) objects. +*/ +class BOTAN_DLL HashFunction : public BufferedComputation + { + public: + /** + * The hash block size as defined for this algorithm. + */ + const u32bit HASH_BLOCK_SIZE; + + /** + * Get a new object representing the same algorithm as *this + */ + virtual HashFunction* clone() const = 0; + + /** + * Get the name of this algorithm. + * @return the name of this algorithm + */ + virtual std::string name() const = 0; + + /** + * Reset the internal state of this object. + */ + virtual void clear() throw() = 0; + + HashFunction(u32bit hash_len, u32bit block_len = 0) : + BufferedComputation(hash_len), HASH_BLOCK_SIZE(block_len) {} + virtual ~HashFunction() {} + private: + HashFunction& operator=(const HashFunction&); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/info.txt b/src/libs/3rdparty/botan/src/hash/info.txt new file mode 100644 index 00000000000..ce55f7ddc72 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/info.txt @@ -0,0 +1,11 @@ +realname "Hash Functions" + +load_on auto + + +hash.h + + + +buf_comp + diff --git a/src/libs/3rdparty/botan/src/hash/md2/info.txt b/src/libs/3rdparty/botan/src/hash/md2/info.txt new file mode 100644 index 00000000000..ff33e1eb32c --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md2/info.txt @@ -0,0 +1,10 @@ +realname "MD2" + +define MD2 + +load_on auto + + +md2.cpp +md2.h + diff --git a/src/libs/3rdparty/botan/src/hash/md2/md2.cpp b/src/libs/3rdparty/botan/src/hash/md2/md2.cpp new file mode 100644 index 00000000000..c67e72b5aa8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md2/md2.cpp @@ -0,0 +1,108 @@ +/* +* MD2 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/** +* MD2 Compression Function +*/ +void MD2::hash(const byte input[]) + { + static const byte SBOX[256] = { + 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36, 0x54, 0xA1, + 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C, + 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, + 0xFD, 0xD4, 0xE0, 0x16, 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, + 0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E, + 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F, + 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21, 0x80, 0x7F, 0x5D, 0x9A, + 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, + 0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, + 0xAC, 0x56, 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6, + 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D, 0x70, 0x59, + 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02, + 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, + 0x34, 0x40, 0x7E, 0x0F, 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, + 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E, + 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52, + 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA, 0x24, 0xE1, 0x7B, 0x08, + 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, + 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, + 0x66, 0x58, 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A, + 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99, 0x8D, 0x33, + 0x9F, 0x11, 0x83, 0x14 }; + + X.copy(16, input, HASH_BLOCK_SIZE); + xor_buf(X + 32, X, X + 16, HASH_BLOCK_SIZE); + byte T = 0; + for(u32bit j = 0; j != 18; ++j) + { + for(u32bit k = 0; k != 48; k += 8) + { + T = X[k ] ^= SBOX[T]; T = X[k+1] ^= SBOX[T]; + T = X[k+2] ^= SBOX[T]; T = X[k+3] ^= SBOX[T]; + T = X[k+4] ^= SBOX[T]; T = X[k+5] ^= SBOX[T]; + T = X[k+6] ^= SBOX[T]; T = X[k+7] ^= SBOX[T]; + } + T += j; + } + T = checksum[15]; + for(u32bit j = 0; j != HASH_BLOCK_SIZE; ++j) + T = checksum[j] ^= SBOX[input[j] ^ T]; + } + +/** +* Update the hash +*/ +void MD2::add_data(const byte input[], u32bit length) + { + buffer.copy(position, input, length); + if(position + length >= HASH_BLOCK_SIZE) + { + hash(buffer.begin()); + input += (HASH_BLOCK_SIZE - position); + length -= (HASH_BLOCK_SIZE - position); + while(length >= HASH_BLOCK_SIZE) + { + hash(input); + input += HASH_BLOCK_SIZE; + length -= HASH_BLOCK_SIZE; + } + buffer.copy(input, length); + position = 0; + } + position += length; + } + +/** +* Finalize a MD2 Hash +*/ +void MD2::final_result(byte output[]) + { + for(u32bit j = position; j != HASH_BLOCK_SIZE; ++j) + buffer[j] = static_cast(HASH_BLOCK_SIZE - position); + hash(buffer); + hash(checksum); + copy_mem(output, X.begin(), OUTPUT_LENGTH); + clear(); + } + +/** +* Clear memory of sensitive data +*/ +void MD2::clear() throw() + { + X.clear(); + checksum.clear(); + buffer.clear(); + position = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/md2/md2.h b/src/libs/3rdparty/botan/src/hash/md2/md2.h new file mode 100644 index 00000000000..9337c43f4c4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md2/md2.h @@ -0,0 +1,37 @@ +/* +* MD2 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MD2_H__ +#define BOTAN_MD2_H__ + +#include + +namespace Botan { + +/* +* MD2 +*/ +class BOTAN_DLL MD2 : public HashFunction + { + public: + void clear() throw(); + std::string name() const { return "MD2"; } + HashFunction* clone() const { return new MD2; } + MD2() : HashFunction(16, 16) { clear(); } + private: + void add_data(const byte[], u32bit); + void hash(const byte[]); + void final_result(byte[]); + + SecureBuffer X; + SecureBuffer checksum, buffer; + u32bit position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/md4/info.txt b/src/libs/3rdparty/botan/src/hash/md4/info.txt new file mode 100644 index 00000000000..fc9cbe1162f --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md4/info.txt @@ -0,0 +1,14 @@ +realname "MD4" + +define MD4 + +load_on auto + + +md4.cpp +md4.h + + + +mdx_hash + diff --git a/src/libs/3rdparty/botan/src/hash/md4/md4.cpp b/src/libs/3rdparty/botan/src/hash/md4/md4.cpp new file mode 100644 index 00000000000..39e3c8c41f4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md4/md4.cpp @@ -0,0 +1,108 @@ +/* +* MD4 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* MD4 FF Function +*/ +inline void FF(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit M, byte S) + { + A += (D ^ (B & (C ^ D))) + M; + A = rotate_left(A, S); + } + +/* +* MD4 GG Function +*/ +inline void GG(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit M, byte S) + { + A += ((B & C) | (D & (B | C))) + M + 0x5A827999; + A = rotate_left(A, S); + } + +/* +* MD4 HH Function +*/ +inline void HH(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit M, byte S) + { + A += (B ^ C ^ D) + M + 0x6ED9EBA1; + A = rotate_left(A, S); + } + +} + +/* +* MD4 Compression Function +*/ +void MD4::compress_n(const byte input[], u32bit blocks) + { + u32bit A = digest[0], B = digest[1], C = digest[2], D = digest[3]; + + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0; j != 16; ++j) + M[j] = load_le(input, j); + input += HASH_BLOCK_SIZE; + + FF(A,B,C,D,M[ 0], 3); FF(D,A,B,C,M[ 1], 7); FF(C,D,A,B,M[ 2],11); + FF(B,C,D,A,M[ 3],19); FF(A,B,C,D,M[ 4], 3); FF(D,A,B,C,M[ 5], 7); + FF(C,D,A,B,M[ 6],11); FF(B,C,D,A,M[ 7],19); FF(A,B,C,D,M[ 8], 3); + FF(D,A,B,C,M[ 9], 7); FF(C,D,A,B,M[10],11); FF(B,C,D,A,M[11],19); + FF(A,B,C,D,M[12], 3); FF(D,A,B,C,M[13], 7); FF(C,D,A,B,M[14],11); + FF(B,C,D,A,M[15],19); + + GG(A,B,C,D,M[ 0], 3); GG(D,A,B,C,M[ 4], 5); GG(C,D,A,B,M[ 8], 9); + GG(B,C,D,A,M[12],13); GG(A,B,C,D,M[ 1], 3); GG(D,A,B,C,M[ 5], 5); + GG(C,D,A,B,M[ 9], 9); GG(B,C,D,A,M[13],13); GG(A,B,C,D,M[ 2], 3); + GG(D,A,B,C,M[ 6], 5); GG(C,D,A,B,M[10], 9); GG(B,C,D,A,M[14],13); + GG(A,B,C,D,M[ 3], 3); GG(D,A,B,C,M[ 7], 5); GG(C,D,A,B,M[11], 9); + GG(B,C,D,A,M[15],13); + + HH(A,B,C,D,M[ 0], 3); HH(D,A,B,C,M[ 8], 9); HH(C,D,A,B,M[ 4],11); + HH(B,C,D,A,M[12],15); HH(A,B,C,D,M[ 2], 3); HH(D,A,B,C,M[10], 9); + HH(C,D,A,B,M[ 6],11); HH(B,C,D,A,M[14],15); HH(A,B,C,D,M[ 1], 3); + HH(D,A,B,C,M[ 9], 9); HH(C,D,A,B,M[ 5],11); HH(B,C,D,A,M[13],15); + HH(A,B,C,D,M[ 3], 3); HH(D,A,B,C,M[11], 9); HH(C,D,A,B,M[ 7],11); + HH(B,C,D,A,M[15],15); + + A = (digest[0] += A); + B = (digest[1] += B); + C = (digest[2] += C); + D = (digest[3] += D); + } + } + +/* +* Copy out the digest +*/ +void MD4::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; j += 4) + store_le(digest[j/4], output + j); + } + +/* +* Clear memory of sensitive data +*/ +void MD4::clear() throw() + { + MDx_HashFunction::clear(); + M.clear(); + digest[0] = 0x67452301; + digest[1] = 0xEFCDAB89; + digest[2] = 0x98BADCFE; + digest[3] = 0x10325476; + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/md4/md4.h b/src/libs/3rdparty/botan/src/hash/md4/md4.h new file mode 100644 index 00000000000..df6f2292d8c --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md4/md4.h @@ -0,0 +1,36 @@ +/* +* MD4 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MD4_H__ +#define BOTAN_MD4_H__ + +#include + +namespace Botan { + +/* +* MD4 +*/ +class BOTAN_DLL MD4 : public MDx_HashFunction + { + public: + void clear() throw(); + std::string name() const { return "MD4"; } + HashFunction* clone() const { return new MD4; } + MD4() : MDx_HashFunction(16, 64, false, true) { clear(); } + protected: + void compress_n(const byte input[], u32bit blocks); + void hash_old(const byte[]); + void copy_out(byte[]); + + SecureBuffer M; + SecureBuffer digest; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/md4_ia32/info.txt b/src/libs/3rdparty/botan/src/hash/md4_ia32/info.txt new file mode 100644 index 00000000000..fee7dd1a81e --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md4_ia32/info.txt @@ -0,0 +1,35 @@ +realname "MD4 (IA-32)" + +define MD4_IA32 + +load_on asm_ok + + +md4_ia32_imp.S +md4_ia32.cpp +md4_ia32.h + + + +ia32 + + + +gcc +icc + + +# ELF systems + +linux +freebsd +dragonfly +netbsd +openbsd +solaris + + + +asm_ia32 +md4 + diff --git a/src/libs/3rdparty/botan/src/hash/md4_ia32/md4_ia32.cpp b/src/libs/3rdparty/botan/src/hash/md4_ia32/md4_ia32.cpp new file mode 100644 index 00000000000..12fe71da4f6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md4_ia32/md4_ia32.cpp @@ -0,0 +1,27 @@ +/* +* MD4 (IA-32) +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +extern "C" void botan_md4_ia32_compress(u32bit[4], const byte[64], u32bit[16]); + +/* +* MD4 Compression Function +*/ +void MD4_IA32::compress_n(const byte input[], u32bit blocks) + { + for(u32bit i = 0; i != blocks; ++i) + { + botan_md4_ia32_compress(digest, input, M); + input += HASH_BLOCK_SIZE; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/md4_ia32/md4_ia32.h b/src/libs/3rdparty/botan/src/hash/md4_ia32/md4_ia32.h new file mode 100644 index 00000000000..f01d148f425 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md4_ia32/md4_ia32.h @@ -0,0 +1,28 @@ +/* +* MD4 (IA-32) +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MD4_IA32_H__ +#define BOTAN_MD4_IA32_H__ + +#include + +namespace Botan { + +/* +* MD4 +*/ +class BOTAN_DLL MD4_IA32 : public MD4 + { + public: + HashFunction* clone() const { return new MD4_IA32; } + private: + void compress_n(const byte[], u32bit blocks); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/md4_ia32/md4_ia32_imp.S b/src/libs/3rdparty/botan/src/hash/md4_ia32/md4_ia32_imp.S new file mode 100644 index 00000000000..ca04cbe4eaa --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md4_ia32/md4_ia32_imp.S @@ -0,0 +1,137 @@ +/* +* MD4 Source File +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +START_LISTING(md4_ia32.S) + +START_FUNCTION(botan_md4_ia32_compress) + SPILL_REGS() + +#define PUSHED 4 + + ASSIGN(EBP, ARG(2)) /* input block */ + ASSIGN(EDI, ARG(3)) /* expanded words */ + + ZEROIZE(ESI) + +START_LOOP(.LOAD_INPUT) + ADD_IMM(ESI, 4) + + ASSIGN(EAX, ARRAY4(EBP, 0)) + ASSIGN(EBX, ARRAY4(EBP, 1)) + ASSIGN(ECX, ARRAY4(EBP, 2)) + ASSIGN(EDX, ARRAY4(EBP, 3)) + + ADD_IMM(EBP, 16) + + ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-4), EAX) + ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-3), EBX) + ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-2), ECX) + ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-1), EDX) +LOOP_UNTIL_EQ(ESI, 16, .LOAD_INPUT) + + ASSIGN(EBP, ARG(1)) + ASSIGN(EAX, ARRAY4(EBP, 0)) + ASSIGN(EBX, ARRAY4(EBP, 1)) + ASSIGN(ECX, ARRAY4(EBP, 2)) + ASSIGN(EDX, ARRAY4(EBP, 3)) + +#define MSG EDI +#define T1 ESI +#define T2 EBP + +#define FF(A, B, C, D, N, S) \ + ASSIGN(T1, ARRAY4(MSG, N)) ; \ + ASSIGN(T2, C) ; \ + XOR(T2, D) ; \ + AND(T2, B) ; \ + XOR(T2, D) ; \ + ADD(A, T1) ; \ + ADD(A, T2) ; \ + ROTL_IMM(A, S) ; + +#define GG(A, B, C, D, N, S) \ + ASSIGN(T1, ARRAY4(MSG, N)) ; \ + ASSIGN(T2, B) ; \ + OR(T2, C) ; \ + AND(T2, D) ; \ + ADD3_IMM(A, T1, 0x5A827999) ; \ + ASSIGN(T1, B) ; \ + AND(T1, C) ; \ + OR(T2, T1) ; \ + ADD(A, T2) ; \ + ROTL_IMM(A, S) ; + +#define HH(A, B, C, D, N, S) \ + ASSIGN(T1, ARRAY4(MSG, N)) ; \ + ASSIGN(T2, B) ; \ + XOR(T2, C) ; \ + XOR(T2, D) ; \ + ADD3_IMM(A, T1, 0x6ED9EBA1) ; \ + ADD(A, T2) ; \ + ROTL_IMM(A, S) ; + + FF(EAX,EBX,ECX,EDX, 0, 3); + FF(EDX,EAX,EBX,ECX, 1, 7); + FF(ECX,EDX,EAX,EBX, 2,11); + FF(EBX,ECX,EDX,EAX, 3,19); + FF(EAX,EBX,ECX,EDX, 4, 3); + FF(EDX,EAX,EBX,ECX, 5, 7); + FF(ECX,EDX,EAX,EBX, 6,11); + FF(EBX,ECX,EDX,EAX, 7,19); + FF(EAX,EBX,ECX,EDX, 8, 3); + FF(EDX,EAX,EBX,ECX, 9, 7); + FF(ECX,EDX,EAX,EBX,10,11); + FF(EBX,ECX,EDX,EAX,11,19); + FF(EAX,EBX,ECX,EDX,12, 3); + FF(EDX,EAX,EBX,ECX,13, 7); + FF(ECX,EDX,EAX,EBX,14,11); + FF(EBX,ECX,EDX,EAX,15,19); + + GG(EAX,EBX,ECX,EDX, 0, 3); + GG(EDX,EAX,EBX,ECX, 4, 5); + GG(ECX,EDX,EAX,EBX, 8, 9); + GG(EBX,ECX,EDX,EAX,12,13); + GG(EAX,EBX,ECX,EDX, 1, 3); + GG(EDX,EAX,EBX,ECX, 5, 5); + GG(ECX,EDX,EAX,EBX, 9, 9); + GG(EBX,ECX,EDX,EAX,13,13); + GG(EAX,EBX,ECX,EDX, 2, 3); + GG(EDX,EAX,EBX,ECX, 6, 5); + GG(ECX,EDX,EAX,EBX,10, 9); + GG(EBX,ECX,EDX,EAX,14,13); + GG(EAX,EBX,ECX,EDX, 3, 3); + GG(EDX,EAX,EBX,ECX, 7, 5); + GG(ECX,EDX,EAX,EBX,11, 9); + GG(EBX,ECX,EDX,EAX,15,13); + + HH(EAX,EBX,ECX,EDX, 0, 3); + HH(EDX,EAX,EBX,ECX, 8, 9); + HH(ECX,EDX,EAX,EBX, 4,11); + HH(EBX,ECX,EDX,EAX,12,15); + HH(EAX,EBX,ECX,EDX, 2, 3); + HH(EDX,EAX,EBX,ECX,10, 9); + HH(ECX,EDX,EAX,EBX, 6,11); + HH(EBX,ECX,EDX,EAX,14,15); + HH(EAX,EBX,ECX,EDX, 1, 3); + HH(EDX,EAX,EBX,ECX, 9, 9); + HH(ECX,EDX,EAX,EBX, 5,11); + HH(EBX,ECX,EDX,EAX,13,15); + HH(EAX,EBX,ECX,EDX, 3, 3); + HH(EDX,EAX,EBX,ECX,11, 9); + HH(ECX,EDX,EAX,EBX, 7,11); + HH(EBX,ECX,EDX,EAX,15,15); + + ASSIGN(EBP, ARG(1)) + ADD(ARRAY4(EBP, 0), EAX) + ADD(ARRAY4(EBP, 1), EBX) + ADD(ARRAY4(EBP, 2), ECX) + ADD(ARRAY4(EBP, 3), EDX) + + RESTORE_REGS() +END_FUNCTION(botan_md4_ia32_compress) diff --git a/src/libs/3rdparty/botan/src/hash/md5/info.txt b/src/libs/3rdparty/botan/src/hash/md5/info.txt new file mode 100644 index 00000000000..525a45ab51c --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md5/info.txt @@ -0,0 +1,14 @@ +realname "MD5" + +define MD5 + +load_on auto + + +md5.cpp +md5.h + + + +mdx_hash + diff --git a/src/libs/3rdparty/botan/src/hash/md5/md5.cpp b/src/libs/3rdparty/botan/src/hash/md5/md5.cpp new file mode 100644 index 00000000000..7c280aab733 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md5/md5.cpp @@ -0,0 +1,136 @@ +/* +* MD5 +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* MD5 FF Function +*/ +inline void FF(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit msg, + byte S, u32bit magic) + { + A += (D ^ (B & (C ^ D))) + msg + magic; + A = rotate_left(A, S) + B; + } + +/* +* MD5 GG Function +*/ +inline void GG(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit msg, + byte S, u32bit magic) + { + A += (C ^ (D & (B ^ C))) + msg + magic; + A = rotate_left(A, S) + B; + } + +/* +* MD5 HH Function +*/ +inline void HH(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit msg, + byte S, u32bit magic) + { + A += (B ^ C ^ D) + msg + magic; + A = rotate_left(A, S) + B; + } + +/* +* MD5 II Function +*/ +inline void II(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit msg, + byte S, u32bit magic) + { + A += (C ^ (B | ~D)) + msg + magic; + A = rotate_left(A, S) + B; + } + +} + +/* +* MD5 Compression Function +*/ +void MD5::compress_n(const byte input[], u32bit blocks) + { + u32bit A = digest[0], B = digest[1], C = digest[2], D = digest[3]; + + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0; j != 16; ++j) + M[j] = load_le(input, j); + input += HASH_BLOCK_SIZE; + + FF(A,B,C,D,M[ 0], 7,0xD76AA478); FF(D,A,B,C,M[ 1],12,0xE8C7B756); + FF(C,D,A,B,M[ 2],17,0x242070DB); FF(B,C,D,A,M[ 3],22,0xC1BDCEEE); + FF(A,B,C,D,M[ 4], 7,0xF57C0FAF); FF(D,A,B,C,M[ 5],12,0x4787C62A); + FF(C,D,A,B,M[ 6],17,0xA8304613); FF(B,C,D,A,M[ 7],22,0xFD469501); + FF(A,B,C,D,M[ 8], 7,0x698098D8); FF(D,A,B,C,M[ 9],12,0x8B44F7AF); + FF(C,D,A,B,M[10],17,0xFFFF5BB1); FF(B,C,D,A,M[11],22,0x895CD7BE); + FF(A,B,C,D,M[12], 7,0x6B901122); FF(D,A,B,C,M[13],12,0xFD987193); + FF(C,D,A,B,M[14],17,0xA679438E); FF(B,C,D,A,M[15],22,0x49B40821); + + GG(A,B,C,D,M[ 1], 5,0xF61E2562); GG(D,A,B,C,M[ 6], 9,0xC040B340); + GG(C,D,A,B,M[11],14,0x265E5A51); GG(B,C,D,A,M[ 0],20,0xE9B6C7AA); + GG(A,B,C,D,M[ 5], 5,0xD62F105D); GG(D,A,B,C,M[10], 9,0x02441453); + GG(C,D,A,B,M[15],14,0xD8A1E681); GG(B,C,D,A,M[ 4],20,0xE7D3FBC8); + GG(A,B,C,D,M[ 9], 5,0x21E1CDE6); GG(D,A,B,C,M[14], 9,0xC33707D6); + GG(C,D,A,B,M[ 3],14,0xF4D50D87); GG(B,C,D,A,M[ 8],20,0x455A14ED); + GG(A,B,C,D,M[13], 5,0xA9E3E905); GG(D,A,B,C,M[ 2], 9,0xFCEFA3F8); + GG(C,D,A,B,M[ 7],14,0x676F02D9); GG(B,C,D,A,M[12],20,0x8D2A4C8A); + + HH(A,B,C,D,M[ 5], 4,0xFFFA3942); HH(D,A,B,C,M[ 8],11,0x8771F681); + HH(C,D,A,B,M[11],16,0x6D9D6122); HH(B,C,D,A,M[14],23,0xFDE5380C); + HH(A,B,C,D,M[ 1], 4,0xA4BEEA44); HH(D,A,B,C,M[ 4],11,0x4BDECFA9); + HH(C,D,A,B,M[ 7],16,0xF6BB4B60); HH(B,C,D,A,M[10],23,0xBEBFBC70); + HH(A,B,C,D,M[13], 4,0x289B7EC6); HH(D,A,B,C,M[ 0],11,0xEAA127FA); + HH(C,D,A,B,M[ 3],16,0xD4EF3085); HH(B,C,D,A,M[ 6],23,0x04881D05); + HH(A,B,C,D,M[ 9], 4,0xD9D4D039); HH(D,A,B,C,M[12],11,0xE6DB99E5); + HH(C,D,A,B,M[15],16,0x1FA27CF8); HH(B,C,D,A,M[ 2],23,0xC4AC5665); + + II(A,B,C,D,M[ 0], 6,0xF4292244); II(D,A,B,C,M[ 7],10,0x432AFF97); + II(C,D,A,B,M[14],15,0xAB9423A7); II(B,C,D,A,M[ 5],21,0xFC93A039); + II(A,B,C,D,M[12], 6,0x655B59C3); II(D,A,B,C,M[ 3],10,0x8F0CCC92); + II(C,D,A,B,M[10],15,0xFFEFF47D); II(B,C,D,A,M[ 1],21,0x85845DD1); + II(A,B,C,D,M[ 8], 6,0x6FA87E4F); II(D,A,B,C,M[15],10,0xFE2CE6E0); + II(C,D,A,B,M[ 6],15,0xA3014314); II(B,C,D,A,M[13],21,0x4E0811A1); + II(A,B,C,D,M[ 4], 6,0xF7537E82); II(D,A,B,C,M[11],10,0xBD3AF235); + II(C,D,A,B,M[ 2],15,0x2AD7D2BB); II(B,C,D,A,M[ 9],21,0xEB86D391); + + A = (digest[0] += A); + B = (digest[1] += B); + C = (digest[2] += C); + D = (digest[3] += D); + } + } + +/* +* Copy out the digest +*/ +void MD5::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; j += 4) + store_le(digest[j/4], output + j); + } + +/* +* Clear memory of sensitive data +*/ +void MD5::clear() throw() + { + MDx_HashFunction::clear(); + M.clear(); + digest[0] = 0x67452301; + digest[1] = 0xEFCDAB89; + digest[2] = 0x98BADCFE; + digest[3] = 0x10325476; + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/md5/md5.h b/src/libs/3rdparty/botan/src/hash/md5/md5.h new file mode 100644 index 00000000000..85f684d8b2c --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md5/md5.h @@ -0,0 +1,35 @@ +/** +* MD5 +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MD5_H__ +#define BOTAN_MD5_H__ + +#include + +namespace Botan { + +/** +* MD5 +*/ +class BOTAN_DLL MD5 : public MDx_HashFunction + { + public: + void clear() throw(); + std::string name() const { return "MD5"; } + HashFunction* clone() const { return new MD5; } + MD5() : MDx_HashFunction(16, 64, false, true) { clear(); } + protected: + void compress_n(const byte[], u32bit blocks); + void copy_out(byte[]); + + SecureBuffer M; + SecureBuffer digest; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/md5_ia32/info.txt b/src/libs/3rdparty/botan/src/hash/md5_ia32/info.txt new file mode 100644 index 00000000000..ad9923b26f2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md5_ia32/info.txt @@ -0,0 +1,35 @@ +realname "MD5 (IA-32)" + +define MD5_IA32 + +load_on asm_ok + + +md5_ia32_imp.S +md5_ia32.cpp +md5_ia32.h + + + +ia32 + + + +gcc +icc + + +# ELF systems + +linux +freebsd +dragonfly +netbsd +openbsd +solaris + + + +asm_ia32 +md5 + diff --git a/src/libs/3rdparty/botan/src/hash/md5_ia32/md5_ia32.cpp b/src/libs/3rdparty/botan/src/hash/md5_ia32/md5_ia32.cpp new file mode 100644 index 00000000000..443569b3bf9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md5_ia32/md5_ia32.cpp @@ -0,0 +1,32 @@ +/* +* MD5 (IA-32) +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace { + +extern "C" +void botan_md5_ia32_compress(u32bit[4], const byte[64], u32bit[16]); + +} + +/* +* MD5 Compression Function +*/ +void MD5_IA32::compress_n(const byte input[], u32bit blocks) + { + for(u32bit i = 0; i != blocks; ++i) + { + botan_md5_ia32_compress(digest, input, M); + input += HASH_BLOCK_SIZE; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/md5_ia32/md5_ia32.h b/src/libs/3rdparty/botan/src/hash/md5_ia32/md5_ia32.h new file mode 100644 index 00000000000..723d724de15 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md5_ia32/md5_ia32.h @@ -0,0 +1,28 @@ +/* +* MD5 (IA-32) +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MD5_IA32_H__ +#define BOTAN_MD5_IA32_H__ + +#include + +namespace Botan { + +/* +* MD5 +*/ +class BOTAN_DLL MD5_IA32 : public MD5 + { + public: + HashFunction* clone() const { return new MD5_IA32; } + private: + void compress_n(const byte[], u32bit blocks); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/md5_ia32/md5_ia32_imp.S b/src/libs/3rdparty/botan/src/hash/md5_ia32/md5_ia32_imp.S new file mode 100644 index 00000000000..8087bbdbc44 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/md5_ia32/md5_ia32_imp.S @@ -0,0 +1,166 @@ +/* +* MD5 Source File +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +START_LISTING(md5_ia32.S) + +START_FUNCTION(botan_md5_ia32_compress) + SPILL_REGS() + +#define PUSHED 4 + + ASSIGN(EBP, ARG(2)) /* input block */ + ASSIGN(EDI, ARG(3)) /* expanded words */ + + ZEROIZE(ESI) + +START_LOOP(.LOAD_INPUT) + ADD_IMM(ESI, 4) + + ASSIGN(EAX, ARRAY4(EBP, 0)) + ASSIGN(EBX, ARRAY4(EBP, 1)) + ASSIGN(ECX, ARRAY4(EBP, 2)) + ASSIGN(EDX, ARRAY4(EBP, 3)) + + ADD_IMM(EBP, 16) + + ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-4), EAX) + ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-3), EBX) + ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-2), ECX) + ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-1), EDX) +LOOP_UNTIL_EQ(ESI, 16, .LOAD_INPUT) + + ASSIGN(EBP, ARG(1)) + ASSIGN(EAX, ARRAY4(EBP, 0)) + ASSIGN(EBX, ARRAY4(EBP, 1)) + ASSIGN(ECX, ARRAY4(EBP, 2)) + ASSIGN(EDX, ARRAY4(EBP, 3)) + +#define MSG EDI +#define T1 ESI +#define T2 EBP + +#define FF(A, B, C, D, N, S, MAGIC) \ + ASSIGN(T1, ARRAY4(MSG, N)) ; \ + ASSIGN(T2, C) ; \ + XOR(T2, D) ; \ + AND(T2, B) ; \ + XOR(T2, D) ; \ + ADD3_IMM(A, T1, MAGIC) ; \ + ADD(A, T2) ; \ + ROTL_IMM(A, S) ; \ + ADD(A, B) ; + +#define GG(A, B, C, D, N, S, MAGIC) \ + ASSIGN(T1, ARRAY4(MSG, N)) ; \ + ASSIGN(T2, B) ; \ + XOR(T2, C) ; \ + AND(T2, D) ; \ + XOR(T2, C) ; \ + ADD3_IMM(A, T1, MAGIC) ; \ + ADD(A, T2) ; \ + ROTL_IMM(A, S) ; \ + ADD(A, B) ; + +#define HH(A, B, C, D, N, S, MAGIC) \ + ASSIGN(T1, ARRAY4(MSG, N)) ; \ + ASSIGN(T2, B) ; \ + XOR(T2, C) ; \ + XOR(T2, D) ; \ + ADD3_IMM(A, T1, MAGIC) ; \ + ADD(A, T2) ; \ + ROTL_IMM(A, S) ; \ + ADD(A, B) ; + +#define II(A, B, C, D, N, S, MAGIC) \ + ASSIGN(T1, ARRAY4(MSG, N)) ; \ + ASSIGN(T2, D) ; \ + NOT(T2) ; \ + OR(T2, B) ; \ + XOR(T2, C) ; \ + ADD3_IMM(A, T1, MAGIC) ; \ + ADD(A, T2) ; \ + ROTL_IMM(A, S) ; \ + ADD(A, B) ; + + FF(EAX,EBX,ECX,EDX, 0, 7,0xD76AA478); + FF(EDX,EAX,EBX,ECX, 1,12,0xE8C7B756); + FF(ECX,EDX,EAX,EBX, 2,17,0x242070DB); + FF(EBX,ECX,EDX,EAX, 3,22,0xC1BDCEEE); + FF(EAX,EBX,ECX,EDX, 4, 7,0xF57C0FAF); + FF(EDX,EAX,EBX,ECX, 5,12,0x4787C62A); + FF(ECX,EDX,EAX,EBX, 6,17,0xA8304613); + FF(EBX,ECX,EDX,EAX, 7,22,0xFD469501); + FF(EAX,EBX,ECX,EDX, 8, 7,0x698098D8); + FF(EDX,EAX,EBX,ECX, 9,12,0x8B44F7AF); + FF(ECX,EDX,EAX,EBX,10,17,0xFFFF5BB1); + FF(EBX,ECX,EDX,EAX,11,22,0x895CD7BE); + FF(EAX,EBX,ECX,EDX,12, 7,0x6B901122); + FF(EDX,EAX,EBX,ECX,13,12,0xFD987193); + FF(ECX,EDX,EAX,EBX,14,17,0xA679438E); + FF(EBX,ECX,EDX,EAX,15,22,0x49B40821); + + GG(EAX,EBX,ECX,EDX, 1, 5,0xF61E2562); + GG(EDX,EAX,EBX,ECX, 6, 9,0xC040B340); + GG(ECX,EDX,EAX,EBX,11,14,0x265E5A51); + GG(EBX,ECX,EDX,EAX, 0,20,0xE9B6C7AA); + GG(EAX,EBX,ECX,EDX, 5, 5,0xD62F105D); + GG(EDX,EAX,EBX,ECX,10, 9,0x02441453); + GG(ECX,EDX,EAX,EBX,15,14,0xD8A1E681); + GG(EBX,ECX,EDX,EAX, 4,20,0xE7D3FBC8); + GG(EAX,EBX,ECX,EDX, 9, 5,0x21E1CDE6); + GG(EDX,EAX,EBX,ECX,14, 9,0xC33707D6); + GG(ECX,EDX,EAX,EBX, 3,14,0xF4D50D87); + GG(EBX,ECX,EDX,EAX, 8,20,0x455A14ED); + GG(EAX,EBX,ECX,EDX,13, 5,0xA9E3E905); + GG(EDX,EAX,EBX,ECX, 2, 9,0xFCEFA3F8); + GG(ECX,EDX,EAX,EBX, 7,14,0x676F02D9); + GG(EBX,ECX,EDX,EAX,12,20,0x8D2A4C8A); + + HH(EAX,EBX,ECX,EDX, 5, 4,0xFFFA3942); + HH(EDX,EAX,EBX,ECX, 8,11,0x8771F681); + HH(ECX,EDX,EAX,EBX,11,16,0x6D9D6122); + HH(EBX,ECX,EDX,EAX,14,23,0xFDE5380C); + HH(EAX,EBX,ECX,EDX, 1, 4,0xA4BEEA44); + HH(EDX,EAX,EBX,ECX, 4,11,0x4BDECFA9); + HH(ECX,EDX,EAX,EBX, 7,16,0xF6BB4B60); + HH(EBX,ECX,EDX,EAX,10,23,0xBEBFBC70); + HH(EAX,EBX,ECX,EDX,13, 4,0x289B7EC6); + HH(EDX,EAX,EBX,ECX, 0,11,0xEAA127FA); + HH(ECX,EDX,EAX,EBX, 3,16,0xD4EF3085); + HH(EBX,ECX,EDX,EAX, 6,23,0x04881D05); + HH(EAX,EBX,ECX,EDX, 9, 4,0xD9D4D039); + HH(EDX,EAX,EBX,ECX,12,11,0xE6DB99E5); + HH(ECX,EDX,EAX,EBX,15,16,0x1FA27CF8); + HH(EBX,ECX,EDX,EAX, 2,23,0xC4AC5665); + + II(EAX,EBX,ECX,EDX, 0, 6,0xF4292244); + II(EDX,EAX,EBX,ECX, 7,10,0x432AFF97); + II(ECX,EDX,EAX,EBX,14,15,0xAB9423A7); + II(EBX,ECX,EDX,EAX, 5,21,0xFC93A039); + II(EAX,EBX,ECX,EDX,12, 6,0x655B59C3); + II(EDX,EAX,EBX,ECX, 3,10,0x8F0CCC92); + II(ECX,EDX,EAX,EBX,10,15,0xFFEFF47D); + II(EBX,ECX,EDX,EAX, 1,21,0x85845DD1); + II(EAX,EBX,ECX,EDX, 8, 6,0x6FA87E4F); + II(EDX,EAX,EBX,ECX,15,10,0xFE2CE6E0); + II(ECX,EDX,EAX,EBX, 6,15,0xA3014314); + II(EBX,ECX,EDX,EAX,13,21,0x4E0811A1); + II(EAX,EBX,ECX,EDX, 4, 6,0xF7537E82); + II(EDX,EAX,EBX,ECX,11,10,0xBD3AF235); + II(ECX,EDX,EAX,EBX, 2,15,0x2AD7D2BB); + II(EBX,ECX,EDX,EAX, 9,21,0xEB86D391); + + ASSIGN(EBP, ARG(1)) + ADD(ARRAY4(EBP, 0), EAX) + ADD(ARRAY4(EBP, 1), EBX) + ADD(ARRAY4(EBP, 2), ECX) + ADD(ARRAY4(EBP, 3), EDX) + + RESTORE_REGS() +END_FUNCTION(botan_md5_ia32_compress) diff --git a/src/libs/3rdparty/botan/src/hash/mdx_hash/info.txt b/src/libs/3rdparty/botan/src/hash/mdx_hash/info.txt new file mode 100644 index 00000000000..412c9335086 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/mdx_hash/info.txt @@ -0,0 +1,10 @@ +realname "MDx Hash Base" + +define MDX_HASH_FUNCTION + +load_on dep + + +mdx_hash.cpp +mdx_hash.h + diff --git a/src/libs/3rdparty/botan/src/hash/mdx_hash/mdx_hash.cpp b/src/libs/3rdparty/botan/src/hash/mdx_hash/mdx_hash.cpp new file mode 100644 index 00000000000..b630ec227bf --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/mdx_hash/mdx_hash.cpp @@ -0,0 +1,105 @@ +/** +* Merkle-Damgard Hash Function +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/** +* MDx_HashFunction Constructor +*/ +MDx_HashFunction::MDx_HashFunction(u32bit hash_len, u32bit block_len, + bool byte_end, bool bit_end, + u32bit cnt_size) : + HashFunction(hash_len, block_len), buffer(block_len), + BIG_BYTE_ENDIAN(byte_end), BIG_BIT_ENDIAN(bit_end), COUNT_SIZE(cnt_size) + { + if(COUNT_SIZE >= OUTPUT_LENGTH || COUNT_SIZE >= HASH_BLOCK_SIZE) + throw Invalid_Argument("MDx_HashFunction: COUNT_SIZE is too big"); + count = position = 0; + } + +/** +* Clear memory of sensitive data +*/ +void MDx_HashFunction::clear() throw() + { + buffer.clear(); + count = position = 0; + } + +/** +* Update the hash +*/ +void MDx_HashFunction::add_data(const byte input[], u32bit length) + { + count += length; + + if(position) + { + buffer.copy(position, input, length); + + if(position + length >= HASH_BLOCK_SIZE) + { + compress_n(buffer.begin(), 1); + input += (HASH_BLOCK_SIZE - position); + length -= (HASH_BLOCK_SIZE - position); + position = 0; + } + } + + const u32bit full_blocks = length / HASH_BLOCK_SIZE; + const u32bit remaining = length % HASH_BLOCK_SIZE; + + if(full_blocks) + compress_n(input, full_blocks); + + buffer.copy(position, input + full_blocks * HASH_BLOCK_SIZE, remaining); + position += remaining; + } + +/** +* Finalize a hash +*/ +void MDx_HashFunction::final_result(byte output[]) + { + buffer[position] = (BIG_BIT_ENDIAN ? 0x80 : 0x01); + for(u32bit j = position+1; j != HASH_BLOCK_SIZE; ++j) + buffer[j] = 0; + + if(position >= HASH_BLOCK_SIZE - COUNT_SIZE) + { + compress_n(buffer, 1); + buffer.clear(); + } + + write_count(buffer + HASH_BLOCK_SIZE - COUNT_SIZE); + + compress_n(buffer, 1); + copy_out(output); + clear(); + } + +/** +* Write the count bits to the buffer +*/ +void MDx_HashFunction::write_count(byte out[]) + { + if(COUNT_SIZE < 8) + throw Invalid_State("MDx_HashFunction::write_count: COUNT_SIZE < 8"); + + const u64bit bit_count = count * 8; + + if(BIG_BYTE_ENDIAN) + store_be(bit_count, out + COUNT_SIZE - 8); + else + store_le(bit_count, out + COUNT_SIZE - 8); + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/mdx_hash/mdx_hash.h b/src/libs/3rdparty/botan/src/hash/mdx_hash/mdx_hash.h new file mode 100644 index 00000000000..0c3aa780697 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/mdx_hash/mdx_hash.h @@ -0,0 +1,42 @@ +/** +* MDx Hash Function +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MDX_BASE_H__ +#define BOTAN_MDX_BASE_H__ + +#include + +namespace Botan { + +/** +* MDx Hash Function Base Class +*/ +class BOTAN_DLL MDx_HashFunction : public HashFunction + { + public: + MDx_HashFunction(u32bit, u32bit, bool, bool, u32bit = 8); + virtual ~MDx_HashFunction() {} + protected: + void add_data(const byte[], u32bit); + void final_result(byte output[]); + virtual void compress_n(const byte block[], u32bit block_n) = 0; + + void clear() throw(); + virtual void copy_out(byte[]) = 0; + virtual void write_count(byte[]); + private: + SecureVector buffer; + u64bit count; + u32bit position; + + const bool BIG_BYTE_ENDIAN, BIG_BIT_ENDIAN; + const u32bit COUNT_SIZE; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/par_hash/info.txt b/src/libs/3rdparty/botan/src/hash/par_hash/info.txt new file mode 100644 index 00000000000..45716aac817 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/par_hash/info.txt @@ -0,0 +1,10 @@ +realname "Parallel Hash" + +define PARALLEL_HASH + +load_on auto + + +par_hash.cpp +par_hash.h + diff --git a/src/libs/3rdparty/botan/src/hash/par_hash/par_hash.cpp b/src/libs/3rdparty/botan/src/hash/par_hash/par_hash.cpp new file mode 100644 index 00000000000..4b0c7c46699 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/par_hash/par_hash.cpp @@ -0,0 +1,103 @@ +/* +* Parallel +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +namespace { + +/* +* Return the sum of the hash sizes +*/ +u32bit sum_of_hash_lengths(const std::vector& hashes) + { + u32bit sum = 0; + + for(u32bit j = 0; j != hashes.size(); ++j) + sum += hashes[j]->OUTPUT_LENGTH; + + return sum; + } + +} + +/* +* Update the hash +*/ +void Parallel::add_data(const byte input[], u32bit length) + { + for(u32bit j = 0; j != hashes.size(); ++j) + hashes[j]->update(input, length); + } + +/* +* Finalize the hash +*/ +void Parallel::final_result(byte hash[]) + { + u32bit offset = 0; + for(u32bit j = 0; j != hashes.size(); ++j) + { + hashes[j]->final(hash + offset); + offset += hashes[j]->OUTPUT_LENGTH; + } + } + +/* +* Return the name of this type +*/ +std::string Parallel::name() const + { + std::string hash_names; + for(u32bit j = 0; j != hashes.size(); ++j) + { + if(j) + hash_names += ','; + hash_names += hashes[j]->name(); + } + return "Parallel(" + hash_names + ")"; + } + +/* +* Return a clone of this object +*/ +HashFunction* Parallel::clone() const + { + std::vector hash_copies; + for(u32bit j = 0; j != hashes.size(); ++j) + hash_copies.push_back(hashes[j]->clone()); + return new Parallel(hash_copies); + } + +/* +* Clear memory of sensitive data +*/ +void Parallel::clear() throw() + { + for(u32bit j = 0; j != hashes.size(); ++j) + hashes[j]->clear(); + } + +/* +* Parallel Constructor +*/ +Parallel::Parallel(const std::vector& hash_in) : + HashFunction(sum_of_hash_lengths(hash_in)), hashes(hash_in) + { + } + +/* +* Parallel Destructor +*/ +Parallel::~Parallel() + { + for(u32bit j = 0; j != hashes.size(); ++j) + delete hashes[j]; + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/par_hash/par_hash.h b/src/libs/3rdparty/botan/src/hash/par_hash/par_hash.h new file mode 100644 index 00000000000..7e75c27bec2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/par_hash/par_hash.h @@ -0,0 +1,36 @@ +/* +* Parallel Hash +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PARALLEL_HASH_H__ +#define BOTAN_PARALLEL_HASH_H__ + +#include +#include + +namespace Botan { + +/* +* Parallel +*/ +class BOTAN_DLL Parallel : public HashFunction + { + public: + void clear() throw(); + std::string name() const; + HashFunction* clone() const; + + Parallel(const std::vector&); + ~Parallel(); + private: + void add_data(const byte[], u32bit); + void final_result(byte[]); + std::vector hashes; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/rmd128/info.txt b/src/libs/3rdparty/botan/src/hash/rmd128/info.txt new file mode 100644 index 00000000000..402271da5e8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/rmd128/info.txt @@ -0,0 +1,14 @@ +realname "RIPEMD-128" + +define RIPEMD_128 + +load_on auto + + +rmd128.cpp +rmd128.h + + + +mdx_hash + diff --git a/src/libs/3rdparty/botan/src/hash/rmd128/rmd128.cpp b/src/libs/3rdparty/botan/src/hash/rmd128/rmd128.cpp new file mode 100644 index 00000000000..8b2c0ccf826 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/rmd128/rmd128.cpp @@ -0,0 +1,172 @@ +/* +* RIPEMD-128 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* RIPEMD-128 F1 Function +*/ +inline void F1(u32bit& A, u32bit B, u32bit C, u32bit D, + u32bit msg, u32bit shift) + { + A += (B ^ C ^ D) + msg; + A = rotate_left(A, shift); + } + +/* +* RIPEMD-128 F2 Function +*/ +inline void F2(u32bit& A, u32bit B, u32bit C, u32bit D, + u32bit msg, u32bit shift, u32bit magic) + { + A += (D ^ (B & (C ^ D))) + msg + magic; + A = rotate_left(A, shift); + } + +/* +* RIPEMD-128 F3 Function +*/ +inline void F3(u32bit& A, u32bit B, u32bit C, u32bit D, + u32bit msg, u32bit shift, u32bit magic) + { + A += (D ^ (B | ~C)) + msg + magic; + A = rotate_left(A, shift); + } + +/* +* RIPEMD-128 F4 Function +*/ +inline void F4(u32bit& A, u32bit B, u32bit C, u32bit D, + u32bit msg, u32bit shift, u32bit magic) + { + A += (C ^ (D & (B ^ C))) + msg + magic; + A = rotate_left(A, shift); + } + +} + +/* +* RIPEMD-128 Compression Function +*/ +void RIPEMD_128::compress_n(const byte input[], u32bit blocks) + { + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0; j != 16; ++j) + M[j] = load_le(input, j); + input += HASH_BLOCK_SIZE; + + u32bit A1 = digest[0], A2 = A1, B1 = digest[1], B2 = B1, + C1 = digest[2], C2 = C1, D1 = digest[3], D2 = D1; + + const u32bit MAGIC2 = 0x5A827999, MAGIC3 = 0x6ED9EBA1, + MAGIC4 = 0x8F1BBCDC, MAGIC5 = 0x50A28BE6, + MAGIC6 = 0x5C4DD124, MAGIC7 = 0x6D703EF3; + + F1(A1,B1,C1,D1,M[ 0],11 ); F4(A2,B2,C2,D2,M[ 5], 8,MAGIC5); + F1(D1,A1,B1,C1,M[ 1],14 ); F4(D2,A2,B2,C2,M[14], 9,MAGIC5); + F1(C1,D1,A1,B1,M[ 2],15 ); F4(C2,D2,A2,B2,M[ 7], 9,MAGIC5); + F1(B1,C1,D1,A1,M[ 3],12 ); F4(B2,C2,D2,A2,M[ 0],11,MAGIC5); + F1(A1,B1,C1,D1,M[ 4], 5 ); F4(A2,B2,C2,D2,M[ 9],13,MAGIC5); + F1(D1,A1,B1,C1,M[ 5], 8 ); F4(D2,A2,B2,C2,M[ 2],15,MAGIC5); + F1(C1,D1,A1,B1,M[ 6], 7 ); F4(C2,D2,A2,B2,M[11],15,MAGIC5); + F1(B1,C1,D1,A1,M[ 7], 9 ); F4(B2,C2,D2,A2,M[ 4], 5,MAGIC5); + F1(A1,B1,C1,D1,M[ 8],11 ); F4(A2,B2,C2,D2,M[13], 7,MAGIC5); + F1(D1,A1,B1,C1,M[ 9],13 ); F4(D2,A2,B2,C2,M[ 6], 7,MAGIC5); + F1(C1,D1,A1,B1,M[10],14 ); F4(C2,D2,A2,B2,M[15], 8,MAGIC5); + F1(B1,C1,D1,A1,M[11],15 ); F4(B2,C2,D2,A2,M[ 8],11,MAGIC5); + F1(A1,B1,C1,D1,M[12], 6 ); F4(A2,B2,C2,D2,M[ 1],14,MAGIC5); + F1(D1,A1,B1,C1,M[13], 7 ); F4(D2,A2,B2,C2,M[10],14,MAGIC5); + F1(C1,D1,A1,B1,M[14], 9 ); F4(C2,D2,A2,B2,M[ 3],12,MAGIC5); + F1(B1,C1,D1,A1,M[15], 8 ); F4(B2,C2,D2,A2,M[12], 6,MAGIC5); + + F2(A1,B1,C1,D1,M[ 7], 7,MAGIC2); F3(A2,B2,C2,D2,M[ 6], 9,MAGIC6); + F2(D1,A1,B1,C1,M[ 4], 6,MAGIC2); F3(D2,A2,B2,C2,M[11],13,MAGIC6); + F2(C1,D1,A1,B1,M[13], 8,MAGIC2); F3(C2,D2,A2,B2,M[ 3],15,MAGIC6); + F2(B1,C1,D1,A1,M[ 1],13,MAGIC2); F3(B2,C2,D2,A2,M[ 7], 7,MAGIC6); + F2(A1,B1,C1,D1,M[10],11,MAGIC2); F3(A2,B2,C2,D2,M[ 0],12,MAGIC6); + F2(D1,A1,B1,C1,M[ 6], 9,MAGIC2); F3(D2,A2,B2,C2,M[13], 8,MAGIC6); + F2(C1,D1,A1,B1,M[15], 7,MAGIC2); F3(C2,D2,A2,B2,M[ 5], 9,MAGIC6); + F2(B1,C1,D1,A1,M[ 3],15,MAGIC2); F3(B2,C2,D2,A2,M[10],11,MAGIC6); + F2(A1,B1,C1,D1,M[12], 7,MAGIC2); F3(A2,B2,C2,D2,M[14], 7,MAGIC6); + F2(D1,A1,B1,C1,M[ 0],12,MAGIC2); F3(D2,A2,B2,C2,M[15], 7,MAGIC6); + F2(C1,D1,A1,B1,M[ 9],15,MAGIC2); F3(C2,D2,A2,B2,M[ 8],12,MAGIC6); + F2(B1,C1,D1,A1,M[ 5], 9,MAGIC2); F3(B2,C2,D2,A2,M[12], 7,MAGIC6); + F2(A1,B1,C1,D1,M[ 2],11,MAGIC2); F3(A2,B2,C2,D2,M[ 4], 6,MAGIC6); + F2(D1,A1,B1,C1,M[14], 7,MAGIC2); F3(D2,A2,B2,C2,M[ 9],15,MAGIC6); + F2(C1,D1,A1,B1,M[11],13,MAGIC2); F3(C2,D2,A2,B2,M[ 1],13,MAGIC6); + F2(B1,C1,D1,A1,M[ 8],12,MAGIC2); F3(B2,C2,D2,A2,M[ 2],11,MAGIC6); + + F3(A1,B1,C1,D1,M[ 3],11,MAGIC3); F2(A2,B2,C2,D2,M[15], 9,MAGIC7); + F3(D1,A1,B1,C1,M[10],13,MAGIC3); F2(D2,A2,B2,C2,M[ 5], 7,MAGIC7); + F3(C1,D1,A1,B1,M[14], 6,MAGIC3); F2(C2,D2,A2,B2,M[ 1],15,MAGIC7); + F3(B1,C1,D1,A1,M[ 4], 7,MAGIC3); F2(B2,C2,D2,A2,M[ 3],11,MAGIC7); + F3(A1,B1,C1,D1,M[ 9],14,MAGIC3); F2(A2,B2,C2,D2,M[ 7], 8,MAGIC7); + F3(D1,A1,B1,C1,M[15], 9,MAGIC3); F2(D2,A2,B2,C2,M[14], 6,MAGIC7); + F3(C1,D1,A1,B1,M[ 8],13,MAGIC3); F2(C2,D2,A2,B2,M[ 6], 6,MAGIC7); + F3(B1,C1,D1,A1,M[ 1],15,MAGIC3); F2(B2,C2,D2,A2,M[ 9],14,MAGIC7); + F3(A1,B1,C1,D1,M[ 2],14,MAGIC3); F2(A2,B2,C2,D2,M[11],12,MAGIC7); + F3(D1,A1,B1,C1,M[ 7], 8,MAGIC3); F2(D2,A2,B2,C2,M[ 8],13,MAGIC7); + F3(C1,D1,A1,B1,M[ 0],13,MAGIC3); F2(C2,D2,A2,B2,M[12], 5,MAGIC7); + F3(B1,C1,D1,A1,M[ 6], 6,MAGIC3); F2(B2,C2,D2,A2,M[ 2],14,MAGIC7); + F3(A1,B1,C1,D1,M[13], 5,MAGIC3); F2(A2,B2,C2,D2,M[10],13,MAGIC7); + F3(D1,A1,B1,C1,M[11],12,MAGIC3); F2(D2,A2,B2,C2,M[ 0],13,MAGIC7); + F3(C1,D1,A1,B1,M[ 5], 7,MAGIC3); F2(C2,D2,A2,B2,M[ 4], 7,MAGIC7); + F3(B1,C1,D1,A1,M[12], 5,MAGIC3); F2(B2,C2,D2,A2,M[13], 5,MAGIC7); + + F4(A1,B1,C1,D1,M[ 1],11,MAGIC4); F1(A2,B2,C2,D2,M[ 8],15 ); + F4(D1,A1,B1,C1,M[ 9],12,MAGIC4); F1(D2,A2,B2,C2,M[ 6], 5 ); + F4(C1,D1,A1,B1,M[11],14,MAGIC4); F1(C2,D2,A2,B2,M[ 4], 8 ); + F4(B1,C1,D1,A1,M[10],15,MAGIC4); F1(B2,C2,D2,A2,M[ 1],11 ); + F4(A1,B1,C1,D1,M[ 0],14,MAGIC4); F1(A2,B2,C2,D2,M[ 3],14 ); + F4(D1,A1,B1,C1,M[ 8],15,MAGIC4); F1(D2,A2,B2,C2,M[11],14 ); + F4(C1,D1,A1,B1,M[12], 9,MAGIC4); F1(C2,D2,A2,B2,M[15], 6 ); + F4(B1,C1,D1,A1,M[ 4], 8,MAGIC4); F1(B2,C2,D2,A2,M[ 0],14 ); + F4(A1,B1,C1,D1,M[13], 9,MAGIC4); F1(A2,B2,C2,D2,M[ 5], 6 ); + F4(D1,A1,B1,C1,M[ 3],14,MAGIC4); F1(D2,A2,B2,C2,M[12], 9 ); + F4(C1,D1,A1,B1,M[ 7], 5,MAGIC4); F1(C2,D2,A2,B2,M[ 2],12 ); + F4(B1,C1,D1,A1,M[15], 6,MAGIC4); F1(B2,C2,D2,A2,M[13], 9 ); + F4(A1,B1,C1,D1,M[14], 8,MAGIC4); F1(A2,B2,C2,D2,M[ 9],12 ); + F4(D1,A1,B1,C1,M[ 5], 6,MAGIC4); F1(D2,A2,B2,C2,M[ 7], 5 ); + F4(C1,D1,A1,B1,M[ 6], 5,MAGIC4); F1(C2,D2,A2,B2,M[10],15 ); + F4(B1,C1,D1,A1,M[ 2],12,MAGIC4); F1(B2,C2,D2,A2,M[14], 8 ); + + D2 = digest[1] + C1 + D2; digest[1] = digest[2] + D1 + A2; + digest[2] = digest[3] + A1 + B2; digest[3] = digest[0] + B1 + C2; + digest[0] = D2; + } + } + +/* +* Copy out the digest +*/ +void RIPEMD_128::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; j += 4) + store_le(digest[j/4], output + j); + } + +/* +* Clear memory of sensitive data +*/ +void RIPEMD_128::clear() throw() + { + MDx_HashFunction::clear(); + M.clear(); + digest[0] = 0x67452301; + digest[1] = 0xEFCDAB89; + digest[2] = 0x98BADCFE; + digest[3] = 0x10325476; + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/rmd128/rmd128.h b/src/libs/3rdparty/botan/src/hash/rmd128/rmd128.h new file mode 100644 index 00000000000..031ae57467e --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/rmd128/rmd128.h @@ -0,0 +1,35 @@ +/* +* RIPEMD-128 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_RIPEMD_128_H__ +#define BOTAN_RIPEMD_128_H__ + +#include + +namespace Botan { + +/* +* RIPEMD-128 +*/ +class BOTAN_DLL RIPEMD_128 : public MDx_HashFunction + { + public: + void clear() throw(); + std::string name() const { return "RIPEMD-128"; } + HashFunction* clone() const { return new RIPEMD_128; } + RIPEMD_128() : MDx_HashFunction(16, 64, false, true) { clear(); } + private: + void compress_n(const byte[], u32bit blocks); + void copy_out(byte[]); + + SecureBuffer M; + SecureBuffer digest; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/rmd160/info.txt b/src/libs/3rdparty/botan/src/hash/rmd160/info.txt new file mode 100644 index 00000000000..af4b5c23086 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/rmd160/info.txt @@ -0,0 +1,14 @@ +realname "RIPEMD-160" + +define RIPEMD_160 + +load_on auto + + +rmd160.cpp +rmd160.h + + + +mdx_hash + diff --git a/src/libs/3rdparty/botan/src/hash/rmd160/rmd160.cpp b/src/libs/3rdparty/botan/src/hash/rmd160/rmd160.cpp new file mode 100644 index 00000000000..863de848794 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/rmd160/rmd160.cpp @@ -0,0 +1,210 @@ +/* +* RIPEMD-160 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* RIPEMD-160 F1 Function +*/ +inline void F1(u32bit& A, u32bit B, u32bit& C, u32bit D, u32bit E, + u32bit msg, u32bit shift) + { + A += (B ^ C ^ D) + msg; + A = rotate_left(A, shift) + E; + C = rotate_left(C, 10); + } + +/* +* RIPEMD-160 F2 Function +*/ +inline void F2(u32bit& A, u32bit B, u32bit& C, u32bit D, u32bit E, + u32bit msg, u32bit shift, u32bit magic) + { + A += (D ^ (B & (C ^ D))) + msg + magic; + A = rotate_left(A, shift) + E; + C = rotate_left(C, 10); + } + +/* +* RIPEMD-160 F3 Function +*/ +inline void F3(u32bit& A, u32bit B, u32bit& C, u32bit D, u32bit E, + u32bit msg, u32bit shift, u32bit magic) + { + A += (D ^ (B | ~C)) + msg + magic; + A = rotate_left(A, shift) + E; + C = rotate_left(C, 10); + } + +/* +* RIPEMD-160 F4 Function +*/ +inline void F4(u32bit& A, u32bit B, u32bit& C, u32bit D, u32bit E, + u32bit msg, u32bit shift, u32bit magic) + { + A += (C ^ (D & (B ^ C))) + msg + magic; + A = rotate_left(A, shift) + E; + C = rotate_left(C, 10); + } + +/* +* RIPEMD-160 F5 Function +*/ +inline void F5(u32bit& A, u32bit B, u32bit& C, u32bit D, u32bit E, + u32bit msg, u32bit shift, u32bit magic) + { + A += (B ^ (C | ~D)) + msg + magic; + A = rotate_left(A, shift) + E; + C = rotate_left(C, 10); + } + +} + +/* +* RIPEMD-160 Compression Function +*/ +void RIPEMD_160::compress_n(const byte input[], u32bit blocks) + { + const u32bit MAGIC2 = 0x5A827999, MAGIC3 = 0x6ED9EBA1, + MAGIC4 = 0x8F1BBCDC, MAGIC5 = 0xA953FD4E, + MAGIC6 = 0x50A28BE6, MAGIC7 = 0x5C4DD124, + MAGIC8 = 0x6D703EF3, MAGIC9 = 0x7A6D76E9; + + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0; j != 16; ++j) + M[j] = load_le(input, j); + input += HASH_BLOCK_SIZE; + + u32bit A1 = digest[0], A2 = A1, B1 = digest[1], B2 = B1, + C1 = digest[2], C2 = C1, D1 = digest[3], D2 = D1, + E1 = digest[4], E2 = E1; + + F1(A1,B1,C1,D1,E1,M[ 0],11 ); F5(A2,B2,C2,D2,E2,M[ 5], 8,MAGIC6); + F1(E1,A1,B1,C1,D1,M[ 1],14 ); F5(E2,A2,B2,C2,D2,M[14], 9,MAGIC6); + F1(D1,E1,A1,B1,C1,M[ 2],15 ); F5(D2,E2,A2,B2,C2,M[ 7], 9,MAGIC6); + F1(C1,D1,E1,A1,B1,M[ 3],12 ); F5(C2,D2,E2,A2,B2,M[ 0],11,MAGIC6); + F1(B1,C1,D1,E1,A1,M[ 4], 5 ); F5(B2,C2,D2,E2,A2,M[ 9],13,MAGIC6); + F1(A1,B1,C1,D1,E1,M[ 5], 8 ); F5(A2,B2,C2,D2,E2,M[ 2],15,MAGIC6); + F1(E1,A1,B1,C1,D1,M[ 6], 7 ); F5(E2,A2,B2,C2,D2,M[11],15,MAGIC6); + F1(D1,E1,A1,B1,C1,M[ 7], 9 ); F5(D2,E2,A2,B2,C2,M[ 4], 5,MAGIC6); + F1(C1,D1,E1,A1,B1,M[ 8],11 ); F5(C2,D2,E2,A2,B2,M[13], 7,MAGIC6); + F1(B1,C1,D1,E1,A1,M[ 9],13 ); F5(B2,C2,D2,E2,A2,M[ 6], 7,MAGIC6); + F1(A1,B1,C1,D1,E1,M[10],14 ); F5(A2,B2,C2,D2,E2,M[15], 8,MAGIC6); + F1(E1,A1,B1,C1,D1,M[11],15 ); F5(E2,A2,B2,C2,D2,M[ 8],11,MAGIC6); + F1(D1,E1,A1,B1,C1,M[12], 6 ); F5(D2,E2,A2,B2,C2,M[ 1],14,MAGIC6); + F1(C1,D1,E1,A1,B1,M[13], 7 ); F5(C2,D2,E2,A2,B2,M[10],14,MAGIC6); + F1(B1,C1,D1,E1,A1,M[14], 9 ); F5(B2,C2,D2,E2,A2,M[ 3],12,MAGIC6); + F1(A1,B1,C1,D1,E1,M[15], 8 ); F5(A2,B2,C2,D2,E2,M[12], 6,MAGIC6); + + F2(E1,A1,B1,C1,D1,M[ 7], 7,MAGIC2); F4(E2,A2,B2,C2,D2,M[ 6], 9,MAGIC7); + F2(D1,E1,A1,B1,C1,M[ 4], 6,MAGIC2); F4(D2,E2,A2,B2,C2,M[11],13,MAGIC7); + F2(C1,D1,E1,A1,B1,M[13], 8,MAGIC2); F4(C2,D2,E2,A2,B2,M[ 3],15,MAGIC7); + F2(B1,C1,D1,E1,A1,M[ 1],13,MAGIC2); F4(B2,C2,D2,E2,A2,M[ 7], 7,MAGIC7); + F2(A1,B1,C1,D1,E1,M[10],11,MAGIC2); F4(A2,B2,C2,D2,E2,M[ 0],12,MAGIC7); + F2(E1,A1,B1,C1,D1,M[ 6], 9,MAGIC2); F4(E2,A2,B2,C2,D2,M[13], 8,MAGIC7); + F2(D1,E1,A1,B1,C1,M[15], 7,MAGIC2); F4(D2,E2,A2,B2,C2,M[ 5], 9,MAGIC7); + F2(C1,D1,E1,A1,B1,M[ 3],15,MAGIC2); F4(C2,D2,E2,A2,B2,M[10],11,MAGIC7); + F2(B1,C1,D1,E1,A1,M[12], 7,MAGIC2); F4(B2,C2,D2,E2,A2,M[14], 7,MAGIC7); + F2(A1,B1,C1,D1,E1,M[ 0],12,MAGIC2); F4(A2,B2,C2,D2,E2,M[15], 7,MAGIC7); + F2(E1,A1,B1,C1,D1,M[ 9],15,MAGIC2); F4(E2,A2,B2,C2,D2,M[ 8],12,MAGIC7); + F2(D1,E1,A1,B1,C1,M[ 5], 9,MAGIC2); F4(D2,E2,A2,B2,C2,M[12], 7,MAGIC7); + F2(C1,D1,E1,A1,B1,M[ 2],11,MAGIC2); F4(C2,D2,E2,A2,B2,M[ 4], 6,MAGIC7); + F2(B1,C1,D1,E1,A1,M[14], 7,MAGIC2); F4(B2,C2,D2,E2,A2,M[ 9],15,MAGIC7); + F2(A1,B1,C1,D1,E1,M[11],13,MAGIC2); F4(A2,B2,C2,D2,E2,M[ 1],13,MAGIC7); + F2(E1,A1,B1,C1,D1,M[ 8],12,MAGIC2); F4(E2,A2,B2,C2,D2,M[ 2],11,MAGIC7); + + F3(D1,E1,A1,B1,C1,M[ 3],11,MAGIC3); F3(D2,E2,A2,B2,C2,M[15], 9,MAGIC8); + F3(C1,D1,E1,A1,B1,M[10],13,MAGIC3); F3(C2,D2,E2,A2,B2,M[ 5], 7,MAGIC8); + F3(B1,C1,D1,E1,A1,M[14], 6,MAGIC3); F3(B2,C2,D2,E2,A2,M[ 1],15,MAGIC8); + F3(A1,B1,C1,D1,E1,M[ 4], 7,MAGIC3); F3(A2,B2,C2,D2,E2,M[ 3],11,MAGIC8); + F3(E1,A1,B1,C1,D1,M[ 9],14,MAGIC3); F3(E2,A2,B2,C2,D2,M[ 7], 8,MAGIC8); + F3(D1,E1,A1,B1,C1,M[15], 9,MAGIC3); F3(D2,E2,A2,B2,C2,M[14], 6,MAGIC8); + F3(C1,D1,E1,A1,B1,M[ 8],13,MAGIC3); F3(C2,D2,E2,A2,B2,M[ 6], 6,MAGIC8); + F3(B1,C1,D1,E1,A1,M[ 1],15,MAGIC3); F3(B2,C2,D2,E2,A2,M[ 9],14,MAGIC8); + F3(A1,B1,C1,D1,E1,M[ 2],14,MAGIC3); F3(A2,B2,C2,D2,E2,M[11],12,MAGIC8); + F3(E1,A1,B1,C1,D1,M[ 7], 8,MAGIC3); F3(E2,A2,B2,C2,D2,M[ 8],13,MAGIC8); + F3(D1,E1,A1,B1,C1,M[ 0],13,MAGIC3); F3(D2,E2,A2,B2,C2,M[12], 5,MAGIC8); + F3(C1,D1,E1,A1,B1,M[ 6], 6,MAGIC3); F3(C2,D2,E2,A2,B2,M[ 2],14,MAGIC8); + F3(B1,C1,D1,E1,A1,M[13], 5,MAGIC3); F3(B2,C2,D2,E2,A2,M[10],13,MAGIC8); + F3(A1,B1,C1,D1,E1,M[11],12,MAGIC3); F3(A2,B2,C2,D2,E2,M[ 0],13,MAGIC8); + F3(E1,A1,B1,C1,D1,M[ 5], 7,MAGIC3); F3(E2,A2,B2,C2,D2,M[ 4], 7,MAGIC8); + F3(D1,E1,A1,B1,C1,M[12], 5,MAGIC3); F3(D2,E2,A2,B2,C2,M[13], 5,MAGIC8); + + F4(C1,D1,E1,A1,B1,M[ 1],11,MAGIC4); F2(C2,D2,E2,A2,B2,M[ 8],15,MAGIC9); + F4(B1,C1,D1,E1,A1,M[ 9],12,MAGIC4); F2(B2,C2,D2,E2,A2,M[ 6], 5,MAGIC9); + F4(A1,B1,C1,D1,E1,M[11],14,MAGIC4); F2(A2,B2,C2,D2,E2,M[ 4], 8,MAGIC9); + F4(E1,A1,B1,C1,D1,M[10],15,MAGIC4); F2(E2,A2,B2,C2,D2,M[ 1],11,MAGIC9); + F4(D1,E1,A1,B1,C1,M[ 0],14,MAGIC4); F2(D2,E2,A2,B2,C2,M[ 3],14,MAGIC9); + F4(C1,D1,E1,A1,B1,M[ 8],15,MAGIC4); F2(C2,D2,E2,A2,B2,M[11],14,MAGIC9); + F4(B1,C1,D1,E1,A1,M[12], 9,MAGIC4); F2(B2,C2,D2,E2,A2,M[15], 6,MAGIC9); + F4(A1,B1,C1,D1,E1,M[ 4], 8,MAGIC4); F2(A2,B2,C2,D2,E2,M[ 0],14,MAGIC9); + F4(E1,A1,B1,C1,D1,M[13], 9,MAGIC4); F2(E2,A2,B2,C2,D2,M[ 5], 6,MAGIC9); + F4(D1,E1,A1,B1,C1,M[ 3],14,MAGIC4); F2(D2,E2,A2,B2,C2,M[12], 9,MAGIC9); + F4(C1,D1,E1,A1,B1,M[ 7], 5,MAGIC4); F2(C2,D2,E2,A2,B2,M[ 2],12,MAGIC9); + F4(B1,C1,D1,E1,A1,M[15], 6,MAGIC4); F2(B2,C2,D2,E2,A2,M[13], 9,MAGIC9); + F4(A1,B1,C1,D1,E1,M[14], 8,MAGIC4); F2(A2,B2,C2,D2,E2,M[ 9],12,MAGIC9); + F4(E1,A1,B1,C1,D1,M[ 5], 6,MAGIC4); F2(E2,A2,B2,C2,D2,M[ 7], 5,MAGIC9); + F4(D1,E1,A1,B1,C1,M[ 6], 5,MAGIC4); F2(D2,E2,A2,B2,C2,M[10],15,MAGIC9); + F4(C1,D1,E1,A1,B1,M[ 2],12,MAGIC4); F2(C2,D2,E2,A2,B2,M[14], 8,MAGIC9); + + F5(B1,C1,D1,E1,A1,M[ 4], 9,MAGIC5); F1(B2,C2,D2,E2,A2,M[12], 8 ); + F5(A1,B1,C1,D1,E1,M[ 0],15,MAGIC5); F1(A2,B2,C2,D2,E2,M[15], 5 ); + F5(E1,A1,B1,C1,D1,M[ 5], 5,MAGIC5); F1(E2,A2,B2,C2,D2,M[10],12 ); + F5(D1,E1,A1,B1,C1,M[ 9],11,MAGIC5); F1(D2,E2,A2,B2,C2,M[ 4], 9 ); + F5(C1,D1,E1,A1,B1,M[ 7], 6,MAGIC5); F1(C2,D2,E2,A2,B2,M[ 1],12 ); + F5(B1,C1,D1,E1,A1,M[12], 8,MAGIC5); F1(B2,C2,D2,E2,A2,M[ 5], 5 ); + F5(A1,B1,C1,D1,E1,M[ 2],13,MAGIC5); F1(A2,B2,C2,D2,E2,M[ 8],14 ); + F5(E1,A1,B1,C1,D1,M[10],12,MAGIC5); F1(E2,A2,B2,C2,D2,M[ 7], 6 ); + F5(D1,E1,A1,B1,C1,M[14], 5,MAGIC5); F1(D2,E2,A2,B2,C2,M[ 6], 8 ); + F5(C1,D1,E1,A1,B1,M[ 1],12,MAGIC5); F1(C2,D2,E2,A2,B2,M[ 2],13 ); + F5(B1,C1,D1,E1,A1,M[ 3],13,MAGIC5); F1(B2,C2,D2,E2,A2,M[13], 6 ); + F5(A1,B1,C1,D1,E1,M[ 8],14,MAGIC5); F1(A2,B2,C2,D2,E2,M[14], 5 ); + F5(E1,A1,B1,C1,D1,M[11],11,MAGIC5); F1(E2,A2,B2,C2,D2,M[ 0],15 ); + F5(D1,E1,A1,B1,C1,M[ 6], 8,MAGIC5); F1(D2,E2,A2,B2,C2,M[ 3],13 ); + F5(C1,D1,E1,A1,B1,M[15], 5,MAGIC5); F1(C2,D2,E2,A2,B2,M[ 9],11 ); + F5(B1,C1,D1,E1,A1,M[13], 6,MAGIC5); F1(B2,C2,D2,E2,A2,M[11],11 ); + + C1 = digest[1] + C1 + D2; + digest[1] = digest[2] + D1 + E2; + digest[2] = digest[3] + E1 + A2; + digest[3] = digest[4] + A1 + B2; + digest[4] = digest[0] + B1 + C2; + digest[0] = C1; + } + } + +/* +* Copy out the digest +*/ +void RIPEMD_160::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; j += 4) + store_le(digest[j/4], output + j); + } + +/* +* Clear memory of sensitive data +*/ +void RIPEMD_160::clear() throw() + { + MDx_HashFunction::clear(); + M.clear(); + digest[0] = 0x67452301; + digest[1] = 0xEFCDAB89; + digest[2] = 0x98BADCFE; + digest[3] = 0x10325476; + digest[4] = 0xC3D2E1F0; + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/rmd160/rmd160.h b/src/libs/3rdparty/botan/src/hash/rmd160/rmd160.h new file mode 100644 index 00000000000..f2babc5822e --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/rmd160/rmd160.h @@ -0,0 +1,35 @@ +/* +* RIPEMD-160 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_RIPEMD_160_H__ +#define BOTAN_RIPEMD_160_H__ + +#include + +namespace Botan { + +/* +* RIPEMD-160 +*/ +class BOTAN_DLL RIPEMD_160 : public MDx_HashFunction + { + public: + void clear() throw(); + std::string name() const { return "RIPEMD-160"; } + HashFunction* clone() const { return new RIPEMD_160; } + RIPEMD_160() : MDx_HashFunction(20, 64, false, true) { clear(); } + private: + void compress_n(const byte[], u32bit blocks); + void copy_out(byte[]); + + SecureBuffer M; + SecureBuffer digest; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/sha1/info.txt b/src/libs/3rdparty/botan/src/hash/sha1/info.txt new file mode 100644 index 00000000000..a0ae30b4bfc --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1/info.txt @@ -0,0 +1,14 @@ +realname "SHA-1" + +define SHA1 + +load_on auto + + +sha160.cpp +sha160.h + + + +mdx_hash + diff --git a/src/libs/3rdparty/botan/src/hash/sha1/sha160.cpp b/src/libs/3rdparty/botan/src/hash/sha1/sha160.cpp new file mode 100644 index 00000000000..45323a11be8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1/sha160.cpp @@ -0,0 +1,162 @@ +/* +* SHA-160 +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* SHA-160 F1 Function +*/ +inline void F1(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg) + { + E += (D ^ (B & (C ^ D))) + msg + 0x5A827999 + rotate_left(A, 5); + B = rotate_left(B, 30); + } + +/* +* SHA-160 F2 Function +*/ +inline void F2(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg) + { + E += (B ^ C ^ D) + msg + 0x6ED9EBA1 + rotate_left(A, 5); + B = rotate_left(B, 30); + } + +/* +* SHA-160 F3 Function +*/ +inline void F3(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg) + { + E += ((B & C) | ((B | C) & D)) + msg + 0x8F1BBCDC + rotate_left(A, 5); + B = rotate_left(B, 30); + } + +/* +* SHA-160 F4 Function +*/ +inline void F4(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg) + { + E += (B ^ C ^ D) + msg + 0xCA62C1D6 + rotate_left(A, 5); + B = rotate_left(B, 30); + } + +} + +/* +* SHA-160 Compression Function +*/ +void SHA_160::compress_n(const byte input[], u32bit blocks) + { + u32bit A = digest[0], B = digest[1], C = digest[2], + D = digest[3], E = digest[4]; + + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0; j != 16; j += 4) + { + W[j ] = load_be(input, j); + W[j+1] = load_be(input, j+1); + W[j+2] = load_be(input, j+2); + W[j+3] = load_be(input, j+3); + } + input += HASH_BLOCK_SIZE; + + for(u32bit j = 16; j != 80; j += 4) + { + W[j ] = rotate_left((W[j-3] ^ W[j-8] ^ W[j-14] ^ W[j-16]), 1); + W[j+1] = rotate_left((W[j-2] ^ W[j-7] ^ W[j-13] ^ W[j-15]), 1); + W[j+2] = rotate_left((W[j-1] ^ W[j-6] ^ W[j-12] ^ W[j-14]), 1); + W[j+3] = rotate_left((W[j ] ^ W[j-5] ^ W[j-11] ^ W[j-13]), 1); + } + + F1(A,B,C,D,E,W[ 0]); F1(E,A,B,C,D,W[ 1]); F1(D,E,A,B,C,W[ 2]); + F1(C,D,E,A,B,W[ 3]); F1(B,C,D,E,A,W[ 4]); F1(A,B,C,D,E,W[ 5]); + F1(E,A,B,C,D,W[ 6]); F1(D,E,A,B,C,W[ 7]); F1(C,D,E,A,B,W[ 8]); + F1(B,C,D,E,A,W[ 9]); F1(A,B,C,D,E,W[10]); F1(E,A,B,C,D,W[11]); + F1(D,E,A,B,C,W[12]); F1(C,D,E,A,B,W[13]); F1(B,C,D,E,A,W[14]); + F1(A,B,C,D,E,W[15]); F1(E,A,B,C,D,W[16]); F1(D,E,A,B,C,W[17]); + F1(C,D,E,A,B,W[18]); F1(B,C,D,E,A,W[19]); + + F2(A,B,C,D,E,W[20]); F2(E,A,B,C,D,W[21]); F2(D,E,A,B,C,W[22]); + F2(C,D,E,A,B,W[23]); F2(B,C,D,E,A,W[24]); F2(A,B,C,D,E,W[25]); + F2(E,A,B,C,D,W[26]); F2(D,E,A,B,C,W[27]); F2(C,D,E,A,B,W[28]); + F2(B,C,D,E,A,W[29]); F2(A,B,C,D,E,W[30]); F2(E,A,B,C,D,W[31]); + F2(D,E,A,B,C,W[32]); F2(C,D,E,A,B,W[33]); F2(B,C,D,E,A,W[34]); + F2(A,B,C,D,E,W[35]); F2(E,A,B,C,D,W[36]); F2(D,E,A,B,C,W[37]); + F2(C,D,E,A,B,W[38]); F2(B,C,D,E,A,W[39]); + + F3(A,B,C,D,E,W[40]); F3(E,A,B,C,D,W[41]); F3(D,E,A,B,C,W[42]); + F3(C,D,E,A,B,W[43]); F3(B,C,D,E,A,W[44]); F3(A,B,C,D,E,W[45]); + F3(E,A,B,C,D,W[46]); F3(D,E,A,B,C,W[47]); F3(C,D,E,A,B,W[48]); + F3(B,C,D,E,A,W[49]); F3(A,B,C,D,E,W[50]); F3(E,A,B,C,D,W[51]); + F3(D,E,A,B,C,W[52]); F3(C,D,E,A,B,W[53]); F3(B,C,D,E,A,W[54]); + F3(A,B,C,D,E,W[55]); F3(E,A,B,C,D,W[56]); F3(D,E,A,B,C,W[57]); + F3(C,D,E,A,B,W[58]); F3(B,C,D,E,A,W[59]); + + F4(A,B,C,D,E,W[60]); F4(E,A,B,C,D,W[61]); F4(D,E,A,B,C,W[62]); + F4(C,D,E,A,B,W[63]); F4(B,C,D,E,A,W[64]); F4(A,B,C,D,E,W[65]); + F4(E,A,B,C,D,W[66]); F4(D,E,A,B,C,W[67]); F4(C,D,E,A,B,W[68]); + F4(B,C,D,E,A,W[69]); F4(A,B,C,D,E,W[70]); F4(E,A,B,C,D,W[71]); + F4(D,E,A,B,C,W[72]); F4(C,D,E,A,B,W[73]); F4(B,C,D,E,A,W[74]); + F4(A,B,C,D,E,W[75]); F4(E,A,B,C,D,W[76]); F4(D,E,A,B,C,W[77]); + F4(C,D,E,A,B,W[78]); F4(B,C,D,E,A,W[79]); + + A = (digest[0] += A); + B = (digest[1] += B); + C = (digest[2] += C); + D = (digest[3] += D); + E = (digest[4] += E); + } + } + +/* +* Copy out the digest +*/ +void SHA_160::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; j += 4) + store_be(digest[j/4], output + j); + } + +/* +* Clear memory of sensitive data +*/ +void SHA_160::clear() throw() + { + MDx_HashFunction::clear(); + W.clear(); + digest[0] = 0x67452301; + digest[1] = 0xEFCDAB89; + digest[2] = 0x98BADCFE; + digest[3] = 0x10325476; + digest[4] = 0xC3D2E1F0; + } + +/* +* SHA_160 Constructor +*/ +SHA_160::SHA_160() : + MDx_HashFunction(20, 64, true, true), W(80) + { + clear(); + } + +/* +* SHA_160 Constructor +*/ +SHA_160::SHA_160(u32bit W_size) : + MDx_HashFunction(20, 64, true, true), W(W_size) + { + clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/sha1/sha160.h b/src/libs/3rdparty/botan/src/hash/sha1/sha160.h new file mode 100644 index 00000000000..232cf03229c --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1/sha160.h @@ -0,0 +1,38 @@ +/* +* SHA-160 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SHA_160_H__ +#define BOTAN_SHA_160_H__ + +#include + +namespace Botan { + +/* +* SHA-160 +*/ +class BOTAN_DLL SHA_160 : public MDx_HashFunction + { + public: + void clear() throw(); + std::string name() const { return "SHA-160"; } + HashFunction* clone() const { return new SHA_160; } + SHA_160(); + + protected: + SHA_160(u32bit W_size); + + void compress_n(const byte[], u32bit blocks); + void copy_out(byte[]); + + SecureBuffer digest; + SecureVector W; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/sha1_amd64/info.txt b/src/libs/3rdparty/botan/src/hash/sha1_amd64/info.txt new file mode 100644 index 00000000000..ddbc7d38027 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1_amd64/info.txt @@ -0,0 +1,34 @@ +realname "SHA-1 (x86-64 assembler)" + +define SHA1_AMD64 + +load_on asm_ok + + +sha1_amd64_imp.S +sha1_amd64.cpp +sha1_amd64.h + + + +amd64 + + + +gcc +icc + + +# ELF systems + +linux +netbsd +openbsd +solaris + + + +amd64_eng +asm_amd64 +sha1 + diff --git a/src/libs/3rdparty/botan/src/hash/sha1_amd64/sha1_amd64.cpp b/src/libs/3rdparty/botan/src/hash/sha1_amd64/sha1_amd64.cpp new file mode 100644 index 00000000000..0efbd85597f --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1_amd64/sha1_amd64.cpp @@ -0,0 +1,31 @@ +/* +* SHA-160 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +namespace { + +extern "C" +void botan_sha160_amd64_compress(u32bit[5], const byte[64], u32bit[80]); + +} + +/* +* SHA-160 Compression Function +*/ +void SHA_160_AMD64::compress_n(const byte input[], u32bit blocks) + { + for(u32bit i = 0; i != blocks; ++i) + { + botan_sha160_amd64_compress(digest, input, W); + input += HASH_BLOCK_SIZE; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/sha1_amd64/sha1_amd64.h b/src/libs/3rdparty/botan/src/hash/sha1_amd64/sha1_amd64.h new file mode 100644 index 00000000000..f182627a829 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1_amd64/sha1_amd64.h @@ -0,0 +1,28 @@ +/* +* SHA-160 (x86-64) +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SHA_160_AMD64_H__ +#define BOTAN_SHA_160_AMD64_H__ + +#include + +namespace Botan { + +/* +* SHA-160 +*/ +class BOTAN_DLL SHA_160_AMD64 : public SHA_160 + { + public: + HashFunction* clone() const { return new SHA_160_AMD64; } + private: + void compress_n(const byte[], u32bit blocks); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/sha1_amd64/sha1_amd64_imp.S b/src/libs/3rdparty/botan/src/hash/sha1_amd64/sha1_amd64_imp.S new file mode 100644 index 00000000000..34a8318ed7e --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1_amd64/sha1_amd64_imp.S @@ -0,0 +1,260 @@ +/* +* SHA-160 Source File +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +START_LISTING(sha1_amd64.S) + +START_FUNCTION(botan_sha160_amd64_compress) + +#define DIGEST_ARR %rdi +#define INPUT %rsi +#define W %rdx +#define LOOP_CTR %eax + +#define A %r8d +#define B %r9d +#define C %r10d +#define D %r11d +#define E %ecx + + ZEROIZE(LOOP_CTR) + +ALIGN; +.LOOP_LOAD_INPUT: + addl $8, %eax + + movq ARRAY8(INPUT, 0), %r8 + movq ARRAY8(INPUT, 1), %r9 + movq ARRAY8(INPUT, 2), %r10 + movq ARRAY8(INPUT, 3), %r11 + + bswap %r8 + bswap %r9 + bswap %r10 + bswap %r11 + + rolq $32, %r8 + rolq $32, %r9 + rolq $32, %r10 + rolq $32, %r11 + + movq %r8, ARRAY8(W, 0) + movq %r9, ARRAY8(W, 1) + movq %r10, ARRAY8(W, 2) + movq %r11, ARRAY8(W, 3) + + addq $32, W + addq $32, INPUT + + cmp IMM(16), LOOP_CTR + jne .LOOP_LOAD_INPUT + +/* +#define A %r8d +#define B %r9d +#define C %r10d +#define D %r11d +#define E %ecx +*/ + +ALIGN; +.LOOP_EXPANSION: + addl $4, LOOP_CTR + + ZEROIZE(A) + ASSIGN(B, ARRAY4(W, -1)) + ASSIGN(C, ARRAY4(W, -2)) + ASSIGN(D, ARRAY4(W, -3)) + + XOR(A, ARRAY4(W, -5)) + XOR(B, ARRAY4(W, -6)) + XOR(C, ARRAY4(W, -7)) + XOR(D, ARRAY4(W, -8)) + + XOR(A, ARRAY4(W, -11)) + XOR(B, ARRAY4(W, -12)) + XOR(C, ARRAY4(W, -13)) + XOR(D, ARRAY4(W, -14)) + + XOR(A, ARRAY4(W, -13)) + XOR(B, ARRAY4(W, -14)) + XOR(C, ARRAY4(W, -15)) + XOR(D, ARRAY4(W, -16)) + + ROTL_IMM(D, 1) + ROTL_IMM(C, 1) + ROTL_IMM(B, 1) + XOR(A, D) + ROTL_IMM(A, 1) + + ASSIGN(ARRAY4(W, 0), D) + ASSIGN(ARRAY4(W, 1), C) + ASSIGN(ARRAY4(W, 2), B) + ASSIGN(ARRAY4(W, 3), A) + + addq $16, W + cmp IMM(80), LOOP_CTR + jne .LOOP_EXPANSION + + subq $320, W + +#define MAGIC1 0x5A827999 +#define MAGIC2 0x6ED9EBA1 +#define MAGIC3 0x8F1BBCDC +#define MAGIC4 0xCA62C1D6 + +#define T %esi +#define T2 %eax + +#define F1(A, B, C, D, E, F, N) \ + ASSIGN(T2, ARRAY4(W, N)) ; \ + ASSIGN(A, F) ; \ + ROTL_IMM(F, 5) ; \ + ADD(F, E) ; \ + ASSIGN(E, C) ; \ + XOR(E, D) ; \ + ADD3_IMM(F, T2, MAGIC1) ; \ + AND(E, B) ; \ + XOR(E, D) ; \ + ROTR_IMM(B, 2) ; \ + ADD(E, F) ; + +#define F2_4(A, B, C, D, E, F, N, MAGIC) \ + ASSIGN(T2, ARRAY4(W, N)) ; \ + ASSIGN(A, F) ; \ + ROTL_IMM(F, 5) ; \ + ADD(F, E) ; \ + ASSIGN(E, B) ; \ + XOR(E, C) ; \ + ADD3_IMM(F, T2, MAGIC) ; \ + XOR(E, D) ; \ + ROTR_IMM(B, 2) ; \ + ADD(E, F) ; + +#define F3(A, B, C, D, E, F, N) \ + ASSIGN(T2, ARRAY4(W, N)) ; \ + ASSIGN(A, F) ; \ + ROTL_IMM(F, 5) ; \ + ADD(F, E) ; \ + ASSIGN(E, B) ; \ + OR(E, C) ; \ + AND(E, D) ; \ + ADD3_IMM(F, T2, MAGIC3) ; \ + ASSIGN(T2, B) ; \ + AND(T2, C) ; \ + OR(E, T2) ; \ + ROTR_IMM(B, 2) ; \ + ADD(E, F) ; + +#define F2(A, B, C, D, E, F, W) \ + F2_4(A, B, C, D, E, F, W, MAGIC2) + +#define F4(A, B, C, D, E, F, W) \ + F2_4(A, B, C, D, E, F, W, MAGIC4) + + ASSIGN(T, ARRAY4(DIGEST_ARR, 0)) + ASSIGN(B, ARRAY4(DIGEST_ARR, 1)) + ASSIGN(C, ARRAY4(DIGEST_ARR, 2)) + ASSIGN(D, ARRAY4(DIGEST_ARR, 3)) + ASSIGN(E, ARRAY4(DIGEST_ARR, 4)) + + /* First Round */ + F1(A, B, C, D, E, T, 0) + F1(T, A, B, C, D, E, 1) + F1(E, T, A, B, C, D, 2) + F1(D, E, T, A, B, C, 3) + F1(C, D, E, T, A, B, 4) + F1(B, C, D, E, T, A, 5) + F1(A, B, C, D, E, T, 6) + F1(T, A, B, C, D, E, 7) + F1(E, T, A, B, C, D, 8) + F1(D, E, T, A, B, C, 9) + F1(C, D, E, T, A, B, 10) + F1(B, C, D, E, T, A, 11) + F1(A, B, C, D, E, T, 12) + F1(T, A, B, C, D, E, 13) + F1(E, T, A, B, C, D, 14) + F1(D, E, T, A, B, C, 15) + F1(C, D, E, T, A, B, 16) + F1(B, C, D, E, T, A, 17) + F1(A, B, C, D, E, T, 18) + F1(T, A, B, C, D, E, 19) + + /* Second Round */ + F2(E, T, A, B, C, D, 20) + F2(D, E, T, A, B, C, 21) + F2(C, D, E, T, A, B, 22) + F2(B, C, D, E, T, A, 23) + F2(A, B, C, D, E, T, 24) + F2(T, A, B, C, D, E, 25) + F2(E, T, A, B, C, D, 26) + F2(D, E, T, A, B, C, 27) + F2(C, D, E, T, A, B, 28) + F2(B, C, D, E, T, A, 29) + F2(A, B, C, D, E, T, 30) + F2(T, A, B, C, D, E, 31) + F2(E, T, A, B, C, D, 32) + F2(D, E, T, A, B, C, 33) + F2(C, D, E, T, A, B, 34) + F2(B, C, D, E, T, A, 35) + F2(A, B, C, D, E, T, 36) + F2(T, A, B, C, D, E, 37) + F2(E, T, A, B, C, D, 38) + F2(D, E, T, A, B, C, 39) + + /* Third Round */ + F3(C, D, E, T, A, B, 40) + F3(B, C, D, E, T, A, 41) + F3(A, B, C, D, E, T, 42) + F3(T, A, B, C, D, E, 43) + F3(E, T, A, B, C, D, 44) + F3(D, E, T, A, B, C, 45) + F3(C, D, E, T, A, B, 46) + F3(B, C, D, E, T, A, 47) + F3(A, B, C, D, E, T, 48) + F3(T, A, B, C, D, E, 49) + F3(E, T, A, B, C, D, 50) + F3(D, E, T, A, B, C, 51) + F3(C, D, E, T, A, B, 52) + F3(B, C, D, E, T, A, 53) + F3(A, B, C, D, E, T, 54) + F3(T, A, B, C, D, E, 55) + F3(E, T, A, B, C, D, 56) + F3(D, E, T, A, B, C, 57) + F3(C, D, E, T, A, B, 58) + F3(B, C, D, E, T, A, 59) + + /* Fourth Round */ + F4(A, B, C, D, E, T, 60) + F4(T, A, B, C, D, E, 61) + F4(E, T, A, B, C, D, 62) + F4(D, E, T, A, B, C, 63) + F4(C, D, E, T, A, B, 64) + F4(B, C, D, E, T, A, 65) + F4(A, B, C, D, E, T, 66) + F4(T, A, B, C, D, E, 67) + F4(E, T, A, B, C, D, 68) + F4(D, E, T, A, B, C, 69) + F4(C, D, E, T, A, B, 70) + F4(B, C, D, E, T, A, 71) + F4(A, B, C, D, E, T, 72) + F4(T, A, B, C, D, E, 73) + F4(E, T, A, B, C, D, 74) + F4(D, E, T, A, B, C, 75) + F4(C, D, E, T, A, B, 76) + F4(B, C, D, E, T, A, 77) + F4(A, B, C, D, E, T, 78) + F4(T, A, B, C, D, E, 79) + + ADD(ARRAY4(DIGEST_ARR, 0), D) + ADD(ARRAY4(DIGEST_ARR, 1), T) + ADD(ARRAY4(DIGEST_ARR, 2), A) + ADD(ARRAY4(DIGEST_ARR, 3), B) + ADD(ARRAY4(DIGEST_ARR, 4), C) + +END_FUNCTION(botan_sha160_amd64_compress) diff --git a/src/libs/3rdparty/botan/src/hash/sha1_ia32/info.txt b/src/libs/3rdparty/botan/src/hash/sha1_ia32/info.txt new file mode 100644 index 00000000000..bfb3211459a --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1_ia32/info.txt @@ -0,0 +1,35 @@ +realname "SHA-1 (IA-32)" + +define SHA1_IA32 + +load_on asm_ok + + +sha1_ia32_imp.S +sha1_ia32.cpp +sha1_ia32.h + + + +ia32 + + + +gcc +icc + + +# ELF systems + +linux +freebsd +dragonfly +netbsd +openbsd +solaris + + + +asm_ia32 +sha1 + diff --git a/src/libs/3rdparty/botan/src/hash/sha1_ia32/sha1_ia32.cpp b/src/libs/3rdparty/botan/src/hash/sha1_ia32/sha1_ia32.cpp new file mode 100644 index 00000000000..0fa0b6bf246 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1_ia32/sha1_ia32.cpp @@ -0,0 +1,32 @@ +/* +* SHA-160 (IA-32) +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace { + +extern "C" +void botan_sha160_ia32_compress(u32bit[5], const byte[64], u32bit[81]); + +} + +/* +* SHA-160 Compression Function +*/ +void SHA_160_IA32::compress_n(const byte input[], u32bit blocks) + { + for(u32bit i = 0; i != blocks; ++i) + { + botan_sha160_ia32_compress(digest, input, W); + input += HASH_BLOCK_SIZE; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/sha1_ia32/sha1_ia32.h b/src/libs/3rdparty/botan/src/hash/sha1_ia32/sha1_ia32.h new file mode 100644 index 00000000000..fd34971cb8d --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1_ia32/sha1_ia32.h @@ -0,0 +1,31 @@ +/* +* SHA-160 (IA-32) +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SHA_160_IA32_H__ +#define BOTAN_SHA_160_IA32_H__ + +#include + +namespace Botan { + +/* +* SHA-160 +*/ +class BOTAN_DLL SHA_160_IA32 : public SHA_160 + { + public: + HashFunction* clone() const { return new SHA_160_IA32; } + + // Note 81 instead of normal 80: IA-32 asm needs an extra temp + SHA_160_IA32() : SHA_160(81) {} + private: + void compress_n(const byte[], u32bit blocks); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/sha1_ia32/sha1_ia32_imp.S b/src/libs/3rdparty/botan/src/hash/sha1_ia32/sha1_ia32_imp.S new file mode 100644 index 00000000000..e76b9fb7621 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1_ia32/sha1_ia32_imp.S @@ -0,0 +1,244 @@ +/* +* SHA-160 Source File +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +START_LISTING(sha1_ia32.S) + +START_FUNCTION(botan_sha160_ia32_compress) + SPILL_REGS() + +#define PUSHED 4 + + ASSIGN(EDI, ARG(2)) + ASSIGN(EBP, ARG(3)) + + ZEROIZE(ESI) + +START_LOOP(.LOAD_INPUT) + ADD_IMM(ESI, 4) + + ASSIGN(EAX, ARRAY4(EDI, 0)) + ASSIGN(EBX, ARRAY4(EDI, 1)) + ASSIGN(ECX, ARRAY4(EDI, 2)) + ASSIGN(EDX, ARRAY4(EDI, 3)) + + ADD_IMM(EDI, 16) + + BSWAP(EAX) + BSWAP(EBX) + BSWAP(ECX) + BSWAP(EDX) + + ASSIGN(ARRAY4_INDIRECT(EBP,ESI,-4), EAX) + ASSIGN(ARRAY4_INDIRECT(EBP,ESI,-3), EBX) + ASSIGN(ARRAY4_INDIRECT(EBP,ESI,-2), ECX) + ASSIGN(ARRAY4_INDIRECT(EBP,ESI,-1), EDX) +LOOP_UNTIL_EQ(ESI, 16, .LOAD_INPUT) + + ADD2_IMM(EDI, EBP, 64) + +START_LOOP(.EXPANSION) + ADD_IMM(ESI, 4) + + ZEROIZE(EAX) + ASSIGN(EBX, ARRAY4(EDI, -1)) + ASSIGN(ECX, ARRAY4(EDI, -2)) + ASSIGN(EDX, ARRAY4(EDI, -3)) + + XOR(EAX, ARRAY4(EDI, -5)) + XOR(EBX, ARRAY4(EDI, -6)) + XOR(ECX, ARRAY4(EDI, -7)) + XOR(EDX, ARRAY4(EDI, -8)) + + XOR(EAX, ARRAY4(EDI, -11)) + XOR(EBX, ARRAY4(EDI, -12)) + XOR(ECX, ARRAY4(EDI, -13)) + XOR(EDX, ARRAY4(EDI, -14)) + + XOR(EAX, ARRAY4(EDI, -13)) + XOR(EBX, ARRAY4(EDI, -14)) + XOR(ECX, ARRAY4(EDI, -15)) + XOR(EDX, ARRAY4(EDI, -16)) + + ROTL_IMM(EDX, 1) + ROTL_IMM(ECX, 1) + ROTL_IMM(EBX, 1) + XOR(EAX, EDX) + ROTL_IMM(EAX, 1) + + ASSIGN(ARRAY4(EDI, 0), EDX) + ASSIGN(ARRAY4(EDI, 1), ECX) + ASSIGN(ARRAY4(EDI, 2), EBX) + ASSIGN(ARRAY4(EDI, 3), EAX) + + ADD_IMM(EDI, 16) +LOOP_UNTIL_EQ(ESI, 80, .EXPANSION) + +#define MAGIC1 0x5A827999 +#define MAGIC2 0x6ED9EBA1 +#define MAGIC3 0x8F1BBCDC +#define MAGIC4 0xCA62C1D6 + +#define MSG ESP +#define T2 EBP + +#define F1(A, B, C, D, E, F, N) \ + ASSIGN(T2, ARRAY4(MSG, N)) ; \ + ASSIGN(A, F) ; \ + ROTL_IMM(F, 5) ; \ + ADD(F, E) ; \ + ASSIGN(E, C) ; \ + XOR(E, D) ; \ + ADD3_IMM(F, T2, MAGIC1) ; \ + AND(E, B) ; \ + XOR(E, D) ; \ + ROTR_IMM(B, 2) ; \ + ADD(E, F) ; + +#define F2_4(A, B, C, D, E, F, N, MAGIC) \ + ASSIGN(T2, ARRAY4(MSG, N)) ; \ + ASSIGN(A, F) ; \ + ROTL_IMM(F, 5) ; \ + ADD(F, E) ; \ + ASSIGN(E, B) ; \ + XOR(E, C) ; \ + ADD3_IMM(F, T2, MAGIC) ; \ + XOR(E, D) ; \ + ROTR_IMM(B, 2) ; \ + ADD(E, F) ; + +#define F3(A, B, C, D, E, F, N) \ + ASSIGN(T2, ARRAY4(MSG, N)) ; \ + ASSIGN(A, F) ; \ + ROTL_IMM(F, 5) ; \ + ADD(F, E) ; \ + ASSIGN(E, B) ; \ + OR(E, C) ; \ + AND(E, D) ; \ + ADD3_IMM(F, T2, MAGIC3) ; \ + ASSIGN(T2, B) ; \ + AND(T2, C) ; \ + OR(E, T2) ; \ + ROTR_IMM(B, 2) ; \ + ADD(E, F) ; + +#define F2(A, B, C, D, E, F, MSG) \ + F2_4(A, B, C, D, E, F, MSG, MAGIC2) + +#define F4(A, B, C, D, E, F, MSG) \ + F2_4(A, B, C, D, E, F, MSG, MAGIC4) + + ASSIGN(EAX, ARG(1)) + ASSIGN(EDI, ARRAY4(EAX, 0)) + ASSIGN(EBX, ARRAY4(EAX, 1)) + ASSIGN(ECX, ARRAY4(EAX, 2)) + ASSIGN(EDX, ARRAY4(EAX, 3)) + ASSIGN(ESI, ARRAY4(EAX, 4)) + + ASSIGN(ARRAY4(EBP, 80), ESP) + ASSIGN(ESP, EBP) + + /* First Round */ + F1(EAX, EBX, ECX, EDX, ESI, EDI, 0) + F1(EDI, EAX, EBX, ECX, EDX, ESI, 1) + F1(ESI, EDI, EAX, EBX, ECX, EDX, 2) + F1(EDX, ESI, EDI, EAX, EBX, ECX, 3) + F1(ECX, EDX, ESI, EDI, EAX, EBX, 4) + F1(EBX, ECX, EDX, ESI, EDI, EAX, 5) + F1(EAX, EBX, ECX, EDX, ESI, EDI, 6) + F1(EDI, EAX, EBX, ECX, EDX, ESI, 7) + F1(ESI, EDI, EAX, EBX, ECX, EDX, 8) + F1(EDX, ESI, EDI, EAX, EBX, ECX, 9) + F1(ECX, EDX, ESI, EDI, EAX, EBX, 10) + F1(EBX, ECX, EDX, ESI, EDI, EAX, 11) + F1(EAX, EBX, ECX, EDX, ESI, EDI, 12) + F1(EDI, EAX, EBX, ECX, EDX, ESI, 13) + F1(ESI, EDI, EAX, EBX, ECX, EDX, 14) + F1(EDX, ESI, EDI, EAX, EBX, ECX, 15) + F1(ECX, EDX, ESI, EDI, EAX, EBX, 16) + F1(EBX, ECX, EDX, ESI, EDI, EAX, 17) + F1(EAX, EBX, ECX, EDX, ESI, EDI, 18) + F1(EDI, EAX, EBX, ECX, EDX, ESI, 19) + + /* Second Round */ + F2(ESI, EDI, EAX, EBX, ECX, EDX, 20) + F2(EDX, ESI, EDI, EAX, EBX, ECX, 21) + F2(ECX, EDX, ESI, EDI, EAX, EBX, 22) + F2(EBX, ECX, EDX, ESI, EDI, EAX, 23) + F2(EAX, EBX, ECX, EDX, ESI, EDI, 24) + F2(EDI, EAX, EBX, ECX, EDX, ESI, 25) + F2(ESI, EDI, EAX, EBX, ECX, EDX, 26) + F2(EDX, ESI, EDI, EAX, EBX, ECX, 27) + F2(ECX, EDX, ESI, EDI, EAX, EBX, 28) + F2(EBX, ECX, EDX, ESI, EDI, EAX, 29) + F2(EAX, EBX, ECX, EDX, ESI, EDI, 30) + F2(EDI, EAX, EBX, ECX, EDX, ESI, 31) + F2(ESI, EDI, EAX, EBX, ECX, EDX, 32) + F2(EDX, ESI, EDI, EAX, EBX, ECX, 33) + F2(ECX, EDX, ESI, EDI, EAX, EBX, 34) + F2(EBX, ECX, EDX, ESI, EDI, EAX, 35) + F2(EAX, EBX, ECX, EDX, ESI, EDI, 36) + F2(EDI, EAX, EBX, ECX, EDX, ESI, 37) + F2(ESI, EDI, EAX, EBX, ECX, EDX, 38) + F2(EDX, ESI, EDI, EAX, EBX, ECX, 39) + + /* Third Round */ + F3(ECX, EDX, ESI, EDI, EAX, EBX, 40) + F3(EBX, ECX, EDX, ESI, EDI, EAX, 41) + F3(EAX, EBX, ECX, EDX, ESI, EDI, 42) + F3(EDI, EAX, EBX, ECX, EDX, ESI, 43) + F3(ESI, EDI, EAX, EBX, ECX, EDX, 44) + F3(EDX, ESI, EDI, EAX, EBX, ECX, 45) + F3(ECX, EDX, ESI, EDI, EAX, EBX, 46) + F3(EBX, ECX, EDX, ESI, EDI, EAX, 47) + F3(EAX, EBX, ECX, EDX, ESI, EDI, 48) + F3(EDI, EAX, EBX, ECX, EDX, ESI, 49) + F3(ESI, EDI, EAX, EBX, ECX, EDX, 50) + F3(EDX, ESI, EDI, EAX, EBX, ECX, 51) + F3(ECX, EDX, ESI, EDI, EAX, EBX, 52) + F3(EBX, ECX, EDX, ESI, EDI, EAX, 53) + F3(EAX, EBX, ECX, EDX, ESI, EDI, 54) + F3(EDI, EAX, EBX, ECX, EDX, ESI, 55) + F3(ESI, EDI, EAX, EBX, ECX, EDX, 56) + F3(EDX, ESI, EDI, EAX, EBX, ECX, 57) + F3(ECX, EDX, ESI, EDI, EAX, EBX, 58) + F3(EBX, ECX, EDX, ESI, EDI, EAX, 59) + + /* Fourth Round */ + F4(EAX, EBX, ECX, EDX, ESI, EDI, 60) + F4(EDI, EAX, EBX, ECX, EDX, ESI, 61) + F4(ESI, EDI, EAX, EBX, ECX, EDX, 62) + F4(EDX, ESI, EDI, EAX, EBX, ECX, 63) + F4(ECX, EDX, ESI, EDI, EAX, EBX, 64) + F4(EBX, ECX, EDX, ESI, EDI, EAX, 65) + F4(EAX, EBX, ECX, EDX, ESI, EDI, 66) + F4(EDI, EAX, EBX, ECX, EDX, ESI, 67) + F4(ESI, EDI, EAX, EBX, ECX, EDX, 68) + F4(EDX, ESI, EDI, EAX, EBX, ECX, 69) + F4(ECX, EDX, ESI, EDI, EAX, EBX, 70) + F4(EBX, ECX, EDX, ESI, EDI, EAX, 71) + F4(EAX, EBX, ECX, EDX, ESI, EDI, 72) + F4(EDI, EAX, EBX, ECX, EDX, ESI, 73) + F4(ESI, EDI, EAX, EBX, ECX, EDX, 74) + F4(EDX, ESI, EDI, EAX, EBX, ECX, 75) + F4(ECX, EDX, ESI, EDI, EAX, EBX, 76) + F4(EBX, ECX, EDX, ESI, EDI, EAX, 77) + F4(EAX, EBX, ECX, EDX, ESI, EDI, 78) + F4(EDI, EAX, EBX, ECX, EDX, ESI, 79) + + ASSIGN(ESP, ARRAY4(ESP, 80)) + + ASSIGN(EBP, ARG(1)) + ADD(ARRAY4(EBP, 0), EDX) + ADD(ARRAY4(EBP, 1), EDI) + ADD(ARRAY4(EBP, 2), EAX) + ADD(ARRAY4(EBP, 3), EBX) + ADD(ARRAY4(EBP, 4), ECX) + + RESTORE_REGS() +END_FUNCTION(botan_sha160_ia32_compress) diff --git a/src/libs/3rdparty/botan/src/hash/sha1_sse2/info.txt b/src/libs/3rdparty/botan/src/hash/sha1_sse2/info.txt new file mode 100644 index 00000000000..b8d693b706f --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1_sse2/info.txt @@ -0,0 +1,28 @@ +realname "SHA-1 (SSE2)" + +define SHA1_SSE2 + +load_on auto + + +sha1_sse2_imp.cpp +sha1_sse2.cpp +sha1_sse2.h + + + +pentium-m +pentium4 +prescott +amd64 + + + +gcc +icc + + + +sha1 +sse2_eng + diff --git a/src/libs/3rdparty/botan/src/hash/sha1_sse2/sha1_sse2.cpp b/src/libs/3rdparty/botan/src/hash/sha1_sse2/sha1_sse2.cpp new file mode 100644 index 00000000000..dddc06b7be0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1_sse2/sha1_sse2.cpp @@ -0,0 +1,24 @@ +/* +* SHA-160 (SSE2) +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* SHA-160 Compression Function +*/ +void SHA_160_SSE2::compress_n(const byte input[], u32bit blocks) + { + for(u32bit i = 0; i != blocks; ++i) + { + botan_sha1_sse2_compress(digest, reinterpret_cast(input)); + input += HASH_BLOCK_SIZE; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/sha1_sse2/sha1_sse2.h b/src/libs/3rdparty/botan/src/hash/sha1_sse2/sha1_sse2.h new file mode 100644 index 00000000000..0f8eebee935 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1_sse2/sha1_sse2.h @@ -0,0 +1,31 @@ +/* +* SHA-160 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SHA_160_SSE2_H__ +#define BOTAN_SHA_160_SSE2_H__ + +#include + +namespace Botan { + +/* +* SHA-160 +*/ +class BOTAN_DLL SHA_160_SSE2 : public SHA_160 + { + public: + HashFunction* clone() const { return new SHA_160_SSE2; } + SHA_160_SSE2() : SHA_160(0) {} // no W needed + private: + void compress_n(const byte[], u32bit blocks); + }; + +extern "C" void botan_sha1_sse2_compress(u32bit[5], const u32bit*); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/sha1_sse2/sha1_sse2_imp.cpp b/src/libs/3rdparty/botan/src/hash/sha1_sse2/sha1_sse2_imp.cpp new file mode 100644 index 00000000000..90a8dccd5d9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha1_sse2/sha1_sse2_imp.cpp @@ -0,0 +1,331 @@ +/* this code is public domain. + + * dean gaudet + + * this code was inspired by this paper: + + * SHA: A Design for Parallel Architectures? + * Antoon Bosselaers, Ren΄e Govaerts and Joos Vandewalle + * + + * more information available on this implementation here: + + * http://arctic.org/~dean/crypto/sha1.html + + * version: 2 + */ + +/* + * Lightly modified for Botan, tested under GCC 4.1.1 and ICC 9.1 + * on a Linux/Core2 system. + + */ +#include +#include + +namespace Botan { + +namespace { + +typedef union { + u32bit u32[4]; + __m128i u128; + } v4si __attribute__((aligned(16))); + +static const v4si K00_19 = { { 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999 } }; +static const v4si K20_39 = { { 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1 } }; +static const v4si K40_59 = { { 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc } }; +static const v4si K60_79 = { { 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6 } }; + +#define UNALIGNED 1 +#if UNALIGNED +#define load(p) _mm_loadu_si128(p) +#else +#define load(p) (*p) +#endif + + +/* +the first 16 bytes only need byte swapping + +prepared points to 4x u32bit, 16-byte aligned + +W points to the 4 dwords which need preparing -- +and is overwritten with the swapped bytes +*/ +#define prep00_15(prep, W) do { \ + __m128i r1, r2; \ + \ + r1 = (W); \ + if (1) { \ + r1 = _mm_shufflehi_epi16(r1, _MM_SHUFFLE(2, 3, 0, 1)); \ + r1 = _mm_shufflelo_epi16(r1, _MM_SHUFFLE(2, 3, 0, 1)); \ + r2 = _mm_slli_epi16(r1, 8); \ + r1 = _mm_srli_epi16(r1, 8); \ + r1 = _mm_or_si128(r1, r2); \ + (W) = r1; \ + } \ + (prep).u128 = _mm_add_epi32(K00_19.u128, r1); \ + } while(0) + + + +/* +for each multiple of 4, t, we want to calculate this: + +W[t+0] = rol(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1); +W[t+1] = rol(W[t-2] ^ W[t-7] ^ W[t-13] ^ W[t-15], 1); +W[t+2] = rol(W[t-1] ^ W[t-6] ^ W[t-12] ^ W[t-14], 1); +W[t+3] = rol(W[t] ^ W[t-5] ^ W[t-11] ^ W[t-13], 1); + +we'll actually calculate this: + +W[t+0] = rol(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1); +W[t+1] = rol(W[t-2] ^ W[t-7] ^ W[t-13] ^ W[t-15], 1); +W[t+2] = rol(W[t-1] ^ W[t-6] ^ W[t-12] ^ W[t-14], 1); +W[t+3] = rol( 0 ^ W[t-5] ^ W[t-11] ^ W[t-13], 1); +W[t+3] ^= rol(W[t+0], 1); + +the parameters are: + +W0 = &W[t-16]; +W1 = &W[t-12]; +W2 = &W[t- 8]; +W3 = &W[t- 4]; + +and on output: +prepared = W0 + K +W0 = W[t]..W[t+3] +*/ + +/* note that there is a step here where i want to do a rol by 1, which +* normally would look like this: +* +* r1 = psrld r0,$31 +* r0 = pslld r0,$1 +* r0 = por r0,r1 +* +* but instead i do this: +* +* r1 = pcmpltd r0,zero +* r0 = paddd r0,r0 +* r0 = psub r0,r1 +* +* because pcmpltd and paddd are availabe in both MMX units on +* efficeon, pentium-m, and opteron but shifts are available in +* only one unit. +*/ +#define prep(prep, XW0, XW1, XW2, XW3, K) do { \ + __m128i r0, r1, r2, r3; \ + \ + /* load W[t-4] 16-byte aligned, and shift */ \ + r3 = _mm_srli_si128((XW3), 4); \ + r0 = (XW0); \ + /* get high 64-bits of XW0 into low 64-bits */ \ + r1 = _mm_shuffle_epi32((XW0), _MM_SHUFFLE(1,0,3,2)); \ + /* load high 64-bits of r1 */ \ + r1 = _mm_unpacklo_epi64(r1, (XW1)); \ + r2 = (XW2); \ + \ + r0 = _mm_xor_si128(r1, r0); \ + r2 = _mm_xor_si128(r3, r2); \ + r0 = _mm_xor_si128(r2, r0); \ + /* unrotated W[t]..W[t+2] in r0 ... still need W[t+3] */ \ + \ + r2 = _mm_slli_si128(r0, 12); \ + r1 = _mm_cmplt_epi32(r0, _mm_setzero_si128()); \ + r0 = _mm_add_epi32(r0, r0); /* shift left by 1 */ \ + r0 = _mm_sub_epi32(r0, r1); /* r0 has W[t]..W[t+2] */ \ + \ + r3 = _mm_srli_epi32(r2, 30); \ + r2 = _mm_slli_epi32(r2, 2); \ + \ + r0 = _mm_xor_si128(r0, r3); \ + r0 = _mm_xor_si128(r0, r2); /* r0 now has W[t+3] */ \ + \ + (XW0) = r0; \ + (prep).u128 = _mm_add_epi32(r0, (K).u128); \ + } while(0) + + +static inline u32bit rol(u32bit src, u32bit amt) + { + /* gcc and icc appear to turn this into a rotate */ + return (src << amt) | (src >> (32 - amt)); + } + + +static inline u32bit f00_19(u32bit x, u32bit y, u32bit z) + { + /* FIPS 180-2 says this: (x & y) ^ (~x & z) + * but we can calculate it in fewer steps. + */ + return ((y ^ z) & x) ^ z; + } + + +static inline u32bit f20_39(u32bit x, u32bit y, u32bit z) + { + return (x ^ z) ^ y; + } + + +static inline u32bit f40_59(u32bit x, u32bit y, u32bit z) + { + /* FIPS 180-2 says this: (x & y) ^ (x & z) ^ (y & z) + * but we can calculate it in fewer steps. + */ + return (x & z) | ((x | z) & y); + } + + +static inline u32bit f60_79(u32bit x, u32bit y, u32bit z) + { + return f20_39(x, y, z); + } + +#define step(nn_mm, xa, xb, xc, xd, xe, xt, input) do { \ + (xt) = (input) + f##nn_mm((xb), (xc), (xd)); \ + (xb) = rol((xb), 30); \ + (xt) += ((xe) + rol((xa), 5)); \ + } while(0) + +} + +extern "C" void botan_sha1_sse2_compress(u32bit H[5], + const u32bit* inputu) + { + const __m128i * input = (const __m128i *)inputu; + __m128i W0, W1, W2, W3; + v4si prep0, prep1, prep2; + u32bit a, b, c, d, e, t; + + a = H[0]; + b = H[1]; + c = H[2]; + d = H[3]; + e = H[4]; + + /* i've tried arranging the SSE2 code to be 4, 8, 12, and 16 + * steps ahead of the integer code. 12 steps ahead seems + * to produce the best performance. -dean + */ + W0 = load(&input[0]); + prep00_15(prep0, W0); /* prepare for 00 through 03 */ + W1 = load(&input[1]); + prep00_15(prep1, W1); /* prepare for 04 through 07 */ + W2 = load(&input[2]); + prep00_15(prep2, W2); /* prepare for 08 through 11 */ + + W3 = load(&input[3]); + step(00_19, a, b, c, d, e, t, prep0.u32[0]); /* 00 */ + step(00_19, t, a, b, c, d, e, prep0.u32[1]); /* 01 */ + step(00_19, e, t, a, b, c, d, prep0.u32[2]); /* 02 */ + step(00_19, d, e, t, a, b, c, prep0.u32[3]); /* 03 */ + prep00_15(prep0, W3); + step(00_19, c, d, e, t, a, b, prep1.u32[0]); /* 04 */ + step(00_19, b, c, d, e, t, a, prep1.u32[1]); /* 05 */ + step(00_19, a, b, c, d, e, t, prep1.u32[2]); /* 06 */ + step(00_19, t, a, b, c, d, e, prep1.u32[3]); /* 07 */ + prep(prep1, W0, W1, W2, W3, K00_19); /* prepare for 16 through 19 */ + step(00_19, e, t, a, b, c, d, prep2.u32[0]); /* 08 */ + step(00_19, d, e, t, a, b, c, prep2.u32[1]); /* 09 */ + step(00_19, c, d, e, t, a, b, prep2.u32[2]); /* 10 */ + step(00_19, b, c, d, e, t, a, prep2.u32[3]); /* 11 */ + prep(prep2, W1, W2, W3, W0, K20_39); /* prepare for 20 through 23 */ + step(00_19, a, b, c, d, e, t, prep0.u32[0]); /* 12 */ + step(00_19, t, a, b, c, d, e, prep0.u32[1]); /* 13 */ + step(00_19, e, t, a, b, c, d, prep0.u32[2]); /* 14 */ + step(00_19, d, e, t, a, b, c, prep0.u32[3]); /* 15 */ + prep(prep0, W2, W3, W0, W1, K20_39); + step(00_19, c, d, e, t, a, b, prep1.u32[0]); /* 16 */ + step(00_19, b, c, d, e, t, a, prep1.u32[1]); /* 17 */ + step(00_19, a, b, c, d, e, t, prep1.u32[2]); /* 18 */ + step(00_19, t, a, b, c, d, e, prep1.u32[3]); /* 19 */ + + prep(prep1, W3, W0, W1, W2, K20_39); + step(20_39, e, t, a, b, c, d, prep2.u32[0]); /* 20 */ + step(20_39, d, e, t, a, b, c, prep2.u32[1]); /* 21 */ + step(20_39, c, d, e, t, a, b, prep2.u32[2]); /* 22 */ + step(20_39, b, c, d, e, t, a, prep2.u32[3]); /* 23 */ + prep(prep2, W0, W1, W2, W3, K20_39); + step(20_39, a, b, c, d, e, t, prep0.u32[0]); /* 24 */ + step(20_39, t, a, b, c, d, e, prep0.u32[1]); /* 25 */ + step(20_39, e, t, a, b, c, d, prep0.u32[2]); /* 26 */ + step(20_39, d, e, t, a, b, c, prep0.u32[3]); /* 27 */ + prep(prep0, W1, W2, W3, W0, K20_39); + step(20_39, c, d, e, t, a, b, prep1.u32[0]); /* 28 */ + step(20_39, b, c, d, e, t, a, prep1.u32[1]); /* 29 */ + step(20_39, a, b, c, d, e, t, prep1.u32[2]); /* 30 */ + step(20_39, t, a, b, c, d, e, prep1.u32[3]); /* 31 */ + prep(prep1, W2, W3, W0, W1, K40_59); + step(20_39, e, t, a, b, c, d, prep2.u32[0]); /* 32 */ + step(20_39, d, e, t, a, b, c, prep2.u32[1]); /* 33 */ + step(20_39, c, d, e, t, a, b, prep2.u32[2]); /* 34 */ + step(20_39, b, c, d, e, t, a, prep2.u32[3]); /* 35 */ + prep(prep2, W3, W0, W1, W2, K40_59); + step(20_39, a, b, c, d, e, t, prep0.u32[0]); /* 36 */ + step(20_39, t, a, b, c, d, e, prep0.u32[1]); /* 37 */ + step(20_39, e, t, a, b, c, d, prep0.u32[2]); /* 38 */ + step(20_39, d, e, t, a, b, c, prep0.u32[3]); /* 39 */ + + prep(prep0, W0, W1, W2, W3, K40_59); + step(40_59, c, d, e, t, a, b, prep1.u32[0]); /* 40 */ + step(40_59, b, c, d, e, t, a, prep1.u32[1]); /* 41 */ + step(40_59, a, b, c, d, e, t, prep1.u32[2]); /* 42 */ + step(40_59, t, a, b, c, d, e, prep1.u32[3]); /* 43 */ + prep(prep1, W1, W2, W3, W0, K40_59); + step(40_59, e, t, a, b, c, d, prep2.u32[0]); /* 44 */ + step(40_59, d, e, t, a, b, c, prep2.u32[1]); /* 45 */ + step(40_59, c, d, e, t, a, b, prep2.u32[2]); /* 46 */ + step(40_59, b, c, d, e, t, a, prep2.u32[3]); /* 47 */ + prep(prep2, W2, W3, W0, W1, K40_59); + step(40_59, a, b, c, d, e, t, prep0.u32[0]); /* 48 */ + step(40_59, t, a, b, c, d, e, prep0.u32[1]); /* 49 */ + step(40_59, e, t, a, b, c, d, prep0.u32[2]); /* 50 */ + step(40_59, d, e, t, a, b, c, prep0.u32[3]); /* 51 */ + prep(prep0, W3, W0, W1, W2, K60_79); + step(40_59, c, d, e, t, a, b, prep1.u32[0]); /* 52 */ + step(40_59, b, c, d, e, t, a, prep1.u32[1]); /* 53 */ + step(40_59, a, b, c, d, e, t, prep1.u32[2]); /* 54 */ + step(40_59, t, a, b, c, d, e, prep1.u32[3]); /* 55 */ + prep(prep1, W0, W1, W2, W3, K60_79); + step(40_59, e, t, a, b, c, d, prep2.u32[0]); /* 56 */ + step(40_59, d, e, t, a, b, c, prep2.u32[1]); /* 57 */ + step(40_59, c, d, e, t, a, b, prep2.u32[2]); /* 58 */ + step(40_59, b, c, d, e, t, a, prep2.u32[3]); /* 59 */ + + prep(prep2, W1, W2, W3, W0, K60_79); + step(60_79, a, b, c, d, e, t, prep0.u32[0]); /* 60 */ + step(60_79, t, a, b, c, d, e, prep0.u32[1]); /* 61 */ + step(60_79, e, t, a, b, c, d, prep0.u32[2]); /* 62 */ + step(60_79, d, e, t, a, b, c, prep0.u32[3]); /* 63 */ + prep(prep0, W2, W3, W0, W1, K60_79); + step(60_79, c, d, e, t, a, b, prep1.u32[0]); /* 64 */ + step(60_79, b, c, d, e, t, a, prep1.u32[1]); /* 65 */ + step(60_79, a, b, c, d, e, t, prep1.u32[2]); /* 66 */ + step(60_79, t, a, b, c, d, e, prep1.u32[3]); /* 67 */ + prep(prep1, W3, W0, W1, W2, K60_79); + step(60_79, e, t, a, b, c, d, prep2.u32[0]); /* 68 */ + step(60_79, d, e, t, a, b, c, prep2.u32[1]); /* 69 */ + step(60_79, c, d, e, t, a, b, prep2.u32[2]); /* 70 */ + step(60_79, b, c, d, e, t, a, prep2.u32[3]); /* 71 */ + + step(60_79, a, b, c, d, e, t, prep0.u32[0]); /* 72 */ + step(60_79, t, a, b, c, d, e, prep0.u32[1]); /* 73 */ + step(60_79, e, t, a, b, c, d, prep0.u32[2]); /* 74 */ + step(60_79, d, e, t, a, b, c, prep0.u32[3]); /* 75 */ + /* no more input to prepare */ + step(60_79, c, d, e, t, a, b, prep1.u32[0]); /* 76 */ + step(60_79, b, c, d, e, t, a, prep1.u32[1]); /* 77 */ + step(60_79, a, b, c, d, e, t, prep1.u32[2]); /* 78 */ + step(60_79, t, a, b, c, d, e, prep1.u32[3]); /* 79 */ + /* e, t, a, b, c, d */ + H[0] += e; + H[1] += t; + H[2] += a; + H[3] += b; + H[4] += c; + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/sha2/info.txt b/src/libs/3rdparty/botan/src/hash/sha2/info.txt new file mode 100644 index 00000000000..9b92ff38550 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha2/info.txt @@ -0,0 +1,16 @@ +realname "SHA-2 (224, 256, 384, 512)" + +define SHA2 + +load_on auto + + +sha2_32.cpp +sha2_32.h +sha2_64.cpp +sha2_64.h + + + +mdx_hash + diff --git a/src/libs/3rdparty/botan/src/hash/sha2/sha2_32.cpp b/src/libs/3rdparty/botan/src/hash/sha2/sha2_32.cpp new file mode 100644 index 00000000000..9da2ec23f1b --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha2/sha2_32.cpp @@ -0,0 +1,193 @@ +/* +* SHA-{224,256} +* (C) 1999-2008 Jack Lloyd +* 2007 FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* SHA-256 Rho Function +*/ +inline u32bit rho(u32bit X, u32bit rot1, u32bit rot2, u32bit rot3) + { + return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ + rotate_right(X, rot3)); + } + +/* +* SHA-256 Sigma Function +*/ +inline u32bit sigma(u32bit X, u32bit rot1, u32bit rot2, u32bit shift) + { + return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ (X >> shift)); + } + +/* +* SHA-256 F1 Function +*/ +inline void F1(u32bit A, u32bit B, u32bit C, u32bit& D, + u32bit E, u32bit F, u32bit G, u32bit& H, + u32bit msg, u32bit magic) + { + magic += rho(E, 6, 11, 25) + ((E & F) ^ (~E & G)) + msg; + D += magic + H; + H += magic + rho(A, 2, 13, 22) + ((A & B) ^ (A & C) ^ (B & C)); + } + +} + +/* +* SHA-256 Compression Function +*/ +void SHA_224_256_BASE::compress_n(const byte input[], u32bit blocks) + { + u32bit A = digest[0], B = digest[1], C = digest[2], + D = digest[3], E = digest[4], F = digest[5], + G = digest[6], H = digest[7]; + + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0; j != 16; ++j) + W[j] = load_be(input, j); + input += HASH_BLOCK_SIZE; + + for(u32bit j = 16; j != 64; ++j) + W[j] = sigma(W[j- 2], 17, 19, 10) + W[j- 7] + + sigma(W[j-15], 7, 18, 3) + W[j-16]; + + F1(A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98); + F1(H, A, B, C, D, E, F, G, W[ 1], 0x71374491); + F1(G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF); + F1(F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5); + F1(E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B); + F1(D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1); + F1(C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4); + F1(B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5); + F1(A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98); + F1(H, A, B, C, D, E, F, G, W[ 9], 0x12835B01); + F1(G, H, A, B, C, D, E, F, W[10], 0x243185BE); + F1(F, G, H, A, B, C, D, E, W[11], 0x550C7DC3); + F1(E, F, G, H, A, B, C, D, W[12], 0x72BE5D74); + F1(D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE); + F1(C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7); + F1(B, C, D, E, F, G, H, A, W[15], 0xC19BF174); + F1(A, B, C, D, E, F, G, H, W[16], 0xE49B69C1); + F1(H, A, B, C, D, E, F, G, W[17], 0xEFBE4786); + F1(G, H, A, B, C, D, E, F, W[18], 0x0FC19DC6); + F1(F, G, H, A, B, C, D, E, W[19], 0x240CA1CC); + F1(E, F, G, H, A, B, C, D, W[20], 0x2DE92C6F); + F1(D, E, F, G, H, A, B, C, W[21], 0x4A7484AA); + F1(C, D, E, F, G, H, A, B, W[22], 0x5CB0A9DC); + F1(B, C, D, E, F, G, H, A, W[23], 0x76F988DA); + F1(A, B, C, D, E, F, G, H, W[24], 0x983E5152); + F1(H, A, B, C, D, E, F, G, W[25], 0xA831C66D); + F1(G, H, A, B, C, D, E, F, W[26], 0xB00327C8); + F1(F, G, H, A, B, C, D, E, W[27], 0xBF597FC7); + F1(E, F, G, H, A, B, C, D, W[28], 0xC6E00BF3); + F1(D, E, F, G, H, A, B, C, W[29], 0xD5A79147); + F1(C, D, E, F, G, H, A, B, W[30], 0x06CA6351); + F1(B, C, D, E, F, G, H, A, W[31], 0x14292967); + F1(A, B, C, D, E, F, G, H, W[32], 0x27B70A85); + F1(H, A, B, C, D, E, F, G, W[33], 0x2E1B2138); + F1(G, H, A, B, C, D, E, F, W[34], 0x4D2C6DFC); + F1(F, G, H, A, B, C, D, E, W[35], 0x53380D13); + F1(E, F, G, H, A, B, C, D, W[36], 0x650A7354); + F1(D, E, F, G, H, A, B, C, W[37], 0x766A0ABB); + F1(C, D, E, F, G, H, A, B, W[38], 0x81C2C92E); + F1(B, C, D, E, F, G, H, A, W[39], 0x92722C85); + F1(A, B, C, D, E, F, G, H, W[40], 0xA2BFE8A1); + F1(H, A, B, C, D, E, F, G, W[41], 0xA81A664B); + F1(G, H, A, B, C, D, E, F, W[42], 0xC24B8B70); + F1(F, G, H, A, B, C, D, E, W[43], 0xC76C51A3); + F1(E, F, G, H, A, B, C, D, W[44], 0xD192E819); + F1(D, E, F, G, H, A, B, C, W[45], 0xD6990624); + F1(C, D, E, F, G, H, A, B, W[46], 0xF40E3585); + F1(B, C, D, E, F, G, H, A, W[47], 0x106AA070); + F1(A, B, C, D, E, F, G, H, W[48], 0x19A4C116); + F1(H, A, B, C, D, E, F, G, W[49], 0x1E376C08); + F1(G, H, A, B, C, D, E, F, W[50], 0x2748774C); + F1(F, G, H, A, B, C, D, E, W[51], 0x34B0BCB5); + F1(E, F, G, H, A, B, C, D, W[52], 0x391C0CB3); + F1(D, E, F, G, H, A, B, C, W[53], 0x4ED8AA4A); + F1(C, D, E, F, G, H, A, B, W[54], 0x5B9CCA4F); + F1(B, C, D, E, F, G, H, A, W[55], 0x682E6FF3); + F1(A, B, C, D, E, F, G, H, W[56], 0x748F82EE); + F1(H, A, B, C, D, E, F, G, W[57], 0x78A5636F); + F1(G, H, A, B, C, D, E, F, W[58], 0x84C87814); + F1(F, G, H, A, B, C, D, E, W[59], 0x8CC70208); + F1(E, F, G, H, A, B, C, D, W[60], 0x90BEFFFA); + F1(D, E, F, G, H, A, B, C, W[61], 0xA4506CEB); + F1(C, D, E, F, G, H, A, B, W[62], 0xBEF9A3F7); + F1(B, C, D, E, F, G, H, A, W[63], 0xC67178F2); + + A = (digest[0] += A); + B = (digest[1] += B); + C = (digest[2] += C); + D = (digest[3] += D); + E = (digest[4] += E); + F = (digest[5] += F); + G = (digest[6] += G); + H = (digest[7] += H); + } + } + +/* +* Copy out the digest +*/ +void SHA_224_256_BASE::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; j += 4) + store_be(digest[j/4], output + j); + } + +/* +* Clear memory of sensitive data +*/ +void SHA_224_256_BASE::clear() throw() + { + MDx_HashFunction::clear(); + W.clear(); + } + +/* +* Clear memory of sensitive data +*/ +void SHA_224::clear() throw() + { + SHA_224_256_BASE::clear(); + digest[0] = 0xc1059ed8; + digest[1] = 0x367cd507; + digest[2] = 0x3070dd17; + digest[3] = 0xf70e5939; + digest[4] = 0xffc00b31; + digest[5] = 0x68581511; + digest[6] = 0x64f98fa7; + digest[7] = 0xbefa4fa4; + } + +/* +* Clear memory of sensitive data +*/ +void SHA_256::clear() throw() + { + SHA_224_256_BASE::clear(); + digest[0] = 0x6A09E667; + digest[1] = 0xBB67AE85; + digest[2] = 0x3C6EF372; + digest[3] = 0xA54FF53A; + digest[4] = 0x510E527F; + digest[5] = 0x9B05688C; + digest[6] = 0x1F83D9AB; + digest[7] = 0x5BE0CD19; + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/sha2/sha2_32.h b/src/libs/3rdparty/botan/src/hash/sha2/sha2_32.h new file mode 100644 index 00000000000..05083d19d21 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha2/sha2_32.h @@ -0,0 +1,59 @@ +/* +* SHA-{224,256} +* (C) 1999-2008 Jack Lloyd +* 2007 FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SHA_256_H__ +#define BOTAN_SHA_256_H__ + +#include + +namespace Botan { + +/* +* SHA-{224,256} Base +*/ +class BOTAN_DLL SHA_224_256_BASE : public MDx_HashFunction + { + protected: + void clear() throw(); + SHA_224_256_BASE(u32bit out) : + MDx_HashFunction(out, 64, true, true) { clear(); } + + SecureBuffer W; + SecureBuffer digest; + private: + void compress_n(const byte[], u32bit blocks); + void copy_out(byte[]); + }; + +/* +* SHA-224 +*/ +class BOTAN_DLL SHA_224 : public SHA_224_256_BASE + { + public: + void clear() throw(); + std::string name() const { return "SHA-224"; } + HashFunction* clone() const { return new SHA_224; } + SHA_224() : SHA_224_256_BASE(28) { clear(); } + }; + +/* +* SHA-256 +*/ +class BOTAN_DLL SHA_256 : public SHA_224_256_BASE + { + public: + void clear() throw(); + std::string name() const { return "SHA-256"; } + HashFunction* clone() const { return new SHA_256; } + SHA_256() : SHA_224_256_BASE(32) { clear (); } + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/sha2/sha2_64.cpp b/src/libs/3rdparty/botan/src/hash/sha2/sha2_64.cpp new file mode 100644 index 00000000000..e9b4c2e5a6d --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha2/sha2_64.cpp @@ -0,0 +1,208 @@ +/* +* SHA-{384,512} +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* SHA-{384,512} Rho Function +*/ +inline u64bit rho(u64bit X, u32bit rot1, u32bit rot2, u32bit rot3) + { + return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ + rotate_right(X, rot3)); + } + +/* +* SHA-{384,512} F1 Function +*/ +inline void F1(u64bit A, u64bit B, u64bit C, u64bit& D, + u64bit E, u64bit F, u64bit G, u64bit& H, + u64bit msg, u64bit magic) + { + magic += rho(E, 14, 18, 41) + ((E & F) ^ (~E & G)) + msg; + D += magic + H; + H += magic + rho(A, 28, 34, 39) + ((A & B) ^ (A & C) ^ (B & C)); + } + +/* +* SHA-{384,512} Sigma Function +*/ +inline u64bit sigma(u64bit X, u32bit rot1, u32bit rot2, u32bit shift) + { + return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ (X >> shift)); + } + +} + +/* +* SHA-{384,512} Compression Function +*/ +void SHA_384_512_BASE::compress_n(const byte input[], u32bit blocks) + { + u64bit A = digest[0], B = digest[1], C = digest[2], + D = digest[3], E = digest[4], F = digest[5], + G = digest[6], H = digest[7]; + + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0; j != 16; ++j) + W[j] = load_be(input, j); + input += HASH_BLOCK_SIZE; + + for(u32bit j = 16; j != 80; ++j) + W[j] = sigma(W[j- 2], 19, 61, 6) + W[j- 7] + + sigma(W[j-15], 1, 8, 7) + W[j-16]; + + F1(A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98D728AE22); + F1(H, A, B, C, D, E, F, G, W[ 1], 0x7137449123EF65CD); + F1(G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCFEC4D3B2F); + F1(F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA58189DBBC); + F1(E, F, G, H, A, B, C, D, W[ 4], 0x3956C25BF348B538); + F1(D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1B605D019); + F1(C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4AF194F9B); + F1(B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5DA6D8118); + F1(A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98A3030242); + F1(H, A, B, C, D, E, F, G, W[ 9], 0x12835B0145706FBE); + F1(G, H, A, B, C, D, E, F, W[10], 0x243185BE4EE4B28C); + F1(F, G, H, A, B, C, D, E, W[11], 0x550C7DC3D5FFB4E2); + F1(E, F, G, H, A, B, C, D, W[12], 0x72BE5D74F27B896F); + F1(D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE3B1696B1); + F1(C, D, E, F, G, H, A, B, W[14], 0x9BDC06A725C71235); + F1(B, C, D, E, F, G, H, A, W[15], 0xC19BF174CF692694); + F1(A, B, C, D, E, F, G, H, W[16], 0xE49B69C19EF14AD2); + F1(H, A, B, C, D, E, F, G, W[17], 0xEFBE4786384F25E3); + F1(G, H, A, B, C, D, E, F, W[18], 0x0FC19DC68B8CD5B5); + F1(F, G, H, A, B, C, D, E, W[19], 0x240CA1CC77AC9C65); + F1(E, F, G, H, A, B, C, D, W[20], 0x2DE92C6F592B0275); + F1(D, E, F, G, H, A, B, C, W[21], 0x4A7484AA6EA6E483); + F1(C, D, E, F, G, H, A, B, W[22], 0x5CB0A9DCBD41FBD4); + F1(B, C, D, E, F, G, H, A, W[23], 0x76F988DA831153B5); + F1(A, B, C, D, E, F, G, H, W[24], 0x983E5152EE66DFAB); + F1(H, A, B, C, D, E, F, G, W[25], 0xA831C66D2DB43210); + F1(G, H, A, B, C, D, E, F, W[26], 0xB00327C898FB213F); + F1(F, G, H, A, B, C, D, E, W[27], 0xBF597FC7BEEF0EE4); + F1(E, F, G, H, A, B, C, D, W[28], 0xC6E00BF33DA88FC2); + F1(D, E, F, G, H, A, B, C, W[29], 0xD5A79147930AA725); + F1(C, D, E, F, G, H, A, B, W[30], 0x06CA6351E003826F); + F1(B, C, D, E, F, G, H, A, W[31], 0x142929670A0E6E70); + F1(A, B, C, D, E, F, G, H, W[32], 0x27B70A8546D22FFC); + F1(H, A, B, C, D, E, F, G, W[33], 0x2E1B21385C26C926); + F1(G, H, A, B, C, D, E, F, W[34], 0x4D2C6DFC5AC42AED); + F1(F, G, H, A, B, C, D, E, W[35], 0x53380D139D95B3DF); + F1(E, F, G, H, A, B, C, D, W[36], 0x650A73548BAF63DE); + F1(D, E, F, G, H, A, B, C, W[37], 0x766A0ABB3C77B2A8); + F1(C, D, E, F, G, H, A, B, W[38], 0x81C2C92E47EDAEE6); + F1(B, C, D, E, F, G, H, A, W[39], 0x92722C851482353B); + F1(A, B, C, D, E, F, G, H, W[40], 0xA2BFE8A14CF10364); + F1(H, A, B, C, D, E, F, G, W[41], 0xA81A664BBC423001); + F1(G, H, A, B, C, D, E, F, W[42], 0xC24B8B70D0F89791); + F1(F, G, H, A, B, C, D, E, W[43], 0xC76C51A30654BE30); + F1(E, F, G, H, A, B, C, D, W[44], 0xD192E819D6EF5218); + F1(D, E, F, G, H, A, B, C, W[45], 0xD69906245565A910); + F1(C, D, E, F, G, H, A, B, W[46], 0xF40E35855771202A); + F1(B, C, D, E, F, G, H, A, W[47], 0x106AA07032BBD1B8); + F1(A, B, C, D, E, F, G, H, W[48], 0x19A4C116B8D2D0C8); + F1(H, A, B, C, D, E, F, G, W[49], 0x1E376C085141AB53); + F1(G, H, A, B, C, D, E, F, W[50], 0x2748774CDF8EEB99); + F1(F, G, H, A, B, C, D, E, W[51], 0x34B0BCB5E19B48A8); + F1(E, F, G, H, A, B, C, D, W[52], 0x391C0CB3C5C95A63); + F1(D, E, F, G, H, A, B, C, W[53], 0x4ED8AA4AE3418ACB); + F1(C, D, E, F, G, H, A, B, W[54], 0x5B9CCA4F7763E373); + F1(B, C, D, E, F, G, H, A, W[55], 0x682E6FF3D6B2B8A3); + F1(A, B, C, D, E, F, G, H, W[56], 0x748F82EE5DEFB2FC); + F1(H, A, B, C, D, E, F, G, W[57], 0x78A5636F43172F60); + F1(G, H, A, B, C, D, E, F, W[58], 0x84C87814A1F0AB72); + F1(F, G, H, A, B, C, D, E, W[59], 0x8CC702081A6439EC); + F1(E, F, G, H, A, B, C, D, W[60], 0x90BEFFFA23631E28); + F1(D, E, F, G, H, A, B, C, W[61], 0xA4506CEBDE82BDE9); + F1(C, D, E, F, G, H, A, B, W[62], 0xBEF9A3F7B2C67915); + F1(B, C, D, E, F, G, H, A, W[63], 0xC67178F2E372532B); + F1(A, B, C, D, E, F, G, H, W[64], 0xCA273ECEEA26619C); + F1(H, A, B, C, D, E, F, G, W[65], 0xD186B8C721C0C207); + F1(G, H, A, B, C, D, E, F, W[66], 0xEADA7DD6CDE0EB1E); + F1(F, G, H, A, B, C, D, E, W[67], 0xF57D4F7FEE6ED178); + F1(E, F, G, H, A, B, C, D, W[68], 0x06F067AA72176FBA); + F1(D, E, F, G, H, A, B, C, W[69], 0x0A637DC5A2C898A6); + F1(C, D, E, F, G, H, A, B, W[70], 0x113F9804BEF90DAE); + F1(B, C, D, E, F, G, H, A, W[71], 0x1B710B35131C471B); + F1(A, B, C, D, E, F, G, H, W[72], 0x28DB77F523047D84); + F1(H, A, B, C, D, E, F, G, W[73], 0x32CAAB7B40C72493); + F1(G, H, A, B, C, D, E, F, W[74], 0x3C9EBE0A15C9BEBC); + F1(F, G, H, A, B, C, D, E, W[75], 0x431D67C49C100D4C); + F1(E, F, G, H, A, B, C, D, W[76], 0x4CC5D4BECB3E42B6); + F1(D, E, F, G, H, A, B, C, W[77], 0x597F299CFC657E2A); + F1(C, D, E, F, G, H, A, B, W[78], 0x5FCB6FAB3AD6FAEC); + F1(B, C, D, E, F, G, H, A, W[79], 0x6C44198C4A475817); + + A = (digest[0] += A); + B = (digest[1] += B); + C = (digest[2] += C); + D = (digest[3] += D); + E = (digest[4] += E); + F = (digest[5] += F); + G = (digest[6] += G); + H = (digest[7] += H); + } + } + +/* +* Copy out the digest +*/ +void SHA_384_512_BASE::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; j += 8) + store_be(digest[j/8], output + j); + } + +/* +* Clear memory of sensitive data +*/ +void SHA_384_512_BASE::clear() throw() + { + MDx_HashFunction::clear(); + W.clear(); + } + +/* +* Clear memory of sensitive data +*/ +void SHA_384::clear() throw() + { + SHA_384_512_BASE::clear(); + digest[0] = 0xCBBB9D5DC1059ED8; + digest[1] = 0x629A292A367CD507; + digest[2] = 0x9159015A3070DD17; + digest[3] = 0x152FECD8F70E5939; + digest[4] = 0x67332667FFC00B31; + digest[5] = 0x8EB44A8768581511; + digest[6] = 0xDB0C2E0D64F98FA7; + digest[7] = 0x47B5481DBEFA4FA4; + } + +/* +* Clear memory of sensitive data +*/ +void SHA_512::clear() throw() + { + SHA_384_512_BASE::clear(); + digest[0] = 0x6A09E667F3BCC908; + digest[1] = 0xBB67AE8584CAA73B; + digest[2] = 0x3C6EF372FE94F82B; + digest[3] = 0xA54FF53A5F1D36F1; + digest[4] = 0x510E527FADE682D1; + digest[5] = 0x9B05688C2B3E6C1F; + digest[6] = 0x1F83D9ABFB41BD6B; + digest[7] = 0x5BE0CD19137E2179; + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/sha2/sha2_64.h b/src/libs/3rdparty/botan/src/hash/sha2/sha2_64.h new file mode 100644 index 00000000000..dcc6dc83b6d --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/sha2/sha2_64.h @@ -0,0 +1,60 @@ +/* +* SHA-{384,512} +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SHA_64BIT_H__ +#define BOTAN_SHA_64BIT_H__ + +#include + +namespace Botan { + +/* +* SHA-{384,512} Base +*/ +class BOTAN_DLL SHA_384_512_BASE : public MDx_HashFunction + { + protected: + void clear() throw(); + + SHA_384_512_BASE(u32bit out) : + MDx_HashFunction(out, 128, true, true, 16) {} + + SecureBuffer digest; + private: + void compress_n(const byte[], u32bit blocks); + void copy_out(byte[]); + + SecureBuffer W; + }; + +/* +* SHA-384 +*/ +class BOTAN_DLL SHA_384 : public SHA_384_512_BASE + { + public: + void clear() throw(); + std::string name() const { return "SHA-384"; } + HashFunction* clone() const { return new SHA_384; } + SHA_384() : SHA_384_512_BASE(48) { clear(); } + }; + +/* +* SHA-512 +*/ +class BOTAN_DLL SHA_512 : public SHA_384_512_BASE + { + public: + void clear() throw(); + std::string name() const { return "SHA-512"; } + HashFunction* clone() const { return new SHA_512; } + SHA_512() : SHA_384_512_BASE(64) { clear(); } + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/skein/info.txt b/src/libs/3rdparty/botan/src/hash/skein/info.txt new file mode 100644 index 00000000000..bab8497c586 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/skein/info.txt @@ -0,0 +1,14 @@ +realname "Skein" + +define SKEIN_512 + +load_on auto + + +skein_512.cpp +skein_512.h + + + +alloc + diff --git a/src/libs/3rdparty/botan/src/hash/skein/skein_512.cpp b/src/libs/3rdparty/botan/src/hash/skein/skein_512.cpp new file mode 100644 index 00000000000..a48cfc18678 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/skein/skein_512.cpp @@ -0,0 +1,262 @@ +/** +* The Skein-512 hash function +* (C) 2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +enum type_code { + SKEIN_KEY = 0, + SKEIN_CONFIG = 4, + SKEIN_PERSONALIZATION = 8, + SKEIN_PUBLIC_KEY = 12, + SKEIN_KEY_IDENTIFIER = 16, + SKEIN_NONCE = 20, + SKEIN_MSG = 48, + SKEIN_OUTPUT = 63 +}; + +void ubi_512(u64bit H[9], u64bit T[], const byte msg[], u64bit msg_len) + { + do + { + const u64bit to_proc = std::min(msg_len, 64); + T[0] += to_proc; + + u64bit M[8] = { 0 }; + for(u32bit j = 0; j != to_proc / 8; ++j) + M[j] = load_le(msg, j); + + if(to_proc % 8) + { + for(u32bit j = 0; j != to_proc % 8; ++j) + M[to_proc/8] |= ((u64bit)msg[8*(to_proc/8)+j] << (8*j)); + } + + H[8] = H[0] ^ H[1] ^ H[2] ^ H[3] ^ + H[4] ^ H[5] ^ H[6] ^ H[7] ^ 0x5555555555555555; + + T[2] = T[0] ^ T[1]; + + u64bit X0 = M[0] + H[0]; + u64bit X1 = M[1] + H[1]; + u64bit X2 = M[2] + H[2]; + u64bit X3 = M[3] + H[3]; + u64bit X4 = M[4] + H[4]; + u64bit X5 = M[5] + H[5] + T[0]; + u64bit X6 = M[6] + H[6] + T[1]; + u64bit X7 = M[7] + H[7]; + +#define THREEFISH_ROUND(I1,I2,I3,I4,I5,I6,I7,I8,ROT1,ROT2,ROT3,ROT4) \ + do { \ + X##I1 += X##I2; X##I2 = rotate_left(X##I2, ROT1) ^ X##I1; \ + X##I3 += X##I4; X##I4 = rotate_left(X##I4, ROT2) ^ X##I3; \ + X##I5 += X##I6; X##I6 = rotate_left(X##I6, ROT3) ^ X##I5; \ + X##I7 += X##I8; X##I8 = rotate_left(X##I8, ROT4) ^ X##I7; \ + } while(0); + +#define THREEFISH_INJECT_KEY(r) \ + do { \ + X0 += H[(r ) % 9]; \ + X1 += H[(r+1) % 9]; \ + X2 += H[(r+2) % 9]; \ + X3 += H[(r+3) % 9]; \ + X4 += H[(r+4) % 9]; \ + X5 += H[(r+5) % 9] + T[(r ) % 3]; \ + X6 += H[(r+6) % 9] + T[(r+1) % 3]; \ + X7 += H[(r+7) % 9] + (r); \ + } while(0); + +#define THREEFISH_8_ROUNDS(R1,R2) \ + do { \ + THREEFISH_ROUND(0,1,2,3,4,5,6,7, 46,36,19,37); \ + THREEFISH_ROUND(2,1,4,7,6,5,0,3, 33,27,14,42); \ + THREEFISH_ROUND(4,1,6,3,0,5,2,7, 17,49,36,39); \ + THREEFISH_ROUND(6,1,0,7,2,5,4,3, 44, 9,54,56); \ + \ + THREEFISH_INJECT_KEY(R1); \ + \ + THREEFISH_ROUND(0,1,2,3,4,5,6,7, 39,30,34,24); \ + THREEFISH_ROUND(2,1,4,7,6,5,0,3, 13,50,10,17); \ + THREEFISH_ROUND(4,1,6,3,0,5,2,7, 25,29,39,43); \ + THREEFISH_ROUND(6,1,0,7,2,5,4,3, 8,35,56,22); \ + \ + THREEFISH_INJECT_KEY(R2); \ + } while(0); + + THREEFISH_8_ROUNDS(1,2); + THREEFISH_8_ROUNDS(3,4); + THREEFISH_8_ROUNDS(5,6); + THREEFISH_8_ROUNDS(7,8); + THREEFISH_8_ROUNDS(9,10); + THREEFISH_8_ROUNDS(11,12); + THREEFISH_8_ROUNDS(13,14); + THREEFISH_8_ROUNDS(15,16); + THREEFISH_8_ROUNDS(17,18); + + // message feed forward + H[0] = X0 ^ M[0]; + H[1] = X1 ^ M[1]; + H[2] = X2 ^ M[2]; + H[3] = X3 ^ M[3]; + H[4] = X4 ^ M[4]; + H[5] = X5 ^ M[5]; + H[6] = X6 ^ M[6]; + H[7] = X7 ^ M[7]; + + T[1] &= ~((u64bit)1 << 62); // clear first flag if set + + msg_len -= to_proc; + msg += to_proc; + } while(msg_len); + } + +void reset_tweak(u64bit T[3], type_code type, bool final) + { + T[0] = 0; + T[1] = ((u64bit)type << 56) | ((u64bit)1 << 62) | ((u64bit)final << 63); + } + +void initial_block(u64bit H[9], u64bit T[3], u32bit output_bits, + const std::string& personalization) + { + clear_mem(H, 9); + + // ASCII("SHA3") followed by version (0x0001) code + byte config_str[32] = { 0x53, 0x48, 0x41, 0x33, 0x01, 0x00, 0 }; + store_le(output_bits, config_str + 8); + + reset_tweak(T, SKEIN_CONFIG, true); + ubi_512(H, T, config_str, sizeof(config_str)); + + if(personalization != "") + { + /* + This is a limitation of this implementation, and not of the + algorithm specification. Could be fixed relatively easily, but + doesn't seem worth the trouble. + */ + if(personalization.length() > 64) + throw Invalid_Argument("Skein personalization must be <= 64 bytes"); + + const byte* bits = reinterpret_cast(personalization.data()); + + reset_tweak(T, SKEIN_PERSONALIZATION, true); + ubi_512(H, T, bits, personalization.length()); + } + + reset_tweak(T, SKEIN_MSG, false); + } + +} + +Skein_512::Skein_512(u32bit arg_output_bits, + const std::string& arg_personalization) : + HashFunction(arg_output_bits / 8, 64), + personalization(arg_personalization), + output_bits(arg_output_bits) + { + if(output_bits == 0 || output_bits % 8 != 0) + throw Invalid_Argument("Bad output bits size for Skein-512"); + + buf_pos = 0; + initial_block(H, T, output_bits, personalization); + } + +std::string Skein_512::name() const + { + return "Skein-512(" + to_string(output_bits) + ")"; + } + +HashFunction* Skein_512::clone() const + { + return new Skein_512(output_bits, personalization); + } + +void Skein_512::clear() throw() + { + H.clear(); + T.clear(); + buffer.clear(); + buf_pos = 0; + } + +void Skein_512::add_data(const byte input[], u32bit length) + { + if(length == 0) + return; + + if(buf_pos) + { + buffer.copy(buf_pos, input, length); + if(buf_pos + length > 64) + { + ubi_512(H, T, &buffer[0], buffer.size()); + + input += (64 - buf_pos); + length -= (64 - buf_pos); + buf_pos = 0; + } + } + + const u32bit full_blocks = (length - 1) / 64; + + if(full_blocks) + ubi_512(H, T, input, 64*full_blocks); + + length -= full_blocks * 64; + + buffer.copy(buf_pos, input + full_blocks * 64, length); + buf_pos += length; + } + +void Skein_512::final_result(byte out[]) + { + T[1] |= ((u64bit)1 << 63); // final block flag + + for(u32bit i = buf_pos; i != buffer.size(); ++i) + buffer[i] = 0; + + ubi_512(H, T, &buffer[0], buf_pos); + + byte counter[8] = { 0 }; + + u32bit out_bytes = output_bits / 8; + + SecureBuffer H_out; + + while(out_bytes) + { + const u32bit to_proc = std::min(out_bytes, 64); + + H_out.copy(H.begin(), 8); + + reset_tweak(T, SKEIN_OUTPUT, true); + ubi_512(H_out, T, counter, sizeof(counter)); + + for(u32bit i = 0; i != to_proc; ++i) + out[i] = get_byte(7-i%8, H_out[i/8]); + + out_bytes -= to_proc; + out += to_proc; + + for(u32bit i = 0; i != sizeof(counter); ++i) + if(++counter[i]) + break; + } + + buf_pos = 0; + initial_block(H, T, output_bits, personalization); + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/skein/skein_512.h b/src/libs/3rdparty/botan/src/hash/skein/skein_512.h new file mode 100644 index 00000000000..fa558fc0d56 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/skein/skein_512.h @@ -0,0 +1,41 @@ +/** +* The Skein-512 hash function +* (C) 2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SKEIN_512_H__ +#define BOTAN_SKEIN_512_H__ + +#include +#include +#include + +namespace Botan { + +class BOTAN_DLL Skein_512 : public HashFunction + { + public: + Skein_512(u32bit output_bits = 512, + const std::string& personalization = ""); + + HashFunction* clone() const; + std::string name() const; + void clear() throw(); + private: + void add_data(const byte input[], u32bit length); + void final_result(byte out[]); + + std::string personalization; + u32bit output_bits; + SecureBuffer H; + SecureBuffer T; + + SecureBuffer buffer; + u32bit buf_pos; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/tiger/info.txt b/src/libs/3rdparty/botan/src/hash/tiger/info.txt new file mode 100644 index 00000000000..7d4cd717783 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/tiger/info.txt @@ -0,0 +1,15 @@ +realname "Tiger" + +define TIGER + +load_on auto + + +tig_tab.cpp +tiger.cpp +tiger.h + + + +mdx_hash + diff --git a/src/libs/3rdparty/botan/src/hash/tiger/tig_tab.cpp b/src/libs/3rdparty/botan/src/hash/tiger/tig_tab.cpp new file mode 100644 index 00000000000..b76501d7409 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/tiger/tig_tab.cpp @@ -0,0 +1,364 @@ +/* +* S-Box Tables for Tiger +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +const u64bit Tiger::SBOX1[256] = { + 0x02AAB17CF7E90C5E, 0xAC424B03E243A8EC, 0x72CD5BE30DD5FCD3, + 0x6D019B93F6F97F3A, 0xCD9978FFD21F9193, 0x7573A1C9708029E2, + 0xB164326B922A83C3, 0x46883EEE04915870, 0xEAACE3057103ECE6, + 0xC54169B808A3535C, 0x4CE754918DDEC47C, 0x0AA2F4DFDC0DF40C, + 0x10B76F18A74DBEFA, 0xC6CCB6235AD1AB6A, 0x13726121572FE2FF, + 0x1A488C6F199D921E, 0x4BC9F9F4DA0007CA, 0x26F5E6F6E85241C7, + 0x859079DBEA5947B6, 0x4F1885C5C99E8C92, 0xD78E761EA96F864B, + 0x8E36428C52B5C17D, 0x69CF6827373063C1, 0xB607C93D9BB4C56E, + 0x7D820E760E76B5EA, 0x645C9CC6F07FDC42, 0xBF38A078243342E0, + 0x5F6B343C9D2E7D04, 0xF2C28AEB600B0EC6, 0x6C0ED85F7254BCAC, + 0x71592281A4DB4FE5, 0x1967FA69CE0FED9F, 0xFD5293F8B96545DB, + 0xC879E9D7F2A7600B, 0x860248920193194E, 0xA4F9533B2D9CC0B3, + 0x9053836C15957613, 0xDB6DCF8AFC357BF1, 0x18BEEA7A7A370F57, + 0x037117CA50B99066, 0x6AB30A9774424A35, 0xF4E92F02E325249B, + 0x7739DB07061CCAE1, 0xD8F3B49CECA42A05, 0xBD56BE3F51382F73, + 0x45FAED5843B0BB28, 0x1C813D5C11BF1F83, 0x8AF0E4B6D75FA169, + 0x33EE18A487AD9999, 0x3C26E8EAB1C94410, 0xB510102BC0A822F9, + 0x141EEF310CE6123B, 0xFC65B90059DDB154, 0xE0158640C5E0E607, + 0x884E079826C3A3CF, 0x930D0D9523C535FD, 0x35638D754E9A2B00, + 0x4085FCCF40469DD5, 0xC4B17AD28BE23A4C, 0xCAB2F0FC6A3E6A2E, + 0x2860971A6B943FCD, 0x3DDE6EE212E30446, 0x6222F32AE01765AE, + 0x5D550BB5478308FE, 0xA9EFA98DA0EDA22A, 0xC351A71686C40DA7, + 0x1105586D9C867C84, 0xDCFFEE85FDA22853, 0xCCFBD0262C5EEF76, + 0xBAF294CB8990D201, 0xE69464F52AFAD975, 0x94B013AFDF133E14, + 0x06A7D1A32823C958, 0x6F95FE5130F61119, 0xD92AB34E462C06C0, + 0xED7BDE33887C71D2, 0x79746D6E6518393E, 0x5BA419385D713329, + 0x7C1BA6B948A97564, 0x31987C197BFDAC67, 0xDE6C23C44B053D02, + 0x581C49FED002D64D, 0xDD474D6338261571, 0xAA4546C3E473D062, + 0x928FCE349455F860, 0x48161BBACAAB94D9, 0x63912430770E6F68, + 0x6EC8A5E602C6641C, 0x87282515337DDD2B, 0x2CDA6B42034B701B, + 0xB03D37C181CB096D, 0xE108438266C71C6F, 0x2B3180C7EB51B255, + 0xDF92B82F96C08BBC, 0x5C68C8C0A632F3BA, 0x5504CC861C3D0556, + 0xABBFA4E55FB26B8F, 0x41848B0AB3BACEB4, 0xB334A273AA445D32, + 0xBCA696F0A85AD881, 0x24F6EC65B528D56C, 0x0CE1512E90F4524A, + 0x4E9DD79D5506D35A, 0x258905FAC6CE9779, 0x2019295B3E109B33, + 0xF8A9478B73A054CC, 0x2924F2F934417EB0, 0x3993357D536D1BC4, + 0x38A81AC21DB6FF8B, 0x47C4FBF17D6016BF, 0x1E0FAADD7667E3F5, + 0x7ABCFF62938BEB96, 0xA78DAD948FC179C9, 0x8F1F98B72911E50D, + 0x61E48EAE27121A91, 0x4D62F7AD31859808, 0xECEBA345EF5CEAEB, + 0xF5CEB25EBC9684CE, 0xF633E20CB7F76221, 0xA32CDF06AB8293E4, + 0x985A202CA5EE2CA4, 0xCF0B8447CC8A8FB1, 0x9F765244979859A3, + 0xA8D516B1A1240017, 0x0BD7BA3EBB5DC726, 0xE54BCA55B86ADB39, + 0x1D7A3AFD6C478063, 0x519EC608E7669EDD, 0x0E5715A2D149AA23, + 0x177D4571848FF194, 0xEEB55F3241014C22, 0x0F5E5CA13A6E2EC2, + 0x8029927B75F5C361, 0xAD139FABC3D6E436, 0x0D5DF1A94CCF402F, + 0x3E8BD948BEA5DFC8, 0xA5A0D357BD3FF77E, 0xA2D12E251F74F645, + 0x66FD9E525E81A082, 0x2E0C90CE7F687A49, 0xC2E8BCBEBA973BC5, + 0x000001BCE509745F, 0x423777BBE6DAB3D6, 0xD1661C7EAEF06EB5, + 0xA1781F354DAACFD8, 0x2D11284A2B16AFFC, 0xF1FC4F67FA891D1F, + 0x73ECC25DCB920ADA, 0xAE610C22C2A12651, 0x96E0A810D356B78A, + 0x5A9A381F2FE7870F, 0xD5AD62EDE94E5530, 0xD225E5E8368D1427, + 0x65977B70C7AF4631, 0x99F889B2DE39D74F, 0x233F30BF54E1D143, + 0x9A9675D3D9A63C97, 0x5470554FF334F9A8, 0x166ACB744A4F5688, + 0x70C74CAAB2E4AEAD, 0xF0D091646F294D12, 0x57B82A89684031D1, + 0xEFD95A5A61BE0B6B, 0x2FBD12E969F2F29A, 0x9BD37013FEFF9FE8, + 0x3F9B0404D6085A06, 0x4940C1F3166CFE15, 0x09542C4DCDF3DEFB, + 0xB4C5218385CD5CE3, 0xC935B7DC4462A641, 0x3417F8A68ED3B63F, + 0xB80959295B215B40, 0xF99CDAEF3B8C8572, 0x018C0614F8FCB95D, + 0x1B14ACCD1A3ACDF3, 0x84D471F200BB732D, 0xC1A3110E95E8DA16, + 0x430A7220BF1A82B8, 0xB77E090D39DF210E, 0x5EF4BD9F3CD05E9D, + 0x9D4FF6DA7E57A444, 0xDA1D60E183D4A5F8, 0xB287C38417998E47, + 0xFE3EDC121BB31886, 0xC7FE3CCC980CCBEF, 0xE46FB590189BFD03, + 0x3732FD469A4C57DC, 0x7EF700A07CF1AD65, 0x59C64468A31D8859, + 0x762FB0B4D45B61F6, 0x155BAED099047718, 0x68755E4C3D50BAA6, + 0xE9214E7F22D8B4DF, 0x2ADDBF532EAC95F4, 0x32AE3909B4BD0109, + 0x834DF537B08E3450, 0xFA209DA84220728D, 0x9E691D9B9EFE23F7, + 0x0446D288C4AE8D7F, 0x7B4CC524E169785B, 0x21D87F0135CA1385, + 0xCEBB400F137B8AA5, 0x272E2B66580796BE, 0x3612264125C2B0DE, + 0x057702BDAD1EFBB2, 0xD4BABB8EACF84BE9, 0x91583139641BC67B, + 0x8BDC2DE08036E024, 0x603C8156F49F68ED, 0xF7D236F7DBEF5111, + 0x9727C4598AD21E80, 0xA08A0896670A5FD7, 0xCB4A8F4309EBA9CB, + 0x81AF564B0F7036A1, 0xC0B99AA778199ABD, 0x959F1EC83FC8E952, + 0x8C505077794A81B9, 0x3ACAAF8F056338F0, 0x07B43F50627A6778, + 0x4A44AB49F5ECCC77, 0x3BC3D6E4B679EE98, 0x9CC0D4D1CF14108C, + 0x4406C00B206BC8A0, 0x82A18854C8D72D89, 0x67E366B35C3C432C, + 0xB923DD61102B37F2, 0x56AB2779D884271D, 0xBE83E1B0FF1525AF, + 0xFB7C65D4217E49A9, 0x6BDBE0E76D48E7D4, 0x08DF828745D9179E, + 0x22EA6A9ADD53BD34, 0xE36E141C5622200A, 0x7F805D1B8CB750EE, + 0xAFE5C7A59F58E837, 0xE27F996A4FB1C23C, 0xD3867DFB0775F0D0, + 0xD0E673DE6E88891A, 0x123AEB9EAFB86C25, 0x30F1D5D5C145B895, + 0xBB434A2DEE7269E7, 0x78CB67ECF931FA38, 0xF33B0372323BBF9C, + 0x52D66336FB279C74, 0x505F33AC0AFB4EAA, 0xE8A5CD99A2CCE187, + 0x534974801E2D30BB, 0x8D2D5711D5876D90, 0x1F1A412891BC038E, + 0xD6E2E71D82E56648, 0x74036C3A497732B7, 0x89B67ED96361F5AB, + 0xFFED95D8F1EA02A2, 0xE72B3BD61464D43D, 0xA6300F170BDC4820, + 0xEBC18760ED78A77A }; + +const u64bit Tiger::SBOX2[256] = { + 0xE6A6BE5A05A12138, 0xB5A122A5B4F87C98, 0x563C6089140B6990, + 0x4C46CB2E391F5DD5, 0xD932ADDBC9B79434, 0x08EA70E42015AFF5, + 0xD765A6673E478CF1, 0xC4FB757EAB278D99, 0xDF11C6862D6E0692, + 0xDDEB84F10D7F3B16, 0x6F2EF604A665EA04, 0x4A8E0F0FF0E0DFB3, + 0xA5EDEEF83DBCBA51, 0xFC4F0A2A0EA4371E, 0xE83E1DA85CB38429, + 0xDC8FF882BA1B1CE2, 0xCD45505E8353E80D, 0x18D19A00D4DB0717, + 0x34A0CFEDA5F38101, 0x0BE77E518887CAF2, 0x1E341438B3C45136, + 0xE05797F49089CCF9, 0xFFD23F9DF2591D14, 0x543DDA228595C5CD, + 0x661F81FD99052A33, 0x8736E641DB0F7B76, 0x15227725418E5307, + 0xE25F7F46162EB2FA, 0x48A8B2126C13D9FE, 0xAFDC541792E76EEA, + 0x03D912BFC6D1898F, 0x31B1AAFA1B83F51B, 0xF1AC2796E42AB7D9, + 0x40A3A7D7FCD2EBAC, 0x1056136D0AFBBCC5, 0x7889E1DD9A6D0C85, + 0xD33525782A7974AA, 0xA7E25D09078AC09B, 0xBD4138B3EAC6EDD0, + 0x920ABFBE71EB9E70, 0xA2A5D0F54FC2625C, 0xC054E36B0B1290A3, + 0xF6DD59FF62FE932B, 0x3537354511A8AC7D, 0xCA845E9172FADCD4, + 0x84F82B60329D20DC, 0x79C62CE1CD672F18, 0x8B09A2ADD124642C, + 0xD0C1E96A19D9E726, 0x5A786A9B4BA9500C, 0x0E020336634C43F3, + 0xC17B474AEB66D822, 0x6A731AE3EC9BAAC2, 0x8226667AE0840258, + 0x67D4567691CAECA5, 0x1D94155C4875ADB5, 0x6D00FD985B813FDF, + 0x51286EFCB774CD06, 0x5E8834471FA744AF, 0xF72CA0AEE761AE2E, + 0xBE40E4CDAEE8E09A, 0xE9970BBB5118F665, 0x726E4BEB33DF1964, + 0x703B000729199762, 0x4631D816F5EF30A7, 0xB880B5B51504A6BE, + 0x641793C37ED84B6C, 0x7B21ED77F6E97D96, 0x776306312EF96B73, + 0xAE528948E86FF3F4, 0x53DBD7F286A3F8F8, 0x16CADCE74CFC1063, + 0x005C19BDFA52C6DD, 0x68868F5D64D46AD3, 0x3A9D512CCF1E186A, + 0x367E62C2385660AE, 0xE359E7EA77DCB1D7, 0x526C0773749ABE6E, + 0x735AE5F9D09F734B, 0x493FC7CC8A558BA8, 0xB0B9C1533041AB45, + 0x321958BA470A59BD, 0x852DB00B5F46C393, 0x91209B2BD336B0E5, + 0x6E604F7D659EF19F, 0xB99A8AE2782CCB24, 0xCCF52AB6C814C4C7, + 0x4727D9AFBE11727B, 0x7E950D0C0121B34D, 0x756F435670AD471F, + 0xF5ADD442615A6849, 0x4E87E09980B9957A, 0x2ACFA1DF50AEE355, + 0xD898263AFD2FD556, 0xC8F4924DD80C8FD6, 0xCF99CA3D754A173A, + 0xFE477BACAF91BF3C, 0xED5371F6D690C12D, 0x831A5C285E687094, + 0xC5D3C90A3708A0A4, 0x0F7F903717D06580, 0x19F9BB13B8FDF27F, + 0xB1BD6F1B4D502843, 0x1C761BA38FFF4012, 0x0D1530C4E2E21F3B, + 0x8943CE69A7372C8A, 0xE5184E11FEB5CE66, 0x618BDB80BD736621, + 0x7D29BAD68B574D0B, 0x81BB613E25E6FE5B, 0x071C9C10BC07913F, + 0xC7BEEB7909AC2D97, 0xC3E58D353BC5D757, 0xEB017892F38F61E8, + 0xD4EFFB9C9B1CC21A, 0x99727D26F494F7AB, 0xA3E063A2956B3E03, + 0x9D4A8B9A4AA09C30, 0x3F6AB7D500090FB4, 0x9CC0F2A057268AC0, + 0x3DEE9D2DEDBF42D1, 0x330F49C87960A972, 0xC6B2720287421B41, + 0x0AC59EC07C00369C, 0xEF4EAC49CB353425, 0xF450244EEF0129D8, + 0x8ACC46E5CAF4DEB6, 0x2FFEAB63989263F7, 0x8F7CB9FE5D7A4578, + 0x5BD8F7644E634635, 0x427A7315BF2DC900, 0x17D0C4AA2125261C, + 0x3992486C93518E50, 0xB4CBFEE0A2D7D4C3, 0x7C75D6202C5DDD8D, + 0xDBC295D8E35B6C61, 0x60B369D302032B19, 0xCE42685FDCE44132, + 0x06F3DDB9DDF65610, 0x8EA4D21DB5E148F0, 0x20B0FCE62FCD496F, + 0x2C1B912358B0EE31, 0xB28317B818F5A308, 0xA89C1E189CA6D2CF, + 0x0C6B18576AAADBC8, 0xB65DEAA91299FAE3, 0xFB2B794B7F1027E7, + 0x04E4317F443B5BEB, 0x4B852D325939D0A6, 0xD5AE6BEEFB207FFC, + 0x309682B281C7D374, 0xBAE309A194C3B475, 0x8CC3F97B13B49F05, + 0x98A9422FF8293967, 0x244B16B01076FF7C, 0xF8BF571C663D67EE, + 0x1F0D6758EEE30DA1, 0xC9B611D97ADEB9B7, 0xB7AFD5887B6C57A2, + 0x6290AE846B984FE1, 0x94DF4CDEACC1A5FD, 0x058A5BD1C5483AFF, + 0x63166CC142BA3C37, 0x8DB8526EB2F76F40, 0xE10880036F0D6D4E, + 0x9E0523C9971D311D, 0x45EC2824CC7CD691, 0x575B8359E62382C9, + 0xFA9E400DC4889995, 0xD1823ECB45721568, 0xDAFD983B8206082F, + 0xAA7D29082386A8CB, 0x269FCD4403B87588, 0x1B91F5F728BDD1E0, + 0xE4669F39040201F6, 0x7A1D7C218CF04ADE, 0x65623C29D79CE5CE, + 0x2368449096C00BB1, 0xAB9BF1879DA503BA, 0xBC23ECB1A458058E, + 0x9A58DF01BB401ECC, 0xA070E868A85F143D, 0x4FF188307DF2239E, + 0x14D565B41A641183, 0xEE13337452701602, 0x950E3DCF3F285E09, + 0x59930254B9C80953, 0x3BF299408930DA6D, 0xA955943F53691387, + 0xA15EDECAA9CB8784, 0x29142127352BE9A0, 0x76F0371FFF4E7AFB, + 0x0239F450274F2228, 0xBB073AF01D5E868B, 0xBFC80571C10E96C1, + 0xD267088568222E23, 0x9671A3D48E80B5B0, 0x55B5D38AE193BB81, + 0x693AE2D0A18B04B8, 0x5C48B4ECADD5335F, 0xFD743B194916A1CA, + 0x2577018134BE98C4, 0xE77987E83C54A4AD, 0x28E11014DA33E1B9, + 0x270CC59E226AA213, 0x71495F756D1A5F60, 0x9BE853FB60AFEF77, + 0xADC786A7F7443DBF, 0x0904456173B29A82, 0x58BC7A66C232BD5E, + 0xF306558C673AC8B2, 0x41F639C6B6C9772A, 0x216DEFE99FDA35DA, + 0x11640CC71C7BE615, 0x93C43694565C5527, 0xEA038E6246777839, + 0xF9ABF3CE5A3E2469, 0x741E768D0FD312D2, 0x0144B883CED652C6, + 0xC20B5A5BA33F8552, 0x1AE69633C3435A9D, 0x97A28CA4088CFDEC, + 0x8824A43C1E96F420, 0x37612FA66EEEA746, 0x6B4CB165F9CF0E5A, + 0x43AA1C06A0ABFB4A, 0x7F4DC26FF162796B, 0x6CBACC8E54ED9B0F, + 0xA6B7FFEFD2BB253E, 0x2E25BC95B0A29D4F, 0x86D6A58BDEF1388C, + 0xDED74AC576B6F054, 0x8030BDBC2B45805D, 0x3C81AF70E94D9289, + 0x3EFF6DDA9E3100DB, 0xB38DC39FDFCC8847, 0x123885528D17B87E, + 0xF2DA0ED240B1B642, 0x44CEFADCD54BF9A9, 0x1312200E433C7EE6, + 0x9FFCC84F3A78C748, 0xF0CD1F72248576BB, 0xEC6974053638CFE4, + 0x2BA7B67C0CEC4E4C, 0xAC2F4DF3E5CE32ED, 0xCB33D14326EA4C11, + 0xA4E9044CC77E58BC, 0x5F513293D934FCEF, 0x5DC9645506E55444, + 0x50DE418F317DE40A, 0x388CB31A69DDE259, 0x2DB4A83455820A86, + 0x9010A91E84711AE9, 0x4DF7F0B7B1498371, 0xD62A2EABC0977179, + 0x22FAC097AA8D5C0E }; + +const u64bit Tiger::SBOX3[256] = { + 0xF49FCC2FF1DAF39B, 0x487FD5C66FF29281, 0xE8A30667FCDCA83F, + 0x2C9B4BE3D2FCCE63, 0xDA3FF74B93FBBBC2, 0x2FA165D2FE70BA66, + 0xA103E279970E93D4, 0xBECDEC77B0E45E71, 0xCFB41E723985E497, + 0xB70AAA025EF75017, 0xD42309F03840B8E0, 0x8EFC1AD035898579, + 0x96C6920BE2B2ABC5, 0x66AF4163375A9172, 0x2174ABDCCA7127FB, + 0xB33CCEA64A72FF41, 0xF04A4933083066A5, 0x8D970ACDD7289AF5, + 0x8F96E8E031C8C25E, 0xF3FEC02276875D47, 0xEC7BF310056190DD, + 0xF5ADB0AEBB0F1491, 0x9B50F8850FD58892, 0x4975488358B74DE8, + 0xA3354FF691531C61, 0x0702BBE481D2C6EE, 0x89FB24057DEDED98, + 0xAC3075138596E902, 0x1D2D3580172772ED, 0xEB738FC28E6BC30D, + 0x5854EF8F63044326, 0x9E5C52325ADD3BBE, 0x90AA53CF325C4623, + 0xC1D24D51349DD067, 0x2051CFEEA69EA624, 0x13220F0A862E7E4F, + 0xCE39399404E04864, 0xD9C42CA47086FCB7, 0x685AD2238A03E7CC, + 0x066484B2AB2FF1DB, 0xFE9D5D70EFBF79EC, 0x5B13B9DD9C481854, + 0x15F0D475ED1509AD, 0x0BEBCD060EC79851, 0xD58C6791183AB7F8, + 0xD1187C5052F3EEE4, 0xC95D1192E54E82FF, 0x86EEA14CB9AC6CA2, + 0x3485BEB153677D5D, 0xDD191D781F8C492A, 0xF60866BAA784EBF9, + 0x518F643BA2D08C74, 0x8852E956E1087C22, 0xA768CB8DC410AE8D, + 0x38047726BFEC8E1A, 0xA67738B4CD3B45AA, 0xAD16691CEC0DDE19, + 0xC6D4319380462E07, 0xC5A5876D0BA61938, 0x16B9FA1FA58FD840, + 0x188AB1173CA74F18, 0xABDA2F98C99C021F, 0x3E0580AB134AE816, + 0x5F3B05B773645ABB, 0x2501A2BE5575F2F6, 0x1B2F74004E7E8BA9, + 0x1CD7580371E8D953, 0x7F6ED89562764E30, 0xB15926FF596F003D, + 0x9F65293DA8C5D6B9, 0x6ECEF04DD690F84C, 0x4782275FFF33AF88, + 0xE41433083F820801, 0xFD0DFE409A1AF9B5, 0x4325A3342CDB396B, + 0x8AE77E62B301B252, 0xC36F9E9F6655615A, 0x85455A2D92D32C09, + 0xF2C7DEA949477485, 0x63CFB4C133A39EBA, 0x83B040CC6EBC5462, + 0x3B9454C8FDB326B0, 0x56F56A9E87FFD78C, 0x2DC2940D99F42BC6, + 0x98F7DF096B096E2D, 0x19A6E01E3AD852BF, 0x42A99CCBDBD4B40B, + 0xA59998AF45E9C559, 0x366295E807D93186, 0x6B48181BFAA1F773, + 0x1FEC57E2157A0A1D, 0x4667446AF6201AD5, 0xE615EBCACFB0F075, + 0xB8F31F4F68290778, 0x22713ED6CE22D11E, 0x3057C1A72EC3C93B, + 0xCB46ACC37C3F1F2F, 0xDBB893FD02AAF50E, 0x331FD92E600B9FCF, + 0xA498F96148EA3AD6, 0xA8D8426E8B6A83EA, 0xA089B274B7735CDC, + 0x87F6B3731E524A11, 0x118808E5CBC96749, 0x9906E4C7B19BD394, + 0xAFED7F7E9B24A20C, 0x6509EADEEB3644A7, 0x6C1EF1D3E8EF0EDE, + 0xB9C97D43E9798FB4, 0xA2F2D784740C28A3, 0x7B8496476197566F, + 0x7A5BE3E6B65F069D, 0xF96330ED78BE6F10, 0xEEE60DE77A076A15, + 0x2B4BEE4AA08B9BD0, 0x6A56A63EC7B8894E, 0x02121359BA34FEF4, + 0x4CBF99F8283703FC, 0x398071350CAF30C8, 0xD0A77A89F017687A, + 0xF1C1A9EB9E423569, 0x8C7976282DEE8199, 0x5D1737A5DD1F7ABD, + 0x4F53433C09A9FA80, 0xFA8B0C53DF7CA1D9, 0x3FD9DCBC886CCB77, + 0xC040917CA91B4720, 0x7DD00142F9D1DCDF, 0x8476FC1D4F387B58, + 0x23F8E7C5F3316503, 0x032A2244E7E37339, 0x5C87A5D750F5A74B, + 0x082B4CC43698992E, 0xDF917BECB858F63C, 0x3270B8FC5BF86DDA, + 0x10AE72BB29B5DD76, 0x576AC94E7700362B, 0x1AD112DAC61EFB8F, + 0x691BC30EC5FAA427, 0xFF246311CC327143, 0x3142368E30E53206, + 0x71380E31E02CA396, 0x958D5C960AAD76F1, 0xF8D6F430C16DA536, + 0xC8FFD13F1BE7E1D2, 0x7578AE66004DDBE1, 0x05833F01067BE646, + 0xBB34B5AD3BFE586D, 0x095F34C9A12B97F0, 0x247AB64525D60CA8, + 0xDCDBC6F3017477D1, 0x4A2E14D4DECAD24D, 0xBDB5E6D9BE0A1EEB, + 0x2A7E70F7794301AB, 0xDEF42D8A270540FD, 0x01078EC0A34C22C1, + 0xE5DE511AF4C16387, 0x7EBB3A52BD9A330A, 0x77697857AA7D6435, + 0x004E831603AE4C32, 0xE7A21020AD78E312, 0x9D41A70C6AB420F2, + 0x28E06C18EA1141E6, 0xD2B28CBD984F6B28, 0x26B75F6C446E9D83, + 0xBA47568C4D418D7F, 0xD80BADBFE6183D8E, 0x0E206D7F5F166044, + 0xE258A43911CBCA3E, 0x723A1746B21DC0BC, 0xC7CAA854F5D7CDD3, + 0x7CAC32883D261D9C, 0x7690C26423BA942C, 0x17E55524478042B8, + 0xE0BE477656A2389F, 0x4D289B5E67AB2DA0, 0x44862B9C8FBBFD31, + 0xB47CC8049D141365, 0x822C1B362B91C793, 0x4EB14655FB13DFD8, + 0x1ECBBA0714E2A97B, 0x6143459D5CDE5F14, 0x53A8FBF1D5F0AC89, + 0x97EA04D81C5E5B00, 0x622181A8D4FDB3F3, 0xE9BCD341572A1208, + 0x1411258643CCE58A, 0x9144C5FEA4C6E0A4, 0x0D33D06565CF620F, + 0x54A48D489F219CA1, 0xC43E5EAC6D63C821, 0xA9728B3A72770DAF, + 0xD7934E7B20DF87EF, 0xE35503B61A3E86E5, 0xCAE321FBC819D504, + 0x129A50B3AC60BFA6, 0xCD5E68EA7E9FB6C3, 0xB01C90199483B1C7, + 0x3DE93CD5C295376C, 0xAED52EDF2AB9AD13, 0x2E60F512C0A07884, + 0xBC3D86A3E36210C9, 0x35269D9B163951CE, 0x0C7D6E2AD0CDB5FA, + 0x59E86297D87F5733, 0x298EF221898DB0E7, 0x55000029D1A5AA7E, + 0x8BC08AE1B5061B45, 0xC2C31C2B6C92703A, 0x94CC596BAF25EF42, + 0x0A1D73DB22540456, 0x04B6A0F9D9C4179A, 0xEFFDAFA2AE3D3C60, + 0xF7C8075BB49496C4, 0x9CC5C7141D1CD4E3, 0x78BD1638218E5534, + 0xB2F11568F850246A, 0xEDFABCFA9502BC29, 0x796CE5F2DA23051B, + 0xAAE128B0DC93537C, 0x3A493DA0EE4B29AE, 0xB5DF6B2C416895D7, + 0xFCABBD25122D7F37, 0x70810B58105DC4B1, 0xE10FDD37F7882A90, + 0x524DCAB5518A3F5C, 0x3C9E85878451255B, 0x4029828119BD34E2, + 0x74A05B6F5D3CECCB, 0xB610021542E13ECA, 0x0FF979D12F59E2AC, + 0x6037DA27E4F9CC50, 0x5E92975A0DF1847D, 0xD66DE190D3E623FE, + 0x5032D6B87B568048, 0x9A36B7CE8235216E, 0x80272A7A24F64B4A, + 0x93EFED8B8C6916F7, 0x37DDBFF44CCE1555, 0x4B95DB5D4B99BD25, + 0x92D3FDA169812FC0, 0xFB1A4A9A90660BB6, 0x730C196946A4B9B2, + 0x81E289AA7F49DA68, 0x64669A0F83B1A05F, 0x27B3FF7D9644F48B, + 0xCC6B615C8DB675B3, 0x674F20B9BCEBBE95, 0x6F31238275655982, + 0x5AE488713E45CF05, 0xBF619F9954C21157, 0xEABAC46040A8EAE9, + 0x454C6FE9F2C0C1CD, 0x419CF6496412691C, 0xD3DC3BEF265B0F70, + 0x6D0E60F5C3578A9E }; + +const u64bit Tiger::SBOX4[256] = { + 0x5B0E608526323C55, 0x1A46C1A9FA1B59F5, 0xA9E245A17C4C8FFA, + 0x65CA5159DB2955D7, 0x05DB0A76CE35AFC2, 0x81EAC77EA9113D45, + 0x528EF88AB6AC0A0D, 0xA09EA253597BE3FF, 0x430DDFB3AC48CD56, + 0xC4B3A67AF45CE46F, 0x4ECECFD8FBE2D05E, 0x3EF56F10B39935F0, + 0x0B22D6829CD619C6, 0x17FD460A74DF2069, 0x6CF8CC8E8510ED40, + 0xD6C824BF3A6ECAA7, 0x61243D581A817049, 0x048BACB6BBC163A2, + 0xD9A38AC27D44CC32, 0x7FDDFF5BAAF410AB, 0xAD6D495AA804824B, + 0xE1A6A74F2D8C9F94, 0xD4F7851235DEE8E3, 0xFD4B7F886540D893, + 0x247C20042AA4BFDA, 0x096EA1C517D1327C, 0xD56966B4361A6685, + 0x277DA5C31221057D, 0x94D59893A43ACFF7, 0x64F0C51CCDC02281, + 0x3D33BCC4FF6189DB, 0xE005CB184CE66AF1, 0xFF5CCD1D1DB99BEA, + 0xB0B854A7FE42980F, 0x7BD46A6A718D4B9F, 0xD10FA8CC22A5FD8C, + 0xD31484952BE4BD31, 0xC7FA975FCB243847, 0x4886ED1E5846C407, + 0x28CDDB791EB70B04, 0xC2B00BE2F573417F, 0x5C9590452180F877, + 0x7A6BDDFFF370EB00, 0xCE509E38D6D9D6A4, 0xEBEB0F00647FA702, + 0x1DCC06CF76606F06, 0xE4D9F28BA286FF0A, 0xD85A305DC918C262, + 0x475B1D8732225F54, 0x2D4FB51668CCB5FE, 0xA679B9D9D72BBA20, + 0x53841C0D912D43A5, 0x3B7EAA48BF12A4E8, 0x781E0E47F22F1DDF, + 0xEFF20CE60AB50973, 0x20D261D19DFFB742, 0x16A12B03062A2E39, + 0x1960EB2239650495, 0x251C16FED50EB8B8, 0x9AC0C330F826016E, + 0xED152665953E7671, 0x02D63194A6369570, 0x5074F08394B1C987, + 0x70BA598C90B25CE1, 0x794A15810B9742F6, 0x0D5925E9FCAF8C6C, + 0x3067716CD868744E, 0x910AB077E8D7731B, 0x6A61BBDB5AC42F61, + 0x93513EFBF0851567, 0xF494724B9E83E9D5, 0xE887E1985C09648D, + 0x34B1D3C675370CFD, 0xDC35E433BC0D255D, 0xD0AAB84234131BE0, + 0x08042A50B48B7EAF, 0x9997C4EE44A3AB35, 0x829A7B49201799D0, + 0x263B8307B7C54441, 0x752F95F4FD6A6CA6, 0x927217402C08C6E5, + 0x2A8AB754A795D9EE, 0xA442F7552F72943D, 0x2C31334E19781208, + 0x4FA98D7CEAEE6291, 0x55C3862F665DB309, 0xBD0610175D53B1F3, + 0x46FE6CB840413F27, 0x3FE03792DF0CFA59, 0xCFE700372EB85E8F, + 0xA7BE29E7ADBCE118, 0xE544EE5CDE8431DD, 0x8A781B1B41F1873E, + 0xA5C94C78A0D2F0E7, 0x39412E2877B60728, 0xA1265EF3AFC9A62C, + 0xBCC2770C6A2506C5, 0x3AB66DD5DCE1CE12, 0xE65499D04A675B37, + 0x7D8F523481BFD216, 0x0F6F64FCEC15F389, 0x74EFBE618B5B13C8, + 0xACDC82B714273E1D, 0xDD40BFE003199D17, 0x37E99257E7E061F8, + 0xFA52626904775AAA, 0x8BBBF63A463D56F9, 0xF0013F1543A26E64, + 0xA8307E9F879EC898, 0xCC4C27A4150177CC, 0x1B432F2CCA1D3348, + 0xDE1D1F8F9F6FA013, 0x606602A047A7DDD6, 0xD237AB64CC1CB2C7, + 0x9B938E7225FCD1D3, 0xEC4E03708E0FF476, 0xFEB2FBDA3D03C12D, + 0xAE0BCED2EE43889A, 0x22CB8923EBFB4F43, 0x69360D013CF7396D, + 0x855E3602D2D4E022, 0x073805BAD01F784C, 0x33E17A133852F546, + 0xDF4874058AC7B638, 0xBA92B29C678AA14A, 0x0CE89FC76CFAADCD, + 0x5F9D4E0908339E34, 0xF1AFE9291F5923B9, 0x6E3480F60F4A265F, + 0xEEBF3A2AB29B841C, 0xE21938A88F91B4AD, 0x57DFEFF845C6D3C3, + 0x2F006B0BF62CAAF2, 0x62F479EF6F75EE78, 0x11A55AD41C8916A9, + 0xF229D29084FED453, 0x42F1C27B16B000E6, 0x2B1F76749823C074, + 0x4B76ECA3C2745360, 0x8C98F463B91691BD, 0x14BCC93CF1ADE66A, + 0x8885213E6D458397, 0x8E177DF0274D4711, 0xB49B73B5503F2951, + 0x10168168C3F96B6B, 0x0E3D963B63CAB0AE, 0x8DFC4B5655A1DB14, + 0xF789F1356E14DE5C, 0x683E68AF4E51DAC1, 0xC9A84F9D8D4B0FD9, + 0x3691E03F52A0F9D1, 0x5ED86E46E1878E80, 0x3C711A0E99D07150, + 0x5A0865B20C4E9310, 0x56FBFC1FE4F0682E, 0xEA8D5DE3105EDF9B, + 0x71ABFDB12379187A, 0x2EB99DE1BEE77B9C, 0x21ECC0EA33CF4523, + 0x59A4D7521805C7A1, 0x3896F5EB56AE7C72, 0xAA638F3DB18F75DC, + 0x9F39358DABE9808E, 0xB7DEFA91C00B72AC, 0x6B5541FD62492D92, + 0x6DC6DEE8F92E4D5B, 0x353F57ABC4BEEA7E, 0x735769D6DA5690CE, + 0x0A234AA642391484, 0xF6F9508028F80D9D, 0xB8E319A27AB3F215, + 0x31AD9C1151341A4D, 0x773C22A57BEF5805, 0x45C7561A07968633, + 0xF913DA9E249DBE36, 0xDA652D9B78A64C68, 0x4C27A97F3BC334EF, + 0x76621220E66B17F4, 0x967743899ACD7D0B, 0xF3EE5BCAE0ED6782, + 0x409F753600C879FC, 0x06D09A39B5926DB6, 0x6F83AEB0317AC588, + 0x01E6CA4A86381F21, 0x66FF3462D19F3025, 0x72207C24DDFD3BFB, + 0x4AF6B6D3E2ECE2EB, 0x9C994DBEC7EA08DE, 0x49ACE597B09A8BC4, + 0xB38C4766CF0797BA, 0x131B9373C57C2A75, 0xB1822CCE61931E58, + 0x9D7555B909BA1C0C, 0x127FAFDD937D11D2, 0x29DA3BADC66D92E4, + 0xA2C1D57154C2ECBC, 0x58C5134D82F6FE24, 0x1C3AE3515B62274F, + 0xE907C82E01CB8126, 0xF8ED091913E37FCB, 0x3249D8F9C80046C9, + 0x80CF9BEDE388FB63, 0x1881539A116CF19E, 0x5103F3F76BD52457, + 0x15B7E6F5AE47F7A8, 0xDBD7C6DED47E9CCF, 0x44E55C410228BB1A, + 0xB647D4255EDB4E99, 0x5D11882BB8AAFC30, 0xF5098BBB29D3212A, + 0x8FB5EA14E90296B3, 0x677B942157DD025A, 0xFB58E7C0A390ACB5, + 0x89D3674C83BD4A01, 0x9E2DA4DF4BF3B93B, 0xFCC41E328CAB4829, + 0x03F38C96BA582C52, 0xCAD1BDBD7FD85DB2, 0xBBB442C16082AE83, + 0xB95FE86BA5DA9AB0, 0xB22E04673771A93F, 0x845358C9493152D8, + 0xBE2A488697B4541E, 0x95A2DC2DD38E6966, 0xC02C11AC923C852B, + 0x2388B1990DF2A87B, 0x7C8008FA1B4F37BE, 0x1F70D0C84D54E503, + 0x5490ADEC7ECE57D4, 0x002B3C27D9063A3A, 0x7EAEA3848030A2BF, + 0xC602326DED2003C0, 0x83A7287D69A94086, 0xC57A5FCB30F57A8A, + 0xB56844E479EBE779, 0xA373B40F05DCBCE9, 0xD71A786E88570EE2, + 0x879CBACDBDE8F6A0, 0x976AD1BCC164A32F, 0xAB21E25E9666D78B, + 0x901063AAE5E5C33C, 0x9818B34448698D90, 0xE36487AE3E1E8ABB, + 0xAFBDF931893BDCB4, 0x6345A0DC5FBBD519, 0x8628FE269B9465CA, + 0x1E5D01603F9C51EC, 0x4DE44006A15049B7, 0xBF6C70E5F776CBB1, + 0x411218F2EF552BED, 0xCB0C0708705A36A3, 0xE74D14754F986044, + 0xCD56D9430EA8280E, 0xC12591D7535F5065, 0xC83223F1720AEF96, + 0xC3A0396F7363A51F }; + +} diff --git a/src/libs/3rdparty/botan/src/hash/tiger/tiger.cpp b/src/libs/3rdparty/botan/src/hash/tiger/tiger.cpp new file mode 100644 index 00000000000..e46f2cb77b2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/tiger/tiger.cpp @@ -0,0 +1,164 @@ +/* +* Tiger +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Tiger Compression Function +*/ +void Tiger::compress_n(const byte input[], u32bit blocks) + { + u64bit A = digest[0], B = digest[1], C = digest[2]; + + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0; j != 8; ++j) + X[j] = load_le(input, j); + input += HASH_BLOCK_SIZE; + + pass(A, B, C, X, 5); mix(X); + pass(C, A, B, X, 7); mix(X); + pass(B, C, A, X, 9); + + for(u32bit j = 3; j != PASS; ++j) + { + mix(X); + pass(A, B, C, X, 9); + u64bit T = A; A = C; C = B; B = T; + } + + A = (digest[0] ^= A); + B = digest[1] = B - digest[1]; + C = (digest[2] += C); + } + } + +/* +* Copy out the digest +*/ +void Tiger::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; ++j) + output[j] = get_byte(7 - (j % 8), digest[j/8]); + } + +/* +* Tiger Pass +*/ +void Tiger::pass(u64bit& A, u64bit& B, u64bit& C, u64bit X[8], byte mul) + { + C ^= X[0]; + A -= SBOX1[get_byte(7, C)] ^ SBOX2[get_byte(5, C)] ^ + SBOX3[get_byte(3, C)] ^ SBOX4[get_byte(1, C)]; + B += SBOX1[get_byte(0, C)] ^ SBOX2[get_byte(2, C)] ^ + SBOX3[get_byte(4, C)] ^ SBOX4[get_byte(6, C)]; + B *= mul; + + A ^= X[1]; + B -= SBOX1[get_byte(7, A)] ^ SBOX2[get_byte(5, A)] ^ + SBOX3[get_byte(3, A)] ^ SBOX4[get_byte(1, A)]; + C += SBOX1[get_byte(0, A)] ^ SBOX2[get_byte(2, A)] ^ + SBOX3[get_byte(4, A)] ^ SBOX4[get_byte(6, A)]; + C *= mul; + + B ^= X[2]; + C -= SBOX1[get_byte(7, B)] ^ SBOX2[get_byte(5, B)] ^ + SBOX3[get_byte(3, B)] ^ SBOX4[get_byte(1, B)]; + A += SBOX1[get_byte(0, B)] ^ SBOX2[get_byte(2, B)] ^ + SBOX3[get_byte(4, B)] ^ SBOX4[get_byte(6, B)]; + A *= mul; + + C ^= X[3]; + A -= SBOX1[get_byte(7, C)] ^ SBOX2[get_byte(5, C)] ^ + SBOX3[get_byte(3, C)] ^ SBOX4[get_byte(1, C)]; + B += SBOX1[get_byte(0, C)] ^ SBOX2[get_byte(2, C)] ^ + SBOX3[get_byte(4, C)] ^ SBOX4[get_byte(6, C)]; + B *= mul; + + A ^= X[4]; + B -= SBOX1[get_byte(7, A)] ^ SBOX2[get_byte(5, A)] ^ + SBOX3[get_byte(3, A)] ^ SBOX4[get_byte(1, A)]; + C += SBOX1[get_byte(0, A)] ^ SBOX2[get_byte(2, A)] ^ + SBOX3[get_byte(4, A)] ^ SBOX4[get_byte(6, A)]; + C *= mul; + + B ^= X[5]; + C -= SBOX1[get_byte(7, B)] ^ SBOX2[get_byte(5, B)] ^ + SBOX3[get_byte(3, B)] ^ SBOX4[get_byte(1, B)]; + A += SBOX1[get_byte(0, B)] ^ SBOX2[get_byte(2, B)] ^ + SBOX3[get_byte(4, B)] ^ SBOX4[get_byte(6, B)]; + A *= mul; + + C ^= X[6]; + A -= SBOX1[get_byte(7, C)] ^ SBOX2[get_byte(5, C)] ^ + SBOX3[get_byte(3, C)] ^ SBOX4[get_byte(1, C)]; + B += SBOX1[get_byte(0, C)] ^ SBOX2[get_byte(2, C)] ^ + SBOX3[get_byte(4, C)] ^ SBOX4[get_byte(6, C)]; + B *= mul; + + A ^= X[7]; + B -= SBOX1[get_byte(7, A)] ^ SBOX2[get_byte(5, A)] ^ + SBOX3[get_byte(3, A)] ^ SBOX4[get_byte(1, A)]; + C += SBOX1[get_byte(0, A)] ^ SBOX2[get_byte(2, A)] ^ + SBOX3[get_byte(4, A)] ^ SBOX4[get_byte(6, A)]; + C *= mul; + } + +/* +* Tiger Mixing Function +*/ +void Tiger::mix(u64bit X[8]) + { + X[0] -= X[7] ^ 0xA5A5A5A5A5A5A5A5; X[1] ^= X[0]; + X[2] += X[1]; X[3] -= X[2] ^ ((~X[1]) << 19); X[4] ^= X[3]; + X[5] += X[4]; X[6] -= X[5] ^ ((~X[4]) >> 23); X[7] ^= X[6]; + X[0] += X[7]; X[1] -= X[0] ^ ((~X[7]) << 19); X[2] ^= X[1]; + X[3] += X[2]; X[4] -= X[3] ^ ((~X[2]) >> 23); X[5] ^= X[4]; + X[6] += X[5]; X[7] -= X[6] ^ 0x0123456789ABCDEF; + } + +/* +* Clear memory of sensitive data +*/ +void Tiger::clear() throw() + { + MDx_HashFunction::clear(); + X.clear(); + digest[0] = 0x0123456789ABCDEF; + digest[1] = 0xFEDCBA9876543210; + digest[2] = 0xF096A5B4C3B2E187; + } + +/* +* Return the name of this type +*/ +std::string Tiger::name() const + { + return "Tiger(" + to_string(OUTPUT_LENGTH) + "," + to_string(PASS) + ")"; + } + +/* +* Tiger Constructor +*/ +Tiger::Tiger(u32bit hashlen, u32bit pass) : + MDx_HashFunction(hashlen, 64, false, false), PASS(pass) + { + if(OUTPUT_LENGTH != 16 && OUTPUT_LENGTH != 20 && OUTPUT_LENGTH != 24) + throw Invalid_Argument("Tiger: Illegal hash output size: " + + to_string(OUTPUT_LENGTH)); + if(PASS < 3) + throw Invalid_Argument("Tiger: Invalid number of passes: " + + to_string(PASS)); + clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/tiger/tiger.h b/src/libs/3rdparty/botan/src/hash/tiger/tiger.h new file mode 100644 index 00000000000..63184a9387d --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/tiger/tiger.h @@ -0,0 +1,44 @@ +/* +* Tiger +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_TIGER_H__ +#define BOTAN_TIGER_H__ + +#include + +namespace Botan { + +/* +* Tiger +*/ +class BOTAN_DLL Tiger : public MDx_HashFunction + { + public: + void clear() throw(); + std::string name() const; + HashFunction* clone() const { return new Tiger(OUTPUT_LENGTH); } + Tiger(u32bit = 24, u32bit = 3); + private: + void compress_n(const byte[], u32bit block); + void copy_out(byte[]); + + static void pass(u64bit&, u64bit&, u64bit&, u64bit[8], byte); + static void mix(u64bit[8]); + + static const u64bit SBOX1[256]; + static const u64bit SBOX2[256]; + static const u64bit SBOX3[256]; + static const u64bit SBOX4[256]; + + SecureBuffer X; + SecureBuffer digest; + const u32bit PASS; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/hash/whirlpool/info.txt b/src/libs/3rdparty/botan/src/hash/whirlpool/info.txt new file mode 100644 index 00000000000..be55b5c3bb0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/whirlpool/info.txt @@ -0,0 +1,15 @@ +realname "Whirlpool" + +define WHIRLPOOL + +load_on auto + + +whrl_tab.cpp +whrlpool.cpp +whrlpool.h + + + +mdx_hash + diff --git a/src/libs/3rdparty/botan/src/hash/whirlpool/whrl_tab.cpp b/src/libs/3rdparty/botan/src/hash/whirlpool/whrl_tab.cpp new file mode 100644 index 00000000000..cf670f3080b --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/whirlpool/whrl_tab.cpp @@ -0,0 +1,540 @@ +/* +* Diffusion Tables for Whirlpool +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +const u64bit Whirlpool::C0[256] = { +0x18186018C07830D8, 0x23238C2305AF4626, 0xC6C63FC67EF991B8, 0xE8E887E8136FCDFB, +0x878726874CA113CB, 0xB8B8DAB8A9626D11, 0x0101040108050209, 0x4F4F214F426E9E0D, +0x3636D836ADEE6C9B, 0xA6A6A2A6590451FF, 0xD2D26FD2DEBDB90C, 0xF5F5F3F5FB06F70E, +0x7979F979EF80F296, 0x6F6FA16F5FCEDE30, 0x91917E91FCEF3F6D, 0x52525552AA07A4F8, +0x60609D6027FDC047, 0xBCBCCABC89766535, 0x9B9B569BACCD2B37, 0x8E8E028E048C018A, +0xA3A3B6A371155BD2, 0x0C0C300C603C186C, 0x7B7BF17BFF8AF684, 0x3535D435B5E16A80, +0x1D1D741DE8693AF5, 0xE0E0A7E05347DDB3, 0xD7D77BD7F6ACB321, 0xC2C22FC25EED999C, +0x2E2EB82E6D965C43, 0x4B4B314B627A9629, 0xFEFEDFFEA321E15D, 0x575741578216AED5, +0x15155415A8412ABD, 0x7777C1779FB6EEE8, 0x3737DC37A5EB6E92, 0xE5E5B3E57B56D79E, +0x9F9F469F8CD92313, 0xF0F0E7F0D317FD23, 0x4A4A354A6A7F9420, 0xDADA4FDA9E95A944, +0x58587D58FA25B0A2, 0xC9C903C906CA8FCF, 0x2929A429558D527C, 0x0A0A280A5022145A, +0xB1B1FEB1E14F7F50, 0xA0A0BAA0691A5DC9, 0x6B6BB16B7FDAD614, 0x85852E855CAB17D9, +0xBDBDCEBD8173673C, 0x5D5D695DD234BA8F, 0x1010401080502090, 0xF4F4F7F4F303F507, +0xCBCB0BCB16C08BDD, 0x3E3EF83EEDC67CD3, 0x0505140528110A2D, 0x676781671FE6CE78, +0xE4E4B7E47353D597, 0x27279C2725BB4E02, 0x4141194132588273, 0x8B8B168B2C9D0BA7, +0xA7A7A6A7510153F6, 0x7D7DE97DCF94FAB2, 0x95956E95DCFB3749, 0xD8D847D88E9FAD56, +0xFBFBCBFB8B30EB70, 0xEEEE9FEE2371C1CD, 0x7C7CED7CC791F8BB, 0x6666856617E3CC71, +0xDDDD53DDA68EA77B, 0x17175C17B84B2EAF, 0x4747014702468E45, 0x9E9E429E84DC211A, +0xCACA0FCA1EC589D4, 0x2D2DB42D75995A58, 0xBFBFC6BF9179632E, 0x07071C07381B0E3F, +0xADAD8EAD012347AC, 0x5A5A755AEA2FB4B0, 0x838336836CB51BEF, 0x3333CC3385FF66B6, +0x636391633FF2C65C, 0x02020802100A0412, 0xAAAA92AA39384993, 0x7171D971AFA8E2DE, +0xC8C807C80ECF8DC6, 0x19196419C87D32D1, 0x494939497270923B, 0xD9D943D9869AAF5F, +0xF2F2EFF2C31DF931, 0xE3E3ABE34B48DBA8, 0x5B5B715BE22AB6B9, 0x88881A8834920DBC, +0x9A9A529AA4C8293E, 0x262698262DBE4C0B, 0x3232C8328DFA64BF, 0xB0B0FAB0E94A7D59, +0xE9E983E91B6ACFF2, 0x0F0F3C0F78331E77, 0xD5D573D5E6A6B733, 0x80803A8074BA1DF4, +0xBEBEC2BE997C6127, 0xCDCD13CD26DE87EB, 0x3434D034BDE46889, 0x48483D487A759032, +0xFFFFDBFFAB24E354, 0x7A7AF57AF78FF48D, 0x90907A90F4EA3D64, 0x5F5F615FC23EBE9D, +0x202080201DA0403D, 0x6868BD6867D5D00F, 0x1A1A681AD07234CA, 0xAEAE82AE192C41B7, +0xB4B4EAB4C95E757D, 0x54544D549A19A8CE, 0x93937693ECE53B7F, 0x222288220DAA442F, +0x64648D6407E9C863, 0xF1F1E3F1DB12FF2A, 0x7373D173BFA2E6CC, 0x12124812905A2482, +0x40401D403A5D807A, 0x0808200840281048, 0xC3C32BC356E89B95, 0xECEC97EC337BC5DF, +0xDBDB4BDB9690AB4D, 0xA1A1BEA1611F5FC0, 0x8D8D0E8D1C830791, 0x3D3DF43DF5C97AC8, +0x97976697CCF1335B, 0x0000000000000000, 0xCFCF1BCF36D483F9, 0x2B2BAC2B4587566E, +0x7676C57697B3ECE1, 0x8282328264B019E6, 0xD6D67FD6FEA9B128, 0x1B1B6C1BD87736C3, +0xB5B5EEB5C15B7774, 0xAFAF86AF112943BE, 0x6A6AB56A77DFD41D, 0x50505D50BA0DA0EA, +0x45450945124C8A57, 0xF3F3EBF3CB18FB38, 0x3030C0309DF060AD, 0xEFEF9BEF2B74C3C4, +0x3F3FFC3FE5C37EDA, 0x55554955921CAAC7, 0xA2A2B2A2791059DB, 0xEAEA8FEA0365C9E9, +0x656589650FECCA6A, 0xBABAD2BAB9686903, 0x2F2FBC2F65935E4A, 0xC0C027C04EE79D8E, +0xDEDE5FDEBE81A160, 0x1C1C701CE06C38FC, 0xFDFDD3FDBB2EE746, 0x4D4D294D52649A1F, +0x92927292E4E03976, 0x7575C9758FBCEAFA, 0x06061806301E0C36, 0x8A8A128A249809AE, +0xB2B2F2B2F940794B, 0xE6E6BFE66359D185, 0x0E0E380E70361C7E, 0x1F1F7C1FF8633EE7, +0x6262956237F7C455, 0xD4D477D4EEA3B53A, 0xA8A89AA829324D81, 0x96966296C4F43152, +0xF9F9C3F99B3AEF62, 0xC5C533C566F697A3, 0x2525942535B14A10, 0x59597959F220B2AB, +0x84842A8454AE15D0, 0x7272D572B7A7E4C5, 0x3939E439D5DD72EC, 0x4C4C2D4C5A619816, +0x5E5E655ECA3BBC94, 0x7878FD78E785F09F, 0x3838E038DDD870E5, 0x8C8C0A8C14860598, +0xD1D163D1C6B2BF17, 0xA5A5AEA5410B57E4, 0xE2E2AFE2434DD9A1, 0x616199612FF8C24E, +0xB3B3F6B3F1457B42, 0x2121842115A54234, 0x9C9C4A9C94D62508, 0x1E1E781EF0663CEE, +0x4343114322528661, 0xC7C73BC776FC93B1, 0xFCFCD7FCB32BE54F, 0x0404100420140824, +0x51515951B208A2E3, 0x99995E99BCC72F25, 0x6D6DA96D4FC4DA22, 0x0D0D340D68391A65, +0xFAFACFFA8335E979, 0xDFDF5BDFB684A369, 0x7E7EE57ED79BFCA9, 0x242490243DB44819, +0x3B3BEC3BC5D776FE, 0xABAB96AB313D4B9A, 0xCECE1FCE3ED181F0, 0x1111441188552299, +0x8F8F068F0C890383, 0x4E4E254E4A6B9C04, 0xB7B7E6B7D1517366, 0xEBEB8BEB0B60CBE0, +0x3C3CF03CFDCC78C1, 0x81813E817CBF1FFD, 0x94946A94D4FE3540, 0xF7F7FBF7EB0CF31C, +0xB9B9DEB9A1676F18, 0x13134C13985F268B, 0x2C2CB02C7D9C5851, 0xD3D36BD3D6B8BB05, +0xE7E7BBE76B5CD38C, 0x6E6EA56E57CBDC39, 0xC4C437C46EF395AA, 0x03030C03180F061B, +0x565645568A13ACDC, 0x44440D441A49885E, 0x7F7FE17FDF9EFEA0, 0xA9A99EA921374F88, +0x2A2AA82A4D825467, 0xBBBBD6BBB16D6B0A, 0xC1C123C146E29F87, 0x53535153A202A6F1, +0xDCDC57DCAE8BA572, 0x0B0B2C0B58271653, 0x9D9D4E9D9CD32701, 0x6C6CAD6C47C1D82B, +0x3131C43195F562A4, 0x7474CD7487B9E8F3, 0xF6F6FFF6E309F115, 0x464605460A438C4C, +0xACAC8AAC092645A5, 0x89891E893C970FB5, 0x14145014A04428B4, 0xE1E1A3E15B42DFBA, +0x16165816B04E2CA6, 0x3A3AE83ACDD274F7, 0x6969B9696FD0D206, 0x09092409482D1241, +0x7070DD70A7ADE0D7, 0xB6B6E2B6D954716F, 0xD0D067D0CEB7BD1E, 0xEDED93ED3B7EC7D6, +0xCCCC17CC2EDB85E2, 0x424215422A578468, 0x98985A98B4C22D2C, 0xA4A4AAA4490E55ED, +0x2828A0285D885075, 0x5C5C6D5CDA31B886, 0xF8F8C7F8933FED6B, 0x8686228644A411C2 }; + +const u64bit Whirlpool::C1[256] = { +0xD818186018C07830, 0x2623238C2305AF46, 0xB8C6C63FC67EF991, 0xFBE8E887E8136FCD, +0xCB878726874CA113, 0x11B8B8DAB8A9626D, 0x0901010401080502, 0x0D4F4F214F426E9E, +0x9B3636D836ADEE6C, 0xFFA6A6A2A6590451, 0x0CD2D26FD2DEBDB9, 0x0EF5F5F3F5FB06F7, +0x967979F979EF80F2, 0x306F6FA16F5FCEDE, 0x6D91917E91FCEF3F, 0xF852525552AA07A4, +0x4760609D6027FDC0, 0x35BCBCCABC897665, 0x379B9B569BACCD2B, 0x8A8E8E028E048C01, +0xD2A3A3B6A371155B, 0x6C0C0C300C603C18, 0x847B7BF17BFF8AF6, 0x803535D435B5E16A, +0xF51D1D741DE8693A, 0xB3E0E0A7E05347DD, 0x21D7D77BD7F6ACB3, 0x9CC2C22FC25EED99, +0x432E2EB82E6D965C, 0x294B4B314B627A96, 0x5DFEFEDFFEA321E1, 0xD5575741578216AE, +0xBD15155415A8412A, 0xE87777C1779FB6EE, 0x923737DC37A5EB6E, 0x9EE5E5B3E57B56D7, +0x139F9F469F8CD923, 0x23F0F0E7F0D317FD, 0x204A4A354A6A7F94, 0x44DADA4FDA9E95A9, +0xA258587D58FA25B0, 0xCFC9C903C906CA8F, 0x7C2929A429558D52, 0x5A0A0A280A502214, +0x50B1B1FEB1E14F7F, 0xC9A0A0BAA0691A5D, 0x146B6BB16B7FDAD6, 0xD985852E855CAB17, +0x3CBDBDCEBD817367, 0x8F5D5D695DD234BA, 0x9010104010805020, 0x07F4F4F7F4F303F5, +0xDDCBCB0BCB16C08B, 0xD33E3EF83EEDC67C, 0x2D0505140528110A, 0x78676781671FE6CE, +0x97E4E4B7E47353D5, 0x0227279C2725BB4E, 0x7341411941325882, 0xA78B8B168B2C9D0B, +0xF6A7A7A6A7510153, 0xB27D7DE97DCF94FA, 0x4995956E95DCFB37, 0x56D8D847D88E9FAD, +0x70FBFBCBFB8B30EB, 0xCDEEEE9FEE2371C1, 0xBB7C7CED7CC791F8, 0x716666856617E3CC, +0x7BDDDD53DDA68EA7, 0xAF17175C17B84B2E, 0x454747014702468E, 0x1A9E9E429E84DC21, +0xD4CACA0FCA1EC589, 0x582D2DB42D75995A, 0x2EBFBFC6BF917963, 0x3F07071C07381B0E, +0xACADAD8EAD012347, 0xB05A5A755AEA2FB4, 0xEF838336836CB51B, 0xB63333CC3385FF66, +0x5C636391633FF2C6, 0x1202020802100A04, 0x93AAAA92AA393849, 0xDE7171D971AFA8E2, +0xC6C8C807C80ECF8D, 0xD119196419C87D32, 0x3B49493949727092, 0x5FD9D943D9869AAF, +0x31F2F2EFF2C31DF9, 0xA8E3E3ABE34B48DB, 0xB95B5B715BE22AB6, 0xBC88881A8834920D, +0x3E9A9A529AA4C829, 0x0B262698262DBE4C, 0xBF3232C8328DFA64, 0x59B0B0FAB0E94A7D, +0xF2E9E983E91B6ACF, 0x770F0F3C0F78331E, 0x33D5D573D5E6A6B7, 0xF480803A8074BA1D, +0x27BEBEC2BE997C61, 0xEBCDCD13CD26DE87, 0x893434D034BDE468, 0x3248483D487A7590, +0x54FFFFDBFFAB24E3, 0x8D7A7AF57AF78FF4, 0x6490907A90F4EA3D, 0x9D5F5F615FC23EBE, +0x3D202080201DA040, 0x0F6868BD6867D5D0, 0xCA1A1A681AD07234, 0xB7AEAE82AE192C41, +0x7DB4B4EAB4C95E75, 0xCE54544D549A19A8, 0x7F93937693ECE53B, 0x2F222288220DAA44, +0x6364648D6407E9C8, 0x2AF1F1E3F1DB12FF, 0xCC7373D173BFA2E6, 0x8212124812905A24, +0x7A40401D403A5D80, 0x4808082008402810, 0x95C3C32BC356E89B, 0xDFECEC97EC337BC5, +0x4DDBDB4BDB9690AB, 0xC0A1A1BEA1611F5F, 0x918D8D0E8D1C8307, 0xC83D3DF43DF5C97A, +0x5B97976697CCF133, 0x0000000000000000, 0xF9CFCF1BCF36D483, 0x6E2B2BAC2B458756, +0xE17676C57697B3EC, 0xE68282328264B019, 0x28D6D67FD6FEA9B1, 0xC31B1B6C1BD87736, +0x74B5B5EEB5C15B77, 0xBEAFAF86AF112943, 0x1D6A6AB56A77DFD4, 0xEA50505D50BA0DA0, +0x5745450945124C8A, 0x38F3F3EBF3CB18FB, 0xAD3030C0309DF060, 0xC4EFEF9BEF2B74C3, +0xDA3F3FFC3FE5C37E, 0xC755554955921CAA, 0xDBA2A2B2A2791059, 0xE9EAEA8FEA0365C9, +0x6A656589650FECCA, 0x03BABAD2BAB96869, 0x4A2F2FBC2F65935E, 0x8EC0C027C04EE79D, +0x60DEDE5FDEBE81A1, 0xFC1C1C701CE06C38, 0x46FDFDD3FDBB2EE7, 0x1F4D4D294D52649A, +0x7692927292E4E039, 0xFA7575C9758FBCEA, 0x3606061806301E0C, 0xAE8A8A128A249809, +0x4BB2B2F2B2F94079, 0x85E6E6BFE66359D1, 0x7E0E0E380E70361C, 0xE71F1F7C1FF8633E, +0x556262956237F7C4, 0x3AD4D477D4EEA3B5, 0x81A8A89AA829324D, 0x5296966296C4F431, +0x62F9F9C3F99B3AEF, 0xA3C5C533C566F697, 0x102525942535B14A, 0xAB59597959F220B2, +0xD084842A8454AE15, 0xC57272D572B7A7E4, 0xEC3939E439D5DD72, 0x164C4C2D4C5A6198, +0x945E5E655ECA3BBC, 0x9F7878FD78E785F0, 0xE53838E038DDD870, 0x988C8C0A8C148605, +0x17D1D163D1C6B2BF, 0xE4A5A5AEA5410B57, 0xA1E2E2AFE2434DD9, 0x4E616199612FF8C2, +0x42B3B3F6B3F1457B, 0x342121842115A542, 0x089C9C4A9C94D625, 0xEE1E1E781EF0663C, +0x6143431143225286, 0xB1C7C73BC776FC93, 0x4FFCFCD7FCB32BE5, 0x2404041004201408, +0xE351515951B208A2, 0x2599995E99BCC72F, 0x226D6DA96D4FC4DA, 0x650D0D340D68391A, +0x79FAFACFFA8335E9, 0x69DFDF5BDFB684A3, 0xA97E7EE57ED79BFC, 0x19242490243DB448, +0xFE3B3BEC3BC5D776, 0x9AABAB96AB313D4B, 0xF0CECE1FCE3ED181, 0x9911114411885522, +0x838F8F068F0C8903, 0x044E4E254E4A6B9C, 0x66B7B7E6B7D15173, 0xE0EBEB8BEB0B60CB, +0xC13C3CF03CFDCC78, 0xFD81813E817CBF1F, 0x4094946A94D4FE35, 0x1CF7F7FBF7EB0CF3, +0x18B9B9DEB9A1676F, 0x8B13134C13985F26, 0x512C2CB02C7D9C58, 0x05D3D36BD3D6B8BB, +0x8CE7E7BBE76B5CD3, 0x396E6EA56E57CBDC, 0xAAC4C437C46EF395, 0x1B03030C03180F06, +0xDC565645568A13AC, 0x5E44440D441A4988, 0xA07F7FE17FDF9EFE, 0x88A9A99EA921374F, +0x672A2AA82A4D8254, 0x0ABBBBD6BBB16D6B, 0x87C1C123C146E29F, 0xF153535153A202A6, +0x72DCDC57DCAE8BA5, 0x530B0B2C0B582716, 0x019D9D4E9D9CD327, 0x2B6C6CAD6C47C1D8, +0xA43131C43195F562, 0xF37474CD7487B9E8, 0x15F6F6FFF6E309F1, 0x4C464605460A438C, +0xA5ACAC8AAC092645, 0xB589891E893C970F, 0xB414145014A04428, 0xBAE1E1A3E15B42DF, +0xA616165816B04E2C, 0xF73A3AE83ACDD274, 0x066969B9696FD0D2, 0x4109092409482D12, +0xD77070DD70A7ADE0, 0x6FB6B6E2B6D95471, 0x1ED0D067D0CEB7BD, 0xD6EDED93ED3B7EC7, +0xE2CCCC17CC2EDB85, 0x68424215422A5784, 0x2C98985A98B4C22D, 0xEDA4A4AAA4490E55, +0x752828A0285D8850, 0x865C5C6D5CDA31B8, 0x6BF8F8C7F8933FED, 0xC28686228644A411 }; + +const u64bit Whirlpool::C2[256] = { +0x30D818186018C078, 0x462623238C2305AF, 0x91B8C6C63FC67EF9, 0xCDFBE8E887E8136F, +0x13CB878726874CA1, 0x6D11B8B8DAB8A962, 0x0209010104010805, 0x9E0D4F4F214F426E, +0x6C9B3636D836ADEE, 0x51FFA6A6A2A65904, 0xB90CD2D26FD2DEBD, 0xF70EF5F5F3F5FB06, +0xF2967979F979EF80, 0xDE306F6FA16F5FCE, 0x3F6D91917E91FCEF, 0xA4F852525552AA07, +0xC04760609D6027FD, 0x6535BCBCCABC8976, 0x2B379B9B569BACCD, 0x018A8E8E028E048C, +0x5BD2A3A3B6A37115, 0x186C0C0C300C603C, 0xF6847B7BF17BFF8A, 0x6A803535D435B5E1, +0x3AF51D1D741DE869, 0xDDB3E0E0A7E05347, 0xB321D7D77BD7F6AC, 0x999CC2C22FC25EED, +0x5C432E2EB82E6D96, 0x96294B4B314B627A, 0xE15DFEFEDFFEA321, 0xAED5575741578216, +0x2ABD15155415A841, 0xEEE87777C1779FB6, 0x6E923737DC37A5EB, 0xD79EE5E5B3E57B56, +0x23139F9F469F8CD9, 0xFD23F0F0E7F0D317, 0x94204A4A354A6A7F, 0xA944DADA4FDA9E95, +0xB0A258587D58FA25, 0x8FCFC9C903C906CA, 0x527C2929A429558D, 0x145A0A0A280A5022, +0x7F50B1B1FEB1E14F, 0x5DC9A0A0BAA0691A, 0xD6146B6BB16B7FDA, 0x17D985852E855CAB, +0x673CBDBDCEBD8173, 0xBA8F5D5D695DD234, 0x2090101040108050, 0xF507F4F4F7F4F303, +0x8BDDCBCB0BCB16C0, 0x7CD33E3EF83EEDC6, 0x0A2D050514052811, 0xCE78676781671FE6, +0xD597E4E4B7E47353, 0x4E0227279C2725BB, 0x8273414119413258, 0x0BA78B8B168B2C9D, +0x53F6A7A7A6A75101, 0xFAB27D7DE97DCF94, 0x374995956E95DCFB, 0xAD56D8D847D88E9F, +0xEB70FBFBCBFB8B30, 0xC1CDEEEE9FEE2371, 0xF8BB7C7CED7CC791, 0xCC716666856617E3, +0xA77BDDDD53DDA68E, 0x2EAF17175C17B84B, 0x8E45474701470246, 0x211A9E9E429E84DC, +0x89D4CACA0FCA1EC5, 0x5A582D2DB42D7599, 0x632EBFBFC6BF9179, 0x0E3F07071C07381B, +0x47ACADAD8EAD0123, 0xB4B05A5A755AEA2F, 0x1BEF838336836CB5, 0x66B63333CC3385FF, +0xC65C636391633FF2, 0x041202020802100A, 0x4993AAAA92AA3938, 0xE2DE7171D971AFA8, +0x8DC6C8C807C80ECF, 0x32D119196419C87D, 0x923B494939497270, 0xAF5FD9D943D9869A, +0xF931F2F2EFF2C31D, 0xDBA8E3E3ABE34B48, 0xB6B95B5B715BE22A, 0x0DBC88881A883492, +0x293E9A9A529AA4C8, 0x4C0B262698262DBE, 0x64BF3232C8328DFA, 0x7D59B0B0FAB0E94A, +0xCFF2E9E983E91B6A, 0x1E770F0F3C0F7833, 0xB733D5D573D5E6A6, 0x1DF480803A8074BA, +0x6127BEBEC2BE997C, 0x87EBCDCD13CD26DE, 0x68893434D034BDE4, 0x903248483D487A75, +0xE354FFFFDBFFAB24, 0xF48D7A7AF57AF78F, 0x3D6490907A90F4EA, 0xBE9D5F5F615FC23E, +0x403D202080201DA0, 0xD00F6868BD6867D5, 0x34CA1A1A681AD072, 0x41B7AEAE82AE192C, +0x757DB4B4EAB4C95E, 0xA8CE54544D549A19, 0x3B7F93937693ECE5, 0x442F222288220DAA, +0xC86364648D6407E9, 0xFF2AF1F1E3F1DB12, 0xE6CC7373D173BFA2, 0x248212124812905A, +0x807A40401D403A5D, 0x1048080820084028, 0x9B95C3C32BC356E8, 0xC5DFECEC97EC337B, +0xAB4DDBDB4BDB9690, 0x5FC0A1A1BEA1611F, 0x07918D8D0E8D1C83, 0x7AC83D3DF43DF5C9, +0x335B97976697CCF1, 0x0000000000000000, 0x83F9CFCF1BCF36D4, 0x566E2B2BAC2B4587, +0xECE17676C57697B3, 0x19E68282328264B0, 0xB128D6D67FD6FEA9, 0x36C31B1B6C1BD877, +0x7774B5B5EEB5C15B, 0x43BEAFAF86AF1129, 0xD41D6A6AB56A77DF, 0xA0EA50505D50BA0D, +0x8A5745450945124C, 0xFB38F3F3EBF3CB18, 0x60AD3030C0309DF0, 0xC3C4EFEF9BEF2B74, +0x7EDA3F3FFC3FE5C3, 0xAAC755554955921C, 0x59DBA2A2B2A27910, 0xC9E9EAEA8FEA0365, +0xCA6A656589650FEC, 0x6903BABAD2BAB968, 0x5E4A2F2FBC2F6593, 0x9D8EC0C027C04EE7, +0xA160DEDE5FDEBE81, 0x38FC1C1C701CE06C, 0xE746FDFDD3FDBB2E, 0x9A1F4D4D294D5264, +0x397692927292E4E0, 0xEAFA7575C9758FBC, 0x0C3606061806301E, 0x09AE8A8A128A2498, +0x794BB2B2F2B2F940, 0xD185E6E6BFE66359, 0x1C7E0E0E380E7036, 0x3EE71F1F7C1FF863, +0xC4556262956237F7, 0xB53AD4D477D4EEA3, 0x4D81A8A89AA82932, 0x315296966296C4F4, +0xEF62F9F9C3F99B3A, 0x97A3C5C533C566F6, 0x4A102525942535B1, 0xB2AB59597959F220, +0x15D084842A8454AE, 0xE4C57272D572B7A7, 0x72EC3939E439D5DD, 0x98164C4C2D4C5A61, +0xBC945E5E655ECA3B, 0xF09F7878FD78E785, 0x70E53838E038DDD8, 0x05988C8C0A8C1486, +0xBF17D1D163D1C6B2, 0x57E4A5A5AEA5410B, 0xD9A1E2E2AFE2434D, 0xC24E616199612FF8, +0x7B42B3B3F6B3F145, 0x42342121842115A5, 0x25089C9C4A9C94D6, 0x3CEE1E1E781EF066, +0x8661434311432252, 0x93B1C7C73BC776FC, 0xE54FFCFCD7FCB32B, 0x0824040410042014, +0xA2E351515951B208, 0x2F2599995E99BCC7, 0xDA226D6DA96D4FC4, 0x1A650D0D340D6839, +0xE979FAFACFFA8335, 0xA369DFDF5BDFB684, 0xFCA97E7EE57ED79B, 0x4819242490243DB4, +0x76FE3B3BEC3BC5D7, 0x4B9AABAB96AB313D, 0x81F0CECE1FCE3ED1, 0x2299111144118855, +0x03838F8F068F0C89, 0x9C044E4E254E4A6B, 0x7366B7B7E6B7D151, 0xCBE0EBEB8BEB0B60, +0x78C13C3CF03CFDCC, 0x1FFD81813E817CBF, 0x354094946A94D4FE, 0xF31CF7F7FBF7EB0C, +0x6F18B9B9DEB9A167, 0x268B13134C13985F, 0x58512C2CB02C7D9C, 0xBB05D3D36BD3D6B8, +0xD38CE7E7BBE76B5C, 0xDC396E6EA56E57CB, 0x95AAC4C437C46EF3, 0x061B03030C03180F, +0xACDC565645568A13, 0x885E44440D441A49, 0xFEA07F7FE17FDF9E, 0x4F88A9A99EA92137, +0x54672A2AA82A4D82, 0x6B0ABBBBD6BBB16D, 0x9F87C1C123C146E2, 0xA6F153535153A202, +0xA572DCDC57DCAE8B, 0x16530B0B2C0B5827, 0x27019D9D4E9D9CD3, 0xD82B6C6CAD6C47C1, +0x62A43131C43195F5, 0xE8F37474CD7487B9, 0xF115F6F6FFF6E309, 0x8C4C464605460A43, +0x45A5ACAC8AAC0926, 0x0FB589891E893C97, 0x28B414145014A044, 0xDFBAE1E1A3E15B42, +0x2CA616165816B04E, 0x74F73A3AE83ACDD2, 0xD2066969B9696FD0, 0x124109092409482D, +0xE0D77070DD70A7AD, 0x716FB6B6E2B6D954, 0xBD1ED0D067D0CEB7, 0xC7D6EDED93ED3B7E, +0x85E2CCCC17CC2EDB, 0x8468424215422A57, 0x2D2C98985A98B4C2, 0x55EDA4A4AAA4490E, +0x50752828A0285D88, 0xB8865C5C6D5CDA31, 0xED6BF8F8C7F8933F, 0x11C28686228644A4 }; + +const u64bit Whirlpool::C3[256] = { +0x7830D818186018C0, 0xAF462623238C2305, 0xF991B8C6C63FC67E, 0x6FCDFBE8E887E813, +0xA113CB878726874C, 0x626D11B8B8DAB8A9, 0x0502090101040108, 0x6E9E0D4F4F214F42, +0xEE6C9B3636D836AD, 0x0451FFA6A6A2A659, 0xBDB90CD2D26FD2DE, 0x06F70EF5F5F3F5FB, +0x80F2967979F979EF, 0xCEDE306F6FA16F5F, 0xEF3F6D91917E91FC, 0x07A4F852525552AA, +0xFDC04760609D6027, 0x766535BCBCCABC89, 0xCD2B379B9B569BAC, 0x8C018A8E8E028E04, +0x155BD2A3A3B6A371, 0x3C186C0C0C300C60, 0x8AF6847B7BF17BFF, 0xE16A803535D435B5, +0x693AF51D1D741DE8, 0x47DDB3E0E0A7E053, 0xACB321D7D77BD7F6, 0xED999CC2C22FC25E, +0x965C432E2EB82E6D, 0x7A96294B4B314B62, 0x21E15DFEFEDFFEA3, 0x16AED55757415782, +0x412ABD15155415A8, 0xB6EEE87777C1779F, 0xEB6E923737DC37A5, 0x56D79EE5E5B3E57B, +0xD923139F9F469F8C, 0x17FD23F0F0E7F0D3, 0x7F94204A4A354A6A, 0x95A944DADA4FDA9E, +0x25B0A258587D58FA, 0xCA8FCFC9C903C906, 0x8D527C2929A42955, 0x22145A0A0A280A50, +0x4F7F50B1B1FEB1E1, 0x1A5DC9A0A0BAA069, 0xDAD6146B6BB16B7F, 0xAB17D985852E855C, +0x73673CBDBDCEBD81, 0x34BA8F5D5D695DD2, 0x5020901010401080, 0x03F507F4F4F7F4F3, +0xC08BDDCBCB0BCB16, 0xC67CD33E3EF83EED, 0x110A2D0505140528, 0xE6CE78676781671F, +0x53D597E4E4B7E473, 0xBB4E0227279C2725, 0x5882734141194132, 0x9D0BA78B8B168B2C, +0x0153F6A7A7A6A751, 0x94FAB27D7DE97DCF, 0xFB374995956E95DC, 0x9FAD56D8D847D88E, +0x30EB70FBFBCBFB8B, 0x71C1CDEEEE9FEE23, 0x91F8BB7C7CED7CC7, 0xE3CC716666856617, +0x8EA77BDDDD53DDA6, 0x4B2EAF17175C17B8, 0x468E454747014702, 0xDC211A9E9E429E84, +0xC589D4CACA0FCA1E, 0x995A582D2DB42D75, 0x79632EBFBFC6BF91, 0x1B0E3F07071C0738, +0x2347ACADAD8EAD01, 0x2FB4B05A5A755AEA, 0xB51BEF838336836C, 0xFF66B63333CC3385, +0xF2C65C636391633F, 0x0A04120202080210, 0x384993AAAA92AA39, 0xA8E2DE7171D971AF, +0xCF8DC6C8C807C80E, 0x7D32D119196419C8, 0x70923B4949394972, 0x9AAF5FD9D943D986, +0x1DF931F2F2EFF2C3, 0x48DBA8E3E3ABE34B, 0x2AB6B95B5B715BE2, 0x920DBC88881A8834, +0xC8293E9A9A529AA4, 0xBE4C0B262698262D, 0xFA64BF3232C8328D, 0x4A7D59B0B0FAB0E9, +0x6ACFF2E9E983E91B, 0x331E770F0F3C0F78, 0xA6B733D5D573D5E6, 0xBA1DF480803A8074, +0x7C6127BEBEC2BE99, 0xDE87EBCDCD13CD26, 0xE468893434D034BD, 0x75903248483D487A, +0x24E354FFFFDBFFAB, 0x8FF48D7A7AF57AF7, 0xEA3D6490907A90F4, 0x3EBE9D5F5F615FC2, +0xA0403D202080201D, 0xD5D00F6868BD6867, 0x7234CA1A1A681AD0, 0x2C41B7AEAE82AE19, +0x5E757DB4B4EAB4C9, 0x19A8CE54544D549A, 0xE53B7F93937693EC, 0xAA442F222288220D, +0xE9C86364648D6407, 0x12FF2AF1F1E3F1DB, 0xA2E6CC7373D173BF, 0x5A24821212481290, +0x5D807A40401D403A, 0x2810480808200840, 0xE89B95C3C32BC356, 0x7BC5DFECEC97EC33, +0x90AB4DDBDB4BDB96, 0x1F5FC0A1A1BEA161, 0x8307918D8D0E8D1C, 0xC97AC83D3DF43DF5, +0xF1335B97976697CC, 0x0000000000000000, 0xD483F9CFCF1BCF36, 0x87566E2B2BAC2B45, +0xB3ECE17676C57697, 0xB019E68282328264, 0xA9B128D6D67FD6FE, 0x7736C31B1B6C1BD8, +0x5B7774B5B5EEB5C1, 0x2943BEAFAF86AF11, 0xDFD41D6A6AB56A77, 0x0DA0EA50505D50BA, +0x4C8A574545094512, 0x18FB38F3F3EBF3CB, 0xF060AD3030C0309D, 0x74C3C4EFEF9BEF2B, +0xC37EDA3F3FFC3FE5, 0x1CAAC75555495592, 0x1059DBA2A2B2A279, 0x65C9E9EAEA8FEA03, +0xECCA6A656589650F, 0x686903BABAD2BAB9, 0x935E4A2F2FBC2F65, 0xE79D8EC0C027C04E, +0x81A160DEDE5FDEBE, 0x6C38FC1C1C701CE0, 0x2EE746FDFDD3FDBB, 0x649A1F4D4D294D52, +0xE0397692927292E4, 0xBCEAFA7575C9758F, 0x1E0C360606180630, 0x9809AE8A8A128A24, +0x40794BB2B2F2B2F9, 0x59D185E6E6BFE663, 0x361C7E0E0E380E70, 0x633EE71F1F7C1FF8, +0xF7C4556262956237, 0xA3B53AD4D477D4EE, 0x324D81A8A89AA829, 0xF4315296966296C4, +0x3AEF62F9F9C3F99B, 0xF697A3C5C533C566, 0xB14A102525942535, 0x20B2AB59597959F2, +0xAE15D084842A8454, 0xA7E4C57272D572B7, 0xDD72EC3939E439D5, 0x6198164C4C2D4C5A, +0x3BBC945E5E655ECA, 0x85F09F7878FD78E7, 0xD870E53838E038DD, 0x8605988C8C0A8C14, +0xB2BF17D1D163D1C6, 0x0B57E4A5A5AEA541, 0x4DD9A1E2E2AFE243, 0xF8C24E616199612F, +0x457B42B3B3F6B3F1, 0xA542342121842115, 0xD625089C9C4A9C94, 0x663CEE1E1E781EF0, +0x5286614343114322, 0xFC93B1C7C73BC776, 0x2BE54FFCFCD7FCB3, 0x1408240404100420, +0x08A2E351515951B2, 0xC72F2599995E99BC, 0xC4DA226D6DA96D4F, 0x391A650D0D340D68, +0x35E979FAFACFFA83, 0x84A369DFDF5BDFB6, 0x9BFCA97E7EE57ED7, 0xB44819242490243D, +0xD776FE3B3BEC3BC5, 0x3D4B9AABAB96AB31, 0xD181F0CECE1FCE3E, 0x5522991111441188, +0x8903838F8F068F0C, 0x6B9C044E4E254E4A, 0x517366B7B7E6B7D1, 0x60CBE0EBEB8BEB0B, +0xCC78C13C3CF03CFD, 0xBF1FFD81813E817C, 0xFE354094946A94D4, 0x0CF31CF7F7FBF7EB, +0x676F18B9B9DEB9A1, 0x5F268B13134C1398, 0x9C58512C2CB02C7D, 0xB8BB05D3D36BD3D6, +0x5CD38CE7E7BBE76B, 0xCBDC396E6EA56E57, 0xF395AAC4C437C46E, 0x0F061B03030C0318, +0x13ACDC565645568A, 0x49885E44440D441A, 0x9EFEA07F7FE17FDF, 0x374F88A9A99EA921, +0x8254672A2AA82A4D, 0x6D6B0ABBBBD6BBB1, 0xE29F87C1C123C146, 0x02A6F153535153A2, +0x8BA572DCDC57DCAE, 0x2716530B0B2C0B58, 0xD327019D9D4E9D9C, 0xC1D82B6C6CAD6C47, +0xF562A43131C43195, 0xB9E8F37474CD7487, 0x09F115F6F6FFF6E3, 0x438C4C464605460A, +0x2645A5ACAC8AAC09, 0x970FB589891E893C, 0x4428B414145014A0, 0x42DFBAE1E1A3E15B, +0x4E2CA616165816B0, 0xD274F73A3AE83ACD, 0xD0D2066969B9696F, 0x2D12410909240948, +0xADE0D77070DD70A7, 0x54716FB6B6E2B6D9, 0xB7BD1ED0D067D0CE, 0x7EC7D6EDED93ED3B, +0xDB85E2CCCC17CC2E, 0x578468424215422A, 0xC22D2C98985A98B4, 0x0E55EDA4A4AAA449, +0x8850752828A0285D, 0x31B8865C5C6D5CDA, 0x3FED6BF8F8C7F893, 0xA411C28686228644 }; + +const u64bit Whirlpool::C4[256] = { +0xC07830D818186018, 0x05AF462623238C23, 0x7EF991B8C6C63FC6, 0x136FCDFBE8E887E8, +0x4CA113CB87872687, 0xA9626D11B8B8DAB8, 0x0805020901010401, 0x426E9E0D4F4F214F, +0xADEE6C9B3636D836, 0x590451FFA6A6A2A6, 0xDEBDB90CD2D26FD2, 0xFB06F70EF5F5F3F5, +0xEF80F2967979F979, 0x5FCEDE306F6FA16F, 0xFCEF3F6D91917E91, 0xAA07A4F852525552, +0x27FDC04760609D60, 0x89766535BCBCCABC, 0xACCD2B379B9B569B, 0x048C018A8E8E028E, +0x71155BD2A3A3B6A3, 0x603C186C0C0C300C, 0xFF8AF6847B7BF17B, 0xB5E16A803535D435, +0xE8693AF51D1D741D, 0x5347DDB3E0E0A7E0, 0xF6ACB321D7D77BD7, 0x5EED999CC2C22FC2, +0x6D965C432E2EB82E, 0x627A96294B4B314B, 0xA321E15DFEFEDFFE, 0x8216AED557574157, +0xA8412ABD15155415, 0x9FB6EEE87777C177, 0xA5EB6E923737DC37, 0x7B56D79EE5E5B3E5, +0x8CD923139F9F469F, 0xD317FD23F0F0E7F0, 0x6A7F94204A4A354A, 0x9E95A944DADA4FDA, +0xFA25B0A258587D58, 0x06CA8FCFC9C903C9, 0x558D527C2929A429, 0x5022145A0A0A280A, +0xE14F7F50B1B1FEB1, 0x691A5DC9A0A0BAA0, 0x7FDAD6146B6BB16B, 0x5CAB17D985852E85, +0x8173673CBDBDCEBD, 0xD234BA8F5D5D695D, 0x8050209010104010, 0xF303F507F4F4F7F4, +0x16C08BDDCBCB0BCB, 0xEDC67CD33E3EF83E, 0x28110A2D05051405, 0x1FE6CE7867678167, +0x7353D597E4E4B7E4, 0x25BB4E0227279C27, 0x3258827341411941, 0x2C9D0BA78B8B168B, +0x510153F6A7A7A6A7, 0xCF94FAB27D7DE97D, 0xDCFB374995956E95, 0x8E9FAD56D8D847D8, +0x8B30EB70FBFBCBFB, 0x2371C1CDEEEE9FEE, 0xC791F8BB7C7CED7C, 0x17E3CC7166668566, +0xA68EA77BDDDD53DD, 0xB84B2EAF17175C17, 0x02468E4547470147, 0x84DC211A9E9E429E, +0x1EC589D4CACA0FCA, 0x75995A582D2DB42D, 0x9179632EBFBFC6BF, 0x381B0E3F07071C07, +0x012347ACADAD8EAD, 0xEA2FB4B05A5A755A, 0x6CB51BEF83833683, 0x85FF66B63333CC33, +0x3FF2C65C63639163, 0x100A041202020802, 0x39384993AAAA92AA, 0xAFA8E2DE7171D971, +0x0ECF8DC6C8C807C8, 0xC87D32D119196419, 0x7270923B49493949, 0x869AAF5FD9D943D9, +0xC31DF931F2F2EFF2, 0x4B48DBA8E3E3ABE3, 0xE22AB6B95B5B715B, 0x34920DBC88881A88, +0xA4C8293E9A9A529A, 0x2DBE4C0B26269826, 0x8DFA64BF3232C832, 0xE94A7D59B0B0FAB0, +0x1B6ACFF2E9E983E9, 0x78331E770F0F3C0F, 0xE6A6B733D5D573D5, 0x74BA1DF480803A80, +0x997C6127BEBEC2BE, 0x26DE87EBCDCD13CD, 0xBDE468893434D034, 0x7A75903248483D48, +0xAB24E354FFFFDBFF, 0xF78FF48D7A7AF57A, 0xF4EA3D6490907A90, 0xC23EBE9D5F5F615F, +0x1DA0403D20208020, 0x67D5D00F6868BD68, 0xD07234CA1A1A681A, 0x192C41B7AEAE82AE, +0xC95E757DB4B4EAB4, 0x9A19A8CE54544D54, 0xECE53B7F93937693, 0x0DAA442F22228822, +0x07E9C86364648D64, 0xDB12FF2AF1F1E3F1, 0xBFA2E6CC7373D173, 0x905A248212124812, +0x3A5D807A40401D40, 0x4028104808082008, 0x56E89B95C3C32BC3, 0x337BC5DFECEC97EC, +0x9690AB4DDBDB4BDB, 0x611F5FC0A1A1BEA1, 0x1C8307918D8D0E8D, 0xF5C97AC83D3DF43D, +0xCCF1335B97976697, 0x0000000000000000, 0x36D483F9CFCF1BCF, 0x4587566E2B2BAC2B, +0x97B3ECE17676C576, 0x64B019E682823282, 0xFEA9B128D6D67FD6, 0xD87736C31B1B6C1B, +0xC15B7774B5B5EEB5, 0x112943BEAFAF86AF, 0x77DFD41D6A6AB56A, 0xBA0DA0EA50505D50, +0x124C8A5745450945, 0xCB18FB38F3F3EBF3, 0x9DF060AD3030C030, 0x2B74C3C4EFEF9BEF, +0xE5C37EDA3F3FFC3F, 0x921CAAC755554955, 0x791059DBA2A2B2A2, 0x0365C9E9EAEA8FEA, +0x0FECCA6A65658965, 0xB9686903BABAD2BA, 0x65935E4A2F2FBC2F, 0x4EE79D8EC0C027C0, +0xBE81A160DEDE5FDE, 0xE06C38FC1C1C701C, 0xBB2EE746FDFDD3FD, 0x52649A1F4D4D294D, +0xE4E0397692927292, 0x8FBCEAFA7575C975, 0x301E0C3606061806, 0x249809AE8A8A128A, +0xF940794BB2B2F2B2, 0x6359D185E6E6BFE6, 0x70361C7E0E0E380E, 0xF8633EE71F1F7C1F, +0x37F7C45562629562, 0xEEA3B53AD4D477D4, 0x29324D81A8A89AA8, 0xC4F4315296966296, +0x9B3AEF62F9F9C3F9, 0x66F697A3C5C533C5, 0x35B14A1025259425, 0xF220B2AB59597959, +0x54AE15D084842A84, 0xB7A7E4C57272D572, 0xD5DD72EC3939E439, 0x5A6198164C4C2D4C, +0xCA3BBC945E5E655E, 0xE785F09F7878FD78, 0xDDD870E53838E038, 0x148605988C8C0A8C, +0xC6B2BF17D1D163D1, 0x410B57E4A5A5AEA5, 0x434DD9A1E2E2AFE2, 0x2FF8C24E61619961, +0xF1457B42B3B3F6B3, 0x15A5423421218421, 0x94D625089C9C4A9C, 0xF0663CEE1E1E781E, +0x2252866143431143, 0x76FC93B1C7C73BC7, 0xB32BE54FFCFCD7FC, 0x2014082404041004, +0xB208A2E351515951, 0xBCC72F2599995E99, 0x4FC4DA226D6DA96D, 0x68391A650D0D340D, +0x8335E979FAFACFFA, 0xB684A369DFDF5BDF, 0xD79BFCA97E7EE57E, 0x3DB4481924249024, +0xC5D776FE3B3BEC3B, 0x313D4B9AABAB96AB, 0x3ED181F0CECE1FCE, 0x8855229911114411, +0x0C8903838F8F068F, 0x4A6B9C044E4E254E, 0xD1517366B7B7E6B7, 0x0B60CBE0EBEB8BEB, +0xFDCC78C13C3CF03C, 0x7CBF1FFD81813E81, 0xD4FE354094946A94, 0xEB0CF31CF7F7FBF7, +0xA1676F18B9B9DEB9, 0x985F268B13134C13, 0x7D9C58512C2CB02C, 0xD6B8BB05D3D36BD3, +0x6B5CD38CE7E7BBE7, 0x57CBDC396E6EA56E, 0x6EF395AAC4C437C4, 0x180F061B03030C03, +0x8A13ACDC56564556, 0x1A49885E44440D44, 0xDF9EFEA07F7FE17F, 0x21374F88A9A99EA9, +0x4D8254672A2AA82A, 0xB16D6B0ABBBBD6BB, 0x46E29F87C1C123C1, 0xA202A6F153535153, +0xAE8BA572DCDC57DC, 0x582716530B0B2C0B, 0x9CD327019D9D4E9D, 0x47C1D82B6C6CAD6C, +0x95F562A43131C431, 0x87B9E8F37474CD74, 0xE309F115F6F6FFF6, 0x0A438C4C46460546, +0x092645A5ACAC8AAC, 0x3C970FB589891E89, 0xA04428B414145014, 0x5B42DFBAE1E1A3E1, +0xB04E2CA616165816, 0xCDD274F73A3AE83A, 0x6FD0D2066969B969, 0x482D124109092409, +0xA7ADE0D77070DD70, 0xD954716FB6B6E2B6, 0xCEB7BD1ED0D067D0, 0x3B7EC7D6EDED93ED, +0x2EDB85E2CCCC17CC, 0x2A57846842421542, 0xB4C22D2C98985A98, 0x490E55EDA4A4AAA4, +0x5D8850752828A028, 0xDA31B8865C5C6D5C, 0x933FED6BF8F8C7F8, 0x44A411C286862286 }; + +const u64bit Whirlpool::C5[256] = { +0x18C07830D8181860, 0x2305AF462623238C, 0xC67EF991B8C6C63F, 0xE8136FCDFBE8E887, +0x874CA113CB878726, 0xB8A9626D11B8B8DA, 0x0108050209010104, 0x4F426E9E0D4F4F21, +0x36ADEE6C9B3636D8, 0xA6590451FFA6A6A2, 0xD2DEBDB90CD2D26F, 0xF5FB06F70EF5F5F3, +0x79EF80F2967979F9, 0x6F5FCEDE306F6FA1, 0x91FCEF3F6D91917E, 0x52AA07A4F8525255, +0x6027FDC04760609D, 0xBC89766535BCBCCA, 0x9BACCD2B379B9B56, 0x8E048C018A8E8E02, +0xA371155BD2A3A3B6, 0x0C603C186C0C0C30, 0x7BFF8AF6847B7BF1, 0x35B5E16A803535D4, +0x1DE8693AF51D1D74, 0xE05347DDB3E0E0A7, 0xD7F6ACB321D7D77B, 0xC25EED999CC2C22F, +0x2E6D965C432E2EB8, 0x4B627A96294B4B31, 0xFEA321E15DFEFEDF, 0x578216AED5575741, +0x15A8412ABD151554, 0x779FB6EEE87777C1, 0x37A5EB6E923737DC, 0xE57B56D79EE5E5B3, +0x9F8CD923139F9F46, 0xF0D317FD23F0F0E7, 0x4A6A7F94204A4A35, 0xDA9E95A944DADA4F, +0x58FA25B0A258587D, 0xC906CA8FCFC9C903, 0x29558D527C2929A4, 0x0A5022145A0A0A28, +0xB1E14F7F50B1B1FE, 0xA0691A5DC9A0A0BA, 0x6B7FDAD6146B6BB1, 0x855CAB17D985852E, +0xBD8173673CBDBDCE, 0x5DD234BA8F5D5D69, 0x1080502090101040, 0xF4F303F507F4F4F7, +0xCB16C08BDDCBCB0B, 0x3EEDC67CD33E3EF8, 0x0528110A2D050514, 0x671FE6CE78676781, +0xE47353D597E4E4B7, 0x2725BB4E0227279C, 0x4132588273414119, 0x8B2C9D0BA78B8B16, +0xA7510153F6A7A7A6, 0x7DCF94FAB27D7DE9, 0x95DCFB374995956E, 0xD88E9FAD56D8D847, +0xFB8B30EB70FBFBCB, 0xEE2371C1CDEEEE9F, 0x7CC791F8BB7C7CED, 0x6617E3CC71666685, +0xDDA68EA77BDDDD53, 0x17B84B2EAF17175C, 0x4702468E45474701, 0x9E84DC211A9E9E42, +0xCA1EC589D4CACA0F, 0x2D75995A582D2DB4, 0xBF9179632EBFBFC6, 0x07381B0E3F07071C, +0xAD012347ACADAD8E, 0x5AEA2FB4B05A5A75, 0x836CB51BEF838336, 0x3385FF66B63333CC, +0x633FF2C65C636391, 0x02100A0412020208, 0xAA39384993AAAA92, 0x71AFA8E2DE7171D9, +0xC80ECF8DC6C8C807, 0x19C87D32D1191964, 0x497270923B494939, 0xD9869AAF5FD9D943, +0xF2C31DF931F2F2EF, 0xE34B48DBA8E3E3AB, 0x5BE22AB6B95B5B71, 0x8834920DBC88881A, +0x9AA4C8293E9A9A52, 0x262DBE4C0B262698, 0x328DFA64BF3232C8, 0xB0E94A7D59B0B0FA, +0xE91B6ACFF2E9E983, 0x0F78331E770F0F3C, 0xD5E6A6B733D5D573, 0x8074BA1DF480803A, +0xBE997C6127BEBEC2, 0xCD26DE87EBCDCD13, 0x34BDE468893434D0, 0x487A75903248483D, +0xFFAB24E354FFFFDB, 0x7AF78FF48D7A7AF5, 0x90F4EA3D6490907A, 0x5FC23EBE9D5F5F61, +0x201DA0403D202080, 0x6867D5D00F6868BD, 0x1AD07234CA1A1A68, 0xAE192C41B7AEAE82, +0xB4C95E757DB4B4EA, 0x549A19A8CE54544D, 0x93ECE53B7F939376, 0x220DAA442F222288, +0x6407E9C86364648D, 0xF1DB12FF2AF1F1E3, 0x73BFA2E6CC7373D1, 0x12905A2482121248, +0x403A5D807A40401D, 0x0840281048080820, 0xC356E89B95C3C32B, 0xEC337BC5DFECEC97, +0xDB9690AB4DDBDB4B, 0xA1611F5FC0A1A1BE, 0x8D1C8307918D8D0E, 0x3DF5C97AC83D3DF4, +0x97CCF1335B979766, 0x0000000000000000, 0xCF36D483F9CFCF1B, 0x2B4587566E2B2BAC, +0x7697B3ECE17676C5, 0x8264B019E6828232, 0xD6FEA9B128D6D67F, 0x1BD87736C31B1B6C, +0xB5C15B7774B5B5EE, 0xAF112943BEAFAF86, 0x6A77DFD41D6A6AB5, 0x50BA0DA0EA50505D, +0x45124C8A57454509, 0xF3CB18FB38F3F3EB, 0x309DF060AD3030C0, 0xEF2B74C3C4EFEF9B, +0x3FE5C37EDA3F3FFC, 0x55921CAAC7555549, 0xA2791059DBA2A2B2, 0xEA0365C9E9EAEA8F, +0x650FECCA6A656589, 0xBAB9686903BABAD2, 0x2F65935E4A2F2FBC, 0xC04EE79D8EC0C027, +0xDEBE81A160DEDE5F, 0x1CE06C38FC1C1C70, 0xFDBB2EE746FDFDD3, 0x4D52649A1F4D4D29, +0x92E4E03976929272, 0x758FBCEAFA7575C9, 0x06301E0C36060618, 0x8A249809AE8A8A12, +0xB2F940794BB2B2F2, 0xE66359D185E6E6BF, 0x0E70361C7E0E0E38, 0x1FF8633EE71F1F7C, +0x6237F7C455626295, 0xD4EEA3B53AD4D477, 0xA829324D81A8A89A, 0x96C4F43152969662, +0xF99B3AEF62F9F9C3, 0xC566F697A3C5C533, 0x2535B14A10252594, 0x59F220B2AB595979, +0x8454AE15D084842A, 0x72B7A7E4C57272D5, 0x39D5DD72EC3939E4, 0x4C5A6198164C4C2D, +0x5ECA3BBC945E5E65, 0x78E785F09F7878FD, 0x38DDD870E53838E0, 0x8C148605988C8C0A, +0xD1C6B2BF17D1D163, 0xA5410B57E4A5A5AE, 0xE2434DD9A1E2E2AF, 0x612FF8C24E616199, +0xB3F1457B42B3B3F6, 0x2115A54234212184, 0x9C94D625089C9C4A, 0x1EF0663CEE1E1E78, +0x4322528661434311, 0xC776FC93B1C7C73B, 0xFCB32BE54FFCFCD7, 0x0420140824040410, +0x51B208A2E3515159, 0x99BCC72F2599995E, 0x6D4FC4DA226D6DA9, 0x0D68391A650D0D34, +0xFA8335E979FAFACF, 0xDFB684A369DFDF5B, 0x7ED79BFCA97E7EE5, 0x243DB44819242490, +0x3BC5D776FE3B3BEC, 0xAB313D4B9AABAB96, 0xCE3ED181F0CECE1F, 0x1188552299111144, +0x8F0C8903838F8F06, 0x4E4A6B9C044E4E25, 0xB7D1517366B7B7E6, 0xEB0B60CBE0EBEB8B, +0x3CFDCC78C13C3CF0, 0x817CBF1FFD81813E, 0x94D4FE354094946A, 0xF7EB0CF31CF7F7FB, +0xB9A1676F18B9B9DE, 0x13985F268B13134C, 0x2C7D9C58512C2CB0, 0xD3D6B8BB05D3D36B, +0xE76B5CD38CE7E7BB, 0x6E57CBDC396E6EA5, 0xC46EF395AAC4C437, 0x03180F061B03030C, +0x568A13ACDC565645, 0x441A49885E44440D, 0x7FDF9EFEA07F7FE1, 0xA921374F88A9A99E, +0x2A4D8254672A2AA8, 0xBBB16D6B0ABBBBD6, 0xC146E29F87C1C123, 0x53A202A6F1535351, +0xDCAE8BA572DCDC57, 0x0B582716530B0B2C, 0x9D9CD327019D9D4E, 0x6C47C1D82B6C6CAD, +0x3195F562A43131C4, 0x7487B9E8F37474CD, 0xF6E309F115F6F6FF, 0x460A438C4C464605, +0xAC092645A5ACAC8A, 0x893C970FB589891E, 0x14A04428B4141450, 0xE15B42DFBAE1E1A3, +0x16B04E2CA6161658, 0x3ACDD274F73A3AE8, 0x696FD0D2066969B9, 0x09482D1241090924, +0x70A7ADE0D77070DD, 0xB6D954716FB6B6E2, 0xD0CEB7BD1ED0D067, 0xED3B7EC7D6EDED93, +0xCC2EDB85E2CCCC17, 0x422A578468424215, 0x98B4C22D2C98985A, 0xA4490E55EDA4A4AA, +0x285D8850752828A0, 0x5CDA31B8865C5C6D, 0xF8933FED6BF8F8C7, 0x8644A411C2868622 }; + +const u64bit Whirlpool::C6[256] = { +0x6018C07830D81818, 0x8C2305AF46262323, 0x3FC67EF991B8C6C6, 0x87E8136FCDFBE8E8, +0x26874CA113CB8787, 0xDAB8A9626D11B8B8, 0x0401080502090101, 0x214F426E9E0D4F4F, +0xD836ADEE6C9B3636, 0xA2A6590451FFA6A6, 0x6FD2DEBDB90CD2D2, 0xF3F5FB06F70EF5F5, +0xF979EF80F2967979, 0xA16F5FCEDE306F6F, 0x7E91FCEF3F6D9191, 0x5552AA07A4F85252, +0x9D6027FDC0476060, 0xCABC89766535BCBC, 0x569BACCD2B379B9B, 0x028E048C018A8E8E, +0xB6A371155BD2A3A3, 0x300C603C186C0C0C, 0xF17BFF8AF6847B7B, 0xD435B5E16A803535, +0x741DE8693AF51D1D, 0xA7E05347DDB3E0E0, 0x7BD7F6ACB321D7D7, 0x2FC25EED999CC2C2, +0xB82E6D965C432E2E, 0x314B627A96294B4B, 0xDFFEA321E15DFEFE, 0x41578216AED55757, +0x5415A8412ABD1515, 0xC1779FB6EEE87777, 0xDC37A5EB6E923737, 0xB3E57B56D79EE5E5, +0x469F8CD923139F9F, 0xE7F0D317FD23F0F0, 0x354A6A7F94204A4A, 0x4FDA9E95A944DADA, +0x7D58FA25B0A25858, 0x03C906CA8FCFC9C9, 0xA429558D527C2929, 0x280A5022145A0A0A, +0xFEB1E14F7F50B1B1, 0xBAA0691A5DC9A0A0, 0xB16B7FDAD6146B6B, 0x2E855CAB17D98585, +0xCEBD8173673CBDBD, 0x695DD234BA8F5D5D, 0x4010805020901010, 0xF7F4F303F507F4F4, +0x0BCB16C08BDDCBCB, 0xF83EEDC67CD33E3E, 0x140528110A2D0505, 0x81671FE6CE786767, +0xB7E47353D597E4E4, 0x9C2725BB4E022727, 0x1941325882734141, 0x168B2C9D0BA78B8B, +0xA6A7510153F6A7A7, 0xE97DCF94FAB27D7D, 0x6E95DCFB37499595, 0x47D88E9FAD56D8D8, +0xCBFB8B30EB70FBFB, 0x9FEE2371C1CDEEEE, 0xED7CC791F8BB7C7C, 0x856617E3CC716666, +0x53DDA68EA77BDDDD, 0x5C17B84B2EAF1717, 0x014702468E454747, 0x429E84DC211A9E9E, +0x0FCA1EC589D4CACA, 0xB42D75995A582D2D, 0xC6BF9179632EBFBF, 0x1C07381B0E3F0707, +0x8EAD012347ACADAD, 0x755AEA2FB4B05A5A, 0x36836CB51BEF8383, 0xCC3385FF66B63333, +0x91633FF2C65C6363, 0x0802100A04120202, 0x92AA39384993AAAA, 0xD971AFA8E2DE7171, +0x07C80ECF8DC6C8C8, 0x6419C87D32D11919, 0x39497270923B4949, 0x43D9869AAF5FD9D9, +0xEFF2C31DF931F2F2, 0xABE34B48DBA8E3E3, 0x715BE22AB6B95B5B, 0x1A8834920DBC8888, +0x529AA4C8293E9A9A, 0x98262DBE4C0B2626, 0xC8328DFA64BF3232, 0xFAB0E94A7D59B0B0, +0x83E91B6ACFF2E9E9, 0x3C0F78331E770F0F, 0x73D5E6A6B733D5D5, 0x3A8074BA1DF48080, +0xC2BE997C6127BEBE, 0x13CD26DE87EBCDCD, 0xD034BDE468893434, 0x3D487A7590324848, +0xDBFFAB24E354FFFF, 0xF57AF78FF48D7A7A, 0x7A90F4EA3D649090, 0x615FC23EBE9D5F5F, +0x80201DA0403D2020, 0xBD6867D5D00F6868, 0x681AD07234CA1A1A, 0x82AE192C41B7AEAE, +0xEAB4C95E757DB4B4, 0x4D549A19A8CE5454, 0x7693ECE53B7F9393, 0x88220DAA442F2222, +0x8D6407E9C8636464, 0xE3F1DB12FF2AF1F1, 0xD173BFA2E6CC7373, 0x4812905A24821212, +0x1D403A5D807A4040, 0x2008402810480808, 0x2BC356E89B95C3C3, 0x97EC337BC5DFECEC, +0x4BDB9690AB4DDBDB, 0xBEA1611F5FC0A1A1, 0x0E8D1C8307918D8D, 0xF43DF5C97AC83D3D, +0x6697CCF1335B9797, 0x0000000000000000, 0x1BCF36D483F9CFCF, 0xAC2B4587566E2B2B, +0xC57697B3ECE17676, 0x328264B019E68282, 0x7FD6FEA9B128D6D6, 0x6C1BD87736C31B1B, +0xEEB5C15B7774B5B5, 0x86AF112943BEAFAF, 0xB56A77DFD41D6A6A, 0x5D50BA0DA0EA5050, +0x0945124C8A574545, 0xEBF3CB18FB38F3F3, 0xC0309DF060AD3030, 0x9BEF2B74C3C4EFEF, +0xFC3FE5C37EDA3F3F, 0x4955921CAAC75555, 0xB2A2791059DBA2A2, 0x8FEA0365C9E9EAEA, +0x89650FECCA6A6565, 0xD2BAB9686903BABA, 0xBC2F65935E4A2F2F, 0x27C04EE79D8EC0C0, +0x5FDEBE81A160DEDE, 0x701CE06C38FC1C1C, 0xD3FDBB2EE746FDFD, 0x294D52649A1F4D4D, +0x7292E4E039769292, 0xC9758FBCEAFA7575, 0x1806301E0C360606, 0x128A249809AE8A8A, +0xF2B2F940794BB2B2, 0xBFE66359D185E6E6, 0x380E70361C7E0E0E, 0x7C1FF8633EE71F1F, +0x956237F7C4556262, 0x77D4EEA3B53AD4D4, 0x9AA829324D81A8A8, 0x6296C4F431529696, +0xC3F99B3AEF62F9F9, 0x33C566F697A3C5C5, 0x942535B14A102525, 0x7959F220B2AB5959, +0x2A8454AE15D08484, 0xD572B7A7E4C57272, 0xE439D5DD72EC3939, 0x2D4C5A6198164C4C, +0x655ECA3BBC945E5E, 0xFD78E785F09F7878, 0xE038DDD870E53838, 0x0A8C148605988C8C, +0x63D1C6B2BF17D1D1, 0xAEA5410B57E4A5A5, 0xAFE2434DD9A1E2E2, 0x99612FF8C24E6161, +0xF6B3F1457B42B3B3, 0x842115A542342121, 0x4A9C94D625089C9C, 0x781EF0663CEE1E1E, +0x1143225286614343, 0x3BC776FC93B1C7C7, 0xD7FCB32BE54FFCFC, 0x1004201408240404, +0x5951B208A2E35151, 0x5E99BCC72F259999, 0xA96D4FC4DA226D6D, 0x340D68391A650D0D, +0xCFFA8335E979FAFA, 0x5BDFB684A369DFDF, 0xE57ED79BFCA97E7E, 0x90243DB448192424, +0xEC3BC5D776FE3B3B, 0x96AB313D4B9AABAB, 0x1FCE3ED181F0CECE, 0x4411885522991111, +0x068F0C8903838F8F, 0x254E4A6B9C044E4E, 0xE6B7D1517366B7B7, 0x8BEB0B60CBE0EBEB, +0xF03CFDCC78C13C3C, 0x3E817CBF1FFD8181, 0x6A94D4FE35409494, 0xFBF7EB0CF31CF7F7, +0xDEB9A1676F18B9B9, 0x4C13985F268B1313, 0xB02C7D9C58512C2C, 0x6BD3D6B8BB05D3D3, +0xBBE76B5CD38CE7E7, 0xA56E57CBDC396E6E, 0x37C46EF395AAC4C4, 0x0C03180F061B0303, +0x45568A13ACDC5656, 0x0D441A49885E4444, 0xE17FDF9EFEA07F7F, 0x9EA921374F88A9A9, +0xA82A4D8254672A2A, 0xD6BBB16D6B0ABBBB, 0x23C146E29F87C1C1, 0x5153A202A6F15353, +0x57DCAE8BA572DCDC, 0x2C0B582716530B0B, 0x4E9D9CD327019D9D, 0xAD6C47C1D82B6C6C, +0xC43195F562A43131, 0xCD7487B9E8F37474, 0xFFF6E309F115F6F6, 0x05460A438C4C4646, +0x8AAC092645A5ACAC, 0x1E893C970FB58989, 0x5014A04428B41414, 0xA3E15B42DFBAE1E1, +0x5816B04E2CA61616, 0xE83ACDD274F73A3A, 0xB9696FD0D2066969, 0x2409482D12410909, +0xDD70A7ADE0D77070, 0xE2B6D954716FB6B6, 0x67D0CEB7BD1ED0D0, 0x93ED3B7EC7D6EDED, +0x17CC2EDB85E2CCCC, 0x15422A5784684242, 0x5A98B4C22D2C9898, 0xAAA4490E55EDA4A4, +0xA0285D8850752828, 0x6D5CDA31B8865C5C, 0xC7F8933FED6BF8F8, 0x228644A411C28686 }; + +const u64bit Whirlpool::C7[256] = { +0x186018C07830D818, 0x238C2305AF462623, 0xC63FC67EF991B8C6, 0xE887E8136FCDFBE8, +0x8726874CA113CB87, 0xB8DAB8A9626D11B8, 0x0104010805020901, 0x4F214F426E9E0D4F, +0x36D836ADEE6C9B36, 0xA6A2A6590451FFA6, 0xD26FD2DEBDB90CD2, 0xF5F3F5FB06F70EF5, +0x79F979EF80F29679, 0x6FA16F5FCEDE306F, 0x917E91FCEF3F6D91, 0x525552AA07A4F852, +0x609D6027FDC04760, 0xBCCABC89766535BC, 0x9B569BACCD2B379B, 0x8E028E048C018A8E, +0xA3B6A371155BD2A3, 0x0C300C603C186C0C, 0x7BF17BFF8AF6847B, 0x35D435B5E16A8035, +0x1D741DE8693AF51D, 0xE0A7E05347DDB3E0, 0xD77BD7F6ACB321D7, 0xC22FC25EED999CC2, +0x2EB82E6D965C432E, 0x4B314B627A96294B, 0xFEDFFEA321E15DFE, 0x5741578216AED557, +0x155415A8412ABD15, 0x77C1779FB6EEE877, 0x37DC37A5EB6E9237, 0xE5B3E57B56D79EE5, +0x9F469F8CD923139F, 0xF0E7F0D317FD23F0, 0x4A354A6A7F94204A, 0xDA4FDA9E95A944DA, +0x587D58FA25B0A258, 0xC903C906CA8FCFC9, 0x29A429558D527C29, 0x0A280A5022145A0A, +0xB1FEB1E14F7F50B1, 0xA0BAA0691A5DC9A0, 0x6BB16B7FDAD6146B, 0x852E855CAB17D985, +0xBDCEBD8173673CBD, 0x5D695DD234BA8F5D, 0x1040108050209010, 0xF4F7F4F303F507F4, +0xCB0BCB16C08BDDCB, 0x3EF83EEDC67CD33E, 0x05140528110A2D05, 0x6781671FE6CE7867, +0xE4B7E47353D597E4, 0x279C2725BB4E0227, 0x4119413258827341, 0x8B168B2C9D0BA78B, +0xA7A6A7510153F6A7, 0x7DE97DCF94FAB27D, 0x956E95DCFB374995, 0xD847D88E9FAD56D8, +0xFBCBFB8B30EB70FB, 0xEE9FEE2371C1CDEE, 0x7CED7CC791F8BB7C, 0x66856617E3CC7166, +0xDD53DDA68EA77BDD, 0x175C17B84B2EAF17, 0x47014702468E4547, 0x9E429E84DC211A9E, +0xCA0FCA1EC589D4CA, 0x2DB42D75995A582D, 0xBFC6BF9179632EBF, 0x071C07381B0E3F07, +0xAD8EAD012347ACAD, 0x5A755AEA2FB4B05A, 0x8336836CB51BEF83, 0x33CC3385FF66B633, +0x6391633FF2C65C63, 0x020802100A041202, 0xAA92AA39384993AA, 0x71D971AFA8E2DE71, +0xC807C80ECF8DC6C8, 0x196419C87D32D119, 0x4939497270923B49, 0xD943D9869AAF5FD9, +0xF2EFF2C31DF931F2, 0xE3ABE34B48DBA8E3, 0x5B715BE22AB6B95B, 0x881A8834920DBC88, +0x9A529AA4C8293E9A, 0x2698262DBE4C0B26, 0x32C8328DFA64BF32, 0xB0FAB0E94A7D59B0, +0xE983E91B6ACFF2E9, 0x0F3C0F78331E770F, 0xD573D5E6A6B733D5, 0x803A8074BA1DF480, +0xBEC2BE997C6127BE, 0xCD13CD26DE87EBCD, 0x34D034BDE4688934, 0x483D487A75903248, +0xFFDBFFAB24E354FF, 0x7AF57AF78FF48D7A, 0x907A90F4EA3D6490, 0x5F615FC23EBE9D5F, +0x2080201DA0403D20, 0x68BD6867D5D00F68, 0x1A681AD07234CA1A, 0xAE82AE192C41B7AE, +0xB4EAB4C95E757DB4, 0x544D549A19A8CE54, 0x937693ECE53B7F93, 0x2288220DAA442F22, +0x648D6407E9C86364, 0xF1E3F1DB12FF2AF1, 0x73D173BFA2E6CC73, 0x124812905A248212, +0x401D403A5D807A40, 0x0820084028104808, 0xC32BC356E89B95C3, 0xEC97EC337BC5DFEC, +0xDB4BDB9690AB4DDB, 0xA1BEA1611F5FC0A1, 0x8D0E8D1C8307918D, 0x3DF43DF5C97AC83D, +0x976697CCF1335B97, 0x0000000000000000, 0xCF1BCF36D483F9CF, 0x2BAC2B4587566E2B, +0x76C57697B3ECE176, 0x82328264B019E682, 0xD67FD6FEA9B128D6, 0x1B6C1BD87736C31B, +0xB5EEB5C15B7774B5, 0xAF86AF112943BEAF, 0x6AB56A77DFD41D6A, 0x505D50BA0DA0EA50, +0x450945124C8A5745, 0xF3EBF3CB18FB38F3, 0x30C0309DF060AD30, 0xEF9BEF2B74C3C4EF, +0x3FFC3FE5C37EDA3F, 0x554955921CAAC755, 0xA2B2A2791059DBA2, 0xEA8FEA0365C9E9EA, +0x6589650FECCA6A65, 0xBAD2BAB9686903BA, 0x2FBC2F65935E4A2F, 0xC027C04EE79D8EC0, +0xDE5FDEBE81A160DE, 0x1C701CE06C38FC1C, 0xFDD3FDBB2EE746FD, 0x4D294D52649A1F4D, +0x927292E4E0397692, 0x75C9758FBCEAFA75, 0x061806301E0C3606, 0x8A128A249809AE8A, +0xB2F2B2F940794BB2, 0xE6BFE66359D185E6, 0x0E380E70361C7E0E, 0x1F7C1FF8633EE71F, +0x62956237F7C45562, 0xD477D4EEA3B53AD4, 0xA89AA829324D81A8, 0x966296C4F4315296, +0xF9C3F99B3AEF62F9, 0xC533C566F697A3C5, 0x25942535B14A1025, 0x597959F220B2AB59, +0x842A8454AE15D084, 0x72D572B7A7E4C572, 0x39E439D5DD72EC39, 0x4C2D4C5A6198164C, +0x5E655ECA3BBC945E, 0x78FD78E785F09F78, 0x38E038DDD870E538, 0x8C0A8C148605988C, +0xD163D1C6B2BF17D1, 0xA5AEA5410B57E4A5, 0xE2AFE2434DD9A1E2, 0x6199612FF8C24E61, +0xB3F6B3F1457B42B3, 0x21842115A5423421, 0x9C4A9C94D625089C, 0x1E781EF0663CEE1E, +0x4311432252866143, 0xC73BC776FC93B1C7, 0xFCD7FCB32BE54FFC, 0x0410042014082404, +0x515951B208A2E351, 0x995E99BCC72F2599, 0x6DA96D4FC4DA226D, 0x0D340D68391A650D, +0xFACFFA8335E979FA, 0xDF5BDFB684A369DF, 0x7EE57ED79BFCA97E, 0x2490243DB4481924, +0x3BEC3BC5D776FE3B, 0xAB96AB313D4B9AAB, 0xCE1FCE3ED181F0CE, 0x1144118855229911, +0x8F068F0C8903838F, 0x4E254E4A6B9C044E, 0xB7E6B7D1517366B7, 0xEB8BEB0B60CBE0EB, +0x3CF03CFDCC78C13C, 0x813E817CBF1FFD81, 0x946A94D4FE354094, 0xF7FBF7EB0CF31CF7, +0xB9DEB9A1676F18B9, 0x134C13985F268B13, 0x2CB02C7D9C58512C, 0xD36BD3D6B8BB05D3, +0xE7BBE76B5CD38CE7, 0x6EA56E57CBDC396E, 0xC437C46EF395AAC4, 0x030C03180F061B03, +0x5645568A13ACDC56, 0x440D441A49885E44, 0x7FE17FDF9EFEA07F, 0xA99EA921374F88A9, +0x2AA82A4D8254672A, 0xBBD6BBB16D6B0ABB, 0xC123C146E29F87C1, 0x535153A202A6F153, +0xDC57DCAE8BA572DC, 0x0B2C0B582716530B, 0x9D4E9D9CD327019D, 0x6CAD6C47C1D82B6C, +0x31C43195F562A431, 0x74CD7487B9E8F374, 0xF6FFF6E309F115F6, 0x4605460A438C4C46, +0xAC8AAC092645A5AC, 0x891E893C970FB589, 0x145014A04428B414, 0xE1A3E15B42DFBAE1, +0x165816B04E2CA616, 0x3AE83ACDD274F73A, 0x69B9696FD0D20669, 0x092409482D124109, +0x70DD70A7ADE0D770, 0xB6E2B6D954716FB6, 0xD067D0CEB7BD1ED0, 0xED93ED3B7EC7D6ED, +0xCC17CC2EDB85E2CC, 0x4215422A57846842, 0x985A98B4C22D2C98, 0xA4AAA4490E55EDA4, +0x28A0285D88507528, 0x5C6D5CDA31B8865C, 0xF8C7F8933FED6BF8, 0x86228644A411C286 }; + +} diff --git a/src/libs/3rdparty/botan/src/hash/whirlpool/whrlpool.cpp b/src/libs/3rdparty/botan/src/hash/whirlpool/whrlpool.cpp new file mode 100644 index 00000000000..8548d61921a --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/whirlpool/whrlpool.cpp @@ -0,0 +1,146 @@ +/* +* Whirlpool +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Whirlpool Compression Function +*/ +void Whirlpool::compress_n(const byte in[], u32bit blocks) + { + static const u64bit RC[10] = { + 0x1823C6E887B8014F, 0x36A6D2F5796F9152, + 0x60BC9B8EA30C7B35, 0x1DE0D7C22E4BFE57, + 0x157737E59FF04ADA, 0x58C9290AB1A06B85, + 0xBD5D10F4CB3E0567, 0xE427418BA77D95D8, + 0xFBEE7C66DD17479E, 0xCA2DBF07AD5A8333 + }; + + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0; j != 8; ++j) + M[j] = load_be(in, j); + in += HASH_BLOCK_SIZE; + + u64bit K0, K1, K2, K3, K4, K5, K6, K7; + K0 = digest[0]; K1 = digest[1]; K2 = digest[2]; K3 = digest[3]; + K4 = digest[4]; K5 = digest[5]; K6 = digest[6]; K7 = digest[7]; + + u64bit B0, B1, B2, B3, B4, B5, B6, B7; + B0 = K0 ^ M[0]; B1 = K1 ^ M[1]; B2 = K2 ^ M[2]; B3 = K3 ^ M[3]; + B4 = K4 ^ M[4]; B5 = K5 ^ M[5]; B6 = K6 ^ M[6]; B7 = K7 ^ M[7]; + + for(u32bit j = 0; j != 10; ++j) + { + u64bit T0, T1, T2, T3, T4, T5, T6, T7; + T0 = C0[get_byte(0, K0)] ^ C1[get_byte(1, K7)] ^ + C2[get_byte(2, K6)] ^ C3[get_byte(3, K5)] ^ + C4[get_byte(4, K4)] ^ C5[get_byte(5, K3)] ^ + C6[get_byte(6, K2)] ^ C7[get_byte(7, K1)] ^ RC[j]; + T1 = C0[get_byte(0, K1)] ^ C1[get_byte(1, K0)] ^ + C2[get_byte(2, K7)] ^ C3[get_byte(3, K6)] ^ + C4[get_byte(4, K5)] ^ C5[get_byte(5, K4)] ^ + C6[get_byte(6, K3)] ^ C7[get_byte(7, K2)]; + T2 = C0[get_byte(0, K2)] ^ C1[get_byte(1, K1)] ^ + C2[get_byte(2, K0)] ^ C3[get_byte(3, K7)] ^ + C4[get_byte(4, K6)] ^ C5[get_byte(5, K5)] ^ + C6[get_byte(6, K4)] ^ C7[get_byte(7, K3)]; + T3 = C0[get_byte(0, K3)] ^ C1[get_byte(1, K2)] ^ + C2[get_byte(2, K1)] ^ C3[get_byte(3, K0)] ^ + C4[get_byte(4, K7)] ^ C5[get_byte(5, K6)] ^ + C6[get_byte(6, K5)] ^ C7[get_byte(7, K4)]; + T4 = C0[get_byte(0, K4)] ^ C1[get_byte(1, K3)] ^ + C2[get_byte(2, K2)] ^ C3[get_byte(3, K1)] ^ + C4[get_byte(4, K0)] ^ C5[get_byte(5, K7)] ^ + C6[get_byte(6, K6)] ^ C7[get_byte(7, K5)]; + T5 = C0[get_byte(0, K5)] ^ C1[get_byte(1, K4)] ^ + C2[get_byte(2, K3)] ^ C3[get_byte(3, K2)] ^ + C4[get_byte(4, K1)] ^ C5[get_byte(5, K0)] ^ + C6[get_byte(6, K7)] ^ C7[get_byte(7, K6)]; + T6 = C0[get_byte(0, K6)] ^ C1[get_byte(1, K5)] ^ + C2[get_byte(2, K4)] ^ C3[get_byte(3, K3)] ^ + C4[get_byte(4, K2)] ^ C5[get_byte(5, K1)] ^ + C6[get_byte(6, K0)] ^ C7[get_byte(7, K7)]; + T7 = C0[get_byte(0, K7)] ^ C1[get_byte(1, K6)] ^ + C2[get_byte(2, K5)] ^ C3[get_byte(3, K4)] ^ + C4[get_byte(4, K3)] ^ C5[get_byte(5, K2)] ^ + C6[get_byte(6, K1)] ^ C7[get_byte(7, K0)]; + + K0 = T0; K1 = T1; K2 = T2; K3 = T3; + K4 = T4; K5 = T5; K6 = T6; K7 = T7; + + T0 = C0[get_byte(0, B0)] ^ C1[get_byte(1, B7)] ^ + C2[get_byte(2, B6)] ^ C3[get_byte(3, B5)] ^ + C4[get_byte(4, B4)] ^ C5[get_byte(5, B3)] ^ + C6[get_byte(6, B2)] ^ C7[get_byte(7, B1)] ^ K0; + T1 = C0[get_byte(0, B1)] ^ C1[get_byte(1, B0)] ^ + C2[get_byte(2, B7)] ^ C3[get_byte(3, B6)] ^ + C4[get_byte(4, B5)] ^ C5[get_byte(5, B4)] ^ + C6[get_byte(6, B3)] ^ C7[get_byte(7, B2)] ^ K1; + T2 = C0[get_byte(0, B2)] ^ C1[get_byte(1, B1)] ^ + C2[get_byte(2, B0)] ^ C3[get_byte(3, B7)] ^ + C4[get_byte(4, B6)] ^ C5[get_byte(5, B5)] ^ + C6[get_byte(6, B4)] ^ C7[get_byte(7, B3)] ^ K2; + T3 = C0[get_byte(0, B3)] ^ C1[get_byte(1, B2)] ^ + C2[get_byte(2, B1)] ^ C3[get_byte(3, B0)] ^ + C4[get_byte(4, B7)] ^ C5[get_byte(5, B6)] ^ + C6[get_byte(6, B5)] ^ C7[get_byte(7, B4)] ^ K3; + T4 = C0[get_byte(0, B4)] ^ C1[get_byte(1, B3)] ^ + C2[get_byte(2, B2)] ^ C3[get_byte(3, B1)] ^ + C4[get_byte(4, B0)] ^ C5[get_byte(5, B7)] ^ + C6[get_byte(6, B6)] ^ C7[get_byte(7, B5)] ^ K4; + T5 = C0[get_byte(0, B5)] ^ C1[get_byte(1, B4)] ^ + C2[get_byte(2, B3)] ^ C3[get_byte(3, B2)] ^ + C4[get_byte(4, B1)] ^ C5[get_byte(5, B0)] ^ + C6[get_byte(6, B7)] ^ C7[get_byte(7, B6)] ^ K5; + T6 = C0[get_byte(0, B6)] ^ C1[get_byte(1, B5)] ^ + C2[get_byte(2, B4)] ^ C3[get_byte(3, B3)] ^ + C4[get_byte(4, B2)] ^ C5[get_byte(5, B1)] ^ + C6[get_byte(6, B0)] ^ C7[get_byte(7, B7)] ^ K6; + T7 = C0[get_byte(0, B7)] ^ C1[get_byte(1, B6)] ^ + C2[get_byte(2, B5)] ^ C3[get_byte(3, B4)] ^ + C4[get_byte(4, B3)] ^ C5[get_byte(5, B2)] ^ + C6[get_byte(6, B1)] ^ C7[get_byte(7, B0)] ^ K7; + + B0 = T0; B1 = T1; B2 = T2; B3 = T3; + B4 = T4; B5 = T5; B6 = T6; B7 = T7; + } + + digest[0] ^= B0 ^ M[0]; + digest[1] ^= B1 ^ M[1]; + digest[2] ^= B2 ^ M[2]; + digest[3] ^= B3 ^ M[3]; + digest[4] ^= B4 ^ M[4]; + digest[5] ^= B5 ^ M[5]; + digest[6] ^= B6 ^ M[6]; + digest[7] ^= B7 ^ M[7]; + } + } + +/* +* Copy out the digest +*/ +void Whirlpool::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; j += 8) + store_be(digest[j/8], output + j); + } + +/* +* Clear memory of sensitive data +*/ +void Whirlpool::clear() throw() + { + MDx_HashFunction::clear(); + M.clear(); + digest.clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/hash/whirlpool/whrlpool.h b/src/libs/3rdparty/botan/src/hash/whirlpool/whrlpool.h new file mode 100644 index 00000000000..b72ff609f6b --- /dev/null +++ b/src/libs/3rdparty/botan/src/hash/whirlpool/whrlpool.h @@ -0,0 +1,42 @@ +/* +* Whirlpool +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_WHIRLPOOL_H__ +#define BOTAN_WHIRLPOOL_H__ + +#include + +namespace Botan { + +/* +* Whirlpool +*/ +class BOTAN_DLL Whirlpool : public MDx_HashFunction + { + public: + void clear() throw(); + std::string name() const { return "Whirlpool"; } + HashFunction* clone() const { return new Whirlpool; } + Whirlpool() : MDx_HashFunction(64, 64, true, true, 32) { clear(); } + private: + void compress_n(const byte[], u32bit blocks); + void copy_out(byte[]); + + static const u64bit C0[256]; + static const u64bit C1[256]; + static const u64bit C2[256]; + static const u64bit C3[256]; + static const u64bit C4[256]; + static const u64bit C5[256]; + static const u64bit C6[256]; + static const u64bit C7[256]; + SecureBuffer M, digest; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/kdf/info.txt b/src/libs/3rdparty/botan/src/kdf/info.txt new file mode 100644 index 00000000000..1965a209878 --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/info.txt @@ -0,0 +1,14 @@ +realname "KDF Base Class" + +define KDF_BASE + +load_on auto + + +kdf.cpp +kdf.h + + + +alloc + diff --git a/src/libs/3rdparty/botan/src/kdf/kdf.cpp b/src/libs/3rdparty/botan/src/kdf/kdf.cpp new file mode 100644 index 00000000000..4be8475dfc8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/kdf.cpp @@ -0,0 +1,68 @@ +/* +* KDF Base Class +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Derive a key +*/ +SecureVector KDF::derive_key(u32bit key_len, + const MemoryRegion& secret, + const std::string& salt) const + { + return derive_key(key_len, secret, secret.size(), + reinterpret_cast(salt.data()), + salt.length()); + } + +/* +* Derive a key +*/ +SecureVector KDF::derive_key(u32bit key_len, + const MemoryRegion& secret, + const byte salt[], u32bit salt_len) const + { + return derive_key(key_len, secret.begin(), secret.size(), + salt, salt_len); + } + +/* +* Derive a key +*/ +SecureVector KDF::derive_key(u32bit key_len, + const MemoryRegion& secret, + const MemoryRegion& salt) const + { + return derive_key(key_len, secret.begin(), secret.size(), + salt.begin(), salt.size()); + } + +/* +* Derive a key +*/ +SecureVector KDF::derive_key(u32bit key_len, + const byte secret[], u32bit secret_len, + const std::string& salt) const + { + return derive_key(key_len, secret, secret_len, + reinterpret_cast(salt.data()), + salt.length()); + } + +/* +* Derive a key +*/ +SecureVector KDF::derive_key(u32bit key_len, + const byte secret[], u32bit secret_len, + const byte salt[], u32bit salt_len) const + { + return derive(key_len, secret, secret_len, salt, salt_len); + } + +} diff --git a/src/libs/3rdparty/botan/src/kdf/kdf.h b/src/libs/3rdparty/botan/src/kdf/kdf.h new file mode 100644 index 00000000000..70f636b6cb0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/kdf.h @@ -0,0 +1,60 @@ +/* +* KDF/MGF +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_KDF_BASE_H__ +#define BOTAN_KDF_BASE_H__ + +#include +#include + +namespace Botan { + +/* +* Key Derivation Function +*/ +class BOTAN_DLL KDF + { + public: + SecureVector derive_key(u32bit key_len, + const MemoryRegion& secret, + const std::string& salt = "") const; + SecureVector derive_key(u32bit key_len, + const MemoryRegion& secret, + const MemoryRegion& salt) const; + + SecureVector derive_key(u32bit key_len, + const MemoryRegion& secret, + const byte salt[], u32bit salt_len) const; + + SecureVector derive_key(u32bit key_len, + const byte secret[], u32bit secret_len, + const std::string& salt = "") const; + SecureVector derive_key(u32bit key_len, + const byte secret[], u32bit secret_len, + const byte salt[], u32bit salt_len) const; + + virtual ~KDF() {} + private: + virtual SecureVector derive(u32bit, const byte[], u32bit, + const byte[], u32bit) const = 0; + }; + +/* +* Mask Generation Function +*/ +class BOTAN_DLL MGF + { + public: + virtual void mask(const byte in[], u32bit in_len, + byte out[], u32bit out_len) const = 0; + + virtual ~MGF() {} + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/kdf/kdf1/info.txt b/src/libs/3rdparty/botan/src/kdf/kdf1/info.txt new file mode 100644 index 00000000000..ede10017e94 --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/kdf1/info.txt @@ -0,0 +1,14 @@ +realname "KDF1" + +define KDF1 + +load_on auto + + +kdf1.h +kdf1.cpp + + + +hash + diff --git a/src/libs/3rdparty/botan/src/kdf/kdf1/kdf1.cpp b/src/libs/3rdparty/botan/src/kdf/kdf1/kdf1.cpp new file mode 100644 index 00000000000..539d9ed500d --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/kdf1/kdf1.cpp @@ -0,0 +1,24 @@ +/* +* KDF1 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* KDF1 Key Derivation Mechanism +*/ +SecureVector KDF1::derive(u32bit, + const byte secret[], u32bit secret_len, + const byte P[], u32bit P_len) const + { + hash->update(secret, secret_len); + hash->update(P, P_len); + return hash->final(); + } + +} diff --git a/src/libs/3rdparty/botan/src/kdf/kdf1/kdf1.h b/src/libs/3rdparty/botan/src/kdf/kdf1/kdf1.h new file mode 100644 index 00000000000..d657cccc2a6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/kdf1/kdf1.h @@ -0,0 +1,36 @@ +/* +* KDF1 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_KDF1_H__ +#define BOTAN_KDF1_H__ + +#include +#include + +namespace Botan { + +/* +* KDF1 +*/ +class BOTAN_DLL KDF1 : public KDF + { + public: + SecureVector derive(u32bit, + const byte secret[], u32bit secret_len, + const byte P[], u32bit P_len) const; + + KDF1(HashFunction* h) : hash(h) {} + KDF1(const KDF1& other) : KDF(), hash(other.hash->clone()) {} + + ~KDF1() { delete hash; } + private: + HashFunction* hash; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/kdf/kdf2/info.txt b/src/libs/3rdparty/botan/src/kdf/kdf2/info.txt new file mode 100644 index 00000000000..1858f89290a --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/kdf2/info.txt @@ -0,0 +1,14 @@ +realname "KDF2" + +define KDF2 + +load_on auto + + +kdf2.cpp +kdf2.h + + + +hash + diff --git a/src/libs/3rdparty/botan/src/kdf/kdf2/kdf2.cpp b/src/libs/3rdparty/botan/src/kdf/kdf2/kdf2.cpp new file mode 100644 index 00000000000..167f64436fc --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/kdf2/kdf2.cpp @@ -0,0 +1,41 @@ +/* +* KDF2 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* KDF2 Key Derivation Mechanism +*/ +SecureVector KDF2::derive(u32bit out_len, + const byte secret[], u32bit secret_len, + const byte P[], u32bit P_len) const + { + SecureVector output; + u32bit counter = 1; + + while(out_len && counter) + { + hash->update(secret, secret_len); + for(u32bit j = 0; j != 4; ++j) + hash->update(get_byte(j, counter)); + hash->update(P, P_len); + SecureVector hash_result = hash->final(); + + u32bit added = std::min(hash_result.size(), out_len); + output.append(hash_result, added); + out_len -= added; + + ++counter; + } + + return output; + } + +} diff --git a/src/libs/3rdparty/botan/src/kdf/kdf2/kdf2.h b/src/libs/3rdparty/botan/src/kdf/kdf2/kdf2.h new file mode 100644 index 00000000000..f748bed0f37 --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/kdf2/kdf2.h @@ -0,0 +1,34 @@ +/* +* KDF2 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_KDF2_H__ +#define BOTAN_KDF2_H__ + +#include +#include + +namespace Botan { + +/* +* KDF2 +*/ +class BOTAN_DLL KDF2 : public KDF + { + public: + SecureVector derive(u32bit, const byte[], u32bit, + const byte[], u32bit) const; + + KDF2(HashFunction* h) : hash(h) {} + KDF2(const KDF2& other) : KDF(), hash(other.hash->clone()) {} + ~KDF2() { delete hash; } + private: + HashFunction* hash; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/kdf/mgf1/info.txt b/src/libs/3rdparty/botan/src/kdf/mgf1/info.txt new file mode 100644 index 00000000000..f9e952f82fe --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/mgf1/info.txt @@ -0,0 +1,14 @@ +realname "MGF1" + +define MGF1 + +load_on dep + + +mgf1.h +mgf1.cpp + + + +hash + diff --git a/src/libs/3rdparty/botan/src/kdf/mgf1/mgf1.cpp b/src/libs/3rdparty/botan/src/kdf/mgf1/mgf1.cpp new file mode 100644 index 00000000000..a26e33a9e2d --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/mgf1/mgf1.cpp @@ -0,0 +1,58 @@ +/* +* MGF1 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* MGF1 Mask Generation Function +*/ +void MGF1::mask(const byte in[], u32bit in_len, byte out[], + u32bit out_len) const + { + u32bit counter = 0; + + while(out_len) + { + hash->update(in, in_len); + for(u32bit j = 0; j != 4; ++j) + hash->update(get_byte(j, counter)); + SecureVector buffer = hash->final(); + + u32bit xored = std::min(buffer.size(), out_len); + xor_buf(out, buffer.begin(), xored); + out += xored; + out_len -= xored; + + ++counter; + } + } + +/* +* MGF1 Constructor +*/ +MGF1::MGF1(HashFunction* h) : hash(h) + { + if(!hash) + throw Invalid_Argument("MGF1 given null hash object"); + } + +/* +* MGF1 Destructor +*/ +MGF1::~MGF1() + { + delete hash; + } + +} diff --git a/src/libs/3rdparty/botan/src/kdf/mgf1/mgf1.h b/src/libs/3rdparty/botan/src/kdf/mgf1/mgf1.h new file mode 100644 index 00000000000..799ba7eed7c --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/mgf1/mgf1.h @@ -0,0 +1,36 @@ +/* +* MGF1 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MGF1_H__ +#define BOTAN_MGF1_H__ + +#include +#include + +namespace Botan { + +/* +* MGF1 (Mask Generation Function) +*/ +class BOTAN_DLL MGF1 : public MGF + { + public: + void mask(const byte[], u32bit, byte[], u32bit) const; + + /** + MGF1 constructor: takes ownership of hash + */ + MGF1(HashFunction* hash); + + ~MGF1(); + private: + HashFunction* hash; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/kdf/ssl_prf/info.txt b/src/libs/3rdparty/botan/src/kdf/ssl_prf/info.txt new file mode 100644 index 00000000000..f862905a2a0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/ssl_prf/info.txt @@ -0,0 +1,16 @@ +realname "SSLv3 PRF" + +define SSL_V3_PRF + +load_on auto + + +prf_ssl3.h +prf_ssl3.cpp + + + +md5 +sha1 +sym_algo + diff --git a/src/libs/3rdparty/botan/src/kdf/ssl_prf/prf_ssl3.cpp b/src/libs/3rdparty/botan/src/kdf/ssl_prf/prf_ssl3.cpp new file mode 100644 index 00000000000..2b67644d21a --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/ssl_prf/prf_ssl3.cpp @@ -0,0 +1,76 @@ +/* +* SSLv3 PRF +* (C) 2004-2006 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Return the next inner hash +*/ +OctetString next_hash(u32bit where, u32bit want, + HashFunction& md5, HashFunction& sha1, + const byte secret[], u32bit secret_len, + const byte seed[], u32bit seed_len) + { + if(want > md5.OUTPUT_LENGTH) + throw Internal_Error("SSL3_PRF:next_hash: want is too big"); + + const byte ASCII_A_CHAR = 0x41; + + for(u32bit j = 0; j != where + 1; j++) + sha1.update(ASCII_A_CHAR + where); + sha1.update(secret, secret_len); + sha1.update(seed, seed_len); + SecureVector sha1_hash = sha1.final(); + + md5.update(secret, secret_len); + md5.update(sha1_hash); + SecureVector md5_hash = md5.final(); + + return OctetString(md5_hash, want); + } + +} + +/* +* SSL3 PRF +*/ +SecureVector SSL3_PRF::derive(u32bit key_len, + const byte secret[], u32bit secret_len, + const byte seed[], u32bit seed_len) const + { + if(key_len > 416) + throw Internal_Error("SSL3_PRF: Requested key length is too large"); + + MD5 md5; + SHA_160 sha1; + + OctetString output; + + int counter = 0; + while(key_len) + { + const u32bit produce = std::min(key_len, md5.OUTPUT_LENGTH); + + output = output + next_hash(counter++, produce, md5, sha1, + secret, secret_len, seed, seed_len); + + key_len -= produce; + } + + return output.bits_of(); + } + +} diff --git a/src/libs/3rdparty/botan/src/kdf/ssl_prf/prf_ssl3.h b/src/libs/3rdparty/botan/src/kdf/ssl_prf/prf_ssl3.h new file mode 100644 index 00000000000..165fc7c3c4e --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/ssl_prf/prf_ssl3.h @@ -0,0 +1,27 @@ +/* +* SSLv3 PRF +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SSLV3_PRF_H__ +#define BOTAN_SSLV3_PRF_H__ + +#include + +namespace Botan { + +/* +* SSL3 PRF +*/ +class BOTAN_DLL SSL3_PRF : public KDF + { + public: + SecureVector derive(u32bit, const byte[], u32bit, + const byte[], u32bit) const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/kdf/tls_prf/info.txt b/src/libs/3rdparty/botan/src/kdf/tls_prf/info.txt new file mode 100644 index 00000000000..f95ef9c24df --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/tls_prf/info.txt @@ -0,0 +1,17 @@ +realname "TLS v1.0 PRF" + +define TLS_V10_PRF + +load_on auto + + +prf_tls.h +prf_tls.cpp + + + +hmac +mac +md5 +sha1 + diff --git a/src/libs/3rdparty/botan/src/kdf/tls_prf/prf_tls.cpp b/src/libs/3rdparty/botan/src/kdf/tls_prf/prf_tls.cpp new file mode 100644 index 00000000000..7c638b994ee --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/tls_prf/prf_tls.cpp @@ -0,0 +1,85 @@ +/* +* TLS PRF +* (C) 2004-2006 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* TLS PRF P_hash function +*/ +SecureVector P_hash(MessageAuthenticationCode* mac, + u32bit len, + const byte secret[], u32bit secret_len, + const byte seed[], u32bit seed_len) + { + SecureVector out; + + mac->set_key(secret, secret_len); + + SecureVector A(seed, seed_len); + while(len) + { + const u32bit this_block_len = std::min(mac->OUTPUT_LENGTH, len); + + A = mac->process(A); + + mac->update(A); + mac->update(seed, seed_len); + SecureVector block = mac->final(); + + out.append(block, this_block_len); + len -= this_block_len; + } + return out; + } + +} + +/* +* TLS PRF Constructor and Destructor +*/ +TLS_PRF::TLS_PRF() + { + hmac_md5 = new HMAC(new MD5); + hmac_sha1 = new HMAC(new SHA_160); + } + +TLS_PRF::~TLS_PRF() + { + delete hmac_md5; + delete hmac_sha1; + } + +/* +* TLS PRF +*/ +SecureVector TLS_PRF::derive(u32bit key_len, + const byte secret[], u32bit secret_len, + const byte seed[], u32bit seed_len) const + { + u32bit S1_len = (secret_len + 1) / 2, + S2_len = (secret_len + 1) / 2; + const byte* S1 = secret; + const byte* S2 = secret + (secret_len - S2_len); + + SecureVector key1, key2; + key1 = P_hash(hmac_md5, key_len, S1, S1_len, seed, seed_len); + key2 = P_hash(hmac_sha1, key_len, S2, S2_len, seed, seed_len); + + xor_buf(key1.begin(), key2.begin(), key2.size()); + + return key1; + } + +} diff --git a/src/libs/3rdparty/botan/src/kdf/tls_prf/prf_tls.h b/src/libs/3rdparty/botan/src/kdf/tls_prf/prf_tls.h new file mode 100644 index 00000000000..d2127958825 --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/tls_prf/prf_tls.h @@ -0,0 +1,34 @@ +/* +* TLS v1.0 PRF +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_TLS_PRF_H__ +#define BOTAN_TLS_PRF_H__ + +#include +#include + +namespace Botan { + +/* +* TLS PRF +*/ +class BOTAN_DLL TLS_PRF : public KDF + { + public: + SecureVector derive(u32bit, const byte[], u32bit, + const byte[], u32bit) const; + + TLS_PRF(); + ~TLS_PRF(); + private: + MessageAuthenticationCode* hmac_md5; + MessageAuthenticationCode* hmac_sha1; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/kdf/x942_prf/info.txt b/src/libs/3rdparty/botan/src/kdf/x942_prf/info.txt new file mode 100644 index 00000000000..295c2cde6bd --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/x942_prf/info.txt @@ -0,0 +1,16 @@ +realname "X942 PRF" + +define X942_PRF + +load_on auto + + +prf_x942.cpp +prf_x942.h + + + +asn1 +oid_lookup +sha1 + diff --git a/src/libs/3rdparty/botan/src/kdf/x942_prf/prf_x942.cpp b/src/libs/3rdparty/botan/src/kdf/x942_prf/prf_x942.cpp new file mode 100644 index 00000000000..d9ee09d2031 --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/x942_prf/prf_x942.cpp @@ -0,0 +1,91 @@ +/* +* X9.42 PRF +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Encode an integer as an OCTET STRING +*/ +MemoryVector encode_x942_int(u32bit n) + { + byte n_buf[4] = { 0 }; + store_be(n, n_buf); + return DER_Encoder().encode(n_buf, 4, OCTET_STRING).get_contents(); + } + +} + +/* +* X9.42 PRF +*/ +SecureVector X942_PRF::derive(u32bit key_len, + const byte secret[], u32bit secret_len, + const byte salt[], u32bit salt_len) const + { + SHA_160 hash; + const OID kek_algo(key_wrap_oid); + + SecureVector key; + u32bit counter = 1; + + while(key.size() != key_len && counter) + { + hash.update(secret, secret_len); + + hash.update( + DER_Encoder().start_cons(SEQUENCE) + + .start_cons(SEQUENCE) + .encode(kek_algo) + .raw_bytes(encode_x942_int(counter)) + .end_cons() + + .encode_if(salt_len != 0, + DER_Encoder() + .start_explicit(0) + .encode(salt, salt_len, OCTET_STRING) + .end_explicit() + ) + + .start_explicit(2) + .raw_bytes(encode_x942_int(8 * key_len)) + .end_explicit() + + .end_cons().get_contents() + ); + + SecureVector digest = hash.final(); + key.append(digest, std::min(digest.size(), key_len - key.size())); + + ++counter; + } + + return key; + } + +/* +* X9.42 Constructor +*/ +X942_PRF::X942_PRF(const std::string& oid) + { + if(OIDS::have_oid(oid)) + key_wrap_oid = OIDS::lookup(oid).as_string(); + else + key_wrap_oid = oid; + } + +} diff --git a/src/libs/3rdparty/botan/src/kdf/x942_prf/prf_x942.h b/src/libs/3rdparty/botan/src/kdf/x942_prf/prf_x942.h new file mode 100644 index 00000000000..f957566b096 --- /dev/null +++ b/src/libs/3rdparty/botan/src/kdf/x942_prf/prf_x942.h @@ -0,0 +1,31 @@ +/* +* X9.42 PRF +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ANSI_X942_PRF_H__ +#define BOTAN_ANSI_X942_PRF_H__ + +#include + +namespace Botan { + +/* +* X9.42 PRF +*/ +class BOTAN_DLL X942_PRF : public KDF + { + public: + SecureVector derive(u32bit, const byte[], u32bit, + const byte[], u32bit) const; + + X942_PRF(const std::string&); + private: + std::string key_wrap_oid; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/libstate/botan.h b/src/libs/3rdparty/botan/src/libstate/botan.h new file mode 100644 index 00000000000..3fa131216e1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/botan.h @@ -0,0 +1,18 @@ +/** +* A vague catch all include file for Botan +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +#include + +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) + #include +#endif diff --git a/src/libs/3rdparty/botan/src/libstate/get_enc.cpp b/src/libs/3rdparty/botan/src/libstate/get_enc.cpp new file mode 100644 index 00000000000..ab4d15896c8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/get_enc.cpp @@ -0,0 +1,238 @@ +/* +* PBKDF/EMSA/EME/KDF/MGF Retrieval +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +#if defined(BOTAN_HAS_PBKDF1) + #include +#endif + +#if defined(BOTAN_HAS_PBKDF2) + #include + #include +#endif + +#if defined(BOTAN_HAS_PGPS2K) + #include +#endif + +#if defined(BOTAN_HAS_MGF1) + #include +#endif + +#if defined(BOTAN_HAS_EMSA1) + #include +#endif + +#if defined(BOTAN_HAS_EMSA1_BSI) + #include +#endif + +#if defined(BOTAN_HAS_EMSA2) + #include +#endif + +#if defined(BOTAN_HAS_EMSA3) + #include +#endif + +#if defined(BOTAN_HAS_EMSA4) + #include +#endif + +#if defined(BOTAN_HAS_EMSA_RAW) + #include +#endif + +#if defined(BOTAN_HAS_EME1) + #include +#endif + +#if defined(BOTAN_HAS_EME_PKCS1v15) + #include +#endif + +#if defined(BOTAN_HAS_KDF1) + #include +#endif + +#if defined(BOTAN_HAS_KDF2) + #include +#endif + +#if defined(BOTAN_HAS_X942_PRF) + #include +#endif + +#if defined(BOTAN_HAS_SSL_V3_PRF) + #include +#endif + +#if defined(BOTAN_HAS_TLS_V10_PRF) + #include +#endif + +namespace Botan { + +/* +* Get a S2K algorithm by name +*/ +S2K* get_s2k(const std::string& algo_spec) + { + SCAN_Name request(algo_spec); + + Algorithm_Factory& af = global_state().algorithm_factory(); + +#if defined(BOTAN_HAS_PBKDF1) + if(request.algo_name() == "PBKDF1" && request.arg_count() == 1) + return new PKCS5_PBKDF1(af.make_hash_function(request.arg(0))); +#endif + +#if defined(BOTAN_HAS_PBKDF2) + if(request.algo_name() == "PBKDF2" && request.arg_count() == 1) + return new PKCS5_PBKDF2(new HMAC(af.make_hash_function(request.arg(0)))); +#endif + +#if defined(BOTAN_HAS_PGPS2K) + if(request.algo_name() == "OpenPGP-S2K" && request.arg_count() == 1) + return new OpenPGP_S2K(af.make_hash_function(request.arg(0))); +#endif + + throw Algorithm_Not_Found(algo_spec); + } + +/* +* Get an EMSA by name +*/ +EMSA* get_emsa(const std::string& algo_spec) + { + SCAN_Name request(algo_spec); + + Algorithm_Factory& af = global_state().algorithm_factory(); + +#if defined(BOTAN_HAS_EMSA_RAW) + if(request.algo_name() == "Raw" && request.arg_count() == 0) + return new EMSA_Raw; +#endif + +#if defined(BOTAN_HAS_EMSA1) + if(request.algo_name() == "EMSA1" && request.arg_count() == 1) + return new EMSA1(af.make_hash_function(request.arg(0))); +#endif + +#if defined(BOTAN_HAS_EMSA1_BSI) + if(request.algo_name() == "EMSA1_BSI" && request.arg_count() == 1) + return new EMSA1_BSI(af.make_hash_function(request.arg(0))); +#endif + +#if defined(BOTAN_HAS_EMSA2) + if(request.algo_name() == "EMSA2" && request.arg_count() == 1) + return new EMSA2(af.make_hash_function(request.arg(0))); +#endif + +#if defined(BOTAN_HAS_EMSA3) + if(request.algo_name() == "EMSA3" && request.arg_count() == 1) + { + if(request.arg(0) == "Raw") + return new EMSA3_Raw; + return new EMSA3(af.make_hash_function(request.arg(0))); + } +#endif + +#if defined(BOTAN_HAS_EMSA4) + if(request.algo_name() == "EMSA4" && request.arg_count_between(1, 3)) + { + // 3 args: Hash, MGF, salt size (MGF is hardcoded MGF1 in Botan) + if(request.arg_count() == 1) + return new EMSA4(af.make_hash_function(request.arg(0))); + + if(request.arg_count() == 2 && request.arg(1) != "MGF1") + return new EMSA4(af.make_hash_function(request.arg(0))); + + if(request.arg_count() == 3) + return new EMSA4(af.make_hash_function(request.arg(0)), + request.arg_as_u32bit(2, 0)); + } +#endif + + throw Algorithm_Not_Found(algo_spec); + } + +/* +* Get an EME by name +*/ +EME* get_eme(const std::string& algo_spec) + { + SCAN_Name request(algo_spec); + + Algorithm_Factory& af = global_state().algorithm_factory(); + + if(request.algo_name() == "Raw") + return 0; // No padding + +#if defined(BOTAN_HAS_EME_PKCS1v15) + if(request.algo_name() == "PKCS1v15" && request.arg_count() == 0) + return new EME_PKCS1v15; +#endif + +#if defined(BOTAN_HAS_EME1) + if(request.algo_name() == "EME1" && request.arg_count_between(1, 2)) + { + if(request.arg_count() == 1 || + (request.arg_count() == 2 && request.arg(1) == "MGF1")) + { + return new EME1(af.make_hash_function(request.arg(0))); + } + } +#endif + + throw Algorithm_Not_Found(algo_spec); + } + +/* +* Get an KDF by name +*/ +KDF* get_kdf(const std::string& algo_spec) + { + SCAN_Name request(algo_spec); + + Algorithm_Factory& af = global_state().algorithm_factory(); + + if(request.algo_name() == "Raw") + return 0; // No KDF + +#if defined(BOTAN_HAS_KDF1) + if(request.algo_name() == "KDF1" && request.arg_count() == 1) + return new KDF1(af.make_hash_function(request.arg(0))); +#endif + +#if defined(BOTAN_HAS_KDF2) + if(request.algo_name() == "KDF2" && request.arg_count() == 1) + return new KDF2(af.make_hash_function(request.arg(0))); +#endif + +#if defined(BOTAN_HAS_X942_PRF) + if(request.algo_name() == "X9.42-PRF" && request.arg_count() == 1) + return new X942_PRF(request.arg(0)); // OID +#endif + +#if defined(BOTAN_HAS_TLS_V10_PRF) + if(request.algo_name() == "TLS-PRF" && request.arg_count() == 0) + return new TLS_PRF; +#endif + +#if defined(BOTAN_HAS_SSL_V3_PRF) + if(request.algo_name() == "SSL3-PRF" && request.arg_count() == 0) + return new SSL3_PRF; +#endif + + throw Algorithm_Not_Found(algo_spec); + } + +} diff --git a/src/libs/3rdparty/botan/src/libstate/info.txt b/src/libs/3rdparty/botan/src/libstate/info.txt new file mode 100644 index 00000000000..6eaa2f70bce --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/info.txt @@ -0,0 +1,45 @@ +realname "Botan Libstate Module" + +load_on always + +define LIBSTATE_MODULE + + +botan.h +get_enc.cpp +init.cpp +init.h +libstate.cpp +libstate.h +look_pk.cpp +look_pk.h +lookup.cpp +lookup.h +pk_engine.cpp +pk_engine.h +policy.cpp +scan_name.cpp +scan_name.h + + + +algo_factory +alloc +bigint +block +def_engine +engine +filters +hash +kdf +mac +mode_pad +mutex +noop_mutex +pk_pad +pubkey +rng +s2k +stream +system_alloc + diff --git a/src/libs/3rdparty/botan/src/libstate/init.cpp b/src/libs/3rdparty/botan/src/libstate/init.cpp new file mode 100644 index 00000000000..b908de6c790 --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/init.cpp @@ -0,0 +1,75 @@ +/** +* Default Initialization Function +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Library Initialization +*/ +void LibraryInitializer::initialize(const std::string& arg_string) + { + bool thread_safe = false; + + const std::vector arg_list = split_on(arg_string, ' '); + for(u32bit j = 0; j != arg_list.size(); ++j) + { + if(arg_list[j].size() == 0) + continue; + + std::string name, value; + + if(arg_list[j].find('=') == std::string::npos) + { + name = arg_list[j]; + value = "true"; + } + else + { + std::vector name_and_value = split_on(arg_list[j], '='); + name = name_and_value[0]; + value = name_and_value[1]; + } + + bool is_on = + (value == "1" || value == "true" || value == "yes" || value == "on"); + + if(name == "thread_safe") + thread_safe = is_on; + } + + try + { + /* + This two stage initialization process is because Library_State's + constructor will implicitly refer to global state through the + allocators and so for, so global_state() has to be a valid + reference before initialize() can be called. Yeah, gross. + */ + set_global_state(new Library_State); + + global_state().initialize(thread_safe); + } + catch(...) + { + deinitialize(); + throw; + } + } + +/* +* Library Shutdown +*/ +void LibraryInitializer::deinitialize() + { + set_global_state(0); + } + +} diff --git a/src/libs/3rdparty/botan/src/libstate/init.h b/src/libs/3rdparty/botan/src/libstate/init.h new file mode 100644 index 00000000000..254f9458b1f --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/init.h @@ -0,0 +1,41 @@ +/** +* Library Initialization +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_LIBRARY_INITIALIZER_H__ +#define BOTAN_LIBRARY_INITIALIZER_H__ + +#include +#include + +namespace Botan { + +/** +* This class represents the Library Initialization/Shutdown Object. It +* has to exceed the lifetime of any Botan object used in an +* application. You can call initialize/deinitialize or use +* LibraryInitializer in the RAII style. +*/ +class BOTAN_DLL LibraryInitializer + { + public: + static void initialize(const std::string& options = ""); + + static void deinitialize(); + + /** + * Initialize the library + * @param thread_safe if the library should use a thread-safe mutex + */ + LibraryInitializer(const std::string& options = "") + { LibraryInitializer::initialize(options); } + + ~LibraryInitializer() { LibraryInitializer::deinitialize(); } + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/libstate/libstate.cpp b/src/libs/3rdparty/botan/src/libstate/libstate.cpp new file mode 100644 index 00000000000..3275c649330 --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/libstate.cpp @@ -0,0 +1,338 @@ +/* +* Library Internal/Global State +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(BOTAN_HAS_MUTEX_PTHREAD) + #include +#elif defined(BOTAN_HAS_MUTEX_WIN32) + #include +#elif defined(BOTAN_HAS_MUTEX_QT) + #include +#endif + +#if defined(BOTAN_HAS_ALLOC_MMAP) + #include +#endif + +#if defined(BOTAN_HAS_ENGINE_IA32_ASSEMBLER) + #include +#endif + +#if defined(BOTAN_HAS_ENGINE_AMD64_ASSEMBLER) + #include +#endif + +#if defined(BOTAN_HAS_ENGINE_SSE2_ASSEMBLER) + #include +#endif + +#if defined(BOTAN_HAS_ENGINE_GNU_MP) + #include +#endif + +#if defined(BOTAN_HAS_ENGINE_OPENSSL) + #include +#endif + +namespace Botan { + +/* +* Botan's global state +*/ +namespace { + +Library_State* global_lib_state = 0; + +} + +/* +* Access the global state object +*/ +Library_State& global_state() + { + /* Lazy initialization. Botan still needs to be deinitialized later + on or memory might leak. + */ + if(!global_lib_state) + LibraryInitializer::initialize("thread_safe=true"); + + return (*global_lib_state); + } + +/* +* Set a new global state object +*/ +void set_global_state(Library_State* new_state) + { + delete swap_global_state(new_state); + } + +/* +* Swap two global state objects +*/ +Library_State* swap_global_state(Library_State* new_state) + { + Library_State* old_state = global_lib_state; + global_lib_state = new_state; + return old_state; + } + +/* +* Get a new mutex object +*/ +Mutex* Library_State::get_mutex() const + { + return mutex_factory->make(); + } + +/* +* Get an allocator by its name +*/ +Allocator* Library_State::get_allocator(const std::string& type) const + { + Mutex_Holder lock(allocator_lock); + + if(type != "") + return search_map(alloc_factory, type, 0); + + if(!cached_default_allocator) + { + std::string chosen = this->option("base/default_allocator"); + + if(chosen == "") + chosen = "malloc"; + + cached_default_allocator = + search_map(alloc_factory, chosen, 0); + } + + return cached_default_allocator; + } + +/* +* Create a new name to object mapping +*/ +void Library_State::add_allocator(Allocator* allocator) + { + Mutex_Holder lock(allocator_lock); + + allocator->init(); + + allocators.push_back(allocator); + alloc_factory[allocator->type()] = allocator; + } + +/* +* Set the default allocator type +*/ +void Library_State::set_default_allocator(const std::string& type) + { + Mutex_Holder lock(allocator_lock); + + if(type == "") + return; + + this->set("conf", "base/default_allocator", type); + cached_default_allocator = 0; + } + +/* +* Get a configuration value +*/ +std::string Library_State::get(const std::string& section, + const std::string& key) const + { + Mutex_Holder lock(config_lock); + + return search_map(config, + section + "/" + key, ""); + } + +/* +* See if a particular option has been set +*/ +bool Library_State::is_set(const std::string& section, + const std::string& key) const + { + Mutex_Holder lock(config_lock); + + return search_map(config, section + "/" + key, false, true); + } + +/* +* Set a configuration value +*/ +void Library_State::set(const std::string& section, const std::string& key, + const std::string& value, bool overwrite) + { + Mutex_Holder lock(config_lock); + + std::string full_key = section + "/" + key; + + std::map::const_iterator i = + config.find(full_key); + + if(overwrite || i == config.end() || i->second == "") + config[full_key] = value; + } + +/* +* Add an alias +*/ +void Library_State::add_alias(const std::string& key, const std::string& value) + { + set("alias", key, value); + } + +/* +* Dereference an alias to a fixed name +*/ +std::string Library_State::deref_alias(const std::string& key) const + { + std::string result = key; + while(is_set("alias", result)) + result = get("alias", result); + return result; + } + +/* +* Set/Add an option +*/ +void Library_State::set_option(const std::string key, + const std::string& value) + { + set("conf", key, value); + } + +/* +* Get an option value +*/ +std::string Library_State::option(const std::string& key) const + { + return get("conf", key); + } + +/** +Return a reference to the Algorithm_Factory +*/ +Algorithm_Factory& Library_State::algorithm_factory() + { + if(!m_algorithm_factory) + throw Invalid_State("Uninitialized in Library_State::algorithm_factory"); + return *m_algorithm_factory; + } + +/* +* Load a set of modules +*/ +void Library_State::initialize(bool thread_safe) + { + if(mutex_factory) + throw Invalid_State("Library_State has already been initialized"); + + if(!thread_safe) + { + mutex_factory = new Noop_Mutex_Factory; + } + else + { +#if defined(BOTAN_HAS_MUTEX_PTHREAD) + mutex_factory = new Pthread_Mutex_Factory; +#elif defined(BOTAN_HAS_MUTEX_WIN32) + mutex_factory = new Win32_Mutex_Factory; +#elif defined(BOTAN_HAS_MUTEX_QT) + mutex_factory Qt_Mutex_Factory; +#else + throw Invalid_State("Could not find a thread-safe mutex object to use"); +#endif + } + + allocator_lock = mutex_factory->make(); + config_lock = mutex_factory->make(); + + cached_default_allocator = 0; + + add_allocator(new Malloc_Allocator); + add_allocator(new Locking_Allocator(mutex_factory->make())); + +#if defined(BOTAN_HAS_ALLOC_MMAP) + add_allocator(new MemoryMapping_Allocator(mutex_factory->make())); +#endif + + set_default_allocator("locking"); + + load_default_config(); + + std::vector engines; + +#if defined(BOTAN_HAS_ENGINE_GNU_MP) + engines.push_back(new GMP_Engine); +#endif + +#if defined(BOTAN_HAS_ENGINE_OPENSSL) + engines.push_back(new OpenSSL_Engine); +#endif + +#if defined(BOTAN_HAS_ENGINE_SSE2_ASSEMBLER) + engines.push_back(new SSE2_Assembler_Engine); +#endif + +#if defined(BOTAN_HAS_ENGINE_AMD64_ASSEMBLER) + engines.push_back(new AMD64_Assembler_Engine); +#endif + +#if defined(BOTAN_HAS_ENGINE_IA32_ASSEMBLER) + engines.push_back(new IA32_Assembler_Engine); +#endif + + engines.push_back(new Default_Engine); + + m_algorithm_factory = new Algorithm_Factory(engines, *mutex_factory); + } + +/* +* Library_State Constructor +*/ +Library_State::Library_State() + { + mutex_factory = 0; + allocator_lock = config_lock = 0; + cached_default_allocator = 0; + m_algorithm_factory = 0; + } + +/* +* Library_State Destructor +*/ +Library_State::~Library_State() + { + delete m_algorithm_factory; + + cached_default_allocator = 0; + + for(u32bit j = 0; j != allocators.size(); ++j) + { + allocators[j]->destroy(); + delete allocators[j]; + } + + delete allocator_lock; + delete mutex_factory; + delete config_lock; + } + +} diff --git a/src/libs/3rdparty/botan/src/libstate/libstate.h b/src/libs/3rdparty/botan/src/libstate/libstate.h new file mode 100644 index 00000000000..2493863a984 --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/libstate.h @@ -0,0 +1,125 @@ +/* +* Library Internal/Global State +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_LIB_STATE_H__ +#define BOTAN_LIB_STATE_H__ + +#include +#include +#include + +#include +#include +#include + +namespace Botan { + +/* +* Global State Container Base +*/ +class BOTAN_DLL Library_State + { + public: + Library_State(); + ~Library_State(); + + void initialize(bool thread_safe); + + Algorithm_Factory& algorithm_factory(); + + Allocator* get_allocator(const std::string& = "") const; + void add_allocator(Allocator*); + void set_default_allocator(const std::string&); + + /** + * Get a parameter value as std::string. + * @param section the section of the desired key + * @param key the desired keys name + * @result the value of the parameter + */ + std::string get(const std::string& section, + const std::string& key) const; + + /** + * Check whether a certain parameter is set + * or not. + * @param section the section of the desired key + * @param key the desired keys name + * @result true if the parameters value is set, + * false otherwise + */ + bool is_set(const std::string& section, const std::string& key) const; + + /** + * Set a configuration parameter. + * @param section the section of the desired key + * @param key the desired keys name + * @param overwrite if set to true, the parameters value + * will be overwritten even if it is already set, otherwise + * no existing values will be overwritten. + */ + void set(const std::string& section, const std::string& key, + const std::string& value, bool overwrite = true); + + /** + * Get a parameters value out of the "conf" section ( + * referred to as option). + * @param key the desired keys name + */ + std::string option(const std::string& key) const; + + /** + * Set an option. + * @param key the key of the option to set + * @param value the value to set + */ + void set_option(const std::string key, const std::string& value); + + /** + * Add a parameter value to the "alias" section. + * @param key the name of the parameter which shall have a new alias + * @param value the new alias + */ + void add_alias(const std::string&, const std::string&); + + /** + * Resolve an alias. + * @param alias the alias to resolve. + * @return what the alias stands for + */ + std::string deref_alias(const std::string&) const; + + class Mutex* get_mutex() const; + private: + void load_default_config(); + + Library_State(const Library_State&) {} + Library_State& operator=(const Library_State&) { return (*this); } + + class Mutex_Factory* mutex_factory; + + std::map config; + class Mutex* config_lock; + + class Mutex* allocator_lock; + std::map alloc_factory; + mutable Allocator* cached_default_allocator; + std::vector allocators; + + Algorithm_Factory* m_algorithm_factory; + }; + +/* +* Global State +*/ +BOTAN_DLL Library_State& global_state(); +BOTAN_DLL void set_global_state(Library_State*); +BOTAN_DLL Library_State* swap_global_state(Library_State*); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/libstate/look_pk.cpp b/src/libs/3rdparty/botan/src/libstate/look_pk.cpp new file mode 100644 index 00000000000..8eb47385803 --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/look_pk.cpp @@ -0,0 +1,76 @@ +/* +* PK Algorithm Lookup +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Get a PK_Encryptor object +*/ +PK_Encryptor* get_pk_encryptor(const PK_Encrypting_Key& key, + const std::string& eme) + { + return new PK_Encryptor_MR_with_EME(key, get_eme(eme)); + } + +/* +* Get a PK_Decryptor object +*/ +PK_Decryptor* get_pk_decryptor(const PK_Decrypting_Key& key, + const std::string& eme) + { + return new PK_Decryptor_MR_with_EME(key, get_eme(eme)); + } + +/* +* Get a PK_Signer object +*/ +PK_Signer* get_pk_signer(const PK_Signing_Key& key, + const std::string& emsa, + Signature_Format sig_format) + { + PK_Signer* signer = new PK_Signer(key, get_emsa(emsa)); + signer->set_output_format(sig_format); + return signer; + } + +/* +* Get a PK_Verifier object +*/ +PK_Verifier* get_pk_verifier(const PK_Verifying_with_MR_Key& key, + const std::string& emsa, + Signature_Format sig_format) + { + PK_Verifier* verifier = new PK_Verifier_with_MR(key, get_emsa(emsa)); + verifier->set_input_format(sig_format); + return verifier; + } + +/* +* Get a PK_Verifier object +*/ +PK_Verifier* get_pk_verifier(const PK_Verifying_wo_MR_Key& key, + const std::string& emsa, + Signature_Format sig_format) + { + PK_Verifier* verifier = new PK_Verifier_wo_MR(key, get_emsa(emsa)); + verifier->set_input_format(sig_format); + return verifier; + } + +/* +* Get a PK_Key_Agreement object +*/ +PK_Key_Agreement* get_pk_kas(const PK_Key_Agreement_Key& key, + const std::string& kdf) + { + return new PK_Key_Agreement(key, get_kdf(kdf)); + } + +} diff --git a/src/libs/3rdparty/botan/src/libstate/look_pk.h b/src/libs/3rdparty/botan/src/libstate/look_pk.h new file mode 100644 index 00000000000..27b67dc5be2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/look_pk.h @@ -0,0 +1,78 @@ +/* +* PK Algorithm Lookup +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PK_LOOKUP_H__ +#define BOTAN_PK_LOOKUP_H__ + +#include +#include + +namespace Botan { + +/** +* Public key encryptor factory method. +* @param key the key that will work inside the encryptor +* @param pad determines the algorithm and encoding +* @return the public key encryptor object +*/ +BOTAN_DLL PK_Encryptor* get_pk_encryptor(const PK_Encrypting_Key& key, + const std::string& pad); + +/** +* Public key decryptor factory method. +* @param key the key that will work inside the decryptor +* @param pad determines the algorithm and encoding +* @return the public key decryptor object +*/ +BOTAN_DLL PK_Decryptor* get_pk_decryptor(const PK_Decrypting_Key& key, + const std::string& pad); + +/** +* Public key signer factory method. +* @param key the key that will work inside the signer +* @param pad determines the algorithm, encoding and hash algorithm +* @param sig_format the signature format to be used +* @return the public key signer object +*/ +BOTAN_DLL PK_Signer* get_pk_signer(const PK_Signing_Key& key, + const std::string& pad, + Signature_Format = IEEE_1363); + +/** +* Public key verifier factory method. +* @param key the key that will work inside the verifier +* @param pad determines the algorithm, encoding and hash algorithm +* @param sig_format the signature format to be used +* @return the public key verifier object +*/ +BOTAN_DLL PK_Verifier* get_pk_verifier(const PK_Verifying_with_MR_Key& key, + const std::string& pad, + Signature_Format = IEEE_1363); + +/** +* Public key verifier factory method. +* @param key the key that will work inside the verifier +* @param pad determines the algorithm, encoding and hash algorithm +* @param sig_form the signature format to be used +* @return the public key verifier object +*/ +BOTAN_DLL PK_Verifier* get_pk_verifier(const PK_Verifying_wo_MR_Key& key, + const std::string& pad, + Signature_Format sig_form = IEEE_1363); + +/** +* Public key key agreement factory method. +* @param key the key that will work inside the key agreement +* @param pad determines the algorithm, encoding and hash algorithm +* @return the public key verifier object +*/ +BOTAN_DLL PK_Key_Agreement* get_pk_kas(const PK_Key_Agreement_Key& key, + const std::string& pad); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/libstate/lookup.cpp b/src/libs/3rdparty/botan/src/libstate/lookup.cpp new file mode 100644 index 00000000000..3b49116f6ce --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/lookup.cpp @@ -0,0 +1,296 @@ +/* +* Algorithm Retrieval +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/** +* Acquire a block cipher +*/ +const BlockCipher* retrieve_block_cipher(const std::string& algo_spec) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + return af.prototype_block_cipher(algo_spec); + } + +/** +* Get a block cipher by name +*/ +BlockCipher* get_block_cipher(const std::string& algo_spec) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + return af.make_block_cipher(algo_spec); + } + +/** +* Acquire a stream cipher +*/ +const StreamCipher* retrieve_stream_cipher(const std::string& algo_spec) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + return af.prototype_stream_cipher(algo_spec); + } + +/** +* Get a stream cipher by name +*/ +StreamCipher* get_stream_cipher(const std::string& algo_spec) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + return af.make_stream_cipher(algo_spec); + } + +/** +* Acquire a hash function +*/ +const HashFunction* retrieve_hash(const std::string& algo_spec) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + return af.prototype_hash_function(algo_spec); + } + +/** +* Get a hash function by name +*/ +HashFunction* get_hash(const std::string& algo_spec) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + return af.make_hash_function(algo_spec); + } + +/** +* Query if Botan has the named hash function +*/ +bool have_hash(const std::string& algo_spec) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + return af.prototype_hash_function(algo_spec); + } + +/** +* Acquire an authentication code +*/ +const MessageAuthenticationCode* retrieve_mac(const std::string& algo_spec) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + return af.prototype_mac(algo_spec); + } + +/** +* Get a MAC by name +*/ +MessageAuthenticationCode* get_mac(const std::string& algo_spec) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + return af.make_mac(algo_spec); + } + +/** +* Query if Botan has the named MAC +*/ +bool have_mac(const std::string& algo_spec) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + return af.prototype_mac(algo_spec); + } + +/** +* Query if an algorithm exists +*/ +bool have_algorithm(const std::string& name) + { + if(retrieve_block_cipher(name)) + return true; + if(retrieve_stream_cipher(name)) + return true; + if(retrieve_hash(name)) + return true; + if(retrieve_mac(name)) + return true; + return false; + } + +/** +* Query if Botan has the named block cipher +*/ +bool have_block_cipher(const std::string& name) + { + return (retrieve_block_cipher(name) != 0); + } + +/** +* Query if Botan has the named stream cipher +*/ +bool have_stream_cipher(const std::string& name) + { + return (retrieve_stream_cipher(name) != 0); + } + +/** +* Query the block size of a cipher or hash +*/ +u32bit block_size_of(const std::string& name) + { + const BlockCipher* cipher = retrieve_block_cipher(name); + if(cipher) + return cipher->BLOCK_SIZE; + + const HashFunction* hash = retrieve_hash(name); + if(hash) + return hash->HASH_BLOCK_SIZE; + + throw Algorithm_Not_Found(name); + } + +/** +* Query the OUTPUT_LENGTH of a hash or MAC +*/ +u32bit output_length_of(const std::string& name) + { + const HashFunction* hash = retrieve_hash(name); + if(hash) + return hash->OUTPUT_LENGTH; + + const MessageAuthenticationCode* mac = retrieve_mac(name); + if(mac) + return mac->OUTPUT_LENGTH; + + throw Algorithm_Not_Found(name); + } + +/** +* Check if a keylength is valid for this algo +*/ +bool valid_keylength_for(u32bit key_len, const std::string& name) + { + const BlockCipher* bc = retrieve_block_cipher(name); + if(bc) + return bc->valid_keylength(key_len); + + const StreamCipher* sc = retrieve_stream_cipher(name); + if(sc) + return sc->valid_keylength(key_len); + + const MessageAuthenticationCode* mac = retrieve_mac(name); + if(mac) + return mac->valid_keylength(key_len); + + throw Algorithm_Not_Found(name); + } + +/** +* Query the MINIMUM_KEYLENGTH of an algorithm +*/ +u32bit min_keylength_of(const std::string& name) + { + const BlockCipher* bc = retrieve_block_cipher(name); + if(bc) + return bc->MINIMUM_KEYLENGTH; + + const StreamCipher* sc = retrieve_stream_cipher(name); + if(sc) + return sc->MINIMUM_KEYLENGTH; + + const MessageAuthenticationCode* mac = retrieve_mac(name); + if(mac) + return mac->MINIMUM_KEYLENGTH; + + throw Algorithm_Not_Found(name); + } + +/** +* Query the MAXIMUM_KEYLENGTH of an algorithm +*/ +u32bit max_keylength_of(const std::string& name) + { + const BlockCipher* bc = retrieve_block_cipher(name); + if(bc) + return bc->MAXIMUM_KEYLENGTH; + + const StreamCipher* sc = retrieve_stream_cipher(name); + if(sc) + return sc->MAXIMUM_KEYLENGTH; + + const MessageAuthenticationCode* mac = retrieve_mac(name); + if(mac) + return mac->MAXIMUM_KEYLENGTH; + + throw Algorithm_Not_Found(name); + } + +/** +* Query the KEYLENGTH_MULTIPLE of an algorithm +*/ +u32bit keylength_multiple_of(const std::string& name) + { + const BlockCipher* bc = retrieve_block_cipher(name); + if(bc) + return bc->KEYLENGTH_MULTIPLE; + + const StreamCipher* sc = retrieve_stream_cipher(name); + if(sc) + return sc->KEYLENGTH_MULTIPLE; + + const MessageAuthenticationCode* mac = retrieve_mac(name); + if(mac) + return mac->KEYLENGTH_MULTIPLE; + + throw Algorithm_Not_Found(name); + } + +/** +* Get a cipher object +*/ +Keyed_Filter* get_cipher(const std::string& algo_spec, + Cipher_Dir direction) + { + Algorithm_Factory& af = global_state().algorithm_factory(); + + Algorithm_Factory::Engine_Iterator i(af); + + while(Engine* engine = i.next()) + { + Keyed_Filter* algo = engine->get_cipher(algo_spec, direction, af); + if(algo) + return algo; + } + + throw Algorithm_Not_Found(algo_spec); + } + +/** +* Get a cipher object +*/ +Keyed_Filter* get_cipher(const std::string& algo_spec, + const SymmetricKey& key, + const InitializationVector& iv, + Cipher_Dir direction) + { + Keyed_Filter* cipher = get_cipher(algo_spec, direction); + cipher->set_key(key); + + if(iv.length()) + cipher->set_iv(iv); + + return cipher; + } + +/** +* Get a cipher object +*/ +Keyed_Filter* get_cipher(const std::string& algo_spec, + const SymmetricKey& key, + Cipher_Dir direction) + { + return get_cipher(algo_spec, + key, InitializationVector(), direction); + } + +} diff --git a/src/libs/3rdparty/botan/src/libstate/lookup.h b/src/libs/3rdparty/botan/src/libstate/lookup.h new file mode 100644 index 00000000000..0f48dddfb22 --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/lookup.h @@ -0,0 +1,239 @@ +/* +* Algorithm Lookup +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_LOOKUP_H__ +#define BOTAN_LOOKUP_H__ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Retrieve an object from the lookup table +*/ +// NOTE: these functions return internally stored objects, library +// retains ownership + +BOTAN_DLL const BlockCipher* +retrieve_block_cipher(const std::string&); + +BOTAN_DLL const StreamCipher* +retrieve_stream_cipher(const std::string&); + +BOTAN_DLL const HashFunction* +retrieve_hash(const std::string&); + +BOTAN_DLL const MessageAuthenticationCode* +retrieve_mac(const std::string&); + +/* +* Get an algorithm object +*/ +// NOTE: these functions create and return new objects, letting the +// caller assume ownership of them + +/** +* Block cipher factory method. +* @param algo_spec the name of the desired block cipher +* @return a pointer to the block cipher object +*/ +BOTAN_DLL BlockCipher* get_block_cipher(const std::string& name); + + +/** +* Stream cipher factory method. +* @param algo_spec the name of the desired stream cipher +* @return a pointer to the stream cipher object +*/ +BOTAN_DLL StreamCipher* get_stream_cipher(const std::string& name); + +/** +* Hash function factory method. +* @param algo_spec the name of the desired hash function +* @return a pointer to the hash function object +*/ +BOTAN_DLL HashFunction* get_hash(const std::string& name); + +/** +* MAC factory method. +* @param algo_spec the name of the desired MAC +* @return a pointer to the MAC object +*/ +BOTAN_DLL MessageAuthenticationCode* get_mac(const std::string& name); + +/** +* String to key algorithm factory method. +* @param name the name of the desired string to key (S2K) algorithm +* @return a pointer to the string to key algorithm object +*/ +BOTAN_DLL S2K* get_s2k(const std::string& name); + +/* +* Get an EMSA/EME/KDF/MGF function +*/ +// NOTE: these functions create and return new objects, letting the +// caller assume ownership of them + +/** +* Factory method for EME (message-encoding methods for encryption) objects +* @param name the name of the EME to create +* @return a pointer to the desired EME object +*/ +BOTAN_DLL EME* get_eme(const std::string& name); + +/** +* Factory method for EMSA (message-encoding methods for signatures +* with appendix) objects +* @param name the name of the EME to create +* @return a pointer to the desired EME object +*/ +BOTAN_DLL EMSA* get_emsa(const std::string& name); + +/** +* Factory method for KDF (key derivation function) +* @param name the name of the KDF to create +* @return a pointer to the desired KDF object +*/ +BOTAN_DLL KDF* get_kdf(const std::string& name); + +/* +* Get a cipher object +*/ + +/** +* Factory method for general symmetric cipher filters. +* @param algo_spec the name of the desired cipher +* @param key the key to be used for encryption/decryption performed by +* the filter +* @param iv the initialization vector to be used +* @param direction determines whether the filter will be an encrypting or decrypting +* filter +* @return a pointer to the encryption or decryption filter +*/ +BOTAN_DLL Keyed_Filter* get_cipher(const std::string& name, + const SymmetricKey& key, + const InitializationVector& iv, + Cipher_Dir dir); +/** +* Factory method for general symmetric cipher filters. +* @param algo_spec the name of the desired cipher +* @param key the key to be used for encryption/decryption performed by +* the filter +* @param direction determines whether the filter will be an encrypting or decrypting +* filter +* @return a pointer to the encryption or decryption filter +*/ +BOTAN_DLL Keyed_Filter* get_cipher(const std::string& name, + const SymmetricKey& key, + Cipher_Dir dir); + +/** Factory method for general symmetric cipher filters. No key will +* be set in the filter. +* @param algo_spec the name of the desired cipher + +* @param direction determines whether the filter will be an encrypting or +* decrypting filter +* @return a pointer to the encryption or decryption filter +*/ +BOTAN_DLL Keyed_Filter* get_cipher(const std::string& name, Cipher_Dir dir); + +/** +* Check if an algorithm exists. +* @param name the name of the algorithm to check for +* @return true if the algorithm exists, false otherwise +*/ +BOTAN_DLL bool have_algorithm(const std::string& name); + +/** +* Check if a block cipher algorithm exists. +* @param name the name of the algorithm to check for +* @return true if the algorithm exists, false otherwise +*/ +BOTAN_DLL bool have_block_cipher(const std::string& name); + +/** +* Check if a stream cipher algorithm exists. +* @param name the name of the algorithm to check for +* @return true if the algorithm exists, false otherwise +*/ +BOTAN_DLL bool have_stream_cipher(const std::string& name); + +/** +* Check if a hash algorithm exists. +* @param algo_spec the name of the algorithm to check for +* @return true if the algorithm exists, false otherwise +*/ +BOTAN_DLL bool have_hash(const std::string& name); + +/** +* Check if a MAC algorithm exists. +* @param algo_spec the name of the algorithm to check for +* @return true if the algorithm exists, false otherwise +*/ +BOTAN_DLL bool have_mac(const std::string& name); + +/* +* Query information about an algorithm +*/ + +/** +* Find out the block size of a certain symmetric algorithm. +* @param name the name of the algorithm +* @return the block size of the specified algorithm +*/ +BOTAN_DLL u32bit block_size_of(const std::string& name); + +/** +* Find out the output length of a certain symmetric algorithm. +* @param name the name of the algorithm +* @return the output length of the specified algorithm +*/ +BOTAN_DLL u32bit output_length_of(const std::string& name); + +/** +* Find out the whether a certain key length is allowd for a given +* symmetric algorithm. +* @param key_len the key length in question +* @param name the name of the algorithm +* @return true if the key length is valid for that algorithm, false otherwise +*/ +BOTAN_DLL bool valid_keylength_for(u32bit keylen, const std::string& name); + +/** +* Find out the minimum key size of a certain symmetric algorithm. +* @param name the name of the algorithm +* @return the minimum key length of the specified algorithm +*/ +BOTAN_DLL u32bit min_keylength_of(const std::string& name); + +/** +* Find out the maximum key size of a certain symmetric algorithm. +* @param name the name of the algorithm +* @return the maximum key length of the specified algorithm +*/ +BOTAN_DLL u32bit max_keylength_of(const std::string& name); + +/** +* Find out the size any valid key is a multiple of for a certain algorithm. +* @param name the name of the algorithm +* @return the size any valid key is a multiple of +*/ +BOTAN_DLL u32bit keylength_multiple_of(const std::string& name); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/libstate/oid_lookup/info.txt b/src/libs/3rdparty/botan/src/libstate/oid_lookup/info.txt new file mode 100644 index 00000000000..609eb919926 --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/oid_lookup/info.txt @@ -0,0 +1,14 @@ +realname "OID Lookup" + +load_on dep + +define OID_LOOKUP + + +oids.cpp +oids.h + + + +asn1 + diff --git a/src/libs/3rdparty/botan/src/libstate/oid_lookup/oids.cpp b/src/libs/3rdparty/botan/src/libstate/oid_lookup/oids.cpp new file mode 100644 index 00000000000..232c6336032 --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/oid_lookup/oids.cpp @@ -0,0 +1,76 @@ +/* +* OID Registry +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace OIDS { + +/* +* Register an OID to string mapping +*/ +void add_oid(const OID& oid, const std::string& name) + { + const std::string oid_str = oid.as_string(); + + if(!global_state().is_set("oid2str", oid_str)) + global_state().set("oid2str", oid_str, name); + if(!global_state().is_set("str2oid", name)) + global_state().set("str2oid", name, oid_str); + } + +/* +* Do an OID to string lookup +*/ +std::string lookup(const OID& oid) + { + std::string name = global_state().get("oid2str", oid.as_string()); + if(name == "") + return oid.as_string(); + return name; + } + +/* +* Do a string to OID lookup +*/ +OID lookup(const std::string& name) + { + std::string value = global_state().get("str2oid", name); + if(value != "") + return OID(value); + + try + { + return OID(name); + } + catch(Exception) + { + throw Lookup_Error("No object identifier found for " + name); + } + } + +/* +* Check to see if an OID exists in the table +*/ +bool have_oid(const std::string& name) + { + return global_state().is_set("str2oid", name); + } + +/* +* Check to see if an OID exists in the table +*/ +bool name_of(const OID& oid, const std::string& name) + { + return (oid == lookup(name)); + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/libstate/oid_lookup/oids.h b/src/libs/3rdparty/botan/src/libstate/oid_lookup/oids.h new file mode 100644 index 00000000000..fdfe61f7c6d --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/oid_lookup/oids.h @@ -0,0 +1,58 @@ +/* +* OID Registry +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_OIDS_H__ +#define BOTAN_OIDS_H__ + +#include + +namespace Botan { + +namespace OIDS { + +/** +* Register an OID to string mapping. +* @param oid the oid to register +* @param name the name to be associated with the oid +*/ +BOTAN_DLL void add_oid(const OID& oid, const std::string& name); + +/** +* See if an OID exists in the internal table. +* @param oid the oid to check for +* @return true if the oid is registered +*/ +BOTAN_DLL bool have_oid(const std::string& oid); + +/** +* Resolve an OID +* @param oid the OID to look up +* @return the name associated with this OID +*/ +BOTAN_DLL std::string lookup(const OID& oid); + +/** +* Find the OID to a name. The lookup will be performed in the +* general OID section of the configuration. +* @param name the name to resolve +* @return the OID associated with the specified name +*/ +BOTAN_DLL OID lookup(const std::string& name); + +/** +* Tests whether the specified OID stands for the specified name. +* @param oid the OID to check +* @param name the name to check +* @return true if the specified OID stands for the specified name +*/ +BOTAN_DLL bool name_of(const OID& oid, const std::string& name); + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/libstate/pk_engine.cpp b/src/libs/3rdparty/botan/src/libstate/pk_engine.cpp new file mode 100644 index 00000000000..790ddcde4fd --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/pk_engine.cpp @@ -0,0 +1,175 @@ +/* +* PK Engine Lookup +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace Engine_Core { + +#if defined(BOTAN_HAS_IF_PUBLIC_KEY_FAMILY) +/* +* Acquire an IF op +*/ +IF_Operation* if_op(const BigInt& e, const BigInt& n, const BigInt& d, + const BigInt& p, const BigInt& q, const BigInt& d1, + const BigInt& d2, const BigInt& c) + { + Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); + + while(const Engine* engine = i.next()) + { + IF_Operation* op = engine->if_op(e, n, d, p, q, d1, d2, c); + if(op) + return op; + } + + throw Lookup_Error("Engine_Core::if_op: Unable to find a working engine"); + } +#endif + +#if defined(BOTAN_HAS_DSA) +/* +* Acquire a DSA op +*/ +DSA_Operation* dsa_op(const DL_Group& group, const BigInt& y, const BigInt& x) + { + Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); + + while(const Engine* engine = i.next()) + { + DSA_Operation* op = engine->dsa_op(group, y, x); + if(op) + return op; + } + + throw Lookup_Error("Engine_Core::dsa_op: Unable to find a working engine"); + } +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) +/* +* Acquire a NR op +*/ +NR_Operation* nr_op(const DL_Group& group, const BigInt& y, const BigInt& x) + { + Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); + + while(const Engine* engine = i.next()) + { + NR_Operation* op = engine->nr_op(group, y, x); + if(op) + return op; + } + + throw Lookup_Error("Engine_Core::nr_op: Unable to find a working engine"); + } +#endif + +#if defined(BOTAN_HAS_ELGAMAL) +/* +* Acquire an ElGamal op +*/ +ELG_Operation* elg_op(const DL_Group& group, const BigInt& y, const BigInt& x) + { + Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); + + while(const Engine* engine = i.next()) + { + ELG_Operation* op = engine->elg_op(group, y, x); + if(op) + return op; + } + + throw Lookup_Error("Engine_Core::elg_op: Unable to find a working engine"); + } +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) +/* +* Acquire a DH op +*/ +DH_Operation* dh_op(const DL_Group& group, const BigInt& x) + { + Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); + + while(const Engine* engine = i.next()) + { + DH_Operation* op = engine->dh_op(group, x); + if(op) + return op; + } + + throw Lookup_Error("Engine_Core::dh_op: Unable to find a working engine"); + } +#endif + +#if defined(BOTAN_HAS_ECDSA) +/* +* Acquire an ECDSA op +*/ +ECDSA_Operation* ecdsa_op(const EC_Domain_Params& dom_pars, + const BigInt& priv_key, + const PointGFp& pub_key) + { + Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); + + while(const Engine* engine = i.next()) + { + ECDSA_Operation* op = engine->ecdsa_op(dom_pars, priv_key, pub_key); + if(op) + return op; + } + + throw Lookup_Error("Engine_Core::ecdsa_op: Unable to find a working engine"); + } +#endif + +#if defined(BOTAN_HAS_ECKAEG) +/* +* Acquire a ECKAEG op +*/ +ECKAEG_Operation* eckaeg_op(const EC_Domain_Params& dom_pars, + const BigInt& priv_key, + const PointGFp& pub_key) + { + Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); + + while(const Engine* engine = i.next()) + { + ECKAEG_Operation* op = engine->eckaeg_op(dom_pars, priv_key, pub_key); + if(op) + return op; + } + + throw Lookup_Error("Engine_Core::eckaeg_op: Unable to find a working engine"); + } +#endif + +/* +* Acquire a modular exponentiator +*/ +Modular_Exponentiator* mod_exp(const BigInt& n, Power_Mod::Usage_Hints hints) + { + Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); + + while(const Engine* engine = i.next()) + { + Modular_Exponentiator* op = engine->mod_exp(n, hints); + + if(op) + return op; + } + + throw Lookup_Error("Engine_Core::mod_exp: Unable to find a working engine"); + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/libstate/pk_engine.h b/src/libs/3rdparty/botan/src/libstate/pk_engine.h new file mode 100644 index 00000000000..256a47c201b --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/pk_engine.h @@ -0,0 +1,95 @@ +/** +* Engine for PK +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENGINE_PK_LOOKUP_H__ +#define BOTAN_ENGINE_PK_LOOKUP_H__ + +#include +#include + +#if defined(BOTAN_HAS_IF_PUBLIC_KEY_FAMILY) + #include +#endif + +#if defined(BOTAN_HAS_DSA) + #include +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + #include +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + #include +#endif + +#if defined(BOTAN_HAS_ELGAMAL) + #include +#endif + +#if defined(BOTAN_HAS_ECDSA) + #include + #include +#endif + +#if defined(BOTAN_HAS_ECKAEG) + #include + #include +#endif + +namespace Botan { + +class Algorithm_Factory; +class Keyed_Filter; +class Modular_Exponentiator; + +namespace Engine_Core { + +/* +* Get an operation from an Engine +*/ +Modular_Exponentiator* mod_exp(const BigInt&, Power_Mod::Usage_Hints); + +#if defined(BOTAN_HAS_IF_PUBLIC_KEY_FAMILY) +IF_Operation* if_op(const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&); +#endif + +#if defined(BOTAN_HAS_DSA) +DSA_Operation* dsa_op(const DL_Group&, const BigInt&, const BigInt&); +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) +NR_Operation* nr_op(const DL_Group&, const BigInt&, const BigInt&); +#endif + +#if defined(BOTAN_HAS_ELGAMAL) +ELG_Operation* elg_op(const DL_Group&, const BigInt&, const BigInt&); +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) +DH_Operation* dh_op(const DL_Group&, const BigInt&); +#endif + +#if defined(BOTAN_HAS_ECDSA) +ECDSA_Operation* ecdsa_op(const EC_Domain_Params& dom_pars, + const BigInt& priv_key, + const PointGFp& pub_key); +#endif + +#if defined(BOTAN_HAS_ECKAEG) +ECKAEG_Operation* eckaeg_op(const EC_Domain_Params& dom_pars, + const BigInt& priv_key, + const PointGFp& pub_key); +#endif + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/libstate/policy.cpp b/src/libs/3rdparty/botan/src/libstate/policy.cpp new file mode 100644 index 00000000000..dfc1dfc7a2c --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/policy.cpp @@ -0,0 +1,511 @@ +/* +* Default Policy +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +namespace { + +/* +* OID loading helper function +*/ +void add_oid(Library_State& config, + const std::string& oid_str, + const std::string& name) + { + if(!config.is_set("oid2str", oid_str)) + config.set("oid2str", oid_str, name); + if(!config.is_set("str2oid", name)) + config.set("str2oid", name, oid_str); + } + +/* +* Load all of the default OIDs +*/ +void set_default_oids(Library_State& config) + { + /* Public key types */ + add_oid(config, "1.2.840.113549.1.1.1", "RSA"); + add_oid(config, "2.5.8.1.1", "RSA"); // RSA alternate + add_oid(config, "1.2.840.10040.4.1", "DSA"); + add_oid(config, "1.2.840.10046.2.1", "DH"); + add_oid(config, "1.3.6.1.4.1.3029.1.2.1", "ELG"); + add_oid(config, "1.3.6.1.4.1.25258.1.1", "RW"); + add_oid(config, "1.3.6.1.4.1.25258.1.2", "NR"); + add_oid(config, "1.2.840.10045.2.1", "ECDSA"); // X9.62 + + /* Ciphers */ + add_oid(config, "1.3.14.3.2.7", "DES/CBC"); + add_oid(config, "1.2.840.113549.3.7", "TripleDES/CBC"); + add_oid(config, "1.2.840.113549.3.2", "RC2/CBC"); + add_oid(config, "1.2.840.113533.7.66.10", "CAST-128/CBC"); + add_oid(config, "2.16.840.1.101.3.4.1.2", "AES-128/CBC"); + add_oid(config, "2.16.840.1.101.3.4.1.22", "AES-192/CBC"); + add_oid(config, "2.16.840.1.101.3.4.1.42", "AES-256/CBC"); + + /* Hash Functions */ + add_oid(config, "1.2.840.113549.2.5", "MD5"); + add_oid(config, "1.3.6.1.4.1.11591.12.2", "Tiger(24,3)"); + + add_oid(config, "1.3.14.3.2.26", "SHA-160"); + add_oid(config, "2.16.840.1.101.3.4.2.4", "SHA-224"); + add_oid(config, "2.16.840.1.101.3.4.2.1", "SHA-256"); + add_oid(config, "2.16.840.1.101.3.4.2.2", "SHA-384"); + add_oid(config, "2.16.840.1.101.3.4.2.3", "SHA-512"); + + /* Key Wrap */ + add_oid(config, "1.2.840.113549.1.9.16.3.6", "KeyWrap.TripleDES"); + add_oid(config, "1.2.840.113549.1.9.16.3.7", "KeyWrap.RC2"); + add_oid(config, "1.2.840.113533.7.66.15", "KeyWrap.CAST-128"); + add_oid(config, "2.16.840.1.101.3.4.1.5", "KeyWrap.AES-128"); + add_oid(config, "2.16.840.1.101.3.4.1.25", "KeyWrap.AES-192"); + add_oid(config, "2.16.840.1.101.3.4.1.45", "KeyWrap.AES-256"); + + /* Compression */ + add_oid(config, "1.2.840.113549.1.9.16.3.8", "Compression.Zlib"); + + /* Public key signature schemes */ + add_oid(config, "1.2.840.113549.1.1.1", "RSA/EME-PKCS1-v1_5"); + add_oid(config, "1.2.840.113549.1.1.2", "RSA/EMSA3(MD2)"); + add_oid(config, "1.2.840.113549.1.1.4", "RSA/EMSA3(MD5)"); + add_oid(config, "1.2.840.113549.1.1.5", "RSA/EMSA3(SHA-160)"); + add_oid(config, "1.2.840.113549.1.1.11", "RSA/EMSA3(SHA-256)"); + add_oid(config, "1.2.840.113549.1.1.12", "RSA/EMSA3(SHA-384)"); + add_oid(config, "1.2.840.113549.1.1.13", "RSA/EMSA3(SHA-512)"); + add_oid(config, "1.3.36.3.3.1.2", "RSA/EMSA3(RIPEMD-160)"); + + add_oid(config, "1.2.840.10040.4.3", "DSA/EMSA1(SHA-160)"); + add_oid(config, "2.16.840.1.101.3.4.3.1", "DSA/EMSA1(SHA-224)"); + add_oid(config, "2.16.840.1.101.3.4.3.2", "DSA/EMSA1(SHA-256)"); + + add_oid(config, "1.2.840.10045.4.1", "ECDSA/EMSA1_BSI(SHA-160)"); + add_oid(config, "1.2.840.10045.4.3.1", "ECDSA/EMSA1_BSI(SHA-224)"); + add_oid(config, "1.2.840.10045.4.3.2", "ECDSA/EMSA1_BSI(SHA-256)"); + add_oid(config, "1.2.840.10045.4.3.3", "ECDSA/EMSA1_BSI(SHA-384)"); + add_oid(config, "1.2.840.10045.4.3.4", "ECDSA/EMSA1_BSI(SHA-512)"); + + add_oid(config, "1.2.840.10045.4.3.1", "ECDSA/EMSA1(SHA-224)"); + add_oid(config, "1.2.840.10045.4.3.2", "ECDSA/EMSA1(SHA-256)"); + add_oid(config, "1.2.840.10045.4.3.3", "ECDSA/EMSA1(SHA-384)"); + add_oid(config, "1.2.840.10045.4.3.4", "ECDSA/EMSA1(SHA-512)"); + + add_oid(config, "1.3.6.1.4.1.25258.2.1.1.1", "RW/EMSA2(RIPEMD-160)"); + add_oid(config, "1.3.6.1.4.1.25258.2.1.1.2", "RW/EMSA2(SHA-160)"); + add_oid(config, "1.3.6.1.4.1.25258.2.1.1.3", "RW/EMSA2(SHA-224)"); + add_oid(config, "1.3.6.1.4.1.25258.2.1.1.4", "RW/EMSA2(SHA-256)"); + add_oid(config, "1.3.6.1.4.1.25258.2.1.1.5", "RW/EMSA2(SHA-384)"); + add_oid(config, "1.3.6.1.4.1.25258.2.1.1.6", "RW/EMSA2(SHA-512)"); + + add_oid(config, "1.3.6.1.4.1.25258.2.1.2.1", "RW/EMSA4(RIPEMD-160)"); + add_oid(config, "1.3.6.1.4.1.25258.2.1.2.2", "RW/EMSA4(SHA-160)"); + add_oid(config, "1.3.6.1.4.1.25258.2.1.2.3", "RW/EMSA4(SHA-224)"); + add_oid(config, "1.3.6.1.4.1.25258.2.1.2.4", "RW/EMSA4(SHA-256)"); + add_oid(config, "1.3.6.1.4.1.25258.2.1.2.5", "RW/EMSA4(SHA-384)"); + add_oid(config, "1.3.6.1.4.1.25258.2.1.2.6", "RW/EMSA4(SHA-512)"); + + add_oid(config, "1.3.6.1.4.1.25258.2.2.1.1", "NR/EMSA2(RIPEMD-160)"); + add_oid(config, "1.3.6.1.4.1.25258.2.2.1.2", "NR/EMSA2(SHA-160)"); + add_oid(config, "1.3.6.1.4.1.25258.2.2.1.3", "NR/EMSA2(SHA-224)"); + add_oid(config, "1.3.6.1.4.1.25258.2.2.1.4", "NR/EMSA2(SHA-256)"); + add_oid(config, "1.3.6.1.4.1.25258.2.2.1.5", "NR/EMSA2(SHA-384)"); + add_oid(config, "1.3.6.1.4.1.25258.2.2.1.6", "NR/EMSA2(SHA-512)"); + + add_oid(config, "2.5.4.3", "X520.CommonName"); + add_oid(config, "2.5.4.4", "X520.Surname"); + add_oid(config, "2.5.4.5", "X520.SerialNumber"); + add_oid(config, "2.5.4.6", "X520.Country"); + add_oid(config, "2.5.4.7", "X520.Locality"); + add_oid(config, "2.5.4.8", "X520.State"); + add_oid(config, "2.5.4.10", "X520.Organization"); + add_oid(config, "2.5.4.11", "X520.OrganizationalUnit"); + add_oid(config, "2.5.4.12", "X520.Title"); + add_oid(config, "2.5.4.42", "X520.GivenName"); + add_oid(config, "2.5.4.43", "X520.Initials"); + add_oid(config, "2.5.4.44", "X520.GenerationalQualifier"); + add_oid(config, "2.5.4.46", "X520.DNQualifier"); + add_oid(config, "2.5.4.65", "X520.Pseudonym"); + + add_oid(config, "1.2.840.113549.1.5.12", "PKCS5.PBKDF2"); + add_oid(config, "1.2.840.113549.1.5.1", "PBE-PKCS5v15(MD2,DES/CBC)"); + add_oid(config, "1.2.840.113549.1.5.4", "PBE-PKCS5v15(MD2,RC2/CBC)"); + add_oid(config, "1.2.840.113549.1.5.3", "PBE-PKCS5v15(MD5,DES/CBC)"); + add_oid(config, "1.2.840.113549.1.5.6", "PBE-PKCS5v15(MD5,RC2/CBC)"); + add_oid(config, "1.2.840.113549.1.5.10", "PBE-PKCS5v15(SHA-160,DES/CBC)"); + add_oid(config, "1.2.840.113549.1.5.11", "PBE-PKCS5v15(SHA-160,RC2/CBC)"); + add_oid(config, "1.2.840.113549.1.5.13", "PBE-PKCS5v20"); + + add_oid(config, "1.2.840.113549.1.9.1", "PKCS9.EmailAddress"); + add_oid(config, "1.2.840.113549.1.9.2", "PKCS9.UnstructuredName"); + add_oid(config, "1.2.840.113549.1.9.3", "PKCS9.ContentType"); + add_oid(config, "1.2.840.113549.1.9.4", "PKCS9.MessageDigest"); + add_oid(config, "1.2.840.113549.1.9.7", "PKCS9.ChallengePassword"); + add_oid(config, "1.2.840.113549.1.9.14", "PKCS9.ExtensionRequest"); + + add_oid(config, "1.2.840.113549.1.7.1", "CMS.DataContent"); + add_oid(config, "1.2.840.113549.1.7.2", "CMS.SignedData"); + add_oid(config, "1.2.840.113549.1.7.3", "CMS.EnvelopedData"); + add_oid(config, "1.2.840.113549.1.7.5", "CMS.DigestedData"); + add_oid(config, "1.2.840.113549.1.7.6", "CMS.EncryptedData"); + add_oid(config, "1.2.840.113549.1.9.16.1.2", "CMS.AuthenticatedData"); + add_oid(config, "1.2.840.113549.1.9.16.1.9", "CMS.CompressedData"); + + add_oid(config, "2.5.29.14", "X509v3.SubjectKeyIdentifier"); + add_oid(config, "2.5.29.15", "X509v3.KeyUsage"); + add_oid(config, "2.5.29.17", "X509v3.SubjectAlternativeName"); + add_oid(config, "2.5.29.18", "X509v3.IssuerAlternativeName"); + add_oid(config, "2.5.29.19", "X509v3.BasicConstraints"); + add_oid(config, "2.5.29.20", "X509v3.CRLNumber"); + add_oid(config, "2.5.29.21", "X509v3.ReasonCode"); + add_oid(config, "2.5.29.23", "X509v3.HoldInstructionCode"); + add_oid(config, "2.5.29.24", "X509v3.InvalidityDate"); + add_oid(config, "2.5.29.32", "X509v3.CertificatePolicies"); + add_oid(config, "2.5.29.35", "X509v3.AuthorityKeyIdentifier"); + add_oid(config, "2.5.29.36", "X509v3.PolicyConstraints"); + add_oid(config, "2.5.29.37", "X509v3.ExtendedKeyUsage"); + + add_oid(config, "2.5.29.32.0", "X509v3.AnyPolicy"); + + add_oid(config, "1.3.6.1.5.5.7.3.1", "PKIX.ServerAuth"); + add_oid(config, "1.3.6.1.5.5.7.3.2", "PKIX.ClientAuth"); + add_oid(config, "1.3.6.1.5.5.7.3.3", "PKIX.CodeSigning"); + add_oid(config, "1.3.6.1.5.5.7.3.4", "PKIX.EmailProtection"); + add_oid(config, "1.3.6.1.5.5.7.3.5", "PKIX.IPsecEndSystem"); + add_oid(config, "1.3.6.1.5.5.7.3.6", "PKIX.IPsecTunnel"); + add_oid(config, "1.3.6.1.5.5.7.3.7", "PKIX.IPsecUser"); + add_oid(config, "1.3.6.1.5.5.7.3.8", "PKIX.TimeStamping"); + add_oid(config, "1.3.6.1.5.5.7.3.9", "PKIX.OCSPSigning"); + + add_oid(config, "1.3.6.1.5.5.7.8.5", "PKIX.XMPPAddr"); + + /* CVC */ + add_oid(config, "0.4.0.127.0.7.3.1.2.1", + "CertificateHolderAuthorizationTemplate"); + } + +/* +* Set the default algorithm aliases +*/ +void set_default_aliases(Library_State& config) + { + config.add_alias("OpenPGP.Cipher.1", "IDEA"); + config.add_alias("OpenPGP.Cipher.2", "TripleDES"); + config.add_alias("OpenPGP.Cipher.3", "CAST-128"); + config.add_alias("OpenPGP.Cipher.4", "Blowfish"); + config.add_alias("OpenPGP.Cipher.5", "SAFER-SK(13)"); + config.add_alias("OpenPGP.Cipher.7", "AES-128"); + config.add_alias("OpenPGP.Cipher.8", "AES-192"); + config.add_alias("OpenPGP.Cipher.9", "AES-256"); + config.add_alias("OpenPGP.Cipher.10", "Twofish"); + + config.add_alias("OpenPGP.Digest.1", "MD5"); + config.add_alias("OpenPGP.Digest.2", "SHA-1"); + config.add_alias("OpenPGP.Digest.3", "RIPEMD-160"); + config.add_alias("OpenPGP.Digest.5", "MD2"); + config.add_alias("OpenPGP.Digest.6", "Tiger(24,3)"); + config.add_alias("OpenPGP.Digest.8", "SHA-256"); + + config.add_alias("TLS.Digest.0", "Parallel(MD5,SHA-160)"); + + config.add_alias("EME-PKCS1-v1_5", "PKCS1v15"); + config.add_alias("OAEP-MGF1", "EME1"); + config.add_alias("EME-OAEP", "EME1"); + config.add_alias("X9.31", "EMSA2"); + config.add_alias("EMSA-PKCS1-v1_5", "EMSA3"); + config.add_alias("PSS-MGF1", "EMSA4"); + config.add_alias("EMSA-PSS", "EMSA4"); + + config.add_alias("Rijndael", "AES"); + config.add_alias("3DES", "TripleDES"); + config.add_alias("DES-EDE", "TripleDES"); + config.add_alias("CAST5", "CAST-128"); + config.add_alias("SHA1", "SHA-160"); + config.add_alias("SHA-1", "SHA-160"); + config.add_alias("MARK-4", "ARC4(256)"); + config.add_alias("OMAC", "CMAC"); + config.add_alias("GOST", "GOST-28147-89"); + } + +/* +* Set the default configuration toggles +*/ +void set_default_config(Library_State& config) + { + config.set_option("base/default_allocator", "malloc"); + + config.set_option("x509/exts/basic_constraints", "critical"); + config.set_option("x509/exts/subject_key_id", "yes"); + config.set_option("x509/exts/authority_key_id", "yes"); + config.set_option("x509/exts/subject_alternative_name", "yes"); + config.set_option("x509/exts/issuer_alternative_name", "no"); + config.set_option("x509/exts/key_usage", "critical"); + config.set_option("x509/exts/extended_key_usage", "yes"); + config.set_option("x509/exts/crl_number", "yes"); + } + +/* +* Set the built-in discrete log groups +*/ +void set_default_dl_groups(Library_State& config) + { + config.set("dl", "modp/ietf/768", + "-----BEGIN X942 DH PARAMETERS-----" + "MIHIAmEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxObIlFK" + "CHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjo2IP//" + "////////AgECAmB//////////+SH7VEQtGEaYmMxRcBuDmiUgScERTPmOgEF31Md" + "ic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4obp/Catrao4SLyQtq7MS8/Y3omIXTT" + "HRsQf/////////8=" + "-----END X942 DH PARAMETERS-----"); + + config.set("dl", "modp/ietf/1024", + "-----BEGIN X942 DH PARAMETERS-----" + "MIIBCgKBgQD//////////8kP2qIhaMI0xMZii4DcHNEpAk4IimfMdAILvqY7E5si" + "UUoIeY40BN3vlRmzzTpDGzArCm3yXxQ3T+E1bW1RwkXkhbV2Yl5+xvRMQummN+1r" + "C/9ctvQGt+3uOGv7Womfpa6fJBF8Sx/mSShmUezmU4H//////////wIBAgKBgH//" + "////////5IftURC0YRpiYzFFwG4OaJSBJwRFM+Y6AQXfUx2JzZEopQQ8xxoCbvfK" + "jNnmnSGNmBWFNvkvihun8Jq2tqjhIvJC2rsxLz9jeiYhdNMb9rWF/65begNb9vcc" + "Nf2tRM/S10+SCL4lj/MklDMo9nMpwP//////////" + "-----END X942 DH PARAMETERS-----"); + + config.set("dl", "modp/ietf/1536", + "-----BEGIN X942 DH PARAMETERS-----" + "MIIBigKBwQD//////////8kP2qIhaMI0xMZii4DcHNEpAk4IimfMdAILvqY7E5si" + "UUoIeY40BN3vlRmzzTpDGzArCm3yXxQ3T+E1bW1RwkXkhbV2Yl5+xvRMQummN+1r" + "C/9ctvQGt+3uOGv7Womfpa6fJBF8Sx/mSShmUezkWz3CAHy4oWO/BZjaSDYcVdOa" + "aRY/qP0kz1+DZV0j3KOtlhxi81YghVK7ntUpB3CWlm1nDDVOSryYBPF0bAjKI3Mn" + "//////////8CAQICgcB//////////+SH7VEQtGEaYmMxRcBuDmiUgScERTPmOgEF" + "31Mdic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4obp/Catrao4SLyQtq7MS8/Y3om" + "IXTTG/a1hf+uW3oDW/b3HDX9rUTP0tdPkgi+JY/zJJQzKPZyLZ7hAD5cULHfgsxt" + "JBsOKunNNIsf1H6SZ6/Bsq6R7lHWyw4xeasQQqldz2qUg7hLSzazhhqnJV5MAni6" + "NgRlEbmT//////////8=" + "-----END X942 DH PARAMETERS-----"); + + config.set("dl", "modp/ietf/2048", + "-----BEGIN X942 DH PARAMETERS-----" + "MIICDAKCAQEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" + "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" + "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" + "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" + "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" + "5RXSJhiY+gUQFXKOWoqsqmj//////////wIBAgKCAQB//////////+SH7VEQtGEa" + "YmMxRcBuDmiUgScERTPmOgEF31Mdic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4ob" + "p/Catrao4SLyQtq7MS8/Y3omIXTTG/a1hf+uW3oDW/b3HDX9rUTP0tdPkgi+JY/z" + "JJQzKPZyLZ7hAD5cULHfgsxtJBsOKunNNIsf1H6SZ6/Bsq6R7lHWyw4xeasQQqld" + "z2qUg7hLSzazhhqnJV5MAni6NgRlDBC+GUgvIxcbZx3xzzuWDAdDAc2TwdF2A9FH" + "2uKu+DemKWTvFeX7SqwLjBzKpL51SrVyiukTDEx9AogKuUctRVZVNH//////////" + "-----END X942 DH PARAMETERS-----"); + + config.set("dl", "modp/ietf/3072", + "-----BEGIN X942 DH PARAMETERS-----" + "MIIDDAKCAYEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" + "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" + "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" + "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" + "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" + "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" + "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" + "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqTrS" + "yv//////////AgECAoIBgH//////////5IftURC0YRpiYzFFwG4OaJSBJwRFM+Y6" + "AQXfUx2JzZEopQQ8xxoCbvfKjNnmnSGNmBWFNvkvihun8Jq2tqjhIvJC2rsxLz9j" + "eiYhdNMb9rWF/65begNb9vccNf2tRM/S10+SCL4lj/MklDMo9nItnuEAPlxQsd+C" + "zG0kGw4q6c00ix/UfpJnr8GyrpHuUdbLDjF5qxBCqV3PapSDuEtLNrOGGqclXkwC" + "eLo2BGUMEL4ZSC8jFxtnHfHPO5YMB0MBzZPB0XYD0Ufa4q74N6YpZO8V5ftKrAuM" + "HMqkvnVKtXKK6RMMTH0CiAq5Ry1FVWIW1pmLhoIoPRnUKpDV745dMnZ9woIsbfeF" + "RXU4q66DBj7Zy4fC03DyY9X610ZthJnrj0ZKcCUSsM7ncekTDWl3NfiX/QNsxQQy" + "bDsBOZ9kNTIpD5WMC72QBl3wi6u9MK62O4TEYF1so3EEcSfQOnLVmKHtrf5wfohH" + "JcFokFSdaWV//////////w==" + "-----END X942 DH PARAMETERS-----"); + + config.set("dl", "modp/ietf/4096", + "-----BEGIN X942 DH PARAMETERS-----" + "MIIEDAKCAgEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" + "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" + "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" + "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" + "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" + "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" + "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" + "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" + "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" + "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" + "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0BjGZ//////////8CAQICggIA" + "f//////////kh+1RELRhGmJjMUXAbg5olIEnBEUz5joBBd9THYnNkSilBDzHGgJu" + "98qM2eadIY2YFYU2+S+KG6fwmra2qOEi8kLauzEvP2N6JiF00xv2tYX/rlt6A1v2" + "9xw1/a1Ez9LXT5IIviWP8ySUMyj2ci2e4QA+XFCx34LMbSQbDirpzTSLH9R+kmev" + "wbKuke5R1ssOMXmrEEKpXc9qlIO4S0s2s4YapyVeTAJ4ujYEZQwQvhlILyMXG2cd" + "8c87lgwHQwHNk8HRdgPRR9rirvg3pilk7xXl+0qsC4wcyqS+dUq1corpEwxMfQKI" + "CrlHLUVVYhbWmYuGgig9GdQqkNXvjl0ydn3Cgixt94VFdTirroMGPtnLh8LTcPJj" + "1frXRm2EmeuPRkpwJRKwzudx6RMNaXc1+Jf9A2zFBDJsOwE5n2Q1MikPlYwLvZAG" + "XfCLq70wrrY7hMRgXWyjcQRxJ9A6ctWYoe2t/nB+iEclwWiQVJCEAI05HglTw/Nr" + "xDjNCF7dLZNM4ZOMNXpxHg1KNBpbCoXtEsH05RVqJnRt3eFtgm9HfJdHfgoP32VT" + "FD4so6c14C7M2Usn0Ehh0RGd0MMorfP2j7CUuGdxa9fcDe67ELgkDmgDSJPq2C1U" + "ydp1TEbH7uDDf9vuSFNgR6b6GuSaAxjM//////////8=" + "-----END X942 DH PARAMETERS-----"); + + config.set("dl", "modp/ietf/6144", + "-----BEGIN X942 DH PARAMETERS-----" + "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" + "jzbmIBJ//////////wIBAg==" + "-----END X942 DH PARAMETERS-----"); + + config.set("dl", "modp/ietf/8192", + "-----BEGIN X942 DH PARAMETERS-----" + "MIIIDAKCBAEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" + "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" + "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" + "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" + "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" + "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" + "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" + "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" + "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" + "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" + "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" + "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" + "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" + "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" + "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" + "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebb4R" + "WXSjkm8S/uXkOHd8tqky34zYvsTQc7kxujvIMraNndMAdB+nv4r8R+0ldvaTa6Qk" + "ZjqrY5xa5PVoNCO0dCvxyXgjjxbL451lLeP9uL78hIrZIiIuBKQDfAcT61eoGiPw" + "xzRz/GRs6jBrS8vIhi+Dhd36nUt/osCH6HloMwPtW906Bis89bOieKZtKhP4P0T4" + "Ld8xDuB0q2o2RZfomaAlXcFk8xzFCEaFHfmrSBld7X6hsdUQvX7nTXP682vDHs+i" + "aDWQRvTrh5+SQAlDi0gcbNeImgAu1e44K8kZDab8Am5HlVjkR1Z36aqeMFDidlaU" + "38gfVuiAuW5xYMmA3Zjt09///////////wKCBAB//////////+SH7VEQtGEaYmMx" + "RcBuDmiUgScERTPmOgEF31Mdic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4obp/Ca" + "trao4SLyQtq7MS8/Y3omIXTTG/a1hf+uW3oDW/b3HDX9rUTP0tdPkgi+JY/zJJQz" + "KPZyLZ7hAD5cULHfgsxtJBsOKunNNIsf1H6SZ6/Bsq6R7lHWyw4xeasQQqldz2qU" + "g7hLSzazhhqnJV5MAni6NgRlDBC+GUgvIxcbZx3xzzuWDAdDAc2TwdF2A9FH2uKu" + "+DemKWTvFeX7SqwLjBzKpL51SrVyiukTDEx9AogKuUctRVViFtaZi4aCKD0Z1CqQ" + "1e+OXTJ2fcKCLG33hUV1OKuugwY+2cuHwtNw8mPV+tdGbYSZ649GSnAlErDO53Hp" + "Ew1pdzX4l/0DbMUEMmw7ATmfZDUyKQ+VjAu9kAZd8IurvTCutjuExGBdbKNxBHEn" + "0Dpy1Zih7a3+cH6IRyXBaJBUkIQAjTkeCVPD82vEOM0IXt0tk0zhk4w1enEeDUo0" + "GlsKhe0SwfTlFWomdG3d4W2Cb0d8l0d+Cg/fZVMUPiyjpzXgLszZSyfQSGHREZ3Q" + "wyit8/aPsJS4Z3Fr19wN7rsQuCQOaANIk+rYLVTJ2nVMRsfu4MN/2+5IU2BHpvoa" + "5JoBQkkbYf1aaT44E2DqblkwEyNvZLqPOx7dG978f8oDVs8ph3LtnBegmADXWDUp" + "9sgT7BiLy5PYQy1EjG0fbfXnzYp2omc2XWdqXY3tv4oj82YSpZmQKKiV69ehN9x6" + "AJvGaV+sweUA4yXJdngZdQrouQ6B+kFr5zc6f3tqrzgXo0wGQVrUIBjIBY5PLPPk" + "v99j9HmR1L0/G2ZEXweOotv/rC1ipeoD2RWgqlVmR7a/X6Rw7ApmL2kHwBvwU8uK" + "93lN8ZQDUOrF2+LtO3qoVR7FD9/4dYzmWNGJ6q5tK2T2F3lLGRw/9Gu3HgI0Ah9H" + "sx+kMHcJX5athbo6a3NKfI823wisulHJN4l/cvIcO75bVJlvxmxfYmg53JjdHeQZ" + "W0bO6YA6D9PfxX4j9pK7e0m10hIzHVWxzi1yerQaEdo6FfjkvBHHi2XxzrKW8f7c" + "X35CRWyRERcCUgG+A4n1q9QNEfhjmjn+MjZ1GDWl5eRDF8HC7v1Opb/RYEP0PLQZ" + "gfat7p0DFZ562dE8UzaVCfwfonwW75iHcDpVtRsiy/RM0BKu4LJ5jmKEI0KO/NWk" + "DK72v1DY6ohev3Omuf15teGPZ9E0GsgjenXDz8kgBKHFpA42a8RNABdq9xwV5IyG" + "034BNyPKrHIjqzv01U8YKHE7K0pv5A+rdEBctziwZMBuzHbp7///////////AgEC" + "-----END X942 DH PARAMETERS-----"); + + config.set("dl", "dsa/jce/512", + "-----BEGIN DSA PARAMETERS-----" + "MIGdAkEA/KaCzo4Syrom78z3EQ5SbbB4sF7ey80etKII864WF64B81uRpH5t9jQT" + "xeEu0ImbzRMqzVDZkVG9xD7nN1kuFwIVAJYu3cw2nLqOuyYO5rahJtk0bjjFAkEA" + "3gtU76vylwh+5iPVylWIxkgo70/eT/uuHs0gBndrBbEbgeo83pvDlkwWh8UyW/Q9" + "fM76DQqGvl3/3dDRFD3NdQ==" + "-----END DSA PARAMETERS-----"); + + config.set("dl", "dsa/jce/768", + "-----BEGIN DSA PARAMETERS-----" + "MIHdAmEA6eZCWZ01XzfJf/01ZxILjiXJzUPpJ7OpZw++xdiQFBki0sOzrSSACTeZ" + "hp0ehGqrSfqwrSbSzmoiIZ1HC859d31KIfvpwnC1f2BwAvPO+Dk2lM9F7jaIwRqM" + "VqsSej2vAhUAnNvYTJ8awvOND4D0KrlS5zOL9RECYQDe7p717RUWzn5pXmcrjO5F" + "5s17NuDmOF+JS6hhY/bz5sbU6KgRRtQBfe/dccvZD6Akdlm4i3zByJT0gmn9Txqs" + "CjBTjf9rP8ds+xMcnnlltYhYqwpDtVczWRKoqlR/lWg=" + "-----END DSA PARAMETERS-----"); + + config.set("dl", "dsa/jce/1024", + "-----BEGIN DSA PARAMETERS-----" + "MIIBHgKBgQD9f1OBHXUSKVLfSpwu7OTn9hG3UjzvRADDHj+AtlEmaUVdQCJR+1k9" + "jVj6v8X1ujD2y5tVbNeBO4AdNG/yZmC3a5lQpaSfn+gEexAiwk+7qdf+t8Yb+DtX" + "58aophUPBPuD9tPFHsMCNVQTWhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdgUI8V" + "IwvMspK5gqLrhAvwWBz1AoGARpYDUS4wJ4zTlHWV2yLuyYJqYyKtyXNE9B10DDJX" + "JMj577qn1NgD/4xgnc0QDrxb38+tfGpCX66nhuogUOvpg1HqH9of3yTWlHqmuaoj" + "dmlTgC9NfUqOy6BtGXaKJJH/sW0O+cQ6mbX3FnL/bwoktETQc20E04oaEyLa9s3Y" + "jJ0=" + "-----END DSA PARAMETERS-----"); + + config.set("dl", "dsa/botan/2048", + "-----BEGIN DSA PARAMETERS-----" + "MIICLAKCAQEAkcSKT9+898Aq6V59oSYSK13Shk9Vm4fo50oobVL1m9HeaN/WRdDg" + "DGDAgAMYkZgDdO61lKUyv9Z7mgnqxLhmOgeRDmjzlGX7cEDSXfE5MuusQ0elMOy6" + "YchU+biA08DDZgCAWHxFVm2t4mvVo5S+CTtMDyS1r/747GxbPlf7iQJam8FnaZMh" + "MeFtPJTvyrGNDfBhIDzFPmEDvHLVWUv9QMplOA9EqahR3LB1SV/AM6ilgHGhvXj+" + "BS9mVVZI60txnSr+i0iA+NrW8VgYuhePiSdMhwvpuW6wjEbEAEDMLv4d+xsYaN0x" + "nePDSjKmOrbrEiQgmkGWgMx5AtFyjU354QIhAIzX1FD4bwrZTu5M5GmodW0evRBY" + "JBlD6v+ws1RYXpJNAoIBAA2fXgdhtNvRgz1qsalhoJlsXyIwP3LYTBQPZ8Qx2Uq1" + "cVvqgaDJjTnOS8941rnryJXTT+idlAkdWEhhXvFfXobxHZb2yWniA936WDVkIKSc" + "tES1lbkBqTPP4HZ7WU8YoHt/kd7NukRriJkPePL/kfL+fNQ/0uRtGOraH3u2YCxh" + "f27zpLKE8v2boQo2BC3o+oeiyjZZf+yBFXoUheRAQd8CgwERy4gLvm7UlIFIhvll" + "zcMTX1zPE4Nyi/ZbgG+WksCxDWxMCcdabKO0ATyxarLBBfa+I66pAA6rIXiYX5cs" + "mAV+HIbkTnIYaI6krg82NtzKdFydzU5q/7Z8y8E9YTE=" + "-----END DSA PARAMETERS-----"); + + config.set("dl", "dsa/botan/3072", + "-----BEGIN DSA PARAMETERS-----" + "MIIDLAKCAYEA5LUIgHWWY1heFCRgyi2d/xMviuTIQN2jomZoiRJP5WOLhOiim3rz" + "+hIJvmv8S1By7Tsrc4e68/hX9HioAijvNgC3az3Pth0g00RlslBtLK+H3259wM6R" + "vS0Wekb2rcwxxTHk+cervbkq3fNbCoBsZikqX14X6WTdCZkDczrEKKs12A6m9oW/" + "uovkBo5UGK5eytno/wc94rY+Tn6tNciptwtb1Hz7iNNztm83kxk5sKtxvVWVgJCG" + "2gFVM30YWg5Ps2pRmxtiArhZHmACRJzxzTpmOE9tIHOxzXO+ypO68eGmEX0COPIi" + "rh7X/tGFqJDn9n+rj+uXU8wTSlGD3+h64llfe1wtn7tCJJ/dWVE+HTOWs+sv2GaE" + "8oWoRI/nV6ApiBxAdguU75Gb35dAw4OJWZ7FGm6btRmo4GhJHpzgovz+PLYNZs8N" + "+tIKjsaEBIaEphREV1vRck1zUrRKdgB3s71r04XOWwpyUMwL92jagpI4Buuc+7E4" + "hDcxthggjHWbAiEAs+vTZOxp74zzuvZDt1c0sWM5suSeXN4bWcHp+0DuDFsCggGA" + "K+0h7vg5ZKIwrom7px2ffDnFL8gim047x+WUTTKdoQ8BDqyee69sAJ/E6ylgcj4r" + "Vt9GY+TDrIAOkljeL3ZJ0gZ4KJP4Ze/KSY0u7zAHTqXop6smJxKk2UovOwuaku5A" + "D7OKPMWaXcfkNtXABLIuNQKDgbUck0B+sy1K4P1Cy0XhLQ7O6KJiOO3iCCp7FSIR" + "PGbO+NdFxs88uUX4TS9N4W1Epx3hmCcOE/A1U8iLjTI60LlIob8hA6lJl5tu0W+1" + "88lT2Vt8jojKZ9z1pjb7nKOdkkIV96iE7Wx+48ltjZcVQnl0t8Q1EoLhPTdz99KL" + "RS8QiSoTx1hzKN6kgntrNpsqjcFyrcWD9R8qZZjFSD5bxGewL5HQWcQC0Y4sJoD3" + "dqoG9JKAoscsF8xC1bbnQMXEsas8UcLtCSviotiwU65Xc9FCXtKwjwbi3VBZLfGk" + "eMFVkc39EVZP+I/zi3IdQjkv2kcyEtz9jS2IqXagCv/m//tDCjWeZMorNRyiQSOU" + "-----END DSA PARAMETERS-----"); + } +} + +/* +* Set the default policy +*/ +void Library_State::load_default_config() + { + set_default_config(*this); + set_default_aliases(*this); + set_default_oids(*this); + set_default_dl_groups(*this); + } + +} diff --git a/src/libs/3rdparty/botan/src/libstate/scan_name.cpp b/src/libs/3rdparty/botan/src/libstate/scan_name.cpp new file mode 100644 index 00000000000..ef771871d6c --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/scan_name.cpp @@ -0,0 +1,74 @@ +/** +SCAN Name Abstraction +(C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +namespace { + +std::vector +parse_and_deref_aliases(const std::string& algo_spec) + { + std::vector parts = parse_algorithm_name(algo_spec); + std::vector out; + + for(size_t i = 0; i != parts.size(); ++i) + { + std::string part_i = global_state().deref_alias(parts[i]); + + if(i == 0 && part_i.find_first_of(",()") != std::string::npos) + { + std::vector parts_i = parse_and_deref_aliases(part_i); + + for(size_t j = 0; j != parts_i.size(); ++j) + out.push_back(parts_i[j]); + } + else + out.push_back(part_i); + } + + return out; + } + +} + +SCAN_Name::SCAN_Name(const std::string& algo_spec) + { + orig_algo_spec = algo_spec; + + name = parse_and_deref_aliases(algo_spec); + + if(name.size() == 0) + throw Decoding_Error("Bad SCAN name " + algo_spec); + } + +std::string SCAN_Name::arg(u32bit i) const + { + if(i >= arg_count()) + throw std::range_error("SCAN_Name::argument"); + return name[i+1]; + } + +std::string SCAN_Name::arg(u32bit i, const std::string& def_value) const + { + if(i >= arg_count()) + return def_value; + return name[i+1]; + } + +u32bit SCAN_Name::arg_as_u32bit(u32bit i, u32bit def_value) const + { + if(i >= arg_count()) + return def_value; + return to_u32bit(name[i+1]); + } + +} diff --git a/src/libs/3rdparty/botan/src/libstate/scan_name.h b/src/libs/3rdparty/botan/src/libstate/scan_name.h new file mode 100644 index 00000000000..9e7af40d602 --- /dev/null +++ b/src/libs/3rdparty/botan/src/libstate/scan_name.h @@ -0,0 +1,77 @@ +/** +SCAN Name Abstraction +(C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SCAN_NAME_H__ +#define BOTAN_SCAN_NAME_H__ + +#include +#include +#include +#include + +namespace Botan { + +/** +A class encapsulating a SCAN name (similar to JCE conventions) +http://www.users.zetnet.co.uk/hopwood/crypto/scan/ +*/ +class SCAN_Name + { + public: + /** + @param algo_spec A SCAN name + */ + SCAN_Name(const std::string& algo_spec); + + /** + @return the original input string + */ + std::string as_string() const { return orig_algo_spec; } + + /** + @return the algorithm name + */ + std::string algo_name() const { return name[0]; } + + /** + @return the number of arguments + */ + u32bit arg_count() const { return name.size() - 1; } + + /** + @return if the number of arguments is between lower and upper + */ + bool arg_count_between(u32bit lower, u32bit upper) const + { return ((arg_count() >= lower) && (arg_count() <= upper)); } + + /** + @param i which argument + @return the ith argument + */ + std::string arg(u32bit i) const; + + /** + @param i which argument + @param def_value the default value + @return the ith argument or the default value + */ + std::string arg(u32bit i, const std::string& def_value) const; + + /** + @param i which argument + @param def_value the default value + @return the ith argument as a u32bit, or the default value + */ + u32bit arg_as_u32bit(u32bit i, u32bit def_value) const; + private: + std::string orig_algo_spec; + std::vector name; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/mac/cbc_mac/cbc_mac.cpp b/src/libs/3rdparty/botan/src/mac/cbc_mac/cbc_mac.cpp new file mode 100644 index 00000000000..f5d9e15678b --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/cbc_mac/cbc_mac.cpp @@ -0,0 +1,109 @@ +/* +* CBC-MAC +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Update an CBC-MAC Calculation +*/ +void CBC_MAC::add_data(const byte input[], u32bit length) + { + u32bit xored = std::min(OUTPUT_LENGTH - position, length); + xor_buf(state + position, input, xored); + position += xored; + + if(position < OUTPUT_LENGTH) + return; + + e->encrypt(state); + input += xored; + length -= xored; + while(length >= OUTPUT_LENGTH) + { + xor_buf(state, input, OUTPUT_LENGTH); + e->encrypt(state); + input += OUTPUT_LENGTH; + length -= OUTPUT_LENGTH; + } + + xor_buf(state, input, length); + position = length; + } + +/* +* Finalize an CBC-MAC Calculation +*/ +void CBC_MAC::final_result(byte mac[]) + { + if(position) + e->encrypt(state); + + copy_mem(mac, state.begin(), state.size()); + state.clear(); + position = 0; + } + +/* +* CBC-MAC Key Schedule +*/ +void CBC_MAC::key_schedule(const byte key[], u32bit length) + { + e->set_key(key, length); + } + +/* +* Clear memory of sensitive data +*/ +void CBC_MAC::clear() throw() + { + e->clear(); + state.clear(); + position = 0; + } + +/* +* Return the name of this type +*/ +std::string CBC_MAC::name() const + { + return "CBC-MAC(" + e->name() + ")"; + } + +/* +* Return a clone of this object +*/ +MessageAuthenticationCode* CBC_MAC::clone() const + { + return new CBC_MAC(e->clone()); + } + +/* +* CBC-MAC Constructor +*/ +CBC_MAC::CBC_MAC(BlockCipher* e_in) : + MessageAuthenticationCode(e_in->BLOCK_SIZE, + e_in->MINIMUM_KEYLENGTH, + e_in->MAXIMUM_KEYLENGTH, + e_in->KEYLENGTH_MULTIPLE), + e(e_in), state(e->BLOCK_SIZE) + { + position = 0; + } + +/* +* CBC-MAC Destructor +*/ +CBC_MAC::~CBC_MAC() + { + delete e; + } + +} diff --git a/src/libs/3rdparty/botan/src/mac/cbc_mac/cbc_mac.h b/src/libs/3rdparty/botan/src/mac/cbc_mac/cbc_mac.h new file mode 100644 index 00000000000..d17d792d3a1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/cbc_mac/cbc_mac.h @@ -0,0 +1,40 @@ +/* +* CBC-MAC +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CBC_MAC_H__ +#define BOTAN_CBC_MAC_H__ + +#include +#include + +namespace Botan { + +/* +* CBC-MAC +*/ +class BOTAN_DLL CBC_MAC : public MessageAuthenticationCode + { + public: + void clear() throw(); + std::string name() const; + MessageAuthenticationCode* clone() const; + + CBC_MAC(BlockCipher* e); + ~CBC_MAC(); + private: + void add_data(const byte[], u32bit); + void final_result(byte[]); + void key_schedule(const byte[], u32bit); + + BlockCipher* e; + SecureVector state; + u32bit position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/mac/cbc_mac/info.txt b/src/libs/3rdparty/botan/src/mac/cbc_mac/info.txt new file mode 100644 index 00000000000..3a54349740c --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/cbc_mac/info.txt @@ -0,0 +1,14 @@ +realname "CBC-MAC" + +define CBC_MAC + +load_on auto + + +cbc_mac.cpp +cbc_mac.h + + + +block + diff --git a/src/libs/3rdparty/botan/src/mac/cmac/cmac.cpp b/src/libs/3rdparty/botan/src/mac/cmac/cmac.cpp new file mode 100644 index 00000000000..84aa61e036f --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/cmac/cmac.cpp @@ -0,0 +1,162 @@ +/* +* CMAC +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Perform CMAC's multiplication in GF(2^n) +*/ +SecureVector CMAC::poly_double(const MemoryRegion& in, + byte polynomial) + { + const bool do_xor = (in[0] & 0x80) ? true : false; + + SecureVector out = in; + + byte carry = 0; + for(u32bit j = out.size(); j != 0; --j) + { + byte temp = out[j-1]; + out[j-1] = (temp << 1) | carry; + carry = (temp >> 7); + } + + if(do_xor) + out[out.size()-1] ^= polynomial; + + return out; + } + +/* +* Update an CMAC Calculation +*/ +void CMAC::add_data(const byte input[], u32bit length) + { + buffer.copy(position, input, length); + if(position + length > OUTPUT_LENGTH) + { + xor_buf(state, buffer, OUTPUT_LENGTH); + e->encrypt(state); + input += (OUTPUT_LENGTH - position); + length -= (OUTPUT_LENGTH - position); + while(length > OUTPUT_LENGTH) + { + xor_buf(state, input, OUTPUT_LENGTH); + e->encrypt(state); + input += OUTPUT_LENGTH; + length -= OUTPUT_LENGTH; + } + buffer.copy(input, length); + position = 0; + } + position += length; + } + +/* +* Finalize an CMAC Calculation +*/ +void CMAC::final_result(byte mac[]) + { + xor_buf(state, buffer, position); + + if(position == OUTPUT_LENGTH) + { + xor_buf(state, B, OUTPUT_LENGTH); + } + else + { + state[position] ^= 0x80; + xor_buf(state, P, OUTPUT_LENGTH); + } + + e->encrypt(state); + + for(u32bit j = 0; j != OUTPUT_LENGTH; ++j) + mac[j] = state[j]; + + state.clear(); + buffer.clear(); + position = 0; + } + +/* +* CMAC Key Schedule +*/ +void CMAC::key_schedule(const byte key[], u32bit length) + { + clear(); + e->set_key(key, length); + e->encrypt(B); + B = poly_double(B, polynomial); + P = poly_double(B, polynomial); + } + +/* +* Clear memory of sensitive data +*/ +void CMAC::clear() throw() + { + e->clear(); + state.clear(); + buffer.clear(); + B.clear(); + P.clear(); + position = 0; + } + +/* +* Return the name of this type +*/ +std::string CMAC::name() const + { + return "CMAC(" + e->name() + ")"; + } + +/* +* Return a clone of this object +*/ +MessageAuthenticationCode* CMAC::clone() const + { + return new CMAC(e->clone()); + } + +/* +* CMAC Constructor +*/ +CMAC::CMAC(BlockCipher* e_in) : + MessageAuthenticationCode(e_in->BLOCK_SIZE, + e_in->MINIMUM_KEYLENGTH, + e_in->MAXIMUM_KEYLENGTH, + e_in->KEYLENGTH_MULTIPLE), + e(e_in) + { + if(e->BLOCK_SIZE == 16) + polynomial = 0x87; + else if(e->BLOCK_SIZE == 8) + polynomial = 0x1B; + else + throw Invalid_Argument("CMAC cannot use the cipher " + e->name()); + + state.create(OUTPUT_LENGTH); + buffer.create(OUTPUT_LENGTH); + B.create(OUTPUT_LENGTH); + P.create(OUTPUT_LENGTH); + position = 0; + } + +/* +* CMAC Destructor +*/ +CMAC::~CMAC() + { + delete e; + } + +} diff --git a/src/libs/3rdparty/botan/src/mac/cmac/cmac.h b/src/libs/3rdparty/botan/src/mac/cmac/cmac.h new file mode 100644 index 00000000000..5a6deb7b0bc --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/cmac/cmac.h @@ -0,0 +1,44 @@ +/* +* CMAC +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CMAC_H__ +#define BOTAN_CMAC_H__ + +#include +#include + +namespace Botan { + +/* +* CMAC +*/ +class BOTAN_DLL CMAC : public MessageAuthenticationCode + { + public: + void clear() throw(); + std::string name() const; + MessageAuthenticationCode* clone() const; + + static SecureVector poly_double(const MemoryRegion& in, + byte polynomial); + + CMAC(BlockCipher* e); + ~CMAC(); + private: + void add_data(const byte[], u32bit); + void final_result(byte[]); + void key_schedule(const byte[], u32bit); + + BlockCipher* e; + SecureVector buffer, state, B, P; + u32bit position; + byte polynomial; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/mac/cmac/info.txt b/src/libs/3rdparty/botan/src/mac/cmac/info.txt new file mode 100644 index 00000000000..b593c9d38e1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/cmac/info.txt @@ -0,0 +1,14 @@ +realname "CMAC" + +define CMAC + +load_on auto + + +cmac.cpp +cmac.h + + + +block + diff --git a/src/libs/3rdparty/botan/src/mac/hmac/hmac.cpp b/src/libs/3rdparty/botan/src/mac/hmac/hmac.cpp new file mode 100644 index 00000000000..717e2640cfa --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/hmac/hmac.cpp @@ -0,0 +1,99 @@ +/* +* HMAC +* (C) 1999-2007 Jack Lloyd +* 2007 Yves Jerschow +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Update a HMAC Calculation +*/ +void HMAC::add_data(const byte input[], u32bit length) + { + hash->update(input, length); + } + +/* +* Finalize a HMAC Calculation +*/ +void HMAC::final_result(byte mac[]) + { + hash->final(mac); + hash->update(o_key); + hash->update(mac, OUTPUT_LENGTH); + hash->final(mac); + hash->update(i_key); + } + +/* +* HMAC Key Schedule +*/ +void HMAC::key_schedule(const byte key[], u32bit length) + { + hash->clear(); + std::fill(i_key.begin(), i_key.end(), 0x36); + std::fill(o_key.begin(), o_key.end(), 0x5C); + + if(length > hash->HASH_BLOCK_SIZE) + { + SecureVector hmac_key = hash->process(key, length); + xor_buf(i_key, hmac_key, hmac_key.size()); + xor_buf(o_key, hmac_key, hmac_key.size()); + } + else + { + xor_buf(i_key, key, length); + xor_buf(o_key, key, length); + } + + hash->update(i_key); + } + +/* +* Clear memory of sensitive data +*/ +void HMAC::clear() throw() + { + hash->clear(); + i_key.clear(); + o_key.clear(); + } + +/* +* Return the name of this type +*/ +std::string HMAC::name() const + { + return "HMAC(" + hash->name() + ")"; + } + +/* +* Return a clone of this object +*/ +MessageAuthenticationCode* HMAC::clone() const + { + return new HMAC(hash->clone()); + } + +/* +* HMAC Constructor +*/ +HMAC::HMAC(HashFunction* hash_in) : + MessageAuthenticationCode(hash_in->OUTPUT_LENGTH, + 1, 2*hash_in->HASH_BLOCK_SIZE), + hash(hash_in) + { + if(hash->HASH_BLOCK_SIZE == 0) + throw Invalid_Argument("HMAC cannot be used with " + hash->name()); + + i_key.create(hash->HASH_BLOCK_SIZE); + o_key.create(hash->HASH_BLOCK_SIZE); + } + +} diff --git a/src/libs/3rdparty/botan/src/mac/hmac/hmac.h b/src/libs/3rdparty/botan/src/mac/hmac/hmac.h new file mode 100644 index 00000000000..932af71fca6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/hmac/hmac.h @@ -0,0 +1,38 @@ +/* +* HMAC +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_HMAC_H__ +#define BOTAN_HMAC_H__ + +#include +#include + +namespace Botan { + +/* +* HMAC +*/ +class BOTAN_DLL HMAC : public MessageAuthenticationCode + { + public: + void clear() throw(); + std::string name() const; + MessageAuthenticationCode* clone() const; + + HMAC(HashFunction* hash); + ~HMAC() { delete hash; } + private: + void add_data(const byte[], u32bit); + void final_result(byte[]); + void key_schedule(const byte[], u32bit); + HashFunction* hash; + SecureVector i_key, o_key; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/mac/hmac/info.txt b/src/libs/3rdparty/botan/src/mac/hmac/info.txt new file mode 100644 index 00000000000..cdf2e67ab3e --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/hmac/info.txt @@ -0,0 +1,14 @@ +realname "HMAC" + +define HMAC + +load_on auto + + +hmac.cpp +hmac.h + + + +hash + diff --git a/src/libs/3rdparty/botan/src/mac/info.txt b/src/libs/3rdparty/botan/src/mac/info.txt new file mode 100644 index 00000000000..239eb633fe8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/info.txt @@ -0,0 +1,13 @@ +realname "Message Authentication Codes" + +load_on auto + + +mac.h +mac.cpp + + + +buf_comp +sym_algo + diff --git a/src/libs/3rdparty/botan/src/mac/mac.cpp b/src/libs/3rdparty/botan/src/mac/mac.cpp new file mode 100644 index 00000000000..96df2550391 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/mac.cpp @@ -0,0 +1,26 @@ +/** +Message Authentication Code base class +(C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/** +* Default (deterministic) MAC verification operation +*/ +bool MessageAuthenticationCode::verify_mac(const byte mac[], u32bit length) + { + SecureVector our_mac = final(); + if(our_mac.size() != length) + return false; + for(u32bit j = 0; j != length; ++j) + if(mac[j] != our_mac[j]) + return false; + return true; + } + +} diff --git a/src/libs/3rdparty/botan/src/mac/mac.h b/src/libs/3rdparty/botan/src/mac/mac.h new file mode 100644 index 00000000000..3ec5fff5f54 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/mac.h @@ -0,0 +1,60 @@ +/** +* Base class for message authentiction codes +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MESSAGE_AUTH_CODE_BASE_H__ +#define BOTAN_MESSAGE_AUTH_CODE_BASE_H__ + +#include +#include +#include + +namespace Botan { + +/** +* This class represents Message Authentication Code (MAC) objects. +*/ +class BOTAN_DLL MessageAuthenticationCode : public BufferedComputation, + public SymmetricAlgorithm + { + public: + /** + * Verify a MAC. + * @param in the MAC to verify as a byte array + * @param length the length of the byte array + * @return true if the MAC is valid, false otherwise + */ + virtual bool verify_mac(const byte[], u32bit); + + /** + * Get a new object representing the same algorithm as *this + */ + virtual MessageAuthenticationCode* clone() const = 0; + + /** + * Get the name of this algorithm. + * @return the name of this algorithm + */ + virtual std::string name() const = 0; + + /** + * Reset the internal state of this object. + */ + virtual void clear() throw() = 0; + + MessageAuthenticationCode(u32bit mac_len, + u32bit key_min, + u32bit key_max = 0, + u32bit key_mod = 1) : + BufferedComputation(mac_len), + SymmetricAlgorithm(key_min, key_max, key_mod) {} + + virtual ~MessageAuthenticationCode() {} + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/mac/ssl3mac/info.txt b/src/libs/3rdparty/botan/src/mac/ssl3mac/info.txt new file mode 100644 index 00000000000..f8791169c23 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/ssl3mac/info.txt @@ -0,0 +1,14 @@ +realname "SSLv3 MAC" + +define SSL3_MAC + +load_on auto + + +ssl3_mac.cpp +ssl3_mac.h + + + +hash + diff --git a/src/libs/3rdparty/botan/src/mac/ssl3mac/ssl3_mac.cpp b/src/libs/3rdparty/botan/src/mac/ssl3mac/ssl3_mac.cpp new file mode 100644 index 00000000000..c29296cedfe --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/ssl3mac/ssl3_mac.cpp @@ -0,0 +1,90 @@ +/* +* SSL3-MAC +* (C) 1999-2004 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Update a SSL3-MAC Calculation +*/ +void SSL3_MAC::add_data(const byte input[], u32bit length) + { + hash->update(input, length); + } + +/* +* Finalize a SSL3-MAC Calculation +*/ +void SSL3_MAC::final_result(byte mac[]) + { + hash->final(mac); + hash->update(o_key); + hash->update(mac, OUTPUT_LENGTH); + hash->final(mac); + hash->update(i_key); + } + +/* +* SSL3-MAC Key Schedule +*/ +void SSL3_MAC::key_schedule(const byte key[], u32bit length) + { + hash->clear(); + std::fill(i_key.begin(), i_key.end(), 0x36); + std::fill(o_key.begin(), o_key.end(), 0x5C); + + i_key.copy(key, length); + o_key.copy(key, length); + hash->update(i_key); + } + +/* +* Clear memory of sensitive data +*/ +void SSL3_MAC::clear() throw() + { + hash->clear(); + i_key.clear(); + o_key.clear(); + } + +/* +* Return the name of this type +*/ +std::string SSL3_MAC::name() const + { + return "SSL3-MAC(" + hash->name() + ")"; + } + +/* +* Return a clone of this object +*/ +MessageAuthenticationCode* SSL3_MAC::clone() const + { + return new SSL3_MAC(hash->clone()); + } + +/* +* SSL3-MAC Constructor +*/ +SSL3_MAC::SSL3_MAC(HashFunction* hash_in) : + MessageAuthenticationCode(hash_in->OUTPUT_LENGTH, + hash_in->OUTPUT_LENGTH), + hash(hash_in) + { + if(hash->HASH_BLOCK_SIZE == 0) + throw Invalid_Argument("SSL3-MAC cannot be used with " + hash->name()); + + u32bit INNER_HASH_LENGTH = + (hash->name() == "SHA-160") ? 60 : hash->HASH_BLOCK_SIZE; + + i_key.create(INNER_HASH_LENGTH); + o_key.create(INNER_HASH_LENGTH); + } + +} diff --git a/src/libs/3rdparty/botan/src/mac/ssl3mac/ssl3_mac.h b/src/libs/3rdparty/botan/src/mac/ssl3mac/ssl3_mac.h new file mode 100644 index 00000000000..dcaf7f40414 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/ssl3mac/ssl3_mac.h @@ -0,0 +1,39 @@ +/* +* SSL3-MAC +* (C) 1999-2004 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SSL3_MAC_H__ +#define BOTAN_SSL3_MAC_H__ + +#include +#include + +namespace Botan { + +/* +* SSL3-MAC +*/ +class BOTAN_DLL SSL3_MAC : public MessageAuthenticationCode + { + public: + void clear() throw(); + std::string name() const; + MessageAuthenticationCode* clone() const; + + SSL3_MAC(HashFunction*); + ~SSL3_MAC() { delete hash; } + private: + void add_data(const byte[], u32bit); + void final_result(byte[]); + void key_schedule(const byte[], u32bit); + + HashFunction* hash; + SecureVector i_key, o_key; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/mac/x919_mac/info.txt b/src/libs/3rdparty/botan/src/mac/x919_mac/info.txt new file mode 100644 index 00000000000..f2ebd5b3576 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/x919_mac/info.txt @@ -0,0 +1,14 @@ +realname "ANSI X9.19 MAC" + +define ANSI_X919_MAC + +load_on auto + + +x919_mac.cpp +x919_mac.h + + + +block + diff --git a/src/libs/3rdparty/botan/src/mac/x919_mac/x919_mac.cpp b/src/libs/3rdparty/botan/src/mac/x919_mac/x919_mac.cpp new file mode 100644 index 00000000000..ef89cac9ccf --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/x919_mac/x919_mac.cpp @@ -0,0 +1,107 @@ +/* +* ANSI X9.19 MAC +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Update an ANSI X9.19 MAC Calculation +*/ +void ANSI_X919_MAC::add_data(const byte input[], u32bit length) + { + u32bit xored = std::min(8 - position, length); + xor_buf(state + position, input, xored); + position += xored; + + if(position < 8) return; + + e->encrypt(state); + input += xored; + length -= xored; + while(length >= 8) + { + xor_buf(state, input, 8); + e->encrypt(state); + input += 8; + length -= 8; + } + + xor_buf(state, input, length); + position = length; + } + +/* +* Finalize an ANSI X9.19 MAC Calculation +*/ +void ANSI_X919_MAC::final_result(byte mac[]) + { + if(position) + e->encrypt(state); + d->decrypt(state, mac); + e->encrypt(mac); + state.clear(); + position = 0; + } + +/* +* ANSI X9.19 MAC Key Schedule +*/ +void ANSI_X919_MAC::key_schedule(const byte key[], u32bit length) + { + e->set_key(key, 8); + if(length == 8) d->set_key(key, 8); + else d->set_key(key + 8, 8); + } + +/* +* Clear memory of sensitive data +*/ +void ANSI_X919_MAC::clear() throw() + { + e->clear(); + d->clear(); + state.clear(); + position = 0; + } + +std::string ANSI_X919_MAC::name() const + { + return "X9.19-MAC"; + } + +MessageAuthenticationCode* ANSI_X919_MAC::clone() const + { + return new ANSI_X919_MAC(e->clone()); + } + +/* +* ANSI X9.19 MAC Constructor +*/ +ANSI_X919_MAC::ANSI_X919_MAC(BlockCipher* e_in) : + MessageAuthenticationCode(e_in->BLOCK_SIZE, + e_in->MINIMUM_KEYLENGTH, + 2*e_in->MAXIMUM_KEYLENGTH, + 2*e_in->KEYLENGTH_MULTIPLE), + e(e_in), d(e->clone()), position(0) + { + if(e->name() != "DES") + throw Invalid_Argument("ANSI X9.19 MAC only supports DES"); + } + +/* +* ANSI X9.19 MAC Destructor +le*/ +ANSI_X919_MAC::~ANSI_X919_MAC() + { + delete e; + delete d; + } + +} diff --git a/src/libs/3rdparty/botan/src/mac/x919_mac/x919_mac.h b/src/libs/3rdparty/botan/src/mac/x919_mac/x919_mac.h new file mode 100644 index 00000000000..1c2a06bee3e --- /dev/null +++ b/src/libs/3rdparty/botan/src/mac/x919_mac/x919_mac.h @@ -0,0 +1,41 @@ +/* +* ANSI X9.19 MAC +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ANSI_X919_MAC_H__ +#define BOTAN_ANSI_X919_MAC_H__ + +#include +#include + +namespace Botan { + +/** +* DES/3DES-based MAC from ANSI X9.19 +*/ +class BOTAN_DLL ANSI_X919_MAC : public MessageAuthenticationCode + { + public: + void clear() throw(); + std::string name() const; + MessageAuthenticationCode* clone() const; + + ANSI_X919_MAC(BlockCipher*); + ~ANSI_X919_MAC(); + private: + void add_data(const byte[], u32bit); + void final_result(byte[]); + void key_schedule(const byte[], u32bit); + + BlockCipher* e; + BlockCipher* d; + SecureBuffer state; + u32bit position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/big_code.cpp b/src/libs/3rdparty/botan/src/math/bigint/big_code.cpp new file mode 100644 index 00000000000..74701e53242 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/big_code.cpp @@ -0,0 +1,154 @@ +/* +* BigInt Encoding/Decoding +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Encode a BigInt +*/ +void BigInt::encode(byte output[], const BigInt& n, Base base) + { + if(base == Binary) + n.binary_encode(output); + else if(base == Hexadecimal) + { + SecureVector binary(n.encoded_size(Binary)); + n.binary_encode(binary); + for(u32bit j = 0; j != binary.size(); ++j) + Hex_Encoder::encode(binary[j], output + 2*j); + } + else if(base == Octal) + { + BigInt copy = n; + const u32bit output_size = n.encoded_size(Octal); + for(u32bit j = 0; j != output_size; ++j) + { + output[output_size - 1 - j] = Charset::digit2char(copy % 8); + copy /= 8; + } + } + else if(base == Decimal) + { + BigInt copy = n; + BigInt remainder; + copy.set_sign(Positive); + const u32bit output_size = n.encoded_size(Decimal); + for(u32bit j = 0; j != output_size; ++j) + { + divide(copy, 10, copy, remainder); + output[output_size - 1 - j] = + Charset::digit2char(remainder.word_at(0)); + if(copy.is_zero()) + break; + } + } + else + throw Invalid_Argument("Unknown BigInt encoding method"); + } + +/* +* Encode a BigInt +*/ +SecureVector BigInt::encode(const BigInt& n, Base base) + { + SecureVector output(n.encoded_size(base)); + encode(output, n, base); + if(base != Binary) + for(u32bit j = 0; j != output.size(); ++j) + if(output[j] == 0) + output[j] = '0'; + return output; + } + +/* +* Encode a BigInt, with leading 0s if needed +*/ +SecureVector BigInt::encode_1363(const BigInt& n, u32bit bytes) + { + const u32bit n_bytes = n.bytes(); + if(n_bytes > bytes) + throw Encoding_Error("encode_1363: n is too large to encode properly"); + + const u32bit leading_0s = bytes - n_bytes; + + SecureVector output(bytes); + encode(output + leading_0s, n, Binary); + return output; + } + +/* +* Decode a BigInt +*/ +BigInt BigInt::decode(const MemoryRegion& buf, Base base) + { + return BigInt::decode(buf, buf.size(), base); + } + +/* +* Decode a BigInt +*/ +BigInt BigInt::decode(const byte buf[], u32bit length, Base base) + { + BigInt r; + if(base == Binary) + r.binary_decode(buf, length); + else if(base == Hexadecimal) + { + SecureVector hex; + for(u32bit j = 0; j != length; ++j) + if(Hex_Decoder::is_valid(buf[j])) + hex.append(buf[j]); + + u32bit offset = (hex.size() % 2); + SecureVector binary(hex.size() / 2 + offset); + + if(offset) + { + byte temp[2] = { '0', hex[0] }; + binary[0] = Hex_Decoder::decode(temp); + } + + for(u32bit j = offset; j != binary.size(); ++j) + binary[j] = Hex_Decoder::decode(hex+2*j-offset); + r.binary_decode(binary, binary.size()); + } + else if(base == Decimal || base == Octal) + { + const u32bit RADIX = ((base == Decimal) ? 10 : 8); + for(u32bit j = 0; j != length; ++j) + { + if(Charset::is_space(buf[j])) + continue; + + if(!Charset::is_digit(buf[j])) + throw Invalid_Argument("BigInt::decode: " + "Invalid character in decimal input"); + + byte x = Charset::char2digit(buf[j]); + if(x >= RADIX) + { + if(RADIX == 10) + throw Invalid_Argument("BigInt: Invalid decimal string"); + else + throw Invalid_Argument("BigInt: Invalid octal string"); + } + + r *= RADIX; + r += x; + } + } + else + throw Invalid_Argument("Unknown BigInt decoding method"); + return r; + } + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/big_io.cpp b/src/libs/3rdparty/botan/src/math/bigint/big_io.cpp new file mode 100644 index 00000000000..b50fcceff10 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/big_io.cpp @@ -0,0 +1,55 @@ +/* +* BigInt Input/Output +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Write the BigInt into a stream +*/ +std::ostream& operator<<(std::ostream& stream, const BigInt& n) + { + BigInt::Base base = BigInt::Decimal; + if(stream.flags() & std::ios::hex) + base = BigInt::Hexadecimal; + else if(stream.flags() & std::ios::oct) + base = BigInt::Octal; + + if(n == 0) + stream.write("0", 1); + else + { + if(n < 0) + stream.write("-", 1); + SecureVector buffer = BigInt::encode(n, base); + u32bit skip = 0; + while(buffer[skip] == '0' && skip < buffer.size()) + ++skip; + stream.write(reinterpret_cast(buffer.begin()) + skip, + buffer.size() - skip); + } + if(!stream.good()) + throw Stream_IO_Error("BigInt output operator has failed"); + return stream; + } + +/* +* Read the BigInt from a stream +*/ +std::istream& operator>>(std::istream& stream, BigInt& n) + { + std::string str; + std::getline(stream, str); + if(stream.bad() || (stream.fail() && !stream.eof())) + throw Stream_IO_Error("BigInt input operator has failed"); + n = BigInt(str); + return stream; + } + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/big_ops2.cpp b/src/libs/3rdparty/botan/src/math/bigint/big_ops2.cpp new file mode 100644 index 00000000000..488eca909d6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/big_ops2.cpp @@ -0,0 +1,224 @@ +/* +* BigInt Assignment Operators +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Addition Operator +*/ +BigInt& BigInt::operator+=(const BigInt& y) + { + const u32bit x_sw = sig_words(), y_sw = y.sig_words(); + + const u32bit reg_size = std::max(x_sw, y_sw) + 1; + grow_to(reg_size); + + if(sign() == y.sign()) + bigint_add2(get_reg(), reg_size - 1, y.data(), y_sw); + else + { + s32bit relative_size = bigint_cmp(data(), x_sw, y.data(), y_sw); + + if(relative_size < 0) + { + SecureVector z(reg_size - 1); + bigint_sub3(z, y.data(), reg_size - 1, data(), x_sw); + copy_mem(get_reg().begin(), z.begin(), z.size()); + set_sign(y.sign()); + } + else if(relative_size == 0) + { + get_reg().clear(); + set_sign(Positive); + } + else if(relative_size > 0) + bigint_sub2(get_reg(), x_sw, y.data(), y_sw); + } + + return (*this); + } + +/* +* Subtraction Operator +*/ +BigInt& BigInt::operator-=(const BigInt& y) + { + const u32bit x_sw = sig_words(), y_sw = y.sig_words(); + + s32bit relative_size = bigint_cmp(data(), x_sw, y.data(), y_sw); + + const u32bit reg_size = std::max(x_sw, y_sw) + 1; + grow_to(reg_size); + + if(relative_size < 0) + { + if(sign() == y.sign()) + { + SecureVector z(reg_size - 1); + bigint_sub3(z, y.data(), reg_size - 1, data(), x_sw); + copy_mem(get_reg().begin(), z.begin(), z.size()); + } + else + bigint_add2(get_reg(), reg_size - 1, y.data(), y_sw); + + set_sign(y.reverse_sign()); + } + else if(relative_size == 0) + { + if(sign() == y.sign()) + { + get_reg().clear(); + set_sign(Positive); + } + else + bigint_shl1(get_reg(), x_sw, 0, 1); + } + else if(relative_size > 0) + { + if(sign() == y.sign()) + bigint_sub2(get_reg(), x_sw, y.data(), y_sw); + else + bigint_add2(get_reg(), reg_size - 1, y.data(), y_sw); + } + + return (*this); + } + +/* +* Multiplication Operator +*/ +BigInt& BigInt::operator*=(const BigInt& y) + { + const u32bit x_sw = sig_words(), y_sw = y.sig_words(); + set_sign((sign() == y.sign()) ? Positive : Negative); + + if(x_sw == 0 || y_sw == 0) + { + get_reg().clear(); + set_sign(Positive); + } + else if(x_sw == 1 && y_sw) + { + grow_to(y_sw + 2); + bigint_linmul3(get_reg(), y.data(), y_sw, word_at(0)); + } + else if(y_sw == 1 && x_sw) + { + grow_to(x_sw + 2); + bigint_linmul2(get_reg(), x_sw, y.word_at(0)); + } + else + { + grow_to(size() + y.size()); + + SecureVector z(data(), x_sw); + SecureVector workspace(size()); + + bigint_mul(get_reg(), size(), workspace, + z, z.size(), x_sw, + y.data(), y.size(), y_sw); + } + + return (*this); + } + +/* +* Division Operator +*/ +BigInt& BigInt::operator/=(const BigInt& y) + { + if(y.sig_words() == 1 && power_of_2(y.word_at(0))) + (*this) >>= (y.bits() - 1); + else + (*this) = (*this) / y; + return (*this); + } + +/* +* Modulo Operator +*/ +BigInt& BigInt::operator%=(const BigInt& mod) + { + return (*this = (*this) % mod); + } + +/* +* Modulo Operator +*/ +word BigInt::operator%=(word mod) + { + if(mod == 0) + throw BigInt::DivideByZero(); + if(power_of_2(mod)) + { + word result = (word_at(0) & (mod - 1)); + clear(); + grow_to(2); + get_reg()[0] = result; + return result; + } + + word remainder = 0; + + for(u32bit j = sig_words(); j > 0; --j) + remainder = bigint_modop(remainder, word_at(j-1), mod); + clear(); + grow_to(2); + + if(remainder && sign() == BigInt::Negative) + get_reg()[0] = mod - remainder; + else + get_reg()[0] = remainder; + + set_sign(BigInt::Positive); + + return word_at(0); + } + +/* +* Left Shift Operator +*/ +BigInt& BigInt::operator<<=(u32bit shift) + { + if(shift) + { + const u32bit shift_words = shift / MP_WORD_BITS, + shift_bits = shift % MP_WORD_BITS, + words = sig_words(); + + grow_to(words + shift_words + (shift_bits ? 1 : 0)); + bigint_shl1(get_reg(), words, shift_words, shift_bits); + } + + return (*this); + } + +/* +* Right Shift Operator +*/ +BigInt& BigInt::operator>>=(u32bit shift) + { + if(shift) + { + const u32bit shift_words = shift / MP_WORD_BITS, + shift_bits = shift % MP_WORD_BITS; + + bigint_shr1(get_reg(), sig_words(), shift_words, shift_bits); + + if(is_zero()) + set_sign(Positive); + } + + return (*this); + } + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/big_ops3.cpp b/src/libs/3rdparty/botan/src/math/bigint/big_ops3.cpp new file mode 100644 index 00000000000..ad8b7bbd082 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/big_ops3.cpp @@ -0,0 +1,190 @@ +/* +* BigInt Binary Operators +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Addition Operator +*/ +BigInt operator+(const BigInt& x, const BigInt& y) + { + const u32bit x_sw = x.sig_words(), y_sw = y.sig_words(); + + BigInt z(x.sign(), std::max(x_sw, y_sw) + 1); + + if((x.sign() == y.sign())) + bigint_add3(z.get_reg(), x.data(), x_sw, y.data(), y_sw); + else + { + s32bit relative_size = bigint_cmp(x.data(), x_sw, y.data(), y_sw); + + if(relative_size < 0) + { + bigint_sub3(z.get_reg(), y.data(), y_sw, x.data(), x_sw); + z.set_sign(y.sign()); + } + else if(relative_size == 0) + z.set_sign(BigInt::Positive); + else if(relative_size > 0) + bigint_sub3(z.get_reg(), x.data(), x_sw, y.data(), y_sw); + } + + return z; + } + +/* +* Subtraction Operator +*/ +BigInt operator-(const BigInt& x, const BigInt& y) + { + const u32bit x_sw = x.sig_words(), y_sw = y.sig_words(); + + s32bit relative_size = bigint_cmp(x.data(), x_sw, y.data(), y_sw); + + BigInt z(BigInt::Positive, std::max(x_sw, y_sw) + 1); + + if(relative_size < 0) + { + if(x.sign() == y.sign()) + bigint_sub3(z.get_reg(), y.data(), y_sw, x.data(), x_sw); + else + bigint_add3(z.get_reg(), x.data(), x_sw, y.data(), y_sw); + z.set_sign(y.reverse_sign()); + } + else if(relative_size == 0) + { + if(x.sign() != y.sign()) + bigint_shl2(z.get_reg(), x.data(), x_sw, 0, 1); + } + else if(relative_size > 0) + { + if(x.sign() == y.sign()) + bigint_sub3(z.get_reg(), x.data(), x_sw, y.data(), y_sw); + else + bigint_add3(z.get_reg(), x.data(), x_sw, y.data(), y_sw); + z.set_sign(x.sign()); + } + return z; + } + +/* +* Multiplication Operator +*/ +BigInt operator*(const BigInt& x, const BigInt& y) + { + const u32bit x_sw = x.sig_words(), y_sw = y.sig_words(); + + BigInt z(BigInt::Positive, x.size() + y.size()); + + if(x_sw == 1 && y_sw) + bigint_linmul3(z.get_reg(), y.data(), y_sw, x.word_at(0)); + else if(y_sw == 1 && x_sw) + bigint_linmul3(z.get_reg(), x.data(), x_sw, y.word_at(0)); + else if(x_sw && y_sw) + { + SecureVector workspace(z.size()); + bigint_mul(z.get_reg(), z.size(), workspace, + x.data(), x.size(), x_sw, + y.data(), y.size(), y_sw); + } + + if(x_sw && y_sw && x.sign() != y.sign()) + z.flip_sign(); + return z; + } + +/* +* Division Operator +*/ +BigInt operator/(const BigInt& x, const BigInt& y) + { + BigInt q, r; + divide(x, y, q, r); + return q; + } + +/* +* Modulo Operator +*/ +BigInt operator%(const BigInt& n, const BigInt& mod) + { + if(mod.is_zero()) + throw BigInt::DivideByZero(); + if(mod.is_negative()) + throw Invalid_Argument("BigInt::operator%: modulus must be > 0"); + if(n.is_positive() && mod.is_positive() && n < mod) + return n; + + BigInt q, r; + divide(n, mod, q, r); + return r; + } + +/* +* Modulo Operator +*/ +word operator%(const BigInt& n, word mod) + { + if(mod == 0) + throw BigInt::DivideByZero(); + if(power_of_2(mod)) + return (n.word_at(0) & (mod - 1)); + + word remainder = 0; + + for(u32bit j = n.sig_words(); j > 0; --j) + remainder = bigint_modop(remainder, n.word_at(j-1), mod); + + if(remainder && n.sign() == BigInt::Negative) + return mod - remainder; + return remainder; + } + +/* +* Left Shift Operator +*/ +BigInt operator<<(const BigInt& x, u32bit shift) + { + if(shift == 0) + return x; + + const u32bit shift_words = shift / MP_WORD_BITS, + shift_bits = shift % MP_WORD_BITS; + + const u32bit x_sw = x.sig_words(); + + BigInt y(x.sign(), x_sw + shift_words + (shift_bits ? 1 : 0)); + bigint_shl2(y.get_reg(), x.data(), x_sw, shift_words, shift_bits); + return y; + } + +/* +* Right Shift Operator +*/ +BigInt operator>>(const BigInt& x, u32bit shift) + { + if(shift == 0) + return x; + if(x.bits() <= shift) + return 0; + + const u32bit shift_words = shift / MP_WORD_BITS, + shift_bits = shift % MP_WORD_BITS, + x_sw = x.sig_words(); + + BigInt y(x.sign(), x_sw - shift_words); + bigint_shr2(y.get_reg(), x.data(), x_sw, shift_words, shift_bits); + return y; + } + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/big_rand.cpp b/src/libs/3rdparty/botan/src/math/bigint/big_rand.cpp new file mode 100644 index 00000000000..b641baee26e --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/big_rand.cpp @@ -0,0 +1,61 @@ +/* +* BigInt Random Generation +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Construct a BigInt of a specific form +*/ +BigInt::BigInt(NumberType type, u32bit bits) + { + set_sign(Positive); + + if(type == Power2) + set_bit(bits); + else + throw Invalid_Argument("BigInt(NumberType): Unknown type"); + } + +/* +* Randomize this number +*/ +void BigInt::randomize(RandomNumberGenerator& rng, + u32bit bitsize) + { + set_sign(Positive); + + if(bitsize == 0) + clear(); + else + { + SecureVector array((bitsize + 7) / 8); + rng.randomize(array, array.size()); + if(bitsize % 8) + array[0] &= 0xFF >> (8 - (bitsize % 8)); + array[0] |= 0x80 >> ((bitsize % 8) ? (8 - bitsize % 8) : 0); + binary_decode(array, array.size()); + } + } + +/* +* Generate a random integer within given range +*/ +BigInt BigInt::random_integer(RandomNumberGenerator& rng, + const BigInt& min, const BigInt& max) + { + BigInt range = max - min; + + if(range <= 0) + throw Invalid_Argument("random_integer: invalid min/max values"); + + return (min + (BigInt(rng, range.bits() + 2) % range)); + } + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/bigint.cpp b/src/libs/3rdparty/botan/src/math/bigint/bigint.cpp new file mode 100644 index 00000000000..926bedc02ea --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/bigint.cpp @@ -0,0 +1,369 @@ +/* +* BigInt Base +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Construct a BigInt from a regular number +*/ +BigInt::BigInt(u64bit n) + { + set_sign(Positive); + + if(n == 0) + return; + + const u32bit limbs_needed = sizeof(u64bit) / sizeof(word); + + reg.create(4*limbs_needed); + for(u32bit j = 0; j != limbs_needed; ++j) + reg[j] = ((n >> (j*MP_WORD_BITS)) & MP_WORD_MASK); + } + +/* +* Construct a BigInt of the specified size +*/ +BigInt::BigInt(Sign s, u32bit size) + { + reg.create(round_up(size, 8)); + signedness = s; + } + +/* +* Construct a BigInt from a "raw" BigInt +*/ +BigInt::BigInt(const BigInt& b) + { + const u32bit b_words = b.sig_words(); + + if(b_words) + { + reg.create(round_up(b_words, 8)); + reg.copy(b.data(), b_words); + set_sign(b.sign()); + } + else + { + reg.create(2); + set_sign(Positive); + } + } + +/* +* Construct a BigInt from a string +*/ +BigInt::BigInt(const std::string& str) + { + Base base = Decimal; + u32bit markers = 0; + bool negative = false; + if(str.length() > 0 && str[0] == '-') { markers += 1; negative = true; } + + if(str.length() > markers + 2 && str[markers ] == '0' && + str[markers + 1] == 'x') + { markers += 2; base = Hexadecimal; } + else if(str.length() > markers + 1 && str[markers] == '0') + { markers += 1; base = Octal; } + + *this = decode(reinterpret_cast(str.data()) + markers, + str.length() - markers, base); + + if(negative) set_sign(Negative); + else set_sign(Positive); + } + +/* +* Construct a BigInt from an encoded BigInt +*/ +BigInt::BigInt(const byte input[], u32bit length, Base base) + { + set_sign(Positive); + *this = decode(input, length, base); + } + +/* +* Construct a BigInt from an encoded BigInt +*/ +BigInt::BigInt(RandomNumberGenerator& rng, u32bit bits) + { + set_sign(Positive); + randomize(rng, bits); + } + +/* +* Swap this BigInt with another +*/ +void BigInt::swap(BigInt& other) + { + reg.swap(other.reg); + std::swap(signedness, other.signedness); + } + +/* +* Grow the internal storage +*/ +void BigInt::grow_reg(u32bit n) + { + reg.grow_to(round_up(size() + n, 8)); + } + +/* +* Grow the internal storage +*/ +void BigInt::grow_to(u32bit n) + { + if(n > size()) + reg.grow_to(round_up(n, 8)); + } + +/* +* Comparison Function +*/ +s32bit BigInt::cmp(const BigInt& n, bool check_signs) const + { + if(check_signs) + { + if(n.is_positive() && this->is_negative()) return -1; + if(n.is_negative() && this->is_positive()) return 1; + if(n.is_negative() && this->is_negative()) + return (-bigint_cmp(data(), sig_words(), n.data(), n.sig_words())); + } + return bigint_cmp(data(), sig_words(), n.data(), n.sig_words()); + } + +/* +* Convert this number to a u32bit, if possible +*/ +u32bit BigInt::to_u32bit() const + { + if(is_negative()) + throw Encoding_Error("BigInt::to_u32bit: Number is negative"); + if(bits() >= 32) + throw Encoding_Error("BigInt::to_u32bit: Number is too big to convert"); + + u32bit out = 0; + for(u32bit j = 0; j != 4; ++j) + out = (out << 8) | byte_at(3-j); + return out; + } + +/* +* Return byte n of this number +*/ +byte BigInt::byte_at(u32bit n) const + { + const u32bit WORD_BYTES = sizeof(word); + u32bit word_num = n / WORD_BYTES, byte_num = n % WORD_BYTES; + if(word_num >= size()) + return 0; + else + return get_byte(WORD_BYTES - byte_num - 1, reg[word_num]); + } + +/* +* Return bit n of this number +*/ +bool BigInt::get_bit(u32bit n) const + { + return ((word_at(n / MP_WORD_BITS) >> (n % MP_WORD_BITS)) & 1); + } + +/* +* Return bits {offset...offset+length} +*/ +u32bit BigInt::get_substring(u32bit offset, u32bit length) const + { + if(length > 32) + throw Invalid_Argument("BigInt::get_substring: Substring size too big"); + + u64bit piece = 0; + for(u32bit j = 0; j != 8; ++j) + piece = (piece << 8) | byte_at((offset / 8) + (7-j)); + + u64bit mask = (1 << length) - 1; + u32bit shift = (offset % 8); + + return static_cast((piece >> shift) & mask); + } + +/* +* Set bit number n +*/ +void BigInt::set_bit(u32bit n) + { + const u32bit which = n / MP_WORD_BITS; + const word mask = static_cast(1) << (n % MP_WORD_BITS); + if(which >= size()) grow_to(which + 1); + reg[which] |= mask; + } + +/* +* Clear bit number n +*/ +void BigInt::clear_bit(u32bit n) + { + const u32bit which = n / MP_WORD_BITS; + const word mask = static_cast(1) << (n % MP_WORD_BITS); + if(which < size()) + reg[which] &= ~mask; + } + +/* +* Clear all but the lowest n bits +*/ +void BigInt::mask_bits(u32bit n) + { + if(n == 0) { clear(); return; } + if(n >= bits()) return; + + const u32bit top_word = n / MP_WORD_BITS; + const word mask = (static_cast(1) << (n % MP_WORD_BITS)) - 1; + + if(top_word < size()) + for(u32bit j = top_word + 1; j != size(); ++j) + reg[j] = 0; + + reg[top_word] &= mask; + } + +/* +* Count how many bytes are being used +*/ +u32bit BigInt::bytes() const + { + return (bits() + 7) / 8; + } + +/* +* Count how many bits are being used +*/ +u32bit BigInt::bits() const + { + if(sig_words() == 0) + return 0; + + u32bit full_words = sig_words() - 1, top_bits = MP_WORD_BITS; + word top_word = word_at(full_words), mask = MP_WORD_TOP_BIT; + + while(top_bits && ((top_word & mask) == 0)) + { mask >>= 1; top_bits--; } + + return (full_words * MP_WORD_BITS + top_bits); + } + +/* +* Calcluate the size in a certain base +*/ +u32bit BigInt::encoded_size(Base base) const + { + static const double LOG_2_BASE_10 = 0.30102999566; + + if(base == Binary) + return bytes(); + else if(base == Hexadecimal) + return 2*bytes(); + else if(base == Octal) + return ((bits() + 2) / 3); + else if(base == Decimal) + return static_cast((bits() * LOG_2_BASE_10) + 1); + else + throw Invalid_Argument("Unknown base for BigInt encoding"); + } + +/* +* Set the sign +*/ +void BigInt::set_sign(Sign s) + { + if(is_zero()) + signedness = Positive; + else + signedness = s; + } + +/* +* Reverse the value of the sign flag +*/ +void BigInt::flip_sign() + { + set_sign(reverse_sign()); + } + +/* +* Return the opposite value of the current sign +*/ +BigInt::Sign BigInt::reverse_sign() const + { + if(sign() == Positive) + return Negative; + return Positive; + } + +/* +* Return the negation of this number +*/ +BigInt BigInt::operator-() const + { + BigInt x = (*this); + x.flip_sign(); + return x; + } + +/* +* Return the absolute value of this number +*/ +BigInt BigInt::abs() const + { + BigInt x = (*this); + x.set_sign(Positive); + return x; + } + +/* +* Encode this number into bytes +*/ +void BigInt::binary_encode(byte output[]) const + { + const u32bit sig_bytes = bytes(); + for(u32bit j = 0; j != sig_bytes; ++j) + output[sig_bytes-j-1] = byte_at(j); + } + +/* +* Set this number to the value in buf +*/ +void BigInt::binary_decode(const byte buf[], u32bit length) + { + const u32bit WORD_BYTES = sizeof(word); + + reg.create(round_up((length / WORD_BYTES) + 1, 8)); + + for(u32bit j = 0; j != length / WORD_BYTES; ++j) + { + u32bit top = length - WORD_BYTES*j; + for(u32bit k = WORD_BYTES; k > 0; --k) + reg[j] = (reg[j] << 8) | buf[top - k]; + } + for(u32bit j = 0; j != length % WORD_BYTES; ++j) + reg[length / WORD_BYTES] = (reg[length / WORD_BYTES] << 8) | buf[j]; + } + +/* +* Set this number to the value in buf +*/ +void BigInt::binary_decode(const MemoryRegion& buf) + { + binary_decode(buf, buf.size()); + } + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/bigint.h b/src/libs/3rdparty/botan/src/math/bigint/bigint.h new file mode 100644 index 00000000000..16a1bba96a0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/bigint.h @@ -0,0 +1,534 @@ +/* +* BigInt +* (C) 1999-2008 Jack Lloyd +* 2007 FlexSecure +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BIGINT_H__ +#define BOTAN_BIGINT_H__ + +#include +#include +#include +#include + +namespace Botan { + +/** + * Big Integer representation. This class defines an integer type, + * that can be very big. Additionally some helper functions are + * defined to work more comfortably. + + */ +class BOTAN_DLL BigInt + { + public: + /** + * Base-Enumerator (currently 8,10,16 and 256 are defined) + */ + enum Base { Octal = 8, Decimal = 10, Hexadecimal = 16, Binary = 256 }; + + /** + * Sign symbol definitions for positive and negative numbers + */ + enum Sign { Negative = 0, Positive = 1 }; + + /** + * Number types (Powers of 2) + */ + enum NumberType { Power2 }; + + /** + * DivideByZero Exception + */ + struct DivideByZero : public Exception + { DivideByZero() : Exception("BigInt divide by zero") {} }; + + /************* + * operators + *************/ + + /** + * += Operator + * @param y the BigInt to add to the local value + */ + BigInt& operator+=(const BigInt& y); + + /** + * -= Operator + * @param y the BigInt to subtract from the local value + */ + BigInt& operator-=(const BigInt& y); + + /** + * *= Operator + * @param y the BigInt to multiply with the local value + */ + BigInt& operator*=(const BigInt& y); + + /** + * /= Operator + * @param y the BigInt to divide the local value by + */ + BigInt& operator/=(const BigInt& y); + + /** + * %= Operator, modulo operator. + * @param y the modulus to reduce the local value by + */ + BigInt& operator%=(const BigInt& y); + + /** + * %= Operator + * @param y the modulus (word) to reduce the local value by + */ + word operator%=(word y); + + /** + * <<= Operator + * @param y the amount of bits to shift the local value left + */ + BigInt& operator<<=(u32bit y); + + /** + * >>= Operator + * @param y the amount of bits to shift the local value right + */ + BigInt& operator>>=(u32bit y); + + /** + * ++ Operator + */ + BigInt& operator++() { return (*this += 1); } + + /** + * -- Operator + */ + BigInt& operator--() { return (*this -= 1); } + + /** + * ++ Operator (postfix) + */ + BigInt operator++(int) { BigInt x = (*this); ++(*this); return x; } + + /** + * -- Operator (postfix) + */ + BigInt operator--(int) { BigInt x = (*this); --(*this); return x; } + + /** + * - Operator + */ + BigInt operator-() const; + + /** + * ! Operator + */ + bool operator !() const { return (!is_nonzero()); } + + /** + * [] Operator (array access) + */ + word& operator[](u32bit i) { return reg[i]; } + + /** + * [] Operator (array access) + */ + word operator[](u32bit i) const { return reg[i]; } + + /** + * Zeroize the BigInt + */ + void clear() { get_reg().clear(); } + + /************* + * functions + ************/ + + /** + * Compare *this to another BigInt. + * @param n the BigInt value to compare to the local value. + * @param check_signs Include sign in comparison? + * @result if (thisn) return 1, if both + * values are identical return 0. + */ + s32bit cmp(const BigInt& n, bool check_signs = true) const; + + /** + * Test if the integer has an even value + * @result true, if the integer an even value, false otherwise + */ + bool is_even() const { return (get_bit(0) == 0); } + + /** + * Test if the integer has an odd value + * @result true, if the integer an odd value, false otherwise + */ + bool is_odd() const { return (get_bit(0) == 1); } + + /** + * Test if the integer is not zero. + * @result true, if the integer has a non-zero value, false otherwise + */ + bool is_nonzero() const { return (!is_zero()); } + + /** + * Test if the integer is zero. + * @result true, if the integer has the value zero, false otherwise + */ + bool is_zero() const + { + const u32bit sw = sig_words(); + + for(u32bit i = 0; i != sw; ++i) + if(reg[i]) + return false; + return true; + } + + /** + * Set bit at specified position + * @param n bit position to set + */ + void set_bit(u32bit n); + + /** + * Clear bit at specified position + * @param n bit position to clear + */ + void clear_bit(u32bit n); + + /** + * Clear all but the lowest n bits + * @param n amount of bits to keep + */ + void mask_bits(u32bit n); + + /** + * Return bit value at specified position + * @param n the bit offset to test + * @result true, if the bit at position n is set, false otherwise + */ + bool get_bit(u32bit n) const; + + /** + * Return (a maximum of) 32 bits of the complete value + * @param offset the offset to start extracting + * @param length amount of bits to extract (starting at offset) + * @result the integer extracted from the register starting at + * offset with specified length + */ + u32bit get_substring(u32bit offset, u32bit length) const; + + byte byte_at(u32bit) const; + + /** + * Return the word at a specified position of the internal register + * @param n position in the register + * @return the value at position n + */ + word word_at(u32bit n) const + { return ((n < size()) ? reg[n] : 0); } + + /** + * Return the integer as an unsigned 32bit-integer-value. If the + * value is negative OR to big to be stored in 32bits, this + * function will throw an exception. + * @result a 32bit-integer + */ + u32bit to_u32bit() const; + + /** + * Tests if the sign of the integer is negative. + * @result true, if the integer has a negative sign, + */ + bool is_negative() const { return (sign() == Negative); } + + /** + * Tests if the sign of the integer is positive. + * @result true, if the integer has a positive sign, + */ + bool is_positive() const { return (sign() == Positive); } + + /** + * Return the sign of the integer + * @result the sign of the integer + */ + Sign sign() const { return (signedness); } + + /** + * Return the opposite sign of the represented integer value + * @result the opposite sign of the represented integer value + */ + Sign reverse_sign() const; + + /** + * Flip (change!) the sign of the integer to its opposite value + */ + void flip_sign(); + + /** + * Set sign of the integer + * @param sign new Sign to set + */ + void set_sign(Sign sign); + + /** + * Give absolute (positive) value of the integer + * @result absolute (positive) value of the integer + */ + BigInt abs() const; + + /** + * Give size of internal register + * @result size of internal register in words + */ + u32bit size() const { return get_reg().size(); } + + /** + * Give significant words of the represented integer value + * @result significant words of the represented integer value + */ + u32bit sig_words() const + { + const word* x = reg.begin(); + u32bit sig = reg.size(); + + while(sig && (x[sig-1] == 0)) + sig--; + return sig; + } + + /** + * Give byte-length of the integer + * @result byte-length of the represented integer value + */ + u32bit bytes() const; + + /** + * Get the bit-length of the integer. + * @result bit-length of the represented integer value + */ + u32bit bits() const; + + /** + * Return a pointer to the big integer word register. + * @result a pointer to the start of the internal register of + * the integer value + */ + const word* data() const { return reg.begin(); } + + /** + * return a reference to the internal register containing the value + * @result a reference to the word-array (SecureVector) + * with the internal register value (containing the integer + * value) + */ + SecureVector& get_reg() { return reg; } + + /** + * return a const reference to the internal register containing the value + * @result a const reference to the word-array (SecureVector) + * with the internal register value (containing the integer + * value) + */ + const SecureVector& get_reg() const { return reg; } + + /** + * Increase internal register buffer by n words + * @param n increase by n words + */ + void grow_reg(u32bit n); + + void grow_to(u32bit n); + + /** + * Fill BigInt with a random number with size of bitsize + * @param rng the random number generator to use + * @param bitsize number of bits the created random value should have + */ + void randomize(RandomNumberGenerator& rng, u32bit bitsize = 0); + + /** + * Store BigInt-value in a given byte array + * @param buf destination byte array for the integer value + */ + void binary_encode(byte buf[]) const; + + /** + * Read integer value from a byte array with given size + * @param buf byte array buffer containing the integer + * @param length size of buf + */ + void binary_decode(const byte buf[], u32bit length); + + /** + * Read integer value from a byte array (MemoryRegion) + * @param buf the BigInt value to compare to the local value. + */ + void binary_decode(const MemoryRegion& buf); + + u32bit encoded_size(Base = Binary) const; + + /** + @param rng a random number generator + @result a random integer between min and max + */ + static BigInt random_integer(RandomNumberGenerator& rng, + const BigInt& min, const BigInt& max); + + /** + * Encode the integer value from a BigInt to a SecureVector of bytes + * @param n the BigInt to use as integer source + * @param base number-base of resulting byte array representation + * @result SecureVector of bytes containing the integer with given base + */ + static SecureVector encode(const BigInt& n, Base base = Binary); + + /** + * Encode the integer value from a BigInt to a byte array + * @param buf destination byte array for the encoded integer + * value with given base + * @param n the BigInt to use as integer source + * @param base number-base of resulting byte array representation + */ + static void encode(byte buf[], const BigInt& n, Base base = Binary); + + /** + * Create a BigInt from an integer in a byte array + * @param buf the BigInt value to compare to the local value. + * @param length size of buf + * @param base number-base of the integer in buf + * @result BigInt-representing the given integer read from the byte array + */ + static BigInt decode(const byte buf[], u32bit length, + Base base = Binary); + + static BigInt decode(const MemoryRegion&, Base = Binary); + + /** + * Encode a Big Integer to a byte array according to IEEE1363. + * @param n the Big Integer to encode + * @param bytes the length of the resulting SecureVector + * @result a SecureVector containing the encoded Big Integer + */ + static SecureVector encode_1363(const BigInt& n, u32bit bytes); + + /** + * Swap BigInt-value with given BigInt. + * @param bigint the BigInt to swap values with + */ + void swap(BigInt& bigint); + + /** + * constructors + */ + + /** + * Create empty BigInt + */ + BigInt() { signedness = Positive; } + + /** + * Create BigInt from 64bit-Integer value + * @param n 64bit-integer + */ + BigInt(u64bit n); + + /** + * Copy-Constructor: clone given BigInt + * @param bigint the BigInt to clone + */ + BigInt(const BigInt& bigint); + + /** + * Create BigInt from a string. + * If the string starts with 0x the rest of the string will be + * interpreted as hexadecimal digits. + * If the string starts with 0 and the second character is NOT + * an 'x' the string will be interpreted as octal digits. + * If the string starts with non-zero digit, it will be + * interpreted as a decimal number. + * @param str the string to parse for an integer value + */ + BigInt(const std::string& str); + + /** + * Create a BigInt from an integer in a byte array + * @param buf the BigInt value to compare to the local value. + * @param length size of buf + * @param base number-base of the integer in buf + */ + BigInt(const byte buf[], u32bit length, Base base = Binary); + + /** + * Create a random BigInt of the specified size + * @param rng random number generator + * @param bits size in bits + */ + BigInt(RandomNumberGenerator& rng, u32bit bits); + + /** + * Create BigInt from unsigned 32 bit integer value and an + * also specify the sign of the value + * @param n integer value + */ + BigInt(Sign, u32bit n); + + /** + * Create a number of the specified type and size + * @param type the type of number to create + * @param n the size + */ + BigInt(NumberType type, u32bit n); + + private: + SecureVector reg; + Sign signedness; + }; + +/* +* Arithmetic Operators +*/ +BigInt BOTAN_DLL operator+(const BigInt&, const BigInt&); +BigInt BOTAN_DLL operator-(const BigInt&, const BigInt&); +BigInt BOTAN_DLL operator*(const BigInt&, const BigInt&); +BigInt BOTAN_DLL operator/(const BigInt&, const BigInt&); +BigInt BOTAN_DLL operator%(const BigInt&, const BigInt&); +word BOTAN_DLL operator%(const BigInt&, word); +BigInt BOTAN_DLL operator<<(const BigInt&, u32bit); +BigInt BOTAN_DLL operator>>(const BigInt&, u32bit); + +/* +* Comparison Operators +*/ +inline bool operator==(const BigInt& a, const BigInt& b) + { return (a.cmp(b) == 0); } +inline bool operator!=(const BigInt& a, const BigInt& b) + { return (a.cmp(b) != 0); } +inline bool operator<=(const BigInt& a, const BigInt& b) + { return (a.cmp(b) <= 0); } +inline bool operator>=(const BigInt& a, const BigInt& b) + { return (a.cmp(b) >= 0); } +inline bool operator<(const BigInt& a, const BigInt& b) + { return (a.cmp(b) < 0); } +inline bool operator>(const BigInt& a, const BigInt& b) + { return (a.cmp(b) > 0); } + +/* +* I/O Operators +*/ +BOTAN_DLL std::ostream& operator<<(std::ostream&, const BigInt&); +BOTAN_DLL std::istream& operator>>(std::istream&, BigInt&); + +} + +namespace std { + +inline void swap(Botan::BigInt& a, Botan::BigInt& b) { a.swap(b); } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/divide.cpp b/src/libs/3rdparty/botan/src/math/bigint/divide.cpp new file mode 100644 index 00000000000..6afaa0feef2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/divide.cpp @@ -0,0 +1,106 @@ +/* +* Division Algorithm +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace { + +/* +* Handle signed operands, if necessary +*/ +void sign_fixup(const BigInt& x, const BigInt& y, BigInt& q, BigInt& r) + { + if(x.sign() == BigInt::Negative) + { + q.flip_sign(); + if(r.is_nonzero()) { --q; r = y.abs() - r; } + } + if(y.sign() == BigInt::Negative) + q.flip_sign(); + } + +} + +/* +* Solve x = q * y + r +*/ +void divide(const BigInt& x, const BigInt& y_arg, BigInt& q, BigInt& r) + { + if(y_arg.is_zero()) + throw BigInt::DivideByZero(); + + BigInt y = y_arg; + const u32bit y_words = y.sig_words(); + r = x; + + r.set_sign(BigInt::Positive); + y.set_sign(BigInt::Positive); + + s32bit compare = r.cmp(y); + + if(compare < 0) + q = 0; + else if(compare == 0) + { + q = 1; + r = 0; + } + else + { + u32bit shifts = 0; + word y_top = y[y.sig_words()-1]; + while(y_top < MP_WORD_TOP_BIT) { y_top <<= 1; ++shifts; } + y <<= shifts; + r <<= shifts; + + const u32bit n = r.sig_words() - 1, t = y_words - 1; + + q.get_reg().create(n - t + 1); + if(n <= t) + { + while(r > y) { r -= y; ++q; } + r >>= shifts; + sign_fixup(x, y_arg, q, r); + return; + } + + BigInt temp = y << (MP_WORD_BITS * (n-t)); + + while(r >= temp) { r -= temp; ++q[n-t]; } + + for(u32bit j = n; j != t; --j) + { + const word x_j0 = r.word_at(j); + const word x_j1 = r.word_at(j-1); + const word y_t = y.word_at(t); + + if(x_j0 == y_t) + q[j-t-1] = MP_WORD_MAX; + else + q[j-t-1] = bigint_divop(x_j0, x_j1, y_t); + + while(bigint_divcore(q[j-t-1], y_t, y.word_at(t-1), + x_j0, x_j1, r.word_at(j-2))) + --q[j-t-1]; + + r -= (q[j-t-1] * y) << (MP_WORD_BITS * (j-t-1)); + if(r.is_negative()) + { + r += y << (MP_WORD_BITS * (j-t-1)); + --q[j-t-1]; + } + } + r >>= shifts; + } + + sign_fixup(x, y_arg, q, r); + } + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/divide.h b/src/libs/3rdparty/botan/src/math/bigint/divide.h new file mode 100644 index 00000000000..9445b137b7c --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/divide.h @@ -0,0 +1,19 @@ +/* +* Division +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DIVISON_ALGORITHM_H__ +#define BOTAN_DIVISON_ALGORITHM_H__ + +#include + +namespace Botan { + +void BOTAN_DLL divide(const BigInt&, const BigInt&, BigInt&, BigInt&); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/info.txt b/src/libs/3rdparty/botan/src/math/bigint/info.txt new file mode 100644 index 00000000000..513703deb14 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/info.txt @@ -0,0 +1,33 @@ +realname "BigInt" + +load_on auto + +define BIGINT + + +bigint.h +divide.h +mp_core.h +mp_types.h +big_code.cpp +big_io.cpp +big_ops2.cpp +big_ops3.cpp +big_rand.cpp +bigint.cpp +divide.cpp +mp_asm.cpp +mp_comba.cpp +mp_karat.cpp +mp_misc.cpp +mp_shift.cpp + + + +alloc +hex +mp_amd64|mp_asm64|mp_ia32|mp_ia32_msvc|mp_generic +monty_generic +mulop_generic +rng + diff --git a/src/libs/3rdparty/botan/src/math/bigint/monty_amd64/info.txt b/src/libs/3rdparty/botan/src/math/bigint/monty_amd64/info.txt new file mode 100644 index 00000000000..a897045b2fe --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/monty_amd64/info.txt @@ -0,0 +1,32 @@ +realname "Montgomery Reduction (x86-64)" + +mp_bits 64 + +load_on never + + +mp_monty.S + + + +amd64 + + + +gcc +icc + + +# ELF systems + +linux +freebsd +dragonfly +netbsd +openbsd +solaris + + + +asm_amd64 + diff --git a/src/libs/3rdparty/botan/src/math/bigint/monty_amd64/mp_monty.S b/src/libs/3rdparty/botan/src/math/bigint/monty_amd64/mp_monty.S new file mode 100644 index 00000000000..22045c36904 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/monty_amd64/mp_monty.S @@ -0,0 +1,399 @@ +/* +* Montgomery Reduction Source File +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +START_LISTING(mp_monty.S) + +START_FUNCTION(bigint_monty_redc) + pushq %r15 # + pushq %r14 # + pushq %r13 # + pushq %r12 # + pushq %rbp # + pushq %rbx # + + movq %rdi, %r14 # z + movq %rdx, %r12 # x + movl %esi, %ebp # z_size + + xorl %esi, %esi # j.76 + movq %r8, -16(%rsp) # u, u + movl %ecx, %ebx # x_size, x_size + movl %ecx, %r8d # x_size, blocks_of_8 + andl $-8, %r8d #, blocks_of_8 + testl %ecx, %ecx # x_size + je .L3 #, + mov %ecx, %eax # x_size, pretmp.71 + leal 1(%rbx), %r15d #, k.73 + salq $3, %rax #, + xorl %r13d, %r13d # j + movq %rax, -8(%rsp) #, pretmp.21 + .p2align 4,,10 + .p2align 3 +.L11: + mov %r13d, %eax # j, j + movq -16(%rsp), %rdi # u, y + leaq (%r14,%rax,8), %r11 #, z_j + xorl %r9d, %r9d # i + imulq (%r11), %rdi #* z_j, y + xorl %r10d, %r10d # carry + testl %r8d, %r8d # blocks_of_8 + je .L7 #, + .p2align 4,,10 + .p2align 3 +.LOOP_MUL_ADD: + mov %r9d, %ecx # i, i + addl $8, %r9d #, i + salq $3, %rcx #, D.2315 + leaq (%r11,%rcx), %rsi #, tmp130 + leaq (%r12,%rcx), %rcx #, tmp131 + + movq 8*0(%rcx), %rax + mulq %rdi # y + addq %r10, %rax # carry + adcq $0,%rdx + addq 8*0(%rsi), %rax + adcq $0,%rdx + movq %rdx,%r10 # carry + movq %rax, 8*0 (%rsi) + + movq 8*1(%rcx), %rax + mulq %rdi # y + addq %r10, %rax # carry + adcq $0,%rdx + addq 8*1(%rsi), %rax + adcq $0,%rdx + movq %rdx,%r10 # carry + movq %rax, 8*1 (%rsi) + + movq 8*2(%rcx), %rax + mulq %rdi # y + addq %r10, %rax # carry + adcq $0,%rdx + addq 8*2(%rsi), %rax + adcq $0,%rdx + movq %rdx,%r10 # carry + movq %rax, 8*2 (%rsi) + + movq 8*3(%rcx), %rax + mulq %rdi # y + addq %r10, %rax # carry + adcq $0,%rdx + addq 8*3(%rsi), %rax + adcq $0,%rdx + movq %rdx,%r10 # carry + movq %rax, 8*3 (%rsi) + + movq 8*4(%rcx), %rax + mulq %rdi # y + addq %r10, %rax # carry + adcq $0,%rdx + addq 8*4(%rsi), %rax + adcq $0,%rdx + movq %rdx,%r10 # carry + movq %rax, 8*4 (%rsi) + + movq 8*5(%rcx), %rax + mulq %rdi # y + addq %r10, %rax # carry + adcq $0,%rdx + addq 8*5(%rsi), %rax + adcq $0,%rdx + movq %rdx,%r10 # carry + movq %rax, 8*5 (%rsi) + + movq 8*6(%rcx), %rax + mulq %rdi # y + addq %r10, %rax # carry + adcq $0,%rdx + addq 8*6(%rsi), %rax + adcq $0,%rdx + movq %rdx,%r10 # carry + movq %rax, 8*6 (%rsi) + + movq 8*7(%rcx), %rax + mulq %rdi # y + addq %r10, %rax # carry + adcq $0,%rdx + addq 8*7(%rsi), %rax + adcq $0,%rdx + movq %rdx,%r10 # carry + movq %rax, 8*7 (%rsi) + + cmpl %r9d, %r8d # i, blocks_of_8 + jne .LOOP_MUL_ADD #, + cmpl %r8d, %ebx # blocks_of_8, x_size + je .L8 #, +.L7: + movl %r8d, %esi # blocks_of_8, i + .p2align 4,,10 + .p2align 3 +.L5: + mov %esi, %eax # i, i + movq %rdi, %rcx # y, b + leaq (%r11, %rax,8), %r9 #, D.2325 + incl %esi # i + movq (%r12, %rax,8), %rax #* x, tmp133 + + mulq %rcx # b + addq (%r9), %rax #* D.2325, a + adcq $0,%rdx # + addq %r10, %rax # carry, a + adcq $0,%rdx # + + cmpl %esi, %ebx # i, x_size + movq %rdx, %r10 #, carry + movq %rax, (%r9) # a,* D.2325 + jne .L5 #, +.L8: + movq -8(%rsp), %rdx # pretmp.21, + leaq (%r11,%rdx), %rax #, D.2332 + movq (%rax), %rcx #* D.2332, D.2333 + leaq (%r10,%rcx), %rdx #, z_sum + movq %rdx, (%rax) # z_sum,* D.2332 + cmpq %rdx, %rcx # z_sum, D.2333 + jbe .L9 #, + cmpl %ebp, %r15d # z_size, k.73 + je .L9 #, + movl %r15d, %ecx # k.73, k + jmp .L10 # + .p2align 4,,10 + .p2align 3 +.L31: + incl %ecx # k + cmpl %ecx, %ebp # k, z_size + .p2align 4,,4 + .p2align 3 + je .L9 #, +.L10: + mov %ecx, %edx # k, k + leaq (%r11,%rdx,8), %rdx #, D.2342 + movq (%rdx), %rax #* D.2342, tmp136 + incq %rax # D.2344 + movq %rax, (%rdx) # D.2344,* D.2342 + testq %rax, %rax # D.2344 + je .L31 #, +.L9: + incl %r13d # j + decl %ebp # z_size + cmpl %r13d, %ebx # j, x_size + jne .L11 #, + movl %ebx, %esi # x_size, j.76 +.L3: + leal (%rbx,%rbx), %eax #, tmp137 + mov %eax, %eax + leaq (%r14, %rax,8), %rdi #, D.2349 + cmpq $0, (%rdi) #,* D.2349 + jne .L12 #, + testl %ebx, %ebx # x_size + je .L12 #, + leal -1(%rbx), %ecx #, j + leal (%rsi,%rcx), %edx #, tmp141 + mov %ecx, %eax # j, j + movq (%r14,%rdx,8), %rbp #* z, + cmpq %rbp, (%r12, %rax,8) #,* x + jb .L12 #, + ja .L_EXIT #, + leal -2(%rsi,%rbx), %edx #, ivtmp.45 + jmp .L14 # + .p2align 4,,10 + .p2align 3 +.L15: + mov %edx, %eax # ivtmp.45, ivtmp.45 + decl %ecx # j + movq (%r14, %rax,8), %rsi #* z, D.2360 + mov %ecx, %eax # j, j + movq (%r12, %rax,8), %rax #* x, temp.68 + cmpq %rax, %rsi + ja .L12 #, + decl %edx # ivtmp.45 + cmpq %rax, %rsi + jb .L_EXIT #, +.L14: + testl %ecx, %ecx # j + jne .L15 #, +.L12: + xorl %ecx, %ecx # j + xorl %r10d, %r10d # carry + mov %ebx, %esi # x_size, pretmp.19 + testl %r8d, %r8d # blocks_of_8 + je .L17 #, + .p2align 4,,10 + .p2align 3 +.L22: + mov %ecx, %edx # j, D.2375 + addl $8, %ecx #, j + leaq (%rdx,%rsi), %rax #, tmp146 + leaq (%r12,%rdx,8), %rdx #, tmp150 + leaq (%r14, %rax,8), %rax #, tmp148 + + rorq %r10 # carry + + movq 8*0(%rdx), %r10 + sbbq %r10, 8*0(%rax) + + movq 8*1(%rdx), %r10 + sbbq %r10, 8*1(%rax) + + movq 8*2(%rdx), %r10 + sbbq %r10, 8*2(%rax) + + movq 8*3(%rdx), %r10 + sbbq %r10, 8*3(%rax) + + movq 8*4(%rdx), %r10 + sbbq %r10, 8*4(%rax) + + movq 8*5(%rdx), %r10 + sbbq %r10, 8*5(%rax) + + movq 8*6(%rdx), %r10 + sbbq %r10, 8*6(%rax) + + movq 8*7(%rdx), %r10 + sbbq %r10, 8*7(%rax) + + sbbq %r10,%r10 # carry + negq %r10 # carry + + cmpl %ecx, %r8d # j, blocks_of_8 + jne .L22 #, +.L17: + cmpl %r8d, %ebx # blocks_of_8, x_size + je .L19 #, + leal (%r8,%rbx), %r9d #, ivtmp.33 + movl %r8d, %esi # blocks_of_8, j + .p2align 4,,10 + .p2align 3 +.L20: + mov %r9d, %eax # ivtmp.33, ivtmp.33 + mov %esi, %ecx # j, j + leaq (%r14, %rax,8), %rax #, D.2387 + incl %esi # j + movq (%rax), %rdx #* D.2387, tmp153 + incl %r9d # ivtmp.33 + + rorq %r10 # carry + sbbq (%r12,%rcx,8),%rdx #* x, x + sbbq %r10,%r10 # carry + negq %r10 # carry + + cmpl %esi, %ebx # j, x_size + movq %rdx, (%rax) # x,* D.2387 + jne .L20 #, +.L19: + testq %r10, %r10 # carry + je .L_EXIT #, + decq (%rdi) #* D.2349 +.L_EXIT: + popq %rbx # + popq %rbp # + popq %r12 # + popq %r13 # + popq %r14 # + popq %r15 # +END_FUNCTION(bigint_monty_redc) + + +#if 0 + #define Z_ARR ARG_1 // rdi +#define Z_SIZE ARG_2_32 // esi +// X_ARR is ARG_3 == rdx, moved b/c needed for multiply +#define X_SIZE ARG_4_32 // ecx +#define U ARG_5 // r8 + +/* + We need all arguments for a while (we can reuse U eventually) + So only temp registers are + TEMP_1 %r10 + TEMP_2 %r11 + TEMP_3 = ARG_6 = %r9 + void return, so also + R0 %rax (aka TEMP_9) + is free (but needed for multiply) + + Can push: + %rbx (base pointer, callee saved) + %rpb (frame pointer, callee saved) + %r12-%r15 (callee saved) + + Can push base/frame pointers since this is a leaf function + and does not reference any data. +*/ + + push %r12 + push %r13 + push %r14 + push %r15 + +#define LOOP_CTR_I %r12 +#define LOOP_CTR_J %r13 + +#define CARRY TEMP_1 +#define Z_WORD TEMP_2 +#define X_ARR TEMP_3 +#define MUL_LO %rax +#define MUL_HI %rdx + + ASSIGN(X_ARR, ARG_3) + + /* + ZEROIZE(CARRY) + + ASSIGN(LOOP_CTR, X_SIZE) + + JUMP_IF_ZERO(LOOP_CTR, .L_MULADD_DONE) + JUMP_IF_LT(LOOP_CTR, 8, .LOOP_MULADD1) + +#define MULADD_OP(N) \ + ASSIGN(MUL_LO, ARRAY8(X_ARR, N)) ; \ + ASSIGN(Z_WORD, ARRAY8(Z_ARR, N)) ; \ + MUL(Y) ; \ + ADD(Z_WORD, CARRY) ; \ + ASSIGN(CARRY, MUL_HI) ; \ + ADD_LAST_CARRY(CARRY) ; \ + ADD(Z_WORD, MUL_LO) ; \ + ADD_LAST_CARRY(CARRY) ; \ + ASSIGN(ARRAY8(Z_ARR, N), Z_WORD) + +ALIGN +.LOOP_MULADD8: + MULADD_OP(0) + MULADD_OP(1) + MULADD_OP(2) + MULADD_OP(3) + MULADD_OP(4) + MULADD_OP(5) + MULADD_OP(6) + MULADD_OP(7) + + SUB_IMM(LOOP_CTR, 8) + ADD_IMM(Z_ARR, 64) + ADD_IMM(X_ARR, 64) + cmp IMM(8), LOOP_CTR + jge .LOOP_MULADD8 + + JUMP_IF_ZERO(LOOP_CTR, .L_MULADD_DONE) + +ALIGN +.LOOP_MULADD1: + MULADD_OP(0) + + SUB_IMM(LOOP_CTR, 1) + ADD_IMM(Z_ARR, 8) + ADD_IMM(X_ARR, 8) + + cmp IMM(0), LOOP_CTR + jne .LOOP_MULADD1 +*/ + + pop %r15 + pop %r14 + pop %r13 + pop %r12 +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/monty_generic/info.txt b/src/libs/3rdparty/botan/src/math/bigint/monty_generic/info.txt new file mode 100644 index 00000000000..6f5f0e72267 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/monty_generic/info.txt @@ -0,0 +1,7 @@ +realname "Montgomery Reduction" + +load_on dep + + +mp_monty.cpp + diff --git a/src/libs/3rdparty/botan/src/math/bigint/monty_generic/mp_monty.cpp b/src/libs/3rdparty/botan/src/math/bigint/monty_generic/mp_monty.cpp new file mode 100644 index 00000000000..5409e2569a6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/monty_generic/mp_monty.cpp @@ -0,0 +1,78 @@ +/* +* Montgomery Reduction +* (C) 1999-2008 Jack Lloyd +* 2006 Luca Piccarreta +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +extern "C" { + +/* +* Montgomery Reduction Algorithm +*/ +void bigint_monty_redc(word z[], u32bit z_size, + const word x[], u32bit x_size, word u) + { + const u32bit blocks_of_8 = x_size - (x_size % 8); + + for(u32bit i = 0; i != x_size; ++i) + { + word* z_i = z + i; + + const word y = z_i[0] * u; + + word carry = 0; + + for(u32bit j = 0; j != blocks_of_8; j += 8) + carry = word8_madd3(z_i + j, x + j, y, carry); + + for(u32bit j = blocks_of_8; j != x_size; ++j) + z_i[j] = word_madd3(x[j], y, z_i[j], &carry); + + word z_sum = z_i[x_size] + carry; + carry = (z_sum < z_i[x_size]); + z_i[x_size] = z_sum; + + for(u32bit j = x_size + 1; carry && j != z_size - i; ++j) + { + ++z_i[j]; + carry = !z_i[j]; + } + } + + // Check if z[x_size...x_size+1] >= x[0...x_size] using bigint_cmp (inlined) + if(!z[x_size + x_size]) + { + for(u32bit i = x_size; i > 0; --i) + { + if(z[x_size + i - 1] > x[i-1]) + break; + + if(z[x_size + i - 1] < x[i-1]) + return; + } + } + + // If the compare above is true, subtract using bigint_sub2 (inlined) + word carry = 0; + + for(u32bit i = 0; i != blocks_of_8; i += 8) + carry = word8_sub2(z + x_size + i, x + i, carry); + + for(u32bit i = blocks_of_8; i != x_size; ++i) + z[x_size + i] = word_sub(z[x_size + i], x[i], &carry); + + if(carry) + --z[x_size+x_size]; + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_amd64/info.txt b/src/libs/3rdparty/botan/src/math/bigint/mp_amd64/info.txt new file mode 100644 index 00000000000..84a5bcf53ff --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_amd64/info.txt @@ -0,0 +1,19 @@ +realname "MPI Core (x86-64)" + +mp_bits 64 + +load_on dep + + +mp_asm.h +mp_asmi.h + + + +amd64 + + + +gcc +icc + diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_amd64/mp_asm.h b/src/libs/3rdparty/botan/src/math/bigint/mp_amd64/mp_asm.h new file mode 100644 index 00000000000..fa66d04f319 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_amd64/mp_asm.h @@ -0,0 +1,69 @@ +/* +* Lowest Level MPI Algorithms +* (C) 1999-2008 Jack Lloyd +* 2006 Luca Piccarreta +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MP_ASM_H__ +#define BOTAN_MP_ASM_H__ + +#include + +#if (BOTAN_MP_WORD_BITS != 64) + #error The mp_amd64 module requires that BOTAN_MP_WORD_BITS == 64 +#endif + +namespace Botan { + +extern "C" { + +/* +* Helper Macros for amd64 Assembly +*/ +#define ASM(x) x "\n\t" + +/* +* Word Multiply +*/ +inline word word_madd2(word a, word b, word* c) + { + asm( + ASM("mulq %[b]") + ASM("addq %[c],%[a]") + ASM("adcq $0,%[carry]") + + : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*c) + : "0"(a), "1"(b), [c]"g"(*c) : "cc"); + + return a; + } + +/* +* Word Multiply/Add +*/ +inline word word_madd3(word a, word b, word c, word* d) + { + asm( + ASM("mulq %[b]") + + ASM("addq %[c],%[a]") + ASM("adcq $0,%[carry]") + + ASM("addq %[d],%[a]") + ASM("adcq $0,%[carry]") + + : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*d) + : "0"(a), "1"(b), [c]"g"(c), [d]"g"(*d) : "cc"); + + return a; + } + +#undef ASM + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_amd64/mp_asmi.h b/src/libs/3rdparty/botan/src/math/bigint/mp_amd64/mp_asmi.h new file mode 100644 index 00000000000..8bccbaaf497 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_amd64/mp_asmi.h @@ -0,0 +1,243 @@ +/* +* Lowest Level MPI Algorithms +* (C) 1999-2007 Jack Lloyd +* 2006 Luca Piccarreta +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MP_ASM_INTERNAL_H__ +#define BOTAN_MP_ASM_INTERNAL_H__ + +#include + +namespace Botan { + +extern "C" { + +/* +* Helper Macros for amd64 Assembly +*/ +#ifndef ASM + #define ASM(x) x "\n\t" +#endif + +#define ADDSUB2_OP(OPERATION, INDEX) \ + ASM("movq 8*" #INDEX "(%[y]), %[carry]") \ + ASM(OPERATION " %[carry], 8*" #INDEX "(%[x])") \ + +#define ADDSUB3_OP(OPERATION, INDEX) \ + ASM("movq 8*" #INDEX "(%[x]), %[carry]") \ + ASM(OPERATION " 8*" #INDEX "(%[y]), %[carry]") \ + ASM("movq %[carry], 8*" #INDEX "(%[z])") \ + +#define LINMUL_OP(WRITE_TO, INDEX) \ + ASM("movq 8*" #INDEX "(%[x]),%%rax") \ + ASM("mulq %[y]") \ + ASM("addq %[carry],%%rax") \ + ASM("adcq $0,%%rdx") \ + ASM("movq %%rdx,%[carry]") \ + ASM("movq %%rax, 8*" #INDEX "(%[" WRITE_TO "])") + +#define MULADD_OP(IGNORED, INDEX) \ + ASM("movq 8*" #INDEX "(%[x]),%%rax") \ + ASM("mulq %[y]") \ + ASM("addq %[carry],%%rax") \ + ASM("adcq $0,%%rdx") \ + ASM("addq 8*" #INDEX "(%[z]),%%rax") \ + ASM("adcq $0,%%rdx") \ + ASM("movq %%rdx,%[carry]") \ + ASM("movq %%rax, 8*" #INDEX " (%[z])") + +#define DO_8_TIMES(MACRO, ARG) \ + MACRO(ARG, 0) \ + MACRO(ARG, 1) \ + MACRO(ARG, 2) \ + MACRO(ARG, 3) \ + MACRO(ARG, 4) \ + MACRO(ARG, 5) \ + MACRO(ARG, 6) \ + MACRO(ARG, 7) + +#define ADD_OR_SUBTRACT(CORE_CODE) \ + ASM("rorq %[carry]") \ + CORE_CODE \ + ASM("sbbq %[carry],%[carry]") \ + ASM("negq %[carry]") + +/* +* Word Addition +*/ +inline word word_add(word x, word y, word* carry) + { +#if 0 + asm( + ADD_OR_SUBTRACT(ASM("adcq %[y],%[x]")) + : [x]"=r"(x), [carry]"=r"(*carry) + : "0"(x), [y]"rm"(y), "1"(*carry) + : "cc"); + return x; +#else + word z = x + y; + word c1 = (z < x); + z += *carry; + *carry = c1 | (z < *carry); + return z; +#endif + } + +/* +* Eight Word Block Addition, Two Argument +*/ +inline word word8_add2(word x[8], const word y[8], word carry) + { + asm( + ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB2_OP, "adcq")) + : [carry]"=r"(carry) + : [x]"r"(x), [y]"r"(y), "0"(carry) + : "cc", "memory"); + return carry; + } + +/* +* Eight Word Block Addition, Three Argument +*/ +inline word word8_add3(word z[8], const word x[8], const word y[8], word carry) + { + asm( + ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "adcq")) + : [carry]"=r"(carry) + : [x]"r"(x), [y]"r"(y), [z]"r"(z), "0"(carry) + : "cc", "memory"); + return carry; + } + +/* +* Word Subtraction +*/ +inline word word_sub(word x, word y, word* carry) + { + asm( + ADD_OR_SUBTRACT(ASM("sbbq %[y],%[x]")) + : [x]"=r"(x), [carry]"=r"(*carry) + : "0"(x), [y]"rm"(y), "1"(*carry) + : "cc"); + return x; + } + +/* +* Eight Word Block Subtraction, Two Argument +*/ +inline word word8_sub2(word x[8], const word y[8], word carry) + { + asm( + ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB2_OP, "sbbq")) + : [carry]"=r"(carry) + : [x]"r"(x), [y]"r"(y), "0"(carry) + : "cc", "memory"); + return carry; + } + +/* +* Eight Word Block Subtraction, Three Argument +*/ +inline word word8_sub3(word z[8], const word x[8], const word y[8], word carry) + { + asm( + ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "sbbq")) + : [carry]"=r"(carry) + : [x]"r"(x), [y]"r"(y), [z]"r"(z), "0"(carry) + : "cc", "memory"); + return carry; + } + +/* +* Eight Word Block Linear Multiplication +*/ +inline word word8_linmul2(word x[8], word y, word carry) + { + asm( + DO_8_TIMES(LINMUL_OP, "x") + : [carry]"=r"(carry) + : [x]"r"(x), [y]"rm"(y), "0"(carry) + : "cc", "%rax", "%rdx"); + return carry; + } + +/* +* Eight Word Block Linear Multiplication +*/ +inline word word8_linmul3(word z[8], const word x[8], word y, word carry) + { + asm( + DO_8_TIMES(LINMUL_OP, "z") + : [carry]"=r"(carry) + : [z]"r"(z), [x]"r"(x), [y]"rm"(y), "0"(carry) + : "cc", "%rax", "%rdx"); + return carry; + } + +/* +* Eight Word Block Multiply/Add +*/ +inline word word8_madd3(word z[8], const word x[8], word y, word carry) + { + asm( + DO_8_TIMES(MULADD_OP, "") + : [carry]"=r"(carry) + : [z]"r"(z), [x]"r"(x), [y]"rm"(y), "0"(carry) + : "cc", "%rax", "%rdx"); + return carry; + } + +/* +* Multiply-Add Accumulator +*/ +inline void word3_muladd(word* w2, word* w1, word* w0, word x, word y) + { + asm( + ASM("mulq %[y]") + + ASM("addq %[x],%[w0]") + ASM("adcq %[y],%[w1]") + ASM("adcq $0,%[w2]") + + : [w0]"=r"(*w0), [w1]"=r"(*w1), [w2]"=r"(*w2) + : [x]"a"(x), [y]"d"(y), "0"(*w0), "1"(*w1), "2"(*w2) + : "cc"); + } + +/* +* Multiply-Add Accumulator +*/ +inline void word3_muladd_2(word* w2, word* w1, word* w0, word x, word y) + { + asm( + ASM("mulq %[y]") + + ASM("addq %[x],%[w0]") + ASM("adcq %[y],%[w1]") + ASM("adcq $0,%[w2]") + + ASM("addq %[x],%[w0]") + ASM("adcq %[y],%[w1]") + ASM("adcq $0,%[w2]") + + : [w0]"=r"(*w0), [w1]"=r"(*w1), [w2]"=r"(*w2) + : [x]"a"(x), [y]"d"(y), "0"(*w0), "1"(*w1), "2"(*w2) + : "cc"); + } + + +#undef ASM +#undef DO_8_TIMES +#undef ADD_OR_SUBTRACT +#undef ADDSUB2_OP +#undef ADDSUB3_OP +#undef LINMUL_OP +#undef MULADD_OP + +} + +} +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_asm.cpp b/src/libs/3rdparty/botan/src/math/bigint/mp_asm.cpp new file mode 100644 index 00000000000..ea9738d3020 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_asm.cpp @@ -0,0 +1,179 @@ +/* +* Lowest Level MPI Algorithms +* (C) 1999-2008 Jack Lloyd +* 2006 Luca Piccarreta +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +extern "C" { + +/* +* Two Operand Addition, No Carry +*/ +word bigint_add2_nc(word x[], u32bit x_size, const word y[], u32bit y_size) + { + word carry = 0; + + const u32bit blocks = y_size - (y_size % 8); + + for(u32bit j = 0; j != blocks; j += 8) + carry = word8_add2(x + j, y + j, carry); + + for(u32bit j = blocks; j != y_size; ++j) + x[j] = word_add(x[j], y[j], &carry); + + if(!carry) + return 0; + + for(u32bit j = y_size; j != x_size; ++j) + if(++x[j]) + return 0; + + return 1; + } + +/* +* Three Operand Addition, No Carry +*/ +word bigint_add3_nc(word z[], const word x[], u32bit x_size, + const word y[], u32bit y_size) + { + if(x_size < y_size) + { return bigint_add3_nc(z, y, y_size, x, x_size); } + + word carry = 0; + + const u32bit blocks = y_size - (y_size % 8); + + for(u32bit j = 0; j != blocks; j += 8) + carry = word8_add3(z + j, x + j, y + j, carry); + + for(u32bit j = blocks; j != y_size; ++j) + z[j] = word_add(x[j], y[j], &carry); + + for(u32bit j = y_size; j != x_size; ++j) + { + word x_j = x[j] + carry; + if(carry && x_j) + carry = 0; + z[j] = x_j; + } + + return carry; + } + +/* +* Two Operand Addition +*/ +void bigint_add2(word x[], u32bit x_size, const word y[], u32bit y_size) + { + if(bigint_add2_nc(x, x_size, y, y_size)) + ++x[x_size]; + } + +/* +* Three Operand Addition +*/ +void bigint_add3(word z[], const word x[], u32bit x_size, + const word y[], u32bit y_size) + { + if(bigint_add3_nc(z, x, x_size, y, y_size)) + ++z[(x_size > y_size ? x_size : y_size)]; + } + +/* +* Two Operand Subtraction +*/ +void bigint_sub2(word x[], u32bit x_size, const word y[], u32bit y_size) + { + word carry = 0; + + const u32bit blocks = y_size - (y_size % 8); + + for(u32bit j = 0; j != blocks; j += 8) + carry = word8_sub2(x + j, y + j, carry); + + for(u32bit j = blocks; j != y_size; ++j) + x[j] = word_sub(x[j], y[j], &carry); + + if(!carry) return; + + for(u32bit j = y_size; j != x_size; ++j) + { + --x[j]; + if(x[j] != MP_WORD_MAX) return; + } + } + +/* +* Three Operand Subtraction +*/ +void bigint_sub3(word z[], const word x[], u32bit x_size, + const word y[], u32bit y_size) + { + word carry = 0; + + const u32bit blocks = y_size - (y_size % 8); + + for(u32bit j = 0; j != blocks; j += 8) + carry = word8_sub3(z + j, x + j, y + j, carry); + + for(u32bit j = blocks; j != y_size; ++j) + z[j] = word_sub(x[j], y[j], &carry); + + for(u32bit j = y_size; j != x_size; ++j) + { + word x_j = x[j] - carry; + if(carry && x_j != MP_WORD_MAX) + carry = 0; + z[j] = x_j; + } + } + +/* +* Two Operand Linear Multiply +*/ +void bigint_linmul2(word x[], u32bit x_size, word y) + { + const u32bit blocks = x_size - (x_size % 8); + + word carry = 0; + + for(u32bit j = 0; j != blocks; j += 8) + carry = word8_linmul2(x + j, y, carry); + + for(u32bit j = blocks; j != x_size; ++j) + x[j] = word_madd2(x[j], y, &carry); + + x[x_size] = carry; + } + +/* +* Three Operand Linear Multiply +*/ +void bigint_linmul3(word z[], const word x[], u32bit x_size, word y) + { + const u32bit blocks = x_size - (x_size % 8); + + word carry = 0; + + for(u32bit j = 0; j != blocks; j += 8) + carry = word8_linmul3(z + j, x + j, y, carry); + + for(u32bit j = blocks; j != x_size; ++j) + z[j] = word_madd2(x[j], y, &carry); + + z[x_size] = carry; + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_asm64/info.txt b/src/libs/3rdparty/botan/src/math/bigint/mp_asm64/info.txt new file mode 100644 index 00000000000..5c112c490c5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_asm64/info.txt @@ -0,0 +1,27 @@ +realname "MPI Core (Alpha/IA-64/MIPS64/PowerPC-64/SPARC64)" + +mp_bits 64 + +load_on dep + + +mp_asm.h +mp_generic:mp_asmi.h + + + +#amd64 +alpha +ia64 +mips64 +ppc64 +sparc64 + + +# The inline asm only works with gcc, but it looks like (at least on +# UltraSPARC), using 64-bit words and the sythensized multiply is a 5 to 25% +# win, so it's probably worth using elsewhere. + +gcc +sunwspro + diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_asm64/mp_asm.h b/src/libs/3rdparty/botan/src/math/bigint/mp_asm64/mp_asm.h new file mode 100644 index 00000000000..c9159eaa71c --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_asm64/mp_asm.h @@ -0,0 +1,119 @@ +/* +* MPI Multiply-Add Core +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MP_MADD_H__ +#define BOTAN_MP_MADD_H__ + +#include + +namespace Botan { + +#if (BOTAN_MP_WORD_BITS != 64) + #error The mp_asm64 module requires that BOTAN_MP_WORD_BITS == 64 +#endif + +#if defined(BOTAN_TARGET_ARCH_IS_ALPHA) + +#define BOTAN_WORD_MUL(a,b,z1,z0) do { \ + asm("umulh %1,%2,%0" : "=r" (z0) : "r" (a), "r" (b)); \ + z1 = a * b; \ +} while(0); + +#elif defined(BOTAN_TARGET_ARCH_IS_AMD64) + +#define BOTAN_WORD_MUL(a,b,z1,z0) do { \ + asm("mulq %3" : "=d" (z0), "=a" (z1) : \ + "a" (a), "rm" (b) : "cc"); \ +} while(0); + +#elif defined(BOTAN_TARGET_ARCH_IS_IA64) + +#define BOTAN_WORD_MUL(a,b,z1,z0) do { \ + asm("xmpy.hu %0=%1,%2" : "=f" (z0) : "f" (a), "f" (b)); \ + z1 = a * b; \ +} while(0); + +#elif defined(BOTAN_TARGET_ARCH_IS_PPC64) + +#define BOTAN_WORD_MUL(a,b,z1,z0) do { \ + asm("mulhdu %0,%1,%2" : "=r" (z0) : "r" (a), "r" (b) : "cc"); \ + z1 = a * b; \ +} while(0); + +#elif defined(BOTAN_TARGET_ARCH_IS_MIPS64) + +#define BOTAN_WORD_MUL(a,b,z1,z0) do { \ + asm("dmultu %2,%3" : "=h" (z0), "=l" (z1) : "r" (a), "r" (b)); \ +} while(0); + +#else + +// Do a 64x64->128 multiply using four 64x64->64 multiplies +// plus some adds and shifts. Last resort for CPUs like UltraSPARC, +// with 64-bit registers/ALU, but no 64x64->128 multiply. +inline void bigint_2word_mul(word a, word b, word* z1, word* z0) + { + const u32bit MP_HWORD_BITS = BOTAN_MP_WORD_BITS / 2; + const word MP_HWORD_MASK = ((word)1 << MP_HWORD_BITS) - 1; + + const word a_hi = (a >> MP_HWORD_BITS); + const word a_lo = (a & MP_HWORD_MASK); + const word b_hi = (b >> MP_HWORD_BITS); + const word b_lo = (b & MP_HWORD_MASK); + + word x0 = a_hi * b_hi; + word x1 = a_lo * b_hi; + word x2 = a_hi * b_lo; + word x3 = a_lo * b_lo; + + x2 += x3 >> (MP_HWORD_BITS); + x2 += x1; + if(x2 < x1) + x0 += ((word)1 << MP_HWORD_BITS); + + *z0 = x0 + (x2 >> MP_HWORD_BITS); + *z1 = ((x2 & MP_HWORD_MASK) << MP_HWORD_BITS) + (x3 & MP_HWORD_MASK); + } + +#define BOTAN_WORD_MUL(a,b,z1,z0) bigint_2word_mul(a, b, &z1, &z0) + +#endif + +/* +* Word Multiply/Add +*/ +inline word word_madd2(word a, word b, word* c) + { + word z0 = 0, z1 = 0; + + BOTAN_WORD_MUL(a, b, z1, z0); + + z1 += *c; if(z1 < *c) z0++; + + *c = z0; + return z1; + } + +/* +* Word Multiply/Add +*/ +inline word word_madd3(word a, word b, word c, word* d) + { + word z0 = 0, z1 = 0; + + BOTAN_WORD_MUL(a, b, z1, z0); + + z1 += c; if(z1 < c) z0++; + z1 += *d; if(z1 < *d) z0++; + + *d = z0; + return z1; + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_comba.cpp b/src/libs/3rdparty/botan/src/math/bigint/mp_comba.cpp new file mode 100644 index 00000000000..218038d8a7c --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_comba.cpp @@ -0,0 +1,920 @@ +/* +* Comba Multiplication and Squaring +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +extern "C" { + +/* +* Comba 4x4 Squaring +*/ +void bigint_comba_sqr4(word z[8], const word x[4]) + { + word w2 = 0, w1 = 0, w0 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], x[0]); + z[0] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[1]); + z[1] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[2]); + word3_muladd(&w2, &w1, &w0, x[1], x[1]); + z[2] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[3]); + word3_muladd_2(&w2, &w1, &w0, x[1], x[2]); + z[3] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[1], x[3]); + word3_muladd(&w2, &w1, &w0, x[2], x[2]); + z[4] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[2], x[3]); + z[5] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[3], x[3]); + z[6] = w0; + z[7] = w1; + } + +/* +* Comba 4x4 Multiplication +*/ +void bigint_comba_mul4(word z[8], const word x[4], const word y[4]) + { + word w2 = 0, w1 = 0, w0 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[0]); + z[0] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[1]); + word3_muladd(&w2, &w1, &w0, x[1], y[0]); + z[1] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[2]); + word3_muladd(&w2, &w1, &w0, x[1], y[1]); + word3_muladd(&w2, &w1, &w0, x[2], y[0]); + z[2] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[3]); + word3_muladd(&w2, &w1, &w0, x[1], y[2]); + word3_muladd(&w2, &w1, &w0, x[2], y[1]); + word3_muladd(&w2, &w1, &w0, x[3], y[0]); + z[3] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[1], y[3]); + word3_muladd(&w2, &w1, &w0, x[2], y[2]); + word3_muladd(&w2, &w1, &w0, x[3], y[1]); + z[4] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[2], y[3]); + word3_muladd(&w2, &w1, &w0, x[3], y[2]); + z[5] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[3], y[3]); + z[6] = w0; + z[7] = w1; + } + +/* +* Comba 6x6 Squaring +*/ +void bigint_comba_sqr6(word z[12], const word x[6]) + { + word w2 = 0, w1 = 0, w0 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], x[0]); + z[0] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[1]); + z[1] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[2]); + word3_muladd(&w2, &w1, &w0, x[1], x[1]); + z[2] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[3]); + word3_muladd_2(&w2, &w1, &w0, x[1], x[2]); + z[3] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[4]); + word3_muladd_2(&w2, &w1, &w0, x[1], x[3]); + word3_muladd(&w2, &w1, &w0, x[2], x[2]); + z[4] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[5]); + word3_muladd_2(&w2, &w1, &w0, x[1], x[4]); + word3_muladd_2(&w2, &w1, &w0, x[2], x[3]); + z[5] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[1], x[5]); + word3_muladd_2(&w2, &w1, &w0, x[2], x[4]); + word3_muladd(&w2, &w1, &w0, x[3], x[3]); + z[6] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[2], x[5]); + word3_muladd_2(&w2, &w1, &w0, x[3], x[4]); + z[7] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[3], x[5]); + word3_muladd(&w2, &w1, &w0, x[4], x[4]); + z[8] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[4], x[5]); + z[9] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[5], x[5]); + z[10] = w0; + z[11] = w1; + } + +/* +* Comba 6x6 Multiplication +*/ +void bigint_comba_mul6(word z[12], const word x[6], const word y[6]) + { + word w2 = 0, w1 = 0, w0 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[0]); + z[0] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[1]); + word3_muladd(&w2, &w1, &w0, x[1], y[0]); + z[1] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[2]); + word3_muladd(&w2, &w1, &w0, x[1], y[1]); + word3_muladd(&w2, &w1, &w0, x[2], y[0]); + z[2] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[3]); + word3_muladd(&w2, &w1, &w0, x[1], y[2]); + word3_muladd(&w2, &w1, &w0, x[2], y[1]); + word3_muladd(&w2, &w1, &w0, x[3], y[0]); + z[3] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[4]); + word3_muladd(&w2, &w1, &w0, x[1], y[3]); + word3_muladd(&w2, &w1, &w0, x[2], y[2]); + word3_muladd(&w2, &w1, &w0, x[3], y[1]); + word3_muladd(&w2, &w1, &w0, x[4], y[0]); + z[4] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[5]); + word3_muladd(&w2, &w1, &w0, x[1], y[4]); + word3_muladd(&w2, &w1, &w0, x[2], y[3]); + word3_muladd(&w2, &w1, &w0, x[3], y[2]); + word3_muladd(&w2, &w1, &w0, x[4], y[1]); + word3_muladd(&w2, &w1, &w0, x[5], y[0]); + z[5] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[1], y[5]); + word3_muladd(&w2, &w1, &w0, x[2], y[4]); + word3_muladd(&w2, &w1, &w0, x[3], y[3]); + word3_muladd(&w2, &w1, &w0, x[4], y[2]); + word3_muladd(&w2, &w1, &w0, x[5], y[1]); + z[6] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[2], y[5]); + word3_muladd(&w2, &w1, &w0, x[3], y[4]); + word3_muladd(&w2, &w1, &w0, x[4], y[3]); + word3_muladd(&w2, &w1, &w0, x[5], y[2]); + z[7] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[3], y[5]); + word3_muladd(&w2, &w1, &w0, x[4], y[4]); + word3_muladd(&w2, &w1, &w0, x[5], y[3]); + z[8] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[4], y[5]); + word3_muladd(&w2, &w1, &w0, x[5], y[4]); + z[9] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[5], y[5]); + z[10] = w0; + z[11] = w1; + } + +/* +* Comba 8x8 Squaring +*/ +void bigint_comba_sqr8(word z[16], const word x[8]) + { + word w2 = 0, w1 = 0, w0 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], x[0]); + z[0] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[1]); + z[1] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[2]); + word3_muladd(&w2, &w1, &w0, x[1], x[1]); + z[2] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[3]); + word3_muladd_2(&w2, &w1, &w0, x[1], x[2]); + z[3] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[4]); + word3_muladd_2(&w2, &w1, &w0, x[1], x[3]); + word3_muladd(&w2, &w1, &w0, x[2], x[2]); + z[4] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[5]); + word3_muladd_2(&w2, &w1, &w0, x[1], x[4]); + word3_muladd_2(&w2, &w1, &w0, x[2], x[3]); + z[5] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[6]); + word3_muladd_2(&w2, &w1, &w0, x[1], x[5]); + word3_muladd_2(&w2, &w1, &w0, x[2], x[4]); + word3_muladd(&w2, &w1, &w0, x[3], x[3]); + z[6] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[0], x[7]); + word3_muladd_2(&w2, &w1, &w0, x[1], x[6]); + word3_muladd_2(&w2, &w1, &w0, x[2], x[5]); + word3_muladd_2(&w2, &w1, &w0, x[3], x[4]); + z[7] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[1], x[7]); + word3_muladd_2(&w2, &w1, &w0, x[2], x[6]); + word3_muladd_2(&w2, &w1, &w0, x[3], x[5]); + word3_muladd(&w2, &w1, &w0, x[4], x[4]); + z[8] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[2], x[7]); + word3_muladd_2(&w2, &w1, &w0, x[3], x[6]); + word3_muladd_2(&w2, &w1, &w0, x[4], x[5]); + z[9] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[3], x[7]); + word3_muladd_2(&w2, &w1, &w0, x[4], x[6]); + word3_muladd(&w2, &w1, &w0, x[5], x[5]); + z[10] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[4], x[7]); + word3_muladd_2(&w2, &w1, &w0, x[5], x[6]); + z[11] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[5], x[7]); + word3_muladd(&w2, &w1, &w0, x[6], x[6]); + z[12] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[6], x[7]); + z[13] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[7], x[7]); + z[14] = w0; + z[15] = w1; + } + +/* +* Comba 8x8 Multiplication +*/ +void bigint_comba_mul8(word z[16], const word x[8], const word y[8]) + { + word w2 = 0, w1 = 0, w0 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[0]); + z[0] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[1]); + word3_muladd(&w2, &w1, &w0, x[1], y[0]); + z[1] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[2]); + word3_muladd(&w2, &w1, &w0, x[1], y[1]); + word3_muladd(&w2, &w1, &w0, x[2], y[0]); + z[2] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[3]); + word3_muladd(&w2, &w1, &w0, x[1], y[2]); + word3_muladd(&w2, &w1, &w0, x[2], y[1]); + word3_muladd(&w2, &w1, &w0, x[3], y[0]); + z[3] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[4]); + word3_muladd(&w2, &w1, &w0, x[1], y[3]); + word3_muladd(&w2, &w1, &w0, x[2], y[2]); + word3_muladd(&w2, &w1, &w0, x[3], y[1]); + word3_muladd(&w2, &w1, &w0, x[4], y[0]); + z[4] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[5]); + word3_muladd(&w2, &w1, &w0, x[1], y[4]); + word3_muladd(&w2, &w1, &w0, x[2], y[3]); + word3_muladd(&w2, &w1, &w0, x[3], y[2]); + word3_muladd(&w2, &w1, &w0, x[4], y[1]); + word3_muladd(&w2, &w1, &w0, x[5], y[0]); + z[5] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[6]); + word3_muladd(&w2, &w1, &w0, x[1], y[5]); + word3_muladd(&w2, &w1, &w0, x[2], y[4]); + word3_muladd(&w2, &w1, &w0, x[3], y[3]); + word3_muladd(&w2, &w1, &w0, x[4], y[2]); + word3_muladd(&w2, &w1, &w0, x[5], y[1]); + word3_muladd(&w2, &w1, &w0, x[6], y[0]); + z[6] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[0], y[7]); + word3_muladd(&w2, &w1, &w0, x[1], y[6]); + word3_muladd(&w2, &w1, &w0, x[2], y[5]); + word3_muladd(&w2, &w1, &w0, x[3], y[4]); + word3_muladd(&w2, &w1, &w0, x[4], y[3]); + word3_muladd(&w2, &w1, &w0, x[5], y[2]); + word3_muladd(&w2, &w1, &w0, x[6], y[1]); + word3_muladd(&w2, &w1, &w0, x[7], y[0]); + z[7] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[1], y[7]); + word3_muladd(&w2, &w1, &w0, x[2], y[6]); + word3_muladd(&w2, &w1, &w0, x[3], y[5]); + word3_muladd(&w2, &w1, &w0, x[4], y[4]); + word3_muladd(&w2, &w1, &w0, x[5], y[3]); + word3_muladd(&w2, &w1, &w0, x[6], y[2]); + word3_muladd(&w2, &w1, &w0, x[7], y[1]); + z[8] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[2], y[7]); + word3_muladd(&w2, &w1, &w0, x[3], y[6]); + word3_muladd(&w2, &w1, &w0, x[4], y[5]); + word3_muladd(&w2, &w1, &w0, x[5], y[4]); + word3_muladd(&w2, &w1, &w0, x[6], y[3]); + word3_muladd(&w2, &w1, &w0, x[7], y[2]); + z[9] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[3], y[7]); + word3_muladd(&w2, &w1, &w0, x[4], y[6]); + word3_muladd(&w2, &w1, &w0, x[5], y[5]); + word3_muladd(&w2, &w1, &w0, x[6], y[4]); + word3_muladd(&w2, &w1, &w0, x[7], y[3]); + z[10] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[4], y[7]); + word3_muladd(&w2, &w1, &w0, x[5], y[6]); + word3_muladd(&w2, &w1, &w0, x[6], y[5]); + word3_muladd(&w2, &w1, &w0, x[7], y[4]); + z[11] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[5], y[7]); + word3_muladd(&w2, &w1, &w0, x[6], y[6]); + word3_muladd(&w2, &w1, &w0, x[7], y[5]); + z[12] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[6], y[7]); + word3_muladd(&w2, &w1, &w0, x[7], y[6]); + z[13] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[7], y[7]); + z[14] = w0; + z[15] = w1; + } + +/* +* Comba 16x16 Squaring +*/ +void bigint_comba_sqr16(word z[32], const word x[16]) + { + word w2 = 0, w1 = 0, w0 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], x[ 0]); + z[ 0] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 1]); + z[ 1] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 1], x[ 1]); + z[ 2] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]); + z[ 3] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 4]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 2], x[ 2]); + z[ 4] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 5]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 4]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 3]); + z[ 5] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 3], x[ 3]); + z[ 6] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 7]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 6]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 5]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 4]); + z[ 7] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 8]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 7]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 6]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 4], x[ 4]); + z[ 8] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 9]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 8]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]); + z[ 9] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[10]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 9]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 8]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 7]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 5], x[ 5]); + z[10] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[11]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[10]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 9]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 8]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 7]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 6]); + z[11] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[11]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[10]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 9]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 8]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 6], x[ 6]); + z[12] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[11]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[10]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 9]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 8]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[ 7]); + z[13] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[11]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[10]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 9]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 7], x[ 7]); + z[14] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[11]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[10]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[ 9]); + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[ 8]); + z[15] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[11]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[10]); + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 8], x[ 8]); + z[16] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[11]); + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[10]); + word3_muladd_2(&w2, &w1, &w0, x[ 8], x[ 9]); + z[17] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[11]); + word3_muladd_2(&w2, &w1, &w0, x[ 8], x[10]); + word3_muladd(&w2, &w1, &w0, x[ 9], x[ 9]); + z[18] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[ 8], x[11]); + word3_muladd_2(&w2, &w1, &w0, x[ 9], x[10]); + z[19] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[ 8], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[ 9], x[11]); + word3_muladd(&w2, &w1, &w0, x[10], x[10]); + z[20] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[ 8], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[ 9], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[10], x[11]); + z[21] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[ 8], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[ 9], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[10], x[12]); + word3_muladd(&w2, &w1, &w0, x[11], x[11]); + z[22] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 8], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[ 9], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[10], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[11], x[12]); + z[23] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 9], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[10], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[11], x[13]); + word3_muladd(&w2, &w1, &w0, x[12], x[12]); + z[24] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[10], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[11], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[12], x[13]); + z[25] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[11], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[12], x[14]); + word3_muladd(&w2, &w1, &w0, x[13], x[13]); + z[26] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[12], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[13], x[14]); + z[27] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[13], x[15]); + word3_muladd(&w2, &w1, &w0, x[14], x[14]); + z[28] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[14], x[15]); + z[29] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[15], x[15]); + z[30] = w0; + z[31] = w1; + } + +/* +* Comba 16x16 Multiplication +*/ +void bigint_comba_mul16(word z[32], const word x[16], const word y[16]) + { + word w2 = 0, w1 = 0, w0 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]); + z[0] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 0]); + z[1] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 0]); + z[2] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]); + z[3] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 0]); + z[4] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 0]); + z[5] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]); + z[6] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 0]); + z[7] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 0]); + z[8] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 0]); + z[9] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[10]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 0]); + z[10] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[11]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[10]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 0]); + z[11] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[12]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[11]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[10]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 0]); + z[12] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[13]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[12]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[11]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[10]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 0]); + z[13] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[14]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[13]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[12]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[11]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[10]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 0]); + z[14] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[15]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[14]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[13]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[12]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[11]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[10]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 0]); + z[15] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 1], y[15]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[14]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[13]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[12]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[11]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[10]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 1]); + z[16] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 2], y[15]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[14]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[13]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[12]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[11]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[10]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 2]); + z[17] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 3], y[15]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[14]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[13]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[12]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[11]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[10]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 3]); + z[18] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 4], y[15]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[14]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[13]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[12]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[11]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[10]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 4]); + z[19] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 5], y[15]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[14]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[13]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[12]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[11]); + word3_muladd(&w2, &w1, &w0, x[10], y[10]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 5]); + z[20] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 6], y[15]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[14]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[13]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[12]); + word3_muladd(&w2, &w1, &w0, x[10], y[11]); + word3_muladd(&w2, &w1, &w0, x[11], y[10]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 6]); + z[21] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 7], y[15]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[14]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[13]); + word3_muladd(&w2, &w1, &w0, x[10], y[12]); + word3_muladd(&w2, &w1, &w0, x[11], y[11]); + word3_muladd(&w2, &w1, &w0, x[12], y[10]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 7]); + z[22] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 8], y[15]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[14]); + word3_muladd(&w2, &w1, &w0, x[10], y[13]); + word3_muladd(&w2, &w1, &w0, x[11], y[12]); + word3_muladd(&w2, &w1, &w0, x[12], y[11]); + word3_muladd(&w2, &w1, &w0, x[13], y[10]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 8]); + z[23] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 9], y[15]); + word3_muladd(&w2, &w1, &w0, x[10], y[14]); + word3_muladd(&w2, &w1, &w0, x[11], y[13]); + word3_muladd(&w2, &w1, &w0, x[12], y[12]); + word3_muladd(&w2, &w1, &w0, x[13], y[11]); + word3_muladd(&w2, &w1, &w0, x[14], y[10]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 9]); + z[24] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[10], y[15]); + word3_muladd(&w2, &w1, &w0, x[11], y[14]); + word3_muladd(&w2, &w1, &w0, x[12], y[13]); + word3_muladd(&w2, &w1, &w0, x[13], y[12]); + word3_muladd(&w2, &w1, &w0, x[14], y[11]); + word3_muladd(&w2, &w1, &w0, x[15], y[10]); + z[25] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[11], y[15]); + word3_muladd(&w2, &w1, &w0, x[12], y[14]); + word3_muladd(&w2, &w1, &w0, x[13], y[13]); + word3_muladd(&w2, &w1, &w0, x[14], y[12]); + word3_muladd(&w2, &w1, &w0, x[15], y[11]); + z[26] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[12], y[15]); + word3_muladd(&w2, &w1, &w0, x[13], y[14]); + word3_muladd(&w2, &w1, &w0, x[14], y[13]); + word3_muladd(&w2, &w1, &w0, x[15], y[12]); + z[27] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[13], y[15]); + word3_muladd(&w2, &w1, &w0, x[14], y[14]); + word3_muladd(&w2, &w1, &w0, x[15], y[13]); + z[28] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[14], y[15]); + word3_muladd(&w2, &w1, &w0, x[15], y[14]); + z[29] = w0; w0 = w1; w1 = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[15], y[15]); + z[30] = w0; + z[31] = w1; + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_core.h b/src/libs/3rdparty/botan/src/math/bigint/mp_core.h new file mode 100644 index 00000000000..ea27a77a758 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_core.h @@ -0,0 +1,98 @@ +/* +* MPI Algorithms +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MP_CORE_H__ +#define BOTAN_MP_CORE_H__ + +#include + +namespace Botan { + +/* +* The size of the word type, in bits +*/ +const u32bit MP_WORD_BITS = BOTAN_MP_WORD_BITS; + +extern "C" { + +/* +* Addition/Subtraction Operations +*/ +void bigint_add2(word[], u32bit, const word[], u32bit); +void bigint_add3(word[], const word[], u32bit, const word[], u32bit); + +word bigint_add2_nc(word[], u32bit, const word[], u32bit); +word bigint_add3_nc(word[], const word[], u32bit, const word[], u32bit); + +void bigint_sub2(word[], u32bit, const word[], u32bit); +void bigint_sub3(word[], const word[], u32bit, const word[], u32bit); + +/* +* Shift Operations +*/ +void bigint_shl1(word[], u32bit, u32bit, u32bit); +void bigint_shl2(word[], const word[], u32bit, u32bit, u32bit); +void bigint_shr1(word[], u32bit, u32bit, u32bit); +void bigint_shr2(word[], const word[], u32bit, u32bit, u32bit); + +/* +* Simple O(N^2) Multiplication and Squaring +*/ +void bigint_simple_mul(word z[], const word x[], u32bit x_size, + const word y[], u32bit y_size); +void bigint_simple_sqr(word z[], const word x[], u32bit x_size); + +/* +* Linear Multiply +*/ +void bigint_linmul2(word[], u32bit, word); +void bigint_linmul3(word[], const word[], u32bit, word); +void bigint_linmul_add(word[], u32bit, const word[], u32bit, word); + +/* +* Montgomery Reduction +*/ +void bigint_monty_redc(word[], u32bit, const word[], u32bit, word); + +/* +* Misc Utility Operations +*/ +u32bit bigint_divcore(word, word, word, word, word, word); +s32bit bigint_cmp(const word[], u32bit, const word[], u32bit); +word bigint_divop(word, word, word); +word bigint_modop(word, word, word); +void bigint_wordmul(word, word, word*, word*); + +/* +* Comba Multiplication / Squaring +*/ +void bigint_comba_mul4(word[8], const word[4], const word[4]); +void bigint_comba_mul6(word[12], const word[6], const word[6]); +void bigint_comba_mul8(word[16], const word[8], const word[8]); +void bigint_comba_mul16(word[32], const word[16], const word[16]); + +void bigint_comba_sqr4(word[8], const word[4]); +void bigint_comba_sqr6(word[12], const word[6]); +void bigint_comba_sqr8(word[16], const word[8]); +void bigint_comba_sqr8(word[32], const word[16]); +void bigint_comba_sqr16(word[64], const word[32]); + +} + +/* +* High Level Multiplication/Squaring Interfaces +*/ +void bigint_mul(word[], u32bit, word[], + const word[], u32bit, u32bit, + const word[], u32bit, u32bit); + +void bigint_sqr(word[], u32bit, word[], + const word[], u32bit, u32bit); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_generic/info.txt b/src/libs/3rdparty/botan/src/math/bigint/mp_generic/info.txt new file mode 100644 index 00000000000..8bf75fec301 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_generic/info.txt @@ -0,0 +1,8 @@ +realname "MPI Core (C++)" + +load_on dep + + +mp_asm.h +mp_asmi.h + diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_generic/mp_asm.h b/src/libs/3rdparty/botan/src/math/bigint/mp_generic/mp_asm.h new file mode 100644 index 00000000000..7c18343ef7b --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_generic/mp_asm.h @@ -0,0 +1,54 @@ +/* +* Lowest Level MPI Algorithms +* (C) 1999-2008 Jack Lloyd +* 2006 Luca Piccarreta +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MP_ASM_H__ +#define BOTAN_MP_ASM_H__ + +#include + +#if (BOTAN_MP_WORD_BITS == 8) + typedef Botan::u16bit dword; +#elif (BOTAN_MP_WORD_BITS == 16) + typedef Botan::u32bit dword; +#elif (BOTAN_MP_WORD_BITS == 32) + typedef Botan::u64bit dword; +#elif (BOTAN_MP_WORD_BITS == 64) + #error BOTAN_MP_WORD_BITS can be 64 only with assembly support +#else + #error BOTAN_MP_WORD_BITS must be 8, 16, 32, or 64 +#endif + +namespace Botan { + +extern "C" { + +/* +* Word Multiply/Add +*/ +inline word word_madd2(word a, word b, word* c) + { + dword z = (dword)a * b + *c; + *c = (word)(z >> BOTAN_MP_WORD_BITS); + return (word)z; + } + +/* +* Word Multiply/Add +*/ +inline word word_madd3(word a, word b, word c, word* d) + { + dword z = (dword)a * b + c + *d; + *d = (word)(z >> BOTAN_MP_WORD_BITS); + return (word)z; + } + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_generic/mp_asmi.h b/src/libs/3rdparty/botan/src/math/bigint/mp_generic/mp_asmi.h new file mode 100644 index 00000000000..21c4db24858 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_generic/mp_asmi.h @@ -0,0 +1,191 @@ +/* +* Lowest Level MPI Algorithms +* (C) 1999-2008 Jack Lloyd +* 2006 Luca Piccarreta +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MP_ASM_INTERNAL_H__ +#define BOTAN_MP_ASM_INTERNAL_H__ + +#include + +namespace Botan { + +extern "C" { + +/* +* Word Addition +*/ +inline word word_add(word x, word y, word* carry) + { + word z = x + y; + word c1 = (z < x); + z += *carry; + *carry = c1 | (z < *carry); + return z; + } + +/* +* Eight Word Block Addition, Two Argument +*/ +inline word word8_add2(word x[8], const word y[8], word carry) + { + x[0] = word_add(x[0], y[0], &carry); + x[1] = word_add(x[1], y[1], &carry); + x[2] = word_add(x[2], y[2], &carry); + x[3] = word_add(x[3], y[3], &carry); + x[4] = word_add(x[4], y[4], &carry); + x[5] = word_add(x[5], y[5], &carry); + x[6] = word_add(x[6], y[6], &carry); + x[7] = word_add(x[7], y[7], &carry); + return carry; + } + +/* +* Eight Word Block Addition, Three Argument +*/ +inline word word8_add3(word z[8], const word x[8], + const word y[8], word carry) + { + z[0] = word_add(x[0], y[0], &carry); + z[1] = word_add(x[1], y[1], &carry); + z[2] = word_add(x[2], y[2], &carry); + z[3] = word_add(x[3], y[3], &carry); + z[4] = word_add(x[4], y[4], &carry); + z[5] = word_add(x[5], y[5], &carry); + z[6] = word_add(x[6], y[6], &carry); + z[7] = word_add(x[7], y[7], &carry); + return carry; + } + +/* +* Word Subtraction +*/ +inline word word_sub(word x, word y, word* carry) + { + word t0 = x - y; + word c1 = (t0 > x); + word z = t0 - *carry; + *carry = c1 | (z > t0); + return z; + } + +/* +* Eight Word Block Subtraction, Two Argument +*/ +inline word word8_sub2(word x[4], const word y[4], word carry) + { + x[0] = word_sub(x[0], y[0], &carry); + x[1] = word_sub(x[1], y[1], &carry); + x[2] = word_sub(x[2], y[2], &carry); + x[3] = word_sub(x[3], y[3], &carry); + x[4] = word_sub(x[4], y[4], &carry); + x[5] = word_sub(x[5], y[5], &carry); + x[6] = word_sub(x[6], y[6], &carry); + x[7] = word_sub(x[7], y[7], &carry); + return carry; + } + +/* +* Eight Word Block Subtraction, Three Argument +*/ +inline word word8_sub3(word z[8], const word x[8], + const word y[8], word carry) + { + z[0] = word_sub(x[0], y[0], &carry); + z[1] = word_sub(x[1], y[1], &carry); + z[2] = word_sub(x[2], y[2], &carry); + z[3] = word_sub(x[3], y[3], &carry); + z[4] = word_sub(x[4], y[4], &carry); + z[5] = word_sub(x[5], y[5], &carry); + z[6] = word_sub(x[6], y[6], &carry); + z[7] = word_sub(x[7], y[7], &carry); + return carry; + } + +/* +* Eight Word Block Linear Multiplication +*/ +inline word word8_linmul2(word x[4], word y, word carry) + { + x[0] = word_madd2(x[0], y, &carry); + x[1] = word_madd2(x[1], y, &carry); + x[2] = word_madd2(x[2], y, &carry); + x[3] = word_madd2(x[3], y, &carry); + x[4] = word_madd2(x[4], y, &carry); + x[5] = word_madd2(x[5], y, &carry); + x[6] = word_madd2(x[6], y, &carry); + x[7] = word_madd2(x[7], y, &carry); + return carry; + } + +/* +* Eight Word Block Linear Multiplication +*/ +inline word word8_linmul3(word z[8], const word x[8], word y, word carry) + { + z[0] = word_madd2(x[0], y, &carry); + z[1] = word_madd2(x[1], y, &carry); + z[2] = word_madd2(x[2], y, &carry); + z[3] = word_madd2(x[3], y, &carry); + z[4] = word_madd2(x[4], y, &carry); + z[5] = word_madd2(x[5], y, &carry); + z[6] = word_madd2(x[6], y, &carry); + z[7] = word_madd2(x[7], y, &carry); + return carry; + } + +/* +* Eight Word Block Multiply/Add +*/ +inline word word8_madd3(word z[8], const word x[8], word y, word carry) + { + z[0] = word_madd3(x[0], y, z[0], &carry); + z[1] = word_madd3(x[1], y, z[1], &carry); + z[2] = word_madd3(x[2], y, z[2], &carry); + z[3] = word_madd3(x[3], y, z[3], &carry); + z[4] = word_madd3(x[4], y, z[4], &carry); + z[5] = word_madd3(x[5], y, z[5], &carry); + z[6] = word_madd3(x[6], y, z[6], &carry); + z[7] = word_madd3(x[7], y, z[7], &carry); + return carry; + } + +/* +* Multiply-Add Accumulator +*/ +inline void word3_muladd(word* w2, word* w1, word* w0, word a, word b) + { + word carry = *w0; + *w0 = word_madd2(a, b, &carry); + *w1 += carry; + *w2 += (*w1 < carry) ? 1 : 0; + } + +/* +* Multiply-Add Accumulator +*/ +inline void word3_muladd_2(word* w2, word* w1, word* w0, word a, word b) + { + word carry = 0; + a = word_madd2(a, b, &carry); + b = carry; + + word top = (b >> (BOTAN_MP_WORD_BITS-1)); + b <<= 1; + b |= (a >> (BOTAN_MP_WORD_BITS-1)); + a <<= 1; + + carry = 0; + *w0 = word_add(*w0, a, &carry); + *w1 = word_add(*w1, b, &carry); + *w2 = word_add(*w2, top, &carry); + } + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_ia32/info.txt b/src/libs/3rdparty/botan/src/math/bigint/mp_ia32/info.txt new file mode 100644 index 00000000000..51f98fda883 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_ia32/info.txt @@ -0,0 +1,19 @@ +realname "MPI Core (IA-32)" + +mp_bits 32 + +load_on asm_ok + + +mp_asm.h +mp_asmi.h + + + +ia32 + + + +gcc +icc + diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_ia32/mp_asm.h b/src/libs/3rdparty/botan/src/math/bigint/mp_ia32/mp_asm.h new file mode 100644 index 00000000000..4d3afc99220 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_ia32/mp_asm.h @@ -0,0 +1,67 @@ +/* +* Lowest Level MPI Algorithms +* (C) 1999-2008 Jack Lloyd +* 2006 Luca Piccarreta +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MP_ASM_H__ +#define BOTAN_MP_ASM_H__ + +#include + +#if (BOTAN_MP_WORD_BITS != 32) + #error The mp_ia32 module requires that BOTAN_MP_WORD_BITS == 32 +#endif + +namespace Botan { + +extern "C" { + +/* +* Helper Macros for x86 Assembly +*/ +#define ASM(x) x "\n\t" + +/* +* Word Multiply +*/ +inline word word_madd2(word a, word b, word* c) + { + asm( + ASM("mull %[b]") + ASM("addl %[c],%[a]") + ASM("adcl $0,%[carry]") + + : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*c) + : "0"(a), "1"(b), [c]"g"(*c) : "cc"); + + return a; + } + +/* +* Word Multiply/Add +*/ +inline word word_madd3(word a, word b, word c, word* d) + { + asm( + ASM("mull %[b]") + + ASM("addl %[c],%[a]") + ASM("adcl $0,%[carry]") + + ASM("addl %[d],%[a]") + ASM("adcl $0,%[carry]") + + : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*d) + : "0"(a), "1"(b), [c]"g"(c), [d]"g"(*d) : "cc"); + + return a; + } + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_ia32/mp_asmi.h b/src/libs/3rdparty/botan/src/math/bigint/mp_ia32/mp_asmi.h new file mode 100644 index 00000000000..28b99abcc1f --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_ia32/mp_asmi.h @@ -0,0 +1,235 @@ +/* +* Lowest Level MPI Algorithms +* (C) 1999-2007 Jack Lloyd +* 2006 Luca Piccarreta +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MP_ASM_INTERNAL_H__ +#define BOTAN_MP_ASM_INTERNAL_H__ + +#include + +namespace Botan { + +extern "C" { + +/* +* Helper Macros for x86 Assembly +*/ +#ifndef ASM + #define ASM(x) x "\n\t" +#endif + +#define ADDSUB2_OP(OPERATION, INDEX) \ + ASM("movl 4*" #INDEX "(%[y]), %[carry]") \ + ASM(OPERATION " %[carry], 4*" #INDEX "(%[x])") \ + +#define ADDSUB3_OP(OPERATION, INDEX) \ + ASM("movl 4*" #INDEX "(%[x]), %[carry]") \ + ASM(OPERATION " 4*" #INDEX "(%[y]), %[carry]") \ + ASM("movl %[carry], 4*" #INDEX "(%[z])") \ + +#define LINMUL_OP(WRITE_TO, INDEX) \ + ASM("movl 4*" #INDEX "(%[x]),%%eax") \ + ASM("mull %[y]") \ + ASM("addl %[carry],%%eax") \ + ASM("adcl $0,%%edx") \ + ASM("movl %%edx,%[carry]") \ + ASM("movl %%eax, 4*" #INDEX "(%[" WRITE_TO "])") + +#define MULADD_OP(IGNORED, INDEX) \ + ASM("movl 4*" #INDEX "(%[x]),%%eax") \ + ASM("mull %[y]") \ + ASM("addl %[carry],%%eax") \ + ASM("adcl $0,%%edx") \ + ASM("addl 4*" #INDEX "(%[z]),%%eax") \ + ASM("adcl $0,%%edx") \ + ASM("movl %%edx,%[carry]") \ + ASM("movl %%eax, 4*" #INDEX " (%[z])") + +#define DO_8_TIMES(MACRO, ARG) \ + MACRO(ARG, 0) \ + MACRO(ARG, 1) \ + MACRO(ARG, 2) \ + MACRO(ARG, 3) \ + MACRO(ARG, 4) \ + MACRO(ARG, 5) \ + MACRO(ARG, 6) \ + MACRO(ARG, 7) + +#define ADD_OR_SUBTRACT(CORE_CODE) \ + ASM("rorl %[carry]") \ + CORE_CODE \ + ASM("sbbl %[carry],%[carry]") \ + ASM("negl %[carry]") + +/* +* Word Addition +*/ +inline word word_add(word x, word y, word* carry) + { +#if 0 + asm( + ADD_OR_SUBTRACT(ASM("adcl %[y],%[x]")) + : [x]"=r"(x), [carry]"=r"(*carry) + : "0"(x), [y]"rm"(y), "1"(*carry) + : "cc"); + return x; +#else + word z = x + y; + word c1 = (z < x); + z += *carry; + *carry = c1 | (z < *carry); + return z; +#endif + } + +/* +* Eight Word Block Addition, Two Argument +*/ +inline word word8_add2(word x[8], const word y[8], word carry) + { + asm( + ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB2_OP, "adcl")) + : [carry]"=r"(carry) + : [x]"r"(x), [y]"r"(y), "0"(carry) + : "cc", "memory"); + return carry; + } + +/* +* Eight Word Block Addition, Three Argument +*/ +inline word word8_add3(word z[8], const word x[8], const word y[8], word carry) + { + asm( + ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "adcl")) + : [carry]"=r"(carry) + : [x]"r"(x), [y]"r"(y), [z]"r"(z), "0"(carry) + : "cc", "memory"); + return carry; + } + +/* +* Word Subtraction +*/ +inline word word_sub(word x, word y, word* carry) + { + asm( + ADD_OR_SUBTRACT(ASM("sbbl %[y],%[x]")) + : [x]"=r"(x), [carry]"=r"(*carry) + : "0"(x), [y]"rm"(y), "1"(*carry) + : "cc"); + return x; + } + +/* +* Eight Word Block Subtraction, Two Argument +*/ +inline word word8_sub2(word x[8], const word y[8], word carry) + { + asm( + ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB2_OP, "sbbl")) + : [carry]"=r"(carry) + : [x]"r"(x), [y]"r"(y), "0"(carry) + : "cc", "memory"); + return carry; + } + +/* +* Eight Word Block Subtraction, Three Argument +*/ +inline word word8_sub3(word z[8], const word x[8], const word y[8], word carry) + { + asm( + ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "sbbl")) + : [carry]"=r"(carry) + : [x]"r"(x), [y]"r"(y), [z]"r"(z), "0"(carry) + : "cc", "memory"); + return carry; + } + +/* +* Eight Word Block Linear Multiplication +*/ +inline word word8_linmul2(word x[8], word y, word carry) + { + asm( + DO_8_TIMES(LINMUL_OP, "x") + : [carry]"=r"(carry) + : [x]"r"(x), [y]"rm"(y), "0"(carry) + : "cc", "%eax", "%edx"); + return carry; + } + +/* +* Eight Word Block Linear Multiplication +*/ +inline word word8_linmul3(word z[8], const word x[8], word y, word carry) + { + asm( + DO_8_TIMES(LINMUL_OP, "z") + : [carry]"=r"(carry) + : [z]"r"(z), [x]"r"(x), [y]"rm"(y), "0"(carry) + : "cc", "%eax", "%edx"); + return carry; + } + +/* +* Eight Word Block Multiply/Add +*/ +inline word word8_madd3(word z[8], const word x[8], word y, word carry) + { + asm( + DO_8_TIMES(MULADD_OP, "") + : [carry]"=r"(carry) + : [z]"r"(z), [x]"r"(x), [y]"rm"(y), "0"(carry) + : "cc", "%eax", "%edx"); + return carry; + } + +/* +* Multiply-Add Accumulator +*/ +inline void word3_muladd(word* w2, word* w1, word* w0, word x, word y) + { + asm( + ASM("mull %[y]") + + ASM("addl %[x],%[w0]") + ASM("adcl %[y],%[w1]") + ASM("adcl $0,%[w2]") + + : [w0]"=r"(*w0), [w1]"=r"(*w1), [w2]"=r"(*w2) + : [x]"a"(x), [y]"d"(y), "0"(*w0), "1"(*w1), "2"(*w2) + : "cc"); + } + +/* +* Multiply-Add Accumulator +*/ +inline void word3_muladd_2(word* w2, word* w1, word* w0, word x, word y) + { + asm( + ASM("mull %[y]") + + ASM("addl %[x],%[w0]") + ASM("adcl %[y],%[w1]") + ASM("adcl $0,%[w2]") + + ASM("addl %[x],%[w0]") + ASM("adcl %[y],%[w1]") + ASM("adcl $0,%[w2]") + + : [w0]"=r"(*w0), [w1]"=r"(*w1), [w2]"=r"(*w2) + : [x]"a"(x), [y]"d"(y), "0"(*w0), "1"(*w1), "2"(*w2) + : "cc"); + } + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_ia32_msvc/info.txt b/src/libs/3rdparty/botan/src/math/bigint/mp_ia32_msvc/info.txt new file mode 100644 index 00000000000..9c7ac9b43c9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_ia32_msvc/info.txt @@ -0,0 +1,18 @@ +realname "x86 MPI Assembler Core (MSVC)" + +mp_bits 32 + +load_on dep + + +mp_generic:mp_asm.h +mp_asmi.h + + + +ia32 + + + +msvc + diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_ia32_msvc/mp_asmi.h b/src/libs/3rdparty/botan/src/math/bigint/mp_ia32_msvc/mp_asmi.h new file mode 100644 index 00000000000..33ce6eb3d7e --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_ia32_msvc/mp_asmi.h @@ -0,0 +1,528 @@ +/* +* Lowest Level MPI Algorithms +* (C) 1999-2006 Jack Lloyd +* 2006 Luca Piccarreta +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MP_ASM_INTERNAL_H__ +#define BOTAN_MP_ASM_INTERNAL_H__ + +#include + +namespace Botan { + +extern "C" { + +/* +* Word Addition +*/ +inline word word_add(word x, word y, word* carry) + { + word z = x + y; + word c1 = (z < x); + z += *carry; + *carry = c1 | (z < *carry); + return z; + } + +/* +* Eight Word Block Addition, Two Argument +*/ +inline word word8_add2(word x[8], const word y[8], word carry) + { + __asm { + mov edx,[x] + mov esi,[y] + xor eax,eax + sub eax,[carry] //force CF=1 iff *carry==1 + mov eax,[esi] + adc [edx],eax + mov eax,[esi+4] + adc [edx+4],eax + mov eax,[esi+8] + adc [edx+8],eax + mov eax,[esi+12] + adc [edx+12],eax + mov eax,[esi+16] + adc [edx+16],eax + mov eax,[esi+20] + adc [edx+20],eax + mov eax,[esi+24] + adc [edx+24],eax + mov eax,[esi+28] + adc [edx+28],eax + sbb eax,eax + neg eax + } + } + +/* +* Eight Word Block Addition, Three Argument +*/ +inline word word8_add3(word z[8], const word x[8], const word y[8], word carry) + { + __asm { + mov edi,[x] + mov esi,[y] + mov ebx,[z] + xor eax,eax + sub eax,[carry] //force CF=1 iff *carry==1 + mov eax,[edi] + adc eax,[esi] + mov [ebx],eax + + mov eax,[edi+4] + adc eax,[esi+4] + mov [ebx+4],eax + + mov eax,[edi+8] + adc eax,[esi+8] + mov [ebx+8],eax + + mov eax,[edi+12] + adc eax,[esi+12] + mov [ebx+12],eax + + mov eax,[edi+16] + adc eax,[esi+16] + mov [ebx+16],eax + + mov eax,[edi+20] + adc eax,[esi+20] + mov [ebx+20],eax + + mov eax,[edi+24] + adc eax,[esi+24] + mov [ebx+24],eax + + mov eax,[edi+28] + adc eax,[esi+28] + mov [ebx+28],eax + + sbb eax,eax + neg eax + } + } + +/* +* Word Subtraction +*/ +inline word word_sub(word x, word y, word* carry) + { + word t0 = x - y; + word c1 = (t0 > x); + word z = t0 - *carry; + *carry = c1 | (z > t0); + return z; + } + +/* +* Eight Word Block Subtraction, Two Argument +*/ +inline word word8_sub2(word x[8], const word y[8], word carry) + { + _asm { + mov edi,[x] + mov esi,[y] + xor eax,eax + sub eax,[carry] //force CF=1 iff *carry==1 + mov eax,[edi] + sbb eax,[esi] + mov [edi],eax + mov eax,[edi+4] + sbb eax,[esi+4] + mov [edi+4],eax + mov eax,[edi+8] + sbb eax,[esi+8] + mov [edi+8],eax + mov eax,[edi+12] + sbb eax,[esi+12] + mov [edi+12],eax + mov eax,[edi+16] + sbb eax,[esi+16] + mov [edi+16],eax + mov eax,[edi+20] + sbb eax,[esi+20] + mov [edi+20],eax + mov eax,[edi+24] + sbb eax,[esi+24] + mov [edi+24],eax + mov eax,[edi+28] + sbb eax,[esi+28] + mov [edi+28],eax + sbb eax,eax + neg eax + } + } + +/* +* Eight Word Block Subtraction, Three Argument +*/ +inline word word8_sub3(word z[8], const word x[8], + const word y[8], word carry) + { + __asm { + mov edi,[x] + mov esi,[y] + xor eax,eax + sub eax,[carry] //force CF=1 iff *carry==1 + mov ebx,[z] + mov eax,[edi] + sbb eax,[esi] + mov [ebx],eax + mov eax,[edi+4] + sbb eax,[esi+4] + mov [ebx+4],eax + mov eax,[edi+8] + sbb eax,[esi+8] + mov [ebx+8],eax + mov eax,[edi+12] + sbb eax,[esi+12] + mov [ebx+12],eax + mov eax,[edi+16] + sbb eax,[esi+16] + mov [ebx+16],eax + mov eax,[edi+20] + sbb eax,[esi+20] + mov [ebx+20],eax + mov eax,[edi+24] + sbb eax,[esi+24] + mov [ebx+24],eax + mov eax,[edi+28] + sbb eax,[esi+28] + mov [ebx+28],eax + sbb eax,eax + neg eax + } + } + +/* +* Eight Word Block Linear Multiplication +*/ +inline word word8_linmul2(word x[8], word y, word carry) + { + __asm + { + mov esi,[x] + mov eax,[esi] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,[carry] //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [esi],eax //load a + + mov eax,[esi+4] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [esi+4],eax //load a + + mov eax,[esi+8] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [esi+8],eax //load a + + mov eax,[esi+12] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [esi+12],eax //load a + + mov eax,[esi+16] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [esi+16],eax //load a + + mov eax,[esi+20] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [esi+20],eax //load a + + mov eax,[esi+24] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [esi+24],eax //load a + + mov eax,[esi+28] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov [esi+28],eax //load a + + mov eax,edx //store carry + } + } + +/* +* Eight Word Block Linear Multiplication +*/ +inline word word8_muladd(word z[8], const word x[8], + word y, word carry) + { + __asm + { + mov esi,[x] + mov ebx,[y] + mov edi,[z] + mov eax,[esi] //load a + mul ebx //edx(hi):eax(lo)=a*b + add eax,[carry] //sum lo carry + adc edx,0 //sum hi carry + add eax,[edi] //sum lo z + adc edx,0 //sum hi z + mov ecx,edx //carry for next block = hi z + mov [edi],eax //save lo z + + mov eax,[esi+4] + mul ebx + add eax,ecx + adc edx,0 + add eax,[edi+4] + adc edx,0 + mov ecx,edx + mov [edi+4],eax + + mov eax,[esi+8] + mul ebx + add eax,ecx + adc edx,0 + add eax,[edi+8] + adc edx,0 + mov ecx,edx + mov [edi+8],eax + + mov eax,[esi+12] + mul ebx + add eax,ecx + adc edx,0 + add eax,[edi+12] + adc edx,0 + mov ecx,edx + mov [edi+12],eax + + mov eax,[esi+16] + mul ebx + add eax,ecx + adc edx,0 + add eax,[edi+16] + adc edx,0 + mov ecx,edx + mov [edi+16],eax + + mov eax,[esi+20] + mul ebx + add eax,ecx + adc edx,0 + add eax,[edi+20] + adc edx,0 + mov ecx,edx + mov [edi+20],eax + + mov eax,[esi+24] + mul ebx + add eax,ecx + adc edx,0 + add eax,[edi+24] + adc edx,0 + mov ecx,edx + mov [edi+24],eax + + mov eax,[esi+28] + mul ebx + add eax,ecx + adc edx,0 + add eax,[edi+28] + adc edx,0 + mov [edi+28],eax + mov eax,edx + } + } + +inline word word8_linmul3(word z[4], const word x[4], word y, word carry) + { + __asm + { +#if 0 + //it's slower!!! + mov edx,[z] + mov eax,[x] + movd mm7,[y] + + movd mm0,[eax] + movd mm1,[eax+4] + movd mm2,[eax+8] + pmuludq mm0,mm7 + pmuludq mm1,mm7 + pmuludq mm2,mm7 + + movd mm6,[carry] + paddq mm0,mm6 + movd [edx],mm0 + + psrlq mm0,32 + paddq mm1,mm0 + movd [edx+4],mm1 + + movd mm3,[eax+12] + psrlq mm1,32 + paddq mm2,mm1 + movd [edx+8],mm2 + + pmuludq mm3,mm7 + movd mm4,[eax+16] + psrlq mm2,32 + paddq mm3,mm2 + movd [edx+12],mm3 + + pmuludq mm4,mm7 + movd mm5,[eax+20] + psrlq mm3,32 + paddq mm4,mm3 + movd [edx+16],mm4 + + pmuludq mm5,mm7 + movd mm0,[eax+24] + psrlq mm4,32 + paddq mm5,mm4 + movd [edx+20],mm5 + + pmuludq mm0,mm7 + movd mm1,[eax+28] + psrlq mm5,32 + paddq mm0,mm5 + movd [edx+24],mm0 + + pmuludq mm1,mm7 + psrlq mm0,32 + paddq mm1,mm0 + movd [edx+28],mm1 + + psrlq mm1,32 + movd eax,mm1 + emms +#else + mov edi,[z] + mov esi,[x] + mov eax,[esi] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,[carry] //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [edi],eax //load a + + mov eax,[esi+4] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [edi+4],eax //load a + + mov eax,[esi+8] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [edi+8],eax //load a + + mov eax,[esi+12] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [edi+12],eax //load a + + mov eax,[esi+16] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [edi+16],eax //load a + + mov eax,[esi+20] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [edi+20],eax //load a + + mov eax,[esi+24] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov ecx,edx //store carry + mov [edi+24],eax //load a + + mov eax,[esi+28] //load a + mul [y] //edx(hi):eax(lo)=a*b + add eax,ecx //sum lo carry + adc edx,0 //sum hi carry + mov [edi+28],eax //load a + mov eax,edx //store carry +#endif + } + } + +/* +* Eight Word Block Multiply/Add +*/ +inline word word8_madd3(word z[8], const word x[8], word y, word carry) + { + z[0] = word_madd3(x[0], y, z[0], &carry); + z[1] = word_madd3(x[1], y, z[1], &carry); + z[2] = word_madd3(x[2], y, z[2], &carry); + z[3] = word_madd3(x[3], y, z[3], &carry); + z[4] = word_madd3(x[4], y, z[4], &carry); + z[5] = word_madd3(x[5], y, z[5], &carry); + z[6] = word_madd3(x[6], y, z[6], &carry); + z[7] = word_madd3(x[7], y, z[7], &carry); + return carry; + } + +/* +* Multiply-Add Accumulator +*/ +inline void word3_muladd(word* w2, word* w1, word* w0, word a, word b) + { + word carry = *w0; + *w0 = word_madd2(a, b, &carry); + *w1 += carry; + *w2 += (*w1 < carry) ? 1 : 0; + } + +/* +* Multiply-Add Accumulator +*/ +inline void word3_muladd_2(word* w2, word* w1, word* w0, word a, word b) + { + word carry = 0; + a = word_madd2(a, b, &carry); + b = carry; + + word top = (b >> (BOTAN_MP_WORD_BITS-1)); + b <<= 1; + b |= (a >> (BOTAN_MP_WORD_BITS-1)); + a <<= 1; + + carry = 0; + *w0 = word_add(*w0, a, &carry); + *w1 = word_add(*w1, b, &carry); + *w2 = word_add(*w2, top, &carry); + } + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_karat.cpp b/src/libs/3rdparty/botan/src/math/bigint/mp_karat.cpp new file mode 100644 index 00000000000..f30d418cc0d --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_karat.cpp @@ -0,0 +1,336 @@ +/* +* Karatsuba Multiplication/Squaring +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Karatsuba Multiplication Operation +*/ +void karatsuba_mul(word z[], const word x[], const word y[], u32bit N, + word workspace[]) + { + if(N == 6) + bigint_comba_mul6(z, x, y); + else if(N == 8) + bigint_comba_mul8(z, x, y); + else if(N == 16) + bigint_comba_mul16(z, x, y); + else if(N < BOTAN_KARAT_MUL_THRESHOLD || N % 2) + bigint_simple_mul(z, x, N, y, N); + else + { + const u32bit N2 = N / 2; + + const word* x0 = x; + const word* x1 = x + N2; + const word* y0 = y; + const word* y1 = y + N2; + word* z0 = z; + word* z1 = z + N; + + const s32bit cmp0 = bigint_cmp(x0, N2, x1, N2); + const s32bit cmp1 = bigint_cmp(y1, N2, y0, N2); + + clear_mem(workspace, 2*N); + + if(cmp0 && cmp1) + { + if(cmp0 > 0) + bigint_sub3(z0, x0, N2, x1, N2); + else + bigint_sub3(z0, x1, N2, x0, N2); + + if(cmp1 > 0) + bigint_sub3(z1, y1, N2, y0, N2); + else + bigint_sub3(z1, y0, N2, y1, N2); + + karatsuba_mul(workspace, z0, z1, N2, workspace+N); + } + + karatsuba_mul(z0, x0, y0, N2, workspace+N); + karatsuba_mul(z1, x1, y1, N2, workspace+N); + + const u32bit blocks_of_8 = N - (N % 8); + + word carry = 0; + + for(u32bit j = 0; j != blocks_of_8; j += 8) + carry = word8_add3(workspace + N + j, z0 + j, z1 + j, carry); + + for(u32bit j = blocks_of_8; j != N; ++j) + workspace[N + j] = word_add(z0[j], z1[j], &carry); + + word carry2 = 0; + + for(u32bit j = 0; j != blocks_of_8; j += 8) + carry2 = word8_add2(z + N2 + j, workspace + N + j, carry2); + + for(u32bit j = blocks_of_8; j != N; ++j) + z[N2 + j] = word_add(z[N2 + j], workspace[N + j], &carry2); + + z[N + N2] = word_add(z[N + N2], carry2, &carry); + + if(carry) + for(u32bit j = 1; j != N2; ++j) + if(++z[N + N2 + j]) + break; + + if((cmp0 == cmp1) || (cmp0 == 0) || (cmp1 == 0)) + bigint_add2(z + N2, 2*N-N2, workspace, N); + else + bigint_sub2(z + N2, 2*N-N2, workspace, N); + } + } + +/* +* Karatsuba Squaring Operation +*/ +void karatsuba_sqr(word z[], const word x[], u32bit N, word workspace[]) + { + if(N == 6) + bigint_comba_sqr6(z, x); + else if(N == 8) + bigint_comba_sqr8(z, x); + else if(N == 16) + bigint_comba_sqr16(z, x); + else if(N < BOTAN_KARAT_SQR_THRESHOLD || N % 2) + bigint_simple_sqr(z, x, N); + else + { + const u32bit N2 = N / 2; + + const word* x0 = x; + const word* x1 = x + N2; + word* z0 = z; + word* z1 = z + N; + + const s32bit cmp = bigint_cmp(x0, N2, x1, N2); + + clear_mem(workspace, 2*N); + + if(cmp) + { + if(cmp > 0) + bigint_sub3(z0, x0, N2, x1, N2); + else + bigint_sub3(z0, x1, N2, x0, N2); + + karatsuba_sqr(workspace, z0, N2, workspace+N); + } + + karatsuba_sqr(z0, x0, N2, workspace+N); + karatsuba_sqr(z1, x1, N2, workspace+N); + + const u32bit blocks_of_8 = N - (N % 8); + + word carry = 0; + + for(u32bit j = 0; j != blocks_of_8; j += 8) + carry = word8_add3(workspace + N + j, z0 + j, z1 + j, carry); + + for(u32bit j = blocks_of_8; j != N; ++j) + workspace[N + j] = word_add(z0[j], z1[j], &carry); + + word carry2 = 0; + + for(u32bit j = 0; j != blocks_of_8; j += 8) + carry2 = word8_add2(z + N2 + j, workspace + N + j, carry2); + + for(u32bit j = blocks_of_8; j != N; ++j) + z[N2 + j] = word_add(z[N2 + j], workspace[N + j], &carry2); + + z[N + N2] = word_add(z[N + N2], carry2, &carry); + + if(carry) + for(u32bit j = 1; j != N2; ++j) + if(++z[N + N2 + j]) + break; + + if(cmp == 0) + bigint_add2(z + N2, 2*N-N2, workspace, N); + else + bigint_sub2(z + N2, 2*N-N2, workspace, N); + } + } + +/* +* Pick a good size for the Karatsuba multiply +*/ +u32bit karatsuba_size(u32bit z_size, + u32bit x_size, u32bit x_sw, + u32bit y_size, u32bit y_sw) + { + if(x_sw > x_size || x_sw > y_size || y_sw > x_size || y_sw > y_size) + return 0; + + if(((x_size == x_sw) && (x_size % 2)) || + ((y_size == y_sw) && (y_size % 2))) + return 0; + + const u32bit start = (x_sw > y_sw) ? x_sw : y_sw; + const u32bit end = (x_size < y_size) ? x_size : y_size; + + if(start == end) + { + if(start % 2) + return 0; + return start; + } + + for(u32bit j = start; j <= end; ++j) + { + if(j % 2) + continue; + + if(2*j > z_size) + return 0; + + if(x_sw <= j && j <= x_size && y_sw <= j && j <= y_size) + { + if(j % 4 == 2 && + (j+2) <= x_size && (j+2) <= y_size && 2*(j+2) <= z_size) + return j+2; + return j; + } + } + + return 0; + } + +/* +* Pick a good size for the Karatsuba squaring +*/ +u32bit karatsuba_size(u32bit z_size, u32bit x_size, u32bit x_sw) + { + if(x_sw == x_size) + { + if(x_sw % 2) + return 0; + return x_sw; + } + + for(u32bit j = x_sw; j <= x_size; ++j) + { + if(j % 2) + continue; + + if(2*j > z_size) + return 0; + + if(j % 4 == 2 && (j+2) <= x_size && 2*(j+2) <= z_size) + return j+2; + return j; + } + + return 0; + } + +} + +/* +* Multiplication Algorithm Dispatcher +*/ +void bigint_mul(word z[], u32bit z_size, word workspace[], + const word x[], u32bit x_size, u32bit x_sw, + const word y[], u32bit y_size, u32bit y_sw) + { + if(x_sw == 1) + { + bigint_linmul3(z, y, y_sw, x[0]); + } + else if(y_sw == 1) + { + bigint_linmul3(z, x, x_sw, y[0]); + } + else if(x_sw <= 4 && x_size >= 4 && + y_sw <= 4 && y_size >= 4 && z_size >= 8) + { + bigint_comba_mul4(z, x, y); + } + else if(x_sw <= 6 && x_size >= 6 && + y_sw <= 6 && y_size >= 6 && z_size >= 12) + { + bigint_comba_mul6(z, x, y); + } + else if(x_sw <= 8 && x_size >= 8 && + y_sw <= 8 && y_size >= 8 && z_size >= 16) + { + bigint_comba_mul8(z, x, y); + } + else if(x_sw <= 16 && x_size >= 16 && + y_sw <= 16 && y_size >= 16 && z_size >= 32) + { + bigint_comba_mul16(z, x, y); + } + else if(x_sw < BOTAN_KARAT_MUL_THRESHOLD || y_sw < BOTAN_KARAT_MUL_THRESHOLD) + bigint_simple_mul(z, x, x_sw, y, y_sw); + else + { + const u32bit N = karatsuba_size(z_size, x_size, x_sw, y_size, y_sw); + + if(N) + { + clear_mem(workspace, 2*N); + karatsuba_mul(z, x, y, N, workspace); + } + else + bigint_simple_mul(z, x, x_sw, y, y_sw); + } + } + +/* +* Squaring Algorithm Dispatcher +*/ +void bigint_sqr(word z[], u32bit z_size, word workspace[], + const word x[], u32bit x_size, u32bit x_sw) + { + if(x_sw == 1) + { + bigint_linmul3(z, x, x_sw, x[0]); + } + else if(x_sw <= 4 && x_size >= 4 && z_size >= 8) + { + bigint_comba_sqr4(z, x); + } + else if(x_sw <= 6 && x_size >= 6 && z_size >= 12) + { + bigint_comba_sqr6(z, x); + } + else if(x_sw <= 8 && x_size >= 8 && z_size >= 16) + { + bigint_comba_sqr8(z, x); + } + else if(x_sw <= 16 && x_size >= 16 && z_size >= 32) + { + bigint_comba_sqr16(z, x); + } + else if(x_size < BOTAN_KARAT_SQR_THRESHOLD) + { + bigint_simple_sqr(z, x, x_sw); + } + else + { + const u32bit N = karatsuba_size(z_size, x_size, x_sw); + + if(N) + { + clear_mem(workspace, 2*N); + karatsuba_sqr(z, x, N, workspace); + } + else + bigint_simple_sqr(z, x, x_sw); + } + } + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_misc.cpp b/src/libs/3rdparty/botan/src/math/bigint/mp_misc.cpp new file mode 100644 index 00000000000..6b7fc651b09 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_misc.cpp @@ -0,0 +1,94 @@ +/* +* MP Misc Functions +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +extern "C" { + +/* +* Core Division Operation +*/ +u32bit bigint_divcore(word q, word y1, word y2, + word x1, word x2, word x3) + { + word y0 = 0; + y2 = word_madd2(q, y2, &y0); + y1 = word_madd2(q, y1, &y0); + + if(y0 > x1) return 1; + if(y0 < x1) return 0; + if(y1 > x2) return 1; + if(y1 < x2) return 0; + if(y2 > x3) return 1; + if(y2 < x3) return 0; + return 0; + } + +/* +* Compare two MP integers +*/ +s32bit bigint_cmp(const word x[], u32bit x_size, + const word y[], u32bit y_size) + { + if(x_size < y_size) { return (-bigint_cmp(y, y_size, x, x_size)); } + + while(x_size > y_size) + { + if(x[x_size-1]) + return 1; + x_size--; + } + for(u32bit j = x_size; j > 0; --j) + { + if(x[j-1] > y[j-1]) return 1; + if(x[j-1] < y[j-1]) return -1; + } + return 0; + } + +/* +* Do a 2-word/1-word Division +*/ +word bigint_divop(word n1, word n0, word d) + { + word high = n1 % d, quotient = 0; + + for(u32bit j = 0; j != MP_WORD_BITS; ++j) + { + word high_top_bit = (high & MP_WORD_TOP_BIT); + + high <<= 1; + high |= (n0 >> (MP_WORD_BITS-1-j)) & 1; + quotient <<= 1; + + if(high_top_bit || high >= d) + { + high -= d; + quotient |= 1; + } + } + + return quotient; + } + +/* +* Do a 2-word/1-word Modulo +*/ +word bigint_modop(word n1, word n0, word d) + { + word z = bigint_divop(n1, n0, d); + word dummy = 0; + z = word_madd2(z, d, &dummy); + return (n0-z); + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_shift.cpp b/src/libs/3rdparty/botan/src/math/bigint/mp_shift.cpp new file mode 100644 index 00000000000..a7de79c77b1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_shift.cpp @@ -0,0 +1,138 @@ +/* +* MP Shift Algorithms +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +extern "C" { + +/* +* Single Operand Left Shift +*/ +void bigint_shl1(word x[], u32bit x_size, u32bit word_shift, u32bit bit_shift) + { + if(word_shift) + { + for(u32bit j = 1; j != x_size + 1; ++j) + x[(x_size - j) + word_shift] = x[x_size - j]; + clear_mem(x, word_shift); + } + + if(bit_shift) + { + word carry = 0; + for(u32bit j = word_shift; j != x_size + word_shift + 1; ++j) + { + word temp = x[j]; + x[j] = (temp << bit_shift) | carry; + carry = (temp >> (MP_WORD_BITS - bit_shift)); + } + } + } + +/* +* Single Operand Right Shift +*/ +void bigint_shr1(word x[], u32bit x_size, u32bit word_shift, u32bit bit_shift) + { + if(x_size < word_shift) + { + clear_mem(x, x_size); + return; + } + + if(word_shift) + { + copy_mem(x, x + word_shift, x_size - word_shift); + clear_mem(x + x_size - word_shift, word_shift); + } + + if(bit_shift) + { + word carry = 0; + + u32bit top = x_size - word_shift; + + while(top >= 4) + { + word w = x[top-1]; + x[top-1] = (w >> bit_shift) | carry; + carry = (w << (MP_WORD_BITS - bit_shift)); + + w = x[top-2]; + x[top-2] = (w >> bit_shift) | carry; + carry = (w << (MP_WORD_BITS - bit_shift)); + + w = x[top-3]; + x[top-3] = (w >> bit_shift) | carry; + carry = (w << (MP_WORD_BITS - bit_shift)); + + w = x[top-4]; + x[top-4] = (w >> bit_shift) | carry; + carry = (w << (MP_WORD_BITS - bit_shift)); + + top -= 4; + } + + while(top) + { + word w = x[top-1]; + x[top-1] = (w >> bit_shift) | carry; + carry = (w << (MP_WORD_BITS - bit_shift)); + + top--; + } + } + } + +/* +* Two Operand Left Shift +*/ +void bigint_shl2(word y[], const word x[], u32bit x_size, + u32bit word_shift, u32bit bit_shift) + { + for(u32bit j = 0; j != x_size; ++j) + y[j + word_shift] = x[j]; + if(bit_shift) + { + word carry = 0; + for(u32bit j = word_shift; j != x_size + word_shift + 1; ++j) + { + word w = y[j]; + y[j] = (w << bit_shift) | carry; + carry = (w >> (MP_WORD_BITS - bit_shift)); + } + } + } + +/* +* Two Operand Right Shift +*/ +void bigint_shr2(word y[], const word x[], u32bit x_size, + u32bit word_shift, u32bit bit_shift) + { + if(x_size < word_shift) return; + + for(u32bit j = 0; j != x_size - word_shift; ++j) + y[j] = x[j + word_shift]; + if(bit_shift) + { + word carry = 0; + for(u32bit j = x_size - word_shift; j > 0; --j) + { + word w = y[j-1]; + y[j-1] = (w >> bit_shift) | carry; + carry = (w << (MP_WORD_BITS - bit_shift)); + } + } + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/mp_types.h b/src/libs/3rdparty/botan/src/math/bigint/mp_types.h new file mode 100644 index 00000000000..1648713edd3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mp_types.h @@ -0,0 +1,33 @@ +/* +* Low Level MPI Types +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MPI_TYPES_H__ +#define BOTAN_MPI_TYPES_H__ + +#include + +namespace Botan { + +#if (BOTAN_MP_WORD_BITS == 8) + typedef byte word; +#elif (BOTAN_MP_WORD_BITS == 16) + typedef u16bit word; +#elif (BOTAN_MP_WORD_BITS == 32) + typedef u32bit word; +#elif (BOTAN_MP_WORD_BITS == 64) + typedef u64bit word; +#else + #error BOTAN_MP_WORD_BITS must be 8, 16, 32, or 64 +#endif + +const word MP_WORD_MASK = ~static_cast(0); +const word MP_WORD_TOP_BIT = static_cast(1) << (8*sizeof(word) - 1); +const word MP_WORD_MAX = MP_WORD_MASK; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/bigint/mulop_amd64/info.txt b/src/libs/3rdparty/botan/src/math/bigint/mulop_amd64/info.txt new file mode 100644 index 00000000000..77990df807b --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mulop_amd64/info.txt @@ -0,0 +1,32 @@ +realname "BigInt Multiply-Add (x86-64)" + +mp_bits 64 + +load_on never + + +mp_mulop_amd64.S + + + +amd64 + + + +gcc +icc + + +# ELF systems + +linux +freebsd +dragonfly +netbsd +openbsd +solaris + + + +asm_amd64 + diff --git a/src/libs/3rdparty/botan/src/math/bigint/mulop_amd64/mp_mulop.cpp b/src/libs/3rdparty/botan/src/math/bigint/mulop_amd64/mp_mulop.cpp new file mode 100644 index 00000000000..cbd723e28a7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mulop_amd64/mp_mulop.cpp @@ -0,0 +1,96 @@ +/* +* Simple O(N^2) Multiplication and Squaring +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +extern "C" { + +/* +* Simple O(N^2) Multiplication +*/ +void bigint_simple_mul(word z[], const word x[], u32bit x_size, + const word y[], u32bit y_size) + { + const u32bit blocks = x_size - (x_size % 8); + + clear_mem(z, x_size + y_size); + + for(u32bit i = 0; i != y_size; ++i) + { + word carry = 0; + + for(u32bit j = 0; j != blocks; j += 8) + carry = word8_madd3(z + i + j, x + j, y[i], carry); + + for(u32bit j = blocks; j != x_size; ++j) + z[i+j] = word_madd3(x[j], y[i], z[i+j], &carry); + + z[x_size+i] = carry; + } + } + +inline word word_sqr(word x, + +/* +* Simple O(N^2) Squaring + +This is exactly the same algorithm as bigint_simple_mul, +however because C/C++ compilers suck at alias analysis it +is good to have the version where the compiler knows +that x == y +*/ +void bigint_simple_sqr(word z[], const word x[], u32bit x_size) + { + clear_mem(z, 2*x_size); + + for(u32bit i = 0; i != x_size; ++i) + { + const word x_i = x[i]; + + word carry = z[2*i]; + z[2*i] = word_madd2(x_i, x_i, z[2*i], &carry); + + for(u32bit j = i; j != x_size; ++j) + { + // z[i+j] = z[i+j] + 2 * x[j] * x_i + carry; + + /* + load z[i+j] into register + load x[j] into %hi + mulq %[x_i] -> x[i] * x[j] -> %lo:%hi + shlq %lo, $1 + + // put carry bit (cf) from %lo into %temp + xorl %temp + adcq $0, %temp + + // high bit of lo now in cf + shl %hi, $1 + // add in lowest bid from %lo + orl %temp, %hi + + addq %[c], %[lo] + adcq $0, %[hi] + addq %[z_ij], %[lo] + adcq $0, %[hi] + + */ + + } + + z[x_size+i] = carry; + } + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/mulop_amd64/mp_mulop_amd64.S b/src/libs/3rdparty/botan/src/math/bigint/mulop_amd64/mp_mulop_amd64.S new file mode 100644 index 00000000000..63ac55e95fb --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mulop_amd64/mp_mulop_amd64.S @@ -0,0 +1,130 @@ +/* +* Simple O(N^2) Multiplication and Squaring +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +START_LISTING(mp_mulop.S) + +#if 0 +void bigint_simple_sqr(word z[], const word x[], u32bit x_size) + { + const u32bit blocks = x_size - (x_size % 8); + + clear_mem(z, 2*x_size); + + for(u32bit i = 0; i != x_size; ++i) + { + word carry = 0; + + /* + for(u32bit j = 0; j != blocks; j += 8) + carry = word8_madd3(z + i + j, x + j, x[i], carry); + + for(u32bit j = blocks; j != x_size; ++j) + z[i+j] = word_madd3(x[j], x[i], z[i+j], &carry); + */ + + + for(u32bit j = 0; j != x_size; ++j) + z[i+j] = word_madd3(x[j], x[i], z[i+j], &carry); + + for(u32bit j = 0; j != x_size; ++j) + { + dword z = (dword)a * b + c + *d; + *d = (word)(z >> BOTAN_MP_WORD_BITS); + return (word)z; + } + + + + z[i+j] = word_madd3(x[j], x[i], z[i+j], &carry); + + } + + + + z[x_size+i] = carry; + } + } + +#endif + +START_FUNCTION(bigint_simple_sqr) + +#define Z_ARR ARG_1 +#define X_ARR ARG_2 +//#define X_SIZE ARG_3_32 + +#define CARRY TEMP_1 +#define Z_WORD TEMP_2 +#define LOOP_I TEMP_3 +#define LOOP_J TEMP_4 +#define X_SIZE TEMP_5 +#define MUL_LO %rax +// arg 3, xsize +#define MUL_HI %rdx + +// need arg3 == rdx for multiply + ASSIGN(X_SIZE, ARG3_32) + + ZEROIZE(CARRY) + + ZEROIZE(LOOP_I) + +.LOOP_ZEROIZE_Z: + + cmp LOOP_I, X_SIZE + + + + + JUMP_IF_ZERO(LOOP_CTR, .L_MULADD_DONE) + JUMP_IF_LT(LOOP_CTR, 8, .LOOP_MULADD1) + +#define MULADD_OP(N) \ + ASSIGN(MUL_LO, ARRAY8(X_ARR, N)) ; \ + ASSIGN(Z_WORD, ARRAY8(Z_ARR, N)) ; \ + MUL(Y) ; \ + ADD(Z_WORD, CARRY) ; \ + ASSIGN(CARRY, MUL_HI) ; \ + ADD_LAST_CARRY(CARRY) ; \ + ADD(Z_WORD, MUL_LO) ; \ + ADD_LAST_CARRY(CARRY) ; \ + ASSIGN(ARRAY8(Z_ARR, N), Z_WORD) + +.LOOP_MULADD8: + MULADD_OP(0) + MULADD_OP(1) + MULADD_OP(2) + MULADD_OP(3) + MULADD_OP(4) + MULADD_OP(5) + MULADD_OP(6) + MULADD_OP(7) + + SUB_IMM(LOOP_CTR, 8) + ADD_IMM(Z_ARR, 64) + ADD_IMM(X_ARR, 64) + cmp IMM(8), LOOP_CTR + jge .LOOP_MULADD8 + + JUMP_IF_ZERO(LOOP_CTR, .L_MULADD_DONE) + +ALIGN +.LOOP_MULADD1: + MULADD_OP(0) + + SUB_IMM(LOOP_CTR, 1) + ADD_IMM(Z_ARR, 8) + ADD_IMM(X_ARR, 8) + + cmp IMM(0), LOOP_CTR + jne .LOOP_MULADD1 + +.L_MULADD_DONE: + RETURN_VALUE_IS(CARRY) +END_FUNCTION(bigint_simple_square) diff --git a/src/libs/3rdparty/botan/src/math/bigint/mulop_generic/info.txt b/src/libs/3rdparty/botan/src/math/bigint/mulop_generic/info.txt new file mode 100644 index 00000000000..28ebe41eb95 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mulop_generic/info.txt @@ -0,0 +1,7 @@ +realname "BigInt Multiply-Add" + +load_on dep + + +mp_mulop.cpp + diff --git a/src/libs/3rdparty/botan/src/math/bigint/mulop_generic/mp_mulop.cpp b/src/libs/3rdparty/botan/src/math/bigint/mulop_generic/mp_mulop.cpp new file mode 100644 index 00000000000..4647d00d514 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mulop_generic/mp_mulop.cpp @@ -0,0 +1,77 @@ +/* +* Simple O(N^2) Multiplication and Squaring +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +extern "C" { + +/* +* Simple O(N^2) Multiplication +*/ +void bigint_simple_mul(word z[], const word x[], u32bit x_size, + const word y[], u32bit y_size) + { + const u32bit x_size_8 = x_size - (x_size % 8); + + clear_mem(z, x_size + y_size); + + for(u32bit i = 0; i != y_size; ++i) + { + const word y_i = y[i]; + + word carry = 0; + + for(u32bit j = 0; j != x_size_8; j += 8) + carry = word8_madd3(z + i + j, x + j, y_i, carry); + + for(u32bit j = x_size_8; j != x_size; ++j) + z[i+j] = word_madd3(x[j], y_i, z[i+j], &carry); + + z[x_size+i] = carry; + } + } + +/* +* Simple O(N^2) Squaring + +This is exactly the same algorithm as bigint_simple_mul, +however because C/C++ compilers suck at alias analysis it +is good to have the version where the compiler knows +that x == y + +There is an O(n^1.5) squaring algorithm specified in Handbook of +Applied Cryptography, chapter 14 +*/ +void bigint_simple_sqr(word z[], const word x[], u32bit x_size) + { + const u32bit x_size_8 = x_size - (x_size % 8); + + clear_mem(z, 2*x_size); + + for(u32bit i = 0; i != x_size; ++i) + { + const word x_i = x[i]; + word carry = 0; + + for(u32bit j = 0; j != x_size_8; j += 8) + carry = word8_madd3(z + i + j, x + j, x_i, carry); + + for(u32bit j = x_size_8; j != x_size; ++j) + z[i+j] = word_madd3(x[j], x_i, z[i+j], &carry); + + z[x_size+i] = carry; + } + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/math/bigint/mulop_ia32/info.txt b/src/libs/3rdparty/botan/src/math/bigint/mulop_ia32/info.txt new file mode 100644 index 00000000000..b995dd8d776 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mulop_ia32/info.txt @@ -0,0 +1,34 @@ +realname "BigInt Multiply-Add (IA-32)" + +mp_bits 32 + +# Out of date, still implements bigint_mul_add_words + +load_on request + + +mp_mulop.S + + + +ia32 + + + +gcc +icc + + +# ELF systems + +linux +freebsd +dragonfly +netbsd +openbsd +solaris + + + +asm_ia32 + diff --git a/src/libs/3rdparty/botan/src/math/bigint/mulop_ia32/mp_mulop.S b/src/libs/3rdparty/botan/src/math/bigint/mulop_ia32/mp_mulop.S new file mode 100644 index 00000000000..716166fd9e1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/bigint/mulop_ia32/mp_mulop.S @@ -0,0 +1,64 @@ +/* +* Multiply/Add Algorithm Source File +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +START_LISTING(mp_muladd.S) + +START_FUNCTION(bigint_mul_add_words) + SPILL_REGS() +#define PUSHED 4 + +#define LOOP_CTR ESI + ASSIGN(LOOP_CTR, ARG(3)) /* x_size */ + ZEROIZE(EDI) + + ASSIGN(ECX, ARG(1)) /* z[] */ + ASSIGN(EBX, ARG(2)) /* x[] */ + ASSIGN(EBP, ARG(4)) /* y */ + +#define MULADD_OP(N) \ + ASSIGN(EAX, ARRAY4(EBX, N)) ; \ + MUL(EBP) ; \ + ADD_W_CARRY(EAX, EDX, EDI) ; \ + ASSIGN(EDI, EDX) ; \ + ADD_W_CARRY(ARRAY4(ECX, N), EDI, EAX) ; + + JUMP_IF_ZERO(LOOP_CTR, .MUL_ADD_DONE) + JUMP_IF_LT(LOOP_CTR, 8, .MULADD1_LOOP) + +START_LOOP(.MULADD8) + MULADD_OP(0) + MULADD_OP(1) + MULADD_OP(2) + MULADD_OP(3) + MULADD_OP(4) + MULADD_OP(5) + MULADD_OP(6) + MULADD_OP(7) + + SUB_IMM(LOOP_CTR, 8) + ADD_IMM(EBX, 32) + ADD_IMM(ECX, 32) +LOOP_UNTIL_LT(LOOP_CTR, 8, .MULADD8) + + JUMP_IF_ZERO(LOOP_CTR, .MUL_ADD_DONE) + +START_LOOP(.MULADD1) + MULADD_OP(0) + + SUB_IMM(LOOP_CTR, 1) + ADD_IMM(EBX, 4) + ADD_IMM(ECX, 4) +LOOP_UNTIL_EQ(LOOP_CTR, 0, .MULADD1) + +.MUL_ADD_DONE: + + ASSIGN(EAX, EDI) +#undef PUSHED + RESTORE_REGS() +END_FUNCTION(bigint_mul_add_words) diff --git a/src/libs/3rdparty/botan/src/math/gfpmath/curve_gfp.cpp b/src/libs/3rdparty/botan/src/math/gfpmath/curve_gfp.cpp new file mode 100644 index 00000000000..e12ade0812b --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/gfpmath/curve_gfp.cpp @@ -0,0 +1,165 @@ +/****** +* Elliptic curves over GF(p) +* +* (C) 2007 Martin Doering +* Christoph Ludwig +* Falko Strenzke +* 2008 Jack Lloyd +******/ + +#include +#include +#include +#include + +namespace Botan { + +void CurveGFp::set_shrd_mod(const std::tr1::shared_ptr mod) + { + mp_mod = mod; + mA.turn_off_sp_red_mul();// m.m. is not needed, must be trf. back + mB.turn_off_sp_red_mul();// m.m. is not needed, must be trf. back + //ok, above we destroy any evantually computated montg. mult. values, + // but that won't influence performance in usual applications + mA.set_shrd_mod(mod); + mB.set_shrd_mod(mod); + } + +CurveGFp::CurveGFp(const GFpElement& a, const GFpElement& b, + const BigInt& p) + : mA(a), + mB(b) + { + if(!((p == mA.get_p()) && (p == mB.get_p()))) + { + throw Invalid_Argument("could not construct curve: moduli of arguments differ"); + } + std::tr1::shared_ptr p_mod = std::tr1::shared_ptr(new GFpModulus(p)); + // the above is the creation of the GFpModuls object which will be shared point-wide + // (in the context of a point of course) + set_shrd_mod(p_mod); + } +// copy constructor +CurveGFp::CurveGFp(const CurveGFp& other) + : mA(other.get_a()), + mB(other.get_b()) + { + mp_mod = std::tr1::shared_ptr(new GFpModulus(*other.mp_mod)); + assert(mp_mod->p_equal_to(mA.get_p())); + assert(mp_mod->p_equal_to(mB.get_p())); + set_shrd_mod(mp_mod); + if(other.mp_mres_a.get()) + { + mp_mres_a = std::tr1::shared_ptr(new GFpElement(*other.mp_mres_a)); + } + if(other.mp_mres_b.get()) + { + mp_mres_b = std::tr1::shared_ptr(new GFpElement(*other.mp_mres_b)); + } + if(other.mp_mres_one.get()) + { + mp_mres_one = std::tr1::shared_ptr(new GFpElement(*other.mp_mres_one)); + } + + } + +// assignment operator +const CurveGFp& CurveGFp::operator=(const CurveGFp& other) + { + // for exception safety... + GFpElement a_tmp = other.mA; + GFpElement b_tmp = other.mB; + mA.swap(a_tmp); + mB.swap(b_tmp); + + std::tr1::shared_ptr p_mod = std::tr1::shared_ptr(new GFpModulus(*other.mp_mod)); + set_shrd_mod(p_mod); + + // exception safety note: no problem if we have a throw from here on... + if(other.mp_mres_a.get()) + { + mp_mres_a = std::tr1::shared_ptr(new GFpElement(*other.mp_mres_a)); + } + if(other.mp_mres_b.get()) + { + mp_mres_b = std::tr1::shared_ptr(new GFpElement(*other.mp_mres_b)); + } + if(other.mp_mres_one.get()) + { + mp_mres_one = std::tr1::shared_ptr(new GFpElement(*other.mp_mres_one)); + } + return *this; + } + +// getters +const GFpElement& CurveGFp::get_a() const + { + return mA; + } + +const GFpElement& CurveGFp::get_b() const + { + return mB; + } + +const BigInt CurveGFp::get_p() const + { + assert(mp_mod.get() != 0); + return mp_mod->get_p(); + } + +// swaps the states of *this and other, does not throw +void CurveGFp::swap(CurveGFp& other) + { + mA.swap(other.mA); + mB.swap(other.mB); + mp_mod.swap(other.mp_mod); + std::swap(mp_mres_a, other.mp_mres_a); + std::swap(mp_mres_b, other.mp_mres_b); + std::swap(mp_mres_one, other.mp_mres_one); + } + +GFpElement const CurveGFp::get_mres_a() const + { + if(mp_mres_a.get() == 0) + { + mp_mres_a = std::tr1::shared_ptr(new GFpElement(mA)); + mp_mres_a->turn_on_sp_red_mul(); + mp_mres_a->get_mres(); + } + return GFpElement(*mp_mres_a); + } + +GFpElement const CurveGFp::get_mres_b() const + { + if(mp_mres_b.get() == 0) + { + mp_mres_b = std::tr1::shared_ptr(new GFpElement(mB)); + mp_mres_b->turn_on_sp_red_mul(); + mp_mres_b->get_mres(); + } + return GFpElement(*mp_mres_b); + } + +std::tr1::shared_ptr const CurveGFp::get_mres_one() const + { + if(mp_mres_one.get() == 0) + { + mp_mres_one = std::tr1::shared_ptr(new GFpElement(mp_mod->get_p(), 1)); + mp_mres_one->turn_on_sp_red_mul(); + mp_mres_one->get_mres(); + } + return mp_mres_one; + } + +bool operator==(const CurveGFp& lhs, const CurveGFp& rhs) + { + return (lhs.get_p() == rhs.get_p() && lhs.get_a() == rhs.get_a() && lhs.get_b() == rhs.get_b()); + } + +std::ostream& operator<<(std::ostream& output, const CurveGFp& elem) + { + return output << "y^2f = x^3 + (" << elem.get_a() << ")x + (" << elem.get_b() << ")"; + } + +} diff --git a/src/libs/3rdparty/botan/src/math/gfpmath/curve_gfp.h b/src/libs/3rdparty/botan/src/math/gfpmath/curve_gfp.h new file mode 100644 index 00000000000..81cf6ce5161 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/gfpmath/curve_gfp.h @@ -0,0 +1,177 @@ +/****** + * Elliptic curves over GF(p) (header file) + * + * (C) 2007 Martin Doering + * doering@cdc.informatik.tu-darmstadt.de + * Christoph Ludwig + * ludwig@fh-worms.de + * Falko Strenzke + * strenzke@flexsecure.de + ******/ + +#ifndef BOTAN_GFP_CURVE_H__ +#define BOTAN_GFP_CURVE_H__ + +#include +#include +#include + +namespace Botan { + +/** +* This class represents an elliptic curve over GF(p) +* +* Distributed under the terms of the Botan license +*/ +class BOTAN_DLL CurveGFp + { + public: + + /** + * Construct the elliptic curve E: y^2 = x^3 + ax + b over GF(p) + * @param a first coefficient + * @param b second coefficient + * @param p prime number of the field + */ + CurveGFp(const GFpElement& a, const GFpElement& b, + const BigInt& p); + + /** + * Copy constructor + * @param other The curve to clone + */ + CurveGFp(const CurveGFp& other); + + /** + * Assignment operator + * @param other The curve to use as source for the assignment + */ + const CurveGFp& operator=(const CurveGFp& other); + + /** + * Set the shared GFpModulus object. + * Warning: do not use this function unless you know in detail how + * the sharing of values + * in the various EC related objects works. + * Do NOT spread pointers to a GFpModulus over different threads! + * @param mod a shared pointer to a GFpModulus object suitable for + * *this. + */ + void set_shrd_mod(const std::tr1::shared_ptr mod); + + // getters + + /** + * Get coefficient a + * @result coefficient a + */ + const GFpElement& get_a() const; + + /** + * Get coefficient b + * @result coefficient b + */ + const GFpElement& get_b() const; + + /** + * Get the GFpElement coefficient a transformed + * to its m-residue. This can be used for efficency reasons: the curve + * stores the transformed version after the first invocation of this + * function. + * @result the coefficient a, transformed to its m-residue + */ + GFpElement const get_mres_a() const; + + /** + * Get the GFpElement coefficient b transformed + * to its m-residue. This can be used for efficency reasons: the curve + * stores the transformed version after the first invocation of this + * function. + * @result the coefficient b, transformed to its m-residue + */ + GFpElement const get_mres_b() const; + + + /** + * Get the GFpElement 1 transformed + * to its m-residue. This can be used for efficency reasons: the curve + * stores the transformed version after the first invocation of this + * function. + * @result the GFpElement 1, transformed to its m-residue + */ + std::tr1::shared_ptr const get_mres_one() const; + + /** + * Get prime modulus of the field of the curve + * @result prime modulus of the field of the curve + */ + BigInt const get_p() const; + /*inline std::tr1::shared_ptr const get_ptr_p() const + { + return mp_p; + }*/ + + /** + * Retrieve a shared pointer to the curves GFpModulus object for efficient storage + * and computation of montgomery multiplication related data members and functions. + * Warning: do not use this function unless you know in detail how the sharing of values + * in the various EC related objects works. + * Do NOT spread pointers to a GFpModulus over different threads! + * @result a shared pointer to a GFpModulus object + */ + inline std::tr1::shared_ptr const get_ptr_mod() const + { + return mp_mod; + } + + /** + * swaps the states of *this and other, does not throw + * @param other The curve to swap values with + */ + void swap(CurveGFp& other); + + private: + std::tr1::shared_ptr mp_mod; + GFpElement mA; + GFpElement mB; + mutable std::tr1::shared_ptr mp_mres_a; + mutable std::tr1::shared_ptr mp_mres_b; + mutable std::tr1::shared_ptr mp_mres_one; + }; + +// relational operators +bool operator==(const CurveGFp& lhs, const CurveGFp& rhs); + +inline bool operator!=(const CurveGFp& lhs, const CurveGFp& rhs) + { + return !(lhs == rhs); + } + +// io operators +std::ostream& operator<<(std::ostream& output, const CurveGFp& elem); + +// swaps the states of curve1 and curve2, does not throw! +// cf. Meyers, Item 25 +inline +void swap(CurveGFp& curve1, CurveGFp& curve2) + { + curve1.swap(curve2); + } + +} // namespace Botan + + +namespace std { + +// swaps the states of curve1 and curve2, does not throw! +// cf. Meyers, Item 25 +template<> inline +void swap(Botan::CurveGFp& curve1, + Botan::CurveGFp& curve2) + { + curve1.swap(curve2); + } + +} // namespace std + +#endif diff --git a/src/libs/3rdparty/botan/src/math/gfpmath/gfp_element.cpp b/src/libs/3rdparty/botan/src/math/gfpmath/gfp_element.cpp new file mode 100644 index 00000000000..b7180930198 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/gfpmath/gfp_element.cpp @@ -0,0 +1,699 @@ +/****** + * Arithmetic for prime fields GF(p) (source file) + * + * (C) 2007 Martin Doering + * doering@cdc.informatik.tu-darmstadt.de + * Christoph Ludwig + * ludwig@fh-worms.de + * Falko Strenzke + * strenzke@flexsecure.de + ******/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +void inner_montg_mult_sos(word result[], const word* a_bar, const word* b_bar, const word* n, const word* n_dash, u32bit s) + { + SecureVector t; + t.grow_to(2*s+1); + + // t = a_bar * b_bar + for (u32bit i=0; i 0) + { + // we need not worry here about C > 1, because the other operand is zero + word tmp = word_add(t[i+s+cnt], 0, &C); + t[i+s+cnt] = tmp; + cnt++; + } + } + + // u = t + SecureVector u; + u.grow_to(s+1); + for (u32bit j=0; j= 0 (B == 0 -> no borrow), return t + if(B == 0) + { + for (u32bit i=0; im (and R beeing as small as possible) for an odd modulus m. +* no check for oddity is performed! +* +* Distributed under the terms of the Botan license +*/ +BigInt montgm_calc_r_oddmod(const BigInt& prime) + { + u32bit n = prime.sig_words(); + BigInt result(1); + result <<= n*BOTAN_MP_WORD_BITS; + return result; + } + +/** +*calculates m' with r*r^-1 - m*m' = 1 +* where r^-1 is the multiplicative inverse of r to the modulus m +*/ +BigInt montgm_calc_m_dash(const BigInt& r, const BigInt& m, const BigInt& r_inv) + { + BigInt result = ((r * r_inv) - BigInt(1))/m; + return result; + } + +BigInt montg_trf_to_mres(const BigInt& ord_res, const BigInt& r, const BigInt& m) + { + BigInt result(ord_res); + result *= r; + result %= m; + return result; + } + +BigInt montg_trf_to_ordres(const BigInt& m_res, const BigInt& m, const BigInt& r_inv) + { + BigInt result(m_res); + result *= r_inv; + result %= m; + return result; + } + +} + +GFpElement::GFpElement(const BigInt& p, const BigInt& value, bool use_montgm) + : mp_mod(), + m_value(value %p), + m_use_montgm(use_montgm), + m_is_trf(false) + { + assert(mp_mod.get() == 0); + mp_mod = std::tr1::shared_ptr(new GFpModulus(p)); + assert(mp_mod->m_p_dash == 0); + if(m_use_montgm) + ensure_montgm_precomp(); + } + +GFpElement::GFpElement(std::tr1::shared_ptr const mod, const BigInt& value, bool use_montgm) + : mp_mod(), + m_value(value % mod->m_p), + m_use_montgm(use_montgm), + m_is_trf(false) + { + assert(mp_mod.get() == 0); + mp_mod = mod; + } + +GFpElement::GFpElement(const GFpElement& other) + : m_value(other.m_value), + m_use_montgm(other.m_use_montgm), + m_is_trf(other.m_is_trf) + + { + //creates an independent copy + assert((other.m_is_trf && other.m_use_montgm) || !other.m_is_trf); + mp_mod.reset(new GFpModulus(*other.mp_mod)); // copy-ctor of GFpModulus + } + +void GFpElement::turn_on_sp_red_mul() const + { + ensure_montgm_precomp(); + m_use_montgm = true; + } + +void GFpElement::turn_off_sp_red_mul() const + { + if(m_is_trf) + { + trf_to_ordres(); + // will happen soon anyway, so we can do it here already + // (this is not lazy but way more secure concerning our internal logic here) + } + m_use_montgm = false; + } + +void GFpElement::ensure_montgm_precomp() const + { + if((!mp_mod->m_r.is_zero()) && (!mp_mod->m_r_inv.is_zero()) && (!mp_mod->m_p_dash.is_zero())) + { + // values are already set, nothing more to do + } + else + { + BigInt tmp_r(montgm_calc_r_oddmod(mp_mod->m_p)); + + BigInt tmp_r_inv(inverse_mod(tmp_r, mp_mod->m_p)); + + BigInt tmp_p_dash(montgm_calc_m_dash(tmp_r, mp_mod->m_p, tmp_r_inv)); + + mp_mod->m_r.grow_reg(tmp_r.size()); + mp_mod->m_r_inv.grow_reg(tmp_r_inv.size()); + mp_mod->m_p_dash.grow_reg(tmp_p_dash.size()); + + mp_mod->m_r = tmp_r; + mp_mod->m_r_inv = tmp_r_inv; + mp_mod->m_p_dash = tmp_p_dash; + + assert(!mp_mod->m_r.is_zero()); + assert(!mp_mod->m_r_inv.is_zero()); + assert(!mp_mod->m_p_dash.is_zero()); + } + + } + +void GFpElement::set_shrd_mod(std::tr1::shared_ptr const p_mod) + { + mp_mod = p_mod; + } + +void GFpElement::trf_to_mres() const + { + if(!m_use_montgm) + { + throw Illegal_Transformation("GFpElement is not allowed to be transformed to m-residue"); + } + assert(m_is_trf == false); + assert(!mp_mod->m_r_inv.is_zero()); + assert(!mp_mod->m_p_dash.is_zero()); + m_value = montg_trf_to_mres(m_value, mp_mod->m_r, mp_mod->m_p); + m_is_trf = true; + } + +void GFpElement::trf_to_ordres() const + { + assert(m_is_trf == true); + m_value = montg_trf_to_ordres(m_value, mp_mod->m_p, mp_mod->m_r_inv); + m_is_trf = false; + } + +bool GFpElement::align_operands_res(const GFpElement& lhs, const GFpElement& rhs) //static + { + assert(lhs.mp_mod->m_p == rhs.mp_mod->m_p); + if(lhs.m_use_montgm && rhs.m_use_montgm) + { + assert(rhs.mp_mod->m_p_dash == lhs.mp_mod->m_p_dash); + assert(rhs.mp_mod->m_r == lhs.mp_mod->m_r); + assert(rhs.mp_mod->m_r_inv == lhs.mp_mod->m_r_inv); + if(!lhs.m_is_trf && !rhs.m_is_trf) + { + return false; + } + else if(lhs.m_is_trf && rhs.m_is_trf) + { + return true; + } + else // one is transf., the other not + { + if(!lhs.m_is_trf) + { + lhs.trf_to_mres(); + assert(rhs.m_is_trf==true); + return true; + } + assert(rhs.m_is_trf==false); + assert(lhs.m_is_trf==true); + rhs.trf_to_mres(); // the only possibility left... + return true; + } + } + else // at least one of them does not use mm + // (so it is impossible that both use it) + { + if(lhs.m_is_trf) + { + lhs.trf_to_ordres(); + assert(rhs.m_is_trf == false); + return false; + } + if(rhs.m_is_trf) + { + rhs.trf_to_ordres(); + assert(lhs.m_is_trf == false); + return false; + } + return false; + } + assert(false); + } + +bool GFpElement::is_trf_to_mres() const + { + return m_is_trf; + } + +const BigInt& GFpElement::get_p() const + { + return (mp_mod->m_p); + } + +const BigInt& GFpElement::get_value() const + { + if(m_is_trf) + { + assert(m_use_montgm); + trf_to_ordres(); + } + return m_value; + } + +const BigInt& GFpElement::get_mres() const + { + if(!m_use_montgm) + { + // does the following exception really make sense? + // wouldnΒ΄t it be better to simply turn on montg.mult. when + // this explicit request is made? + throw Illegal_Transformation("GFpElement is not allowed to be transformed to m-residue"); + } + if(!m_is_trf) + { + trf_to_mres(); + } + + return m_value; + } + +const GFpElement& GFpElement::operator=(const GFpElement& other) + { + m_value.grow_reg(other.m_value.size()); // grow first for exception safety + + //m_value = other.m_value; + + // m_use_montgm = other.m_use_montgm; + // m_is_trf = other.m_is_trf; + // we want to keep the member pointers, which might be part of a "sharing group" + // but we may not simply overwrite the BigInt values with those of the argument!! + // if ours already contains precomputations, it would be hazardous to + // set them back to zero. + // thus we first check for equality of the moduli, + // then whether either of the two objects already contains + // precomputed values. + + // we also deal with the case were the pointers themsevles are equal: + if(mp_mod.get() == other.mp_mod.get()) + { + // everything ok, we are in the same sharing group anyway, nothing to do + m_value = other.m_value; // cannot throw + m_use_montgm = other.m_use_montgm; + m_is_trf = other.m_is_trf; + return *this; + } + if(mp_mod->m_p != other.mp_mod->m_p) + { + // the moduli are different, this is a special case + // which will not occur in usual applications, + // so we donΒ΄t hesitate to simply create new objects + // (we do want to create an independent copy) + mp_mod.reset(new GFpModulus(*other.mp_mod)); // this could throw, + // and because of this + // we haven't modified + // anything so far + m_value = other.m_value; // can't throw + m_use_montgm = other.m_use_montgm; + m_is_trf = other.m_is_trf; + return *this; + } + // exception safety note: from now on we are on the safe + // side with respect to the modulus, + // so we can assign the value now: + m_value = other.m_value; + m_use_montgm = other.m_use_montgm; + m_is_trf = other.m_is_trf; + // the moduli are equal, but we deal with different sharing groups. + // we will NOT fuse the sharing goups + // and we will NOT reset already precomputed values + if(mp_mod->has_precomputations()) + { + // our own sharing group already has precomputed values, + // so nothing to do. + return *this; + } + else + { + // letΒ΄s see whether the argument has something for us... + if(other.mp_mod->has_precomputations()) + { + // fetch them for our sharing group + // exc. safety note: grow first + mp_mod->m_p_dash.grow_reg(other.mp_mod->m_p_dash.size()); + mp_mod->m_r.grow_reg(other.mp_mod->m_r.size()); + mp_mod->m_r_inv.grow_reg(other.mp_mod->m_r_inv.size()); + + mp_mod->m_p_dash = other.mp_mod->m_p_dash; + mp_mod->m_r = other.mp_mod->m_r; + mp_mod->m_r_inv = other.mp_mod->m_r_inv; + return *this; + } + } + // our precomputations arenΒ΄t set, the arguments neither, + // so we let them alone + return *this; + } + +void GFpElement::share_assign(const GFpElement& other) + { + assert((other.m_is_trf && other.m_use_montgm) || !other.m_is_trf); + + // use grow_to to make it exc safe + m_value.grow_reg(other.m_value.size()); + m_value = other.m_value; + + m_use_montgm = other.m_use_montgm; + m_is_trf = other.m_is_trf; + mp_mod = other.mp_mod; // cannot throw + } + +GFpElement& GFpElement::operator+=(const GFpElement& rhs) + { + GFpElement::align_operands_res(*this, rhs); + + workspace = m_value; + workspace += rhs.m_value; + if(workspace >= mp_mod->m_p) + workspace -= mp_mod->m_p; + + m_value = workspace; + assert(m_value < mp_mod->m_p); + assert(m_value >= 0); + + return *this; + } + +GFpElement& GFpElement::operator-=(const GFpElement& rhs) + { + GFpElement::align_operands_res(*this, rhs); + + workspace = m_value; + + workspace -= rhs.m_value; + + if(workspace.is_negative()) + workspace += mp_mod->m_p; + + m_value = workspace; + assert(m_value < mp_mod->m_p); + assert(m_value >= 0); + return *this; + } + +GFpElement& GFpElement::operator*= (u32bit rhs) + { + workspace = m_value; + workspace *= rhs; + workspace %= mp_mod->m_p; + m_value = workspace; + return *this; + } + +GFpElement& GFpElement::operator*=(const GFpElement& rhs) + { + assert(rhs.mp_mod->m_p == mp_mod->m_p); + // here, we do not use align_operands_res() for one simple reason: + // we want to enforce the transformation to an m-residue, otherwise it would + // never happen + if(m_use_montgm && rhs.m_use_montgm) + { + assert(rhs.mp_mod->m_p == mp_mod->m_p); // is montgm. mult is on, then precomps must be there + assert(rhs.mp_mod->m_p_dash == mp_mod->m_p_dash); + assert(rhs.mp_mod->m_r == mp_mod->m_r); + if(!m_is_trf) + { + trf_to_mres(); + } + if(!rhs.m_is_trf) + { + rhs.trf_to_mres(); + } + workspace = m_value; + montg_mult(m_value, workspace, rhs.m_value, mp_mod->m_p, mp_mod->m_p_dash, mp_mod->m_r); + } + else // ordinary multiplication + { + if(m_is_trf) + { + assert(m_use_montgm); + trf_to_ordres(); + } + if(rhs.m_is_trf) + { + assert(rhs.m_use_montgm); + rhs.trf_to_ordres(); + } + + workspace = m_value; + workspace *= rhs.m_value; + workspace %= mp_mod->m_p; + m_value = workspace; + } + return *this; + } + +GFpElement& GFpElement::operator/=(const GFpElement& rhs) + { + bool use_mres = GFpElement::align_operands_res(*this, rhs); + assert((this->m_is_trf && rhs.m_is_trf) || !(this->m_is_trf && rhs.m_is_trf)); + // (internal note: see C86) + if(use_mres) + { + assert(m_use_montgm && rhs.m_use_montgm); + GFpElement rhs_ordres(rhs); + rhs_ordres.trf_to_ordres(); + rhs_ordres.inverse_in_place(); + workspace = m_value; + workspace *= rhs_ordres.get_value(); + workspace %= mp_mod->m_p; + m_value = workspace; + + } + else + { + GFpElement inv_rhs(rhs); + inv_rhs.inverse_in_place(); + *this *= inv_rhs; + } + return *this; + } + +bool GFpElement::is_zero() + { + return (m_value.is_zero()); + // this is correct because x_bar = x * r = x = 0 for x = 0 + } + +GFpElement& GFpElement::inverse_in_place() + { + m_value = inverse_mod(m_value, mp_mod->m_p); + if(m_is_trf) + { + assert(m_use_montgm); + + m_value *= mp_mod->m_r; + m_value *= mp_mod->m_r; + m_value %= mp_mod->m_p; + } + assert(m_value <= mp_mod->m_p); + return *this; + } + +GFpElement& GFpElement::negate() + { + m_value = mp_mod->m_p - m_value; + assert(m_value <= mp_mod->m_p); + return *this; + } + +void GFpElement::swap(GFpElement& other) + { + m_value.swap(other.m_value); + mp_mod.swap(other.mp_mod); + std::swap(m_use_montgm,other.m_use_montgm); + std::swap(m_is_trf,other.m_is_trf); + } + +std::ostream& operator<<(std::ostream& output, const GFpElement& elem) + { + return output << '(' << elem.get_value() << "," << elem.get_p() << ')'; + } + +bool operator==(const GFpElement& lhs, const GFpElement& rhs) + { + // for effeciency reasons we firstly check whether + //the modulus pointers are different in the first place: + if(lhs.get_ptr_mod() != rhs.get_ptr_mod()) + { + if(lhs.get_p() != rhs.get_p()) + { + return false; + } + } + // so the modulus is equal, now check the values + bool use_mres = GFpElement::align_operands_res(lhs, rhs); + + if(use_mres) + { + return (lhs.get_mres() == rhs.get_mres()); + } + else + { + return(lhs.get_value() == rhs.get_value()); + } + } + +GFpElement operator+(const GFpElement& lhs, const GFpElement& rhs) + { + // consider the case that lhs and rhs both use montgm: + // then += returns an element which uses montgm. + // thus the return value of op+ here will be an element + // using montgm in this case + // NOTE: the rhs might be transformed when using op+, the lhs never + GFpElement result(lhs); + result += rhs; + return result; + } + +GFpElement operator-(const GFpElement& lhs, const GFpElement& rhs) + { + GFpElement result(lhs); + result -= rhs; + return result; + // NOTE: the rhs might be transformed when using op-, the lhs never + } + +GFpElement operator-(const GFpElement& lhs) + { + return(GFpElement(lhs)).negate(); + } + +GFpElement operator*(const GFpElement& lhs, const GFpElement& rhs) + { + // consider the case that lhs and rhs both use montgm: + // then *= returns an element which uses montgm. + // thus the return value of op* here will be an element + // using montgm in this case + GFpElement result(lhs); + result *= rhs; + return result; + } + +GFpElement operator*(const GFpElement& lhs, u32bit rhs) + { + GFpElement result(lhs); + result *= rhs; + return result; + } + +GFpElement operator*(u32bit lhs, const GFpElement& rhs) + { + return rhs*lhs; + } + +GFpElement operator/(const GFpElement& lhs, const GFpElement& rhs) + { + GFpElement result (lhs); + result /= rhs; + return result; + } + +SecureVector FE2OSP(const GFpElement& elem) + { + return BigInt::encode_1363(elem.get_value(), elem.get_p().bytes()); + } + +GFpElement OS2FEP(MemoryRegion const& os, BigInt p) + { + return GFpElement(p, BigInt::decode(os.begin(), os.size())); + } + +GFpElement inverse(const GFpElement& elem) + { + return GFpElement(elem).inverse_in_place(); + } + +} + diff --git a/src/libs/3rdparty/botan/src/math/gfpmath/gfp_element.h b/src/libs/3rdparty/botan/src/math/gfpmath/gfp_element.h new file mode 100644 index 00000000000..4e0ee985b21 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/gfpmath/gfp_element.h @@ -0,0 +1,311 @@ +/****** + * Arithmetic for prime fields GF(p) (header file) + * + * (C) 2007 Martin Doering + * doering@cdc.informatik.tu-darmstadt.de + * Christoph Ludwig + * ludwig@fh-worms.de + * Falko Strenzke + * strenzke@flexsecure.de + ******/ + +#ifndef BOTAN_GFP_ELEMENT_H__ +#define BOTAN_GFP_ELEMENT_H__ + +#include +#include +#include + +#if defined(BOTAN_USE_STD_TR1) + #include +#elif defined(BOTAN_USE_BOOST_TR1) + #include +#else + #error "Please choose a TR1 implementation in build.h" +#endif + +namespace Botan { + +struct Illegal_Transformation : public Exception + { + Illegal_Transformation(const std::string& err = + "Requested transformation is not possible") + : Exception(err) {} + }; + +/** + * This class represents one element in GF(p). Enables the convenient, + * transparent use of the montgomery multiplication. + */ +class BOTAN_DLL GFpElement + { + private: + std::tr1::shared_ptr mp_mod; + mutable BigInt m_value; // ordinary residue or m-residue respectively + mutable BigInt workspace; + + // ***************************************** + // data members for montgomery multiplication + mutable bool m_use_montgm; + //mutable BigInt m_mres; + // this bool tells use whether the m_mres carries + // the actual value (in this case mValue doesnΒ΄t) + mutable bool m_is_trf; + + void ensure_montgm_precomp() const; + void trf_to_mres() const; + void trf_to_ordres() const; + + public: + + /** construct an element of GF(p) with the given value. + * use_montg defaults to false and determines wether Montgomery + * multiplications will be use when applying operators *, *= + * @param p the prime number of the field + * @param value the element value + * @param use_montgm whether this object will use Montgomery multiplication + */ + explicit GFpElement (const BigInt& p, const BigInt& value, bool use_montgm = false); + + + /** construct an element of GF(p) with the given value (defaults + * to 0). use_montg defaults to false and determines wether + * montgomery multiplications will be use when applying operators + * '*' , '*='. Use this constructor for efficient use of + * Montgomery multiplication in a context with a fixed a modulus. + * Warning: do not use this function unless you know in detail + * about the implications of using the shared GFpModulus objects! + * @param mod shared pointer to the GFpModulus to be shared + * @param value the element value + * @param use_montgm whether this object will use Montgomery multiplication + */ + explicit GFpElement(std::tr1::shared_ptr const mod, + const BigInt& value, bool use_mongm = false); + + /** + * Copy constructor + * @param other The element to clone + */ + GFpElement(const GFpElement& other); + + /** + * Assignment operator. + * makes *this a totally independent object + * (gives *this independent modulus specific values). + + * @param other The element to assign to our object + */ + const GFpElement& operator=(const GFpElement& other); + + /** + * Works like the assignment operator, but lets + * *this share the modulus dependend value with other. + * Warning: do not use this function unless you know in detail about + * the implications of using + * the shared GFpModulus objects! + * @param other The element to assign to our object + */ + void share_assign(const GFpElement& other); + + /** + * Switch Montgomery multiplcation optimizations ON + */ + void turn_on_sp_red_mul() const; + + /** + * Switch Montgomery multiplcation optimizations OFF + */ + void turn_off_sp_red_mul() const; + + /** + * += Operator + * @param rhs the GFpElement to add to the local value + * @result *this + */ + GFpElement& operator+=(const GFpElement& rhs); + + /** + * -= Operator + * @param rhs the GFpElement to subtract from the local value + * @result *this + */ + GFpElement& operator-=(const GFpElement& rhs); + + /** + * *= Operator + * @param rhs the GFpElement to multiply with the local value + * @result *this + */ + GFpElement& operator*=(const GFpElement& rhs); + /** + * /= Operator + * @param rhs the GFpElement to divide the local value by + * @result *this + */ + GFpElement& operator/=(const GFpElement& rhs); + + /** + * *= Operator + * @param rhs the value to multiply with the local value + * @result *this + */ + GFpElement& operator*= (u32bit rhs); + + /** + * Negate internal value(*this *= -1 ) + * @return *this + */ + GFpElement& negate(); + + /** + * Assigns the inverse of *this to *this, i.e. + * *this = (*this)^(-1) + * @result *this + */ + GFpElement& inverse_in_place(); + + /** + * checks whether the value is zero (without provoking + * a backtransformation to the ordinary-residue) + * @result true, if the value is zero, false otherwise. + */ + bool is_zero(); + + /** + * return prime number of GF(p) + * @result a prime number + */ + const BigInt& get_p() const; + + /** + * Return the represented value in GF(p) + * @result The value in GF(p) + */ + const BigInt& get_value() const; + + /** + * Returns the shared pointer to the GFpModulus of *this. + * Warning: do not use this function unless you know in detail about + * the implications of using + * the shared GFpModulus objects! + * @result the shared pointer to the GFpModulus of *this + */ + inline std::tr1::shared_ptr const get_ptr_mod() const + { + return mp_mod; + } + + + /** + * Sets the shared pointer to the GFpModulus of *this. + * Warning: do not use this function unless you know in detail about + * the implications of using + * the shared GFpModulus objects! + * @param mod a shared pointer to a GFpModulus that will be held in *this + */ + void set_shrd_mod(std::tr1::shared_ptr const mod); + + /** + * Tells whether this GFpElement is currently transformed to itΒ΄ m-residue, + * i.e. in the form x_bar = x * r mod m. + * @result true if it is currently transformed to itΒ΄s m-residue. + */ + bool is_trf_to_mres() const; + + /** + * Transforms this to x_bar = x * r mod m + * @result return the value x_bar. + */ + const BigInt& get_mres() const; + + /** + * Check, if montgomery multiplication is used. + * @result true, if montgomery multiplication is used, false otherwise + */ + bool is_use_montgm() const + { + return m_use_montgm; + } + + /** + * Transforms the arguments in such way that either both + * are in m-residue representation (returns true) or both are + * in ordinary residue representation (returns false). + * m-residue is prefered in case of ambiguity. + * does not toggle m_use_montgm of the arguments. + * DonΒ΄t be confused about the constness of the arguments: + * the transformation between normal residue and m-residue is + * considered as leaving the object const. + * @param lhs the first operand to be aligned + * @param rhs the second operand to be aligned + * @result true if both are transformed to their m-residue, + * false it both are transformed to their normal residue. + */ + static bool align_operands_res(const GFpElement& lhs, const GFpElement& rhs); + + //friend declarations for non-member functions + + /** + * write a GFpElement to an output stream. + * @param output the output stream to write to + * @param elem the object to write + * @result the output stream + */ + friend std::ostream& operator<<(std::ostream& output, const GFpElement& elem); + + friend class Point_Coords_GFp; + + /** + * swaps the states of *this and other, does not throw! + * @param other The value to swap with + */ + void swap(GFpElement& other); + + }; + +// relational operators +bool operator==(const GFpElement& lhs, const GFpElement& rhs); +inline bool operator!=(const GFpElement& lhs, const GFpElement& rhs ) + { + return !operator==(lhs, rhs); + } + +// arithmetic operators +GFpElement operator+(const GFpElement& lhs, const GFpElement& rhs); +GFpElement operator-(const GFpElement& lhs, const GFpElement& rhs); +GFpElement operator-(const GFpElement& lhs); + +GFpElement operator*(const GFpElement& lhs, const GFpElement& rhs); +GFpElement operator/(const GFpElement& lhs, const GFpElement& rhs); +GFpElement operator* (const GFpElement& lhs, u32bit rhs); +GFpElement operator* (u32bit rhs, const GFpElement& lhs); + +// io operators +std::ostream& operator<<(std::ostream& output, const GFpElement& elem); + +// return (*this)^(-1) +GFpElement inverse(const GFpElement& elem); + +// encoding and decoding +SecureVector FE2OSP(const GFpElement& elem); +GFpElement OS2FEP(MemoryRegion const& os, BigInt p); + +inline void swap(GFpElement& x, GFpElement& y) + { + x.swap(y); + } + +} + +namespace std { + +template<> inline +void swap(Botan::GFpElement& x, + Botan::GFpElement& y) + { + x.swap(y); + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/gfpmath/gfp_modulus.h b/src/libs/3rdparty/botan/src/math/gfpmath/gfp_modulus.h new file mode 100644 index 00000000000..b5c0857758c --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/gfpmath/gfp_modulus.h @@ -0,0 +1,127 @@ +/****** + * Modulus and related data for a specific + * implementation of GF(p) (header file) + * + * (C) 2008 Martin DΓΆring + * doering@cdc.informatik.tu-darmstadt.de + * Christoph Ludwig + * ludwig@fh-worms.de + * Falko Strenzke + * strenzke@flexsecure.de + ******/ + +#ifndef BOTAN_GFP_MODULUS_H__ +#define BOTAN_GFP_MODULUS_H__ + +#include + +namespace Botan +{ + +class BOTAN_DLL GFpElement; +/** +* This class represents a GFpElement modulus including the modulus related +* values necessary for the montgomery multiplication. +* +* Distributed under the terms of the Botan license +*/ +class BOTAN_DLL GFpModulus + { + friend class GFpElement; + private: + BigInt m_p; // the modulus itself + mutable BigInt m_p_dash; + mutable BigInt m_r; + mutable BigInt m_r_inv; + public: + + /** + * Construct a GF(P)-Modulus from a BigInt + */ + GFpModulus(BigInt p) + : m_p(p), + m_p_dash(), + m_r(), + m_r_inv() + {} + + /** + * Tells whether the precomputations necessary for the use of the + * montgomery multiplication have yet been established. + * @result true if the precomputated value are already available. + */ + inline bool has_precomputations() const + { + return(!m_p_dash.is_zero() && !m_r.is_zero() && !m_r_inv.is_zero()); + } + + /** + * Swaps this with another GFpModulus, does not throw. + * @param other the GFpModulus to swap *this with. + */ + inline void swap(GFpModulus& other) + { + m_p.swap(other.m_p); + m_p_dash.swap(other.m_p_dash); + m_r.swap(other.m_r); + m_r_inv.swap(other.m_r_inv); + } + + /** + * Tells whether the modulus of *this is equal to the argument. + * @param mod the modulus to compare this with + * @result true if the modulus of *this and the argument are equal. + */ + inline bool p_equal_to(const BigInt& mod) const + { + return (m_p == mod); + } + + /** + * Return the modulus of this GFpModulus. + * @result the modulus of *this. + */ + inline const BigInt& get_p() const + { + return m_p; + } + + /** + * returns the montgomery multiplication related value r. + * Warning: will be zero if precomputations have not yet been + * performed! + * @result r + */ + inline const BigInt& get_r() const + { + return m_r; + } + + /** + * returns the montgomery multiplication related value r^{-1}. + * Warning: will be zero if precomputations have not yet been + * performed! + * @result r^{-1} + */ + inline const BigInt& get_r_inv() const + { + return m_r_inv; + } + + /** + * returns the montgomery multiplication related value p'. + * Warning: will be zero if precomputations have not yet been + * performed! + * @result p' + */ + inline const BigInt& get_p_dash() const + { + return m_p_dash; + } + // default cp-ctor, op= are fine + }; + +} + +#endif + diff --git a/src/libs/3rdparty/botan/src/math/gfpmath/info.txt b/src/libs/3rdparty/botan/src/math/gfpmath/info.txt new file mode 100644 index 00000000000..1a52144b76e --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/gfpmath/info.txt @@ -0,0 +1,22 @@ +realname "GF(p) Math" + +uses_tr1 yes + +load_on auto + +define BIGINT_GFP + + +curve_gfp.cpp +curve_gfp.h +gfp_element.cpp +gfp_element.h +gfp_modulus.h +point_gfp.cpp +point_gfp.h + + + +bigint +numbertheory + diff --git a/src/libs/3rdparty/botan/src/math/gfpmath/point_gfp.cpp b/src/libs/3rdparty/botan/src/math/gfpmath/point_gfp.cpp new file mode 100644 index 00000000000..9139c3ef932 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/gfpmath/point_gfp.cpp @@ -0,0 +1,1154 @@ +/****** +* Arithmetic for point groups of elliptic curves +* over GF(p) (source file) +* +* (C) 2007 Martin Doering +* Christoph Ludwig +* Falko Strenzke +* 2008 Jack Lloyd +******/ + +#include +#include + +namespace Botan { + +// construct the point at infinity or a random point +PointGFp::PointGFp(const CurveGFp& curve) + : mC(curve), + mX(curve.get_p(), 0), + mY(curve.get_p(), 1), + mZ(curve.get_p(), 0), + mZpow2(curve.get_p(),0), + mZpow3(curve.get_p(),0), + mAZpow4(curve.get_p(),0), + mZpow2_set(false), + mZpow3_set(false), + mAZpow4_set(false) + { + // first set the point wide pointer + + set_shrd_mod(mC.get_ptr_mod()); + + } + +// construct a point given its jacobian projective coordinates +PointGFp::PointGFp(const CurveGFp& curve, const GFpElement& x, + const GFpElement& y, const GFpElement& z) + : mC(curve), + mX(x), + mY(y), + mZ(z), + mZpow2(curve.get_p(),0), + mZpow3(curve.get_p(),0), + mAZpow4(curve.get_p(),0), + mZpow2_set(false), + mZpow3_set(false), + mAZpow4_set(false) + { + set_shrd_mod(mC.get_ptr_mod()); + } +PointGFp::PointGFp ( const CurveGFp& curve, const GFpElement& x, + const GFpElement& y ) + :mC(curve), + mX(x), + mY(y), + mZ(curve.get_p(),1), + mZpow2(curve.get_p(),0), + mZpow3(curve.get_p(),0), + mAZpow4(curve.get_p(),0), + mZpow2_set(false), + mZpow3_set(false), + mAZpow4_set(false) + { + set_shrd_mod(mC.get_ptr_mod()); + } + +// copy constructor +PointGFp::PointGFp(const PointGFp& other) + : mC(other.mC), + mX(other.mX), + mY(other.mY), + mZ(other.mZ), + mZpow2(other.mZpow2), + mZpow3(other.mZpow3), + mAZpow4(other.mAZpow4), + mZpow2_set(other.mZpow2_set), + mZpow3_set(other.mZpow3_set), + mAZpow4_set(other.mAZpow4_set) + { + set_shrd_mod(mC.get_ptr_mod()); + } + +// assignment operator +const PointGFp& PointGFp::operator=(PointGFp const& other) + { + mC = other.get_curve(); + mX = other.get_jac_proj_x(); + mY = other.get_jac_proj_y(); + mZ = other.get_jac_proj_z(); + mZpow2 = GFpElement(other.mZpow2); + mZpow3 = GFpElement(other.mZpow3); + mAZpow4 = GFpElement(other.mAZpow4); + mZpow2_set = other.mZpow2_set; + mZpow3_set = other.mZpow3_set; + mAZpow4_set = other.mAZpow4_set; + set_shrd_mod(mC.get_ptr_mod()); + return *this; + } + +const PointGFp& PointGFp::assign_within_same_curve(PointGFp const& other) + { + mX = other.get_jac_proj_x(); + mY = other.get_jac_proj_y(); + mZ = other.get_jac_proj_z(); + mZpow2_set = false; + mZpow3_set = false; + mAZpow4_set = false; + // the rest stays! + return *this; + } + +void PointGFp::set_shrd_mod(std::tr1::shared_ptr p_mod) + { + mX.set_shrd_mod(p_mod); + mY.set_shrd_mod(p_mod); + mZ.set_shrd_mod(p_mod); + mZpow2.set_shrd_mod(p_mod); + mZpow3.set_shrd_mod(p_mod); + mAZpow4.set_shrd_mod(p_mod); + } + +void PointGFp::ensure_worksp() const + { + if (mp_worksp_gfp_el.get() != 0) + { + if ((*mp_worksp_gfp_el).size() == GFPEL_WKSP_SIZE) + { + return; + } + else + { + throw Invalid_State("encountered incorrect size for PointGFpΒ΄s GFpElement workspace"); + } + } + + mp_worksp_gfp_el = std::tr1::shared_ptr >(new std::vector); + mp_worksp_gfp_el->reserve(9); + for (u32bit i=0; ipush_back(GFpElement(1,0)); + + } + } + +// arithmetic operators +PointGFp& PointGFp::operator+=(const PointGFp& rhs) + { + if (is_zero()) + { + *this = rhs; + return *this; + } + if (rhs.is_zero()) + { + return *this; + } + ensure_worksp(); + + if (rhs.mZ == *(mC.get_mres_one())) + { + //U1 = mX; + (*mp_worksp_gfp_el)[0].share_assign(mX); + + //S1 = mY; + (*mp_worksp_gfp_el)[2].share_assign(mY); + } + else + { + if ((!rhs.mZpow2_set) || (!rhs.mZpow3_set)) + { + rhs.mZpow2 = rhs.mZ; + rhs.mZpow2 *= rhs.mZ; + rhs.mZpow3 = rhs.mZpow2; + rhs.mZpow3 *= rhs.mZ; + + rhs.mZpow2_set = true; + rhs.mZpow3_set = true; + } + //U1 = mX * rhs.mZpow2; + (*mp_worksp_gfp_el)[0].share_assign(mX); + (*mp_worksp_gfp_el)[0] *= rhs.mZpow2; + + //S1 = mY * rhs.mZpow3; + (*mp_worksp_gfp_el)[2].share_assign(mY); + (*mp_worksp_gfp_el)[2] *= rhs.mZpow3; + + } + if (mZ == *(mC.get_mres_one())) + { + //U2 = rhs.mX; + (*mp_worksp_gfp_el)[1].share_assign(rhs.mX); + + //S2 = rhs.mY; + (*mp_worksp_gfp_el)[3].share_assign(rhs.mY); + } + else + { + if ((!mZpow2_set) || (!mZpow3_set)) + { + // precomputation canΒ΄t be used, because *this changes anyway + mZpow2 = mZ; + mZpow2 *= mZ; + + mZpow3 = mZpow2; + mZpow3 *= mZ; + } + //U2 = rhs.mX * mZpow2; + (*mp_worksp_gfp_el)[1].share_assign(rhs.mX); + (*mp_worksp_gfp_el)[1] *= mZpow2; + + //S2 = rhs.mY * mZpow3; + (*mp_worksp_gfp_el)[3].share_assign(rhs.mY); + (*mp_worksp_gfp_el)[3] *= mZpow3; + + } + //GFpElement H(U2 - U1); + + (*mp_worksp_gfp_el)[4].share_assign((*mp_worksp_gfp_el)[1]); + (*mp_worksp_gfp_el)[4] -= (*mp_worksp_gfp_el)[0]; + + //GFpElement r(S2 - S1); + (*mp_worksp_gfp_el)[5].share_assign((*mp_worksp_gfp_el)[3]); + (*mp_worksp_gfp_el)[5] -= (*mp_worksp_gfp_el)[2]; + + //if(H.is_zero()) + if ((*mp_worksp_gfp_el)[4].is_zero()) + + { + if ((*mp_worksp_gfp_el)[5].is_zero()) + + { + mult2_in_place(); + return *this; + } + *this = PointGFp(mC); // setting myself to zero + return *this; + } + + //U2 = H * H; + (*mp_worksp_gfp_el)[1].share_assign((*mp_worksp_gfp_el)[4]); + (*mp_worksp_gfp_el)[1] *= (*mp_worksp_gfp_el)[4]; + + //S2 = U2 * H; + (*mp_worksp_gfp_el)[3].share_assign((*mp_worksp_gfp_el)[1]); + (*mp_worksp_gfp_el)[3] *= (*mp_worksp_gfp_el)[4]; + + //U2 *= U1; + (*mp_worksp_gfp_el)[1] *= (*mp_worksp_gfp_el)[0]; + + //GFpElement x(r*r - S2 - (U2+U2)); + (*mp_worksp_gfp_el)[6].share_assign((*mp_worksp_gfp_el)[5]); + (*mp_worksp_gfp_el)[6] *= (*mp_worksp_gfp_el)[5]; + (*mp_worksp_gfp_el)[6] -= (*mp_worksp_gfp_el)[3]; + (*mp_worksp_gfp_el)[6] -= (*mp_worksp_gfp_el)[1]; + (*mp_worksp_gfp_el)[6] -= (*mp_worksp_gfp_el)[1]; + + //GFpElement z(S1 * S2); + (*mp_worksp_gfp_el)[8].share_assign((*mp_worksp_gfp_el)[2]); + (*mp_worksp_gfp_el)[8] *= (*mp_worksp_gfp_el)[3]; + + //GFpElement y(r * (U2-x) - z); + (*mp_worksp_gfp_el)[7].share_assign((*mp_worksp_gfp_el)[1]); + (*mp_worksp_gfp_el)[7] -= (*mp_worksp_gfp_el)[6]; + (*mp_worksp_gfp_el)[7] *= (*mp_worksp_gfp_el)[5]; + (*mp_worksp_gfp_el)[7] -= (*mp_worksp_gfp_el)[8]; + + if (mZ == *(mC.get_mres_one())) + { + if (rhs.mZ != *(mC.get_mres_one())) + { + //z = rhs.mZ * H; + (*mp_worksp_gfp_el)[8].share_assign(rhs.mZ); + (*mp_worksp_gfp_el)[8] *= (*mp_worksp_gfp_el)[4]; + } + else + { + //z = H; + (*mp_worksp_gfp_el)[8].share_assign((*mp_worksp_gfp_el)[4]); + } + } + else if (rhs.mZ != *(mC.get_mres_one())) + { + //U1 = mZ * rhs.mZ; + (*mp_worksp_gfp_el)[0].share_assign(mZ); + (*mp_worksp_gfp_el)[0] *= rhs.mZ; + + //z = U1 * H; + (*mp_worksp_gfp_el)[8].share_assign((*mp_worksp_gfp_el)[0]); + (*mp_worksp_gfp_el)[8] *= (*mp_worksp_gfp_el)[4]; + + } + else + { + //z = mZ * H; + (*mp_worksp_gfp_el)[8].share_assign(mZ); + (*mp_worksp_gfp_el)[8] *= (*mp_worksp_gfp_el)[4]; + + } + mZpow2_set = false; + mZpow3_set = false; + mAZpow4_set = false; + + mX = (*mp_worksp_gfp_el)[6]; + mY = (*mp_worksp_gfp_el)[7]; + mZ = (*mp_worksp_gfp_el)[8]; + + return *this; + + } +PointGFp& PointGFp::operator-=(const PointGFp& rhs) + { + PointGFp minus_rhs = PointGFp(rhs).negate(); + + if (is_zero()) + { + *this = minus_rhs; + } + else + { + *this += minus_rhs; + } + return *this; + } + +PointGFp& PointGFp::mult_this_secure(const BigInt& scalar, + const BigInt& /*point_order*/, + const BigInt& /*max_secr*/) + { + // NOTE: FS: so far this is code duplication of op*=. + // we have to see how we deal with this. + // fact is that we will probably modify this function + // while evaluating the countermeasures + // whereas we probably will not start modifying the + // function operator*=. + // however, in the end both should be merged. + + // use montgomery mult. in this operation + this->turn_on_sp_red_mul(); + + std::tr1::shared_ptr H(new PointGFp(this->mC)); + std::tr1::shared_ptr tmp; // used for AADA + + PointGFp P(*this); + BigInt m(scalar); + + if (m < BigInt(0)) + { + m = -m; + P.negate(); + } + if (P.is_zero() || (m == BigInt(0))) + { + *this = *H; + return *this; + } + if (m == BigInt(1)) + { + return *this; + } + // +#ifdef CM_AADA +#ifndef CM_RAND_EXP + int max_secr_bits = max_secr.bits(); +#endif +#endif + + int mul_bits = m.bits(); // this is used for a determined number of loop runs in + // the mult_loop where leading zeroΒ΄s are padded if necessary. + // Here we assign the value that will be used when no countermeasures are specified +#ifdef CM_RAND_EXP + u32bit rand_r_bit_len = 20; // Coron(99) proposes 20 bit for r + +#ifdef CM_AADA + + BigInt r_max(1); + +#endif // CM_AADA + + // use randomized exponent +#ifdef TA_COLL_T + static BigInt r_randexp; + if (new_rand) + { + r_randexp = random_integer(rand_r_bit_len); + } + //assert(!r_randexp.is_zero()); +#else + BigInt r_randexp(random_integer(rand_r_bit_len)); +#endif + + m += r_randexp * point_order; + // determine mul_bits... +#ifdef CM_AADA + // AADA with rand. Exp. + //assert(rand_r_bit_len > 0); + r_max <<= rand_r_bit_len; + r_max -= 1; + //assert(r_max.bits() == rand_r_bit_len); + mul_bits = (max_secr + point_order * r_max).bits(); +#else + // rand. Exp. without AADA + mul_bits = m.bits(); +#endif // CM_AADA + + +#endif // CM_RAND_EXP + + // determine mul_bits... +#if (CM_AADA == 1 && CM_RAND_EXP != 1) + + mul_bits = max_secr_bits; +#endif // CM_AADA without CM_RAND_EXP + + //assert(mul_bits != 0); + + + H = mult_loop(mul_bits-1, m, H, tmp, P); + + if (!H->is_zero()) // cannot convert if H == O + { + *this = H->get_z_to_one(); + }else + { + *this = *H; + } + mX.turn_off_sp_red_mul(); + mY.turn_off_sp_red_mul(); + mZ.turn_off_sp_red_mul(); + return *this; + } + +PointGFp& PointGFp::operator*=(const BigInt& scalar) + { + // use montgomery mult. in this operation + + this->turn_on_sp_red_mul(); + + PointGFp H(this->mC); // create as zero + H.turn_on_sp_red_mul(); + PointGFp P(*this); + P.turn_on_sp_red_mul(); + BigInt m(scalar); + if (m < BigInt(0)) + { + m = -m; + P.negate(); + } + if (P.is_zero() || (m == BigInt(0))) + { + *this = H; + return *this; + } + if (m == BigInt(1)) + { + //*this == P already + return *this; + } + + const int l = m.bits() - 1; + for (int i=l; i >=0; i--) + { + + H.mult2_in_place(); + if (m.get_bit(i)) + { + H += P; + } + } + + if (!H.is_zero()) // cannot convert if H == O + { + *this = H.get_z_to_one(); + }else + { + *this = H; + } + return *this; + } + +inline std::tr1::shared_ptr PointGFp::mult_loop(int l, + const BigInt& m, + std::tr1::shared_ptr H, + std::tr1::shared_ptr tmp, + const PointGFp& P) + { + //assert(l >= (int)m.bits()- 1); + tmp = H; + std::tr1::shared_ptr to_add(new PointGFp(P)); // we just need some point + // so that we can use op= + // inside the loop + for (int i=l; i >=0; i--) + { + H->mult2_in_place(); + +#ifndef CM_AADA + + if (m.get_bit(i)) + { + *H += P; + } +#else // (CM_AADA is in) + + if (H.get() == to_add.get()) + { + to_add = tmp; // otherwise all pointers might point to the same object + // and we always need two objects to be able to switch around + } + to_add->assign_within_same_curve(*H); + tmp = H; + *tmp += P; // tmp already points to H + + if (m.get_bit(i)) + { + H = tmp; // NOTE: assign the pointer, not the value! + // (so that the operation is fast and thus as difficult + // to detect as possible) + } + else + { + H = to_add; // NOTE: this is necessary, because the assignment + // "*tmp = ..." already changed what H pointed to + + + } +#endif // CM_AADA + + } + return H; + } + +PointGFp& PointGFp::negate() + { + if (!is_zero()) + { + mY.negate(); + } + return *this; + } + +// *this *= 2 +PointGFp& PointGFp::mult2_in_place() + { + if (is_zero()) + { + return *this; + } + if (mY.is_zero()) + { + + *this = PointGFp(mC); // setting myself to zero + return *this; + } + ensure_worksp(); + + (*mp_worksp_gfp_el)[0].share_assign(mY); + (*mp_worksp_gfp_el)[0] *= mY; + + //GFpElement S(mX * z); + (*mp_worksp_gfp_el)[1].share_assign(mX); + (*mp_worksp_gfp_el)[1] *= (*mp_worksp_gfp_el)[0]; + + //GFpElement x(S + S); + (*mp_worksp_gfp_el)[2].share_assign((*mp_worksp_gfp_el)[1]); + (*mp_worksp_gfp_el)[2] += (*mp_worksp_gfp_el)[1]; + + //S = x + x; + (*mp_worksp_gfp_el)[1].share_assign((*mp_worksp_gfp_el)[2]); + (*mp_worksp_gfp_el)[1] += (*mp_worksp_gfp_el)[2]; + + if (!mAZpow4_set) + { + if (mZ == *(mC.get_mres_one())) + { + mAZpow4 = mC.get_mres_a(); + mAZpow4_set = true; + } + else + { + if (!mZpow2_set) + { + mZpow2 = mZ; + mZpow2 *= mZ; + + mZpow2_set = true; + } + //x = mZpow2 * mZpow2; + (*mp_worksp_gfp_el)[2].share_assign(mZpow2); + (*mp_worksp_gfp_el)[2] *= mZpow2; + + //mAZpow4 = mC.get_mres_a() * x; + mAZpow4 = mC.get_mres_a(); + mAZpow4 *= (*mp_worksp_gfp_el)[2]; + + } + + } + + //GFpElement y(mX * mX); + (*mp_worksp_gfp_el)[3].share_assign(mX); + (*mp_worksp_gfp_el)[3] *= mX; + + //GFpElement M(y + y + y + mAZpow4); + (*mp_worksp_gfp_el)[4].share_assign((*mp_worksp_gfp_el)[3]); + (*mp_worksp_gfp_el)[4] += (*mp_worksp_gfp_el)[3]; + (*mp_worksp_gfp_el)[4] += (*mp_worksp_gfp_el)[3]; + (*mp_worksp_gfp_el)[4] += mAZpow4; + + //x = M * M - (S+S); + (*mp_worksp_gfp_el)[2].share_assign((*mp_worksp_gfp_el)[4]); + (*mp_worksp_gfp_el)[2] *= (*mp_worksp_gfp_el)[4]; + (*mp_worksp_gfp_el)[2] -= (*mp_worksp_gfp_el)[1]; + (*mp_worksp_gfp_el)[2] -= (*mp_worksp_gfp_el)[1]; + + //y = z * z; + (*mp_worksp_gfp_el)[3].share_assign((*mp_worksp_gfp_el)[0]); + (*mp_worksp_gfp_el)[3] *= (*mp_worksp_gfp_el)[0]; + + //GFpElement U(y + y); + (*mp_worksp_gfp_el)[5].share_assign((*mp_worksp_gfp_el)[3]); + (*mp_worksp_gfp_el)[5] += (*mp_worksp_gfp_el)[3]; + + //z = U + U; + (*mp_worksp_gfp_el)[0].share_assign((*mp_worksp_gfp_el)[5]); + (*mp_worksp_gfp_el)[0] += (*mp_worksp_gfp_el)[5]; + + //U = z + z; + (*mp_worksp_gfp_el)[5].share_assign((*mp_worksp_gfp_el)[0]); + (*mp_worksp_gfp_el)[5] += (*mp_worksp_gfp_el)[0]; + + //y = M * (S - x) - U; + (*mp_worksp_gfp_el)[3].share_assign((*mp_worksp_gfp_el)[1]); + (*mp_worksp_gfp_el)[3] -= (*mp_worksp_gfp_el)[2]; + (*mp_worksp_gfp_el)[3] *= (*mp_worksp_gfp_el)[4]; + (*mp_worksp_gfp_el)[3] -= (*mp_worksp_gfp_el)[5]; + + if (mZ != *(mC.get_mres_one())) + { + //z = mY * mZ; + (*mp_worksp_gfp_el)[0].share_assign(mY); + (*mp_worksp_gfp_el)[0] *= mZ; + + } + else + { + //z = mY; + (*mp_worksp_gfp_el)[0].share_assign(mY); + + } + //z = z + z; + (*mp_worksp_gfp_el)[6].share_assign((*mp_worksp_gfp_el)[0]); + (*mp_worksp_gfp_el)[0] += (*mp_worksp_gfp_el)[6]; + + //mX = x; + //mY = y; + //mZ = z; + mX = (*mp_worksp_gfp_el)[2]; + mY = (*mp_worksp_gfp_el)[3]; + mZ = (*mp_worksp_gfp_el)[0]; + + mZpow2_set = false; + mZpow3_set = false; + mAZpow4_set = false; + return *this; + } + +void PointGFp::turn_on_sp_red_mul() const + { + mX.turn_on_sp_red_mul(); + mY.turn_on_sp_red_mul(); + mZ.turn_on_sp_red_mul(); + + // also pretransform, otherwise + // we might have bad results with respect to + // performance because + // additions/subtractions in mult2_in_place() + // and op+= spread untransformed GFpElements + mX.get_mres(); + mY.get_mres(); + mZ.get_mres(); + + mZpow2.turn_on_sp_red_mul(); + mZpow3.turn_on_sp_red_mul(); + mAZpow4.turn_on_sp_red_mul(); + } +// getters + +/** +* returns a point equivalent to *this but were +* Z has value one, i.e. x and y correspond to +* their values in affine coordinates +* +* Distributed under the terms of the Botan license +*/ +PointGFp const PointGFp::get_z_to_one() const + { + return PointGFp(*this).set_z_to_one(); + } + +/** +* changes the representation of *this so that +* Z has value one, i.e. x and y correspond to +* their values in affine coordinates. +* returns *this. +*/ +const PointGFp& PointGFp::set_z_to_one() const + { + if (!(mZ.get_value() == BigInt(1)) && !(mZ.get_value() == BigInt(0))) + { + GFpElement z = inverse(mZ); + GFpElement z2 = z * z; + z *= z2; + GFpElement x = mX * z2; + GFpElement y = mY * z; + mZ = GFpElement(mC.get_p(), BigInt(1)); + mX = x; + mY = y; + } + else + { + if (mZ.get_value() == BigInt(0)) + { + throw Illegal_Transformation("cannot convert Z to one"); + } + } + return *this; // mZ = 1 already + } + +const CurveGFp PointGFp::get_curve() const + { + return mC; + } + +GFpElement const PointGFp::get_affine_x() const + { + + if (is_zero()) + { + throw Illegal_Transformation("cannot convert to affine"); + + } + /*if(!mZpow2_set) + {*/ + mZpow2 = mZ * mZ; + mZpow2_set = true; + //} + //assert(mZpow2 == mZ*mZ); + GFpElement z2 = mZpow2; + return mX * z2.inverse_in_place(); + } + +GFpElement const PointGFp::get_affine_y() const + { + + if (is_zero()) + { + throw Illegal_Transformation("cannot convert to affine"); + + } + /*if(!mZpow3_set ) + {*/ + mZpow3 = mZ * mZ * mZ; + mZpow3_set = true; + //} + //assert(mZpow3 == mZ * mZ *mZ); + GFpElement z3 = mZpow3; + return mY * z3.inverse_in_place(); + } + +GFpElement const PointGFp::get_jac_proj_x() const + { + return GFpElement(mX); + } + +GFpElement const PointGFp::get_jac_proj_y() const + { + return GFpElement(mY); + } + +GFpElement const PointGFp::get_jac_proj_z() const + { + return GFpElement(mZ); + } + +// Is this the point at infinity? +bool PointGFp::is_zero() const + { + return(mX.is_zero() && mZ.is_zero()); + //NOTE: the calls to GFpElement::is_zero() instead of getting the value and + // and comparing it are import because they do not provoke backtransformations + // to the ordinary residue. + } + +// Is the point still on the curve?? +// (If everything is correct, the point is always on its curve; then the +// function will return silently. If Oskar managed to corrupt this object's state, +// then it will throw an exception.) + +void PointGFp::check_invariants() const + { + if (is_zero()) + { + return; + } + const GFpElement y2 = mY * mY; + const GFpElement x3 = mX * mX * mX; + + if (mZ.get_value() == BigInt(1)) + { + GFpElement ax = mC.get_a() * mX; + if(y2 != (x3 + ax + mC.get_b())) + { + throw Illegal_Point(); + } + + } + + mZpow2 = mZ * mZ; + mZpow2_set = true; + mZpow3 = mZpow2 * mZ; + mZpow3_set = true; + mAZpow4 = mZpow3 * mZ * mC.get_a(); + mAZpow4_set = true; + const GFpElement aXZ4 = mAZpow4 * mX; + const GFpElement bZ6 = mC.get_b() * mZpow3 * mZpow3; + + if (y2 != (x3 + aXZ4 + bZ6)) + throw Illegal_Point(); + } + +// swaps the states of *this and other, does not throw! +void PointGFp::swap(PointGFp& other) + { + mC.swap(other.mC); + mX.swap(other.mX); + mY.swap(other.mY); + mZ.swap(other.mZ); + mZpow2.swap(other.mZpow2); + mZpow3.swap(other.mZpow3); + mAZpow4.swap(other.mAZpow4); + std::swap(mZpow2_set, other.mZpow2_set); + std::swap(mZpow3_set, other.mZpow3_set); + std::swap(mAZpow4_set, other.mAZpow4_set); + } + +PointGFp const mult2(const PointGFp& point) + { + return (PointGFp(point)).mult2_in_place(); + } + +bool operator==(const PointGFp& lhs, PointGFp const& rhs) + { + if (lhs.is_zero() && rhs.is_zero()) + { + return true; + } + if ((lhs.is_zero() && !rhs.is_zero()) || (!lhs.is_zero() && rhs.is_zero())) + { + return false; + } + // neither operand is zero, so we can call get_z_to_one() + //assert(!lhs.is_zero()); + //assert(!rhs.is_zero()); + PointGFp aff_lhs = lhs.get_z_to_one(); + PointGFp aff_rhs = rhs.get_z_to_one(); + return (aff_lhs.get_curve() == aff_rhs.get_curve() && + aff_lhs.get_jac_proj_x() == aff_rhs.get_jac_proj_x() && + aff_lhs.get_jac_proj_y() == aff_rhs.get_jac_proj_y()); + } + +// arithmetic operators +PointGFp operator+(const PointGFp& lhs, PointGFp const& rhs) + { + PointGFp tmp(lhs); + return tmp += rhs; + } + +PointGFp operator-(const PointGFp& lhs, PointGFp const& rhs) + { + PointGFp tmp(lhs); + return tmp -= rhs; + } + +PointGFp operator-(const PointGFp& lhs) + { + return PointGFp(lhs).negate(); + } + +PointGFp operator*(const BigInt& scalar, const PointGFp& point) + { + PointGFp result(point); + return result *= scalar; + } + +PointGFp operator*(const PointGFp& point, const BigInt& scalar) + { + PointGFp result(point); + return result *= scalar; + } + +PointGFp mult_point_secure(const PointGFp& point, const BigInt& scalar, + const BigInt& point_order, const BigInt& max_secret) + { + PointGFp result(point); + result.mult_this_secure(scalar, point_order, max_secret); + return result; + } + +// encoding and decoding +SecureVector EC2OSP(const PointGFp& point, byte format) + { + SecureVector result; + if (format == PointGFp::UNCOMPRESSED) + { + result = encode_uncompressed(point); + } + else if (format == PointGFp::COMPRESSED) + { + result = encode_compressed(point); + + } + else if (format == PointGFp::HYBRID) + { + result = encode_hybrid(point); + } + else + { + throw Format_Error("illegal point encoding format specification"); + } + return result; + } +SecureVector encode_compressed(const PointGFp& point) + { + + + if (point.is_zero()) + { + SecureVector result (1); + result[0] = 0; + return result; + + } + u32bit l = point.get_curve().get_p().bits(); + int dummy = l & 7; + if (dummy != 0) + { + l += 8 - dummy; + } + l /= 8; + SecureVector result (l+1); + result[0] = 2; + BigInt x = point.get_affine_x().get_value(); + SecureVector bX = BigInt::encode_1363(x, l); + result.copy(1, bX.begin(), bX.size()); + BigInt y = point.get_affine_y().get_value(); + if (y.get_bit(0)) + { + result[0] |= 1; + } + return result; + } + + +SecureVector encode_uncompressed(const PointGFp& point) + { + if (point.is_zero()) + { + SecureVector result (1); + result[0] = 0; + return result; + } + u32bit l = point.get_curve().get_p().bits(); + int dummy = l & 7; + if (dummy != 0) + { + l += 8 - dummy; + } + l /= 8; + SecureVector result (2*l+1); + result[0] = 4; + BigInt x = point.get_affine_x().get_value(); + BigInt y = point.get_affine_y().get_value(); + SecureVector bX = BigInt::encode_1363(x, l); + SecureVector bY = BigInt::encode_1363(y, l); + result.copy(1, bX.begin(), l); + result.copy(l+1, bY.begin(), l); + return result; + + } + +SecureVector encode_hybrid(const PointGFp& point) + { + if (point.is_zero()) + { + SecureVector result (1); + result[0] = 0; + return result; + } + u32bit l = point.get_curve().get_p().bits(); + int dummy = l & 7; + if (dummy != 0) + { + l += 8 - dummy; + } + l /= 8; + SecureVector result (2*l+1); + result[0] = 6; + BigInt x = point.get_affine_x().get_value(); + BigInt y = point.get_affine_y().get_value(); + SecureVector bX = BigInt::encode_1363(x, l); + SecureVector bY = BigInt::encode_1363(y, l); + result.copy(1, bX.begin(), bX.size()); + result.copy(l+1, bY.begin(), bY.size()); + if (y.get_bit(0)) + { + result[0] |= 1; + } + return result; + } + +PointGFp OS2ECP(MemoryRegion const& os, const CurveGFp& curve) + { + if (os.size() == 1 && os[0] == 0) + { + return PointGFp(curve); // return zero + } + SecureVector bX; + SecureVector bY; + + GFpElement x(1,0); + GFpElement y(1,0); + GFpElement z(1,0); + + const byte pc = os[0]; + BigInt bi_dec_x; + BigInt bi_dec_y; + switch (pc) + { + case 2: + case 3: + //compressed form + bX = SecureVector(os.size() - 1); + bX.copy(os.begin()+1, os.size()-1); + + /* Problem wΓ€re, wenn decode() das erste bit als Vorzeichen interpretiert. + *--------------------- + * AW(FS): decode() interpretiert das erste Bit nicht als Vorzeichen + */ + bi_dec_x = BigInt::decode(bX, bX.size()); + x = GFpElement(curve.get_p(), bi_dec_x); + bool yMod2; + yMod2 = (pc & 1) == 1; + y = PointGFp::decompress(yMod2, x, curve); + break; + case 4: + // uncompressed form + int l; + l = (os.size() -1)/2; + bX = SecureVector(l); + bY = SecureVector(l); + bX.copy(os.begin()+1, l); + bY.copy(os.begin()+1+l, l); + bi_dec_x = BigInt::decode(bX.begin(), bX.size()); + + bi_dec_y = BigInt::decode(bY.begin(),bY.size()); + x = GFpElement(curve.get_p(), bi_dec_x); + y = GFpElement(curve.get_p(), bi_dec_y); + break; + + case 6: + case 7: + //hybrid form + l = (os.size() - 1)/2; + bX = SecureVector(l); + bY = SecureVector(l); + bX.copy(os.begin() + 1, l); + bY.copy(os.begin()+1+l, l); + yMod2 = (pc & 0x01) == 1; + if (!(PointGFp::decompress(yMod2, x, curve) == y)) + { + throw Illegal_Point("error during decoding hybrid format"); + } + break; + default: + throw Format_Error("encountered illegal format specification while decoding point"); + } + z = GFpElement(curve.get_p(), BigInt(1)); + //assert((x.is_trf_to_mres() && x.is_use_montgm()) || !x.is_trf_to_mres()); + //assert((y.is_trf_to_mres() && y.is_use_montgm()) || !y.is_trf_to_mres()); + //assert((z.is_trf_to_mres() && z.is_use_montgm()) || !z.is_trf_to_mres()); + PointGFp result(curve, x, y, z); + result.check_invariants(); + //assert((result.get_jac_proj_x().is_trf_to_mres() && result.get_jac_proj_x().is_use_montgm()) || !result.get_jac_proj_x().is_trf_to_mres()); + //assert((result.get_jac_proj_y().is_trf_to_mres() && result.get_jac_proj_y().is_use_montgm()) || !result.get_jac_proj_y().is_trf_to_mres()); + //assert((result.get_jac_proj_z().is_trf_to_mres() && result.get_jac_proj_z().is_use_montgm()) || !result.get_jac_proj_z().is_trf_to_mres()); + return result; + } + +GFpElement PointGFp::decompress(bool yMod2, const GFpElement& x, + const CurveGFp& curve) + { + BigInt xVal = x.get_value(); + BigInt xpow3 = xVal * xVal * xVal; + BigInt g = curve.get_a().get_value() * xVal; + g += xpow3; + g += curve.get_b().get_value(); + g = g%curve.get_p(); + BigInt z = ressol(g, curve.get_p()); + + if(z < 0) + throw Illegal_Point("error during decompression"); + + bool zMod2 = z.get_bit(0); + if ((zMod2 && ! yMod2) || (!zMod2 && yMod2)) + { + z = curve.get_p() - z; + } + return GFpElement(curve.get_p(),z); + } + +PointGFp const create_random_point(RandomNumberGenerator& rng, + const CurveGFp& curve) + { + + // create a random point + GFpElement mX(1,1); + GFpElement mY(1,1); + GFpElement mZ(1,1); + GFpElement minusOne(curve.get_p(), BigInt(BigInt::Negative,1)); + mY = minusOne; + GFpElement y2(1,1); + GFpElement x(1,1); + + while (mY == minusOne) + { + BigInt value(rng, curve.get_p().bits()); + mX = GFpElement(curve.get_p(),value); + y2 = curve.get_a() * mX; + x = mX * mX; + x *= mX; + y2 += (x + curve.get_b()); + + value = ressol(y2.get_value(), curve.get_p()); + + if(value < 0) + mY = minusOne; + else + mY = GFpElement(curve.get_p(), value); + } + mZ = GFpElement(curve.get_p(), BigInt(1)); + + return PointGFp(curve, mX, mY, mZ); + } + +} // namespace Botan diff --git a/src/libs/3rdparty/botan/src/math/gfpmath/point_gfp.h b/src/libs/3rdparty/botan/src/math/gfpmath/point_gfp.h new file mode 100644 index 00000000000..771605efc49 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/gfpmath/point_gfp.h @@ -0,0 +1,315 @@ +/* +* Arithmetic over GF(p) +* +* (C) 2007 Martin Doering +* Christoph Ludwig +* Falko Strenzke +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_POINT_GFP_H__ +#define BOTAN_POINT_GFP_H__ + +#include +#include +#include +#include +#include + +namespace Botan { + +struct Illegal_Point : public Exception + { + Illegal_Point(const std::string& err = "") : Exception(err) {} + }; + +/** +* This class represents one point on a curve of GF(p). +*/ +class BOTAN_DLL PointGFp + { + public: + /** + * uncompressed encoding byte value + */ + static const int UNCOMPRESSED = 0; + + /** + * compressed encoding byte value + */ + static const int COMPRESSED = 1; + + /** + * hybrid encoding byte value + */ + static const int HYBRID = 2; + + /** + * Construct the point O + * @param curve The base curve + */ + explicit PointGFp(const CurveGFp& curve); + + /** + * Construct a point given its affine coordinates + * @param curve the base curve + * @param x affine x coordinate + * @param y affine y coordinate + */ + explicit PointGFp(const CurveGFp& curve, GFpElement const& x, + GFpElement const& y); + + /** + * Construct a point given its jacobian projective coordinates + * @param curve the base curve + * @param x jacobian projective x coordinate + * @param y jacobian projective y coordinate + * @param z jacobian projective y coordinate + */ + explicit PointGFp(const CurveGFp& curve, GFpElement const& x, + GFpElement const& y, GFpElement const& z); + + /** + * copy constructor + * @param other the value to clone + */ + PointGFp(const PointGFp& other); + + /** + * assignment operator + * @param other The point to use as source for the assignment + */ + const PointGFp& operator=(const PointGFp& other); + + /** + * assign another point which is on the same curve as *this + * @param other The point to use as source for the assignment + */ + const PointGFp& assign_within_same_curve(const PointGFp& other); + + + + /** + * += Operator + * @param rhs the PointGFp to add to the local value + * @result resulting PointGFp + */ + PointGFp& operator+=(const PointGFp& rhs); + + /** + * -= Operator + * @param rhs the PointGFp to subtract from the local value + * @result resulting PointGFp + */ + PointGFp& operator-=(const PointGFp& rhs); + + /** + * *= Operator + * This function turns on the the special reduction multiplication + * itself for fast computation, turns it off again when finished. + * @param scalar the PointGFp to multiply with *this + * @result resulting PointGFp + */ + PointGFp& operator*=(const BigInt& scalar); + + /** + * the equivalent to operator*= with countermeasures against + * sidechannel attacks, using the randomized exponent + * and add-and-double-always + * countermeasures (suitable for ECDSA and ECKAEG) + * @param scalar the scalar to multiply the point with + * @param point_order a multiple of the order of the point + *(= n * k in the general case; k is the cofactor) + * @param max_secr the maximal size of the scalar + * (will usually be n-1 ) + * @result resulting PointGFp + */ + PointGFp& mult_this_secure(const BigInt& scalar, + const BigInt& point_order, + const BigInt& max_secr + ); + + /** + * Negate internal value(*this *= -1 ) + * @return *this + */ + PointGFp& negate(); + + /** + * Multiply the point by two(*this *= 2 ) + * @return *this + */ + PointGFp& mult2_in_place(); + + /** + * Set z coordinate to one. + * @return *this + */ + const PointGFp& set_z_to_one() const; + + /** + * Turn on the special reduction multiplication (i.e. the + * Montgomery multiplication in the current implementation) for + * the coordinates. This enables fast execution of mult2_in_place() + * and operator+=(). + */ + void turn_on_sp_red_mul() const; + + /** + * Return a point + * where the coordinates are transformed + * so that z equals one, + * thus x and y have just the affine values. + * @result *this + */ + PointGFp const get_z_to_one() const; + + /** + * Return base curve of this point + * @result the curve over GF(p) of this point + */ + CurveGFp const get_curve() const; + + /** + * get affine x coordinate + * @result affine x coordinate + */ + GFpElement const get_affine_x() const; + + /** + * get affine y coordinate + * @result affine y coordinate + */ + GFpElement const get_affine_y() const; + + /** + * get the jacobian projective x coordinate + * @result jacobian projective x coordinate + */ + GFpElement const get_jac_proj_x() const; + + /** + * get the jacobian projective y coordinate + * @result jacobian projective y coordinate + */ + GFpElement const get_jac_proj_y() const; + + /** + * get the jacobian projective z coordinate + * @result jacobian projective z coordinate + */ + GFpElement const get_jac_proj_z() const; + + /** + * Is this the point at infinity? + * @result true, if this point is at infinity, false otherwise. + */ + bool is_zero() const; + + /** + * Checks whether the point is to be found on the underlying curve. + * Throws an Invalid_Point exception in case of detecting that the point + * does not satisfy the curve equation. + * To be used to ensure against fault attacks. + */ + void check_invariants() const; + + + /** + * swaps the states of *this and other, does not throw! + * @param other the object to swap values with + */ + void swap(PointGFp& other); + + /** + * Sets the shared pointer to the GFpModulus that will be + * held in *this, specifically the various members of *this. + * Warning: do not use this function unless you know in detail about + * the implications of using + * the shared GFpModulus objects! + * Do NOT spread a shared pointer to GFpModulus over different + * threads! + * @param mod a shared pointer to a GFpModulus that will + * be held in the members *this + */ + void set_shrd_mod(std::tr1::shared_ptr p_mod); + + static GFpElement decompress(bool yMod2, GFpElement const& x, const CurveGFp& curve); + + private: + static const u32bit GFPEL_WKSP_SIZE = 9; + void ensure_worksp() const; + + inline std::tr1::shared_ptr mult_loop(int l, const BigInt& m, + std::tr1::shared_ptr H, + std::tr1::shared_ptr tmp, + const PointGFp& P); + + CurveGFp mC; + mutable GFpElement mX; // NOTE: these values must be mutable (affine<->proj) + mutable GFpElement mY; + mutable GFpElement mZ; + mutable GFpElement mZpow2; // mZ^2 + mutable GFpElement mZpow3; // mZ^3 + mutable GFpElement mAZpow4; // mA*mZ^4 + mutable bool mZpow2_set; + mutable bool mZpow3_set; + mutable bool mAZpow4_set; + mutable std::tr1::shared_ptr > mp_worksp_gfp_el; + + }; + +// relational operators +bool operator==(const PointGFp& lhs, const PointGFp& rhs); +inline bool operator!=(const PointGFp& lhs, const PointGFp& rhs ) + { + return !operator==(lhs, rhs); + } + +// arithmetic operators +PointGFp operator+(const PointGFp& lhs, const PointGFp& rhs); +PointGFp operator-(const PointGFp& lhs, const PointGFp& rhs); +PointGFp operator-(const PointGFp& lhs); + +PointGFp operator*(const BigInt& scalar, const PointGFp& point); +PointGFp operator*(const PointGFp& point, const BigInt& scalar); +PointGFp mult_point_secure(const PointGFp& point, + const BigInt& scalar, + const BigInt& point_order, + const BigInt& max_secret); + +PointGFp const mult2(const PointGFp& point); + +PointGFp const create_random_point(RandomNumberGenerator& rng, + const CurveGFp& curve); + +// encoding and decoding +SecureVector EC2OSP(const PointGFp& point, byte format); +PointGFp OS2ECP(MemoryRegion const& os, const CurveGFp& curve); + +SecureVector encode_uncompressed(const PointGFp& point); // maybe make private +SecureVector encode_hybrid(const PointGFp& point); // maybe make private +SecureVector encode_compressed(const PointGFp& point); // maybe make private + +// swaps the states of point1 and point2, does not throw! +// cf. Meyers, Item 25 +inline +void swap(PointGFp& point1, PointGFp& point2 ) + { + point1.swap(point2); + } + +} // namespace Botan + +namespace std { + +// swaps the states of point1 and point2, does not throw! +// cf. Meyers, Item 25 +template<> inline void +swap(Botan::PointGFp& x, Botan::PointGFp& y) { x.swap(y); } + +} // namespace std + +#endif diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/blinding.cpp b/src/libs/3rdparty/botan/src/math/numbertheory/blinding.cpp new file mode 100644 index 00000000000..c6a3fd1bd89 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/blinding.cpp @@ -0,0 +1,49 @@ +/* +* Blinder +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Blinder Constructor +*/ +Blinder::Blinder(const BigInt& e, const BigInt& d, const BigInt& n) + { + if(e < 1 || d < 1 || n < 1) + throw Invalid_Argument("Blinder: Arguments too small"); + + reducer = Modular_Reducer(n); + this->e = e; + this->d = d; + } + +/* +* Blind a number +*/ +BigInt Blinder::blind(const BigInt& i) const + { + if(!reducer.initialized()) + return i; + + e = reducer.square(e); + d = reducer.square(d); + return reducer.multiply(i, e); + } + +/* +* Unblind a number +*/ +BigInt Blinder::unblind(const BigInt& i) const + { + if(!reducer.initialized()) + return i; + return reducer.multiply(i, d); + } + +} diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/blinding.h b/src/libs/3rdparty/botan/src/math/numbertheory/blinding.h new file mode 100644 index 00000000000..5f7f9e6b7dc --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/blinding.h @@ -0,0 +1,34 @@ +/* +* Blinder +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BLINDER_H__ +#define BOTAN_BLINDER_H__ + +#include +#include + +namespace Botan { + +/* +* Blinding Function Object +*/ +class BOTAN_DLL Blinder + { + public: + BigInt blind(const BigInt&) const; + BigInt unblind(const BigInt&) const; + + Blinder() {} + Blinder(const BigInt&, const BigInt&, const BigInt&); + private: + Modular_Reducer reducer; + mutable BigInt e, d; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/def_powm.h b/src/libs/3rdparty/botan/src/math/numbertheory/def_powm.h new file mode 100644 index 00000000000..472c865c373 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/def_powm.h @@ -0,0 +1,64 @@ +/* +* Modular Exponentiation +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DEFAULT_MODEXP_H__ +#define BOTAN_DEFAULT_MODEXP_H__ + +#include +#include +#include + +namespace Botan { + +/* +* Fixed Window Exponentiator +*/ +class BOTAN_DLL Fixed_Window_Exponentiator : public Modular_Exponentiator + { + public: + void set_exponent(const BigInt&); + void set_base(const BigInt&); + BigInt execute() const; + + Modular_Exponentiator* copy() const + { return new Fixed_Window_Exponentiator(*this); } + + Fixed_Window_Exponentiator(const BigInt&, Power_Mod::Usage_Hints); + private: + Modular_Reducer reducer; + BigInt exp; + u32bit window_bits; + std::vector g; + Power_Mod::Usage_Hints hints; + }; + +/* +* Montgomery Exponentiator +*/ +class BOTAN_DLL Montgomery_Exponentiator : public Modular_Exponentiator + { + public: + void set_exponent(const BigInt&); + void set_base(const BigInt&); + BigInt execute() const; + + Modular_Exponentiator* copy() const + { return new Montgomery_Exponentiator(*this); } + + Montgomery_Exponentiator(const BigInt&, Power_Mod::Usage_Hints); + private: + BigInt exp, modulus; + BigInt R2, R_mod; + std::vector g; + word mod_prime; + u32bit mod_words, exp_bits, window_bits; + Power_Mod::Usage_Hints hints; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/dsa_gen.cpp b/src/libs/3rdparty/botan/src/math/numbertheory/dsa_gen.cpp new file mode 100644 index 00000000000..83646e50e74 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/dsa_gen.cpp @@ -0,0 +1,135 @@ +/* +* DSA Parameter Generation +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Check if this size is allowed by FIPS 186-3 +*/ +bool fips186_3_valid_size(u32bit pbits, u32bit qbits) + { + if(qbits == 160) + return (pbits == 512 || pbits == 768 || pbits == 1024); + + if(qbits == 224) + return (pbits == 2048); + + if(qbits == 256) + return (pbits == 2048 || pbits == 3072); + + return false; + } + +} + +/* +* Attempt DSA prime generation with given seed +*/ +bool generate_dsa_primes(RandomNumberGenerator& rng, + Algorithm_Factory& af, + BigInt& p, BigInt& q, + u32bit pbits, u32bit qbits, + const MemoryRegion& seed_c) + { + if(!fips186_3_valid_size(pbits, qbits)) + throw Invalid_Argument( + "FIPS 186-3 does not allow DSA domain parameters of " + + to_string(pbits) + "/" + to_string(qbits) + " bits long"); + + if(seed_c.size() * 8 < qbits) + throw Invalid_Argument( + "Generating a DSA parameter set with a " + to_string(qbits) + + "long q requires a seed at least as many bits long"); + + std::auto_ptr hash( + af.make_hash_function("SHA-" + to_string(qbits))); + + const u32bit HASH_SIZE = hash->OUTPUT_LENGTH; + + class Seed + { + public: + Seed(const MemoryRegion& s) : seed(s) {} + + operator MemoryRegion& () { return seed; } + + Seed& operator++() + { + for(u32bit j = seed.size(); j > 0; --j) + if(++seed[j-1]) + break; + return (*this); + } + private: + SecureVector seed; + }; + + Seed seed(seed_c); + + q.binary_decode(hash->process(seed)); + q.set_bit(qbits-1); + q.set_bit(0); + + if(!is_prime(q, rng)) + return false; + + const u32bit n = (pbits-1) / (HASH_SIZE * 8), + b = (pbits-1) % (HASH_SIZE * 8); + + BigInt X; + SecureVector V(HASH_SIZE * (n+1)); + + for(u32bit j = 0; j != 4096; ++j) + { + for(u32bit k = 0; k <= n; ++k) + { + ++seed; + hash->update(seed); + hash->final(V + HASH_SIZE * (n-k)); + } + + X.binary_decode(V + (HASH_SIZE - 1 - b/8), + V.size() - (HASH_SIZE - 1 - b/8)); + X.set_bit(pbits-1); + + p = X - (X % (2*q) - 1); + + if(p.bits() == pbits && is_prime(p, rng)) + return true; + } + return false; + } + +/* +* Generate DSA Primes +*/ +SecureVector generate_dsa_primes(RandomNumberGenerator& rng, + Algorithm_Factory& af, + BigInt& p, BigInt& q, + u32bit pbits, u32bit qbits) + { + SecureVector seed(qbits/8); + + while(true) + { + rng.randomize(seed, seed.size()); + + if(generate_dsa_primes(rng, af, p, q, pbits, qbits, seed)) + return seed; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/info.txt b/src/libs/3rdparty/botan/src/math/numbertheory/info.txt new file mode 100644 index 00000000000..1595c7305c7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/info.txt @@ -0,0 +1,33 @@ +realname "Math Functions" + +load_on auto + +define BIGINT_MATH + + +blinding.cpp +blinding.h +def_powm.h +dsa_gen.cpp +jacobi.cpp +make_prm.cpp +mp_numth.cpp +numthry.cpp +numthry.h +pow_mod.cpp +pow_mod.h +powm_fw.cpp +powm_mnt.cpp +primes.cpp +reducer.cpp +reducer.h +ressol.cpp + + + +algo_factory +bigint +hash +libstate +rng + diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/jacobi.cpp b/src/libs/3rdparty/botan/src/math/numbertheory/jacobi.cpp new file mode 100644 index 00000000000..2ad05ff713c --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/jacobi.cpp @@ -0,0 +1,53 @@ +/* +* Jacobi Function +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Calculate the Jacobi symbol +*/ +s32bit jacobi(const BigInt& a, const BigInt& n) + { + if(a.is_negative()) + throw Invalid_Argument("jacobi: first argument must be non-negative"); + if(n.is_even() || n < 2) + throw Invalid_Argument("jacobi: second argument must be odd and > 1"); + + BigInt x = a, y = n; + s32bit J = 1; + + while(y > 1) + { + x %= y; + if(x > y / 2) + { + x = y - x; + if(y % 4 == 3) + J = -J; + } + if(x.is_zero()) + return 0; + + u32bit shifts = low_zero_bits(x); + x >>= shifts; + if(shifts % 2) + { + word y_mod_8 = y % 8; + if(y_mod_8 == 3 || y_mod_8 == 5) + J = -J; + } + + if(x % 4 == 3 && y % 4 == 3) + J = -J; + std::swap(x, y); + } + return J; + } + +} diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/make_prm.cpp b/src/libs/3rdparty/botan/src/math/numbertheory/make_prm.cpp new file mode 100644 index 00000000000..b136b6d2527 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/make_prm.cpp @@ -0,0 +1,97 @@ +/* +* Prime Generation +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Generate a random prime +*/ +BigInt random_prime(RandomNumberGenerator& rng, + u32bit bits, const BigInt& coprime, + u32bit equiv, u32bit modulo) + { + if(bits <= 1) + throw Invalid_Argument("random_prime: Can't make a prime of " + + to_string(bits) + " bits"); + else if(bits == 2) + return ((rng.next_byte() % 2) ? 2 : 3); + else if(bits == 3) + return ((rng.next_byte() % 2) ? 5 : 7); + else if(bits == 4) + return ((rng.next_byte() % 2) ? 11 : 13); + + if(coprime <= 0) + throw Invalid_Argument("random_prime: coprime must be > 0"); + if(modulo % 2 == 1 || modulo == 0) + throw Invalid_Argument("random_prime: Invalid modulo value"); + if(equiv >= modulo || equiv % 2 == 0) + throw Invalid_Argument("random_prime: equiv must be < modulo, and odd"); + + while(true) + { + BigInt p(rng, bits); + p.set_bit(bits - 2); + p.set_bit(0); + + if(p % modulo != equiv) + p += (modulo - p % modulo) + equiv; + + const u32bit sieve_size = std::min(bits / 2, PRIME_TABLE_SIZE); + SecureVector sieve(sieve_size); + + for(u32bit j = 0; j != sieve.size(); ++j) + sieve[j] = p % PRIMES[j]; + + u32bit counter = 0; + while(true) + { + if(counter == 4096 || p.bits() > bits) + break; + + bool passes_sieve = true; + ++counter; + p += modulo; + + if(p.bits() > bits) + break; + + for(u32bit j = 0; j != sieve.size(); ++j) + { + sieve[j] = (sieve[j] + modulo) % PRIMES[j]; + if(sieve[j] == 0) + passes_sieve = false; + } + + if(!passes_sieve || gcd(p - 1, coprime) != 1) + continue; + if(passes_mr_tests(rng, p)) + return p; + } + } + } + +/* +* Generate a random safe prime +*/ +BigInt random_safe_prime(RandomNumberGenerator& rng, u32bit bits) + { + if(bits <= 64) + throw Invalid_Argument("random_safe_prime: Can't make a prime of " + + to_string(bits) + " bits"); + + BigInt p; + do + p = (random_prime(rng, bits - 1) << 1) + 1; + while(!is_prime(p, rng)); + return p; + } + +} diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/mp_numth.cpp b/src/libs/3rdparty/botan/src/math/numbertheory/mp_numth.cpp new file mode 100644 index 00000000000..45a398440dd --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/mp_numth.cpp @@ -0,0 +1,71 @@ +/* +* Fused and Important MP Algorithms +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Square a BigInt +*/ +BigInt square(const BigInt& x) + { + const u32bit x_sw = x.sig_words(); + + BigInt z(BigInt::Positive, round_up(2*x_sw, 16)); + SecureVector workspace(z.size()); + + bigint_sqr(z.get_reg(), z.size(), workspace, + x.data(), x.size(), x_sw); + return z; + } + +/* +* Multiply-Add Operation +*/ +BigInt mul_add(const BigInt& a, const BigInt& b, const BigInt& c) + { + if(c.is_negative() || c.is_zero()) + throw Invalid_Argument("mul_add: Third argument must be > 0"); + + BigInt::Sign sign = BigInt::Positive; + if(a.sign() != b.sign()) + sign = BigInt::Negative; + + const u32bit a_sw = a.sig_words(); + const u32bit b_sw = b.sig_words(); + const u32bit c_sw = c.sig_words(); + + BigInt r(sign, std::max(a.size() + b.size(), c_sw) + 1); + SecureVector workspace(r.size()); + + bigint_mul(r.get_reg(), r.size(), workspace, + a.data(), a.size(), a_sw, + b.data(), b.size(), b_sw); + const u32bit r_size = std::max(r.sig_words(), c_sw); + bigint_add2(r.get_reg(), r_size, c.data(), c_sw); + return r; + } + +/* +* Subtract-Multiply Operation +*/ +BigInt sub_mul(const BigInt& a, const BigInt& b, const BigInt& c) + { + if(a.is_negative() || b.is_negative()) + throw Invalid_Argument("sub_mul: First two arguments must be >= 0"); + + BigInt r = a; + r -= b; + r *= c; + return r; + } + +} diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/numthry.cpp b/src/libs/3rdparty/botan/src/math/numbertheory/numthry.cpp new file mode 100644 index 00000000000..448681333a1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/numthry.cpp @@ -0,0 +1,346 @@ +/* +* Number Theory Functions +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Miller-Rabin Iterations +*/ +u32bit miller_rabin_test_iterations(u32bit bits, bool verify) + { + struct mapping { u32bit bits; u32bit verify_iter; u32bit check_iter; }; + + static const mapping tests[] = { + { 50, 55, 25 }, + { 100, 38, 22 }, + { 160, 32, 18 }, + { 163, 31, 17 }, + { 168, 30, 16 }, + { 177, 29, 16 }, + { 181, 28, 15 }, + { 185, 27, 15 }, + { 190, 26, 15 }, + { 195, 25, 14 }, + { 201, 24, 14 }, + { 208, 23, 14 }, + { 215, 22, 13 }, + { 222, 21, 13 }, + { 231, 20, 13 }, + { 241, 19, 12 }, + { 252, 18, 12 }, + { 264, 17, 12 }, + { 278, 16, 11 }, + { 294, 15, 10 }, + { 313, 14, 9 }, + { 334, 13, 8 }, + { 360, 12, 8 }, + { 392, 11, 7 }, + { 430, 10, 7 }, + { 479, 9, 6 }, + { 542, 8, 6 }, + { 626, 7, 5 }, + { 746, 6, 4 }, + { 926, 5, 3 }, + { 1232, 4, 2 }, + { 1853, 3, 2 }, + { 0, 0, 0 } + }; + + for(u32bit i = 0; tests[i].bits; ++i) + { + if(bits <= tests[i].bits) + { + if(verify) + return tests[i].verify_iter; + else + return tests[i].check_iter; + } + } + return 2; + } + +} + +/* +* Return the number of 0 bits at the end of n +*/ +u32bit low_zero_bits(const BigInt& n) + { + if(n.is_negative() || n.is_zero()) return 0; + + u32bit low_zero = 0; + + if(n.is_positive() && n.is_nonzero()) + { + for(u32bit i = 0; i != n.size(); ++i) + { + word x = n[i]; + + if(x) + { + low_zero += ctz(x); + break; + } + else + low_zero += BOTAN_MP_WORD_BITS; + } + } + + return low_zero; + } + +/* +* Calculate the GCD +*/ +BigInt gcd(const BigInt& a, const BigInt& b) + { + if(a.is_zero() || b.is_zero()) return 0; + if(a == 1 || b == 1) return 1; + + BigInt x = a, y = b; + x.set_sign(BigInt::Positive); + y.set_sign(BigInt::Positive); + u32bit shift = std::min(low_zero_bits(x), low_zero_bits(y)); + + x >>= shift; + y >>= shift; + + while(x.is_nonzero()) + { + x >>= low_zero_bits(x); + y >>= low_zero_bits(y); + if(x >= y) { x -= y; x >>= 1; } + else { y -= x; y >>= 1; } + } + + return (y << shift); + } + +/* +* Calculate the LCM +*/ +BigInt lcm(const BigInt& a, const BigInt& b) + { + return ((a * b) / gcd(a, b)); + } + +/* +* Find the Modular Inverse +*/ +BigInt inverse_mod(const BigInt& n, const BigInt& mod) + { + if(mod.is_zero()) + throw BigInt::DivideByZero(); + if(mod.is_negative() || n.is_negative()) + throw Invalid_Argument("inverse_mod: arguments must be non-negative"); + + if(n.is_zero() || (n.is_even() && mod.is_even())) + return 0; + + BigInt x = mod, y = n, u = mod, v = n; + BigInt A = 1, B = 0, C = 0, D = 1; + + while(u.is_nonzero()) + { + u32bit zero_bits = low_zero_bits(u); + u >>= zero_bits; + for(u32bit i = 0; i != zero_bits; ++i) + { + if(A.is_odd() || B.is_odd()) + { A += y; B -= x; } + A >>= 1; B >>= 1; + } + + zero_bits = low_zero_bits(v); + v >>= zero_bits; + for(u32bit i = 0; i != zero_bits; ++i) + { + if(C.is_odd() || D.is_odd()) + { C += y; D -= x; } + C >>= 1; D >>= 1; + } + + if(u >= v) { u -= v; A -= C; B -= D; } + else { v -= u; C -= A; D -= B; } + } + + if(v != 1) + return 0; + + while(D.is_negative()) D += mod; + while(D >= mod) D -= mod; + + return D; + } + +/* +* Modular Exponentiation +*/ +BigInt power_mod(const BigInt& base, const BigInt& exp, const BigInt& mod) + { + Power_Mod pow_mod(mod); + pow_mod.set_base(base); + pow_mod.set_exponent(exp); + return pow_mod.execute(); + } + +/* +* Do simple tests of primality +*/ +s32bit simple_primality_tests(const BigInt& n) + { + const s32bit NOT_PRIME = -1, UNKNOWN = 0, PRIME = 1; + + if(n == 2) + return PRIME; + if(n <= 1 || n.is_even()) + return NOT_PRIME; + + if(n <= PRIMES[PRIME_TABLE_SIZE-1]) + { + const word num = n.word_at(0); + for(u32bit i = 0; PRIMES[i]; ++i) + { + if(num == PRIMES[i]) return PRIME; + if(num < PRIMES[i]) return NOT_PRIME; + } + return NOT_PRIME; + } + + u32bit check_first = std::min(n.bits() / 32, PRIME_PRODUCTS_TABLE_SIZE); + for(u32bit i = 0; i != check_first; ++i) + if(gcd(n, PRIME_PRODUCTS[i]) != 1) + return NOT_PRIME; + + return UNKNOWN; + } + +/* +* Fast check of primality +*/ +bool check_prime(const BigInt& n, RandomNumberGenerator& rng) + { + return run_primality_tests(rng, n, 0); + } + +/* +* Test for primality +*/ +bool is_prime(const BigInt& n, RandomNumberGenerator& rng) + { + return run_primality_tests(rng, n, 1); + } + +/* +* Verify primality +*/ +bool verify_prime(const BigInt& n, RandomNumberGenerator& rng) + { + return run_primality_tests(rng, n, 2); + } + +/* +* Verify primality +*/ +bool run_primality_tests(RandomNumberGenerator& rng, + const BigInt& n, u32bit level) + { + s32bit simple_tests = simple_primality_tests(n); + if(simple_tests) return (simple_tests == 1) ? true : false; + return passes_mr_tests(rng, n, level); + } + +/* +* Test for primaility using Miller-Rabin +*/ +bool passes_mr_tests(RandomNumberGenerator& rng, + const BigInt& n, u32bit level) + { + const u32bit PREF_NONCE_BITS = 40; + + if(level > 2) + level = 2; + + MillerRabin_Test mr(n); + + if(!mr.passes_test(2)) + return false; + + if(level == 0) + return true; + + const u32bit NONCE_BITS = std::min(n.bits() - 1, PREF_NONCE_BITS); + + const bool verify = (level == 2); + + u32bit tests = miller_rabin_test_iterations(n.bits(), verify); + + BigInt nonce; + for(u32bit i = 0; i != tests; ++i) + { + if(!verify && PRIMES[i] < (n-1)) + nonce = PRIMES[i]; + else + { + while(nonce < 2 || nonce >= (n-1)) + nonce.randomize(rng, NONCE_BITS); + } + + if(!mr.passes_test(nonce)) + return false; + } + return true; + } + +/* +* Miller-Rabin Test +*/ +bool MillerRabin_Test::passes_test(const BigInt& a) + { + if(a < 2 || a >= n_minus_1) + throw Invalid_Argument("Bad size for nonce in Miller-Rabin test"); + + BigInt y = pow_mod(a); + if(y == 1 || y == n_minus_1) + return true; + + for(u32bit i = 1; i != s; ++i) + { + y = reducer.square(y); + + if(y == 1) + return false; + if(y == n_minus_1) + return true; + } + return false; + } + +/* +* Miller-Rabin Constructor +*/ +MillerRabin_Test::MillerRabin_Test(const BigInt& num) + { + if(num.is_even() || num < 3) + throw Invalid_Argument("MillerRabin_Test: Invalid number for testing"); + + n = num; + n_minus_1 = n - 1; + s = low_zero_bits(n_minus_1); + r = n_minus_1 >> s; + + pow_mod = Fixed_Exponent_Power_Mod(r, n); + reducer = Modular_Reducer(n); + } + +} diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/numthry.h b/src/libs/3rdparty/botan/src/math/numbertheory/numthry.h new file mode 100644 index 00000000000..e4c0437997c --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/numthry.h @@ -0,0 +1,120 @@ +/* +* Number Theory Functions +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_NUMBER_THEORY_H__ +#define BOTAN_NUMBER_THEORY_H__ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Fused Arithmetic Operations +*/ +BigInt BOTAN_DLL mul_add(const BigInt&, const BigInt&, const BigInt&); +BigInt BOTAN_DLL sub_mul(const BigInt&, const BigInt&, const BigInt&); + +/* +* Number Theory Functions +*/ +inline BigInt abs(const BigInt& n) { return n.abs(); } + +void BOTAN_DLL divide(const BigInt&, const BigInt&, BigInt&, BigInt&); + +BigInt BOTAN_DLL gcd(const BigInt&, const BigInt&); +BigInt BOTAN_DLL lcm(const BigInt&, const BigInt&); + +BigInt BOTAN_DLL square(const BigInt&); +BigInt BOTAN_DLL inverse_mod(const BigInt&, const BigInt&); +s32bit BOTAN_DLL jacobi(const BigInt&, const BigInt&); + +BigInt BOTAN_DLL power_mod(const BigInt&, const BigInt&, const BigInt&); + +/* +* Compute the square root of x modulo a prime +* using the Shanks-Tonnelli algorithm +*/ +BigInt ressol(const BigInt& x, const BigInt& p); + +/* +* Utility Functions +*/ +u32bit BOTAN_DLL low_zero_bits(const BigInt&); + +/* +* Primality Testing +*/ +bool BOTAN_DLL check_prime(const BigInt&, RandomNumberGenerator&); +bool BOTAN_DLL is_prime(const BigInt&, RandomNumberGenerator&); +bool BOTAN_DLL verify_prime(const BigInt&, RandomNumberGenerator&); + +s32bit BOTAN_DLL simple_primality_tests(const BigInt&); + +bool BOTAN_DLL passes_mr_tests(RandomNumberGenerator&, + const BigInt&, u32bit = 1); + +bool BOTAN_DLL run_primality_tests(RandomNumberGenerator&, + const BigInt&, u32bit = 1); + +/* +* Random Number Generation +*/ +BigInt BOTAN_DLL random_prime(RandomNumberGenerator&, + u32bit bits, const BigInt& coprime = 1, + u32bit equiv = 1, u32bit equiv_mod = 2); + +BigInt BOTAN_DLL random_safe_prime(RandomNumberGenerator&, + u32bit); + +/* +* DSA Parameter Generation +*/ +class Algorithm_Factory; + +SecureVector BOTAN_DLL +generate_dsa_primes(RandomNumberGenerator& rng, + Algorithm_Factory& af, + BigInt& p, BigInt& q, + u32bit pbits, u32bit qbits); + +bool BOTAN_DLL +generate_dsa_primes(RandomNumberGenerator& rng, + Algorithm_Factory& af, + BigInt& p_out, BigInt& q_out, + u32bit p_bits, u32bit q_bits, + const MemoryRegion& seed); + +/* +* Prime Numbers +*/ +const u32bit PRIME_TABLE_SIZE = 6541; +const u32bit PRIME_PRODUCTS_TABLE_SIZE = 256; + +extern const u16bit BOTAN_DLL PRIMES[]; +extern const u64bit PRIME_PRODUCTS[]; + +/* +* Miller-Rabin Primality Tester +*/ +class BOTAN_DLL MillerRabin_Test + { + public: + bool passes_test(const BigInt&); + MillerRabin_Test(const BigInt&); + private: + BigInt n, r, n_minus_1; + u32bit s; + Fixed_Exponent_Power_Mod pow_mod; + Modular_Reducer reducer; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/pow_mod.cpp b/src/libs/3rdparty/botan/src/math/numbertheory/pow_mod.cpp new file mode 100644 index 00000000000..fd9b8e921fb --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/pow_mod.cpp @@ -0,0 +1,157 @@ +/* +* Modular Exponentiation Proxy +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Power_Mod Constructor +*/ +Power_Mod::Power_Mod(const BigInt& n, Usage_Hints hints) + { + core = 0; + set_modulus(n, hints); + } + +/* +* Power_Mod Copy Constructor +*/ +Power_Mod::Power_Mod(const Power_Mod& other) + { + core = 0; + if(other.core) + core = other.core->copy(); + } + +/* +* Power_Mod Assignment Operator +*/ +Power_Mod& Power_Mod::operator=(const Power_Mod& other) + { + delete core; + core = 0; + if(other.core) + core = other.core->copy(); + return (*this); + } + +/* +* Power_Mod Destructor +*/ +Power_Mod::~Power_Mod() + { + delete core; + } + +/* +* Set the modulus +*/ +void Power_Mod::set_modulus(const BigInt& n, Usage_Hints hints) const + { + delete core; + core = ((n == 0) ? 0 : Engine_Core::mod_exp(n, hints)); + } + +/* +* Set the base +*/ +void Power_Mod::set_base(const BigInt& b) const + { + if(b.is_zero() || b.is_negative()) + throw Invalid_Argument("Power_Mod::set_base: arg must be > 0"); + + if(!core) + throw Internal_Error("Power_Mod::set_base: core was NULL"); + core->set_base(b); + } + +/* +* Set the exponent +*/ +void Power_Mod::set_exponent(const BigInt& e) const + { + if(e.is_negative()) + throw Invalid_Argument("Power_Mod::set_exponent: arg must be > 0"); + + if(!core) + throw Internal_Error("Power_Mod::set_exponent: core was NULL"); + core->set_exponent(e); + } + +/* +* Compute the result +*/ +BigInt Power_Mod::execute() const + { + if(!core) + throw Internal_Error("Power_Mod::execute: core was NULL"); + return core->execute(); + } + +namespace { + +/* +* Choose potentially useful hints +*/ +Power_Mod::Usage_Hints choose_base_hints(const BigInt& b, const BigInt& n) + { + if(b == 2) + return Power_Mod::Usage_Hints(Power_Mod::BASE_IS_2 | + Power_Mod::BASE_IS_SMALL); + + const u32bit b_bits = b.bits(); + const u32bit n_bits = n.bits(); + + if(b_bits < n_bits / 32) + return Power_Mod::BASE_IS_SMALL; + if(b_bits > n_bits / 4) + return Power_Mod::BASE_IS_LARGE; + + return Power_Mod::NO_HINTS; + } + +/* +* Choose potentially useful hints +*/ +Power_Mod::Usage_Hints choose_exp_hints(const BigInt& e, const BigInt& n) + { + const u32bit e_bits = e.bits(); + const u32bit n_bits = n.bits(); + + if(e_bits < n_bits / 32) + return Power_Mod::BASE_IS_SMALL; + if(e_bits > n_bits / 4) + return Power_Mod::BASE_IS_LARGE; + return Power_Mod::NO_HINTS; + } + +} + +/* +* Fixed_Exponent_Power_Mod Constructor +*/ +Fixed_Exponent_Power_Mod::Fixed_Exponent_Power_Mod(const BigInt& e, + const BigInt& n, + Usage_Hints hints) : + Power_Mod(n, Usage_Hints(hints | EXP_IS_FIXED | choose_exp_hints(e, n))) + { + set_exponent(e); + } + +/* +* Fixed_Base_Power_Mod Constructor +*/ +Fixed_Base_Power_Mod::Fixed_Base_Power_Mod(const BigInt& b, const BigInt& n, + Usage_Hints hints) : + Power_Mod(n, Usage_Hints(hints | BASE_IS_FIXED | choose_base_hints(b, n))) + { + set_base(b); + } + +} diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/pow_mod.h b/src/libs/3rdparty/botan/src/math/numbertheory/pow_mod.h new file mode 100644 index 00000000000..6952dcd1bfc --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/pow_mod.h @@ -0,0 +1,93 @@ +/* +* Modular Exponentiator +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_POWER_MOD_H__ +#define BOTAN_POWER_MOD_H__ + +#include + +namespace Botan { + +/* +* Modular Exponentiator Interface +*/ +class BOTAN_DLL Modular_Exponentiator + { + public: + virtual void set_base(const BigInt&) = 0; + virtual void set_exponent(const BigInt&) = 0; + virtual BigInt execute() const = 0; + virtual Modular_Exponentiator* copy() const = 0; + virtual ~Modular_Exponentiator() {} + }; + +/* +* Modular Exponentiator Proxy +*/ +class BOTAN_DLL Power_Mod + { + public: + enum Usage_Hints { + NO_HINTS = 0x0000, + + BASE_IS_FIXED = 0x0001, + BASE_IS_SMALL = 0x0002, + BASE_IS_LARGE = 0x0004, + BASE_IS_2 = 0x0008, + + EXP_IS_FIXED = 0x0100, + EXP_IS_SMALL = 0x0200, + EXP_IS_LARGE = 0x0400 + }; + + void set_modulus(const BigInt&, Usage_Hints = NO_HINTS) const; + void set_base(const BigInt&) const; + void set_exponent(const BigInt&) const; + + BigInt execute() const; + + Power_Mod& operator=(const Power_Mod&); + + Power_Mod(const BigInt& = 0, Usage_Hints = NO_HINTS); + Power_Mod(const Power_Mod&); + ~Power_Mod(); + private: + mutable Modular_Exponentiator* core; + Usage_Hints hints; + }; + +/* +* Fixed Exponent Modular Exponentiator Proxy +*/ +class BOTAN_DLL Fixed_Exponent_Power_Mod : public Power_Mod + { + public: + BigInt operator()(const BigInt& b) const + { set_base(b); return execute(); } + + Fixed_Exponent_Power_Mod() {} + Fixed_Exponent_Power_Mod(const BigInt&, const BigInt&, + Usage_Hints = NO_HINTS); + }; + +/* +* Fixed Base Modular Exponentiator Proxy +*/ +class BOTAN_DLL Fixed_Base_Power_Mod : public Power_Mod + { + public: + BigInt operator()(const BigInt& e) const + { set_exponent(e); return execute(); } + + Fixed_Base_Power_Mod() {} + Fixed_Base_Power_Mod(const BigInt&, const BigInt&, + Usage_Hints = NO_HINTS); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/powm_fw.cpp b/src/libs/3rdparty/botan/src/math/numbertheory/powm_fw.cpp new file mode 100644 index 00000000000..b764ee7aa9a --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/powm_fw.cpp @@ -0,0 +1,104 @@ +/* +* Fixed Window Exponentiation +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Try to choose a good window size +*/ +u32bit choose_window_bits(u32bit exp_bits, u32bit, + Power_Mod::Usage_Hints hints) + { + static const u32bit wsize[][2] = { + { 2048, 7 }, { 1024, 6 }, { 256, 5 }, { 128, 4 }, { 64, 3 }, { 0, 0 } + }; + + u32bit window_bits = 3; + + if(exp_bits) + { + for(u32bit j = 0; wsize[j][0]; ++j) + { + if(exp_bits >= wsize[j][0]) + { + window_bits += wsize[j][1]; + break; + } + } + } + + if(hints & Power_Mod::EXP_IS_FIXED) + window_bits += 2; + if(hints & Power_Mod::EXP_IS_LARGE) + window_bits += 2; + if(hints & Power_Mod::BASE_IS_FIXED) + ++window_bits; + + return window_bits; + } + +} + +/* +* Set the exponent +*/ +void Fixed_Window_Exponentiator::set_exponent(const BigInt& e) + { + exp = e; + } + +/* +* Set the base +*/ +void Fixed_Window_Exponentiator::set_base(const BigInt& base) + { + window_bits = choose_window_bits(exp.bits(), base.bits(), hints); + + g.resize((1 << window_bits) - 1); + g[0] = base; + for(u32bit j = 1; j != g.size(); ++j) + g[j] = reducer.multiply(g[j-1], g[0]); + } + +/* +* Compute the result +*/ +BigInt Fixed_Window_Exponentiator::execute() const + { + const u32bit exp_nibbles = (exp.bits() + window_bits - 1) / window_bits; + + BigInt x = 1; + for(u32bit j = exp_nibbles; j > 0; --j) + { + for(u32bit k = 0; k != window_bits; ++k) + x = reducer.square(x); + + u32bit nibble = exp.get_substring(window_bits*(j-1), window_bits); + if(nibble) + x = reducer.multiply(x, g[nibble-1]); + } + return x; + } + +/* +* Fixed_Window_Exponentiator Constructor +*/ +Fixed_Window_Exponentiator::Fixed_Window_Exponentiator(const BigInt& n, + Power_Mod::Usage_Hints hints) + { + reducer = Modular_Reducer(n); + this->hints = hints; + window_bits = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/powm_mnt.cpp b/src/libs/3rdparty/botan/src/math/numbertheory/powm_mnt.cpp new file mode 100644 index 00000000000..e6d8cc3f093 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/powm_mnt.cpp @@ -0,0 +1,180 @@ +/* +* Montgomery Exponentiation +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Try to choose a good window size +*/ +u32bit choose_window_bits(u32bit exp_bits, u32bit, + Power_Mod::Usage_Hints hints) + { + static const u32bit wsize[][2] = { + { 2048, 4 }, { 1024, 3 }, { 256, 2 }, { 128, 1 }, { 0, 0 } + }; + + u32bit window_bits = 1; + + if(exp_bits) + { + for(u32bit j = 0; wsize[j][0]; ++j) + { + if(exp_bits >= wsize[j][0]) + { + window_bits += wsize[j][1]; + break; + } + } + } + + if(hints & Power_Mod::BASE_IS_FIXED) + window_bits += 2; + if(hints & Power_Mod::EXP_IS_LARGE) + ++window_bits; + + return window_bits; + } + +/* +* Montgomery Reduction +*/ +inline void montgomery_reduce(BigInt& out, MemoryRegion& z_buf, + const BigInt& x_bn, u32bit x_size, word u) + { + const word* x = x_bn.data(); + word* z = z_buf.begin(); + u32bit z_size = z_buf.size(); + + bigint_monty_redc(z, z_size, x, x_size, u); + + out.get_reg().set(z + x_size, x_size + 1); + } + +} + +/* +* Set the exponent +*/ +void Montgomery_Exponentiator::set_exponent(const BigInt& exp) + { + this->exp = exp; + exp_bits = exp.bits(); + } + +/* +* Set the base +*/ +void Montgomery_Exponentiator::set_base(const BigInt& base) + { + window_bits = choose_window_bits(exp.bits(), base.bits(), hints); + + g.resize((1 << window_bits) - 1); + + SecureVector z(2 * (mod_words + 1)); + SecureVector workspace(z.size()); + + g[0] = (base >= modulus) ? (base % modulus) : base; + bigint_mul(z.begin(), z.size(), workspace, + g[0].data(), g[0].size(), g[0].sig_words(), + R2.data(), R2.size(), R2.sig_words()); + + montgomery_reduce(g[0], z, modulus, mod_words, mod_prime); + + const BigInt& x = g[0]; + const u32bit x_sig = x.sig_words(); + + for(u32bit j = 1; j != g.size(); ++j) + { + const BigInt& y = g[j-1]; + const u32bit y_sig = y.sig_words(); + + z.clear(); + bigint_mul(z.begin(), z.size(), workspace, + x.data(), x.size(), x_sig, + y.data(), y.size(), y_sig); + + montgomery_reduce(g[j], z, modulus, mod_words, mod_prime); + } + } + +/* +* Compute the result +*/ +BigInt Montgomery_Exponentiator::execute() const + { + const u32bit exp_nibbles = (exp_bits + window_bits - 1) / window_bits; + + BigInt x = R_mod; + SecureVector z(2 * (mod_words + 1)); + SecureVector workspace(2 * (mod_words + 1)); + + for(u32bit j = exp_nibbles; j > 0; --j) + { + for(u32bit k = 0; k != window_bits; ++k) + { + z.clear(); + bigint_sqr(z.begin(), z.size(), workspace, + x.data(), x.size(), x.sig_words()); + + montgomery_reduce(x, z, modulus, mod_words, mod_prime); + } + + u32bit nibble = exp.get_substring(window_bits*(j-1), window_bits); + if(nibble) + { + const BigInt& y = g[nibble-1]; + + z.clear(); + bigint_mul(z.begin(), z.size(), workspace, + x.data(), x.size(), x.sig_words(), + y.data(), y.size(), y.sig_words()); + + montgomery_reduce(x, z, modulus, mod_words, mod_prime); + } + } + + z.clear(); + z.copy(x.data(), x.size()); + + montgomery_reduce(x, z, modulus, mod_words, mod_prime); + return x; + } + +/* +* Montgomery_Exponentiator Constructor +*/ +Montgomery_Exponentiator::Montgomery_Exponentiator(const BigInt& mod, + Power_Mod::Usage_Hints hints) + { + if(!mod.is_positive()) + throw Exception("Montgomery_Exponentiator: modulus must be positive"); + if(mod.is_even()) + throw Exception("Montgomery_Exponentiator: modulus must be odd"); + + window_bits = 0; + this->hints = hints; + modulus = mod; + + mod_words = modulus.sig_words(); + + BigInt mod_prime_bn(BigInt::Power2, MP_WORD_BITS); + mod_prime = (mod_prime_bn - inverse_mod(modulus, mod_prime_bn)).word_at(0); + + R_mod = BigInt(BigInt::Power2, MP_WORD_BITS * mod_words); + R_mod %= modulus; + + R2 = BigInt(BigInt::Power2, 2 * MP_WORD_BITS * mod_words); + R2 %= modulus; + } + +} diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/primes.cpp b/src/libs/3rdparty/botan/src/math/numbertheory/primes.cpp new file mode 100644 index 00000000000..26ff098a5e2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/primes.cpp @@ -0,0 +1,676 @@ +/* +* Small Primes Table +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +const u16bit PRIMES[PRIME_TABLE_SIZE+1] = { + 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, 0 }; + +const u64bit PRIME_PRODUCTS[PRIME_PRODUCTS_TABLE_SIZE] = { +0xFF658BDE2F2A43DF, 0xFEEB94CD535119ED, 0xFA921839EC24DDD5, 0xFDDA766C77E1E605, +0xFF3024B0EB4EE333, 0xFEEE350BBC92F4DF, 0xFFC724B7D011D01B, 0xFEED34B826C33B05, +0xFE69D8DE3F85C6E3, 0xFE3B48909250918F, 0xFF8EC0CE9C632429, 0xFFD92A5C78226D6B, +0xFFB4BFB0C65133CF, 0xFE77113704902C57, 0xFF8A21D222EA81FD, 0xFEDA1299661CF5AB, +0xFF4CE86187737D0D, 0xFFD26443A07F519D, 0xFFA817B7191D7967, 0xFF00EDC142868873, +0xFFB9C6D7F7A239B7, 0xFFE76D3481E98E39, 0xFF76D5432584120D, 0xFFAA499F071EC705, +0xFEB5198F05722E59, 0xFF7E0431CA41107F, 0xFFCFD52FEDDC928F, 0xFE0EA42537BC6ABF, +0xFF64937896876925, 0xFC6FC87E811607D3, 0xFFBF600E6CDD0F4F, 0xFF022700FE658243, +0xFF2E21166779D6B9, 0xFFC224624C665C33, 0xFF1372F41FF177AD, 0xFF31E57E972D0C13, +0xFFA891F866404D23, 0xFF7BF13EF716E9A3, 0xFE51CAFD9466E733, 0xFDA1CF55F6D6336F, +0xFFAF6C040ED0950F, 0xFFAA1725F40BA269, 0xFEC593BC3570BEEB, 0xFEE05B35B426F413, +0xFFCA5209A08890F9, 0xFFED8AF70EB0CC89, 0xFF3F98E3E27860A5, 0xFF92FECD017FF9F7, +0xFEFA655B2609018F, 0xFFFC51D15AAC7B77, 0xFEF5007E71420DB1, 0xFFEC4784141332D1, +0xFE8384ED4E1D21CD, 0xFFD3FF614D3ECC47, 0xFFDE5166FD540313, 0xFF5320ECED04B26F, +0xFF223980F122FF75, 0xFF19C1F27CB1B4A5, 0xFF0F1DFC9DA9523B, 0xFF82DE7B387F5427, +0xFF9A026BA87314E3, 0xFFAC7FF3ACE64E77, 0xFF808EB2FD5873C3, 0xFE983ED5BB363301, +0xFF714856DB2CFE95, 0xFF84E1510CF3EB9F, 0xFF29D04C1DA0B115, 0xFFBCF3BF9433552F, +0xFF32203D58A4C473, 0xFFF00910A15021C3, 0xFDE93041F28240AD, 0xFFC518BCD81C03C5, +0xFEF504CD8BB9CBDD, 0xFEB8FFBFFF116A6B, 0xFF7642E0785ADA23, 0xFFECF068800FD50D, +0xFFD703577CA247A7, 0xFF54C0ECAD2C9691, 0xFFC031706B8C72F5, 0xFFE59E5CA58BBDF5, +0xFFF31FAFFD3B331D, 0xFF64DDF32349FF6D, 0xFFE38309D0BD4A51, 0xFF8C934F76B3C737, +0xFFDC80B4BAEAFC1F, 0xFFCC1FE4C856FBD9, 0xFFDB5976DDF601FD, 0xFFD3DD25F424433D, +0xFFC00FA367E746C7, 0xFFE08BF011CC854F, 0xFFC3F21982468F6D, 0xFFDA6C52478A76DF, +0xFFC67D95AADED363, 0xFFD605D18C3AFC65, 0xFFE828C9D698F1DF, 0xFFBE5098D83B7737, +0xFF79EB34474ABFB9, 0xFFD27AEED0786363, 0xFFD0FE27B77C271F, 0xFFFBB6563BD065EF, +0xFFF3638F8635E1EB, 0xFFBE862C22C9F065, 0xFF44712D8488A01D, 0xFF7EEC97F9913111, +0xFFC23CC78CB12AB1, 0xFFF390FE85F81D3D, 0xFFE8EA21A0FB9931, 0xFFB9D42D17A93385, +0xFFCDB63AB21E904D, 0xFF5EB7F2210D33DF, 0xFFE6F6C7BB60C9DF, 0xFFAD4CA8DC26D699, +0xFF7BE75BD21DCA51, 0xFEF89CE23CB61789, 0xFF40ECA3CCA22CE5, 0xF52BDF080F7ABA6F, +0xEC8F38C8B28E0493, 0xE68E732A2ABED62F, 0xE21A13779E0CCDC7, 0xD823C075C325191B, +0xD1B284C91EED248B, 0xCBA5A08068E8C1F7, 0xC483EE5A2228985D, 0xBCAEE9F787AC75EB, +0xB782DAB1B77D3E09, 0xB0D77226F15E387B, 0xAA2A8727D47941CD, 0xA4A45682E9CE533D, +0x9CAF15AF4CE7FCF7, 0x94C051DD15537305, 0x9006D2FBD933A297, 0x8C4DED05F19B7399, +0x884FD7A270AD1B1B, 0x83C687D33F238D4B, 0xFF62E2BAE50C6C16, 0x7A59E1FD9D203DBB, +0x764F1DC07B0E442D, 0x72732FE1F2023153, 0x6E373B550764872F, 0x680FFFD267C5F3FF, +0x6206BFEC14F1CFC5, 0x5FA6F70CFD587265, 0x5CC7A1B4F6DF9823, 0x599291B29311407F, +0xFF3CEBD359B67EF9, 0x51C573C14F289F6D, 0x4FA265B31B73C6DF, 0x4B3154ACBD077DED, +0x4785C96B29A1E437, 0x451F887F646CF763, 0x429DC254C5490571, 0x408410840EAE2883, +0x3E12CC83606624F3, 0x3A70D774B821DA71, 0x37A21449A196A825, 0x34C5D056E2278B81, +0xFA0C6CAB29D8E297, 0x2FA5AEC982A5972B, 0x2D6831749426068F, 0x2B7F876418155CA7, +0x2A1B897ED2AB433D, 0x28C9430D0F92132F, 0x26DF879EBF12E103, 0xFD2FAB4CA364D43B, +0x22B5B4FC40D4C35F, 0x209298AA84D7E6A1, 0x1ED4B9F11445F1E7, 0x1DC6D2DD416CC91D, +0x1C1517A52E37C3EF, 0x1A808916125AEF2F, 0x197A2FB2938FF13D, 0x1814AA6C087B561D, +0xFB3B173E72947609, 0x1571187A8E3D4D6B, 0x13D306D29263C139, 0xF8AEC6ADA137E865, +0x123EA204BAB48731, 0x11012099D202F297, 0x10290E15797C21BD, 0x0F3AB38E679D6317, +0xF50B5505D593FCF9, 0xFF23754F7F2052B5, 0x0CC52D96BC2E5A2D, 0x0BF80EAD87B228E5, +0x0B59A623082C9171, 0xF44E28B9221A433B, 0x09DB5CDD2505EABD, 0x09638C123BCAB351, +0xFDB9AE6935254CD3, 0xFFE30D7E4F02F163, 0x07CF1FC053B9C61F, 0x0789244FF1705821, +0x06FBD05649B0B9C7, 0xEF9713EC6A0C250B, 0xF47691AD6AA9F0DB, 0xF2A8EB02CB08CA51, +0xF9559D40380A20E1, 0x04E15138A5B9BF43, 0xEECD739EA48F3ABB, 0xF76E7E7530574E79, +0xF8393D2E42D7D277, 0xF666F9AD3A16D173, 0xF403C629749F3ED5, 0xFBD7EC45F220A473, +0xFA8AFF7491B234FD, 0xFF471CE534D1F537, 0xF4BEBFDD9C54CEC9, 0xDD04722310A6CE9D, +0xFD8071236214FA05, 0xFBCA07B399A482DD, 0xFD9642C104864C17, 0xFA525105AADEFA39, +0xF71122156406E645, 0xFF415FDFD1247539, 0xFB709936F52446AF, 0xFF7734CCB806CDA7, +0xF801E9A88CD3D70D, 0xFC0C00AC9BCC5491, 0xFF462CD8E52ED221, 0xFC97426300FCE331, +0xFEB3049C5E37A059, 0xFFFC8AB1E05051CD, 0xFE5F4621F2D9FE63, 0xFE931DB54FC5D521, +0xFFDE43D960FE42A5, 0xFFDBFAD1B802BDB5, 0xFF23C485F6B7BF53, 0xFFC98F169C8DF21B, +0xF1609D0E2E564D01, 0xCB10B976C333834B, 0x9B52037A38DAB8F9, 0x800E88FF5E929095, +0x55A9AD1C21F5E173, 0x3D1A64E4E555D699, 0x2A5D1D73694F7B93, 0x198F4260D8807623, +0x140D45BB525C35EB, 0x102F4743FF914EEB, 0x0CB114936A734FBF, 0x096D97150B7B0A71, +0x06F06B90B850C2E5, 0x053B17A0D7F7386B, 0xE3AD1CE3C82FE6A5, 0xDAE968B4B710E857, +0xFA2DC15B2C96BE77, 0xF1FF5F22AF135BD9, 0xFC65C5CAAA878A13, 0xFB9427EB08CF9C11, +0xCCB12B6FEBFE285D, 0x5BAADA462B48F999, 0x2E53167EC64B703B, 0x1264ED670CD61961, +0x071F216A9AB74E2D, 0xEE26503C1266CE55, 0x4C6004C7E404E4B5, 0xCB649E41ECE95F85 +}; + +} diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/reducer.cpp b/src/libs/3rdparty/botan/src/math/numbertheory/reducer.cpp new file mode 100644 index 00000000000..fbd675ea675 --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/reducer.cpp @@ -0,0 +1,97 @@ +/* +* Modular Reducer +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Modular_Reducer Constructor +*/ +Modular_Reducer::Modular_Reducer(const BigInt& mod) + { + if(mod <= 0) + throw Invalid_Argument("Modular_Reducer: modulus must be positive"); + + modulus = mod; + mod_words = modulus.sig_words(); + + modulus_2 = Botan::square(modulus); + mod2_words = modulus_2.sig_words(); + + mu = BigInt(BigInt::Power2, 2 * MP_WORD_BITS * mod_words) / modulus; + mu_words = mu.sig_words(); + } + +/* +* Barrett Reduction +*/ +BigInt Modular_Reducer::reduce(const BigInt& x) const + { + if(mod_words == 0) + throw Invalid_State("Modular_Reducer: Never initalized"); + + BigInt t1 = x; + t1.set_sign(BigInt::Positive); + + if(t1 < modulus) + { + if(x.is_negative() && t1.is_nonzero()) + return modulus - t1; + return x; + } + + if(t1 >= modulus_2) + return (x % modulus); + + t1 >>= (MP_WORD_BITS * (mod_words - 1)); + t1 *= mu; + t1 >>= (MP_WORD_BITS * (mod_words + 1)); + + t1 *= modulus; + t1.mask_bits(MP_WORD_BITS * (mod_words+1)); + + BigInt t2 = x; + t2.set_sign(BigInt::Positive); + t2.mask_bits(MP_WORD_BITS * (mod_words+1)); + + t1 = t2 - t1; + + if(t1.is_negative()) + { + BigInt b_to_k1(BigInt::Power2, MP_WORD_BITS * (mod_words+1)); + t1 += b_to_k1; + } + + while(t1 >= modulus) + t1 -= modulus; + + if(x.is_negative() && t1.is_nonzero()) + t1 = modulus - t1; + + return t1; + } + +/* +* Multiply, followed by a reduction +*/ +BigInt Modular_Reducer::multiply(const BigInt& x, const BigInt& y) const + { + return reduce(x * y); + } + +/* +* Square, followed by a reduction +*/ +BigInt Modular_Reducer::square(const BigInt& x) const + { + return reduce(Botan::square(x)); + } + +} diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/reducer.h b/src/libs/3rdparty/botan/src/math/numbertheory/reducer.h new file mode 100644 index 00000000000..d234e0735ae --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/reducer.h @@ -0,0 +1,36 @@ +/* +* Modular Reducer +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MODARITH_H__ +#define BOTAN_MODARITH_H__ + +#include + +namespace Botan { + +/* +* Modular Reducer +*/ +class BOTAN_DLL Modular_Reducer + { + public: + BigInt multiply(const BigInt&, const BigInt&) const; + BigInt square(const BigInt&) const; + BigInt reduce(const BigInt&) const; + + bool initialized() const { return (mod_words != 0); } + + Modular_Reducer() { mod_words = 0; } + Modular_Reducer(const BigInt&); + private: + BigInt modulus, modulus_2, mu; + u32bit mod_words, mod2_words, mu_words; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/math/numbertheory/ressol.cpp b/src/libs/3rdparty/botan/src/math/numbertheory/ressol.cpp new file mode 100644 index 00000000000..d51acb8bdfa --- /dev/null +++ b/src/libs/3rdparty/botan/src/math/numbertheory/ressol.cpp @@ -0,0 +1,82 @@ +/* +* Shanks-Tonnelli (RESSOL) +* (C) 2007-2008 Falko Strenzke, FlexSecure GmbH +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Shanks-Tonnelli algorithm +*/ +BigInt ressol(const BigInt& a, const BigInt& p) + { + if(a < 0) + throw Invalid_Argument("ressol(): a to solve for must be positive"); + if(p <= 1) + throw Invalid_Argument("ressol(): prime must be > 1"); + + if(a == 0) + return 0; + if(p == 2) + return a; + + if(jacobi(a, p) != 1) // not a quadratic residue + return -BigInt(1); + + if(p % 4 == 3) + return power_mod(a, ((p+1) >> 2), p); + + u32bit s = low_zero_bits(p - 1); + BigInt q = p >> s; + + q -= 1; + q >>= 1; + + Modular_Reducer mod_p(p); + + BigInt r = power_mod(a, q, p); + BigInt n = mod_p.multiply(a, mod_p.square(r)); + r = mod_p.multiply(r, a); + + if(n == 1) + return r; + + // find random non quadratic residue z + BigInt z = 2; + while(jacobi(z, p) == 1) // while z quadratic residue + ++z; + + BigInt c = power_mod(z, (q << 1) + 1, p); + + while(n > 1) + { + q = n; + + u32bit i = 0; + while(q != 1) + { + q = mod_p.square(q); + ++i; + } + u32bit t = s; + + if(t <= i) + return -BigInt(1); + + c = power_mod(c, BigInt(BigInt::Power2, t-i-1), p); + r = mod_p.multiply(r, c); + c = mod_p.square(c); + n = mod_p.multiply(n, c); + s = i; + } + + return r; + } + +} diff --git a/src/libs/3rdparty/botan/src/modes/cbc/cbc.cpp b/src/libs/3rdparty/botan/src/modes/cbc/cbc.cpp new file mode 100644 index 00000000000..f26d4d6cf48 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/cbc/cbc.cpp @@ -0,0 +1,158 @@ +/* +* CBC Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* CBC Encryption Constructor +*/ +CBC_Encryption::CBC_Encryption(BlockCipher* ciph, + BlockCipherModePaddingMethod* pad) : + BlockCipherMode(ciph, "CBC", ciph->BLOCK_SIZE), + padder(pad) + { + if(!padder->valid_blocksize(BLOCK_SIZE)) + throw Invalid_Block_Size(name(), padder->name()); + } + +/* +* CBC Encryption Constructor +*/ +CBC_Encryption::CBC_Encryption(BlockCipher* ciph, + BlockCipherModePaddingMethod* pad, + const SymmetricKey& key, + const InitializationVector& iv) : + BlockCipherMode(ciph, "CBC", ciph->BLOCK_SIZE), + padder(pad) + { + if(!padder->valid_blocksize(BLOCK_SIZE)) + throw Invalid_Block_Size(name(), padder->name()); + set_key(key); + set_iv(iv); + } + +/* +* Encrypt in CBC mode +*/ +void CBC_Encryption::write(const byte input[], u32bit length) + { + while(length) + { + u32bit xored = std::min(BLOCK_SIZE - position, length); + xor_buf(state + position, input, xored); + input += xored; + length -= xored; + position += xored; + if(position == BLOCK_SIZE) + { + cipher->encrypt(state); + send(state, BLOCK_SIZE); + position = 0; + } + } + } + +/* +* Finish encrypting in CBC mode +*/ +void CBC_Encryption::end_msg() + { + SecureVector padding(BLOCK_SIZE); + padder->pad(padding, padding.size(), position); + write(padding, padder->pad_bytes(BLOCK_SIZE, position)); + if(position != 0) + throw Exception(name() + ": Did not pad to full blocksize"); + } + +/* +* Return a CBC mode name +*/ +std::string CBC_Encryption::name() const + { + return (cipher->name() + "/" + mode_name + "/" + padder->name()); + } + +/* +* CBC Decryption Constructor +*/ +CBC_Decryption::CBC_Decryption(BlockCipher* ciph, + BlockCipherModePaddingMethod* pad) : + BlockCipherMode(ciph, "CBC", ciph->BLOCK_SIZE), + padder(pad) + { + if(!padder->valid_blocksize(BLOCK_SIZE)) + throw Invalid_Block_Size(name(), padder->name()); + temp.create(BLOCK_SIZE); + } + +/* +* CBC Decryption Constructor +*/ +CBC_Decryption::CBC_Decryption(BlockCipher* ciph, + BlockCipherModePaddingMethod* pad, + const SymmetricKey& key, + const InitializationVector& iv) : + BlockCipherMode(ciph, "CBC", ciph->BLOCK_SIZE), + padder(pad) + { + if(!padder->valid_blocksize(BLOCK_SIZE)) + throw Invalid_Block_Size(name(), padder->name()); + temp.create(BLOCK_SIZE); + set_key(key); + set_iv(iv); + } + +/* +* Decrypt in CBC mode +*/ +void CBC_Decryption::write(const byte input[], u32bit length) + { + while(length) + { + if(position == BLOCK_SIZE) + { + cipher->decrypt(buffer, temp); + xor_buf(temp, state, BLOCK_SIZE); + send(temp, BLOCK_SIZE); + state = buffer; + position = 0; + } + u32bit added = std::min(BLOCK_SIZE - position, length); + buffer.copy(position, input, added); + input += added; + length -= added; + position += added; + } + } + +/* +* Finish decrypting in CBC mode +*/ +void CBC_Decryption::end_msg() + { + if(position != BLOCK_SIZE) + throw Decoding_Error(name()); + cipher->decrypt(buffer, temp); + xor_buf(temp, state, BLOCK_SIZE); + send(temp, padder->unpad(temp, BLOCK_SIZE)); + state = buffer; + position = 0; + } + +/* +* Return a CBC mode name +*/ +std::string CBC_Decryption::name() const + { + return (cipher->name() + "/" + mode_name + "/" + padder->name()); + } + +} diff --git a/src/libs/3rdparty/botan/src/modes/cbc/cbc.h b/src/libs/3rdparty/botan/src/modes/cbc/cbc.h new file mode 100644 index 00000000000..a926ac18061 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/cbc/cbc.h @@ -0,0 +1,55 @@ +/* +* CBC Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CBC_H__ +#define BOTAN_CBC_H__ + +#include +#include + +namespace Botan { + +/* +* CBC Encryption +*/ +class BOTAN_DLL CBC_Encryption : public BlockCipherMode + { + public: + CBC_Encryption(BlockCipher*, BlockCipherModePaddingMethod*); + CBC_Encryption(BlockCipher*, BlockCipherModePaddingMethod*, + const SymmetricKey&, const InitializationVector&); + + ~CBC_Encryption() { delete padder; } + private: + std::string name() const; + void write(const byte[], u32bit); + void end_msg(); + const BlockCipherModePaddingMethod* padder; + }; + +/* +* CBC Decryption +*/ +class BOTAN_DLL CBC_Decryption : public BlockCipherMode + { + public: + CBC_Decryption(BlockCipher*, BlockCipherModePaddingMethod*); + CBC_Decryption(BlockCipher*, BlockCipherModePaddingMethod*, + const SymmetricKey&, const InitializationVector&); + + ~CBC_Decryption() { delete padder; } + private: + std::string name() const; + void write(const byte[], u32bit); + void end_msg(); + const BlockCipherModePaddingMethod* padder; + SecureVector temp; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/modes/cbc/info.txt b/src/libs/3rdparty/botan/src/modes/cbc/info.txt new file mode 100644 index 00000000000..de81dcb8c12 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/cbc/info.txt @@ -0,0 +1,14 @@ +realname "CBC block cipher mode" + +define CBC + +load_on auto + + +cbc.cpp +cbc.h + + + +mode_pad + diff --git a/src/libs/3rdparty/botan/src/modes/cfb/cfb.cpp b/src/libs/3rdparty/botan/src/modes/cfb/cfb.cpp new file mode 100644 index 00000000000..a126bd99590 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/cfb/cfb.cpp @@ -0,0 +1,143 @@ +/* +* CFB Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Check the feedback size +*/ +void check_feedback(u32bit BLOCK_SIZE, u32bit FEEDBACK_SIZE, u32bit bits, + const std::string& name) + { + if(FEEDBACK_SIZE == 0 || FEEDBACK_SIZE > BLOCK_SIZE || bits % 8 != 0) + throw Invalid_Argument(name + ": Invalid feedback size " + + to_string(bits)); + } + +} + +/* +* CFB Encryption Constructor +*/ +CFB_Encryption::CFB_Encryption(BlockCipher* ciph, + u32bit fback_bits) : + BlockCipherMode(ciph, "CFB", ciph->BLOCK_SIZE, 1), + FEEDBACK_SIZE(fback_bits ? fback_bits / 8: BLOCK_SIZE) + { + check_feedback(BLOCK_SIZE, FEEDBACK_SIZE, fback_bits, name()); + } + +/* +* CFB Encryption Constructor +*/ +CFB_Encryption::CFB_Encryption(BlockCipher* ciph, + const SymmetricKey& key, + const InitializationVector& iv, + u32bit fback_bits) : + BlockCipherMode(ciph, "CFB", ciph->BLOCK_SIZE, 1), + FEEDBACK_SIZE(fback_bits ? fback_bits / 8: BLOCK_SIZE) + { + check_feedback(BLOCK_SIZE, FEEDBACK_SIZE, fback_bits, name()); + set_key(key); + set_iv(iv); + } + +/* +* Encrypt data in CFB mode +*/ +void CFB_Encryption::write(const byte input[], u32bit length) + { + while(length) + { + u32bit xored = std::min(FEEDBACK_SIZE - position, length); + xor_buf(buffer + position, input, xored); + send(buffer + position, xored); + input += xored; + length -= xored; + position += xored; + if(position == FEEDBACK_SIZE) + feedback(); + } + } + +/* +* Do the feedback +*/ +void CFB_Encryption::feedback() + { + for(u32bit j = 0; j != BLOCK_SIZE - FEEDBACK_SIZE; ++j) + state[j] = state[j + FEEDBACK_SIZE]; + state.copy(BLOCK_SIZE - FEEDBACK_SIZE, buffer, FEEDBACK_SIZE); + cipher->encrypt(state, buffer); + position = 0; + } + +/* +* CFB Decryption Constructor +*/ +CFB_Decryption::CFB_Decryption(BlockCipher* ciph, + u32bit fback_bits) : + BlockCipherMode(ciph, "CFB", ciph->BLOCK_SIZE, 1), + FEEDBACK_SIZE(fback_bits ? fback_bits / 8 : BLOCK_SIZE) + { + check_feedback(BLOCK_SIZE, FEEDBACK_SIZE, fback_bits, name()); + } + +/* +* CFB Decryption Constructor +*/ +CFB_Decryption::CFB_Decryption(BlockCipher* ciph, + const SymmetricKey& key, + const InitializationVector& iv, + u32bit fback_bits) : + BlockCipherMode(ciph, "CFB", ciph->BLOCK_SIZE, 1), + FEEDBACK_SIZE(fback_bits ? fback_bits / 8 : BLOCK_SIZE) + { + check_feedback(BLOCK_SIZE, FEEDBACK_SIZE, fback_bits, name()); + set_key(key); + set_iv(iv); + } + +/* +* Decrypt data in CFB mode +*/ +void CFB_Decryption::write(const byte input[], u32bit length) + { + while(length) + { + u32bit xored = std::min(FEEDBACK_SIZE - position, length); + xor_buf(buffer + position, input, xored); + send(buffer + position, xored); + buffer.copy(position, input, xored); + input += xored; + length -= xored; + position += xored; + if(position == FEEDBACK_SIZE) + feedback(); + } + } + +/* +* Do the feedback +*/ +void CFB_Decryption::feedback() + { + for(u32bit j = 0; j != BLOCK_SIZE - FEEDBACK_SIZE; ++j) + state[j] = state[j + FEEDBACK_SIZE]; + state.copy(BLOCK_SIZE - FEEDBACK_SIZE, buffer, FEEDBACK_SIZE); + cipher->encrypt(state, buffer); + position = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/modes/cfb/cfb.h b/src/libs/3rdparty/botan/src/modes/cfb/cfb.h new file mode 100644 index 00000000000..7810c00e455 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/cfb/cfb.h @@ -0,0 +1,47 @@ +/* +* CFB Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CFB_H__ +#define BOTAN_CFB_H__ + +#include + +namespace Botan { + +/* +* CFB Encryption +*/ +class BOTAN_DLL CFB_Encryption : public BlockCipherMode + { + public: + CFB_Encryption(BlockCipher*, u32bit = 0); + CFB_Encryption(BlockCipher*, const SymmetricKey&, + const InitializationVector&, u32bit = 0); + private: + void write(const byte[], u32bit); + void feedback(); + const u32bit FEEDBACK_SIZE; + }; + +/* +* CFB Decryption +*/ +class BOTAN_DLL CFB_Decryption : public BlockCipherMode + { + public: + CFB_Decryption(BlockCipher*, u32bit = 0); + CFB_Decryption(BlockCipher*, const SymmetricKey&, + const InitializationVector&, u32bit = 0); + private: + void write(const byte[], u32bit); + void feedback(); + const u32bit FEEDBACK_SIZE; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/modes/cfb/info.txt b/src/libs/3rdparty/botan/src/modes/cfb/info.txt new file mode 100644 index 00000000000..d66df1ee7d4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/cfb/info.txt @@ -0,0 +1,15 @@ +realname "CFB block cipher mode" + +define CFB + +load_on auto + + +cfb.cpp +cfb.h + + + +modes + + diff --git a/src/libs/3rdparty/botan/src/modes/ctr/ctr.cpp b/src/libs/3rdparty/botan/src/modes/ctr/ctr.cpp new file mode 100644 index 00000000000..9eb42ec5ad2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/ctr/ctr.cpp @@ -0,0 +1,75 @@ +/* +* CTR Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* CTR-BE Constructor +*/ +CTR_BE::CTR_BE(BlockCipher* ciph) : + BlockCipherMode(ciph, "CTR-BE", ciph->BLOCK_SIZE, 1) + { + } + +/* +* CTR-BE Constructor +*/ +CTR_BE::CTR_BE(BlockCipher* ciph, const SymmetricKey& key, + const InitializationVector& iv) : + BlockCipherMode(ciph, "CTR-BE", ciph->BLOCK_SIZE, 1) + { + set_key(key); + set_iv(iv); + } + +/* +* CTR-BE Encryption/Decryption +*/ +void CTR_BE::write(const byte input[], u32bit length) + { + u32bit copied = std::min(BLOCK_SIZE - position, length); + xor_buf(buffer + position, input, copied); + send(buffer + position, copied); + input += copied; + length -= copied; + position += copied; + + if(position == BLOCK_SIZE) + increment_counter(); + + while(length >= BLOCK_SIZE) + { + xor_buf(buffer, input, BLOCK_SIZE); + send(buffer, BLOCK_SIZE); + + input += BLOCK_SIZE; + length -= BLOCK_SIZE; + increment_counter(); + } + + xor_buf(buffer + position, input, length); + send(buffer + position, length); + position += length; + } + +/* +* Increment the counter and update the buffer +*/ +void CTR_BE::increment_counter() + { + for(s32bit j = BLOCK_SIZE - 1; j >= 0; --j) + if(++state[j]) + break; + cipher->encrypt(state, buffer); + position = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/modes/ctr/ctr.h b/src/libs/3rdparty/botan/src/modes/ctr/ctr.h new file mode 100644 index 00000000000..aa0db57618b --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/ctr/ctr.h @@ -0,0 +1,31 @@ +/* +* CTR Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_COUNTER_MODE_H__ +#define BOTAN_COUNTER_MODE_H__ + +#include +#include + +namespace Botan { + +/* +* CTR-BE Mode +*/ +class BOTAN_DLL CTR_BE : public BlockCipherMode + { + public: + CTR_BE(BlockCipher*); + CTR_BE(BlockCipher*, const SymmetricKey&, const InitializationVector&); + private: + void write(const byte[], u32bit); + void increment_counter(); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/modes/ctr/info.txt b/src/libs/3rdparty/botan/src/modes/ctr/info.txt new file mode 100644 index 00000000000..cb291a2c145 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/ctr/info.txt @@ -0,0 +1,15 @@ +realname "CTR block cipher mode" + +define CTR + +load_on auto + + +ctr.cpp +ctr.h + + + +modes + + diff --git a/src/libs/3rdparty/botan/src/modes/cts/cts.cpp b/src/libs/3rdparty/botan/src/modes/cts/cts.cpp new file mode 100644 index 00000000000..99f042f613c --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/cts/cts.cpp @@ -0,0 +1,134 @@ +/* +* CTS Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Encrypt a block +*/ +void CTS_Encryption::encrypt(const byte block[]) + { + xor_buf(state, block, BLOCK_SIZE); + cipher->encrypt(state); + send(state, BLOCK_SIZE); + } + +/* +* Encrypt in CTS mode +*/ +void CTS_Encryption::write(const byte input[], u32bit length) + { + u32bit copied = std::min(BUFFER_SIZE - position, length); + buffer.copy(position, input, copied); + length -= copied; + input += copied; + position += copied; + + if(length == 0) return; + + encrypt(buffer); + if(length > BLOCK_SIZE) + { + encrypt(buffer + BLOCK_SIZE); + while(length > 2*BLOCK_SIZE) + { + encrypt(input); + length -= BLOCK_SIZE; + input += BLOCK_SIZE; + } + position = 0; + } + else + { + copy_mem(buffer.begin(), buffer + BLOCK_SIZE, BLOCK_SIZE); + position = BLOCK_SIZE; + } + buffer.copy(position, input, length); + position += length; + } + +/* +* Finish encrypting in CTS mode +*/ +void CTS_Encryption::end_msg() + { + if(position < BLOCK_SIZE + 1) + throw Exception("CTS_Encryption: insufficient data to encrypt"); + xor_buf(state, buffer, BLOCK_SIZE); + cipher->encrypt(state); + SecureVector cn = state; + clear_mem(buffer + position, BUFFER_SIZE - position); + encrypt(buffer + BLOCK_SIZE); + send(cn, position - BLOCK_SIZE); + } + +/* +* Decrypt a block +*/ +void CTS_Decryption::decrypt(const byte block[]) + { + cipher->decrypt(block, temp); + xor_buf(temp, state, BLOCK_SIZE); + send(temp, BLOCK_SIZE); + state.copy(block, BLOCK_SIZE); + } + +/* +* Decrypt in CTS mode +*/ +void CTS_Decryption::write(const byte input[], u32bit length) + { + u32bit copied = std::min(BUFFER_SIZE - position, length); + buffer.copy(position, input, copied); + length -= copied; + input += copied; + position += copied; + + if(length == 0) return; + + decrypt(buffer); + if(length > BLOCK_SIZE) + { + decrypt(buffer + BLOCK_SIZE); + while(length > 2*BLOCK_SIZE) + { + decrypt(input); + length -= BLOCK_SIZE; + input += BLOCK_SIZE; + } + position = 0; + } + else + { + copy_mem(buffer.begin(), buffer + BLOCK_SIZE, BLOCK_SIZE); + position = BLOCK_SIZE; + } + buffer.copy(position, input, length); + position += length; + } + +/* +* Finish decrypting in CTS mode +*/ +void CTS_Decryption::end_msg() + { + cipher->decrypt(buffer, temp); + xor_buf(temp, buffer + BLOCK_SIZE, position - BLOCK_SIZE); + SecureVector xn = temp; + copy_mem(buffer + position, xn + (position - BLOCK_SIZE), + BUFFER_SIZE - position); + cipher->decrypt(buffer + BLOCK_SIZE, temp); + xor_buf(temp, state, BLOCK_SIZE); + send(temp, BLOCK_SIZE); + send(xn, position - BLOCK_SIZE); + } + +} diff --git a/src/libs/3rdparty/botan/src/modes/cts/cts.h b/src/libs/3rdparty/botan/src/modes/cts/cts.h new file mode 100644 index 00000000000..9b17203f318 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/cts/cts.h @@ -0,0 +1,60 @@ +/* +* CTS Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CTS_H__ +#define BOTAN_CTS_H__ + +#include +#include + +namespace Botan { + +/* +* CTS Encryption +*/ +class BOTAN_DLL CTS_Encryption : public BlockCipherMode + { + public: + CTS_Encryption(BlockCipher* ciph) : + BlockCipherMode(ciph, "CTS", ciph->BLOCK_SIZE, 0, 2) {} + + CTS_Encryption(BlockCipher* ciph, + const SymmetricKey& key, + const InitializationVector& iv) : + BlockCipherMode(ciph, "CTS", ciph->BLOCK_SIZE, 0, 2) + { set_key(key); set_iv(iv); } + private: + void write(const byte[], u32bit); + void end_msg(); + void encrypt(const byte[]); + }; + +/* +* CTS Decryption +*/ +class BOTAN_DLL CTS_Decryption : public BlockCipherMode + { + public: + CTS_Decryption(BlockCipher* ciph) : + BlockCipherMode(ciph, "CTS", ciph->BLOCK_SIZE, 0, 2) + { temp.create(BLOCK_SIZE); } + + CTS_Decryption(BlockCipher* ciph, + const SymmetricKey& key, + const InitializationVector& iv) : + BlockCipherMode(ciph, "CTS", ciph->BLOCK_SIZE, 0, 2) + { set_key(key); set_iv(iv); temp.create(BLOCK_SIZE); } + private: + void write(const byte[], u32bit); + void end_msg(); + void decrypt(const byte[]); + SecureVector temp; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/modes/cts/info.txt b/src/libs/3rdparty/botan/src/modes/cts/info.txt new file mode 100644 index 00000000000..9eb16add528 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/cts/info.txt @@ -0,0 +1,14 @@ +realname "CTS block cipher mode" + +define CTS + +load_on auto + + +cts.cpp +cts.h + + + +block + diff --git a/src/libs/3rdparty/botan/src/modes/eax/eax.cpp b/src/libs/3rdparty/botan/src/modes/eax/eax.cpp new file mode 100644 index 00000000000..67465a7761f --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/eax/eax.cpp @@ -0,0 +1,172 @@ +/* +* EAX Mode Encryption +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* EAX MAC-based PRF +*/ +SecureVector eax_prf(byte tag, u32bit BLOCK_SIZE, + MessageAuthenticationCode* mac, + const byte in[], u32bit length) + { + for(u32bit j = 0; j != BLOCK_SIZE - 1; ++j) + mac->update(0); + mac->update(tag); + mac->update(in, length); + return mac->final(); + } + +} + +/* +* EAX_Base Constructor +*/ +EAX_Base::EAX_Base(BlockCipher* ciph, + u32bit tag_size) : + TAG_SIZE(tag_size ? tag_size / 8 : ciph->BLOCK_SIZE), + BLOCK_SIZE(ciph->BLOCK_SIZE) + { + cipher = ciph; + mac = new CMAC(cipher->clone()); + + if(tag_size % 8 != 0 || TAG_SIZE == 0 || TAG_SIZE > mac->OUTPUT_LENGTH) + throw Invalid_Argument(name() + ": Bad tag size " + to_string(tag_size)); + + state.create(BLOCK_SIZE); + buffer.create(BLOCK_SIZE); + position = 0; + } + +/* +* Check if a keylength is valid for EAX +*/ +bool EAX_Base::valid_keylength(u32bit n) const + { + if(!cipher->valid_keylength(n)) + return false; + if(!mac->valid_keylength(n)) + return false; + return true; + } + +/* +* Set the EAX key +*/ +void EAX_Base::set_key(const SymmetricKey& key) + { + cipher->set_key(key); + mac->set_key(key); + header_mac = eax_prf(1, BLOCK_SIZE, mac, 0, 0); + } + +/* +* Do setup at the start of each message +*/ +void EAX_Base::start_msg() + { + for(u32bit j = 0; j != BLOCK_SIZE - 1; ++j) + mac->update(0); + mac->update(2); + } + +/* +* Set the EAX nonce +*/ +void EAX_Base::set_iv(const InitializationVector& iv) + { + nonce_mac = eax_prf(0, BLOCK_SIZE, mac, iv.begin(), iv.length()); + state = nonce_mac; + cipher->encrypt(state, buffer); + } + +/* +* Set the EAX header +*/ +void EAX_Base::set_header(const byte header[], u32bit length) + { + header_mac = eax_prf(1, BLOCK_SIZE, mac, header, length); + } + +/* +* Return the name of this cipher mode +*/ +std::string EAX_Base::name() const + { + return (cipher->name() + "/EAX"); + } + +/* +* Increment the counter and update the buffer +*/ +void EAX_Base::increment_counter() + { + for(s32bit j = BLOCK_SIZE - 1; j >= 0; --j) + if(++state[j]) + break; + cipher->encrypt(state, buffer); + position = 0; + } + +/* +* Encrypt in EAX mode +*/ +void EAX_Encryption::write(const byte input[], u32bit length) + { + u32bit copied = std::min(BLOCK_SIZE - position, length); + xor_buf(buffer + position, input, copied); + send(buffer + position, copied); + mac->update(buffer + position, copied); + input += copied; + length -= copied; + position += copied; + + if(position == BLOCK_SIZE) + increment_counter(); + + while(length >= BLOCK_SIZE) + { + xor_buf(buffer, input, BLOCK_SIZE); + send(buffer, BLOCK_SIZE); + mac->update(buffer, BLOCK_SIZE); + + input += BLOCK_SIZE; + length -= BLOCK_SIZE; + increment_counter(); + } + + xor_buf(buffer + position, input, length); + send(buffer + position, length); + mac->update(buffer + position, length); + position += length; + } + +/* +* Finish encrypting in EAX mode +*/ +void EAX_Encryption::end_msg() + { + SecureVector data_mac = mac->final(); + xor_buf(data_mac, nonce_mac, data_mac.size()); + xor_buf(data_mac, header_mac, data_mac.size()); + + send(data_mac, TAG_SIZE); + + state.clear(); + buffer.clear(); + position = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/modes/eax/eax.h b/src/libs/3rdparty/botan/src/modes/eax/eax.h new file mode 100644 index 00000000000..1bb2e510d18 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/eax/eax.h @@ -0,0 +1,85 @@ +/* +* EAX Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EAX_H__ +#define BOTAN_EAX_H__ + +#include +#include +#include + +namespace Botan { + +/* +* EAX Base Class +*/ +class BOTAN_DLL EAX_Base : public Keyed_Filter + { + public: + void set_key(const SymmetricKey&); + void set_iv(const InitializationVector&); + void set_header(const byte[], u32bit); + std::string name() const; + + bool valid_keylength(u32bit) const; + + ~EAX_Base() { delete cipher; delete mac; } + protected: + EAX_Base(BlockCipher*, u32bit); + void start_msg(); + void increment_counter(); + + const u32bit TAG_SIZE, BLOCK_SIZE; + BlockCipher* cipher; + MessageAuthenticationCode* mac; + SecureVector nonce_mac, header_mac, state, buffer; + u32bit position; + }; + +/* +* EAX Encryption +*/ +class BOTAN_DLL EAX_Encryption : public EAX_Base + { + public: + EAX_Encryption(BlockCipher* ciph, u32bit tag_size = 0) : + EAX_Base(ciph, tag_size) {} + + EAX_Encryption(BlockCipher* ciph, const SymmetricKey& key, + const InitializationVector& iv, + u32bit tag_size) : EAX_Base(ciph, tag_size) + { + set_key(key); + set_iv(iv); + } + private: + void write(const byte[], u32bit); + void end_msg(); + }; + +/* +* EAX Decryption +*/ +class BOTAN_DLL EAX_Decryption : public EAX_Base + { + public: + EAX_Decryption(BlockCipher* ciph, u32bit tag_size = 0); + + EAX_Decryption(BlockCipher* ciph, const SymmetricKey& key, + const InitializationVector& iv, + u32bit tag_size = 0); + private: + void write(const byte[], u32bit); + void do_write(const byte[], u32bit); + void end_msg(); + SecureVector queue; + u32bit queue_start, queue_end; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/modes/eax/eax_dec.cpp b/src/libs/3rdparty/botan/src/modes/eax/eax_dec.cpp new file mode 100644 index 00000000000..b7e5795f70c --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/eax/eax_dec.cpp @@ -0,0 +1,127 @@ +/* +* EAX Mode Encryption +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* EAX_Decryption Constructor +*/ +EAX_Decryption::EAX_Decryption(BlockCipher* ciph, + u32bit tag_size) : + EAX_Base(ciph, tag_size) + { + queue.create(2*TAG_SIZE + DEFAULT_BUFFERSIZE); + queue_start = queue_end = 0; + } + +/* +* EAX_Decryption Constructor +*/ +EAX_Decryption::EAX_Decryption(BlockCipher* ciph, + const SymmetricKey& key, + const InitializationVector& iv, + u32bit tag_size) : + EAX_Base(ciph, tag_size) + { + set_key(key); + set_iv(iv); + queue.create(2*TAG_SIZE + DEFAULT_BUFFERSIZE); + queue_start = queue_end = 0; + } + +/* +* Decrypt in EAX mode +*/ +void EAX_Decryption::write(const byte input[], u32bit length) + { + while(length) + { + const u32bit copied = std::min(length, queue.size() - queue_end); + + queue.copy(queue_end, input, copied); + input += copied; + length -= copied; + queue_end += copied; + + SecureVector block_buf(cipher->BLOCK_SIZE); + while((queue_end - queue_start) > TAG_SIZE) + { + u32bit removed = (queue_end - queue_start) - TAG_SIZE; + do_write(queue + queue_start, removed); + queue_start += removed; + } + + if(queue_start + TAG_SIZE == queue_end && + queue_start >= queue.size() / 2) + { + SecureVector queue_data(TAG_SIZE); + queue_data.copy(queue + queue_start, TAG_SIZE); + queue.copy(queue_data, TAG_SIZE); + queue_start = 0; + queue_end = TAG_SIZE; + } + } + } + +/* +* Decrypt in EAX mode +*/ +void EAX_Decryption::do_write(const byte input[], u32bit length) + { + mac->update(input, length); + + u32bit copied = std::min(BLOCK_SIZE - position, length); + xor_buf(buffer + position, input, copied); + send(buffer + position, copied); + input += copied; + length -= copied; + position += copied; + + if(position == BLOCK_SIZE) + increment_counter(); + + while(length >= BLOCK_SIZE) + { + xor_buf(buffer, input, BLOCK_SIZE); + send(buffer, BLOCK_SIZE); + + input += BLOCK_SIZE; + length -= BLOCK_SIZE; + increment_counter(); + } + + xor_buf(buffer + position, input, length); + send(buffer + position, length); + position += length; + } + +/* +* Finish decrypting in EAX mode +*/ +void EAX_Decryption::end_msg() + { + if((queue_end - queue_start) != TAG_SIZE) + throw Integrity_Failure(name() + ": Message authentication failure"); + + SecureVector data_mac = mac->final(); + + for(u32bit j = 0; j != TAG_SIZE; ++j) + if(queue[queue_start+j] != (data_mac[j] ^ nonce_mac[j] ^ header_mac[j])) + throw Integrity_Failure(name() + ": Message authentication failure"); + + state.clear(); + buffer.clear(); + position = 0; + queue_start = queue_end = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/modes/eax/info.txt b/src/libs/3rdparty/botan/src/modes/eax/info.txt new file mode 100644 index 00000000000..d1fc7e0e378 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/eax/info.txt @@ -0,0 +1,18 @@ +realname "EAX block cipher mode" + +define EAX + +load_on auto + + +eax.cpp +eax.h +eax_dec.cpp + + + +block +cmac +filters +mac + diff --git a/src/libs/3rdparty/botan/src/modes/ecb/ecb.cpp b/src/libs/3rdparty/botan/src/modes/ecb/ecb.cpp new file mode 100644 index 00000000000..8da0a48023d --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/ecb/ecb.cpp @@ -0,0 +1,105 @@ +/* +* ECB Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Verify the IV is not set +*/ +bool ECB::valid_iv_size(u32bit iv_size) const + { + if(iv_size == 0) + return true; + return false; + } + +/* +* Return an ECB mode name +*/ +std::string ECB::name() const + { + return (cipher->name() + "/" + mode_name + "/" + padder->name()); + } + +/* +* Encrypt in ECB mode +*/ +void ECB_Encryption::write(const byte input[], u32bit length) + { + buffer.copy(position, input, length); + if(position + length >= BLOCK_SIZE) + { + cipher->encrypt(buffer); + send(buffer, BLOCK_SIZE); + input += (BLOCK_SIZE - position); + length -= (BLOCK_SIZE - position); + while(length >= BLOCK_SIZE) + { + cipher->encrypt(input, buffer); + send(buffer, BLOCK_SIZE); + input += BLOCK_SIZE; + length -= BLOCK_SIZE; + } + buffer.copy(input, length); + position = 0; + } + position += length; + } + +/* +* Finish encrypting in ECB mode +*/ +void ECB_Encryption::end_msg() + { + SecureVector padding(BLOCK_SIZE); + padder->pad(padding, padding.size(), position); + write(padding, padder->pad_bytes(BLOCK_SIZE, position)); + if(position != 0) + throw Encoding_Error(name() + ": Did not pad to full blocksize"); + } + +/* +* Decrypt in ECB mode +*/ +void ECB_Decryption::write(const byte input[], u32bit length) + { + buffer.copy(position, input, length); + if(position + length > BLOCK_SIZE) + { + cipher->decrypt(buffer); + send(buffer, BLOCK_SIZE); + input += (BLOCK_SIZE - position); + length -= (BLOCK_SIZE - position); + while(length > BLOCK_SIZE) + { + cipher->decrypt(input, buffer); + send(buffer, BLOCK_SIZE); + input += BLOCK_SIZE; + length -= BLOCK_SIZE; + } + buffer.copy(input, length); + position = 0; + } + position += length; + } + +/* +* Finish decrypting in ECB mode +*/ +void ECB_Decryption::end_msg() + { + if(position != BLOCK_SIZE) + throw Decoding_Error(name()); + cipher->decrypt(buffer); + send(buffer, padder->unpad(buffer, BLOCK_SIZE)); + state = buffer; + position = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/modes/ecb/ecb.h b/src/libs/3rdparty/botan/src/modes/ecb/ecb.h new file mode 100644 index 00000000000..5230f9b14b6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/ecb/ecb.h @@ -0,0 +1,73 @@ +/* +* ECB Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ECB_H__ +#define BOTAN_ECB_H__ + +#include +#include +#include + +namespace Botan { + +/* +* ECB +*/ +class BOTAN_DLL ECB : public BlockCipherMode + { + protected: + ECB(BlockCipher* ciph, BlockCipherModePaddingMethod* pad) : + BlockCipherMode(ciph, "ECB", 0), padder(pad) {} + ~ECB() { delete padder; } + + std::string name() const; + BlockCipherModePaddingMethod* padder; + private: + bool valid_iv_size(u32bit) const; + }; + +/* +* ECB Encryption +*/ +class BOTAN_DLL ECB_Encryption : public ECB + { + public: + ECB_Encryption(BlockCipher* ciph, + BlockCipherModePaddingMethod* pad) : + ECB(ciph, pad) {} + + ECB_Encryption(BlockCipher* ciph, + BlockCipherModePaddingMethod* pad, + const SymmetricKey& key) : + ECB(ciph, pad) { set_key(key); } + private: + void write(const byte[], u32bit); + void end_msg(); + }; + +/* +* ECB Decryption +*/ +class BOTAN_DLL ECB_Decryption : public ECB + { + public: + ECB_Decryption(BlockCipher* ciph, + BlockCipherModePaddingMethod* pad) : + ECB(ciph, pad) {} + + ECB_Decryption(BlockCipher* ciph, + BlockCipherModePaddingMethod* pad, + const SymmetricKey& key) : + ECB(ciph, pad) { set_key(key); } + private: + void write(const byte[], u32bit); + void end_msg(); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/modes/ecb/info.txt b/src/libs/3rdparty/botan/src/modes/ecb/info.txt new file mode 100644 index 00000000000..06b7b4fd2c6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/ecb/info.txt @@ -0,0 +1,15 @@ +realname "ECB block cipher mode" + +define ECB + +load_on auto + + +ecb.cpp +ecb.h + + + +block +mode_pad + diff --git a/src/libs/3rdparty/botan/src/modes/info.txt b/src/libs/3rdparty/botan/src/modes/info.txt new file mode 100644 index 00000000000..e089e74a963 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/info.txt @@ -0,0 +1,15 @@ +realname "Cipher Mode Base Class" + +define CIPHER_MODEBASE + +load_on auto + + +modebase.cpp +modebase.h + + + +block +filters + diff --git a/src/libs/3rdparty/botan/src/modes/mode_pad/info.txt b/src/libs/3rdparty/botan/src/modes/mode_pad/info.txt new file mode 100644 index 00000000000..f22cf741104 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/mode_pad/info.txt @@ -0,0 +1,10 @@ +realname "Cipher Mode Padding Method" + +define CIPHER_MODE_PADDING + +load_on auto + + +mode_pad.cpp +mode_pad.h + diff --git a/src/libs/3rdparty/botan/src/modes/mode_pad/mode_pad.cpp b/src/libs/3rdparty/botan/src/modes/mode_pad/mode_pad.cpp new file mode 100644 index 00000000000..b8badd7a7a6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/mode_pad/mode_pad.cpp @@ -0,0 +1,128 @@ +/* +* CBC Padding Methods +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Default amount of padding +*/ +u32bit BlockCipherModePaddingMethod::pad_bytes(u32bit bs, u32bit pos) const + { + return (bs - pos); + } + +/* +* Pad with PKCS #7 Method +*/ +void PKCS7_Padding::pad(byte block[], u32bit size, u32bit position) const + { + for(u32bit j = 0; j != size; ++j) + block[j] = (size-position); + } + +/* +* Unpad with PKCS #7 Method +*/ +u32bit PKCS7_Padding::unpad(const byte block[], u32bit size) const + { + u32bit position = block[size-1]; + if(position > size) + throw Decoding_Error(name()); + for(u32bit j = size-position; j != size-1; ++j) + if(block[j] != position) + throw Decoding_Error(name()); + return (size-position); + } + +/* +* Query if the size is valid for this method +*/ +bool PKCS7_Padding::valid_blocksize(u32bit size) const + { + if(size > 0 && size < 256) + return true; + else + return false; + } + +/* +* Pad with ANSI X9.23 Method +*/ +void ANSI_X923_Padding::pad(byte block[], u32bit size, u32bit position) const + { + for(u32bit j = 0; j != size-position; ++j) + block[j] = 0; + block[size-position-1] = (size-position); + } + +/* +* Unpad with ANSI X9.23 Method +*/ +u32bit ANSI_X923_Padding::unpad(const byte block[], u32bit size) const + { + u32bit position = block[size-1]; + if(position > size) + throw Decoding_Error(name()); + for(u32bit j = size-position; j != size-1; ++j) + if(block[j] != 0) + throw Decoding_Error(name()); + return (size-position); + } + +/* +* Query if the size is valid for this method +*/ +bool ANSI_X923_Padding::valid_blocksize(u32bit size) const + { + if(size > 0 && size < 256) + return true; + else + return false; + } + +/* +* Pad with One and Zeros Method +*/ +void OneAndZeros_Padding::pad(byte block[], u32bit size, u32bit) const + { + block[0] = 0x80; + for(u32bit j = 1; j != size; ++j) + block[j] = 0x00; + } + +/* +* Unpad with One and Zeros Method +*/ +u32bit OneAndZeros_Padding::unpad(const byte block[], u32bit size) const + { + while(size) + { + if(block[size-1] == 0x80) + break; + if(block[size-1] != 0x00) + throw Decoding_Error(name()); + size--; + } + if(!size) + throw Decoding_Error(name()); + return (size-1); + } + +/* +* Query if the size is valid for this method +*/ +bool OneAndZeros_Padding::valid_blocksize(u32bit size) const + { + if(size) return true; + else return false; + } + +} diff --git a/src/libs/3rdparty/botan/src/modes/mode_pad/mode_pad.h b/src/libs/3rdparty/botan/src/modes/mode_pad/mode_pad.h new file mode 100644 index 00000000000..a486d3c1fc4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/mode_pad/mode_pad.h @@ -0,0 +1,120 @@ +/** +* CBC Padding Methods +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CBC_PADDING_H__ +#define BOTAN_CBC_PADDING_H__ + +#include +#include + +namespace Botan { + +/** +* Block Cipher Mode Padding Method +* This class is pretty limited, it cannot deal well with +* randomized padding methods, or any padding method that +* wants to add more than one block. For instance, it should +* be possible to define cipher text stealing mode as simply +* a padding mode for CBC, which happens to consume the last +* two block (and requires use of the block cipher). +*/ +class BOTAN_DLL BlockCipherModePaddingMethod + { + public: + /** + * @param block output buffer + * @param size of the block + * @param current_position in the last block + */ + virtual void pad(byte block[], + u32bit size, + u32bit current_position) const = 0; + + /** + * @param block the last block + * @param size the of the block + */ + virtual u32bit unpad(const byte block[], + u32bit size) const = 0; + + /** + * @param block_size of the cipher + * @param position in the current block + * @return number of padding bytes that will be appended + */ + virtual u32bit pad_bytes(u32bit block_size, + u32bit position) const; + + /** + * @param block_size of the cipher + * @return valid block size for this padding mode + */ + virtual bool valid_blocksize(u32bit block_size) const = 0; + + /** + * @return name of the mode + */ + virtual std::string name() const = 0; + + /** + * virtual destructor + */ + virtual ~BlockCipherModePaddingMethod() {} + }; + +/** +* PKCS#7 Padding +*/ +class BOTAN_DLL PKCS7_Padding : public BlockCipherModePaddingMethod + { + public: + void pad(byte[], u32bit, u32bit) const; + u32bit unpad(const byte[], u32bit) const; + bool valid_blocksize(u32bit) const; + std::string name() const { return "PKCS7"; } + }; + +/** +* ANSI X9.23 Padding +*/ +class BOTAN_DLL ANSI_X923_Padding : public BlockCipherModePaddingMethod + { + public: + void pad(byte[], u32bit, u32bit) const; + u32bit unpad(const byte[], u32bit) const; + bool valid_blocksize(u32bit) const; + std::string name() const { return "X9.23"; } + }; + +/** +* One And Zeros Padding +*/ +class BOTAN_DLL OneAndZeros_Padding : public BlockCipherModePaddingMethod + { + public: + void pad(byte[], u32bit, u32bit) const; + u32bit unpad(const byte[], u32bit) const; + bool valid_blocksize(u32bit) const; + std::string name() const { return "OneAndZeros"; } + }; + +/** +* Null Padding +*/ +class BOTAN_DLL Null_Padding : public BlockCipherModePaddingMethod + { + public: + void pad(byte[], u32bit, u32bit) const { return; } + u32bit unpad(const byte[], u32bit size) const { return size; } + u32bit pad_bytes(u32bit, u32bit) const { return 0; } + bool valid_blocksize(u32bit) const { return true; } + std::string name() const { return "NoPadding"; } + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/modes/modebase.cpp b/src/libs/3rdparty/botan/src/modes/modebase.cpp new file mode 100644 index 00000000000..8293acc5484 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/modebase.cpp @@ -0,0 +1,54 @@ +/* +* Block Cipher Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Block Cipher Mode Constructor +*/ +BlockCipherMode::BlockCipherMode(BlockCipher* cipher_ptr, + const std::string& cipher_mode_name, + u32bit iv_size, u32bit iv_meth, + u32bit buf_mult) : + BLOCK_SIZE(cipher_ptr->BLOCK_SIZE), BUFFER_SIZE(buf_mult * BLOCK_SIZE), + IV_METHOD(iv_meth), mode_name(cipher_mode_name) + { + base_ptr = cipher = cipher_ptr; + buffer.create(BUFFER_SIZE); + state.create(iv_size); + position = 0; + } + +/* +* Return the name of this type +*/ +std::string BlockCipherMode::name() const + { + return (cipher->name() + "/" + mode_name); + } + +/* +* Set the IV +*/ +void BlockCipherMode::set_iv(const InitializationVector& new_iv) + { + if(new_iv.length() != state.size()) + throw Invalid_IV_Length(name(), new_iv.length()); + + state = new_iv.bits_of(); + buffer.clear(); + position = 0; + + if(IV_METHOD == 1) + cipher->encrypt(state, buffer); + else if(IV_METHOD == 2) + cipher->encrypt(state); + } + +} diff --git a/src/libs/3rdparty/botan/src/modes/modebase.h b/src/libs/3rdparty/botan/src/modes/modebase.h new file mode 100644 index 00000000000..173fde58cb0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/modebase.h @@ -0,0 +1,39 @@ +/* +* Block Cipher Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MODEBASE_H__ +#define BOTAN_MODEBASE_H__ + +#include +#include + +namespace Botan { + +/** +* This class represents an abstract block cipher mode +*/ +class BOTAN_DLL BlockCipherMode : public Keyed_Filter + { + public: + std::string name() const; + + BlockCipherMode(BlockCipher*, const std::string&, + u32bit, u32bit = 0, u32bit = 1); + + virtual ~BlockCipherMode() { delete cipher; } + protected: + void set_iv(const InitializationVector&); + const u32bit BLOCK_SIZE, BUFFER_SIZE, IV_METHOD; + const std::string mode_name; + BlockCipher* cipher; + SecureVector buffer, state; + u32bit position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/modes/ofb/info.txt b/src/libs/3rdparty/botan/src/modes/ofb/info.txt new file mode 100644 index 00000000000..3cba4151eb9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/ofb/info.txt @@ -0,0 +1,14 @@ +realname "OFB block cipher mode" + +define OFB + +load_on auto + + +ofb.cpp +ofb.h + + + +block + diff --git a/src/libs/3rdparty/botan/src/modes/ofb/ofb.cpp b/src/libs/3rdparty/botan/src/modes/ofb/ofb.cpp new file mode 100644 index 00000000000..cb40fdeaa23 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/ofb/ofb.cpp @@ -0,0 +1,66 @@ +/* +* OFB Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* OFB Constructor +*/ +OFB::OFB(BlockCipher* ciph) : + BlockCipherMode(ciph, "OFB", ciph->BLOCK_SIZE, 2) + { + } + +/* +* OFB Constructor +*/ +OFB::OFB(BlockCipher* ciph, const SymmetricKey& key, + const InitializationVector& iv) : + BlockCipherMode(ciph, "OFB", ciph->BLOCK_SIZE, 2) + { + set_key(key); + set_iv(iv); + } + +/* +* OFB Encryption/Decryption +*/ +void OFB::write(const byte input[], u32bit length) + { + u32bit copied = std::min(BLOCK_SIZE - position, length); + xor_buf(buffer, input, state + position, copied); + send(buffer, copied); + input += copied; + length -= copied; + position += copied; + + if(position == BLOCK_SIZE) + { + cipher->encrypt(state); + position = 0; + } + + while(length >= BLOCK_SIZE) + { + xor_buf(buffer, input, state, BLOCK_SIZE); + send(buffer, BLOCK_SIZE); + + input += BLOCK_SIZE; + length -= BLOCK_SIZE; + cipher->encrypt(state); + } + + xor_buf(buffer, input, state + position, length); + send(buffer, length); + position += length; + } + +} diff --git a/src/libs/3rdparty/botan/src/modes/ofb/ofb.h b/src/libs/3rdparty/botan/src/modes/ofb/ofb.h new file mode 100644 index 00000000000..a3aadc137b7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/ofb/ofb.h @@ -0,0 +1,33 @@ +/* +* OFB Mode +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_OUTPUT_FEEDBACK_MODE_H__ +#define BOTAN_OUTPUT_FEEDBACK_MODE_H__ + +#include +#include + +namespace Botan { + +/* +* OFB Mode +*/ +class BOTAN_DLL OFB : public BlockCipherMode + { + public: + OFB(BlockCipher* cipher); + + OFB(BlockCipher* cipher, + const SymmetricKey& key, + const InitializationVector& iv); + private: + void write(const byte[], u32bit); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/modes/xts/info.txt b/src/libs/3rdparty/botan/src/modes/xts/info.txt new file mode 100644 index 00000000000..65c7df2f824 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/xts/info.txt @@ -0,0 +1,15 @@ +realname "XTS block cipher mode" + +define XTS + +load_on auto + + +xts.cpp +xts.h + + + +block +filters + diff --git a/src/libs/3rdparty/botan/src/modes/xts/xts.cpp b/src/libs/3rdparty/botan/src/modes/xts/xts.cpp new file mode 100644 index 00000000000..8780ae166d0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/xts/xts.cpp @@ -0,0 +1,344 @@ +/* +* XTS Mode +* (C) 2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +namespace { + +void poly_double(byte tweak[], u32bit size) + { + const byte polynomial = 0x87; // for 128 bit ciphers + + byte carry = 0; + for(u32bit i = 0; i != size; ++i) + { + byte carry2 = (tweak[i] >> 7); + tweak[i] = (tweak[i] << 1) | carry; + carry = carry2; + } + + if(carry) + tweak[0] ^= polynomial; + } + +} + +/* +* XTS_Encryption constructor +*/ +XTS_Encryption::XTS_Encryption(BlockCipher* ciph) : cipher(ciph) + { + if(cipher->BLOCK_SIZE != 16) + throw std::invalid_argument("Bad cipher for XTS: " + cipher->name()); + + cipher2 = cipher->clone(); + tweak.create(cipher->BLOCK_SIZE); + buffer.create(2 * cipher->BLOCK_SIZE); + position = 0; + } + +/* +* XTS_Encryption constructor +*/ +XTS_Encryption::XTS_Encryption(BlockCipher* ciph, + const SymmetricKey& key, + const InitializationVector& iv) : cipher(ciph) + { + if(cipher->BLOCK_SIZE != 16) + throw std::invalid_argument("Bad cipher for XTS: " + cipher->name()); + + cipher2 = cipher->clone(); + tweak.create(cipher->BLOCK_SIZE); + buffer.create(2 * cipher->BLOCK_SIZE); + position = 0; + + set_key(key); + set_iv(iv); + } + +/* +* Return the name +*/ +std::string XTS_Encryption::name() const + { + return (cipher->name() + "/XTS"); + } + +/* +* Set new tweak +*/ +void XTS_Encryption::set_iv(const InitializationVector& iv) + { + if(iv.length() != tweak.size()) + throw Invalid_IV_Length(name(), iv.length()); + + tweak = iv.bits_of(); + cipher2->encrypt(tweak); + } + +void XTS_Encryption::set_key(const SymmetricKey& key) + { + u32bit key_half = key.length() / 2; + + if(key.length() % 2 == 1 || !cipher->valid_keylength(key_half)) + throw Invalid_Key_Length(name(), key.length()); + + cipher->set_key(key.begin(), key_half); + cipher2->set_key(key.begin() + key_half, key_half); + } + +void XTS_Encryption::encrypt(const byte block[]) + { + /* + * We can always use the first 16 bytes of buffer as temp space, + * since either the input block is buffer (in which case this is + * just buffer ^= tweak) or it not, in which case we already read + * and used the data there and are processing new input. Kind of + * subtle/nasty, but saves allocating a distinct temp buf. + */ + + xor_buf(buffer, block, tweak, cipher->BLOCK_SIZE); + cipher->encrypt(buffer); + xor_buf(buffer, tweak, cipher->BLOCK_SIZE); + + poly_double(tweak, cipher->BLOCK_SIZE); + + send(buffer, cipher->BLOCK_SIZE); + } + +/* +* Encrypt in XTS mode +*/ +void XTS_Encryption::write(const byte input[], u32bit length) + { + const u32bit BLOCK_SIZE = cipher->BLOCK_SIZE; + + u32bit copied = std::min(buffer.size() - position, length); + buffer.copy(position, input, copied); + length -= copied; + input += copied; + position += copied; + + if(length == 0) return; + + encrypt(buffer); + if(length > BLOCK_SIZE) + { + encrypt(buffer + BLOCK_SIZE); + while(length > buffer.size()) + { + encrypt(input); + length -= BLOCK_SIZE; + input += BLOCK_SIZE; + } + position = 0; + } + else + { + copy_mem(buffer.begin(), buffer + BLOCK_SIZE, BLOCK_SIZE); + position = BLOCK_SIZE; + } + buffer.copy(position, input, length); + position += length; + } + +/* +* Finish encrypting in XTS mode +*/ +void XTS_Encryption::end_msg() + { + const u32bit BLOCK_SIZE = cipher->BLOCK_SIZE; + + if(position < BLOCK_SIZE) + throw Exception("XTS_Encryption: insufficient data to encrypt"); + else if(position == BLOCK_SIZE) + { + encrypt(buffer); + } + else if(position == 2*BLOCK_SIZE) + { + encrypt(buffer); + encrypt(buffer + BLOCK_SIZE); + } + else + { // steal ciphertext + xor_buf(buffer, tweak, cipher->BLOCK_SIZE); + cipher->encrypt(buffer); + xor_buf(buffer, tweak, cipher->BLOCK_SIZE); + + poly_double(tweak, cipher->BLOCK_SIZE); + + for(u32bit i = 0; i != position - cipher->BLOCK_SIZE; ++i) + std::swap(buffer[i], buffer[i + cipher->BLOCK_SIZE]); + + xor_buf(buffer, tweak, cipher->BLOCK_SIZE); + cipher->encrypt(buffer); + xor_buf(buffer, tweak, cipher->BLOCK_SIZE); + + send(buffer, position); + } + + position = 0; + } + +/* +* XTS_Decryption constructor +*/ +XTS_Decryption::XTS_Decryption(BlockCipher* ciph) + { + cipher = ciph; + cipher2 = ciph->clone(); + tweak.create(cipher->BLOCK_SIZE); + buffer.create(2 * cipher->BLOCK_SIZE); + position = 0; + } + +/* +* XTS_Decryption constructor +*/ +XTS_Decryption::XTS_Decryption(BlockCipher* ciph, + const SymmetricKey& key, + const InitializationVector& iv) + { + cipher = ciph; + cipher2 = ciph->clone(); + tweak.create(cipher->BLOCK_SIZE); + buffer.create(2 * cipher->BLOCK_SIZE); + position = 0; + + set_key(key); + set_iv(iv); + } + +/* +* Return the name +*/ +std::string XTS_Decryption::name() const + { + return (cipher->name() + "/XTS"); + } + +/* +* Set new tweak +*/ +void XTS_Decryption::set_iv(const InitializationVector& iv) + { + if(iv.length() != tweak.size()) + throw Invalid_IV_Length(name(), iv.length()); + + tweak = iv.bits_of(); + cipher2->encrypt(tweak); + } + +void XTS_Decryption::set_key(const SymmetricKey& key) + { + u32bit key_half = key.length() / 2; + + if(key.length() % 2 == 1 || !cipher->valid_keylength(key_half)) + throw Invalid_Key_Length(name(), key.length()); + + cipher->set_key(key.begin(), key_half); + cipher2->set_key(key.begin() + key_half, key_half); + } + +/* +* Decrypt a block +*/ +void XTS_Decryption::decrypt(const byte block[]) + { + xor_buf(buffer, block, tweak, cipher->BLOCK_SIZE); + cipher->decrypt(buffer); + xor_buf(buffer, tweak, cipher->BLOCK_SIZE); + + poly_double(tweak, cipher->BLOCK_SIZE); + + send(buffer, cipher->BLOCK_SIZE); + } + +/* +* Decrypt in XTS mode +*/ +void XTS_Decryption::write(const byte input[], u32bit length) + { + const u32bit BLOCK_SIZE = cipher->BLOCK_SIZE; + + u32bit copied = std::min(buffer.size() - position, length); + buffer.copy(position, input, copied); + length -= copied; + input += copied; + position += copied; + + if(length == 0) return; + + decrypt(buffer); + if(length > BLOCK_SIZE) + { + decrypt(buffer + BLOCK_SIZE); + while(length > 2*BLOCK_SIZE) + { + decrypt(input); + length -= BLOCK_SIZE; + input += BLOCK_SIZE; + } + position = 0; + } + else + { + copy_mem(buffer.begin(), buffer + BLOCK_SIZE, BLOCK_SIZE); + position = BLOCK_SIZE; + } + buffer.copy(position, input, length); + position += length; + } + +/* +* Finish decrypting in XTS mode +*/ +void XTS_Decryption::end_msg() + { + const u32bit BLOCK_SIZE = cipher->BLOCK_SIZE; + + if(position < BLOCK_SIZE) + throw Exception("XTS_Decryption: insufficient data to decrypt"); + else if(position == BLOCK_SIZE) + { + decrypt(buffer); + } + else if(position == 2*BLOCK_SIZE) + { + decrypt(buffer); + decrypt(buffer + BLOCK_SIZE); + } + else + { + SecureVector tweak2 = tweak; + + poly_double(tweak2, cipher->BLOCK_SIZE); + + xor_buf(buffer, tweak2, cipher->BLOCK_SIZE); + cipher->decrypt(buffer); + xor_buf(buffer, tweak2, cipher->BLOCK_SIZE); + + for(u32bit i = 0; i != position - cipher->BLOCK_SIZE; ++i) + std::swap(buffer[i], buffer[i + cipher->BLOCK_SIZE]); + + xor_buf(buffer, tweak, cipher->BLOCK_SIZE); + cipher->decrypt(buffer); + xor_buf(buffer, tweak, cipher->BLOCK_SIZE); + + send(buffer, position); + } + + position = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/modes/xts/xts.h b/src/libs/3rdparty/botan/src/modes/xts/xts.h new file mode 100644 index 00000000000..01558175bea --- /dev/null +++ b/src/libs/3rdparty/botan/src/modes/xts/xts.h @@ -0,0 +1,76 @@ +/* +* XTS mode, from IEEE P1619 +* (C) 2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_XTS_H__ +#define BOTAN_XTS_H__ + +#include +#include + +namespace Botan { + +/* +* XTS Encryption +*/ +class BOTAN_DLL XTS_Encryption : public Keyed_Filter + { + public: + void set_key(const SymmetricKey& key); + void set_iv(const InitializationVector& iv); + + std::string name() const; + + XTS_Encryption(BlockCipher* ciph); + + XTS_Encryption(BlockCipher* ciph, + const SymmetricKey& key, + const InitializationVector& iv); + + ~XTS_Encryption() { delete cipher; delete cipher2; } + private: + void write(const byte[], u32bit); + void end_msg(); + void encrypt(const byte block[]); + + BlockCipher* cipher; + BlockCipher* cipher2; + SecureVector tweak; + SecureVector buffer; + u32bit position; + }; + +/* +* XTS Decryption +*/ +class BOTAN_DLL XTS_Decryption : public Keyed_Filter + { + public: + void set_key(const SymmetricKey& key); + void set_iv(const InitializationVector& iv); + + std::string name() const; + + XTS_Decryption(BlockCipher* ciph); + + XTS_Decryption(BlockCipher* ciph, + const SymmetricKey& key, + const InitializationVector& iv); + private: + void write(const byte[], u32bit); + void end_msg(); + void decrypt(const byte[]); + + BlockCipher* cipher; + BlockCipher* cipher2; + SecureVector tweak; + SecureVector buffer; + u32bit position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/mutex/info.txt b/src/libs/3rdparty/botan/src/mutex/info.txt new file mode 100644 index 00000000000..ff79bf753d5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/info.txt @@ -0,0 +1,9 @@ +realname "Mutex Wrappers" + +define MUTEX_WRAPPERS + +load_on auto + + +mutex.h + diff --git a/src/libs/3rdparty/botan/src/mutex/mutex.h b/src/libs/3rdparty/botan/src/mutex/mutex.h new file mode 100644 index 00000000000..a04ff83c966 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/mutex.h @@ -0,0 +1,56 @@ +/* +* Mutex +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MUTEX_H__ +#define BOTAN_MUTEX_H__ + +#include + +namespace Botan { + +/* +* Mutex Base Class +*/ +class BOTAN_DLL Mutex + { + public: + virtual void lock() = 0; + virtual void unlock() = 0; + virtual ~Mutex() {} + }; + +/* +* Mutex Factory +*/ +class BOTAN_DLL Mutex_Factory + { + public: + virtual Mutex* make() = 0; + virtual ~Mutex_Factory() {} + }; + +/* +* Mutex Holding Class +*/ +class BOTAN_DLL Mutex_Holder + { + public: + Mutex_Holder(Mutex* m) : mux(m) + { + if(!mux) + throw Invalid_Argument("Mutex_Holder: Argument was NULL"); + mux->lock(); + } + + ~Mutex_Holder() { mux->unlock(); } + private: + Mutex* mux; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/mutex/noop_mutex/info.txt b/src/libs/3rdparty/botan/src/mutex/noop_mutex/info.txt new file mode 100644 index 00000000000..1f49f5e1ccf --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/noop_mutex/info.txt @@ -0,0 +1,10 @@ +realname "No-Op Mutex" + +load_on auto + +define MUTEX_NOOP + + +mux_noop.cpp +mux_noop.h + diff --git a/src/libs/3rdparty/botan/src/mutex/noop_mutex/mux_noop.cpp b/src/libs/3rdparty/botan/src/mutex/noop_mutex/mux_noop.cpp new file mode 100644 index 00000000000..5c45084feb0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/noop_mutex/mux_noop.cpp @@ -0,0 +1,50 @@ +/* +* No-Op Mutex Factory +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* No-Op Mutex Factory +*/ +Mutex* Noop_Mutex_Factory::make() + { + class Noop_Mutex : public Mutex + { + public: + class Mutex_State_Error : public Internal_Error + { + public: + Mutex_State_Error(const std::string& where) : + Internal_Error("Noop_Mutex::" + where + ": " + + "Mutex is already " + where + "ed") {} + }; + + void lock() + { + if(locked) + throw Mutex_State_Error("lock"); + locked = true; + } + + void unlock() + { + if(!locked) + throw Mutex_State_Error("unlock"); + locked = false; + } + + Noop_Mutex() { locked = false; } + private: + bool locked; + }; + + return new Noop_Mutex; + } + +} diff --git a/src/libs/3rdparty/botan/src/mutex/noop_mutex/mux_noop.h b/src/libs/3rdparty/botan/src/mutex/noop_mutex/mux_noop.h new file mode 100644 index 00000000000..94201cb7c2a --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/noop_mutex/mux_noop.h @@ -0,0 +1,26 @@ +/* +* No-Op Mutex Factory +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_NOOP_MUTEX_FACTORY_H__ +#define BOTAN_NOOP_MUTEX_FACTORY_H__ + +#include + +namespace Botan { + +/* +* No-Op Mutex Factory +*/ +class BOTAN_DLL Noop_Mutex_Factory : public Mutex_Factory + { + public: + Mutex* make(); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/mutex/pthreads/info.txt b/src/libs/3rdparty/botan/src/mutex/pthreads/info.txt new file mode 100644 index 00000000000..f135dea4817 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/pthreads/info.txt @@ -0,0 +1,30 @@ +realname "Pthread Mutex" + +define MUTEX_PTHREAD + +load_on auto + + +mux_pthr.cpp +mux_pthr.h + + + +all!qnx,freebsd,dragonfly,openbsd,netbsd -> pthread + + + +aix +cygwin +darwin +freebsd +dragonfly +hpux +irix +linux +netbsd +openbsd +qnx +solaris +tru64 + diff --git a/src/libs/3rdparty/botan/src/mutex/pthreads/mux_pthr.cpp b/src/libs/3rdparty/botan/src/mutex/pthreads/mux_pthr.cpp new file mode 100644 index 00000000000..9f1d9816e46 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/pthreads/mux_pthr.cpp @@ -0,0 +1,58 @@ +/* +* Pthread Mutex +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +#ifndef _POSIX_C_SOURCE + #define _POSIX_C_SOURCE 199506 +#endif + +#include + +namespace Botan { + +/* +* Pthread Mutex Factory +*/ +Mutex* Pthread_Mutex_Factory::make() + { + + class Pthread_Mutex : public Mutex + { + public: + void lock() + { + if(pthread_mutex_lock(&mutex) != 0) + throw Exception("Pthread_Mutex::lock: Error occured"); + } + + void unlock() + { + if(pthread_mutex_unlock(&mutex) != 0) + throw Exception("Pthread_Mutex::unlock: Error occured"); + } + + Pthread_Mutex() + { + if(pthread_mutex_init(&mutex, 0) != 0) + throw Exception("Pthread_Mutex: initialization failed"); + } + + ~Pthread_Mutex() + { + if(pthread_mutex_destroy(&mutex) != 0) + throw Invalid_State("~Pthread_Mutex: mutex is still locked"); + } + private: + pthread_mutex_t mutex; + }; + + return new Pthread_Mutex(); + } + +} diff --git a/src/libs/3rdparty/botan/src/mutex/pthreads/mux_pthr.h b/src/libs/3rdparty/botan/src/mutex/pthreads/mux_pthr.h new file mode 100644 index 00000000000..118853947e2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/pthreads/mux_pthr.h @@ -0,0 +1,26 @@ +/* +* Pthread Mutex +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MUTEX_PTHREAD_H__ +#define BOTAN_MUTEX_PTHREAD_H__ + +#include + +namespace Botan { + +/* +* Pthread Mutex Factory +*/ +class BOTAN_DLL Pthread_Mutex_Factory : public Mutex_Factory + { + public: + Mutex* make(); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/mutex/qt_mutex/info.txt b/src/libs/3rdparty/botan/src/mutex/qt_mutex/info.txt new file mode 100644 index 00000000000..a21108c798a --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/qt_mutex/info.txt @@ -0,0 +1,18 @@ +realname "Qt Mutex" + +define MUTEX_QT + +note "You'll probably have to add -I/-L flags to the Makefile to find Qt" + +load_on request + + +mux_qt.cpp +mux_qt.h + + +# I think we want to always use qt-mt, not qt -- not much point in supporting +# mutexes in a single threaded application, after all. + +all -> qt-mt + diff --git a/src/libs/3rdparty/botan/src/mutex/qt_mutex/mux_qt.cpp b/src/libs/3rdparty/botan/src/mutex/qt_mutex/mux_qt.cpp new file mode 100644 index 00000000000..0f670c8b4b2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/qt_mutex/mux_qt.cpp @@ -0,0 +1,35 @@ +/* +* Qt Thread Mutex +* (C) 2004-2007 Justin Karneges +* 2004-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +#if !defined(QT_THREAD_SUPPORT) + #error Your version of Qt does not support threads or mutexes +#endif + +namespace Botan { + +/* +* Qt Mutex Factory +*/ +Mutex* Qt_Mutex_Factory::make() + { + class Qt_Mutex : public Mutex + { + public: + void lock() { mutex.lock(); } + void unlock() { mutex.unlock(); } + private: + QMutex mutex; + }; + + return new Qt_Mutex(); + } + +} diff --git a/src/libs/3rdparty/botan/src/mutex/qt_mutex/mux_qt.h b/src/libs/3rdparty/botan/src/mutex/qt_mutex/mux_qt.h new file mode 100644 index 00000000000..5aed77f4b1f --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/qt_mutex/mux_qt.h @@ -0,0 +1,27 @@ +/* +* Qt Mutex +* (C) 2004-2007 Justin Karneges +* 2004-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MUTEX_QT_H__ +#define BOTAN_MUTEX_QT_H__ + +#include + +namespace Botan { + +/* +* Qt Mutex +*/ +class BOTAN_DLL Qt_Mutex_Factory : public Mutex_Factory + { + public: + Mutex* make(); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/mutex/win32_crit_section/info.txt b/src/libs/3rdparty/botan/src/mutex/win32_crit_section/info.txt new file mode 100644 index 00000000000..a2d339c3bb0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/win32_crit_section/info.txt @@ -0,0 +1,17 @@ +realname "Win32 Mutex" + +define MUTEX_WIN32 +modset win32 + +load_on auto + + +mux_win32.cpp +mux_win32.h + + + +cygwin +windows +mingw + diff --git a/src/libs/3rdparty/botan/src/mutex/win32_crit_section/mux_win32.cpp b/src/libs/3rdparty/botan/src/mutex/win32_crit_section/mux_win32.cpp new file mode 100644 index 00000000000..2a967892ba4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/win32_crit_section/mux_win32.cpp @@ -0,0 +1,34 @@ +/* +* Win32 Mutex +* (C) 2006 Luca Piccarreta +* 2006-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Win32 Mutex Factory +*/ +Mutex* Win32_Mutex_Factory::make() + { + class Win32_Mutex : public Mutex + { + public: + void lock() { EnterCriticalSection(&mutex); } + void unlock() { LeaveCriticalSection(&mutex); } + + Win32_Mutex() { InitializeCriticalSection(&mutex); } + ~Win32_Mutex() { DeleteCriticalSection(&mutex); } + private: + CRITICAL_SECTION mutex; + }; + + return new Win32_Mutex(); + } + +} diff --git a/src/libs/3rdparty/botan/src/mutex/win32_crit_section/mux_win32.h b/src/libs/3rdparty/botan/src/mutex/win32_crit_section/mux_win32.h new file mode 100644 index 00000000000..a91850e7161 --- /dev/null +++ b/src/libs/3rdparty/botan/src/mutex/win32_crit_section/mux_win32.h @@ -0,0 +1,26 @@ +/* +* Win32 Mutex +* (C) 2006 Luca Piccarreta +* 2006-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MUTEX_WIN32_H__ +#define BOTAN_MUTEX_WIN32_H__ + +#include + +namespace Botan { + +/* +* Win32 Mutex Factory +*/ +class BOTAN_DLL Win32_Mutex_Factory : public Mutex_Factory + { + public: + Mutex* make(); + }; +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pbe/get_pbe.cpp b/src/libs/3rdparty/botan/src/pbe/get_pbe.cpp new file mode 100644 index 00000000000..3217101efc2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pbe/get_pbe.cpp @@ -0,0 +1,130 @@ +/* +* PBE Retrieval +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +#if defined(BOTAN_HAS_PBE_PKCS_V15) + #include +#endif + +#if defined(BOTAN_HAS_PBE_PKCS_V20) + #include +#endif + +namespace Botan { + +/* +* Get an encryption PBE, set new parameters +*/ +PBE* get_pbe(const std::string& algo_spec) + { + SCAN_Name request(algo_spec); + + const std::string pbe = request.algo_name(); + std::string digest_name = request.arg(0); + const std::string cipher = request.arg(1); + + std::vector cipher_spec = split_on(cipher, '/'); + if(cipher_spec.size() != 2) + throw Invalid_Argument("PBE: Invalid cipher spec " + cipher); + + const std::string cipher_algo = global_state().deref_alias(cipher_spec[0]); + const std::string cipher_mode = cipher_spec[1]; + + if(cipher_mode != "CBC") + throw Invalid_Argument("PBE: Invalid cipher mode " + cipher); + + Algorithm_Factory& af = global_state().algorithm_factory(); + + const BlockCipher* block_cipher = af.prototype_block_cipher(cipher_algo); + if(!block_cipher) + throw Algorithm_Not_Found(cipher_algo); + + const HashFunction* hash_function = af.prototype_hash_function(digest_name); + if(!hash_function) + throw Algorithm_Not_Found(digest_name); + + if(request.arg_count() != 2) + throw Invalid_Algorithm_Name(algo_spec); + +#if defined(BOTAN_HAS_PBE_PKCS_V15) + if(pbe == "PBE-PKCS5v15") + return new PBE_PKCS5v15(block_cipher->clone(), + hash_function->clone(), + ENCRYPTION); +#endif + +#if defined(BOTAN_HAS_PBE_PKCS_V20) + if(pbe == "PBE-PKCS5v20") + return new PBE_PKCS5v20(block_cipher->clone(), + hash_function->clone()); +#endif + + throw Algorithm_Not_Found(algo_spec); + } + +/* +* Get a decryption PBE, decode parameters +*/ +PBE* get_pbe(const OID& pbe_oid, DataSource& params) + { + SCAN_Name request(OIDS::lookup(pbe_oid)); + + const std::string pbe = request.algo_name(); + +#if defined(BOTAN_HAS_PBE_PKCS_V15) + if(pbe == "PBE-PKCS5v15") + { + if(request.arg_count() != 2) + throw Invalid_Algorithm_Name(request.as_string()); + + std::string digest_name = request.arg(0); + const std::string cipher = request.arg(1); + + std::vector cipher_spec = split_on(cipher, '/'); + if(cipher_spec.size() != 2) + throw Invalid_Argument("PBE: Invalid cipher spec " + cipher); + + const std::string cipher_algo = global_state().deref_alias(cipher_spec[0]); + const std::string cipher_mode = cipher_spec[1]; + + if(cipher_mode != "CBC") + throw Invalid_Argument("PBE: Invalid cipher mode " + cipher); + + Algorithm_Factory& af = global_state().algorithm_factory(); + + const BlockCipher* block_cipher = af.prototype_block_cipher(cipher_algo); + if(!block_cipher) + throw Algorithm_Not_Found(cipher_algo); + + const HashFunction* hash_function = + af.prototype_hash_function(digest_name); + + if(!hash_function) + throw Algorithm_Not_Found(digest_name); + + PBE* pbe = new PBE_PKCS5v15(block_cipher->clone(), + hash_function->clone(), + DECRYPTION); + pbe->decode_params(params); + return pbe; + } +#endif + +#if defined(BOTAN_HAS_PBE_PKCS_V20) + if(pbe == "PBE-PKCS5v20") + return new PBE_PKCS5v20(params); +#endif + + throw Algorithm_Not_Found(pbe_oid.as_string()); + } + +} diff --git a/src/libs/3rdparty/botan/src/pbe/get_pbe.h b/src/libs/3rdparty/botan/src/pbe/get_pbe.h new file mode 100644 index 00000000000..04eda66968f --- /dev/null +++ b/src/libs/3rdparty/botan/src/pbe/get_pbe.h @@ -0,0 +1,33 @@ +/* +* PBE Lookup +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_LOOKUP_PBE_H__ +#define BOTAN_LOOKUP_PBE_H__ + +#include +#include + +namespace Botan { + +/** +* Factory function for PBEs. +* @param algo_spec the name of the PBE algorithm to retrieve +* @return a pointer to a PBE with randomly created parameters +*/ +BOTAN_DLL PBE* get_pbe(const std::string&); + +/** +* Factory function for PBEs. +* @param pbe_oid the oid of the desired PBE +* @param params a DataSource providing the DER encoded parameters to use +* @return a pointer to the PBE with the specified parameters +*/ +BOTAN_DLL PBE* get_pbe(const OID&, DataSource&); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pbe/info.txt b/src/libs/3rdparty/botan/src/pbe/info.txt new file mode 100644 index 00000000000..c4210b2a7d7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pbe/info.txt @@ -0,0 +1,16 @@ +realname "PBE Base" + +load_on dep + +define PASSWORD_BASED_ENCRYPTION + + +get_pbe.cpp +get_pbe.h + + + +filters +libstate +oid_lookup + diff --git a/src/libs/3rdparty/botan/src/pbe/pbes1/info.txt b/src/libs/3rdparty/botan/src/pbe/pbes1/info.txt new file mode 100644 index 00000000000..70c6baeee5c --- /dev/null +++ b/src/libs/3rdparty/botan/src/pbe/pbes1/info.txt @@ -0,0 +1,19 @@ +realname "PKCS5 v1.5 PBE" + +define PBE_PKCS_V15 + +load_on auto + + +pbes1.cpp +pbes1.h + + + +asn1 +block +cbc +filters +hash +pbkdf1 + diff --git a/src/libs/3rdparty/botan/src/pbe/pbes1/pbes1.cpp b/src/libs/3rdparty/botan/src/pbe/pbes1/pbes1.cpp new file mode 100644 index 00000000000..21bd330ff1a --- /dev/null +++ b/src/libs/3rdparty/botan/src/pbe/pbes1/pbes1.cpp @@ -0,0 +1,184 @@ +/* +* PKCS #5 PBES1 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Encrypt some bytes using PBES1 +*/ +void PBE_PKCS5v15::write(const byte input[], u32bit length) + { + while(length) + { + u32bit put = std::min(DEFAULT_BUFFERSIZE, length); + pipe.write(input, length); + flush_pipe(true); + length -= put; + } + } + +/* +* Start encrypting with PBES1 +*/ +void PBE_PKCS5v15::start_msg() + { + if(direction == ENCRYPTION) + pipe.append(new CBC_Encryption(block_cipher->clone(), + new PKCS7_Padding, + key, iv)); + else + pipe.append(new CBC_Decryption(block_cipher->clone(), + new PKCS7_Padding, + key, iv)); + + pipe.start_msg(); + if(pipe.message_count() > 1) + pipe.set_default_msg(pipe.default_msg() + 1); + } + +/* +* Finish encrypting with PBES1 +*/ +void PBE_PKCS5v15::end_msg() + { + pipe.end_msg(); + flush_pipe(false); + pipe.reset(); + } + +/* +* Flush the pipe +*/ +void PBE_PKCS5v15::flush_pipe(bool safe_to_skip) + { + if(safe_to_skip && pipe.remaining() < 64) + return; + + SecureVector buffer(DEFAULT_BUFFERSIZE); + while(pipe.remaining()) + { + u32bit got = pipe.read(buffer, buffer.size()); + send(buffer, got); + } + } + +/* +* Set the passphrase to use +*/ +void PBE_PKCS5v15::set_key(const std::string& passphrase) + { + PKCS5_PBKDF1 pbkdf(hash_function->clone()); + + pbkdf.set_iterations(iterations); + pbkdf.change_salt(salt, salt.size()); + SymmetricKey key_and_iv = pbkdf.derive_key(16, passphrase); + + key.set(key_and_iv.begin(), 8); + iv.set(key_and_iv.begin() + 8, 8); + } + +/* +* Create a new set of PBES1 parameters +*/ +void PBE_PKCS5v15::new_params(RandomNumberGenerator& rng) + { + iterations = 2048; + salt.create(8); + rng.randomize(salt, salt.size()); + } + +/* +* Encode PKCS#5 PBES1 parameters +*/ +MemoryVector PBE_PKCS5v15::encode_params() const + { + return DER_Encoder() + .start_cons(SEQUENCE) + .encode(salt, OCTET_STRING) + .encode(iterations) + .end_cons() + .get_contents(); + } + +/* +* Decode PKCS#5 PBES1 parameters +*/ +void PBE_PKCS5v15::decode_params(DataSource& source) + { + BER_Decoder(source) + .start_cons(SEQUENCE) + .decode(salt, OCTET_STRING) + .decode(iterations) + .verify_end() + .end_cons(); + + if(salt.size() != 8) + throw Decoding_Error("PBES1: Encoded salt is not 8 octets"); + } + +/* +* Return an OID for this PBES1 type +*/ +OID PBE_PKCS5v15::get_oid() const + { + const OID base_pbes1_oid("1.2.840.113549.1.5"); + + const std::string cipher = block_cipher->name(); + const std::string digest = hash_function->name(); + + if(cipher == "DES" && digest == "MD2") + return (base_pbes1_oid + 1); + else if(cipher == "DES" && digest == "MD5") + return (base_pbes1_oid + 3); + else if(cipher == "DES" && digest == "SHA-160") + return (base_pbes1_oid + 10); + else if(cipher == "RC2" && digest == "MD2") + return (base_pbes1_oid + 4); + else if(cipher == "RC2" && digest == "MD5") + return (base_pbes1_oid + 6); + else if(cipher == "RC2" && digest == "SHA-160") + return (base_pbes1_oid + 11); + else + throw Internal_Error("PBE-PKCS5 v1.5: get_oid() has run out of options"); + } + +/* +* PKCS#5 v1.5 PBE Constructor +*/ +PBE_PKCS5v15::PBE_PKCS5v15(BlockCipher* cipher, + HashFunction* hash, + Cipher_Dir dir) : + direction(dir), block_cipher(cipher), hash_function(hash) + { + if(cipher->name() != "DES" && cipher->name() != "RC2") + { + throw Invalid_Argument("PBE_PKCS5v1.5: Unknown cipher " + + cipher->name()); + } + + if(hash->name() != "MD2" && hash->name() != "MD5" && + hash->name() != "SHA-160") + { + throw Invalid_Argument("PBE_PKCS5v1.5: Unknown hash " + + hash->name()); + } + } + +PBE_PKCS5v15::~PBE_PKCS5v15() + { + delete block_cipher; + delete hash_function; + } + +} diff --git a/src/libs/3rdparty/botan/src/pbe/pbes1/pbes1.h b/src/libs/3rdparty/botan/src/pbe/pbes1/pbes1.h new file mode 100644 index 00000000000..2e1855dc27a --- /dev/null +++ b/src/libs/3rdparty/botan/src/pbe/pbes1/pbes1.h @@ -0,0 +1,53 @@ +/* +* PKCS #5 v1.5 PBE +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PBE_PKCS_V15_H__ +#define BOTAN_PBE_PKCS_V15_H__ + +#include +#include +#include +#include + +namespace Botan { + +/* +* PKCS#5 v1.5 PBE +*/ +class BOTAN_DLL PBE_PKCS5v15 : public PBE + { + public: + void write(const byte[], u32bit); + void start_msg(); + void end_msg(); + + PBE_PKCS5v15(BlockCipher* cipher, + HashFunction* hash, + Cipher_Dir); + + ~PBE_PKCS5v15(); + private: + void set_key(const std::string&); + void new_params(RandomNumberGenerator& rng); + MemoryVector encode_params() const; + void decode_params(DataSource&); + OID get_oid() const; + + void flush_pipe(bool); + + Cipher_Dir direction; + BlockCipher* block_cipher; + HashFunction* hash_function; + + SecureVector salt, key, iv; + u32bit iterations; + Pipe pipe; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pbe/pbes2/info.txt b/src/libs/3rdparty/botan/src/pbe/pbes2/info.txt new file mode 100644 index 00000000000..cd37b1e69c3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pbe/pbes2/info.txt @@ -0,0 +1,23 @@ +realname "PKCS5 v2.0 PBE" + +define PBE_PKCS_V20 + +load_on auto + + +pbes2.cpp +pbes2.h + + + +algo_factory +asn1 +block +cbc +filters +hash +hmac +libstate +oid_lookup +pbkdf2 + diff --git a/src/libs/3rdparty/botan/src/pbe/pbes2/pbes2.cpp b/src/libs/3rdparty/botan/src/pbe/pbes2/pbes2.cpp new file mode 100644 index 00000000000..b7e2589d069 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pbe/pbes2/pbes2.cpp @@ -0,0 +1,239 @@ +/** +* PKCS #5 PBES2 +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* Encrypt some bytes using PBES2 +*/ +void PBE_PKCS5v20::write(const byte input[], u32bit length) + { + while(length) + { + u32bit put = std::min(DEFAULT_BUFFERSIZE, length); + pipe.write(input, length); + flush_pipe(true); + length -= put; + } + } + +/** +* Start encrypting with PBES2 +*/ +void PBE_PKCS5v20::start_msg() + { + if(direction == ENCRYPTION) + pipe.append(new CBC_Encryption(block_cipher->clone(), + new PKCS7_Padding, + key, iv)); + else + pipe.append(new CBC_Decryption(block_cipher->clone(), + new PKCS7_Padding, + key, iv)); + + pipe.start_msg(); + if(pipe.message_count() > 1) + pipe.set_default_msg(pipe.default_msg() + 1); + } + +/** +* Finish encrypting with PBES2 +*/ +void PBE_PKCS5v20::end_msg() + { + pipe.end_msg(); + flush_pipe(false); + pipe.reset(); + } + +/** +* Flush the pipe +*/ +void PBE_PKCS5v20::flush_pipe(bool safe_to_skip) + { + if(safe_to_skip && pipe.remaining() < 64) + return; + + SecureVector buffer(DEFAULT_BUFFERSIZE); + while(pipe.remaining()) + { + u32bit got = pipe.read(buffer, buffer.size()); + send(buffer, got); + } + } + +/** +* Set the passphrase to use +*/ +void PBE_PKCS5v20::set_key(const std::string& passphrase) + { + PKCS5_PBKDF2 pbkdf(new HMAC(hash_function->clone())); + + pbkdf.set_iterations(iterations); + pbkdf.change_salt(salt, salt.size()); + key = pbkdf.derive_key(key_length, passphrase).bits_of(); + } + +/** +* Create a new set of PBES2 parameters +*/ +void PBE_PKCS5v20::new_params(RandomNumberGenerator& rng) + { + iterations = 2048; + key_length = block_cipher->MAXIMUM_KEYLENGTH; + + salt.create(8); + rng.randomize(salt, salt.size()); + + iv.create(block_cipher->BLOCK_SIZE); + rng.randomize(iv, iv.size()); + } + +/** +* Encode PKCS#5 PBES2 parameters +*/ +MemoryVector PBE_PKCS5v20::encode_params() const + { + return DER_Encoder() + .start_cons(SEQUENCE) + .encode( + AlgorithmIdentifier("PKCS5.PBKDF2", + DER_Encoder() + .start_cons(SEQUENCE) + .encode(salt, OCTET_STRING) + .encode(iterations) + .encode(key_length) + .end_cons() + .get_contents() + ) + ) + .encode( + AlgorithmIdentifier(block_cipher->name() + "/CBC", + DER_Encoder() + .encode(iv, OCTET_STRING) + .get_contents() + ) + ) + .end_cons() + .get_contents(); + } + +/** +* Decode PKCS#5 PBES2 parameters +*/ +void PBE_PKCS5v20::decode_params(DataSource& source) + { + AlgorithmIdentifier kdf_algo, enc_algo; + + BER_Decoder(source) + .start_cons(SEQUENCE) + .decode(kdf_algo) + .decode(enc_algo) + .verify_end() + .end_cons(); + + if(kdf_algo.oid == OIDS::lookup("PKCS5.PBKDF2")) + { + BER_Decoder(kdf_algo.parameters) + .start_cons(SEQUENCE) + .decode(salt, OCTET_STRING) + .decode(iterations) + .decode_optional(key_length, INTEGER, UNIVERSAL) + .verify_end() + .end_cons(); + } + else + throw Decoding_Error("PBE-PKCS5 v2.0: Unknown KDF algorithm " + + kdf_algo.oid.as_string()); + + Algorithm_Factory& af = global_state().algorithm_factory(); + + std::string cipher = OIDS::lookup(enc_algo.oid); + std::vector cipher_spec = split_on(cipher, '/'); + if(cipher_spec.size() != 2) + throw Decoding_Error("PBE-PKCS5 v2.0: Invalid cipher spec " + cipher); + + if(!known_cipher(cipher_spec[0]) || cipher_spec[1] != "CBC") + throw Decoding_Error("PBE-PKCS5 v2.0: Don't know param format for " + + cipher); + + BER_Decoder(enc_algo.parameters).decode(iv, OCTET_STRING).verify_end(); + + block_cipher = af.make_block_cipher(cipher_spec[0]); + hash_function = af.make_hash_function("SHA-160"); + + if(key_length == 0) + key_length = block_cipher->MAXIMUM_KEYLENGTH; + + if(salt.size() < 8) + throw Decoding_Error("PBE-PKCS5 v2.0: Encoded salt is too small"); + } + +/** +* Return an OID for PBES2 +*/ +OID PBE_PKCS5v20::get_oid() const + { + return OIDS::lookup("PBE-PKCS5v20"); + } + +/** +* Check if this is a known PBES2 cipher +*/ +bool PBE_PKCS5v20::known_cipher(const std::string& algo) + { + if(algo == "AES-128" || algo == "AES-192" || algo == "AES-256") + return true; + if(algo == "DES" || algo == "TripleDES") + return true; + return false; + } + +/** +* PKCS#5 v2.0 PBE Constructor +*/ +PBE_PKCS5v20::PBE_PKCS5v20(BlockCipher* cipher, + HashFunction* digest) : + direction(ENCRYPTION), block_cipher(cipher), hash_function(digest) + { + if(!known_cipher(block_cipher->name())) + throw Invalid_Argument("PBE-PKCS5 v2.0: Invalid cipher " + cipher->name()); + if(hash_function->name() != "SHA-160") + throw Invalid_Argument("PBE-PKCS5 v2.0: Invalid digest " + digest->name()); + } + +/** +* PKCS#5 v2.0 PBE Constructor +*/ +PBE_PKCS5v20::PBE_PKCS5v20(DataSource& params) : direction(DECRYPTION) + { + hash_function = 0; + block_cipher = 0; + decode_params(params); + } + +PBE_PKCS5v20::~PBE_PKCS5v20() + { + delete hash_function; + delete block_cipher; + } + +} diff --git a/src/libs/3rdparty/botan/src/pbe/pbes2/pbes2.h b/src/libs/3rdparty/botan/src/pbe/pbes2/pbes2.h new file mode 100644 index 00000000000..fc460a22834 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pbe/pbes2/pbes2.h @@ -0,0 +1,53 @@ +/* +* PKCS #5 v2.0 PBE +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PBE_PKCS_v20_H__ +#define BOTAN_PBE_PKCS_v20_H__ + +#include +#include +#include +#include + +namespace Botan { + +/* +* PKCS#5 v2.0 PBE +*/ +class BOTAN_DLL PBE_PKCS5v20 : public PBE + { + public: + static bool known_cipher(const std::string&); + + void write(const byte[], u32bit); + void start_msg(); + void end_msg(); + + PBE_PKCS5v20(DataSource&); + PBE_PKCS5v20(BlockCipher*, HashFunction*); + + ~PBE_PKCS5v20(); + private: + void set_key(const std::string&); + void new_params(RandomNumberGenerator& rng); + MemoryVector encode_params() const; + void decode_params(DataSource&); + OID get_oid() const; + + void flush_pipe(bool); + + Cipher_Dir direction; + BlockCipher* block_cipher; + HashFunction* hash_function; + SecureVector salt, key, iv; + u32bit iterations, key_length; + Pipe pipe; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pk_pad/eme.cpp b/src/libs/3rdparty/botan/src/pk_pad/eme.cpp new file mode 100644 index 00000000000..74bba5ac1e5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/eme.cpp @@ -0,0 +1,50 @@ +/* +* EME Base Class +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Encode a message +*/ +SecureVector EME::encode(const byte msg[], u32bit msg_len, + u32bit key_bits, + RandomNumberGenerator& rng) const + { + return pad(msg, msg_len, key_bits, rng); + } + +/* +* Encode a message +*/ +SecureVector EME::encode(const MemoryRegion& msg, + u32bit key_bits, + RandomNumberGenerator& rng) const + { + return pad(msg, msg.size(), key_bits, rng); + } + +/* +* Decode a message +*/ +SecureVector EME::decode(const byte msg[], u32bit msg_len, + u32bit key_bits) const + { + return unpad(msg, msg_len, key_bits); + } + +/* +* Decode a message +*/ +SecureVector EME::decode(const MemoryRegion& msg, + u32bit key_bits) const + { + return unpad(msg, msg.size(), key_bits); + } + +} diff --git a/src/libs/3rdparty/botan/src/pk_pad/eme.h b/src/libs/3rdparty/botan/src/pk_pad/eme.h new file mode 100644 index 00000000000..321c1d01e3a --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/eme.h @@ -0,0 +1,42 @@ +/* +* EME Classes +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PUBKEY_EME_ENCRYPTION_PAD_H__ +#define BOTAN_PUBKEY_EME_ENCRYPTION_PAD_H__ + +#include +#include + +namespace Botan { + +/* +* Encoding Method for Encryption +*/ +class BOTAN_DLL EME + { + public: + virtual u32bit maximum_input_size(u32bit) const = 0; + + SecureVector encode(const byte[], u32bit, u32bit, + RandomNumberGenerator&) const; + SecureVector encode(const MemoryRegion&, u32bit, + RandomNumberGenerator&) const; + + SecureVector decode(const byte[], u32bit, u32bit) const; + SecureVector decode(const MemoryRegion&, u32bit) const; + + virtual ~EME() {} + private: + virtual SecureVector pad(const byte[], u32bit, u32bit, + RandomNumberGenerator&) const = 0; + + virtual SecureVector unpad(const byte[], u32bit, u32bit) const = 0; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pk_pad/eme1/eme1.cpp b/src/libs/3rdparty/botan/src/pk_pad/eme1/eme1.cpp new file mode 100644 index 00000000000..13f68f8e463 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/eme1/eme1.cpp @@ -0,0 +1,103 @@ +/* +* EME1 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* EME1 Pad Operation +*/ +SecureVector EME1::pad(const byte in[], u32bit in_length, + u32bit key_length, + RandomNumberGenerator& rng) const + { + key_length /= 8; + + if(in_length > key_length - 2*HASH_LENGTH - 1) + throw Exception("EME1: Input is too large"); + + SecureVector out(key_length); + + out.clear(); + + rng.randomize(out, HASH_LENGTH); + + out.copy(HASH_LENGTH, Phash, Phash.size()); + out[out.size() - in_length - 1] = 0x01; + out.copy(out.size() - in_length, in, in_length); + mgf->mask(out, HASH_LENGTH, out + HASH_LENGTH, out.size() - HASH_LENGTH); + mgf->mask(out + HASH_LENGTH, out.size() - HASH_LENGTH, out, HASH_LENGTH); + + return out; + } + +/* +* EME1 Unpad Operation +*/ +SecureVector EME1::unpad(const byte in[], u32bit in_length, + u32bit key_length) const + { + /* + Must be careful about error messages here; if an attacker can + distinguish them, it is easy to use the differences as an oracle to + find the secret key, as described in "A Chosen Ciphertext Attack on + RSA Optimal Asymmetric Encryption Padding (OAEP) as Standardized in + PKCS #1 v2.0", James Manger, Crypto 2001 + */ + + key_length /= 8; + if(in_length > key_length) + throw Decoding_Error("Invalid EME1 encoding"); + + SecureVector tmp(key_length); + tmp.copy(key_length - in_length, in, in_length); + + mgf->mask(tmp + HASH_LENGTH, tmp.size() - HASH_LENGTH, tmp, HASH_LENGTH); + mgf->mask(tmp, HASH_LENGTH, tmp + HASH_LENGTH, tmp.size() - HASH_LENGTH); + + for(u32bit j = 0; j != Phash.size(); ++j) + if(tmp[j+HASH_LENGTH] != Phash[j]) + throw Decoding_Error("Invalid EME1 encoding"); + + for(u32bit j = HASH_LENGTH + Phash.size(); j != tmp.size(); ++j) + { + if(tmp[j] && tmp[j] != 0x01) + throw Decoding_Error("Invalid EME1 encoding"); + if(tmp[j] && tmp[j] == 0x01) + { + SecureVector retval(tmp + j + 1, tmp.size() - j - 1); + return retval; + } + } + throw Decoding_Error("Invalid EME1 encoding"); + } + +/* +* Return the max input size for a given key size +*/ +u32bit EME1::maximum_input_size(u32bit keybits) const + { + if(keybits / 8 > 2*HASH_LENGTH + 1) + return ((keybits / 8) - 2*HASH_LENGTH - 1); + else + return 0; + } + +/* +* EME1 Constructor +*/ +EME1::EME1(HashFunction* hash, const std::string& P) : + HASH_LENGTH(hash->OUTPUT_LENGTH) + { + Phash = hash->process(P); + mgf = new MGF1(hash); + } + +} diff --git a/src/libs/3rdparty/botan/src/pk_pad/eme1/eme1.h b/src/libs/3rdparty/botan/src/pk_pad/eme1/eme1.h new file mode 100644 index 00000000000..4df5c5f1cd7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/eme1/eme1.h @@ -0,0 +1,45 @@ +/* +* EME1 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EME1_H__ +#define BOTAN_EME1_H__ + +#include +#include +#include + +namespace Botan { + +/* +* EME1 +*/ +class BOTAN_DLL EME1 : public EME + { + public: + u32bit maximum_input_size(u32bit) const; + + /** + EME1 constructor. Hash will be deleted by ~EME1 (when mgf is deleted) + + P is an optional label. Normally empty. + */ + EME1(HashFunction* hash, const std::string& P = ""); + + ~EME1() { delete mgf; } + private: + SecureVector pad(const byte[], u32bit, u32bit, + RandomNumberGenerator&) const; + SecureVector unpad(const byte[], u32bit, u32bit) const; + + const u32bit HASH_LENGTH; + SecureVector Phash; + MGF* mgf; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pk_pad/eme1/info.txt b/src/libs/3rdparty/botan/src/pk_pad/eme1/info.txt new file mode 100644 index 00000000000..2f61265e2f2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/eme1/info.txt @@ -0,0 +1,16 @@ +realname "EME1" + +define EME1 + +load_on auto + + +eme1.h +eme1.cpp + + + +hash +kdf +mgf1 + diff --git a/src/libs/3rdparty/botan/src/pk_pad/eme_pkcs/eme_pkcs.cpp b/src/libs/3rdparty/botan/src/pk_pad/eme_pkcs/eme_pkcs.cpp new file mode 100644 index 00000000000..c2f9c91d25e --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/eme_pkcs/eme_pkcs.cpp @@ -0,0 +1,70 @@ +/* +* PKCS1 EME +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* PKCS1 Pad Operation +*/ +SecureVector EME_PKCS1v15::pad(const byte in[], u32bit inlen, + u32bit olen, + RandomNumberGenerator& rng) const + { + olen /= 8; + + if(olen < 10) + throw Encoding_Error("PKCS1: Output space too small"); + if(inlen > olen - 10) + throw Encoding_Error("PKCS1: Input is too large"); + + SecureVector out(olen); + + out[0] = 0x02; + for(u32bit j = 1; j != olen - inlen - 1; ++j) + while(out[j] == 0) + out[j] = rng.next_byte(); + out.copy(olen - inlen, in, inlen); + + return out; + } + +/* +* PKCS1 Unpad Operation +*/ +SecureVector EME_PKCS1v15::unpad(const byte in[], u32bit inlen, + u32bit key_len) const + { + if(inlen != key_len / 8 || inlen < 10 || in[0] != 0x02) + throw Decoding_Error("PKCS1::unpad"); + + u32bit seperator = 0; + for(u32bit j = 0; j != inlen; ++j) + if(in[j] == 0) + { + seperator = j; + break; + } + if(seperator < 9) + throw Decoding_Error("PKCS1::unpad"); + + return SecureVector(in + seperator + 1, inlen - seperator - 1); + } + +/* +* Return the max input size for a given key size +*/ +u32bit EME_PKCS1v15::maximum_input_size(u32bit keybits) const + { + if(keybits / 8 > 10) + return ((keybits / 8) - 10); + else + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/pk_pad/eme_pkcs/eme_pkcs.h b/src/libs/3rdparty/botan/src/pk_pad/eme_pkcs/eme_pkcs.h new file mode 100644 index 00000000000..1aeedf5d79b --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/eme_pkcs/eme_pkcs.h @@ -0,0 +1,30 @@ +/* +* EME PKCS#1 v1.5 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EME_PKCS1_H__ +#define BOTAN_EME_PKCS1_H__ + +#include + +namespace Botan { + +/* +* EME_PKCS1v15 +*/ +class BOTAN_DLL EME_PKCS1v15 : public EME + { + public: + u32bit maximum_input_size(u32bit) const; + private: + SecureVector pad(const byte[], u32bit, u32bit, + RandomNumberGenerator&) const; + SecureVector unpad(const byte[], u32bit, u32bit) const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pk_pad/eme_pkcs/info.txt b/src/libs/3rdparty/botan/src/pk_pad/eme_pkcs/info.txt new file mode 100644 index 00000000000..88d9caf1727 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/eme_pkcs/info.txt @@ -0,0 +1,10 @@ +realname "PKCSv1 v1.5 EME" + +define EME_PKCS1v15 + +load_on auto + + +eme_pkcs.h +eme_pkcs.cpp + diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa.h b/src/libs/3rdparty/botan/src/pk_pad/emsa.h new file mode 100644 index 00000000000..e2491e40f7d --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa.h @@ -0,0 +1,36 @@ +/* +* EMSA Classes +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PUBKEY_EMSA_H__ +#define BOTAN_PUBKEY_EMSA_H__ + +#include +#include + +namespace Botan { + +/* +* Encoding Method for Signatures, Appendix +*/ +class BOTAN_DLL EMSA + { + public: + virtual void update(const byte[], u32bit) = 0; + virtual SecureVector raw_data() = 0; + + virtual SecureVector encoding_of(const MemoryRegion&, + u32bit, + RandomNumberGenerator& rng) = 0; + + virtual bool verify(const MemoryRegion&, const MemoryRegion&, + u32bit) throw() = 0; + virtual ~EMSA() {} + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa1/emsa1.cpp b/src/libs/3rdparty/botan/src/pk_pad/emsa1/emsa1.cpp new file mode 100644 index 00000000000..26d709c28b5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa1/emsa1.cpp @@ -0,0 +1,105 @@ +/* +* EMSA1 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +namespace { + +SecureVector emsa1_encoding(const MemoryRegion& msg, + u32bit output_bits) + { + if(8*msg.size() <= output_bits) + return msg; + + u32bit shift = 8*msg.size() - output_bits; + + u32bit byte_shift = shift / 8, bit_shift = shift % 8; + SecureVector digest(msg.size() - byte_shift); + + for(u32bit j = 0; j != msg.size() - byte_shift; ++j) + digest[j] = msg[j]; + + if(bit_shift) + { + byte carry = 0; + for(u32bit j = 0; j != digest.size(); ++j) + { + byte temp = digest[j]; + digest[j] = (temp >> bit_shift) | carry; + carry = (temp << (8 - bit_shift)); + } + } + return digest; + } + +} + +/* +* EMSA1 Update Operation +*/ +void EMSA1::update(const byte input[], u32bit length) + { + hash->update(input, length); + } + +/* +* Return the raw (unencoded) data +*/ +SecureVector EMSA1::raw_data() + { + return hash->final(); + } + +/* +* EMSA1 Encode Operation +*/ +SecureVector EMSA1::encoding_of(const MemoryRegion& msg, + u32bit output_bits, + RandomNumberGenerator&) + { + if(msg.size() != hash->OUTPUT_LENGTH) + throw Encoding_Error("EMSA1::encoding_of: Invalid size for input"); + return emsa1_encoding(msg, output_bits); + } + +/* +* EMSA1 Decode/Verify Operation +*/ +bool EMSA1::verify(const MemoryRegion& coded, + const MemoryRegion& raw, u32bit key_bits) throw() + { + try { + if(raw.size() != hash->OUTPUT_LENGTH) + throw Encoding_Error("EMSA1::encoding_of: Invalid size for input"); + + SecureVector our_coding = emsa1_encoding(raw, key_bits); + + if(our_coding == coded) return true; + if(our_coding[0] != 0) return false; + if(our_coding.size() <= coded.size()) return false; + + u32bit offset = 0; + while(our_coding[offset] == 0 && offset < our_coding.size()) + ++offset; + if(our_coding.size() - offset != coded.size()) + return false; + + for(u32bit j = 0; j != coded.size(); ++j) + if(coded[j] != our_coding[j+offset]) + return false; + + return true; + } + catch(Invalid_Argument) + { + return false; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa1/emsa1.h b/src/libs/3rdparty/botan/src/pk_pad/emsa1/emsa1.h new file mode 100644 index 00000000000..a5dac07e26d --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa1/emsa1.h @@ -0,0 +1,41 @@ +/* +* EMSA1 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EMSA1_H__ +#define BOTAN_EMSA1_H__ + +#include +#include + +namespace Botan { + +/* +* EMSA1 +*/ +class BOTAN_DLL EMSA1 : public EMSA + { + public: + EMSA1(HashFunction* h) : hash(h) {} + ~EMSA1() { delete hash; } + protected: + const HashFunction* hash_ptr() const { return hash; } + private: + void update(const byte[], u32bit); + SecureVector raw_data(); + + SecureVector encoding_of(const MemoryRegion&, u32bit, + RandomNumberGenerator& rng); + + bool verify(const MemoryRegion&, const MemoryRegion&, + u32bit) throw(); + + HashFunction* hash; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa1/info.txt b/src/libs/3rdparty/botan/src/pk_pad/emsa1/info.txt new file mode 100644 index 00000000000..086270b9656 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa1/info.txt @@ -0,0 +1,14 @@ +realname "EMSA1" + +define EMSA1 + +load_on auto + + +emsa1.h +emsa1.cpp + + + +hash + diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa1_bsi/emsa1_bsi.cpp b/src/libs/3rdparty/botan/src/pk_pad/emsa1_bsi/emsa1_bsi.cpp new file mode 100644 index 00000000000..212091e2272 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa1_bsi/emsa1_bsi.cpp @@ -0,0 +1,29 @@ +/* +* EMSA1 BSI +* (C) 1999-2008 Jack Lloyd +* 2008 Falko Strenzke, FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* EMSA1 BSI Encode Operation +*/ +SecureVector EMSA1_BSI::encoding_of(const MemoryRegion& msg, + u32bit output_bits, + RandomNumberGenerator&) + { + if(msg.size() != hash_ptr()->OUTPUT_LENGTH) + throw Encoding_Error("EMSA1_BSI::encoding_of: Invalid size for input"); + + if(8*msg.size() <= output_bits) + return msg; + + throw Encoding_Error("EMSA1_BSI::encoding_of: max key input size exceeded"); + } + +} diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa1_bsi/emsa1_bsi.h b/src/libs/3rdparty/botan/src/pk_pad/emsa1_bsi/emsa1_bsi.h new file mode 100644 index 00000000000..ec86d40e259 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa1_bsi/emsa1_bsi.h @@ -0,0 +1,32 @@ +/* +* EMSA1 BSI Variant +* (C) 1999-2008 Jack Lloyd +* 2007 FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EMSA1_BSI_H__ +#define BOTAN_EMSA1_BSI_H__ + +#include + +namespace Botan { + +/** +EMSA1_BSI is a variant of EMSA1 specified by the BSI. It accepts only +hash values which are less or equal than the maximum key length. The +implementation comes from InSiTo +*/ +class BOTAN_DLL EMSA1_BSI : public EMSA1 + { + public: + EMSA1_BSI(HashFunction* hash) : EMSA1(hash) {} + private: + SecureVector encoding_of(const MemoryRegion&, u32bit, + RandomNumberGenerator& rng); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa1_bsi/info.txt b/src/libs/3rdparty/botan/src/pk_pad/emsa1_bsi/info.txt new file mode 100644 index 00000000000..14a9fd396cd --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa1_bsi/info.txt @@ -0,0 +1,14 @@ +realname "EMSA1 (BSI variant)" + +define EMSA1_BSI + +load_on auto + + +emsa1_bsi.h +emsa1_bsi.cpp + + + +emsa1 + diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa2/emsa2.cpp b/src/libs/3rdparty/botan/src/pk_pad/emsa2/emsa2.cpp new file mode 100644 index 00000000000..168f9209e35 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa2/emsa2.cpp @@ -0,0 +1,111 @@ +/* +* EMSA2 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace { + +/* +* EMSA2 Encode Operation +*/ +SecureVector emsa2_encoding(const MemoryRegion& msg, + u32bit output_bits, + const MemoryRegion& empty_hash, + byte hash_id) + { + const u32bit HASH_SIZE = empty_hash.size(); + + u32bit output_length = (output_bits + 1) / 8; + + if(msg.size() != HASH_SIZE) + throw Encoding_Error("EMSA2::encoding_of: Bad input length"); + if(output_length < HASH_SIZE + 4) + throw Encoding_Error("EMSA2::encoding_of: Output length is too small"); + + bool empty = true; + for(u32bit j = 0; j != HASH_SIZE; ++j) + if(empty_hash[j] != msg[j]) + empty = false; + + SecureVector output(output_length); + + output[0] = (empty ? 0x4B : 0x6B); + output[output_length - 3 - HASH_SIZE] = 0xBA; + set_mem(output + 1, output_length - 4 - HASH_SIZE, 0xBB); + output.copy(output_length - (HASH_SIZE + 2), msg, msg.size()); + output[output_length-2] = hash_id; + output[output_length-1] = 0xCC; + + return output; + } + +} + +/* +* EMSA2 Update Operation +*/ +void EMSA2::update(const byte input[], u32bit length) + { + hash->update(input, length); + } + +/* +* Return the raw (unencoded) data +*/ +SecureVector EMSA2::raw_data() + { + return hash->final(); + } + +/* +* EMSA2 Encode Operation +*/ +SecureVector EMSA2::encoding_of(const MemoryRegion& msg, + u32bit output_bits, + RandomNumberGenerator&) + { + return emsa2_encoding(msg, output_bits, empty_hash, hash_id); + } + +/* +* EMSA2 Verify Operation +*/ +bool EMSA2::verify(const MemoryRegion& coded, + const MemoryRegion& raw, + u32bit key_bits) throw() + { + try + { + return (coded == emsa2_encoding(raw, key_bits, + empty_hash, hash_id)); + } + catch(...) + { + return false; + } + } + +/* +* EMSA2 Constructor +*/ +EMSA2::EMSA2(HashFunction* hash_in) : hash(hash_in) + { + empty_hash = hash->final(); + + hash_id = ieee1363_hash_id(hash->name()); + + if(hash_id == 0) + { + delete hash; + throw Encoding_Error("EMSA2 cannot be used with " + hash->name()); + } + } + +} diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa2/emsa2.h b/src/libs/3rdparty/botan/src/pk_pad/emsa2/emsa2.h new file mode 100644 index 00000000000..76888d1f6b5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa2/emsa2.h @@ -0,0 +1,41 @@ +/* +* EMSA2 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EMSA2_H__ +#define BOTAN_EMSA2_H__ + +#include +#include + +namespace Botan { + +/* +* EMSA2 +*/ +class BOTAN_DLL EMSA2 : public EMSA + { + public: + EMSA2(HashFunction* hash); + ~EMSA2() { delete hash; } + private: + void update(const byte[], u32bit); + SecureVector raw_data(); + + SecureVector encoding_of(const MemoryRegion&, u32bit, + RandomNumberGenerator& rng); + + bool verify(const MemoryRegion&, const MemoryRegion&, + u32bit) throw(); + + SecureVector empty_hash; + HashFunction* hash; + byte hash_id; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa2/info.txt b/src/libs/3rdparty/botan/src/pk_pad/emsa2/info.txt new file mode 100644 index 00000000000..1c8161c5e5f --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa2/info.txt @@ -0,0 +1,15 @@ +realname "EMSA2" + +define EMSA2 + +load_on auto + + +emsa2.h +emsa2.cpp + + + +hash +hash_id + diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa3/emsa3.cpp b/src/libs/3rdparty/botan/src/pk_pad/emsa3/emsa3.cpp new file mode 100644 index 00000000000..4d50abd8473 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa3/emsa3.cpp @@ -0,0 +1,152 @@ +/* +* EMSA3 and EMSA3_Raw +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace { + +/** +* EMSA3 Encode Operation +*/ +SecureVector emsa3_encoding(const MemoryRegion& msg, + u32bit output_bits, + const byte hash_id[], + u32bit hash_id_length) + { + u32bit output_length = output_bits / 8; + if(output_length < hash_id_length + msg.size() + 10) + throw Encoding_Error("emsa3_encoding: Output length is too small"); + + SecureVector T(output_length); + const u32bit P_LENGTH = output_length - msg.size() - hash_id_length - 2; + + T[0] = 0x01; + set_mem(T+1, P_LENGTH, 0xFF); + T[P_LENGTH+1] = 0x00; + T.copy(P_LENGTH+2, hash_id, hash_id_length); + T.copy(output_length-msg.size(), msg, msg.size()); + return T; + } + +} + +/** +* EMSA3 Update Operation +*/ +void EMSA3::update(const byte input[], u32bit length) + { + hash->update(input, length); + } + +/** +* Return the raw (unencoded) data +*/ +SecureVector EMSA3::raw_data() + { + return hash->final(); + } + +/** +* EMSA3 Encode Operation +*/ +SecureVector EMSA3::encoding_of(const MemoryRegion& msg, + u32bit output_bits, + RandomNumberGenerator&) + { + if(msg.size() != hash->OUTPUT_LENGTH) + throw Encoding_Error("EMSA3::encoding_of: Bad input length"); + + return emsa3_encoding(msg, output_bits, + hash_id, hash_id.size()); + } + +/** +* Default signature decoding +*/ +bool EMSA3::verify(const MemoryRegion& coded, + const MemoryRegion& raw, + u32bit key_bits) throw() + { + if(raw.size() != hash->OUTPUT_LENGTH) + return false; + + try + { + return (coded == emsa3_encoding(raw, key_bits, + hash_id, hash_id.size())); + } + catch(...) + { + return false; + } + } + +/** +* EMSA3 Constructor +*/ +EMSA3::EMSA3(HashFunction* hash_in) : hash(hash_in) + { + hash_id = pkcs_hash_id(hash->name()); + } + +/** +* EMSA3 Destructor +*/ +EMSA3::~EMSA3() + { + delete hash; + } + +/** +* EMSA3_Raw Update Operation +*/ +void EMSA3_Raw::update(const byte input[], u32bit length) + { + message.append(input, length); + } + +/** +* Return the raw (unencoded) data +*/ +SecureVector EMSA3_Raw::raw_data() + { + SecureVector ret = message; + message.clear(); + return ret; + } + +/** +* EMSA3_Raw Encode Operation +*/ +SecureVector EMSA3_Raw::encoding_of(const MemoryRegion& msg, + u32bit output_bits, + RandomNumberGenerator&) + { + return emsa3_encoding(msg, output_bits, 0, 0); + } + +/** +* Default signature decoding +*/ +bool EMSA3_Raw::verify(const MemoryRegion& coded, + const MemoryRegion& raw, + u32bit key_bits) throw() + { + try + { + return (coded == emsa3_encoding(raw, key_bits, 0, 0)); + } + catch(...) + { + return false; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa3/emsa3.h b/src/libs/3rdparty/botan/src/pk_pad/emsa3/emsa3.h new file mode 100644 index 00000000000..301f2142a93 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa3/emsa3.h @@ -0,0 +1,65 @@ +/* +* EMSA3 and EMSA3_Raw +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EMSA3_H__ +#define BOTAN_EMSA3_H__ + +#include +#include + +namespace Botan { + +/** +* EMSA3 +* aka PKCS #1 v1.5 signature padding +* aka PKCS #1 block type 1 +*/ +class BOTAN_DLL EMSA3 : public EMSA + { + public: + EMSA3(HashFunction*); + ~EMSA3(); + + void update(const byte[], u32bit); + + SecureVector raw_data(); + + SecureVector encoding_of(const MemoryRegion&, u32bit, + RandomNumberGenerator& rng); + + bool verify(const MemoryRegion&, const MemoryRegion&, + u32bit) throw(); + private: + HashFunction* hash; + SecureVector hash_id; + }; + +/** +* EMSA3_Raw which is EMSA3 without a hash or digest id (which +* according to QCA docs is "identical to PKCS#11's CKM_RSA_PKCS +* mechanism", something I have not confirmed) +*/ +class BOTAN_DLL EMSA3_Raw : public EMSA + { + public: + void update(const byte[], u32bit); + + SecureVector raw_data(); + + SecureVector encoding_of(const MemoryRegion&, u32bit, + RandomNumberGenerator& rng); + + bool verify(const MemoryRegion&, const MemoryRegion&, + u32bit) throw(); + + private: + SecureVector message; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa3/info.txt b/src/libs/3rdparty/botan/src/pk_pad/emsa3/info.txt new file mode 100644 index 00000000000..90e4b9bfcce --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa3/info.txt @@ -0,0 +1,15 @@ +realname "EMSA3" + +define EMSA3 + +load_on auto + + +emsa3.h +emsa3.cpp + + + +hash +hash_id + diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa4/emsa4.cpp b/src/libs/3rdparty/botan/src/pk_pad/emsa4/emsa4.cpp new file mode 100644 index 00000000000..cff9a153705 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa4/emsa4.cpp @@ -0,0 +1,143 @@ +/* +* EMSA4 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* EMSA4 Update Operation +*/ +void EMSA4::update(const byte input[], u32bit length) + { + hash->update(input, length); + } + +/* +* Return the raw (unencoded) data +*/ +SecureVector EMSA4::raw_data() + { + return hash->final(); + } + +/* +* EMSA4 Encode Operation +*/ +SecureVector EMSA4::encoding_of(const MemoryRegion& msg, + u32bit output_bits, + RandomNumberGenerator& rng) + { + const u32bit HASH_SIZE = hash->OUTPUT_LENGTH; + + if(msg.size() != HASH_SIZE) + throw Encoding_Error("EMSA4::encoding_of: Bad input length"); + if(output_bits < 8*HASH_SIZE + 8*SALT_SIZE + 9) + throw Encoding_Error("EMSA4::encoding_of: Output length is too small"); + + const u32bit output_length = (output_bits + 7) / 8; + + SecureVector salt(SALT_SIZE); + rng.randomize(salt, SALT_SIZE); + + for(u32bit j = 0; j != 8; ++j) + hash->update(0); + hash->update(msg); + hash->update(salt, SALT_SIZE); + SecureVector H = hash->final(); + + SecureVector EM(output_length); + + EM[output_length - HASH_SIZE - SALT_SIZE - 2] = 0x01; + EM.copy(output_length - 1 - HASH_SIZE - SALT_SIZE, salt, SALT_SIZE); + mgf->mask(H, HASH_SIZE, EM, output_length - HASH_SIZE - 1); + EM[0] &= 0xFF >> (8 * ((output_bits + 7) / 8) - output_bits); + EM.copy(output_length - 1 - HASH_SIZE, H, HASH_SIZE); + EM[output_length-1] = 0xBC; + + return EM; + } + +/* +* EMSA4 Decode/Verify Operation +*/ +bool EMSA4::verify(const MemoryRegion& const_coded, + const MemoryRegion& raw, u32bit key_bits) throw() + { + const u32bit HASH_SIZE = hash->OUTPUT_LENGTH; + const u32bit KEY_BYTES = (key_bits + 7) / 8; + + if(key_bits < 8*HASH_SIZE + 9) + return false; + if(raw.size() != HASH_SIZE) + return false; + if(const_coded.size() > KEY_BYTES) + return false; + if(const_coded[const_coded.size()-1] != 0xBC) + return false; + + SecureVector coded = const_coded; + if(coded.size() < KEY_BYTES) + { + SecureVector temp(KEY_BYTES); + temp.copy(KEY_BYTES - coded.size(), coded, coded.size()); + coded = temp; + } + + const u32bit TOP_BITS = 8 * ((key_bits + 7) / 8) - key_bits; + if(TOP_BITS > 8 - high_bit(coded[0])) + return false; + + SecureVector DB(coded.begin(), coded.size() - HASH_SIZE - 1); + SecureVector H(coded + coded.size() - HASH_SIZE - 1, HASH_SIZE); + + mgf->mask(H, H.size(), DB, coded.size() - H.size() - 1); + DB[0] &= 0xFF >> TOP_BITS; + + u32bit salt_offset = 0; + for(u32bit j = 0; j != DB.size(); ++j) + { + if(DB[j] == 0x01) + { salt_offset = j + 1; break; } + if(DB[j]) + return false; + } + if(salt_offset == 0) + return false; + + SecureVector salt(DB + salt_offset, DB.size() - salt_offset); + + for(u32bit j = 0; j != 8; ++j) + hash->update(0); + hash->update(raw); + hash->update(salt); + SecureVector H2 = hash->final(); + + return (H == H2); + } + +/* +* EMSA4 Constructor +*/ +EMSA4::EMSA4(HashFunction* h) : + SALT_SIZE(h->OUTPUT_LENGTH), hash(h) + { + mgf = new MGF1(hash->clone()); + } + +/* +* EMSA4 Constructor +*/ +EMSA4::EMSA4(HashFunction* h, u32bit salt_size) : + SALT_SIZE(salt_size), hash(h) + { + mgf = new MGF1(hash->clone()); + } + +} diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa4/emsa4.h b/src/libs/3rdparty/botan/src/pk_pad/emsa4/emsa4.h new file mode 100644 index 00000000000..b716178a97b --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa4/emsa4.h @@ -0,0 +1,43 @@ +/* +* EMSA4 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EMSA4_H__ +#define BOTAN_EMSA4_H__ + +#include +#include +#include + +namespace Botan { + +/* +* EMSA4 +*/ +class BOTAN_DLL EMSA4 : public EMSA + { + public: + EMSA4(HashFunction*); + EMSA4(HashFunction*, u32bit); + + ~EMSA4() { delete hash; delete mgf; } + private: + void update(const byte[], u32bit); + SecureVector raw_data(); + + SecureVector encoding_of(const MemoryRegion&, u32bit, + RandomNumberGenerator& rng); + bool verify(const MemoryRegion&, const MemoryRegion&, + u32bit) throw(); + + u32bit SALT_SIZE; + HashFunction* hash; + const MGF* mgf; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa4/info.txt b/src/libs/3rdparty/botan/src/pk_pad/emsa4/info.txt new file mode 100644 index 00000000000..29ef4e0cf8f --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa4/info.txt @@ -0,0 +1,16 @@ +realname "EMSA4" + +define EMSA4 + +load_on auto + + +emsa4.h +emsa4.cpp + + + +hash +kdf +mgf1 + diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa_raw/emsa_raw.cpp b/src/libs/3rdparty/botan/src/pk_pad/emsa_raw/emsa_raw.cpp new file mode 100644 index 00000000000..d5973ee55e0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa_raw/emsa_raw.cpp @@ -0,0 +1,50 @@ +/* +* EMSA-Raw +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* EMSA-Raw Encode Operation +*/ +void EMSA_Raw::update(const byte input[], u32bit length) + { + message.append(input, length); + } + +/* +* Return the raw (unencoded) data +*/ +SecureVector EMSA_Raw::raw_data() + { + SecureVector buf = message; + message.destroy(); + return buf; + } + +/* +* EMSA-Raw Encode Operation +*/ +SecureVector EMSA_Raw::encoding_of(const MemoryRegion& msg, + u32bit, + RandomNumberGenerator&) + { + return msg; + } + +/* +* EMSA-Raw Verify Operation +*/ +bool EMSA_Raw::verify(const MemoryRegion& coded, + const MemoryRegion& raw, + u32bit) throw() + { + return (coded == raw); + } + +} diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa_raw/emsa_raw.h b/src/libs/3rdparty/botan/src/pk_pad/emsa_raw/emsa_raw.h new file mode 100644 index 00000000000..1b0ad516eda --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa_raw/emsa_raw.h @@ -0,0 +1,34 @@ +/* +* EMSA-Raw +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EMSA_RAW_H__ +#define BOTAN_EMSA_RAW_H__ + +#include + +namespace Botan { + +/* +* EMSA-Raw +*/ +class BOTAN_DLL EMSA_Raw : public EMSA + { + private: + void update(const byte[], u32bit); + SecureVector raw_data(); + + SecureVector encoding_of(const MemoryRegion&, u32bit, + RandomNumberGenerator&); + bool verify(const MemoryRegion&, const MemoryRegion&, + u32bit) throw(); + + SecureVector message; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pk_pad/emsa_raw/info.txt b/src/libs/3rdparty/botan/src/pk_pad/emsa_raw/info.txt new file mode 100644 index 00000000000..2a88d10fa5b --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/emsa_raw/info.txt @@ -0,0 +1,10 @@ +realname "EMSA-Raw" + +define EMSA_RAW + +load_on auto + + +emsa_raw.h +emsa_raw.cpp + diff --git a/src/libs/3rdparty/botan/src/pk_pad/hash_id/hash_id.cpp b/src/libs/3rdparty/botan/src/pk_pad/hash_id/hash_id.cpp new file mode 100644 index 00000000000..c83ad87ac59 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/hash_id/hash_id.cpp @@ -0,0 +1,116 @@ +/* +* Hash Function Identification +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace PKCS_IDS { + +const byte MD2_ID[] = { +0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, +0xF7, 0x0D, 0x02, 0x02, 0x05, 0x00, 0x04, 0x10 }; + +const byte MD5_ID[] = { +0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, +0xF7, 0x0D, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10 }; + +const byte RIPEMD_128_ID[] = { +0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, 0x03, 0x02, +0x02, 0x05, 0x00, 0x04, 0x14 }; + +const byte RIPEMD_160_ID[] = { +0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, 0x03, 0x02, +0x01, 0x05, 0x00, 0x04, 0x14 }; + +const byte SHA_160_ID[] = { +0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, +0x1A, 0x05, 0x00, 0x04, 0x14 }; + +const byte SHA_224_ID[] = { +0x30, 0x2D, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, +0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 0x1C }; + +const byte SHA_256_ID[] = { +0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, +0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20 }; + +const byte SHA_384_ID[] = { +0x30, 0x41, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, +0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30 }; + +const byte SHA_512_ID[] = { +0x30, 0x51, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, +0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40 }; + +const byte TIGER_ID[] = { +0x30, 0x29, 0x30, 0x0D, 0x06, 0x09, 0x2B, 0x06, 0x01, 0x04, +0x01, 0xDA, 0x47, 0x0C, 0x02, 0x05, 0x00, 0x04, 0x18 }; + +} + +/** +* @return HashID as specified by PKCS +* For details see RFC 3447 section 9.2 +* http://tools.ietf.org/html/rfc3447#section-9.2 +*/ +MemoryVector pkcs_hash_id(const std::string& name) + { + MemoryVector out; + + if(name == "Parallel(MD5,SHA-160)") + return out; + + if(name == "MD2") + out.set(PKCS_IDS::MD2_ID, sizeof(PKCS_IDS::MD2_ID)); + else if(name == "MD5") + out.set(PKCS_IDS::MD5_ID, sizeof(PKCS_IDS::MD5_ID)); + else if(name == "RIPEMD-128") + out.set(PKCS_IDS::RIPEMD_128_ID, sizeof(PKCS_IDS::RIPEMD_128_ID)); + else if(name == "RIPEMD-160") + out.set(PKCS_IDS::RIPEMD_160_ID, sizeof(PKCS_IDS::RIPEMD_160_ID)); + else if(name == "SHA-160") + out.set(PKCS_IDS::SHA_160_ID, sizeof(PKCS_IDS::SHA_160_ID)); + else if(name == "SHA-224") + out.set(PKCS_IDS::SHA_224_ID, sizeof(PKCS_IDS::SHA_224_ID)); + else if(name == "SHA-256") + out.set(PKCS_IDS::SHA_256_ID, sizeof(PKCS_IDS::SHA_256_ID)); + else if(name == "SHA-384") + out.set(PKCS_IDS::SHA_384_ID, sizeof(PKCS_IDS::SHA_384_ID)); + else if(name == "SHA-512") + out.set(PKCS_IDS::SHA_512_ID, sizeof(PKCS_IDS::SHA_512_ID)); + else if(name == "Tiger(24,3)") + out.set(PKCS_IDS::TIGER_ID, sizeof(PKCS_IDS::TIGER_ID)); + + if(out.size()) + return out; + + throw Invalid_Argument("No PKCS #1 identifier for " + name); + } + +/** +* @return HashID as specified by IEEE 1363/X9.31 +*/ +byte ieee1363_hash_id(const std::string& name) + { + if(name == "SHA-160") return 0x33; + + if(name == "SHA-224") return 0x38; + if(name == "SHA-256") return 0x34; + if(name == "SHA-384") return 0x36; + if(name == "SHA-512") return 0x35; + + if(name == "RIPEMD-160") return 0x31; + if(name == "RIPEMD-128") return 0x32; + + if(name == "Whirlpool") return 0x37; + + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/pk_pad/hash_id/hash_id.h b/src/libs/3rdparty/botan/src/pk_pad/hash_id/hash_id.h new file mode 100644 index 00000000000..847d9106cac --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/hash_id/hash_id.h @@ -0,0 +1,24 @@ +/* +* Hash Function Identification +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_HASHID_H__ +#define BOTAN_HASHID_H__ + +#include +#include + +namespace Botan { + +/* +* Return the values of various defined HashIDs +*/ +BOTAN_DLL MemoryVector pkcs_hash_id(const std::string&); +BOTAN_DLL byte ieee1363_hash_id(const std::string&); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pk_pad/hash_id/info.txt b/src/libs/3rdparty/botan/src/pk_pad/hash_id/info.txt new file mode 100644 index 00000000000..93543258841 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/hash_id/info.txt @@ -0,0 +1,14 @@ +realname "Hash Function Identifiers" + +define HASH_ID + +load_on auto + + +hash_id.cpp +hash_id.h + + + +alloc + diff --git a/src/libs/3rdparty/botan/src/pk_pad/info.txt b/src/libs/3rdparty/botan/src/pk_pad/info.txt new file mode 100644 index 00000000000..c281b15638e --- /dev/null +++ b/src/libs/3rdparty/botan/src/pk_pad/info.txt @@ -0,0 +1,16 @@ +realname "Public Key EME/EMSA Padding Modes" + +define PK_PADDING + +load_on auto + + +emsa.h +eme.cpp +eme.h + + + +alloc +rng + diff --git a/src/libs/3rdparty/botan/src/pubkey/dh/dh.cpp b/src/libs/3rdparty/botan/src/pubkey/dh/dh.cpp new file mode 100644 index 00000000000..0c9d02f0ee4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dh/dh.cpp @@ -0,0 +1,119 @@ +/* +* Diffie-Hellman +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* DH_PublicKey Constructor +*/ +DH_PublicKey::DH_PublicKey(const DL_Group& grp, const BigInt& y1) + { + group = grp; + y = y1; + X509_load_hook(); + } + +/* +* Algorithm Specific X.509 Initialization Code +*/ +void DH_PublicKey::X509_load_hook() + { + } + +/* +* Return the maximum input size in bits +*/ +u32bit DH_PublicKey::max_input_bits() const + { + return group_p().bits(); + } + +/* +* Return the public value for key agreement +*/ +MemoryVector DH_PublicKey::public_value() const + { + return BigInt::encode_1363(y, group_p().bytes()); + } + +/* +* Create a DH private key +*/ +DH_PrivateKey::DH_PrivateKey(RandomNumberGenerator& rng, + const DL_Group& grp, + const BigInt& x_arg) + { + group = grp; + x = x_arg; + + if(x == 0) + { + const BigInt& p = group_p(); + x.randomize(rng, 2 * dl_work_factor(p.bits())); + PKCS8_load_hook(rng, true); + } + else + PKCS8_load_hook(rng, false); + } + +/* +* Algorithm Specific PKCS #8 Initialization Code +*/ +void DH_PrivateKey::PKCS8_load_hook(RandomNumberGenerator& rng, + bool generated) + { + if(y == 0) + y = power_mod(group_g(), x, group_p()); + core = DH_Core(rng, group, x); + + if(generated) + gen_check(rng); + else + load_check(rng); + } + +/* +* Return the public value for key agreement +*/ +MemoryVector DH_PrivateKey::public_value() const + { + return DH_PublicKey::public_value(); + } + +/* +* Derive a key +*/ +SecureVector DH_PrivateKey::derive_key(const byte w[], + u32bit w_len) const + { + return derive_key(BigInt::decode(w, w_len)); + } + +/* +* Derive a key +*/ +SecureVector DH_PrivateKey::derive_key(const DH_PublicKey& key) const + { + return derive_key(key.get_y()); + } + +/* +* Derive a key +*/ +SecureVector DH_PrivateKey::derive_key(const BigInt& w) const + { + const BigInt& p = group_p(); + if(w <= 1 || w >= p-1) + throw Invalid_Argument(algo_name() + "::derive_key: Invalid key input"); + return BigInt::encode_1363(core.agree(w), p.bytes()); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/dh/dh.h b/src/libs/3rdparty/botan/src/pubkey/dh/dh.h new file mode 100644 index 00000000000..fa558bce258 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dh/dh.h @@ -0,0 +1,80 @@ +/* +* Diffie-Hellman +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DIFFIE_HELLMAN_H__ +#define BOTAN_DIFFIE_HELLMAN_H__ + +#include +#include + +namespace Botan { + +/** +* This class represents Diffie-Hellman public keys. +*/ +class BOTAN_DLL DH_PublicKey : public virtual DL_Scheme_PublicKey + { + public: + std::string algo_name() const { return "DH"; } + + MemoryVector public_value() const; + u32bit max_input_bits() const; + + DL_Group::Format group_format() const { return DL_Group::ANSI_X9_42; } + + /** + * Construct an uninitialized key. Use this constructor if you wish + * to decode an encoded key into the new instance. + */ + DH_PublicKey() {} + + /** + * Construct a public key with the specified parameters. + * @param grp the DL group to use in the key + * @param y the public value y + */ + DH_PublicKey(const DL_Group& grp, const BigInt& y); + private: + void X509_load_hook(); + }; + +/** +* This class represents Diffie-Hellman private keys. +*/ +class BOTAN_DLL DH_PrivateKey : public DH_PublicKey, + public PK_Key_Agreement_Key, + public virtual DL_Scheme_PrivateKey + { + public: + SecureVector derive_key(const byte other[], u32bit length) const; + SecureVector derive_key(const DH_PublicKey& other) const; + SecureVector derive_key(const BigInt& other) const; + + MemoryVector public_value() const; + + /** + * Construct an uninitialized key. Use this constructor if you wish + * to decode an encoded key into the new instance. + */ + DH_PrivateKey() {} + + /** + * Construct a private key with predetermined value. + * @param rng random number generator to use + * @param grp the group to be used in the key + * @param x the key's secret value (or if zero, generate a new key) + */ + DH_PrivateKey(RandomNumberGenerator& rng, const DL_Group& grp, + const BigInt& x = 0); + private: + void PKCS8_load_hook(RandomNumberGenerator& rng, bool = false); + DH_Core core; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/dh/dh_core.cpp b/src/libs/3rdparty/botan/src/pubkey/dh/dh_core.cpp new file mode 100644 index 00000000000..78a26a8ef1a --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dh/dh_core.cpp @@ -0,0 +1,69 @@ +/* +* PK Algorithm Core +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +const u32bit BLINDING_BITS = BOTAN_PRIVATE_KEY_OP_BLINDING_BITS; + +} + +/* +* DH_Core Constructor +*/ +DH_Core::DH_Core(RandomNumberGenerator& rng, + const DL_Group& group, const BigInt& x) + { + op = Engine_Core::dh_op(group, x); + + const BigInt& p = group.get_p(); + + BigInt k(rng, std::min(p.bits()-1, BLINDING_BITS)); + + if(k != 0) + blinder = Blinder(k, power_mod(inverse_mod(k, p), x, p), p); + } + +/* +* DH_Core Copy Constructor +*/ +DH_Core::DH_Core(const DH_Core& core) + { + op = 0; + if(core.op) + op = core.op->clone(); + blinder = core.blinder; + } + +/* +* DH_Core Assignment Operator +*/ +DH_Core& DH_Core::operator=(const DH_Core& core) + { + delete op; + if(core.op) + op = core.op->clone(); + blinder = core.blinder; + return (*this); + } + +/* +* DH Operation +*/ +BigInt DH_Core::agree(const BigInt& i) const + { + return blinder.unblind(op->agree(blinder.blind(i))); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/dh/dh_core.h b/src/libs/3rdparty/botan/src/pubkey/dh/dh_core.h new file mode 100644 index 00000000000..91b50a27af1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dh/dh_core.h @@ -0,0 +1,38 @@ +/* +* DH Core +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DH_CORE_H__ +#define BOTAN_DH_CORE_H__ + +#include +#include + +namespace Botan { + +/* +* DH Core +*/ +class BOTAN_DLL DH_Core + { + public: + BigInt agree(const BigInt&) const; + + DH_Core& operator=(const DH_Core&); + + DH_Core() { op = 0; } + DH_Core(const DH_Core&); + DH_Core(RandomNumberGenerator& rng, + const DL_Group&, const BigInt&); + ~DH_Core() { delete op; } + private: + DH_Operation* op; + Blinder blinder; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/dh/dh_op.h b/src/libs/3rdparty/botan/src/pubkey/dh/dh_op.h new file mode 100644 index 00000000000..50f3d782561 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dh/dh_op.h @@ -0,0 +1,45 @@ +/* +* DH Operations +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DH_OPS_H__ +#define BOTAN_DH_OPS_H__ + +#include +#include +#include + +namespace Botan { + +/* +* DH Operation Interface +*/ +class BOTAN_DLL DH_Operation + { + public: + virtual BigInt agree(const BigInt&) const = 0; + virtual DH_Operation* clone() const = 0; + virtual ~DH_Operation() {} + }; + +/* +* Botan's Default DH Operation +*/ +class BOTAN_DLL Default_DH_Op : public DH_Operation + { + public: + BigInt agree(const BigInt& i) const { return powermod_x_p(i); } + DH_Operation* clone() const { return new Default_DH_Op(*this); } + + Default_DH_Op(const DL_Group& group, const BigInt& x) : + powermod_x_p(x, group.get_p()) {} + private: + Fixed_Exponent_Power_Mod powermod_x_p; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/dh/info.txt b/src/libs/3rdparty/botan/src/pubkey/dh/info.txt new file mode 100644 index 00000000000..33af9a8e524 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dh/info.txt @@ -0,0 +1,20 @@ +realname "Diffie-Hellman Key Agreement" + +define DIFFIE_HELLMAN + +load_on auto + + +dh.cpp +dh.h +dh_core.cpp +dh_core.h +dh_op.h + + + +dl_algo +dl_group +libstate +numbertheory + diff --git a/src/libs/3rdparty/botan/src/pubkey/dl_algo/dl_algo.cpp b/src/libs/3rdparty/botan/src/pubkey/dl_algo/dl_algo.cpp new file mode 100644 index 00000000000..8ce34465a6d --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dl_algo/dl_algo.cpp @@ -0,0 +1,167 @@ +/* +* DL Scheme +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Return the X.509 public key encoder +*/ +X509_Encoder* DL_Scheme_PublicKey::x509_encoder() const + { + class DL_Scheme_Encoder : public X509_Encoder + { + public: + AlgorithmIdentifier alg_id() const + { + MemoryVector group = + key->group.DER_encode(key->group_format()); + + return AlgorithmIdentifier(key->get_oid(), group); + } + + MemoryVector key_bits() const + { + return DER_Encoder().encode(key->y).get_contents(); + } + + DL_Scheme_Encoder(const DL_Scheme_PublicKey* k) : key(k) {} + private: + const DL_Scheme_PublicKey* key; + }; + + return new DL_Scheme_Encoder(this); + } + +/* +* Return the X.509 public key decoder +*/ +X509_Decoder* DL_Scheme_PublicKey::x509_decoder() + { + class DL_Scheme_Decoder : public X509_Decoder + { + public: + void alg_id(const AlgorithmIdentifier& alg_id) + { + DataSource_Memory source(alg_id.parameters); + key->group.BER_decode(source, key->group_format()); + } + + void key_bits(const MemoryRegion& bits) + { + BER_Decoder(bits).decode(key->y); + key->X509_load_hook(); + } + + DL_Scheme_Decoder(DL_Scheme_PublicKey* k) : key(k) {} + private: + DL_Scheme_PublicKey* key; + }; + + return new DL_Scheme_Decoder(this); + } + +/* +* Return the PKCS #8 private key encoder +*/ +PKCS8_Encoder* DL_Scheme_PrivateKey::pkcs8_encoder() const + { + class DL_Scheme_Encoder : public PKCS8_Encoder + { + public: + AlgorithmIdentifier alg_id() const + { + MemoryVector group = + key->group.DER_encode(key->group_format()); + + return AlgorithmIdentifier(key->get_oid(), group); + } + + MemoryVector key_bits() const + { + return DER_Encoder().encode(key->x).get_contents(); + } + + DL_Scheme_Encoder(const DL_Scheme_PrivateKey* k) : key(k) {} + private: + const DL_Scheme_PrivateKey* key; + }; + + return new DL_Scheme_Encoder(this); + } + +/* +* Return the PKCS #8 private key decoder +*/ +PKCS8_Decoder* DL_Scheme_PrivateKey::pkcs8_decoder(RandomNumberGenerator& rng) + { + class DL_Scheme_Decoder : public PKCS8_Decoder + { + public: + void alg_id(const AlgorithmIdentifier& alg_id) + { + DataSource_Memory source(alg_id.parameters); + key->group.BER_decode(source, key->group_format()); + } + + void key_bits(const MemoryRegion& bits) + { + BER_Decoder(bits).decode(key->x); + key->PKCS8_load_hook(rng); + } + + DL_Scheme_Decoder(DL_Scheme_PrivateKey* k, RandomNumberGenerator& r) : + key(k), rng(r) {} + private: + DL_Scheme_PrivateKey* key; + RandomNumberGenerator& rng; + }; + + return new DL_Scheme_Decoder(this, rng); + } + +/* +* Check Public DL Parameters +*/ +bool DL_Scheme_PublicKey::check_key(RandomNumberGenerator& rng, + bool strong) const + { + if(y < 2 || y >= group_p()) + return false; + if(!group.verify_group(rng, strong)) + return false; + return true; + } + +/* +* Check DL Scheme Private Parameters +*/ +bool DL_Scheme_PrivateKey::check_key(RandomNumberGenerator& rng, + bool strong) const + { + const BigInt& p = group_p(); + const BigInt& g = group_g(); + + if(y < 2 || y >= p || x < 2 || x >= p) + return false; + if(!group.verify_group(rng, strong)) + return false; + + if(!strong) + return true; + + if(y != power_mod(g, x, p)) + return false; + + return true; + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/dl_algo/dl_algo.h b/src/libs/3rdparty/botan/src/pubkey/dl_algo/dl_algo.h new file mode 100644 index 00000000000..256ce96ee2f --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dl_algo/dl_algo.h @@ -0,0 +1,116 @@ +/* +* DL Scheme +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DL_ALGO_H__ +#define BOTAN_DL_ALGO_H__ + +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents discrete logarithm (DL) public keys. +*/ +class BOTAN_DLL DL_Scheme_PublicKey : public virtual Public_Key + { + public: + bool check_key(RandomNumberGenerator& rng, bool) const; + + /** + * Get the DL domain parameters of this key. + * @return the DL domain parameters of this key + */ + const DL_Group& get_domain() const { return group; } + + /** + * Get the public value y with y = g^x mod p where x is the secret key. + */ + const BigInt& get_y() const { return y; } + + /** + * Get the prime p of the underlying DL group. + * @return the prime p + */ + const BigInt& group_p() const { return group.get_p(); } + + /** + * Get the prime q of the underlying DL group. + * @return the prime q + */ + const BigInt& group_q() const { return group.get_q(); } + + /** + * Get the generator g of the underlying DL group. + * @return the generator g + */ + const BigInt& group_g() const { return group.get_g(); } + + /** + * Get the underlying groups encoding format. + * @return the encoding format + */ + virtual DL_Group::Format group_format() const = 0; + + /** + * Get an X509 encoder for this key. + * @return an encoder usable to encode this key. + */ + X509_Encoder* x509_encoder() const; + + /** + * Get an X509 decoder for this key. + * @return an decoder usable to decode a DL key and store the + * values in this instance. + */ + X509_Decoder* x509_decoder(); + protected: + BigInt y; + DL_Group group; + private: + virtual void X509_load_hook() {} + }; + +/** +* This class represents discrete logarithm (DL) private keys. +*/ +class BOTAN_DLL DL_Scheme_PrivateKey : public virtual DL_Scheme_PublicKey, + public virtual Private_Key + { + public: + bool check_key(RandomNumberGenerator& rng, bool) const; + + /** + * Get the secret key x. + * @return the secret key + */ + const BigInt& get_x() const { return x; } + + /** + * Get an PKCS#8 encoder for this key. + * @return an encoder usable to encode this key. + */ + PKCS8_Encoder* pkcs8_encoder() const; + + /** + * Get an PKCS#8 decoder for this key. + * @param rng the rng to use + * @return an decoder usable to decode a DL key and store the + * values in this instance. + */ + PKCS8_Decoder* pkcs8_decoder(RandomNumberGenerator& rng); + protected: + BigInt x; + private: + virtual void PKCS8_load_hook(RandomNumberGenerator&, bool = false) {} + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/dl_algo/info.txt b/src/libs/3rdparty/botan/src/pubkey/dl_algo/info.txt new file mode 100644 index 00000000000..15a77516bb5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dl_algo/info.txt @@ -0,0 +1,18 @@ +realname "Discrete Logarithm PK Algorithms" + +define DL_PUBLIC_KEY_FAMILY + +load_on auto + + +dl_algo.cpp +dl_algo.h + + + +asn1 +dl_group +numbertheory +pk_codecs +rng + diff --git a/src/libs/3rdparty/botan/src/pubkey/dl_group/dl_group.cpp b/src/libs/3rdparty/botan/src/pubkey/dl_group/dl_group.cpp new file mode 100644 index 00000000000..81c5d5e1dc7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dl_group/dl_group.cpp @@ -0,0 +1,333 @@ +/* +* Discrete Logarithm Parameters +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* DL_Group Constructor +*/ +DL_Group::DL_Group() + { + initialized = false; + } + +/* +* DL_Group Constructor +*/ +DL_Group::DL_Group(const std::string& type) + { + std::string grp_contents = global_state().get("dl", type); + + if(grp_contents == "") + throw Invalid_Argument("DL_Group: Unknown group " + type); + + DataSource_Memory pem(grp_contents); + PEM_decode(pem); + } + +/* +* DL_Group Constructor +*/ +DL_Group::DL_Group(RandomNumberGenerator& rng, + PrimeType type, u32bit pbits, u32bit qbits) + { + if(pbits < 512) + throw Invalid_Argument("DL_Group: prime size " + to_string(pbits) + + " is too small"); + + if(type == Strong) + { + p = random_safe_prime(rng, pbits); + q = (p - 1) / 2; + g = 2; + } + else if(type == Prime_Subgroup || type == DSA_Kosherizer) + { + if(type == Prime_Subgroup) + { + if(!qbits) + qbits = 2 * dl_work_factor(pbits); + + q = random_prime(rng, qbits); + BigInt X; + while(p.bits() != pbits || !is_prime(p, rng)) + { + X.randomize(rng, pbits); + p = X - (X % (2*q) - 1); + } + } + else + { + qbits = qbits ? qbits : ((pbits == 1024) ? 160 : 256); + generate_dsa_primes(rng, + global_state().algorithm_factory(), + p, q, pbits, qbits); + } + + g = make_dsa_generator(p, q); + } + + initialized = true; + } + +/* +* DL_Group Constructor +*/ +DL_Group::DL_Group(RandomNumberGenerator& rng, + const MemoryRegion& seed, u32bit pbits, u32bit qbits) + { + if(!generate_dsa_primes(rng, + global_state().algorithm_factory(), + p, q, pbits, qbits, seed)) + throw Invalid_Argument("DL_Group: The seed given does not " + "generate a DSA group"); + + g = make_dsa_generator(p, q); + + initialized = true; + } + +/* +* DL_Group Constructor +*/ +DL_Group::DL_Group(const BigInt& p1, const BigInt& g1) + { + initialize(p1, 0, g1); + } + +/* +* DL_Group Constructor +*/ +DL_Group::DL_Group(const BigInt& p1, const BigInt& q1, const BigInt& g1) + { + initialize(p1, q1, g1); + } + +/* +* DL_Group Initializer +*/ +void DL_Group::initialize(const BigInt& p1, const BigInt& q1, const BigInt& g1) + { + if(p1 < 3) + throw Invalid_Argument("DL_Group: Prime invalid"); + if(g1 < 2 || g1 >= p1) + throw Invalid_Argument("DL_Group: Generator invalid"); + if(q1 < 0 || q1 >= p1) + throw Invalid_Argument("DL_Group: Subgroup invalid"); + + p = p1; + g = g1; + q = q1; + + initialized = true; + } + +/* +* Verify that the group has been set +*/ +void DL_Group::init_check() const + { + if(!initialized) + throw Invalid_State("DLP group cannot be used uninitialized"); + } + +/* +* Verify the parameters +*/ +bool DL_Group::verify_group(RandomNumberGenerator& rng, + bool strong) const + { + init_check(); + + if(g < 2 || p < 3 || q < 0) + return false; + if((q != 0) && ((p - 1) % q != 0)) + return false; + + if(!strong) + return true; + + if(!check_prime(p, rng)) + return false; + if((q > 0) && !check_prime(q, rng)) + return false; + return true; + } + +/* +* Return the prime +*/ +const BigInt& DL_Group::get_p() const + { + init_check(); + return p; + } + +/* +* Return the generator +*/ +const BigInt& DL_Group::get_g() const + { + init_check(); + return g; + } + +/* +* Return the subgroup +*/ +const BigInt& DL_Group::get_q() const + { + init_check(); + if(q == 0) + throw Format_Error("DLP group has no q prime specified"); + return q; + } + +/* +* DER encode the parameters +*/ +SecureVector DL_Group::DER_encode(Format format) const + { + init_check(); + + if((q == 0) && (format != PKCS_3)) + throw Encoding_Error("The ANSI DL parameter formats require a subgroup"); + + if(format == ANSI_X9_57) + { + return DER_Encoder() + .start_cons(SEQUENCE) + .encode(p) + .encode(q) + .encode(g) + .end_cons() + .get_contents(); + } + else if(format == ANSI_X9_42) + { + return DER_Encoder() + .start_cons(SEQUENCE) + .encode(p) + .encode(g) + .encode(q) + .end_cons() + .get_contents(); + } + else if(format == PKCS_3) + { + return DER_Encoder() + .start_cons(SEQUENCE) + .encode(p) + .encode(g) + .end_cons() + .get_contents(); + } + + throw Invalid_Argument("Unknown DL_Group encoding " + to_string(format)); + } + +/* +* PEM encode the parameters +*/ +std::string DL_Group::PEM_encode(Format format) const + { + SecureVector encoding = DER_encode(format); + if(format == PKCS_3) + return PEM_Code::encode(encoding, "DH PARAMETERS"); + else if(format == ANSI_X9_57) + return PEM_Code::encode(encoding, "DSA PARAMETERS"); + else if(format == ANSI_X9_42) + return PEM_Code::encode(encoding, "X942 DH PARAMETERS"); + else + throw Invalid_Argument("Unknown DL_Group encoding " + to_string(format)); + } + +/* +* Decode BER encoded parameters +*/ +void DL_Group::BER_decode(DataSource& source, Format format) + { + BigInt new_p, new_q, new_g; + + BER_Decoder decoder(source); + BER_Decoder ber = decoder.start_cons(SEQUENCE); + + if(format == ANSI_X9_57) + { + ber.decode(new_p) + .decode(new_q) + .decode(new_g) + .verify_end(); + } + else if(format == ANSI_X9_42) + { + ber.decode(new_p) + .decode(new_g) + .decode(new_q) + .discard_remaining(); + } + else if(format == PKCS_3) + { + ber.decode(new_p) + .decode(new_g) + .discard_remaining(); + } + else + throw Invalid_Argument("Unknown DL_Group encoding " + to_string(format)); + + initialize(new_p, new_q, new_g); + } + +/* +* Decode PEM encoded parameters +*/ +void DL_Group::PEM_decode(DataSource& source) + { + std::string label; + DataSource_Memory ber(PEM_Code::decode(source, label)); + + if(label == "DH PARAMETERS") + BER_decode(ber, PKCS_3); + else if(label == "DSA PARAMETERS") + BER_decode(ber, ANSI_X9_57); + else if(label == "X942 DH PARAMETERS") + BER_decode(ber, ANSI_X9_42); + else + throw Decoding_Error("DL_Group: Invalid PEM label " + label); + } + +/* +* Create a random DSA-style generator +*/ +BigInt DL_Group::make_dsa_generator(const BigInt& p, const BigInt& q) + { + BigInt g, e = (p - 1) / q; + + for(u32bit j = 0; j != PRIME_TABLE_SIZE; ++j) + { + g = power_mod(PRIMES[j], e, p); + if(g != 1) + break; + } + + if(g == 1) + throw Exception("DL_Group: Couldn't create a suitable generator"); + + return g; + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/dl_group/dl_group.h b/src/libs/3rdparty/botan/src/pubkey/dl_group/dl_group.h new file mode 100644 index 00000000000..a84a85f872f --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dl_group/dl_group.h @@ -0,0 +1,162 @@ +/* +* Discrete Logarithm Group +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DL_PARAM_H__ +#define BOTAN_DL_PARAM_H__ + +#include +#include + +namespace Botan { + +/** +* This class represents discrete logarithm groups. It holds a prime p, +* a prime q = (p-1)/2 and g = x^((p-1)/q) mod p. +*/ +class BOTAN_DLL DL_Group + { + public: + /** + * Get the prime p. + * @return the prime p + */ + const BigInt& get_p() const; + + /** + * Get the prime q. + * @return the prime q + */ + const BigInt& get_q() const; + + /** + * Get the base g. + * @return the base g + */ + const BigInt& get_g() const; + + /** + * The DL group encoding format variants. + */ + enum Format { + ANSI_X9_42, + ANSI_X9_57, + PKCS_3, + + DSA_PARAMETERS = ANSI_X9_57, + DH_PARAMETERS = ANSI_X9_42, + X942_DH_PARAMETERS = ANSI_X9_42, + PKCS3_DH_PARAMETERS = PKCS_3 + }; + + /** + * Determine the prime creation for DL groups. + */ + enum PrimeType { Strong, Prime_Subgroup, DSA_Kosherizer }; + + /** + * Perform validity checks on the group. + * @param rng the rng to use + * @param strong whether to perform stronger by lengthier tests + * @return true if the object is consistent, false otherwise + */ + bool verify_group(RandomNumberGenerator& rng, bool strong) const; + + /** + * Encode this group into a string using PEM encoding. + * @param format the encoding format + * @return the string holding the PEM encoded group + */ + std::string PEM_encode(Format format) const; + + /** + * Encode this group into a string using DER encoding. + * @param format the encoding format + * @return the string holding the DER encoded group + */ + SecureVector DER_encode(Format format) const; + + /** + * Decode a DER/BER encoded group into this instance. + * @param src a DataSource providing the encoded group + * @param format the format of the encoded group + */ + void BER_decode(DataSource& src, Format format); + + /** + * Decode a PEM encoded group into this instance. + * @param src a DataSource providing the encoded group + */ + void PEM_decode(DataSource& src); + + /** + * Construct a DL group with uninitialized internal value. + * Use this constructor is you wish to set the groups values + * from a DER or PEM encoded group. + */ + DL_Group(); + + /** + * Construct a DL group that is registered in the configuration. + * @param name the name that is configured in the global configuration + * for the desired group. If no configuration file is specified, + * the default values from the file policy.cpp will be used. For instance, + * use "modp/ietf/768" as name. + */ + DL_Group(const std::string& name); + + /** + * Create a new group randomly. + * @param rng the random number generator to use + * @param type specifies how the creation of primes p and q shall + * be performed. If type=Strong, then p will be determined as a + * safe prime, and q will be chosen as (p-1)/2. If + * type=Prime_Subgroup and qbits = 0, then the size of q will be + * determined according to the estimated difficulty of the DL + * problem. If type=DSA_Kosherizer, DSA primes will be created. + * @param pbits the number of bits of p + * @param qbits the number of bits of q. Leave it as 0 to have + * the value determined according to pbits. + */ + DL_Group(RandomNumberGenerator& rng, PrimeType type, + u32bit pbits, u32bit qbits = 0); + + /** + * Create a DSA group with a given seed. + * @param rng the random number generator to use + * @param seed the seed to use to create the random primes + * @param pbits the desired bit size of the prime p + * @param qbits the desired bit size of the prime q. + */ + DL_Group(RandomNumberGenerator& rng, const MemoryRegion& seed, + u32bit pbits = 1024, u32bit qbits = 0); + + /** + * Create a DL group. The prime q will be determined according to p. + * @param p the prime p + * @param g the base g + */ + DL_Group(const BigInt& p, const BigInt& g); + + /** + * Create a DL group. + * @param p the prime p + * @param q the prime q + * @param g the base g + */ + DL_Group(const BigInt& p, const BigInt& q, const BigInt& g); + private: + static BigInt make_dsa_generator(const BigInt&, const BigInt&); + + void init_check() const; + void initialize(const BigInt&, const BigInt&, const BigInt&); + bool initialized; + BigInt p, q, g; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/dl_group/info.txt b/src/libs/3rdparty/botan/src/pubkey/dl_group/info.txt new file mode 100644 index 00000000000..6b9884a4daa --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dl_group/info.txt @@ -0,0 +1,19 @@ +realname "DL Group" + +load_on auto + +define DL_GROUP + + +dl_group.cpp +dl_group.h + + + +asn1 +bigint +filters +libstate +numbertheory +pem + diff --git a/src/libs/3rdparty/botan/src/pubkey/dlies/dlies.cpp b/src/libs/3rdparty/botan/src/pubkey/dlies/dlies.cpp new file mode 100644 index 00000000000..c441ed17cdb --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dlies/dlies.cpp @@ -0,0 +1,137 @@ +/* +* DLIES +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* DLIES_Encryptor Constructor +*/ +DLIES_Encryptor::DLIES_Encryptor(const PK_Key_Agreement_Key& k, + KDF* kdf_obj, + MessageAuthenticationCode* mac_obj, + u32bit mac_kl) : + key(k), kdf(kdf_obj), mac(mac_obj), mac_keylen(mac_kl) + { + } + +DLIES_Encryptor::~DLIES_Encryptor() + { + delete kdf; + delete mac; + } + +/* +* DLIES Encryption +*/ +SecureVector DLIES_Encryptor::enc(const byte in[], u32bit length, + RandomNumberGenerator&) const + { + if(length > maximum_input_size()) + throw Invalid_Argument("DLIES: Plaintext too large"); + if(other_key.is_empty()) + throw Invalid_State("DLIES: The other key was never set"); + + MemoryVector v = key.public_value(); + + SecureVector out(v.size() + length + mac->OUTPUT_LENGTH); + out.copy(v, v.size()); + out.copy(v.size(), in, length); + + SecureVector vz(v, key.derive_key(other_key, other_key.size())); + + const u32bit K_LENGTH = length + mac_keylen; + OctetString K = kdf->derive_key(K_LENGTH, vz, vz.size()); + if(K.length() != K_LENGTH) + throw Encoding_Error("DLIES: KDF did not provide sufficient output"); + byte* C = out + v.size(); + + xor_buf(C, K.begin() + mac_keylen, length); + mac->set_key(K.begin(), mac_keylen); + + mac->update(C, length); + for(u32bit j = 0; j != 8; ++j) + mac->update(0); + + mac->final(C + length); + + return out; + } + +/* +* Set the other parties public key +*/ +void DLIES_Encryptor::set_other_key(const MemoryRegion& ok) + { + other_key = ok; + } + +/* +* Return the max size, in bytes, of a message +*/ +u32bit DLIES_Encryptor::maximum_input_size() const + { + return 32; + } + +/* +* DLIES_Decryptor Constructor +*/ +DLIES_Decryptor::DLIES_Decryptor(const PK_Key_Agreement_Key& k, + KDF* kdf_obj, + MessageAuthenticationCode* mac_obj, + u32bit mac_kl) : + key(k), kdf(kdf_obj), mac(mac_obj), mac_keylen(mac_kl) + { + } + +DLIES_Decryptor::~DLIES_Decryptor() + { + delete kdf; + delete mac; + } + +/* +* DLIES Decryption +*/ +SecureVector DLIES_Decryptor::dec(const byte msg[], u32bit length) const + { + const u32bit public_len = key.public_value().size(); + + if(length < public_len + mac->OUTPUT_LENGTH) + throw Decoding_Error("DLIES decryption: ciphertext is too short"); + + const u32bit CIPHER_LEN = length - public_len - mac->OUTPUT_LENGTH; + + SecureVector v(msg, public_len); + SecureVector C(msg + public_len, CIPHER_LEN); + SecureVector T(msg + public_len + CIPHER_LEN, mac->OUTPUT_LENGTH); + + SecureVector vz(v, key.derive_key(v, v.size())); + + const u32bit K_LENGTH = C.size() + mac_keylen; + OctetString K = kdf->derive_key(K_LENGTH, vz, vz.size()); + if(K.length() != K_LENGTH) + throw Encoding_Error("DLIES: KDF did not provide sufficient output"); + + mac->set_key(K.begin(), mac_keylen); + mac->update(C); + for(u32bit j = 0; j != 8; ++j) + mac->update(0); + SecureVector T2 = mac->final(); + if(T != T2) + throw Integrity_Failure("DLIES: message authentication failed"); + + xor_buf(C, K.begin() + mac_keylen, C.size()); + + return C; + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/dlies/dlies.h b/src/libs/3rdparty/botan/src/pubkey/dlies/dlies.h new file mode 100644 index 00000000000..88a22b9de07 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dlies/dlies.h @@ -0,0 +1,69 @@ +/* +* DLIES +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DLIES_H__ +#define BOTAN_DLIES_H__ + +#include +#include +#include + +namespace Botan { + +/* +* DLIES Encryption +*/ +class BOTAN_DLL DLIES_Encryptor : public PK_Encryptor + { + public: + DLIES_Encryptor(const PK_Key_Agreement_Key&, + KDF* kdf, + MessageAuthenticationCode* mac, + u32bit mac_key_len = 20); + + ~DLIES_Encryptor(); + + void set_other_key(const MemoryRegion&); + private: + SecureVector enc(const byte[], u32bit, + RandomNumberGenerator&) const; + u32bit maximum_input_size() const; + + const PK_Key_Agreement_Key& key; + SecureVector other_key; + + KDF* kdf; + MessageAuthenticationCode* mac; + u32bit mac_keylen; + }; + +/* +* DLIES Decryption +*/ +class BOTAN_DLL DLIES_Decryptor : public PK_Decryptor + { + public: + DLIES_Decryptor(const PK_Key_Agreement_Key&, + KDF* kdf, + MessageAuthenticationCode* mac, + u32bit mac_key_len = 20); + + ~DLIES_Decryptor(); + + private: + SecureVector dec(const byte[], u32bit) const; + + const PK_Key_Agreement_Key& key; + + KDF* kdf; + MessageAuthenticationCode* mac; + u32bit mac_keylen; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/dlies/info.txt b/src/libs/3rdparty/botan/src/pubkey/dlies/info.txt new file mode 100644 index 00000000000..5138aafc571 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dlies/info.txt @@ -0,0 +1,16 @@ +realname "DLIES" + +define DLIES + +load_on auto + + +dlies.cpp +dlies.h + + + +kdf +libstate +mac + diff --git a/src/libs/3rdparty/botan/src/pubkey/dsa/dsa.cpp b/src/libs/3rdparty/botan/src/pubkey/dsa/dsa.cpp new file mode 100644 index 00000000000..b0688ae0dc1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dsa/dsa.cpp @@ -0,0 +1,134 @@ +/* +* DSA +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* DSA_PublicKey Constructor +*/ +DSA_PublicKey::DSA_PublicKey(const DL_Group& grp, const BigInt& y1) + { + group = grp; + y = y1; + X509_load_hook(); + } + +/* +* Algorithm Specific X.509 Initialization Code +*/ +void DSA_PublicKey::X509_load_hook() + { + core = DSA_Core(group, y); + } + +/* +* DSA Verification Function +*/ +bool DSA_PublicKey::verify(const byte msg[], u32bit msg_len, + const byte sig[], u32bit sig_len) const + { + return core.verify(msg, msg_len, sig, sig_len); + } + +/* +* Return the maximum input size in bits +*/ +u32bit DSA_PublicKey::max_input_bits() const + { + return group_q().bits(); + } + +/* +* Return the size of each portion of the sig +*/ +u32bit DSA_PublicKey::message_part_size() const + { + return group_q().bytes(); + } + +/* +* Create a DSA private key +*/ +DSA_PrivateKey::DSA_PrivateKey(RandomNumberGenerator& rng, + const DL_Group& grp, + const BigInt& x_arg) + { + group = grp; + x = x_arg; + + if(x == 0) + { + x = BigInt::random_integer(rng, 2, group_q() - 1); + PKCS8_load_hook(rng, true); + } + else + PKCS8_load_hook(rng, false); + } + +/* +* Algorithm Specific PKCS #8 Initialization Code +*/ +void DSA_PrivateKey::PKCS8_load_hook(RandomNumberGenerator& rng, + bool generated) + { + y = power_mod(group_g(), x, group_p()); + core = DSA_Core(group, y, x); + + if(generated) + gen_check(rng); + else + load_check(rng); + } + +/* +* DSA Signature Operation +*/ +SecureVector DSA_PrivateKey::sign(const byte in[], u32bit length, + RandomNumberGenerator& rng) const + { + const BigInt& q = group_q(); + + BigInt k; + do + k.randomize(rng, q.bits()); + while(k >= q); + + return core.sign(in, length, k); + } + +/* +* Check Private DSA Parameters +*/ +bool DSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const + { + if(!DL_Scheme_PrivateKey::check_key(rng, strong) || x >= group_q()) + return false; + + if(!strong) + return true; + + try + { + KeyPair::check_key(rng, + get_pk_signer(*this, "EMSA1(SHA-1)"), + get_pk_verifier(*this, "EMSA1(SHA-1)") + ); + } + catch(Self_Test_Failure) + { + return false; + } + + return true; + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/dsa/dsa.h b/src/libs/3rdparty/botan/src/pubkey/dsa/dsa.h new file mode 100644 index 00000000000..4c9b708f4cd --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dsa/dsa.h @@ -0,0 +1,62 @@ +/* +* DSA +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DSA_H__ +#define BOTAN_DSA_H__ + +#include +#include + +namespace Botan { + +/* +* DSA Public Key +*/ +class BOTAN_DLL DSA_PublicKey : public PK_Verifying_wo_MR_Key, + public virtual DL_Scheme_PublicKey + { + public: + std::string algo_name() const { return "DSA"; } + + DL_Group::Format group_format() const { return DL_Group::ANSI_X9_57; } + u32bit message_parts() const { return 2; } + u32bit message_part_size() const; + + bool verify(const byte[], u32bit, const byte[], u32bit) const; + u32bit max_input_bits() const; + + DSA_PublicKey() {} + DSA_PublicKey(const DL_Group&, const BigInt&); + protected: + DSA_Core core; + private: + void X509_load_hook(); + }; + +/* +* DSA Private Key +*/ +class BOTAN_DLL DSA_PrivateKey : public DSA_PublicKey, + public PK_Signing_Key, + public virtual DL_Scheme_PrivateKey + { + public: + SecureVector sign(const byte[], u32bit, + RandomNumberGenerator& rng) const; + + bool check_key(RandomNumberGenerator& rng, bool) const; + + DSA_PrivateKey() {} + DSA_PrivateKey(RandomNumberGenerator&, const DL_Group&, + const BigInt& = 0); + private: + void PKCS8_load_hook(RandomNumberGenerator& rng, bool = false); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/dsa/dsa_core.cpp b/src/libs/3rdparty/botan/src/pubkey/dsa/dsa_core.cpp new file mode 100644 index 00000000000..e5a23a5c338 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dsa/dsa_core.cpp @@ -0,0 +1,63 @@ +/* +* DSA Core +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* DSA_Core Constructor +*/ +DSA_Core::DSA_Core(const DL_Group& group, const BigInt& y, const BigInt& x) + { + op = Engine_Core::dsa_op(group, y, x); + } + +/* +* DSA_Core Copy Constructor +*/ +DSA_Core::DSA_Core(const DSA_Core& core) + { + op = 0; + if(core.op) + op = core.op->clone(); + } + +/* +* DSA_Core Assignment Operator +*/ +DSA_Core& DSA_Core::operator=(const DSA_Core& core) + { + delete op; + if(core.op) + op = core.op->clone(); + return (*this); + } + +/* +* DSA Verification Operation +*/ +bool DSA_Core::verify(const byte msg[], u32bit msg_length, + const byte sig[], u32bit sig_length) const + { + return op->verify(msg, msg_length, sig, sig_length); + } + +/* +* DSA Signature Operation +*/ +SecureVector DSA_Core::sign(const byte in[], u32bit length, + const BigInt& k) const + { + return op->sign(in, length, k); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/dsa/dsa_core.h b/src/libs/3rdparty/botan/src/pubkey/dsa/dsa_core.h new file mode 100644 index 00000000000..8bb16211f29 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dsa/dsa_core.h @@ -0,0 +1,37 @@ +/* +* DSA Core +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DSA_CORE_H__ +#define BOTAN_DSA_CORE_H__ + +#include +#include + +namespace Botan { + +/* +* DSA Core +*/ +class BOTAN_DLL DSA_Core + { + public: + SecureVector sign(const byte[], u32bit, const BigInt&) const; + bool verify(const byte[], u32bit, const byte[], u32bit) const; + + DSA_Core& operator=(const DSA_Core&); + + DSA_Core() { op = 0; } + DSA_Core(const DSA_Core&); + DSA_Core(const DL_Group&, const BigInt&, const BigInt& = 0); + ~DSA_Core() { delete op; } + private: + DSA_Operation* op; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/dsa/dsa_op.cpp b/src/libs/3rdparty/botan/src/pubkey/dsa/dsa_op.cpp new file mode 100644 index 00000000000..5b921441d6e --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dsa/dsa_op.cpp @@ -0,0 +1,73 @@ +/* +* DSA Operations +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Default_DSA_Op Constructor +*/ +Default_DSA_Op::Default_DSA_Op(const DL_Group& grp, const BigInt& y1, + const BigInt& x1) : x(x1), y(y1), group(grp) + { + powermod_g_p = Fixed_Base_Power_Mod(group.get_g(), group.get_p()); + powermod_y_p = Fixed_Base_Power_Mod(y, group.get_p()); + mod_p = Modular_Reducer(group.get_p()); + mod_q = Modular_Reducer(group.get_q()); + } + +/* +* Default DSA Verify Operation +*/ +bool Default_DSA_Op::verify(const byte msg[], u32bit msg_len, + const byte sig[], u32bit sig_len) const + { + const BigInt& q = group.get_q(); + + if(sig_len != 2*q.bytes() || msg_len > q.bytes()) + return false; + + BigInt r(sig, q.bytes()); + BigInt s(sig + q.bytes(), q.bytes()); + BigInt i(msg, msg_len); + + if(r <= 0 || r >= q || s <= 0 || s >= q) + return false; + + s = inverse_mod(s, q); + s = mod_p.multiply(powermod_g_p(mod_q.multiply(s, i)), + powermod_y_p(mod_q.multiply(s, r))); + + return (mod_q.reduce(s) == r); + } + +/* +* Default DSA Sign Operation +*/ +SecureVector Default_DSA_Op::sign(const byte in[], u32bit length, + const BigInt& k) const + { + if(x == 0) + throw Internal_Error("Default_DSA_Op::sign: No private key"); + + const BigInt& q = group.get_q(); + BigInt i(in, length); + + BigInt r = mod_q.reduce(powermod_g_p(k)); + BigInt s = mod_q.multiply(inverse_mod(k, q), mul_add(x, r, i)); + + if(r.is_zero() || s.is_zero()) + throw Internal_Error("Default_DSA_Op::sign: r or s was zero"); + + SecureVector output(2*q.bytes()); + r.binary_encode(output + (output.size() / 2 - r.bytes())); + s.binary_encode(output + (output.size() - s.bytes())); + return output; + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/dsa/dsa_op.h b/src/libs/3rdparty/botan/src/pubkey/dsa/dsa_op.h new file mode 100644 index 00000000000..0b112c6a1b4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dsa/dsa_op.h @@ -0,0 +1,53 @@ +/* +* DSA Operations +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DSA_OPS_H__ +#define BOTAN_DSA_OPS_H__ + +#include +#include +#include +#include + +namespace Botan { + +/* +* DSA Operation +*/ +class BOTAN_DLL DSA_Operation + { + public: + virtual bool verify(const byte[], u32bit, + const byte[], u32bit) const = 0; + virtual SecureVector sign(const byte[], u32bit, + const BigInt&) const = 0; + virtual DSA_Operation* clone() const = 0; + virtual ~DSA_Operation() {} + }; + +/* +* Botan's Default DSA Operation +*/ +class BOTAN_DLL Default_DSA_Op : public DSA_Operation + { + public: + bool verify(const byte[], u32bit, const byte[], u32bit) const; + SecureVector sign(const byte[], u32bit, const BigInt&) const; + + DSA_Operation* clone() const { return new Default_DSA_Op(*this); } + + Default_DSA_Op(const DL_Group&, const BigInt&, const BigInt&); + private: + const BigInt x, y; + const DL_Group group; + Fixed_Base_Power_Mod powermod_g_p, powermod_y_p; + Modular_Reducer mod_p, mod_q; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/dsa/info.txt b/src/libs/3rdparty/botan/src/pubkey/dsa/info.txt new file mode 100644 index 00000000000..c70e02d9095 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/dsa/info.txt @@ -0,0 +1,22 @@ +realname "DSA" + +define DSA + +load_on auto + + +dsa.cpp +dsa.h +dsa_core.cpp +dsa_core.h +dsa_op.cpp +dsa_op.h + + + +dl_algo +dl_group +keypair +libstate +numbertheory + diff --git a/src/libs/3rdparty/botan/src/pubkey/ec_dompar/ec_dompar.cpp b/src/libs/3rdparty/botan/src/pubkey/ec_dompar/ec_dompar.cpp new file mode 100644 index 00000000000..6cfcc0619b2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ec_dompar/ec_dompar.cpp @@ -0,0 +1,573 @@ + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +std::vector get_standard_domain_parameter(const std::string& oid) + { + // using a linear search here is pretty nasty... revisit + + /* SEC2 */ + + if(oid == "1.3.132.0.6") + { + /* secp112r1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xdb7c2abf62e35e668076bead208b"); //p + dom_par.push_back("0xDB7C2ABF62E35E668076BEAD2088"); // a + dom_par.push_back("0x659EF8BA043916EEDE8911702B22"); // b + dom_par.push_back("0409487239995A5EE76B55F9C2F098A89CE5AF8724C0A23E0E0ff77500"); // G + dom_par.push_back("0xDB7C2ABF62E35E7628DFAC6561C5"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.132.0.7") + { + /* secp112r2; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xdb7c2abf62e35e668076bead208b"); //p + dom_par.push_back("0x6127C24C05F38A0AAAF65C0EF02C"); // a + dom_par.push_back("0x51DEF1815DB5ED74FCC34C85D709"); // b + dom_par.push_back("044BA30AB5E892B4E1649DD0928643ADCD46F5882E3747DEF36E956E97"); // G + dom_par.push_back("0x36DF0AAFD8B8D7597CA10520D04B"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.132.0.28") + { + /* secp128r1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xfffffffdffffffffffffffffffffffff"); //p + dom_par.push_back("0xffffffFDffffffffffffffffffffffFC"); // a + dom_par.push_back("0xE87579C11079F43DD824993C2CEE5ED3"); // b + dom_par.push_back("04161ff7528B899B2D0C28607CA52C5B86CF5AC8395BAFEB13C02DA292DDED7A83"); // G + dom_par.push_back("0xffffffFE0000000075A30D1B9038A115"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.132.0.29") + { + /* secp128r2; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xfffffffdffffffffffffffffffffffff"); //p + dom_par.push_back("0xD6031998D1B3BBFEBF59CC9BBff9AEE1"); // a + dom_par.push_back("0x5EEEFCA380D02919DC2C6558BB6D8A5D"); // b + dom_par.push_back("047B6AA5D85E572983E6FB32A7CDEBC14027B6916A894D3AEE7106FE805FC34B44"); // G + dom_par.push_back("0x3ffffffF7ffffffFBE0024720613B5A3"); // order + dom_par.push_back("4"); // cofactor + + return dom_par; + } + + if(oid == "1.3.132.0.9") + { + /* secp160k1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xfffffffffffffffffffffffffffffffeffffac73"); //p + dom_par.push_back("0x0000000000000000000000000000000000000000"); // a + dom_par.push_back("0x0000000000000000000000000000000000000007"); // b + dom_par.push_back("043B4C382CE37AA192A4019E763036F4F5DD4D7EBB938CF935318FDCED6BC28286531733C3F03C4FEE"); // G + dom_par.push_back("0x0100000000000000000001B8FA16DFAB9ACA16B6B3"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.132.0.30") + { + /* secp160r2; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xfffffffffffffffffffffffffffffffeffffac73"); //p + dom_par.push_back("0xffffffffffffffffffffffffffffffFEffffAC70"); // a + dom_par.push_back("0xB4E134D3FB59EB8BAB57274904664D5AF50388BA"); // b + dom_par.push_back("0452DCB034293A117E1F4ff11B30F7199D3144CE6DFEAffEF2E331F296E071FA0DF9982CFEA7D43F2E"); // G + dom_par.push_back("0x0100000000000000000000351EE786A818F3A1A16B"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.132.0.31") + { + /* secp192k1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xfffffffffffffffffffffffffffffffffffffffeffffee37"); //p + dom_par.push_back("0x000000000000000000000000000000000000000000000000"); // a + dom_par.push_back("0x000000000000000000000000000000000000000000000003"); // b + dom_par.push_back("04DB4ff10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D"); // G + dom_par.push_back("0xffffffffffffffffffffffFE26F2FC170F69466A74DEFD8D"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.132.0.32") + { + /* secp224k1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xfffffffffffffffffffffffffffffffffffffffffffffffeffffe56d"); //p + dom_par.push_back("0x00000000000000000000000000000000000000000000000000000000"); // a + dom_par.push_back("0x00000000000000000000000000000000000000000000000000000005"); // b + dom_par.push_back("04A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5"); // G + dom_par.push_back("0x010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.132.0.33") + { + /* secp224r1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xffffffffffffffffffffffffffffffff000000000000000000000001"); //p + dom_par.push_back("0xffffffffffffffffffffffffffffffFEffffffffffffffffffffffFE"); // a + dom_par.push_back("0xB4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355ffB4"); // b + dom_par.push_back("04B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34"); // G + dom_par.push_back("0xffffffffffffffffffffffffffff16A2E0B8F03E13DD29455C5C2A3D"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.132.0.10") + { + /* secp256k1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"); //p + dom_par.push_back("0x0000000000000000000000000000000000000000000000000000000000000000"); // a + dom_par.push_back("0x0000000000000000000000000000000000000000000000000000000000000007"); // b + dom_par.push_back("0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8"); // G + dom_par.push_back("0xffffffffffffffffffffffffffffffFEBAAEDCE6AF48A03BBFD25E8CD0364141"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.132.0.34") + { + /* secp384r1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"); //p + dom_par.push_back("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFEffffffff0000000000000000ffffffFC"); // a + dom_par.push_back("0xB3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF"); // b + dom_par.push_back("04AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB73617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F"); // G + dom_par.push_back("0xffffffffffffffffffffffffffffffffffffffffffffffffC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.132.0.35") + { + /* secp521r1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); //p + dom_par.push_back("0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFC"); // a + dom_par.push_back("0x0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00"); // b + dom_par.push_back("0400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2ffA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"); // G + dom_par.push_back("0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + /* NIS */ + + if(oid == "1.3.6.1.4.1.8301.3.1.2.9.0.38") + { + /* NIST curve P-521; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); //p + dom_par.push_back("0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFC"); // a + dom_par.push_back("0x051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00"); // b + dom_par.push_back("0400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2ffA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"); // G + dom_par.push_back("0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + /* BrainPool */ + + if(oid == "1.3.36.3.3.2.8.1.1.1") + { + /* brainpoolP160r1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xE95E4A5F737059DC60DFC7AD95B3D8139515620F"); //p + dom_par.push_back("0x340E7BE2A280EB74E2BE61BADA745D97E8F7C300"); // a + dom_par.push_back("0x1E589A8595423412134FAA2DBDEC95C8D8675E58"); // b + dom_par.push_back("04BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC31667CB477A1A8EC338F94741669C976316DA6321"); // G + dom_par.push_back("0xE95E4A5F737059DC60DF5991D45029409E60FC09"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.36.3.3.2.8.1.1.3") + { + /* brainpoolP192r1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xC302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297"); //p + dom_par.push_back("0x6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF"); // a + dom_par.push_back("0x469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9"); // b + dom_par.push_back("04C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD614B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F"); // G + dom_par.push_back("0xC302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.36.3.3.2.8.1.1.5") + { + /* brainpoolP224r1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xD7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF"); //p + dom_par.push_back("0x68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43"); // a + dom_par.push_back("0x2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B"); // b + dom_par.push_back("040D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD"); // G + dom_par.push_back("0xD7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.36.3.3.2.8.1.1.7") + { + /* brainpoolP256r1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xA9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377"); //p + dom_par.push_back("0x7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9"); // a + dom_par.push_back("0x26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6"); // b + dom_par.push_back("048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997"); // G + dom_par.push_back("0xA9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.36.3.3.2.8.1.1.9") + { + /* brainpoolP320r1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xD35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27"); //p + dom_par.push_back("0x3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4"); // a + dom_par.push_back("0x520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6"); // b + dom_par.push_back("0443BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E2061114FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1"); // G + dom_par.push_back("0xD35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.36.3.3.2.8.1.1.11") + { + /* brainpoolP384r1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0x8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53"); //p + dom_par.push_back("0x7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826"); // a + dom_par.push_back("0x4A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11"); // b + dom_par.push_back("041D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315"); // G + dom_par.push_back("0x8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.36.3.3.2.8.1.1.13") + { + /* brainpoolP512r1; source: Flexiprovider */ + std::vector dom_par; + dom_par.push_back("0xAADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3"); //p + dom_par.push_back("0x7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA"); // a + dom_par.push_back("0x3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723"); // b + dom_par.push_back("0481AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F8227DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892"); // G + dom_par.push_back("0xAADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069"); // order + dom_par.push_back("1"); // cofactor + + return dom_par; + } + + if(oid == "1.3.132.0.8") + { + std::vector dom_par; + dom_par.push_back("0xffffffffffffffffffffffffffffffff7fffffff"); //p + dom_par.push_back("0xffffffffffffffffffffffffffffffff7ffffffc"); // a + dom_par.push_back("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); // b + dom_par.push_back("024a96b5688ef573284664698968c38bb913cbfc82"); // G + dom_par.push_back("0x0100000000000000000001f4c8f927aed3ca752257"); // order + dom_par.push_back("1"); // cofactor + return dom_par; + } + + if(oid == "1.2.840.10045.3.1.1") // prime192v1 Flexiprovider + { + std::vector dom_par; + dom_par.push_back("0xfffffffffffffffffffffffffffffffeffffffffffffffff"); //p + dom_par.push_back("0xfffffffffffffffffffffffffffffffefffffffffffffffc"); // a + dom_par.push_back("0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1"); // b + dom_par.push_back("03188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012"); // G + dom_par.push_back("0xffffffffffffffffffffffff99def836146bc9b1b4d22831"); // order + dom_par.push_back("1"); // cofactor + return dom_par; + } + + /* prime192v2; source: Flexiprovider */ + if(oid == "1.2.840.10045.3.1.2") + { + std::vector dom_par; + dom_par.push_back("0xfffffffffffffffffffffffffffffffeffffffffffffffff"); //p + dom_par.push_back("0xffffffffffffffffffffffffffffffFeffffffffffffffFC"); // a + dom_par.push_back("0xcc22d6dfb95c6b25e49c0d6364a4e5980c393aa21668d953"); // b + dom_par.push_back("03eea2bae7e1497842f2de7769cfe9c989c072ad696f48034a"); // G + dom_par.push_back("0xfffffffffffffffffffffffe5fb1a724dc80418648d8dd31"); // order + dom_par.push_back("1"); // cofactor + return dom_par; + } + + /* prime192v3; source: Flexiprovider */ + if(oid == "1.2.840.10045.3.1.3") + { + std::vector dom_par; + dom_par.push_back("0xfffffffffffffffffffffffffffffffeffffffffffffffff"); //p + dom_par.push_back("0xfffffffffffffffffffffffffffffffefffffffffffffffc"); // a + dom_par.push_back("0x22123dc2395a05caa7423daeccc94760a7d462256bd56916"); // b + dom_par.push_back("027d29778100c65a1da1783716588dce2b8b4aee8e228f1896"); // G + dom_par.push_back("0xffffffffffffffffffffffff7a62d031c83f4294f640ec13"); // order + dom_par.push_back("1"); // cofactor + return dom_par; + } + + /* prime239v1; source: Flexiprovider */ + if(oid == "1.2.840.10045.3.1.4") + { + std::vector dom_par; + dom_par.push_back("0x7fffffffffffffffffffffff7fffffffffff8000000000007fffffffffff"); //p + dom_par.push_back("0x7ffFffffffffffffffffffff7fffffffffff8000000000007ffffffffffc"); // a + dom_par.push_back("0x6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A"); // b + dom_par.push_back("020ffA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF"); // G + dom_par.push_back("0x7fffffffffffffffffffffff7fffff9e5e9a9f5d9071fbd1522688909d0b"); // order + dom_par.push_back("1"); // cofactor + return dom_par; + } + + /* prime239v2; source: Flexiprovider */ + if(oid == "1.2.840.10045.3.1.5") + { + std::vector dom_par; + dom_par.push_back("0x7fffffffffffffffffffffff7fffffffffff8000000000007fffffffffff"); //p + dom_par.push_back("0x7ffFffffffffffffffffffff7ffFffffffff8000000000007ffFffffffFC"); // a + dom_par.push_back("0x617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C"); // b + dom_par.push_back("0238AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7"); // G + dom_par.push_back("0x7fffffffffffffffffffffff800000CFA7E8594377D414C03821BC582063"); // order + dom_par.push_back("1"); // cofactor + return dom_par; + } + + /* prime239v3; source: Flexiprovider */ + if(oid == "1.2.840.10045.3.1.6") + { + std::vector dom_par; + dom_par.push_back("0x7fffffffffffffffffffffff7fffffffffff8000000000007fffffffffff"); //p + dom_par.push_back("0x7ffFffffffffffffffffffff7ffFffffffff8000000000007ffFffffffFC"); // a + dom_par.push_back("0x255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E"); // b + dom_par.push_back("036768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A"); // G + dom_par.push_back("0x7fffffffffffffffffffffff7fffff975DEB41B3A6057C3C432146526551"); // order + dom_par.push_back("1"); // cofactor + return dom_par; + } + + /* prime256v1; source: Flexiprovider */ + if(oid == "1.2.840.10045.3.1.7") + { + std::vector dom_par; + dom_par.push_back("0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff"); //p + dom_par.push_back("0xffffffff00000001000000000000000000000000ffffffffffffffffffffffFC"); // a + dom_par.push_back("0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B"); // b + dom_par.push_back("036B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"); // G + dom_par.push_back("0xffffffff00000000ffffffffffffffffBCE6FAADA7179E84F3B9CAC2FC632551"); // order + dom_par.push_back("1"); // cofactor + return dom_par; + } + + throw Invalid_Argument("No such ECC curve " + oid); + } + +EC_Domain_Params get_ec_dompar(const std::string& oid) + { + std::vector dom_par = get_standard_domain_parameter(oid); + + BigInt p(dom_par[0]); // give as 0x... + GFpElement a(p, BigInt(dom_par[1])); + GFpElement b(p, BigInt(dom_par[2])); + + Pipe pipe(new Hex_Decoder); + pipe.process_msg(dom_par[3]); + SecureVector sv_g = pipe.read_all(); + + CurveGFp curve(a, b, p); + PointGFp G = OS2ECP ( sv_g, curve ); + G.check_invariants(); + BigInt order(dom_par[4]); + BigInt cofactor(dom_par[5]); + EC_Domain_Params result(curve, G, order, cofactor); + return result; + } + +} + +EC_Domain_Params get_EC_Dom_Pars_by_oid(std::string oid) + { + EC_Domain_Params result = get_ec_dompar(oid); + result.m_oid = oid; + return result; + } + +EC_Domain_Params::EC_Domain_Params(const CurveGFp& curve, const PointGFp& base_point, + const BigInt& order, const BigInt& cofactor) + : m_curve(curve), + m_base_point(base_point), + m_order(order), + m_cofactor(cofactor), + m_oid("") + { } + +namespace { + +SecureVector encode_der_ec_dompar_explicit(EC_Domain_Params const& dom_pars) + { + u32bit ecpVers1 = 1; + OID curve_type_oid("1.2.840.10045.1.1"); + + DER_Encoder der; + + der.start_cons(SEQUENCE) + .encode(ecpVers1) + .start_cons(SEQUENCE) + .encode(curve_type_oid) + .encode(dom_pars.get_curve().get_p()) + .end_cons() + .start_cons(SEQUENCE) + .encode(FE2OSP ( dom_pars.get_curve().get_a() ), OCTET_STRING) + .encode(FE2OSP ( dom_pars.get_curve().get_b() ), OCTET_STRING) + .end_cons() + .encode(EC2OSP ( dom_pars.get_base_point(), PointGFp::UNCOMPRESSED), OCTET_STRING) + .encode(dom_pars.get_order()) + .encode(dom_pars.get_cofactor()) + .end_cons(); + + return der.get_contents(); + } + +EC_Domain_Params decode_ber_ec_dompar_explicit(SecureVector const& encoded) + { + BigInt ecpVers1(1); + OID curve_type_oid; + SecureVector sv_a; + SecureVector sv_b; + BigInt p; + SecureVector sv_base_point; + BigInt order; + BigInt cofactor; + BER_Decoder dec(encoded); + dec + .start_cons(SEQUENCE) + .decode(ecpVers1) + .start_cons(SEQUENCE) + .decode(curve_type_oid) + .decode(p) + .end_cons() + .start_cons(SEQUENCE) + .decode(sv_a, OCTET_STRING) + .decode(sv_b, OCTET_STRING) + .end_cons() + .decode(sv_base_point, OCTET_STRING) + .decode(order) + .decode(cofactor) + .verify_end() + .end_cons(); + if(ecpVers1 != 1) + { + throw Decoding_Error("wrong ecpVers"); + } + // Set the domain parameters + if(curve_type_oid.as_string() != "1.2.840.10045.1.1") // NOTE: hardcoded: prime field type + { + throw Decoding_Error("wrong curve type oid where prime field was expected"); + } + GFpElement a(p,BigInt::decode(sv_a, sv_a.size())); + GFpElement b(p,BigInt::decode(sv_b, sv_b.size())); + CurveGFp curve(a,b,p); + PointGFp G = OS2ECP ( sv_base_point, curve ); + G.check_invariants(); + return EC_Domain_Params(curve, G, order, cofactor); + } + +} // end anonymous namespace + +SecureVector encode_der_ec_dompar(EC_Domain_Params const& dom_pars, EC_dompar_enc enc_type) + { + SecureVector result; + + if(enc_type == ENC_EXPLICIT) + { + result = encode_der_ec_dompar_explicit(dom_pars); + } + else if(enc_type == ENC_OID) + { + OID dom_par_oid(dom_pars.get_oid()); + result = DER_Encoder().encode(dom_par_oid).get_contents(); + } + else if(enc_type == ENC_IMPLICITCA) + { + result = DER_Encoder().encode_null().get_contents(); + } + else + { + throw Internal_Error("encountered illegal value for ec parameter encoding type"); + } + return result; + } + +EC_Domain_Params decode_ber_ec_dompar(SecureVector const& encoded) + { + BER_Decoder dec(encoded); + BER_Object obj = dec.get_next_object(); + ASN1_Tag tag = obj.type_tag; + std::auto_ptr p_result; + + if(tag == OBJECT_ID) + { + OID dom_par_oid; + BER_Decoder(encoded).decode(dom_par_oid); + return EC_Domain_Params(get_ec_dompar(dom_par_oid.as_string())); + } + else if(tag == SEQUENCE) + return EC_Domain_Params(decode_ber_ec_dompar_explicit(encoded)); + else if(tag == NULL_TAG) + throw Decoding_Error("cannot decode ECDSA parameters that are ImplicitCA"); + + throw Decoding_Error("encountered unexpected when trying to decode domain parameters"); + } + +bool operator==(EC_Domain_Params const& lhs, EC_Domain_Params const& rhs) + { + return ((lhs.get_curve() == rhs.get_curve()) && + (lhs.get_base_point() == rhs.get_base_point()) && + (lhs.get_order() == rhs.get_order()) && + (lhs.get_cofactor() == rhs.get_cofactor())); + } + +} + diff --git a/src/libs/3rdparty/botan/src/pubkey/ec_dompar/ec_dompar.h b/src/libs/3rdparty/botan/src/pubkey/ec_dompar/ec_dompar.h new file mode 100644 index 00000000000..47971d80272 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ec_dompar/ec_dompar.h @@ -0,0 +1,121 @@ +/* +* ECDSA Domain Parameters +* (C) 2007 Falko Strenzke, FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ECC_DOMAIN_PARAMETERS_H__ +#define BOTAN_ECC_DOMAIN_PARAMETERS_H__ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents elliptic curce domain parameters +*/ +class BOTAN_DLL EC_Domain_Params + { + public: + + /** + * Construct Domain paramers from specified parameters + * @param curve elliptic curve + * @param base_point a base point + * @param order the order of the base point + * @param cofactor the cofactor + */ + EC_Domain_Params(const CurveGFp& curve, + const PointGFp& base_point, + const BigInt& order, + const BigInt& cofactor); + + /** + * Return domain parameter curve + * @result domain parameter curve + */ + const CurveGFp& get_curve() const + { + return m_curve; + } + + /** + * Return domain parameter curve + * @result domain parameter curve + */ + const PointGFp& get_base_point() const + { + return m_base_point; + } + + /** + * Return the order of the base point + * @result order of the base point + */ + const BigInt& get_order() const + { + return m_order; + } + + /** + * Return the cofactor + * @result the cofactor + */ + const BigInt& get_cofactor() const + { + return m_cofactor; + } + + /** + * Return the OID of these domain parameters + * @result the OID + */ + std::string get_oid() const { return m_oid; } + + private: + friend EC_Domain_Params get_EC_Dom_Pars_by_oid(std::string oid); + + CurveGFp m_curve; + PointGFp m_base_point; + BigInt m_order; + BigInt m_cofactor; + std::string m_oid; + }; + +bool operator==(EC_Domain_Params const& lhs, EC_Domain_Params const& rhs); + +inline bool operator!=(const EC_Domain_Params& lhs, + const EC_Domain_Params& rhs) + { + return !(lhs == rhs); + } + +enum EC_dompar_enc { ENC_EXPLICIT = 0, ENC_IMPLICITCA = 1, ENC_OID = 2 }; + +SecureVector encode_der_ec_dompar(EC_Domain_Params const& dom_pars, + EC_dompar_enc enc_type); + +EC_Domain_Params decode_ber_ec_dompar(SecureVector const& encoded); + +/** +* Factory function, the only way to obtain EC domain parameters with +* an OID. The demanded OID has to be registered in the InSiTo +* configuration. Consult the file ec_dompar.cpp for the default +* configuration. +* @param oid the oid of the demanded EC domain parameters +* @result the EC domain parameters associated with the OID +*/ +EC_Domain_Params get_EC_Dom_Pars_by_oid(std::string oid); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/ec_dompar/info.txt b/src/libs/3rdparty/botan/src/pubkey/ec_dompar/info.txt new file mode 100644 index 00000000000..21278372597 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ec_dompar/info.txt @@ -0,0 +1,18 @@ +realname "ECC Domain Parameters" + +define ECC_DOMAIN_PARAMATERS + +load_on auto + + +ec_dompar.cpp +ec_dompar.h + + + +asn1 +bigint +filters +gfpmath +hex + diff --git a/src/libs/3rdparty/botan/src/pubkey/ecc_key/ecc_key.cpp b/src/libs/3rdparty/botan/src/pubkey/ecc_key/ecc_key.cpp new file mode 100644 index 00000000000..615efecf198 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ecc_key/ecc_key.cpp @@ -0,0 +1,269 @@ +/* +* ECC Key implemenation +* (C) 2007 Manuel Hartl, FlexSecure GmbH +* Falko Strenzke, FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* EC_PublicKey +*/ +void EC_PublicKey::affirm_init() const // virtual + { + if((mp_dom_pars.get() == 0) || (mp_public_point.get() == 0)) + throw Invalid_State("cannot use uninitialized EC_Key"); + } + +const EC_Domain_Params& EC_PublicKey::domain_parameters() const + { + if(!mp_dom_pars.get()) + throw Invalid_State("EC_PublicKey::domain_parameters(): " + "ec domain parameters are not yet set"); + + return *mp_dom_pars; + } + +const PointGFp& EC_PublicKey::public_point() const + { + if(!mp_public_point.get()) + throw Invalid_State("EC_PublicKey::public_point(): public point not set"); + + return *mp_public_point; + } + +bool EC_PublicKey::domain_parameters_set() + { + return mp_dom_pars.get(); + } + +void EC_PublicKey::X509_load_hook() + { + try + { + // the base point is checked to be on curve already when decoding it + affirm_init(); + mp_public_point->check_invariants(); + } + catch(Illegal_Point) + { + throw Decoding_Error("decoded public point was found not to lie on curve"); + } + } + +X509_Encoder* EC_PublicKey::x509_encoder() const + { + class EC_Key_Encoder : public X509_Encoder + { + public: + AlgorithmIdentifier alg_id() const + { + key->affirm_init(); + + SecureVector params = + encode_der_ec_dompar(key->domain_parameters(), key->m_param_enc); + + return AlgorithmIdentifier(key->get_oid(), params); + } + + MemoryVector key_bits() const + { + key->affirm_init(); + return EC2OSP(*(key->mp_public_point), PointGFp::COMPRESSED); + } + + EC_Key_Encoder(const EC_PublicKey* k): key(k) {} + private: + const EC_PublicKey* key; + }; + + return new EC_Key_Encoder(this); + } + +X509_Decoder* EC_PublicKey::x509_decoder() + { + class EC_Key_Decoder : public X509_Decoder + { + public: + void alg_id(const AlgorithmIdentifier& alg_id) + { + key->mp_dom_pars.reset(new EC_Domain_Params(decode_ber_ec_dompar(alg_id.parameters))); + } + + void key_bits(const MemoryRegion& bits) + { + key->mp_public_point.reset( + new PointGFp( + OS2ECP(bits, key->domain_parameters().get_curve()) + )); + + key->X509_load_hook(); + } + + EC_Key_Decoder(EC_PublicKey* k): key(k) {} + private: + EC_PublicKey* key; + }; + + return new EC_Key_Decoder(this); + } + +void EC_PublicKey::set_parameter_encoding(EC_dompar_enc type) + { + if((type != ENC_EXPLICIT) && (type != ENC_IMPLICITCA) && (type != ENC_OID)) + throw Invalid_Argument("Invalid encoding type for EC-key object specified"); + + affirm_init(); + + if((type == ENC_OID) && (mp_dom_pars->get_oid() == "")) + throw Invalid_Argument("Invalid encoding type ENC_OID specified for " + "EC-key object whose corresponding domain " + "parameters are without oid"); + + m_param_enc = type; + } + +/******************************** +* EC_PrivateKey +********************************/ +void EC_PrivateKey::affirm_init() const // virtual + { + if(m_private_value == 0) + throw Invalid_State("cannot use EC_PrivateKey when private key is uninitialized"); + + EC_PublicKey::affirm_init(); + } + +const BigInt& EC_PrivateKey::private_value() const + { + if(m_private_value == 0) + throw Invalid_State("cannot use EC_PrivateKey when private key is uninitialized"); + + return m_private_value; + } + +/** +* EC_PrivateKey generator +**/ +void EC_PrivateKey::generate_private_key(RandomNumberGenerator& rng) + { + if(mp_dom_pars.get() == 0) + { + throw Invalid_State("cannot generate private key when domain parameters are not set"); + } + + BigInt tmp_private_value(0); + tmp_private_value = BigInt::random_integer(rng, 1, mp_dom_pars->get_order()); + mp_public_point = std::auto_ptr( new PointGFp (mp_dom_pars->get_base_point())); + mp_public_point->mult_this_secure(tmp_private_value, + mp_dom_pars->get_order(), + mp_dom_pars->get_order()-1); + + //assert(mp_public_point.get() != 0); + tmp_private_value.swap(m_private_value); + } + +/** +* Return the PKCS #8 public key encoder +**/ +PKCS8_Encoder* EC_PrivateKey::pkcs8_encoder() const + { + class EC_Key_Encoder : public PKCS8_Encoder + { + public: + AlgorithmIdentifier alg_id() const + { + key->affirm_init(); + + SecureVector params = + encode_der_ec_dompar(key->domain_parameters(), ENC_EXPLICIT); + + return AlgorithmIdentifier(key->get_oid(), params); + } + + MemoryVector key_bits() const + { + key->affirm_init(); + SecureVector octstr_secret = + BigInt::encode_1363(key->m_private_value, key->m_private_value.bytes()); + + return DER_Encoder() + .start_cons(SEQUENCE) + .encode(BigInt(1)) + .encode(octstr_secret, OCTET_STRING) + .end_cons() + .get_contents(); + } + + EC_Key_Encoder(const EC_PrivateKey* k): key(k) {} + private: + const EC_PrivateKey* key; + }; + + return new EC_Key_Encoder(this); + } + +/** +* Return the PKCS #8 public key decoder +*/ +PKCS8_Decoder* EC_PrivateKey::pkcs8_decoder(RandomNumberGenerator&) + { + class EC_Key_Decoder : public PKCS8_Decoder + { + public: + void alg_id(const AlgorithmIdentifier& alg_id) + { + key->mp_dom_pars.reset(new EC_Domain_Params(decode_ber_ec_dompar(alg_id.parameters))); + } + + void key_bits(const MemoryRegion& bits) + { + u32bit version; + SecureVector octstr_secret; + + BER_Decoder(bits) + .start_cons(SEQUENCE) + .decode(version) + .decode(octstr_secret, OCTET_STRING) + .verify_end() + .end_cons(); + + key->m_private_value = BigInt::decode(octstr_secret, octstr_secret.size()); + + if(version != 1) + throw Decoding_Error("Wrong PKCS #1 key format version for EC key"); + + key->PKCS8_load_hook(); + } + + EC_Key_Decoder(EC_PrivateKey* k): key(k) {} + private: + EC_PrivateKey* key; + }; + + return new EC_Key_Decoder(this); + } + +void EC_PrivateKey::PKCS8_load_hook(bool) + { + // we cannot use affirm_init() here because mp_public_point might still be null + if(mp_dom_pars.get() == 0) + throw Invalid_State("attempt to set public point for an uninitialized key"); + + mp_public_point.reset(new PointGFp(m_private_value * mp_dom_pars->get_base_point())); + mp_public_point->check_invariants(); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/ecc_key/ecc_key.h b/src/libs/3rdparty/botan/src/pubkey/ecc_key/ecc_key.h new file mode 100644 index 00000000000..0ca9a0e755f --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ecc_key/ecc_key.h @@ -0,0 +1,154 @@ +/* +* ECDSA +* (C) 2007 Falko Strenzke, FlexSecure GmbH +* Manuel Hartl, FlexSecure GmbH +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ECC_PUBLIC_KEY_BASE_H__ +#define BOTAN_ECC_PUBLIC_KEY_BASE_H__ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents abstract EC Public Keys. When encoding a key +* via an encoder that can be accessed via the corresponding member +* functions, the key will decide upon its internally stored encoding +* information whether to encode itself with or without domain +* parameters, or using the domain parameter oid. Furthermore, a public +* key without domain parameters can be decoded. In that case, it +* cannot be used for verification until its domain parameters are set +* by calling the corresponding member function. +*/ +class BOTAN_DLL EC_PublicKey : public virtual Public_Key + { + public: + + /** + * Tells whether this key knows his own domain parameters. + * @result true if the domain parameters are set, false otherwise + */ + bool domain_parameters_set(); + + /** + * Get the public point of this key. + * @throw Invalid_State is thrown if the + * domain parameters of this point are not set + * @result the public point of this key + */ + const PointGFp& public_point() const; + + /** + * Get the domain parameters of this key. + * @throw Invalid_State is thrown if the + * domain parameters of this point are not set + * @result the domain parameters of this key + */ + const EC_Domain_Params& domain_parameters() const; + + /** + * Set the domain parameter encoding to be used when encoding this key. + * @param enc the encoding to use + */ + void set_parameter_encoding(EC_dompar_enc enc); + + /** + * Get the domain parameter encoding to be used when encoding this key. + * @result the encoding to use + */ + inline int get_parameter_encoding() const + { + return m_param_enc; + } + + //ctors + EC_PublicKey() + : m_param_enc(ENC_EXPLICIT) + { + //assert(mp_dom_pars.get() == 0); + //assert(mp_public_point.get() == 0); + } + + /** + * Get an x509_encoder that can be used to encode this key. + * @result an x509_encoder for this key + */ + X509_Encoder* x509_encoder() const; + + /** + * Get an x509_decoder that can be used to decode a stored key into + * this key. + * @result an x509_decoder for this key + */ + X509_Decoder* x509_decoder(); + + /** + * Make sure that the public point and domain parameters of this key are set. + * @throw Invalid_State if either of the two data members is not set + */ + virtual void affirm_init() const; + + virtual ~EC_PublicKey() {} + protected: + virtual void X509_load_hook(); + + SecureVector m_enc_public_point; // stores the public point + + std::auto_ptr mp_dom_pars; + std::auto_ptr mp_public_point; + EC_dompar_enc m_param_enc; + }; + +/** +* This abstract class represents general EC Private Keys +*/ +class BOTAN_DLL EC_PrivateKey : public virtual EC_PublicKey, public virtual Private_Key + { + public: + + /** + * Get an PKCS#8 encoder that can be used to encoded this key. + * @result an PKCS#8 encoder for this key + */ + PKCS8_Encoder* pkcs8_encoder() const; + + /** + * Get an PKCS#8 decoder that can be used to decoded a stored key into + * this key. + * @result an PKCS#8 decoder for this key + */ + PKCS8_Decoder* pkcs8_decoder(RandomNumberGenerator&); + + /** + * Get the private key value of this key object. + * @result the private key value of this key object + */ + const BigInt& private_value() const; + + /** + * Make sure that the public key parts of this object are set + * (calls EC_PublicKey::affirm_init()) as well as the private key + * value. + * @throw Invalid_State if the above conditions are not satisfied + */ + virtual void affirm_init() const; + + virtual ~EC_PrivateKey() {} + protected: + virtual void PKCS8_load_hook(bool = false); + void generate_private_key(RandomNumberGenerator&); + BigInt m_private_value; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/ecc_key/info.txt b/src/libs/3rdparty/botan/src/pubkey/ecc_key/info.txt new file mode 100644 index 00000000000..2a3c9a3b2ae --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ecc_key/info.txt @@ -0,0 +1,20 @@ +realname "ECC Public Key" + +define ECC_PUBLIC_KEY_CRYPTO + +load_on auto + + +ecc_key.cpp +ecc_key.h + + + +alloc +asn1 +bigint +ec_dompar +gfpmath +numbertheory +pk_codecs + diff --git a/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa.cpp b/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa.cpp new file mode 100644 index 00000000000..9640c63974e --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa.cpp @@ -0,0 +1,230 @@ +/* +* ECDSA implemenation +* (C) 2007 Manuel Hartl, FlexSecure GmbH +* 2007 Falko Strenzke, FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +ECDSA_PrivateKey::ECDSA_PrivateKey(RandomNumberGenerator& rng, + const EC_Domain_Params& dom_pars) + { + mp_dom_pars = std::auto_ptr(new EC_Domain_Params(dom_pars)); + generate_private_key(rng); + + try + { + mp_public_point->check_invariants(); + } + catch(Illegal_Point& e) + { + throw Invalid_State("ECDSA key generation failed"); + } + + m_ecdsa_core = ECDSA_Core(*mp_dom_pars, m_private_value, *mp_public_point); + } + +/* +* ECDSA_PublicKey +*/ +void ECDSA_PublicKey::affirm_init() const // virtual + { + EC_PublicKey::affirm_init(); + } + +void ECDSA_PublicKey::set_domain_parameters(const EC_Domain_Params& dom_pars) + { + if(mp_dom_pars.get()) + { + // they are already set, we must ensure that they are equal to the arg + if(dom_pars != *mp_dom_pars.get()) + throw Invalid_Argument("EC_PublicKey::set_domain_parameters - cannot reset to a new value"); + + return; + } + + if(m_enc_public_point.size() == 0) + throw Invalid_State("EC_PublicKey::set_domain_parameters(): encoded public point isn't set"); + + // now try to decode the public key ... + PointGFp tmp_pp(OS2ECP(m_enc_public_point, dom_pars.get_curve())); + try + { + tmp_pp.check_invariants(); + } + catch(Illegal_Point e) + { + throw Invalid_State("EC_PublicKey::set_domain_parameters(): point does not lie on provided curve"); + } + + std::auto_ptr p_tmp_pars(new EC_Domain_Params(dom_pars)); + ECDSA_Core tmp_ecdsa_core(*p_tmp_pars, BigInt(0), tmp_pp); + mp_public_point.reset(new PointGFp(tmp_pp)); + m_ecdsa_core = tmp_ecdsa_core; + mp_dom_pars = p_tmp_pars; + } + +void ECDSA_PublicKey::set_all_values(const ECDSA_PublicKey& other) + { + m_param_enc = other.m_param_enc; + m_ecdsa_core = other.m_ecdsa_core; + m_enc_public_point = other.m_enc_public_point; + if(other.mp_dom_pars.get()) + mp_dom_pars.reset(new EC_Domain_Params(other.domain_parameters())); + + if(other.mp_public_point.get()) + mp_public_point.reset(new PointGFp(other.public_point())); + } + +ECDSA_PublicKey::ECDSA_PublicKey(const ECDSA_PublicKey& other) + : Public_Key(), + EC_PublicKey(), + PK_Verifying_wo_MR_Key() + { + set_all_values(other); + } + +const ECDSA_PublicKey& ECDSA_PublicKey::operator=(const ECDSA_PublicKey& rhs) + { + set_all_values(rhs); + return *this; + } + +bool ECDSA_PublicKey::verify(const byte message[], + u32bit mess_len, + const byte signature[], + u32bit sig_len) const + { + affirm_init(); + + BigInt r, s; + + BER_Decoder(signature, sig_len) + .start_cons(SEQUENCE) + .decode(r) + .decode(s) + .end_cons() + .verify_end(); + + u32bit enc_len = std::max(r.bytes(), s.bytes()); + + SecureVector sv_plain_sig; + + sv_plain_sig.append(BigInt::encode_1363(r, enc_len)); + sv_plain_sig.append(BigInt::encode_1363(s, enc_len)); + + return m_ecdsa_core.verify(sv_plain_sig, sv_plain_sig.size(), + message, mess_len); + } + +ECDSA_PublicKey::ECDSA_PublicKey(const EC_Domain_Params& dom_par, + const PointGFp& public_point) + { + mp_dom_pars = std::auto_ptr(new EC_Domain_Params(dom_par)); + mp_public_point = std::auto_ptr(new PointGFp(public_point)); + m_param_enc = ENC_EXPLICIT; + m_ecdsa_core = ECDSA_Core(*mp_dom_pars, BigInt(0), *mp_public_point); + } + +void ECDSA_PublicKey::X509_load_hook() + { + EC_PublicKey::X509_load_hook(); + EC_PublicKey::affirm_init(); + m_ecdsa_core = ECDSA_Core ( *mp_dom_pars, BigInt ( 0 ), *mp_public_point ); + } + +u32bit ECDSA_PublicKey::max_input_bits() const + { + if(!mp_dom_pars.get()) + { + throw Invalid_State("ECDSA_PublicKey::max_input_bits(): domain parameters not set"); + } + return mp_dom_pars->get_order().bits(); + } + +/************************* +* ECDSA_PrivateKey +*************************/ +void ECDSA_PrivateKey::affirm_init() const // virtual + { + EC_PrivateKey::affirm_init(); + } + +void ECDSA_PrivateKey::PKCS8_load_hook(bool generated) + { + EC_PrivateKey::PKCS8_load_hook(generated); + EC_PrivateKey::affirm_init(); + m_ecdsa_core = ECDSA_Core(*mp_dom_pars, m_private_value, *mp_public_point); + } + +void ECDSA_PrivateKey::set_all_values(const ECDSA_PrivateKey& other) + { + m_private_value = other.m_private_value; + m_param_enc = other.m_param_enc; + m_ecdsa_core = other.m_ecdsa_core; + m_enc_public_point = other.m_enc_public_point; + + if(other.mp_dom_pars.get()) + mp_dom_pars.reset(new EC_Domain_Params(other.domain_parameters())); + + if(other.mp_public_point.get()) + mp_public_point.reset(new PointGFp(other.public_point())); + } + +ECDSA_PrivateKey::ECDSA_PrivateKey(ECDSA_PrivateKey const& other) + : Public_Key(), + EC_PublicKey(), + Private_Key(), + ECDSA_PublicKey(), + EC_PrivateKey(), + PK_Signing_Key() + { + set_all_values(other); + } + + +const ECDSA_PrivateKey& ECDSA_PrivateKey::operator=(const ECDSA_PrivateKey& rhs) + { + set_all_values(rhs); + return *this; + } + +SecureVector ECDSA_PrivateKey::sign(const byte message[], + u32bit mess_len, + RandomNumberGenerator& rng) const + { + affirm_init(); + + SecureVector sv_sig = m_ecdsa_core.sign(message, mess_len, rng); + + if(sv_sig.size() % 2 != 0) + throw Invalid_Argument("Erroneous length of signature"); + + u32bit rs_len = sv_sig.size() / 2; + SecureVector sv_r, sv_s; + sv_r.set(sv_sig.begin(), rs_len); + sv_s.set(&sv_sig[rs_len], rs_len); + + BigInt r = BigInt::decode(sv_r, sv_r.size()); + BigInt s = BigInt::decode(sv_s, sv_s.size()); + + return DER_Encoder() + .start_cons(SEQUENCE) + .encode(r) + .encode(s) + .end_cons() + .get_contents(); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa.h b/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa.h new file mode 100644 index 00000000000..3794457772f --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa.h @@ -0,0 +1,145 @@ +/* +* ECDSA +* (C) 2007 Falko Strenzke, FlexSecure GmbH +* Manuel Hartl, FlexSecure GmbH +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ECDSA_KEY_H__ +#define BOTAN_ECDSA_KEY_H__ + +#include +#include + +namespace Botan { + +/** +* This class represents ECDSA Public Keys. +*/ +class BOTAN_DLL ECDSA_PublicKey : public virtual EC_PublicKey, + public PK_Verifying_wo_MR_Key + { + public: + + /** + * Get this keys algorithm name. + * @result this keys algorithm name ("ECDSA") + */ + std::string algo_name() const { return "ECDSA"; } + + /** + * Get the maximum number of bits allowed to be fed to this key. + * This is the bitlength of the order of the base point. + + * @result the maximum number of input bits + */ + u32bit max_input_bits() const; + + /** + * Verify a message with this key. + * @param message the byte array containing the message + * @param mess_len the number of bytes in the message byte array + * @param signature the byte array containing the signature + * @param sig_len the number of bytes in the signature byte array + */ + bool verify(const byte message[], u32bit mess_len, + const byte signature[], u32bit sig_len) const; + + /** + * Default constructor. Use this one if you want to later fill + * this object with data from an encoded key. + */ + ECDSA_PublicKey() {} + + /** + * Construct a public key from a given public point. + * @param dom_par the domain parameters associated with this key + * @param public_point the public point defining this key + */ + ECDSA_PublicKey(const EC_Domain_Params& dom_par, + const PointGFp& public_point); // sets core + + ECDSA_PublicKey const& operator=(const ECDSA_PublicKey& rhs); + + ECDSA_PublicKey(const ECDSA_PublicKey& other); + + /** + * Set the domain parameters of this key. This function has to be + * used when a key encoded without domain parameters was decoded into + * this key. Otherwise it will not be able to verify a signature. + * @param dom_pars the domain_parameters associated with this key + * @throw Invalid_Argument if the point was found not to be satisfying the + * curve equation of the provided domain parameters + * or if this key already has domain parameters set + * and these are differing from those given as the parameter + */ + void set_domain_parameters(const EC_Domain_Params& dom_pars); + + /** + * Ensure that the public point and domain parameters of this key are set. + * @throw Invalid_State if either of the two data members is not set + */ + virtual void affirm_init() const; + + protected: + void X509_load_hook(); + virtual void set_all_values(const ECDSA_PublicKey& other); + + ECDSA_Core m_ecdsa_core; + }; + +/** +* This class represents ECDSA Private Keys +*/ +class BOTAN_DLL ECDSA_PrivateKey : public ECDSA_PublicKey, + public EC_PrivateKey, + public PK_Signing_Key + { + public: + //ctors + + /** + * Default constructor. Use this one if you want to later fill + * this object with data from an encoded key. + */ + ECDSA_PrivateKey() {} + + /** + * Generate a new private key + * @param the domain parameters to used for this key + */ + ECDSA_PrivateKey(RandomNumberGenerator& rng, + const EC_Domain_Params& domain); + + ECDSA_PrivateKey(const ECDSA_PrivateKey& other); + ECDSA_PrivateKey const& operator=(const ECDSA_PrivateKey& rhs); + + /** + * Sign a message with this key. + * @param message the byte array representing the message to be signed + * @param mess_len the length of the message byte array + * @result the signature + */ + + SecureVector sign(const byte message[], u32bit mess_len, + RandomNumberGenerator& rng) const; + + /** + * Make sure that the public key parts of this object are set + * (calls EC_PublicKey::affirm_init()) as well as the private key + * value. + * @throw Invalid_State if the above conditions are not satisfied + */ + virtual void affirm_init() const; + + protected: + virtual void set_all_values(const ECDSA_PrivateKey& other); + private: + void PKCS8_load_hook(bool = false); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_core.cpp b/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_core.cpp new file mode 100644 index 00000000000..93808ccd523 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_core.cpp @@ -0,0 +1,55 @@ +/* +* ECDSA Core +* (C) 1999-2007 Jack Lloyd +* (C) 2007 FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* ECDSA Operation +*/ +bool ECDSA_Core::verify(const byte signature[], u32bit sig_len, + const byte message[], u32bit mess_len) const + { + //assert(op.get()); + return op->verify(signature, sig_len, message, mess_len); + } + +SecureVector ECDSA_Core::sign(const byte message[], + u32bit mess_len, + RandomNumberGenerator& rng) const + { + //assert(op.get()); + return op->sign(message, mess_len, rng); + } + +ECDSA_Core& ECDSA_Core::operator=(const ECDSA_Core& core) + { + delete op; + if(core.op) + op = core.op->clone(); + return (*this); + } + +ECDSA_Core::ECDSA_Core(const ECDSA_Core& core) + { + op = 0; + if(core.op) + op = core.op->clone(); + } + +ECDSA_Core::ECDSA_Core(EC_Domain_Params const& dom_pars, const BigInt& priv_key, PointGFp const& pub_key) + { + op = Engine_Core::ecdsa_op(dom_pars, priv_key, pub_key); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_core.h b/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_core.h new file mode 100644 index 00000000000..ceccc940efc --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_core.h @@ -0,0 +1,47 @@ +/* +* ECDSA Core +* (C) 1999-2007 Jack Lloyd +* (C) 2007 FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ECDSA_CORE_H__ +#define BOTAN_ECDSA_CORE_H__ + +#include +#include +#include + +namespace Botan { + +/* +* ECDSA Core +*/ +class BOTAN_DLL ECDSA_Core + { + public: + bool verify(const byte signature[], u32bit sig_len, + const byte message[], u32bit mess_len) const; + + SecureVector sign(const byte message[], u32bit mess_len, + RandomNumberGenerator& rng) const; + + ECDSA_Core& operator=(const ECDSA_Core&); + + ECDSA_Core() { op = 0; } + + ECDSA_Core(const ECDSA_Core&); + + ECDSA_Core(const EC_Domain_Params& dom_pars, + const BigInt& priv_key, + const PointGFp& pub_key); + + ~ECDSA_Core() { delete op; } + private: + ECDSA_Operation* op; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_op.cpp b/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_op.cpp new file mode 100644 index 00000000000..986043ed628 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_op.cpp @@ -0,0 +1,129 @@ +/* +* ECDSA Operation +* (C) 2007 FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +bool Default_ECDSA_Op::verify(const byte signature[], u32bit sig_len, + const byte message[], u32bit mess_len) const + { + if(sig_len % 2 != 0) + throw Invalid_Argument("Erroneous length of signature"); + + //NOTE: it is not checked whether the public point is set + if(m_dom_pars.get_curve().get_p() == 0) + throw Internal_Error("domain parameters not set"); + + BigInt e(message, mess_len); + + u32bit rs_len = sig_len/2; + SecureVector sv_r; + SecureVector sv_s; + sv_r.set(signature, rs_len); + sv_s.set(signature+rs_len, rs_len); + BigInt r = BigInt::decode ( sv_r, sv_r.size()); + BigInt s = BigInt::decode (sv_s, sv_s.size()); + + if(r < 0 || r >= m_dom_pars.get_order()) + throw Invalid_Argument("r in ECDSA signature has an illegal value"); + + if(s < 0 || s >= m_dom_pars.get_order()) + throw Invalid_Argument("s in ECDSA signature has an illegal value"); + + BigInt w = inverse_mod(s, m_dom_pars.get_order()); + + PointGFp R = w*(e*m_dom_pars.get_base_point() + r*m_pub_key); + if(R.is_zero()) + return false; + + BigInt x = R.get_affine_x().get_value(); + bool result = (x % m_dom_pars.get_order() == r); + return result; + } + +SecureVector Default_ECDSA_Op::sign(const byte message[], + u32bit mess_len, + RandomNumberGenerator& rng) const + { + if(m_priv_key == 0) + throw Internal_Error("Default_ECDSA_Op::sign(): no private key"); + + if(m_dom_pars.get_curve().get_p() == 0) + throw Internal_Error("Default_ECDSA_Op::sign(): domain parameters not set"); + + BigInt e(message, mess_len); + + // generate k + BigInt k; + BigInt r(0); + const BigInt n(m_dom_pars.get_order()); + while(r == 0) + { + k = BigInt::random_integer(rng, 1, n); + + PointGFp k_times_P(m_dom_pars.get_base_point()); + k_times_P.mult_this_secure(k, n, n-1); + k_times_P.check_invariants(); + r = k_times_P.get_affine_x().get_value() % n; + } + BigInt k_inv = inverse_mod(k, n); + + // use randomization against attacks on s: + // a = k_inv * (r*(d + x) + e) mod n + // b = k_inv * r * x mod n + // s = a - b mod n + // where x is a random integer + +#if defined(CMS_RAND) + BigInt x = BigInt::random_integer(0, n); + BigInt s = m_priv_key + x; // obscure the secret from the beginning + // all following operations thus are randomized + s *= r; + s += e; + s *= k_inv; + s %= n; + + BigInt b = x; // again, start with the random number + b *= r; + b *= k_inv; + b %= n; + s -= b; // s = a - b + if(s <= 0) // s %= n + { + s += n; + } +#else // CMS_RAND + // no countermeasure here + BigInt s(r); + s *= m_priv_key; + s += e; + s *= k_inv; + s %= n; + +#endif // CMS_RAND + + SecureVector sv_r = BigInt::encode_1363 ( r, m_dom_pars.get_order().bytes() ); + SecureVector sv_s = BigInt::encode_1363 ( s, m_dom_pars.get_order().bytes() ); + + SecureVector result(sv_r); + result.append(sv_s); + return result; + } + +Default_ECDSA_Op::Default_ECDSA_Op(const EC_Domain_Params& dom_pars, const BigInt& priv_key, const PointGFp& pub_key) + : m_dom_pars(dom_pars), + m_pub_key(pub_key), + m_priv_key(priv_key) + { + + } + +} + diff --git a/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_op.h b/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_op.h new file mode 100644 index 00000000000..25831a9d444 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ecdsa/ecdsa_op.h @@ -0,0 +1,64 @@ +/* +* ECDSA Operations +* (C) 1999-2008 Jack Lloyd +* (C) 2007 FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ECDSA_OPERATIONS_H__ +#define BOTAN_ECDSA_OPERATIONS_H__ + +#include +#include + +namespace Botan { + +/* +* ECDSA Operation +*/ +class BOTAN_DLL ECDSA_Operation + { + public: + virtual bool verify(const byte sig[], u32bit sig_len, + const byte msg[], u32bit msg_len) const = 0; + + virtual SecureVector sign(const byte message[], + u32bit mess_len, + RandomNumberGenerator&) const = 0; + + virtual ECDSA_Operation* clone() const = 0; + + virtual ~ECDSA_Operation() {} + }; + + +/* +* Default ECDSA operation +*/ +class BOTAN_DLL Default_ECDSA_Op : public ECDSA_Operation + { + public: + bool verify(const byte signature[], u32bit sig_len, + const byte message[], u32bit mess_len) const; + + SecureVector sign(const byte message[], u32bit mess_len, + RandomNumberGenerator& rng) const; + + ECDSA_Operation* clone() const + { + return new Default_ECDSA_Op(*this); + } + + Default_ECDSA_Op(const EC_Domain_Params& dom_pars, + const BigInt& priv_key, + const PointGFp& pub_key); + private: + EC_Domain_Params m_dom_pars; + PointGFp m_pub_key; + BigInt m_priv_key; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/ecdsa/info.txt b/src/libs/3rdparty/botan/src/pubkey/ecdsa/info.txt new file mode 100644 index 00000000000..743440f8ff1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/ecdsa/info.txt @@ -0,0 +1,25 @@ +realname "ECDSA" + +define ECDSA + +load_on auto + + +ecdsa.cpp +ecdsa.h +ecdsa_core.cpp +ecdsa_core.h +ecdsa_op.cpp +ecdsa_op.h + + + +alloc +asn1 +ec_dompar +ecc_key +gfpmath +libstate +numbertheory +rng + diff --git a/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg.cpp b/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg.cpp new file mode 100644 index 00000000000..b8ff75d89fa --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg.cpp @@ -0,0 +1,152 @@ +/* +* ECKAEG implemenation +* (C) 2007 Manuel Hartl, FlexSecure GmbH +* 2007 Falko Strenzke, FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/********************************* +* ECKAEG_PublicKey +*********************************/ + +void ECKAEG_PublicKey::affirm_init() const // virtual + { + EC_PublicKey::affirm_init(); + } + +void ECKAEG_PublicKey::set_all_values(ECKAEG_PublicKey const& other) + { + m_param_enc = other.m_param_enc; + m_eckaeg_core = other.m_eckaeg_core; + m_enc_public_point = other.m_enc_public_point; + if(other.mp_dom_pars.get()) + { + mp_dom_pars.reset(new EC_Domain_Params(*(other.mp_dom_pars))); + } + if(other.mp_public_point.get()) + { + mp_public_point.reset(new PointGFp(*(other.mp_public_point))); + } + } + +ECKAEG_PublicKey::ECKAEG_PublicKey(ECKAEG_PublicKey const& other) + : Public_Key(), + EC_PublicKey() + { + set_all_values(other); + } + +ECKAEG_PublicKey const& ECKAEG_PublicKey::operator=(ECKAEG_PublicKey const& rhs) + { + set_all_values(rhs); + return *this; + } + +void ECKAEG_PublicKey::X509_load_hook() + { + EC_PublicKey::X509_load_hook(); + EC_PublicKey::affirm_init(); + m_eckaeg_core = ECKAEG_Core(*mp_dom_pars, BigInt(0), *mp_public_point); + } + +ECKAEG_PublicKey::ECKAEG_PublicKey(EC_Domain_Params const& dom_par, PointGFp const& public_point) + { + mp_dom_pars = std::auto_ptr(new EC_Domain_Params(dom_par)); + mp_public_point = std::auto_ptr(new PointGFp(public_point)); + if(mp_public_point->get_curve() != mp_dom_pars->get_curve()) + { + throw Invalid_Argument("ECKAEG_PublicKey(): curve of arg. point and curve of arg. domain parameters are different"); + } + EC_PublicKey::affirm_init(); + m_eckaeg_core = ECKAEG_Core(*mp_dom_pars, BigInt(0), *mp_public_point); + } + +/********************************* +* ECKAEG_PrivateKey +*********************************/ +void ECKAEG_PrivateKey::affirm_init() const // virtual + { + EC_PrivateKey::affirm_init(); + } + +void ECKAEG_PrivateKey::PKCS8_load_hook(bool generated) + { + EC_PrivateKey::PKCS8_load_hook(generated); + EC_PrivateKey::affirm_init(); + m_eckaeg_core = ECKAEG_Core(*mp_dom_pars, m_private_value, *mp_public_point); + } + +void ECKAEG_PrivateKey::set_all_values(ECKAEG_PrivateKey const& other) + { + m_private_value = other.m_private_value; + m_param_enc = other.m_param_enc; + m_eckaeg_core = other.m_eckaeg_core; + m_enc_public_point = other.m_enc_public_point; + if(other.mp_dom_pars.get()) + { + mp_dom_pars.reset(new EC_Domain_Params(*(other.mp_dom_pars))); + } + if(other.mp_public_point.get()) + { + mp_public_point.reset(new PointGFp(*(other.mp_public_point))); + } + } + +ECKAEG_PrivateKey::ECKAEG_PrivateKey(ECKAEG_PrivateKey const& other) + : Public_Key(), + EC_PublicKey(), + Private_Key(), + ECKAEG_PublicKey(), + EC_PrivateKey(), + PK_Key_Agreement_Key() + { + set_all_values(other); + } + +ECKAEG_PrivateKey const& ECKAEG_PrivateKey::operator= (ECKAEG_PrivateKey const& rhs) + { + set_all_values(rhs); + return *this; + } + +MemoryVector ECKAEG_PrivateKey::public_value() const + { + return EC2OSP(public_point(), PointGFp::UNCOMPRESSED); + } + +/** +* Derive a key +*/ +SecureVector ECKAEG_PrivateKey::derive_key(const byte key[], + u32bit key_len) const + { + MemoryVector key_x(key, key_len); // FIXME: nasty/slow + PointGFp point = OS2ECP(key_x, public_point().get_curve()); + + return m_eckaeg_core.agree(point); + } + +/** +* Derive a key +*/ +SecureVector ECKAEG_PrivateKey::derive_key(const ECKAEG_PublicKey& key) const + { + affirm_init(); + key.affirm_init(); + + return m_eckaeg_core.agree(key.public_point()); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg.h b/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg.h new file mode 100644 index 00000000000..31b65740cef --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg.h @@ -0,0 +1,137 @@ +/* +* ECKAEG +* (C) 2007 Falko Strenzke, FlexSecure GmbH +* Manuel Hartl, FlexSecure GmbH +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ECKAEG_KEY_H__ +#define BOTAN_ECKAEG_KEY_H__ + +#include +#include + +namespace Botan { + +/** +* This class represents ECKAEG Public Keys. +*/ +class BOTAN_DLL ECKAEG_PublicKey : public virtual EC_PublicKey + { + public: + + /** + * Default constructor. Use this one if you want to later fill + * this object with data from an encoded key. + */ + ECKAEG_PublicKey() {} + + /** + * Construct a public key from a given public point. + * @param dom_par the domain parameters associated with this key + * @param public_point the public point defining this key + */ + ECKAEG_PublicKey(const EC_Domain_Params& dom_par, + const PointGFp& public_point); + + /** + * Get this keys algorithm name. + * @result this keys algorithm name + */ + std::string algo_name() const { return "ECKAEG"; } + + /** + * Get the maximum number of bits allowed to be fed to this key. + * This is the bitlength of the order of the base point. + + * @result the maximum number of input bits + */ + u32bit max_input_bits() const + { + if(!mp_dom_pars.get()) + throw Invalid_State("ECKAEG_PublicKey::max_input_bits(): domain parameters not set"); + + return mp_dom_pars->get_order().bits(); + } + + ECKAEG_PublicKey(ECKAEG_PublicKey const& other); + ECKAEG_PublicKey const& operator= (ECKAEG_PublicKey const& rhs); + + /** + * Make sure that the public point and domain parameters of this + * key are set. + * @throw Invalid_State if either of the two data members is not set + */ + virtual void affirm_init() const; + + protected: + void X509_load_hook(); + virtual void set_all_values(const ECKAEG_PublicKey& other); + + ECKAEG_Core m_eckaeg_core; + }; + +/** +* This class represents ECKAEG Private Keys. +*/ +class BOTAN_DLL ECKAEG_PrivateKey : public ECKAEG_PublicKey, + public EC_PrivateKey, + public PK_Key_Agreement_Key + { + public: + + /** + * Generate a new private key + * @param the domain parameters to used for this key + */ + ECKAEG_PrivateKey(RandomNumberGenerator& rng, + const EC_Domain_Params& dom_pars) + { + mp_dom_pars = std::auto_ptr(new EC_Domain_Params(dom_pars)); + generate_private_key(rng); + mp_public_point->check_invariants(); + m_eckaeg_core = ECKAEG_Core(*mp_dom_pars, m_private_value, *mp_public_point); + } + + /** + * Default constructor. Use this one if you want to later fill this object with data + * from an encoded key. + */ + ECKAEG_PrivateKey() {} + ECKAEG_PrivateKey(ECKAEG_PrivateKey const& other); + ECKAEG_PrivateKey const& operator=(ECKAEG_PrivateKey const& rhs); + + MemoryVector public_value() const; + + void PKCS8_load_hook(bool = false); + + /** + * Derive a shared key with the other partys public key. + * @param key the other partys public key + * @param key_len the other partys public key + */ + SecureVector derive_key(const byte key[], u32bit key_len) const; + + /** + * Derive a shared key with the other partys public key. + * @param other the other partys public key + */ + SecureVector derive_key(const ECKAEG_PublicKey& other) const; + + /** + * Make sure that the public key parts of this object are set + * (calls EC_PublicKey::affirm_init()) as well as the private key + * value. + * @throw Invalid_State if the above conditions are not satisfied + */ + virtual void affirm_init() const; + + protected: + virtual void set_all_values(const ECKAEG_PrivateKey& other); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_core.cpp b/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_core.cpp new file mode 100644 index 00000000000..dc89a878d78 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_core.cpp @@ -0,0 +1,59 @@ +/* +* ECKAEG Core +* (C) 1999-2007 Jack Lloyd +* (C) 2007 FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* ECKAEG_Core Constructor +*/ +ECKAEG_Core::ECKAEG_Core(const EC_Domain_Params& dom_pars, + const BigInt& priv_key, + const PointGFp& pub_key) + { + op = Engine_Core::eckaeg_op(dom_pars, priv_key, pub_key); + } + +/* +* ECKAEG_Core Copy Constructor +*/ +ECKAEG_Core::ECKAEG_Core(const ECKAEG_Core& core) + { + op = 0; + if(core.op) + op = core.op->clone(); + blinder = core.blinder; + } + +/* +* ECKAEG_Core Assignment Operator +*/ +ECKAEG_Core& ECKAEG_Core::operator=(const ECKAEG_Core& core) + { + delete op; + if(core.op) + op = core.op->clone(); + blinder = core.blinder; + return (*this); + } + +/* +* ECKAEG Operation +*/ +SecureVector ECKAEG_Core::agree(const PointGFp& otherKey) const + { + //assert(op.get()); + return op->agree(otherKey); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_core.h b/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_core.h new file mode 100644 index 00000000000..d632c945172 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_core.h @@ -0,0 +1,44 @@ +/* +* ECKAEG Core +* (C) 1999-2007 Jack Lloyd +* (C) 2007 FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ECKAEG_CORE_H__ +#define BOTAN_ECKAEG_CORE_H__ + +#include +#include +#include + +namespace Botan { + +/* +* ECKAEG Core +*/ +class BOTAN_DLL ECKAEG_Core + { + public: + SecureVector agree(const PointGFp&) const; + + ECKAEG_Core& operator=(const ECKAEG_Core&); + + ECKAEG_Core() { op = 0; } + + ECKAEG_Core(const ECKAEG_Core&); + + ECKAEG_Core(const EC_Domain_Params& dom_pars, + const BigInt& priv_key, + PointGFp const& pub_key); + + ~ECKAEG_Core() { delete op; } + private: + ECKAEG_Operation* op; + Blinder blinder; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_op.cpp b/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_op.cpp new file mode 100644 index 00000000000..0cb5c3d55ce --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_op.cpp @@ -0,0 +1,36 @@ +/* +* ECKAEG Operation +* (C) 2007 FlexSecure GmbH +* 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +Default_ECKAEG_Op::Default_ECKAEG_Op(const EC_Domain_Params& dom_pars, + const BigInt& priv_key, + const PointGFp& pub_key) + : m_dom_pars(dom_pars), + m_pub_key(pub_key), + m_priv_key(priv_key) + { + } + +SecureVector Default_ECKAEG_Op::agree(const PointGFp& i) const + { + BigInt cofactor(m_dom_pars.get_cofactor()); + BigInt n = m_dom_pars.get_order(); + BigInt l(inverse_mod(cofactor,n)); // l=h^-1 mod n + PointGFp Q(cofactor*i); // q = h*Pb + PointGFp S(Q); + BigInt group_order = m_dom_pars.get_cofactor() * n; + S.mult_this_secure((m_priv_key*l)%n, group_order, n-1); + S.check_invariants(); + return FE2OSP(S.get_affine_x()); // fe2os(xs) + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_op.h b/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_op.h new file mode 100644 index 00000000000..27cf4f367ba --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/eckaeg/eckaeg_op.h @@ -0,0 +1,49 @@ +/* +* ECKAEG Operations +* (C) 1999-2008 Jack Lloyd +* 2007 FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ECKAEG_OPERATIONS_H__ +#define BOTAN_ECKAEG_OPERATIONS_H__ + +#include + +namespace Botan { + +/* +* ECKAEG Operation +*/ +class BOTAN_DLL ECKAEG_Operation + { + public: + virtual SecureVector agree(const PointGFp&) const = 0; + virtual ECKAEG_Operation* clone() const = 0; + virtual ~ECKAEG_Operation() {} + }; + +/* +* Default ECKAEG operation +*/ +class BOTAN_DLL Default_ECKAEG_Op : public ECKAEG_Operation + { + public: + SecureVector agree(const PointGFp& i) const; + + ECKAEG_Operation* clone() const { return new Default_ECKAEG_Op(*this); } + + Default_ECKAEG_Op(const EC_Domain_Params& dom_pars, + const BigInt& priv_key, + const PointGFp& pub_key); + private: + EC_Domain_Params m_dom_pars; + PointGFp m_pub_key; + BigInt m_priv_key; + }; + + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/eckaeg/info.txt b/src/libs/3rdparty/botan/src/pubkey/eckaeg/info.txt new file mode 100644 index 00000000000..6b78f7de561 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/eckaeg/info.txt @@ -0,0 +1,24 @@ +realname "ECKAEG" + +define ECKAEG + +load_on auto + + +eckaeg.cpp +eckaeg.h +eckaeg_core.cpp +eckaeg_core.h +eckaeg_op.cpp +eckaeg_op.h + + + +alloc +asn1 +ec_dompar +ecc_key +gfpmath +libstate +numbertheory + diff --git a/src/libs/3rdparty/botan/src/pubkey/elgamal/elg_core.cpp b/src/libs/3rdparty/botan/src/pubkey/elgamal/elg_core.cpp new file mode 100644 index 00000000000..8b8c8f50bc5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/elgamal/elg_core.cpp @@ -0,0 +1,97 @@ +/* +* ElGamal Core +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +const u32bit BLINDING_BITS = BOTAN_PRIVATE_KEY_OP_BLINDING_BITS; + +} + +/* +* ELG_Core Constructor +*/ +ELG_Core::ELG_Core(const DL_Group& group, const BigInt& y) + { + op = Engine_Core::elg_op(group, y, 0); + p_bytes = 0; + } + +/* +* ELG_Core Constructor +*/ +ELG_Core::ELG_Core(RandomNumberGenerator& rng, + const DL_Group& group, const BigInt& y, const BigInt& x) + { + op = Engine_Core::elg_op(group, y, x); + + const BigInt& p = group.get_p(); + p_bytes = p.bytes(); + + if(BLINDING_BITS) + { + BigInt k(rng, std::min(p.bits()-1, BLINDING_BITS)); + blinder = Blinder(k, power_mod(k, x, p), p); + } + } + +/* +* ELG_Core Copy Constructor +*/ +ELG_Core::ELG_Core(const ELG_Core& core) + { + op = 0; + if(core.op) + op = core.op->clone(); + blinder = core.blinder; + p_bytes = core.p_bytes; + } + +/* +* ELG_Core Assignment Operator +*/ +ELG_Core& ELG_Core::operator=(const ELG_Core& core) + { + delete op; + if(core.op) + op = core.op->clone(); + blinder = core.blinder; + p_bytes = core.p_bytes; + return (*this); + } + +/* +* ElGamal Encrypt Operation +*/ +SecureVector ELG_Core::encrypt(const byte in[], u32bit length, + const BigInt& k) const + { + return op->encrypt(in, length, k); + } + +/* +* ElGamal Decrypt Operation +*/ +SecureVector ELG_Core::decrypt(const byte in[], u32bit length) const + { + if(length != 2*p_bytes) + throw Invalid_Argument("ELG_Core::decrypt: Invalid message"); + + BigInt a(in, p_bytes); + BigInt b(in + p_bytes, p_bytes); + + return BigInt::encode(blinder.unblind(op->decrypt(blinder.blind(a), b))); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/elgamal/elg_core.h b/src/libs/3rdparty/botan/src/pubkey/elgamal/elg_core.h new file mode 100644 index 00000000000..a7768a6aeeb --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/elgamal/elg_core.h @@ -0,0 +1,44 @@ +/* +* ElGamal Core +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ELGAMAL_CORE_H__ +#define BOTAN_ELGAMAL_CORE_H__ + +#include +#include +#include + +namespace Botan { + +/* +* ElGamal Core +*/ +class BOTAN_DLL ELG_Core + { + public: + SecureVector encrypt(const byte[], u32bit, const BigInt&) const; + SecureVector decrypt(const byte[], u32bit) const; + + ELG_Core& operator=(const ELG_Core&); + + ELG_Core() { op = 0; } + ELG_Core(const ELG_Core&); + + ELG_Core(const DL_Group&, const BigInt&); + ELG_Core(RandomNumberGenerator&, const DL_Group&, + const BigInt&, const BigInt&); + + ~ELG_Core() { delete op; } + private: + ELG_Operation* op; + Blinder blinder; + u32bit p_bytes; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/elgamal/elg_op.cpp b/src/libs/3rdparty/botan/src/pubkey/elgamal/elg_op.cpp new file mode 100644 index 00000000000..1e476ab7a84 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/elgamal/elg_op.cpp @@ -0,0 +1,56 @@ +/* +* ElGamal Operations +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Default_ELG_Op Constructor +*/ +Default_ELG_Op::Default_ELG_Op(const DL_Group& group, const BigInt& y, + const BigInt& x) : p(group.get_p()) + { + powermod_g_p = Fixed_Base_Power_Mod(group.get_g(), p); + powermod_y_p = Fixed_Base_Power_Mod(y, p); + mod_p = Modular_Reducer(p); + + if(x != 0) + powermod_x_p = Fixed_Exponent_Power_Mod(x, p); + } + +/* +* Default ElGamal Encrypt Operation +*/ +SecureVector Default_ELG_Op::encrypt(const byte in[], u32bit length, + const BigInt& k) const + { + BigInt m(in, length); + if(m >= p) + throw Invalid_Argument("Default_ELG_Op::encrypt: Input is too large"); + + BigInt a = powermod_g_p(k); + BigInt b = mod_p.multiply(m, powermod_y_p(k)); + + SecureVector output(2*p.bytes()); + a.binary_encode(output + (p.bytes() - a.bytes())); + b.binary_encode(output + output.size() / 2 + (p.bytes() - b.bytes())); + return output; + } + +/* +* Default ElGamal Decrypt Operation +*/ +BigInt Default_ELG_Op::decrypt(const BigInt& a, const BigInt& b) const + { + if(a >= p || b >= p) + throw Invalid_Argument("Default_ELG_Op: Invalid message"); + + return mod_p.multiply(b, inverse_mod(powermod_x_p(a), p)); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/elgamal/elg_op.h b/src/libs/3rdparty/botan/src/pubkey/elgamal/elg_op.h new file mode 100644 index 00000000000..39ed897f497 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/elgamal/elg_op.h @@ -0,0 +1,52 @@ +/* +* ElGamal Operations +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ELGAMAL_OPS_H__ +#define BOTAN_ELGAMAL_OPS_H__ + +#include +#include +#include +#include + +namespace Botan { + +/* +* ElGamal Operation +*/ +class BOTAN_DLL ELG_Operation + { + public: + virtual SecureVector encrypt(const byte[], u32bit, + const BigInt&) const = 0; + virtual BigInt decrypt(const BigInt&, const BigInt&) const = 0; + virtual ELG_Operation* clone() const = 0; + virtual ~ELG_Operation() {} + }; + +/* +* Botan's Default ElGamal Operation +*/ +class BOTAN_DLL Default_ELG_Op : public ELG_Operation + { + public: + SecureVector encrypt(const byte[], u32bit, const BigInt&) const; + BigInt decrypt(const BigInt&, const BigInt&) const; + + ELG_Operation* clone() const { return new Default_ELG_Op(*this); } + + Default_ELG_Op(const DL_Group&, const BigInt&, const BigInt&); + private: + const BigInt p; + Fixed_Base_Power_Mod powermod_g_p, powermod_y_p; + Fixed_Exponent_Power_Mod powermod_x_p; + Modular_Reducer mod_p; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/elgamal/elgamal.cpp b/src/libs/3rdparty/botan/src/pubkey/elgamal/elgamal.cpp new file mode 100644 index 00000000000..1f79df57a3d --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/elgamal/elgamal.cpp @@ -0,0 +1,124 @@ +/* +* ElGamal +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* ElGamal_PublicKey Constructor +*/ +ElGamal_PublicKey::ElGamal_PublicKey(const DL_Group& grp, const BigInt& y1) + { + group = grp; + y = y1; + X509_load_hook(); + } + +/* +* Algorithm Specific X.509 Initialization Code +*/ +void ElGamal_PublicKey::X509_load_hook() + { + core = ELG_Core(group, y); + } + +/* +* ElGamal Encryption Function +*/ +SecureVector +ElGamal_PublicKey::encrypt(const byte in[], u32bit length, + RandomNumberGenerator& rng) const + { + BigInt k(rng, 2 * dl_work_factor(group_p().bits())); + return core.encrypt(in, length, k); + } + +/* +* Return the maximum input size in bits +*/ +u32bit ElGamal_PublicKey::max_input_bits() const + { + return (group_p().bits() - 1); + } + +/* +* ElGamal_PrivateKey Constructor +*/ +ElGamal_PrivateKey::ElGamal_PrivateKey(RandomNumberGenerator& rng, + const DL_Group& grp, + const BigInt& x_arg) + { + group = grp; + x = x_arg; + + if(x == 0) + { + x.randomize(rng, 2 * dl_work_factor(group_p().bits())); + PKCS8_load_hook(rng, true); + } + else + PKCS8_load_hook(rng, false); + } + +/* +* Algorithm Specific PKCS #8 Initialization Code +*/ +void ElGamal_PrivateKey::PKCS8_load_hook(RandomNumberGenerator& rng, + bool generated) + { + if(y == 0) + y = power_mod(group_g(), x, group_p()); + core = ELG_Core(rng, group, y, x); + + if(generated) + gen_check(rng); + else + load_check(rng); + } + +/* +* ElGamal Decryption Function +*/ +SecureVector ElGamal_PrivateKey::decrypt(const byte in[], + u32bit length) const + { + return core.decrypt(in, length); + } + +/* +* Check Private ElGamal Parameters +*/ +bool ElGamal_PrivateKey::check_key(RandomNumberGenerator& rng, + bool strong) const + { + if(!DL_Scheme_PrivateKey::check_key(rng, strong)) + return false; + + if(!strong) + return true; + + try + { + KeyPair::check_key(rng, + get_pk_encryptor(*this, "EME1(SHA-1)"), + get_pk_decryptor(*this, "EME1(SHA-1)") + ); + } + catch(Self_Test_Failure) + { + return false; + } + + return true; + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/elgamal/elgamal.h b/src/libs/3rdparty/botan/src/pubkey/elgamal/elgamal.h new file mode 100644 index 00000000000..93e640f0963 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/elgamal/elgamal.h @@ -0,0 +1,59 @@ +/* +* ElGamal +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ELGAMAL_H__ +#define BOTAN_ELGAMAL_H__ + +#include +#include + +namespace Botan { + +/* +* ElGamal Public Key +*/ +class BOTAN_DLL ElGamal_PublicKey : public PK_Encrypting_Key, + public virtual DL_Scheme_PublicKey + { + public: + std::string algo_name() const { return "ElGamal"; } + DL_Group::Format group_format() const { return DL_Group::ANSI_X9_42; } + + SecureVector encrypt(const byte[], u32bit, + RandomNumberGenerator& rng) const; + u32bit max_input_bits() const; + + ElGamal_PublicKey() {} + ElGamal_PublicKey(const DL_Group&, const BigInt&); + protected: + ELG_Core core; + private: + void X509_load_hook(); + }; + +/* +* ElGamal Private Key +*/ +class BOTAN_DLL ElGamal_PrivateKey : public ElGamal_PublicKey, + public PK_Decrypting_Key, + public virtual DL_Scheme_PrivateKey + { + public: + SecureVector decrypt(const byte[], u32bit) const; + + bool check_key(RandomNumberGenerator& rng, bool) const; + + ElGamal_PrivateKey() {} + ElGamal_PrivateKey(RandomNumberGenerator&, const DL_Group&, + const BigInt& = 0); + private: + void PKCS8_load_hook(RandomNumberGenerator&, bool = false); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/elgamal/info.txt b/src/libs/3rdparty/botan/src/pubkey/elgamal/info.txt new file mode 100644 index 00000000000..d7ae614ea5b --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/elgamal/info.txt @@ -0,0 +1,22 @@ +realname "ElGamal" + +define ELGAMAL + +load_on auto + + +elgamal.cpp +elgamal.h +elg_core.cpp +elg_core.h +elg_op.cpp +elg_op.h + + + +dl_algo +dl_group +keypair +libstate +numbertheory + diff --git a/src/libs/3rdparty/botan/src/pubkey/if_algo/if_algo.cpp b/src/libs/3rdparty/botan/src/pubkey/if_algo/if_algo.cpp new file mode 100644 index 00000000000..556c86f6f1f --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/if_algo/if_algo.cpp @@ -0,0 +1,215 @@ +/* +* IF Scheme +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Return the X.509 public key encoder +*/ +X509_Encoder* IF_Scheme_PublicKey::x509_encoder() const + { + class IF_Scheme_Encoder : public X509_Encoder + { + public: + AlgorithmIdentifier alg_id() const + { + return AlgorithmIdentifier(key->get_oid(), + AlgorithmIdentifier::USE_NULL_PARAM); + } + + MemoryVector key_bits() const + { + return DER_Encoder() + .start_cons(SEQUENCE) + .encode(key->n) + .encode(key->e) + .end_cons() + .get_contents(); + } + + IF_Scheme_Encoder(const IF_Scheme_PublicKey* k) : key(k) {} + private: + const IF_Scheme_PublicKey* key; + }; + + return new IF_Scheme_Encoder(this); + } + +/* +* Return the X.509 public key decoder +*/ +X509_Decoder* IF_Scheme_PublicKey::x509_decoder() + { + class IF_Scheme_Decoder : public X509_Decoder + { + public: + void alg_id(const AlgorithmIdentifier&) {} + + void key_bits(const MemoryRegion& bits) + { + BER_Decoder(bits) + .start_cons(SEQUENCE) + .decode(key->n) + .decode(key->e) + .verify_end() + .end_cons(); + + key->X509_load_hook(); + } + + IF_Scheme_Decoder(IF_Scheme_PublicKey* k) : key(k) {} + private: + IF_Scheme_PublicKey* key; + }; + + return new IF_Scheme_Decoder(this); + } + +/* +* Return the PKCS #8 public key encoder +*/ +PKCS8_Encoder* IF_Scheme_PrivateKey::pkcs8_encoder() const + { + class IF_Scheme_Encoder : public PKCS8_Encoder + { + public: + AlgorithmIdentifier alg_id() const + { + return AlgorithmIdentifier(key->get_oid(), + AlgorithmIdentifier::USE_NULL_PARAM); + } + + MemoryVector key_bits() const + { + return DER_Encoder() + .start_cons(SEQUENCE) + .encode(static_cast(0)) + .encode(key->n) + .encode(key->e) + .encode(key->d) + .encode(key->p) + .encode(key->q) + .encode(key->d1) + .encode(key->d2) + .encode(key->c) + .end_cons() + .get_contents(); + } + + IF_Scheme_Encoder(const IF_Scheme_PrivateKey* k) : key(k) {} + private: + const IF_Scheme_PrivateKey* key; + }; + + return new IF_Scheme_Encoder(this); + } + +/* +* Return the PKCS #8 public key decoder +*/ +PKCS8_Decoder* IF_Scheme_PrivateKey::pkcs8_decoder(RandomNumberGenerator& rng) + { + class IF_Scheme_Decoder : public PKCS8_Decoder + { + public: + void alg_id(const AlgorithmIdentifier&) {} + + void key_bits(const MemoryRegion& bits) + { + u32bit version; + + BER_Decoder(bits) + .start_cons(SEQUENCE) + .decode(version) + .decode(key->n) + .decode(key->e) + .decode(key->d) + .decode(key->p) + .decode(key->q) + .decode(key->d1) + .decode(key->d2) + .decode(key->c) + .end_cons(); + + if(version != 0) + throw Decoding_Error("Unknown PKCS #1 key format version"); + + key->PKCS8_load_hook(rng); + } + + IF_Scheme_Decoder(IF_Scheme_PrivateKey* k, RandomNumberGenerator& r) : + key(k), rng(r) {} + private: + IF_Scheme_PrivateKey* key; + RandomNumberGenerator& rng; + }; + + return new IF_Scheme_Decoder(this, rng); + } + +/* +* Algorithm Specific X.509 Initialization Code +*/ +void IF_Scheme_PublicKey::X509_load_hook() + { + core = IF_Core(e, n); + } + +/* +* Algorithm Specific PKCS #8 Initialization Code +*/ +void IF_Scheme_PrivateKey::PKCS8_load_hook(RandomNumberGenerator& rng, + bool generated) + { + if(n == 0) n = p * q; + if(d1 == 0) d1 = d % (p - 1); + if(d2 == 0) d2 = d % (q - 1); + if(c == 0) c = inverse_mod(q, p); + + core = IF_Core(rng, e, n, d, p, q, d1, d2, c); + + if(generated) + gen_check(rng); + else + load_check(rng); + } + +/* +* Check IF Scheme Public Parameters +*/ +bool IF_Scheme_PublicKey::check_key(RandomNumberGenerator&, bool) const + { + if(n < 35 || n.is_even() || e < 2) + return false; + return true; + } + +/* +* Check IF Scheme Private Parameters +*/ +bool IF_Scheme_PrivateKey::check_key(RandomNumberGenerator& rng, + bool strong) const + { + if(n < 35 || n.is_even() || e < 2 || d < 2 || p < 3 || q < 3 || p*q != n) + return false; + + if(!strong) + return true; + + if(d1 != d % (p - 1) || d2 != d % (q - 1) || c != inverse_mod(q, p)) + return false; + if(!check_prime(p, rng) || !check_prime(q, rng)) + return false; + return true; + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/if_algo/if_algo.h b/src/libs/3rdparty/botan/src/pubkey/if_algo/if_algo.h new file mode 100644 index 00000000000..32a29be49ce --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/if_algo/if_algo.h @@ -0,0 +1,85 @@ +/* +* IF Scheme +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_IF_ALGO_H__ +#define BOTAN_IF_ALGO_H__ + +#include +#include +#include + +namespace Botan { + +/** +* This class represents public keys +* of integer factorization based (IF) public key schemes. +*/ +class BOTAN_DLL IF_Scheme_PublicKey : public virtual Public_Key + { + public: + bool check_key(RandomNumberGenerator& rng, bool) const; + + /** + * Get n = p * q. + * @return n + */ + const BigInt& get_n() const { return n; } + + /** + * Get the public exponent used by the key. + * @return the public exponent + */ + const BigInt& get_e() const { return e; } + + u32bit max_input_bits() const { return (n.bits() - 1); } + + X509_Encoder* x509_encoder() const; + X509_Decoder* x509_decoder(); + protected: + virtual void X509_load_hook(); + BigInt n, e; + IF_Core core; + }; + +/** +* This class represents public keys +* of integer factorization based (IF) public key schemes. +*/ +class BOTAN_DLL IF_Scheme_PrivateKey : public virtual IF_Scheme_PublicKey, + public virtual Private_Key + { + public: + bool check_key(RandomNumberGenerator& rng, bool) const; + + /** + * Get the first prime p. + * @return the prime p + */ + const BigInt& get_p() const { return p; } + + /** + * Get the second prime q. + * @return the prime q + */ + const BigInt& get_q() const { return q; } + + /** + * Get d with exp * d = 1 mod (p - 1, q - 1). + * @return d + */ + const BigInt& get_d() const { return d; } + + PKCS8_Encoder* pkcs8_encoder() const; + PKCS8_Decoder* pkcs8_decoder(RandomNumberGenerator&); + protected: + virtual void PKCS8_load_hook(RandomNumberGenerator&, bool = false); + BigInt d, p, q, d1, d2, c; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/if_algo/if_core.cpp b/src/libs/3rdparty/botan/src/pubkey/if_algo/if_core.cpp new file mode 100644 index 00000000000..8cc6a816f6d --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/if_algo/if_core.cpp @@ -0,0 +1,87 @@ +/* +* IF Algorithm Core +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +const u32bit BLINDING_BITS = BOTAN_PRIVATE_KEY_OP_BLINDING_BITS; + +} + +/* +* IF_Core Constructor +*/ +IF_Core::IF_Core(const BigInt& e, const BigInt& n) + { + op = Engine_Core::if_op(e, n, 0, 0, 0, 0, 0, 0); + } + + +/* +* IF_Core Constructor +*/ +IF_Core::IF_Core(RandomNumberGenerator& rng, + const BigInt& e, const BigInt& n, const BigInt& d, + const BigInt& p, const BigInt& q, + const BigInt& d1, const BigInt& d2, const BigInt& c) + { + op = Engine_Core::if_op(e, n, d, p, q, d1, d2, c); + + if(BLINDING_BITS) + { + BigInt k(rng, std::min(n.bits()-1, BLINDING_BITS)); + blinder = Blinder(power_mod(k, e, n), inverse_mod(k, n), n); + } + } + +/* +* IF_Core Copy Constructor +*/ +IF_Core::IF_Core(const IF_Core& core) + { + op = 0; + if(core.op) + op = core.op->clone(); + blinder = core.blinder; + } + +/* +* IF_Core Assignment Operator +*/ +IF_Core& IF_Core::operator=(const IF_Core& core) + { + delete op; + if(core.op) + op = core.op->clone(); + blinder = core.blinder; + return (*this); + } + +/* +* IF Public Operation +*/ +BigInt IF_Core::public_op(const BigInt& i) const + { + return op->public_op(i); + } + +/* +* IF Private Operation +*/ +BigInt IF_Core::private_op(const BigInt& i) const + { + return blinder.unblind(op->private_op(blinder.blind(i))); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/if_algo/if_core.h b/src/libs/3rdparty/botan/src/pubkey/if_algo/if_core.h new file mode 100644 index 00000000000..b7f487706eb --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/if_algo/if_core.h @@ -0,0 +1,45 @@ +/* +* IF Algorithm Core +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_IF_CORE_H__ +#define BOTAN_IF_CORE_H__ + +#include +#include + +namespace Botan { + +/* +* IF Core +*/ +class BOTAN_DLL IF_Core + { + public: + BigInt public_op(const BigInt&) const; + BigInt private_op(const BigInt&) const; + + IF_Core& operator=(const IF_Core&); + + IF_Core() { op = 0; } + IF_Core(const IF_Core&); + + IF_Core(const BigInt&, const BigInt&); + + IF_Core(RandomNumberGenerator& rng, + const BigInt&, const BigInt&, + const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&, const BigInt&); + + ~IF_Core() { delete op; } + private: + IF_Operation* op; + Blinder blinder; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/if_algo/if_op.cpp b/src/libs/3rdparty/botan/src/pubkey/if_algo/if_op.cpp new file mode 100644 index 00000000000..27aef453ed5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/if_algo/if_op.cpp @@ -0,0 +1,47 @@ +/* +* IF (RSA/RW) Operation +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Default_IF_Op Constructor +*/ +Default_IF_Op::Default_IF_Op(const BigInt& e, const BigInt& n, const BigInt&, + const BigInt& p, const BigInt& q, + const BigInt& d1, const BigInt& d2, + const BigInt& c) + { + powermod_e_n = Fixed_Exponent_Power_Mod(e, n); + + if(d1 != 0 && d2 != 0 && p != 0 && q != 0) + { + powermod_d1_p = Fixed_Exponent_Power_Mod(d1, p); + powermod_d2_q = Fixed_Exponent_Power_Mod(d2, q); + reducer = Modular_Reducer(p); + this->c = c; + this->q = q; + } + } + +/* +* Default IF Private Operation +*/ +BigInt Default_IF_Op::private_op(const BigInt& i) const + { + if(q == 0) + throw Internal_Error("Default_IF_Op::private_op: No private key"); + + BigInt j1 = powermod_d1_p(i); + BigInt j2 = powermod_d2_q(i); + j1 = reducer.reduce(sub_mul(j1, j2, c)); + return mul_add(j1, q, j2); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/if_algo/if_op.h b/src/libs/3rdparty/botan/src/pubkey/if_algo/if_op.h new file mode 100644 index 00000000000..516902fd9bf --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/if_algo/if_op.h @@ -0,0 +1,52 @@ +/* +* IF Operations +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_IF_OP_H__ +#define BOTAN_IF_OP_H__ + +#include +#include +#include + +namespace Botan { + +/* +* IF Operation +*/ +class BOTAN_DLL IF_Operation + { + public: + virtual BigInt public_op(const BigInt&) const = 0; + virtual BigInt private_op(const BigInt&) const = 0; + virtual IF_Operation* clone() const = 0; + virtual ~IF_Operation() {} + }; + +/* +* Default IF Operation +*/ +class BOTAN_DLL Default_IF_Op : public IF_Operation + { + public: + BigInt public_op(const BigInt& i) const + { return powermod_e_n(i); } + BigInt private_op(const BigInt&) const; + + IF_Operation* clone() const { return new Default_IF_Op(*this); } + + Default_IF_Op(const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&, const BigInt&, + const BigInt&, const BigInt&); + private: + Fixed_Exponent_Power_Mod powermod_e_n, powermod_d1_p, powermod_d2_q; + Modular_Reducer reducer; + BigInt c, q; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/if_algo/info.txt b/src/libs/3rdparty/botan/src/pubkey/if_algo/info.txt new file mode 100644 index 00000000000..d2142f42f91 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/if_algo/info.txt @@ -0,0 +1,22 @@ +realname "Integer Factorization Algorithms" + +define IF_PUBLIC_KEY_FAMILY + +load_on dep + + +if_algo.cpp +if_algo.h +if_core.cpp +if_core.h +if_op.cpp +if_op.h + + + +asn1 +bigint +libstate +numbertheory +pk_codecs + diff --git a/src/libs/3rdparty/botan/src/pubkey/info.txt b/src/libs/3rdparty/botan/src/pubkey/info.txt new file mode 100644 index 00000000000..ee8da5b9dd5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/info.txt @@ -0,0 +1,30 @@ +realname "Public Key Base" + +define PUBLIC_KEY_CRYPTO + +load_on auto + + +pk_algs.cpp +pk_algs.h +pk_filts.cpp +pk_filts.h +pk_keys.cpp +pk_keys.h +pubkey.cpp +pubkey.h +pubkey_enums.cpp +pubkey_enums.h + + + +alloc +asn1 +bigint +filters +kdf +oid_lookup +pk_pad +rng +sym_algo + diff --git a/src/libs/3rdparty/botan/src/pubkey/keypair/info.txt b/src/libs/3rdparty/botan/src/pubkey/keypair/info.txt new file mode 100644 index 00000000000..9e758643f72 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/keypair/info.txt @@ -0,0 +1,14 @@ +realname "Keypair Testing" + +define KEYPAIR_TESTING + +load_on auto + + +keypair.cpp +keypair.h + + + +libstate + diff --git a/src/libs/3rdparty/botan/src/pubkey/keypair/keypair.cpp b/src/libs/3rdparty/botan/src/pubkey/keypair/keypair.cpp new file mode 100644 index 00000000000..486577fc55f --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/keypair/keypair.cpp @@ -0,0 +1,73 @@ +/* +* Keypair Checks +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace KeyPair { + +/* +* Check an encryption key pair for consistency +*/ +void check_key(RandomNumberGenerator& rng, + PK_Encryptor* encryptor, PK_Decryptor* decryptor) + { + if(encryptor->maximum_input_size() == 0) + return; + + std::auto_ptr enc(encryptor); + std::auto_ptr dec(decryptor); + + SecureVector message(enc->maximum_input_size() - 1); + rng.randomize(message, message.size()); + + SecureVector ciphertext = enc->encrypt(message, rng); + if(ciphertext == message) + throw Self_Test_Failure("Encryption key pair consistency failure"); + + SecureVector message2 = dec->decrypt(ciphertext); + if(message != message2) + throw Self_Test_Failure("Encryption key pair consistency failure"); + } + +/* +* Check a signature key pair for consistency +*/ +void check_key(RandomNumberGenerator& rng, + PK_Signer* signer, PK_Verifier* verifier) + { + std::auto_ptr sig(signer); + std::auto_ptr ver(verifier); + + SecureVector message(16); + rng.randomize(message, message.size()); + + SecureVector signature; + + try + { + signature = sig->sign_message(message, rng); + } + catch(Encoding_Error) + { + return; + } + + if(!ver->verify_message(message, signature)) + throw Self_Test_Failure("Signature key pair consistency failure"); + + ++message[0]; + if(ver->verify_message(message, signature)) + throw Self_Test_Failure("Signature key pair consistency failure"); + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/keypair/keypair.h b/src/libs/3rdparty/botan/src/pubkey/keypair/keypair.h new file mode 100644 index 00000000000..b1d5c2da099 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/keypair/keypair.h @@ -0,0 +1,47 @@ +/* +* Keypair Checks +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_KEYPAIR_H__ +#define BOTAN_KEYPAIR_H__ + +#include + +namespace Botan { + +namespace KeyPair { + +/** +* Tests whether the specified encryptor and decryptor are related to each other, +* i.e. whether encrypting with the encryptor and consecutive decryption leads to +* the original plaintext. +* @param rng the rng to use +* @param enc the encryptor to test +* @param dec the decryptor to test +* @throw Self_Test_Failure if the arguments are not related to each other +*/ +BOTAN_DLL void check_key(RandomNumberGenerator& rng, + PK_Encryptor* enc, + PK_Decryptor* dec); + +/** +* Tests whether the specified signer and verifier are related to each other, +* i.e. whether a signature created with the signer and can be +* successfully verified with the verifier. +* @param rng the rng to use +* @param sig the signer to test +* @param ver the verifier to test +* @throw Self_Test_Failure if the arguments are not related to each other +*/ +BOTAN_DLL void check_key(RandomNumberGenerator& rng, + PK_Signer* sig, + PK_Verifier* ver); + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/nr/info.txt b/src/libs/3rdparty/botan/src/pubkey/nr/info.txt new file mode 100644 index 00000000000..c89820aebb0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/nr/info.txt @@ -0,0 +1,22 @@ +realname "Nyberg-Rueppel" + +define NYBERG_RUEPPEL + +load_on auto + + +nr.cpp +nr.h +nr_core.cpp +nr_core.h +nr_op.cpp +nr_op.h + + + +dl_algo +dl_group +keypair +libstate +numbertheory + diff --git a/src/libs/3rdparty/botan/src/pubkey/nr/nr.cpp b/src/libs/3rdparty/botan/src/pubkey/nr/nr.cpp new file mode 100644 index 00000000000..ad4ae78d3bf --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/nr/nr.cpp @@ -0,0 +1,134 @@ +/* +* Nyberg-Rueppel +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* NR_PublicKey Constructor +*/ +NR_PublicKey::NR_PublicKey(const DL_Group& grp, const BigInt& y1) + { + group = grp; + y = y1; + X509_load_hook(); + } + +/* +* Algorithm Specific X.509 Initialization Code +*/ +void NR_PublicKey::X509_load_hook() + { + core = NR_Core(group, y); + } + +/* +* Nyberg-Rueppel Verification Function +*/ +SecureVector NR_PublicKey::verify(const byte sig[], u32bit sig_len) const + { + return core.verify(sig, sig_len); + } + +/* +* Return the maximum input size in bits +*/ +u32bit NR_PublicKey::max_input_bits() const + { + return (group_q().bits() - 1); + } + +/* +* Return the size of each portion of the sig +*/ +u32bit NR_PublicKey::message_part_size() const + { + return group_q().bytes(); + } + +/* +* Create a NR private key +*/ +NR_PrivateKey::NR_PrivateKey(RandomNumberGenerator& rng, + const DL_Group& grp, + const BigInt& x_arg) + { + group = grp; + x = x_arg; + + if(x == 0) + { + x = BigInt::random_integer(rng, 2, group_q() - 1); + PKCS8_load_hook(rng, true); + } + else + PKCS8_load_hook(rng, false); + } + +/* +* Algorithm Specific PKCS #8 Initialization Code +*/ +void NR_PrivateKey::PKCS8_load_hook(RandomNumberGenerator& rng, + bool generated) + { + if(y == 0) + y = power_mod(group_g(), x, group_p()); + core = NR_Core(group, y, x); + + if(generated) + gen_check(rng); + else + load_check(rng); + } + +/* +* Nyberg-Rueppel Signature Operation +*/ +SecureVector NR_PrivateKey::sign(const byte in[], u32bit length, + RandomNumberGenerator& rng) const + { + const BigInt& q = group_q(); + + BigInt k; + do + k.randomize(rng, q.bits()); + while(k >= q); + + return core.sign(in, length, k); + } + +/* +* Check Private Nyberg-Rueppel Parameters +*/ +bool NR_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const + { + if(!DL_Scheme_PrivateKey::check_key(rng, strong) || x >= group_q()) + return false; + + if(!strong) + return true; + + try + { + KeyPair::check_key(rng, + get_pk_signer(*this, "EMSA1(SHA-1)"), + get_pk_verifier(*this, "EMSA1(SHA-1)") + ); + } + catch(Self_Test_Failure) + { + return false; + } + + return true; + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/nr/nr.h b/src/libs/3rdparty/botan/src/pubkey/nr/nr.h new file mode 100644 index 00000000000..144c5ec2af2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/nr/nr.h @@ -0,0 +1,63 @@ +/* +* Nyberg-Rueppel +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_NYBERG_RUEPPEL_H__ +#define BOTAN_NYBERG_RUEPPEL_H__ + +#include +#include + +namespace Botan { + +/* +* Nyberg-Rueppel Public Key +*/ +class BOTAN_DLL NR_PublicKey : public PK_Verifying_with_MR_Key, + public virtual DL_Scheme_PublicKey + { + public: + std::string algo_name() const { return "NR"; } + + SecureVector verify(const byte[], u32bit) const; + u32bit max_input_bits() const; + + DL_Group::Format group_format() const { return DL_Group::ANSI_X9_57; } + u32bit message_parts() const { return 2; } + u32bit message_part_size() const; + + NR_PublicKey() {} + NR_PublicKey(const DL_Group&, const BigInt&); + protected: + NR_Core core; + private: + void X509_load_hook(); + }; + +/* +* Nyberg-Rueppel Private Key +*/ +class BOTAN_DLL NR_PrivateKey : public NR_PublicKey, + public PK_Signing_Key, + public virtual DL_Scheme_PrivateKey + { + public: + SecureVector sign(const byte[], u32bit, + RandomNumberGenerator& rng) const; + + bool check_key(RandomNumberGenerator& rng, bool) const; + + NR_PrivateKey() {} + + NR_PrivateKey(RandomNumberGenerator&, const DL_Group&, + const BigInt& = 0); + private: + void PKCS8_load_hook(RandomNumberGenerator&, bool = false); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/nr/nr_core.cpp b/src/libs/3rdparty/botan/src/pubkey/nr/nr_core.cpp new file mode 100644 index 00000000000..afa1115dba4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/nr/nr_core.cpp @@ -0,0 +1,62 @@ +/* +* NR Core +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* NR_Core Constructor +*/ +NR_Core::NR_Core(const DL_Group& group, const BigInt& y, const BigInt& x) + { + op = Engine_Core::nr_op(group, y, x); + } + +/* +* NR_Core Copy Constructor +*/ +NR_Core::NR_Core(const NR_Core& core) + { + op = 0; + if(core.op) + op = core.op->clone(); + } + +/* +* NR_Core Assignment Operator +*/ +NR_Core& NR_Core::operator=(const NR_Core& core) + { + delete op; + if(core.op) + op = core.op->clone(); + return (*this); + } + +/* +* NR Verification Operation +*/ +SecureVector NR_Core::verify(const byte in[], u32bit length) const + { + return op->verify(in, length); + } + +/* +* NR Signature Operation +*/ +SecureVector NR_Core::sign(const byte in[], u32bit length, + const BigInt& k) const + { + return op->sign(in, length, k); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/nr/nr_core.h b/src/libs/3rdparty/botan/src/pubkey/nr/nr_core.h new file mode 100644 index 00000000000..48377362211 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/nr/nr_core.h @@ -0,0 +1,37 @@ +/* +* NR Core +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_NR_CORE_H__ +#define BOTAN_NR_CORE_H__ + +#include +#include + +namespace Botan { + +/* +* NR Core +*/ +class BOTAN_DLL NR_Core + { + public: + SecureVector sign(const byte[], u32bit, const BigInt&) const; + SecureVector verify(const byte[], u32bit) const; + + NR_Core& operator=(const NR_Core&); + + NR_Core() { op = 0; } + NR_Core(const NR_Core&); + NR_Core(const DL_Group&, const BigInt&, const BigInt& = 0); + ~NR_Core() { delete op; } + private: + NR_Operation* op; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/nr/nr_op.cpp b/src/libs/3rdparty/botan/src/pubkey/nr/nr_op.cpp new file mode 100644 index 00000000000..b5efa3d3759 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/nr/nr_op.cpp @@ -0,0 +1,71 @@ +/* +* NR Operations +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Default_NR_Op Constructor +*/ +Default_NR_Op::Default_NR_Op(const DL_Group& grp, const BigInt& y1, + const BigInt& x1) : x(x1), y(y1), group(grp) + { + powermod_g_p = Fixed_Base_Power_Mod(group.get_g(), group.get_p()); + powermod_y_p = Fixed_Base_Power_Mod(y, group.get_p()); + mod_p = Modular_Reducer(group.get_p()); + mod_q = Modular_Reducer(group.get_q()); + } + +/* +* Default NR Verify Operation +*/ +SecureVector Default_NR_Op::verify(const byte in[], u32bit length) const + { + const BigInt& q = group.get_q(); + + if(length != 2*q.bytes()) + return false; + + BigInt c(in, q.bytes()); + BigInt d(in + q.bytes(), q.bytes()); + + if(c.is_zero() || c >= q || d >= q) + throw Invalid_Argument("Default_NR_Op::verify: Invalid signature"); + + BigInt i = mod_p.multiply(powermod_g_p(d), powermod_y_p(c)); + return BigInt::encode(mod_q.reduce(c - i)); + } + +/* +* Default NR Sign Operation +*/ +SecureVector Default_NR_Op::sign(const byte in[], u32bit length, + const BigInt& k) const + { + if(x == 0) + throw Internal_Error("Default_NR_Op::sign: No private key"); + + const BigInt& q = group.get_q(); + + BigInt f(in, length); + + if(f >= q) + throw Invalid_Argument("Default_NR_Op::sign: Input is out of range"); + + BigInt c = mod_q.reduce(powermod_g_p(k) + f); + if(c.is_zero()) + throw Internal_Error("Default_NR_Op::sign: c was zero"); + BigInt d = mod_q.reduce(k - x * c); + + SecureVector output(2*q.bytes()); + c.binary_encode(output + (output.size() / 2 - c.bytes())); + d.binary_encode(output + (output.size() - d.bytes())); + return output; + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/nr/nr_op.h b/src/libs/3rdparty/botan/src/pubkey/nr/nr_op.h new file mode 100644 index 00000000000..cba1465f2f7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/nr/nr_op.h @@ -0,0 +1,53 @@ +/* +* NR Operations +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_NR_OPS_H__ +#define BOTAN_NR_OPS_H__ + +#include +#include +#include +#include + +namespace Botan { + +/* +* NR Operation +*/ +class BOTAN_DLL NR_Operation + { + public: + virtual SecureVector verify(const byte[], u32bit) const = 0; + virtual SecureVector sign(const byte[], u32bit, + const BigInt&) const = 0; + virtual NR_Operation* clone() const = 0; + virtual ~NR_Operation() {} + }; + +/* +* Botan's Default NR Operation +*/ +class BOTAN_DLL Default_NR_Op : public NR_Operation + { + public: + SecureVector verify(const byte[], u32bit) const; + SecureVector sign(const byte[], u32bit, const BigInt&) const; + + NR_Operation* clone() const { return new Default_NR_Op(*this); } + + Default_NR_Op(const DL_Group&, const BigInt&, const BigInt&); + private: + const BigInt x, y; + const DL_Group group; + Fixed_Base_Power_Mod powermod_g_p, powermod_y_p; + Modular_Reducer mod_p, mod_q; + }; + + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/pk_algs.cpp b/src/libs/3rdparty/botan/src/pubkey/pk_algs.cpp new file mode 100644 index 00000000000..99d7294f0d8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pk_algs.cpp @@ -0,0 +1,112 @@ +/* +* PK Key +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +#if defined(BOTAN_HAS_RSA) + #include +#endif + +#if defined(BOTAN_HAS_DSA) + #include +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + #include +#endif + +#if defined(BOTAN_HAS_ECDSA) + #include +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + #include +#endif + +#if defined(BOTAN_HAS_RW) + #include +#endif + +#if defined(BOTAN_HAS_ELGAMAL) + #include +#endif + +namespace Botan { + +/* +* Get an PK public key object +*/ +Public_Key* get_public_key(const std::string& alg_name) + { +#if defined(BOTAN_HAS_RSA) + if(alg_name == "RSA") return new RSA_PublicKey; +#endif + +#if defined(BOTAN_HAS_DSA) + if(alg_name == "DSA") return new DSA_PublicKey; +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + if(alg_name == "DH") return new DH_PublicKey; +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + if(alg_name == "NR") return new NR_PublicKey; +#endif + +#if defined(BOTAN_HAS_RW) + if(alg_name == "RW") return new RW_PublicKey; +#endif + +#if defined(BOTAN_HAS_ELG) + if(alg_name == "ELG") return new ElGamal_PublicKey; +#endif + +#if defined(BOTAN_HAS_ECDSA) + if(alg_name == "ECDSA") return new ECDSA_PublicKey; +#endif + + return 0; + } + +/* +* Get an PK private key object +*/ +Private_Key* get_private_key(const std::string& alg_name) + { +#if defined(BOTAN_HAS_RSA) + if(alg_name == "RSA") return new RSA_PrivateKey; +#endif + +#if defined(BOTAN_HAS_DSA) + if(alg_name == "DSA") return new DSA_PrivateKey; +#endif + +#if defined(BOTAN_HAS_DIFFIE_HELLMAN) + if(alg_name == "DH") return new DH_PrivateKey; +#endif + +#if defined(BOTAN_HAS_NYBERG_RUEPPEL) + if(alg_name == "NR") return new NR_PrivateKey; +#endif + +#if defined(BOTAN_HAS_RW) + if(alg_name == "RW") return new RW_PrivateKey; +#endif + +#if defined(BOTAN_HAS_ELG) + if(alg_name == "ELG") return new ElGamal_PrivateKey; +#endif + +#if defined(BOTAN_HAS_ECDSA) + if(alg_name == "ECDSA") return new ECDSA_PrivateKey; +#endif + + return 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/pk_algs.h b/src/libs/3rdparty/botan/src/pubkey/pk_algs.h new file mode 100644 index 00000000000..c41bf1a630d --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pk_algs.h @@ -0,0 +1,31 @@ +/* +* PK Key Factory +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PK_KEY_FACTORY_H__ +#define BOTAN_PK_KEY_FACTORY_H__ + +#include + +namespace Botan { + +/** +* Get an empty public key object. +* @param name the name of the desired public key algorithm +* @return the public key object +*/ +BOTAN_DLL Public_Key* get_public_key(const std::string&); + +/** +* Get an empty private key object. +* @param name the name of the desired public key algorithm +* @return the private key object +*/ +BOTAN_DLL Private_Key* get_private_key(const std::string&); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/pk_codecs/info.txt b/src/libs/3rdparty/botan/src/pubkey/pk_codecs/info.txt new file mode 100644 index 00000000000..96511a663d6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pk_codecs/info.txt @@ -0,0 +1,18 @@ +realname "PK codecs (PKCS8, X.509)" + +load_on auto + + +pkcs8.h +pkcs8.cpp +x509_key.h +x509_key.cpp + + + +asn1 +filters +oid_lookup +pbe +pem + diff --git a/src/libs/3rdparty/botan/src/pubkey/pk_codecs/pkcs8.cpp b/src/libs/3rdparty/botan/src/pubkey/pk_codecs/pkcs8.cpp new file mode 100644 index 00000000000..8a464ecfeb4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pk_codecs/pkcs8.cpp @@ -0,0 +1,313 @@ +/* +* PKCS #8 +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace PKCS8 { + +namespace { + +/* +* Get info from an EncryptedPrivateKeyInfo +*/ +SecureVector PKCS8_extract(DataSource& source, + AlgorithmIdentifier& pbe_alg_id) + { + SecureVector key_data; + + BER_Decoder(source) + .start_cons(SEQUENCE) + .decode(pbe_alg_id) + .decode(key_data, OCTET_STRING) + .verify_end(); + + return key_data; + } + +/* +* PEM decode and/or decrypt a private key +*/ +SecureVector PKCS8_decode(DataSource& source, const User_Interface& ui, + AlgorithmIdentifier& pk_alg_id) + { + AlgorithmIdentifier pbe_alg_id; + SecureVector key_data, key; + bool is_encrypted = true; + + try { + if(ASN1::maybe_BER(source) && !PEM_Code::matches(source)) + key_data = PKCS8_extract(source, pbe_alg_id); + else + { + std::string label; + key_data = PEM_Code::decode(source, label); + if(label == "PRIVATE KEY") + is_encrypted = false; + else if(label == "ENCRYPTED PRIVATE KEY") + { + DataSource_Memory key_source(key_data); + key_data = PKCS8_extract(key_source, pbe_alg_id); + } + else + throw PKCS8_Exception("Unknown PEM label " + label); + } + + if(key_data.is_empty()) + throw PKCS8_Exception("No key data found"); + } + catch(Decoding_Error) + { + throw Decoding_Error("PKCS #8 private key decoding failed"); + } + + if(!is_encrypted) + key = key_data; + + const u32bit MAX_TRIES = 3; + + u32bit tries = 0; + while(true) + { + try { + if(MAX_TRIES && tries >= MAX_TRIES) + break; + + if(is_encrypted) + { + DataSource_Memory params(pbe_alg_id.parameters); + std::auto_ptr pbe(get_pbe(pbe_alg_id.oid, params)); + + User_Interface::UI_Result result = User_Interface::OK; + const std::string passphrase = + ui.get_passphrase("PKCS #8 private key", source.id(), result); + + if(result == User_Interface::CANCEL_ACTION) + break; + + pbe->set_key(passphrase); + Pipe decryptor(pbe.release()); + + decryptor.process_msg(key_data, key_data.size()); + key = decryptor.read_all(); + } + + u32bit version; + + BER_Decoder(key) + .start_cons(SEQUENCE) + .decode(version) + .decode(pk_alg_id) + .decode(key, OCTET_STRING) + .discard_remaining() + .end_cons(); + + if(version != 0) + throw Decoding_Error("PKCS #8: Unknown version number"); + + break; + } + catch(Decoding_Error) + { + ++tries; + } + } + + if(key.is_empty()) + throw Decoding_Error("PKCS #8 private key decoding failed"); + return key; + } + +} + +/* +* DER or PEM encode a PKCS #8 private key +*/ +void encode(const Private_Key& key, Pipe& pipe, X509_Encoding encoding) + { + std::auto_ptr encoder(key.pkcs8_encoder()); + if(!encoder.get()) + throw Encoding_Error("PKCS8::encode: Key does not support encoding"); + + const u32bit PKCS8_VERSION = 0; + + SecureVector contents = + DER_Encoder() + .start_cons(SEQUENCE) + .encode(PKCS8_VERSION) + .encode(encoder->alg_id()) + .encode(encoder->key_bits(), OCTET_STRING) + .end_cons() + .get_contents(); + + if(encoding == PEM) + pipe.write(PEM_Code::encode(contents, "PRIVATE KEY")); + else + pipe.write(contents); + } + +/* +* Encode and encrypt a PKCS #8 private key +*/ +void encrypt_key(const Private_Key& key, + Pipe& pipe, + RandomNumberGenerator& rng, + const std::string& pass, const std::string& pbe_algo, + X509_Encoding encoding) + { + const std::string DEFAULT_PBE = "PBE-PKCS5v20(SHA-1,TripleDES/CBC)"; + + Pipe raw_key; + raw_key.start_msg(); + encode(key, raw_key, RAW_BER); + raw_key.end_msg(); + + std::auto_ptr pbe(get_pbe(((pbe_algo != "") ? pbe_algo : DEFAULT_PBE))); + + pbe->new_params(rng); + pbe->set_key(pass); + + AlgorithmIdentifier pbe_algid(pbe->get_oid(), pbe->encode_params()); + + Pipe key_encrytor(pbe.release()); + key_encrytor.process_msg(raw_key); + + SecureVector enc_key = + DER_Encoder() + .start_cons(SEQUENCE) + .encode(pbe_algid) + .encode(key_encrytor.read_all(), OCTET_STRING) + .end_cons() + .get_contents(); + + if(encoding == PEM) + pipe.write(PEM_Code::encode(enc_key, "ENCRYPTED PRIVATE KEY")); + else + pipe.write(enc_key); + } + +/* +* PEM encode a PKCS #8 private key +*/ +std::string PEM_encode(const Private_Key& key) + { + Pipe pem; + pem.start_msg(); + encode(key, pem, PEM); + pem.end_msg(); + return pem.read_all_as_string(); + } + +/* +* Encrypt and PEM encode a PKCS #8 private key +*/ +std::string PEM_encode(const Private_Key& key, + RandomNumberGenerator& rng, + const std::string& pass, + const std::string& pbe_algo) + { + if(pass == "") + return PEM_encode(key); + + Pipe pem; + pem.start_msg(); + encrypt_key(key, pem, rng, pass, pbe_algo, PEM); + pem.end_msg(); + return pem.read_all_as_string(); + } + +/* +* Extract a private key and return it +*/ +Private_Key* load_key(DataSource& source, + RandomNumberGenerator& rng, + const User_Interface& ui) + { + AlgorithmIdentifier alg_id; + SecureVector pkcs8_key = PKCS8_decode(source, ui, alg_id); + + const std::string alg_name = OIDS::lookup(alg_id.oid); + if(alg_name == "" || alg_name == alg_id.oid.as_string()) + throw PKCS8_Exception("Unknown algorithm OID: " + + alg_id.oid.as_string()); + + std::auto_ptr key(get_private_key(alg_name)); + + if(!key.get()) + throw PKCS8_Exception("Unknown PK algorithm/OID: " + alg_name + ", " + + alg_id.oid.as_string()); + + std::auto_ptr decoder(key->pkcs8_decoder(rng)); + + if(!decoder.get()) + throw Decoding_Error("Key does not support PKCS #8 decoding"); + + decoder->alg_id(alg_id); + decoder->key_bits(pkcs8_key); + + return key.release(); + } + +/* +* Extract a private key and return it +*/ +Private_Key* load_key(const std::string& fsname, + RandomNumberGenerator& rng, + const User_Interface& ui) + { + DataSource_Stream source(fsname, true); + return PKCS8::load_key(source, rng, ui); + } + +/* +* Extract a private key and return it +*/ +Private_Key* load_key(DataSource& source, + RandomNumberGenerator& rng, + const std::string& pass) + { + return PKCS8::load_key(source, rng, User_Interface(pass)); + } + +/* +* Extract a private key and return it +*/ +Private_Key* load_key(const std::string& fsname, + RandomNumberGenerator& rng, + const std::string& pass) + { + return PKCS8::load_key(fsname, rng, User_Interface(pass)); + } + +/* +* Make a copy of this private key +*/ +Private_Key* copy_key(const Private_Key& key, + RandomNumberGenerator& rng) + { + Pipe bits; + + bits.start_msg(); + PKCS8::encode(key, bits); + bits.end_msg(); + + DataSource_Memory source(bits.read_all()); + return PKCS8::load_key(source, rng); + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/pk_codecs/pkcs8.h b/src/libs/3rdparty/botan/src/pubkey/pk_codecs/pkcs8.h new file mode 100644 index 00000000000..28008bdba66 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pk_codecs/pkcs8.h @@ -0,0 +1,177 @@ +/* +* PKCS #8 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PKCS8_H__ +#define BOTAN_PKCS8_H__ + +#include +#include + +namespace Botan { + +/** +* PKCS #8 Private Key Encoder. +*/ +class BOTAN_DLL PKCS8_Encoder + { + public: + /** + * Get the algorithm identifier associated with the scheme + * this encoders key is part of. + * @return the algorithm identifier + */ + virtual AlgorithmIdentifier alg_id() const = 0; + + /** + * Get the DER encoded key. + * @return the DER encoded key + */ + // FIXME: Why not SecureVector? + virtual MemoryVector key_bits() const = 0; + virtual ~PKCS8_Encoder() {} + }; + +/* +* PKCS #8 Private Key Decoder +*/ +class BOTAN_DLL PKCS8_Decoder + { + public: + /** + * Set the algorithm identifier associated with the scheme + * this decoders key is part of. + * @param alg_id the algorithm identifier + */ + virtual void alg_id(const AlgorithmIdentifier&) = 0; + + /** + * Set the DER encoded key. + * @param key the DER encoded key + */ + virtual void key_bits(const MemoryRegion&) = 0; + virtual ~PKCS8_Decoder() {} + }; + +/** +* PKCS #8 General Exception +*/ +struct BOTAN_DLL PKCS8_Exception : public Decoding_Error + { + PKCS8_Exception(const std::string& error) : + Decoding_Error("PKCS #8: " + error) {} + }; + +namespace PKCS8 { + +/** +* Encode a private key into a pipe. +* @param key the private key to encode +* @param pipe the pipe to feed the encoded key into +* @param enc the encoding type to use +*/ +BOTAN_DLL void encode(const Private_Key& key, Pipe& pipe, + X509_Encoding enc = PEM); + +/** +* Encode and encrypt a private key into a pipe. +* @param key the private key to encode +* @param pipe the pipe to feed the encoded key into +* @param pass the password to use for encryption +* @param rng the rng to use +* @param pbe_algo the name of the desired password-based encryption algorithm. +* Provide an empty string to use the default PBE defined in the configuration +* under base/default_pbe. +* @param enc the encoding type to use +*/ +BOTAN_DLL void encrypt_key(const Private_Key& key, + Pipe& pipe, + RandomNumberGenerator& rng, + const std::string& pass, + const std::string& pbe_algo = "", + X509_Encoding enc = PEM); + + +/** +* Get a string containing a PEM encoded private key. +* @param key the key to encode +* @return the encoded key +*/ +BOTAN_DLL std::string PEM_encode(const Private_Key& key); + +/** +* Get a string containing a PEM encoded private key, encrypting it with a +* password. +* @param key the key to encode +* @param rng the rng to use +* @param pass the password to use for encryption +* @param pbe_algo the name of the desired password-based encryption algorithm. +* Provide an empty string to use the default PBE defined in the configuration +* under base/default_pbe. +*/ +BOTAN_DLL std::string PEM_encode(const Private_Key& key, + RandomNumberGenerator& rng, + const std::string& pass, + const std::string& pbe_algo = ""); + +/** +* Load a key from a data source. +* @param source the data source providing the encoded key +* @param rng the rng to use +* @param ui the user interface to be used for passphrase dialog +* @return the loaded private key object +*/ +BOTAN_DLL Private_Key* load_key(DataSource& source, + RandomNumberGenerator& rng, + const User_Interface& ui); + +/** Load a key from a data source. +* @param source the data source providing the encoded key +* @param rng the rng to use +* @param pass the passphrase to decrypt the key. Provide an empty +* string if the key is not encoded. +* @return the loaded private key object +*/ +BOTAN_DLL Private_Key* load_key(DataSource& source, + RandomNumberGenerator& rng, + const std::string& pass = ""); + +/** +* Load a key from a file. +* @param filename the path to the file containing the encoded key +* @param rng the rng to use +* @param ui the user interface to be used for passphrase dialog +* @return the loaded private key object +*/ +BOTAN_DLL Private_Key* load_key(const std::string& filename, + RandomNumberGenerator& rng, + const User_Interface& ui); + +/** Load a key from a file. +* @param filename the path to the file containing the encoded key +* @param rng the rng to use +* @param pass the passphrase to decrypt the key. Provide an empty +* string if the key is not encoded. +* @return the loaded private key object +*/ +BOTAN_DLL Private_Key* load_key(const std::string& filename, + RandomNumberGenerator& rng, + const std::string& pass = ""); + +/** +* Copy an existing encoded key object. +* @param key the key to copy +* @param rng the rng to use +* @return the new copy of the key +*/ +BOTAN_DLL Private_Key* copy_key(const Private_Key& key, + RandomNumberGenerator& rng); + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/pk_codecs/x509_key.cpp b/src/libs/3rdparty/botan/src/pubkey/pk_codecs/x509_key.cpp new file mode 100644 index 00000000000..455e627f344 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pk_codecs/x509_key.cpp @@ -0,0 +1,176 @@ +/* +* X.509 Public Key +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace X509 { + +/* +* DER or PEM encode a X.509 public key +*/ +void encode(const Public_Key& key, Pipe& pipe, X509_Encoding encoding) + { + std::auto_ptr encoder(key.x509_encoder()); + if(!encoder.get()) + throw Encoding_Error("X509::encode: Key does not support encoding"); + + MemoryVector der = + DER_Encoder() + .start_cons(SEQUENCE) + .encode(encoder->alg_id()) + .encode(encoder->key_bits(), BIT_STRING) + .end_cons() + .get_contents(); + + if(encoding == PEM) + pipe.write(PEM_Code::encode(der, "PUBLIC KEY")); + else + pipe.write(der); + } + +/* +* PEM encode a X.509 public key +*/ +std::string PEM_encode(const Public_Key& key) + { + Pipe pem; + pem.start_msg(); + encode(key, pem, PEM); + pem.end_msg(); + return pem.read_all_as_string(); + } + +/* +* Extract a public key and return it +*/ +Public_Key* load_key(DataSource& source) + { + try { + AlgorithmIdentifier alg_id; + MemoryVector key_bits; + + if(ASN1::maybe_BER(source) && !PEM_Code::matches(source)) + { + BER_Decoder(source) + .start_cons(SEQUENCE) + .decode(alg_id) + .decode(key_bits, BIT_STRING) + .verify_end() + .end_cons(); + } + else + { + DataSource_Memory ber( + PEM_Code::decode_check_label(source, "PUBLIC KEY") + ); + + BER_Decoder(ber) + .start_cons(SEQUENCE) + .decode(alg_id) + .decode(key_bits, BIT_STRING) + .verify_end() + .end_cons(); + } + + if(key_bits.is_empty()) + throw Decoding_Error("X.509 public key decoding failed"); + + const std::string alg_name = OIDS::lookup(alg_id.oid); + if(alg_name == "") + throw Decoding_Error("Unknown algorithm OID: " + + alg_id.oid.as_string()); + + std::auto_ptr key_obj(get_public_key(alg_name)); + if(!key_obj.get()) + throw Decoding_Error("Unknown PK algorithm/OID: " + alg_name + ", " + + alg_id.oid.as_string()); + + std::auto_ptr decoder(key_obj->x509_decoder()); + + if(!decoder.get()) + throw Decoding_Error("Key does not support X.509 decoding"); + + decoder->alg_id(alg_id); + decoder->key_bits(key_bits); + + return key_obj.release(); + } + catch(Decoding_Error) + { + throw Decoding_Error("X.509 public key decoding failed"); + } + } + +/* +* Extract a public key and return it +*/ +Public_Key* load_key(const std::string& fsname) + { + DataSource_Stream source(fsname, true); + return X509::load_key(source); + } + +/* +* Extract a public key and return it +*/ +Public_Key* load_key(const MemoryRegion& mem) + { + DataSource_Memory source(mem); + return X509::load_key(source); + } + +/* +* Make a copy of this public key +*/ +Public_Key* copy_key(const Public_Key& key) + { + Pipe bits; + bits.start_msg(); + X509::encode(key, bits, RAW_BER); + bits.end_msg(); + DataSource_Memory source(bits.read_all()); + return X509::load_key(source); + } + +/* +* Find the allowable key constraints +*/ +Key_Constraints find_constraints(const Public_Key& pub_key, + Key_Constraints limits) + { + const Public_Key* key = &pub_key; + u32bit constraints = 0; + + if(dynamic_cast(key)) + constraints |= KEY_ENCIPHERMENT | DATA_ENCIPHERMENT; + + if(dynamic_cast(key)) + constraints |= KEY_AGREEMENT; + + if(dynamic_cast(key) || + dynamic_cast(key)) + constraints |= DIGITAL_SIGNATURE | NON_REPUDIATION; + + if(limits) + constraints &= limits; + + return Key_Constraints(constraints); + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/pk_codecs/x509_key.h b/src/libs/3rdparty/botan/src/pubkey/pk_codecs/x509_key.h new file mode 100644 index 00000000000..9404b7ecc42 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pk_codecs/x509_key.h @@ -0,0 +1,110 @@ +/* +* X.509 Public Key +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_X509_PUBLIC_KEY_H__ +#define BOTAN_X509_PUBLIC_KEY_H__ + +#include +#include +#include +#include + +namespace Botan { + +/** +* This class represents abstract X.509 public key encoders. +*/ +class BOTAN_DLL X509_Encoder + { + public: + virtual AlgorithmIdentifier alg_id() const = 0; + virtual MemoryVector key_bits() const = 0; + virtual ~X509_Encoder() {} + }; + +/** +* This class represents abstract X.509 public key decoders. +*/ +class BOTAN_DLL X509_Decoder + { + public: + virtual void alg_id(const AlgorithmIdentifier&) = 0; + virtual void key_bits(const MemoryRegion&) = 0; + virtual ~X509_Decoder() {} + }; + +/** +* This namespace contains functions for handling X509 objects. +*/ +namespace X509 { + +/* +* X.509 Public Key Encoding/Decoding +*/ + +/** +* Encode a key into a pipe. +* @param key the public key to encode +* @param pipe the pipe to feed the encoded key into +* @param enc the encoding type to use +*/ +BOTAN_DLL void encode(const Public_Key& key, Pipe& pipe, + X509_Encoding enc = PEM); + +/** +* PEM encode a public key into a string. +* @param key the key to encode +* @return the PEM encoded key +*/ +BOTAN_DLL std::string PEM_encode(const Public_Key& key); + +/** +* Create a public key from a data source. +* @param source the source providing the DER or PEM encoded key +* @return the new public key object +*/ +BOTAN_DLL Public_Key* load_key(DataSource& source); + +/** +* Create a public key from a string. +* @param enc the string containing the PEM encoded key +* @return the new public key object +*/ +BOTAN_DLL Public_Key* load_key(const std::string& enc); + +/** +* Create a public key from a memory region. +* @param enc the memory region containing the DER or PEM encoded key +* @return the new public key object +*/ +BOTAN_DLL Public_Key* load_key(const MemoryRegion& enc); + +/** +* Copy a key. +* @param key the public key to copy +* @return the new public key object +*/ +BOTAN_DLL Public_Key* copy_key(const Public_Key& key); + +/** +* Create the key constraints for a specific public key. +* @param pub_key the public key from which the basic set of +* constraints to be placed in the return value is derived +* @param limits additional limits that will be incorporated into the +* return value +* @return the combination of key type specific constraints and +* additional limits +*/ + +BOTAN_DLL Key_Constraints find_constraints(const Public_Key& pub_key, + Key_Constraints limits); + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/pk_filts.cpp b/src/libs/3rdparty/botan/src/pubkey/pk_filts.cpp new file mode 100644 index 00000000000..18da9c10bf5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pk_filts.cpp @@ -0,0 +1,115 @@ +/* +* PK Filters +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Append to the buffer +*/ +void PK_Encryptor_Filter::write(const byte input[], u32bit length) + { + buffer.append(input, length); + } + +/* +* Encrypt the message +*/ +void PK_Encryptor_Filter::end_msg() + { + send(cipher->encrypt(buffer, buffer.size(), rng)); + buffer.destroy(); + } + +/* +* Append to the buffer +*/ +void PK_Decryptor_Filter::write(const byte input[], u32bit length) + { + buffer.append(input, length); + } + +/* +* Decrypt the message +*/ +void PK_Decryptor_Filter::end_msg() + { + send(cipher->decrypt(buffer, buffer.size())); + buffer.destroy(); + } + +/* +* Add more data +*/ +void PK_Signer_Filter::write(const byte input[], u32bit length) + { + signer->update(input, length); + } + +/* +* Sign the message +*/ +void PK_Signer_Filter::end_msg() + { + send(signer->signature(rng)); + } + +/* +* Add more data +*/ +void PK_Verifier_Filter::write(const byte input[], u32bit length) + { + verifier->update(input, length); + } + +/* +* Verify the message +*/ +void PK_Verifier_Filter::end_msg() + { + if(signature.is_empty()) + throw Exception("PK_Verifier_Filter: No signature to check against"); + bool is_valid = verifier->check_signature(signature, signature.size()); + send((is_valid ? 1 : 0)); + } + +/* +* Set the signature to check +*/ +void PK_Verifier_Filter::set_signature(const byte sig[], u32bit length) + { + signature.set(sig, length); + } + +/* +* Set the signature to check +*/ +void PK_Verifier_Filter::set_signature(const MemoryRegion& sig) + { + signature = sig; + } + +/* +* PK_Verifier_Filter Constructor +*/ +PK_Verifier_Filter::PK_Verifier_Filter(PK_Verifier* v, const byte sig[], + u32bit length) : + verifier(v), signature(sig, length) + { + } + +/* +* PK_Verifier_Filter Constructor +*/ +PK_Verifier_Filter::PK_Verifier_Filter(PK_Verifier* v, + const MemoryRegion& sig) : + verifier(v), signature(sig) + { + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/pk_filts.h b/src/libs/3rdparty/botan/src/pubkey/pk_filts.h new file mode 100644 index 00000000000..8bf3fc238f9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pk_filts.h @@ -0,0 +1,91 @@ +/* +* PK Filters +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PK_FILTERS_H__ +#define BOTAN_PK_FILTERS_H__ + +#include +#include + +namespace Botan { + +/* +* PK_Encryptor Filter +*/ +class BOTAN_DLL PK_Encryptor_Filter : public Filter + { + public: + void write(const byte[], u32bit); + void end_msg(); + PK_Encryptor_Filter(PK_Encryptor* c, + RandomNumberGenerator& rng_ref) : + cipher(c), rng(rng_ref) {} + ~PK_Encryptor_Filter() { delete cipher; } + private: + PK_Encryptor* cipher; + RandomNumberGenerator& rng; + SecureVector buffer; + }; + +/* +* PK_Decryptor Filter +*/ +class BOTAN_DLL PK_Decryptor_Filter : public Filter + { + public: + void write(const byte[], u32bit); + void end_msg(); + PK_Decryptor_Filter(PK_Decryptor* c) : cipher(c) {} + ~PK_Decryptor_Filter() { delete cipher; } + private: + PK_Decryptor* cipher; + SecureVector buffer; + }; + +/* +* PK_Signer Filter +*/ +class BOTAN_DLL PK_Signer_Filter : public Filter + { + public: + void write(const byte[], u32bit); + void end_msg(); + + PK_Signer_Filter(PK_Signer* s, + RandomNumberGenerator& rng_ref) : + signer(s), rng(rng_ref) {} + + ~PK_Signer_Filter() { delete signer; } + private: + PK_Signer* signer; + RandomNumberGenerator& rng; + }; + +/* +* PK_Verifier Filter +*/ +class BOTAN_DLL PK_Verifier_Filter : public Filter + { + public: + void write(const byte[], u32bit); + void end_msg(); + + void set_signature(const byte[], u32bit); + void set_signature(const MemoryRegion&); + + PK_Verifier_Filter(PK_Verifier* v) : verifier(v) {} + PK_Verifier_Filter(PK_Verifier*, const byte[], u32bit); + PK_Verifier_Filter(PK_Verifier*, const MemoryRegion&); + ~PK_Verifier_Filter() { delete verifier; } + private: + PK_Verifier* verifier; + SecureVector signature; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/pk_keys.cpp b/src/libs/3rdparty/botan/src/pubkey/pk_keys.cpp new file mode 100644 index 00000000000..b93158558a9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pk_keys.cpp @@ -0,0 +1,54 @@ +/* +* PK Key Types +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Default OID access +*/ +OID Public_Key::get_oid() const + { + try { + return OIDS::lookup(algo_name()); + } + catch(Lookup_Error) + { + throw Lookup_Error("PK algo " + algo_name() + " has no defined OIDs"); + } + } + +/* +* Run checks on a loaded public key +*/ +void Public_Key::load_check(RandomNumberGenerator& rng) const + { + if(!check_key(rng, BOTAN_PUBLIC_KEY_STRONG_CHECKS_ON_LOAD)) + throw Invalid_Argument(algo_name() + ": Invalid public key"); + } + +/* +* Run checks on a loaded private key +*/ +void Private_Key::load_check(RandomNumberGenerator& rng) const + { + if(!check_key(rng, BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_LOAD)) + throw Invalid_Argument(algo_name() + ": Invalid private key"); + } + +/* +* Run checks on a generated private key +*/ +void Private_Key::gen_check(RandomNumberGenerator& rng) const + { + if(!check_key(rng, BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_GENERATE)) + throw Self_Test_Failure(algo_name() + " private key generation failed"); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/pk_keys.h b/src/libs/3rdparty/botan/src/pubkey/pk_keys.h new file mode 100644 index 00000000000..5b612577d29 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pk_keys.h @@ -0,0 +1,180 @@ +/* +* PK Key Types +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PK_KEYS_H__ +#define BOTAN_PK_KEYS_H__ + +#include +#include +#include + +namespace Botan { + +/** +* Public Key Base Class. +*/ +class BOTAN_DLL Public_Key + { + public: + /** + * Get the name of the underlying public key scheme. + * @return the name of the public key scheme + */ + virtual std::string algo_name() const = 0; + + /** + * Get the OID of the underlying public key scheme. + * @return the OID of the public key scheme + */ + virtual OID get_oid() const; + + /** + * Test the key values for consistency. + * @param rng rng to use + * @param strong whether to perform strong and lengthy version + * of the test + * @return true if the test is passed + */ + virtual bool check_key(RandomNumberGenerator&, bool) const + { return true; } + + /** + * Find out the number of message parts supported by this scheme. + * @return the number of message parts + */ + virtual u32bit message_parts() const { return 1; } + + /** + * Find out the message part size supported by this scheme/key. + * @return the size of the message parts + */ + virtual u32bit message_part_size() const { return 0; } + + /** + * Get the maximum message size in bits supported by this public key. + * @return the maximum message in bits + */ + virtual u32bit max_input_bits() const = 0; + + /** + * Get an X509 encoder that can be used to encode this key in X509 format. + * @return an X509 encoder for this key + */ + virtual class X509_Encoder* x509_encoder() const = 0; + + /** + * Get an X509 decoder that can be used to set the values of this + * key based on an X509 encoded key object. + * @return an X509 decoder for this key + */ + virtual class X509_Decoder* x509_decoder() = 0; + + virtual ~Public_Key() {} + protected: + virtual void load_check(RandomNumberGenerator&) const; + }; + +/** +* Private Key Base Class +*/ +class BOTAN_DLL Private_Key : public virtual Public_Key + { + public: + /** + * Get a PKCS#8 encoder that can be used to encode this key in + * PKCS#8 format. + * @return an PKCS#8 encoder for this key + */ + virtual class PKCS8_Encoder* pkcs8_encoder() const + { return 0; } + + /** + * Get an PKCS#8 decoder that can be used to set the values of this key + * based on an PKCS#8 encoded key object. + * @return an PKCS#8 decoder for this key + */ + virtual class PKCS8_Decoder* pkcs8_decoder(RandomNumberGenerator&) + { return 0; } + protected: + void load_check(RandomNumberGenerator&) const; + void gen_check(RandomNumberGenerator&) const; + }; + +/** +* PK Encrypting Key. +*/ +class BOTAN_DLL PK_Encrypting_Key : public virtual Public_Key + { + public: + virtual SecureVector encrypt(const byte[], u32bit, + RandomNumberGenerator&) const = 0; + virtual ~PK_Encrypting_Key() {} + }; + +/** +* PK Decrypting Key +*/ +class BOTAN_DLL PK_Decrypting_Key : public virtual Private_Key + { + public: + virtual SecureVector decrypt(const byte[], u32bit) const = 0; + virtual ~PK_Decrypting_Key() {} + }; + +/** +* PK Signing Key +*/ +class BOTAN_DLL PK_Signing_Key : public virtual Private_Key + { + public: + virtual SecureVector sign(const byte[], u32bit, + RandomNumberGenerator& rng) const = 0; + virtual ~PK_Signing_Key() {} + }; + +/** +* PK Verifying Key, Message Recovery Version +*/ +class BOTAN_DLL PK_Verifying_with_MR_Key : public virtual Public_Key + { + public: + virtual SecureVector verify(const byte[], u32bit) const = 0; + virtual ~PK_Verifying_with_MR_Key() {} + }; + +/** +* PK Verifying Key, No Message Recovery Version +*/ +class BOTAN_DLL PK_Verifying_wo_MR_Key : public virtual Public_Key + { + public: + virtual bool verify(const byte[], u32bit, + const byte[], u32bit) const = 0; + virtual ~PK_Verifying_wo_MR_Key() {} + }; + +/** +* PK Secret Value Derivation Key +*/ +class BOTAN_DLL PK_Key_Agreement_Key : public virtual Private_Key + { + public: + virtual SecureVector derive_key(const byte[], u32bit) const = 0; + virtual MemoryVector public_value() const = 0; + virtual ~PK_Key_Agreement_Key() {} + }; + +/* +* Typedefs +*/ +typedef PK_Key_Agreement_Key PK_KA_Key; +typedef Public_Key X509_PublicKey; +typedef Private_Key PKCS8_PrivateKey; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/pubkey.cpp b/src/libs/3rdparty/botan/src/pubkey/pubkey.cpp new file mode 100644 index 00000000000..4ddaa6fb698 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pubkey.cpp @@ -0,0 +1,396 @@ +/* +* Public Key Base +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Encrypt a message +*/ +SecureVector PK_Encryptor::encrypt(const byte in[], u32bit len, + RandomNumberGenerator& rng) const + { + return enc(in, len, rng); + } + +/* +* Encrypt a message +*/ +SecureVector PK_Encryptor::encrypt(const MemoryRegion& in, + RandomNumberGenerator& rng) const + { + return enc(in.begin(), in.size(), rng); + } + +/* +* Decrypt a message +*/ +SecureVector PK_Decryptor::decrypt(const byte in[], u32bit len) const + { + return dec(in, len); + } + +/* +* Decrypt a message +*/ +SecureVector PK_Decryptor::decrypt(const MemoryRegion& in) const + { + return dec(in.begin(), in.size()); + } + +/* +* PK_Encryptor_MR_with_EME Constructor +*/ +PK_Encryptor_MR_with_EME::PK_Encryptor_MR_with_EME(const PK_Encrypting_Key& k, + EME* eme_obj) : + key(k), encoder(eme_obj) + { + } + +/* +* Encrypt a message +*/ +SecureVector +PK_Encryptor_MR_with_EME::enc(const byte msg[], + u32bit length, + RandomNumberGenerator& rng) const + { + SecureVector message; + if(encoder) + message = encoder->encode(msg, length, key.max_input_bits(), rng); + else + message.set(msg, length); + + if(8*(message.size() - 1) + high_bit(message[0]) > key.max_input_bits()) + throw Exception("PK_Encryptor_MR_with_EME: Input is too large"); + + return key.encrypt(message, message.size(), rng); + } + +/* +* Return the max size, in bytes, of a message +*/ +u32bit PK_Encryptor_MR_with_EME::maximum_input_size() const + { + if(!encoder) + return (key.max_input_bits() / 8); + else + return encoder->maximum_input_size(key.max_input_bits()); + } + +/* +* PK_Decryptor_MR_with_EME Constructor +*/ +PK_Decryptor_MR_with_EME::PK_Decryptor_MR_with_EME(const PK_Decrypting_Key& k, + EME* eme_obj) : + key(k), encoder(eme_obj) + { + } + +/* +* Decrypt a message +*/ +SecureVector PK_Decryptor_MR_with_EME::dec(const byte msg[], + u32bit length) const + { + try { + SecureVector decrypted = key.decrypt(msg, length); + if(encoder) + return encoder->decode(decrypted, key.max_input_bits()); + else + return decrypted; + } + catch(Invalid_Argument) + { + throw Exception("PK_Decryptor_MR_with_EME: Input is invalid"); + } + catch(Decoding_Error) + { + throw Exception("PK_Decryptor_MR_with_EME: Input is invalid"); + } + } + +/* +* PK_Signer Constructor +*/ +PK_Signer::PK_Signer(const PK_Signing_Key& k, EMSA* emsa_obj) : + key(k), emsa(emsa_obj) + { + sig_format = IEEE_1363; + } + +/* +* Set the signature format +*/ +void PK_Signer::set_output_format(Signature_Format format) + { + if(key.message_parts() == 1 && format != IEEE_1363) + throw Invalid_State("PK_Signer: Cannot set the output format for " + + key.algo_name() + " keys"); + sig_format = format; + } + +/* +* Sign a message +*/ +SecureVector PK_Signer::sign_message(const byte msg[], u32bit length, + RandomNumberGenerator& rng) + { + update(msg, length); + return signature(rng); + } + +/* +* Sign a message +*/ +SecureVector PK_Signer::sign_message(const MemoryRegion& msg, + RandomNumberGenerator& rng) + { + return sign_message(msg, msg.size(), rng); + } + +/* +* Add more to the message to be signed +*/ +void PK_Signer::update(const byte in[], u32bit length) + { + emsa->update(in, length); + } + +/* +* Add more to the message to be signed +*/ +void PK_Signer::update(byte in) + { + update(&in, 1); + } + +/* +* Add more to the message to be signed +*/ +void PK_Signer::update(const MemoryRegion& in) + { + update(in, in.size()); + } + +/* +* Create a signature +*/ +SecureVector PK_Signer::signature(RandomNumberGenerator& rng) + { + SecureVector encoded = emsa->encoding_of(emsa->raw_data(), + key.max_input_bits(), + rng); + + SecureVector plain_sig = key.sign(encoded, encoded.size(), rng); + + if(key.message_parts() == 1 || sig_format == IEEE_1363) + return plain_sig; + + if(sig_format == DER_SEQUENCE) + { + if(plain_sig.size() % key.message_parts()) + throw Encoding_Error("PK_Signer: strange signature size found"); + const u32bit SIZE_OF_PART = plain_sig.size() / key.message_parts(); + + std::vector sig_parts(key.message_parts()); + for(u32bit j = 0; j != sig_parts.size(); ++j) + sig_parts[j].binary_decode(plain_sig + SIZE_OF_PART*j, SIZE_OF_PART); + + return DER_Encoder() + .start_cons(SEQUENCE) + .encode_list(sig_parts) + .end_cons() + .get_contents(); + } + else + throw Encoding_Error("PK_Signer: Unknown signature format " + + to_string(sig_format)); + } + +/* +* PK_Verifier Constructor +*/ +PK_Verifier::PK_Verifier(EMSA* emsa_obj) + { + emsa = emsa_obj; + sig_format = IEEE_1363; + } + +/* +* PK_Verifier Destructor +*/ +PK_Verifier::~PK_Verifier() + { + delete emsa; + } + +/* +* Set the signature format +*/ +void PK_Verifier::set_input_format(Signature_Format format) + { + if(key_message_parts() == 1 && format != IEEE_1363) + throw Invalid_State("PK_Verifier: This algorithm always uses IEEE 1363"); + sig_format = format; + } + +/* +* Verify a message +*/ +bool PK_Verifier::verify_message(const MemoryRegion& msg, + const MemoryRegion& sig) + { + return verify_message(msg, msg.size(), sig, sig.size()); + } + +/* +* Verify a message +*/ +bool PK_Verifier::verify_message(const byte msg[], u32bit msg_length, + const byte sig[], u32bit sig_length) + { + update(msg, msg_length); + return check_signature(sig, sig_length); + } + +/* +* Append to the message +*/ +void PK_Verifier::update(const byte in[], u32bit length) + { + emsa->update(in, length); + } + +/* +* Append to the message +*/ +void PK_Verifier::update(byte in) + { + update(&in, 1); + } + +/* +* Append to the message +*/ +void PK_Verifier::update(const MemoryRegion& in) + { + update(in, in.size()); + } + +/* +* Check a signature +*/ +bool PK_Verifier::check_signature(const MemoryRegion& sig) + { + return check_signature(sig, sig.size()); + } + +/* +* Check a signature +*/ +bool PK_Verifier::check_signature(const byte sig[], u32bit length) + { + try { + if(sig_format == IEEE_1363) + return validate_signature(emsa->raw_data(), sig, length); + else if(sig_format == DER_SEQUENCE) + { + BER_Decoder decoder(sig, length); + BER_Decoder ber_sig = decoder.start_cons(SEQUENCE); + + u32bit count = 0; + SecureVector real_sig; + while(ber_sig.more_items()) + { + BigInt sig_part; + ber_sig.decode(sig_part); + real_sig.append(BigInt::encode_1363(sig_part, + key_message_part_size())); + ++count; + } + if(count != key_message_parts()) + throw Decoding_Error("PK_Verifier: signature size invalid"); + + return validate_signature(emsa->raw_data(), + real_sig, real_sig.size()); + } + else + throw Decoding_Error("PK_Verifier: Unknown signature format " + + to_string(sig_format)); + } + catch(Invalid_Argument) { return false; } + catch(Decoding_Error) { return false; } + } + +/* +* Verify a signature +*/ +bool PK_Verifier_with_MR::validate_signature(const MemoryRegion& msg, + const byte sig[], u32bit sig_len) + { + SecureVector output_of_key = key.verify(sig, sig_len); + return emsa->verify(output_of_key, msg, key.max_input_bits()); + } + +/* +* Verify a signature +*/ +bool PK_Verifier_wo_MR::validate_signature(const MemoryRegion& msg, + const byte sig[], u32bit sig_len) + { + Null_RNG rng; + + SecureVector encoded = + emsa->encoding_of(msg, key.max_input_bits(), rng); + + return key.verify(encoded, encoded.size(), sig, sig_len); + } + +/* +* PK_Key_Agreement Constructor +*/ +PK_Key_Agreement::PK_Key_Agreement(const PK_Key_Agreement_Key& k, + KDF* kdf_obj) : + key(k), kdf(kdf_obj) + { + } + +/* +* Perform Key Agreement Operation +*/ +SymmetricKey PK_Key_Agreement::derive_key(u32bit key_len, + const byte in[], u32bit in_len, + const std::string& params) const + { + return derive_key(key_len, in, in_len, + reinterpret_cast(params.data()), + params.length()); + } + +/* +* Perform Key Agreement Operation +*/ +SymmetricKey PK_Key_Agreement::derive_key(u32bit key_len, const byte in[], + u32bit in_len, const byte params[], + u32bit params_len) const + { + OctetString z = key.derive_key(in, in_len); + if(!kdf) + return z; + + return kdf->derive_key(key_len, z.bits_of(), params, params_len); + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/pubkey.h b/src/libs/3rdparty/botan/src/pubkey/pubkey.h new file mode 100644 index 00000000000..c73a54d35e8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pubkey.h @@ -0,0 +1,392 @@ +/* +* Public Key Interface +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PUBKEY_H__ +#define BOTAN_PUBKEY_H__ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* The two types of signature format supported by Botan. +*/ +enum Signature_Format { IEEE_1363, DER_SEQUENCE }; + +/** +* Public Key Encryptor +*/ +class BOTAN_DLL PK_Encryptor + { + public: + + /** + * Encrypt a message. + * @param in the message as a byte array + * @param length the length of the above byte array + * @param rng the random number source to use + * @return the encrypted message + */ + SecureVector encrypt(const byte in[], u32bit length, + RandomNumberGenerator& rng) const; + + /** + * Encrypt a message. + * @param in the message + * @param rng the random number source to use + * @return the encrypted message + */ + SecureVector encrypt(const MemoryRegion& in, + RandomNumberGenerator& rng) const; + + /** + * Return the maximum allowed message size in bytes. + * @return the maximum message size in bytes + */ + virtual u32bit maximum_input_size() const = 0; + + virtual ~PK_Encryptor() {} + private: + virtual SecureVector enc(const byte[], u32bit, + RandomNumberGenerator&) const = 0; + }; + +/** +* Public Key Decryptor +*/ +class BOTAN_DLL PK_Decryptor + { + public: + /** + * Decrypt a ciphertext. + * @param in the ciphertext as a byte array + * @param length the length of the above byte array + * @return the decrypted message + */ + SecureVector decrypt(const byte in[], u32bit length) const; + + /** + * Decrypt a ciphertext. + * @param in the ciphertext + * @return the decrypted message + */ + SecureVector decrypt(const MemoryRegion& in) const; + + virtual ~PK_Decryptor() {} + private: + virtual SecureVector dec(const byte[], u32bit) const = 0; + }; + +/** +* Public Key Signer. Use the sign_message() functions for small +* messages. Use multiple calls update() to process large messages and +* generate the signature by finally calling signature(). +*/ +class BOTAN_DLL PK_Signer + { + public: + /** + * Sign a message. + * @param in the message to sign as a byte array + * @param length the length of the above byte array + * @param rng the rng to use + * @return the signature + */ + SecureVector sign_message(const byte in[], u32bit length, + RandomNumberGenerator& rng); + + /** + * Sign a message. + * @param in the message to sign + * @param rng the rng to use + * @return the signature + */ + SecureVector sign_message(const MemoryRegion& in, + RandomNumberGenerator& rng); + + /** + * Add a message part (single byte). + * @param the byte to add + */ + void update(byte in); + + /** + * Add a message part. + * @param in the message part to add as a byte array + * @param length the length of the above byte array + */ + void update(const byte in[], u32bit length); + + /** + * Add a message part. + * @param in the message part to add + */ + void update(const MemoryRegion& in); + + /** + * Get the signature of the so far processed message (provided by the + * calls to update()). + * @param rng the rng to use + * @return the signature of the total message + */ + SecureVector signature(RandomNumberGenerator& rng); + + /** + * Set the output format of the signature. + * @param format the signature format to use + */ + void set_output_format(Signature_Format format); + + /** + * Construct a PK Signer. + * @param key the key to use inside this signer + * @param emsa the EMSA to use + * An example would be "EMSA1(SHA-224)". + */ + PK_Signer(const PK_Signing_Key& key, EMSA* emsa); + + ~PK_Signer() { delete emsa; } + private: + PK_Signer(const PK_Signer&); + PK_Signer& operator=(const PK_Signer&); + + const PK_Signing_Key& key; + Signature_Format sig_format; + EMSA* emsa; + }; + +/** +* Public Key Verifier. Use the verify_message() functions for small +* messages. Use multiple calls update() to process large messages and +* verify the signature by finally calling check_signature(). +*/ +class BOTAN_DLL PK_Verifier + { + public: + /** + * Verify a signature. + * @param msg the message that the signature belongs to, as a byte array + * @param msg_length the length of the above byte array msg + * @param sig the signature as a byte array + * @param sig_length the length of the above byte array sig + * @return true if the signature is valid + */ + bool verify_message(const byte msg[], u32bit msg_length, + const byte sig[], u32bit sig_length); + /** + * Verify a signature. + * @param msg the message that the signature belongs to + * @param sig the signature + * @return true if the signature is valid + */ + bool verify_message(const MemoryRegion& msg, + const MemoryRegion& sig); + + /** + * Add a message part (single byte) of the message corresponding to the + * signature to be verified. + * @param msg_part the byte to add + */ + void update(byte msg_part); + + /** + * Add a message part of the message corresponding to the + * signature to be verified. + * @param msg_part the new message part as a byte array + * @param length the length of the above byte array + */ + void update(const byte msg_part[], u32bit length); + + /** + * Add a message part of the message corresponding to the + * signature to be verified. + * @param msg_part the new message part + */ + void update(const MemoryRegion& msg_part); + + /** + * Check the signature of the buffered message, i.e. the one build + * by successive calls to update. + * @param sig the signature to be verified as a byte array + * @param length the length of the above byte array + * @return true if the signature is valid, false otherwise + */ + bool check_signature(const byte sig[], u32bit length); + + /** + * Check the signature of the buffered message, i.e. the one build + * by successive calls to update. + * @param sig the signature to be verified + * @return true if the signature is valid, false otherwise + */ + bool check_signature(const MemoryRegion& sig); + + /** + * Set the format of the signatures fed to this verifier. + * @param format the signature format to use + */ + void set_input_format(Signature_Format format); + + /** + * Construct a PK Verifier. + * @param emsa the EMSA to use + * An example would be new EMSA1(new SHA_224) + */ + PK_Verifier(EMSA* emsa); + + virtual ~PK_Verifier(); + protected: + virtual bool validate_signature(const MemoryRegion&, + const byte[], u32bit) = 0; + virtual u32bit key_message_parts() const = 0; + virtual u32bit key_message_part_size() const = 0; + + Signature_Format sig_format; + EMSA* emsa; + private: + PK_Verifier(const PK_Verifier&); + PK_Verifier& operator=(const PK_Verifier&); + }; + +/* +* Key Agreement +*/ +class BOTAN_DLL PK_Key_Agreement + { + public: + SymmetricKey derive_key(u32bit, const byte[], u32bit, + const std::string& = "") const; + SymmetricKey derive_key(u32bit, const byte[], u32bit, + const byte[], u32bit) const; + + /** + * Construct a PK Key Agreement. + * @param key the key to use + * @param kdf the KDF to use + */ + PK_Key_Agreement(const PK_Key_Agreement_Key& key, KDF* kdf); + + ~PK_Key_Agreement() { delete kdf; } + private: + PK_Key_Agreement(const PK_Key_Agreement_Key&); + PK_Key_Agreement& operator=(const PK_Key_Agreement&); + + const PK_Key_Agreement_Key& key; + KDF* kdf; + }; + +/** +* Encryption with an MR algorithm and an EME. +*/ +class BOTAN_DLL PK_Encryptor_MR_with_EME : public PK_Encryptor + { + public: + u32bit maximum_input_size() const; + + /** + * Construct an instance. + * @param key the key to use inside the decryptor + * @param eme the EME to use + */ + PK_Encryptor_MR_with_EME(const PK_Encrypting_Key& key, + EME* eme); + + ~PK_Encryptor_MR_with_EME() { delete encoder; } + private: + PK_Encryptor_MR_with_EME(const PK_Encryptor_MR_with_EME&); + PK_Encryptor_MR_with_EME& operator=(const PK_Encryptor_MR_with_EME&); + + SecureVector enc(const byte[], u32bit, + RandomNumberGenerator& rng) const; + + const PK_Encrypting_Key& key; + const EME* encoder; + }; + +/** +* Decryption with an MR algorithm and an EME. +*/ +class BOTAN_DLL PK_Decryptor_MR_with_EME : public PK_Decryptor + { + public: + /** + * Construct an instance. + * @param key the key to use inside the encryptor + * @param eme the EME to use + */ + PK_Decryptor_MR_with_EME(const PK_Decrypting_Key& key, + EME* eme); + + ~PK_Decryptor_MR_with_EME() { delete encoder; } + private: + PK_Decryptor_MR_with_EME(const PK_Decryptor_MR_with_EME&); + PK_Decryptor_MR_with_EME& operator=(const PK_Decryptor_MR_with_EME&); + + SecureVector dec(const byte[], u32bit) const; + + const PK_Decrypting_Key& key; + const EME* encoder; + }; + +/** +* Public Key Verifier with Message Recovery. +*/ +class BOTAN_DLL PK_Verifier_with_MR : public PK_Verifier + { + public: + /** + * Construct an instance. + * @param key the key to use inside the verifier + * @param emsa_name the name of the EMSA to use + */ + PK_Verifier_with_MR(const PK_Verifying_with_MR_Key& k, + EMSA* emsa_obj) : PK_Verifier(emsa_obj), key(k) {} + + private: + PK_Verifier_with_MR(const PK_Verifying_with_MR_Key&); + PK_Verifier_with_MR& operator=(const PK_Verifier_with_MR&); + + bool validate_signature(const MemoryRegion&, const byte[], u32bit); + u32bit key_message_parts() const { return key.message_parts(); } + u32bit key_message_part_size() const { return key.message_part_size(); } + + const PK_Verifying_with_MR_Key& key; + }; + +/** +* Public Key Verifier without Message Recovery +*/ +class BOTAN_DLL PK_Verifier_wo_MR : public PK_Verifier + { + public: + /** + * Construct an instance. + * @param key the key to use inside the verifier + * @param emsa_name the name of the EMSA to use + */ + PK_Verifier_wo_MR(const PK_Verifying_wo_MR_Key& k, + EMSA* emsa_obj) : PK_Verifier(emsa_obj), key(k) {} + + private: + PK_Verifier_wo_MR(const PK_Verifying_wo_MR_Key&); + PK_Verifier_wo_MR& operator=(const PK_Verifier_wo_MR&); + + bool validate_signature(const MemoryRegion&, const byte[], u32bit); + u32bit key_message_parts() const { return key.message_parts(); } + u32bit key_message_part_size() const { return key.message_part_size(); } + + const PK_Verifying_wo_MR_Key& key; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/pubkey_enums.cpp b/src/libs/3rdparty/botan/src/pubkey/pubkey_enums.cpp new file mode 100644 index 00000000000..327107dd1aa --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pubkey_enums.cpp @@ -0,0 +1,42 @@ +/* +* KeyUsage +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +namespace BER { + +/* +* Decode a BER encoded KeyUsage +*/ +void decode(BER_Decoder& source, Key_Constraints& key_usage) + { + BER_Object obj = source.get_next_object(); + + if(obj.type_tag != BIT_STRING || obj.class_tag != UNIVERSAL) + throw BER_Bad_Tag("Bad tag for usage constraint", + obj.type_tag, obj.class_tag); + if(obj.value.size() != 2 && obj.value.size() != 3) + throw BER_Decoding_Error("Bad size for BITSTRING in usage constraint"); + if(obj.value[0] >= 8) + throw BER_Decoding_Error("Invalid unused bits in usage constraint"); + + const byte mask = (0xFF << obj.value[0]); + obj.value[obj.value.size()-1] &= mask; + + u16bit usage = 0; + for(u32bit j = 1; j != obj.value.size(); ++j) + usage = (obj.value[j] << 8) | usage; + + key_usage = Key_Constraints(usage); + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/pubkey_enums.h b/src/libs/3rdparty/botan/src/pubkey/pubkey_enums.h new file mode 100644 index 00000000000..53e319f389f --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/pubkey_enums.h @@ -0,0 +1,77 @@ +/* +* Enumerations +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ENUMS_H__ +#define BOTAN_ENUMS_H__ + +#include + +namespace Botan { + +/** +* X.509v3 Key Constraints. +*/ +enum Key_Constraints { + NO_CONSTRAINTS = 0, + DIGITAL_SIGNATURE = 32768, + NON_REPUDIATION = 16384, + KEY_ENCIPHERMENT = 8192, + DATA_ENCIPHERMENT = 4096, + KEY_AGREEMENT = 2048, + KEY_CERT_SIGN = 1024, + CRL_SIGN = 512, + ENCIPHER_ONLY = 256, + DECIPHER_ONLY = 128 +}; + +/** +* BER Decoding Function for key constraints +*/ +namespace BER { + +void BOTAN_DLL decode(BER_Decoder&, Key_Constraints&); + +} + +/** +* X.509v2 CRL Reason Code. +*/ +enum CRL_Code { + UNSPECIFIED = 0, + KEY_COMPROMISE = 1, + CA_COMPROMISE = 2, + AFFILIATION_CHANGED = 3, + SUPERSEDED = 4, + CESSATION_OF_OPERATION = 5, + CERTIFICATE_HOLD = 6, + REMOVE_FROM_CRL = 8, + PRIVLEDGE_WITHDRAWN = 9, + AA_COMPROMISE = 10, + + DELETE_CRL_ENTRY = 0xFF00, + OCSP_GOOD = 0xFF01, + OCSP_UNKNOWN = 0xFF02 +}; + +/* +* Various Other Enumerations +*/ + +/** +* The two types of X509 encoding supported by Botan. +*/ +enum X509_Encoding { RAW_BER, PEM }; + +/** +* Value to encode in case of no path limit in the X509 +* BasicConstraints extension. +*/ +static const u32bit NO_CERT_PATH_LIMIT = 0xFFFFFFF0; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/rsa/info.txt b/src/libs/3rdparty/botan/src/pubkey/rsa/info.txt new file mode 100644 index 00000000000..7729fd83d18 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/rsa/info.txt @@ -0,0 +1,17 @@ +realname "RSA" + +define RSA + +load_on auto + + +rsa.cpp +rsa.h + + + +if_algo +keypair +libstate +numbertheory + diff --git a/src/libs/3rdparty/botan/src/pubkey/rsa/rsa.cpp b/src/libs/3rdparty/botan/src/pubkey/rsa/rsa.cpp new file mode 100644 index 00000000000..83e6e1b17f8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/rsa/rsa.cpp @@ -0,0 +1,164 @@ +/* +* RSA +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* RSA_PublicKey Constructor +*/ +RSA_PublicKey::RSA_PublicKey(const BigInt& mod, const BigInt& exp) + { + n = mod; + e = exp; + X509_load_hook(); + } + +/* +* RSA Public Operation +*/ +BigInt RSA_PublicKey::public_op(const BigInt& i) const + { + if(i >= n) + throw Invalid_Argument(algo_name() + "::public_op: input is too large"); + return core.public_op(i); + } + +/* +* RSA Encryption Function +*/ +SecureVector RSA_PublicKey::encrypt(const byte in[], u32bit len, + RandomNumberGenerator&) const + { + BigInt i(in, len); + return BigInt::encode_1363(public_op(i), n.bytes()); + } + +/* +* RSA Verification Function +*/ +SecureVector RSA_PublicKey::verify(const byte in[], u32bit len) const + { + BigInt i(in, len); + return BigInt::encode(public_op(i)); + } + +/* +* Create a RSA private key +*/ +RSA_PrivateKey::RSA_PrivateKey(RandomNumberGenerator& rng, + u32bit bits, u32bit exp) + { + if(bits < 512) + throw Invalid_Argument(algo_name() + ": Can't make a key that is only " + + to_string(bits) + " bits long"); + if(exp < 3 || exp % 2 == 0) + throw Invalid_Argument(algo_name() + ": Invalid encryption exponent"); + + e = exp; + p = random_prime(rng, (bits + 1) / 2, e); + q = random_prime(rng, bits - p.bits(), e); + d = inverse_mod(e, lcm(p - 1, q - 1)); + + PKCS8_load_hook(rng, true); + + if(n.bits() != bits) + throw Self_Test_Failure(algo_name() + " private key generation failed"); + } + +/* +* RSA_PrivateKey Constructor +*/ +RSA_PrivateKey::RSA_PrivateKey(RandomNumberGenerator& rng, + const BigInt& prime1, const BigInt& prime2, + const BigInt& exp, const BigInt& d_exp, + const BigInt& mod) + { + p = prime1; + q = prime2; + e = exp; + d = d_exp; + n = mod; + + if(d == 0) + d = inverse_mod(e, lcm(p - 1, q - 1)); + + PKCS8_load_hook(rng); + } + +/* +* RSA Private Operation +*/ +BigInt RSA_PrivateKey::private_op(const byte in[], u32bit length) const + { + BigInt i(in, length); + if(i >= n) + throw Invalid_Argument(algo_name() + "::private_op: input is too large"); + + BigInt r = core.private_op(i); + if(i != public_op(r)) + throw Self_Test_Failure(algo_name() + " private operation check failed"); + return r; + } + +/* +* RSA Decryption Operation +*/ +SecureVector RSA_PrivateKey::decrypt(const byte in[], u32bit len) const + { + return BigInt::encode(private_op(in, len)); + } + +/* +* RSA Signature Operation +*/ +SecureVector RSA_PrivateKey::sign(const byte in[], u32bit len, + RandomNumberGenerator&) const + { + return BigInt::encode_1363(private_op(in, len), n.bytes()); + } + +/* +* Check Private RSA Parameters +*/ +bool RSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const + { + if(!IF_Scheme_PrivateKey::check_key(rng, strong)) + return false; + + if(!strong) + return true; + + if((e * d) % lcm(p - 1, q - 1) != 1) + return false; + + try + { + KeyPair::check_key(rng, + get_pk_encryptor(*this, "EME1(SHA-1)"), + get_pk_decryptor(*this, "EME1(SHA-1)") + ); + + KeyPair::check_key(rng, + get_pk_signer(*this, "EMSA4(SHA-1)"), + get_pk_verifier(*this, "EMSA4(SHA-1)") + ); + } + catch(Self_Test_Failure) + { + return false; + } + + return true; + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/rsa/rsa.h b/src/libs/3rdparty/botan/src/pubkey/rsa/rsa.h new file mode 100644 index 00000000000..f07533a4f60 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/rsa/rsa.h @@ -0,0 +1,88 @@ +/* +* RSA +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_RSA_H__ +#define BOTAN_RSA_H__ + +#include + +namespace Botan { + +/** +* RSA Public Key +*/ +class BOTAN_DLL RSA_PublicKey : public PK_Encrypting_Key, + public PK_Verifying_with_MR_Key, + public virtual IF_Scheme_PublicKey + { + public: + std::string algo_name() const { return "RSA"; } + + SecureVector encrypt(const byte[], u32bit, + RandomNumberGenerator& rng) const; + + SecureVector verify(const byte[], u32bit) const; + + RSA_PublicKey() {} + RSA_PublicKey(const BigInt&, const BigInt&); + protected: + BigInt public_op(const BigInt&) const; + }; + +/** +* RSA Private Key class. +*/ +class BOTAN_DLL RSA_PrivateKey : public RSA_PublicKey, + public PK_Decrypting_Key, + public PK_Signing_Key, + public IF_Scheme_PrivateKey + { + public: + SecureVector sign(const byte[], u32bit, + RandomNumberGenerator&) const; + + SecureVector decrypt(const byte[], u32bit) const; + + bool check_key(RandomNumberGenerator& rng, bool) const; + + /** + * Default constructor, does not set any internal values. Use this + * constructor if you wish to decode a DER or PEM encoded key. + */ + RSA_PrivateKey() {} + + /** + * Construct a private key from the specified parameters. + * @param rng the random number generator to use + * @param prime1 the first prime + * @param prime2 the second prime + * @param exp the exponent + * @param d_exp if specified, this has to be d with + * exp * d = 1 mod (p - 1, q - 1). Leave it as 0 if you wish to + * the constructor to calculate it. + * @param n if specified, this must be n = p * q. Leave it as 0 + * if you wish to the constructor to calculate it. + */ + RSA_PrivateKey(RandomNumberGenerator& rng, + const BigInt& p, const BigInt& q, const BigInt& e, + const BigInt& d = 0, const BigInt& n = 0); + + /** + * Create a new private key with the specified bit length + * @param rng the random number generator to use + * @param bits the desired bit length of the private key + * @param exp the public exponent to be used + */ + RSA_PrivateKey(RandomNumberGenerator& rng, + u32bit bits, u32bit exp = 65537); + private: + BigInt private_op(const byte[], u32bit) const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/pubkey/rw/info.txt b/src/libs/3rdparty/botan/src/pubkey/rw/info.txt new file mode 100644 index 00000000000..ada6c37d6a2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/rw/info.txt @@ -0,0 +1,17 @@ +realname "Rabin-Williams" + +define RW + +load_on auto + + +rw.cpp +rw.h + + + +if_algo +keypair +libstate +numbertheory + diff --git a/src/libs/3rdparty/botan/src/pubkey/rw/rw.cpp b/src/libs/3rdparty/botan/src/pubkey/rw/rw.cpp new file mode 100644 index 00000000000..def0ae68976 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/rw/rw.cpp @@ -0,0 +1,148 @@ +/* +* Rabin-Williams +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* RW_PublicKey Constructor +*/ +RW_PublicKey::RW_PublicKey(const BigInt& mod, const BigInt& exp) + { + n = mod; + e = exp; + X509_load_hook(); + } + +/* +* Rabin-Williams Public Operation +*/ +BigInt RW_PublicKey::public_op(const BigInt& i) const + { + if((i > (n >> 1)) || i.is_negative()) + throw Invalid_Argument(algo_name() + "::public_op: i > n / 2 || i < 0"); + + BigInt r = core.public_op(i); + if(r % 16 == 12) return r; + if(r % 8 == 6) return 2*r; + + r = n - r; + if(r % 16 == 12) return r; + if(r % 8 == 6) return 2*r; + + throw Invalid_Argument(algo_name() + "::public_op: Invalid input"); + } + +/* +* Rabin-Williams Verification Function +*/ +SecureVector RW_PublicKey::verify(const byte in[], u32bit len) const + { + BigInt i(in, len); + return BigInt::encode(public_op(i)); + } + +/* +* Create a Rabin-Williams private key +*/ +RW_PrivateKey::RW_PrivateKey(RandomNumberGenerator& rng, + u32bit bits, u32bit exp) + { + if(bits < 512) + throw Invalid_Argument(algo_name() + ": Can't make a key that is only " + + to_string(bits) + " bits long"); + if(exp < 2 || exp % 2 == 1) + throw Invalid_Argument(algo_name() + ": Invalid encryption exponent"); + + e = exp; + p = random_prime(rng, (bits + 1) / 2, e / 2, 3, 4); + q = random_prime(rng, bits - p.bits(), e / 2, ((p % 8 == 3) ? 7 : 3), 8); + d = inverse_mod(e, lcm(p - 1, q - 1) >> 1); + + PKCS8_load_hook(rng, true); + + if(n.bits() != bits) + throw Self_Test_Failure(algo_name() + " private key generation failed"); + } + +/* +* RW_PrivateKey Constructor +*/ +RW_PrivateKey::RW_PrivateKey(RandomNumberGenerator& rng, + const BigInt& prime1, const BigInt& prime2, + const BigInt& exp, const BigInt& d_exp, + const BigInt& mod) + { + p = prime1; + q = prime2; + e = exp; + d = d_exp; + n = mod; + + if(d == 0) + d = inverse_mod(e, lcm(p - 1, q - 1) >> 1); + + PKCS8_load_hook(rng); + } + +/* +* Rabin-Williams Signature Operation +*/ +SecureVector RW_PrivateKey::sign(const byte in[], u32bit len, + RandomNumberGenerator&) const + { + BigInt i(in, len); + if(i >= n || i % 16 != 12) + throw Invalid_Argument(algo_name() + "::sign: Invalid input"); + + BigInt r; + if(jacobi(i, n) == 1) r = core.private_op(i); + else r = core.private_op(i >> 1); + + r = std::min(r, n - r); + if(i != public_op(r)) + throw Self_Test_Failure(algo_name() + " private operation check failed"); + + return BigInt::encode_1363(r, n.bytes()); + } + +/* +* Check Private Rabin-Williams Parameters +*/ +bool RW_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const + { + if(!IF_Scheme_PrivateKey::check_key(rng, strong)) + return false; + + if(!strong) + return true; + + if((e * d) % (lcm(p - 1, q - 1) / 2) != 1) + return false; + + try + { + KeyPair::check_key(rng, + get_pk_signer(*this, "EMSA2(SHA-1)"), + get_pk_verifier(*this, "EMSA2(SHA-1)") + ); + } + catch(Self_Test_Failure) + { + return false; + } + + return true; + } + +} diff --git a/src/libs/3rdparty/botan/src/pubkey/rw/rw.h b/src/libs/3rdparty/botan/src/pubkey/rw/rw.h new file mode 100644 index 00000000000..900e5ebda25 --- /dev/null +++ b/src/libs/3rdparty/botan/src/pubkey/rw/rw.h @@ -0,0 +1,56 @@ +/* +* Rabin-Williams +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_RW_H__ +#define BOTAN_RW_H__ + +#include + +namespace Botan { + +/* +* Rabin-Williams Public Key +*/ +class BOTAN_DLL RW_PublicKey : public PK_Verifying_with_MR_Key, + public virtual IF_Scheme_PublicKey + { + public: + std::string algo_name() const { return "RW"; } + + SecureVector verify(const byte[], u32bit) const; + + RW_PublicKey() {} + RW_PublicKey(const BigInt&, const BigInt&); + protected: + BigInt public_op(const BigInt&) const; + }; + +/* +* Rabin-Williams Private Key +*/ +class BOTAN_DLL RW_PrivateKey : public RW_PublicKey, + public PK_Signing_Key, + public IF_Scheme_PrivateKey + { + public: + SecureVector sign(const byte[], u32bit, + RandomNumberGenerator& rng) const; + + bool check_key(RandomNumberGenerator& rng, bool) const; + + RW_PrivateKey() {} + + RW_PrivateKey(RandomNumberGenerator&, + const BigInt&, const BigInt&, const BigInt&, + const BigInt& = 0, const BigInt& = 0); + + RW_PrivateKey(RandomNumberGenerator& rng, u32bit bits, u32bit = 2); + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/rng/auto_rng/auto_rng.cpp b/src/libs/3rdparty/botan/src/rng/auto_rng/auto_rng.cpp new file mode 100644 index 00000000000..8405170ad19 --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/auto_rng/auto_rng.cpp @@ -0,0 +1,158 @@ +/* +* Auto Seeded RNG +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +#if defined(BOTAN_HAS_RANDPOOL) + #include +#endif + +#if defined(BOTAN_HAS_HMAC_RNG) + #include +#endif + +#if defined(BOTAN_HAS_X931_RNG) + #include +#endif + +#if defined(BOTAN_HAS_AES) + #include +#endif + +#if defined(BOTAN_HAS_TIMER_HARDWARE) + #include +#endif + +#if defined(BOTAN_HAS_TIMER_POSIX) + #include +#endif + +#if defined(BOTAN_HAS_TIMER_UNIX) + #include +#endif + +#if defined(BOTAN_HAS_TIMER_WIN32) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_DEVICE) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_EGD) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_UNIX) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_BEOS) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_CAPI) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_WIN32) + #include +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_FTW) + #include +#endif + +namespace Botan { + +namespace { + +/** +* Add any known entropy sources to this RNG +*/ +void add_entropy_sources(RandomNumberGenerator* rng) + { + + // Add a high resolution timer, if available +#if defined(BOTAN_HAS_TIMER_HARDWARE) + rng->add_entropy_source(new Hardware_Timer); +#elif defined(BOTAN_HAS_TIMER_POSIX) + rng->add_entropy_source(new POSIX_Timer); +#elif defined(BOTAN_HAS_TIMER_UNIX) + rng->add_entropy_source(new Unix_Timer); +#elif defined(BOTAN_HAS_TIMER_WIN32) + rng->add_entropy_source(new Win32_Timer); +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_DEVICE) + rng->add_entropy_source( + new Device_EntropySource( + split_on("/dev/urandom:/dev/random:/dev/srandom", ':') + ) + ); +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_EGD) + rng->add_entropy_source( + new EGD_EntropySource(split_on("/var/run/egd-pool:/dev/egd-pool", ':')) + ); +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_CAPI) + rng->add_entropy_source(new Win32_CAPI_EntropySource); +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_FTW) + rng->add_entropy_source(new FTW_EntropySource("/proc")); +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_WIN32) + rng->add_entropy_source(new Win32_EntropySource); +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_BEOS) + rng->add_entropy_source(new BeOS_EntropySource); +#endif + +#if defined(BOTAN_HAS_ENTROPY_SRC_UNIX) + rng->add_entropy_source( + new Unix_EntropySource(split_on("/bin:/sbin:/usr/bin:/usr/sbin", ':')) + ); +#endif + } + +} + +AutoSeeded_RNG::AutoSeeded_RNG(u32bit poll_bits) + { + rng = 0; + +#if defined(BOTAN_HAS_HMAC_RNG) + rng = new HMAC_RNG(new HMAC(new SHA_512), new HMAC(new SHA_256)); +#elif defined(BOTAN_HAS_RANDPOOL) && defined(BOTAN_HAS_AES) + rng = new Randpool(new AES_256, new HMAC(new SHA_256)); +#endif + + if(!rng) + throw Algorithm_Not_Found("No usable RNG found enabled in build"); + + /* If X9.31 is available, use it to wrap the other RNG as a failsafe */ +#if defined(BOTAN_HAS_X931_RNG) && defined(BOTAN_HAS_AES) + rng = new ANSI_X931_RNG(new AES_256, rng); +#endif + + add_entropy_sources(rng); + + rng->reseed(poll_bits); + } + +} diff --git a/src/libs/3rdparty/botan/src/rng/auto_rng/auto_rng.h b/src/libs/3rdparty/botan/src/rng/auto_rng/auto_rng.h new file mode 100644 index 00000000000..f18f8e5cd5f --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/auto_rng/auto_rng.h @@ -0,0 +1,44 @@ +/* +* Auto Seeded RNG +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_AUTO_SEEDING_RNG_H__ +#define BOTAN_AUTO_SEEDING_RNG_H__ + +#include +#include + +namespace Botan { + +/** +* RNG that attempts to seed itself +*/ +class BOTAN_DLL AutoSeeded_RNG : public RandomNumberGenerator + { + public: + void randomize(byte out[], u32bit len) + { rng->randomize(out, len); } + bool is_seeded() const + { return rng->is_seeded(); } + void clear() throw() { rng->clear(); } + std::string name() const + { return "AutoSeeded(" + rng->name() + ")"; } + + void reseed(u32bit poll_bits = 256) { rng->reseed(poll_bits); } + void add_entropy_source(EntropySource* es) + { rng->add_entropy_source(es); } + void add_entropy(const byte in[], u32bit len) + { rng->add_entropy(in, len); } + + AutoSeeded_RNG(u32bit poll_bits = 256); + ~AutoSeeded_RNG() { delete rng; } + private: + RandomNumberGenerator* rng; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/rng/auto_rng/info.txt b/src/libs/3rdparty/botan/src/rng/auto_rng/info.txt new file mode 100644 index 00000000000..7d5d5ddccc2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/auto_rng/info.txt @@ -0,0 +1,16 @@ +realname "Auto-seeded Random Number Generator" + +define AUTO_SEEDING_RNG + +load_on auto + + +auto_rng.h +auto_rng.cpp + + + +hmac +sha2 +timer + diff --git a/src/libs/3rdparty/botan/src/rng/hmac_rng/hmac_rng.cpp b/src/libs/3rdparty/botan/src/rng/hmac_rng/hmac_rng.cpp new file mode 100644 index 00000000000..113489db31e --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/hmac_rng/hmac_rng.cpp @@ -0,0 +1,223 @@ +/* +* HMAC_RNG +* (C) 2008-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +void hmac_prf(MessageAuthenticationCode* prf, + MemoryRegion& K, + u32bit& counter, + const std::string& label) + { + prf->update(K, K.size()); + prf->update(label); + for(u32bit i = 0; i != 4; ++i) + prf->update(get_byte(i, counter)); + prf->final(K); + + ++counter; + } + +} + +/** +* Generate a buffer of random bytes +*/ +void HMAC_RNG::randomize(byte out[], u32bit length) + { + if(!is_seeded()) + throw PRNG_Unseeded(name()); + + /* + HMAC KDF as described in E-t-E, using a CTXinfo of "rng" + */ + while(length) + { + hmac_prf(prf, K, counter, "rng"); + + const u32bit copied = std::min(K.size(), length); + + copy_mem(out, K.begin(), copied); + out += copied; + length -= copied; + } + } + +/** +* Reseed the internal state, also accepting user input to include +*/ +void HMAC_RNG::reseed_with_input(u32bit poll_bits, + const byte input[], u32bit input_length) + { + /** + Using the terminology of E-t-E, XTR is the MAC function (normally + HMAC) seeded with XTS (below) and we form SKM, the key material, by + fast polling each source, and then slow polling as many as we think + we need (in the following loop), and feeding all of the poll + results, along with any optional user input, along with, finally, + feedback of the current PRK value, into the extractor function. + */ + + Entropy_Accumulator_BufferedComputation accum(*extractor, poll_bits); + + if(!entropy_sources.empty()) + { + u32bit poll_attempt = 0; + + while(!accum.polling_goal_achieved() && poll_attempt < poll_bits) + { + entropy_sources[poll_attempt % entropy_sources.size()]->poll(accum); + ++poll_attempt; + } + } + + // And now add the user-provided input, if any + if(input_length) + accum.add(input, input_length, 1); + + /* + It is necessary to feed forward poll data. Otherwise, a good poll + (collecting a large amount of conditional entropy) followed by a + bad one (collecting little) would be unsafe. Do this by generating + new PRF outputs using the previous key and feeding them into the + extractor function. + + Cycle the RNG once (CTXinfo="rng"), then generate a new PRF output + using the CTXinfo "reseed". Provide these values as input to the + extractor function. + */ + hmac_prf(prf, K, counter, "rng"); + extractor->update(K); // K is the CTXinfo=rng PRF output + + hmac_prf(prf, K, counter, "reseed"); + extractor->update(K); // K is the CTXinfo=reseed PRF output + + /* Now derive the new PRK using everything that has been fed into + the extractor, and set the PRF key to that */ + prf->set_key(extractor->final()); + + // Now generate a new PRF output to use as the XTS extractor salt + hmac_prf(prf, K, counter, "xts"); + extractor->set_key(K, K.size()); + + // Reset state + K.clear(); + counter = 0; + + if(input_length || accum.bits_collected() >= poll_bits) + seeded = true; + } + +/** +* Reseed the internal state +*/ +void HMAC_RNG::reseed(u32bit poll_bits) + { + reseed_with_input(poll_bits, 0, 0); + } + +/** +* Add user-supplied entropy by reseeding and including this +* input among the poll data +*/ +void HMAC_RNG::add_entropy(const byte input[], u32bit length) + { + reseed_with_input(0, input, length); + } + +/** +* Add another entropy source to the list +*/ +void HMAC_RNG::add_entropy_source(EntropySource* src) + { + entropy_sources.push_back(src); + } + +/* +* Clear memory of sensitive data +*/ +void HMAC_RNG::clear() throw() + { + extractor->clear(); + prf->clear(); + K.clear(); + counter = 0; + seeded = false; + } + +/** +* Return the name of this type +*/ +std::string HMAC_RNG::name() const + { + return "HMAC_RNG(" + extractor->name() + "," + prf->name() + ")"; + } + +/** +* HMAC_RNG Constructor +*/ +HMAC_RNG::HMAC_RNG(MessageAuthenticationCode* extractor_mac, + MessageAuthenticationCode* prf_mac) : + extractor(extractor_mac), prf(prf_mac) + { + // First PRF inputs are all zero, as specified in section 2 + K.create(prf->OUTPUT_LENGTH); + counter = 0; + seeded = false; + + /* + Normally we want to feedback PRF output into the input to the + extractor function to ensure a single bad poll does not damage the + RNG, but obviously that is meaningless to do on the first poll. + + We will want to use the PRF before we set the first key (in + reseed_with_input), and it is a pain to keep track if it is set or + not. Since the first time it doesn't matter anyway, just set it to + a constant: randomize() will not produce output unless is_seeded() + returns true, and that will only be the case if the estimated + entropy counter is high enough. That variable is only set when a + reseeding is performed. + */ + std::string prf_key = "Botan HMAC_RNG PRF"; + prf->set_key(reinterpret_cast(prf_key.c_str()), + prf_key.length()); + + /* + This will be used as the first XTS value when extracting input. + XTS values after this one are generated using the PRF. + + If I understand the E-t-E paper correctly (specifically Section 4), + using this fixed extractor key is safe to do. + */ + std::string xts = "Botan HMAC_RNG XTS"; + extractor->set_key(reinterpret_cast(xts.c_str()), + xts.length()); + } + +/** +* HMAC_RNG Destructor +*/ +HMAC_RNG::~HMAC_RNG() + { + delete extractor; + delete prf; + + std::for_each(entropy_sources.begin(), entropy_sources.end(), + del_fun()); + + counter = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/rng/hmac_rng/hmac_rng.h b/src/libs/3rdparty/botan/src/rng/hmac_rng/hmac_rng.h new file mode 100644 index 00000000000..318e2a931ad --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/hmac_rng/hmac_rng.h @@ -0,0 +1,59 @@ +/* +* HMAC RNG +* (C) 2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_HMAC_RNG_H__ +#define BOTAN_HMAC_RNG_H__ + +#include +#include +#include + +namespace Botan { + +/** +HMAC_RNG - based on the design described in "On Extract-then-Expand +Key Derivation Functions and an HMAC-based KDF" by Hugo Krawczyk +(henceforce, 'E-t-E') + +However it actually can be parameterized with any two MAC functions, +not restricted to HMAC (this variation is also described in Krawczyk's +paper), for instance one could use HMAC(SHA-512) as the extractor +and CMAC(AES-256) as the PRF. +*/ +class BOTAN_DLL HMAC_RNG : public RandomNumberGenerator + { + public: + void randomize(byte buf[], u32bit len); + bool is_seeded() const { return seeded; } + void clear() throw(); + std::string name() const; + + void reseed(u32bit poll_bits); + void add_entropy_source(EntropySource* es); + void add_entropy(const byte[], u32bit); + + HMAC_RNG(MessageAuthenticationCode* extractor, + MessageAuthenticationCode* prf); + + ~HMAC_RNG(); + private: + void reseed_with_input(u32bit poll_bits, + const byte input[], u32bit length); + + MessageAuthenticationCode* extractor; + MessageAuthenticationCode* prf; + + std::vector entropy_sources; + bool seeded; + + SecureVector K, io_buffer; + u32bit counter, source_index; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/rng/hmac_rng/info.txt b/src/libs/3rdparty/botan/src/rng/hmac_rng/info.txt new file mode 100644 index 00000000000..2c7f13e0aaf --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/hmac_rng/info.txt @@ -0,0 +1,14 @@ +realname "HMAC RNG" + +define HMAC_RNG + +load_on auto + + +hmac_rng.cpp +hmac_rng.h + + + +mac + diff --git a/src/libs/3rdparty/botan/src/rng/info.txt b/src/libs/3rdparty/botan/src/rng/info.txt new file mode 100644 index 00000000000..44a41665d3b --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/info.txt @@ -0,0 +1,12 @@ +realname "Random Number Generators" + +load_on auto + + +rng.cpp +rng.h + + + +entropy + diff --git a/src/libs/3rdparty/botan/src/rng/randpool/info.txt b/src/libs/3rdparty/botan/src/rng/randpool/info.txt new file mode 100644 index 00000000000..cc7f6155279 --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/randpool/info.txt @@ -0,0 +1,15 @@ +realname "Randpool RNG" + +define RANDPOOL + +load_on auto + + +randpool.cpp +randpool.h + + + +block +mac + diff --git a/src/libs/3rdparty/botan/src/rng/randpool/randpool.cpp b/src/libs/3rdparty/botan/src/rng/randpool/randpool.cpp new file mode 100644 index 00000000000..77a5228c663 --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/randpool/randpool.cpp @@ -0,0 +1,213 @@ +/* +* Randpool +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/** +* PRF based on a MAC +*/ +enum RANDPOOL_PRF_TAG { + CIPHER_KEY = 0, + MAC_KEY = 1, + GEN_OUTPUT = 2 +}; + +} + +/** +* Generate a buffer of random bytes +*/ +void Randpool::randomize(byte out[], u32bit length) + { + if(!is_seeded()) + throw PRNG_Unseeded(name()); + + update_buffer(); + while(length) + { + const u32bit copied = std::min(length, buffer.size()); + copy_mem(out, buffer.begin(), copied); + out += copied; + length -= copied; + update_buffer(); + } + } + +/** +* Refill the output buffer +*/ +void Randpool::update_buffer() + { + const u64bit timestamp = system_time(); + + for(u32bit i = 0; i != counter.size(); ++i) + if(++counter[i]) + break; + store_be(timestamp, counter + 4); + + mac->update(static_cast(GEN_OUTPUT)); + mac->update(counter, counter.size()); + SecureVector mac_val = mac->final(); + + for(u32bit i = 0; i != mac_val.size(); ++i) + buffer[i % buffer.size()] ^= mac_val[i]; + cipher->encrypt(buffer); + + if(counter[0] % ITERATIONS_BEFORE_RESEED == 0) + mix_pool(); + } + +/** +* Mix the entropy pool +*/ +void Randpool::mix_pool() + { + const u32bit BLOCK_SIZE = cipher->BLOCK_SIZE; + + mac->update(static_cast(MAC_KEY)); + mac->update(pool, pool.size()); + mac->set_key(mac->final()); + + mac->update(static_cast(CIPHER_KEY)); + mac->update(pool, pool.size()); + cipher->set_key(mac->final()); + + xor_buf(pool, buffer, BLOCK_SIZE); + cipher->encrypt(pool); + for(u32bit i = 1; i != POOL_BLOCKS; ++i) + { + const byte* previous_block = pool + BLOCK_SIZE*(i-1); + byte* this_block = pool + BLOCK_SIZE*i; + xor_buf(this_block, previous_block, BLOCK_SIZE); + cipher->encrypt(this_block); + } + + update_buffer(); + } + +/** +* Reseed the internal state +*/ +void Randpool::reseed(u32bit poll_bits) + { + Entropy_Accumulator_BufferedComputation accum(*mac, poll_bits); + + if(!entropy_sources.empty()) + { + u32bit poll_attempt = 0; + + while(!accum.polling_goal_achieved() && poll_attempt < poll_bits) + { + entropy_sources[poll_attempt % entropy_sources.size()]->poll(accum); + ++poll_attempt; + } + } + + SecureVector mac_val = mac->final(); + + xor_buf(pool, mac_val, mac_val.size()); + mix_pool(); + + if(accum.bits_collected() >= poll_bits) + seeded = true; + } + +/** +* Add user-supplied entropy +*/ +void Randpool::add_entropy(const byte input[], u32bit length) + { + SecureVector mac_val = mac->process(input, length); + xor_buf(pool, mac_val, mac_val.size()); + mix_pool(); + + if(length) + seeded = true; + } + +/** +* Add another entropy source to the list +*/ +void Randpool::add_entropy_source(EntropySource* src) + { + entropy_sources.push_back(src); + } + +/** +* Clear memory of sensitive data +*/ +void Randpool::clear() throw() + { + cipher->clear(); + mac->clear(); + pool.clear(); + buffer.clear(); + counter.clear(); + seeded = false; + } + +/** +* Return the name of this type +*/ +std::string Randpool::name() const + { + return "Randpool(" + cipher->name() + "," + mac->name() + ")"; + } + +/** +* Randpool Constructor +*/ +Randpool::Randpool(BlockCipher* cipher_in, + MessageAuthenticationCode* mac_in, + u32bit pool_blocks, + u32bit iter_before_reseed) : + ITERATIONS_BEFORE_RESEED(iter_before_reseed), + POOL_BLOCKS(pool_blocks), + cipher(cipher_in), + mac(mac_in) + { + const u32bit BLOCK_SIZE = cipher->BLOCK_SIZE; + const u32bit OUTPUT_LENGTH = mac->OUTPUT_LENGTH; + + if(OUTPUT_LENGTH < BLOCK_SIZE || + !cipher->valid_keylength(OUTPUT_LENGTH) || + !mac->valid_keylength(OUTPUT_LENGTH)) + { + delete cipher; + delete mac; + throw Internal_Error("Randpool: Invalid algorithm combination " + + cipher->name() + "/" + mac->name()); + } + + buffer.create(BLOCK_SIZE); + pool.create(POOL_BLOCKS * BLOCK_SIZE); + counter.create(12); + seeded = false; + } + +/** +* Randpool Destructor +*/ +Randpool::~Randpool() + { + delete cipher; + delete mac; + + std::for_each(entropy_sources.begin(), entropy_sources.end(), + del_fun()); + } + +} diff --git a/src/libs/3rdparty/botan/src/rng/randpool/randpool.h b/src/libs/3rdparty/botan/src/rng/randpool/randpool.h new file mode 100644 index 00000000000..b6a3adda4a5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/randpool/randpool.h @@ -0,0 +1,53 @@ +/* +* Randpool +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_RANDPOOL_H__ +#define BOTAN_RANDPOOL_H__ + +#include +#include +#include +#include + +namespace Botan { + +/** +* Randpool +*/ +class BOTAN_DLL Randpool : public RandomNumberGenerator + { + public: + void randomize(byte[], u32bit); + bool is_seeded() const { return seeded; } + void clear() throw(); + std::string name() const; + + void reseed(u32bit bits_to_collect); + void add_entropy_source(EntropySource* es); + void add_entropy(const byte input[], u32bit length); + + Randpool(BlockCipher* cipher, MessageAuthenticationCode* mac, + u32bit pool_blocks = 32, + u32bit iterations_before_reseed = 128); + + ~Randpool(); + private: + void update_buffer(); + void mix_pool(); + + u32bit ITERATIONS_BEFORE_RESEED, POOL_BLOCKS; + BlockCipher* cipher; + MessageAuthenticationCode* mac; + + std::vector entropy_sources; + SecureVector pool, buffer, counter; + bool seeded; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/rng/rng.cpp b/src/libs/3rdparty/botan/src/rng/rng.cpp new file mode 100644 index 00000000000..aa9b73ff39a --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/rng.cpp @@ -0,0 +1,38 @@ +/* +* Random Number Generator Base +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) + #include +#endif + +namespace Botan { + +/* +* Get a single random byte +*/ +byte RandomNumberGenerator::next_byte() + { + byte out; + this->randomize(&out, 1); + return out; + } + +/* +* Create and seed a new RNG object +*/ +RandomNumberGenerator* RandomNumberGenerator::make_rng() + { +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) + return new AutoSeeded_RNG; +#endif + + throw Algorithm_Not_Found("RandomNumberGenerator::make_rng - no RNG found"); + } + +} diff --git a/src/libs/3rdparty/botan/src/rng/rng.h b/src/libs/3rdparty/botan/src/rng/rng.h new file mode 100644 index 00000000000..41904dbef40 --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/rng.h @@ -0,0 +1,103 @@ +/* +* RandomNumberGenerator +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_RANDOM_NUMBER_GENERATOR_H__ +#define BOTAN_RANDOM_NUMBER_GENERATOR_H__ + +#include +#include +#include + +namespace Botan { + +/** +* This class represents a random number (RNG) generator object. +*/ +class BOTAN_DLL RandomNumberGenerator + { + public: + /** + * Create a seeded and active RNG object for general application use + */ + static RandomNumberGenerator* make_rng(); + + /** + * Randomize a byte array. + * @param output the byte array to hold the random output. + * @param length the length of the byte array output. + */ + virtual void randomize(byte output[], u32bit length) = 0; + + /** + * Return a random byte + * @return random byte + */ + byte next_byte(); + + /** + * Check whether this RNG is seeded. + * @return true if this RNG was already seeded, false otherwise. + */ + virtual bool is_seeded() const { return true; } + + /** + * Clear all internally held values of this RNG. + */ + virtual void clear() throw() = 0; + + /** + * Return the name of this object + */ + virtual std::string name() const = 0; + + /** + * Seed this RNG using the entropy sources it contains. + * @param bits_to_collect is the number of bits of entropy to + attempt to gather from the entropy sources + */ + virtual void reseed(u32bit bits_to_collect) = 0; + + /** + * Add this entropy source to the RNG object + * @param source the entropy source which will be retained and used by RNG + */ + virtual void add_entropy_source(EntropySource* source) = 0; + + /** + * Add entropy to this RNG. + * @param in a byte array containg the entropy to be added + * @param length the length of the byte array in + */ + virtual void add_entropy(const byte in[], u32bit length) = 0; + + RandomNumberGenerator() {} + virtual ~RandomNumberGenerator() {} + private: + RandomNumberGenerator(const RandomNumberGenerator&) {} + RandomNumberGenerator& operator=(const RandomNumberGenerator&) + { return (*this); } + }; + +/* +* Null Random Number Generator +*/ +class BOTAN_DLL Null_RNG : public RandomNumberGenerator + { + public: + void randomize(byte[], u32bit) { throw PRNG_Unseeded("Null_RNG"); } + void clear() throw() {} + std::string name() const { return "Null_RNG"; } + + void reseed(u32bit) {} + bool is_seeded() const { return false; } + void add_entropy(const byte[], u32bit) {} + void add_entropy_source(EntropySource* es) { delete es; } + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/rng/x931_rng/info.txt b/src/libs/3rdparty/botan/src/rng/x931_rng/info.txt new file mode 100644 index 00000000000..633eb02689b --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/x931_rng/info.txt @@ -0,0 +1,14 @@ +realname "ANSI X9.31 PRNG" + +define X931_RNG + +load_on auto + + +x931_rng.cpp +x931_rng.h + + + +block + diff --git a/src/libs/3rdparty/botan/src/rng/x931_rng/x931_rng.cpp b/src/libs/3rdparty/botan/src/rng/x931_rng/x931_rng.cpp new file mode 100644 index 00000000000..e239bce84e2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/x931_rng/x931_rng.cpp @@ -0,0 +1,154 @@ +/* +* ANSI X9.31 RNG +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/** +* Generate a buffer of random bytes +*/ +void ANSI_X931_RNG::randomize(byte out[], u32bit length) + { + if(!is_seeded()) + throw PRNG_Unseeded(name()); + + while(length) + { + if(position == R.size()) + update_buffer(); + + const u32bit copied = std::min(length, R.size() - position); + + copy_mem(out, R + position, copied); + out += copied; + length -= copied; + position += copied; + } + } + +/** +* Refill the internal state +*/ +void ANSI_X931_RNG::update_buffer() + { + SecureVector DT(cipher->BLOCK_SIZE); + + prng->randomize(DT, DT.size()); + cipher->encrypt(DT); + + xor_buf(R, V, DT, cipher->BLOCK_SIZE); + cipher->encrypt(R); + + xor_buf(V, R, DT, cipher->BLOCK_SIZE); + cipher->encrypt(V); + + position = 0; + } + +/** +* Reset V and the cipher key with new values +*/ +void ANSI_X931_RNG::rekey() + { + if(prng->is_seeded()) + { + SecureVector key(cipher->MAXIMUM_KEYLENGTH); + prng->randomize(key, key.size()); + cipher->set_key(key, key.size()); + + if(V.size() != cipher->BLOCK_SIZE) + V.create(cipher->BLOCK_SIZE); + prng->randomize(V, V.size()); + + update_buffer(); + } + } + +/** +* Reseed the internal state +*/ +void ANSI_X931_RNG::reseed(u32bit poll_bits) + { + prng->reseed(poll_bits); + rekey(); + } + +/** +* Add a entropy source to the underlying PRNG +*/ +void ANSI_X931_RNG::add_entropy_source(EntropySource* src) + { + prng->add_entropy_source(src); + } + +/** +* Add some entropy to the underlying PRNG +*/ +void ANSI_X931_RNG::add_entropy(const byte input[], u32bit length) + { + prng->add_entropy(input, length); + rekey(); + } + +/** +* Check if the the PRNG is seeded +*/ +bool ANSI_X931_RNG::is_seeded() const + { + return V.has_items(); + } + +/** +* Clear memory of sensitive data +*/ +void ANSI_X931_RNG::clear() throw() + { + cipher->clear(); + prng->clear(); + R.clear(); + V.destroy(); + + position = 0; + } + +/** +* Return the name of this type +*/ +std::string ANSI_X931_RNG::name() const + { + return "X9.31(" + cipher->name() + ")"; + } + +/** +* ANSI X931 RNG Constructor +*/ +ANSI_X931_RNG::ANSI_X931_RNG(BlockCipher* cipher_in, + RandomNumberGenerator* prng_in) + { + if(!prng_in || !cipher_in) + throw Invalid_Argument("ANSI_X931_RNG constructor: NULL arguments"); + + cipher = cipher_in; + prng = prng_in; + + R.create(cipher->BLOCK_SIZE); + position = 0; + } + +/** +* ANSI X931 RNG Destructor +*/ +ANSI_X931_RNG::~ANSI_X931_RNG() + { + delete cipher; + delete prng; + } + +} diff --git a/src/libs/3rdparty/botan/src/rng/x931_rng/x931_rng.h b/src/libs/3rdparty/botan/src/rng/x931_rng/x931_rng.h new file mode 100644 index 00000000000..44e9b442811 --- /dev/null +++ b/src/libs/3rdparty/botan/src/rng/x931_rng/x931_rng.h @@ -0,0 +1,45 @@ +/* +* ANSI X9.31 RNG +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ANSI_X931_RNG_H__ +#define BOTAN_ANSI_X931_RNG_H__ + +#include +#include + +namespace Botan { + +/** +* ANSI X9.31 RNG +*/ +class BOTAN_DLL ANSI_X931_RNG : public RandomNumberGenerator + { + public: + void randomize(byte[], u32bit); + bool is_seeded() const; + void clear() throw(); + std::string name() const; + + void reseed(u32bit poll_bits); + void add_entropy_source(EntropySource*); + void add_entropy(const byte[], u32bit); + + ANSI_X931_RNG(BlockCipher*, RandomNumberGenerator*); + ~ANSI_X931_RNG(); + private: + void rekey(); + void update_buffer(); + + BlockCipher* cipher; + RandomNumberGenerator* prng; + SecureVector V, R; + u32bit position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/s2k/info.txt b/src/libs/3rdparty/botan/src/s2k/info.txt new file mode 100644 index 00000000000..e603fd93787 --- /dev/null +++ b/src/libs/3rdparty/botan/src/s2k/info.txt @@ -0,0 +1,13 @@ +realname "String to Key Functions" + +load_on auto + + +s2k.cpp +s2k.h + + + +rng +sym_algo + diff --git a/src/libs/3rdparty/botan/src/s2k/pbkdf1/info.txt b/src/libs/3rdparty/botan/src/s2k/pbkdf1/info.txt new file mode 100644 index 00000000000..4c5b27546b3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/s2k/pbkdf1/info.txt @@ -0,0 +1,14 @@ +realname "Pbkdf1" + +define PBKDF1 + +load_on auto + + +pbkdf1.cpp +pbkdf1.h + + + +hash + diff --git a/src/libs/3rdparty/botan/src/s2k/pbkdf1/pbkdf1.cpp b/src/libs/3rdparty/botan/src/s2k/pbkdf1/pbkdf1.cpp new file mode 100644 index 00000000000..04e3aa45348 --- /dev/null +++ b/src/libs/3rdparty/botan/src/s2k/pbkdf1/pbkdf1.cpp @@ -0,0 +1,55 @@ +/* +* PBKDF1 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Return a PKCS#5 PBKDF1 derived key +*/ +OctetString PKCS5_PBKDF1::derive(u32bit key_len, + const std::string& passphrase, + const byte salt[], u32bit salt_size, + u32bit iterations) const + { + if(iterations == 0) + throw Invalid_Argument("PKCS#5 PBKDF1: Invalid iteration count"); + + if(key_len > hash->OUTPUT_LENGTH) + throw Exception("PKCS#5 PBKDF1: Requested output length too long"); + + hash->update(passphrase); + hash->update(salt, salt_size); + SecureVector key = hash->final(); + + for(u32bit j = 1; j != iterations; ++j) + { + hash->update(key); + hash->final(key); + } + + return OctetString(key, std::min(key_len, key.size())); + } + +/* +* Clone this type +*/ +S2K* PKCS5_PBKDF1::clone() const + { + return new PKCS5_PBKDF1(hash->clone()); + } + +/* +* Return the name of this type +*/ +std::string PKCS5_PBKDF1::name() const + { + return "PBKDF1(" + hash->name() + ")"; + } + +} diff --git a/src/libs/3rdparty/botan/src/s2k/pbkdf1/pbkdf1.h b/src/libs/3rdparty/botan/src/s2k/pbkdf1/pbkdf1.h new file mode 100644 index 00000000000..4e5cafdb0af --- /dev/null +++ b/src/libs/3rdparty/botan/src/s2k/pbkdf1/pbkdf1.h @@ -0,0 +1,44 @@ +/* +* PBKDF1 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PBKDF1_H__ +#define BOTAN_PBKDF1_H__ + +#include +#include + +namespace Botan { + +/** +* This class implements the PKCS #5 PBKDF1 functionality. +*/ +class BOTAN_DLL PKCS5_PBKDF1 : public S2K + { + public: + std::string name() const; + S2K* clone() const; + + /** + * Create a PKCS #5 instance using the specified hash function. + * @param hash a pointer to a hash function object to use + */ + PKCS5_PBKDF1(HashFunction* hash_in) : hash(hash_in) {} + + PKCS5_PBKDF1(const PKCS5_PBKDF1& other) : + S2K(), hash(other.hash->clone()) {} + + ~PKCS5_PBKDF1() { delete hash; } + private: + OctetString derive(u32bit, const std::string&, + const byte[], u32bit, u32bit) const; + + HashFunction* hash; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/s2k/pbkdf2/info.txt b/src/libs/3rdparty/botan/src/s2k/pbkdf2/info.txt new file mode 100644 index 00000000000..921aeb1ab45 --- /dev/null +++ b/src/libs/3rdparty/botan/src/s2k/pbkdf2/info.txt @@ -0,0 +1,14 @@ +realname "Pbkdf2" + +define PBKDF2 + +load_on auto + + +pbkdf2.cpp +pbkdf2.h + + + +mac + diff --git a/src/libs/3rdparty/botan/src/s2k/pbkdf2/pbkdf2.cpp b/src/libs/3rdparty/botan/src/s2k/pbkdf2/pbkdf2.cpp new file mode 100644 index 00000000000..1de27c9acb6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/s2k/pbkdf2/pbkdf2.cpp @@ -0,0 +1,82 @@ +/* +* PBKDF2 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Return a PKCS#5 PBKDF2 derived key +*/ +OctetString PKCS5_PBKDF2::derive(u32bit key_len, + const std::string& passphrase, + const byte salt[], u32bit salt_size, + u32bit iterations) const + { + if(iterations == 0) + throw Invalid_Argument("PKCS#5 PBKDF2: Invalid iteration count"); + + if(passphrase.length() == 0) + throw Invalid_Argument("PKCS#5 PBKDF2: Empty passphrase is invalid"); + + mac->set_key(reinterpret_cast(passphrase.data()), + passphrase.length()); + + SecureVector key(key_len); + + byte* T = key.begin(); + + u32bit counter = 1; + while(key_len) + { + u32bit T_size = std::min(mac->OUTPUT_LENGTH, key_len); + SecureVector U(mac->OUTPUT_LENGTH); + + mac->update(salt, salt_size); + for(u32bit j = 0; j != 4; ++j) + mac->update(get_byte(j, counter)); + mac->final(U); + xor_buf(T, U, T_size); + + for(u32bit j = 1; j != iterations; ++j) + { + mac->update(U); + mac->final(U); + xor_buf(T, U, T_size); + } + + key_len -= T_size; + T += T_size; + ++counter; + } + + return key; + } + +/* +* Return the name of this type +*/ +std::string PKCS5_PBKDF2::name() const + { + return "PBKDF2(" + mac->name() + ")"; + } + +S2K* PKCS5_PBKDF2::clone() const + { + return new PKCS5_PBKDF2(mac->clone()); + } + +/* +* PKCS5_PBKDF2 Constructor +*/ +PKCS5_PBKDF2::PKCS5_PBKDF2(MessageAuthenticationCode* m) : mac(m) {} + +PKCS5_PBKDF2::~PKCS5_PBKDF2() { delete mac; } + +} diff --git a/src/libs/3rdparty/botan/src/s2k/pbkdf2/pbkdf2.h b/src/libs/3rdparty/botan/src/s2k/pbkdf2/pbkdf2.h new file mode 100644 index 00000000000..7510338bba2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/s2k/pbkdf2/pbkdf2.h @@ -0,0 +1,40 @@ +/* +* PBKDF2 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PBKDF2_H__ +#define BOTAN_PBKDF2_H__ + +#include +#include + +namespace Botan { + +/** +* This class implements the PKCS #5 PBKDF2 functionality. +*/ +class BOTAN_DLL PKCS5_PBKDF2 : public S2K + { + public: + std::string name() const; + S2K* clone() const; + + /** + * Create a PKCS #5 instance using the specified message auth code + * @param mac the MAC to use + */ + PKCS5_PBKDF2(MessageAuthenticationCode* mac); + ~PKCS5_PBKDF2(); + private: + OctetString derive(u32bit, const std::string&, + const byte[], u32bit, u32bit) const; + + MessageAuthenticationCode* mac; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/s2k/pgps2k/info.txt b/src/libs/3rdparty/botan/src/s2k/pgps2k/info.txt new file mode 100644 index 00000000000..14b75a02bde --- /dev/null +++ b/src/libs/3rdparty/botan/src/s2k/pgps2k/info.txt @@ -0,0 +1,14 @@ +realname "Pgps2k" + +define PGPS2K + +load_on auto + + +pgp_s2k.cpp +pgp_s2k.h + + + +hash + diff --git a/src/libs/3rdparty/botan/src/s2k/pgps2k/pgp_s2k.cpp b/src/libs/3rdparty/botan/src/s2k/pgps2k/pgp_s2k.cpp new file mode 100644 index 00000000000..86394d84d4d --- /dev/null +++ b/src/libs/3rdparty/botan/src/s2k/pgps2k/pgp_s2k.cpp @@ -0,0 +1,74 @@ +/* +* OpenPGP S2K +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Derive a key using the OpenPGP S2K algorithm +*/ +OctetString OpenPGP_S2K::derive(u32bit key_len, const std::string& passphrase, + const byte salt_buf[], u32bit salt_size, + u32bit iterations) const + { + SecureVector key(key_len), hash_buf; + + u32bit pass = 0, generated = 0, + total_size = passphrase.size() + salt_size; + u32bit to_hash = std::max(iterations, total_size); + + hash->clear(); + while(key_len > generated) + { + for(u32bit j = 0; j != pass; ++j) + hash->update(0); + + u32bit left = to_hash; + while(left >= total_size) + { + hash->update(salt_buf, salt_size); + hash->update(passphrase); + left -= total_size; + } + if(left <= salt_size) + hash->update(salt_buf, left); + else + { + hash->update(salt_buf, salt_size); + left -= salt_size; + hash->update(reinterpret_cast(passphrase.data()), left); + } + + hash_buf = hash->final(); + key.copy(generated, hash_buf, hash->OUTPUT_LENGTH); + generated += hash->OUTPUT_LENGTH; + ++pass; + } + + return key; + } + +/* +* Return the name of this type +*/ +std::string OpenPGP_S2K::name() const + { + return "OpenPGP-S2K(" + hash->name() + ")"; + } + +/* +* Return a clone of this object +*/ +S2K* OpenPGP_S2K::clone() const + { + return new OpenPGP_S2K(hash->clone()); + } + +} diff --git a/src/libs/3rdparty/botan/src/s2k/pgps2k/pgp_s2k.h b/src/libs/3rdparty/botan/src/s2k/pgps2k/pgp_s2k.h new file mode 100644 index 00000000000..00e95f7fa37 --- /dev/null +++ b/src/libs/3rdparty/botan/src/s2k/pgps2k/pgp_s2k.h @@ -0,0 +1,36 @@ +/* +* OpenPGP S2K +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_OPENPGP_S2K_H__ +#define BOTAN_OPENPGP_S2K_H__ + +#include +#include + +namespace Botan { + +/* +* OpenPGP S2K +*/ +class BOTAN_DLL OpenPGP_S2K : public S2K + { + public: + std::string name() const; + S2K* clone() const; + + OpenPGP_S2K(HashFunction* hash_in) : hash(hash_in) {} + ~OpenPGP_S2K() { delete hash; } + private: + OctetString derive(u32bit, const std::string&, + const byte[], u32bit, u32bit) const; + + HashFunction* hash; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/s2k/s2k.cpp b/src/libs/3rdparty/botan/src/s2k/s2k.cpp new file mode 100644 index 00000000000..b8a8ef71961 --- /dev/null +++ b/src/libs/3rdparty/botan/src/s2k/s2k.cpp @@ -0,0 +1,55 @@ +/* +* S2K +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Derive a key from a passphrase +*/ +OctetString S2K::derive_key(u32bit key_len, + const std::string& passphrase) const + { + return derive(key_len, passphrase, salt, salt.size(), iterations()); + } + +/* +* Set the number of iterations +*/ +void S2K::set_iterations(u32bit i) + { + iter = i; + } + +/* +* Change the salt +*/ +void S2K::change_salt(const byte new_salt[], u32bit length) + { + salt.set(new_salt, length); + } + +/* +* Change the salt +*/ +void S2K::change_salt(const MemoryRegion& new_salt) + { + change_salt(new_salt.begin(), new_salt.size()); + } + +/* +* Create a new random salt +*/ +void S2K::new_random_salt(RandomNumberGenerator& rng, + u32bit length) + { + salt.create(length); + rng.randomize(salt, length); + } + +} diff --git a/src/libs/3rdparty/botan/src/s2k/s2k.h b/src/libs/3rdparty/botan/src/s2k/s2k.h new file mode 100644 index 00000000000..7af92519bbc --- /dev/null +++ b/src/libs/3rdparty/botan/src/s2k/s2k.h @@ -0,0 +1,102 @@ +/* +* S2K +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_S2K_H__ +#define BOTAN_S2K_H__ + +#include +#include + +namespace Botan { + +/* +* S2K Interface +*/ +class BOTAN_DLL S2K + { + public: + /** + * Create a copy of this object. + * @return an auto_ptr to a copy of this object + */ + virtual S2K* clone() const = 0; + + /** + * Get the algorithm name. + * @return the name of this S2K algorithm + */ + virtual std::string name() const = 0; + + /** + * Clear this objects internal values. + */ + virtual void clear() {} + + /** + * Derive a key from a passphrase with this S2K object. It will use + * the salt value and number of iterations configured in this object. + * @param key_len the desired length of the key to produce + * @param passphrase the password to derive the key from + */ + OctetString derive_key(u32bit key_len, + const std::string& passphrase) const; + + /** + * Set the number of iterations for the one-way function during + * key generation. + * @param n the desired number of iterations + */ + void set_iterations(u32bit n); + + /** + * Set a new salt value. + * @param new_salt a byte array defining the new salt value + * @param len the length of the above byte array + */ + void change_salt(const byte new_salt[], u32bit len); + + /** + * Set a new salt value. + * @param new_salt the new salt value + */ + void change_salt(const MemoryRegion& new_salt); + + /** + * Create a new random salt value using the rng + * @param rng the random number generator to use + * @param len the desired length of the new salt value + */ + void new_random_salt(RandomNumberGenerator& rng, u32bit len); + + /** + * Get the number of iterations for the key derivation currently + * configured in this S2K object. + * @return the current number of iterations + */ + u32bit iterations() const { return iter; } + + /** + * Get the currently configured salt value of this S2K object. + * @return the current salt value + */ + SecureVector current_salt() const { return salt; } + + S2K() { iter = 0; } + virtual ~S2K() {} + private: + S2K(const S2K&) {} + S2K& operator=(const S2K&) { return (*this); } + + virtual OctetString derive(u32bit, const std::string&, + const byte[], u32bit, u32bit) const = 0; + SecureVector salt; + u32bit iter; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/selftest/info.txt b/src/libs/3rdparty/botan/src/selftest/info.txt new file mode 100644 index 00000000000..323a610a6d0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/selftest/info.txt @@ -0,0 +1,21 @@ +realname "Selftests" + +define SELFTESTS + +load_on auto + + +selftest.cpp +selftest.h + + + +algo_factory +cbc +cfb +ctr +ecb +filters +hmac +ofb + diff --git a/src/libs/3rdparty/botan/src/selftest/selftest.cpp b/src/libs/3rdparty/botan/src/selftest/selftest.cpp new file mode 100644 index 00000000000..d644e866e28 --- /dev/null +++ b/src/libs/3rdparty/botan/src/selftest/selftest.cpp @@ -0,0 +1,184 @@ +/* +* Startup Self Tests +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Perform a Known Answer Test +*/ +void do_kat(const std::string& in, const std::string& out, + const std::string& algo_name, Filter* filter) + { + if(out.length()) + { + Pipe pipe(new Hex_Decoder, filter, new Hex_Encoder); + pipe.process_msg(in); + + if(out != pipe.read_all_as_string()) + throw Self_Test_Failure(algo_name + " startup test"); + } + } + +/* +* Perform a KAT for a cipher +*/ +void cipher_kat(const BlockCipher* proto, + const std::string& key_str, + const std::string& iv_str, + const std::string& in, + const std::string& ecb_out, + const std::string& cbc_out, + const std::string& cfb_out, + const std::string& ofb_out, + const std::string& ctr_out) + { + SymmetricKey key(key_str); + InitializationVector iv(iv_str); + + std::string name = proto->name(); + + do_kat(in, ecb_out, name + "/ECB", + new ECB_Encryption(proto->clone(), new Null_Padding, key)); + do_kat(ecb_out, in, name + "/ECB", + new ECB_Decryption(proto->clone(), new Null_Padding, key)); + + do_kat(in, cbc_out, name + "/CBC", + new CBC_Encryption(proto->clone(), new Null_Padding, key, iv)); + do_kat(cbc_out, in, name + "/CBC", + new CBC_Decryption(proto->clone(), new Null_Padding, key, iv)); + + do_kat(in, cfb_out, name + "/CFB", + new CFB_Encryption(proto->clone(), key, iv)); + do_kat(cfb_out, in, name + "/CFB", + new CFB_Decryption(proto->clone(), key, iv)); + + do_kat(in, ofb_out, name + "/OFB", new OFB(proto->clone(), key, iv)); + + do_kat(in, ctr_out, name + "/CTR-BE", + new CTR_BE(proto->clone(), key, iv)); + } + +} + +/* +* Perform Self Tests +*/ +bool passes_self_tests(Algorithm_Factory& af) + { + try + { + if(const BlockCipher* proto = af.prototype_block_cipher("DES")) + { + cipher_kat(proto, + "0123456789ABCDEF", "1234567890ABCDEF", + "4E6F77206973207468652074696D6520666F7220616C6C20", + "3FA40E8A984D48156A271787AB8883F9893D51EC4B563B53", + "E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F6", + "F3096249C7F46E51A69E839B1A92F78403467133898EA622", + "F3096249C7F46E5135F24A242EEB3D3F3D6D5BE3255AF8C3", + "F3096249C7F46E51163A8CA0FFC94C27FA2F80F480B86F75"); + } + + if(const BlockCipher* proto = af.prototype_block_cipher("TripleDES")) + { + cipher_kat(proto, + "385D7189A5C3D485E1370AA5D408082B5CCCCB5E19F2D90E", + "C141B5FCCD28DC8A", + "6E1BD7C6120947A464A6AAB293A0F89A563D8D40D3461B68", + "64EAAD4ACBB9CEAD6C7615E7C7E4792FE587D91F20C7D2F4", + "6235A461AFD312973E3B4F7AA7D23E34E03371F8E8C376C9", + "E26BA806A59B0330DE40CA38E77A3E494BE2B212F6DD624B", + "E26BA806A59B03307DE2BCC25A08BA40A8BA335F5D604C62", + "E26BA806A59B03303C62C2EFF32D3ACDD5D5F35EBCC53371"); + } + + if(const BlockCipher* proto = af.prototype_block_cipher("AES")) + { + cipher_kat(proto, + "2B7E151628AED2A6ABF7158809CF4F3C", + "000102030405060708090A0B0C0D0E0F", + "6BC1BEE22E409F96E93D7E117393172A" + "AE2D8A571E03AC9C9EB76FAC45AF8E51", + "3AD77BB40D7A3660A89ECAF32466EF97" + "F5D3D58503B9699DE785895A96FDBAAF", + "7649ABAC8119B246CEE98E9B12E9197D" + "5086CB9B507219EE95DB113A917678B2", + "3B3FD92EB72DAD20333449F8E83CFB4A" + "C8A64537A0B3A93FCDE3CDAD9F1CE58B", + "3B3FD92EB72DAD20333449F8E83CFB4A" + "7789508D16918F03F53C52DAC54ED825", + "3B3FD92EB72DAD20333449F8E83CFB4A" + "010C041999E03F36448624483E582D0E"); + } + + if(const HashFunction* proto = af.prototype_hash_function("SHA-1")) + { + do_kat("", "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709", + proto->name(), new Hash_Filter(proto->clone())); + + do_kat("616263", "A9993E364706816ABA3E25717850C26C9CD0D89D", + proto->name(), new Hash_Filter(proto->clone())); + + do_kat("6162636462636465636465666465666765666768666768696768696A" + "68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071", + "84983E441C3BD26EBAAE4AA1F95129E5E54670F1", + proto->name(), new Hash_Filter(proto->clone())); + + do_kat("4869205468657265", + "B617318655057264E28BC0B6FB378C8EF146BE00", + "HMAC(" + proto->name() + ")", + new MAC_Filter(new HMAC(proto->clone()), + SymmetricKey("0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B"))); + } + + if(const HashFunction* proto = af.prototype_hash_function("SHA-256")) + { + do_kat("", + "E3B0C44298FC1C149AFBF4C8996FB924" + "27AE41E4649B934CA495991B7852B855", + proto->name(), new Hash_Filter(proto->clone())); + + do_kat("616263", + "BA7816BF8F01CFEA414140DE5DAE2223" + "B00361A396177A9CB410FF61F20015AD", + proto->name(), new Hash_Filter(proto->clone())); + + do_kat("6162636462636465636465666465666765666768666768696768696A" + "68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071", + "248D6A61D20638B8E5C026930C3E6039" + "A33CE45964FF2167F6ECEDD419DB06C1", + proto->name(), new Hash_Filter(proto->clone())); + + do_kat("4869205468657265", + "198A607EB44BFBC69903A0F1CF2BBDC5" + "BA0AA3F3D9AE3C1C7A3B1696A0B68CF7", + "HMAC(" + proto->name() + ")", + new MAC_Filter(new HMAC(proto->clone()), + SymmetricKey("0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B" + "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B"))); + } + } + catch(std::exception) + { + return false; + } + + return true; + } + +} diff --git a/src/libs/3rdparty/botan/src/selftest/selftest.h b/src/libs/3rdparty/botan/src/selftest/selftest.h new file mode 100644 index 00000000000..9e36d2298a1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/selftest/selftest.h @@ -0,0 +1,22 @@ +/* +* Startup Self Test +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SELF_TESTS_H__ +#define BOTAN_SELF_TESTS_H__ + +#include + +namespace Botan { + +/* +* Self Tests +*/ +BOTAN_DLL bool passes_self_tests(Algorithm_Factory& af); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/stream/arc4/arc4.cpp b/src/libs/3rdparty/botan/src/stream/arc4/arc4.cpp new file mode 100644 index 00000000000..0f78f7362be --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/arc4/arc4.cpp @@ -0,0 +1,105 @@ +/* +* ARC4 +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Combine cipher stream with message +*/ +void ARC4::cipher(const byte in[], byte out[], u32bit length) + { + while(length >= buffer.size() - position) + { + xor_buf(out, in, buffer.begin() + position, buffer.size() - position); + length -= (buffer.size() - position); + in += (buffer.size() - position); + out += (buffer.size() - position); + generate(); + } + xor_buf(out, in, buffer.begin() + position, length); + position += length; + } + +/* +* Generate cipher stream +*/ +void ARC4::generate() + { + u32bit SX, SY; + for(u32bit j = 0; j != buffer.size(); j += 4) + { + SX = state[X+1]; Y = (Y + SX) % 256; SY = state[Y]; + state[X+1] = SY; state[Y] = SX; + buffer[j] = state[(SX + SY) % 256]; + + SX = state[X+2]; Y = (Y + SX) % 256; SY = state[Y]; + state[X+2] = SY; state[Y] = SX; + buffer[j+1] = state[(SX + SY) % 256]; + + SX = state[X+3]; Y = (Y + SX) % 256; SY = state[Y]; + state[X+3] = SY; state[Y] = SX; + buffer[j+2] = state[(SX + SY) % 256]; + + X = (X + 4) % 256; + SX = state[X]; Y = (Y + SX) % 256; SY = state[Y]; + state[X] = SY; state[Y] = SX; + buffer[j+3] = state[(SX + SY) % 256]; + } + position = 0; + } + +/* +* ARC4 Key Schedule +*/ +void ARC4::key_schedule(const byte key[], u32bit length) + { + clear(); + for(u32bit j = 0; j != 256; ++j) + state[j] = j; + for(u32bit j = 0, state_index = 0; j != 256; ++j) + { + state_index = (state_index + key[j % length] + state[j]) % 256; + std::swap(state[j], state[state_index]); + } + for(u32bit j = 0; j <= SKIP; j += buffer.size()) + generate(); + position += (SKIP % buffer.size()); + } + +/* +* Return the name of this type +*/ +std::string ARC4::name() const + { + if(SKIP == 0) return "ARC4"; + if(SKIP == 256) return "MARK-4"; + else return "RC4_skip(" + to_string(SKIP) + ")"; + } + +/* +* Clear memory of sensitive data +*/ +void ARC4::clear() throw() + { + state.clear(); + buffer.clear(); + position = X = Y = 0; + } + +/* +* ARC4 Constructor +*/ +ARC4::ARC4(u32bit s) : StreamCipher(1, 256), SKIP(s) + { + clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/stream/arc4/arc4.h b/src/libs/3rdparty/botan/src/stream/arc4/arc4.h new file mode 100644 index 00000000000..aa2cea7fea5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/arc4/arc4.h @@ -0,0 +1,41 @@ +/* +* ARC4 +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_ARC4_H__ +#define BOTAN_ARC4_H__ + +#include +#include + +namespace Botan { + +/* +* ARC4 +*/ +class BOTAN_DLL ARC4 : public StreamCipher + { + public: + void clear() throw(); + std::string name() const; + StreamCipher* clone() const { return new ARC4(SKIP); } + ARC4(u32bit = 0); + ~ARC4() { clear(); } + private: + void cipher(const byte[], byte[], u32bit); + void key_schedule(const byte[], u32bit); + void generate(); + + const u32bit SKIP; + + SecureBuffer buffer; + SecureBuffer state; + u32bit X, Y, position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/stream/arc4/info.txt b/src/libs/3rdparty/botan/src/stream/arc4/info.txt new file mode 100644 index 00000000000..e4689cf6985 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/arc4/info.txt @@ -0,0 +1,14 @@ +realname "ARC4" + +define ARC4 + +load_on auto + + +stream + + + +arc4.cpp +arc4.h + diff --git a/src/libs/3rdparty/botan/src/stream/info.txt b/src/libs/3rdparty/botan/src/stream/info.txt new file mode 100644 index 00000000000..295c7370829 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/info.txt @@ -0,0 +1,14 @@ +realname "Stream Ciphers" + +load_on auto + +define STREAM_CIPHER + + +stream_cipher.h +stream_cipher.cpp + + + +sym_algo + diff --git a/src/libs/3rdparty/botan/src/stream/salsa20/info.txt b/src/libs/3rdparty/botan/src/stream/salsa20/info.txt new file mode 100644 index 00000000000..db938307b97 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/salsa20/info.txt @@ -0,0 +1,14 @@ +realname "Salsa20" + +define SALSA20 + +load_on auto + + +stream + + + +salsa20.cpp +salsa20.h + diff --git a/src/libs/3rdparty/botan/src/stream/salsa20/salsa20.cpp b/src/libs/3rdparty/botan/src/stream/salsa20/salsa20.cpp new file mode 100644 index 00000000000..75137798ca1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/salsa20/salsa20.cpp @@ -0,0 +1,217 @@ +/* +* Salsa20 +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Generate Salsa20 cipher stream +*/ +void salsa20(byte output[64], const u32bit input[16]) + { + u32bit x00 = input[0]; + u32bit x01 = input[1]; + u32bit x02 = input[2]; + u32bit x03 = input[3]; + u32bit x04 = input[4]; + u32bit x05 = input[5]; + u32bit x06 = input[6]; + u32bit x07 = input[7]; + u32bit x08 = input[8]; + u32bit x09 = input[9]; + u32bit x10 = input[10]; + u32bit x11 = input[11]; + u32bit x12 = input[12]; + u32bit x13 = input[13]; + u32bit x14 = input[14]; + u32bit x15 = input[15]; + + for(u32bit i = 0; i != 10; ++i) + { + x04 ^= rotate_left(x00 + x12, 7); + x08 ^= rotate_left(x04 + x00, 9); + x12 ^= rotate_left(x08 + x04, 13); + x00 ^= rotate_left(x12 + x08, 18); + x09 ^= rotate_left(x05 + x01, 7); + x13 ^= rotate_left(x09 + x05, 9); + x01 ^= rotate_left(x13 + x09, 13); + x05 ^= rotate_left(x01 + x13, 18); + x14 ^= rotate_left(x10 + x06, 7); + x02 ^= rotate_left(x14 + x10, 9); + x06 ^= rotate_left(x02 + x14, 13); + x10 ^= rotate_left(x06 + x02, 18); + x03 ^= rotate_left(x15 + x11, 7); + x07 ^= rotate_left(x03 + x15, 9); + x11 ^= rotate_left(x07 + x03, 13); + x15 ^= rotate_left(x11 + x07, 18); + + x01 ^= rotate_left(x00 + x03, 7); + x02 ^= rotate_left(x01 + x00, 9); + x03 ^= rotate_left(x02 + x01, 13); + x00 ^= rotate_left(x03 + x02, 18); + x06 ^= rotate_left(x05 + x04, 7); + x07 ^= rotate_left(x06 + x05, 9); + x04 ^= rotate_left(x07 + x06, 13); + x05 ^= rotate_left(x04 + x07, 18); + x11 ^= rotate_left(x10 + x09, 7); + x08 ^= rotate_left(x11 + x10, 9); + x09 ^= rotate_left(x08 + x11, 13); + x10 ^= rotate_left(x09 + x08, 18); + x12 ^= rotate_left(x15 + x14, 7); + x13 ^= rotate_left(x12 + x15, 9); + x14 ^= rotate_left(x13 + x12, 13); + x15 ^= rotate_left(x14 + x13, 18); + } + + store_le(x00 + input[ 0], output + 4 * 0); + store_le(x01 + input[ 1], output + 4 * 1); + store_le(x02 + input[ 2], output + 4 * 2); + store_le(x03 + input[ 3], output + 4 * 3); + store_le(x04 + input[ 4], output + 4 * 4); + store_le(x05 + input[ 5], output + 4 * 5); + store_le(x06 + input[ 6], output + 4 * 6); + store_le(x07 + input[ 7], output + 4 * 7); + store_le(x08 + input[ 8], output + 4 * 8); + store_le(x09 + input[ 9], output + 4 * 9); + store_le(x10 + input[10], output + 4 * 10); + store_le(x11 + input[11], output + 4 * 11); + store_le(x12 + input[12], output + 4 * 12); + store_le(x13 + input[13], output + 4 * 13); + store_le(x14 + input[14], output + 4 * 14); + store_le(x15 + input[15], output + 4 * 15); + } + +} + +/* +* Combine cipher stream with message +*/ +void Salsa20::cipher(const byte in[], byte out[], u32bit length) + { + while(length >= buffer.size() - position) + { + xor_buf(out, in, buffer.begin() + position, buffer.size() - position); + length -= (buffer.size() - position); + in += (buffer.size() - position); + out += (buffer.size() - position); + salsa20(buffer.begin(), state); + + ++state[8]; + if(!state[8]) // if overflow in state[8] + ++state[9]; // carry to state[9] + + position = 0; + } + + xor_buf(out, in, buffer.begin() + position, length); + + position += length; + } + +/* +* Salsa20 Key Schedule +*/ +void Salsa20::key_schedule(const byte key[], u32bit length) + { + static const u32bit TAU[] = + { 0x61707865, 0x3120646e, 0x79622d36, 0x6b206574 }; + + static const u32bit SIGMA[] = + { 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 }; + + clear(); + + if(length == 16) + { + state[0] = TAU[0]; + state[1] = load_le(key, 0); + state[2] = load_le(key, 1); + state[3] = load_le(key, 2); + state[4] = load_le(key, 3); + state[5] = TAU[1]; + state[10] = TAU[2]; + state[11] = load_le(key, 0); + state[12] = load_le(key, 1); + state[13] = load_le(key, 2); + state[14] = load_le(key, 3); + state[15] = TAU[3]; + } + else if(length == 32) + { + state[0] = SIGMA[0]; + state[1] = load_le(key, 0); + state[2] = load_le(key, 1); + state[3] = load_le(key, 2); + state[4] = load_le(key, 3); + state[5] = SIGMA[1]; + state[10] = SIGMA[2]; + state[11] = load_le(key, 4); + state[12] = load_le(key, 5); + state[13] = load_le(key, 6); + state[14] = load_le(key, 7); + state[15] = SIGMA[3]; + } + + const byte ZERO[8] = { 0 }; + resync(ZERO, sizeof(ZERO)); + } + +/* +* Return the name of this type +*/ +void Salsa20::resync(const byte iv[], u32bit length) + { + if(length != IV_LENGTH) + throw Invalid_IV_Length(name(), length); + + state[6] = load_le(iv, 0); + state[7] = load_le(iv, 1); + state[8] = 0; + state[9] = 0; + + salsa20(buffer.begin(), state); + ++state[8]; + if(!state[8]) // if overflow in state[8] + ++state[9]; // carry to state[9] + + position = 0; + } + +/* +* Return the name of this type +*/ +std::string Salsa20::name() const + { + return "Salsa20"; + } + +/* +* Clear memory of sensitive data +*/ +void Salsa20::clear() throw() + { + state.clear(); + buffer.clear(); + position = 0; + } + +/* +* Salsa20 Constructor +*/ +Salsa20::Salsa20() : StreamCipher(16, 32, 16, 8) + { + clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/stream/salsa20/salsa20.h b/src/libs/3rdparty/botan/src/stream/salsa20/salsa20.h new file mode 100644 index 00000000000..3dbfddb50b4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/salsa20/salsa20.h @@ -0,0 +1,41 @@ +/* +* Salsa20 +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SALSA20_H__ +#define BOTAN_SALSA20_H__ + +#include + +namespace Botan { + +/* +* Salsa20 +*/ +class BOTAN_DLL Salsa20 : public StreamCipher + { + public: + void clear() throw(); + std::string name() const; + StreamCipher* clone() const { return new Salsa20; } + + void resync(const byte[], u32bit); + + Salsa20(); + ~Salsa20() { clear(); } + private: + void cipher(const byte[], byte[], u32bit); + void key_schedule(const byte[], u32bit); + + SecureBuffer state; + + SecureBuffer buffer; + u32bit position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/stream/stream_cipher.cpp b/src/libs/3rdparty/botan/src/stream/stream_cipher.cpp new file mode 100644 index 00000000000..68bb5d4f082 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/stream_cipher.cpp @@ -0,0 +1,30 @@ +/** +* Stream Cipher Default Implementation for IV and Seek +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Default StreamCipher Resync Operation +*/ +void StreamCipher::resync(const byte[], u32bit length) + { + if(length) + throw Exception("The stream cipher " + name() + + " does not support resyncronization"); + } + +/* +* Default StreamCipher Seek Operation +*/ +void StreamCipher::seek(u32bit) + { + throw Exception("The stream cipher " + name() + " does not support seek()"); + } + +} diff --git a/src/libs/3rdparty/botan/src/stream/stream_cipher.h b/src/libs/3rdparty/botan/src/stream/stream_cipher.h new file mode 100644 index 00000000000..8ea35913108 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/stream_cipher.h @@ -0,0 +1,92 @@ +/** +* Stream Cipher +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_STREAM_CIPHER_H__ +#define BOTAN_STREAM_CIPHER_H__ + +#include + +namespace Botan { + +/* +* Stream Cipher +*/ +class BOTAN_DLL StreamCipher : public SymmetricAlgorithm + { + public: + const u32bit IV_LENGTH; + + /** + * Encrypt a message. + * @param i the plaintext + * @param o the byte array to hold the output, i.e. the ciphertext + * @param len the length of both i and o + */ + void encrypt(const byte i[], byte o[], u32bit len) { cipher(i, o, len); } + + /** + * Decrypt a message. + * @param i the ciphertext to decrypt + * @param o the byte array to hold the output, i.e. the plaintext + * @param len the length of both i and o + */ + void decrypt(const byte i[], byte o[], u32bit len) { cipher(i, o, len); } + + /** + * Encrypt a message. + * @param in the plaintext as input, after the function has + * returned it will hold the ciphertext + + * @param len the length of in + */ + void encrypt(byte in[], u32bit len) { cipher(in, in, len); } + + /** + * Decrypt a message. + * @param in the ciphertext as input, after the function has + * returned it will hold the plaintext + * @param len the length of in + */ + void decrypt(byte in[], u32bit len) { cipher(in, in, len); } + + /** + * Resync the cipher using the IV + * @param iv the initialization vector + * @param iv_len the length of the IV in bytes + */ + virtual void resync(const byte iv[], u32bit iv_len); + + /** + * Seek ahead in the stream. + * @param len the length to seek ahead. + */ + virtual void seek(u32bit len); + + /** + * Get a new object representing the same algorithm as *this + */ + virtual StreamCipher* clone() const = 0; + + /** + * Zeroize internal state + */ + virtual void clear() throw() = 0; + + StreamCipher(u32bit key_min, u32bit key_max = 0, + u32bit key_mod = 1, + u32bit iv_len = 0) : + SymmetricAlgorithm(key_min, key_max, key_mod), + IV_LENGTH(iv_len) {} + + virtual ~StreamCipher() {} + private: + virtual void cipher(const byte[], byte[], u32bit) = 0; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/stream/turing/info.txt b/src/libs/3rdparty/botan/src/stream/turing/info.txt new file mode 100644 index 00000000000..c251a0a3046 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/turing/info.txt @@ -0,0 +1,15 @@ +realname "Turing" + +define TURING + +load_on auto + + +stream + + + +tur_tab.cpp +turing.cpp +turing.h + diff --git a/src/libs/3rdparty/botan/src/stream/turing/tur_tab.cpp b/src/libs/3rdparty/botan/src/stream/turing/tur_tab.cpp new file mode 100644 index 00000000000..a2edd5a5e30 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/turing/tur_tab.cpp @@ -0,0 +1,81 @@ +/* +* Tables for Turing +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +const byte Turing::SBOX[256] = { + 0x61, 0x51, 0xEB, 0x19, 0xB9, 0x5D, 0x60, 0x38, 0x7C, 0xB2, 0x06, 0x12, + 0xC4, 0x5B, 0x16, 0x3B, 0x2B, 0x18, 0x83, 0xB0, 0x7F, 0x75, 0xFA, 0xA0, + 0xE9, 0xDD, 0x6D, 0x7A, 0x6B, 0x68, 0x2D, 0x49, 0xB5, 0x1C, 0x90, 0xF7, + 0xED, 0x9F, 0xE8, 0xCE, 0xAE, 0x77, 0xC2, 0x13, 0xFD, 0xCD, 0x3E, 0xCF, + 0x37, 0x6A, 0xD4, 0xDB, 0x8E, 0x65, 0x1F, 0x1A, 0x87, 0xCB, 0x40, 0x15, + 0x88, 0x0D, 0x35, 0xB3, 0x11, 0x0F, 0xD0, 0x30, 0x48, 0xF9, 0xA8, 0xAC, + 0x85, 0x27, 0x0E, 0x8A, 0xE0, 0x50, 0x64, 0xA7, 0xCC, 0xE4, 0xF1, 0x98, + 0xFF, 0xA1, 0x04, 0xDA, 0xD5, 0xBC, 0x1B, 0xBB, 0xD1, 0xFE, 0x31, 0xCA, + 0xBA, 0xD9, 0x2E, 0xF3, 0x1D, 0x47, 0x4A, 0x3D, 0x71, 0x4C, 0xAB, 0x7D, + 0x8D, 0xC7, 0x59, 0xB8, 0xC1, 0x96, 0x1E, 0xFC, 0x44, 0xC8, 0x7B, 0xDC, + 0x5C, 0x78, 0x2A, 0x9D, 0xA5, 0xF0, 0x73, 0x22, 0x89, 0x05, 0xF4, 0x07, + 0x21, 0x52, 0xA6, 0x28, 0x9A, 0x92, 0x69, 0x8F, 0xC5, 0xC3, 0xF5, 0xE1, + 0xDE, 0xEC, 0x09, 0xF2, 0xD3, 0xAF, 0x34, 0x23, 0xAA, 0xDF, 0x7E, 0x82, + 0x29, 0xC0, 0x24, 0x14, 0x03, 0x32, 0x4E, 0x39, 0x6F, 0xC6, 0xB1, 0x9B, + 0xEA, 0x72, 0x79, 0x41, 0xD8, 0x26, 0x6C, 0x5E, 0x2C, 0xB4, 0xA2, 0x53, + 0x57, 0xE2, 0x9C, 0x86, 0x54, 0x95, 0xB6, 0x80, 0x8C, 0x36, 0x67, 0xBD, + 0x08, 0x93, 0x2F, 0x99, 0x5A, 0xF8, 0x3A, 0xD7, 0x56, 0x84, 0xD2, 0x01, + 0xF6, 0x66, 0x4D, 0x55, 0x8B, 0x0C, 0x0B, 0x46, 0xB7, 0x3C, 0x45, 0x91, + 0xA4, 0xE3, 0x70, 0xD6, 0xFB, 0xE6, 0x10, 0xA9, 0xC9, 0x00, 0x9E, 0xE7, + 0x4F, 0x76, 0x25, 0x3F, 0x5F, 0xA3, 0x33, 0x20, 0x02, 0xEF, 0x62, 0x74, + 0xEE, 0x17, 0x81, 0x42, 0x58, 0x0A, 0x4B, 0x63, 0xE5, 0xBE, 0x6E, 0xAD, + 0xBF, 0x43, 0x94, 0x97 }; + +const u32bit Turing::Q_BOX[256] = { + 0x1FAA1887, 0x4E5E435C, 0x9165C042, 0x250E6EF4, 0x5957EE20, 0xD484FED3, + 0xA666C502, 0x7E54E8AE, 0xD12EE9D9, 0xFC1F38D4, 0x49829B5D, 0x1B5CDF3C, + 0x74864249, 0xDA2E3963, 0x28F4429F, 0xC8432C35, 0x4AF40325, 0x9FC0DD70, + 0xD8973DED, 0x1A02DC5E, 0xCD175B42, 0xF10012BF, 0x6694D78C, 0xACAAB26B, + 0x4EC11B9A, 0x3F168146, 0xC0EA8EC5, 0xB38AC28F, 0x1FED5C0F, 0xAAB4101C, + 0xEA2DB082, 0x470929E1, 0xE71843DE, 0x508299FC, 0xE72FBC4B, 0x2E3915DD, + 0x9FA803FA, 0x9546B2DE, 0x3C233342, 0x0FCEE7C3, 0x24D607EF, 0x8F97EBAB, + 0xF37F859B, 0xCD1F2E2F, 0xC25B71DA, 0x75E2269A, 0x1E39C3D1, 0xEDA56B36, + 0xF8C9DEF2, 0x46C9FC5F, 0x1827B3A3, 0x70A56DDF, 0x0D25B510, 0x000F85A7, + 0xB2E82E71, 0x68CB8816, 0x8F951E2A, 0x72F5F6AF, 0xE4CBC2B3, 0xD34FF55D, + 0x2E6B6214, 0x220B83E3, 0xD39EA6F5, 0x6FE041AF, 0x6B2F1F17, 0xAD3B99EE, + 0x16A65EC0, 0x757016C6, 0xBA7709A4, 0xB0326E01, 0xF4B280D9, 0x4BFB1418, + 0xD6AFF227, 0xFD548203, 0xF56B9D96, 0x6717A8C0, 0x00D5BF6E, 0x10EE7888, + 0xEDFCFE64, 0x1BA193CD, 0x4B0D0184, 0x89AE4930, 0x1C014F36, 0x82A87088, + 0x5EAD6C2A, 0xEF22C678, 0x31204DE7, 0xC9C2E759, 0xD200248E, 0x303B446B, + 0xB00D9FC2, 0x9914A895, 0x906CC3A1, 0x54FEF170, 0x34C19155, 0xE27B8A66, + 0x131B5E69, 0xC3A8623E, 0x27BDFA35, 0x97F068CC, 0xCA3A6ACD, 0x4B55E936, + 0x86602DB9, 0x51DF13C1, 0x390BB16D, 0x5A80B83C, 0x22B23763, 0x39D8A911, + 0x2CB6BC13, 0xBF5579D7, 0x6C5C2FA8, 0xA8F4196E, 0xBCDB5476, 0x6864A866, + 0x416E16AD, 0x897FC515, 0x956FEB3C, 0xF6C8A306, 0x216799D9, 0x171A9133, + 0x6C2466DD, 0x75EB5DCD, 0xDF118F50, 0xE4AFB226, 0x26B9CEF3, 0xADB36189, + 0x8A7A19B1, 0xE2C73084, 0xF77DED5C, 0x8B8BC58F, 0x06DDE421, 0xB41E47FB, + 0xB1CC715E, 0x68C0FF99, 0x5D122F0F, 0xA4D25184, 0x097A5E6C, 0x0CBF18BC, + 0xC2D7C6E0, 0x8BB7E420, 0xA11F523F, 0x35D9B8A2, 0x03DA1A6B, 0x06888C02, + 0x7DD1E354, 0x6BBA7D79, 0x32CC7753, 0xE52D9655, 0xA9829DA1, 0x301590A7, + 0x9BC1C149, 0x13537F1C, 0xD3779B69, 0x2D71F2B7, 0x183C58FA, 0xACDC4418, + 0x8D8C8C76, 0x2620D9F0, 0x71A80D4D, 0x7A74C473, 0x449410E9, 0xA20E4211, + 0xF9C8082B, 0x0A6B334A, 0xB5F68ED2, 0x8243CC1B, 0x453C0FF3, 0x9BE564A0, + 0x4FF55A4F, 0x8740F8E7, 0xCCA7F15F, 0xE300FE21, 0x786D37D6, 0xDFD506F1, + 0x8EE00973, 0x17BBDE36, 0x7A670FA8, 0x5C31AB9E, 0xD4DAB618, 0xCC1F52F5, + 0xE358EB4F, 0x19B9E343, 0x3A8D77DD, 0xCDB93DA6, 0x140FD52D, 0x395412F8, + 0x2BA63360, 0x37E53AD0, 0x80700F1C, 0x7624ED0B, 0x703DC1EC, 0xB7366795, + 0xD6549D15, 0x66CE46D7, 0xD17ABE76, 0xA448E0A0, 0x28F07C02, 0xC31249B7, + 0x6E9ED6BA, 0xEAA47F78, 0xBBCFFFBD, 0xC507CA84, 0xE965F4DA, 0x8E9F35DA, + 0x6AD2AA44, 0x577452AC, 0xB5D674A7, 0x5461A46A, 0x6763152A, 0x9C12B7AA, + 0x12615927, 0x7B4FB118, 0xC351758D, 0x7E81687B, 0x5F52F0B3, 0x2D4254ED, + 0xD4C77271, 0x0431ACAB, 0xBEF94AEC, 0xFEE994CD, 0x9C4D9E81, 0xED623730, + 0xCF8A21E8, 0x51917F0B, 0xA7A9B5D6, 0xB297ADF8, 0xEED30431, 0x68CAC921, + 0xF1B35D46, 0x7A430A36, 0x51194022, 0x9ABCA65E, 0x85EC70BA, 0x39AEA8CC, + 0x737BAE8B, 0x582924D5, 0x03098A5A, 0x92396B81, 0x18DE2522, 0x745C1CB8, + 0xA1B8FE1D, 0x5DB3C697, 0x29164F83, 0x97C16376, 0x8419224C, 0x21203B35, + 0x833AC0FE, 0xD966A19A, 0xAAF0B24F, 0x40FDA998, 0xE7D52D71, 0x390896A8, + 0xCEE6053F, 0xD0B0D300, 0xFF99CBCC, 0x065E3D40 }; + +} diff --git a/src/libs/3rdparty/botan/src/stream/turing/turing.cpp b/src/libs/3rdparty/botan/src/stream/turing/turing.cpp new file mode 100644 index 00000000000..b988568c307 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/turing/turing.cpp @@ -0,0 +1,307 @@ +/* +* Turing +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +namespace { + +/* +* Perform an N-way PHT +*/ +inline void PHT(MemoryRegion& buf) + { + u32bit sum = 0; + for(u32bit j = 0; j < buf.size() - 1; ++j) + sum += buf[j]; + buf[buf.size()-1] += sum; + sum = buf[buf.size()-1]; + for(u32bit j = 0; j < buf.size() - 1; ++j) + buf[j] += sum; + } + +} + +/* +* Combine cipher stream with message +*/ +void Turing::cipher(const byte in[], byte out[], u32bit length) + { + while(length >= buffer.size() - position) + { + xor_buf(out, in, buffer.begin() + position, buffer.size() - position); + length -= (buffer.size() - position); + in += (buffer.size() - position); + out += (buffer.size() - position); + generate(); + } + xor_buf(out, in, buffer.begin() + position, length); + position += length; + } + +/* +* Generate cipher stream +*/ +void Turing::generate() + { + // Table for Turing's polynomial multiplication + static const u32bit MULT_TAB[256] = { + 0x00000000, 0xD02B4367, 0xED5686CE, 0x3D7DC5A9, 0x97AC41D1, 0x478702B6, + 0x7AFAC71F, 0xAAD18478, 0x631582EF, 0xB33EC188, 0x8E430421, 0x5E684746, + 0xF4B9C33E, 0x24928059, 0x19EF45F0, 0xC9C40697, 0xC62A4993, 0x16010AF4, + 0x2B7CCF5D, 0xFB578C3A, 0x51860842, 0x81AD4B25, 0xBCD08E8C, 0x6CFBCDEB, + 0xA53FCB7C, 0x7514881B, 0x48694DB2, 0x98420ED5, 0x32938AAD, 0xE2B8C9CA, + 0xDFC50C63, 0x0FEE4F04, 0xC154926B, 0x117FD10C, 0x2C0214A5, 0xFC2957C2, + 0x56F8D3BA, 0x86D390DD, 0xBBAE5574, 0x6B851613, 0xA2411084, 0x726A53E3, + 0x4F17964A, 0x9F3CD52D, 0x35ED5155, 0xE5C61232, 0xD8BBD79B, 0x089094FC, + 0x077EDBF8, 0xD755989F, 0xEA285D36, 0x3A031E51, 0x90D29A29, 0x40F9D94E, + 0x7D841CE7, 0xADAF5F80, 0x646B5917, 0xB4401A70, 0x893DDFD9, 0x59169CBE, + 0xF3C718C6, 0x23EC5BA1, 0x1E919E08, 0xCEBADD6F, 0xCFA869D6, 0x1F832AB1, + 0x22FEEF18, 0xF2D5AC7F, 0x58042807, 0x882F6B60, 0xB552AEC9, 0x6579EDAE, + 0xACBDEB39, 0x7C96A85E, 0x41EB6DF7, 0x91C02E90, 0x3B11AAE8, 0xEB3AE98F, + 0xD6472C26, 0x066C6F41, 0x09822045, 0xD9A96322, 0xE4D4A68B, 0x34FFE5EC, + 0x9E2E6194, 0x4E0522F3, 0x7378E75A, 0xA353A43D, 0x6A97A2AA, 0xBABCE1CD, + 0x87C12464, 0x57EA6703, 0xFD3BE37B, 0x2D10A01C, 0x106D65B5, 0xC04626D2, + 0x0EFCFBBD, 0xDED7B8DA, 0xE3AA7D73, 0x33813E14, 0x9950BA6C, 0x497BF90B, + 0x74063CA2, 0xA42D7FC5, 0x6DE97952, 0xBDC23A35, 0x80BFFF9C, 0x5094BCFB, + 0xFA453883, 0x2A6E7BE4, 0x1713BE4D, 0xC738FD2A, 0xC8D6B22E, 0x18FDF149, + 0x258034E0, 0xF5AB7787, 0x5F7AF3FF, 0x8F51B098, 0xB22C7531, 0x62073656, + 0xABC330C1, 0x7BE873A6, 0x4695B60F, 0x96BEF568, 0x3C6F7110, 0xEC443277, + 0xD139F7DE, 0x0112B4B9, 0xD31DD2E1, 0x03369186, 0x3E4B542F, 0xEE601748, + 0x44B19330, 0x949AD057, 0xA9E715FE, 0x79CC5699, 0xB008500E, 0x60231369, + 0x5D5ED6C0, 0x8D7595A7, 0x27A411DF, 0xF78F52B8, 0xCAF29711, 0x1AD9D476, + 0x15379B72, 0xC51CD815, 0xF8611DBC, 0x284A5EDB, 0x829BDAA3, 0x52B099C4, + 0x6FCD5C6D, 0xBFE61F0A, 0x7622199D, 0xA6095AFA, 0x9B749F53, 0x4B5FDC34, + 0xE18E584C, 0x31A51B2B, 0x0CD8DE82, 0xDCF39DE5, 0x1249408A, 0xC26203ED, + 0xFF1FC644, 0x2F348523, 0x85E5015B, 0x55CE423C, 0x68B38795, 0xB898C4F2, + 0x715CC265, 0xA1778102, 0x9C0A44AB, 0x4C2107CC, 0xE6F083B4, 0x36DBC0D3, + 0x0BA6057A, 0xDB8D461D, 0xD4630919, 0x04484A7E, 0x39358FD7, 0xE91ECCB0, + 0x43CF48C8, 0x93E40BAF, 0xAE99CE06, 0x7EB28D61, 0xB7768BF6, 0x675DC891, + 0x5A200D38, 0x8A0B4E5F, 0x20DACA27, 0xF0F18940, 0xCD8C4CE9, 0x1DA70F8E, + 0x1CB5BB37, 0xCC9EF850, 0xF1E33DF9, 0x21C87E9E, 0x8B19FAE6, 0x5B32B981, + 0x664F7C28, 0xB6643F4F, 0x7FA039D8, 0xAF8B7ABF, 0x92F6BF16, 0x42DDFC71, + 0xE80C7809, 0x38273B6E, 0x055AFEC7, 0xD571BDA0, 0xDA9FF2A4, 0x0AB4B1C3, + 0x37C9746A, 0xE7E2370D, 0x4D33B375, 0x9D18F012, 0xA06535BB, 0x704E76DC, + 0xB98A704B, 0x69A1332C, 0x54DCF685, 0x84F7B5E2, 0x2E26319A, 0xFE0D72FD, + 0xC370B754, 0x135BF433, 0xDDE1295C, 0x0DCA6A3B, 0x30B7AF92, 0xE09CECF5, + 0x4A4D688D, 0x9A662BEA, 0xA71BEE43, 0x7730AD24, 0xBEF4ABB3, 0x6EDFE8D4, + 0x53A22D7D, 0x83896E1A, 0x2958EA62, 0xF973A905, 0xC40E6CAC, 0x14252FCB, + 0x1BCB60CF, 0xCBE023A8, 0xF69DE601, 0x26B6A566, 0x8C67211E, 0x5C4C6279, + 0x6131A7D0, 0xB11AE4B7, 0x78DEE220, 0xA8F5A147, 0x958864EE, 0x45A32789, + 0xEF72A3F1, 0x3F59E096, 0x0224253F, 0xD20F6658 }; + + /* + I tried an implementation without precomputed LFSR offsets, since + I thought that might allow (especially on x86-64) the use of leal to + compute all the offsets.. However on my Core2 with GCC 4.3 it + turned out significantly slower (238 Mib/s, versus 300 Mib/s + with precomputed offsets) + + I also tried using byte vs u32bit for the offset variable (since + x86 memory addressing modes can be odd), but it made things even + slower (186 Mib/s) + */ + static const byte OFFSETS[221] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 14, 15, 16, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 2, 3, 4, + 10, 11, 12, 13, 14, 15, 16, 0, 1, 5, 7, 8, 9, + 15, 16, 0, 1, 2, 3, 4, 5, 6, 10, 12, 13, 14, + 3, 4, 5, 6, 7, 8, 9, 10, 11, 15, 0, 1, 2, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 3, 5, 6, 7, + 13, 14, 15, 16, 0, 1, 2, 3, 4, 8, 10, 11, 12, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 15, 16, 0, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 1, 3, 4, 5, + 11, 12, 13, 14, 15, 16, 0, 1, 2, 6, 8, 9, 10, + 16, 0, 1, 2, 3, 4, 5, 6, 7, 11, 13, 14, 15, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 1, 2, 3, + 9, 10, 11, 12, 13, 14, 15, 16, 0, 4, 6, 7, 8, + 14, 15, 16, 0, 1, 2, 3, 4, 5, 9, 11, 12, 13, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 16, 0, 1, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 2, 4, 5, 6, + 12, 13, 14, 15, 16, 0, 1, 2, 3, 7, 9, 10, 11 }; + + for(u32bit j = 0; j != 17; ++j) + { + const byte* R_off = OFFSETS + 13*j; + + u32bit R0 = R[R_off[0]]; + u32bit R1 = R[R_off[1]]; + u32bit R2 = R[R_off[2]]; + u32bit R3 = R[R_off[3]]; + u32bit R4 = R[R_off[4]]; + + const u32bit R5 = R[R_off[5]]; + const u32bit R6 = R[R_off[6]]; + const u32bit R7 = R[R_off[7]]; + const u32bit R8 = R[R_off[8]]; + const u32bit R9 = R[R_off[9]]; + const u32bit R10 = R[R_off[10]]; + const u32bit R11 = R[R_off[11]]; + const u32bit R12 = R[R_off[12]]; + + R[R_off[0]] = R0 = ((R0 << 8) ^ MULT_TAB[(R0 >> 24) & 0xFF]) ^ R11 ^ R4; + + u32bit A = R0; + u32bit B = R10; + u32bit C = R7; + u32bit D = R2; + u32bit E = R1; + + E += A + B + C + D; + + A += E; + B += E; + C += E; + D += E; + + A = S0[get_byte(0, A)] ^ S1[get_byte(1, A)] ^ + S2[get_byte(2, A)] ^ S3[get_byte(3, A)]; + B = S0[get_byte(1, B)] ^ S1[get_byte(2, B)] ^ + S2[get_byte(3, B)] ^ S3[get_byte(0, B)]; + C = S0[get_byte(2, C)] ^ S1[get_byte(3, C)] ^ + S2[get_byte(0, C)] ^ S3[get_byte(1, C)]; + D = S0[get_byte(3, D)] ^ S1[get_byte(0, D)] ^ + S2[get_byte(1, D)] ^ S3[get_byte(2, D)]; + E = S0[get_byte(0, E)] ^ S1[get_byte(1, E)] ^ + S2[get_byte(2, E)] ^ S3[get_byte(3, E)]; + + E += A + B + C + D; + + A += E; + B += E; + C += E; + D += E; + + R[R_off[1]] = R1 = ((R1 << 8) ^ MULT_TAB[(R1 >> 24) & 0xFF]) ^ R12 ^ R5; + R[R_off[2]] = R2 = ((R2 << 8) ^ MULT_TAB[(R2 >> 24) & 0xFF]) ^ R0 ^ R6; + R[R_off[3]] = ((R3 << 8) ^ MULT_TAB[(R3 >> 24) & 0xFF]) ^ R1 ^ R7; + + E += R4; + + R[R_off[4]] = ((R4 << 8) ^ MULT_TAB[(R4 >> 24) & 0xFF]) ^ R2 ^ R8; + + A += R1; + B += R12; + C += R9; + D += R5; + + store_be(A, buffer + 20*j + 0); + store_be(B, buffer + 20*j + 4); + store_be(C, buffer + 20*j + 8); + store_be(D, buffer + 20*j + 12); + store_be(E, buffer + 20*j + 16); + } + + position = 0; + } + +/* +* Turing's byte mixing step +*/ +u32bit Turing::fixedS(u32bit W) + { + for(u32bit j = 0; j != 4; ++j) + { + byte B = SBOX[get_byte(j, W)]; + W ^= rotate_left(Q_BOX[B], j*8); + W &= rotate_right(0x00FFFFFF, j*8); + W |= B << (24-j*8); + } + return W; + } + +/* +* Generate the expanded Turing Sbox tables +*/ +void Turing::gen_sbox(MemoryRegion& S, u32bit which, + const MemoryRegion& K) + { + for(u32bit j = 0; j != 256; ++j) + { + u32bit W = 0, C = j; + + for(u32bit k = 0; k < K.size(); ++k) + { + C = SBOX[get_byte(which, K[k]) ^ C]; + W ^= rotate_left(Q_BOX[C], k + 8*which); + } + S[j] = (W & rotate_right(0x00FFFFFF, 8*which)) | (C << (24 - 8*which)); + } + } + +/* +* Turing Key Schedule +*/ +void Turing::key_schedule(const byte key[], u32bit length) + { + K.create(length / 4); + for(u32bit j = 0; j != length; ++j) + K[j/4] = (K[j/4] << 8) + key[j]; + + for(u32bit j = 0; j != K.size(); ++j) + K[j] = fixedS(K[j]); + + PHT(K); + + gen_sbox(S0, 0, K); + gen_sbox(S1, 1, K); + gen_sbox(S2, 2, K); + gen_sbox(S3, 3, K); + + resync(0, 0); + } + +/* +* Resynchronization +*/ +void Turing::resync(const byte iv[], u32bit length) + { + if(length % 4 != 0 || length > 16) + throw Invalid_IV_Length(name(), length); + + SecureVector IV(length / 4); + for(u32bit j = 0; j != length; ++j) + IV[j/4] = (IV[j/4] << 8) + iv[j]; + + for(u32bit j = 0; j != IV.size(); ++j) + R[j] = IV[j] = fixedS(IV[j]); + + for(u32bit j = 0; j != K.size(); ++j) + R[j+IV.size()] = K[j]; + + R[K.size() + IV.size()] = (0x010203 << 8) | (K.size() << 4) | IV.size(); + + for(u32bit j = K.size() + IV.size() + 1; j != 17; ++j) + { + const u32bit W = R[j-K.size()-IV.size()-1] + R[j-1]; + R[j] = S0[get_byte(0, W)] ^ S1[get_byte(1, W)] ^ + S2[get_byte(2, W)] ^ S3[get_byte(3, W)]; + } + + PHT(R); + + generate(); + } + +/* +* Clear memory of sensitive data +*/ +void Turing::clear() throw() + { + S0.clear(); + S1.clear(); + S2.clear(); + S3.clear(); + + buffer.clear(); + position = 0; + } + +} diff --git a/src/libs/3rdparty/botan/src/stream/turing/turing.h b/src/libs/3rdparty/botan/src/stream/turing/turing.h new file mode 100644 index 00000000000..d48c1d8a878 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/turing/turing.h @@ -0,0 +1,47 @@ +/* +* Turing +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_TURING_H__ +#define BOTAN_TURING_H__ + +#include + +namespace Botan { + +/* +* Turing +*/ +class BOTAN_DLL Turing : public StreamCipher + { + public: + void clear() throw(); + std::string name() const { return "Turing"; } + StreamCipher* clone() const { return new Turing; } + Turing() : StreamCipher(4, 32, 4) { position = 0; } + private: + void cipher(const byte[], byte[], u32bit); + void key_schedule(const byte[], u32bit); + void resync(const byte[], u32bit); + void generate(); + + static u32bit fixedS(u32bit); + static void gen_sbox(MemoryRegion&, u32bit, + const MemoryRegion&); + + static const u32bit Q_BOX[256]; + static const byte SBOX[256]; + + SecureBuffer S0, S1, S2, S3; + SecureBuffer R; + SecureVector K; + SecureBuffer buffer; + u32bit position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/stream/wid_wake/info.txt b/src/libs/3rdparty/botan/src/stream/wid_wake/info.txt new file mode 100644 index 00000000000..94416417ec6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/wid_wake/info.txt @@ -0,0 +1,14 @@ +realname "WiderWake" + +define WID_WAKE + +load_on auto + + +stream + + + +wid_wake.cpp +wid_wake.h + diff --git a/src/libs/3rdparty/botan/src/stream/wid_wake/wid_wake.cpp b/src/libs/3rdparty/botan/src/stream/wid_wake/wid_wake.cpp new file mode 100644 index 00000000000..1dc0fd7f989 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/wid_wake/wid_wake.cpp @@ -0,0 +1,147 @@ +/* +* WiderWake +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Combine cipher stream with message +*/ +void WiderWake_41_BE::cipher(const byte in[], byte out[], u32bit length) + { + while(length >= buffer.size() - position) + { + xor_buf(out, in, buffer + position, buffer.size() - position); + length -= (buffer.size() - position); + in += (buffer.size() - position); + out += (buffer.size() - position); + generate(buffer.size()); + } + xor_buf(out, in, buffer + position, length); + position += length; + } + +/* +* Generate cipher stream +*/ +void WiderWake_41_BE::generate(u32bit length) + { + u32bit R0 = state[0], R1 = state[1], + R2 = state[2], R3 = state[3], + R4 = state[4]; + + for(u32bit j = 0; j != length; j += 8) + { + u32bit R0a; + + store_be(R3, buffer + j); + + R0a = R4 + R3; R3 += R2; R2 += R1; R1 += R0; + R0a = (R0a >> 8) ^ T[(R0a & 0xFF)]; + R1 = (R1 >> 8) ^ T[(R1 & 0xFF)]; + R2 = (R2 >> 8) ^ T[(R2 & 0xFF)]; + R3 = (R3 >> 8) ^ T[(R3 & 0xFF)]; + R4 = R0; R0 = R0a; + + store_be(R3, buffer + j + 4); + + R0a = R4 + R3; R3 += R2; R2 += R1; R1 += R0; + R0a = (R0a >> 8) ^ T[(R0a & 0xFF)]; + R1 = (R1 >> 8) ^ T[(R1 & 0xFF)]; + R2 = (R2 >> 8) ^ T[(R2 & 0xFF)]; + R3 = (R3 >> 8) ^ T[(R3 & 0xFF)]; + R4 = R0; R0 = R0a; + } + + state[0] = R0; + state[1] = R1; + state[2] = R2; + state[3] = R3; + state[4] = R4; + + position = 0; + } + +/* +* WiderWake Key Schedule +*/ +void WiderWake_41_BE::key_schedule(const byte key[], u32bit) + { + for(u32bit j = 0; j != 4; ++j) + t_key[j] = load_be(key, j); + + static const u32bit MAGIC[8] = { + 0x726A8F3B, 0xE69A3B5C, 0xD3C71FE5, 0xAB3C73D2, + 0x4D3A8EB3, 0x0396D6E8, 0x3D4C2F7A, 0x9EE27CF3 }; + + for(u32bit j = 0; j != 4; ++j) + T[j] = t_key[j]; + for(u32bit j = 4; j != 256; ++j) + { + u32bit X = T[j-1] + T[j-4]; + T[j] = (X >> 3) ^ MAGIC[X % 8]; + } + for(u32bit j = 0; j != 23; ++j) + T[j] += T[j+89]; + + u32bit X = T[33]; + u32bit Z = (T[59] | 0x01000001) & 0xFF7FFFFF; + for(u32bit j = 0; j != 256; ++j) + { + X = (X & 0xFF7FFFFF) + Z; + T[j] = (T[j] & 0x00FFFFFF) ^ X; + } + X = (T[X & 0xFF] ^ X) & 0xFF; + Z = T[0]; + T[0] = T[X]; + for(u32bit j = 1; j != 256; ++j) + { + T[X] = T[j]; + X = (T[j ^ X] ^ X) & 0xFF; + T[j] = T[X]; + } + T[X] = Z; + + position = 0; + const byte iv[8] = { 0 }; + resync(iv, 8); + } + +/* +* Resynchronization +*/ +void WiderWake_41_BE::resync(const byte iv[], u32bit length) + { + if(length != 8) + throw Invalid_IV_Length(name(), length); + + for(u32bit j = 0; j != 4; ++j) + state[j] = t_key[j]; + state[4] = load_be(iv, 0); + state[0] ^= state[4]; + state[2] ^= load_be(iv, 1); + + generate(8*4); + generate(buffer.size()); + } + +/* +* Clear memory of sensitive data +*/ +void WiderWake_41_BE::clear() throw() + { + position = 0; + t_key.clear(); + state.clear(); + T.clear(); + buffer.clear(); + } + +} diff --git a/src/libs/3rdparty/botan/src/stream/wid_wake/wid_wake.h b/src/libs/3rdparty/botan/src/stream/wid_wake/wid_wake.h new file mode 100644 index 00000000000..4720afdb2b9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/stream/wid_wake/wid_wake.h @@ -0,0 +1,41 @@ +/* +* WiderWake +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_WIDER_WAKE_H__ +#define BOTAN_WIDER_WAKE_H__ + +#include + +namespace Botan { + +/* +* WiderWake4+1-BE +*/ +class BOTAN_DLL WiderWake_41_BE : public StreamCipher + { + public: + void clear() throw(); + std::string name() const { return "WiderWake4+1-BE"; } + StreamCipher* clone() const { return new WiderWake_41_BE; } + WiderWake_41_BE() : StreamCipher(16, 16, 1, 8) {} + private: + void cipher(const byte[], byte[], u32bit); + void key_schedule(const byte[], u32bit); + void resync(const byte[], u32bit); + + void generate(u32bit); + + SecureBuffer buffer; + SecureBuffer T; + SecureBuffer state; + SecureBuffer t_key; + u32bit position; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/sym_algo/info.txt b/src/libs/3rdparty/botan/src/sym_algo/info.txt new file mode 100644 index 00000000000..03804a92dc4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/sym_algo/info.txt @@ -0,0 +1,16 @@ +realname "Symmetric Algorithms" + +load_on auto + + +sym_algo.h +symkey.cpp +symkey.h + + + +alloc +filters +hex +rng + diff --git a/src/libs/3rdparty/botan/src/sym_algo/sym_algo.h b/src/libs/3rdparty/botan/src/sym_algo/sym_algo.h new file mode 100644 index 00000000000..1c8b816fdf4 --- /dev/null +++ b/src/libs/3rdparty/botan/src/sym_algo/sym_algo.h @@ -0,0 +1,101 @@ +/** +* Symmetric Algorithm Base Class +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SYMMETRIC_ALGORITHM_H__ +#define BOTAN_SYMMETRIC_ALGORITHM_H__ + +#include +#include +#include + +namespace Botan { + +/** +* This class represents a symmetric algorithm object. +*/ +class BOTAN_DLL SymmetricAlgorithm + { + public: + + /** + * The maximum allowed key length. + */ + const u32bit MAXIMUM_KEYLENGTH; + + /** + * The minimal allowed key length. + */ + const u32bit MINIMUM_KEYLENGTH; + + /** + * A valid keylength is a multiple of this value. + */ + const u32bit KEYLENGTH_MULTIPLE; + + /** + * The name of the algorithm. + * @return the name of the algorithm + */ + virtual std::string name() const = 0; + + /** + * Set the symmetric key of this object. + * @param key the SymmetricKey to be set. + */ + void set_key(const SymmetricKey& key) throw(Invalid_Key_Length) + { set_key(key.begin(), key.length()); } + + /** + * Set the symmetric key of this object. + * @param key the to be set as a byte array. + * @param the length of the byte array. + */ + void set_key(const byte key[], u32bit length) throw(Invalid_Key_Length) + { + if(!valid_keylength(length)) + throw Invalid_Key_Length(name(), length); + key_schedule(key, length); + } + + /** + * Check whether a given key length is valid for this algorithm. + * @param length the key length to be checked. + * @return true if the key length is valid. + */ + bool valid_keylength(u32bit length) const + { + return ((length >= MINIMUM_KEYLENGTH) && + (length <= MAXIMUM_KEYLENGTH) && + (length % KEYLENGTH_MULTIPLE == 0)); + } + + /** + * Construct a SymmetricAlgorithm. + * @param key_min the minimum allowed key length + * @param key_max the maximum allowed key length + * @param key_mod any valid key length must be a multiple of this value + */ + SymmetricAlgorithm(u32bit key_min, u32bit key_max, u32bit key_mod) : + MAXIMUM_KEYLENGTH(key_max ? key_max : key_min), + MINIMUM_KEYLENGTH(key_min), + KEYLENGTH_MULTIPLE(key_mod) + {} + + virtual ~SymmetricAlgorithm() {} + private: + virtual void key_schedule(const byte[], u32bit) = 0; + }; + +/** +* The two possible directions for cipher filters, determining whether they +* actually perform encryption or decryption. +*/ +enum Cipher_Dir { ENCRYPTION, DECRYPTION }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/sym_algo/symkey.cpp b/src/libs/3rdparty/botan/src/sym_algo/symkey.cpp new file mode 100644 index 00000000000..32dfe68d5a9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/sym_algo/symkey.cpp @@ -0,0 +1,141 @@ +/* +* OctetString +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Create an OctetString from RNG output +*/ +OctetString::OctetString(RandomNumberGenerator& rng, + u32bit length) + { + bits.create(length); + rng.randomize(bits, length); + } + +/* +* Create an OctetString from a hex string +*/ +void OctetString::change(const std::string& hex_string) + { + SecureVector hex; + for(u32bit j = 0; j != hex_string.length(); ++j) + if(Hex_Decoder::is_valid(hex_string[j])) + hex.append(hex_string[j]); + + if(hex.size() % 2 != 0) + throw Invalid_Argument("OctetString: hex string must encode full bytes"); + bits.create(hex.size() / 2); + for(u32bit j = 0; j != bits.size(); ++j) + bits[j] = Hex_Decoder::decode(hex.begin() + 2*j); + } + +/* +* Create an OctetString from a byte string +*/ +void OctetString::change(const byte in[], u32bit n) + { + bits.create(n); + bits.copy(in, n); + } + +/* +* Set the parity of each key byte to odd +*/ +void OctetString::set_odd_parity() + { + const byte ODD_PARITY[256] = { + 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x07, 0x07, 0x08, 0x08, 0x0B, 0x0B, + 0x0D, 0x0D, 0x0E, 0x0E, 0x10, 0x10, 0x13, 0x13, 0x15, 0x15, 0x16, 0x16, + 0x19, 0x19, 0x1A, 0x1A, 0x1C, 0x1C, 0x1F, 0x1F, 0x20, 0x20, 0x23, 0x23, + 0x25, 0x25, 0x26, 0x26, 0x29, 0x29, 0x2A, 0x2A, 0x2C, 0x2C, 0x2F, 0x2F, + 0x31, 0x31, 0x32, 0x32, 0x34, 0x34, 0x37, 0x37, 0x38, 0x38, 0x3B, 0x3B, + 0x3D, 0x3D, 0x3E, 0x3E, 0x40, 0x40, 0x43, 0x43, 0x45, 0x45, 0x46, 0x46, + 0x49, 0x49, 0x4A, 0x4A, 0x4C, 0x4C, 0x4F, 0x4F, 0x51, 0x51, 0x52, 0x52, + 0x54, 0x54, 0x57, 0x57, 0x58, 0x58, 0x5B, 0x5B, 0x5D, 0x5D, 0x5E, 0x5E, + 0x61, 0x61, 0x62, 0x62, 0x64, 0x64, 0x67, 0x67, 0x68, 0x68, 0x6B, 0x6B, + 0x6D, 0x6D, 0x6E, 0x6E, 0x70, 0x70, 0x73, 0x73, 0x75, 0x75, 0x76, 0x76, + 0x79, 0x79, 0x7A, 0x7A, 0x7C, 0x7C, 0x7F, 0x7F, 0x80, 0x80, 0x83, 0x83, + 0x85, 0x85, 0x86, 0x86, 0x89, 0x89, 0x8A, 0x8A, 0x8C, 0x8C, 0x8F, 0x8F, + 0x91, 0x91, 0x92, 0x92, 0x94, 0x94, 0x97, 0x97, 0x98, 0x98, 0x9B, 0x9B, + 0x9D, 0x9D, 0x9E, 0x9E, 0xA1, 0xA1, 0xA2, 0xA2, 0xA4, 0xA4, 0xA7, 0xA7, + 0xA8, 0xA8, 0xAB, 0xAB, 0xAD, 0xAD, 0xAE, 0xAE, 0xB0, 0xB0, 0xB3, 0xB3, + 0xB5, 0xB5, 0xB6, 0xB6, 0xB9, 0xB9, 0xBA, 0xBA, 0xBC, 0xBC, 0xBF, 0xBF, + 0xC1, 0xC1, 0xC2, 0xC2, 0xC4, 0xC4, 0xC7, 0xC7, 0xC8, 0xC8, 0xCB, 0xCB, + 0xCD, 0xCD, 0xCE, 0xCE, 0xD0, 0xD0, 0xD3, 0xD3, 0xD5, 0xD5, 0xD6, 0xD6, + 0xD9, 0xD9, 0xDA, 0xDA, 0xDC, 0xDC, 0xDF, 0xDF, 0xE0, 0xE0, 0xE3, 0xE3, + 0xE5, 0xE5, 0xE6, 0xE6, 0xE9, 0xE9, 0xEA, 0xEA, 0xEC, 0xEC, 0xEF, 0xEF, + 0xF1, 0xF1, 0xF2, 0xF2, 0xF4, 0xF4, 0xF7, 0xF7, 0xF8, 0xF8, 0xFB, 0xFB, + 0xFD, 0xFD, 0xFE, 0xFE }; + + for(u32bit j = 0; j != bits.size(); ++j) + bits[j] = ODD_PARITY[bits[j]]; + } + +/* +* Hex encode an OctetString +*/ +std::string OctetString::as_string() const + { + Pipe pipe(new Hex_Encoder); + pipe.process_msg(bits); + return pipe.read_all_as_string(); + } + +/* +* XOR Operation for OctetStrings +*/ +OctetString& OctetString::operator^=(const OctetString& k) + { + if(&k == this) { bits.clear(); return (*this); } + xor_buf(bits.begin(), k.begin(), std::min(length(), k.length())); + return (*this); + } + +/* +* Equality Operation for OctetStrings +*/ +bool operator==(const OctetString& s1, const OctetString& s2) + { + return (s1.bits_of() == s2.bits_of()); + } + +/* +* Unequality Operation for OctetStrings +*/ +bool operator!=(const OctetString& s1, const OctetString& s2) + { + return !(s1 == s2); + } + +/* +* Append Operation for OctetStrings +*/ +OctetString operator+(const OctetString& k1, const OctetString& k2) + { + return OctetString(SecureVector(k1.bits_of(), k2.bits_of())); + } + +/* +* XOR Operation for OctetStrings +*/ +OctetString operator^(const OctetString& k1, const OctetString& k2) + { + SecureVector ret(std::max(k1.length(), k2.length())); + ret.copy(k1.begin(), k1.length()); + xor_buf(ret, k2.begin(), k2.length()); + return OctetString(ret); + } + +} diff --git a/src/libs/3rdparty/botan/src/sym_algo/symkey.h b/src/libs/3rdparty/botan/src/sym_algo/symkey.h new file mode 100644 index 00000000000..5504297a408 --- /dev/null +++ b/src/libs/3rdparty/botan/src/sym_algo/symkey.h @@ -0,0 +1,62 @@ +/* +* OctetString +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SYMKEY_H__ +#define BOTAN_SYMKEY_H__ + +#include +#include + +namespace Botan { + +/* +* Octet String +*/ +class BOTAN_DLL OctetString + { + public: + u32bit length() const { return bits.size(); } + SecureVector bits_of() const { return bits; } + + const byte* begin() const { return bits.begin(); } + const byte* end() const { return bits.end(); } + + std::string as_string() const; + + OctetString& operator^=(const OctetString&); + + void set_odd_parity(); + + void change(const std::string&); + void change(const byte[], u32bit); + void change(const MemoryRegion& in) { bits = in; } + + OctetString(class RandomNumberGenerator&, u32bit len); + OctetString(const std::string& str = "") { change(str); } + OctetString(const byte in[], u32bit len) { change(in, len); } + OctetString(const MemoryRegion& in) { change(in); } + private: + SecureVector bits; + }; + +/* +* Operations on Octet Strings +*/ +BOTAN_DLL bool operator==(const OctetString&, const OctetString&); +BOTAN_DLL bool operator!=(const OctetString&, const OctetString&); +BOTAN_DLL OctetString operator+(const OctetString&, const OctetString&); +BOTAN_DLL OctetString operator^(const OctetString&, const OctetString&); + +/* +* Alternate Names +*/ +typedef OctetString SymmetricKey; +typedef OctetString InitializationVector; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/timer/cpu_counter/info.txt b/src/libs/3rdparty/botan/src/timer/cpu_counter/info.txt new file mode 100644 index 00000000000..025663a84f7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/cpu_counter/info.txt @@ -0,0 +1,36 @@ +realname "Hardware Timer" + +define TIMER_HARDWARE + +load_on asm_ok + + +tm_hard.cpp +tm_hard.h + + + +gcc + + + +# RDTSC: Pentium and up +i586 +i686 +athlon +pentium4 +pentium-m +amd64 + +ppc # PPC timebase register +ppc64 # PPC timebase register +alpha # rpcc +sparc64 # %tick register +ia64 # ar.itc +s390x +hppa + + + +timer + diff --git a/src/libs/3rdparty/botan/src/timer/cpu_counter/tm_hard.cpp b/src/libs/3rdparty/botan/src/timer/cpu_counter/tm_hard.cpp new file mode 100644 index 00000000000..9e31aee3938 --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/cpu_counter/tm_hard.cpp @@ -0,0 +1,51 @@ +/* +* Hardware Timer +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Get the timestamp +*/ +u64bit Hardware_Timer::clock() const + { + u64bit rtc = 0; + +#if defined(BOTAN_TARGET_ARCH_IS_IA32) || defined(BOTAN_TARGET_ARCH_IS_AMD64) + u32bit rtc_low = 0, rtc_high = 0; + asm volatile("rdtsc" : "=d" (rtc_high), "=a" (rtc_low)); + rtc = (static_cast(rtc_high) << 32) | rtc_low; + +#elif defined(BOTAN_TARGET_ARCH_IS_PPC) || defined(BOTAN_TARGET_ARCH_IS_PPC64) + u32bit rtc_low = 0, rtc_high = 0; + asm volatile("mftbu %0; mftb %1" : "=r" (rtc_high), "=r" (rtc_low)); + rtc = (static_cast(rtc_high) << 32) | rtc_low; + +#elif defined(BOTAN_TARGET_ARCH_IS_ALPHA) + asm volatile("rpcc %0" : "=r" (rtc)); + +#elif defined(BOTAN_TARGET_ARCH_IS_SPARC64) + asm volatile("rd %%tick, %0" : "=r" (rtc)); + +#elif defined(BOTAN_TARGET_ARCH_IS_IA64) + asm volatile("mov %0=ar.itc" : "=r" (rtc)); + +#elif defined(BOTAN_TARGET_ARCH_IS_S390X) + asm volatile("stck 0(%0)" : : "a" (&rtc) : "memory", "cc"); + +#elif defined(BOTAN_TARGET_ARCH_IS_HPPA) + asm volatile("mfctl 16,%0" : "=r" (rtc)); // 64-bit only? + +#else + #error "Unsure how to access hardware timer on this system" +#endif + + return rtc; + } + +} diff --git a/src/libs/3rdparty/botan/src/timer/cpu_counter/tm_hard.h b/src/libs/3rdparty/botan/src/timer/cpu_counter/tm_hard.h new file mode 100644 index 00000000000..2e338eca833 --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/cpu_counter/tm_hard.h @@ -0,0 +1,33 @@ +/* +* Hardware Timer +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_TIMER_HARDWARE_H__ +#define BOTAN_TIMER_HARDWARE_H__ + +#include + +namespace Botan { + +/* +* Hardware Timer +*/ +class BOTAN_DLL Hardware_Timer : public Timer + { + public: + /* + @todo: Add sync(Timer& wall_clock, bool milliseconds) which busy + loops using wall_clock and tries to guess the tick rate of the + hardware counter, allowing it to be used for benchmarks, etc + */ + + std::string name() const { return "Hardware Timer"; } + u64bit clock() const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/timer/gettimeofday/info.txt b/src/libs/3rdparty/botan/src/timer/gettimeofday/info.txt new file mode 100644 index 00000000000..a58e8088d92 --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/gettimeofday/info.txt @@ -0,0 +1,33 @@ +realname "Unix Timer" + +define TIMER_UNIX + +load_on auto +modset unix,beos + + +tm_unix.cpp +tm_unix.h + + + +aix +beos +cygwin +darwin +freebsd +dragonfly +hpux +irix +linux +netbsd +openbsd +qnx +solaris +tru64 + + + +timer + + diff --git a/src/libs/3rdparty/botan/src/timer/gettimeofday/tm_unix.cpp b/src/libs/3rdparty/botan/src/timer/gettimeofday/tm_unix.cpp new file mode 100644 index 00000000000..e32df7166d0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/gettimeofday/tm_unix.cpp @@ -0,0 +1,24 @@ +/* +* Unix Timer +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Get the timestamp +*/ +u64bit Unix_Timer::clock() const + { + struct ::timeval tv; + ::gettimeofday(&tv, 0); + return combine_timers(tv.tv_sec, tv.tv_usec, 1000000); + } + +} diff --git a/src/libs/3rdparty/botan/src/timer/gettimeofday/tm_unix.h b/src/libs/3rdparty/botan/src/timer/gettimeofday/tm_unix.h new file mode 100644 index 00000000000..c304dbb5cf3 --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/gettimeofday/tm_unix.h @@ -0,0 +1,27 @@ +/* +* Unix Timer +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_TIMER_UNIX_H__ +#define BOTAN_TIMER_UNIX_H__ + +#include + +namespace Botan { + +/* +* Unix Timer +*/ +class BOTAN_DLL Unix_Timer : public Timer + { + public: + std::string name() const { return "Unix gettimeofday"; } + u64bit clock() const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/timer/info.txt b/src/libs/3rdparty/botan/src/timer/info.txt new file mode 100644 index 00000000000..6408dca45ea --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/info.txt @@ -0,0 +1,14 @@ +realname "Timer Base Class" + +define TIMER + +load_on auto + + +timer.cpp +timer.h + + + +rng + diff --git a/src/libs/3rdparty/botan/src/timer/posix_rt/info.txt b/src/libs/3rdparty/botan/src/timer/posix_rt/info.txt new file mode 100644 index 00000000000..fa530ea1a4b --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/posix_rt/info.txt @@ -0,0 +1,29 @@ +realname "POSIX Timer" + +define TIMER_POSIX + +load_on auto + + +tm_posix.cpp +tm_posix.h + + + +linux -> rt + + +# The *BSDs put clock_gettime in sys/time.h, not time.h like POSIX says + +cygwin +linux +#freebsd +dragonfly +#netbsd +#openbsd + + + +timer + + diff --git a/src/libs/3rdparty/botan/src/timer/posix_rt/tm_posix.cpp b/src/libs/3rdparty/botan/src/timer/posix_rt/tm_posix.cpp new file mode 100644 index 00000000000..d356384abff --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/posix_rt/tm_posix.cpp @@ -0,0 +1,33 @@ +/* +* POSIX Timer +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +#ifndef _POSIX_C_SOURCE + #define _POSIX_C_SOURCE 199309 +#endif + +#include + +#ifndef CLOCK_REALTIME + #define CLOCK_REALTIME 0 +#endif + +namespace Botan { + +/* +* Get the timestamp +*/ +u64bit POSIX_Timer::clock() const + { + struct ::timespec tv; + ::clock_gettime(CLOCK_REALTIME, &tv); + return combine_timers(tv.tv_sec, tv.tv_nsec, 1000000000); + } + +} diff --git a/src/libs/3rdparty/botan/src/timer/posix_rt/tm_posix.h b/src/libs/3rdparty/botan/src/timer/posix_rt/tm_posix.h new file mode 100644 index 00000000000..8bedccfa208 --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/posix_rt/tm_posix.h @@ -0,0 +1,27 @@ +/* +* POSIX Timer +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_TIMER_POSIX_H__ +#define BOTAN_TIMER_POSIX_H__ + +#include + +namespace Botan { + +/* +* POSIX Timer +*/ +class BOTAN_DLL POSIX_Timer : public Timer + { + public: + std::string name() const { return "POSIX clock_gettime"; } + u64bit clock() const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/timer/timer.cpp b/src/libs/3rdparty/botan/src/timer/timer.cpp new file mode 100644 index 00000000000..035c217f9ca --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/timer.cpp @@ -0,0 +1,52 @@ +/** +* Timestamp Functions +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/** +* Get the system clock +*/ +u64bit system_time() + { + return static_cast(std::time(0)); + } + +/** +* Read the clock and return the output +*/ +void Timer::poll(Entropy_Accumulator& accum) + { + const u64bit clock_value = this->clock(); + accum.add(clock_value, 0); + } + +/** +* Combine a two time values into a single one +*/ +u64bit Timer::combine_timers(u32bit seconds, u32bit parts, u32bit parts_hz) + { + static const u64bit NANOSECONDS_UNITS = 1000000000; + + u64bit res = seconds * NANOSECONDS_UNITS; + res += parts * (NANOSECONDS_UNITS / parts_hz); + return res; + } + +/** +* ANSI Clock +*/ +u64bit ANSI_Clock_Timer::clock() const + { + return combine_timers(std::time(0), std::clock(), CLOCKS_PER_SEC); + } + +} diff --git a/src/libs/3rdparty/botan/src/timer/timer.h b/src/libs/3rdparty/botan/src/timer/timer.h new file mode 100644 index 00000000000..b6e8ef448b6 --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/timer.h @@ -0,0 +1,45 @@ +/** +* Timestamp Functions +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_TIMERS_H__ +#define BOTAN_TIMERS_H__ + +#include + +namespace Botan { + +/** +* Timer Interface +*/ +class BOTAN_DLL Timer : public EntropySource + { + public: + /** + @return nanoseconds resolution timestamp, unknown epoch + */ + virtual u64bit clock() const = 0; + + void poll(Entropy_Accumulator& accum); + + virtual ~Timer() {} + protected: + static u64bit combine_timers(u32bit, u32bit, u32bit); + }; + +/** +* ANSI Clock Timer +*/ +class BOTAN_DLL ANSI_Clock_Timer : public Timer + { + public: + std::string name() const { return "ANSI clock"; } + u64bit clock() const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/timer/win32_query_perf_ctr/info.txt b/src/libs/3rdparty/botan/src/timer/win32_query_perf_ctr/info.txt new file mode 100644 index 00000000000..4bb1ddb3411 --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/win32_query_perf_ctr/info.txt @@ -0,0 +1,26 @@ +realname "Win32 Timer" + +define TIMER_WIN32 +modset win32 + +load_on auto + + +tm_win32.cpp +tm_win32.h + + + +cygwin +windows +mingw + + + +windows -> user32.lib + + + +timer + + diff --git a/src/libs/3rdparty/botan/src/timer/win32_query_perf_ctr/tm_win32.cpp b/src/libs/3rdparty/botan/src/timer/win32_query_perf_ctr/tm_win32.cpp new file mode 100644 index 00000000000..6b878e6e22a --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/win32_query_perf_ctr/tm_win32.cpp @@ -0,0 +1,23 @@ +/* +* Win32 Timer +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Get the timestamp +*/ +u64bit Win32_Timer::clock() const + { + LARGE_INTEGER tv; + ::QueryPerformanceCounter(&tv); + return tv.QuadPart; + } + +} diff --git a/src/libs/3rdparty/botan/src/timer/win32_query_perf_ctr/tm_win32.h b/src/libs/3rdparty/botan/src/timer/win32_query_perf_ctr/tm_win32.h new file mode 100644 index 00000000000..5bcb720ab14 --- /dev/null +++ b/src/libs/3rdparty/botan/src/timer/win32_query_perf_ctr/tm_win32.h @@ -0,0 +1,27 @@ +/* +* Win32 Timer +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_TIMER_WIN32_H__ +#define BOTAN_TIMER_WIN32_H__ + +#include + +namespace Botan { + +/* +* Win32 Timer +*/ +class BOTAN_DLL Win32_Timer : public Timer + { + public: + std::string name() const { return "Win32 QueryPerformanceCounter"; } + u64bit clock() const; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/asm_amd64/asm_macr.h b/src/libs/3rdparty/botan/src/utils/asm_amd64/asm_macr.h new file mode 100644 index 00000000000..287fa3e88c8 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/asm_amd64/asm_macr.h @@ -0,0 +1,127 @@ +/* +* Assembly Macros +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_AMD64_ASM_MACROS_H__ +#define BOTAN_AMD64_ASM_MACROS_H__ + +/* +* General/Global Macros +*/ +#define ALIGN .p2align 4,,15 + +#define START_LISTING(FILENAME) \ + .file #FILENAME; \ + .text; \ + ALIGN; + +#if defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif + +/* +* Function Definitions +*/ +#define START_FUNCTION(func_name) \ + ALIGN; \ + .global func_name; \ + .type func_name,@function; \ +func_name: + +#define END_FUNCTION(func_name) \ + ret + +/* +* Conditional Jumps +*/ +#define JUMP_IF_ZERO(REG, LABEL) \ + cmp IMM(0), REG; \ + jz LABEL + +#define JUMP_IF_LT(REG, NUM, LABEL) \ + cmp IMM(NUM), REG; \ + jl LABEL + +/* +* Register Names +*/ +#define R0 %rax +#define R1 %rbx +#define R2 %rcx +#define R2_32 %ecx +#define R3 %rdx +#define R3_32 %edx +#define R4 %rsp +#define R5 %rbp +#define R6 %rsi +#define R6_32 %esi +#define R7 %rdi +#define R8 %r8 +#define R9 %r9 +#define R9_32 %r9d +#define R10 %r10 +#define R11 %r11 +#define R12 %r12 +#define R13 %r13 +#define R14 %r14 +#define R15 %r15 +#define R16 %r16 + +#define ARG_1 R7 +#define ARG_2 R6 +#define ARG_2_32 R6_32 +#define ARG_3 R3 +#define ARG_3_32 R3_32 +#define ARG_4 R2 +#define ARG_4_32 R2_32 +#define ARG_5 R8 +#define ARG_6 R9 +#define ARG_6_32 R9_32 + +#define TEMP_1 R10 +#define TEMP_2 R11 +#define TEMP_3 ARG_6 +#define TEMP_4 ARG_5 +#define TEMP_5 ARG_4 +#define TEMP_5_32 ARG_4_32 +#define TEMP_6 ARG_3 +#define TEMP_7 ARG_2 +#define TEMP_8 ARG_1 +#define TEMP_9 R0 + +/* +* Memory Access Operations +*/ +#define ARRAY8(REG, NUM) 8*(NUM)(REG) +#define ARRAY4(REG, NUM) 4*(NUM)(REG) + +#define ASSIGN(TO, FROM) mov FROM, TO + +/* +* ALU Operations +*/ +#define IMM(VAL) $VAL + +#define ADD(TO, FROM) add FROM, TO +#define ADD_LAST_CARRY(REG) adc IMM(0), REG +#define ADD_IMM(TO, NUM) ADD(TO, IMM(NUM)) +#define ADD_W_CARRY(TO1, TO2, FROM) add FROM, TO1; adc IMM(0), TO2; +#define SUB_IMM(TO, NUM) sub IMM(NUM), TO +#define MUL(REG) mul REG + +#define XOR(TO, FROM) xor FROM, TO +#define AND(TO, FROM) and FROM, TO +#define OR(TO, FROM) or FROM, TO +#define NOT(REG) not REG +#define ZEROIZE(REG) XOR(REG, REG) + +#define RETURN_VALUE_IS(V) ASSIGN(%rax, V) + +#define ROTL_IMM(REG, NUM) rol IMM(NUM), REG +#define ROTR_IMM(REG, NUM) ror IMM(NUM), REG +#define ADD3_IMM(TO, FROM, NUM) lea NUM(TO,FROM,1), TO + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/asm_amd64/info.txt b/src/libs/3rdparty/botan/src/utils/asm_amd64/info.txt new file mode 100644 index 00000000000..19035b545d1 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/asm_amd64/info.txt @@ -0,0 +1,16 @@ +realname "Assembler Macros (x86-64)" + +load_on dep + + +asm_macr.h + + + +amd64 + + + +gcc +icc + diff --git a/src/libs/3rdparty/botan/src/utils/asm_ia32/asm_macr.h b/src/libs/3rdparty/botan/src/utils/asm_ia32/asm_macr.h new file mode 100644 index 00000000000..2ea69512b3c --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/asm_ia32/asm_macr.h @@ -0,0 +1,128 @@ +/* +* Assembly Macros +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_IA32_ASM_MACROS_H__ +#define BOTAN_IA32_ASM_MACROS_H__ + +/* +* General/Global Macros +*/ +#define ALIGN .p2align 4,,15 + +#define START_LISTING(FILENAME) \ + .file #FILENAME; \ + .text; \ + ALIGN; + +#if defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif + +/* +* Function Definitions +*/ +#define START_FUNCTION(func_name) \ + ALIGN; \ + .global func_name; \ + .type func_name,@function; \ +func_name: + +#define END_FUNCTION(func_name) \ + ret + +/* +* Loop Control +*/ +#define START_LOOP(LABEL) \ + ALIGN; \ + LABEL##_LOOP: + +#define LOOP_UNTIL_EQ(REG, NUM, LABEL) \ + cmpl IMM(NUM), REG; \ + jne LABEL##_LOOP + +#define LOOP_UNTIL_LT(REG, NUM, LABEL) \ + cmpl IMM(NUM), REG; \ + jge LABEL##_LOOP + +/* + Conditional Jumps +*/ +#define JUMP_IF_ZERO(REG, LABEL) \ + cmpl IMM(0), REG; \ + jz LABEL + +#define JUMP_IF_LT(REG, NUM, LABEL) \ + cmpl IMM(NUM), REG; \ + jl LABEL + +/* +* Register Names +*/ +#define EAX %eax +#define EBX %ebx +#define ECX %ecx +#define EDX %edx +#define EBP %ebp +#define EDI %edi +#define ESI %esi +#define ESP %esp + +/* +* Memory Access Operations +*/ +#define ARRAY1(REG, NUM) (NUM)(REG) +#define ARRAY4(REG, NUM) 4*(NUM)(REG) +#define ARRAY4_INDIRECT(BASE, OFFSET, NUM) 4*(NUM)(BASE,OFFSET,4) +#define ARG(NUM) 4*(PUSHED) + ARRAY4(ESP, NUM) + +#define ASSIGN(TO, FROM) movl FROM, TO +#define ASSIGN_BYTE(TO, FROM) movzbl FROM, TO + +#define PUSH(REG) pushl REG +#define POP(REG) popl REG + +#define SPILL_REGS() \ + PUSH(EBP) ; \ + PUSH(EDI) ; \ + PUSH(ESI) ; \ + PUSH(EBX) + +#define RESTORE_REGS() \ + POP(EBX) ; \ + POP(ESI) ; \ + POP(EDI) ; \ + POP(EBP) + +/* +* ALU Operations +*/ +#define IMM(VAL) $VAL + +#define ADD(TO, FROM) addl FROM, TO +#define ADD_IMM(TO, NUM) ADD(TO, IMM(NUM)) +#define ADD_W_CARRY(TO1, TO2, FROM) addl FROM, TO1; adcl IMM(0), TO2; +#define SUB_IMM(TO, NUM) subl IMM(NUM), TO +#define ADD2_IMM(TO, FROM, NUM) leal NUM(FROM), TO +#define ADD3_IMM(TO, FROM, NUM) leal NUM(TO,FROM,1), TO +#define MUL(REG) mull REG + +#define SHL_IMM(REG, SHIFT) shll IMM(SHIFT), REG +#define SHR_IMM(REG, SHIFT) shrl IMM(SHIFT), REG +#define SHL2_3(TO, FROM) leal 0(,FROM,8), TO + +#define XOR(TO, FROM) xorl FROM, TO +#define AND(TO, FROM) andl FROM, TO +#define OR(TO, FROM) orl FROM, TO +#define NOT(REG) notl REG +#define ZEROIZE(REG) XOR(REG, REG) + +#define ROTL_IMM(REG, NUM) roll IMM(NUM), REG +#define ROTR_IMM(REG, NUM) rorl IMM(NUM), REG +#define BSWAP(REG) bswapl REG + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/asm_ia32/info.txt b/src/libs/3rdparty/botan/src/utils/asm_ia32/info.txt new file mode 100644 index 00000000000..4340c35aad2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/asm_ia32/info.txt @@ -0,0 +1,16 @@ +realname "Assembler Macros (IA-32)" + +load_on dep + + +asm_macr.h + + + +ia32 + + + +gcc +icc + diff --git a/src/libs/3rdparty/botan/src/utils/bit_ops.h b/src/libs/3rdparty/botan/src/utils/bit_ops.h new file mode 100644 index 00000000000..c02ec536fe2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/bit_ops.h @@ -0,0 +1,91 @@ +/* +* Bit/Word Operations +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BIT_OPS_H__ +#define BOTAN_BIT_OPS_H__ + +#include + +namespace Botan { + +/* +* Return true iff arg is 2**n for some n > 0 +* T should be an unsigned integer type +*/ +template +inline bool power_of_2(T arg) + { + return ((arg != 0 && arg != 1) && ((arg & (arg-1)) == 0)); + } + +/* +* Return the index of the highest set bit +* T is an unsigned integer type +*/ +template +inline u32bit high_bit(T n) + { + for(u32bit i = 8*sizeof(T); i > 0; --i) + if((n >> (i - 1)) & 0x01) + return i; + return 0; + } + +/* +* Return the index of the lowest set bit +*/ +template +inline u32bit low_bit(T n) + { + for(u32bit i = 0; i != 8*sizeof(T); ++i) + if((n >> i) & 0x01) + return (i + 1); + return 0; + } + +/* +* Return the number of significant bytes in n +*/ +template +inline u32bit significant_bytes(T n) + { + for(u32bit j = 0; j != sizeof(T); ++j) + if(get_byte(j, n)) + return sizeof(T)-j; + return 0; + } + +/* +* Return the Hamming weight of n +*/ +template +inline u32bit hamming_weight(T n) + { + const byte NIBBLE_WEIGHTS[] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; + + u32bit weight = 0; + for(u32bit i = 0; i != 2*sizeof(T); ++i) + weight += NIBBLE_WEIGHTS[(n >> (4*i)) & 0x0F]; + return weight; + } + +/* +* Count the trailing zero bits in n +*/ +template +inline u32bit ctz(T n) + { + for(u32bit i = 0; i != 8*sizeof(T); ++i) + if((n >> i) & 0x01) + return i; + return 8*sizeof(T); + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/bswap.h b/src/libs/3rdparty/botan/src/utils/bswap.h new file mode 100644 index 00000000000..ec1e8143585 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/bswap.h @@ -0,0 +1,62 @@ +/* +* Byte Swapping Operations +* (C) 1999-2008 Jack Lloyd +* (C) 2007 Yves Jerschow +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BYTE_SWAP_H__ +#define BOTAN_BYTE_SWAP_H__ + +#include +#include + +namespace Botan { + +/* +* Byte Swapping Functions +*/ +inline u16bit reverse_bytes(u16bit input) + { + return rotate_left(input, 8); + } + +inline u32bit reverse_bytes(u32bit input) + { +#if BOTAN_USE_GCC_INLINE_ASM && \ + (defined(BOTAN_TARGET_ARCH_IS_IA32) || defined(BOTAN_TARGET_ARCH_IS_AMD64)) + + /* GCC-style inline assembly for x86 or x86-64 */ + asm("bswapl %0" : "=r" (input) : "0" (input)); + return input; + +#elif defined(_MSC_VER) && defined(BOTAN_TARGET_ARCH_IS_IA32) + /* Visual C++ inline asm for 32-bit x86, by Yves Jerschow */ + __asm mov eax, input; + __asm bswap eax; + +#else + /* Generic implementation */ + input = ((input & 0xFF00FF00) >> 8) | ((input & 0x00FF00FF) << 8); + return rotate_left(input, 16); +#endif + } + +inline u64bit reverse_bytes(u64bit input) + { +#if BOTAN_USE_GCC_INLINE_ASM && defined(BOTAN_TARGET_ARCH_IS_AMD64) + asm("bswapq %0" : "=r" (input) : "0" (input)); + return input; +#else + u32bit hi = ((input >> 40) & 0x00FF00FF) | ((input >> 24) & 0xFF00FF00); + u32bit lo = ((input & 0xFF00FF00) >> 8) | ((input & 0x00FF00FF) << 8); + hi = (hi << 16) | (hi >> 16); + lo = (lo << 16) | (lo >> 16); + return (static_cast(lo) << 32) | hi; +#endif + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/buf_comp/buf_comp.h b/src/libs/3rdparty/botan/src/utils/buf_comp/buf_comp.h new file mode 100644 index 00000000000..3f1e90bad3e --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/buf_comp/buf_comp.h @@ -0,0 +1,126 @@ +/** +* BufferedComputation +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_BUFFERED_COMPUTATION_H__ +#define BOTAN_BUFFERED_COMPUTATION_H__ + +#include + +namespace Botan { + +/** +* This class represents any kind of computation which +* uses an internal state, +* such as hash functions. +*/ +class BOTAN_DLL BufferedComputation + { + public: + + /** + * The length of the output of this function in bytes. + */ + const u32bit OUTPUT_LENGTH; + + /** + * Add new input to process. + * @param in the input to process as a byte array + * @param the length of the byte array + */ + void update(const byte in[], u32bit length) { add_data(in, length); } + + /** + * Add new input to process. + * @param in the input to process as a MemoryRegion + */ + void update(const MemoryRegion& in) { add_data(in, in.size()); } + + /** + * Add new input to process. + * @param str the input to process as a std::string. Will be interpreted + * as a byte array based on + * the strings encoding. + */ + void update(const std::string& str) + { + add_data(reinterpret_cast(str.data()), str.size()); + } + + /** + * Process a single byte. + * @param in the byte to process + */ + void update(byte in) { add_data(&in, 1); } + + /** + * Complete the computation and retrieve the + * final result. + * @param out The byte array to be filled with the result. + * Must be of length OUTPUT_LENGTH. + */ + void final(byte out[]) { final_result(out); } + + /** + * Complete the computation and retrieve the + * final result. + * @return a SecureVector holding the result + */ + SecureVector final() + { + SecureVector output(OUTPUT_LENGTH); + final_result(output); + return output; + } + + /** + * Update and finalize computation. Does the same as calling update() + * and final() consecutively. + * @param in the input to process as a byte array + * @param length the length of the byte array + * @result the result of the call to final() + */ + SecureVector process(const byte in[], u32bit length) + { + add_data(in, length); + return final(); + } + + /** + * Update and finalize computation. Does the same as calling update() + * and final() consecutively. + * @param in the input to process + * @result the result of the call to final() + */ + SecureVector process(const MemoryRegion& in) + { + add_data(in, in.size()); + return final(); + } + + /** + * Update and finalize computation. Does the same as calling update() + * and final() consecutively. + * @param in the input to process as a string + * @result the result of the call to final() + */ + SecureVector process(const std::string& in) + { + update(in); + return final(); + } + + BufferedComputation(u32bit out_len) : OUTPUT_LENGTH(out_len) {} + virtual ~BufferedComputation() {} + private: + BufferedComputation& operator=(const BufferedComputation&); + virtual void add_data(const byte[], u32bit) = 0; + virtual void final_result(byte[]) = 0; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/buf_comp/info.txt b/src/libs/3rdparty/botan/src/utils/buf_comp/info.txt new file mode 100644 index 00000000000..bcbbc23e2b2 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/buf_comp/info.txt @@ -0,0 +1,11 @@ +realname "Buffered Computation" + +load_on auto + + +buf_comp.h + + + +alloc + diff --git a/src/libs/3rdparty/botan/src/utils/charset.cpp b/src/libs/3rdparty/botan/src/utils/charset.cpp new file mode 100644 index 00000000000..53125cad1b5 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/charset.cpp @@ -0,0 +1,201 @@ +/* +* Character Set Handling +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +namespace Charset { + +namespace { + +/* +* Convert from UCS-2 to ISO 8859-1 +*/ +std::string ucs2_to_latin1(const std::string& ucs2) + { + if(ucs2.size() % 2 == 1) + throw Decoding_Error("UCS-2 string has an odd number of bytes"); + + std::string latin1; + + for(u32bit j = 0; j != ucs2.size(); j += 2) + { + const byte c1 = ucs2[j]; + const byte c2 = ucs2[j+1]; + + if(c1 != 0) + throw Decoding_Error("UCS-2 has non-Latin1 characters"); + + latin1 += static_cast(c2); + } + + return latin1; + } + +/* +* Convert from UTF-8 to ISO 8859-1 +*/ +std::string utf8_to_latin1(const std::string& utf8) + { + std::string iso8859; + + u32bit position = 0; + while(position != utf8.size()) + { + const byte c1 = static_cast(utf8[position++]); + + if(c1 <= 0x7F) + iso8859 += static_cast(c1); + else if(c1 >= 0xC0 && c1 <= 0xC7) + { + if(position == utf8.size()) + throw Decoding_Error("UTF-8: sequence truncated"); + + const byte c2 = static_cast(utf8[position++]); + const byte iso_char = ((c1 & 0x07) << 6) | (c2 & 0x3F); + + if(iso_char <= 0x7F) + throw Decoding_Error("UTF-8: sequence longer than needed"); + + iso8859 += static_cast(iso_char); + } + else + throw Decoding_Error("UTF-8: Unicode chars not in Latin1 used"); + } + + return iso8859; + } + +/* +* Convert from ISO 8859-1 to UTF-8 +*/ +std::string latin1_to_utf8(const std::string& iso8859) + { + std::string utf8; + for(u32bit j = 0; j != iso8859.size(); ++j) + { + const byte c = static_cast(iso8859[j]); + + if(c <= 0x7F) + utf8 += static_cast(c); + else + { + utf8 += static_cast((0xC0 | (c >> 6))); + utf8 += static_cast((0x80 | (c & 0x3F))); + } + } + return utf8; + } + +} + +/* +* Perform character set transcoding +*/ +std::string transcode(const std::string& str, + Character_Set to, Character_Set from) + { + if(to == LOCAL_CHARSET) + to = LATIN1_CHARSET; + if(from == LOCAL_CHARSET) + from = LATIN1_CHARSET; + + if(to == from) + return str; + + if(from == LATIN1_CHARSET && to == UTF8_CHARSET) + return latin1_to_utf8(str); + if(from == UTF8_CHARSET && to == LATIN1_CHARSET) + return utf8_to_latin1(str); + if(from == UCS2_CHARSET && to == LATIN1_CHARSET) + return ucs2_to_latin1(str); + + throw Invalid_Argument("Unknown transcoding operation from " + + to_string(from) + " to " + to_string(to)); + } + +/* +* Check if a character represents a digit +*/ +bool is_digit(char c) + { + if(c == '0' || c == '1' || c == '2' || c == '3' || c == '4' || + c == '5' || c == '6' || c == '7' || c == '8' || c == '9') + return true; + return false; + } + +/* +* Check if a character represents whitespace +*/ +bool is_space(char c) + { + if(c == ' ' || c == '\t' || c == '\n' || c == '\r') + return true; + return false; + } + +/* +* Convert a character to a digit +*/ +byte char2digit(char c) + { + switch(c) + { + case '0': return 0; + case '1': return 1; + case '2': return 2; + case '3': return 3; + case '4': return 4; + case '5': return 5; + case '6': return 6; + case '7': return 7; + case '8': return 8; + case '9': return 9; + } + + throw Invalid_Argument("char2digit: Input is not a digit character"); + } + +/* +* Convert a digit to a character +*/ +char digit2char(byte b) + { + switch(b) + { + case 0: return '0'; + case 1: return '1'; + case 2: return '2'; + case 3: return '3'; + case 4: return '4'; + case 5: return '5'; + case 6: return '6'; + case 7: return '7'; + case 8: return '8'; + case 9: return '9'; + } + + throw Invalid_Argument("digit2char: Input is not a digit"); + } + +/* +* Case-insensitive character comparison +*/ +bool caseless_cmp(char a, char b) + { + return (std::tolower(static_cast(a)) == + std::tolower(static_cast(b))); + } + +} + +} diff --git a/src/libs/3rdparty/botan/src/utils/charset.h b/src/libs/3rdparty/botan/src/utils/charset.h new file mode 100644 index 00000000000..eebb1997db9 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/charset.h @@ -0,0 +1,44 @@ +/* +* Character Set Handling +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_CHARSET_H__ +#define BOTAN_CHARSET_H__ + +#include +#include + +namespace Botan { + +/** +* The different charsets (nominally) supported by Botan. +*/ +enum Character_Set { + LOCAL_CHARSET, + UCS2_CHARSET, + UTF8_CHARSET, + LATIN1_CHARSET +}; + +namespace Charset { + +/* +* Character Set Handling +*/ +std::string transcode(const std::string&, Character_Set, Character_Set); + +bool is_digit(char); +bool is_space(char); +bool caseless_cmp(char, char); + +byte char2digit(char); +char digit2char(byte); + +} + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/datastor/datastor.cpp b/src/libs/3rdparty/botan/src/utils/datastor/datastor.cpp new file mode 100644 index 00000000000..129dad9bff0 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/datastor/datastor.cpp @@ -0,0 +1,172 @@ +/* +* Data Store +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +/* +* Default Matcher transform operation (identity) +*/ +std::pair +Data_Store::Matcher::transform(const std::string& key, + const std::string& value) const + { + return std::make_pair(key, value); + } + +/* +* Data_Store Equality Comparison +*/ +bool Data_Store::operator==(const Data_Store& other) const + { + return (contents == other.contents); + } + +/* +* Check if this key has at least one value +*/ +bool Data_Store::has_value(const std::string& key) const + { + return (contents.lower_bound(key) != contents.end()); + } + +/* +* Search based on an arbitrary predicate +*/ +std::multimap +Data_Store::search_with(const Matcher& matcher) const + { + std::multimap out; + + std::multimap::const_iterator i = + contents.begin(); + + while(i != contents.end()) + { + if(matcher(i->first, i->second)) + out.insert(matcher.transform(i->first, i->second)); + ++i; + } + + return out; + } + +/* +* Search based on key equality +*/ +std::vector Data_Store::get(const std::string& looking_for) const + { + typedef std::multimap::const_iterator iter; + + std::pair range = contents.equal_range(looking_for); + + std::vector out; + for(iter i = range.first; i != range.second; ++i) + out.push_back(i->second); + return out; + } + +/* +* Get a single atom +*/ +std::string Data_Store::get1(const std::string& key) const + { + std::vector vals = get(key); + + if(vals.empty()) + throw Invalid_State("Data_Store::get1: Not values for " + key); + if(vals.size() > 1) + throw Invalid_State("Data_Store::get1: More than one value for " + key); + + return vals[0]; + } + +/* +* Get a single MemoryVector atom +*/ +MemoryVector +Data_Store::get1_memvec(const std::string& key) const + { + std::vector vals = get(key); + + if(vals.size() > 1) + throw Invalid_State("Data_Store::get1_memvec: Multiple values for " + + key); + + if(vals.empty()) + return MemoryVector(); + + Pipe pipe(new Hex_Decoder(FULL_CHECK)); + pipe.start_msg(); + if(vals.size()) + pipe.write(vals[0]); + pipe.end_msg(); + return pipe.read_all(); + } + +/* +* Get a single u32bit atom +*/ +u32bit Data_Store::get1_u32bit(const std::string& key, + u32bit default_val) const + { + std::vector vals = get(key); + + if(vals.empty()) + return default_val; + else if(vals.size() > 1) + throw Invalid_State("Data_Store::get1_u32bit: Multiple values for " + + key); + + return to_u32bit(vals[0]); + } + +/* +* Insert a single key and value +*/ +void Data_Store::add(const std::string& key, const std::string& val) + { + multimap_insert(contents, key, val); + } + +/* +* Insert a single key and value +*/ +void Data_Store::add(const std::string& key, u32bit val) + { + add(key, to_string(val)); + } + +/* +* Insert a single key and value +*/ +void Data_Store::add(const std::string& key, const MemoryRegion& val) + { + Pipe pipe(new Hex_Encoder); + pipe.process_msg(val); + add(key, pipe.read_all_as_string()); + } + +/* +* Insert a mapping of key/value pairs +*/ +void Data_Store::add(const std::multimap& in) + { + std::multimap::const_iterator i = in.begin(); + while(i != in.end()) + { + contents.insert(*i); + ++i; + } + } + +} diff --git a/src/libs/3rdparty/botan/src/utils/datastor/datastor.h b/src/libs/3rdparty/botan/src/utils/datastor/datastor.h new file mode 100644 index 00000000000..7ee626fda2c --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/datastor/datastor.h @@ -0,0 +1,61 @@ +/* +* Data Store +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_DATA_STORE_H__ +#define BOTAN_DATA_STORE_H__ + +#include +#include +#include +#include +#include + +namespace Botan { + +/** +* Data Store +*/ +class BOTAN_DLL Data_Store + { + public: + class BOTAN_DLL Matcher + { + public: + virtual bool operator()(const std::string&, + const std::string&) const = 0; + + virtual std::pair + transform(const std::string&, const std::string&) const; + + virtual ~Matcher() {} + }; + + bool operator==(const Data_Store&) const; + + std::multimap + search_with(const Matcher&) const; + + std::vector get(const std::string&) const; + + std::string get1(const std::string&) const; + + MemoryVector get1_memvec(const std::string&) const; + u32bit get1_u32bit(const std::string&, u32bit = 0) const; + + bool has_value(const std::string&) const; + + void add(const std::multimap&); + void add(const std::string&, const std::string&); + void add(const std::string&, u32bit); + void add(const std::string&, const MemoryRegion&); + private: + std::multimap contents; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/datastor/info.txt b/src/libs/3rdparty/botan/src/utils/datastor/info.txt new file mode 100644 index 00000000000..8c38a3ac805 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/datastor/info.txt @@ -0,0 +1,13 @@ +realname "Datastore" + +load_on auto + + +datastor.cpp +datastor.h + + + +alloc +filters + diff --git a/src/libs/3rdparty/botan/src/utils/exceptn.cpp b/src/libs/3rdparty/botan/src/utils/exceptn.cpp new file mode 100644 index 00000000000..753d634248a --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/exceptn.cpp @@ -0,0 +1,62 @@ +/* +* Exceptions +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* +* Constructor for Invalid_Key_Length +*/ +Invalid_Key_Length::Invalid_Key_Length(const std::string& name, u32bit length) + { + set_msg(name + " cannot accept a key of length " + to_string(length)); + } + +/* +* Constructor for Invalid_Block_Size +*/ +Invalid_Block_Size::Invalid_Block_Size(const std::string& mode, + const std::string& pad) + { + set_msg("Padding method " + pad + " cannot be used with " + mode); + } + +/* +* Constructor for Invalid_IV_Length +*/ +Invalid_IV_Length::Invalid_IV_Length(const std::string& mode, u32bit bad_len) + { + set_msg("IV length " + to_string(bad_len) + " is invalid for " + mode); + } + +/* +* Constructor for Algorithm_Not_Found +*/ +Algorithm_Not_Found::Algorithm_Not_Found(const std::string& name) + { + set_msg("Could not find any algorithm named \"" + name + "\""); + } + +/* +* Constructor for Invalid_Algorithm_Name +*/ +Invalid_Algorithm_Name::Invalid_Algorithm_Name(const std::string& name) + { + set_msg("Invalid algorithm name: " + name); + } + +/* +* Constructor for Config_Error +*/ +Config_Error::Config_Error(const std::string& err, u32bit line) + { + set_msg("Config error at line " + to_string(line) + ": " + err); + } + +} diff --git a/src/libs/3rdparty/botan/src/utils/exceptn.h b/src/libs/3rdparty/botan/src/utils/exceptn.h new file mode 100644 index 00000000000..a55d842bcca --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/exceptn.h @@ -0,0 +1,197 @@ +/* +* Exceptions +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_EXCEPTION_H__ +#define BOTAN_EXCEPTION_H__ + +#include +#include +#include + +namespace Botan { + +/* +* Exception Base Class +*/ +class BOTAN_DLL Exception : public std::exception + { + public: + const char* what() const throw() { return msg.c_str(); } + Exception(const std::string& m = "Unknown error") { set_msg(m); } + virtual ~Exception() throw() {} + protected: + void set_msg(const std::string& m) { msg = "Botan: " + m; } + private: + std::string msg; + }; + +/* +* Invalid_Argument Exception +*/ +struct BOTAN_DLL Invalid_Argument : public Exception + { + Invalid_Argument(const std::string& err = "") : Exception(err) {} + }; + +/* +* Invalid_Key_Length Exception +*/ +struct BOTAN_DLL Invalid_Key_Length : public Invalid_Argument + { + Invalid_Key_Length(const std::string&, u32bit); + }; + +/* +* Invalid_Block_Size Exception +*/ +struct BOTAN_DLL Invalid_Block_Size : public Invalid_Argument + { + Invalid_Block_Size(const std::string&, const std::string&); + }; + +/* +* Invalid_IV_Length Exception +*/ +struct BOTAN_DLL Invalid_IV_Length : public Invalid_Argument + { + Invalid_IV_Length(const std::string&, u32bit); + }; + +/* +* Invalid_State Exception +*/ +struct BOTAN_DLL Invalid_State : public Exception + { + Invalid_State(const std::string& err) : Exception(err) {} + }; + +/* +* PRNG_Unseeded Exception +*/ +struct BOTAN_DLL PRNG_Unseeded : public Invalid_State + { + PRNG_Unseeded(const std::string& algo) : + Invalid_State("PRNG not seeded: " + algo) {} + }; + +/* +* Policy_Violation Exception +*/ +struct BOTAN_DLL Policy_Violation : public Invalid_State + { + Policy_Violation(const std::string& err) : + Invalid_State("Policy violation: " + err) {} + }; + +/* +* Lookup_Error Exception +*/ +struct BOTAN_DLL Lookup_Error : public Exception + { + Lookup_Error(const std::string& err) : Exception(err) {} + }; + +/* +* Algorithm_Not_Found Exception +*/ +struct BOTAN_DLL Algorithm_Not_Found : public Exception + { + Algorithm_Not_Found(const std::string&); + }; + +/* +* Format_Error Exception +*/ +struct BOTAN_DLL Format_Error : public Exception + { + Format_Error(const std::string& err = "") : Exception(err) {} + }; + +/* +* Invalid_Algorithm_Name Exception +*/ +struct BOTAN_DLL Invalid_Algorithm_Name : public Format_Error + { + Invalid_Algorithm_Name(const std::string&); + }; + +/* +* Encoding_Error Exception +*/ +struct BOTAN_DLL Encoding_Error : public Format_Error + { + Encoding_Error(const std::string& name) : + Format_Error("Encoding error: " + name) {} + }; + +/* +* Decoding_Error Exception +*/ +struct BOTAN_DLL Decoding_Error : public Format_Error + { + Decoding_Error(const std::string& name) : + Format_Error("Decoding error: " + name) {} + }; + +/* +* Invalid_OID Exception +*/ +struct BOTAN_DLL Invalid_OID : public Decoding_Error + { + Invalid_OID(const std::string& oid) : + Decoding_Error("Invalid ASN.1 OID: " + oid) {} + }; + +/* +* Stream_IO_Error Exception +*/ +struct BOTAN_DLL Stream_IO_Error : public Exception + { + Stream_IO_Error(const std::string& err) : + Exception("I/O error: " + err) {} + }; + +/* +* Configuration Error Exception +*/ +struct BOTAN_DLL Config_Error : public Format_Error + { + Config_Error(const std::string& err) : + Format_Error("Config error: " + err) {} + Config_Error(const std::string&, u32bit); + }; + +/* +* Integrity Failure Exception +*/ +struct BOTAN_DLL Integrity_Failure : public Exception + { + Integrity_Failure(const std::string& err) : + Exception("Integrity failure: " + err) {} + }; + +/* +* Internal_Error Exception +*/ +struct BOTAN_DLL Internal_Error : public Exception + { + Internal_Error(const std::string& err) : + Exception("Internal error: " + err) {} + }; + +/* +* Self Test Failure Exception +*/ +struct BOTAN_DLL Self_Test_Failure : public Internal_Error + { + Self_Test_Failure(const std::string& err) : + Internal_Error("Self test failed: " + err) {} + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/info.txt b/src/libs/3rdparty/botan/src/utils/info.txt new file mode 100644 index 00000000000..ab50b88ade7 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/info.txt @@ -0,0 +1,33 @@ +realname "Utility Functions" + +define UTIL_FUNCTIONS + +load_on always + + +tru64 -> rt + + + +bit_ops.h +bswap.h +charset.cpp +charset.h +exceptn.cpp +exceptn.h +loadstor.h +mem_ops.h +mlock.cpp +parsing.cpp +parsing.h +rotate.h +stl_util.h +types.h +ui.cpp +ui.h +util.cpp +util.h +version.cpp +version.h +xor_buf.h + diff --git a/src/libs/3rdparty/botan/src/utils/loadstor.h b/src/libs/3rdparty/botan/src/utils/loadstor.h new file mode 100644 index 00000000000..77ed1554e46 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/loadstor.h @@ -0,0 +1,281 @@ +/* +* Load/Store Operators +* (C) 1999-2007 Jack Lloyd +* 2007 Yves Jerschow +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_LOAD_STORE_H__ +#define BOTAN_LOAD_STORE_H__ + +#include +#include +#include + +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + +#if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) + +#define BOTAN_ENDIAN_N2B(x) (x) +#define BOTAN_ENDIAN_B2N(x) (x) + +#define BOTAN_ENDIAN_N2L(x) reverse_bytes(x) +#define BOTAN_ENDIAN_L2N(x) reverse_bytes(x) + +#elif defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) + +#define BOTAN_ENDIAN_N2L(x) (x) +#define BOTAN_ENDIAN_L2N(x) (x) + +#define BOTAN_ENDIAN_N2B(x) reverse_bytes(x) +#define BOTAN_ENDIAN_B2N(x) reverse_bytes(x) + +#endif + +#endif + +namespace Botan { + +/* +* Byte Extraction Function +*/ +template inline byte get_byte(u32bit byte_num, T input) + { + return (input >> ((sizeof(T)-1-(byte_num&(sizeof(T)-1))) << 3)); + } + +/* +* Byte to Word Conversions +*/ +inline u16bit make_u16bit(byte i0, byte i1) + { + return ((static_cast(i0) << 8) | i1); + } + +inline u32bit make_u32bit(byte i0, byte i1, byte i2, byte i3) + { + return ((static_cast(i0) << 24) | + (static_cast(i1) << 16) | + (static_cast(i2) << 8) | + (static_cast(i3))); + } + +inline u64bit make_u64bit(byte i0, byte i1, byte i2, byte i3, + byte i4, byte i5, byte i6, byte i7) + { + return ((static_cast(i0) << 56) | + (static_cast(i1) << 48) | + (static_cast(i2) << 40) | + (static_cast(i3) << 32) | + (static_cast(i4) << 24) | + (static_cast(i5) << 16) | + (static_cast(i6) << 8) | + (static_cast(i7))); + } + +/* +* Endian-Specific Word Loading Operations +*/ +template +inline T load_be(const byte in[], u32bit off) + { + in += off * sizeof(T); + T out = 0; + for(u32bit j = 0; j != sizeof(T); j++) + out = (out << 8) | in[j]; + return out; + } + +template +inline T load_le(const byte in[], u32bit off) + { + in += off * sizeof(T); + T out = 0; + for(u32bit j = 0; j != sizeof(T); j++) + out = (out << 8) | in[sizeof(T)-1-j]; + return out; + } + +template<> +inline u16bit load_be(const byte in[], u32bit off) + { +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + return BOTAN_ENDIAN_N2B(*(reinterpret_cast(in) + off)); +#else + in += off * sizeof(u16bit); + return make_u16bit(in[0], in[1]); +#endif + } + +template<> +inline u16bit load_le(const byte in[], u32bit off) + { +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + return BOTAN_ENDIAN_N2L(*(reinterpret_cast(in) + off)); +#else + in += off * sizeof(u16bit); + return make_u16bit(in[1], in[0]); +#endif + } + +template<> +inline u32bit load_be(const byte in[], u32bit off) + { +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + return BOTAN_ENDIAN_N2B(*(reinterpret_cast(in) + off)); +#else + in += off * sizeof(u32bit); + return make_u32bit(in[0], in[1], in[2], in[3]); +#endif + } + +template<> +inline u32bit load_le(const byte in[], u32bit off) + { +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + return BOTAN_ENDIAN_N2L(*(reinterpret_cast(in) + off)); +#else + in += off * sizeof(u32bit); + return make_u32bit(in[3], in[2], in[1], in[0]); +#endif + } + +template<> +inline u64bit load_be(const byte in[], u32bit off) + { +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + return BOTAN_ENDIAN_N2B(*(reinterpret_cast(in) + off)); +#else + in += off * sizeof(u64bit); + return make_u64bit(in[0], in[1], in[2], in[3], + in[4], in[5], in[6], in[7]); +#endif + } + +template<> +inline u64bit load_le(const byte in[], u32bit off) + { +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + return BOTAN_ENDIAN_N2L(*(reinterpret_cast(in) + off)); +#else + in += off * sizeof(u64bit); + return make_u64bit(in[7], in[6], in[5], in[4], + in[3], in[2], in[1], in[0]); +#endif + } + +/* +* Endian-Specific Word Storing Operations +*/ +inline void store_be(u16bit in, byte out[2]) + { +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + *reinterpret_cast(out) = BOTAN_ENDIAN_B2N(in); +#else + out[0] = get_byte(0, in); + out[1] = get_byte(1, in); +#endif + } + +inline void store_le(u16bit in, byte out[2]) + { +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + *reinterpret_cast(out) = BOTAN_ENDIAN_L2N(in); +#else + out[0] = get_byte(1, in); + out[1] = get_byte(0, in); +#endif + } + +inline void store_be(u32bit in, byte out[4]) + { +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + *reinterpret_cast(out) = BOTAN_ENDIAN_B2N(in); +#else + out[0] = get_byte(0, in); + out[1] = get_byte(1, in); + out[2] = get_byte(2, in); + out[3] = get_byte(3, in); +#endif + } + +inline void store_le(u32bit in, byte out[4]) + { +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + *reinterpret_cast(out) = BOTAN_ENDIAN_L2N(in); +#else + out[0] = get_byte(3, in); + out[1] = get_byte(2, in); + out[2] = get_byte(1, in); + out[3] = get_byte(0, in); +#endif + } + +inline void store_be(u64bit in, byte out[8]) + { +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + *reinterpret_cast(out) = BOTAN_ENDIAN_B2N(in); +#else + out[0] = get_byte(0, in); + out[1] = get_byte(1, in); + out[2] = get_byte(2, in); + out[3] = get_byte(3, in); + out[4] = get_byte(4, in); + out[5] = get_byte(5, in); + out[6] = get_byte(6, in); + out[7] = get_byte(7, in); +#endif + } + +inline void store_le(u64bit in, byte out[8]) + { +#if BOTAN_TARGET_UNALIGNED_LOADSTOR_OK + *reinterpret_cast(out) = BOTAN_ENDIAN_L2N(in); +#else + out[0] = get_byte(7, in); + out[1] = get_byte(6, in); + out[2] = get_byte(5, in); + out[3] = get_byte(4, in); + out[4] = get_byte(3, in); + out[5] = get_byte(2, in); + out[6] = get_byte(1, in); + out[7] = get_byte(0, in); +#endif + } + +template +inline void store_le(byte out[], T a, T b) + { + store_le(a, out + (0 * sizeof(T))); + store_le(b, out + (1 * sizeof(T))); + } + +template +inline void store_be(byte out[], T a, T b) + { + store_be(a, out + (0 * sizeof(T))); + store_be(b, out + (1 * sizeof(T))); + } + +template +inline void store_le(byte out[], T a, T b, T c, T d) + { + store_le(a, out + (0 * sizeof(T))); + store_le(b, out + (1 * sizeof(T))); + store_le(c, out + (2 * sizeof(T))); + store_le(d, out + (3 * sizeof(T))); + } + +template +inline void store_be(byte out[], T a, T b, T c, T d) + { + store_be(a, out + (0 * sizeof(T))); + store_be(b, out + (1 * sizeof(T))); + store_be(c, out + (2 * sizeof(T))); + store_be(d, out + (3 * sizeof(T))); + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/mem_ops.h b/src/libs/3rdparty/botan/src/utils/mem_ops.h new file mode 100644 index 00000000000..0fcf34ba873 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/mem_ops.h @@ -0,0 +1,40 @@ +/* +* Memory Operations +* (C) 1999-2009 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_MEMORY_OPS_H__ +#define BOTAN_MEMORY_OPS_H__ + +#include +#include + +namespace Botan { + +/* +* Memory Manipulation Functions +*/ +template inline void copy_mem(T* out, const T* in, u32bit n) + { std::memmove(out, in, sizeof(T)*n); } + +template inline void clear_mem(T* ptr, u32bit n) + { if(n) std::memset(ptr, 0, sizeof(T)*n); } + +template inline void set_mem(T* ptr, u32bit n, byte val) + { std::memset(ptr, val, sizeof(T)*n); } + +template inline bool same_mem(const T* p1, const T* p2, u32bit n) + { + bool is_same = true; + + for(u32bit i = 0; i != n; ++i) + is_same &= (p1[i] == p2[i]); + + return is_same; + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/mlock.cpp b/src/libs/3rdparty/botan/src/utils/mlock.cpp new file mode 100644 index 00000000000..9bb062da523 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/mlock.cpp @@ -0,0 +1,45 @@ +/* +* Memory Locking Functions +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +#if defined(BOTAN_TARGET_OS_HAS_POSIX_MLOCK) + #include + #include +#elif defined(BOTAN_TARGET_OS_HAS_WIN32_VIRTUAL_LOCK) + #include +#endif + +namespace Botan { + +/* +* Lock an area of memory into RAM +*/ +bool lock_mem(void* ptr, u32bit bytes) + { +#if defined(BOTAN_TARGET_OS_HAS_POSIX_MLOCK) + return (mlock(ptr, bytes) == 0); +#elif defined(BOTAN_TARGET_OS_HAS_WIN32_VIRTUAL_LOCK) + return (VirtualLock(ptr, bytes) != 0); +#else + return false; +#endif + } + +/* +* Unlock a previously locked region of memory +*/ +void unlock_mem(void* ptr, u32bit bytes) + { +#if defined(BOTAN_TARGET_OS_HAS_POSIX_MLOCK) + munlock(ptr, bytes); +#elif defined(BOTAN_TARGET_OS_HAS_WIN32_VIRTUAL_LOCK) + VirtualUnlock(ptr, bytes); +#endif + } + +} diff --git a/src/libs/3rdparty/botan/src/utils/parsing.cpp b/src/libs/3rdparty/botan/src/utils/parsing.cpp new file mode 100644 index 00000000000..bdb9e79dcdd --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/parsing.cpp @@ -0,0 +1,288 @@ +/* +* Parser Functions +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Convert a string into an integer +*/ +u32bit to_u32bit(const std::string& number) + { + u32bit n = 0; + + for(std::string::const_iterator j = number.begin(); j != number.end(); ++j) + { + const u32bit OVERFLOW_MARK = 0xFFFFFFFF / 10; + + byte digit = Charset::char2digit(*j); + + if((n > OVERFLOW_MARK) || (n == OVERFLOW_MARK && digit > 5)) + throw Decoding_Error("to_u32bit: Integer overflow"); + n *= 10; + n += digit; + } + return n; + } + +/* +* Convert an integer into a string +*/ +std::string to_string(u64bit n, u32bit min_len) + { + std::string lenstr; + if(n) + { + while(n > 0) + { + lenstr = Charset::digit2char(n % 10) + lenstr; + n /= 10; + } + } + else + lenstr = "0"; + + while(lenstr.size() < min_len) + lenstr = "0" + lenstr; + + return lenstr; + } + +/* +* Convert a string into a time duration +*/ +u32bit timespec_to_u32bit(const std::string& timespec) + { + if(timespec == "") + return 0; + + const char suffix = timespec[timespec.size()-1]; + std::string value = timespec.substr(0, timespec.size()-1); + + u32bit scale = 1; + + if(Charset::is_digit(suffix)) + value += suffix; + else if(suffix == 's') + scale = 1; + else if(suffix == 'm') + scale = 60; + else if(suffix == 'h') + scale = 60 * 60; + else if(suffix == 'd') + scale = 24 * 60 * 60; + else if(suffix == 'y') + scale = 365 * 24 * 60 * 60; + else + throw Decoding_Error("timespec_to_u32bit: Bad input " + timespec); + + return scale * to_u32bit(value); + } + +/* +* Parse a SCAN-style algorithm name +*/ +std::vector parse_algorithm_name(const std::string& namex) + { + if(namex.find('(') == std::string::npos && + namex.find(')') == std::string::npos) + return std::vector(1, namex); + + std::string name = namex, substring; + std::vector elems; + u32bit level = 0; + + elems.push_back(name.substr(0, name.find('('))); + name = name.substr(name.find('(')); + + for(std::string::const_iterator j = name.begin(); j != name.end(); ++j) + { + char c = *j; + + if(c == '(') + ++level; + if(c == ')') + { + if(level == 1 && j == name.end() - 1) + { + if(elems.size() == 1) + elems.push_back(substring.substr(1)); + else + elems.push_back(substring); + return elems; + } + + if(level == 0 || (level == 1 && j != name.end() - 1)) + throw Invalid_Algorithm_Name(namex); + --level; + } + + if(c == ',' && level == 1) + { + if(elems.size() == 1) + elems.push_back(substring.substr(1)); + else + elems.push_back(substring); + substring.clear(); + } + else + substring += c; + } + + if(substring != "") + throw Invalid_Algorithm_Name(namex); + + return elems; + } + +/* +* Split the string on slashes +*/ +std::vector split_on(const std::string& str, char delim) + { + std::vector elems; + if(str == "") return elems; + + std::string substr; + for(std::string::const_iterator j = str.begin(); j != str.end(); ++j) + { + if(*j == delim) + { + if(substr != "") + elems.push_back(substr); + substr.clear(); + } + else + substr += *j; + } + + if(substr == "") + throw Format_Error("Unable to split string: " + str); + elems.push_back(substr); + + return elems; + } + +/* +* Parse an ASN.1 OID string +*/ +std::vector parse_asn1_oid(const std::string& oid) + { + std::string substring; + std::vector oid_elems; + + for(std::string::const_iterator j = oid.begin(); j != oid.end(); ++j) + { + char c = *j; + + if(c == '.') + { + if(substring == "") + throw Invalid_OID(oid); + oid_elems.push_back(to_u32bit(substring)); + substring.clear(); + } + else + substring += c; + } + + if(substring == "") + throw Invalid_OID(oid); + oid_elems.push_back(to_u32bit(substring)); + + if(oid_elems.size() < 2) + throw Invalid_OID(oid); + + return oid_elems; + } + +/* +* X.500 String Comparison +*/ +bool x500_name_cmp(const std::string& name1, const std::string& name2) + { + std::string::const_iterator p1 = name1.begin(); + std::string::const_iterator p2 = name2.begin(); + + while((p1 != name1.end()) && Charset::is_space(*p1)) ++p1; + while((p2 != name2.end()) && Charset::is_space(*p2)) ++p2; + + while(p1 != name1.end() && p2 != name2.end()) + { + if(Charset::is_space(*p1)) + { + if(!Charset::is_space(*p2)) + return false; + + while((p1 != name1.end()) && Charset::is_space(*p1)) ++p1; + while((p2 != name2.end()) && Charset::is_space(*p2)) ++p2; + + if(p1 == name1.end() && p2 == name2.end()) + return true; + } + + if(!Charset::caseless_cmp(*p1, *p2)) + return false; + ++p1; + ++p2; + } + + while((p1 != name1.end()) && Charset::is_space(*p1)) ++p1; + while((p2 != name2.end()) && Charset::is_space(*p2)) ++p2; + + if((p1 != name1.end()) || (p2 != name2.end())) + return false; + return true; + } + +/* +* Convert a decimal-dotted string to binary IP +*/ +u32bit string_to_ipv4(const std::string& str) + { + std::vector parts = split_on(str, '.'); + + if(parts.size() != 4) + throw Decoding_Error("Invalid IP string " + str); + + u32bit ip = 0; + + for(size_t j = 0; j != parts.size(); j++) + { + u32bit octet = to_u32bit(parts[j]); + + if(octet > 255) + throw Decoding_Error("Invalid IP string " + str); + + ip = (ip << 8) | (octet & 0xFF); + } + + return ip; + } + +/* +* Convert an IP address to decimal-dotted string +*/ +std::string ipv4_to_string(u32bit ip) + { + std::string str; + + for(size_t j = 0; j != sizeof(ip); j++) + { + if(j) + str += "."; + str += to_string(get_byte(j, ip)); + } + + return str; + } + +} diff --git a/src/libs/3rdparty/botan/src/utils/parsing.h b/src/libs/3rdparty/botan/src/utils/parsing.h new file mode 100644 index 00000000000..2c29d5b4d20 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/parsing.h @@ -0,0 +1,41 @@ +/* +* Parser Functions +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_PARSER_H__ +#define BOTAN_PARSER_H__ + +#include +#include +#include + +namespace Botan { + +/* +* String Parsing Functions +*/ +BOTAN_DLL std::vector parse_algorithm_name(const std::string&); +BOTAN_DLL std::vector split_on(const std::string&, char); +BOTAN_DLL std::vector parse_asn1_oid(const std::string&); +BOTAN_DLL bool x500_name_cmp(const std::string&, const std::string&); + +/* +* String/Integer Conversions +*/ +BOTAN_DLL std::string to_string(u64bit, u32bit = 0); +BOTAN_DLL u32bit to_u32bit(const std::string&); + +BOTAN_DLL u32bit timespec_to_u32bit(const std::string& timespec); + +/* +* String/Network Address Conversions +*/ +BOTAN_DLL u32bit string_to_ipv4(const std::string&); +BOTAN_DLL std::string ipv4_to_string(u32bit); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/rotate.h b/src/libs/3rdparty/botan/src/utils/rotate.h new file mode 100644 index 00000000000..c8f8d4a1a01 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/rotate.h @@ -0,0 +1,30 @@ +/* +* Word Rotation Operations +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_WORD_ROTATE_H__ +#define BOTAN_WORD_ROTATE_H__ + +#include + +namespace Botan { + +/* +* Word Rotation Functions +*/ +template inline T rotate_left(T input, u32bit rot) + { + return static_cast((input << rot) | (input >> (8*sizeof(T)-rot)));; + } + +template inline T rotate_right(T input, u32bit rot) + { + return static_cast((input >> rot) | (input << (8*sizeof(T)-rot))); + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/stl_util.h b/src/libs/3rdparty/botan/src/utils/stl_util.h new file mode 100644 index 00000000000..18c8b149b1d --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/stl_util.h @@ -0,0 +1,86 @@ +/* +* STL Utility Functions +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_STL_UTIL_H__ +#define BOTAN_STL_UTIL_H__ + +#include + +namespace Botan { + +/* +* Copy-on-Predicate Algorithm +*/ +template +OutputIterator copy_if(InputIterator current, InputIterator end, + OutputIterator dest, Predicate copy_p) + { + while(current != end) + { + if(copy_p(*current)) + *dest++ = *current; + ++current; + } + return dest; + } + +/* +* Searching through a std::map +*/ +template +inline V search_map(const std::map& mapping, + const K& key, + const V& null_result = V()) + { + typename std::map::const_iterator i = mapping.find(key); + if(i == mapping.end()) + return null_result; + return i->second; + } + +template +inline R search_map(const std::map& mapping, const K& key, + const R& null_result, const R& found_result) + { + typename std::map::const_iterator i = mapping.find(key); + if(i == mapping.end()) + return null_result; + return found_result; + } + +/* +* Function adaptor for delete operation +*/ +template +class del_fun : public std::unary_function + { + public: + void operator()(T* ptr) { delete ptr; } + }; + +/* +* Delete the second half of a pair of objects +*/ +template +void delete2nd(Pair& pair) + { + delete pair.second; + } + +/* +* Insert a key/value pair into a multimap +*/ +template +void multimap_insert(std::multimap& multimap, + const K& key, const V& value) + { + multimap.insert(std::make_pair(key, value)); + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/types.h b/src/libs/3rdparty/botan/src/utils/types.h new file mode 100644 index 00000000000..304628d027b --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/types.h @@ -0,0 +1,42 @@ +/* +* Low Level Types +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_TYPES_H__ +#define BOTAN_TYPES_H__ + +#include + +namespace Botan { + +typedef unsigned char byte; +typedef unsigned short u16bit; +typedef unsigned int u32bit; + +typedef signed int s32bit; + +#if defined(_MSC_VER) || defined(__BORLANDC__) + typedef unsigned __int64 u64bit; +#elif defined(__KCC) + typedef unsigned __long_long u64bit; +#elif defined(__GNUG__) + __extension__ typedef unsigned long long u64bit; +#else + typedef unsigned long long u64bit; +#endif + +static const u32bit DEFAULT_BUFFERSIZE = BOTAN_DEFAULT_BUFFER_SIZE; + +} + +namespace Botan_types { + +using Botan::byte; +using Botan::u32bit; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/ui.cpp b/src/libs/3rdparty/botan/src/utils/ui.cpp new file mode 100644 index 00000000000..e6c3430ff1f --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/ui.cpp @@ -0,0 +1,36 @@ +/* +* User Interface +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include + +namespace Botan { + +/* +* Get a passphrase from the user +*/ +std::string User_Interface::get_passphrase(const std::string&, + const std::string&, + UI_Result& action) const + { + action = OK; + + if(!first_try) + action = CANCEL_ACTION; + + return preset_passphrase; + } + +/* +* User_Interface Constructor +*/ +User_Interface::User_Interface(const std::string& preset) : + preset_passphrase(preset) + { + first_try = true; + } + +} diff --git a/src/libs/3rdparty/botan/src/utils/ui.h b/src/libs/3rdparty/botan/src/utils/ui.h new file mode 100644 index 00000000000..fe62c60fc76 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/ui.h @@ -0,0 +1,36 @@ +/* +* User Interface +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_UI_H__ +#define BOTAN_UI_H__ + +#include +#include + +namespace Botan { + +/* +* User Interface +*/ +class BOTAN_DLL User_Interface + { + public: + enum UI_Result { OK, CANCEL_ACTION }; + + virtual std::string get_passphrase(const std::string&, + const std::string&, + UI_Result&) const; + User_Interface(const std::string& = ""); + virtual ~User_Interface() {} + protected: + std::string preset_passphrase; + mutable bool first_try; + }; + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/util.cpp b/src/libs/3rdparty/botan/src/utils/util.cpp new file mode 100644 index 00000000000..84dfd1a143c --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/util.cpp @@ -0,0 +1,68 @@ +/* +* Utility Functions +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include +#include + +namespace Botan { + +/* +* Round up n to multiple of align_to +*/ +u32bit round_up(u32bit n, u32bit align_to) + { + if(n % align_to || n == 0) + n += align_to - (n % align_to); + return n; + } + +/* +* Round down n to multiple of align_to +*/ +u32bit round_down(u32bit n, u32bit align_to) + { + return (n - (n % align_to)); + } + +/* +* Choose the exponent size for a DL group +*/ +u32bit dl_work_factor(u32bit bits) + { +#if 0 + /* + These values were taken from RFC 3526 + */ + if(bits <= 1536) + return 90; + else if(bits <= 2048) + return 110; + else if(bits <= 3072) + return 130; + else if(bits <= 4096) + return 150; + else if(bits <= 6144) + return 170; + else if(bits <= 8192) + return 190; + return 256; +#else + const u32bit MIN_ESTIMATE = 64; + + const double log_x = bits / 1.44; + + const double strength = + 2.76 * std::pow(log_x, 1.0/3.0) * std::pow(std::log(log_x), 2.0/3.0); + + if(strength > MIN_ESTIMATE) + return static_cast(strength); + return MIN_ESTIMATE; +#endif + } + +} diff --git a/src/libs/3rdparty/botan/src/utils/util.h b/src/libs/3rdparty/botan/src/utils/util.h new file mode 100644 index 00000000000..ac786739004 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/util.h @@ -0,0 +1,39 @@ +/* +* Utility Functions +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_UTIL_H__ +#define BOTAN_UTIL_H__ + +#include + +namespace Botan { + +/* +* Time Access Functions +*/ +BOTAN_DLL u64bit system_time(); + +/* +* Memory Locking Functions +*/ +BOTAN_DLL bool lock_mem(void*, u32bit); +BOTAN_DLL void unlock_mem(void*, u32bit); + +/* +* Misc Utility Functions +*/ +BOTAN_DLL u32bit round_up(u32bit, u32bit); +BOTAN_DLL u32bit round_down(u32bit, u32bit); + +/* +* Work Factor Estimates +*/ +BOTAN_DLL u32bit dl_work_factor(u32bit); + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/version.cpp b/src/libs/3rdparty/botan/src/utils/version.cpp new file mode 100644 index 00000000000..d540864b284 --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/version.cpp @@ -0,0 +1,36 @@ +/* +* Version Information +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include +#include + +namespace Botan { + +/* + These are intentionally compiled rather than inlined, so an + application running against a shared library can test the true + version they are running against. +*/ + +/* +* Return the version as a string +*/ +std::string version_string() + { + return to_string(version_major()) + "." + + to_string(version_minor()) + "." + + to_string(version_patch()); + } + +/* +* Return parts of the version as integers +*/ +u32bit version_major() { return BOTAN_VERSION_MAJOR; } +u32bit version_minor() { return BOTAN_VERSION_MINOR; } +u32bit version_patch() { return BOTAN_VERSION_PATCH; } + +} diff --git a/src/libs/3rdparty/botan/src/utils/version.h b/src/libs/3rdparty/botan/src/utils/version.h new file mode 100644 index 00000000000..3cc44e8068a --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/version.h @@ -0,0 +1,61 @@ +/* +* Version Information +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_VERSION_H__ +#define BOTAN_VERSION_H__ + +#include +#include + +namespace Botan { + +/* +* Get information describing the version +*/ + +/** +* Get the version string identifying the version of Botan. +* @return the version string +*/ +BOTAN_DLL std::string version_string(); + +/** +* Get the major version number. +* @return the major version number +*/ +BOTAN_DLL u32bit version_major(); + +/** +* Get the minor version number. +* @return the minor version number +*/ +BOTAN_DLL u32bit version_minor(); + +/** +* Get the patch number. +* @return the patch number +*/ +BOTAN_DLL u32bit version_patch(); + +/* +* Macros for compile-time version checks +*/ +#define BOTAN_VERSION_CODE_FOR(a,b,c) ((a << 16) | (b << 8) | (c)) + +/** +* Compare using BOTAN_VERSION_CODE_FOR, as in +* # if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,8,0) +* # error "Botan version too old" +* # endif +*/ +#define BOTAN_VERSION_CODE BOTAN_VERSION_CODE_FOR(BOTAN_VERSION_MAJOR, \ + BOTAN_VERSION_MINOR, \ + BOTAN_VERSION_PATCH) + +} + +#endif diff --git a/src/libs/3rdparty/botan/src/utils/xor_buf.h b/src/libs/3rdparty/botan/src/utils/xor_buf.h new file mode 100644 index 00000000000..39781f0174e --- /dev/null +++ b/src/libs/3rdparty/botan/src/utils/xor_buf.h @@ -0,0 +1,74 @@ +/** +* XOR operations +* (C) 1999-2008 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_XOR_BUF_H__ +#define BOTAN_XOR_BUF_H__ + +#include + +namespace Botan { + +/** +* XOR arrays. Postcondition out[i] = in[i] ^ out[i] forall i = 0...length +* @param out the input/output buffer +* @param in the read-only input buffer +* @param length the length of the buffers +*/ +inline void xor_buf(byte out[], const byte in[], u32bit length) + { + while(length >= 8) + { +#if BOTAN_UNALIGNED_LOADSTOR_OK + *reinterpret_cast(out) ^= *reinterpret_cast(in); +#else + out[0] ^= in[0]; out[1] ^= in[1]; + out[2] ^= in[2]; out[3] ^= in[3]; + out[4] ^= in[4]; out[5] ^= in[5]; + out[6] ^= in[6]; out[7] ^= in[7]; +#endif + + out += 8; in += 8; length -= 8; + } + for(u32bit j = 0; j != length; ++j) + out[j] ^= in[j]; + } + +/** +* XOR arrays. Postcondition out[i] = in[i] ^ in2[i] forall i = 0...length +* @param out the output buffer +* @param in the first input buffer +* @param in2 the second output buffer +* @param length the length of the three buffers +*/ +inline void xor_buf(byte out[], + const byte in[], + const byte in2[], + u32bit length) + { + while(length >= 8) + { +#if BOTAN_UNALIGNED_LOADSTOR_OK + *reinterpret_cast(out) = + *reinterpret_cast(in) ^ + *reinterpret_cast(in2); +#else + out[0] = in[0] ^ in2[0]; out[1] = in[1] ^ in2[1]; + out[2] = in[2] ^ in2[2]; out[3] = in[3] ^ in2[3]; + out[4] = in[4] ^ in2[4]; out[5] = in[5] ^ in2[5]; + out[6] = in[6] ^ in2[6]; out[7] = in[7] ^ in2[7]; +#endif + + in += 8; in2 += 8; out += 8; length -= 8; + } + + for(u32bit j = 0; j != length; ++j) + out[j] = in[j] ^ in2[j]; + } + +} + +#endif diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/botan/__init__.py b/src/libs/3rdparty/botan/wrappers/boost-python/botan/__init__.py new file mode 100644 index 00000000000..9e136ed3946 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/botan/__init__.py @@ -0,0 +1,27 @@ +from _botan import * + +# Initialize the library when the module is imported +init = LibraryInitializer() + +class SymmetricKey(OctetString): + pass + +class InitializationVector(OctetString): + pass + +def Filter(name, key = None, iv = None, dir = None): + if key != None and iv != None and dir != None: + return make_filter(name, key, iv, dir) + elif key != None and dir != None: + return make_filter(name, key, dir) + elif key != None: + return make_filter(name, key) + else: + return make_filter(name) + +def Pipe(*filters): + pipe = PipeObj() + for filter in filters: + if filter: + pipe.append(filter) + return pipe diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/nisttest.py b/src/libs/3rdparty/botan/wrappers/boost-python/nisttest.py new file mode 100644 index 00000000000..3ea8fda0fa0 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/nisttest.py @@ -0,0 +1,61 @@ +#!/usr/bin/python + +import sys, os, botan +from os.path import join; + +def validate(ca_certs, certs, crls, ee_certs): + store = botan.X509_Store() + for cert in certs: + if cert not in ee_certs: + store.add_cert(botan.X509_Certificate(cert), cert in ca_certs) + + for crl in crls: + r = store.add_crl(botan.X509_CRL(crl)) + if r != botan.verify_result.verified: + return r + + for ee in ee_certs: + r = store.validate(botan.X509_Certificate(ee)) + if r != botan.verify_result.verified: + return r + + return botan.verify_result.verified + +def run_test(files, rootdir, testname, expected): + crls = [join(rootdir,x) for x in files if x.endswith(".crl")] + certs = [join(rootdir,x) for x in files if x.endswith(".crt")] + end_entity = [x for x in certs if x.find("end.crt") != -1] + ca_certs = [x for x in certs if x.find("root.crt") != -1] + + print "%s..." % testname, + + result = validate(ca_certs, certs, crls, end_entity) + result = repr(result).replace('botan._botan.verify_result.', '') + + if result != expected: + print "FAILED: got %s, expected %s" % (result, expected) + else: + print "passed" + +def main(): + def load_results(file): + results = {} + for line in open(file, 'r'): + line = line[0:line.find('#')].strip() + if line: + test,result = line.split(' ') + results[test] = result + return results + + results = load_results('results.txt') + + for root, dirs, files in os.walk('../../checks/nist_tests/tests'): + if files: + thistest = root[root.rfind('/')+1:] + if thistest in results: + run_test(files, root, thistest, results[thistest]) + else: + print "%s... skipping - no expected result set" % thistest + +if __name__ == "__main__": + sys.exit(main()) diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/results.txt b/src/libs/3rdparty/botan/wrappers/boost-python/results.txt new file mode 100644 index 00000000000..7a382400141 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/results.txt @@ -0,0 +1,60 @@ +# This is the file of expected results for nisttest.py +test01 verified +test02 signature_error +test03 signature_error +test04 verified +test05 cert_not_yet_valid +test06 cert_not_yet_valid +test07 verified +test08 cert_not_yet_valid +test09 cert_has_expired +test10 cert_has_expired +test11 cert_has_expired +test12 verified +test13 cert_issuer_not_found +test14 cert_issuer_not_found +test15 verified +test16 verified +test17 verified +test18 verified +# changed; should be no_revocation_data_available, but I don't want to +# force people to use CRLs +test19 verified +test20 cert_is_revoked +test21 cert_is_revoked +test22 ca_cert_not_for_cert_issuer +test23 ca_cert_not_for_cert_issuer +test24 verified +test25 ca_cert_not_for_cert_issuer +test26 verified +test27 verified +test28 ca_cert_not_for_cert_issuer +test29 ca_cert_not_for_cert_issuer +test30 verified +test31 ca_cert_not_for_crl_issuer +test32 ca_cert_not_for_crl_issuer +test33 verified +test54 cert_chain_too_long +test55 cert_chain_too_long +test56 verified +test57 verified +test58 cert_chain_too_long +test59 cert_chain_too_long +test60 cert_chain_too_long +test61 cert_chain_too_long +test62 verified +test63 verified +test64 signature_error +# changed; I have no idea why this test is supposed to fail +test65 verified +test66 crl_issuer_not_found +# changed; one of the CRLs has an unknown creator, so we fail +# prior to getting to the end-entity check +test67 crl_issuer_not_found +test68 cert_is_revoked +test69 cert_is_revoked +test70 cert_is_revoked +test71 cert_is_revoked +test72 crl_has_expired +test73 crl_has_expired +test74 verified diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/rng_test.py b/src/libs/3rdparty/botan/wrappers/boost-python/rng_test.py new file mode 100644 index 00000000000..06c79b84e5a --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/rng_test.py @@ -0,0 +1,22 @@ +#!/usr/bin/python + +import botan + +rng = botan.RandomNumberGenerator() + +print "name", rng.name() + +rng.add_entropy("blah") + +print "random 16", rng.gen_random(16).encode("hex") +print "random 32", rng.gen_random(32).encode("base64"), + +rng.reseed() + +for i in range(0, 10): + print rng.gen_random_byte(), +print + +rng.add_entropy("blah") + +print "random 16", rng.gen_random(16).encode("hex") diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/src/block.cpp b/src/libs/3rdparty/botan/wrappers/boost-python/src/block.cpp new file mode 100644 index 00000000000..185b88811f3 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/src/block.cpp @@ -0,0 +1,152 @@ +/************************************************* +* Boost.Python module definition * +* (C) 1999-2007 Jack Lloyd * +*************************************************/ + +#include +using namespace Botan; + +#include "python_botan.h" + +class Py_BlockCipher : public BlockCipher + { + public: + virtual std::string enc_str(const std::string&) const = 0; + virtual std::string dec_str(const std::string&) const = 0; + virtual void set_key_obj(const OctetString&) = 0; + + void clear() throw() {} + + void enc(const byte in[], byte out[]) const + { + string2binary( + enc_str(make_string(in, BLOCK_SIZE)), + out, BLOCK_SIZE); + } + + void dec(const byte in[], byte out[]) const + { + string2binary( + dec_str(make_string(in, BLOCK_SIZE)), + out, BLOCK_SIZE); + } + + void key(const byte key[], u32bit len) + { + set_key_obj(OctetString(key, len)); + } + + Py_BlockCipher(u32bit bs, u32bit kmin, u32bit kmax, u32bit kmod) : + BlockCipher(bs, kmin, kmax, kmod) + { + } + }; + +std::string encrypt_string(BlockCipher* cipher, const std::string& in) + { + if(in.size() != cipher->BLOCK_SIZE) + throw Bad_Size(in.size(), cipher->BLOCK_SIZE); + + SecureVector out(cipher->BLOCK_SIZE); + cipher->encrypt((const byte*)in.data(), out); + return make_string(out); + } + +std::string decrypt_string(BlockCipher* cipher, const std::string& in) + { + if(in.size() != cipher->BLOCK_SIZE) + throw Bad_Size(in.size(), cipher->BLOCK_SIZE); + + SecureVector out(cipher->BLOCK_SIZE); + cipher->decrypt((const byte*)in.data(), out); + return make_string(out); + } + +class Wrapped_Block_Cipher : public BlockCipher + { + public: + void clear() throw() { cipher->clear(); } + + void enc(const byte in[], byte out[]) const { cipher->encrypt(in, out); } + void dec(const byte in[], byte out[]) const { cipher->decrypt(in, out); } + void key(const byte key[], u32bit len) { cipher->set_key(key, len); } + std::string name() const { return cipher->name(); } + BlockCipher* clone() const { return cipher->clone(); } + + Wrapped_Block_Cipher(python::object py_obj, BlockCipher* c) : + BlockCipher(c->BLOCK_SIZE, c->MINIMUM_KEYLENGTH, + c->MAXIMUM_KEYLENGTH, c->KEYLENGTH_MULTIPLE), + obj(py_obj), cipher(c) {} + private: + python::object obj; + BlockCipher* cipher; + }; + +class Py_BlockCipher_Wrapper : public Py_BlockCipher, + public python::wrapper + { + public: + BlockCipher* clone() const + { + python::object self = get_owner(this); + python::object py_clone = self.attr("__class__")(); + BlockCipher* bc = python::extract(py_clone); + return new Wrapped_Block_Cipher(py_clone, bc); + } + + void clear() throw() + { + this->get_override("clear")(); + } + + std::string name() const + { + return this->get_override("name")(); + } + + std::string enc_str(const std::string& in) const + { + return this->get_override("encrypt")(in); + } + + std::string dec_str(const std::string& in) const + { + return this->get_override("decrypt")(in); + } + + void set_key_obj(const OctetString& key) + { + this->get_override("set_key")(key); + } + + Py_BlockCipher_Wrapper(u32bit bs, u32bit kmin, + u32bit kmax, u32bit kmod) : + Py_BlockCipher(bs, kmin, kmax, kmod) {} + }; + +void export_block_ciphers() + { + void (BlockCipher::*set_key_ptr)(const OctetString&) = + &BlockCipher::set_key; + + python::class_ + ("BlockCipher", python::no_init) + .def("__init__", python::make_constructor(get_block_cipher)) + .def_readonly("block_size", &BlockCipher::BLOCK_SIZE) + .def_readonly("keylength_min", &BlockCipher::MINIMUM_KEYLENGTH) + .def_readonly("keylength_max", &BlockCipher::MAXIMUM_KEYLENGTH) + .def_readonly("keylength_mod", &BlockCipher::KEYLENGTH_MULTIPLE) + .def("valid_keylength", &BlockCipher::valid_keylength) + .def("name", &BlockCipher::name) + .def("set_key", set_key_ptr) + .def("encrypt", encrypt_string) + .def("decrypt", decrypt_string); + + python::class_, + boost::noncopyable> + ("BlockCipherImpl", python::init()) + .def("name", python::pure_virtual(&Py_BlockCipher::name)) + .def("encrypt", python::pure_virtual(&Py_BlockCipher::enc_str)) + .def("decrypt", python::pure_virtual(&Py_BlockCipher::dec_str)) + .def("set_key", python::pure_virtual(&Py_BlockCipher::set_key_obj)); + } diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/src/core.cpp b/src/libs/3rdparty/botan/wrappers/boost-python/src/core.cpp new file mode 100644 index 00000000000..7ef2a99705a --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/src/core.cpp @@ -0,0 +1,73 @@ +/************************************************* +* Boost.Python module definition * +* (C) 1999-2007 Jack Lloyd * +*************************************************/ + +#include +using namespace Botan; + +#include +namespace python = boost::python; + +#include "python_botan.h" + +class Python_RandomNumberGenerator + { + public: + Python_RandomNumberGenerator() + { rng = RandomNumberGenerator::make_rng(); } + ~Python_RandomNumberGenerator() { delete rng; } + + std::string name() const { return rng->name(); } + + void reseed() { rng->reseed(); } + + int gen_random_byte() { return rng->next_byte(); } + + std::string gen_random(int n) + { + std::string s(n, 0); + rng->randomize(reinterpret_cast(&s[0]), n); + return s; + } + + void add_entropy(const std::string& in) + { rng->add_entropy(reinterpret_cast(in.c_str()), in.length()); } + + private: + RandomNumberGenerator* rng; + }; + +BOOST_PYTHON_MODULE(_botan) + { + python::class_("LibraryInitializer") + .def(python::init< python::optional >()); + + python::class_("RandomNumberGenerator") + .def(python::init<>()) + .def("__str__", &Python_RandomNumberGenerator::name) + .def("name", &Python_RandomNumberGenerator::name) + .def("reseed", &Python_RandomNumberGenerator::reseed) + .def("add_entropy", &Python_RandomNumberGenerator::add_entropy) + .def("gen_random_byte", &Python_RandomNumberGenerator::gen_random_byte) + .def("gen_random", &Python_RandomNumberGenerator::gen_random); + + python::class_("OctetString") + .def(python::init< python::optional >()) + //.def(python::init< u32bit >()) + .def("__str__", &OctetString::as_string) + .def("__len__", &OctetString::length); + + python::enum_("cipher_dir") + .value("encryption", ENCRYPTION) + .value("decryption", DECRYPTION); + + export_block_ciphers(); + export_stream_ciphers(); + export_hash_functions(); + export_macs(); + + export_filters(); + export_pk(); + export_x509(); + } diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/src/filter.cpp b/src/libs/3rdparty/botan/wrappers/boost-python/src/filter.cpp new file mode 100644 index 00000000000..830e090de7f --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/src/filter.cpp @@ -0,0 +1,176 @@ +/************************************************* +* Boost.Python module definition * +* (C) 1999-2007 Jack Lloyd * +*************************************************/ + +#include +using namespace boost::python; + +#include +#include +using namespace Botan; + +class Py_Filter : public Filter + { + public: + virtual void write_str(const std::string&) = 0; + + void write(const byte data[], u32bit length) + { + write_str(std::string((const char*)data, length)); + } + + void send_str(const std::string& str) + { + printf("Py_Filter::send_str\n"); + send((const byte*)str.data(), str.length()); + } + }; + +class FilterWrapper : public Py_Filter, public wrapper + { + public: + void start_msg() + { + printf("wrapper start_msg\n"); + if(override start_msg = this->get_override("start_msg")) + start_msg(); + } + + void end_msg() + { + printf("wrapper end_msg\n"); + if(override end_msg = this->get_override("end_msg")) + end_msg(); + } + + void default_start_msg() {} + void default_end_msg() {} + + virtual void write_str(const std::string& str) + { + printf("wrapper write\n"); + this->get_override("write")(str); + } + }; + +Filter* return_or_raise(Filter* filter, const std::string& name) + { + if(filter) + return filter; + throw Invalid_Argument("Filter " + name + " could not be found"); + } + +Filter* make_filter1(const std::string& name) + { + Filter* filter = 0; + + if(have_hash(name)) filter = new Hash_Filter(name); + else if(name == "Hex_Encoder") filter = new Hex_Encoder; + else if(name == "Hex_Decoder") filter = new Hex_Decoder; + else if(name == "Base64_Encoder") filter = new Base64_Encoder; + else if(name == "Base64_Decoder") filter = new Base64_Decoder; + + return return_or_raise(filter, name); + } + +Filter* make_filter2(const std::string& name, + const SymmetricKey& key) + { + Filter* filter = 0; + + if(have_mac(name)) + filter = new MAC_Filter(name, key); + else if(have_stream_cipher(name)) + filter = new StreamCipher_Filter(name, key); + + return return_or_raise(filter, name); + } + +// FIXME: add new wrapper for Keyed_Filter here +Filter* make_filter3(const std::string& name, + const SymmetricKey& key, + Cipher_Dir direction) + { + return return_or_raise( + get_cipher(name, key, direction), + name); + } + +Filter* make_filter4(const std::string& name, + const SymmetricKey& key, + const InitializationVector& iv, + Cipher_Dir direction) + { + return return_or_raise( + get_cipher(name, key, iv, direction), + name); + } + +void append_filter(Pipe& pipe, std::auto_ptr filter) + { + pipe.append(filter.get()); + filter.release(); + } + +void prepend_filter(Pipe& pipe, std::auto_ptr filter) + { + pipe.prepend(filter.get()); + filter.release(); + } + +void do_send(std::auto_ptr filter, const std::string& data) + { + printf("Sending %s to %p\n", data.c_str(), filter.get()); + filter->send_str(data); + } + +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(rallas_ovls, read_all_as_string, 0, 1) + +void export_filters() + { + class_, boost::noncopyable> + ("__Internal_FilterObj", no_init); + + def("make_filter", make_filter1, + return_value_policy()); + def("make_filter", make_filter2, + return_value_policy()); + def("make_filter", make_filter3, + return_value_policy()); + def("make_filter", make_filter4, + return_value_policy()); + + // This might not work - Pipe will delete the filter, but Python + // might have allocated the space with malloc() or who-knows-what -> bad + class_, + bases, boost::noncopyable> + ("FilterObj") + .def("write", pure_virtual(&Py_Filter::write_str)) + .def("send", &do_send) + .def("start_msg", &Filter::start_msg, &FilterWrapper::default_start_msg) + .def("end_msg", &Filter::end_msg, &FilterWrapper::default_end_msg); + + implicitly_convertible, + std::auto_ptr >(); + + void (Pipe::*pipe_write_str)(const std::string&) = &Pipe::write; + void (Pipe::*pipe_process_str)(const std::string&) = &Pipe::process_msg; + + class_("PipeObj") + .def(init<>()) + .def_readonly("LAST_MESSAGE", &Pipe::LAST_MESSAGE) + .def_readonly("DEFAULT_MESSAGE", &Pipe::DEFAULT_MESSAGE) + .add_property("default_msg", &Pipe::default_msg, &Pipe::set_default_msg) + .add_property("msg_count", &Pipe::message_count) + .def("append", append_filter) + .def("prepend", prepend_filter) + .def("reset", &Pipe::reset) + .def("pop", &Pipe::pop) + .def("end_of_data", &Pipe::end_of_data) + .def("start_msg", &Pipe::start_msg) + .def("end_msg", &Pipe::end_msg) + .def("write", pipe_write_str) + .def("process_msg", pipe_process_str) + .def("read_all", &Pipe::read_all_as_string, rallas_ovls()); + } diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/src/hash.cpp b/src/libs/3rdparty/botan/wrappers/boost-python/src/hash.cpp new file mode 100644 index 00000000000..6ef1980871e --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/src/hash.cpp @@ -0,0 +1,108 @@ +/************************************************* +* Boost.Python module definition * +* (C) 1999-2007 Jack Lloyd * +*************************************************/ + +#include +using namespace Botan; + +#include "python_botan.h" + +class Py_HashFunction : public HashFunction + { + public: + virtual void hash_str(const std::string&) = 0; + virtual std::string final_str() = 0; + + void clear() throw() {} + + void add_data(const byte input[], u32bit length) + { + hash_str(make_string(input, length)); + } + + void final_result(byte output[]) + { + string2binary(final_str(), output, OUTPUT_LENGTH); + } + + Py_HashFunction(u32bit digest_size, u32bit block_size) : + HashFunction(digest_size, block_size) {} + }; + +class Wrapped_HashFunction : public HashFunction + { + public: + void add_data(const byte in[], u32bit len) { hash->update(in, len); } + void final_result(byte out[]) { hash->final(out); } + + void clear() throw() {} + + std::string name() const { return hash->name(); } + HashFunction* clone() const { return hash->clone(); } + + Wrapped_HashFunction(python::object py_obj, HashFunction* h) : + HashFunction(h->OUTPUT_LENGTH, h->HASH_BLOCK_SIZE), + obj(py_obj), hash(h) {} + private: + python::object obj; + HashFunction* hash; + }; + +class Py_HashFunction_Wrapper : public Py_HashFunction, + public python::wrapper + { + public: + HashFunction* clone() const + { + python::object self = get_owner(this); + python::object py_clone = self.attr("__class__")(); + HashFunction* hf = python::extract(py_clone); + return new Wrapped_HashFunction(py_clone, hf); + } + + std::string name() const + { + return this->get_override("name")(); + } + + void hash_str(const std::string& in) + { + this->get_override("update")(in); + } + + std::string final_str() + { + return this->get_override("final")(); + } + + Py_HashFunction_Wrapper(u32bit digest_size, u32bit block_size) : + Py_HashFunction(digest_size, block_size) {} + }; + +std::string final_str(HashFunction* hash) + { + SecureVector digest = hash->final(); + return std::string((const char*)digest.begin(), digest.size()); + } + +void export_hash_functions() + { + void (HashFunction::*update_str)(const std::string&) = + &HashFunction::update; + + python::class_ + ("HashFunction", python::no_init) + .def("__init__", python::make_constructor(get_hash)) + .def_readonly("digest_size", &HashFunction::OUTPUT_LENGTH) + .def("name", &HashFunction::name) + .def("update", update_str) + .def("final", final_str); + + python::class_, + boost::noncopyable> + ("HashFunctionImpl", python::init()) + .def("name", python::pure_virtual(&Py_HashFunction::name)) + .def("update", python::pure_virtual(&Py_HashFunction::hash_str)) + .def("final", python::pure_virtual(&Py_HashFunction::final_str)); + } diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/src/macs.cpp b/src/libs/3rdparty/botan/wrappers/boost-python/src/macs.cpp new file mode 100644 index 00000000000..54a55afe25e --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/src/macs.cpp @@ -0,0 +1,59 @@ +/************************************************* +* Boost.Python module definition * +* (C) 1999-2007 Jack Lloyd * +*************************************************/ + +#include +using namespace Botan; + +#include +namespace python = boost::python; + +class Py_MAC + { + public: + u32bit output_length() const { return mac->OUTPUT_LENGTH; } + u32bit keylength_min() const { return mac->MINIMUM_KEYLENGTH; } + u32bit keylength_max() const { return mac->MAXIMUM_KEYLENGTH; } + u32bit keylength_mod() const { return mac->KEYLENGTH_MULTIPLE; } + std::string name() const { return mac->name(); } + void clear() throw() { mac->clear(); } + + void set_key(const OctetString& key) { mac->set_key(key); } + + bool valid_keylength(u32bit kl) const + { + return mac->valid_keylength(kl); + } + + void update(const std::string& in) { mac->update(in); } + + std::string final() + { + SecureVector result = mac->final(); + return std::string((const char*)result.begin(), result.size()); + } + + Py_MAC(const std::string& name) + { + mac = get_mac(name); + } + ~Py_MAC() { delete mac; } + private: + MessageAuthenticationCode* mac; + }; + +void export_macs() + { + python::class_("MAC", python::init()) + .add_property("output_length", &Py_MAC::output_length) + .add_property("keylength_min", &Py_MAC::keylength_min) + .add_property("keylength_max", &Py_MAC::keylength_max) + .add_property("keylength_mod", &Py_MAC::keylength_mod) + .add_property("name", &Py_MAC::name) + .def("valid_keylength", &Py_MAC::valid_keylength) + .def("set_key", &Py_MAC::set_key) + .def("clear", &Py_MAC::clear) + .def("update", &Py_MAC::update) + .def("final", &Py_MAC::final); + } diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/src/pk.cpp b/src/libs/3rdparty/botan/wrappers/boost-python/src/pk.cpp new file mode 100644 index 00000000000..72d3294b806 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/src/pk.cpp @@ -0,0 +1,125 @@ +/************************************************* +* Boost.Python module definition * +* (C) 1999-2007 Jack Lloyd * +*************************************************/ + +#include +#include +#include +#include +using namespace Botan; + +#include +namespace python = boost::python; + +std::string encode_pub(const Public_Key* key, + const std::string& type) + { + if(type == "DER") + { + Pipe pipe; + pipe.start_msg(); + X509::encode(*key, pipe, RAW_BER); + pipe.end_msg(); + return pipe.read_all_as_string(); + } + else if(type == "PEM") + return X509::PEM_encode(*key); + else + throw Encoding_Error("Unknown key encoding method " + type); + } + +std::string encode_priv(const Private_Key* key, + const std::string& type) + { + if(type == "DER") + { + Pipe pipe; + PKCS8::encode(*key, pipe, RAW_BER); + return pipe.read_all_as_string(); + } + else if(type == "PEM") + return PKCS8::PEM_encode(*key); + else + throw Encoding_Error("Unknown key encoding method " + type); + } + +/* +Private_Key* load_priv(const std::string& file, const std::string& pass) + { + return PKCS8::load_key(file, pass); + } + +Public_Key* load_public(const std::string& file) + { + return X509::load_key(file); + } +*/ + +/* +std::string encrypt_string(const PK_Encryptor* enc, const std::string& in) + { + SecureVector cipher = enc->encrypt((const byte*)in.data(), in.length()); + return std::string((const char*)cipher.begin(), cipher.size()); + } + +std::string decrypt_string(const PK_Decryptor* dec, const std::string& in) + { + SecureVector plain = dec->decrypt((const byte*)in.data(), in.length()); + return std::string((const char*)plain.begin(), plain.size()); + } +*/ + +void export_pk() + { + /* + python::def("private_key", load_priv, + python::return_value_policy()); + python::def("public_key", load_public, + python::return_value_policy()); + */ + + python::class_ + ("Public_Key", python::no_init) + .add_property("name", &Public_Key::algo_name) + .add_property("max_input_bits", &Public_Key::max_input_bits) + .def("public_key", encode_pub); + + python::class_, boost::noncopyable> + ("PK_Encrypting_Key", python::no_init); + + python::class_, boost::noncopyable> + ("Private_Key", python::no_init) + .def("private_key", encode_priv); + + python::class_, boost::noncopyable> + ("PK_Decrypting_Key", python::no_init); + + python::class_ > + ("RSA_PublicKey", python::no_init); + + python::class_ > + ("DSA_PublicKey", python::no_init); + + /* + python::class_ > + ("RSA_PrivateKey", python::init()); + */ + + /* + python::class_ + ("PK_Encryptor", python::no_init) + .def("__init__", + python::make_constructor(get_pk_encryptor, + python::with_custodian_and_ward_postcall<0, 1>())) + .def("max_input", &PK_Encryptor::maximum_input_size) + .def("encrypt", encrypt_string); + */ + + /* + python::class_ + ("PK_Decryptor", python::no_init) + .def("__init__", python::make_constructor(get_pk_decryptor)) + .def("decrypt", decrypt_string); + */ + } diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/src/python_botan.h b/src/libs/3rdparty/botan/wrappers/boost-python/src/python_botan.h new file mode 100644 index 00000000000..d0fd10207fa --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/src/python_botan.h @@ -0,0 +1,54 @@ + +#ifndef BOTAN_BOOST_PYTHON_COMMON_H__ +#define BOTAN_BOOST_PYTHON_COMMON_H__ + +#include +using namespace Botan; + +#include +namespace python = boost::python; + + +extern void export_block_ciphers(); +extern void export_stream_ciphers(); +extern void export_hash_functions(); +extern void export_macs(); +extern void export_filters(); +extern void export_pk(); +extern void export_x509(); + +class Bad_Size : public Exception + { + public: + Bad_Size(u32bit got, u32bit expected) : + Exception("Bad size detected in Python/C++ conversion layer: got " + + to_string(got) + " bytes, expected " + to_string(expected)) + {} + }; + +inline std::string make_string(const byte input[], u32bit length) + { + return std::string((const char*)input, length); + } + +inline std::string make_string(const MemoryRegion& in) + { + return make_string(in.begin(), in.size()); + } + +inline void string2binary(const std::string& from, byte to[], u32bit expected) + { + if(from.size() != expected) + throw Bad_Size(from.size(), expected); + std::memcpy(to, from.data(), expected); + } + +template +inline python::object get_owner(T* me) + { + return python::object( + python::handle<>( + python::borrowed(python::detail::wrapper_base_::get_owner(*me)))); + } + +#endif diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/src/stream.cpp b/src/libs/3rdparty/botan/wrappers/boost-python/src/stream.cpp new file mode 100644 index 00000000000..f94bd7fd501 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/src/stream.cpp @@ -0,0 +1,54 @@ +/************************************************* +* Boost.Python module definition * +* (C) 1999-2007 Jack Lloyd * +*************************************************/ + +#include +using namespace Botan; + +#include "python_botan.h" + +class Py_StreamCipher + { + public: + u32bit keylength_min() const { return cipher->MINIMUM_KEYLENGTH; } + u32bit keylength_max() const { return cipher->MAXIMUM_KEYLENGTH; } + u32bit keylength_mod() const { return cipher->KEYLENGTH_MULTIPLE; } + + void set_key(const OctetString& key) { cipher->set_key(key); } + bool valid_keylength(u32bit kl) const + { + return cipher->valid_keylength(kl); + } + + std::string name() const { return cipher->name(); } + void clear() throw() { cipher->clear(); } + + std::string crypt(const std::string& in) const + { + SecureVector out(in.size()); + cipher->encrypt((const byte*)in.data(), out.begin(), in.size()); + return std::string((const char*)out.begin(), out.size()); + } + + Py_StreamCipher(const std::string& name) + { + cipher = get_stream_cipher(name); + } + ~Py_StreamCipher() { delete cipher; } + private: + StreamCipher* cipher; + }; + +void export_stream_ciphers() + { + python::class_("StreamCipher", python::init()) + .add_property("keylength_min", &Py_StreamCipher::keylength_min) + .add_property("keylength_max", &Py_StreamCipher::keylength_max) + .add_property("keylength_mod", &Py_StreamCipher::keylength_mod) + .add_property("name", &Py_StreamCipher::name) + .def("clear", &Py_StreamCipher::clear) + .def("valid_keylength", &Py_StreamCipher::valid_keylength) + .def("set_key", &Py_StreamCipher::set_key) + .def("crypt", &Py_StreamCipher::crypt); + } diff --git a/src/libs/3rdparty/botan/wrappers/boost-python/src/x509.cpp b/src/libs/3rdparty/botan/wrappers/boost-python/src/x509.cpp new file mode 100644 index 00000000000..90c2bba1c7a --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/boost-python/src/x509.cpp @@ -0,0 +1,140 @@ +/************************************************* +* Boost.Python module definition * +* (C) 1999-2007 Jack Lloyd * +*************************************************/ + +#include +#include +#include +#include +#include +#include +using namespace Botan; + +#include +namespace python = boost::python; + +template +class vector_to_list + { + public: + static PyObject* convert(const std::vector& in) + { + python::list out; + typename std::vector::const_iterator i = in.begin(); + while(i != in.end()) + { + out.append(*i); + ++i; + } + return python::incref(out.ptr()); + } + + vector_to_list() + { + python::to_python_converter, vector_to_list >(); + } + }; + +template +class memvec_to_hexstr + { + public: + static PyObject* convert(const T& in) + { + Pipe pipe(new Hex_Encoder); + pipe.process_msg(in); + std::string result = pipe.read_all_as_string(); + return python::incref(python::str(result).ptr()); + } + + memvec_to_hexstr() + { + python::to_python_converter >(); + } + }; + +class X509_Store_Search_Wrap : public X509_Store::Search_Func, + public python::wrapper + { + public: + bool match(const X509_Certificate& cert) const + { + return this->get_override("match")(cert); + } + }; + +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(add_cert_ols, add_cert, 1, 2) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(validate_cert_ols, validate_cert, 1, 2) + +void export_x509() + { + vector_to_list(); + vector_to_list(); + memvec_to_hexstr >(); + + python::class_ + ("X509_Certificate", python::init()) + .def(python::self == python::self) + .def(python::self != python::self) + .add_property("version", &X509_Certificate::x509_version) + .add_property("is_CA", &X509_Certificate::is_CA_cert) + .add_property("self_signed", &X509_Certificate::is_self_signed) + .add_property("pathlimit", &X509_Certificate::path_limit) + .add_property("as_pem", &X509_Object::PEM_encode) + .def("start_time", &X509_Certificate::start_time) + .def("end_time", &X509_Certificate::end_time) + .def("subject_info", &X509_Certificate::subject_info) + .def("issuer_info", &X509_Certificate::issuer_info) + .def("ex_constraints", &X509_Certificate::ex_constraints) + .def("policies", &X509_Certificate::policies) + .def("subject_key_id", &X509_Certificate::subject_key_id) + .def("authority_key_id", &X509_Certificate::authority_key_id); + + python::class_ + ("X509_CRL", python::init()) + .add_property("as_pem", &X509_Object::PEM_encode); + + python::enum_("verify_result") + .value("verified", VERIFIED) + .value("unknown_x509_error", UNKNOWN_X509_ERROR) + .value("cannot_establish_trust", CANNOT_ESTABLISH_TRUST) + .value("cert_chain_too_long", CERT_CHAIN_TOO_LONG) + .value("signature_error", SIGNATURE_ERROR) + .value("policy_error", POLICY_ERROR) + .value("invalid_usage", INVALID_USAGE) + .value("cert_format_error", CERT_FORMAT_ERROR) + .value("cert_issuer_not_found", CERT_ISSUER_NOT_FOUND) + .value("cert_not_yet_valid", CERT_NOT_YET_VALID) + .value("cert_has_expired", CERT_HAS_EXPIRED) + .value("cert_is_revoked", CERT_IS_REVOKED) + .value("crl_format_error", CRL_FORMAT_ERROR) + .value("crl_issuer_not_found", CRL_ISSUER_NOT_FOUND) + .value("crl_not_yet_valid", CRL_NOT_YET_VALID) + .value("crl_has_expired", CRL_HAS_EXPIRED) + .value("ca_cert_cannot_sign", CA_CERT_CANNOT_SIGN) + .value("ca_cert_not_for_cert_issuer", CA_CERT_NOT_FOR_CERT_ISSUER) + .value("ca_cert_not_for_crl_issuer", CA_CERT_NOT_FOR_CRL_ISSUER); + + python::enum_("cert_usage") + .value("any", X509_Store::ANY) + .value("tls_server", X509_Store::TLS_SERVER) + .value("tls_client", X509_Store::TLS_CLIENT) + .value("code_signing", X509_Store::CODE_SIGNING) + .value("email_protection", X509_Store::EMAIL_PROTECTION) + .value("time_stamping", X509_Store::TIME_STAMPING) + .value("crl_signing", X509_Store::CRL_SIGNING); + + { + python::scope in_class = + python::class_("X509_Store") + .def("add_cert", &X509_Store::add_cert, add_cert_ols()) + .def("validate", &X509_Store::validate_cert, validate_cert_ols()) + .def("get_certs", &X509_Store::get_certs) + .def("add_crl", &X509_Store::add_crl); + + python::class_ + ("Search_Func") + .def("match", python::pure_virtual(&X509_Store::Search_Func::match)); + } + } diff --git a/src/libs/3rdparty/botan/wrappers/perl-xs/Botan.pm b/src/libs/3rdparty/botan/wrappers/perl-xs/Botan.pm new file mode 100644 index 00000000000..ac4ad91fb65 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/perl-xs/Botan.pm @@ -0,0 +1,117 @@ +package Botan; + +use strict; +use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD); + +require DynaLoader; +require AutoLoader; +use Carp; + +@ISA = qw(DynaLoader); +$VERSION = '0.01'; + +@EXPORT_OK = qw( + NONE + IGNORE_WS + FULL_CHECK +); + +%EXPORT_TAGS = ( + 'all' => [ @EXPORT_OK ], + 'decoder_checking' => [ qw( + NONE + IGNORE_WS + FULL_CHECK + )], + +); + + +sub AUTOLOAD +{ + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. If a constant is not found then control is passed + # to the AUTOLOAD in AutoLoader. + + my $constname = $AUTOLOAD; + $constname =~ s/.*:://; + croak '& not defined' if $constname eq 'constant'; +# my $val = constant($constname, @_ ? $_[0] : 0); + my $val = constant($constname); + if ($! != 0) { + if ( $! =~ /Invalid/ ) + { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else + { + croak "Your vendor has not defined Botan symbol $constname"; + } + } + no strict 'refs'; + *$AUTOLOAD = sub { $val }; + goto &$AUTOLOAD; +} + + +bootstrap Botan $VERSION; + +# to setup inheritance... + +package Botan::Filter; +use vars qw(@ISA); +@ISA = qw(); + +package Botan::Chain; +use vars qw(@ISA); +@ISA = qw( Botan::Filter ); + +package Botan::Fork; +use vars qw(@ISA); +@ISA = qw( Botan::Filter ); + +package Botan::Hex_Encoder; +use vars qw(@ISA); +@ISA = qw( Botan::Filter ); + +package Botan::Hex_Decoder; +use vars qw(@ISA); +@ISA = qw( Botan::Filter ); + +package Botan::Base64_Decoder; +use vars qw(@ISA); +@ISA = qw( Botan::Filter ); + +package Botan::Base64_Encoder; +use vars qw(@ISA); +@ISA = qw( Botan::Filter ); + + +package Botan; + +1; +__END__ + +=head1 NAME + +Botan - Perl extension for access to Botan ... + +=head1 SYNOPSIS + + use Botan; + blah blah blah + +=head1 DESCRIPTION + +Blah blah blah. + +=head1 AUTHOR + +Vaclav Ovsik + +=head1 SEE ALSO + +Bla + +=cut diff --git a/src/libs/3rdparty/botan/wrappers/perl-xs/Botan.xs b/src/libs/3rdparty/botan/wrappers/perl-xs/Botan.xs new file mode 100644 index 00000000000..ded129d2e9d --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/perl-xs/Botan.xs @@ -0,0 +1,829 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#ifdef __cplusplus +} +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/* xsubpp converts ':' to '_' in typemap. We create our types without ':' */ + +typedef Botan::ASN1_String Botan__ASN1_String; +typedef Botan::AlgorithmIdentifier Botan__AlgorithmIdentifier; +typedef Botan::AlternativeName Botan__AlternativeName; +typedef Botan::Attribute Botan__Attribute; +typedef Botan::Base64_Decoder Botan__Base64_Decoder; +typedef Botan::Base64_Encoder Botan__Base64_Encoder; +typedef Botan::Chain Botan__Chain; +typedef Botan::Certificate_Extension Botan__Extension; +typedef Botan::Filter Botan__Filter; +typedef Botan::Fork Botan__Fork; +typedef Botan::Hex_Decoder Botan__Hex_Decoder; +typedef Botan::Hex_Encoder Botan__Hex_Encoder; +typedef Botan::OID Botan__OID; +typedef Botan::Pipe Botan__Pipe; +typedef Botan::X509_Certificate Botan__X509_Certificate; +typedef Botan::X509_DN Botan__X509_DN; +typedef Botan::X509_Time Botan__X509_Time; +typedef Botan::u32bit Botan__u32bit; + + +/* Types to keep track of destruction C++ objects passed + * into other objects... + * An Botan object is deleted by his parent object into which is passed, + * e.g. some Filter is deleted when his Pipe is destructed. We must + * track this and not to delete object again in Perls destructor. + */ + +class ObjectInfo +{ +private: + I32 d_signature; + bool d_del; +public: + static I32 const SIGNVAL = 0x696a626f; + ObjectInfo() : d_signature(SIGNVAL), + d_del(true) {}; + ~ObjectInfo() {}; + void set_delete(bool del = true) { d_del = del; }; + void set_delete_no() { set_delete(false); }; + void set_delete_yes() { set_delete(true); }; + bool should_delete() const { return d_del; }; +}; + +/* Constant object in initial state - template */ + +ObjectInfo const oi_init; + + +/* Botan library initializer ... */ + +Botan::LibraryInitializer botan_init; + + + +/*============================================================================*/ + +MODULE = Botan PACKAGE = Botan + +PROTOTYPES: ENABLE + +void +constant(char *name) + CODE: + using namespace Botan; + errno = 0; + switch (name[0]) + { + case 'F': + if ( strEQ(name, "FULL_CHECK") ) + XSRETURN_IV( FULL_CHECK ); // Decoder_Checking enum + break; + case 'I': + if ( strEQ(name, "IGNORE_WS") ) + XSRETURN_IV( IGNORE_WS ); // Decoder_Checking enum + break; + case 'N': + if ( strEQ(name, "NONE") ) + XSRETURN_IV( NONE ); // Decoder_Checking enum + break; + } + errno = EINVAL; + XSRETURN_UNDEF; + + +# =========================== Botan::Chain ========================== + +MODULE = Botan PACKAGE = Botan::Chain + +Botan__Chain * +Botan__Chain::new(f1 = 0, f2 = 0, f3 = 0, f4 = 0) + Botan__Filter *f1; + Botan__Filter *f2; + Botan__Filter *f3; + Botan__Filter *f4; + PREINIT: + ObjectInfo *f1_oi; + ObjectInfo *f2_oi; + ObjectInfo *f3_oi; + ObjectInfo *f4_oi; + CODE: + try { + RETVAL = new Botan__Chain(f1, f2, f3, f4); + if ( f1 ) f1_oi->set_delete_no(); + if ( f2 ) f2_oi->set_delete_no(); + if ( f3 ) f3_oi->set_delete_no(); + if ( f4 ) f4_oi->set_delete_no(); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +void +Botan__Chain::DESTROY() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + if ( THIS_oi->should_delete() ) + try { + delete THIS; + } + catch (const std::exception &e) { + croak(e.what()); + } + + +# =========================== Botan::Fork ========================== + +MODULE = Botan PACKAGE = Botan::Fork + +Botan__Fork * +Botan__Fork::new(f1 = 0, f2 = 0, f3 = 0, f4 = 0) + Botan__Filter *f1; + Botan__Filter *f2; + Botan__Filter *f3; + Botan__Filter *f4; + PREINIT: + ObjectInfo *f1_oi; + ObjectInfo *f2_oi; + ObjectInfo *f3_oi; + ObjectInfo *f4_oi; + CODE: + try { + RETVAL = new Botan__Fork(f1, f2, f3, f4); + if ( f1 ) f1_oi->set_delete_no(); + if ( f2 ) f2_oi->set_delete_no(); + if ( f3 ) f3_oi->set_delete_no(); + if ( f4 ) f4_oi->set_delete_no(); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +void +Botan__Fork::DESTROY() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + if ( THIS_oi->should_delete() ) + try { + delete THIS; + } + catch (const std::exception &e) { + croak(e.what()); + } + + +# ============================ Botan::Base64_Decoder ============================ + +MODULE = Botan PACKAGE = Botan::Base64_Decoder + +Botan__Base64_Decoder * +Botan__Base64_Decoder::new(checking = Botan::NONE) + int checking; + CODE: + try { + using namespace Botan; + RETVAL = new Base64_Decoder((Decoder_Checking)checking); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +void +Botan__Base64_Decoder::DESTROY() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + if ( THIS_oi->should_delete() ) + try { + delete THIS; + } + catch (const std::exception &e) { + croak(e.what()); + } + + +# =========================== Botan::Base64_Encoder ========================== + +MODULE = Botan PACKAGE = Botan::Base64_Encoder + +Botan__Base64_Encoder * +Botan__Base64_Encoder::new(breaks = false, length = 72) + bool breaks; + Botan__u32bit length; + CODE: + try { + RETVAL = new Botan__Base64_Encoder(breaks, length); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +void +Botan__Base64_Encoder::DESTROY() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + if ( THIS_oi->should_delete() ) + try { + delete THIS; + } + catch (const std::exception &e) { + croak(e.what()); + } + + +# ============================ Botan::Hex_Decoder ============================ + +MODULE = Botan PACKAGE = Botan::Hex_Decoder + +Botan__Hex_Decoder * +Botan__Hex_Decoder::new(checking = Botan::NONE) + int checking; + CODE: + try { + using namespace Botan; + RETVAL = new Hex_Decoder((Decoder_Checking)checking); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +void +Botan__Hex_Decoder::DESTROY() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + if ( THIS_oi->should_delete() ) + try { + delete THIS; + } + catch (const std::exception &e) { + croak(e.what()); + } + + +# ============================ Botan::Hex_Encoder ============================ + +MODULE = Botan PACKAGE = Botan::Hex_Encoder + +Botan__Hex_Encoder * +Botan__Hex_Encoder::new(breaks = false, length = 72, lcase = false) + bool breaks; + Botan__u32bit length; + bool lcase; + CODE: + try { + using Botan::Hex_Encoder; + RETVAL = new Hex_Encoder(breaks, length, + lcase ? Hex_Encoder::Lowercase : Hex_Encoder::Uppercase); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +void +Botan__Hex_Encoder::DESTROY() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + if ( THIS_oi->should_delete() ) + try { + delete THIS; + } + catch (const std::exception &e) { + croak(e.what()); + } + + +# ================================ Botan::OID ================================ + +MODULE = Botan PACKAGE = Botan::OID + +Botan__OID * +Botan__OID::new(s) + char *s; + CODE: + try { + RETVAL = new Botan__OID(s); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +void +Botan__OID::DESTROY() + CODE: + try { + delete THIS; + } + catch (const std::exception &e) { + croak(e.what()); + } + +char * +Botan__OID::as_string() + CODE: + try { + RETVAL = const_cast(THIS->as_string().c_str()); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + + +# ================================ Botan::OIDS ================================ + +MODULE = Botan PACKAGE = Botan::OIDS + +void +add_oid(oid, name) + Botan__OID *oid; + char *name; + CODE: + try { + Botan::OIDS::add_oid(*oid, name); + } + catch (const std::exception &e) { + croak(e.what()); + } + +char * +lookup_by_oid(oid) + Botan__OID *oid; + CODE: + try { + RETVAL = const_cast(Botan::OIDS::lookup(*oid).c_str()); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +Botan__OID * +lookup_by_name(name) + char *name; + CODE: + try { + RETVAL = new Botan__OID(Botan::OIDS::lookup(name)); + } + catch (const std::exception &e) { + croak(e.what()); + } + char const * CLASS = "Botan::OID"; + OUTPUT: + RETVAL + +int +have_oid(name) + char *name; + CODE: + try { + RETVAL = Botan::OIDS::have_oid(name); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + + +# ================================ Botan::Pipe ================================ + +MODULE = Botan PACKAGE = Botan::Pipe + +Botan__Pipe * +Botan__Pipe::new(...) + CODE: + for (I32 i = 1; i < items; i++) + { + if ( !sv_isobject(ST(i)) || (SvTYPE(SvRV(ST(i))) != SVt_PVMG) ) + croak("Botan::Pipe::new() -- arg %u is not " + "a blessed SV reference", i +1); + if ( !sv_derived_from(ST(i), "Botan::Filter") ) + croak("Botan::Pipe::new() -- arg %u is not " + "an object derived from Botan::Filter", i +1); + MAGIC *mg = mg_find(SvRV(ST(i)), '~'); + if ( mg == 0 + || mg->mg_len != sizeof(ObjectInfo) + || *(I32 *)(mg->mg_ptr) != ObjectInfo::SIGNVAL ) + croak("Botan::Pipe::new() -- arg %u has no " + "valid private magic data (ObjectInfo)", i +1); + } + try { + RETVAL = new Botan__Pipe(); + for (I32 i = 1; i < items; i++) + { + SV *osv = (SV *)SvRV(ST(i)); + ObjectInfo *oi = (ObjectInfo *)(mg_find(osv, '~')->mg_ptr); + RETVAL->append((Botan__Filter *)(SvIV(osv))); + oi->set_delete_no(); + } + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +void +Botan__Pipe::DESTROY() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + try { + delete THIS; + } + catch (const std::exception &e) { + croak(e.what()); + } + +void +Botan__Pipe::write(s) + SV *s; + PREINIT: + ObjectInfo *THIS_oi; + CODE: + STRLEN len; + char *ptr = SvPV(s, len); + try { + THIS->write((unsigned char *)ptr, len); + } + catch (const std::exception &e) { + croak(e.what()); + } + +void +Botan__Pipe::process_msg(s) + SV *s; + PREINIT: + ObjectInfo *THIS_oi; + CODE: + STRLEN len; + char *ptr = SvPV(s, len); + try { + THIS->process_msg((unsigned char *)ptr, len); + } + catch (const std::exception &e) { + croak(e.what()); + } + +Botan__u32bit +Botan__Pipe::remaining(msgno = Botan::Pipe::DEFAULT_MESSAGE) + Botan__u32bit msgno; + PREINIT: + ObjectInfo *THIS_oi; + CODE: + try { + RETVAL = THIS->remaining(msgno); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +SV * +Botan__Pipe::read(len = 0xFFFFFFFF, msgno = Botan::Pipe::DEFAULT_MESSAGE) + Botan__u32bit len; + Botan__u32bit msgno; + PREINIT: + ObjectInfo *THIS_oi; + CODE: + try { + if ( len > THIS->remaining(msgno) ) + len = THIS->remaining(msgno); + RETVAL = NEWSV(0, len); + SvPOK_on(RETVAL); + if ( len > 0 ) + SvCUR_set(RETVAL, THIS->read((unsigned char *)SvPVX(RETVAL), + len, msgno)); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +SV * +Botan__Pipe::peek(len = 0xFFFFFFFF, offset = 0, \ + msgno = Botan::Pipe::DEFAULT_MESSAGE) + Botan__u32bit len; + Botan__u32bit offset; + Botan__u32bit msgno; + PREINIT: + ObjectInfo *THIS_oi; + CODE: + try { + if ( len > THIS->remaining(msgno) ) + len = THIS->remaining(msgno); + RETVAL = NEWSV(0, len); + SvPOK_on(RETVAL); + if ( len > 0 ) + SvCUR_set(RETVAL, THIS->peek((unsigned char *)SvPVX(RETVAL), + len, offset, msgno)); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +Botan__u32bit +Botan__Pipe::default_msg() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + try { + RETVAL = THIS->default_msg(); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +void +Botan__Pipe::set_default_msg(msgno) + Botan__u32bit msgno; + PREINIT: + ObjectInfo *THIS_oi; + CODE: + try { + THIS->set_default_msg(msgno); + } + catch (const std::exception &e) { + croak(e.what()); + } + +Botan__u32bit +Botan__Pipe::message_count() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + try { + RETVAL = THIS->message_count(); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +bool +Botan__Pipe::end_of_data() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + try { + RETVAL = THIS->end_of_data(); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +void +Botan__Pipe::start_msg() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + try { + THIS->start_msg(); + } + catch (const std::exception &e) { + croak(e.what()); + } + +void +Botan__Pipe::end_msg() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + try { + THIS->end_msg(); + } + catch (const std::exception &e) { + croak(e.what()); + } + +void +Botan__Pipe::reset() + PREINIT: + ObjectInfo *THIS_oi; + CODE: + try { + THIS->reset(); + } + catch (const std::exception &e) { + croak(e.what()); + } + + +# ========================== Botan::X509_Certificate ========================== + +MODULE = Botan PACKAGE = Botan::X509_Certificate + +Botan__X509_Certificate * +Botan__X509_Certificate::new(char *fn) + CODE: + try { + RETVAL = new Botan__X509_Certificate(fn); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +void +Botan__X509_Certificate::DESTROY() + CODE: + try { + delete THIS; + } + catch (const std::exception &e) { + croak(e.what()); + } + +unsigned int +Botan__X509_Certificate::x509_version() + CODE: + try { + RETVAL = THIS->x509_version(); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +char * +Botan__X509_Certificate::start_time() + CODE: + try { + RETVAL = const_cast(THIS->start_time().c_str()); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +char * +Botan__X509_Certificate::end_time() + CODE: + try { + RETVAL = const_cast(THIS->end_time().c_str()); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +char * +Botan__X509_Certificate::subject_info(char *info) + CODE: + try { + std::vector s = THIS->subject_info(info); + + if(s.size() > 0) + RETVAL = const_cast(s[0].c_str()); + else + RETVAL = "err"; + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +char * +Botan__X509_Certificate::issuer_info(char *info) + CODE: + try { + std::vector s = THIS->subject_info(info); + + if(s.size() > 0) + RETVAL = const_cast(s[0].c_str()); + else + RETVAL = "err"; + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +Botan__X509_DN * +Botan__X509_Certificate::subject_dn() + CODE: + try { + RETVAL = new Botan__X509_DN(THIS->subject_dn()); + } + catch (const std::exception &e) { + croak(e.what()); + } + char const * CLASS = "Botan::X509_DN"; + OUTPUT: + RETVAL + +Botan__X509_DN * +Botan__X509_Certificate::issuer_dn() + CODE: + try { + RETVAL = new Botan__X509_DN(THIS->issuer_dn()); + } + catch (const std::exception &e) { + croak(e.what()); + } + char const * CLASS = "Botan::X509_DN"; + OUTPUT: + RETVAL + + +# ============================== Botan::X509_DN ============================== + +MODULE = Botan PACKAGE = Botan::X509_DN + +Botan__X509_DN * +Botan__X509_DN::new() + CODE: + try { + RETVAL = new Botan__X509_DN(); + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL + +void +Botan__X509_DN::DESTROY() + CODE: + try { + delete THIS; + } + catch (const std::exception &e) { + croak(e.what()); + } + +AV * +Botan__X509_DN::get_attributes() + CODE: + try { + using namespace std; + using namespace Botan; + + typedef multimap::const_iterator rdn_iter; + + multimap const &atrmmap = THIS->get_attributes(); + RETVAL = newAV(); + for(rdn_iter i = atrmmap.begin(); i != atrmmap.end(); i++) + { + string const &atr = i->first.as_string(); + string const &val = i->second; + av_push(RETVAL, newSVpvn(atr.c_str(), atr.length())); + av_push(RETVAL, newSVpvn(val.c_str(), val.length())); + } + } + catch (const std::exception &e) { + croak(e.what()); + } + OUTPUT: + RETVAL diff --git a/src/libs/3rdparty/botan/wrappers/perl-xs/Changes b/src/libs/3rdparty/botan/wrappers/perl-xs/Changes new file mode 100644 index 00000000000..5f32b0c63c3 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/perl-xs/Changes @@ -0,0 +1,4 @@ +Revision history for Perl extension to Botan. + +0.01 Fri, 20 Feb 2004 15:10:50 +0100 + - first version diff --git a/src/libs/3rdparty/botan/wrappers/perl-xs/MANIFEST b/src/libs/3rdparty/botan/wrappers/perl-xs/MANIFEST new file mode 100644 index 00000000000..b9d8454d612 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/perl-xs/MANIFEST @@ -0,0 +1,15 @@ +Botan.pm +Botan.xs +Changes +MANIFEST +Makefile.PL +data/ca.cert.der +data/ca.cert.pem +t/base64.t +t/filt.t +t/hex.t +t/oid.t +t/pipe.t +t/testutl.pl +t/x509cert.t +typemap diff --git a/src/libs/3rdparty/botan/wrappers/perl-xs/data/ca.cert.der b/src/libs/3rdparty/botan/wrappers/perl-xs/data/ca.cert.der new file mode 100644 index 0000000000000000000000000000000000000000..d6ed8aeaf32d2054b6c149b3a46d26fb54855cfd GIT binary patch literal 712 zcmXqLVme~b#H71`nTe5!iBZUamyJ`a&7D}zChA-4f18*?ZNn=q4el%b#j zKZwI6%;D)ArI4sstY;`;AO;d*7UmC0EiO?gD9X%DEUHv+b~F?-5P=)U$tcF2oam6L zmt18aC(dhNU|?ZnU}R`wVPFs?&TC*~U||U38u$~mQ`A5hVkZyS&f?7UJbV^5&PVnZ zBP#=QV=se2V<%H%Bg2XtDRE|NL@xiAPMtmLnS?}U;Cucn3^PA*n-+X~W|G2vGOK## zerdC3byucr>T^HovvvEc&3gqd&lcLVQ}TRVS~uNk2kG^9ts@DG0J=R@%eef#Wk4=7KSYep+)pHF)|>BCMzg38yUFxZ|Z$> znjVl5bokJ^h^d$7cyk0BylqNxVR7Z#;(e^v&vIXfnE5vEuU{muUf*=!o}hZm&s38; zoW?Iop1b{MJ+1z_fBw(Co&1MCFE^K1vi-CirwQjzo7%J$yLl2LZj0Eib8!pUwCurM ekze`&e||M>S#tOHx3{new(&Botan::NONE); }; +print "not " if $@ || !defined $f; +print "ok 2\n"; + +my $dec; +eval { $dec = Botan::Pipe->new($f); }; +print "not " if $@ || !defined $dec; +print "ok 3\n"; + +eval { $f = Botan::Base64_Decoder->new(&Botan::IGNORE_WS); }; +print "not " if $@ || !defined $f; +print "ok 4\n"; + +my $dec_is; +eval { $dec_is = Botan::Pipe->new($f); }; +print "not " if $@ || !defined $dec_is; +print "ok 5\n"; + +eval { $f = Botan::Base64_Decoder->new(&Botan::FULL_CHECK); }; +print "not " if $@ || !defined $f; +print "ok 6\n"; + +my $dec_fc; +eval { $dec_fc = Botan::Pipe->new($f); }; +print "not " if $@ || !defined $dec_fc; +print "ok 7\n"; + + +# Testing clean base64 input + +my $data; + +undef $data; +eval { + $dec->process_msg($botan_lic_b64); + $data = $dec->read(); +}; + +print "not " if $@ || $data ne $botan_lic; +print "ok 8\n"; + +undef $data; +eval { + $dec_is->process_msg($botan_lic_b64); + $data = $dec_is->read(); +}; + +print "not " if $@ || $data ne $botan_lic; +print "ok 9\n"; + +undef $data; +eval { + $dec_fc->process_msg($botan_lic_b64); + $data = $dec_fc->read(); +}; + +print "not " if $@ || $data ne $botan_lic; +print "ok 10\n"; + + +# Testing base64 input with whitespaces + +undef $data; +eval { + $dec->process_msg($botan_lic_b64_ws); + $dec->set_default_msg(1); + $data = $dec->read(); +}; + +print "not " if $@ || $data ne $botan_lic; +print "ok 11\n"; + +undef $data; +eval { + $dec_is->process_msg($botan_lic_b64_ws); + $dec_is->set_default_msg(1); + $data = $dec_is->read(); +}; + +print "not " if $@ || $data ne $botan_lic; +print "ok 12\n"; + +undef $data; +eval { + $dec_fc->process_msg($botan_lic_b64_ws); + $dec_fc->set_default_msg(1); + $data = $dec_fc->read(); +}; + +print "not " unless $@ && !defined $data; +print "ok 13\n"; + + +# Testing base64 input with garbage + +undef $data; +eval { + $dec->process_msg($botan_lic_b64_garbage); + $dec->set_default_msg(2); + $data = $dec->read(); +}; + +print "not " if $@ || $data ne $botan_lic; +print "ok 14\n"; + +undef $data; +eval { + $dec_is->process_msg($botan_lic_b64_garbage); + $dec_is->set_default_msg(2); + $data = $dec_is->read(); +}; + +print "not " unless $@ && !defined $data; +print "ok 15\n"; + +undef $data; +eval { + $dec_fc->process_msg($botan_lic_b64_garbage); + $dec_fc->set_default_msg(2); + $data = $dec_fc->read(); +}; + +print "not " unless $@ && !defined $data; +print "ok 16\n"; + + +# Encoder... + +eval { $f = Botan::Base64_Encoder->new(); }; +print "not " if $@ || !defined $f; +print "ok 17\n"; + +my $enc; +eval { $enc = Botan::Pipe->new($f); }; +print "not " if $@ || !defined $enc; +print "ok 18\n"; + +eval { $f = Botan::Base64_Encoder->new(1, 5); }; +print "not " if $@ || !defined $f; +print "ok 19\n"; + +my $enc2; +eval { $enc2 = Botan::Pipe->new($f); }; +print "not " if $@ || !defined $enc2; +print "ok 20\n"; + +undef $data; +eval { + $enc->process_msg("Hello\n"); + $data = $enc->read(); +}; +print "not " if $@ || $data ne "SGVsbG8K"; +print "ok 21\n"; + +undef $data; +eval { + $enc2->process_msg("Hello\n"); + $data = $enc2->read(); +}; +print "not " if $@ || $data ne "SGVsb\nG8K\n"; +print "ok 22\n"; + + +# Encoder with decoder... + +my $p; +eval { + $p = Botan::Pipe->new( + Botan::Base64_Encoder->new(), + Botan::Base64_Decoder->new(), + ); +}; +print "not " if $@ || !defined $p; +print "ok 23\n"; + +print "not " unless random_message_ok($p); +print "ok 24\n"; diff --git a/src/libs/3rdparty/botan/wrappers/perl-xs/t/filt.t b/src/libs/3rdparty/botan/wrappers/perl-xs/t/filt.t new file mode 100644 index 00000000000..2a7b4c8babd --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/perl-xs/t/filt.t @@ -0,0 +1,56 @@ +# vim: set ft=perl: +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl test.pl' + +######################### We start with some black magic to print on failure. + +# Change 1..1 below to 1..last_test_to_print . +# (It may become useful if the test is moved to ./t subdirectory.) + +BEGIN { $| = 1; print "1..5\n"; } +END { print "not ok 1\n" unless $loaded; } + +use Botan; + +$loaded = 1; +print "ok 1\n"; + +######################### End of black magic. + +# Insert your test code below (better if it prints "ok 13" +# (correspondingly "not ok 13") depending on the success of chunk 13 +# of the test code): + +use strict; + +my $pipe = Botan::Pipe->new(Botan::Hex_Encoder->new()); + +print "not " unless $pipe; +print "ok 2\n"; + +$pipe->process_msg('FOO'); + +print "not " if $pipe->read() ne '464F4F'; +print "ok 3\n"; + +$pipe = Botan::Pipe->new(Botan::Hex_Encoder->new(0, 0, 1)); + +print "not " unless $pipe; +print "ok 4\n"; + +$pipe->process_msg('FOO'); + +print "not " if $pipe->read() ne '464f4f'; +print "ok 5\n"; + + + + + + +#my $pipe = Botan::Pipe->new(Botan::Base64_Encoder->new()); +#$pipe->process_msg('FOO'); +# +#print "not " if $pipe->read() ne 'Rk9P'; +#print "ok 4\n"; + diff --git a/src/libs/3rdparty/botan/wrappers/perl-xs/t/hex.t b/src/libs/3rdparty/botan/wrappers/perl-xs/t/hex.t new file mode 100644 index 00000000000..6f447b25c19 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/perl-xs/t/hex.t @@ -0,0 +1,256 @@ +# vim: set ft=perl: +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl test.pl' + +######################### We start with some black magic to print on failure. + +# Change 1..1 below to 1..last_test_to_print . +# (It may become useful if the test is moved to ./t subdirectory.) + +BEGIN { $| = 1; print "1..24\n"; } +END { print "not ok 1\n" unless $loaded; } + +require 't/testutl.pl'; +use Botan; + +$loaded = 1; +print "ok 1\n"; + +######################### End of black magic. + +# Insert your test code below (better if it prints "ok 13" +# (correspondingly "not ok 13") depending on the success of chunk 13 +# of the test code): + +use strict; + +# Data prep + +my ($hex, $hex_ws, $hex_garbage); +while ( $_ = ) +{ + $hex_garbage .= $_; + s/[^[:xdigit:][:space:]]//g; + $hex_ws .= $_; + s/[^[:xdigit:]]//g; + $hex .= $_; +} +my $data_test = pack("H*", $hex); + +# Decoder... + +my $f; + +eval { $f = Botan::Hex_Decoder->new(&Botan::NONE); }; +print "not " if $@ || !defined $f; +print "ok 2\n"; + +my $dec; +eval { $dec = Botan::Pipe->new($f); }; +print "not " if $@ || !defined $dec; +print "ok 3\n"; + +eval { $f = Botan::Hex_Decoder->new(&Botan::IGNORE_WS); }; +print "not " if $@ || !defined $f; +print "ok 4\n"; + +my $dec_is; +eval { $dec_is = Botan::Pipe->new($f); }; +print "not " if $@ || !defined $dec_is; +print "ok 5\n"; + +eval { $f = Botan::Hex_Decoder->new(&Botan::FULL_CHECK); }; +print "not " if $@ || !defined $f; +print "ok 6\n"; + +my $dec_fc; +eval { $dec_fc = Botan::Pipe->new($f); }; +print "not " if $@ || !defined $dec_fc; +print "ok 7\n"; + + +# Testing clean hexadecimal input + +my $data; + +undef $data; +eval { + $dec->process_msg($hex); + $data = $dec->read(); +}; + +print "not " if $@ || $data ne $data_test; +print "ok 8\n"; + +undef $data; +eval { + $dec_is->process_msg($hex); + $data = $dec_is->read(); +}; + +print "not " if $@ || $data ne $data_test; +print "ok 9\n"; + +undef $data; +eval { + $dec_fc->process_msg($hex); + $data = $dec_fc->read(); +}; + +print "not " if $@ || $data ne $data_test; +print "ok 10\n"; + + +# Testing hexadecimal input with whitespaces + +undef $data; +eval { + $dec->process_msg($hex_ws); + $dec->set_default_msg(1); + $data = $dec->read(); +}; + +print "not " if $@ || $data ne $data_test; +print "ok 11\n"; + +undef $data; +eval { + $dec_is->process_msg($hex_ws); + $dec_is->set_default_msg(1); + $data = $dec_is->read(); +}; + +print "not " if $@ || $data ne $data_test; +print "ok 12\n"; + +undef $data; +eval { + $dec_fc->process_msg($hex_ws); + $dec_fc->set_default_msg(1); + $data = $dec_fc->read(); +}; + +print "not " unless $@ && !defined $data; +print "ok 13\n"; + + +# Testing hexadecimal input with garbage + +undef $data; +eval { + $dec->process_msg($hex_garbage); + $dec->set_default_msg(2); + $data = $dec->read(); +}; + +print "not " if $@ || $data ne $data_test; +print "ok 14\n"; + +undef $data; +eval { + $dec_is->process_msg($hex_garbage); + $dec_is->set_default_msg(2); + $data = $dec_is->read(); +}; + +print "not " unless $@ && !defined $data; +print "ok 15\n"; + +undef $data; +eval { + $dec_fc->process_msg($hex_garbage); + $dec_fc->set_default_msg(2); + $data = $dec_fc->read(); +}; + +print "not " unless $@ && !defined $data; +print "ok 16\n"; + + +# Encoder... + +eval { $f = Botan::Hex_Encoder->new(); }; +print "not " if $@ || !defined $f; +print "ok 17\n"; + +my $enc; +eval { $enc = Botan::Pipe->new($f); }; +print "not " if $@ || !defined $enc; +print "ok 18\n"; + +eval { $f = Botan::Hex_Encoder->new(1, 5, 1); }; +print "not " if $@ || !defined $f; +print "ok 19\n"; + +my $enc2; +eval { $enc2 = Botan::Pipe->new($f); }; +print "not " if $@ || !defined $enc2; +print "ok 20\n"; + +undef $data; +eval { + $enc->process_msg("Hello\n"); + $data = $enc->read(); +}; +print "not " if $@ || $data ne "48656C6C6F0A"; +print "ok 21\n"; + +undef $data; +eval { + $enc2->process_msg("Hello\n"); + $data = $enc2->read(); +}; +print "not " if $@ || $data ne "48656\nc6c6f\n0a\n"; +print "ok 22\n"; + + +# Encoder with decoder... + +my $p; +eval { + $p = Botan::Pipe->new( + Botan::Hex_Encoder->new(), + Botan::Hex_Decoder->new(), + ); +}; +print "not " if $@ || !defined $p; +print "ok 23\n"; + +print "not " unless random_message_ok($p); +print "ok 24\n"; + + + +__DATA__ +cb13 4a4d 7522 1fd3 c6f6 7786 d04b 3043 ..JMu"....w..K.. +4552 4bcf 4d2b 9d71 0cfe 4d6a 1caf bcfd .RK.M+.q..Mj.... +8f91 6151 ff85 e900 7e6a bafc 15e9 ae51 ...Q....~j.....Q +b14b 7210 bb40 5958 2b82 d49e b808 68a5 .Kr..@YX+.....h. +7945 9dec f686 9b98 989e 826d 8088 6ee7 y..........m..n. +d066 1eac 8c34 c461 bb54 7726 87ab d681 .........Tw&.... +a0be 52e5 1128 0cf2 759e cb2d e690 4ed9 ..R..(..u..-..N. +7e88 bda7 2523 4a0f 185a 02b1 f898 fc41 ~...%#J..Z...... +dd48 fa87 945d 7611 b8c9 a50a 2de2 b670 .H...]v.....-..p +0056 c8be 2cbb e7d0 1e70 4a3d 79f0 dce9 .V..,....pJ=y... +b57f 154b 2b3a db73 f086 de11 9f3e 1641 ...K+:.s.....>.. +3a28 8b9b bb0f 682b 80db b791 89e0 62c0 :(....h+........ +7204 db97 5432 2eb0 a04e f38e 809f 7223 r...T....N....r# +912e e552 1452 6dd2 e09f dd06 c715 7c1a ...R.Rm.......|. +fe3d d6cc b6d0 a17a 27d7 4327 4e43 8af3 .=.....z'..'N... +6eb5 e9f8 bfe9 34c3 6636 8243 358f 966d n..............m +7d87 d17b 5c37 6acb 4972 f4ec 6806 bbde }..{\.j.Ir..h... +2689 a019 a9e2 4101 7fe2 de72 bc03 eb5e &..........r...^ +b699 2d6b f8cd a08e 6e01 edfc a81a 94b6 ..-k....n....... +9073 15fb efb2 c8d9 9f85 6633 85f1 e9d0 .s.............. +20ce 578b ab9d 2e51 b947 69bf fba5 82c6 .W....Q.Gi..... +2ed0 dd36 d679 a399 7db3 8a0d cdef 0eda .....y..}....... +e761 e7f1 5b17 3f67 0c83 215a eddf 9d2a ....[.?g..!Z...* +5e70 0a77 c92e 94e1 a82b fd7c f10a 894f ^p.w.....+.|...O +2955 f0e8 7398 f409 2040 b797 da03 a5a6 )U..s... @...... +7ba4 c3c9 2659 b9f7 6a56 e17a b481 983f {...&Y..jV.z...? +00ed 3cc8 5a22 ad5c b6e0 3566 d717 35a6 ..<.Z".\........ +1523 4104 de63 477e fd24 68e5 e816 98df .#....G~.$h..... +1747 417e db72 a76a be5b b9dc 3dfb 2d05 .G.~.r.j.[..=.-. +d27f e597 eafc 9a29 15c5 792d 9c88 9aea .......)..y-.... +485e e431 96c3 7723 da6d 28b2 477a fd12 H^....w#.m(.Gz.. +e645 5dcd 7d5a d8b4 7acc 10b2 b41a e11d ..].}Z..z....... diff --git a/src/libs/3rdparty/botan/wrappers/perl-xs/t/oid.t b/src/libs/3rdparty/botan/wrappers/perl-xs/t/oid.t new file mode 100644 index 00000000000..66204541f9a --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/perl-xs/t/oid.t @@ -0,0 +1,45 @@ +# vim: set ft=perl: +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl test.pl' + +######################### We start with some black magic to print on failure. + +# Change 1..1 below to 1..last_test_to_print . +# (It may become useful if the test is moved to ./t subdirectory.) + +BEGIN { $| = 1; print "1..6\n"; } +END { print "not ok 1\n" unless $loaded; } + +use Botan; + +$loaded = 1; +print "ok 1\n"; + +######################### End of black magic. + +# Insert your test code below (better if it prints "ok 13" +# (correspondingly "not ok 13") depending on the success of chunk 13 +# of the test code): + +use strict; + +print "not " unless Botan::OIDS::have_oid('X520.CommonName'); +print "ok 2\n"; + +my $oid_c = Botan::OID->new('2.5.4.3'); +print "not " if Botan::OIDS::lookup_by_oid($oid_c) ne 'X520.CommonName'; +print "ok 3\n"; + +my $oid_x = Botan::OIDS::lookup_by_name('X520.CommonName'); +print "not " if $oid_x->as_string() ne '2.5.4.3'; +print "ok 4\n"; + +my $oid_foo_num = '1.2.3.4.5.6.7.8.9.10.11.12.13.14.15'; +my $oid_foo = Botan::OID->new($oid_foo_num); +print "not " if Botan::OIDS::lookup_by_oid($oid_foo) ne $oid_foo_num; +print "ok 5\n"; + +Botan::OIDS::add_oid($oid_foo, 'Zito.Foo'); + +print "not " if Botan::OIDS::lookup_by_oid($oid_foo) ne 'Zito.Foo'; +print "ok 6\n"; diff --git a/src/libs/3rdparty/botan/wrappers/perl-xs/t/pipe.t b/src/libs/3rdparty/botan/wrappers/perl-xs/t/pipe.t new file mode 100644 index 00000000000..f850d8519c4 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/perl-xs/t/pipe.t @@ -0,0 +1,98 @@ +# vim: set ft=perl: +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl test.pl' + +######################### We start with some black magic to print on failure. + +# Change 1..1 below to 1..last_test_to_print . +# (It may become useful if the test is moved to ./t subdirectory.) + +BEGIN { $| = 1; print "1..20\n"; } +END { print "not ok 1\n" unless $loaded; } + +use Botan; + +$loaded = 1; +print "ok 1\n"; + +######################### End of black magic. + +# Insert your test code below (better if it prints "ok 13" +# (correspondingly "not ok 13") depending on the success of chunk 13 +# of the test code): + +use strict; + +my $pipe = Botan::Pipe->new(); + +print "not " unless $pipe; +print "ok 2\n"; + +$pipe->start_msg(); +$pipe->write('Hello world'); +$pipe->end_msg(); + +print "not " if $pipe->message_count() != 1; +print "ok 3\n"; + +print "not " if $pipe->remaining() != 11; +print "ok 4\n"; + +print "not " if $pipe->end_of_data(); +print "ok 5\n"; + +print "not " if $pipe->read() ne 'Hello world'; +print "ok 6\n"; + +print "not " if $pipe->remaining() != 0; +print "ok 7\n"; + +print "not " unless $pipe->end_of_data(); +print "ok 8\n"; + +$pipe->process_msg('Hello world'); + +print "not " if $pipe->message_count() != 2; +print "ok 9\n"; + +my $msg_num = $pipe->message_count() -1; + +print "not " if $pipe->read(5, $msg_num) ne 'Hello'; +print "ok 10\n"; + +print "not " if $pipe->read(6, $msg_num) ne ' world'; +print "ok 11\n"; + +print "not " if $pipe->remaining() != 0; +print "ok 12\n"; + +print "not " unless $pipe->end_of_data(); +print "ok 13\n"; + +$pipe->process_msg("The\0string\0with\0null\0chars\0"); +$msg_num = $pipe->message_count() -1; + +print "not " if $pipe->read(80, $msg_num) ne "The\0string\0with\0null\0chars\0"; +print "ok 14\n"; + +$pipe->process_msg('FOO BAR'); +$pipe->set_default_msg($pipe->message_count() -1); + +print "not " if $pipe->peek(3) ne 'FOO'; +print "ok 15\n"; + +print "not " if $pipe->peek(3, 4) ne 'BAR'; +print "ok 16\n"; + +print "not " if $pipe->peek() ne 'FOO BAR'; +print "ok 17\n"; + +print "not " if $pipe->read() ne 'FOO BAR'; +print "ok 18\n"; + +print "not " if $pipe->remaining() != 0; +print "ok 19\n"; + +print "not " unless $pipe->end_of_data(); +print "ok 20\n"; + diff --git a/src/libs/3rdparty/botan/wrappers/perl-xs/t/testutl.pl b/src/libs/3rdparty/botan/wrappers/perl-xs/t/testutl.pl new file mode 100644 index 00000000000..add6f6a45cd --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/perl-xs/t/testutl.pl @@ -0,0 +1,26 @@ +#!/usr/bin/perl + +sub random_message_ok +{ + my ($pipe, $iter, $chunkmax) = @_; + $iter = 100 unless defined $iter; + $chunkmax = 300 unless defined $chunkmax; + eval { + my $input = ''; + $pipe->start_msg(); + for(my $i = 0; $i < $iter; $i++) + { + my $chunk = ''; + my $chunklen = int(rand($chunkmax)); + $chunk .= pack("C", int(rand(256))) while $chunklen--; + $input .= $chunk; + $pipe->write($chunk); + } + $pipe->end_msg(); + my $msg_num = $pipe->message_count() -1; + my $output = $pipe->read(0xFFFFFFFF, $msg_num); + return $input eq $output; + }; +} + +1; diff --git a/src/libs/3rdparty/botan/wrappers/perl-xs/t/x509cert.t b/src/libs/3rdparty/botan/wrappers/perl-xs/t/x509cert.t new file mode 100644 index 00000000000..2a943aeac00 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/perl-xs/t/x509cert.t @@ -0,0 +1,42 @@ +# vim: set ft=perl: +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl test.pl' + +######################### We start with some black magic to print on failure. + +# Change 1..1 below to 1..last_test_to_print . +# (It may become useful if the test is moved to ./t subdirectory.) + +BEGIN { $| = 1; print "1..4\n"; } +END { print "not ok 1\n" unless $loaded; } + +use Botan; + +$loaded = 1; +print "ok 1\n"; + +######################### End of black magic. + +# Insert your test code below (better if it prints "ok 13" +# (correspondingly "not ok 13") depending on the success of chunk 13 +# of the test code): + +use strict; + +my $cert = Botan::X509_Certificate->new('data/ca.cert.der'); + +print "not " if $cert->x509_version() != 3; +print "ok 2\n"; + +print "not " if $cert->start_time() ne '2000/8/20 21:48:00 UTC'; +print "ok 3\n"; + +print "not " if $cert->end_time() ne '2002/8/10 21:48:00 UTC'; +print "ok 4\n"; + +#my $subject = $cert->subject_dn()->get_attributes(); +#print STDERR "subject=", join(',', @{$subject}), "\n"; +# +#my $issuer = $cert->issuer_dn()->get_attributes(); +#print STDERR "issuer=", join(',', @{$issuer}), "\n"; +# diff --git a/src/libs/3rdparty/botan/wrappers/perl-xs/typemap b/src/libs/3rdparty/botan/wrappers/perl-xs/typemap new file mode 100644 index 00000000000..d7403d40da1 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/perl-xs/typemap @@ -0,0 +1,62 @@ +TYPEMAP + +Botan__ASN1_String * O_OBJECT +Botan__AlgorithmIdentifier * O_OBJECT +Botan__AlternativeName * O_OBJECT +Botan__Attribute * O_OBJECT +Botan__Base64_Decoder * O_EXTOBJECT +Botan__Base64_Encoder * O_EXTOBJECT +Botan__Chain * O_EXTOBJECT +Botan__Extension * O_OBJECT +Botan__Filter * O_EXTOBJECT +Botan__Fork * O_EXTOBJECT +Botan__Hex_Decoder * O_EXTOBJECT +Botan__Hex_Encoder * O_EXTOBJECT +Botan__OID * O_OBJECT +Botan__Pipe * O_OBJECT +Botan__X509_Certificate * O_OBJECT +Botan__X509_DN * O_OBJECT +Botan__X509_Time * O_OBJECT +Botan__u32bit T_UV + + +###################################################################### +OUTPUT + +# The Perl object is blessed into 'CLASS', which should be a +# char* having the name of the package for the blessing. +O_OBJECT + sv_setref_pv($arg, CLASS, (void*)$var); + +O_EXTOBJECT + sv_setref_pv($arg, CLASS, (void*)$var); + sv_magic(SvRV($arg), 0, '~', (char *)&oi_init, sizeof(oi_init)); + + +###################################################################### +INPUT + +O_OBJECT + if ( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) + $var = ($type)SvIV((SV*)SvRV( $arg )); + else + croak(\"${Package}::$func_name() -- \" + \"$var is not a blessed SV reference\"); + +# The pointer variable "ObjectInfo *${var}_oi;" must be declared +# in PREINIT section. I don't know how to emit this declaration safely here. +O_EXTOBJECT + if ( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) + $var = ($type)SvIV((SV*)SvRV($arg)); + else + croak(\"${Package}::$func_name() -- \" + \"$var is not a blessed SV reference\"); + { + MAGIC *mg = mg_find(SvRV($arg), '~'); + if ( mg == 0 + || mg->mg_len != sizeof(ObjectInfo) + || *(I32 *)(mg->mg_ptr) != ObjectInfo::SIGNVAL ) + croak(\"${Package}::$func_name() -- \" + \"private magic data for $var invalid\"); + ${var}_oi = (ObjectInfo *)(mg->mg_ptr); + } diff --git a/src/libs/3rdparty/botan/wrappers/swig/base.cpp b/src/libs/3rdparty/botan/wrappers/swig/base.cpp new file mode 100644 index 00000000000..448b3d48e5b --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/base.cpp @@ -0,0 +1,61 @@ +/************************************************* +* SWIG Interface for basic Botan interface * +* (C) 1999-2003 Jack Lloyd * +*************************************************/ + +#include "base.h" +#include + +#include + +/************************************************* +* Initialize the library * +*************************************************/ +LibraryInitializer::LibraryInitializer(const char* args) + { + Botan::Init::initialize(args); + } + +/************************************************* +* Shut down the library * +*************************************************/ +LibraryInitializer::~LibraryInitializer() + { + Botan::Init::deinitialize(); + } + +/************************************************* +* Create a SymmetricKey * +*************************************************/ +SymmetricKey::SymmetricKey(const std::string& str) + { + key = new Botan::SymmetricKey(str); + printf("STR CON: %p %p\n", this, key); + } + +/************************************************* +* Create a SymmetricKey * +*************************************************/ +SymmetricKey::SymmetricKey(u32bit n) + { + key = new Botan::SymmetricKey(n); + printf("N CON: %p %p\n", this, key); + } + +/************************************************* +* Destroy a SymmetricKey * +*************************************************/ +SymmetricKey::~SymmetricKey() + { + printf("DESTR: %p %p\n", this, key); + delete key; + key = 0; + //printf("deleted\n"); + } + +/************************************************* +* Create an InitializationVector * +*************************************************/ +InitializationVector::InitializationVector(const std::string& str) : iv(str) + { + } diff --git a/src/libs/3rdparty/botan/wrappers/swig/base.h b/src/libs/3rdparty/botan/wrappers/swig/base.h new file mode 100644 index 00000000000..341a5c35ae5 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/base.h @@ -0,0 +1,102 @@ +/************************************************* +* SWIG Interface for Botan * +* (C) 1999-2003 Jack Lloyd * +*************************************************/ + +#ifndef BOTAN_WRAP_BASE_H__ +#define BOTAN_WRAP_BASE_H__ + +#include + +#if !defined(SWIG) + #define OUTPUT + #define INOUT +#endif + +/************************************************* +* Typedefs * +*************************************************/ +typedef unsigned char byte; +typedef unsigned int u32bit; + +/************************************************* +* Library Initalization/Shutdown Object * +*************************************************/ +class LibraryInitializer + { + public: + LibraryInitializer(const char*); + ~LibraryInitializer(); + }; + +/************************************************* +* Symmetric Key Object * +*************************************************/ +class SymmetricKey + { + public: + std::string as_string() const { return key->as_string(); } + u32bit length() const { return key->length(); } + SymmetricKey(u32bit = 0); + SymmetricKey(const std::string&); + ~SymmetricKey(); + private: + Botan::SymmetricKey* key; + }; + +/************************************************* +* Initialization Vector Object * +*************************************************/ +class InitializationVector + { + public: + std::string as_string() const { return iv.as_string(); } + u32bit length() const { return iv.length(); } + InitializationVector(u32bit n = 0) { iv.change(n); } + InitializationVector(const std::string&); + private: + Botan::InitializationVector iv; + }; + +/************************************************* +* Filter Object * +*************************************************/ +class Filter + { + public: + Filter(const char*); + //Filter(const char*, const SymmetricKey&); + //Filter(const char*, const SymmetricKey&, const InitializationVector&); + ~Filter(); + private: + friend class Pipe; + Botan::Filter* filter; + bool pipe_owns; + }; + +/************************************************* +* Pipe Object * +*************************************************/ +class Pipe + { + public: + static const u32bit DEFAULT_MESSAGE = 0xFFFFFFFF; + + void write_file(const char*); + void write_string(const char*); + + u32bit read(byte*, u32bit, u32bit = DEFAULT_MESSAGE); + std::string read_all_as_string(u32bit = DEFAULT_MESSAGE); + + u32bit remaining(u32bit = DEFAULT_MESSAGE); + + void start_msg(); + void end_msg(); + + Pipe(Filter* = 0, Filter* = 0, Filter* = 0, Filter* = 0); + ~Pipe(); + private: + Botan::Pipe* pipe; + }; + +#endif diff --git a/src/libs/3rdparty/botan/wrappers/swig/botan.swg b/src/libs/3rdparty/botan/wrappers/swig/botan.swg new file mode 100644 index 00000000000..9088f427239 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/botan.swg @@ -0,0 +1,26 @@ +/************************************************* +* SWIG Interface for Botan * +*************************************************/ +%module botan + +%include "typemaps.i" +%include "std_string.i" +%include "exception.i" +%include "constraints.i" +%include "carrays.i" + +%{ +#include "base.h" +%} + +%exception { + try { + $action + } + catch(std::exception& e) + { + SWIG_exception(SWIG_RuntimeError, e.what()); + } +} + +%include "base.h" diff --git a/src/libs/3rdparty/botan/wrappers/swig/doit.py b/src/libs/3rdparty/botan/wrappers/swig/doit.py new file mode 100644 index 00000000000..98bc97087bd --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/doit.py @@ -0,0 +1,49 @@ +#!/usr/bin/python2 + +import botan + +def hash_it(hash, input): + f1 = botan.Filter("MD5") + f2 = botan.Filter("Hex_Encoder") + pipe = botan.Pipe(f1, f2) + + pipe.start_msg() + pipe.write_string(input) + pipe.end_msg() + + print pipe.remaining() + + out = pipe.read(0) + + + + +def main: + init = botan.LibraryInitializer + + print hash_it("MD5", "foo") + + + key1 = botan.SymmetricKey("ABCD") + print key1.as_string() + key2 = botan.SymmetricKey(16) + print key2.as_string() + + iv1 = botan.InitializationVector(8) + print iv1.as_string() + + + f3 = pipe.read(pipe.remaining()) + + size = pipe.remaining() + out = botan.byte_array(size) + pipe.read(out.cast,size) + + for i in range (0,size): + print "%02X" % out[i] + + print pipe.read_all_as_string() + +if __name__ == "__main__": + sys.exit(main()) + diff --git a/src/libs/3rdparty/botan/wrappers/swig/filter.cpp b/src/libs/3rdparty/botan/wrappers/swig/filter.cpp new file mode 100644 index 00000000000..53ff0e6a3a2 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/filter.cpp @@ -0,0 +1,39 @@ +/************************************************* +* SWIG Interface for Filter Retrieval * +* (C) 1999-2003 Jack Lloyd * +*************************************************/ + +#include "base.h" +#include +#include + +/************************************************* +* Filter Creation * +*************************************************/ +Filter::Filter(const char* filt_string) + { + filter = 0; + pipe_owns = false; + + /* + Fixme: This is all so totally wrong. It needs to have full argument + processing for everything, all that kind of crap. + */ + const std::string filt_name = filt_string; + + if(Botan::have_hash(filt_name)) + filter = new Botan::Hash_Filter(filt_name); + else if(filt_name == "Hex_Encoder") + filter = new Botan::Hex_Encoder; + } + +/************************************************* +* Filter Destruction * +*************************************************/ +Filter::~Filter() + { + /* + if(!pipe_owns) + delete filter; + */ + } diff --git a/src/libs/3rdparty/botan/wrappers/swig/pipe.cpp b/src/libs/3rdparty/botan/wrappers/swig/pipe.cpp new file mode 100644 index 00000000000..0f35d5a437f --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/pipe.cpp @@ -0,0 +1,89 @@ +/************************************************* +* SWIG Interface for Botan Pipe API * +* (C) 1999-2003 Jack Lloyd * +*************************************************/ + +#include "base.h" +#include + +#include + +/************************************************* +* Write the contents of a file into a Pipe * +*************************************************/ +void Pipe::write_file(const char* filename) + { + Botan::DataSource_Stream in(filename); + pipe->write(in); + } + +/************************************************* +* Write the contents of a string into a Pipe * +*************************************************/ +void Pipe::write_string(const char* string) + { + pipe->write(string); + } + +/************************************************* +* Read the contents of a Pipe into a buffer * +*************************************************/ +u32bit Pipe::read(byte* buf, u32bit length, u32bit msg) + { + printf("read %p %d\n", buf, length); + return 0; + //return pipe->read(buf, length, msg); + } + +/************************************************* +* Read the contents of a Pipe as a string * +*************************************************/ +std::string Pipe::read_all_as_string(u32bit msg) + { + return pipe->read_all_as_string(msg); + } + +/************************************************* +* Find out how much stuff the Pipe still has * +*************************************************/ +u32bit Pipe::remaining(u32bit msg) + { + return pipe->remaining(); + } + +/************************************************* +* Start a new message * +*************************************************/ +void Pipe::start_msg() + { + pipe->start_msg(); + } + +/************************************************* +* End the current msessage * +*************************************************/ +void Pipe::end_msg() + { + pipe->end_msg(); + } + +/************************************************* +* Create a new Pipe * +*************************************************/ +Pipe::Pipe(Filter* f1, Filter* f2, Filter* f3, Filter* f4) + { + pipe = new Botan::Pipe(); + + if(f1) { pipe->append(f1->filter); f1->pipe_owns = true; } + if(f2) { pipe->append(f2->filter); f2->pipe_owns = true; } + if(f3) { pipe->append(f3->filter); f3->pipe_owns = true; } + if(f4) { pipe->append(f4->filter); f4->pipe_owns = true; } + } + +/************************************************* +* Destroy this Pipe * +*************************************************/ +Pipe::~Pipe() + { + delete pipe; + } diff --git a/src/libs/3rdparty/botan/wrappers/swig/pk.swg b/src/libs/3rdparty/botan/wrappers/swig/pk.swg new file mode 100644 index 00000000000..8e03cf12094 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/pk.swg @@ -0,0 +1,8 @@ +%module botan + +%{ +#undef ANY +#include "botan/pubkey.h" +%} + +%include "botan/pubkey.h" diff --git a/src/libs/3rdparty/botan/wrappers/swig/readme.txt b/src/libs/3rdparty/botan/wrappers/swig/readme.txt new file mode 100644 index 00000000000..a9965d91488 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/readme.txt @@ -0,0 +1,34 @@ +This is the beginning of an attempt to SWIG-ify Botan so it can be accessed by +other languages. You should use the latest SWIG 1.3 release (I am currently +using SWIG 1.3.19). Currently I am only testing this code with Python 2.2.1, +since that is the language I am mainly interested in at this point. Feel free +to send me patches so this is usable with Perl or whatever. + +I'm not attempting to make everything in Botan usable from a script - +basically, I just want the parts that *I* want to use. Most things are not +supported yet, and there are lots of bugs in the stuff that does exist. If +there is something in particular that you would like to be able to use from a +script, let me know (patches are good, too). + +Todo: + * Why does it seg fault if we don't create a LibraryInitializer. It should + throw an exception, like it does in C++. Maybe have it init Botan when the + module is loaded? That seems a lot cleaner/nicer, but I don't know how to + do it yet. + * Lots of problems with exceptions + * Use constraints to prevent bad args when possible + * Pipe/Filter + - Better argument processing for all filters + - Support for ciphers, MACs, etc + - Chain + Fork + - Support for append/prepend/pop/reset in Pipe? + * Public Key Crypto + - RSA + - DSA + - DH + - Generic X.509 and PKCS #8 stuff + * PKI + - X.509 certs + CRLs + - PKCS #10 requests + - X.509 stores + - X.509 CA diff --git a/src/libs/3rdparty/botan/wrappers/swig/tests/block.py b/src/libs/3rdparty/botan/wrappers/swig/tests/block.py new file mode 100644 index 00000000000..593937c810c --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/tests/block.py @@ -0,0 +1,52 @@ +#!/usr/bin/python + +import botan, base64 + +class MyCipher(botan.BlockCipher): + def __init__(self): + botan.BlockCipher.__init__(self, 16, 16, 32, 8) + def encrypt(self, val): + print "encrypt", val + return val.swapcase() + def decrypt(self, val): + print "decrypt", val + return val.swapcase() + def set_key(self, key): + print "set_key", key + def clone(self): + print "cloning" + return MyCipher() + def name(self): + print "naming" + return "MyCipher" + +cipher = botan.BlockCipher("AES-128") + +print cipher.block_size +print cipher.keylength_min +print cipher.keylength_max +print cipher.keylength_mod +print cipher.name() + +for kl in range(1, 128): + if cipher.valid_keylength(kl): + print "1", + else: + print "0", +print +key = botan.SymmetricKey(16) + +cipher.set_key(key) +ciphertext = cipher.encrypt("ABCDEFGH12345678") +print base64.b16encode(ciphertext) + +cipher2 = cipher.clone() +cipher2.set_key(key) + +plaintext = cipher2.decrypt(ciphertext) +print plaintext + +botan.get_info(cipher) + +mycipher = MyCipher() +botan.get_info(mycipher) diff --git a/src/libs/3rdparty/botan/wrappers/swig/tests/block2.py b/src/libs/3rdparty/botan/wrappers/swig/tests/block2.py new file mode 100644 index 00000000000..5faccaf9a31 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/tests/block2.py @@ -0,0 +1,44 @@ +#!/usr/bin/python + +import botan, base64 + +class MyCipher(botan.BlockCipherImpl): + def __init__(self): + botan.BlockCipherImpl.__init__(self, 8, 8, 16, 1) + + def name(self): + return "MyCipher" + + def encrypt(self, input): + return input.swapcase() + + def decrypt(self, input): + return input.swapcase() + + def set_key(self, key): + print "Got key",key + +def test(cipher): + print + print cipher + print "Testing", cipher.name() + print cipher.block_size + print cipher.keylength_min, cipher.keylength_max, cipher.keylength_mod + for i in range(1, 64): + if cipher.valid_keylength(i): + print "1", + else: + print "0", + print + cipher.set_key(botan.SymmetricKey(16)) + ciphertext = cipher.encrypt("aBcDeFgH" * (cipher.block_size / 8)) + print repr(ciphertext) + print cipher.decrypt(ciphertext) + +def main(): + test(botan.BlockCipher("Blowfish")) + test(MyCipher()) + test(botan.BlockCipher("AES")) + +if __name__ == "__main__": + main() diff --git a/src/libs/3rdparty/botan/wrappers/swig/tests/encrypt.py b/src/libs/3rdparty/botan/wrappers/swig/tests/encrypt.py new file mode 100644 index 00000000000..9896777d4a8 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/tests/encrypt.py @@ -0,0 +1,37 @@ +#!/usr/bin/python + +import sys, botan + +def encrypt(input): + cipher_key = botan.SymmetricKey("AABB") + print cipher_key.length + cipher_key = botan.SymmetricKey("AABBCCDD") + print cipher_key.length + + cipher = botan.Filter("ARC4", key = cipher_key) + + pipe = botan.Pipe(cipher, botan.Filter("Hex_Encoder")) + + pipe.start_msg() + pipe.write(input) + pipe.end_msg() + + str = pipe.read_all() + print str + return str + +def decrypt(input): + pipe = botan.Pipe(botan.Filter("Hex_Decoder"), + botan.Filter("ARC4", + key = botan.SymmetricKey("AABBCCDD"))) + + pipe.process_msg(input) + return pipe.read_all() + +def main(): + ciphertext = encrypt("hi chappy") + print ciphertext + print decrypt(ciphertext) + +if __name__ == "__main__": + sys.exit(main()) diff --git a/src/libs/3rdparty/botan/wrappers/swig/tests/filter.py b/src/libs/3rdparty/botan/wrappers/swig/tests/filter.py new file mode 100644 index 00000000000..2b65d9ff215 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/tests/filter.py @@ -0,0 +1,27 @@ +#!/usr/bin/python + +import sys, botan + +class MyFilter(botan.FilterObj): + def write(self, input): + print "MyFilter::write",input + self.send(input) + def start_msg(self): + print "MyFilter::start_msg" + def end_msg(self): + print "MyFilter::end_msg" + def __del__(self): + print "~MyFilter" + +def main(): + filter = MyFilter() + + pipe = botan.Pipe(botan.Filter("Hex_Encoder"), filter, + botan.Filter("Hex_Decoder")) + pipe.start_msg() + pipe.write("hi chappy") + pipe.end_msg() + print pipe.read_all() + +if __name__ == "__main__": + sys.exit(main()) diff --git a/src/libs/3rdparty/botan/wrappers/swig/tests/hash.py b/src/libs/3rdparty/botan/wrappers/swig/tests/hash.py new file mode 100644 index 00000000000..930b8c81a9d --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/tests/hash.py @@ -0,0 +1,30 @@ +#!/usr/bin/python + +import botan, base64, md5 + +class PyMD5(botan.HashFunctionImpl): + def name(self): + return "PyMD5" + def update(self, input): + self.md5.update(input) + def final(self): + output = self.md5.digest() + self.md5 = md5.new() + return output + def __init__(self): + botan.HashFunctionImpl.__init__(self, 16, 64) + self.md5 = md5.new() + +hash = botan.HashFunction("SHA-256") + +print hash.name() +print hash.digest_size + +hash.update("hi") +hash.update(" ") +hash.update("chappy") +print base64.b16encode(hash.final()) + +hash2 = PyMD5() +hash2.update("hi chappy") +print base64.b16encode(hash2.final()) diff --git a/src/libs/3rdparty/botan/wrappers/swig/tests/mac.py b/src/libs/3rdparty/botan/wrappers/swig/tests/mac.py new file mode 100644 index 00000000000..6110b610220 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/tests/mac.py @@ -0,0 +1,12 @@ +#!/usr/bin/python + +import botan, base64 + +mac = botan.MAC("HMAC(SHA-512)") + +print mac.name +print mac.output_length + +mac.set_key(botan.SymmetricKey("abcd")) +mac.update("hi chappy") +print base64.b16encode(mac.final()) diff --git a/src/libs/3rdparty/botan/wrappers/swig/tests/pubkey.py b/src/libs/3rdparty/botan/wrappers/swig/tests/pubkey.py new file mode 100644 index 00000000000..456c520693e --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/tests/pubkey.py @@ -0,0 +1,10 @@ +#!/usr/bin/python + +import botan + +key = botan.X509_PublicKey("rsapub.pem") +print key +print key.key_id() +print key.max_input_bits +print key.algo +print key.oid diff --git a/src/libs/3rdparty/botan/wrappers/swig/tests/stream.py b/src/libs/3rdparty/botan/wrappers/swig/tests/stream.py new file mode 100644 index 00000000000..59d3ffa16c3 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/tests/stream.py @@ -0,0 +1,17 @@ +#!/usr/bin/python + +import botan, base64 + +cipher = botan.StreamCipher("ARC4") + +print cipher.name + +key = botan.SymmetricKey(16) + +cipher.set_key(key) +ciphertext = cipher.crypt("hi chappy") + +cipher.set_key(key) +plaintext = cipher.crypt(ciphertext) + +print plaintext diff --git a/src/libs/3rdparty/botan/wrappers/swig/x509.swg b/src/libs/3rdparty/botan/wrappers/swig/x509.swg new file mode 100644 index 00000000000..736d3a38579 --- /dev/null +++ b/src/libs/3rdparty/botan/wrappers/swig/x509.swg @@ -0,0 +1,9 @@ +%module botan + +class X509_Certificate + { + public: + + + private: + };

    All results are in operations per second:\n"; + print "\n\n"; + + my %col_index = (); + + my $line = "\n"; + + print $line; + + foreach my $algo (sort keys %pk_algos) { + my $line = "
    Algorithm "; + + foreach my $col (@columns) { + $col_index{$col} = length($line); + $line .= "" . $col . " "; + } + + $line .= "\n
    $algo "; + + for my $col (@columns) { + my $result = $pk{$col}{$algo}; + $result = '-' if not defined($result); + + $result = "$result"; + + $line .= ' ' while(length($line) < ($col_index{$col})); + $line .= $result; + + } + + print $line, "\n"; + } + + print "
    \n"; +} + +print_table(); +print_pk_table(); diff --git a/src/libs/3rdparty/botan/doc/scripts/dist.sh b/src/libs/3rdparty/botan/doc/scripts/dist.sh new file mode 100644 index 00000000000..9629446cf33 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/scripts/dist.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# This is probably only useful if run on my machine, which is not +# exactly ideal + +SELECTOR=h:net.randombit.botan.1_8 +KEY_ID=EFBADFBC +MTN_DB=/storage/mtn/botan.mtn +WEB_DIR=~/projects/www +DIST_DIR=~/Botan-dist + +# You shouldn't have to change anything after this +mkdir -p $DIST_DIR +cd $DIST_DIR + +mtn -d $MTN_DB checkout -r $SELECTOR Botan + +VERSION=$(Botan/configure.py --version) + +mv Botan Botan-$VERSION + +cd Botan-$VERSION +rm -rf _MTN +rm -f .mtn-ignore + +# Build docs +cd doc + +for doc in api tutorial building +do + latex $doc.tex + latex $doc.tex + dvips $doc.dvi -o + pdflatex $doc.tex + pdflatex $doc.tex + cp $doc.pdf $DIST_DIR + mv $doc.ps $DIST_DIR + # Clean up after TeX + rm -f $doc.aux $doc.log $doc.dvi $doc.toc +done + +cp log.txt ../.. + +cd .. # topdir +cd .. # now in DIST_DIR + +tar -cf Botan-$VERSION.tar Botan-$VERSION + +bzip2 -9 -k Botan-$VERSION.tar +gzip -9 Botan-$VERSION.tar + +rm -rf Botan-$VERSION + +mv Botan-$VERSION.tar.gz Botan-$VERSION.tgz +mv Botan-$VERSION.tar.bz2 Botan-$VERSION.tbz + +echo "*****************************************************" +read -a PASSWORD -p "Enter PGP password (or ^C to skip signatures): " + +echo $PASSWORD | gpg --batch --armor -b --passphrase-fd 0 -u $KEY_ID Botan-$VERSION.tgz +echo $PASSWORD | gpg --batch --armor -b --passphrase-fd 0 -u $KEY_ID Botan-$VERSION.tbz + +mv Botan-$VERSION.tgz* $WEB_DIR/files/botan/v1.8 +mv Botan-$VERSION.tbz* $WEB_DIR/files/botan/v1.8 diff --git a/src/libs/3rdparty/botan/doc/scripts/primes.py b/src/libs/3rdparty/botan/doc/scripts/primes.py new file mode 100644 index 00000000000..cf4d139e3e1 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/scripts/primes.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python + +import sys + +def gcd(x,y): + if x <= 0 or y <= 0: + raise ValueError, "Arguments must be positive integers" + g = y + while x > 0: + g = x + x = y % x + y = g + return g + + +def gen_primes(): + primes = [2,3,5,7,11] + + # Primes < 11351 fit into less than 256x64 bits + for i in xrange(1+primes[-1], 11351+1): + for prime in primes: + if gcd(i, prime) != 1: + break + else: + primes.append(i) + + return primes + +def extract_product(primes): + product = 1 + + used = set() + + for prime in sorted(primes, reverse=True): + if product * prime < 2**64: + product *= prime + used.add(prime) + + primes -= used + + return product + +def main(): + primes = gen_primes() + + primes.sort() + primes.reverse() + + primes = set(primes) + + while len(primes): + print "0x%016X, " % extract_product(primes) + + #product = 1 + #for prime in primes: + # product *= prime + + # if product >= 2**64: + # print "%016X" % (product/prime) + # product = prime + +if __name__ == '__main__': + sys.exit(main()) diff --git a/src/libs/3rdparty/botan/doc/scripts/print_deps.py b/src/libs/3rdparty/botan/doc/scripts/print_deps.py new file mode 100644 index 00000000000..b92c43310d0 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/scripts/print_deps.py @@ -0,0 +1,70 @@ +#!/usr/bin/python + +""" +Analyze the botan source tree and print the module interdependencies + +(C) 2009 Jack Lloyd +Distributed under the terms of the Botan license +""" + +import os +import os.path +import sys +import re + +def find_deps_in(filename): + # By convention #include's with spaces before them are + # always wrapped in #ifdef blocks + regexp = re.compile('^#include ') + + for line in open(filename).readlines(): + match = regexp.match(line) + if match != None: + yield match.group(1) + +def get_dependencies(dirname): + all_dirdeps = {} + file_homes = {} + + is_sourcefile = re.compile('\.(cpp|h|S)$') + + for (dirpath, dirnames, filenames) in os.walk('src'): + dirdeps = set() + for filename in filenames: + if is_sourcefile.search(filename) != None: + file_homes[filename] = os.path.basename(dirpath) + + for dep in find_deps_in(os.path.join(dirpath, filename)): + if dep not in filenames and dep != 'build.h': + dirdeps.add(dep) + + dirdeps = sorted(dirdeps) + if dirdeps != []: + all_dirdeps[dirpath] = dirdeps + + return (all_dirdeps, file_homes) + +def main(): + (all_dirdeps, file_homes) = get_dependencies('src') + + def interesting_dep_for(dirname): + def interesting_dep(dep): + if dep == 'utils': + return False # everything depends on it + + # block/serpent depends on block, etc + if dirname.find('/%s/' % (dep)) > 0: + return False + return True + return interesting_dep + + for dirname in sorted(all_dirdeps.keys()): + depdirs = sorted(set(map(lambda x: file_homes[x], all_dirdeps[dirname]))) + + depdirs = filter(interesting_dep_for(dirname), depdirs) + + if depdirs != []: + print "%s: %s" % (dirname, ' '.join(depdirs)) + +if __name__ == '__main__': + sys.exit(main()) diff --git a/src/libs/3rdparty/botan/doc/scripts/update_deps.py b/src/libs/3rdparty/botan/doc/scripts/update_deps.py new file mode 100644 index 00000000000..61aa887cca2 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/scripts/update_deps.py @@ -0,0 +1,41 @@ +#!/usr/bin/python + +import sys +import re +import os.path + +def update_requires(dir, deps): + lines = map(lambda x: x.strip(), + open(os.path.join(dir, 'info.txt')).readlines()) + + if '' in lines: + start = lines.index('') + + while lines.pop(start) != '': + pass + + while lines[-1] == '': + lines = lines[:-1] + + if len(deps) > 0: + lines.append('') + lines.append('') + for dep in deps: + lines.append(dep) + lines.append('') + lines.append('') + + lines = "\n".join(lines).replace("\n\n\n", "\n\n") + + output = open(os.path.join(dir, 'info.txt'), 'w') + output.write(lines) + output.close() + +def main(): + for line in sys.stdin.readlines(): + (dirname, deps) = line.split(':') + deps = deps.strip().split(' ') + update_requires(dirname, deps) + +if __name__ == '__main__': + sys.exit(main()) diff --git a/src/libs/3rdparty/botan/doc/thanks.txt b/src/libs/3rdparty/botan/doc/thanks.txt new file mode 100644 index 00000000000..caa2fb53857 --- /dev/null +++ b/src/libs/3rdparty/botan/doc/thanks.txt @@ -0,0 +1,49 @@ + +The following people (sorted alphabetically) contributed bug reports, useful +information, or were generally just helpful people to talk to: + +Jeff B +Rickard Bondesson +Mike Desjardins +Matthew Gregan +Hany Greiss +Friedemann Kleint +Ying-Chieh Liao +Dan Nicolaescu +Vaclav Ovsik +Ken Perano +Darren Starsmore +Kaushik Veeraraghavan +Dominik Vogt +James Widener + +Cerulean Studios, creators of the Trillian instant messaging client, +has provided financial assistance to the project. + +Barry Kavanagh of AEP Systems Ltd kindly provided an AEP2000 crypto card and +drivers, enabling the creation of Botan's AEP engine module. + +In addition, the following people have unknowingly contributed help: + + Dean Gaudet wrote the SSE2 implementation of SHA-1 + + The implementation of DES is based off a public domain implementation by Phil + Karn from 1994 (he, in turn, credits Richard Outerbridge and Jim Gillogly). + + Rijndael and Square are based on the reference implementations written by + the inventors, Joan Daemen and Vincent Rijmen. + + The Serpent S-boxes used were discovered by Dag Arne Osvik and detailed in + his paper "Speeding Up Serpent". + + Matthew Skala's public domain twofish.c (as given in GnuPG 0.9.8) provided + the basis for my Twofish code (particularly the key schedule). + + Some of the hash functions (MD5, SHA-1, etc) use an optimized implementation + of one of the boolean functions, which was discovered by Colin Plumb. + + The design of Randpool takes some of it's design principles from those + suggested by Eric A. Young in his SSLeay documentation, Peter Gutmann's paper + "Software Generation of Practically Strong Random Numbers", and the paper + "Cryptanalytic Attacks on Pseudorandom Number Generators", by Kelsey, + Schneier, Wagner, and Hall. diff --git a/src/libs/3rdparty/botan/doc/tutorial.pdf b/src/libs/3rdparty/botan/doc/tutorial.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2a68d627ad7d1bc9ac579c740400351240e25ce9 GIT binary patch literal 115992 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

    j3{LcQ*aK88all^}}qZc)3)o%UI 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