sha1block.c 4.6 KB

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