Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

dh.h

Go to the documentation of this file.
00001 #ifndef CRYPTOPP_DH_H 00002 #define CRYPTOPP_DH_H 00003 00004 /** \file 00005 */ 00006 00007 #include "gfpcrypt.h" 00008 00009 NAMESPACE_BEGIN(CryptoPP) 00010 00011 //! , 00012 template <class GROUP_PARAMETERS, class COFACTOR_OPTION = CPP_TYPENAME GROUP_PARAMETERS::DefaultCofactorOption> 00013 class DH_Domain : public DL_SimpleKeyAgreementDomainBase<typename GROUP_PARAMETERS::Element> 00014 { 00015 typedef DL_SimpleKeyAgreementDomainBase<typename GROUP_PARAMETERS::Element> Base; 00016 00017 public: 00018 typedef GROUP_PARAMETERS GroupParameters; 00019 typedef typename GroupParameters::Element Element; 00020 typedef DL_KeyAgreementAlgorithm_DH<Element, COFACTOR_OPTION> DH_Algorithm; 00021 typedef DH_Domain<GROUP_PARAMETERS, COFACTOR_OPTION> Domain; 00022 00023 DH_Domain() {} 00024 00025 DH_Domain(const GroupParameters &params) 00026 : m_groupParameters(params) {} 00027 00028 DH_Domain(BufferedTransformation &bt) 00029 {m_groupParameters.BERDecode(bt);} 00030 00031 template <class T2> 00032 DH_Domain(RandomNumberGenerator &v1, const T2 &v2) 00033 {m_groupParameters.Initialize(v1, v2);} 00034 00035 template <class T2, class T3> 00036 DH_Domain(RandomNumberGenerator &v1, const T2 &v2, const T3 &v3) 00037 {m_groupParameters.Initialize(v1, v2, v3);} 00038 00039 template <class T2, class T3, class T4> 00040 DH_Domain(RandomNumberGenerator &v1, const T2 &v2, const T3 &v3, const T4 &v4) 00041 {m_groupParameters.Initialize(v1, v2, v3, v4);} 00042 00043 template <class T1, class T2> 00044 DH_Domain(const T1 &v1, const T2 &v2) 00045 {m_groupParameters.Initialize(v1, v2);} 00046 00047 template <class T1, class T2, class T3> 00048 DH_Domain(const T1 &v1, const T2 &v2, const T3 &v3) 00049 {m_groupParameters.Initialize(v1, v2, v3);} 00050 00051 template <class T1, class T2, class T3, class T4> 00052 DH_Domain(const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4) 00053 {m_groupParameters.Initialize(v1, v2, v3, v4);} 00054 00055 const GroupParameters & GetGroupParameters() const {return m_groupParameters;} 00056 GroupParameters & AccessGroupParameters() {return m_groupParameters;} 00057 00058 void GeneratePublicKey(RandomNumberGenerator &rng, const byte *privateKey, byte *publicKey) const 00059 { 00060 Base::GeneratePublicKey(rng, privateKey, publicKey); 00061 00062 if (FIPS_140_2_ComplianceEnabled()) 00063 { 00064 SecByteBlock privateKey2(this->PrivateKeyLength()); 00065 this->GeneratePrivateKey(rng, privateKey2); 00066 00067 SecByteBlock publicKey2(this->PublicKeyLength()); 00068 Base::GeneratePublicKey(rng, privateKey2, publicKey2); 00069 00070 SecByteBlock agreedValue(this->AgreedValueLength()), agreedValue2(this->AgreedValueLength()); 00071 this->Agree(agreedValue, privateKey, publicKey2); 00072 this->Agree(agreedValue2, privateKey2, publicKey); 00073 00074 if (agreedValue != agreedValue2) 00075 throw SelfTestFailure(this->AlgorithmName() + ": pairwise consistency test failed"); 00076 } 00077 } 00078 00079 static std::string StaticAlgorithmName() 00080 {return GroupParameters::StaticAlgorithmNamePrefix() + DH_Algorithm::StaticAlgorithmName();} 00081 std::string AlgorithmName() const {return StaticAlgorithmName();} 00082 00083 private: 00084 const DL_KeyAgreementAlgorithm<Element> & GetKeyAgreementAlgorithm() const 00085 {return Singleton<DH_Algorithm>().Ref();} 00086 DL_GroupParameters<Element> & AccessAbstractGroupParameters() 00087 {return m_groupParameters;} 00088 00089 GroupParameters m_groupParameters; 00090 }; 00091 00092 CRYPTOPP_DLL_TEMPLATE_CLASS DH_Domain<DL_GroupParameters_GFP_DefaultSafePrime>; 00093 00094 //! <a href="http://www.weidai.com/scan-mirror/ka.html#DH">Diffie-Hellman</a> in GF(p) with key validation 00095 typedef DH_Domain<DL_GroupParameters_GFP_DefaultSafePrime> DH; 00096 00097 NAMESPACE_END 00098 00099 #endif

Generated on Fri Aug 27 13:57:07 2004 for Crypto++ by doxygen 1.3.8