diff options
Diffstat (limited to 'src/fuzzer/pow_mod.cpp')
-rw-r--r-- | src/fuzzer/pow_mod.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/fuzzer/pow_mod.cpp b/src/fuzzer/pow_mod.cpp new file mode 100644 index 000000000..2244c2004 --- /dev/null +++ b/src/fuzzer/pow_mod.cpp @@ -0,0 +1,70 @@ +/* +* (C) 2016 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include "fuzzers.h" +#include <botan/numthry.h> +#include <botan/reducer.h> +#include <botan/pow_mod.h> + +namespace { + +Botan::BigInt simple_power_mod(Botan::BigInt x, + Botan::BigInt n, + const Botan::BigInt& p, + const Botan::Modular_Reducer& mod_p) + { + if(n == 0) + { + if(p == 1) + return 0; + return 1; + } + + Botan::BigInt y = 1; + + while(n > 1) + { + if(n.is_odd()) + { + y = mod_p.multiply(x, y); + } + x = mod_p.square(x); + n >>= 1; + } + return mod_p.multiply(x, y); + } + +} + +void fuzz(const uint8_t in[], size_t len) + { + static const size_t p_bits = 1024; + static const Botan::BigInt p = random_prime(fuzzer_rng(), p_bits); + static Botan::Modular_Reducer mod_p(p); + + if(len == 0 || len > p_bits/8) + return; + + try + { + const Botan::BigInt g = Botan::BigInt::decode(in, len / 2); + const Botan::BigInt x = Botan::BigInt::decode(in + len / 2, len / 2); + + const Botan::BigInt ref = simple_power_mod(g, x, p, mod_p); + const Botan::BigInt z = Botan::power_mod(g, x, p); + + if(ref != z) + { + std::cout << "G = " << g << "\n" + << "X = " << x << "\n" + << "P = " << p << "\n" + << "Z = " << z << "\n" + << "R = " << ref << "\n"; + abort(); + } + } + catch(Botan::Exception& e) {} + } |