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

📄 ec2n_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!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++: ec2n.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>ec2n.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// ec2n.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 "ec2n.h"</span>00008 <span class="preprocessor">#include "asn.h"</span>00009 00010 <span class="preprocessor">#include "algebra.cpp"</span>00011 <span class="preprocessor">#include "eprecomp.cpp"</span>00012 00013 NAMESPACE_BEGIN(CryptoPP)00014 00015 EC2N::EC2N(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)00016         : m_field(BERDecodeGF2NP(bt))00017 {00018         <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt);00019         m_field-&gt;BERDecodeElement(seq, m_a);00020         m_field-&gt;BERDecodeElement(seq, m_b);00021         <span class="comment">// skip optional seed</span>00022         <span class="keywordflow">if</span> (!seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera4">EndReached</a>())00023                 BERDecodeOctetString(seq, TheBitBucket());00024         seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();00025 }00026 00027 <span class="keywordtype">void</span> EC2N::DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>00028 <span class="keyword"></span>{00029         m_field-&gt;DEREncode(bt);00030         <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt);00031         m_field-&gt;DEREncodeElement(seq, m_a);00032         m_field-&gt;DEREncodeElement(seq, m_b);00033         seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00034 }00035 00036 <span class="keywordtype">bool</span> EC2N::DecodePoint(<a class="code" href="struct_e_c2_n_point.html">EC2N::Point</a> &amp;P, <span class="keyword">const</span> byte *encodedPoint, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> encodedPointLen)<span class="keyword"> const</span>00037 <span class="keyword"></span>{00038         <a class="code" href="class_string_store.html">StringStore</a> store(encodedPoint, encodedPointLen);00039         <span class="keywordflow">return</span> DecodePoint(P, store, encodedPointLen);00040 }00041 00042 <span class="keywordtype">bool</span> EC2N::DecodePoint(<a class="code" href="struct_e_c2_n_point.html">EC2N::Point</a> &amp;P, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> encodedPointLen)<span class="keyword"> const</span>00043 <span class="keyword"></span>{00044         byte type;00045         <span class="keywordflow">if</span> (encodedPointLen &lt; 1 || !bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(type))00046                 <span class="keywordflow">return</span> <span class="keyword">false</span>;00047 00048         <span class="keywordflow">switch</span> (type)00049         {00050         <span class="keywordflow">case</span> 0:00051                 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo0">identity</a> = <span class="keyword">true</span>;00052                 <span class="keywordflow">return</span> <span class="keyword">true</span>;00053         <span class="keywordflow">case</span> 2:00054         <span class="keywordflow">case</span> 3:00055         {00056                 <span class="keywordflow">if</span> (encodedPointLen != EncodedPointSize(<span class="keyword">true</span>))00057                         <span class="keywordflow">return</span> <span class="keyword">false</span>;00058 00059                 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo0">identity</a> = <span class="keyword">false</span>;00060                 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_3">Decode</a>(bt, m_field-&gt;MaxElementByteLength()); 00061 00062                 <span class="keywordflow">if</span> (P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_9">IsZero</a>())00063                 {00064                         P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a> = m_field-&gt;SquareRoot(m_b);00065                         <span class="keywordflow">return</span> <span class="keyword">true</span>;00066                 }00067 00068                 FieldElement z = m_field-&gt;Square(P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>);00069                 assert(P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a> == m_field-&gt;SquareRoot(z));00070                 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a> = m_field-&gt;Divide(m_field-&gt;Add(m_field-&gt;Multiply(z, m_field-&gt;Add(P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>, m_a)), m_b), z);00071                 assert(P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a> == m_field-&gt;Subtract(m_field-&gt;Divide(m_field-&gt;Subtract(m_field-&gt;Multiply(P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a>, z), m_b), z), m_a));00072                 z = m_field-&gt;SolveQuadraticEquation(P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a>);00073                 assert(m_field-&gt;Add(m_field-&gt;Square(z), z) == P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a>);00074                 z.SetCoefficient(0, type &amp; 1);00075 00076                 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a> = m_field-&gt;Multiply(z, P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>);00077                 <span class="keywordflow">return</span> <span class="keyword">true</span>;00078         }00079         <span class="keywordflow">case</span> 4:00080         {00081                 <span class="keywordflow">if</span> (encodedPointLen != EncodedPointSize(<span class="keyword">false</span>))00082                         <span class="keywordflow">return</span> <span class="keyword">false</span>;00083 00084                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = m_field-&gt;MaxElementByteLength();00085                 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo0">identity</a> = <span class="keyword">false</span>;00086                 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_3">Decode</a>(bt, len);00087                 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a>.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_3">Decode</a>(bt, len);00088                 <span class="keywordflow">return</span> <span class="keyword">true</span>;00089         }00090         <span class="keywordflow">default</span>:00091                 <span class="keywordflow">return</span> <span class="keyword">false</span>;00092         }00093 }00094 00095 <span class="keywordtype">void</span> EC2N::EncodePoint(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keyword">const</span> Point &amp;P, <span class="keywordtype">bool</span> compressed)<span class="keyword"> const</span>00096 <span class="keyword"></span>{00097         <span class="keywordflow">if</span> (P.identity)00098                 <a class="code" href="class_null_store.html">NullStore</a>().TransferTo(bt, EncodedPointSize(compressed));00099         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (compressed)00100         {00101                 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(2 + (!P.x ? 0 : m_field-&gt;Divide(P.y, P.x).GetBit(0)));00102                 P.x.Encode(bt, m_field-&gt;MaxElementByteLength());00103         }00104         <span class="keywordflow">else</span>00105         {00106                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = m_field-&gt;MaxElementByteLength();00107                 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(4);      <span class="comment">// uncompressed</span>00108                 P.x.Encode(bt, len);00109                 P.y.Encode(bt, len);00110         }00111 }00112 00113 <span class="keywordtype">void</span> EC2N::EncodePoint(byte *encodedPoint, <span class="keyword">const</span> Point &amp;P, <span class="keywordtype">bool</span> compressed)<span class="keyword"> const</span>00114 <span class="keyword"></span>{00115         <a class="code" href="class_array_sink.html">ArraySink</a> sink(encodedPoint, EncodedPointSize(compressed));00116         EncodePoint(sink, P, compressed);00117         assert(sink.<a class="code" href="class_array_sink.html#_array_xor_sinka4">TotalPutLength</a>() == EncodedPointSize(compressed));00118 }00119 00120 <a class="code" href="struct_e_c2_n_point.html">EC2N::Point</a> EC2N::BERDecodePoint(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>00121 <span class="keyword"></span>{00122         <a class="code" href="class_sec_block.html">SecByteBlock</a> str;00123         BERDecodeOctetString(bt, str);00124         Point P;00125         <span class="keywordflow">if</span> (!DecodePoint(P, str, str.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()))00126                 BERDecodeError();00127         <span class="keywordflow">return</span> P;00128 }00129 00130 <span class="keywordtype">void</span> EC2N::DEREncodePoint(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keyword">const</span> Point &amp;P, <span class="keywordtype">bool</span> compressed)<span class="keyword"> const</span>00131 <span class="keyword"></span>{00132         <a class="code" href="class_sec_block.html">SecByteBlock</a> str(EncodedPointSize(compressed));00133         EncodePoint(str, P, compressed);00134         DEREncodeOctetString(bt, str);00135 }00136 00137 <span class="keywordtype">bool</span> EC2N::ValidateParameters(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level)<span class="keyword"> const</span>00138 <span class="keyword"></span>{00139         <span class="keywordtype">bool</span> pass = !!m_b;00140         pass = pass &amp;&amp; m_a.CoefficientCount() &lt;= m_field-&gt;MaxElementBitLength();00141         pass = pass &amp;&amp; m_b.CoefficientCount() &lt;= m_field-&gt;MaxElementBitLength();00142 00143         <span class="keywordflow">if</span> (level &gt;= 1)00144                 pass = pass &amp;&amp; m_field-&gt;GetModulus().IsIrreducible();00145                 

⌨️ 快捷键说明

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