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
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
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
00094 GDSASigner(RandomNumberGenerator &rng, unsigned int keybits)
00095 : Base(rng, keybits) {}
00096
00097
00098 GDSASigner(RandomNumberGenerator &rng, const Integer &p, const Integer &q, const Integer &g)
00099 : Base(rng, p, q, g) {}
00100
00101
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
00119 GDSAVerifier(const GDSASigner<H> &priv)
00120 : Base(priv) {}
00121
00122
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
00148
00149 DSAPrivateKey(RandomNumberGenerator &rng, unsigned int keybits);
00150
00151
00152 DSAPrivateKey(RandomNumberGenerator &rng, const Integer &p, const Integer &q, const Integer &g)
00153 : GDSADigestSigner(rng, p, q, g) {}
00154
00155
00156 DSAPrivateKey(BufferedTransformation &storedKey)
00157 : GDSADigestSigner(storedKey) {}
00158 };
00159
00161 typedef GDSAVerifier<SHA> DSAPublicKey;
00162
00163 NAMESPACE_END
00164
00165 #endif