⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iterhash_8h-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
字号:
<!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++: iterhash.h 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>iterhash.h</h1><div class="fragment"><pre>00001 <span class="preprocessor">#ifndef CRYPTOPP_ITERHASH_H</span>00002 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_ITERHASH_H</span>00003 <span class="preprocessor"></span>00004 <span class="preprocessor">#include "<a class="code" href="cryptlib_8h.html">cryptlib.h</a>"</span>00005 <span class="preprocessor">#include "secblock.h"</span>00006 <span class="preprocessor">#include "misc.h"</span>00007 00008 NAMESPACE_BEGIN(CryptoPP)00009 00010 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> BASE&gt;00011 <span class="keyword">class </span>IteratedHashBase : <span class="keyword">public</span> BASE00012 {00013 <span class="keyword">public</span>:00014         <span class="keyword">typedef</span> T HashWordType;00015 00016         IteratedHashBase(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockSize, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> digestSize);00017         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DigestSize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_digest.size() * <span class="keyword">sizeof</span>(T);};00018         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> OptimalBlockSize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="namespace_name.html#a9">BlockSize</a>();}00019         <span class="keywordtype">void</span> Update(<span class="keyword">const</span> byte *input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length);00020         byte * CreateUpdateSpace(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;size);00021         <span class="keywordtype">void</span> Restart();00022 00023 <span class="keyword">protected</span>:00024         T GetBitCountHi()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (m_countLo &gt;&gt; (8*<span class="keyword">sizeof</span>(T)-3)) + (m_countHi &lt;&lt; 3);}00025         T GetBitCountLo()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_countLo &lt;&lt; 3;}00026 00027         <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> HashMultipleBlocks(<span class="keyword">const</span> T *input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length);00028         <span class="keywordtype">void</span> PadLastBlock(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lastBlockSize, byte padFirst=0x80);00029         <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init() =0;00030         <span class="keyword">virtual</span> <span class="keywordtype">void</span> HashBlock(<span class="keyword">const</span> T *input) =0;00031 00032         <a class="code" href="class_sec_block.html">SecBlock&lt;T&gt;</a> m_data;                     <span class="comment">// Data buffer</span>00033         <a class="code" href="class_sec_block.html">SecBlock&lt;T&gt;</a> m_digest;           <span class="comment">// Message digest</span>00034 00035 <span class="keyword">private</span>:00036         T m_countLo, m_countHi;00037 };00038 00039 <span class="preprocessor">#ifdef WORD64_AVAILABLE</span>00040 <span class="preprocessor"></span>CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase&lt;word64, HashTransformation&gt;;00041 CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase&lt;word64, MessageAuthenticationCode&gt;;00042 <span class="preprocessor">#endif</span>00043 <span class="preprocessor"></span>00044 CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase&lt;word32, HashTransformation&gt;;00045 CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase&lt;word32, MessageAuthenticationCode&gt;;00046 <span class="comment"></span>00047 <span class="comment">//! .</span>00048 <span class="comment"></span><span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> B, <span class="keyword">class</span> BASE&gt;<a name="l00049"></a><a class="code" href="class_iterated_hash_base2.html">00049</a> <span class="keyword">class </span><a class="code" href="class_iterated_hash_base2.html">IteratedHashBase2</a> : <span class="keyword">public</span> IteratedHashBase&lt;T, BASE&gt;00050 {00051 <span class="keyword">public</span>:00052         <a class="code" href="class_iterated_hash_base2.html">IteratedHashBase2</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockSize, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> digestSize)00053                 : IteratedHashBase&lt;T, BASE&gt;(blockSize, digestSize) {}00054 00055         <span class="keyword">typedef</span> B ByteOrderClass;00056         <span class="keyword">typedef</span> <span class="keyword">typename</span> IteratedHashBase&lt;T, BASE&gt;::HashWordType HashWordType;00057 00058         <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> CorrectEndianess(HashWordType *out, <span class="keyword">const</span> HashWordType *in, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> byteCount)00059         {00060                 ConditionalByteReverse(B::ToEnum(), out, in, byteCount);00061         }00062 00063         <span class="keywordtype">void</span> TruncatedFinal(byte *hash, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size);00064 00065 <span class="keyword">protected</span>:00066         <span class="keywordtype">void</span> HashBlock(<span class="keyword">const</span> HashWordType *input);00067 00068         <span class="keyword">virtual</span> <span class="keywordtype">void</span> vTransform(<span class="keyword">const</span> HashWordType *data) =0;00069 };00070 <span class="comment"></span><a name="l00071"></a><a class="code" href="class_iterated_hash.html">00071</a> <span class="comment">//! .</span>00072 <span class="comment"></span><span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> B, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> S, <span class="keyword">class</span> BASE = HashTransformation&gt;00073 <span class="keyword">class </span><a class="code" href="class_iterated_hash.html">IteratedHash</a> : <span class="keyword">public</span> <a class="code" href="class_iterated_hash_base2.html">IteratedHashBase2</a>&lt;T, B, BASE&gt;00074 {00075 <span class="keyword">public</span>:00076         <span class="keyword">enum</span> {BLOCKSIZE = S};00077 00078 <span class="keyword">private</span>:00079         CRYPTOPP_COMPILE_ASSERT((BLOCKSIZE &amp; (BLOCKSIZE - 1)) == 0);            <span class="comment">// blockSize is a power of 2</span>00080 00081 <span class="keyword">protected</span>:00082         <a class="code" href="class_iterated_hash.html">IteratedHash</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> digestSize) : <a class="code" href="class_iterated_hash_base2.html">IteratedHashBase2&lt;T, B, BASE&gt;</a>(BLOCKSIZE, digestSize) {}00083         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BlockSize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> BLOCKSIZE;}00084 };00085 00086 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> B, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> S, <span class="keyword">class</span> M&gt;00087 <span class="keyword">class </span>IteratedHashWithStaticTransform : <span class="keyword">public</span> <a class="code" href="class_iterated_hash.html">IteratedHash</a>&lt;T, B, S&gt;00088 {00089 <span class="keyword">public</span>:00090         std::string AlgorithmName()<span class="keyword"> const </span>{<span class="keywordflow">return</span> M::StaticAlgorithmName();}00091 <span class="keyword">protected</span>:00092         IteratedHashWithStaticTransform(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> digestSize) : <a class="code" href="class_iterated_hash.html">IteratedHash</a>&lt;T, B, S&gt;(digestSize) {}00093         <span class="keywordtype">void</span> vTransform(<span class="keyword">const</span> T *data) {M::Transform(m_digest, data);}00094 };00095 00096 <span class="comment">// *************************************************************</span>00097 00098 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> B, <span class="keyword">class</span> BASE&gt; <span class="keywordtype">void</span> <a class="code" href="class_iterated_hash_base2.html">IteratedHashBase2&lt;T, B, BASE&gt;::TruncatedFinal</a>(byte *hash, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size)00099 {00100         ThrowIfInvalidTruncatedSize(size);00101 00102         PadLastBlock(BlockSize() - 2*<span class="keyword">sizeof</span>(HashWordType));00103         CorrectEndianess(m_data, m_data, BlockSize() - 2*<span class="keyword">sizeof</span>(HashWordType));00104 00105         m_data[m_data.size()-2] = B::ToEnum() ? GetBitCountHi() : GetBitCountLo();00106         m_data[m_data.size()-1] = B::ToEnum() ? GetBitCountLo() : GetBitCountHi();00107 00108         vTransform(m_data);00109         CorrectEndianess(m_digest, m_digest, DigestSize());00110         memcpy(hash, m_digest, size);00111 00112         Restart();              <span class="comment">// reinit for next use</span>00113 }00114 00115 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> B, <span class="keyword">class</span> BASE&gt; <span class="keywordtype">void</span> <a class="code" href="class_iterated_hash_base2.html">IteratedHashBase2&lt;T, B, BASE&gt;::HashBlock</a>(<span class="keyword">const</span> HashWordType *input)00116 {00117         <span class="keywordflow">if</span> (NativeByteOrderIs(B::ToEnum()))00118                 vTransform(input);00119         <span class="keywordflow">else</span>00120         {00121                 ByteReverse(m_data.begin(), input, BlockSize());00122                 vTransform(m_data);00123         }00124 }00125 00126 NAMESPACE_END00127 00128 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:19 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 + -