diff options
author | lloyd <[email protected]> | 2008-09-18 13:49:25 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2008-09-18 13:49:25 +0000 |
commit | 6fc935389225f2200182f666e3fca7daf3622010 (patch) | |
tree | 7a5d57bf9967d0e6278df92029f6b4eb8f16d8fb /doc/examples/pqg_gen.cpp | |
parent | 3254202ef893d05889b30a4c01b9a43d585d8bbe (diff) |
Add testers for the NIST CAVS PQGGen and SigGen tests (part of FIPS-140
DSA test suite)
Diffstat (limited to 'doc/examples/pqg_gen.cpp')
-rw-r--r-- | doc/examples/pqg_gen.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/doc/examples/pqg_gen.cpp b/doc/examples/pqg_gen.cpp new file mode 100644 index 000000000..96852a81c --- /dev/null +++ b/doc/examples/pqg_gen.cpp @@ -0,0 +1,105 @@ +#include <iostream> +#include <fstream> +#include <string> +#include <vector> +#include <map> + +#include <botan/botan.h> +#include <botan/look_pk.h> +#include <botan/dsa.h> +#include <botan/numthry.h> +using namespace Botan; + +bool check(std::map<std::string, std::string>); + +int main() + { + try { + LibraryInitializer init("use_engines"); + + std::ifstream in("PQGGen.rsp"); + if(!in) + throw Exception("Can't open response file"); + + std::map<std::string, std::string> inputs; + + while(in.good()) + { + std::string line; + std::getline(in, line); + + if(line == "" || line[0] == '[' || line[0] == '#') + continue; + + std::vector<std::string> 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(inputs); + std::cout << "." << std::flush; + if(result == false) + { + std::cout << " Check failed\n"; + + std::map<std::string, std::string>::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(std::map<std::string, std::string> 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<byte> seed = pipe.read_all(); + + BigInt our_p, our_q; + + bool found = generate_dsa_primes(our_p, our_q, seed, seed.size(), + p.bits(), 0); + + 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; + } |