diff options
author | lloyd <[email protected]> | 2008-09-08 16:29:57 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2008-09-08 16:29:57 +0000 |
commit | 32fafc2612c3edfd386c2dd282b992162d5df306 (patch) | |
tree | 8a029d7f3e8a8faae8a7b1d8cead7693ac2930c7 /checks/check.cpp | |
parent | 39e5a94b4407494a95fa74bbd4c9c1b88a09bece (diff) |
Last checkin would crash, because the destructor for the rng would not
run until after the block ended, which was after set_global_state(0)
had run, causing crashes in the destructors that attempted to free memory.
Restructure the argument handling, it is significantly easier to understand
now. Only create the rng where it is needed.
Diffstat (limited to 'checks/check.cpp')
-rw-r--r-- | checks/check.cpp | 115 |
1 files changed, 55 insertions, 60 deletions
diff --git a/checks/check.cpp b/checks/check.cpp index c9550ee08..0449776f9 100644 --- a/checks/check.cpp +++ b/checks/check.cpp @@ -28,7 +28,7 @@ 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 validate(RandomNumberGenerator& rng); +int run_test_suite(); namespace { @@ -78,7 +78,7 @@ void test_types() bool passed = true; passed = passed && test<Botan::byte >("byte", 8, false); - passed = passed && test<Botan::u16bit>("u16bit", 18, false); + passed = passed && test<Botan::u16bit>("u16bit", 16, false); passed = passed && test<Botan::u32bit>("u32bit", 32, false); passed = passed && test<Botan::u64bit>("u64bit", 64, false); passed = passed && test<Botan::s32bit>("s32bit", 31, true); @@ -102,16 +102,14 @@ int main(int argc, char* argv[]) Botan::InitializerOptions init_options(opts.value_if_set("init")); //Botan::LibraryInitializer init(init_options); - - std::auto_ptr<RandomNumberGenerator> rng( - RandomNumberGenerator::make_rng()); + //Botan::LibraryInitializer::initialize(init_options); if(opts.is_set("help") || argc <= 1) { std::cerr << "Test driver for " << Botan::version_string() << "\n" << "Options:\n" - << " --validate: Check test vectors\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" @@ -119,31 +117,32 @@ int main(int argc, char* argv[]) << " --seconds=n: Benchmark for n seconds\n" << " --init=<str>: Pass <str> to the library\n" << " --help: Print this message\n"; - return 1; } - - if(opts.is_set("validate")) - return validate(*rng); - - double seconds = 1.5; - - if(opts.is_set("seconds")) + else if(opts.is_set("validate") || opts.is_set("test")) { - seconds = std::atof(opts.value("seconds").c_str()); - if(seconds && (seconds < 0.1 || seconds > (5 * 60))) - { - std::cout << "Invalid argument to --seconds\n"; - return 2; - } + run_test_suite(); } + if(opts.is_set("bench-algo") || opts.is_set("benchmark")) + { + double seconds = 1.5; - const bool html = opts.is_set("html"); + if(opts.is_set("seconds")) + { + seconds = std::atof(opts.value("seconds").c_str()); + if(seconds && (seconds < 0.1 || seconds > (5 * 60))) + { + std::cout << "Invalid argument to --seconds\n"; + return 2; + } + } - if(opts.is_set("bench-algo")) - { + const bool html = opts.is_set("html"); std::vector<std::string> algs = Botan::split_on(opts.value("bench-algo"), ','); + std::auto_ptr<RandomNumberGenerator> rng( + RandomNumberGenerator::make_rng()); + for(u32bit j = 0; j != algs.size(); j++) { const std::string alg = algs[j]; @@ -151,62 +150,58 @@ int main(int argc, char* argv[]) if(!found) // maybe it's a PK algorithm bench_pk(*rng, alg, html, seconds); } - } - - if(opts.is_set("benchmark")) - benchmark("All", *rng, html, seconds); - else if(opts.is_set("bench-type")) - { - const std::string type = opts.value("bench-type"); - if(type == "all") + if(opts.is_set("benchmark")) 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 == "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 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 == "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); + } } Botan::set_global_state(0); } - catch(Botan::Exception& e) - { - std::cout << "Exception caught:\n " << e.what() << std::endl; - return 1; - } catch(std::exception& e) { - std::cout << "Standard library exception caught:\n " - << e.what() << std::endl; - return 1; + std::cerr << "Exception: " << e.what() << std::endl; } catch(...) { - std::cout << "Unknown exception caught." << std::endl; - return 1; + std::cerr << "Unknown (...) exception caught" << std::endl; } return 0; } -int validate(RandomNumberGenerator& rng) +int run_test_suite() { - std::cout << "Beginning validation tests..." << std::endl; + 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); + try + { + std::auto_ptr<RandomNumberGenerator> rng( + RandomNumberGenerator::make_rng()); + + 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); } catch(Botan::Exception& e) { |