sha1block.spp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. .text
  2. .p2align 2,0x90
  3. .globl _sha1block
  4. .type _sha1block, @function
  5. _sha1block:
  6. /* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
  7. * wp[off] = x;
  8. * x += A <<< 5;
  9. * E += 0xca62c1d6 + x;
  10. * x = FN(B,C,D);
  11. * E += x;
  12. * B >>> 2
  13. */
  14. #define BSWAPDI BYTE $0x0f; BYTE $0xcf;
  15. #define BODY(off,FN,V,A,B,C,D,E)\
  16. movl (off-64)(%ebp), %edi;\
  17. xorl (off-56)(%ebp), %edi;\
  18. xorl (off-32)(%ebp), %edi;\
  19. xorl (off-12)(%ebp), %edi;\
  20. roll $1, %edi;\
  21. movl %edi, off(%ebp);\
  22. leal V(%edi, E, 1), E;\
  23. movl A, %edi;\
  24. roll $5, %edi;\
  25. addl %edi, E;\
  26. FN(B,C,D)\
  27. addl %edi, E;\
  28. rorl $2, B;\
  29. #define BODY0(off,FN,V,A,B,C,D,E)\
  30. movl off(%ebx), %edi;\
  31. bswap %edi;\
  32. movl %edi, off(%ebp);\
  33. leal V(%edi,E,1), E;\
  34. movl A, %edi;\
  35. roll $5,%edi;\
  36. addl %edi,E;\
  37. FN(B,C,D)\
  38. addl %edi,E;\
  39. rorl $2,B;\
  40. /*
  41. * fn1 = (((C^D)&B)^D);
  42. */
  43. #define FN1(B,C,D)\
  44. movl C, %edi;\
  45. xorl D, %edi;\
  46. andl B, %edi;\
  47. xorl D, %edi;\
  48. /*
  49. * fn24 = B ^ C ^ D
  50. */
  51. #define FN24(B,C,D)\
  52. movl B, %edi;\
  53. xorl C, %edi;\
  54. xorl D, %edi;\
  55. /*
  56. * fn3 = ((B ^ C) & (D ^= B)) ^ B
  57. * D ^= B to restore D
  58. */
  59. #define FN3(B,C,D)\
  60. movl B, %edi;\
  61. xorl C, %edi;\
  62. xorl B, D;\
  63. andl D, %edi;\
  64. xorl B, %edi;\
  65. xorl B, D;\
  66. /*
  67. * stack offsets
  68. * void sha1block(uchar *DATA, int LEN, ulong *STATE)
  69. */
  70. #define STACKSIZE (48+80*4)
  71. #define DATA (STACKSIZE+8)
  72. #define LEN (STACKSIZE+12)
  73. #define STATE (STACKSIZE+16)
  74. /*
  75. * stack offsets for locals
  76. * ulong w[80];
  77. * uchar *edata;
  78. * ulong *w15, *w40, *w60, *w80;
  79. * register local
  80. * ulong *wp = %ebp
  81. * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi
  82. * ulong tmp = edi
  83. */
  84. #define WARRAY (STACKSIZE-4-(80*4))
  85. #define TMP1 (STACKSIZE-8-(80*4))
  86. #define TMP2 (STACKSIZE-12-(80*4))
  87. #define W15 (STACKSIZE-16-(80*4))
  88. #define W40 (STACKSIZE-20-(80*4))
  89. #define W60 (STACKSIZE-24-(80*4))
  90. #define W80 (STACKSIZE-28-(80*4))
  91. #define EDATA (STACKSIZE-32-(80*4))
  92. #define OLDEBX (STACKSIZE-36-(80*4))
  93. #define OLDESI (STACKSIZE-40-(80*4))
  94. #define OLDEDI (STACKSIZE-44-(80*4))
  95. /* Prelude */
  96. pushl %ebp
  97. subl $(STACKSIZE), %esp
  98. mov %ebx, OLDEBX(%esp)
  99. mov %esi, OLDESI(%esp)
  100. mov %edi, OLDEDI(%esp)
  101. movl DATA(%esp), %eax
  102. addl LEN(%esp), %eax
  103. movl %eax, EDATA(%esp)
  104. leal (WARRAY+15*4)(%esp), %edi /* aw15 */
  105. movl %edi, W15(%esp)
  106. leal (WARRAY+40*4)(%esp), %edx /* aw40 */
  107. movl %edx, W40(%esp)
  108. leal (WARRAY+60*4)(%esp), %ecx /* aw60 */
  109. movl %ecx, W60(%esp)
  110. leal (WARRAY+80*4)(%esp), %edi /* aw80 */
  111. movl %edi, W80(%esp)
  112. 0:
  113. leal WARRAY(%esp), %ebp /* warray */
  114. movl STATE(%esp), %edi /* state */
  115. movl (%edi),%eax
  116. movl 4(%edi),%ebx
  117. movl %ebx, TMP1(%esp) /* tmp1 */
  118. movl 8(%edi), %ecx
  119. movl 12(%edi), %edx
  120. movl 16(%edi), %esi
  121. movl DATA(%esp), %ebx /* data */
  122. 1:
  123. BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi)
  124. movl %esi,TMP2(%esp)
  125. BODY0(4,FN1,0x5a827999,%esi,%eax,TMP1(%esp),%ecx,%edx)
  126. movl TMP1(%esp),%esi
  127. BODY0(8,FN1,0x5a827999,%edx,TMP2(%esp),%eax,%esi,%ecx)
  128. BODY0(12,FN1,0x5a827999,%ecx,%edx,TMP2(%esp),%eax,%esi)
  129. movl %esi,TMP1(%esp)
  130. BODY0(16,FN1,0x5a827999,%esi,%ecx,%edx,TMP2(%esp),%eax)
  131. movl TMP2(%esp),%esi
  132. addl $20, %ebx
  133. addl $20, %ebp
  134. cmpl W15(%esp), %ebp /* w15 */
  135. jb 1b
  136. BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi)
  137. addl $4, %ebx
  138. MOVL %ebx, DATA(%esp) /* data */
  139. MOVL TMP1(%esp),%ebx
  140. BODY(4,FN1,0x5a827999,%esi,%eax,%ebx,%ecx,%edx)
  141. BODY(8,FN1,0x5a827999,%edx,%esi,%eax,%ebx,%ecx)
  142. BODY(12,FN1,0x5a827999,%ecx,%edx,%esi,%eax,%ebx)
  143. BODY(16,FN1,0x5a827999,%ebx,%ecx,%edx,%esi,%eax)
  144. addl $20, %ebp
  145. 2:
  146. BODY(0,FN24,0x6ed9eba1,%eax,%ebx,%ecx,%edx,%esi)
  147. BODY(4,FN24,0x6ed9eba1,%esi,%eax,%ebx,%ecx,%edx)
  148. BODY(8,FN24,0x6ed9eba1,%edx,%esi,%eax,%ebx,%ecx)
  149. BODY(12,FN24,0x6ed9eba1,%ecx,%edx,%esi,%eax,%ebx)
  150. BODY(16,FN24,0x6ed9eba1,%ebx,%ecx,%edx,%esi,%eax)
  151. addl $20,%ebp
  152. cmpl W40(%esp), %ebp
  153. jb 2b
  154. 3:
  155. BODY(0,FN3,0x8f1bbcdc,%eax,%ebx,%ecx,%edx,%esi)
  156. BODY(4,FN3,0x8f1bbcdc,%esi,%eax,%ebx,%ecx,%edx)
  157. BODY(8,FN3,0x8f1bbcdc,%edx,%esi,%eax,%ebx,%ecx)
  158. BODY(12,FN3,0x8f1bbcdc,%ecx,%edx,%esi,%eax,%ebx)
  159. BODY(16,FN3,0x8f1bbcdc,%ebx,%ecx,%edx,%esi,%eax)
  160. addl $20, %ebp
  161. cmpl W60(%esp), %ebp /* w60 */
  162. jb 3b
  163. 4:
  164. BODY(0,FN24,0xca62c1d6,%eax,%ebx,%ecx,%edx,%esi)
  165. BODY(4,FN24,0xca62c1d6,%esi,%eax,%ebx,%ecx,%edx)
  166. BODY(8,FN24,0xca62c1d6,%edx,%esi,%eax,%ebx,%ecx)
  167. BODY(12,FN24,0xca62c1d6,%ecx,%edx,%esi,%eax,%ebx)
  168. BODY(16,FN24,0xca62c1d6,%ebx,%ecx,%edx,%esi,%eax)
  169. addl $20, %ebp
  170. cmpl W80(%esp), %ebp /* w80 */
  171. jb 4b
  172. movl STATE(%esp), %edi /* state */
  173. addl %eax, 0(%edi)
  174. addl %ebx, 4(%edi)
  175. addl %ecx, 8(%edi)
  176. addl %edx, 12(%edi)
  177. addl %esi, 16(%edi)
  178. movl EDATA(%esp), %edi /* edata */
  179. cmpl %edi, DATA(%esp) /* data */
  180. jb 0b
  181. /* Postlude */
  182. mov OLDEBX(%esp), %ebx
  183. mov OLDESI(%esp), %esi
  184. mov OLDEDI(%esp), %edi
  185. addl $(STACKSIZE), %esp
  186. popl %ebp
  187. ret