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())
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);
49 m_exponentBase.BERDecode(seq);
50 m_windowSize = m_exponentBase.BitCount() - 1;
52 while (!seq.EndReached())
62 DEREncodeUnsigned<word32>(seq, 1);
63 m_exponentBase.DEREncode(seq);
64 for (
unsigned i=0; i<m_bases.size(); 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);
109 return group.
ConvertOut(GeneralCascadeMultiplication<Element>(group.
GetGroup(), eb.begin(), eb.end()));
Element Exponentiate(const DL_GroupPrecomputation< Element > &group, const Integer &exponent) const
virtual bool NeedConversions() const
bool GetBit(size_t i) const
Provides the i-th bit of the Integer.
void swap(dev::eth::Watch &_a, dev::eth::Watch &_b)
void Precompute(const DL_GroupPrecomputation< Element > &group, unsigned int maxExpBits, unsigned int storage)
Element CascadeExponentiate(const DL_GroupPrecomputation< Element > &group, const Integer &exponent, const DL_FixedBasePrecomputation< Element > &pc2, const Integer &exponent2) const
virtual bool InversionIsFast() const
Determine if inversion is fast.
#define NAMESPACE_BEGIN(x)
static void CRYPTOPP_API DivideByPowerOf2(Integer &r, Integer &q, const Integer &a, unsigned int n)
returns same result as Divide(r, q, a, Power2(n)), but faster
void Save(const DL_GroupPrecomputation< Element > &group, BufferedTransformation &storedPrecomputation) const
Classes for performing mathematics over different fields.
virtual const AbstractGroup< Element > & GetGroup() const =0
void PrepareCascade(const DL_GroupPrecomputation< Element > &group, std::vector< BaseAndExponent< Element > > &eb, const Integer &exponent) const
void Load(const DL_GroupPrecomputation< Element > &group, BufferedTransformation &storedPrecomputation)
std::vector< Element > m_bases
virtual Element BERDecodeElement(BufferedTransformation &bt) const =0
static Integer CRYPTOPP_API Power2(size_t e)
Exponentiates to a power of 2.
Multiple precision integer with arithmetic operations.
virtual const Element & Inverse(const Element &a) const =0
Inverts the element in the group.
#define CRYPTOPP_ASSERT(exp)
Classes and functions for working with ANS.1 objects.
Classes for precomputation in a group.
Multiple precision integer with arithmetic operations.
virtual Element ConvertOut(const Element &v) const
virtual void DEREncodeElement(BufferedTransformation &bt, const Element &P) const =0