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 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>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> <<span class="keyword">class</span> T> <span class="keywordtype">void</span> DL_FixedBasePrecomputationImpl<T>::SetBase(<span class="keyword">const</span> DL_GroupPrecomputation<Element> &group, <span class="keyword">const</span> Element &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> <<span class="keyword">class</span> T> <span class="keywordtype">void</span> DL_FixedBasePrecomputationImpl<T>::Precompute(<span class="keyword">const</span> DL_GroupPrecomputation<Element> &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() > 0);00029 assert(storage <= maxExpBits);00030 00031 <span class="keywordflow">if</span> (storage > 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<storage; i++)00039 m_bases[i] = group.GetGroup().ScalarMultiply(m_bases[i-1], m_exponentBase);00040 }00041 00042 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keywordtype">void</span> DL_FixedBasePrecomputationImpl<T>::Load(<span class="keyword">const</span> DL_GroupPrecomputation<Element> &group, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)00043 {00044 <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt);00045 word32 version;00046 BERDecodeUnsigned<word32>(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() && group.NeedConversions())00053 m_base = group.ConvertOut(m_bases[0]);00054 seq.MessageEnd();00055 }00056 00057 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keywordtype">void</span> DL_FixedBasePrecomputationImpl<T>::Save(<span class="keyword">const</span> DL_GroupPrecomputation<Element> &group, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &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<word32>(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<m_bases.size(); i++)00063 group.DEREncodeElement(seq, m_bases[i]);00064 seq.MessageEnd();00065 }00066 00067 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keywordtype">void</span> DL_FixedBasePrecomputationImpl<T>::PrepareCascade(<span class="keyword">const</span> DL_GroupPrecomputation<Element> &i_group, std::vector<<a class="code" href="struct_base_and_exponent.html">BaseAndExponent<Element></a> > &eb, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &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<T></a> &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>() && m_windowSize > 1;00073 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;00074 00075 <span class="keywordflow">for</span> (i=0; i+1<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 && 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<Element></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<Element></a>(m_bases[i], r));00086 }00087 eb.push_back(<a class="code" href="struct_base_and_exponent.html">BaseAndExponent<Element></a>(m_bases[i], e));00088 }00089 00090 <span class="keyword">template</span> <<span class="keyword">class</span> T> T DL_FixedBasePrecomputationImpl<T>::Exponentiate(<span class="keyword">const</span> DL_GroupPrecomputation<Element> &group, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &exponent)<span class="keyword"> const</span>00091 <span class="keyword"></span>{00092 std::vector<BaseAndExponent<Element> > 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<Element>(group.GetGroup(), eb.begin(), eb.end()));00096 }00097 00098 <span class="keyword">template</span> <<span class="keyword">class</span> T> T 00099 DL_FixedBasePrecomputationImpl<T>::CascadeExponentiate(<span class="keyword">const</span> DL_GroupPrecomputation<Element> &group, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &exponent, 00100 <span class="keyword">const</span> DL_FixedBasePrecomputation<T> &i_pc2, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &exponent2)<span class="keyword"> const</span>00101 <span class="keyword"></span>{00102 std::vector<BaseAndExponent<Element> > eb; <span class="comment">// array of segments of the exponent and precalculated bases</span>00103 <span class="keyword">const</span> DL_FixedBasePrecomputationImpl<T> &pc2 = static_cast<const DL_FixedBasePrecomputationImpl<T> &>(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<Element>(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 + -
显示快捷键?