Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

nr.h

Go to the documentation of this file.
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         // generate a random private key
00076         NRSigner(RandomNumberGenerator &rng, unsigned int keybits)
00077                 : Base(rng, keybits) {}
00078 
00079         // generate a random private key, given p, q, and g
00080         NRSigner(RandomNumberGenerator &rng, const Integer &p, const Integer &q, const Integer &g)
00081                 : Base(rng, p, q, g) {}
00082 
00083         // load a previously generated key
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         // create a matching public key from a private key
00098         NRVerifier(const NRSigner<H> &priv)
00099                 : Base(priv) {}
00100 
00101         // load a previously generated key
00102         NRVerifier(BufferedTransformation &storedKey)
00103                 : Base(storedKey) {}
00104 };
00105 
00106 NAMESPACE_END
00107 
00108 #endif

Generated at Mon Jan 15 01:16:34 2001 for Crypto++ by doxygen1.2.4 written by Dimitri van Heesch, © 1997-2000