00001
00002
00003
00004
00005
00006 #ifndef CRYPTOPP_EPRECOMP_H
00007 #define CRYPTOPP_EPRECOMP_H
00008
00009 #include "cryptlib.h"
00010 #include "integer.h"
00011 #include "algebra.h"
00012 #include "stdcpp.h"
00013
00014 NAMESPACE_BEGIN(CryptoPP)
00015
00016 template <class T>
00017 class DL_GroupPrecomputation
00018 {
00019 public:
00020 typedef T Element;
00021
00022 virtual bool NeedConversions() const {return false;}
00023 virtual Element ConvertIn(const Element &v) const {return v;}
00024 virtual Element ConvertOut(const Element &v) const {return v;}
00025 virtual const AbstractGroup<Element> & GetGroup() const =0;
00026 virtual Element BERDecodeElement(BufferedTransformation &bt) const =0;
00027 virtual void DEREncodeElement(BufferedTransformation &bt, const Element &P) const =0;
00028
00029 #ifndef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562
00030 virtual ~DL_GroupPrecomputation() {}
00031 #endif
00032 };
00033
00034 template <class T>
00035 class DL_FixedBasePrecomputation
00036 {
00037 public:
00038 typedef T Element;
00039
00040 virtual bool IsInitialized() const =0;
00041 virtual void SetBase(const DL_GroupPrecomputation<Element> &group, const Element &base) =0;
00042 virtual const Element & GetBase(const DL_GroupPrecomputation<Element> &group) const =0;
00043 virtual void Precompute(const DL_GroupPrecomputation<Element> &group, unsigned int maxExpBits, unsigned int storage) =0;
00044 virtual void Load(const DL_GroupPrecomputation<Element> &group, BufferedTransformation &storedPrecomputation) =0;
00045 virtual void Save(const DL_GroupPrecomputation<Element> &group, BufferedTransformation &storedPrecomputation) const =0;
00046 virtual Element Exponentiate(const DL_GroupPrecomputation<Element> &group, const Integer &exponent) const =0;
00047 virtual Element CascadeExponentiate(const DL_GroupPrecomputation<Element> &group, const Integer &exponent, const DL_FixedBasePrecomputation<Element> &pc2, const Integer &exponent2) const =0;
00048
00049 #ifndef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562
00050 virtual ~DL_FixedBasePrecomputation() {}
00051 #endif
00052 };
00053
00054 template <class T>
00055 class DL_FixedBasePrecomputationImpl : public DL_FixedBasePrecomputation<T>
00056 {
00057 public:
00058 typedef T Element;
00059
00060 DL_FixedBasePrecomputationImpl() : m_windowSize(0) {}
00061
00062
00063 bool IsInitialized() const
00064 {return !m_bases.empty();}
00065 void SetBase(const DL_GroupPrecomputation<Element> &group, const Element &base);
00066 const Element & GetBase(const DL_GroupPrecomputation<Element> &group) const
00067 {return group.NeedConversions() ? m_base : m_bases[0];}
00068 void Precompute(const DL_GroupPrecomputation<Element> &group, unsigned int maxExpBits, unsigned int storage);
00069 void Load(const DL_GroupPrecomputation<Element> &group, BufferedTransformation &storedPrecomputation);
00070 void Save(const DL_GroupPrecomputation<Element> &group, BufferedTransformation &storedPrecomputation) const;
00071 Element Exponentiate(const DL_GroupPrecomputation<Element> &group, const Integer &exponent) const;
00072 Element CascadeExponentiate(const DL_GroupPrecomputation<Element> &group, const Integer &exponent, const DL_FixedBasePrecomputation<Element> &pc2, const Integer &exponent2) const;
00073
00074 #ifndef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562
00075 virtual ~DL_FixedBasePrecomputationImpl() {}
00076 #endif
00077
00078 private:
00079 void PrepareCascade(const DL_GroupPrecomputation<Element> &group, std::vector<BaseAndExponent<Element> > &eb, const Integer &exponent) const;
00080
00081 Element m_base;
00082 unsigned int m_windowSize;
00083 Integer m_exponentBase;
00084 std::vector<Element> m_bases;
00085 };
00086
00087 NAMESPACE_END
00088
00089 #ifdef CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
00090 #include "eprecomp.cpp"
00091 #endif
00092
00093 #endif