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

dsa.h

Go to the documentation of this file.
00001 #ifndef CRYPTOPP_DSA_H
00002 #define CRYPTOPP_DSA_H
00003 
00007 #include "pubkey.h"
00008 #include "modexppc.h"
00009 #include "sha.h"
00010 
00011 #include <limits.h>
00012 
00013 NAMESPACE_BEGIN(CryptoPP)
00014 
00017 enum DSASignatureFormat {DSA_P1363, DSA_DER, DSA_OPENPGP};
00020 unsigned int DSAConvertSignatureFormat(byte *buffer, unsigned int bufferSize, DSASignatureFormat toFormat, 
00021         const byte *signature, unsigned int signatureLen, DSASignatureFormat fromFormat);
00022 
00024 
00028 class GDSADigestVerifier : public PK_WithPrecomputation<DigestVerifier>
00029 {
00030 public:
00031         GDSADigestVerifier(const Integer &p, const Integer &q, const Integer &g, const Integer &y);
00032         GDSADigestVerifier(BufferedTransformation &bt);
00033 
00034         void Precompute(unsigned int precomputationStorage=16);
00035         void LoadPrecomputation(BufferedTransformation &storedPrecomputation);
00036         void SavePrecomputation(BufferedTransformation &storedPrecomputation) const;
00037 
00038         void DEREncode(BufferedTransformation &bt) const;
00039         bool VerifyDigest(const byte *digest, unsigned int digestLen, const byte *signature) const;
00040 
00041         unsigned int MaxDigestLength() const {return UINT_MAX;}
00042         unsigned int DigestSignatureLength() const {return 2*m_q.ByteCount();}
00043 
00044         const Integer & GetModulus() const {return m_p;}
00045         const Integer & GetSubgroupSize() const {return m_q;}
00046         const Integer & GetGenerator() const {return m_g;}
00047         const Integer & GetPublicResidue() const {return m_y;}
00048 
00049         // exposed for validation testing
00050         bool RawVerify(const Integer &m, const Integer &a, const Integer &b) const;
00051 
00052 protected:
00053         GDSADigestVerifier() {}
00054         unsigned int ExponentBitLength() const;
00055         Integer EncodeDigest(const byte *digest, unsigned int digestLen) const;
00056 
00057         Integer m_p, m_q, m_g, m_y;
00058         ModExpPrecomputation m_gpc, m_ypc;
00059 };
00060 
00062 class GDSADigestSigner : public GDSADigestVerifier, public PK_WithPrecomputation<DigestSigner>
00063 {
00064 public:
00065         GDSADigestSigner(const Integer &p, const Integer &q, const Integer &g, const Integer &y, const Integer &x);
00066         GDSADigestSigner(RandomNumberGenerator &rng, unsigned int pbits);
00067         GDSADigestSigner(RandomNumberGenerator &rng, const Integer &p, const Integer &q, const Integer &g);
00068         GDSADigestSigner(BufferedTransformation &bt);
00069 
00070         void DEREncode(BufferedTransformation &bt) const;
00071         void SignDigest(RandomNumberGenerator &rng, const byte *digest, unsigned int digestLen, byte *signature) const;
00072 
00073         const Integer & GetPrivateExponent() const {return m_x;}
00074 
00075         // exposed for validation testing
00076         void RawSign(const Integer &k, const Integer &h, Integer &r, Integer &s) const;
00077 
00078 protected:
00079         GDSADigestSigner() {}
00080 
00081         Integer m_x;
00082 };
00083 
00085 template <class H>
00086 class GDSASigner : public SignerTemplate<GDSADigestSigner, H>, public PK_WithPrecomputation<PK_Signer>
00087 {
00088         typedef GDSADigestSigner Base;
00089 public:
00090         GDSASigner(const Integer &p, const Integer &q, const Integer &g, const Integer &y, const Integer &x)
00091                 : Base(p, q, g, y, x) {}
00092 
00093         // generate a random private key
00094         GDSASigner(RandomNumberGenerator &rng, unsigned int keybits)
00095                 : Base(rng, keybits) {}
00096 
00097         // generate a random private key, given p, q, and g
00098         GDSASigner(RandomNumberGenerator &rng, const Integer &p, const Integer &q, const Integer &g)
00099                 : Base(rng, p, q, g) {}
00100 
00101         // load a previously generated key
00102         GDSASigner(BufferedTransformation &storedKey)
00103                 : Base(storedKey) {}
00104 
00105 protected:
00106         GDSASigner() {}
00107 };
00108 
00110 template <class H>
00111 class GDSAVerifier : public VerifierTemplate<GDSADigestVerifier, H>, public PK_WithPrecomputation<PK_Verifier>
00112 {
00113         typedef GDSADigestVerifier Base;
00114 public:
00115         GDSAVerifier(const Integer &p, const Integer &q, const Integer &g, const Integer &y)
00116                 : Base(p, q, g, y) {}
00117 
00118         // create a matching public key from a private key
00119         GDSAVerifier(const GDSASigner<H> &priv)
00120                 : Base(priv) {}
00121 
00122         // load a previously generated key
00123         GDSAVerifier(BufferedTransformation &storedKey)
00124                 : Base(storedKey) {}
00125 };
00126 
00127 // ***********************************************************
00128 
00129 const int MIN_DSA_PRIME_LENGTH = 512;
00130 const int MAX_DSA_PRIME_LENGTH = 1024;
00131 
00133 
00135 bool GenerateDSAPrimes(byte *seed, unsigned int seedLength, int &counter,
00136                                                   Integer &p, unsigned int primeLength, Integer &q);
00137 
00138 class SHA;
00139 
00141 class DSAPrivateKey : public GDSASigner<SHA>
00142 {
00143 public:
00144         DSAPrivateKey(const Integer &p, const Integer &q, const Integer &g, const Integer &y, const Integer &x)
00145                 : GDSADigestSigner(p, q, g, y, x) {}
00146 
00147         // generate a random private key
00148         // keybits must be between 512 and 1024, and divisible by 64
00149         DSAPrivateKey(RandomNumberGenerator &rng, unsigned int keybits);
00150 
00151         // generate a random private key, given p, q, and g
00152         DSAPrivateKey(RandomNumberGenerator &rng, const Integer &p, const Integer &q, const Integer &g)
00153                 : GDSADigestSigner(rng, p, q, g) {}
00154 
00155         // load a previously generated key
00156         DSAPrivateKey(BufferedTransformation &storedKey)
00157                 : GDSADigestSigner(storedKey) {}
00158 };
00159 
00161 typedef GDSAVerifier<SHA> DSAPublicKey;
00162 
00163 NAMESPACE_END
00164 
00165 #endif

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