12 #ifndef CRYPTOPP_IMPORTS 15 # define CRYPTOPP_RW_USE_OMP 1 17 # define CRYPTOPP_RW_USE_OMP 0 45 const word r3a = (16 + 5 - r) % 16;
46 const word r3b = (16 + 13 - r) % 16;
47 const word r4 = (8 + 5 - r/2) % 8;
75 CRYPTOPP_UNUSED(rng), CRYPTOPP_UNUSED(level);
84 return GetValueHelper(
this, name, valueType, pValue).Assignable()
85 CRYPTOPP_GET_FUNCTION_ENTRY(
Modulus)
91 AssignFromHelper(
this, source)
92 CRYPTOPP_SET_FUNCTION_ENTRY(
Modulus)
102 int modulusSize = 2048;
105 if (modulusSize < 16)
106 throw InvalidArgument(
"InvertibleRWFunction: specified modulus length is too small");
120 m_n = n; m_p = p; m_q = q; m_u = u;
125 void InvertibleRWFunction::PrecomputeTweakedRoots()
const 129 #pragma omp parallel sections if(CRYPTOPP_RW_USE_OMP) 132 m_pre_2_9p = modp.Exponentiate(2, (9 * m_p - 11)/8);
134 m_pre_2_3q = modq.Exponentiate(2, (3 * m_q - 5)/8);
136 m_pre_q_p = modp.Exponentiate(m_q, m_p - 2);
174 m_precompute =
false;
209 re = modn.Multiply(re, x);
211 const Integer &h = re, &p = m_p, &q = m_q;
220 const Integer eh = e*h, V = modp.Exponentiate(eh, (p-3)/8);
221 if(((modp.Multiply(modp.Exponentiate(V, 4), modp.Exponentiate(eh, 2)) - eh) % p).IsZero())
227 #pragma omp parallel sections if(CRYPTOPP_RW_USE_OMP) 231 W = (f.IsUnit() ? U : modq.
Multiply(m_pre_2_3q, U));
235 const Integer t = modp.Multiply(modp.Exponentiate(V, 3), eh);
236 X = (f.IsUnit() ? t : modp.Multiply(m_pre_2_9p, t));
239 const Integer Y = W + q * modp.Multiply(m_pre_q_p, (X - W));
242 Integer s = modn.Multiply(modn.Square(Y), rInv);
257 pass = pass && m_p >
Integer::One() && m_p%8 == 3 && m_p < m_n;
259 pass = pass && m_q >
Integer::One() && m_q%8 == 7 && m_q < m_n;
265 pass = pass && m_p * m_q == m_n;
267 pass = pass && m_u * m_q % m_p == 1;
280 return GetValueHelper<RWFunction>(
this, name, valueType, pValue).Assignable()
281 CRYPTOPP_GET_FUNCTION_ENTRY(
Prime1)
282 CRYPTOPP_GET_FUNCTION_ENTRY(
Prime2)
289 AssignFromHelper<RWFunction>(
this, source)
290 CRYPTOPP_SET_FUNCTION_ENTRY(
Prime1)
291 CRYPTOPP_SET_FUNCTION_ENTRY(
Prime2)
295 m_precompute =
false;
Base class for all exceptions thrown by the library.
const char * MultiplicativeInverseOfPrime2ModPrime1()
Integer.
An invalid argument was detected.
Integer MultiplicativeInverse() const
Calculate multiplicative inverse.
Integer CalculateInverse(RandomNumberGenerator &rng, const Integer &x) const
Calculates the inverse of an element.
const char * Prime2()
Integer.
bool Validate(RandomNumberGenerator &rng, unsigned int level) const
Check this object for errors.
void DEREncode(BufferedTransformation &bt) const
Encode in DER format.
Some other error occurred not belonging to other categories.
void Initialize(const Integer &n, const Integer &p, const Integer &q, const Integer &u)
Initialize a Rabin-Williams private key.
Ring of congruence classes modulo n.
Interface for random number generators.
void Randomize(RandomNumberGenerator &rng, size_t bitCount)
Set this Integer to random integer.
Combines two sets of NameValuePairs.
Integer InverseMod(const Integer &n) const
Calculate multiplicative inverse.
void GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs ¶ms=g_nullNameValuePairs)
Generate a random number.
Integer ApplyFunction(const Integer &x) const
Applies the trapdoor.
bool IsPositive() const
Determines if the Integer is positive.
static const Integer & One()
Integer representing 1.
void GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg)
bool Validate(RandomNumberGenerator &rng, unsigned int level) const
Check this object for errors.
const char * Prime1()
Integer.
void DoQuickSanityCheck() const
Perform a quick sanity check.
Classes for Rabin-Williams signature scheme.
bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const
Get a named value.
bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const
Get a named value.
const Integer & Multiply(const Integer &a, const Integer &b) const
Multiplies elements in the ring.
AlgorithmParameters MakeParameters(const char *name, const T &value, bool throwIfNotUsed=true)
Create an object that implements NameValuePairs.
bool IsZero() const
Determines if the Integer is 0.
bool VerifyPrime(RandomNumberGenerator &rng, const Integer &p, unsigned int level=1)
Verifies a number is probably prime.
void Negate()
Reverse the Sign of the Integer.
void AssignFrom(const NameValuePairs &source)
Assign values to this object.
Multiple precision integer with arithmetic operations.
virtual Element Exponentiate(const Element &a, const Integer &e) const
Raises a base to an exponent in the group.
const T & STDMIN(const T &a, const T &b)
Replacement function for std::min.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
virtual void LoadPrecomputation(BufferedTransformation &storedPrecomputation)
Retrieve previously saved precomputation.
Classes and functions for working with ANS.1 objects.
Classes and functions for number theoretic operations.
Integer Squared() const
Multiply this integer by itself.
An object that implements NameValuePairs.
const char * Modulus()
Integer.
virtual void SavePrecomputation(BufferedTransformation &storedPrecomputation) const
Save precomputation for later use.
Multiple precision integer with arithmetic operations.
static const Integer & Zero()
Integer representing 0.
void AssignFrom(const NameValuePairs &source)
Assign values to this object.
void BERDecode(const byte *input, size_t inputLen)
Decode from BER format.
Class file for performing modular arithmetic.
Crypto++ library namespace.
virtual void Precompute(unsigned int unused=0)
Perform precomputation.
bool GetIntValue(const char *name, int &value) const
Get a named value with type int.
Interface for retrieving values given their names.