📄 sha_8cpp-source.html
字号:
<a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor">#define f(i) T[(5-i)&7]</span><a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor">#define g(i) T[(6-i)&7]</span><a name="l00127"></a>00127 <span class="preprocessor"></span><span class="preprocessor">#define h(i) T[(7-i)&7]</span><a name="l00128"></a>00128 <span class="preprocessor"></span><a name="l00129"></a>00129 <span class="preprocessor">#define R(i) h(i)+=S1(e(i))+Ch(e(i),f(i),g(i))+SHA256_K[i+j]+(j?blk2(i):blk0(i));\</span><a name="l00130"></a>00130 <span class="preprocessor"> d(i)+=h(i);h(i)+=S0(a(i))+Maj(a(i),b(i),c(i))</span><a name="l00131"></a>00131 <span class="preprocessor"></span><a name="l00132"></a>00132 <span class="comment">// for SHA256</span><a name="l00133"></a>00133 <span class="preprocessor">#define S0(x) (rotrFixed(x,2)^rotrFixed(x,13)^rotrFixed(x,22))</span><a name="l00134"></a>00134 <span class="preprocessor"></span><span class="preprocessor">#define S1(x) (rotrFixed(x,6)^rotrFixed(x,11)^rotrFixed(x,25))</span><a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor">#define s0(x) (rotrFixed(x,7)^rotrFixed(x,18)^(x>>3))</span><a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">#define s1(x) (rotrFixed(x,17)^rotrFixed(x,19)^(x>>10))</span><a name="l00137"></a>00137 <span class="preprocessor"></span><a name="l00138"></a><a class="code" href="class_s_h_a256.html#791c4046e1a25a129949366736a623cd">00138</a> <span class="keywordtype">void</span> <a class="code" href="class_s_h_a256.html#791c4046e1a25a129949366736a623cd">SHA256::Transform</a>(word32 *state, <span class="keyword">const</span> word32 *data)<a name="l00139"></a>00139 {<a name="l00140"></a>00140 word32 W[16];<a name="l00141"></a>00141 word32 T[8];<a name="l00142"></a>00142 <span class="comment">/* Copy context->state[] to working vars */</span><a name="l00143"></a>00143 memcpy(T, state, <span class="keyword">sizeof</span>(T));<a name="l00144"></a>00144 <span class="comment">/* 64 operations, partially loop unrolled */</span><a name="l00145"></a>00145 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j=0; j<64; j+=16)<a name="l00146"></a>00146 {<a name="l00147"></a>00147 R( 0); R( 1); R( 2); R( 3);<a name="l00148"></a>00148 R( 4); R( 5); R( 6); R( 7);<a name="l00149"></a>00149 R( 8); R( 9); R(10); R(11);<a name="l00150"></a>00150 R(12); R(13); R(14); R(15);<a name="l00151"></a>00151 }<a name="l00152"></a>00152 <span class="comment">/* Add the working vars back into context.state[] */</span><a name="l00153"></a>00153 state[0] += a(0);<a name="l00154"></a>00154 state[1] += b(0);<a name="l00155"></a>00155 state[2] += c(0);<a name="l00156"></a>00156 state[3] += d(0);<a name="l00157"></a>00157 state[4] += e(0);<a name="l00158"></a>00158 state[5] += f(0);<a name="l00159"></a>00159 state[6] += g(0);<a name="l00160"></a>00160 state[7] += h(0);<a name="l00161"></a>00161 }<a name="l00162"></a>00162 <a name="l00163"></a>00163 <span class="comment">/* </span><a name="l00164"></a>00164 <span class="comment">// smaller but slower</span><a name="l00165"></a>00165 <span class="comment">void SHA256_Transform(word32 *state, const word32 *data)</span><a name="l00166"></a>00166 <span class="comment">{</span><a name="l00167"></a>00167 <span class="comment"> word32 T[20];</span><a name="l00168"></a>00168 <span class="comment"> word32 W[32];</span><a name="l00169"></a>00169 <span class="comment"> unsigned int i = 0, j = 0;</span><a name="l00170"></a>00170 <span class="comment"> word32 *t = T+8;</span><a name="l00171"></a>00171 <span class="comment"></span><a name="l00172"></a>00172 <span class="comment"> memcpy(t, state, 8*4);</span><a name="l00173"></a>00173 <span class="comment"> word32 e = t[4], a = t[0];</span><a name="l00174"></a>00174 <span class="comment"></span><a name="l00175"></a>00175 <span class="comment"> do </span><a name="l00176"></a>00176 <span class="comment"> {</span><a name="l00177"></a>00177 <span class="comment"> word32 w = data[j];</span><a name="l00178"></a>00178 <span class="comment"> W[j] = w;</span><a name="l00179"></a>00179 <span class="comment"> w += K[j];</span><a name="l00180"></a>00180 <span class="comment"> w += t[7];</span><a name="l00181"></a>00181 <span class="comment"> w += S1(e);</span><a name="l00182"></a>00182 <span class="comment"> w += Ch(e, t[5], t[6]);</span><a name="l00183"></a>00183 <span class="comment"> e = t[3] + w;</span><a name="l00184"></a>00184 <span class="comment"> t[3] = t[3+8] = e;</span><a name="l00185"></a>00185 <span class="comment"> w += S0(t[0]);</span><a name="l00186"></a>00186 <span class="comment"> a = w + Maj(a, t[1], t[2]);</span><a name="l00187"></a>00187 <span class="comment"> t[-1] = t[7] = a;</span><a name="l00188"></a>00188 <span class="comment"> --t;</span><a name="l00189"></a>00189 <span class="comment"> ++j;</span><a name="l00190"></a>00190 <span class="comment"> if (j%8 == 0)</span><a name="l00191"></a>00191 <span class="comment"> t += 8;</span><a name="l00192"></a>00192 <span class="comment"> } while (j<16);</span><a name="l00193"></a>00193 <span class="comment"></span><a name="l00194"></a>00194 <span class="comment"> do</span><a name="l00195"></a>00195 <span class="comment"> {</span><a name="l00196"></a>00196 <span class="comment"> i = j&0xf;</span><a name="l00197"></a>00197 <span class="comment"> word32 w = s1(W[i+16-2]) + s0(W[i+16-15]) + W[i] + W[i+16-7];</span><a name="l00198"></a>00198 <span class="comment"> W[i+16] = W[i] = w;</span><a name="l00199"></a>00199 <span class="comment"> w += K[j];</span><a name="l00200"></a>00200 <span class="comment"> w += t[7];</span><a name="l00201"></a>00201 <span class="comment"> w += S1(e);</span><a name="l00202"></a>00202 <span class="comment"> w += Ch(e, t[5], t[6]);</span><a name="l00203"></a>00203 <span class="comment"> e = t[3] + w;</span><a name="l00204"></a>00204 <span class="comment"> t[3] = t[3+8] = e;</span><a name="l00205"></a>00205 <span class="comment"> w += S0(t[0]);</span><a name="l00206"></a>00206 <span class="comment"> a = w + Maj(a, t[1], t[2]);</span><a name="l00207"></a>00207 <span class="comment"> t[-1] = t[7] = a;</span><a name="l00208"></a>00208 <span class="comment"></span><a name="l00209"></a>00209 <span class="comment"> w = s1(W[(i+1)+16-2]) + s0(W[(i+1)+16-15]) + W[(i+1)] + W[(i+1)+16-7];</span><a name="l00210"></a>00210 <span class="comment"> W[(i+1)+16] = W[(i+1)] = w;</span><a name="l00211"></a>00211 <span class="comment"> w += K[j+1];</span><a name="l00212"></a>00212 <span class="comment"> w += (t-1)[7];</span><a name="l00213"></a>00213 <span class="comment"> w += S1(e);</span><a name="l00214"></a>00214 <span class="comment"> w += Ch(e, (t-1)[5], (t-1)[6]);</span><a name="l00215"></a>00215 <span class="comment"> e = (t-1)[3] + w;</span><a name="l00216"></a>00216 <span class="comment"> (t-1)[3] = (t-1)[3+8] = e;</span><a name="l00217"></a>00217 <span class="comment"> w += S0((t-1)[0]);</span><a name="l00218"></a>00218 <span class="comment"> a = w + Maj(a, (t-1)[1], (t-1)[2]);</span><a name="l00219"></a>00219 <span class="comment"> (t-1)[-1] = (t-1)[7] = a;</span><a name="l00220"></a>00220 <span class="comment"></span><a name="l00221"></a>00221 <span class="comment"> t-=2;</span><a name="l00222"></a>00222 <span class="comment"> j+=2;</span><a name="l00223"></a>00223 <span class="comment"> if (j%8 == 0)</span><a name="l00224"></a>00224 <span class="comment"> t += 8;</span><a name="l00225"></a>00225 <span class="comment"> } while (j<64);</span><a name="l00226"></a>00226 <span class="comment"></span><a name="l00227"></a>00227 <span class="comment"> state[0] += a;</span><a name="l00228"></a>00228 <span class="comment"> state[1] += t[1];</span><a name="l00229"></a>00229 <span class="comment"> state[2] += t[2];</span><a name="l00230"></a>00230 <span class="comment"> state[3] += t[3];</span><a name="l00231"></a>00231 <span class="comment"> state[4] += e;</span><a name="l00232"></a>00232 <span class="comment"> state[5] += t[5];</span><a name="l00233"></a>00233 <span class="comment"> state[6] += t[6];</span><a name="l00234"></a>00234 <span class="comment"> state[7] += t[7];</span><a name="l00235"></a>00235 <span class="comment">}</span><a name="l00236"></a>00236 <span class="comment">*/</span><a name="l00237"></a>00237 <a name="l00238"></a>00238 <span class="preprocessor">#undef S0</span><a name="l00239"></a>00239 <span class="preprocessor"></span><span class="preprocessor">#undef S1</span><a name="l00240"></a>00240 <span class="preprocessor"></span><span class="preprocessor">#undef s0</span><a name="l00241"></a>00241 <span class="preprocessor"></span><span class="preprocessor">#undef s1</span><a name="l00242"></a>00242 <span class="preprocessor"></span><span class="preprocessor">#undef R</span><a name="l00243"></a>00243 <span class="preprocessor"></span><a name="l00244"></a>00244 <span class="comment">// *************************************************************</span><a name="l00245"></a>00245 <a name="l00246"></a>00246 <span class="preprocessor">#ifdef WORD64_AVAILABLE</span><a name="l00247"></a>00247 <span class="preprocessor"></span><a name="l00248"></a><a class="code" href="class_s_h_a384.html#fef9ca7a8b423eedbfd0637ec49aee6d">00248</a> <span class="keywordtype">void</span> <a class="code" href="class_s_h_a384.html#fef9ca7a8b423eedbfd0637ec49aee6d">SHA384::InitState</a>(<a class="code" href="class_iterated_hash.html#ce0350088eea8679cbe23668d2498c07">HashWordType</a> *state)<a name="l00249"></a>00249 {<a name="l00250"></a>00250 <span class="keyword">static</span> <span class="keyword">const</span> word64 s[8] = {<a name="l00251"></a>00251 W64LIT(0xcbbb9d5dc1059ed8), W64LIT(0x629a292a367cd507),<a name="l00252"></a>00252 W64LIT(0x9159015a3070dd17), W64LIT(0x152fecd8f70e5939),<a name="l00253"></a>00253 W64LIT(0x67332667ffc00b31), W64LIT(0x8eb44a8768581511),<a name="l00254"></a>00254 W64LIT(0xdb0c2e0d64f98fa7), W64LIT(0x47b5481dbefa4fa4)};<a name="l00255"></a>00255 memcpy(state, s, <span class="keyword">sizeof</span>(s));<a name="l00256"></a>00256 }<a name="l00257"></a>00257 <a name="l00258"></a><a class="code" href="class_s_h_a512.html#e2f0b54045431fbd63f49a8f351393d7">00258</a> <span class="keywordtype">void</span> <a class="code" href="class_s_h_a512.html#e2f0b54045431fbd63f49a8f351393d7">SHA512::InitState</a>(<a class="code" href="class_iterated_hash.html#ce0350088eea8679cbe23668d2498c07">HashWordType</a> *state)<a name="l00259"></a>00259 {<a name="l00260"></a>00260 <span class="keyword">static</span> <span class="keyword">const</span> word64 s[8] = {<a name="l00261"></a>00261 W64LIT(0x6a09e667f3bcc908), W64LIT(0xbb67ae8584caa73b),<a name="l00262"></a>00262 W64LIT(0x3c6ef372fe94f82b), W64LIT(0xa54ff53a5f1d36f1),<a name="l00263"></a>00263 W64LIT(0x510e527fade682d1), W64LIT(0x9b05688c2b3e6c1f),<a name="l00264"></a>00264 W64LIT(0x1f83d9abfb41bd6b), W64LIT(0x5be0cd19137e2179)};<a name="l00265"></a>00265 memcpy(state, s, <span class="keyword">sizeof</span>(s));<a name="l00266"></a>00266 }<a name="l00267"></a>00267 <a name="l00268"></a>00268 CRYPTOPP_ALIGN_DATA(16) static const word64 SHA512_K[80] CRYPTOPP_SECTION_ALIGN16 = {<a name="l00269"></a>00269 W64LIT(0x428a2f98d728ae22), W64LIT(0x7137449123ef65cd),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -