ecp_8cpp-source.html

来自「Crypto++是一个非常强大的密码学库,主要是功能全」· HTML 代码 · 共 484 行 · 第 1/3 页

HTML
484
字号
<!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++: ecp.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>ecp.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// ecp.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 "ecp.h"</span>00008 <span class="preprocessor">#include "asn.h"</span>00009 <span class="preprocessor">#include "nbtheory.h"</span>00010 00011 <span class="preprocessor">#include "algebra.cpp"</span>00012 00013 NAMESPACE_BEGIN(CryptoPP)00014 00015 ANONYMOUS_NAMESPACE_BEGIN00016 <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="struct_e_c_p_point.html">ECP::Point</a> ToMontgomery(<span class="keyword">const</span> <a class="code" href="class_modular_arithmetic.html">ModularArithmetic</a> &amp;mr, <span class="keyword">const</span> <a class="code" href="struct_e_c_p_point.html">ECP::Point</a> &amp;P)00017 {00018         <span class="keywordflow">return</span> P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo0">identity</a> ? P : <a class="code" href="struct_e_c_p_point.html">ECP::Point</a>(mr.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica10">ConvertIn</a>(P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo1">x</a>), mr.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica10">ConvertIn</a>(P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo2">y</a>));00019 }00020 00021 <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="struct_e_c_p_point.html">ECP::Point</a> FromMontgomery(<span class="keyword">const</span> <a class="code" href="class_modular_arithmetic.html">ModularArithmetic</a> &amp;mr, <span class="keyword">const</span> <a class="code" href="struct_e_c_p_point.html">ECP::Point</a> &amp;P)00022 {00023         <span class="keywordflow">return</span> P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo0">identity</a> ? P : <a class="code" href="struct_e_c_p_point.html">ECP::Point</a>(mr.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica11">ConvertOut</a>(P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo1">x</a>), mr.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica11">ConvertOut</a>(P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo2">y</a>));00024 }00025 NAMESPACE_END00026 00027 ECP::ECP(<span class="keyword">const</span> <a class="code" href="class_e_c_p.html">ECP</a> &amp;ecp, <span class="keywordtype">bool</span> convertToMontgomeryRepresentation)00028 {00029         <span class="keywordflow">if</span> (convertToMontgomeryRepresentation &amp;&amp; !ecp.<a class="code" href="class_e_c_p.html#_e_c_pa26">GetField</a>().<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica9">IsMontgomeryRepresentation</a>())00030         {00031                 m_fieldPtr.reset(<span class="keyword">new</span> <a class="code" href="class_montgomery_representation.html">MontgomeryRepresentation</a>(ecp.<a class="code" href="class_e_c_p.html#_e_c_pa26">GetField</a>().<a class="code" href="class_modular_arithmetic.html#_montgomery_representationa14">GetModulus</a>()));00032                 m_a = GetField().<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica10">ConvertIn</a>(ecp.<a class="code" href="class_e_c_p.html#_e_c_pr1">m_a</a>);00033                 m_b = GetField().ConvertIn(ecp.<a class="code" href="class_e_c_p.html#_e_c_pr2">m_b</a>);00034         }00035         <span class="keywordflow">else</span>00036                 operator=(ecp);00037 }00038 00039 ECP::ECP(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)00040         : m_fieldPtr(new Field(bt))00041 {00042         <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt);00043         GetField().BERDecodeElement(seq, m_a);00044         GetField().BERDecodeElement(seq, m_b);00045         <span class="comment">// skip optional seed</span>00046         <span class="keywordflow">if</span> (!seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera4">EndReached</a>())00047                 BERDecodeOctetString(seq, TheBitBucket());00048         seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();00049 }00050 00051 <span class="keywordtype">void</span> ECP::DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>00052 <span class="keyword"></span>{00053         GetField().<a class="code" href="class_modular_arithmetic.html#_montgomery_representationa11">DEREncode</a>(bt);00054         <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt);00055         GetField().<a class="code" href="class_modular_arithmetic.html#_montgomery_representationa12">DEREncodeElement</a>(seq, m_a);00056         GetField().<a class="code" href="class_modular_arithmetic.html#_montgomery_representationa12">DEREncodeElement</a>(seq, m_b);00057         seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00058 }00059 00060 <span class="keywordtype">bool</span> ECP::DecodePoint(<a class="code" href="struct_e_c_p_point.html">ECP::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>00061 <span class="keyword"></span>{00062         <a class="code" href="class_string_store.html">StringStore</a> store(encodedPoint, encodedPointLen);00063         <span class="keywordflow">return</span> DecodePoint(P, store, encodedPointLen);00064 }00065 00066 <span class="keywordtype">bool</span> ECP::DecodePoint(<a class="code" href="struct_e_c_p_point.html">ECP::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>00067 <span class="keyword"></span>{00068         byte type;00069         <span class="keywordflow">if</span> (encodedPointLen &lt; 1 || !bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(type))00070                 <span class="keywordflow">return</span> <span class="keyword">false</span>;00071 00072         <span class="keywordflow">switch</span> (type)00073         {00074         <span class="keywordflow">case</span> 0:00075                 P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo0">identity</a> = <span class="keyword">true</span>;00076                 <span class="keywordflow">return</span> <span class="keyword">true</span>;00077         <span class="keywordflow">case</span> 2:00078         <span class="keywordflow">case</span> 3:00079         {00080                 <span class="keywordflow">if</span> (encodedPointLen != EncodedPointSize(<span class="keyword">true</span>))00081                         <span class="keywordflow">return</span> <span class="keyword">false</span>;00082 00083                 <a class="code" href="class_integer.html">Integer</a> p = FieldSize();00084 00085                 P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo0">identity</a> = <span class="keyword">false</span>;00086                 P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo1">x</a>.<a class="code" href="class_integer.html#_integerz39_7">Decode</a>(bt, GetField().MaxElementByteLength()); 00087                 P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo2">y</a> = ((P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo1">x</a>*P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo1">x</a>+m_a)*P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo1">x</a>+m_b) % p;00088 00089                 <span class="keywordflow">if</span> (Jacobi(P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo2">y</a>, p) !=1)00090                         <span class="keywordflow">return</span> <span class="keyword">false</span>;00091 00092                 P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo2">y</a> = ModularSquareRoot(P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo2">y</a>, p);00093 00094                 <span class="keywordflow">if</span> ((type &amp; 1) != P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo2">y</a>.<a class="code" href="class_integer.html#_integerz41_5">GetBit</a>(0))00095                         P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo2">y</a> = p-P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo2">y</a>;00096 00097                 <span class="keywordflow">return</span> <span class="keyword">true</span>;00098         }00099         <span class="keywordflow">case</span> 4:00100         {00101                 <span class="keywordflow">if</span> (encodedPointLen != EncodedPointSize(<span class="keyword">false</span>))00102                         <span class="keywordflow">return</span> <span class="keyword">false</span>;00103 00104                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = GetField().<a class="code" href="class_modular_arithmetic.html#_montgomery_representationa41">MaxElementByteLength</a>();00105                 P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo0">identity</a> = <span class="keyword">false</span>;00106                 P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo1">x</a>.<a class="code" href="class_integer.html#_integerz39_7">Decode</a>(bt, len);00107                 P.<a class="code" href="struct_e_c_p_point.html#_e_c_p_pointo2">y</a>.<a class="code" href="class_integer.html#_integerz39_7">Decode</a>(bt, len);00108                 <span class="keywordflow">return</span> <span class="keyword">true</span>;00109         }00110         <span class="keywordflow">default</span>:00111                 <span class="keywordflow">return</span> <span class="keyword">false</span>;00112         }00113 }00114 00115 <span class="keywordtype">void</span> ECP::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>00116 <span class="keyword"></span>{00117         <span class="keywordflow">if</span> (P.identity)00118                 <a class="code" href="class_null_store.html">NullStore</a>().TransferTo(bt, EncodedPointSize(compressed));00119         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (compressed)00120         {00121                 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(2 + P.y.GetBit(0));00122                 P.x.Encode(bt, GetField().MaxElementByteLength());00123         }00124         <span class="keywordflow">else</span>00125         {00126                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = GetField().<a class="code" href="class_modular_arithmetic.html#_montgomery_representationa41">MaxElementByteLength</a>();00127                 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(4);      <span class="comment">// uncompressed</span>00128                 P.x.Encode(bt, len);00129                 P.y.Encode(bt, len);00130         }00131 }00132 00133 <span class="keywordtype">void</span> ECP::EncodePoint(byte *encodedPoint, <span class="keyword">const</span> Point &amp;P, <span class="keywordtype">bool</span> compressed)<span class="keyword"> const</span>00134 <span class="keyword"></span>{00135         <a class="code" href="class_array_sink.html">ArraySink</a> sink(encodedPoint, EncodedPointSize(compressed));00136         EncodePoint(sink, P, compressed);00137         assert(sink.<a class="code" href="class_array_sink.html#_array_xor_sinka4">TotalPutLength</a>() == EncodedPointSize(compressed));00138 }00139 00140 <a class="code" href="struct_e_c_p_point.html">ECP::Point</a> ECP::BERDecodePoint(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>00141 <span class="keyword"></span>{00142         <a class="code" href="class_sec_block.html">SecByteBlock</a> str;00143         BERDecodeOctetString(bt, str);00144         Point P;00145         <span class="keywordflow">if</span> (!DecodePoint(P, str, str.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()))00146                 BERDecodeError();00147         <span class="keywordflow">return</span> P;00148 }00149 00150 <span class="keywordtype">void</span> ECP::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>00151 <span class="keyword"></span>{00152         <a class="code" href="class_sec_block.html">SecByteBlock</a> str(EncodedPointSize(compressed));00153         EncodePoint(str, P, compressed);00154         DEREncodeOctetString(bt, str);00155 }

⌨️ 快捷键说明

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