📄 x86.s
字号:
DES_xor_key2: pushl %ebx movl 8(%esp),%edx movl 12(%esp),%ebx pushl %esi pushl %edi DES_xor2(0) DES_xor2(32) DES_xor2(8) DES_xor2(16) DES_xor2(24) DES_xor2(40) DES_xor2(48) DES_xor2(56) DES_xor2(64) DES_xor2(96) DES_xor2(72) DES_xor2(80) DES_xor2(88) DES_xor2(104) DES_xor2(112) DES_xor2(120) popl %edi popl %esi popl %ebx ret#endif.data/* * Weird alignments to make sure KS address's bits 5-11 never match current * instruction pointer's bits 5-11. */#ifdef SOLARISDO_ALIGN(12).zero 0x1000 - 32 - 128#elif defined(__DJGPP__).textDO_ALIGN(12).space (0x1000 - 32 - 128 - 0xE0)#elseDO_ALIGN(12).space (0x1000 - 32 - 128)#endif#if !DES_X2/* * The function pointer, set by CPU_detect(). */.globl DES_std_cryptDES_std_crypt:.long DES_std_crypt_anyDES_SavedL:.long 0#endif/* * These are in .data, not .bss, to get them in a cache line that has to be * already loaded at DES_std_crypt() startup. */.globl DES_IVDES_IV:#ifdef SOLARIS.zero 16#else.space 16#endif.globl DES_countDES_count:.long 0DES_count_tmp:.long 0DO_ALIGN(5).globl DES_KS_copyDES_KS_copy:#ifdef SOLARIS.zero 128#else.space 128#endif#ifdef __DJGPP__.space 32#endif#ifndef BSD.bss#endif#if DES_X2.globl DES_SPE_FDES_SPE_F:.space 0x1000#else.globl DES_SPE_LDES_SPE_L:#ifdef SOLARIS.zero 0x800#else.space 0x800#endif/* * Cache bank shift. This should be at least as large as the word size, but * smaller than the cache line size. (At least on Intel Pentium, two loads * can't dual issue if accessing the same cache bank.) */.long 0.globl DES_SPE_HDES_SPE_H:#ifdef SOLARIS.zero 0x800#else.space 0x800#endif#endifDO_ALIGN(5).globl DES_KS_currentDES_KS_current:#ifdef SOLARIS.zero 128#else.space 128#endif.globl DES_KS_tableDES_KS_table:#ifdef SOLARIS.zero 0x20000#else.space (8 * 128 * 16 * 8)#endif/* * MD5 stuff, optimized for Intel Pentium only right now. */#define S11 7#define S12 12#define S13 17#define S14 22#define S21 5#define S22 9#define S23 14#define S24 20#define S31 4#define S32 11#define S33 16#define S34 23#define S41 6#define S42 10#define S43 15#define S44 21#define Ca 0x67452301#define Cb 0xefcdab89#define Cc 0x98badcfe#define Cd 0x10325476#define a %esi#define b %edi#define c %edx#define d %ebx#undef tmp1#undef tmp2#define tmp1 %eax#define tmp2 %ecx#ifdef SOLARIS#define x(i) i+i+i+i(%ebp)#else#define x(i) 4*i(%ebp)#endif.text#define FF(a, b, c, d, x, s, ac) \ andl b,tmp1; \ addl x,a; \ xorl d,tmp1; \ addl $ac,a; \ addl tmp1,a; \ movl b,tmp1; \ roll $s,a; \ xorl c,tmp1; \ addl b,a#define GG(a, b, c, d, x, s, ac) \ movl x,tmp2; \ xorl b,tmp1; \ addl tmp2,a; \ andl d,tmp1; \ addl $ac,a; \ xorl c,tmp1; \ addl tmp1,a; \ roll $s,a; \ movl b,tmp1; \ addl b,a#define HH(a, b, c, d, x, s, ac) \ movl c,tmp1; \ addl tmp2,a; \ xorl d,tmp1; \ addl $ac,a; \ xorl b,tmp1; \ movl x,tmp2; \ addl tmp1,a; \ roll $s,a; \ addl b,a#define II(a, b, c, d, x, s, ac) \ xorl d,tmp2; \ addl x,a; \ orl b,tmp2; \ addl $ac,a; \ xorl c,tmp2; \ addl tmp2,a; \ movl $-1,tmp2; \ roll $s,a; \ addl b,aDO_ALIGN(5).globl MD5_bodyMD5_body: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%ebp/* Round 1 */ movl $0xd76aa477,a movl $Cb,b addl x(0),a movl $Cc,c roll $S11,a movl $Cd,d addl b,a movl $0x77777777,tmp1 FF (d, a, b, c, x( 1), S12, 0xe8c7b756) /* 2 */ FF (c, d, a, b, x( 2), S13, 0x242070db) /* 3 */ FF (b, c, d, a, x( 3), S14, 0xc1bdceee) /* 4 */ FF (a, b, c, d, x( 4), S11, 0xf57c0faf) /* 5 */ FF (d, a, b, c, x( 5), S12, 0x4787c62a) /* 6 */ FF (c, d, a, b, x( 6), S13, 0xa8304613) /* 7 */ FF (b, c, d, a, x( 7), S14, 0xfd469501) /* 8 */ FF (a, b, c, d, x( 8), S11, 0x698098d8) /* 9 */ FF (d, a, b, c, x( 9), S12, 0x8b44f7af) /* 10 */ FF (c, d, a, b, x(10), S13, 0xffff5bb1) /* 11 */ FF (b, c, d, a, x(11), S14, 0x895cd7be) /* 12 */ FF (a, b, c, d, x(12), S11, 0x6b901122) /* 13 */ FF (d, a, b, c, x(13), S12, 0xfd987193) /* 14 */ FF (c, d, a, b, x(14), S13, 0xa679438e) /* 15 */ andl c,tmp1 addl $0x49b40821,b xorl a,tmp1 addl tmp1,b roll $S14,b movl c,tmp1 addl c,b/* Round 2 */ GG (a, b, c, d, x( 1), S21, 0xf61e2562) /* 17 */ GG (d, a, b, c, x( 6), S22, 0xc040b340) /* 18 */ GG (c, d, a, b, x(11), S23, 0x265e5a51) /* 19 */ GG (b, c, d, a, x( 0), S24, 0xe9b6c7aa) /* 20 */ GG (a, b, c, d, x( 5), S21, 0xd62f105d) /* 21 */ GG (d, a, b, c, x(10), S22, 0x2441453) /* 22 */ xorl d,tmp1 andl b,tmp1 addl $0xd8a1e681,c xorl a,tmp1 addl tmp1,c roll $S23,c movl d,tmp1 addl d,c GG (b, c, d, a, x( 4), S24, 0xe7d3fbc8) /* 24 */ GG (a, b, c, d, x( 9), S21, 0x21e1cde6) /* 25 */ GG (d, a, b, c, x(14), S22, 0xc33707d6) /* 26 */ GG (c, d, a, b, x( 3), S23, 0xf4d50d87) /* 27 */ GG (b, c, d, a, x( 8), S24, 0x455a14ed) /* 28 */ GG (a, b, c, d, x(13), S21, 0xa9e3e905) /* 29 */ GG (d, a, b, c, x( 2), S22, 0xfcefa3f8) /* 30 */ GG (c, d, a, b, x( 7), S23, 0x676f02d9) /* 31 */ movl x(12),tmp2 xorl c,tmp1 addl tmp2,b andl a,tmp1 addl $0x8d2a4c8a,b xorl d,tmp1 movl x(5),tmp2 addl tmp1,b roll $S24,b addl c,b/* Round 3 */ HH (a, b, c, d, x( 8), S31, 0xfffa3942) /* 33 */ HH (d, a, b, c, x(11), S32, 0x8771f681) /* 34 */ HH (c, d, a, b, x(14), S33, 0x6d9d6122) /* 35 */ HH (b, c, d, a, x( 1), S34, 0xfde5380c) /* 36 */ HH (a, b, c, d, x( 4), S31, 0xa4beea44) /* 37 */ HH (d, a, b, c, x( 7), S32, 0x4bdecfa9) /* 38 */ HH (c, d, a, b, x(10), S33, 0xf6bb4b60) /* 39 */ HH (b, c, d, a, x(13), S34, 0xbebfbc70) /* 40 */ HH (a, b, c, d, x( 0), S31, 0x289b7ec6) /* 41 */ HH (d, a, b, c, x( 3), S32, 0xeaa127fa) /* 42 */ HH (c, d, a, b, x( 6), S33, 0xd4ef3085) /* 43 */ HH (b, c, d, a, x( 9), S34, 0x4881d05) /* 44 */ HH (a, b, c, d, x(12), S31, 0xd9d4d039) /* 45 */ HH (d, a, b, c, x( 2), S32, 0xe6db99e5) /* 46 */ movl a,tmp1 xorl b,tmp1 addl $0x1fa27cf8,c xorl d,tmp1 addl tmp1,c roll $S33,c addl d,c HH (b, c, d, a, $-1, S34, 0xc4ac5665) /* 48 *//* Round 4 */ II (a, b, c, d, x( 0), S41, 0xf4292244) /* 49 */ II (d, a, b, c, x( 7), S42, 0x432aff97) /* 50 */ II (c, d, a, b, x(14), S43, 0xab9423a7) /* 51 */ II (b, c, d, a, x( 5), S44, 0xfc93a039) /* 52 */ II (a, b, c, d, x(12), S41, 0x655b59c3) /* 53 */ II (d, a, b, c, x( 3), S42, 0x8f0ccc92) /* 54 */ II (c, d, a, b, x(10), S43, 0xffeff47d) /* 55 */ II (b, c, d, a, x( 1), S44, 0x85845dd1) /* 56 */ II (a, b, c, d, x( 8), S41, 0x6fa87e4f) /* 57 */ xorl c,tmp2 orl a,tmp2 addl $0xfe2ce6e0,d xorl b,tmp2 addl tmp2,d movl $-1,tmp2 roll $S42,d addl a,d II (c, d, a, b, x( 6), S43, 0xa3014314) /* 59 */ II (b, c, d, a, x(13), S44, 0x4e0811a1) /* 60 */ II (a, b, c, d, x( 4), S41, 0xf7537e82) /* 61 */ II (d, a, b, c, x(11), S42, 0xbd3af235) /* 62 */ II (c, d, a, b, x( 2), S43, 0x2ad7d2bb) /* 63 */ xorl a,tmp2 addl x(9),b orl c,tmp2 addl $0xeb86d391,b xorl d,tmp2 addl tmp2,b movl 24(%esp),tmp1 roll $S44,b/* Update the state and return */ addl $Ca,a addl $Cd,d movl a,(tmp1) leal Cb(b,c),b addl $Cc,c movl b,4(tmp1) movl c,8(tmp1) movl d,12(tmp1) popl %edi popl %esi popl %ebx popl %ebp ret/* * Blowfish stuff. */#undef L#undef R#undef tmp1#undef tmp2#define L %esi#define R %edi#define tmp1 %ecx#define tmp1_lo %cl#define tmp2 %ebp#ifdef SOLARIS#define P(N) BF_current+0x1000+N+N+N+N#else#define P(N) BF_current+0x1000+4*N#endif.text#define BF_ROUND(L, R, N) \ xorl L,%eax; \ xorl tmp1,tmp1; \ movl %eax,L; \ shrl $16,%eax; \ movl L,%edx; \ movb %ah,tmp1_lo; \ andl $0xFF,%eax; \ movb %dh,%bl; \ andl $0xFF,%edx; \ movl BF_current(,tmp1,4),tmp1; \ movl BF_current+0x400(,%eax,4),tmp2; \ addl tmp2,tmp1; \ movl BF_current+0x800(,%ebx,4),tmp2; \ xorl tmp2,tmp1; \ movl BF_current+0xC00(,%edx,4),tmp2; \ addl tmp1,tmp2; \ movl P(N)+4,%eax; \ xorl tmp2,R#define BF_ENCRYPT_START \ BF_ROUND(L, R, 0); \ BF_ROUND(R, L, 1); \ BF_ROUND(L, R, 2); \ BF_ROUND(R, L, 3); \ BF_ROUND(L, R, 4); \ BF_ROUND(R, L, 5); \ BF_ROUND(L, R, 6); \ BF_ROUND(R, L, 7); \ BF_ROUND(L, R, 8); \ BF_ROUND(R, L, 9); \ BF_ROUND(L, R, 10); \ BF_ROUND(R, L, 11); \ BF_ROUND(L, R, 12); \ BF_ROUND(R, L, 13); \ BF_ROUND(L, R, 14); \ BF_ROUND(R, L, 15); \ movl BF_ptr,tmp2; \ xorl L,%eax; \ movl P(17),L#define BF_ENCRYPT_END \ xorl R,L; \ movl %eax,RDO_ALIGN(12).globl BF_bodyBF_body: pushl %ebp pushl %ebx pushl %esi pushl %edi xorl L,L xorl R,R movl P(0),%eax xorl %ebx,%ebx movl $P(0),BF_ptrBF_loop_P: BF_ENCRYPT_START addl $8,tmp2 BF_ENCRYPT_END movl tmp2,BF_ptr cmpl $P(18),tmp2 movl L,-8(tmp2) movl R,-4(tmp2) movl P(0),%eax jb BF_loop_P xorl %ebx,%ebx movl $BF_current,BF_ptrBF_loop_S: BF_ENCRYPT_START BF_ENCRYPT_END movl P(0),%eax movl L,(tmp2) movl R,4(tmp2) BF_ENCRYPT_START BF_ENCRYPT_END movl P(0),%eax movl L,8(tmp2) movl R,12(tmp2) BF_ENCRYPT_START BF_ENCRYPT_END movl P(0),%eax movl L,16(tmp2) movl R,20(tmp2) BF_ENCRYPT_START addl $32,tmp2 BF_ENCRYPT_END movl tmp2,BF_ptr cmpl $BF_current+0x1000,tmp2 movl P(0),%eax movl L,-8(tmp2) movl R,-4(tmp2) jb BF_loop_S popl %edi popl %esi popl %ebx popl %ebp ret#ifdef BSD.data#else.bss#endif#ifdef SOLARISDO_ALIGN(12).zero 0x1000 - 96#elif defined(__DJGPP__).textDO_ALIGN(12).space (0x1000 - 96 - 0x100)#elseDO_ALIGN(12).space (0x1000 - 96)#endif.globl BF_currentBF_current:#ifdef SOLARIS.zero 0x1000 + 72#else.space (0x1000 + 72)#endifBF_ptr:.long 0#ifdef __DJGPP__.space 32#endif/* * CPU detection. */#define EF_ID $0x00200000#define CF_MMX $0x00800000#define CV_INTEL $0x6C65746E.text.globl CPU_detectCPU_detect: pushfl pushfl xorl EF_ID,(%esp) popfl pushfl popl %eax xorl (%esp),%eax popfl andl EF_ID,%eax jz CPU_detect_ret movl $1,%eax pushl %ebx#if DES_X2 cpuid popl %ebx xchgl %edx,%eax andl CF_MMX,%eax#else .byte 0x0F .byte 0xA2 popl %ebx andb $0x0F,%ah cmpb $5,%ah jne CPU_detect_ret xorl %eax,%eax pushl %ebx .byte 0x0F .byte 0xA2 popl %ebx cmpl CV_INTEL,%ecx jne CPU_detect_ret movl $DES_std_crypt_P5,%eax movl %eax,DES_std_crypt#endifCPU_detect_ret: ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -