📄 pubkey.h
字号:
virtual const DS_INTERFACE & GetDigestSignatureSchemeInterface() const =0;
};
//! .
template <class H>
class PK_SignerBase : public PK_SignatureSchemeBase<H, PK_Signer, DigestSigner>
{
public:
void SignAndRestart(RandomNumberGenerator &rng, HashTransformation &messageAccumulator, byte *signature) const;
};
//! .
template <class H>
class PK_VerifierBase : public PK_SignatureSchemeBase<H, PK_Verifier, DigestVerifier>
{
public:
bool VerifyAndRestart(HashTransformation &messageAccumulator, const byte *sig) const;
};
template <class H>
void PK_SignerBase<H>::SignAndRestart(RandomNumberGenerator &rng, HashTransformation &messageAccumulator, byte *signature) const
{
if (messageAccumulator.DigestSize() > GetDigestSignatureSchemeInterface().MaxDigestLength())
throw PK_Signer::KeyTooShort();
SecByteBlock digest(messageAccumulator.DigestSize());
messageAccumulator.Final(digest);
GetDigestSignatureSchemeInterface().SignDigest(rng, digest, digest.size(), signature);
}
template <class H>
bool PK_VerifierBase<H>::VerifyAndRestart(HashTransformation &messageAccumulator, const byte *sig) const
{
SecByteBlock digest(messageAccumulator.DigestSize());
messageAccumulator.Final(digest);
return GetDigestSignatureSchemeInterface().VerifyDigest(digest, digest.size(), sig);
}
//! .
template <class BASE, class DS>
class PK_SignatureSchemeImpl : public BASE
{
public:
typedef typename DS::KeyClass KeyClass;
// PublicKeyAlgorithm or PrivateKeyAlgorithm
std::string AlgorithmName() const {return m_ds.AlgorithmName();}
PrivateKey & AccessPrivateKey() {return m_ds.AccessPrivateKey();}
const PrivateKey & GetPrivateKey() const {return m_ds.GetPrivateKey();}
PublicKey & AccessPublicKey() {return m_ds.AccessPublicKey();}
const PublicKey & GetPublicKey() const {return m_ds.GetPublicKey();}
KeyClass & AccessKey() {return m_ds.AccessKey();}
const KeyClass & GetKey() const {return m_ds.GetKey();}
const KeyClass & GetTrapdoorFunction() const {return m_ds.GetTrapdoorFunction();}
DS & AccessDigestSignatureScheme() {return m_ds;}
const DS & GetDigestSignatureScheme() const {return m_ds;}
protected:
DS m_ds;
};
//! .
template <class DS, class H>
class PK_SignerImpl : public PK_SignatureSchemeImpl<PK_SignerBase<H>, DS>, public PrivateKeyCopier<typename DS::SchemeOptions>
{
const DigestSigner & GetDigestSignatureSchemeInterface() const {return m_ds;}
public:
// PrivateKeyCopier
void CopyKeyInto(typename DS::SchemeOptions::PublicKey &key) const
{m_ds.CopyKeyInto(key);}
void CopyKeyInto(typename DS::SchemeOptions::PrivateKey &key) const
{m_ds.CopyKeyInto(key);}
};
//! .
template <class DS, class H>
class PK_VerifierImpl : public PK_SignatureSchemeImpl<PK_VerifierBase<H>, DS>, public PublicKeyCopier<typename DS::SchemeOptions>
{
const DigestVerifier & GetDigestSignatureSchemeInterface() const {return m_ds;}
public:
// PublicKeyCopier
void CopyKeyInto(typename DS::SchemeOptions::PublicKey &key) const
{m_ds.CopyKeyInto(key);}
};
// ********************************************************
//! .
class SignatureEncodingMethodWithRecovery : public HashTransformationWithDefaultTruncation
{
public:
void Final(byte *digest) {}
virtual void Encode(RandomNumberGenerator &rng, byte *representative) =0;
virtual bool Verify(const byte *representative) =0;
virtual DecodingResult Decode(byte *message) =0;
virtual unsigned int MaximumRecoverableLength() const =0;
};
//! .
template <class H>
class SignatureSystemWithRecoveryBaseTemplate : virtual public PK_SignatureSchemeWithRecovery
{
public:
unsigned int SignatureLength() const {return GetTrapdoorFunctionBounds().MaxPreimage().ByteCount();}
HashTransformation * NewMessageAccumulator() const {return new H(PaddedBlockBitLength());}
unsigned int MaximumRecoverableLength() const {return H::MaximumRecoverableLength(PaddedBlockBitLength());}
bool AllowLeftoverMessage() const {return H::AllowLeftoverMessage();}
protected:
unsigned int PaddedBlockByteLength() const {return BitsToBytes(PaddedBlockBitLength());}
unsigned int PaddedBlockBitLength() const {return GetTrapdoorFunctionBounds().ImageBound().BitCount()-1;}
virtual const TrapdoorFunctionBounds & GetTrapdoorFunctionBounds() const =0;
};
//! .
template <class TF, class H>
class SignerWithRecoveryTemplate : virtual public SignatureSystemWithRecoveryBaseTemplate<H>, virtual public PK_SignerWithRecovery, public TF
{
public:
typedef TF KeyClass;
const KeyClass & GetKey() const {return *this;}
KeyClass & AccessKey() {return *this;}
PrivateKey & AccessPrivateKey() {return *this;}
SignerWithRecoveryTemplate() {}
void SignAndRestart(RandomNumberGenerator &rng, HashTransformation &messageAccumulator, byte *signature) const;
const TrapdoorFunctionBounds & GetTrapdoorFunctionBounds() const {return *this;}
};
//! .
template <class TF, class H>
class VerifierWithRecoveryTemplate : virtual public SignatureSystemWithRecoveryBaseTemplate<H>, virtual public PK_VerifierWithRecovery, public TF
{
public:
typedef TF KeyClass;
const KeyClass & GetKey() const {return *this;}
KeyClass & AccessKey() {return *this;}
PublicKey & AccessPublicKey() {return *this;}
VerifierWithRecoveryTemplate() {}
bool VerifyAndRestart(HashTransformation &messageAccumulator, const byte *sig) const;
bool SignatureUpfrontForRecovery() const {return true;}
HashTransformation * NewRecoveryAccumulator(const byte *signature) const;
DecodingResult Recover(byte *recoveredMessage, HashTransformation *recoveryAccumulator, const byte *signature) const;
const TrapdoorFunctionBounds & GetTrapdoorFunctionBounds() const {return *this;}
};
template <class TF, class H>
void SignerWithRecoveryTemplate<TF, H>::SignAndRestart(RandomNumberGenerator &rng, HashTransformation &messageAccumulator, byte *signature) const
{
H &ma = static_cast<H&>(messageAccumulator);
if (ma.MaximumRecoverableLength() == 0)
throw KeyTooShort();
SecByteBlock representative(PaddedBlockByteLength());
ma.Encode(rng, representative);
CalculateInverse(Integer(representative, representative.size())).Encode(signature, SignatureLength());
}
template <class TF, class H>
bool VerifierWithRecoveryTemplate<TF, H>::VerifyAndRestart(HashTransformation &messageAccumulator, const byte *signature) const
{
SecByteBlock representative(PaddedBlockByteLength());
ApplyFunction(Integer(signature, SignatureLength())).Encode(representative, representative.size());
return messageAccumulator.Verify(representative);
}
template <class TF, class H>
HashTransformation * VerifierWithRecoveryTemplate<TF, H>::NewRecoveryAccumulator(const byte *signature) const
{
SecByteBlock representative(PaddedBlockByteLength());
ApplyFunction(Integer(signature, SignatureLength())).Encode(representative, representative.size());
return new H(representative, PaddedBlockBitLength());
}
template <class TF, class H>
DecodingResult VerifierWithRecoveryTemplate<TF, H>::Recover(byte *recoveredMessage, HashTransformation *recoveryAccumulator, const byte *signature) const
{
std::auto_ptr<H> ma(static_cast<H*>(recoveryAccumulator));
return ma->Decode(recoveredMessage);
}
// ********************************************************
// to be thrown by DecodeElement and AgreeWithStaticPrivateKey
class DL_BadElement : public InvalidDataFormat
{
public:
DL_BadElement() : InvalidDataFormat("CryptoPP: invalid group element") {}
};
//! .
template <class T>
class DL_GroupParameters : public CryptoParameters
{
typedef DL_GroupParameters<T> ThisClass;
public:
typedef T Element;
DL_GroupParameters() : m_validationLevel(0) {}
// CryptoMaterial
bool Validate(RandomNumberGenerator &rng, unsigned int level) const
{
if (!GetBasePrecomputation().IsInitialized())
return false;
if (m_validationLevel > level)
return true;
bool pass = ValidateGroup(rng, level);
pass = pass && ValidateElement(level, GetSubgroupGenerator(), &GetBasePrecomputation());
m_validationLevel = pass ? level+1 : 0;
return pass;
}
bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const
{
return GetValueHelper(this, name, valueType, pValue)
CRYPTOPP_GET_FUNCTION_ENTRY(SubgroupOrder)
CRYPTOPP_GET_FUNCTION_ENTRY(SubgroupGenerator)
;
}
bool SupportsPrecomputation() const {return true;}
void Precompute(unsigned int precomputationStorage=16)
{
AccessBasePrecomputation().Precompute(GetGroupPrecomputation(), GetSubgroupOrder().BitCount(), precomputationStorage);
}
void LoadPrecomputation(BufferedTransformation &storedPrecomputation)
{
AccessBasePrecomputation().Load(GetGroupPrecomputation(), storedPrecomputation);
m_validationLevel = 0;
}
void SavePrecomputation(BufferedTransformation &storedPrecomputation) const
{
GetBasePrecomputation().Save(GetGroupPrecomputation(), storedPrecomputation);
}
// non-inherited
virtual const Element & GetSubgroupGenerator() const {return GetBasePrecomputation().GetBase(GetGroupPrecomputation());}
virtual void SetSubgroupGenerator(const Element &base) {AccessBasePrecomputation().SetBase(GetGroupPrecomputation(), base);}
virtual Element ExponentiateBase(const Integer &exponent) const
{
return GetBasePrecomputation().Exponentiate(GetGroupPrecomputation(), exponent);
}
virtual Element ExponentiateElement(const Element &base, const Integer &exponent) const
{
Element result;
SimultaneousExponentiate(&result, base, &exponent, 1);
return result;
}
virtual const DL_GroupPrecomputation<Element> & GetGroupPrecomputation() const =0;
virtual const DL_FixedBasePrecomputation<Element> & GetBasePrecomputation() const =0;
virtual DL_FixedBasePrecomputation<Element> & AccessBasePrecomputation() =0;
virtual const Integer & GetSubgroupOrder() const =0; // order of subgroup generated by base element
virtual Integer GetMaxExponent() const =0;
virtual Integer GetGroupOrder() const {return GetSubgroupOrder()*GetCofactor();} // one of these two needs to be overriden
virtual Integer GetCofactor() const {return GetGroupOrder()/GetSubgroupOrder();}
virtual unsigned int GetEncodedElementSize(bool reversible) const =0;
virtual void EncodeElement(bool reversible, const Element &element, byte *encoded) const =0;
virtual Element DecodeElement(const byte *encoded, bool checkForGroupMembership) const =0;
virtual Integer ConvertElementToInteger(const Element &element) const =0;
virtual bool ValidateGroup(RandomNumberGenerator &rng, unsigned int level) const =0;
virtual bool ValidateElement(unsigned int level, const Element &element, const DL_FixedBasePrecomputation<Element> *precomp) const =0;
virtual bool FastSubgroupCheckAvailable() const =0;
virtual bool IsIdentity(const Element &element) const =0;
virtual void SimultaneousExponentiate(Element *results, const Element &base, const Integer *exponents, unsigned int exponentsCount) const =0;
protected:
void ParametersChanged() {m_validationLevel = 0;}
private:
mutable unsigned int m_validationLevel;
};
//! .
template <class GROUP_PRECOMP, class BASE_PRECOMP = DL_FixedBasePrecomputationImpl<CPP_TYPENAME GROUP_PRECOMP::Element>, class BASE = DL_GroupParameters<CPP_TYPENAME GROUP_PRECOMP::Element> >
class DL_GroupParametersImpl : public BASE
{
public:
typedef GROUP_PRECOMP GroupPrecomputation;
typedef typename GROUP_PRECOMP::Element Element;
typedef BASE_PRECOMP BasePrecomputation;
const DL_GroupPrecomputation<Element> & GetGroupPrecomputation() const {return m_groupPrecomputation;}
const DL_FixedBasePrecomputation<Element> & GetBasePrecomputation() const {return m_gpc;}
DL_FixedBasePrecomputation<Element> & AccessBasePrecomputation() {return m_gpc;}
bool operator==(const DL_GroupParametersImpl<GROUP_PRECOMP, BASE_PRECOMP, BASE> &rhs) const
{return m_groupPrecomputation.GetCurve() == rhs.m_groupPrecomputation.GetCurve() && m_gpc.GetBase(m_groupPrecomputation) == rhs.m_gpc.GetBase(rhs.m_groupPrecomputation);}
protected:
GROUP_PRECOMP m_groupPrecomputation;
BASE_PRECOMP m_gpc;
};
//! .
template <class T>
class DL_Key
{
public:
virtual const DL_GroupParameters<T> & GetAbstractGroupParameters() const =0;
virtual DL_GroupParameters<T> & AccessAbstractGroupParameters() =0;
};
//! .
template <class T>
class DL_PublicKey : public DL_Key<T>
{
typedef DL_PublicKey<T> ThisClass;
public:
typedef T Element;
bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const
{
return GetAbstractGroupParameters().GetVoidValue(name, valueType, pValue)
|| GetValueHelper(this, name, valueType, pValue)
CRYPTOPP_GET_FUNCTION_ENTRY(PublicElement);
}
void AssignFrom(const NameValuePairs &source);
// non-inherited
virtual const Element & GetPublicElement() const {return GetPublicPrecomputation().GetBase(GetAbstractGroupParameters().GetGroupPrecomputation());}
virtual void SetPublicElement(const Element &y) {AccessPublicPrecomputation().SetBase(GetAbstractGroupParameters().GetGroupPrecomputation(), y);}
virtual Element ExponentiatePublicElement(const Integer &exponent) const
{
const DL_GroupParameters<T> ¶ms = GetAbstractGroupParameters();
return GetPublicPrecomputation().Exponentiate(params.GetGroupPrecomputation(), exponent);
}
virtual Element CascadeExponentiateBaseAndPublicElement(const Integer &baseExp, const Integer &publicExp) const
{
const DL_GroupParameters<T> ¶ms = GetAbstractGroupParameters();
return params.GetBasePrecomputation().CascadeExponentiate(params.GetGroupPrecomputation(), baseExp, GetPublicPrecomputation(), publicExp);
}
virtual const DL_FixedBasePrecomputation<T> & GetPublicPrecomputation() const =0;
virtual DL_FixedBasePrecomputation<T> & AccessPublicPrecomputation() =0;
};
//! .
template <class T>
class DL_PrivateKey : public DL_Key<T>
{
typedef DL_PrivateKey<T> ThisClass;
public:
typedef T Element;
void MakePublicKey(DL_PublicKey<T> &pub) const
{
pub.AccessAbstractGroupParameters().AssignFrom(GetAbstractGroupParameters());
pub.SetPublicElement(GetAbstractGroupParameters().ExponentiateBase(GetPrivateExponent()));
}
bool GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const
{
return GetAbstractGroupParameters().GetVoidValue(name, valueType, pValue)
|| GetValueHelper(this, name, valueType, pValue)
CRYPTOPP_GET_FUNCTION_ENTRY(PrivateExponent);
}
void AssignFrom(const NameValuePairs &source)
{
AccessAbstractGroupParameters().AssignFrom(source);
AssignFromHelper(this, source)
CRYPTOPP_SET_FUNCTION_ENTRY(PrivateExponent);
}
virtual const Integer & GetPrivateExponent() const =0;
virtual void SetPrivateExponent(const Integer &x) =0;
};
template <class T>
void DL_PublicKey<T>::AssignFrom(const NameValuePairs &source)
{
DL_PrivateKey<T> *pPrivateKey = NULL;
if (source.GetThisPointer(pPrivateKey))
pPrivateKey->MakePublicKey(*this);
else
{
AccessAbstractGroupParameters().AssignFrom(source);
AssignFromHelper(this, source)
CRYPTOPP_SET_FUNCTION_ENTRY(PublicElement);
}
}
class OID;
//! .
template <class PK, class GP, class O = OID>
class DL_KeyImpl : public PK
{
public:
typedef GP GroupParameters;
O GetAlgorithmID() const {return GetGroupParameters().GetAlgorithmID();}
// void BERDecode(BufferedTransformation &bt)
// {PK::BERDecode(bt);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -