📄 ripemd.cpp
字号:
AS1( emms ) \
AS1( ret 8 )
#endif
PROLOG()
#ifdef OLD_GCC_OFFSET
AS2( lea esi, [ecx + 20] ) // digest_[0]
#else
AS2( lea esi, [ecx + 16] ) // digest_[0]
#endif
AS2( sub esp, 24 ) // make room for tmp a1 - e1
AS2( movd mm1, esi ) // store digest_
AS1( loopStart: )
AS2( movd mm2, edx ) // store times_
AS2( mov eax, [esi] ) // a1
AS2( mov ebx, [esi + 4] ) // b1
AS2( mov ecx, [esi + 8] ) // c1
AS2( mov edx, [esi + 12] ) // d1
AS2( mov ebp, [esi + 16] ) // e1
// setup
AS2( mov esi, ecx )
ASMSubroundF( eax, ebx, ecx, edx, ebp, 0, 11)
ASMSubroundF( ebp, eax, ebx, ecx, edx, 1, 14)
ASMSubroundF( edx, ebp, eax, ebx, ecx, 2, 15)
ASMSubroundF( ecx, edx, ebp, eax, ebx, 3, 12)
ASMSubroundF( ebx, ecx, edx, ebp, eax, 4, 5)
ASMSubroundF( eax, ebx, ecx, edx, ebp, 5, 8)
ASMSubroundF( ebp, eax, ebx, ecx, edx, 6, 7)
ASMSubroundF( edx, ebp, eax, ebx, ecx, 7, 9)
ASMSubroundF( ecx, edx, ebp, eax, ebx, 8, 11)
ASMSubroundF( ebx, ecx, edx, ebp, eax, 9, 13)
ASMSubroundF( eax, ebx, ecx, edx, ebp, 10, 14)
ASMSubroundF( ebp, eax, ebx, ecx, edx, 11, 15)
ASMSubroundF( edx, ebp, eax, ebx, ecx, 12, 6)
ASMSubroundF( ecx, edx, ebp, eax, ebx, 13, 7)
ASMSubroundF( ebx, ecx, edx, ebp, eax, 14, 9)
ASMSubroundF( eax, ebx, ecx, edx, ebp, 15, 8)
ASMSubroundG( ebp, eax, ebx, ecx, edx, 7, 7, k1)
ASMSubroundG( edx, ebp, eax, ebx, ecx, 4, 6, k1)
ASMSubroundG( ecx, edx, ebp, eax, ebx, 13, 8, k1)
ASMSubroundG( ebx, ecx, edx, ebp, eax, 1, 13, k1)
ASMSubroundG( eax, ebx, ecx, edx, ebp, 10, 11, k1)
ASMSubroundG( ebp, eax, ebx, ecx, edx, 6, 9, k1)
ASMSubroundG( edx, ebp, eax, ebx, ecx, 15, 7, k1)
ASMSubroundG( ecx, edx, ebp, eax, ebx, 3, 15, k1)
ASMSubroundG( ebx, ecx, edx, ebp, eax, 12, 7, k1)
ASMSubroundG( eax, ebx, ecx, edx, ebp, 0, 12, k1)
ASMSubroundG( ebp, eax, ebx, ecx, edx, 9, 15, k1)
ASMSubroundG( edx, ebp, eax, ebx, ecx, 5, 9, k1)
ASMSubroundG( ecx, edx, ebp, eax, ebx, 2, 11, k1)
ASMSubroundG( ebx, ecx, edx, ebp, eax, 14, 7, k1)
ASMSubroundG( eax, ebx, ecx, edx, ebp, 11, 13, k1)
ASMSubroundG( ebp, eax, ebx, ecx, edx, 8, 12, k1)
ASMSubroundH( edx, ebp, eax, ebx, ecx, 3, 11, k2)
ASMSubroundH( ecx, edx, ebp, eax, ebx, 10, 13, k2)
ASMSubroundH( ebx, ecx, edx, ebp, eax, 14, 6, k2)
ASMSubroundH( eax, ebx, ecx, edx, ebp, 4, 7, k2)
ASMSubroundH( ebp, eax, ebx, ecx, edx, 9, 14, k2)
ASMSubroundH( edx, ebp, eax, ebx, ecx, 15, 9, k2)
ASMSubroundH( ecx, edx, ebp, eax, ebx, 8, 13, k2)
ASMSubroundH( ebx, ecx, edx, ebp, eax, 1, 15, k2)
ASMSubroundH( eax, ebx, ecx, edx, ebp, 2, 14, k2)
ASMSubroundH( ebp, eax, ebx, ecx, edx, 7, 8, k2)
ASMSubroundH( edx, ebp, eax, ebx, ecx, 0, 13, k2)
ASMSubroundH( ecx, edx, ebp, eax, ebx, 6, 6, k2)
ASMSubroundH( ebx, ecx, edx, ebp, eax, 13, 5, k2)
ASMSubroundH( eax, ebx, ecx, edx, ebp, 11, 12, k2)
ASMSubroundH( ebp, eax, ebx, ecx, edx, 5, 7, k2)
ASMSubroundH( edx, ebp, eax, ebx, ecx, 12, 5, k2)
ASMSubroundI( ecx, edx, ebp, eax, ebx, 1, 11, k3)
ASMSubroundI( ebx, ecx, edx, ebp, eax, 9, 12, k3)
ASMSubroundI( eax, ebx, ecx, edx, ebp, 11, 14, k3)
ASMSubroundI( ebp, eax, ebx, ecx, edx, 10, 15, k3)
ASMSubroundI( edx, ebp, eax, ebx, ecx, 0, 14, k3)
ASMSubroundI( ecx, edx, ebp, eax, ebx, 8, 15, k3)
ASMSubroundI( ebx, ecx, edx, ebp, eax, 12, 9, k3)
ASMSubroundI( eax, ebx, ecx, edx, ebp, 4, 8, k3)
ASMSubroundI( ebp, eax, ebx, ecx, edx, 13, 9, k3)
ASMSubroundI( edx, ebp, eax, ebx, ecx, 3, 14, k3)
ASMSubroundI( ecx, edx, ebp, eax, ebx, 7, 5, k3)
ASMSubroundI( ebx, ecx, edx, ebp, eax, 15, 6, k3)
ASMSubroundI( eax, ebx, ecx, edx, ebp, 14, 8, k3)
ASMSubroundI( ebp, eax, ebx, ecx, edx, 5, 6, k3)
ASMSubroundI( edx, ebp, eax, ebx, ecx, 6, 5, k3)
ASMSubroundI( ecx, edx, ebp, eax, ebx, 2, 12, k3)
// setup
AS2( mov esi, ebp )
ASMSubroundJ( ebx, ecx, edx, ebp, eax, 4, 9, k4)
ASMSubroundJ( eax, ebx, ecx, edx, ebp, 0, 15, k4)
ASMSubroundJ( ebp, eax, ebx, ecx, edx, 5, 5, k4)
ASMSubroundJ( edx, ebp, eax, ebx, ecx, 9, 11, k4)
ASMSubroundJ( ecx, edx, ebp, eax, ebx, 7, 6, k4)
ASMSubroundJ( ebx, ecx, edx, ebp, eax, 12, 8, k4)
ASMSubroundJ( eax, ebx, ecx, edx, ebp, 2, 13, k4)
ASMSubroundJ( ebp, eax, ebx, ecx, edx, 10, 12, k4)
ASMSubroundJ( edx, ebp, eax, ebx, ecx, 14, 5, k4)
ASMSubroundJ( ecx, edx, ebp, eax, ebx, 1, 12, k4)
ASMSubroundJ( ebx, ecx, edx, ebp, eax, 3, 13, k4)
ASMSubroundJ( eax, ebx, ecx, edx, ebp, 8, 14, k4)
ASMSubroundJ( ebp, eax, ebx, ecx, edx, 11, 11, k4)
ASMSubroundJ( edx, ebp, eax, ebx, ecx, 6, 8, k4)
ASMSubroundJ( ecx, edx, ebp, eax, ebx, 15, 5, k4)
ASMSubroundJ( ebx, ecx, edx, ebp, eax, 13, 6, k4)
// store a1 - e1 on stack
AS2( movd esi, mm1 ) // digest_
AS2( mov [esp], eax )
AS2( mov [esp + 4], ebx )
AS2( mov [esp + 8], ecx )
AS2( mov [esp + 12], edx )
AS2( mov [esp + 16], ebp )
AS2( mov eax, [esi] ) // a2
AS2( mov ebx, [esi + 4] ) // b2
AS2( mov ecx, [esi + 8] ) // c2
AS2( mov edx, [esi + 12] ) // d2
AS2( mov ebp, [esi + 16] ) // e2
// setup
AS2( mov esi, edx )
ASMSubroundJ( eax, ebx, ecx, edx, ebp, 5, 8, k5)
ASMSubroundJ( ebp, eax, ebx, ecx, edx, 14, 9, k5)
ASMSubroundJ( edx, ebp, eax, ebx, ecx, 7, 9, k5)
ASMSubroundJ( ecx, edx, ebp, eax, ebx, 0, 11, k5)
ASMSubroundJ( ebx, ecx, edx, ebp, eax, 9, 13, k5)
ASMSubroundJ( eax, ebx, ecx, edx, ebp, 2, 15, k5)
ASMSubroundJ( ebp, eax, ebx, ecx, edx, 11, 15, k5)
ASMSubroundJ( edx, ebp, eax, ebx, ecx, 4, 5, k5)
ASMSubroundJ( ecx, edx, ebp, eax, ebx, 13, 7, k5)
ASMSubroundJ( ebx, ecx, edx, ebp, eax, 6, 7, k5)
ASMSubroundJ( eax, ebx, ecx, edx, ebp, 15, 8, k5)
ASMSubroundJ( ebp, eax, ebx, ecx, edx, 8, 11, k5)
ASMSubroundJ( edx, ebp, eax, ebx, ecx, 1, 14, k5)
ASMSubroundJ( ecx, edx, ebp, eax, ebx, 10, 14, k5)
ASMSubroundJ( ebx, ecx, edx, ebp, eax, 3, 12, k5)
ASMSubroundJ( eax, ebx, ecx, edx, ebp, 12, 6, k5)
// setup
AS2( mov esi, ebx )
ASMSubroundI( ebp, eax, ebx, ecx, edx, 6, 9, k6)
ASMSubroundI( edx, ebp, eax, ebx, ecx, 11, 13, k6)
ASMSubroundI( ecx, edx, ebp, eax, ebx, 3, 15, k6)
ASMSubroundI( ebx, ecx, edx, ebp, eax, 7, 7, k6)
ASMSubroundI( eax, ebx, ecx, edx, ebp, 0, 12, k6)
ASMSubroundI( ebp, eax, ebx, ecx, edx, 13, 8, k6)
ASMSubroundI( edx, ebp, eax, ebx, ecx, 5, 9, k6)
ASMSubroundI( ecx, edx, ebp, eax, ebx, 10, 11, k6)
ASMSubroundI( ebx, ecx, edx, ebp, eax, 14, 7, k6)
ASMSubroundI( eax, ebx, ecx, edx, ebp, 15, 7, k6)
ASMSubroundI( ebp, eax, ebx, ecx, edx, 8, 12, k6)
ASMSubroundI( edx, ebp, eax, ebx, ecx, 12, 7, k6)
ASMSubroundI( ecx, edx, ebp, eax, ebx, 4, 6, k6)
ASMSubroundI( ebx, ecx, edx, ebp, eax, 9, 15, k6)
ASMSubroundI( eax, ebx, ecx, edx, ebp, 1, 13, k6)
ASMSubroundI( ebp, eax, ebx, ecx, edx, 2, 11, k6)
ASMSubroundH( edx, ebp, eax, ebx, ecx, 15, 9, k7)
ASMSubroundH( ecx, edx, ebp, eax, ebx, 5, 7, k7)
ASMSubroundH( ebx, ecx, edx, ebp, eax, 1, 15, k7)
ASMSubroundH( eax, ebx, ecx, edx, ebp, 3, 11, k7)
ASMSubroundH( ebp, eax, ebx, ecx, edx, 7, 8, k7)
ASMSubroundH( edx, ebp, eax, ebx, ecx, 14, 6, k7)
ASMSubroundH( ecx, edx, ebp, eax, ebx, 6, 6, k7)
ASMSubroundH( ebx, ecx, edx, ebp, eax, 9, 14, k7)
ASMSubroundH( eax, ebx, ecx, edx, ebp, 11, 12, k7)
ASMSubroundH( ebp, eax, ebx, ecx, edx, 8, 13, k7)
ASMSubroundH( edx, ebp, eax, ebx, ecx, 12, 5, k7)
ASMSubroundH( ecx, edx, ebp, eax, ebx, 2, 14, k7)
ASMSubroundH( ebx, ecx, edx, ebp, eax, 10, 13, k7)
ASMSubroundH( eax, ebx, ecx, edx, ebp, 0, 13, k7)
ASMSubroundH( ebp, eax, ebx, ecx, edx, 4, 7, k7)
ASMSubroundH( edx, ebp, eax, ebx, ecx, 13, 5, k7)
ASMSubroundG( ecx, edx, ebp, eax, ebx, 8, 15, k8)
ASMSubroundG( ebx, ecx, edx, ebp, eax, 6, 5, k8)
ASMSubroundG( eax, ebx, ecx, edx, ebp, 4, 8, k8)
ASMSubroundG( ebp, eax, ebx, ecx, edx, 1, 11, k8)
ASMSubroundG( edx, ebp, eax, ebx, ecx, 3, 14, k8)
ASMSubroundG( ecx, edx, ebp, eax, ebx, 11, 14, k8)
ASMSubroundG( ebx, ecx, edx, ebp, eax, 15, 6, k8)
ASMSubroundG( eax, ebx, ecx, edx, ebp, 0, 14, k8)
ASMSubroundG( ebp, eax, ebx, ecx, edx, 5, 6, k8)
ASMSubroundG( edx, ebp, eax, ebx, ecx, 12, 9, k8)
ASMSubroundG( ecx, edx, ebp, eax, ebx, 2, 12, k8)
ASMSubroundG( ebx, ecx, edx, ebp, eax, 13, 9, k8)
ASMSubroundG( eax, ebx, ecx, edx, ebp, 9, 12, k8)
ASMSubroundG( ebp, eax, ebx, ecx, edx, 7, 5, k8)
ASMSubroundG( edx, ebp, eax, ebx, ecx, 10, 15, k8)
ASMSubroundG( ecx, edx, ebp, eax, ebx, 14, 8, k8)
ASMSubroundF( ebx, ecx, edx, ebp, eax, 12, 8)
ASMSubroundF( eax, ebx, ecx, edx, ebp, 15, 5)
ASMSubroundF( ebp, eax, ebx, ecx, edx, 10, 12)
ASMSubroundF( edx, ebp, eax, ebx, ecx, 4, 9)
ASMSubroundF( ecx, edx, ebp, eax, ebx, 1, 12)
ASMSubroundF( ebx, ecx, edx, ebp, eax, 5, 5)
ASMSubroundF( eax, ebx, ecx, edx, ebp, 8, 14)
ASMSubroundF( ebp, eax, ebx, ecx, edx, 7, 6)
ASMSubroundF( edx, ebp, eax, ebx, ecx, 6, 8)
ASMSubroundF( ecx, edx, ebp, eax, ebx, 2, 13)
ASMSubroundF( ebx, ecx, edx, ebp, eax, 13, 6)
ASMSubroundF( eax, ebx, ecx, edx, ebp, 14, 5)
ASMSubroundF( ebp, eax, ebx, ecx, edx, 0, 15)
ASMSubroundF( edx, ebp, eax, ebx, ecx, 3, 13)
ASMSubroundF( ecx, edx, ebp, eax, ebx, 9, 11)
ASMSubroundF( ebx, ecx, edx, ebp, eax, 11, 11)
// advance data and store for next round
AS2( add edi, 64 )
AS2( movd esi, mm1 ) // digest_
AS2( movd mm0, edi ) // store
// now edi as tmp
// c1 = digest_[1] + c1 + d2;
AS2( add [esp + 8], edx ) // + d2
AS2( mov edi, [esi + 4] ) // digest_[1]
AS2( add [esp + 8], edi )
// digest_[1] = digest_[2] + d1 + e2;
AS2( mov [esi + 4], ebp ) // e2
AS2( mov edi, [esp + 12] ) // d1
AS2( add edi, [esi + 8] ) // digest_[2]
AS2( add [esi + 4], edi )
// digest_[2] = digest_[3] + e1 + a2;
AS2( mov [esi + 8], eax ) // a2
AS2( mov edi, [esp + 16] ) // e1
AS2( add edi, [esi + 12] ) // digest_[3]
AS2( add [esi + 8], edi )
// digest_[3] = digest_[4] + a1 + b2;
AS2( mov [esi + 12], ebx ) // b2
AS2( mov edi, [esp] ) // a1
AS2( add edi, [esi + 16] ) // digest_[4]
AS2( add [esi + 12], edi )
// digest_[4] = digest_[0] + b1 + c2;
AS2( mov [esi + 16], ecx ) // c2
AS2( mov edi, [esp + 4] ) // b1
AS2( add edi, [esi] ) // digest_[0]
AS2( add [esi + 16], edi )
// digest_[0] = c1;
AS2( mov edi, [esp + 8] ) // c1
AS2( mov [esi], edi )
// setup for loop back
AS2( movd edx, mm2 ) // times
AS2( movd edi, mm0 ) // data, already advanced
AS1( dec edx )
AS1( jnz loopStart )
EPILOG()
}
#endif // DO_RIPEMD_ASM
} // namespace TaoCrypt
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -