14 #if defined(CRYPTOPP_DEBUG) && !defined(CRYPTOPP_DOXYGEN_PROCESSING) && !defined(CRYPTOPP_IS_DLL) 18 void RSA_TestInstantiations()
45 #ifndef CRYPTOPP_IMPORTS 51 return ASN1::rsaEncryption();
73 return a_exp_b_mod_c(x, m_e, m_n);
78 CRYPTOPP_UNUSED(rng), CRYPTOPP_UNUSED(level);
90 return GetValueHelper(
this, name, valueType, pValue).Assignable()
91 CRYPTOPP_GET_FUNCTION_ENTRY(
Modulus)
98 AssignFromHelper(
this, source)
99 CRYPTOPP_SET_FUNCTION_ENTRY(
Modulus)
109 RSAPrimeSelector(
const Integer &e) : m_e(e) {}
116 int modulusSize = 2048;
120 if (modulusSize < 16)
121 throw InvalidArgument(
"InvertibleRSAFunction: specified modulus size is too small");
126 if (m_e < 3 || m_e.IsEven())
127 throw InvalidArgument(
"InvertibleRSAFunction: invalid public exponent");
133 RSAPrimeSelector selector(m_e);
142 m_dp = m_d % (m_p-1);
143 m_dq = m_d % (m_q-1);
152 SignaturePairwiseConsistencyTest_FIPS_140_Only(signer, verifier);
156 EncryptionPairwiseConsistencyTest_FIPS_140_Only(encryptor, decryptor);
168 throw InvalidArgument(
"InvertibleRSAFunction: input is not a valid RSA private key");
185 Integer a = modn.Exponentiate(i, r);
197 m_dp = m_d % (m_p-1);
198 m_dq = m_d % (m_q-1);
203 throw InvalidArgument(
"InvertibleRSAFunction: input is not a valid RSA private key");
213 BERDecodeUnsigned<word32>(privateKey, version,
INTEGER, 0, 0);
214 m_n.BERDecode(privateKey);
215 m_e.BERDecode(privateKey);
218 m_q.BERDecode(privateKey);
219 m_dp.BERDecode(privateKey);
222 privateKey.MessageEnd();
228 DEREncodeUnsigned<word32>(privateKey, 0);
229 m_n.DEREncode(privateKey);
230 m_e.DEREncode(privateKey);
233 m_q.DEREncode(privateKey);
234 m_dp.DEREncode(privateKey);
237 privateKey.MessageEnd();
249 Integer re = modn.Exponentiate(r, m_e);
250 re = modn.Multiply(re, x);
254 y = modn.Multiply(y, rInv);
255 if (modn.Exponentiate(y, m_e) != x)
278 pass = pass && m_p * m_q == m_n;
280 pass = pass && m_e*m_d %
LCM(m_p-1, m_q-1) == 1;
282 pass = pass && m_dp == m_d%(m_p-1) && m_dq == m_d%(m_q-1);
284 pass = pass && m_u * m_q % m_p == 1;
297 return GetValueHelper<RSAFunction>(
this, name, valueType, pValue).Assignable()
298 CRYPTOPP_GET_FUNCTION_ENTRY(
Prime1)
299 CRYPTOPP_GET_FUNCTION_ENTRY(
Prime2)
309 AssignFromHelper<RSAFunction>(
this, source)
310 CRYPTOPP_SET_FUNCTION_ENTRY(
Prime1)
311 CRYPTOPP_SET_FUNCTION_ENTRY(
Prime2)
324 return t % 16 == 12 ? t : m_n - t;
Base class for all exceptions thrown by the library.
const char * MultiplicativeInverseOfPrime2ModPrime1()
Integer.
An invalid argument was detected.
Integer MultiplicativeInverse() const
Calculate multiplicative inverse.
Classes for working with NameValuePairs.
static const Integer & One()
Integer representing 1.
const char * Prime2()
Integer.
T GetValueWithDefault(const char *name, T defaultValue) const
Get a named value.
void DEREncode(BufferedTransformation &bt) const
Encode in DER format.
unsigned int word32
32-bit unsigned datatype
CRYPTOPP_DLL Integer ModularRoot(const Integer &a, const Integer &dp, const Integer &dq, const Integer &p, const Integer &q, const Integer &u)
Extract a modular root.
void BERDecodePrivateKey(BufferedTransformation &bt, bool parametersPresent, size_t size)
Decode privateKey part of privateKeyInfo.
void GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg)
Generate a random key or crypto parameters.
bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const
Get a named value.
Some other error occurred not belonging to other categories.
ASN.1 object identifiers for algorithms and schemes.
OID GetAlgorithmID() const
Retrieves the OID of the algorithm.
Ring of congruence classes modulo n.
Interface for random number generators.
void Randomize(RandomNumberGenerator &rng, size_t bitCount)
Set this Integer to random integer.
Integer InverseMod(const Integer &n) const
Calculate multiplicative inverse.
bool Validate(RandomNumberGenerator &rng, unsigned int level) const
Check this object for errors.
void GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs ¶ms=g_nullNameValuePairs)
Generate a random number.
bool IsPositive() const
Determines if the Integer is positive.
CRYPTOPP_DLL bool VerifyPrime(RandomNumberGenerator &rng, const Integer &p, unsigned int level=1)
Verifies a number is probably prime.
void BERDecodePublicKey(BufferedTransformation &bt, bool parametersPresent, size_t size)
Decode subjectPublicKey part of subjectPublicKeyInfo.
const char * PrivateExponent()
Integer.
Integer ApplyFunction(const Integer &x) const
Applies the trapdoor.
bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const
Get a named value.
const char * Prime1()
Integer.
void DoQuickSanityCheck() const
Perform a quick sanity check.
Integer GCD(const Integer &a, const Integer &b)
Calculate the greatest common divisor.
Classes for PKCS padding schemes.
CRYPTOPP_DLL RandomNumberGenerator & NullRNG()
Random Number Generator that does not produce random numbers.
void Initialize(RandomNumberGenerator &rng, unsigned int modulusBits, const Integer &e=17)
Create a RSA private key.
AlgorithmParameters MakeParameters(const char *name, const T &value, bool throwIfNotUsed=true)
Create an object that implements NameValuePairs.
const char * PublicExponent()
Integer.
bool IsZero() const
Determines if the Integer is 0.
void AssignFrom(const NameValuePairs &source)
Assign values to this object.
const char * ModPrime1PrivateExponent()
Integer.
Classes for SHA3 message digests.
Application callback to signal suitability of a cabdidate prime.
Multiple precision integer with arithmetic operations.
const char * ModPrime2PrivateExponent()
Integer.
Integer LCM(const Integer &a, const Integer &b)
Calculate the least common multiple.
void AssignFrom(const NameValuePairs &source)
Assign values to this object.
Integer CalculateInverse(RandomNumberGenerator &rng, const Integer &x) const
Calculates the inverse of an element.
bool IsEven() const
Determines if the Integer is even parity.
const T & STDMIN(const T &a, const T &b)
Replacement function for std::min.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
Classes and functions for working with ANS.1 objects.
Classes for SHA-1 and SHA-2 family of message digests.
CRYPTOPP_DLL bool GetIntValue(const char *name, int &value) const
Get a named value with type int.
const char * PointerToPrimeSelector()
const PrimeSelector *
CRYPTOPP_DLL bool FIPS_140_2_ComplianceEnabled()
Determines whether the library provides FIPS validated cryptography.
Classes and functions for number theoretic operations.
const char * KeySize()
int, in bits
Classes for the RSA cryptosystem.
bool Validate(RandomNumberGenerator &rng, unsigned int level) const
Check this object for errors.
Classes and functions for the FIPS 140-2 validated library.
Integer CalculateInverse(RandomNumberGenerator &rng, const Integer &x) const
Calculates the inverse of an element.
bool RelativelyPrime(const Integer &a, const Integer &b)
Determine relative primality.
An object that implements NameValuePairs.
const char * Modulus()
Integer.
RSA encryption algorithm.
Integer ApplyFunction(const Integer &x) const
Applies the trapdoor.
void BERDecode(const byte *input, size_t inputLen)
Decode from BER format.
Class file for performing modular arithmetic.
Crypto++ library namespace.
const char * ModulusSize()
int, in bits
void DEREncodePublicKey(BufferedTransformation &bt) const
Encode subjectPublicKey part of subjectPublicKeyInfo.
Classes for probabilistic signature schemes.
void DEREncodePrivateKey(BufferedTransformation &bt) const
Encode privateKey part of privateKeyInfo.
bool IsOdd() const
Determines if the Integer is odd parity.
Interface for retrieving values given their names.
Template implementing constructors for public key algorithm classes.
RSA trapdoor function using the private key.