⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsa.cpp

📁 这是linux下运行的mysql软件包,可用于linux 下安装 php + mysql + apach 的网络配置
💻 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 + -