1#ifndef CRYPTOPP_MODEXPPC_H
2#define CRYPTOPP_MODEXPPC_H
3
4#include "modarith.h"
5#include "eprecomp.h"
6#include "smartptr.h"
7#include "pubkey.h"
8
9NAMESPACE_BEGIN(CryptoPP)
10
11CRYPTOPP_DLL_TEMPLATE_CLASS DL_FixedBasePrecomputationImpl<Integer>;
12
13class ModExpPrecomputation : public DL_GroupPrecomputation<Integer>
14{
15public:
16	// DL_GroupPrecomputation
17	bool NeedConversions() const {return true;}
18	Element ConvertIn(const Element &v) const {return m_mr->ConvertIn(v);}
19	virtual Element ConvertOut(const Element &v) const {return m_mr->ConvertOut(v);}
20	const AbstractGroup<Element> & GetGroup() const {return m_mr->MultiplicativeGroup();}
21	Element BERDecodeElement(BufferedTransformation &bt) const {return Integer(bt);}
22	void DEREncodeElement(BufferedTransformation &bt, const Element &v) const {v.DEREncode(bt);}
23
24	// non-inherited
25	void SetModulus(const Integer &v) {m_mr.reset(new MontgomeryRepresentation(v));}
26	const Integer & GetModulus() const {return m_mr->GetModulus();}
27
28private:
29	value_ptr<MontgomeryRepresentation> m_mr;
30};
31
32NAMESPACE_END
33
34#endif
35