📄 ec2n_8cpp-source.html
字号:
00146 <span class="keywordflow">return</span> pass;00147 }00148 00149 <span class="keywordtype">bool</span> EC2N::VerifyPoint(<span class="keyword">const</span> Point &P)<span class="keyword"> const</span>00150 <span class="keyword"></span>{00151 <span class="keyword">const</span> FieldElement &x = P.x, &y = P.y;00152 <span class="keywordflow">return</span> P.identity || 00153 (x.CoefficientCount() <= m_field->MaxElementBitLength()00154 && y.CoefficientCount() <= m_field->MaxElementBitLength()00155 && !(((x+m_a)*x*x+m_b-(x+y)*y)%m_field->GetModulus()));00156 }00157 00158 <span class="keywordtype">bool</span> EC2N::Equal(<span class="keyword">const</span> Point &P, <span class="keyword">const</span> Point &Q)<span class="keyword"> const</span>00159 <span class="keyword"></span>{00160 <span class="keywordflow">if</span> (P.identity && Q.identity)00161 <span class="keywordflow">return</span> <span class="keyword">true</span>;00162 00163 <span class="keywordflow">if</span> (P.identity && !Q.identity)00164 <span class="keywordflow">return</span> <span class="keyword">false</span>;00165 00166 <span class="keywordflow">if</span> (!P.identity && Q.identity)00167 <span class="keywordflow">return</span> <span class="keyword">false</span>;00168 00169 <span class="keywordflow">return</span> (m_field->Equal(P.x,Q.x) && m_field->Equal(P.y,Q.y));00170 }00171 00172 <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">EC2N::Point</a>& EC2N::Identity()<span class="keyword"> const</span>00173 <span class="keyword"></span>{00174 <span class="keyword">static</span> <span class="keyword">const</span> Point zero;00175 <span class="keywordflow">return</span> zero;00176 }00177 00178 <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">EC2N::Point</a>& EC2N::Inverse(<span class="keyword">const</span> Point &P)<span class="keyword"> const</span>00179 <span class="keyword"></span>{00180 <span class="keywordflow">if</span> (P.identity)00181 <span class="keywordflow">return</span> P;00182 <span class="keywordflow">else</span>00183 {00184 m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo0">identity</a> = <span class="keyword">false</span>;00185 m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a> = m_field->Add(P.x, P.y);00186 m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a> = P.x;00187 <span class="keywordflow">return</span> m_R;00188 }00189 }00190 00191 <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">EC2N::Point</a>& EC2N::Add(<span class="keyword">const</span> Point &P, <span class="keyword">const</span> Point &Q)<span class="keyword"> const</span>00192 <span class="keyword"></span>{00193 <span class="keywordflow">if</span> (P.identity) <span class="keywordflow">return</span> Q;00194 <span class="keywordflow">if</span> (Q.identity) <span class="keywordflow">return</span> P;00195 <span class="keywordflow">if</span> (Equal(P, Q)) <span class="keywordflow">return</span> Double(P);00196 <span class="keywordflow">if</span> (m_field->Equal(P.x, Q.x) && m_field->Equal(P.y, m_field->Add(Q.x, Q.y))) <span class="keywordflow">return</span> Identity();00197 00198 FieldElement t = m_field->Add(P.y, Q.y);00199 t = m_field->Divide(t, m_field->Add(P.x, Q.x));00200 FieldElement x = m_field->Square(t);00201 m_field->Accumulate(x, t);00202 m_field->Accumulate(x, Q.x);00203 m_field->Accumulate(x, m_a);00204 m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a> = m_field->Add(P.y, m_field->Multiply(t, x));00205 m_field->Accumulate(x, P.x);00206 m_field->Accumulate(m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a>, x);00207 00208 m_R.<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_mod2z25_14">swap</a>(x);00209 m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo0">identity</a> = <span class="keyword">false</span>;00210 <span class="keywordflow">return</span> m_R;00211 }00212 00213 <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">EC2N::Point</a>& EC2N::Double(<span class="keyword">const</span> Point &P)<span class="keyword"> const</span>00214 <span class="keyword"></span>{00215 <span class="keywordflow">if</span> (P.identity) <span class="keywordflow">return</span> P;00216 <span class="keywordflow">if</span> (!m_field->IsUnit(P.x)) <span class="keywordflow">return</span> Identity();00217 00218 FieldElement t = m_field->Divide(P.y, P.x);00219 m_field->Accumulate(t, P.x);00220 m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a> = m_field->Square(P.x);00221 m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a> = m_field->Square(t);00222 m_field->Accumulate(m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>, t);00223 m_field->Accumulate(m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>, m_a);00224 m_field->Accumulate(m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a>, m_field->Multiply(t, m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>));00225 m_field->Accumulate(m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a>, m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>);00226 00227 m_R.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo0">identity</a> = <span class="keyword">false</span>;00228 <span class="keywordflow">return</span> m_R;00229 }00230 00231 <span class="comment">// ********************************************************</span>00232 00233 <span class="comment">/*</span>00234 <span class="comment">EcPrecomputation<EC2N>& EcPrecomputation<EC2N>::operator=(const EcPrecomputation<EC2N> &rhs)</span>00235 <span class="comment">{</span>00236 <span class="comment"> m_ec = rhs.m_ec;</span>00237 <span class="comment"> m_ep = rhs.m_ep;</span>00238 <span class="comment"> m_ep.m_group = m_ec.get();</span>00239 <span class="comment"> return *this;</span>00240 <span class="comment">}</span>00241 <span class="comment"></span>00242 <span class="comment">void EcPrecomputation<EC2N>::SetCurveAndBase(const EC2N &ec, const EC2N::Point &base)</span>00243 <span class="comment">{</span>00244 <span class="comment"> m_ec.reset(new EC2N(ec));</span>00245 <span class="comment"> m_ep.SetGroupAndBase(*m_ec, base);</span>00246 <span class="comment">}</span>00247 <span class="comment"></span>00248 <span class="comment">void EcPrecomputation<EC2N>::Precompute(unsigned int maxExpBits, unsigned int storage)</span>00249 <span class="comment">{</span>00250 <span class="comment"> m_ep.Precompute(maxExpBits, storage);</span>00251 <span class="comment">}</span>00252 <span class="comment"></span>00253 <span class="comment">void EcPrecomputation<EC2N>::Load(BufferedTransformation &bt)</span>00254 <span class="comment">{</span>00255 <span class="comment"> BERSequenceDecoder seq(bt);</span>00256 <span class="comment"> word32 version;</span>00257 <span class="comment"> BERDecodeUnsigned<word32>(seq, version, INTEGER, 1, 1);</span>00258 <span class="comment"> m_ep.m_exponentBase.BERDecode(seq);</span>00259 <span class="comment"> m_ep.m_windowSize = m_ep.m_exponentBase.BitCount() - 1;</span>00260 <span class="comment"> m_ep.m_bases.clear();</span>00261 <span class="comment"> while (!seq.EndReached())</span>00262 <span class="comment"> m_ep.m_bases.push_back(m_ec->BERDecodePoint(seq));</span>00263 <span class="comment"> seq.MessageEnd();</span>00264 <span class="comment">}</span>00265 <span class="comment"></span>00266 <span class="comment">void EcPrecomputation<EC2N>::Save(BufferedTransformation &bt) const</span>00267 <span class="comment">{</span>00268 <span class="comment"> DERSequenceEncoder seq(bt);</span>00269 <span class="comment"> DEREncodeUnsigned<word32>(seq, 1); // version</span>00270 <span class="comment"> m_ep.m_exponentBase.DEREncode(seq);</span>00271 <span class="comment"> for (unsigned i=0; i<m_ep.m_bases.size(); i++)</span>00272 <span class="comment"> m_ec->DEREncodePoint(seq, m_ep.m_bases[i]);</span>00273 <span class="comment"> seq.MessageEnd();</span>00274 <span class="comment">}</span>00275 <span class="comment"></span>00276 <span class="comment">EC2N::Point EcPrecomputation<EC2N>::Exponentiate(const Integer &exponent) const</span>00277 <span class="comment">{</span>00278 <span class="comment"> return m_ep.Exponentiate(exponent);</span>00279 <span class="comment">}</span>00280 <span class="comment"></span>00281 <span class="comment">EC2N::Point EcPrecomputation<EC2N>::CascadeExponentiate(const Integer &exponent, const DL_FixedBasePrecomputation<Element> &pc2, const Integer &exponent2) const</span>00282 <span class="comment">{</span>00283 <span class="comment"> return m_ep.CascadeExponentiate(exponent, static_cast<const EcPrecomputation<EC2N> &>(pc2).m_ep, exponent2);</span>00284 <span class="comment">}</span>00285 <span class="comment">*/</span>00286 00287 NAMESPACE_END00288 00289 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:13 2003 for Crypto++ by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -