📄 iterhash_8cpp-source.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 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>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> <<span class="keyword">class</span> T, <span class="keyword">class</span> BASE>00013 IteratedHashBase<T, BASE>::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> <<span class="keyword">class</span> T, <span class="keyword">class</span> BASE> <span class="keywordtype">void</span> IteratedHashBase<T, BASE>::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) < tmp)00023 m_countHi++; <span class="comment">// Carry from low to high</span>00024 m_countHi += SafeRightShift<8*sizeof(HashWordType)>(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 & (blockSize-1));00028 00029 <span class="keywordflow">if</span> (num != 0)00030 {00031 <span class="keywordflow">if</span> ((num+len) >= 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->data.</span>00049 <span class="keywordflow">if</span> (len >= 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<T>(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 >= blockSize);00071 }00072 00073 memcpy(m_data, input, len);00074 }00075 00076 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> BASE> byte * IteratedHashBase<T, BASE>::CreateUpdateSpace(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &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> <<span class="keyword">class</span> T, <span class="keyword">class</span> BASE> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> IteratedHashBase<T, BASE>::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 >= blockSize);00094 <span class="keywordflow">return</span> length;00095 }00096 00097 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> BASE> <span class="keywordtype">void</span> IteratedHashBase<T, BASE>::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 <= 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> <<span class="keyword">class</span> T, <span class="keyword">class</span> BASE> <span class="keywordtype">void</span> IteratedHashBase<T, BASE>::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 + -