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

📄 sha_8cpp-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name="l00415"></a>00415         AS2(    movq    [edi+11*8], mm5)<a name="l00416"></a>00416         SSE2_S0_S1(mm4,28,34,39)                        <span class="comment">// S0(a)</span><a name="l00417"></a>00417         AS2(    paddq   mm4, mm1)                       <span class="comment">// a = temp + S0(a)</span><a name="l00418"></a>00418         AS2(    movq    [edi-8], mm4)<a name="l00419"></a>00419         AS2(    movq    [edi+7*8], mm4)<a name="l00420"></a>00420         AS1(    ret)<a name="l00421"></a>00421 <a name="l00422"></a>00422         <span class="comment">// first 16 rounds</span><a name="l00423"></a>00423         ASL(0)<a name="l00424"></a>00424         AS2(    movq    mm0, [edx+eax*8])<a name="l00425"></a>00425         AS2(    movq    [esi+eax*8], mm0)<a name="l00426"></a>00426         AS2(    movq    [esi+eax*8+16*8], mm0)<a name="l00427"></a>00427         AS2(    paddq   mm0, [ebx+eax*8])<a name="l00428"></a>00428         ASC(    call,   SHA512_Round)<a name="l00429"></a>00429         AS1(    inc             eax)<a name="l00430"></a>00430         AS2(    sub             edi, 8)<a name="l00431"></a>00431         AS2(    test    eax, 7)<a name="l00432"></a>00432         ASJ(    jnz,    0, b)<a name="l00433"></a>00433         AS2(    <span class="keyword">add</span>             edi, 8*8)<a name="l00434"></a>00434         AS2(    cmp             eax, 16)<a name="l00435"></a>00435         ASJ(    jne,    0, b)<a name="l00436"></a>00436 <a name="l00437"></a>00437         <span class="comment">// rest of the rounds</span><a name="l00438"></a>00438         AS2(    movdqu  xmm0, [esi+(16-2)*8])<a name="l00439"></a>00439         ASL(1)<a name="l00440"></a>00440         <span class="comment">// data expansion, W[i-2] already in xmm0</span><a name="l00441"></a>00441         AS2(    movdqu  xmm3, [esi])<a name="l00442"></a>00442         AS2(    paddq   xmm3, [esi+(16-7)*8])<a name="l00443"></a>00443         AS2(    movdqa  xmm2, [esi+(16-15)*8])<a name="l00444"></a>00444         SSE2_s1(xmm0, 6, 19, 61)<a name="l00445"></a>00445         AS2(    paddq   xmm0, xmm3)<a name="l00446"></a>00446         SSE2_s0(xmm2, 1, 7, 8)<a name="l00447"></a>00447         AS2(    paddq   xmm0, xmm2)<a name="l00448"></a>00448         AS2(    movdq2q mm0, xmm0)<a name="l00449"></a>00449         AS2(    movhlps xmm1, xmm0)<a name="l00450"></a>00450         AS2(    paddq   mm0, [ebx+eax*8])<a name="l00451"></a>00451         AS2(    movlps  [esi], xmm0)<a name="l00452"></a>00452         AS2(    movlps  [esi+8], xmm1)<a name="l00453"></a>00453         AS2(    movlps  [esi+8*16], xmm0)<a name="l00454"></a>00454         AS2(    movlps  [esi+8*17], xmm1)<a name="l00455"></a>00455         <span class="comment">// 2 rounds</span><a name="l00456"></a>00456         ASC(    call,   SHA512_Round)<a name="l00457"></a>00457         AS2(    sub             edi, 8)<a name="l00458"></a>00458         AS2(    movdq2q mm0, xmm1)<a name="l00459"></a>00459         AS2(    paddq   mm0, [ebx+eax*8+8])<a name="l00460"></a>00460         ASC(    call,   SHA512_Round)<a name="l00461"></a>00461         <span class="comment">// update indices and loop</span><a name="l00462"></a>00462         AS2(    <span class="keyword">add</span>             esi, 16)<a name="l00463"></a>00463         AS2(    <span class="keyword">add</span>             eax, 2)<a name="l00464"></a>00464         AS2(    sub             edi, 8)<a name="l00465"></a>00465         AS2(    test    eax, 7)<a name="l00466"></a>00466         ASJ(    jnz,    1, b)<a name="l00467"></a>00467         <span class="comment">// do housekeeping every 8 rounds</span><a name="l00468"></a>00468         AS2(    mov             esi, 0xf)<a name="l00469"></a>00469         AS2(    and             esi, eax)<a name="l00470"></a>00470         AS2(    lea             esi, [esp+4+20*8+8+esi*8])<a name="l00471"></a>00471         AS2(    <span class="keyword">add</span>             edi, 8*8)<a name="l00472"></a>00472         AS2(    cmp             eax, 80)<a name="l00473"></a>00473         ASJ(    jne,    1, b)<a name="l00474"></a>00474 <a name="l00475"></a>00475 #define SSE2_CombineState(i)    \<a name="l00476"></a>00476         AS2(    movq    mm0, [edi+i*8])\<a name="l00477"></a>00477         AS2(    paddq   mm0, [ecx+i*8])\<a name="l00478"></a>00478         AS2(    movq    [ecx+i*8], mm0)<a name="l00479"></a>00479 <a name="l00480"></a>00480         SSE2_CombineState(0)<a name="l00481"></a>00481         SSE2_CombineState(1)<a name="l00482"></a>00482         SSE2_CombineState(2)<a name="l00483"></a>00483         SSE2_CombineState(3)<a name="l00484"></a>00484         SSE2_CombineState(4)<a name="l00485"></a>00485         SSE2_CombineState(5)<a name="l00486"></a>00486         SSE2_CombineState(6)<a name="l00487"></a>00487         SSE2_CombineState(7)<a name="l00488"></a>00488 <a name="l00489"></a>00489         AS1(    pop             esp)<a name="l00490"></a>00490         AS1(    emms)<a name="l00491"></a>00491 <a name="l00492"></a>00492 #<span class="keywordflow">if</span> defined(__GNUC__)<a name="l00493"></a>00493         AS1(    pop             ebx)<a name="l00494"></a>00494         <span class="stringliteral">".att_syntax prefix;"</span><a name="l00495"></a>00495                 :<a name="l00496"></a>00496                 : <span class="stringliteral">"a"</span> (SHA512_K), <span class="stringliteral">"c"</span> (state), <span class="stringliteral">"d"</span> (data)<a name="l00497"></a>00497                 : <span class="stringliteral">"%esi"</span>, <span class="stringliteral">"%edi"</span>, <span class="stringliteral">"memory"</span>, <span class="stringliteral">"cc"</span><a name="l00498"></a>00498         );<a name="l00499"></a>00499 <span class="preprocessor">#else</span><a name="l00500"></a>00500 <span class="preprocessor"></span>        AS1(    pop             edi)<a name="l00501"></a>00501         AS1(    pop             esi)<a name="l00502"></a>00502         AS1(    pop             ebx)<a name="l00503"></a>00503         AS1(    ret)<a name="l00504"></a>00504 <span class="preprocessor">#endif</span><a name="l00505"></a>00505 <span class="preprocessor"></span>}<a name="l00506"></a>00506 <span class="preprocessor">#endif  // #if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE</span><a name="l00507"></a>00507 <span class="preprocessor"></span><a name="l00508"></a><a class="code" href="class_s_h_a512.html#4c5ac35076baf1b8046297d37514a34d">00508</a> <span class="keywordtype">void</span> <a class="code" href="class_s_h_a512.html#4c5ac35076baf1b8046297d37514a34d">SHA512::Transform</a>(word64 *state, <span class="keyword">const</span> word64 *data)<a name="l00509"></a>00509 {<a name="l00510"></a>00510 <span class="preprocessor">#if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE &amp;&amp; CRYPTOPP_BOOL_X86</span><a name="l00511"></a>00511 <span class="preprocessor"></span>        <span class="keywordflow">if</span> (HasSSE2())<a name="l00512"></a>00512         {<a name="l00513"></a>00513                 SHA512_SSE2_Transform(state, data);<a name="l00514"></a>00514                 <span class="keywordflow">return</span>;<a name="l00515"></a>00515         }<a name="l00516"></a>00516 <span class="preprocessor">#endif</span><a name="l00517"></a>00517 <span class="preprocessor"></span><a name="l00518"></a>00518 <span class="preprocessor">#define S0(x) (rotrFixed(x,28)^rotrFixed(x,34)^rotrFixed(x,39))</span><a name="l00519"></a>00519 <span class="preprocessor"></span><span class="preprocessor">#define S1(x) (rotrFixed(x,14)^rotrFixed(x,18)^rotrFixed(x,41))</span><a name="l00520"></a>00520 <span class="preprocessor"></span><span class="preprocessor">#define s0(x) (rotrFixed(x,1)^rotrFixed(x,8)^(x&gt;&gt;7))</span><a name="l00521"></a>00521 <span class="preprocessor"></span><span class="preprocessor">#define s1(x) (rotrFixed(x,19)^rotrFixed(x,61)^(x&gt;&gt;6))</span><a name="l00522"></a>00522 <span class="preprocessor"></span><a name="l00523"></a>00523 <span class="preprocessor">#define R(i) h(i)+=S1(e(i))+Ch(e(i),f(i),g(i))+SHA512_K[i+j]+(j?blk2(i):blk0(i));\</span><a name="l00524"></a>00524 <span class="preprocessor">        d(i)+=h(i);h(i)+=S0(a(i))+Maj(a(i),b(i),c(i))</span><a name="l00525"></a>00525 <span class="preprocessor"></span><a name="l00526"></a>00526         word64 W[16];<a name="l00527"></a>00527         word64 T[8];<a name="l00528"></a>00528     <span class="comment">/* Copy context-&gt;state[] to working vars */</span><a name="l00529"></a>00529         memcpy(T, state, <span class="keyword">sizeof</span>(T));<a name="l00530"></a>00530     <span class="comment">/* 80 operations, partially loop unrolled */</span><a name="l00531"></a>00531         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j=0; j&lt;80; j+=16)<a name="l00532"></a>00532         {<a name="l00533"></a>00533                 R( 0); R( 1); R( 2); R( 3);<a name="l00534"></a>00534                 R( 4); R( 5); R( 6); R( 7);<a name="l00535"></a>00535                 R( 8); R( 9); R(10); R(11);<a name="l00536"></a>00536                 R(12); R(13); R(14); R(15);<a name="l00537"></a>00537         }<a name="l00538"></a>00538     <span class="comment">/* Add the working vars back into context.state[] */</span><a name="l00539"></a>00539     state[0] += a(0);<a name="l00540"></a>00540     state[1] += b(0);<a name="l00541"></a>00541     state[2] += c(0);<a name="l00542"></a>00542     state[3] += d(0);<a name="l00543"></a>00543     state[4] += e(0);<a name="l00544"></a>00544     state[5] += f(0);<a name="l00545"></a>00545     state[6] += g(0);<a name="l00546"></a>00546     state[7] += h(0);<a name="l00547"></a>00547 }<a name="l00548"></a>00548 <a name="l00549"></a>00549 <span class="preprocessor">#endif</span><a name="l00550"></a>00550 <span class="preprocessor"></span><a name="l00551"></a>00551 NAMESPACE_END<a name="l00552"></a>00552 <a name="l00553"></a>00553 <span class="preprocessor">#endif  // #ifndef CRYPTOPP_IMPORTS</span></pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Fri Jun 1 11:11:24 2007 for Crypto++ by&nbsp;<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.2 </small></address></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -