00001 #ifndef CRYPTOPP_NR_H
00002 #define CRYPTOPP_NR_H
00003
00007 #include "pubkey.h"
00008 #include "modexppc.h"
00009
00010 #include <limits.h>
00011
00012 NAMESPACE_BEGIN(CryptoPP)
00013
00015 class NRDigestVerifier : public PK_WithPrecomputation<DigestVerifier>
00016 {
00017 public:
00018 NRDigestVerifier(const Integer &p, const Integer &q, const Integer &g, const Integer &y);
00019 NRDigestVerifier(BufferedTransformation &bt);
00020
00021 void Precompute(unsigned int precomputationStorage=16);
00022 void LoadPrecomputation(BufferedTransformation &storedPrecomputation);
00023 void SavePrecomputation(BufferedTransformation &storedPrecomputation) const;
00024
00025 void DEREncode(BufferedTransformation &bt) const;
00026 bool VerifyDigest(const byte *digest, unsigned int digestLen, const byte *signature) const;
00027
00028 unsigned int MaxDigestLength() const {return UINT_MAX;}
00029 unsigned int DigestSignatureLength() const {return 2*m_q.ByteCount();}
00030
00031 const Integer & GetModulus() const {return m_p;}
00032 const Integer & GetSubgroupSize() const {return m_q;}
00033 const Integer & GetGenerator() const {return m_g;}
00034 const Integer & GetPublicResidue() const {return m_y;}
00035
00036 protected:
00037 NRDigestVerifier() {}
00038 bool RawVerify(const Integer &m, const Integer &a, const Integer &b) const;
00039 unsigned int ExponentBitLength() const;
00040 Integer EncodeDigest(const byte *digest, unsigned int digestLen) const;
00041
00042 Integer m_p, m_q, m_g, m_y;
00043 ModExpPrecomputation m_gpc, m_ypc;
00044 };
00045
00047 class NRDigestSigner : public NRDigestVerifier, public PK_WithPrecomputation<DigestSigner>
00048 {
00049 public:
00050 NRDigestSigner(const Integer &p, const Integer &q, const Integer &g, const Integer &y, const Integer &x);
00051 NRDigestSigner(RandomNumberGenerator &rng, unsigned int pbits);
00052 NRDigestSigner(RandomNumberGenerator &rng, const Integer &p, const Integer &q, const Integer &g);
00053 NRDigestSigner(BufferedTransformation &bt);
00054
00055 void DEREncode(BufferedTransformation &bt) const;
00056 void SignDigest(RandomNumberGenerator &rng, const byte *digest, unsigned int digestLen, byte *signature) const;
00057
00058 const Integer & GetPrivateExponent() const {return m_x;}
00059
00060 protected:
00061 void RawSign(RandomNumberGenerator &rng, const Integer &m, Integer &a, Integer &b) const;
00062
00063 Integer m_x;
00064 };
00065
00067 template <class H>
00068 class NRSigner : public SignerTemplate<NRDigestSigner, H>, public PK_WithPrecomputation<PK_Signer>
00069 {
00070 typedef NRDigestSigner Base;
00071 public:
00072 NRSigner(const Integer &p, const Integer &q, const Integer &g, const Integer &y, const Integer &x)
00073 : Base(p, q, g, y, x) {}
00074
00075
00076 NRSigner(RandomNumberGenerator &rng, unsigned int keybits)
00077 : Base(rng, keybits) {}
00078
00079
00080 NRSigner(RandomNumberGenerator &rng, const Integer &p, const Integer &q, const Integer &g)
00081 : Base(rng, p, q, g) {}
00082
00083
00084 NRSigner(BufferedTransformation &storedKey)
00085 : Base(storedKey) {}
00086 };
00087
00089 template <class H>
00090 class NRVerifier : public VerifierTemplate<NRDigestVerifier, H>, public PK_WithPrecomputation<PK_Verifier>
00091 {
00092 typedef NRDigestVerifier Base;
00093 public:
00094 NRVerifier(const Integer &p, const Integer &q, const Integer &g, const Integer &y)
00095 : Base(p, q, g, y) {}
00096
00097
00098 NRVerifier(const NRSigner<H> &priv)
00099 : Base(priv) {}
00100
00101
00102 NRVerifier(BufferedTransformation &storedKey)
00103 : Base(storedKey) {}
00104 };
00105
00106 NAMESPACE_END
00107
00108 #endif