eprecomp_8cpp-source.html

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

HTML
126
字号
<!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++: eprecomp.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>eprecomp.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// eprecomp.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 "eprecomp.h"</span>00008 <span class="preprocessor">#include "asn.h"</span>00009 00010 NAMESPACE_BEGIN(CryptoPP)00011 00012 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keywordtype">void</span> DL_FixedBasePrecomputationImpl&lt;T&gt;::SetBase(<span class="keyword">const</span> DL_GroupPrecomputation&lt;Element&gt; &amp;group, <span class="keyword">const</span> Element &amp;i_base)00013 {00014         m_base = group.NeedConversions() ? group.ConvertIn(i_base) : i_base;00015 00016         <span class="keywordflow">if</span> (m_bases.empty() || !(m_base == m_bases[0]))00017         {00018                 m_bases.resize(1);00019                 m_bases[0] = m_base;00020         }00021 00022         <span class="keywordflow">if</span> (group.NeedConversions())00023                 m_base = i_base;00024 }00025 00026 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keywordtype">void</span> DL_FixedBasePrecomputationImpl&lt;T&gt;::Precompute(<span class="keyword">const</span> DL_GroupPrecomputation&lt;Element&gt; &amp;group, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxExpBits, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> storage)00027 {00028         assert(m_bases.size() &gt; 0);00029         assert(storage &lt;= maxExpBits);00030 00031         <span class="keywordflow">if</span> (storage &gt; 1)00032         {00033                 m_windowSize = (maxExpBits+storage-1)/storage;00034                 m_exponentBase = <a class="code" href="class_integer.html#_integerz37_13">Integer::Power2</a>(m_windowSize);00035         }00036 00037         m_bases.resize(storage);00038         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i=1; i&lt;storage; i++)00039                 m_bases[i] = group.GetGroup().ScalarMultiply(m_bases[i-1], m_exponentBase);00040 }00041 00042 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keywordtype">void</span> DL_FixedBasePrecomputationImpl&lt;T&gt;::Load(<span class="keyword">const</span> DL_GroupPrecomputation&lt;Element&gt; &amp;group, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)00043 {00044         <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt);00045         word32 version;00046         BERDecodeUnsigned&lt;word32&gt;(seq, version, INTEGER, 1, 1);00047         m_exponentBase.BERDecode(seq);00048         m_windowSize = m_exponentBase.BitCount() - 1;00049         m_bases.clear();00050         <span class="keywordflow">while</span> (!seq.EndReached())00051                 m_bases.push_back(group.BERDecodeElement(seq));00052         <span class="keywordflow">if</span> (!m_bases.empty() &amp;&amp; group.NeedConversions())00053                 m_base = group.ConvertOut(m_bases[0]);00054         seq.MessageEnd();00055 }00056 00057 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keywordtype">void</span> DL_FixedBasePrecomputationImpl&lt;T&gt;::Save(<span class="keyword">const</span> DL_GroupPrecomputation&lt;Element&gt; &amp;group, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>00058 <span class="keyword"></span>{00059         <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt);00060         DEREncodeUnsigned&lt;word32&gt;(seq, 1);      <span class="comment">// version</span>00061         m_exponentBase.DEREncode(seq);00062         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i=0; i&lt;m_bases.size(); i++)00063                 group.DEREncodeElement(seq, m_bases[i]);00064         seq.MessageEnd();00065 }00066 00067 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keywordtype">void</span> DL_FixedBasePrecomputationImpl&lt;T&gt;::PrepareCascade(<span class="keyword">const</span> DL_GroupPrecomputation&lt;Element&gt; &amp;i_group, std::vector&lt;<a class="code" href="struct_base_and_exponent.html">BaseAndExponent&lt;Element&gt;</a> &gt; &amp;eb, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;exponent)<span class="keyword"> const</span>00068 <span class="keyword"></span>{00069         <span class="keyword">const</span> <a class="code" href="class_abstract_group.html">AbstractGroup&lt;T&gt;</a> &amp;group = i_group.GetGroup();00070 00071         <a class="code" href="class_integer.html">Integer</a> r, q, e = exponent;00072         <span class="keywordtype">bool</span> fastNegate = group.<a class="code" href="class_abstract_group.html#_euclidean_domain_ofa22">InversionIsFast</a>() &amp;&amp; m_windowSize &gt; 1;00073         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;00074 00075         <span class="keywordflow">for</span> (i=0; i+1&lt;m_bases.size(); i++)00076         {00077                 <a class="code" href="class_integer.html#_integerz49_11">Integer::DivideByPowerOf2</a>(r, q, e, m_windowSize);00078                 std::swap(q, e);00079                 <span class="keywordflow">if</span> (fastNegate &amp;&amp; r.<a class="code" href="class_integer.html#_integerz41_5">GetBit</a>(m_windowSize-1))00080                 {00081                         ++e;00082                         eb.push_back(<a class="code" href="struct_base_and_exponent.html">BaseAndExponent&lt;Element&gt;</a>(group.<a class="code" href="class_abstract_group.html#_abstract_ringa16">Inverse</a>(m_bases[i]), m_exponentBase - r));00083                 }00084                 <span class="keywordflow">else</span>00085                         eb.push_back(<a class="code" href="struct_base_and_exponent.html">BaseAndExponent&lt;Element&gt;</a>(m_bases[i], r));00086         }00087         eb.push_back(<a class="code" href="struct_base_and_exponent.html">BaseAndExponent&lt;Element&gt;</a>(m_bases[i], e));00088 }00089 00090 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; T DL_FixedBasePrecomputationImpl&lt;T&gt;::Exponentiate(<span class="keyword">const</span> DL_GroupPrecomputation&lt;Element&gt; &amp;group, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;exponent)<span class="keyword"> const</span>00091 <span class="keyword"></span>{00092         std::vector&lt;BaseAndExponent&lt;Element&gt; &gt; eb;      <span class="comment">// array of segments of the exponent and precalculated bases</span>00093         eb.reserve(m_bases.size());00094         PrepareCascade(group, eb, exponent);00095         <span class="keywordflow">return</span> group.ConvertOut(GeneralCascadeMultiplication&lt;Element&gt;(group.GetGroup(), eb.begin(), eb.end()));00096 }00097 00098 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; T 00099         DL_FixedBasePrecomputationImpl&lt;T&gt;::CascadeExponentiate(<span class="keyword">const</span> DL_GroupPrecomputation&lt;Element&gt; &amp;group, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;exponent, 00100                 <span class="keyword">const</span> DL_FixedBasePrecomputation&lt;T&gt; &amp;i_pc2, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;exponent2)<span class="keyword"> const</span>00101 <span class="keyword"></span>{00102         std::vector&lt;BaseAndExponent&lt;Element&gt; &gt; eb;      <span class="comment">// array of segments of the exponent and precalculated bases</span>00103         <span class="keyword">const</span> DL_FixedBasePrecomputationImpl&lt;T&gt; &amp;pc2 = static_cast&lt;const DL_FixedBasePrecomputationImpl&lt;T&gt; &amp;&gt;(i_pc2);00104         eb.reserve(m_bases.size() + pc2.m_bases.size());00105         PrepareCascade(group, eb, exponent);00106         pc2.PrepareCascade(group, eb, exponent2);00107         <span class="keywordflow">return</span> group.ConvertOut(GeneralCascadeMultiplication&lt;Element&gt;(group.GetGroup(), eb.begin(), eb.end()));00108 }00109 00110 NAMESPACE_END00111 00112 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:14 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 + =
减小字号Ctrl + -
显示快捷键?