📄 ec2n_8cpp-source.html
字号:
<a name="l00190"></a><a class="code" href="class_e_c2_n.html#84c0a46b7540a13a0c1ba0d78c50265f">00190</a> <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html" title="Elliptic Curve Point.">EC2N::Point</a>& <a class="code" href="class_e_c2_n.html#84c0a46b7540a13a0c1ba0d78c50265f">EC2N::Add</a>(<span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html" title="Elliptic Curve Point.">Point</a> &P, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html" title="Elliptic Curve Point.">Point</a> &Q)<span class="keyword"> const</span><a name="l00191"></a>00191 <span class="keyword"></span>{<a name="l00192"></a>00192 <span class="keywordflow">if</span> (P.<a class="code" href="struct_e_c2_n_point.html#6ded60d603c7ba5af13c7ba3da253cf7">identity</a>) <span class="keywordflow">return</span> Q;<a name="l00193"></a>00193 <span class="keywordflow">if</span> (Q.<a class="code" href="struct_e_c2_n_point.html#6ded60d603c7ba5af13c7ba3da253cf7">identity</a>) <span class="keywordflow">return</span> P;<a name="l00194"></a>00194 <span class="keywordflow">if</span> (<a class="code" href="class_e_c2_n.html#7488f2612e1fea76b6e74a2be66e9ec3">Equal</a>(P, Q)) <span class="keywordflow">return</span> <a class="code" href="class_e_c2_n.html#3b540c5596793305eaf8fe834235b03b">Double</a>(P);<a name="l00195"></a>00195 <span class="keywordflow">if</span> (m_field->Equal(P.x, Q.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>) && m_field->Equal(P.y, m_field->Add(Q.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>, Q.<a class="code" href="struct_e_c2_n_point.html#0ef74f2187b87841db0c36fef978f387">y</a>))) <span class="keywordflow">return</span> <a class="code" href="class_e_c2_n.html#57b7b1ad3cc32c727d1d132ca2f2210f">Identity</a>();<a name="l00196"></a>00196 <a name="l00197"></a>00197 <a class="code" href="class_e_c2_n.html#e03206f65d1a99b107de72c7d86704c2">FieldElement</a> t = m_field->Add(P.y, Q.<a class="code" href="struct_e_c2_n_point.html#0ef74f2187b87841db0c36fef978f387">y</a>);<a name="l00198"></a>00198 t = m_field->Divide(t, m_field->Add(P.x, Q.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>));<a name="l00199"></a>00199 <a class="code" href="class_e_c2_n.html#e03206f65d1a99b107de72c7d86704c2">FieldElement</a> x = m_field->Square(t);<a name="l00200"></a>00200 m_field->Accumulate(x, t);<a name="l00201"></a>00201 m_field->Accumulate(x, Q.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>);<a name="l00202"></a>00202 m_field->Accumulate(x, m_a);<a name="l00203"></a>00203 m_R.<a class="code" href="struct_e_c2_n_point.html#0ef74f2187b87841db0c36fef978f387">y</a> = m_field->Add(P.y, m_field->Multiply(t, x));<a name="l00204"></a>00204 m_field->Accumulate(x, P.x);<a name="l00205"></a>00205 m_field->Accumulate(m_R.<a class="code" href="struct_e_c2_n_point.html#0ef74f2187b87841db0c36fef978f387">y</a>, x);<a name="l00206"></a>00206 <a name="l00207"></a>00207 m_R.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>.<a class="code" href="class_polynomial_mod2.html#21587324d54a4ae453960770b18c398d">swap</a>(x);<a name="l00208"></a>00208 m_R.<a class="code" href="struct_e_c2_n_point.html#6ded60d603c7ba5af13c7ba3da253cf7">identity</a> = <span class="keyword">false</span>;<a name="l00209"></a>00209 <span class="keywordflow">return</span> m_R;<a name="l00210"></a>00210 }<a name="l00211"></a>00211 <a name="l00212"></a><a class="code" href="class_e_c2_n.html#3b540c5596793305eaf8fe834235b03b">00212</a> <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html" title="Elliptic Curve Point.">EC2N::Point</a>& <a class="code" href="class_e_c2_n.html#3b540c5596793305eaf8fe834235b03b">EC2N::Double</a>(<span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html" title="Elliptic Curve Point.">Point</a> &P)<span class="keyword"> const</span><a name="l00213"></a>00213 <span class="keyword"></span>{<a name="l00214"></a>00214 <span class="keywordflow">if</span> (P.<a class="code" href="struct_e_c2_n_point.html#6ded60d603c7ba5af13c7ba3da253cf7">identity</a>) <span class="keywordflow">return</span> P;<a name="l00215"></a>00215 <span class="keywordflow">if</span> (!m_field->IsUnit(P.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>)) <span class="keywordflow">return</span> <a class="code" href="class_e_c2_n.html#57b7b1ad3cc32c727d1d132ca2f2210f">Identity</a>();<a name="l00216"></a>00216 <a name="l00217"></a>00217 <a class="code" href="class_e_c2_n.html#e03206f65d1a99b107de72c7d86704c2">FieldElement</a> t = m_field->Divide(P.<a class="code" href="struct_e_c2_n_point.html#0ef74f2187b87841db0c36fef978f387">y</a>, P.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>);<a name="l00218"></a>00218 m_field->Accumulate(t, P.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>);<a name="l00219"></a>00219 m_R.<a class="code" href="struct_e_c2_n_point.html#0ef74f2187b87841db0c36fef978f387">y</a> = m_field->Square(P.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>);<a name="l00220"></a>00220 m_R.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a> = m_field->Square(t);<a name="l00221"></a>00221 m_field->Accumulate(m_R.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>, t);<a name="l00222"></a>00222 m_field->Accumulate(m_R.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>, m_a);<a name="l00223"></a>00223 m_field->Accumulate(m_R.<a class="code" href="struct_e_c2_n_point.html#0ef74f2187b87841db0c36fef978f387">y</a>, m_field->Multiply(t, m_R.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>));<a name="l00224"></a>00224 m_field->Accumulate(m_R.<a class="code" href="struct_e_c2_n_point.html#0ef74f2187b87841db0c36fef978f387">y</a>, m_R.<a class="code" href="struct_e_c2_n_point.html#b90a3edb6b82f616b6a281315289c574">x</a>);<a name="l00225"></a>00225 <a name="l00226"></a>00226 m_R.<a class="code" href="struct_e_c2_n_point.html#6ded60d603c7ba5af13c7ba3da253cf7">identity</a> = <span class="keyword">false</span>;<a name="l00227"></a>00227 <span class="keywordflow">return</span> m_R;<a name="l00228"></a>00228 }<a name="l00229"></a>00229 <a name="l00230"></a>00230 <span class="comment">// ********************************************************</span><a name="l00231"></a>00231 <a name="l00232"></a>00232 <span class="comment">/*</span><a name="l00233"></a>00233 <span class="comment">EcPrecomputation<EC2N>& EcPrecomputation<EC2N>::operator=(const EcPrecomputation<EC2N> &rhs)</span><a name="l00234"></a>00234 <span class="comment">{</span><a name="l00235"></a>00235 <span class="comment"> m_ec = rhs.m_ec;</span><a name="l00236"></a>00236 <span class="comment"> m_ep = rhs.m_ep;</span><a name="l00237"></a>00237 <span class="comment"> m_ep.m_group = m_ec.get();</span><a name="l00238"></a>00238 <span class="comment"> return *this;</span><a name="l00239"></a>00239 <span class="comment">}</span><a name="l00240"></a>00240 <span class="comment"></span><a name="l00241"></a>00241 <span class="comment">void EcPrecomputation<EC2N>::SetCurveAndBase(const EC2N &ec, const EC2N::Point &base)</span><a name="l00242"></a>00242 <span class="comment">{</span><a name="l00243"></a>00243 <span class="comment"> m_ec.reset(new EC2N(ec));</span><a name="l00244"></a>00244 <span class="comment"> m_ep.SetGroupAndBase(*m_ec, base);</span><a name="l00245"></a>00245 <span class="comment">}</span><a name="l00246"></a>00246 <span class="comment"></span><a name="l00247"></a>00247 <span class="comment">void EcPrecomputation<EC2N>::Precompute(unsigned int maxExpBits, unsigned int storage)</span><a name="l00248"></a>00248 <span class="comment">{</span><a name="l00249"></a>00249 <span class="comment"> m_ep.Precompute(maxExpBits, storage);</span><a name="l00250"></a>00250 <span class="comment">}</span><a name="l00251"></a>00251 <span class="comment"></span><a name="l00252"></a>00252 <span class="comment">void EcPrecomputation<EC2N>::Load(BufferedTransformation &bt)</span><a name="l00253"></a>00253 <span class="comment">{</span><a name="l00254"></a>00254 <span class="comment"> BERSequenceDecoder seq(bt);</span><a name="l00255"></a>00255 <span class="comment"> word32 version;</span><a name="l00256"></a>00256 <span class="comment"> BERDecodeUnsigned<word32>(seq, version, INTEGER, 1, 1);</span><a name="l00257"></a>00257 <span class="comment"> m_ep.m_exponentBase.BERDecode(seq);</span><a name="l00258"></a>00258 <span class="comment"> m_ep.m_windowSize = m_ep.m_exponentBase.BitCount() - 1;</span><a name="l00259"></a>00259 <span class="comment"> m_ep.m_bases.clear();</span><a name="l00260"></a>00260 <span class="comment"> while (!seq.EndReached())</span><a name="l00261"></a>00261 <span class="comment"> m_ep.m_bases.push_back(m_ec->BERDecodePoint(seq));</span><a name="l00262"></a>00262 <span class="comment"> seq.MessageEnd();</span><a name="l00263"></a>00263 <span class="comment">}</span><a name="l00264"></a>00264 <span class="comment"></span><a name="l00265"></a>00265 <span class="comment">void EcPrecomputation<EC2N>::Save(BufferedTransformation &bt) const</span><a name="l00266"></a>00266 <span class="comment">{</span><a name="l00267"></a>00267 <span class="comment"> DERSequenceEncoder seq(bt);</span><a name="l00268"></a>00268 <span class="comment"> DEREncodeUnsigned<word32>(seq, 1); // version</span><a name="l00269"></a>00269 <span class="comment"> m_ep.m_exponentBase.DEREncode(seq);</span><a name="l00270"></a>00270 <span class="comment"> for (unsigned i=0; i<m_ep.m_bases.size(); i++)</span><a name="l00271"></a>00271 <span class="comment"> m_ec->DEREncodePoint(seq, m_ep.m_bases[i]);</span><a name="l00272"></a>00272 <span class="comment"> seq.MessageEnd();</span><a name="l00273"></a>00273 <span class="comment">}</span><a name="l00274"></a>00274 <span class="comment"></span><a name="l00275"></a>00275 <span class="comment">EC2N::Point EcPrecomputation<EC2N>::Exponentiate(const Integer &exponent) const</span><a name="l00276"></a>00276 <span class="comment">{</span><a name="l00277"></a>00277 <span class="comment"> return m_ep.Exponentiate(exponent);</span><a name="l00278"></a>00278 <span class="comment">}</span><a name="l00279"></a>00279 <span class="comment"></span><a name="l00280"></a>00280 <span class="comment">EC2N::Point EcPrecomputation<EC2N>::CascadeExponentiate(const Integer &exponent, const DL_FixedBasePrecomputation<Element> &pc2, const Integer &exponent2) const</span><a name="l00281"></a>00281 <span class="comment">{</span><a name="l00282"></a>00282 <span class="comment"> return m_ep.CascadeExponentiate(exponent, static_cast<const EcPrecomputation<EC2N> &>(pc2).m_ep, exponent2);</span><a name="l00283"></a>00283 <span class="comment">}</span><a name="l00284"></a>00284 <span class="comment">*/</span><a name="l00285"></a>00285 <a name="l00286"></a>00286 NAMESPACE_END<a name="l00287"></a>00287 <a name="l00288"></a>00288 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Fri Jun 1 11:11:20 2007 for Crypto++ by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -