2
Copyright (C) 2000-2007 MySQL AB
4
This program is free software; you can redistribute it and/or modify
5
it under the terms of the GNU General Public License as published by
6
the Free Software Foundation; version 2 of the License.
8
This program is distributed in the hope that it will be useful,
9
but WITHOUT ANY WARRANTY; without even the implied warranty of
10
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
GNU General Public License for more details.
13
You should have received a copy of the GNU General Public License
14
along with this program; see the file COPYING. If not, write to the
15
Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
20
#include "runtime.hpp"
24
#include "modarith.hpp"
30
void DSA_PublicKey::Swap(DSA_PublicKey& other)
39
DSA_PublicKey::DSA_PublicKey(const DSA_PublicKey& other)
40
: p_(other.p_), q_(other.q_), g_(other.g_), y_(other.y_)
44
DSA_PublicKey& DSA_PublicKey::operator=(const DSA_PublicKey& that)
46
DSA_PublicKey tmp(that);
52
DSA_PublicKey::DSA_PublicKey(Source& source)
58
void DSA_PublicKey::Initialize(Source& source)
60
DSA_Public_Decoder decoder(source);
61
decoder.Decode(*this);
65
void DSA_PublicKey::Initialize(const Integer& p, const Integer& q,
66
const Integer& g, const Integer& y)
75
const Integer& DSA_PublicKey::GetModulus() const
80
const Integer& DSA_PublicKey::GetSubGroupOrder() const
86
const Integer& DSA_PublicKey::GetSubGroupGenerator() const
92
const Integer& DSA_PublicKey::GetPublicPart() const
98
void DSA_PublicKey::SetModulus(const Integer& p)
104
void DSA_PublicKey::SetSubGroupOrder(const Integer& q)
110
void DSA_PublicKey::SetSubGroupGenerator(const Integer& g)
116
void DSA_PublicKey::SetPublicPart(const Integer& y)
122
word32 DSA_PublicKey::SignatureLength() const
124
return GetSubGroupOrder().ByteCount() * 2; // r and s
129
DSA_PrivateKey::DSA_PrivateKey(Source& source)
135
void DSA_PrivateKey::Initialize(Source& source)
137
DSA_Private_Decoder decoder(source);
138
decoder.Decode(*this);
142
void DSA_PrivateKey::Initialize(const Integer& p, const Integer& q,
143
const Integer& g, const Integer& y,
146
DSA_PublicKey::Initialize(p, q, g, y);
151
const Integer& DSA_PrivateKey::GetPrivatePart() const
157
void DSA_PrivateKey::SetPrivatePart(const Integer& x)
163
DSA_Signer::DSA_Signer(const DSA_PrivateKey& key)
168
word32 DSA_Signer::Sign(const byte* sha_digest, byte* sig,
169
RandomNumberGenerator& rng)
171
const Integer& p = key_.GetModulus();
172
const Integer& q = key_.GetSubGroupOrder();
173
const Integer& g = key_.GetSubGroupGenerator();
174
const Integer& x = key_.GetPrivatePart();
176
Integer k(rng, 1, q - 1);
178
r_ = a_exp_b_mod_c(g, k, p);
181
Integer H(sha_digest, SHA::DIGEST_SIZE); // sha Hash(m)
183
Integer kInv = k.InverseMod(q);
184
s_ = (kInv * (H + x*r_)) % q;
186
assert(!!r_ && !!s_);
188
int rSz = r_.ByteCount();
197
int sSz = s_.ByteCount();
204
s_.Encode(sig + rSz, sSz);
210
DSA_Verifier::DSA_Verifier(const DSA_PublicKey& key)
215
bool DSA_Verifier::Verify(const byte* sha_digest, const byte* sig)
217
const Integer& p = key_.GetModulus();
218
const Integer& q = key_.GetSubGroupOrder();
219
const Integer& g = key_.GetSubGroupGenerator();
220
const Integer& y = key_.GetPublicPart();
222
int sz = q.ByteCount();
225
s_.Decode(sig + sz, sz);
227
if (r_ >= q || r_ < 1 || s_ >= q || s_ < 1)
230
Integer H(sha_digest, SHA::DIGEST_SIZE); // sha Hash(m)
232
Integer w = s_.InverseMod(q);
233
Integer u1 = (H * w) % q;
234
Integer u2 = (r_ * w) % q;
236
// verify r == ((g^u1 * y^u2) mod p) mod q
237
ModularArithmetic ma(p);
238
Integer v = ma.CascadeExponentiate(g, u1, y, u2);
247
const Integer& DSA_Signer::GetR() const
253
const Integer& DSA_Signer::GetS() const
259
const Integer& DSA_Verifier::GetR() const
265
const Integer& DSA_Verifier::GetS() const