📄 dsa.cpp
字号:
/* dsa.cpp * * Copyright (C) 2003 Sawtooth Consulting Ltd. * * This file is part of yaSSL. * * yaSSL is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * yaSSL is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */#include "runtime.hpp"#include "dsa.hpp"#include "sha.hpp"#include "asn.hpp"#include "modarith.hpp"namespace TaoCrypt {void DSA_PublicKey::Swap(DSA_PublicKey& other){ p_.Swap(other.p_); q_.Swap(other.q_); g_.Swap(other.g_); y_.Swap(other.y_);}DSA_PublicKey::DSA_PublicKey(const DSA_PublicKey& other) : p_(other.p_), q_(other.q_), g_(other.g_), y_(other.y_){}DSA_PublicKey& DSA_PublicKey::operator=(const DSA_PublicKey& that){ DSA_PublicKey tmp(that); Swap(tmp); return *this;}DSA_PublicKey::DSA_PublicKey(Source& source){ Initialize(source);}void DSA_PublicKey::Initialize(Source& source){ DSA_Public_Decoder decoder(source); decoder.Decode(*this);}void DSA_PublicKey::Initialize(const Integer& p, const Integer& q, const Integer& g, const Integer& y){ p_ = p; q_ = q; g_ = g; y_ = y;} const Integer& DSA_PublicKey::GetModulus() const{ return p_;}const Integer& DSA_PublicKey::GetSubGroupOrder() const{ return q_;}const Integer& DSA_PublicKey::GetSubGroupGenerator() const{ return g_;}const Integer& DSA_PublicKey::GetPublicPart() const{ return y_;}void DSA_PublicKey::SetModulus(const Integer& p){ p_ = p;}void DSA_PublicKey::SetSubGroupOrder(const Integer& q){ q_ = q;}void DSA_PublicKey::SetSubGroupGenerator(const Integer& g){ g_ = g;}void DSA_PublicKey::SetPublicPart(const Integer& y){ y_ = y;}word32 DSA_PublicKey::SignatureLength() const{ return GetSubGroupOrder().ByteCount() * 2; // r and s}DSA_PrivateKey::DSA_PrivateKey(Source& source){ Initialize(source);}void DSA_PrivateKey::Initialize(Source& source){ DSA_Private_Decoder decoder(source); decoder.Decode(*this);}void DSA_PrivateKey::Initialize(const Integer& p, const Integer& q, const Integer& g, const Integer& y, const Integer& x){ DSA_PublicKey::Initialize(p, q, g, y); x_ = x;}const Integer& DSA_PrivateKey::GetPrivatePart() const{ return x_;}void DSA_PrivateKey::SetPrivatePart(const Integer& x){ x_ = x;}DSA_Signer::DSA_Signer(const DSA_PrivateKey& key) : key_(key){}word32 DSA_Signer::Sign(const byte* sha_digest, byte* sig, RandomNumberGenerator& rng){ const Integer& p = key_.GetModulus(); const Integer& q = key_.GetSubGroupOrder(); const Integer& g = key_.GetSubGroupGenerator(); const Integer& x = key_.GetPrivatePart(); Integer k(rng, 1, q - 1); r_ = a_exp_b_mod_c(g, k, p); r_ %= q; Integer H(sha_digest, SHA::DIGEST_SIZE); // sha Hash(m) Integer kInv = k.InverseMod(q); s_ = (kInv * (H + x*r_)) % q; assert(!!r_ && !!s_); int rSz = r_.ByteCount(); if (rSz == 19) { sig[0] = 0; sig++; } r_.Encode(sig, rSz); int sSz = s_.ByteCount(); if (sSz == 19) { sig[rSz] = 0; sig++; } s_.Encode(sig + rSz, sSz); return 40;}DSA_Verifier::DSA_Verifier(const DSA_PublicKey& key) : key_(key){}bool DSA_Verifier::Verify(const byte* sha_digest, const byte* sig){ const Integer& p = key_.GetModulus(); const Integer& q = key_.GetSubGroupOrder(); const Integer& g = key_.GetSubGroupGenerator(); const Integer& y = key_.GetPublicPart(); int sz = q.ByteCount(); r_.Decode(sig, sz); s_.Decode(sig + sz, sz); if (r_ >= q || r_ < 1 || s_ >= q || s_ < 1) return false; Integer H(sha_digest, SHA::DIGEST_SIZE); // sha Hash(m) Integer w = s_.InverseMod(q); Integer u1 = (H * w) % q; Integer u2 = (r_ * w) % q; // verify r == ((g^u1 * y^u2) mod p) mod q ModularArithmetic ma(p); Integer v = ma.CascadeExponentiate(g, u1, y, u2); v %= q; return r_ == v;}const Integer& DSA_Signer::GetR() const{ return r_;}const Integer& DSA_Signer::GetS() const{ return s_;}const Integer& DSA_Verifier::GetR() const{ return r_;}const Integer& DSA_Verifier::GetS() const{ return s_;}} // namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -