📄 sha_8cpp-source.html
字号:
<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 && 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>>7))</span><a name="l00521"></a>00521 <span class="preprocessor"></span><span class="preprocessor">#define s1(x) (rotrFixed(x,19)^rotrFixed(x,61)^(x>>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->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<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 <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 + -