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 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>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> &mr, <span class="keyword">const</span> <a class="code" href="struct_e_c_p_point.html">ECP::Point</a> &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> &mr, <span class="keyword">const</span> <a class="code" href="struct_e_c_p_point.html">ECP::Point</a> &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> &ecp, <span class="keywordtype">bool</span> convertToMontgomeryRepresentation)00028 {00029 <span class="keywordflow">if</span> (convertToMontgomeryRepresentation && !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> &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> &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> &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> &P, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &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 < 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 & 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> &bt, <span class="keyword">const</span> Point &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 &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> &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> &bt, <span class="keyword">const</span> Point &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 + -
显示快捷键?