5 #ifndef CRYPTOPP_IMPORTS
10 NAMESPACE_BEGIN(CryptoPP)
14 m_base = group.NeedConversions() ? group.ConvertIn(i_base) : i_base;
16 if (m_bases.empty() || !(m_base == m_bases[0]))
22 if (group.NeedConversions())
28 assert(m_bases.size() > 0);
29 assert(storage <= maxExpBits);
33 m_windowSize = (maxExpBits+storage-1)/storage;
37 m_bases.resize(storage);
38 for (
unsigned i=1; i<storage; i++)
39 m_bases[i] = group.GetGroup().ScalarMultiply(m_bases[i-1], m_exponentBase);
46 BERDecodeUnsigned<word32>(seq, version, INTEGER, 1, 1);
47 m_exponentBase.BERDecode(seq);
48 m_windowSize = m_exponentBase.BitCount() - 1;
50 while (!seq.EndReached())
51 m_bases.push_back(group.BERDecodeElement(seq));
52 if (!m_bases.empty() && group.NeedConversions())
53 m_base = group.ConvertOut(m_bases[0]);
60 DEREncodeUnsigned<word32>(seq, 1);
61 m_exponentBase.DEREncode(seq);
62 for (
unsigned i=0; i<m_bases.size(); i++)
63 group.DEREncodeElement(seq, m_bases[i]);
72 bool fastNegate = group.InversionIsFast() && m_windowSize > 1;
75 for (i=0; i+1<m_bases.size(); i++)
79 if (fastNegate && r.
GetBit(m_windowSize-1))
92 std::vector<BaseAndExponent<Element> > eb;
93 eb.reserve(m_bases.size());
94 PrepareCascade(group, eb, exponent);
95 return group.ConvertOut(GeneralCascadeMultiplication<Element>(group.GetGroup(), eb.begin(), eb.end()));
102 std::vector<BaseAndExponent<Element> > eb;
104 eb.reserve(m_bases.size() + pc2.m_bases.size());
105 PrepareCascade(group, eb, exponent);
106 pc2.PrepareCascade(group, eb, exponent2);
107 return group.ConvertOut(GeneralCascadeMultiplication<Element>(group.GetGroup(), eb.begin(), eb.end()));
bool GetBit(size_t i) const
return the i-th bit, i=0 being the least significant bit
static void DivideByPowerOf2(Integer &r, Integer &q, const Integer &a, unsigned int n)
returns same result as Divide(r, q, a, Power2(n)), but faster
static Integer Power2(size_t e)
return the integer 2**e
multiple precision integer and basic arithmetics