Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
3.5 KiB

  1. // eprecomp.h - written and placed in the public domain by Wei Dai
  2. //! \file eprecomp.h
  3. //! \brief Classes for precomputation in a group
  4. #ifndef CRYPTOPP_EPRECOMP_H
  5. #define CRYPTOPP_EPRECOMP_H
  6. #include "cryptlib.h"
  7. #include "integer.h"
  8. #include "algebra.h"
  9. #include "stdcpp.h"
  10. NAMESPACE_BEGIN(CryptoPP)
  11. template <class T>
  12. class DL_GroupPrecomputation
  13. {
  14. public:
  15. typedef T Element;
  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. #ifndef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562
  23. virtual ~DL_GroupPrecomputation() {}
  24. #endif
  25. };
  26. template <class T>
  27. class DL_FixedBasePrecomputation
  28. {
  29. public:
  30. typedef T Element;
  31. virtual bool IsInitialized() const =0;
  32. virtual void SetBase(const DL_GroupPrecomputation<Element> &group, const Element &base) =0;
  33. virtual const Element & GetBase(const DL_GroupPrecomputation<Element> &group) const =0;
  34. virtual void Precompute(const DL_GroupPrecomputation<Element> &group, unsigned int maxExpBits, unsigned int storage) =0;
  35. virtual void Load(const DL_GroupPrecomputation<Element> &group, BufferedTransformation &storedPrecomputation) =0;
  36. virtual void Save(const DL_GroupPrecomputation<Element> &group, BufferedTransformation &storedPrecomputation) const =0;
  37. virtual Element Exponentiate(const DL_GroupPrecomputation<Element> &group, const Integer &exponent) const =0;
  38. virtual Element CascadeExponentiate(const DL_GroupPrecomputation<Element> &group, const Integer &exponent, const DL_FixedBasePrecomputation<Element> &pc2, const Integer &exponent2) const =0;
  39. #ifndef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562
  40. virtual ~DL_FixedBasePrecomputation() {}
  41. #endif
  42. };
  43. template <class T>
  44. class DL_FixedBasePrecomputationImpl : public DL_FixedBasePrecomputation<T>
  45. {
  46. public:
  47. typedef T Element;
  48. DL_FixedBasePrecomputationImpl() : m_windowSize(0) {}
  49. // DL_FixedBasePrecomputation
  50. bool IsInitialized() const
  51. {return !m_bases.empty();}
  52. void SetBase(const DL_GroupPrecomputation<Element> &group, const Element &base);
  53. const Element & GetBase(const DL_GroupPrecomputation<Element> &group) const
  54. {return group.NeedConversions() ? m_base : m_bases[0];}
  55. void Precompute(const DL_GroupPrecomputation<Element> &group, unsigned int maxExpBits, unsigned int storage);
  56. void Load(const DL_GroupPrecomputation<Element> &group, BufferedTransformation &storedPrecomputation);
  57. void Save(const DL_GroupPrecomputation<Element> &group, BufferedTransformation &storedPrecomputation) const;
  58. Element Exponentiate(const DL_GroupPrecomputation<Element> &group, const Integer &exponent) const;
  59. Element CascadeExponentiate(const DL_GroupPrecomputation<Element> &group, const Integer &exponent, const DL_FixedBasePrecomputation<Element> &pc2, const Integer &exponent2) const;
  60. #ifndef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562
  61. virtual ~DL_FixedBasePrecomputationImpl() {}
  62. #endif
  63. private:
  64. void PrepareCascade(const DL_GroupPrecomputation<Element> &group, std::vector<BaseAndExponent<Element> > &eb, const Integer &exponent) const;
  65. Element m_base;
  66. unsigned int m_windowSize;
  67. Integer m_exponentBase; // what base to represent the exponent in
  68. std::vector<Element> m_bases; // precalculated bases
  69. };
  70. NAMESPACE_END
  71. #ifdef CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
  72. #include "eprecomp.cpp"
  73. #endif
  74. #endif