Crypto++
8.2
Free C++ class library of cryptographic schemes
|
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;
An object that implements NameValuePairs.
Integer InverseMod(const Integer &n) const
Calculate multiplicative inverse.
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.
const char * Modulus()
Integer.
Integer Squared() const
Multiply this integer by itself.
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.
void Initialize(const Integer &n, const Integer &p, const Integer &q, const Integer &u)
Initialize a Rabin-Williams private key.
Integer ApplyFunction(const Integer &x) const
Applies the trapdoor.
Ring of congruence classes modulo n.
const char * Prime2()
Integer.
#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 number is probably prime.
Classes and functions for working with ANS.1 objects.
virtual void SavePrecomputation(BufferedTransformation &storedPrecomputation) const
Save precomputation for later use.
void GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs ¶ms=g_nullNameValuePairs)
Generate a random number.
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.
const char * Prime1()
Integer.
An invalid argument was detected.
Integer MultiplicativeInverse() const
Calculate multiplicative inverse.
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.
const char * MultiplicativeInverseOfPrime2ModPrime1()
Integer.
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.