2 Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
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
;
189 int rSz
= r_
.ByteCount();
198 int sSz
= s_
.ByteCount();
205 s_
.Encode(sig
+ rSz
, sSz
);
211 DSA_Verifier::DSA_Verifier(const DSA_PublicKey
& key
)
216 bool DSA_Verifier::Verify(const byte
* sha_digest
, const byte
* sig
)
218 const Integer
& p
= key_
.GetModulus();
219 const Integer
& q
= key_
.GetSubGroupOrder();
220 const Integer
& g
= key_
.GetSubGroupGenerator();
221 const Integer
& y
= key_
.GetPublicPart();
223 int sz
= q
.ByteCount();
226 s_
.Decode(sig
+ sz
, sz
);
228 if (r_
>= q
|| r_
< 1 || s_
>= q
|| s_
< 1)
231 Integer
H(sha_digest
, SHA::DIGEST_SIZE
); // sha Hash(m)
233 Integer w
= s_
.InverseMod(q
);
234 Integer u1
= (H
* w
) % q
;
235 Integer u2
= (r_
* w
) % q
;
237 // verify r == ((g^u1 * y^u2) mod p) mod q
238 ModularArithmetic
ma(p
);
239 Integer v
= ma
.CascadeExponentiate(g
, u1
, y
, u2
);
248 const Integer
& DSA_Signer::GetR() const
254 const Integer
& DSA_Signer::GetS() const
260 const Integer
& DSA_Verifier::GetR() const
266 const Integer
& DSA_Verifier::GetS() const