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

📄 iterhash_8cpp-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.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>iterhash.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// iterhash.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 "iterhash.h"</span>00008 <span class="preprocessor">#include "misc.h"</span>00009 00010 NAMESPACE_BEGIN(CryptoPP)00011 00012 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> BASE&gt;00013 IteratedHashBase&lt;T, BASE&gt;::IteratedHashBase(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockSize, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> digestSize)00014         : m_data(blockSize/sizeof(T)), m_digest(digestSize/sizeof(T))00015         , m_countHi(0), m_countLo(0)00016 {00017 }00018 00019 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> BASE&gt; <span class="keywordtype">void</span> IteratedHashBase&lt;T, BASE&gt;::Update(<span class="keyword">const</span> byte *input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len)00020 {00021         HashWordType tmp = m_countLo;00022         <span class="keywordflow">if</span> ((m_countLo = tmp + len) &lt; tmp)00023                 m_countHi++;             <span class="comment">// Carry from low to high</span>00024         m_countHi += SafeRightShift&lt;8*sizeof(HashWordType)&gt;(len);00025 00026         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockSize = <a class="code" href="namespace_name.html#a9">BlockSize</a>();00027         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> num = (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)(tmp &amp; (blockSize-1));00028 00029         <span class="keywordflow">if</span> (num != 0)00030         {00031                 <span class="keywordflow">if</span> ((num+len) &gt;= blockSize)00032                 {00033                         memcpy((byte *)m_data.begin()+num, input, blockSize-num);00034                         HashBlock(m_data);00035                         input += (blockSize-num);00036                         len-=(blockSize - num);00037                         num=0;00038                         <span class="comment">// drop through and do the rest</span>00039                 }00040                 <span class="keywordflow">else</span>00041                 {00042                         memcpy((byte *)m_data.begin()+num, input, len);00043                         <span class="keywordflow">return</span>;00044                 }00045         }00046 00047         <span class="comment">// we now can process the input data in blocks of blockSize</span>00048         <span class="comment">// chars and save the leftovers to this-&gt;data.</span>00049         <span class="keywordflow">if</span> (len &gt;= blockSize)00050         {00051                 <span class="keywordflow">if</span> (input == (byte *)m_data.begin())00052                 {00053                         assert(len == blockSize);00054                         HashBlock(m_data);00055                         <span class="keywordflow">return</span>;00056                 }00057                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (IsAligned&lt;T&gt;(input))00058                 {00059                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> leftOver = HashMultipleBlocks((T *)input, len);00060                         input += (len - leftOver);00061                         len = leftOver;00062                 }00063                 <span class="keywordflow">else</span>00064                         <span class="keywordflow">do</span>00065                         {   <span class="comment">// copy input first if it's not aligned correctly</span>00066                                 memcpy(m_data, input, blockSize);00067                                 HashBlock(m_data);00068                                 input+=blockSize;00069                                 len-=blockSize;00070                         } <span class="keywordflow">while</span> (len &gt;= blockSize);00071         }00072 00073         memcpy(m_data, input, len);00074 }00075 00076 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> BASE&gt; byte * IteratedHashBase&lt;T, BASE&gt;::CreateUpdateSpace(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;size)00077 {00078         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockSize = <a class="code" href="namespace_name.html#a9">BlockSize</a>();00079         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> num = ModPowerOf2(m_countLo, blockSize);00080         size = blockSize - num;00081         <span class="keywordflow">return</span> (byte *)m_data.begin() + num;00082 }00083 00084 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> BASE&gt; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> IteratedHashBase&lt;T, BASE&gt;::HashMultipleBlocks(<span class="keyword">const</span> T *input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00085 {00086         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockSize = <a class="code" href="namespace_name.html#a9">BlockSize</a>();00087         <span class="keywordflow">do</span>00088         {00089                 HashBlock(input);00090                 input += blockSize/<span class="keyword">sizeof</span>(T);00091                 length -= blockSize;00092         }00093         <span class="keywordflow">while</span> (length &gt;= blockSize);00094         <span class="keywordflow">return</span> length;00095 }00096 00097 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> BASE&gt; <span class="keywordtype">void</span> IteratedHashBase&lt;T, BASE&gt;::PadLastBlock(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lastBlockSize, byte padFirst)00098 {00099         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockSize = <a class="code" href="namespace_name.html#a9">BlockSize</a>();00100         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> num = ModPowerOf2(m_countLo, blockSize);00101         ((byte *)m_data.begin())[num++]=padFirst;00102         <span class="keywordflow">if</span> (num &lt;= lastBlockSize)00103                 memset((byte *)m_data.begin()+num, 0, lastBlockSize-num);00104         <span class="keywordflow">else</span>00105         {00106                 memset((byte *)m_data.begin()+num, 0, blockSize-num);00107                 HashBlock(m_data);00108                 memset(m_data, 0, lastBlockSize);00109         }00110 }00111 00112 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> BASE&gt; <span class="keywordtype">void</span> IteratedHashBase&lt;T, BASE&gt;::Restart()00113 {00114         m_countLo = m_countHi = 0;00115         Init();00116 }00117 00118 NAMESPACE_END00119 00120 <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 + -