void InvertibleRSAFunction::GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg) { int modulusSize = 2048; alg.GetIntValue("ModulusSize", modulusSize) || alg.GetIntValue("KeySize", modulusSize); ASSERT( modulusSize >= 16 ); m_e = alg.GetValueWithDefault("PublicExponent", Integer(17)); ASSERT( m_e >= 3 ); ASSERT( !m_e.IsEven() ); RSAPrimeSelector selector(m_e); const NameValuePairs &primeParam = MakeParametersForTwoPrimesOfEqualSize(modulusSize) ("PointerToPrimeSelector", selector.GetSelectorPointer()); m_p.GenerateRandom(rng, primeParam); m_q.GenerateRandom(rng, primeParam); m_d = EuclideanMultiplicativeInverse(m_e, LCM(m_p-1, m_q-1)); assert(m_d.IsPositive()); m_dp = m_d % (m_p-1); m_dq = m_d % (m_q-1); m_n = m_p * m_q; m_u = m_q.InverseMod(m_p); }
// generate RSA keypair void AsymmCipher::genkeypair(Integer* privk, Integer* pubk, int size) { pubk[PUB_E] = 17; RSAPrimeSelector selector(pubk[PUB_E]); AlgorithmParameters primeParam = MakeParametersForTwoPrimesOfEqualSize(size)(Name::PointerToPrimeSelector(),selector.GetSelectorPointer()); privk[PRIV_P].GenerateRandom(PrnGen::rng,primeParam); privk[PRIV_Q].GenerateRandom(PrnGen::rng,primeParam); privk[PRIV_D] = pubk[PUB_E].InverseMod(LCM(privk[PRIV_P]-Integer::One(),privk[PRIV_Q]-Integer::One())); pubk[PUB_PQ] = privk[PRIV_P]*privk[PRIV_Q]; privk[PRIV_U] = privk[PRIV_P].InverseMod(privk[PRIV_Q]); }
// generate a random private key void InvertibleRWFunction::GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg) { int modulusSize = 2048; alg.GetIntValue("ModulusSize", modulusSize) || alg.GetIntValue("KeySize", modulusSize); if (modulusSize < 16) throw InvalidArgument("InvertibleRWFunction: specified modulus length is too small"); AlgorithmParameters primeParam = MakeParametersForTwoPrimesOfEqualSize(modulusSize); m_p.GenerateRandom(rng, CombinedNameValuePairs(primeParam, MakeParameters("EquivalentTo", 3)("Mod", 8))); m_q.GenerateRandom(rng, CombinedNameValuePairs(primeParam, MakeParameters("EquivalentTo", 7)("Mod", 8))); m_n = m_p * m_q; m_u = m_q.InverseMod(m_p); }
void InvertibleRSAFunction::GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg) { int modulusSize = 2048; alg.GetIntValue(Name::ModulusSize(), modulusSize) || alg.GetIntValue(Name::KeySize(), modulusSize); assert(modulusSize >= 16); if (modulusSize < 16) throw InvalidArgument("InvertibleRSAFunction: specified modulus size is too small"); m_e = alg.GetValueWithDefault(Name::PublicExponent(), Integer(17)); assert(m_e >= 3); assert(!m_e.IsEven()); if (m_e < 3 || m_e.IsEven()) throw InvalidArgument("InvertibleRSAFunction: invalid public exponent"); RSAPrimeSelector selector(m_e); AlgorithmParameters primeParam = MakeParametersForTwoPrimesOfEqualSize(modulusSize) (Name::PointerToPrimeSelector(), selector.GetSelectorPointer()); m_p.GenerateRandom(rng, primeParam); m_q.GenerateRandom(rng, primeParam); m_d = m_e.InverseMod(LCM(m_p-1, m_q-1)); assert(m_d.IsPositive()); m_dp = m_d % (m_p-1); m_dq = m_d % (m_q-1); m_n = m_p * m_q; m_u = m_q.InverseMod(m_p); if (FIPS_140_2_ComplianceEnabled()) { RSASS<PKCS1v15, SHA>::Signer signer(*this); RSASS<PKCS1v15, SHA>::Verifier verifier(signer); SignaturePairwiseConsistencyTest_FIPS_140_Only(signer, verifier); RSAES<OAEP<SHA> >::Decryptor decryptor(*this); RSAES<OAEP<SHA> >::Encryptor encryptor(decryptor); EncryptionPairwiseConsistencyTest_FIPS_140_Only(encryptor, decryptor); } }
// generate a random private key void InvertibleRabinFunction::GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg) { int modulusSize = 2048; alg.GetIntValue("ModulusSize", modulusSize) || alg.GetIntValue("KeySize", modulusSize); if (modulusSize < 16) throw InvalidArgument("InvertibleRabinFunction: specified modulus size is too small"); // VC70 workaround: putting these after primeParam causes overlapped stack allocation bool rFound=false, sFound=false; Integer t=2; const NameValuePairs &primeParam = MakeParametersForTwoPrimesOfEqualSize(modulusSize) ("EquivalentTo", 3)("Mod", 4); m_p.GenerateRandom(rng, primeParam); m_q.GenerateRandom(rng, primeParam); while (!(rFound && sFound)) { int jp = Jacobi(t, m_p); int jq = Jacobi(t, m_q); if (!rFound && jp==1 && jq==-1) { m_r = t; rFound = true; } if (!sFound && jp==-1 && jq==1) { m_s = t; sFound = true; } ++t; } m_n = m_p * m_q; m_u = m_q.InverseMod(m_p); }
void InvertibleLUCFunction::GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg) { int modulusSize = 2048; alg.GetIntValue("ModulusSize", modulusSize) || alg.GetIntValue("KeySize", modulusSize); if (modulusSize < 16) throw InvalidArgument("InvertibleLUCFunction: specified modulus size is too small"); m_e = alg.GetValueWithDefault("PublicExponent", Integer(17)); if (m_e < 5 || m_e.IsEven()) throw InvalidArgument("InvertibleLUCFunction: invalid public exponent"); LUCPrimeSelector selector(m_e); AlgorithmParameters primeParam = MakeParametersForTwoPrimesOfEqualSize(modulusSize) ("PointerToPrimeSelector", selector.GetSelectorPointer()); m_p.GenerateRandom(rng, primeParam); m_q.GenerateRandom(rng, primeParam); m_n = m_p * m_q; m_u = m_q.InverseMod(m_p); }