5 #ifndef CRYPTOPP_IMPORTS
16 m_base = group.NeedConversions() ? group.ConvertIn(i_base) : i_base;
18 if (m_bases.empty() || !(m_base == m_bases[0]))
24 if (group.NeedConversions())
30 assert(m_bases.size() > 0);
31 assert(storage <= maxExpBits);
35 m_windowSize = (maxExpBits+storage-1)/storage;
39 m_bases.resize(storage);
40 for (
unsigned i=1; i<storage; i++)
41 m_bases[i] = group.GetGroup().ScalarMultiply(m_bases[i-1], m_exponentBase);
48 BERDecodeUnsigned<word32>(seq, version, INTEGER, 1, 1);
49 m_exponentBase.BERDecode(seq);
50 m_windowSize = m_exponentBase.BitCount() - 1;
52 while (!seq.EndReached())
53 m_bases.push_back(group.BERDecodeElement(seq));
54 if (!m_bases.empty() && group.NeedConversions())
55 m_base = group.ConvertOut(m_bases[0]);
62 DEREncodeUnsigned<word32>(seq, 1);
63 m_exponentBase.DEREncode(seq);
64 for (
unsigned i=0; i<m_bases.size(); i++)
65 group.DEREncodeElement(seq, m_bases[i]);
77 for (i=0; i+1<m_bases.size(); i++)
81 if (fastNegate && r.
GetBit(m_windowSize-1))
94 std::vector<BaseAndExponent<Element> > eb;
95 eb.reserve(m_bases.size());
96 PrepareCascade(group, eb, exponent);
97 return group.ConvertOut(GeneralCascadeMultiplication<Element>(group.GetGroup(), eb.begin(), eb.end()));
104 std::vector<BaseAndExponent<Element> > eb;
106 eb.reserve(m_bases.size() + pc2.m_bases.size());
107 PrepareCascade(group, eb, exponent);
108 pc2.PrepareCascade(group, eb, exponent2);
109 return group.ConvertOut(GeneralCascadeMultiplication<Element>(group.GetGroup(), eb.begin(), eb.end()));