/usr/include/botan-2/botan/pow_mod.h is in libbotan-2-dev 2.4.0-5ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | /*
* Modular Exponentiator
* (C) 1999-2007 Jack Lloyd
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
#ifndef BOTAN_POWER_MOD_H_
#define BOTAN_POWER_MOD_H_
#include <botan/bigint.h>
namespace Botan {
/**
* Modular Exponentiator Interface
*/
class BOTAN_PUBLIC_API(2,0) 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;
Modular_Exponentiator() = default;
Modular_Exponentiator(const Modular_Exponentiator&) = default;
Modular_Exponentiator & operator=(const Modular_Exponentiator&) = default;
virtual ~Modular_Exponentiator() = default;
};
/**
* Modular Exponentiator Proxy
*/
class BOTAN_PUBLIC_API(2,0) 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
};
/*
* Try to choose a good window size
*/
static size_t window_bits(size_t exp_bits, size_t base_bits,
Power_Mod::Usage_Hints hints);
/**
* @param modulus the modulus
* @param hints Passed to set_modulus if modulus > 0
* @param disable_montgomery_arith Disables use of Montgomery
* representation. Likely only useful for testing.
*/
void set_modulus(const BigInt& modulus,
Usage_Hints hints = NO_HINTS,
bool disable_montgomery_arith = false) const;
/**
* Set the base
*/
void set_base(const BigInt& base) const;
/**
* Set the exponent
*/
void set_exponent(const BigInt& exponent) const;
/**
* All three of the above functions must have already been called.
* @return result of g^x%p
*/
BigInt execute() const;
Power_Mod& operator=(const Power_Mod&);
/**
* @param modulus Optionally call set_modulus
* @param hints Passed to set_modulus if modulus > 0
* @param disable_montgomery_arith Disables use of Montgomery
* representation. Likely only useful for testing.
*/
Power_Mod(const BigInt& modulus = 0,
Usage_Hints hints = NO_HINTS,
bool disable_montgomery_arith = false);
Power_Mod(const Power_Mod&);
virtual ~Power_Mod() = default;
private:
mutable std::unique_ptr<Modular_Exponentiator> m_core;
};
/**
* Fixed Exponent Modular Exponentiator Proxy
*/
class BOTAN_PUBLIC_API(2,0) Fixed_Exponent_Power_Mod final : public Power_Mod
{
public:
BigInt operator()(const BigInt& b) const
{ set_base(b); return execute(); }
Fixed_Exponent_Power_Mod() = default;
Fixed_Exponent_Power_Mod(const BigInt& exponent,
const BigInt& modulus,
Usage_Hints hints = NO_HINTS);
};
/**
* Fixed Base Modular Exponentiator Proxy
*/
class BOTAN_PUBLIC_API(2,0) Fixed_Base_Power_Mod final : public Power_Mod
{
public:
BigInt operator()(const BigInt& e) const
{ set_exponent(e); return execute(); }
Fixed_Base_Power_Mod() = default;
Fixed_Base_Power_Mod(const BigInt& base,
const BigInt& modulus,
Usage_Hints hints = NO_HINTS);
};
}
#endif
|