📄 dsa_8cpp-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Crypto++: dsa.cpp Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.2 --><div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Compound List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Compound Members</a> | <a class="qindex" href="globals.html">File Members</a></div><h1>dsa.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// dsa.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="preprocessor">#include "pch.h"</span>00004 00005 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span>00006 <span class="preprocessor"></span>00007 <span class="preprocessor">#include "<a class="code" href="dsa_8h.html">dsa.h</a>"</span>00008 <span class="preprocessor">#include "nbtheory.h"</span>00009 00010 NAMESPACE_BEGIN(CryptoPP)00011 00012 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DSAConvertSignatureFormat(byte *buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferSize, DSASignatureFormat toFormat, <span class="keyword">const</span> byte *signature, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> signatureLen, DSASignatureFormat fromFormat)00013 {00014 <a class="code" href="class_integer.html">Integer</a> r, s;00015 <a class="code" href="class_string_store.html">StringStore</a> store(signature, signatureLen);00016 <a class="code" href="class_array_sink.html">ArraySink</a> sink(buffer, bufferSize);00017 00018 <span class="keywordflow">switch</span> (fromFormat)00019 {00020 <span class="keywordflow">case</span> DSA_P1363:00021 r.<a class="code" href="class_integer.html#_integerz39_7">Decode</a>(store, signatureLen/2);00022 s.<a class="code" href="class_integer.html#_integerz39_7">Decode</a>(store, signatureLen/2);00023 <span class="keywordflow">break</span>;00024 <span class="keywordflow">case</span> DSA_DER:00025 {00026 <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(store);00027 r.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00028 s.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00029 seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();00030 <span class="keywordflow">break</span>;00031 }00032 <span class="keywordflow">case</span> DSA_OPENPGP:00033 r.<a class="code" href="class_integer.html#_integerz39_12">OpenPGPDecode</a>(store);00034 s.<a class="code" href="class_integer.html#_integerz39_12">OpenPGPDecode</a>(store);00035 <span class="keywordflow">break</span>;00036 }00037 00038 <span class="keywordflow">switch</span> (toFormat)00039 {00040 <span class="keywordflow">case</span> DSA_P1363:00041 r.<a class="code" href="class_integer.html#_integerz39_1">Encode</a>(sink, bufferSize/2);00042 s.<a class="code" href="class_integer.html#_integerz39_1">Encode</a>(sink, bufferSize/2);00043 <span class="keywordflow">break</span>;00044 <span class="keywordflow">case</span> DSA_DER:00045 {00046 <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(sink);00047 r.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00048 s.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00049 seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00050 <span class="keywordflow">break</span>;00051 }00052 <span class="keywordflow">case</span> DSA_OPENPGP:00053 r.<a class="code" href="class_integer.html#_integerz39_5">OpenPGPEncode</a>(sink);00054 s.<a class="code" href="class_integer.html#_integerz39_5">OpenPGPEncode</a>(sink);00055 <span class="keywordflow">break</span>;00056 }00057 00058 <span class="keywordflow">return</span> sink.<a class="code" href="class_array_sink.html#_array_xor_sinka4">TotalPutLength</a>();00059 }00060 <a name="l00061"></a><a class="code" href="struct_d_s_a.html#_d_s_ae1">00061</a> <span class="keywordtype">bool</span> <a class="code" href="struct_d_s_a.html#_d_s_ae1">DSA::GeneratePrimes</a>(<span class="keyword">const</span> byte *seedIn, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> g, <span class="keywordtype">int</span> &counter,00062 <a class="code" href="class_integer.html">Integer</a> &p, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> L, <a class="code" href="class_integer.html">Integer</a> &q, <span class="keywordtype">bool</span> useInputCounterValue)00063 {00064 assert(g%8 == 0);00065 00066 <a class="code" href="class_s_h_a.html">SHA</a> sha;00067 <a class="code" href="class_sec_block.html">SecByteBlock</a> seed(seedIn, g/8);00068 <a class="code" href="class_sec_block.html">SecByteBlock</a> U(SHA::DIGESTSIZE);00069 <a class="code" href="class_sec_block.html">SecByteBlock</a> temp(SHA::DIGESTSIZE);00070 <a class="code" href="class_sec_block.html">SecByteBlock</a> W(((L-1)/160+1) * SHA::DIGESTSIZE);00071 <span class="keyword">const</span> <span class="keywordtype">int</span> n = (L-1) / 160;00072 <span class="keyword">const</span> <span class="keywordtype">int</span> b = (L-1) % 160;00073 <a class="code" href="class_integer.html">Integer</a> X;00074 00075 sha.<a class="code" href="class_hash_transformation.html#_x_m_a_c_c___basea14">CalculateDigest</a>(U, seed, g/8);00076 00077 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=g/8-1, carry=<span class="keyword">true</span>; i>=0 && carry; i--)00078 carry=!++seed[i];00079 00080 sha.<a class="code" href="class_hash_transformation.html#_x_m_a_c_c___basea14">CalculateDigest</a>(temp, seed, g/8);00081 xorbuf(U, temp, SHA::DIGESTSIZE);00082 00083 U[0] |= 0x80;00084 U[SHA::DIGESTSIZE-1] |= 1;00085 q.<a class="code" href="class_integer.html#_integerz39_7">Decode</a>(U, SHA::DIGESTSIZE);00086 00087 <span class="keywordflow">if</span> (!IsPrime(q))00088 <span class="keywordflow">return</span> <span class="keyword">false</span>;00089 00090 <span class="keywordtype">int</span> counterEnd = useInputCounterValue ? counter+1 : 4096;00091 00092 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c = 0; c < counterEnd; c++)00093 {00094 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k=0; k<=n; k++)00095 {00096 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=g/8-1, carry=<span class="keyword">true</span>; i>=0 && carry; i--)00097 carry=!++seed[i];00098 <span class="keywordflow">if</span> (!useInputCounterValue || c == counter)00099 sha.<a class="code" href="class_hash_transformation.html#_x_m_a_c_c___basea14">CalculateDigest</a>(W+(n-k)*SHA::DIGESTSIZE, seed, g/8);00100 }00101 <span class="keywordflow">if</span> (!useInputCounterValue || c == counter)00102 {00103 W[SHA::DIGESTSIZE - 1 - b/8] |= 0x80;00104 X.<a class="code" href="class_integer.html#_integerz39_7">Decode</a>(W + SHA::DIGESTSIZE - 1 - b/8, L/8);00105 p = X-((X % (2*q))-1);00106 00107 <span class="keywordflow">if</span> (p.<a class="code" href="class_integer.html#_integerz41_5">GetBit</a>(L-1) && IsPrime(p))00108 {00109 counter = c;00110 <span class="keywordflow">return</span> <span class="keyword">true</span>;00111 }00112 }00113 }00114 <span class="keywordflow">return</span> <span class="keyword">false</span>;00115 }00116 00117 NAMESPACE_END00118 00119 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:12 2003 for Crypto++ by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -