Crypto++
eprecomp.h
1 #ifndef CRYPTOPP_EPRECOMP_H
2 #define CRYPTOPP_EPRECOMP_H
3 
4 #include "integer.h"
5 #include "algebra.h"
6 #include <vector>
7 
8 NAMESPACE_BEGIN(CryptoPP)
9 
10 template <class T>
12 {
13 public:
14  typedef T Element;
15 
16  virtual bool NeedConversions() const {return false;}
17  virtual Element ConvertIn(const Element &v) const {return v;}
18  virtual Element ConvertOut(const Element &v) const {return v;}
19  virtual const AbstractGroup<Element> & GetGroup() const =0;
20  virtual Element BERDecodeElement(BufferedTransformation &bt) const =0;
21  virtual void DEREncodeElement(BufferedTransformation &bt, const Element &P) const =0;
22 };
23 
24 template <class T>
26 {
27 public:
28  typedef T Element;
29 
30  virtual bool IsInitialized() const =0;
31  virtual void SetBase(const DL_GroupPrecomputation<Element> &group, const Element &base) =0;
32  virtual const Element & GetBase(const DL_GroupPrecomputation<Element> &group) const =0;
33  virtual void Precompute(const DL_GroupPrecomputation<Element> &group, unsigned int maxExpBits, unsigned int storage) =0;
34  virtual void Load(const DL_GroupPrecomputation<Element> &group, BufferedTransformation &storedPrecomputation) =0;
35  virtual void Save(const DL_GroupPrecomputation<Element> &group, BufferedTransformation &storedPrecomputation) const =0;
36  virtual Element Exponentiate(const DL_GroupPrecomputation<Element> &group, const Integer &exponent) const =0;
37  virtual Element CascadeExponentiate(const DL_GroupPrecomputation<Element> &group, const Integer &exponent, const DL_FixedBasePrecomputation<Element> &pc2, const Integer &exponent2) const =0;
38 };
39 
40 template <class T>
42 {
43 public:
44  typedef T Element;
45 
46  DL_FixedBasePrecomputationImpl() : m_windowSize(0) {}
47 
48  // DL_FixedBasePrecomputation
49  bool IsInitialized() const
50  {return !m_bases.empty();}
51  void SetBase(const DL_GroupPrecomputation<Element> &group, const Element &base);
52  const Element & GetBase(const DL_GroupPrecomputation<Element> &group) const
53  {return group.NeedConversions() ? m_base : m_bases[0];}
54  void Precompute(const DL_GroupPrecomputation<Element> &group, unsigned int maxExpBits, unsigned int storage);
55  void Load(const DL_GroupPrecomputation<Element> &group, BufferedTransformation &storedPrecomputation);
56  void Save(const DL_GroupPrecomputation<Element> &group, BufferedTransformation &storedPrecomputation) const;
57  Element Exponentiate(const DL_GroupPrecomputation<Element> &group, const Integer &exponent) const;
58  Element CascadeExponentiate(const DL_GroupPrecomputation<Element> &group, const Integer &exponent, const DL_FixedBasePrecomputation<Element> &pc2, const Integer &exponent2) const;
59 
60 private:
61  void PrepareCascade(const DL_GroupPrecomputation<Element> &group, std::vector<BaseAndExponent<Element> > &eb, const Integer &exponent) const;
62 
63  Element m_base;
64  unsigned int m_windowSize;
65  Integer m_exponentBase; // what base to represent the exponent in
66  std::vector<Element> m_bases; // precalculated bases
67 };
68 
69 NAMESPACE_END
70 
71 #ifdef CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
72 #include "eprecomp.cpp"
73 #endif
74 
75 #endif
interface for buffered transformations
Definition: cryptlib.h:770
multiple precision integer and basic arithmetics
Definition: integer.h:26
Abstract Group.
Definition: algebra.h:19
Base and Exponent.
Definition: algebra.h:119