diff options
Diffstat (limited to 'checks')
-rw-r--r-- | checks/dolook.cpp | 4 | ||||
-rw-r--r-- | checks/ec_tests.cpp | 18 | ||||
-rw-r--r-- | checks/ecdsa.cpp | 10 | ||||
-rw-r--r-- | checks/nist_tests/x509test.cpp | 93 | ||||
-rw-r--r-- | checks/pk_bench.cpp | 9 | ||||
-rw-r--r-- | checks/validate.cpp | 21 | ||||
-rw-r--r-- | checks/validate.dat | 157 |
7 files changed, 215 insertions, 97 deletions
diff --git a/checks/dolook.cpp b/checks/dolook.cpp index 1015f4240..a8e08a96b 100644 --- a/checks/dolook.cpp +++ b/checks/dolook.cpp @@ -55,6 +55,8 @@ using namespace Botan; #include "common.h" +namespace { + /* A weird little hack to fit PBKDF algorithms into the validation * suite You probably wouldn't ever want to actually use the PBKDF * algorithms like this, the raw PBKDF interface is more convenient @@ -279,6 +281,8 @@ Filter* lookup_encoder(const std::string& algname) return 0; } +} + Filter* lookup(const std::string& algname, const std::vector<std::string>& params) { diff --git a/checks/ec_tests.cpp b/checks/ec_tests.cpp index bad0d8912..8ed975603 100644 --- a/checks/ec_tests.cpp +++ b/checks/ec_tests.cpp @@ -5,12 +5,16 @@ */ -#include <botan/build.h> +#include <botan/rng.h> + +#if defined(BOTAN_HAS_ECC_GROUP) + #include <botan/bigint.h> #include <botan/numthry.h> #include <botan/curve_gfp.h> #include <botan/point_gfp.h> -#include <botan/ecdsa.h> +#include <botan/ec_group.h> +#include <botan/reducer.h> #include <botan/oids.h> using namespace Botan; @@ -22,6 +26,7 @@ using namespace Botan; #include "validate.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"; } @@ -38,7 +43,7 @@ PointGFp create_random_point(RandomNumberGenerator& rng, { const BigInt& p = curve.get_p(); - const Modular_Reducer& mod_p = curve.mod_p(); + Modular_Reducer mod_p(p); while(true) { @@ -813,3 +818,10 @@ void do_ec_tests(RandomNumberGenerator& rng) std::cout << std::endl; } +#else + +void do_ec_tests(Botan::RandomNumberGenerator& rng) + { + } + +#endif diff --git a/checks/ecdsa.cpp b/checks/ecdsa.cpp index 58f76c9ba..5cf353e58 100644 --- a/checks/ecdsa.cpp +++ b/checks/ecdsa.cpp @@ -172,12 +172,12 @@ bool test_ec_sign(RandomNumberGenerator& rng) PK_Signer signer(priv_key, "EMSA1(SHA-224)"); PK_Verifier verifier(priv_key, "EMSA1(SHA-224)"); - for(u32bit i = 0; i != 256; ++i) - signer.update((byte)i); + for(size_t i = 0; i != 256; ++i) + signer.update(static_cast<byte>(i)); SecureVector<byte> sig = signer.signature(rng); for(u32bit i = 0; i != 256; ++i) - verifier.update((byte)i); + verifier.update(static_cast<byte>(i)); if(!verifier.check_signature(sig)) { std::cout << "ECDSA self-test failed!"; @@ -186,7 +186,7 @@ bool test_ec_sign(RandomNumberGenerator& rng) // now check valid signature, different input for(u32bit i = 1; i != 256; ++i) //starting from 1 - verifier.update((byte)i); + verifier.update(static_cast<byte>(i)); if(verifier.check_signature(sig)) { @@ -198,7 +198,7 @@ bool test_ec_sign(RandomNumberGenerator& rng) sig[sig.size()/2]++; for(u32bit i = 0; i != 256; ++i) - verifier.update((byte)i); + verifier.update(static_cast<byte>(i)); if(verifier.check_signature(sig)) { diff --git a/checks/nist_tests/x509test.cpp b/checks/nist_tests/x509test.cpp index d89e7c341..66b274c6c 100644 --- a/checks/nist_tests/x509test.cpp +++ b/checks/nist_tests/x509test.cpp @@ -1,7 +1,7 @@ /* - Code to run the X.509v3 processing tests described in "Conformance Testing of - Relying Party Client Certificate Path Proccessing Logic", which is available - on NIST's web site. + Code to run the X.509v3 processing tests described in "Conformance + Testing of Relying Party Client Certificate Path Proccessing Logic", + which is available on NIST's web site. */ #include <botan/x509path.h> @@ -18,10 +18,6 @@ using namespace Botan; #include <dirent.h> -#define POLICY_TEST1 1000 -#define POLICY_TEST2 2000 -#define POLICY_TEST3 3000 - std::vector<std::string> dir_listing(const std::string&); void run_one_test(u32bit, X509_Code, @@ -263,13 +259,14 @@ void populate_expected_results() expected_results[33] = VERIFIED; /* - Policy tests: a little trickier because there are other inputs which - affect the result. + 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: + 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 should 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 @@ -281,88 +278,28 @@ void populate_expected_results() 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[45] = EXPLICT_POLICY_REQUIRED; + //expected_results[46] = ACCEPT; + //expected_results[47] = EXPLICT_POLICY_REQUIRED; + 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; diff --git a/checks/pk_bench.cpp b/checks/pk_bench.cpp index b0e689b0c..de8ad0730 100644 --- a/checks/pk_bench.cpp +++ b/checks/pk_bench.cpp @@ -65,6 +65,9 @@ using namespace Botan; #include <memory> #include <set> +#define BENCH_FAULT_PROT DISABLE_FAULT_PROTECTION +//#define BENCH_FAULT_PROT ENABLE_FAULT_PROTECTION + namespace { const char* ec_domains[] = { @@ -329,7 +332,7 @@ void benchmark_ecdsa(RandomNumberGenerator& rng, ECDSA_PrivateKey key(rng, params); keygen_timer.stop(); - PK_Signer sig(key, padding, IEEE_1363, DISABLE_FAULT_PROTECTION); + PK_Signer sig(key, padding, IEEE_1363, BENCH_FAULT_PROT); PK_Verifier ver(key, padding); benchmark_sig_ver(ver, sig, verify_timer, @@ -371,7 +374,7 @@ void benchmark_gost_3410(RandomNumberGenerator& rng, GOST_3410_PrivateKey key(rng, params); keygen_timer.stop(); - PK_Signer sig(key, padding, IEEE_1363, DISABLE_FAULT_PROTECTION); + PK_Signer sig(key, padding, IEEE_1363, BENCH_FAULT_PROT); PK_Verifier ver(key, padding); benchmark_sig_ver(ver, sig, verify_timer, @@ -478,7 +481,7 @@ void benchmark_dsa_nr(RandomNumberGenerator& rng, algo_name = key.algo_name(); keygen_timer.stop(); - PK_Signer sig(key, padding, IEEE_1363, DISABLE_FAULT_PROTECTION); + PK_Signer sig(key, padding, IEEE_1363, BENCH_FAULT_PROT); PK_Verifier ver(key, padding); benchmark_sig_ver(ver, sig, verify_timer, diff --git a/checks/validate.cpp b/checks/validate.cpp index d79f9783a..65317604e 100644 --- a/checks/validate.cpp +++ b/checks/validate.cpp @@ -183,19 +183,23 @@ bool test_bcrypt(RandomNumberGenerator& rng) #if defined(BOTAN_HAS_BCRYPT) std::cout << "Testing Bcrypt: " << std::flush; - const std::string input = "abc"; + bool ok = true; // Generated by jBCrypt 0.3 - const std::string fixed_hash = - "$2a$05$DfPyLs.G6.To9fXEFgUL1O6HpYw3jIXgPcl/L3Qt3jESuWmhxtmpS"; + if(!check_bcrypt("abc", + "$2a$05$DfPyLs.G6.To9fXEFgUL1O6HpYw3jIXgPcl/L3Qt3jESuWmhxtmpS")) + { + std::cout << "Fixed bcrypt test failed\n"; + ok = false; + } std::cout << "." << std::flush; - bool ok = true; - - if(!check_bcrypt(input, fixed_hash)) + // http://www.openwall.com/lists/john-dev/2011/06/19/2 + if(!check_bcrypt("\xA3", + "$2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq")) { - std::cout << "Fixed bcrypt test failed\n"; + std::cout << "Fixed bcrypt test 2 failed\n"; ok = false; } @@ -203,7 +207,8 @@ bool test_bcrypt(RandomNumberGenerator& rng) for(u16bit level = 1; level != 5; ++level) { - std::string gen_hash = generate_bcrypt(input, rng, level); + const std::string input = "some test passphrase 123"; + const std::string gen_hash = generate_bcrypt(input, rng, level); if(!check_bcrypt(input, gen_hash)) { diff --git a/checks/validate.dat b/checks/validate.dat index 41e5bf61f..6b9a49e52 100644 --- a/checks/validate.dat +++ b/checks/validate.dat @@ -4123,6 +4123,26 @@ F0E1D2C3B4A5968778695A4B3C2D1E0F00112233445566 FEDCBA9876543210:05044B62FA52D080:\ F0E1D2C3B4A5968778695A4B3C2D1E0F0011223344556677 +[Camellia] +# From RFC 3713 + +0123456789ABCDEFFEDCBA9876543210:67673138549669730857065648EABE43:\ +0123456789ABCDEFFEDCBA9876543210 + +0123456789ABCDEFFEDCBA9876543210:B4993401B3E996F84EE5CEE7D79B09B9:\ +0123456789ABCDEFFEDCBA98765432100011223344556677 + +0123456789ABCDEFFEDCBA9876543210:9ACC237DFF16D76C20EF7C919E3A7509:\ +0123456789ABCDEFFEDCBA987654321000112233445566778899AABBCCDDEEFF + +# From NESSIE + +00000000000000000000000000000000:6C227F749319A3AA7DA235A9BBA05A2C:\ +80000000000000000000000000000000 + +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:25DD9EB9DD67FBC6E8431F56F4FBE651:\ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + # First one is from RFC 2144. The rest were done with OpenSSL and bits taken # from /dev/urandom [CAST-128] @@ -4406,6 +4426,61 @@ D2FD8867D50D2DFE:0000000000000004:0101010101010101 0000000000000000:E2F5728F0995013C:1002911598100201 0000000000000000:1AEAC39A61F0A464:1002911698100101 +# Tests all sboxes +01A1D6D039776742:690F5B0D9A26939B:7CA110454A1A6E57 +5CD54CA83DEF57DA:7A389D10354BD271:0131D9619DC1376E +0248D43806F67172:868EBB51CAB4599A:07A1133E4A0B2686 +51454B582DDF440A:7178876E01F19B2A:3849674C2602319E +42FD443059577FA2:AF37FB421F8C4095:04B915BA43FEB5B6 +059B5E0851CF143A:86A560F10EC6D85B:0113B970FD34F2CE +0756D8E0774761D2:0CD3DA020021DC09:0170F175468FB5E6 +762514B829BF486A:EA676B2CB7DB2B7A:43297FAD38E373FE +3BDD119049372802:DFD64A815CAF1A0F:07A7137045DA2A16 +26955F6835AF609A:5C513C9C4886C088:04689104C2FD3B2F +164D5E404F275232:0A2AEEAE3FF4AB77:37D06BB516CB7546 +6B056E18759F5CCA:EF1BF03E5DFA575A:1F08260D1AC2465E +004BD6EF09176062:88BF0DB6D70DEE56:584023641ABA6176 +480D39006EE762F2:A1F9915541020B56:025816164629B007 +437540C8698F3CFA:6FBF1CAFCFFD0556:49793EBC79B3258F +072D43A077075292:2F22E49BAB7CA1AC:4FB05E1515AB73A7 +02FE55778117F12A:5A6B612CC26CCE4A:49E95D6D4CA229BF +1D9D5C5018F728C2:5F4C038ED12B2E41:018310DC409B26D6 +305532286D6F295A:63FAC0D034D9F793:1C587F1C13924FEF + +# Tests the permutation +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:3107911598080140 +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 @@ -4693,6 +4768,8 @@ D6A025B07C037A6E1E0653E828FB9E3A3587CDDA5325D4DAA743D113D995D6AF E07306086FA442A42B107F7F355359DD972BF070C0C71FF5C37FA7C259C7E039 [IDEA] +7409000000000000:E18315C171B83765:ED1BCC9E9267925F3132BA3A8CF9B764 + D53FABBF94FF8B5F:1D0CB2AF1654820A:729A27ED8F5C3E8BAF16560D14C90B43 848F836780938169:D7E0468226D0FC56:729A27ED8F5C3E8BAF16560D14C90B43 819440CA2065D112:264A8BBA66959075:729A27ED8F5C3E8BAF16560D14C90B43 @@ -4720,6 +4797,86 @@ FAE6D2BEAA96826E0A141E28323C4650050A0F14191E2328050A0F14191E2328:\ 85DF52005608193D2F7DE750212FB7347B7314925DE59C097B7314925DE59C09:\ 00010002000300040005000600070008 +C309000000000000A02A000000000000B03D000000000000C942000000000000\ +2B4C000000000000A04E0000000000009857000000000000C860000000000000\ +0063000000000000F2660000000000008698000000000000729D000000000000\ +34A000000000000023A500000000000010AE00000000000025AE000000000000\ +30D600000000000064DB000000000000BCE1000000000000F6E7000000000000\ +4AEC00000000000080F9000000000000E0FE00000000000061FF000000000000:\ +9C3C4F44BB50DF7367DAD70E6FED04E0AEB0344116C6E41F66A1A304E822132D\ +8AFCC1727259D93DD6E742EAEF2FD8C03EAD7890DC4EFACBB8776F3439A3DB1B\ +55D47DC6BC4A43349BA9E85FE178CD1ADBDD4E9D19CA1E7659341251586E1386\ +4A8C4E93A2616A0C18890A622452AD9FD09CB1A9CDC83ABF2FCFA325FA011731\ +9C924852D426132D05DA82EEBC3C261A6036C6477FBE3F65C40B8B02C2F9D8C8\ +B3084034AB3873CF22F20759C145ECCE92CE6B557D6DB959DA0B8AD4E0DFBCEA:\ +F2022315280960F16FD09741D13F693A + +7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4\ +ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B96\ +8F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C94\ +75D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD\ +1F231EA81C7B64C514735AC55E4B79633B706424119E09DCAAD4ACF21B10AF3B\ +33CDE3504847155CBB6F2219BA9B7DF50BE11A1C7F23F829F8A41B13B5CA4EE8\ +983238E0794D3D34BC5F4E77FACB6C05AC86212BAA1A55A2BE70B5733B045CD3\ +3694B3AFE2F0E49E4F321549FD824EA90870D4B28A2954489A0ABCD50E18A844\ +AC5BF38E4CD72D9B0942E506C433AFCDA3847F2DADD47647DE321CEC4AC430F6\ +2023856CFBB20704F4EC0BB920BA86C33E05F1ECD96733B79950A3E314D3D934\ +F75EA0F210A8F6059401BEB4BC4478FA4969E623D01ADA696A7E4C7E5125B348\ +84533A94FB319990325744EE9BBCE9E525CF08F5E9E25E5360AAD2B2D085FA54\ +D835E8D466826498D9A8877565705A8A3F62802944DE7CA5894E5759D351ADAC\ +869580EC17E485F18C0C66F17CC07CBB22FCE466DA610B63AF62BC83B4692F3A\ +FFAF271693AC071FB86D11342D8DEF4F89D4B66335C1C7E4248367D8ED9612EC\ +453902D8E50AF89D7709D1A596C1F41F95AA82CA6C49AE90CD1668BAAC7AA6F2\ +B4A8CA99B2C2372ACB08CF61C9C3805E6E0328DA4CD76A19EDD2D3994C798B00\ +22569AD418D1FEE4D9CD45A391C601FFC92AD91501432FEE150287617C13629E\ +69FC7281CD7165A63EAB49CF714BCE3A75A74F76EA7E64FF81EB61FDFEC39B67\ +BF0DE98C7E4E32BDF97C8C6AC75BA43C02F4B2ED7216ECF3014DF000108B67CF\ +99505B179F8ED4980A6103D1BCA70DBE9BBFAB0ED59801D6E5F2D6F67D3EC516\ +8E212E2DAF02C6B963C98A1F7097DE0C56891A2B211B01070DD8FD8B16C2A1A4\ +E3CFD292D2984B3561D555D16C33DDC2BCF7EDDE13EFE520C7E2ABDDA44D8188\ +1C531AEEEB66244C3B791EA8ACFB6A68F3584606472B260E0DD2EBB21F6C3A3B\ +C0542AABBA4EF8F6C7169E731108DB0460220AA74D31B55B03A00D220D475DCD\ +9B877856D5704C9C86EA0F98F2EB9C530DA7FA5AD8B0B5DB50C2FD5D095A2AA5\ +E2A3FBB71347549A316332234ECE765B7571B64D216B28712E25CF3780F9DC62\ +9CD719B01E6D4A4FD17C731F4AE97BC05A310D7B9C36EDCA5BBC02DBB5DE3D52\ +B65702D4C44C2495C897B5128030D2DB61E056FD1643C871FFCA4DB5A88A075E\ +E10933A655573B1DEEF02F6E20024981E2A07FF8E34769E311B698B9419F1822\ +A84BC8FDA2041A90F449FE154B48962DE81525CB5C8FAE6D45462786E53FA98D\ +8A718A2C75A4BC6AEEBA7F39021567EA2B8CB6871B64F561AB1CE7905B901EE5:\ +9C142A22EDF81444F47272B80A037C169E304393537CECE8003BD80F7B054406\ +3B4A141F9A99D3C6820BAD98BECD914804F389EB2A50E1E2CF22161FC78B9366\ +0E07E2686E70AC0715299C4796F3559FDA802E61CB4ABBF42BAE516BD09FA410\ +085A0A92C6F32A3797D19808D3B3D049B605852E970E5A1B8031D3DC34B5A273\ +F54ED35E21D780204F4B3C512596237153BE9FAF74A44E9A9DCBE96D628AA58B\ +1E3363A94DF540230B38A1ACA440432640E5387D92F1CC1A16F8628A4CB6229F\ +513AB926300668CF97B27643C9C9D0C3030D0CDFBBCB69C3DB199E5D392A97A5\ +1DE6C9881AE5612A69FA0EA026F2F254B929201AFB3AFC8D977C3ED6E12F0118\ +92037D0F49B0144E07A0F0556F0BAC9B3F829C233265439AF711E0B5DD6EC813\ +FD51281E8AA6F031B096C64EE8F03E041FE4DC6B5441141F2D4A308CE8EA77C6\ +483E3CF565EC49CF27A0B13F28D3C63AD7FB6B3A96579D30C9D65F7BA86E56DA\ +6D14AF3C7D170CB5BF5F21C70C1771354DA2850CFF8D9250273828C1FE60C4AC\ +086049404E3D63E04935F03B057B4783B13CF49757A8B5ABB3D2E37E54B881D2\ +36F7DF7FE80E4AE33E9125F54AA96D96BFB15607F0800B215CBF9BB0F7E29080\ +D8504E9BC1F78256593B9565E5AA5FA22032A47041B453D1B154A8D24CD59CF9\ +AA6A8E55363F3DF2B6307ABA5134D67B0DF0AE4FE77F23BF7DF8504FE9DC7F32\ +A8562E2DF585E639847DD624E55B0D0DCCDA72D0F1E072D82D4BC135DC5F7F91\ +30956D401FAB1456527FE087A436C1511CDFEA58202D200E1817E360E8400AAE\ +83B073A63596B033D7E83C6CAB7FDD7069C3B1718EAF60B937CD2458255E68FC\ +D9514FD14AA6E27EC76E75F95F0A678A0F64D49C1B9B8F8DA56DDB8CE640FF6E\ +7195F4A679165F9996F3DDF992E3CB4ED9E9084AFC0038E4BEFB467CC8170AF8\ +F004082BBCB137BBD45C124BE8CEDC89DD565A24830889CE4B9781FC18803BDA\ +1A0A4EB70DA35887B02F18CFF9329E2B7C31B0F5F0648E0508379B52C8FF91CE\ +F939A040A8C20F2F27ED65553680729A2181B3B3C4AA02BFF8DF0A9228A87BBF\ +52B48F473D0F9070C76E4DB6F09FFDFEB629BD0E1944B7016AF34187E2985AEA\ +E30D6480A58F649A0C858E1F1458388A9E822A306AC1AA7465882DE78F242EF7\ +B0CB45D68A057F00D8609587922C8FAD6F1A7FFA34BF2175FC516730A61CF82C\ +6F866C978CC292BCC1F91E6AF1785FCDAA9A43A01E6AEE91E222F8AF8C989F2A\ +4C50B7A1D45BC15E11E5E6E6EF720506B8DF564648BEBFE272C0A77D41295865\ +108150CDB3620970A37DB94F1CC35E434DC33434D99871F6141EB57C9E648AD1\ +BF70E2B7FCEB81EA871DD92F19C366EA532CA4A7BEF9242128B7ADDD308B58FF\ +F5594CB4156A03C6A6ED3F27E8DB20FB2F4208422B7E9E0A4E63A0122560CFBC:\ +67C6697351FF4AEC29CDBAABF2FBE346 + # Randomly generated by OpenSSL A1F4C5FC0AF894FB:1F88AD254A1653CB:69E2F555209FCA21ED36E0243F043537 55E31A38B2C91116:8D57CB7AFB401E55:BC0ED7C4A90FE4760B3D971F0F2589F6 |