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

📄 eccrypto_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<!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++: eccrypto.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>eccrypto.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// eccrypto.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="eccrypto_8h.html">eccrypto.h</a>"</span>00008 <span class="preprocessor">#include "nbtheory.h"</span>00009 <span class="preprocessor">#include "oids.h"</span>00010 <span class="preprocessor">#include "hex.h"</span>00011 <span class="preprocessor">#include "argnames.h"</span>00012 <span class="preprocessor">#include "ec2n.h"</span>00013 00014 NAMESPACE_BEGIN(CryptoPP)00015 00016 #ifndef NDEBUG00017 <span class="keyword">static</span> <span class="keywordtype">void</span> ECDSA_TestInstantiations()00018 {00019         <a class="code" href="struct_e_c_d_s_a.html">ECDSA&lt;EC2N&gt;</a>::Signer t1;00020         <a class="code" href="struct_e_c_d_s_a.html">ECDSA&lt;EC2N&gt;</a>::Verifier t2(t1);00021         <a class="code" href="struct_e_c_n_r.html">ECNR&lt;ECP&gt;</a>::Signer t3;00022         <a class="code" href="struct_e_c_n_r.html">ECNR&lt;ECP&gt;</a>::Verifier t4(t3);00023         <a class="code" href="struct_e_c_i_e_s.html">ECIES&lt;ECP&gt;</a>::Encryptor t5;00024         <a class="code" href="struct_e_c_i_e_s.html">ECIES&lt;EC2N&gt;</a>::Decryptor t6;00025         <a class="code" href="struct_e_c_d_h.html">ECDH&lt;ECP&gt;</a>::Domain t7;00026         <a class="code" href="struct_e_c_m_q_v.html">ECMQV&lt;ECP&gt;</a>::Domain t8;00027 }00028 <span class="preprocessor">#endif</span>00029 <span class="preprocessor"></span>00030 <span class="comment">// VC60 workaround: complains when these functions are put into an anonymous namespace</span>00031 <span class="keyword">static</span> <a class="code" href="class_integer.html">Integer</a> ConvertToInteger(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &amp;x)00032 {00033         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> l = x.ByteCount();00034         <a class="code" href="class_sec_block.html">SecByteBlock</a> temp(l);00035         x.Encode(temp, l);00036         <span class="keywordflow">return</span> <a class="code" href="class_integer.html">Integer</a>(temp, l);00037 }00038 00039 <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="class_integer.html">Integer</a> ConvertToInteger(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;x)00040 {00041         <span class="keywordflow">return</span> x;00042 }00043 00044 <span class="keyword">static</span> <span class="keywordtype">bool</span> CheckMOVCondition(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;q, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;r)00045 {00046         <a class="code" href="class_integer.html">Integer</a> t=1;00047         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n=q.<a class="code" href="class_integer.html#_integerz41_2">BitCount</a>(), m=r.<a class="code" href="class_integer.html#_integerz41_2">BitCount</a>();00048 00049         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=n; DiscreteLogWorkFactor(i)&lt;m/2; i+=n)00050         {00051                 t = (t*q)%r;00052                 <span class="keywordflow">if</span> (t == 1)00053                         <span class="keywordflow">return</span> <span class="keyword">false</span>;00054         }00055         <span class="keywordflow">return</span> <span class="keyword">true</span>;00056 }00057 00058 <span class="comment">// ******************************************************************</span>00059 00060 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">struct </span>EcRecommendedParameters;00061 00062 <span class="keyword">template</span>&lt;&gt; <span class="keyword">struct </span>EcRecommendedParameters&lt;EC2N&gt;00063 {00064         EcRecommendedParameters(<span class="keyword">const</span> <a class="code" href="class_o_i_d.html">OID</a> &amp;oid, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t2, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t3, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t4, <span class="keyword">const</span> <span class="keywordtype">char</span> *a, <span class="keyword">const</span> <span class="keywordtype">char</span> *b, <span class="keyword">const</span> <span class="keywordtype">char</span> *g, <span class="keyword">const</span> <span class="keywordtype">char</span> *n, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> h)00065                 : oid(oid), t0(0), t1(0), t2(t2), t3(t3), t4(t4), a(a), b(b), g(g), n(n), h(h) {}00066         EcRecommendedParameters(<span class="keyword">const</span> <a class="code" href="class_o_i_d.html">OID</a> &amp;oid, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t1, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t2, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t3, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t4, <span class="keyword">const</span> <span class="keywordtype">char</span> *a, <span class="keyword">const</span> <span class="keywordtype">char</span> *b, <span class="keyword">const</span> <span class="keywordtype">char</span> *g, <span class="keyword">const</span> <span class="keywordtype">char</span> *n, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> h)00067                 : oid(oid), t0(t0), t1(t1), t2(t2), t3(t3), t4(t4), a(a), b(b), g(g), n(n), h(h) {}00068         EC2N *NewEC()<span class="keyword"> const</span>00069 <span class="keyword">        </span>{00070                 <a class="code" href="class_string_source.html">StringSource</a> ssA(a, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html">HexDecoder</a>);00071                 <a class="code" href="class_string_source.html">StringSource</a> ssB(b, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html">HexDecoder</a>);00072                 <span class="keywordflow">if</span> (t0 == 0)00073                         <span class="keywordflow">return</span> <span class="keyword">new</span> EC2N(<a class="code" href="class_g_f2_n_t.html">GF2NT</a>(t2, t3, t4), EC2N::FieldElement(ssA, ssA.MaxRetrievable()), EC2N::FieldElement(ssB, ssB.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_0">MaxRetrievable</a>()));00074                 <span class="keywordflow">else</span>00075                         <span class="keywordflow">return</span> <span class="keyword">new</span> EC2N(<a class="code" href="class_g_f2_n_p_p.html">GF2NPP</a>(t0, t1, t2, t3, t4), EC2N::FieldElement(ssA, ssA.MaxRetrievable()), EC2N::FieldElement(ssB, ssB.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_0">MaxRetrievable</a>()));00076         };00077 00078         <a class="code" href="class_o_i_d.html">OID</a> oid;00079         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t0, t1, t2, t3, t4;00080         <span class="keyword">const</span> <span class="keywordtype">char</span> *a, *b, *g, *n;00081         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> h;00082 };00083 00084 <span class="keyword">template</span>&lt;&gt; <span class="keyword">struct </span>EcRecommendedParameters&lt;ECP&gt;00085 {00086         EcRecommendedParameters(<span class="keyword">const</span> <a class="code" href="class_o_i_d.html">OID</a> &amp;oid, <span class="keyword">const</span> <span class="keywordtype">char</span> *p, <span class="keyword">const</span> <span class="keywordtype">char</span> *a, <span class="keyword">const</span> <span class="keywordtype">char</span> *b, <span class="keyword">const</span> <span class="keywordtype">char</span> *g, <span class="keyword">const</span> <span class="keywordtype">char</span> *n, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> h)00087                 : oid(oid), p(p), a(a), b(b), g(g), n(n), h(h) {}00088         ECP *NewEC()<span class="keyword"> const</span>00089 <span class="keyword">        </span>{00090                 <a class="code" href="class_string_source.html">StringSource</a> ssP(p, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html">HexDecoder</a>);00091                 <a class="code" href="class_string_source.html">StringSource</a> ssA(a, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html">HexDecoder</a>);00092                 <a class="code" href="class_string_source.html">StringSource</a> ssB(b, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html">HexDecoder</a>);00093                 <span class="keywordflow">return</span> <span class="keyword">new</span> ECP(<a class="code" href="class_integer.html">Integer</a>(ssP, ssP.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_0">MaxRetrievable</a>()), <a class="code" href="class_integer.html">ECP::FieldElement</a>(ssA, ssA.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_0">MaxRetrievable</a>()), <a class="code" href="class_integer.html">ECP::FieldElement</a>(ssB, ssB.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_0">MaxRetrievable</a>()));00094         };00095 00096         <a class="code" href="class_o_i_d.html">OID</a> oid;00097         <span class="keyword">const</span> <span class="keywordtype">char</span> *p;00098         <span class="keyword">const</span> <span class="keywordtype">char</span> *a, *b, *g, *n;00099         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> h;00100 };00101 00102 <span class="keyword">struct </span>OIDLessThan00103 {00104         <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;00105         <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> EcRecommendedParameters&lt;T&gt;&amp; a, <span class="keyword">const</span> <a class="code" href="class_o_i_d.html">OID</a>&amp; b) {<span class="keywordflow">return</span> a.oid &lt; b;}00106         <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;00107         <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <a class="code" href="class_o_i_d.html">OID</a>&amp; a, <span class="keyword">const</span> EcRecommendedParameters&lt;T&gt;&amp; b) {<span class="keywordflow">return</span> a &lt; b.oid;}00108 };00109 00110 <span class="keyword">static</span> <span class="keywordtype">void</span> GetRecommendedParameters(<span class="keyword">const</span> EcRecommendedParameters&lt;EC2N&gt; *&amp;begin, <span class="keyword">const</span> EcRecommendedParameters&lt;EC2N&gt; *&amp;end)00111 {00112         <span class="comment">// this array must be sorted by OID</span>00113         <span class="keyword">static</span> <span class="keyword">const</span> EcRecommendedParameters&lt;EC2N&gt; rec[] = {00114                 EcRecommendedParameters&lt;EC2N&gt;(ASN1::sect163k1(), 00115                         163, 7, 6, 3, 0,00116                         <span class="stringliteral">"000000000000000000000000000000000000000001"</span>,00117                         <span class="stringliteral">"000000000000000000000000000000000000000001"</span>,00118                         <span class="stringliteral">"0402FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE80289070FB05D38FF58321F2E800536D538CCDAA3D9"</span>,00119                         <span class="stringliteral">"04000000000000000000020108A2E0CC0D99F8A5EF"</span>,00120                         2),00121                 EcRecommendedParameters&lt;EC2N&gt;(ASN1::sect163r1(), 00122                         163, 7, 6, 3, 0,00123                         <span class="stringliteral">"07B6882CAAEFA84F9554FF8428BD88E246D2782AE2"</span>,00124                         <span class="stringliteral">"0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9"</span>,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -