sha1block.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #include "os.h"
  2. void
  3. _sha1block(uchar *p, ulong len, u32int *s)
  4. {
  5. u32int a, b, c, d, e, x;
  6. uchar *end;
  7. u32int *wp, *wend;
  8. u32int w[80];
  9. /* at this point, we have a multiple of 64 bytes */
  10. for(end = p+len; p < end;){
  11. a = s[0];
  12. b = s[1];
  13. c = s[2];
  14. d = s[3];
  15. e = s[4];
  16. wend = w + 15;
  17. for(wp = w; wp < wend; wp += 5){
  18. wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
  19. e += ((a<<5) | (a>>27)) + wp[0];
  20. e += 0x5a827999 + (((c^d)&b)^d);
  21. b = (b<<30)|(b>>2);
  22. wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7];
  23. d += ((e<<5) | (e>>27)) + wp[1];
  24. d += 0x5a827999 + (((b^c)&a)^c);
  25. a = (a<<30)|(a>>2);
  26. wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11];
  27. c += ((d<<5) | (d>>27)) + wp[2];
  28. c += 0x5a827999 + (((a^b)&e)^b);
  29. e = (e<<30)|(e>>2);
  30. wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15];
  31. b += ((c<<5) | (c>>27)) + wp[3];
  32. b += 0x5a827999 + (((e^a)&d)^a);
  33. d = (d<<30)|(d>>2);
  34. wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19];
  35. a += ((b<<5) | (b>>27)) + wp[4];
  36. a += 0x5a827999 + (((d^e)&c)^e);
  37. c = (c<<30)|(c>>2);
  38. p += 20;
  39. }
  40. wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
  41. e += ((a<<5) | (a>>27)) + wp[0];
  42. e += 0x5a827999 + (((c^d)&b)^d);
  43. b = (b<<30)|(b>>2);
  44. x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
  45. wp[1] = (x<<1) | (x>>31);
  46. d += ((e<<5) | (e>>27)) + wp[1];
  47. d += 0x5a827999 + (((b^c)&a)^c);
  48. a = (a<<30)|(a>>2);
  49. x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
  50. wp[2] = (x<<1) | (x>>31);
  51. c += ((d<<5) | (d>>27)) + wp[2];
  52. c += 0x5a827999 + (((a^b)&e)^b);
  53. e = (e<<30)|(e>>2);
  54. x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
  55. wp[3] = (x<<1) | (x>>31);
  56. b += ((c<<5) | (c>>27)) + wp[3];
  57. b += 0x5a827999 + (((e^a)&d)^a);
  58. d = (d<<30)|(d>>2);
  59. x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
  60. wp[4] = (x<<1) | (x>>31);
  61. a += ((b<<5) | (b>>27)) + wp[4];
  62. a += 0x5a827999 + (((d^e)&c)^e);
  63. c = (c<<30)|(c>>2);
  64. wp += 5;
  65. p += 4;
  66. wend = w + 40;
  67. for(; wp < wend; wp += 5){
  68. x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
  69. wp[0] = (x<<1) | (x>>31);
  70. e += ((a<<5) | (a>>27)) + wp[0];
  71. e += 0x6ed9eba1 + (b^c^d);
  72. b = (b<<30)|(b>>2);
  73. x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
  74. wp[1] = (x<<1) | (x>>31);
  75. d += ((e<<5) | (e>>27)) + wp[1];
  76. d += 0x6ed9eba1 + (a^b^c);
  77. a = (a<<30)|(a>>2);
  78. x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
  79. wp[2] = (x<<1) | (x>>31);
  80. c += ((d<<5) | (d>>27)) + wp[2];
  81. c += 0x6ed9eba1 + (e^a^b);
  82. e = (e<<30)|(e>>2);
  83. x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
  84. wp[3] = (x<<1) | (x>>31);
  85. b += ((c<<5) | (c>>27)) + wp[3];
  86. b += 0x6ed9eba1 + (d^e^a);
  87. d = (d<<30)|(d>>2);
  88. x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
  89. wp[4] = (x<<1) | (x>>31);
  90. a += ((b<<5) | (b>>27)) + wp[4];
  91. a += 0x6ed9eba1 + (c^d^e);
  92. c = (c<<30)|(c>>2);
  93. }
  94. wend = w + 60;
  95. for(; wp < wend; wp += 5){
  96. x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
  97. wp[0] = (x<<1) | (x>>31);
  98. e += ((a<<5) | (a>>27)) + wp[0];
  99. e += 0x8f1bbcdc + ((b&c)|((b|c)&d));
  100. b = (b<<30)|(b>>2);
  101. x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
  102. wp[1] = (x<<1) | (x>>31);
  103. d += ((e<<5) | (e>>27)) + wp[1];
  104. d += 0x8f1bbcdc + ((a&b)|((a|b)&c));
  105. a = (a<<30)|(a>>2);
  106. x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
  107. wp[2] = (x<<1) | (x>>31);
  108. c += ((d<<5) | (d>>27)) + wp[2];
  109. c += 0x8f1bbcdc + ((e&a)|((e|a)&b));
  110. e = (e<<30)|(e>>2);
  111. x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
  112. wp[3] = (x<<1) | (x>>31);
  113. b += ((c<<5) | (c>>27)) + wp[3];
  114. b += 0x8f1bbcdc + ((d&e)|((d|e)&a));
  115. d = (d<<30)|(d>>2);
  116. x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
  117. wp[4] = (x<<1) | (x>>31);
  118. a += ((b<<5) | (b>>27)) + wp[4];
  119. a += 0x8f1bbcdc + ((c&d)|((c|d)&e));
  120. c = (c<<30)|(c>>2);
  121. }
  122. wend = w + 80;
  123. for(; wp < wend; wp += 5){
  124. x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
  125. wp[0] = (x<<1) | (x>>31);
  126. e += ((a<<5) | (a>>27)) + wp[0];
  127. e += 0xca62c1d6 + (b^c^d);
  128. b = (b<<30)|(b>>2);
  129. x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
  130. wp[1] = (x<<1) | (x>>31);
  131. d += ((e<<5) | (e>>27)) + wp[1];
  132. d += 0xca62c1d6 + (a^b^c);
  133. a = (a<<30)|(a>>2);
  134. x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
  135. wp[2] = (x<<1) | (x>>31);
  136. c += ((d<<5) | (d>>27)) + wp[2];
  137. c += 0xca62c1d6 + (e^a^b);
  138. e = (e<<30)|(e>>2);
  139. x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
  140. wp[3] = (x<<1) | (x>>31);
  141. b += ((c<<5) | (c>>27)) + wp[3];
  142. b += 0xca62c1d6 + (d^e^a);
  143. d = (d<<30)|(d>>2);
  144. x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
  145. wp[4] = (x<<1) | (x>>31);
  146. a += ((b<<5) | (b>>27)) + wp[4];
  147. a += 0xca62c1d6 + (c^d^e);
  148. c = (c<<30)|(c>>2);
  149. }
  150. /* save state */
  151. s[0] += a;
  152. s[1] += b;
  153. s[2] += c;
  154. s[3] += d;
  155. s[4] += e;
  156. }
  157. }