Crypto++
5.6.5
Free C++ class library of cryptographic schemes
|
12 #ifndef CRYPTOPP_IMPORTS
15 static const bool CRYPTOPP_RW_USE_OMP =
true;
17 static const bool CRYPTOPP_RW_USE_OMP =
false;
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);
83 return GetValueHelper(
this, name, valueType, pValue).Assignable()
84 CRYPTOPP_GET_FUNCTION_ENTRY(Modulus)
90 AssignFromHelper(
this, source)
91 CRYPTOPP_SET_FUNCTION_ENTRY(Modulus)
101 int modulusSize = 2048;
104 if (modulusSize < 16)
105 throw InvalidArgument(
"InvertibleRWFunction: specified modulus length is too small");
119 m_n = n; m_p = p; m_q = q; m_u = u;
124 void InvertibleRWFunction::PrecomputeTweakedRoots()
const
128 #pragma omp parallel sections if(CRYPTOPP_RW_USE_OMP)
131 m_pre_2_9p = modp.Exponentiate(2, (9 * m_p - 11)/8);
133 m_pre_2_3q = modq.Exponentiate(2, (3 * m_q - 5)/8);
135 m_pre_q_p = modp.Exponentiate(m_q, m_p - 2);
173 m_precompute =
false;
208 re = modn.Multiply(re, x);
210 const Integer &h = re, &p = m_p, &q = m_q;
219 const Integer eh = e*h, V = modp.Exponentiate(eh, (p-3)/8);
220 if(((modp.Multiply(modp.Exponentiate(V, 4), modp.Exponentiate(eh, 2)) - eh) % p).IsZero())
226 #pragma omp parallel sections if(CRYPTOPP_RW_USE_OMP)
230 W = (f.IsUnit() ? U : modq.
Multiply(m_pre_2_3q, U));
234 const Integer t = modp.Multiply(modp.Exponentiate(V, 3), eh);
235 X = (f.IsUnit() ? t : modp.Multiply(m_pre_2_9p, t));
238 const Integer Y = W + q * modp.Multiply(m_pre_q_p, (X - W));
241 Integer s = modn.Multiply(modn.Square(Y), rInv);
255 pass = pass && m_p >
Integer::One() && m_p%8 == 3 && m_p < m_n;
256 pass = pass && m_q >
Integer::One() && m_q%8 == 7 && m_q < m_n;
260 pass = pass && m_p * m_q == m_n;
261 pass = pass && m_u * m_q % m_p == 1;
270 return GetValueHelper<RWFunction>(
this, name, valueType, pValue).Assignable()
271 CRYPTOPP_GET_FUNCTION_ENTRY(Prime1)
272 CRYPTOPP_GET_FUNCTION_ENTRY(Prime2)
273 CRYPTOPP_GET_FUNCTION_ENTRY(MultiplicativeInverseOfPrime2ModPrime1)
279 AssignFromHelper<RWFunction>(
this, source)
280 CRYPTOPP_SET_FUNCTION_ENTRY(Prime1)
281 CRYPTOPP_SET_FUNCTION_ENTRY(Prime2)
282 CRYPTOPP_SET_FUNCTION_ENTRY(MultiplicativeInverseOfPrime2ModPrime1)
285 m_precompute =
false;
An object that implements NameValuePairs.
Integer InverseMod(const Integer &n) const
calculate multiplicative inverse of *this mod n
AlgorithmParameters MakeParameters(const char *name, const T &value, bool throwIfNotUsed=true)
Create an object that implements NameValuePairs.
void GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg)
Classes and functions for number theoretic operations.
void DEREncode(BufferedTransformation &bt) const
Encode in DER format.
virtual void LoadPrecomputation(BufferedTransformation &storedPrecomputation)
Retrieve previously saved precomputation.
bool Validate(RandomNumberGenerator &rng, unsigned int level) const
Check this object for errors.
bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const
Get a named value.
static const Integer & One()
Integer representing 1.
Integer ApplyFunction(const Integer &x) const
Applies the trapdoor.
Ring of congruence classes modulo n.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
void AssignFrom(const NameValuePairs &source)
Assign values to this object.
bool IsZero() const
Determines if the Integer is 0.
Class file for performing modular arithmetic.
const Integer & Multiply(const Integer &a, const Integer &b) const
Multiplies elements in the ring.
void DoQuickSanityCheck() const
Perform a quick sanity check.
bool Validate(RandomNumberGenerator &rng, unsigned int level) const
Check this object for errors.
virtual void Precompute(unsigned int unused=0)
Perform precomputation.
Interface for random number generators.
Base class for all exceptions thrown by the library.
const T & STDMIN(const T &a, const T &b)
Replacement function for std::min.
bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const
Get a named value.
bool VerifyPrime(RandomNumberGenerator &rng, const Integer &p, unsigned int level=1)
Verifies a prime number.
Classes and functions for working with ANS.1 objects.
virtual void SavePrecomputation(BufferedTransformation &storedPrecomputation) const
Save precomputation for later use.
void Randomize(RandomNumberGenerator &rng, size_t bitCount)
Set this Integer to random integer.
void BERDecode(const byte *input, size_t inputLen)
Decode from BER format.
bool IsPositive() const
Determines if the Integer is positive.
An invalid argument was detected.
Integer MultiplicativeInverse() const
return inverse if 1 or -1, otherwise return 0
static const Integer & Zero()
Integer representing 0.
Crypto++ library namespace.
Combines two sets of NameValuePairs.
bool GetIntValue(const char *name, int &value) const
Get a named value with type int.
Classes for Rabin-Williams signature scheme.
virtual Element Exponentiate(const Element &a, const Integer &e) const
Raises a base to an exponent in the group.
@ OTHER_ERROR
Some other error occurred not belonging to other categories.
void Negate()
Reverse the Sign of the Integer.
void AssignFrom(const NameValuePairs &source)
Assign values to this object.
Interface for retrieving values given their names.
Integer CalculateInverse(RandomNumberGenerator &rng, const Integer &x) const
Calculates the inverse of an element.
Multiple precision integer with arithmetic operations.
Multiple precision integer with arithmetic operations.