00001
#ifndef CRYPTOPP_DH_H
00002
#define CRYPTOPP_DH_H
00003
00004
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 ¶ms)
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
00095 typedef DH_Domain<DL_GroupParameters_GFP_DefaultSafePrime>
DH;
00096
00097 NAMESPACE_END
00098
00099
#endif