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

📄 dsa_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 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&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Compound&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Compound&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;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> &amp;counter,00062                                                   <a class="code" href="class_integer.html">Integer</a> &amp;p, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> L, <a class="code" href="class_integer.html">Integer</a> &amp;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&gt;=0 &amp;&amp; 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 &lt; counterEnd; c++)00093         {00094                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k=0; k&lt;=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&gt;=0 &amp;&amp; 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) &amp;&amp; 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 + -