sha1block.s 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. TEXT _sha1block+0(SB),$352
  2. /* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
  3. * wp[off] = x;
  4. * x += A <<< 5;
  5. * E += 0xca62c1d6 + x;
  6. * x = FN(B,C,D);
  7. * E += x;
  8. * B >>> 2
  9. */
  10. #define BSWAPDI BYTE $0x0f; BYTE $0xcf;
  11. #define BODY(off,FN,V,A,B,C,D,E)\
  12. MOVL (off-64)(BP),DI;\
  13. XORL (off-56)(BP),DI;\
  14. XORL (off-32)(BP),DI;\
  15. XORL (off-12)(BP),DI;\
  16. ROLL $1,DI;\
  17. MOVL DI,off(BP);\
  18. LEAL V(DI)(E*1),E;\
  19. MOVL A,DI;\
  20. ROLL $5,DI;\
  21. ADDL DI,E;\
  22. FN(B,C,D)\
  23. ADDL DI,E;\
  24. RORL $2,B;\
  25. #define BODY0(off,FN,V,A,B,C,D,E)\
  26. MOVL off(BX),DI;\
  27. BSWAPDI;\
  28. MOVL DI,off(BP);\
  29. LEAL V(DI)(E*1),E;\
  30. MOVL A,DI;\
  31. ROLL $5,DI;\
  32. ADDL DI,E;\
  33. FN(B,C,D)\
  34. ADDL DI,E;\
  35. RORL $2,B;\
  36. /*
  37. * fn1 = (((C^D)&B)^D);
  38. */
  39. #define FN1(B,C,D)\
  40. MOVL C,DI;\
  41. XORL D,DI;\
  42. ANDL B,DI;\
  43. XORL D,DI;\
  44. /*
  45. * fn24 = B ^ C ^ D
  46. */
  47. #define FN24(B,C,D)\
  48. MOVL B,DI;\
  49. XORL C,DI;\
  50. XORL D,DI;\
  51. /*
  52. * fn3 = ((B ^ C) & (D ^= B)) ^ B
  53. * D ^= B to restore D
  54. */
  55. #define FN3(B,C,D)\
  56. MOVL B,DI;\
  57. XORL C,DI;\
  58. XORL B,D;\
  59. ANDL D,DI;\
  60. XORL B,DI;\
  61. XORL B,D;\
  62. /*
  63. * stack offsets
  64. * void sha1block(uchar *DATA, int LEN, ulong *STATE)
  65. */
  66. #define DATA 0
  67. #define LEN 4
  68. #define STATE 8
  69. /*
  70. * stack offsets for locals
  71. * ulong w[80];
  72. * uchar *edata;
  73. * ulong *w15, *w40, *w60, *w80;
  74. * register local
  75. * ulong *wp = BP
  76. * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi
  77. * ulong tmp = edi
  78. */
  79. #define WARRAY (-4-(80*4))
  80. #define TMP1 (-8-(80*4))
  81. #define TMP2 (-12-(80*4))
  82. #define W15 (-16-(80*4))
  83. #define W40 (-20-(80*4))
  84. #define W60 (-24-(80*4))
  85. #define W80 (-28-(80*4))
  86. #define EDATA (-32-(80*4))
  87. MOVL data+DATA(FP),AX
  88. ADDL len+LEN(FP),AX
  89. MOVL AX,edata+EDATA(SP)
  90. LEAL aw15+(WARRAY+15*4)(SP),DI
  91. MOVL DI,w15+W15(SP)
  92. LEAL aw40+(WARRAY+40*4)(SP),DX
  93. MOVL DX,w40+W40(SP)
  94. LEAL aw60+(WARRAY+60*4)(SP),CX
  95. MOVL CX,w60+W60(SP)
  96. LEAL aw80+(WARRAY+80*4)(SP),DI
  97. MOVL DI,w80+W80(SP)
  98. mainloop:
  99. LEAL warray+WARRAY(SP),BP
  100. MOVL state+STATE(FP),DI
  101. MOVL (DI),AX
  102. MOVL 4(DI),BX
  103. MOVL BX,tmp1+TMP1(SP)
  104. MOVL 8(DI),CX
  105. MOVL 12(DI),DX
  106. MOVL 16(DI),SI
  107. MOVL data+DATA(FP),BX
  108. loop1:
  109. BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI)
  110. MOVL SI,tmp2+TMP2(SP)
  111. BODY0(4,FN1,0x5a827999,SI,AX,tmp1+TMP1(SP),CX,DX)
  112. MOVL tmp1+TMP1(SP),SI
  113. BODY0(8,FN1,0x5a827999,DX,tmp2+TMP2(SP),AX,SI,CX)
  114. BODY0(12,FN1,0x5a827999,CX,DX,tmp2+TMP2(SP),AX,SI)
  115. MOVL SI,tmp1+TMP1(SP)
  116. BODY0(16,FN1,0x5a827999,SI,CX,DX,tmp2+TMP2(SP),AX)
  117. MOVL tmp2+TMP2(SP),SI
  118. ADDL $20,BX
  119. ADDL $20,BP
  120. CMPL BP,w15+W15(SP)
  121. JCS loop1
  122. BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI)
  123. ADDL $4,BX
  124. MOVL BX,data+DATA(FP)
  125. MOVL tmp1+TMP1(SP),BX
  126. BODY(4,FN1,0x5a827999,SI,AX,BX,CX,DX)
  127. BODY(8,FN1,0x5a827999,DX,SI,AX,BX,CX)
  128. BODY(12,FN1,0x5a827999,CX,DX,SI,AX,BX)
  129. BODY(16,FN1,0x5a827999,BX,CX,DX,SI,AX)
  130. ADDL $20,BP
  131. loop2:
  132. BODY(0,FN24,0x6ed9eba1,AX,BX,CX,DX,SI)
  133. BODY(4,FN24,0x6ed9eba1,SI,AX,BX,CX,DX)
  134. BODY(8,FN24,0x6ed9eba1,DX,SI,AX,BX,CX)
  135. BODY(12,FN24,0x6ed9eba1,CX,DX,SI,AX,BX)
  136. BODY(16,FN24,0x6ed9eba1,BX,CX,DX,SI,AX)
  137. ADDL $20,BP
  138. CMPL BP,w40+W40(SP)
  139. JCS loop2
  140. loop3:
  141. BODY(0,FN3,0x8f1bbcdc,AX,BX,CX,DX,SI)
  142. BODY(4,FN3,0x8f1bbcdc,SI,AX,BX,CX,DX)
  143. BODY(8,FN3,0x8f1bbcdc,DX,SI,AX,BX,CX)
  144. BODY(12,FN3,0x8f1bbcdc,CX,DX,SI,AX,BX)
  145. BODY(16,FN3,0x8f1bbcdc,BX,CX,DX,SI,AX)
  146. ADDL $20,BP
  147. CMPL BP,w60+W60(SP)
  148. JCS loop3
  149. loop4:
  150. BODY(0,FN24,0xca62c1d6,AX,BX,CX,DX,SI)
  151. BODY(4,FN24,0xca62c1d6,SI,AX,BX,CX,DX)
  152. BODY(8,FN24,0xca62c1d6,DX,SI,AX,BX,CX)
  153. BODY(12,FN24,0xca62c1d6,CX,DX,SI,AX,BX)
  154. BODY(16,FN24,0xca62c1d6,BX,CX,DX,SI,AX)
  155. ADDL $20,BP
  156. CMPL BP,w80+W80(SP)
  157. JCS loop4
  158. MOVL state+STATE(FP),DI
  159. ADDL AX,0(DI)
  160. ADDL BX,4(DI)
  161. ADDL CX,8(DI)
  162. ADDL DX,12(DI)
  163. ADDL SI,16(DI)
  164. MOVL edata+EDATA(SP),DI
  165. CMPL data+DATA(FP),DI
  166. JCS mainloop
  167. RET
  168. END