Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

803 lines
30 KiB

  1. // ripemd.cpp
  2. // RIPEMD-160 written and placed in the public domain by Wei Dai
  3. // RIPEMD-320, RIPEMD-128, RIPEMD-256 written by Kevin Springle
  4. // and also placed in the public domain
  5. #include "pch.h"
  6. #include "ripemd.h"
  7. #include "misc.h"
  8. NAMESPACE_BEGIN(CryptoPP)
  9. #define F(x, y, z) (x ^ y ^ z)
  10. #define G(x, y, z) (z ^ (x & (y^z)))
  11. #define H(x, y, z) (z ^ (x | ~y))
  12. #define I(x, y, z) (y ^ (z & (x^y)))
  13. #define J(x, y, z) (x ^ (y | ~z))
  14. #define k0 0
  15. #define k1 0x5a827999UL
  16. #define k2 0x6ed9eba1UL
  17. #define k3 0x8f1bbcdcUL
  18. #define k4 0xa953fd4eUL
  19. #define k5 0x50a28be6UL
  20. #define k6 0x5c4dd124UL
  21. #define k7 0x6d703ef3UL
  22. #define k8 0x7a6d76e9UL
  23. #define k9 0
  24. // *************************************************************
  25. // for 160 and 320
  26. #define Subround(f, a, b, c, d, e, x, s, k) \
  27. a += f(b, c, d) + x + k;\
  28. a = rotlFixed((word32)a, s) + e;\
  29. c = rotlFixed((word32)c, 10U)
  30. void RIPEMD160::InitState(HashWordType *state)
  31. {
  32. state[0] = 0x67452301L;
  33. state[1] = 0xefcdab89L;
  34. state[2] = 0x98badcfeL;
  35. state[3] = 0x10325476L;
  36. state[4] = 0xc3d2e1f0L;
  37. }
  38. void RIPEMD160::Transform (word32 *digest, const word32 *X)
  39. {
  40. unsigned long a1, b1, c1, d1, e1, a2, b2, c2, d2, e2;
  41. a1 = a2 = digest[0];
  42. b1 = b2 = digest[1];
  43. c1 = c2 = digest[2];
  44. d1 = d2 = digest[3];
  45. e1 = e2 = digest[4];
  46. Subround(F, a1, b1, c1, d1, e1, X[ 0], 11, k0);
  47. Subround(F, e1, a1, b1, c1, d1, X[ 1], 14, k0);
  48. Subround(F, d1, e1, a1, b1, c1, X[ 2], 15, k0);
  49. Subround(F, c1, d1, e1, a1, b1, X[ 3], 12, k0);
  50. Subround(F, b1, c1, d1, e1, a1, X[ 4], 5, k0);
  51. Subround(F, a1, b1, c1, d1, e1, X[ 5], 8, k0);
  52. Subround(F, e1, a1, b1, c1, d1, X[ 6], 7, k0);
  53. Subround(F, d1, e1, a1, b1, c1, X[ 7], 9, k0);
  54. Subround(F, c1, d1, e1, a1, b1, X[ 8], 11, k0);
  55. Subround(F, b1, c1, d1, e1, a1, X[ 9], 13, k0);
  56. Subround(F, a1, b1, c1, d1, e1, X[10], 14, k0);
  57. Subround(F, e1, a1, b1, c1, d1, X[11], 15, k0);
  58. Subround(F, d1, e1, a1, b1, c1, X[12], 6, k0);
  59. Subround(F, c1, d1, e1, a1, b1, X[13], 7, k0);
  60. Subround(F, b1, c1, d1, e1, a1, X[14], 9, k0);
  61. Subround(F, a1, b1, c1, d1, e1, X[15], 8, k0);
  62. Subround(G, e1, a1, b1, c1, d1, X[ 7], 7, k1);
  63. Subround(G, d1, e1, a1, b1, c1, X[ 4], 6, k1);
  64. Subround(G, c1, d1, e1, a1, b1, X[13], 8, k1);
  65. Subround(G, b1, c1, d1, e1, a1, X[ 1], 13, k1);
  66. Subround(G, a1, b1, c1, d1, e1, X[10], 11, k1);
  67. Subround(G, e1, a1, b1, c1, d1, X[ 6], 9, k1);
  68. Subround(G, d1, e1, a1, b1, c1, X[15], 7, k1);
  69. Subround(G, c1, d1, e1, a1, b1, X[ 3], 15, k1);
  70. Subround(G, b1, c1, d1, e1, a1, X[12], 7, k1);
  71. Subround(G, a1, b1, c1, d1, e1, X[ 0], 12, k1);
  72. Subround(G, e1, a1, b1, c1, d1, X[ 9], 15, k1);
  73. Subround(G, d1, e1, a1, b1, c1, X[ 5], 9, k1);
  74. Subround(G, c1, d1, e1, a1, b1, X[ 2], 11, k1);
  75. Subround(G, b1, c1, d1, e1, a1, X[14], 7, k1);
  76. Subround(G, a1, b1, c1, d1, e1, X[11], 13, k1);
  77. Subround(G, e1, a1, b1, c1, d1, X[ 8], 12, k1);
  78. Subround(H, d1, e1, a1, b1, c1, X[ 3], 11, k2);
  79. Subround(H, c1, d1, e1, a1, b1, X[10], 13, k2);
  80. Subround(H, b1, c1, d1, e1, a1, X[14], 6, k2);
  81. Subround(H, a1, b1, c1, d1, e1, X[ 4], 7, k2);
  82. Subround(H, e1, a1, b1, c1, d1, X[ 9], 14, k2);
  83. Subround(H, d1, e1, a1, b1, c1, X[15], 9, k2);
  84. Subround(H, c1, d1, e1, a1, b1, X[ 8], 13, k2);
  85. Subround(H, b1, c1, d1, e1, a1, X[ 1], 15, k2);
  86. Subround(H, a1, b1, c1, d1, e1, X[ 2], 14, k2);
  87. Subround(H, e1, a1, b1, c1, d1, X[ 7], 8, k2);
  88. Subround(H, d1, e1, a1, b1, c1, X[ 0], 13, k2);
  89. Subround(H, c1, d1, e1, a1, b1, X[ 6], 6, k2);
  90. Subround(H, b1, c1, d1, e1, a1, X[13], 5, k2);
  91. Subround(H, a1, b1, c1, d1, e1, X[11], 12, k2);
  92. Subround(H, e1, a1, b1, c1, d1, X[ 5], 7, k2);
  93. Subround(H, d1, e1, a1, b1, c1, X[12], 5, k2);
  94. Subround(I, c1, d1, e1, a1, b1, X[ 1], 11, k3);
  95. Subround(I, b1, c1, d1, e1, a1, X[ 9], 12, k3);
  96. Subround(I, a1, b1, c1, d1, e1, X[11], 14, k3);
  97. Subround(I, e1, a1, b1, c1, d1, X[10], 15, k3);
  98. Subround(I, d1, e1, a1, b1, c1, X[ 0], 14, k3);
  99. Subround(I, c1, d1, e1, a1, b1, X[ 8], 15, k3);
  100. Subround(I, b1, c1, d1, e1, a1, X[12], 9, k3);
  101. Subround(I, a1, b1, c1, d1, e1, X[ 4], 8, k3);
  102. Subround(I, e1, a1, b1, c1, d1, X[13], 9, k3);
  103. Subround(I, d1, e1, a1, b1, c1, X[ 3], 14, k3);
  104. Subround(I, c1, d1, e1, a1, b1, X[ 7], 5, k3);
  105. Subround(I, b1, c1, d1, e1, a1, X[15], 6, k3);
  106. Subround(I, a1, b1, c1, d1, e1, X[14], 8, k3);
  107. Subround(I, e1, a1, b1, c1, d1, X[ 5], 6, k3);
  108. Subround(I, d1, e1, a1, b1, c1, X[ 6], 5, k3);
  109. Subround(I, c1, d1, e1, a1, b1, X[ 2], 12, k3);
  110. Subround(J, b1, c1, d1, e1, a1, X[ 4], 9, k4);
  111. Subround(J, a1, b1, c1, d1, e1, X[ 0], 15, k4);
  112. Subround(J, e1, a1, b1, c1, d1, X[ 5], 5, k4);
  113. Subround(J, d1, e1, a1, b1, c1, X[ 9], 11, k4);
  114. Subround(J, c1, d1, e1, a1, b1, X[ 7], 6, k4);
  115. Subround(J, b1, c1, d1, e1, a1, X[12], 8, k4);
  116. Subround(J, a1, b1, c1, d1, e1, X[ 2], 13, k4);
  117. Subround(J, e1, a1, b1, c1, d1, X[10], 12, k4);
  118. Subround(J, d1, e1, a1, b1, c1, X[14], 5, k4);
  119. Subround(J, c1, d1, e1, a1, b1, X[ 1], 12, k4);
  120. Subround(J, b1, c1, d1, e1, a1, X[ 3], 13, k4);
  121. Subround(J, a1, b1, c1, d1, e1, X[ 8], 14, k4);
  122. Subround(J, e1, a1, b1, c1, d1, X[11], 11, k4);
  123. Subround(J, d1, e1, a1, b1, c1, X[ 6], 8, k4);
  124. Subround(J, c1, d1, e1, a1, b1, X[15], 5, k4);
  125. Subround(J, b1, c1, d1, e1, a1, X[13], 6, k4);
  126. Subround(J, a2, b2, c2, d2, e2, X[ 5], 8, k5);
  127. Subround(J, e2, a2, b2, c2, d2, X[14], 9, k5);
  128. Subround(J, d2, e2, a2, b2, c2, X[ 7], 9, k5);
  129. Subround(J, c2, d2, e2, a2, b2, X[ 0], 11, k5);
  130. Subround(J, b2, c2, d2, e2, a2, X[ 9], 13, k5);
  131. Subround(J, a2, b2, c2, d2, e2, X[ 2], 15, k5);
  132. Subround(J, e2, a2, b2, c2, d2, X[11], 15, k5);
  133. Subround(J, d2, e2, a2, b2, c2, X[ 4], 5, k5);
  134. Subround(J, c2, d2, e2, a2, b2, X[13], 7, k5);
  135. Subround(J, b2, c2, d2, e2, a2, X[ 6], 7, k5);
  136. Subround(J, a2, b2, c2, d2, e2, X[15], 8, k5);
  137. Subround(J, e2, a2, b2, c2, d2, X[ 8], 11, k5);
  138. Subround(J, d2, e2, a2, b2, c2, X[ 1], 14, k5);
  139. Subround(J, c2, d2, e2, a2, b2, X[10], 14, k5);
  140. Subround(J, b2, c2, d2, e2, a2, X[ 3], 12, k5);
  141. Subround(J, a2, b2, c2, d2, e2, X[12], 6, k5);
  142. Subround(I, e2, a2, b2, c2, d2, X[ 6], 9, k6);
  143. Subround(I, d2, e2, a2, b2, c2, X[11], 13, k6);
  144. Subround(I, c2, d2, e2, a2, b2, X[ 3], 15, k6);
  145. Subround(I, b2, c2, d2, e2, a2, X[ 7], 7, k6);
  146. Subround(I, a2, b2, c2, d2, e2, X[ 0], 12, k6);
  147. Subround(I, e2, a2, b2, c2, d2, X[13], 8, k6);
  148. Subround(I, d2, e2, a2, b2, c2, X[ 5], 9, k6);
  149. Subround(I, c2, d2, e2, a2, b2, X[10], 11, k6);
  150. Subround(I, b2, c2, d2, e2, a2, X[14], 7, k6);
  151. Subround(I, a2, b2, c2, d2, e2, X[15], 7, k6);
  152. Subround(I, e2, a2, b2, c2, d2, X[ 8], 12, k6);
  153. Subround(I, d2, e2, a2, b2, c2, X[12], 7, k6);
  154. Subround(I, c2, d2, e2, a2, b2, X[ 4], 6, k6);
  155. Subround(I, b2, c2, d2, e2, a2, X[ 9], 15, k6);
  156. Subround(I, a2, b2, c2, d2, e2, X[ 1], 13, k6);
  157. Subround(I, e2, a2, b2, c2, d2, X[ 2], 11, k6);
  158. Subround(H, d2, e2, a2, b2, c2, X[15], 9, k7);
  159. Subround(H, c2, d2, e2, a2, b2, X[ 5], 7, k7);
  160. Subround(H, b2, c2, d2, e2, a2, X[ 1], 15, k7);
  161. Subround(H, a2, b2, c2, d2, e2, X[ 3], 11, k7);
  162. Subround(H, e2, a2, b2, c2, d2, X[ 7], 8, k7);
  163. Subround(H, d2, e2, a2, b2, c2, X[14], 6, k7);
  164. Subround(H, c2, d2, e2, a2, b2, X[ 6], 6, k7);
  165. Subround(H, b2, c2, d2, e2, a2, X[ 9], 14, k7);
  166. Subround(H, a2, b2, c2, d2, e2, X[11], 12, k7);
  167. Subround(H, e2, a2, b2, c2, d2, X[ 8], 13, k7);
  168. Subround(H, d2, e2, a2, b2, c2, X[12], 5, k7);
  169. Subround(H, c2, d2, e2, a2, b2, X[ 2], 14, k7);
  170. Subround(H, b2, c2, d2, e2, a2, X[10], 13, k7);
  171. Subround(H, a2, b2, c2, d2, e2, X[ 0], 13, k7);
  172. Subround(H, e2, a2, b2, c2, d2, X[ 4], 7, k7);
  173. Subround(H, d2, e2, a2, b2, c2, X[13], 5, k7);
  174. Subround(G, c2, d2, e2, a2, b2, X[ 8], 15, k8);
  175. Subround(G, b2, c2, d2, e2, a2, X[ 6], 5, k8);
  176. Subround(G, a2, b2, c2, d2, e2, X[ 4], 8, k8);
  177. Subround(G, e2, a2, b2, c2, d2, X[ 1], 11, k8);
  178. Subround(G, d2, e2, a2, b2, c2, X[ 3], 14, k8);
  179. Subround(G, c2, d2, e2, a2, b2, X[11], 14, k8);
  180. Subround(G, b2, c2, d2, e2, a2, X[15], 6, k8);
  181. Subround(G, a2, b2, c2, d2, e2, X[ 0], 14, k8);
  182. Subround(G, e2, a2, b2, c2, d2, X[ 5], 6, k8);
  183. Subround(G, d2, e2, a2, b2, c2, X[12], 9, k8);
  184. Subround(G, c2, d2, e2, a2, b2, X[ 2], 12, k8);
  185. Subround(G, b2, c2, d2, e2, a2, X[13], 9, k8);
  186. Subround(G, a2, b2, c2, d2, e2, X[ 9], 12, k8);
  187. Subround(G, e2, a2, b2, c2, d2, X[ 7], 5, k8);
  188. Subround(G, d2, e2, a2, b2, c2, X[10], 15, k8);
  189. Subround(G, c2, d2, e2, a2, b2, X[14], 8, k8);
  190. Subround(F, b2, c2, d2, e2, a2, X[12], 8, k9);
  191. Subround(F, a2, b2, c2, d2, e2, X[15], 5, k9);
  192. Subround(F, e2, a2, b2, c2, d2, X[10], 12, k9);
  193. Subround(F, d2, e2, a2, b2, c2, X[ 4], 9, k9);
  194. Subround(F, c2, d2, e2, a2, b2, X[ 1], 12, k9);
  195. Subround(F, b2, c2, d2, e2, a2, X[ 5], 5, k9);
  196. Subround(F, a2, b2, c2, d2, e2, X[ 8], 14, k9);
  197. Subround(F, e2, a2, b2, c2, d2, X[ 7], 6, k9);
  198. Subround(F, d2, e2, a2, b2, c2, X[ 6], 8, k9);
  199. Subround(F, c2, d2, e2, a2, b2, X[ 2], 13, k9);
  200. Subround(F, b2, c2, d2, e2, a2, X[13], 6, k9);
  201. Subround(F, a2, b2, c2, d2, e2, X[14], 5, k9);
  202. Subround(F, e2, a2, b2, c2, d2, X[ 0], 15, k9);
  203. Subround(F, d2, e2, a2, b2, c2, X[ 3], 13, k9);
  204. Subround(F, c2, d2, e2, a2, b2, X[ 9], 11, k9);
  205. Subround(F, b2, c2, d2, e2, a2, X[11], 11, k9);
  206. c1 = digest[1] + c1 + d2;
  207. digest[1] = digest[2] + d1 + e2;
  208. digest[2] = digest[3] + e1 + a2;
  209. digest[3] = digest[4] + a1 + b2;
  210. digest[4] = digest[0] + b1 + c2;
  211. digest[0] = c1;
  212. }
  213. // *************************************************************
  214. void RIPEMD320::InitState(HashWordType *state)
  215. {
  216. state[0] = 0x67452301L;
  217. state[1] = 0xefcdab89L;
  218. state[2] = 0x98badcfeL;
  219. state[3] = 0x10325476L;
  220. state[4] = 0xc3d2e1f0L;
  221. state[5] = 0x76543210L;
  222. state[6] = 0xfedcba98L;
  223. state[7] = 0x89abcdefL;
  224. state[8] = 0x01234567L;
  225. state[9] = 0x3c2d1e0fL;
  226. }
  227. void RIPEMD320::Transform (word32 *digest, const word32 *X)
  228. {
  229. unsigned long a1, b1, c1, d1, e1, a2, b2, c2, d2, e2, t;
  230. a1 = digest[0];
  231. b1 = digest[1];
  232. c1 = digest[2];
  233. d1 = digest[3];
  234. e1 = digest[4];
  235. a2 = digest[5];
  236. b2 = digest[6];
  237. c2 = digest[7];
  238. d2 = digest[8];
  239. e2 = digest[9];
  240. Subround(F, a1, b1, c1, d1, e1, X[ 0], 11, k0);
  241. Subround(F, e1, a1, b1, c1, d1, X[ 1], 14, k0);
  242. Subround(F, d1, e1, a1, b1, c1, X[ 2], 15, k0);
  243. Subround(F, c1, d1, e1, a1, b1, X[ 3], 12, k0);
  244. Subround(F, b1, c1, d1, e1, a1, X[ 4], 5, k0);
  245. Subround(F, a1, b1, c1, d1, e1, X[ 5], 8, k0);
  246. Subround(F, e1, a1, b1, c1, d1, X[ 6], 7, k0);
  247. Subround(F, d1, e1, a1, b1, c1, X[ 7], 9, k0);
  248. Subround(F, c1, d1, e1, a1, b1, X[ 8], 11, k0);
  249. Subround(F, b1, c1, d1, e1, a1, X[ 9], 13, k0);
  250. Subround(F, a1, b1, c1, d1, e1, X[10], 14, k0);
  251. Subround(F, e1, a1, b1, c1, d1, X[11], 15, k0);
  252. Subround(F, d1, e1, a1, b1, c1, X[12], 6, k0);
  253. Subround(F, c1, d1, e1, a1, b1, X[13], 7, k0);
  254. Subround(F, b1, c1, d1, e1, a1, X[14], 9, k0);
  255. Subround(F, a1, b1, c1, d1, e1, X[15], 8, k0);
  256. Subround(J, a2, b2, c2, d2, e2, X[ 5], 8, k5);
  257. Subround(J, e2, a2, b2, c2, d2, X[14], 9, k5);
  258. Subround(J, d2, e2, a2, b2, c2, X[ 7], 9, k5);
  259. Subround(J, c2, d2, e2, a2, b2, X[ 0], 11, k5);
  260. Subround(J, b2, c2, d2, e2, a2, X[ 9], 13, k5);
  261. Subround(J, a2, b2, c2, d2, e2, X[ 2], 15, k5);
  262. Subround(J, e2, a2, b2, c2, d2, X[11], 15, k5);
  263. Subround(J, d2, e2, a2, b2, c2, X[ 4], 5, k5);
  264. Subround(J, c2, d2, e2, a2, b2, X[13], 7, k5);
  265. Subround(J, b2, c2, d2, e2, a2, X[ 6], 7, k5);
  266. Subround(J, a2, b2, c2, d2, e2, X[15], 8, k5);
  267. Subround(J, e2, a2, b2, c2, d2, X[ 8], 11, k5);
  268. Subround(J, d2, e2, a2, b2, c2, X[ 1], 14, k5);
  269. Subround(J, c2, d2, e2, a2, b2, X[10], 14, k5);
  270. Subround(J, b2, c2, d2, e2, a2, X[ 3], 12, k5);
  271. Subround(J, a2, b2, c2, d2, e2, X[12], 6, k5);
  272. t = a1; a1 = a2; a2 = t;
  273. Subround(G, e1, a1, b1, c1, d1, X[ 7], 7, k1);
  274. Subround(G, d1, e1, a1, b1, c1, X[ 4], 6, k1);
  275. Subround(G, c1, d1, e1, a1, b1, X[13], 8, k1);
  276. Subround(G, b1, c1, d1, e1, a1, X[ 1], 13, k1);
  277. Subround(G, a1, b1, c1, d1, e1, X[10], 11, k1);
  278. Subround(G, e1, a1, b1, c1, d1, X[ 6], 9, k1);
  279. Subround(G, d1, e1, a1, b1, c1, X[15], 7, k1);
  280. Subround(G, c1, d1, e1, a1, b1, X[ 3], 15, k1);
  281. Subround(G, b1, c1, d1, e1, a1, X[12], 7, k1);
  282. Subround(G, a1, b1, c1, d1, e1, X[ 0], 12, k1);
  283. Subround(G, e1, a1, b1, c1, d1, X[ 9], 15, k1);
  284. Subround(G, d1, e1, a1, b1, c1, X[ 5], 9, k1);
  285. Subround(G, c1, d1, e1, a1, b1, X[ 2], 11, k1);
  286. Subround(G, b1, c1, d1, e1, a1, X[14], 7, k1);
  287. Subround(G, a1, b1, c1, d1, e1, X[11], 13, k1);
  288. Subround(G, e1, a1, b1, c1, d1, X[ 8], 12, k1);
  289. Subround(I, e2, a2, b2, c2, d2, X[ 6], 9, k6);
  290. Subround(I, d2, e2, a2, b2, c2, X[11], 13, k6);
  291. Subround(I, c2, d2, e2, a2, b2, X[ 3], 15, k6);
  292. Subround(I, b2, c2, d2, e2, a2, X[ 7], 7, k6);
  293. Subround(I, a2, b2, c2, d2, e2, X[ 0], 12, k6);
  294. Subround(I, e2, a2, b2, c2, d2, X[13], 8, k6);
  295. Subround(I, d2, e2, a2, b2, c2, X[ 5], 9, k6);
  296. Subround(I, c2, d2, e2, a2, b2, X[10], 11, k6);
  297. Subround(I, b2, c2, d2, e2, a2, X[14], 7, k6);
  298. Subround(I, a2, b2, c2, d2, e2, X[15], 7, k6);
  299. Subround(I, e2, a2, b2, c2, d2, X[ 8], 12, k6);
  300. Subround(I, d2, e2, a2, b2, c2, X[12], 7, k6);
  301. Subround(I, c2, d2, e2, a2, b2, X[ 4], 6, k6);
  302. Subround(I, b2, c2, d2, e2, a2, X[ 9], 15, k6);
  303. Subround(I, a2, b2, c2, d2, e2, X[ 1], 13, k6);
  304. Subround(I, e2, a2, b2, c2, d2, X[ 2], 11, k6);
  305. t = b1; b1 = b2; b2 = t;
  306. Subround(H, d1, e1, a1, b1, c1, X[ 3], 11, k2);
  307. Subround(H, c1, d1, e1, a1, b1, X[10], 13, k2);
  308. Subround(H, b1, c1, d1, e1, a1, X[14], 6, k2);
  309. Subround(H, a1, b1, c1, d1, e1, X[ 4], 7, k2);
  310. Subround(H, e1, a1, b1, c1, d1, X[ 9], 14, k2);
  311. Subround(H, d1, e1, a1, b1, c1, X[15], 9, k2);
  312. Subround(H, c1, d1, e1, a1, b1, X[ 8], 13, k2);
  313. Subround(H, b1, c1, d1, e1, a1, X[ 1], 15, k2);
  314. Subround(H, a1, b1, c1, d1, e1, X[ 2], 14, k2);
  315. Subround(H, e1, a1, b1, c1, d1, X[ 7], 8, k2);
  316. Subround(H, d1, e1, a1, b1, c1, X[ 0], 13, k2);
  317. Subround(H, c1, d1, e1, a1, b1, X[ 6], 6, k2);
  318. Subround(H, b1, c1, d1, e1, a1, X[13], 5, k2);
  319. Subround(H, a1, b1, c1, d1, e1, X[11], 12, k2);
  320. Subround(H, e1, a1, b1, c1, d1, X[ 5], 7, k2);
  321. Subround(H, d1, e1, a1, b1, c1, X[12], 5, k2);
  322. Subround(H, d2, e2, a2, b2, c2, X[15], 9, k7);
  323. Subround(H, c2, d2, e2, a2, b2, X[ 5], 7, k7);
  324. Subround(H, b2, c2, d2, e2, a2, X[ 1], 15, k7);
  325. Subround(H, a2, b2, c2, d2, e2, X[ 3], 11, k7);
  326. Subround(H, e2, a2, b2, c2, d2, X[ 7], 8, k7);
  327. Subround(H, d2, e2, a2, b2, c2, X[14], 6, k7);
  328. Subround(H, c2, d2, e2, a2, b2, X[ 6], 6, k7);
  329. Subround(H, b2, c2, d2, e2, a2, X[ 9], 14, k7);
  330. Subround(H, a2, b2, c2, d2, e2, X[11], 12, k7);
  331. Subround(H, e2, a2, b2, c2, d2, X[ 8], 13, k7);
  332. Subround(H, d2, e2, a2, b2, c2, X[12], 5, k7);
  333. Subround(H, c2, d2, e2, a2, b2, X[ 2], 14, k7);
  334. Subround(H, b2, c2, d2, e2, a2, X[10], 13, k7);
  335. Subround(H, a2, b2, c2, d2, e2, X[ 0], 13, k7);
  336. Subround(H, e2, a2, b2, c2, d2, X[ 4], 7, k7);
  337. Subround(H, d2, e2, a2, b2, c2, X[13], 5, k7);
  338. t = c1; c1 = c2; c2 = t;
  339. Subround(I, c1, d1, e1, a1, b1, X[ 1], 11, k3);
  340. Subround(I, b1, c1, d1, e1, a1, X[ 9], 12, k3);
  341. Subround(I, a1, b1, c1, d1, e1, X[11], 14, k3);
  342. Subround(I, e1, a1, b1, c1, d1, X[10], 15, k3);
  343. Subround(I, d1, e1, a1, b1, c1, X[ 0], 14, k3);
  344. Subround(I, c1, d1, e1, a1, b1, X[ 8], 15, k3);
  345. Subround(I, b1, c1, d1, e1, a1, X[12], 9, k3);
  346. Subround(I, a1, b1, c1, d1, e1, X[ 4], 8, k3);
  347. Subround(I, e1, a1, b1, c1, d1, X[13], 9, k3);
  348. Subround(I, d1, e1, a1, b1, c1, X[ 3], 14, k3);
  349. Subround(I, c1, d1, e1, a1, b1, X[ 7], 5, k3);
  350. Subround(I, b1, c1, d1, e1, a1, X[15], 6, k3);
  351. Subround(I, a1, b1, c1, d1, e1, X[14], 8, k3);
  352. Subround(I, e1, a1, b1, c1, d1, X[ 5], 6, k3);
  353. Subround(I, d1, e1, a1, b1, c1, X[ 6], 5, k3);
  354. Subround(I, c1, d1, e1, a1, b1, X[ 2], 12, k3);
  355. Subround(G, c2, d2, e2, a2, b2, X[ 8], 15, k8);
  356. Subround(G, b2, c2, d2, e2, a2, X[ 6], 5, k8);
  357. Subround(G, a2, b2, c2, d2, e2, X[ 4], 8, k8);
  358. Subround(G, e2, a2, b2, c2, d2, X[ 1], 11, k8);
  359. Subround(G, d2, e2, a2, b2, c2, X[ 3], 14, k8);
  360. Subround(G, c2, d2, e2, a2, b2, X[11], 14, k8);
  361. Subround(G, b2, c2, d2, e2, a2, X[15], 6, k8);
  362. Subround(G, a2, b2, c2, d2, e2, X[ 0], 14, k8);
  363. Subround(G, e2, a2, b2, c2, d2, X[ 5], 6, k8);
  364. Subround(G, d2, e2, a2, b2, c2, X[12], 9, k8);
  365. Subround(G, c2, d2, e2, a2, b2, X[ 2], 12, k8);
  366. Subround(G, b2, c2, d2, e2, a2, X[13], 9, k8);
  367. Subround(G, a2, b2, c2, d2, e2, X[ 9], 12, k8);
  368. Subround(G, e2, a2, b2, c2, d2, X[ 7], 5, k8);
  369. Subround(G, d2, e2, a2, b2, c2, X[10], 15, k8);
  370. Subround(G, c2, d2, e2, a2, b2, X[14], 8, k8);
  371. t = d1; d1 = d2; d2 = t;
  372. Subround(J, b1, c1, d1, e1, a1, X[ 4], 9, k4);
  373. Subround(J, a1, b1, c1, d1, e1, X[ 0], 15, k4);
  374. Subround(J, e1, a1, b1, c1, d1, X[ 5], 5, k4);
  375. Subround(J, d1, e1, a1, b1, c1, X[ 9], 11, k4);
  376. Subround(J, c1, d1, e1, a1, b1, X[ 7], 6, k4);
  377. Subround(J, b1, c1, d1, e1, a1, X[12], 8, k4);
  378. Subround(J, a1, b1, c1, d1, e1, X[ 2], 13, k4);
  379. Subround(J, e1, a1, b1, c1, d1, X[10], 12, k4);
  380. Subround(J, d1, e1, a1, b1, c1, X[14], 5, k4);
  381. Subround(J, c1, d1, e1, a1, b1, X[ 1], 12, k4);
  382. Subround(J, b1, c1, d1, e1, a1, X[ 3], 13, k4);
  383. Subround(J, a1, b1, c1, d1, e1, X[ 8], 14, k4);
  384. Subround(J, e1, a1, b1, c1, d1, X[11], 11, k4);
  385. Subround(J, d1, e1, a1, b1, c1, X[ 6], 8, k4);
  386. Subround(J, c1, d1, e1, a1, b1, X[15], 5, k4);
  387. Subround(J, b1, c1, d1, e1, a1, X[13], 6, k4);
  388. Subround(F, b2, c2, d2, e2, a2, X[12], 8, k9);
  389. Subround(F, a2, b2, c2, d2, e2, X[15], 5, k9);
  390. Subround(F, e2, a2, b2, c2, d2, X[10], 12, k9);
  391. Subround(F, d2, e2, a2, b2, c2, X[ 4], 9, k9);
  392. Subround(F, c2, d2, e2, a2, b2, X[ 1], 12, k9);
  393. Subround(F, b2, c2, d2, e2, a2, X[ 5], 5, k9);
  394. Subround(F, a2, b2, c2, d2, e2, X[ 8], 14, k9);
  395. Subround(F, e2, a2, b2, c2, d2, X[ 7], 6, k9);
  396. Subround(F, d2, e2, a2, b2, c2, X[ 6], 8, k9);
  397. Subround(F, c2, d2, e2, a2, b2, X[ 2], 13, k9);
  398. Subround(F, b2, c2, d2, e2, a2, X[13], 6, k9);
  399. Subround(F, a2, b2, c2, d2, e2, X[14], 5, k9);
  400. Subround(F, e2, a2, b2, c2, d2, X[ 0], 15, k9);
  401. Subround(F, d2, e2, a2, b2, c2, X[ 3], 13, k9);
  402. Subround(F, c2, d2, e2, a2, b2, X[ 9], 11, k9);
  403. Subround(F, b2, c2, d2, e2, a2, X[11], 11, k9);
  404. t = e1; e1 = e2; e2 = t;
  405. digest[0] += a1;
  406. digest[1] += b1;
  407. digest[2] += c1;
  408. digest[3] += d1;
  409. digest[4] += e1;
  410. digest[5] += a2;
  411. digest[6] += b2;
  412. digest[7] += c2;
  413. digest[8] += d2;
  414. digest[9] += e2;
  415. }
  416. #undef Subround
  417. // *************************************************************
  418. // for 128 and 256
  419. #define Subround(f, a, b, c, d, x, s, k) \
  420. a += f(b, c, d) + x + k;\
  421. a = rotlFixed((word32)a, s);
  422. void RIPEMD128::InitState(HashWordType *state)
  423. {
  424. state[0] = 0x67452301L;
  425. state[1] = 0xefcdab89L;
  426. state[2] = 0x98badcfeL;
  427. state[3] = 0x10325476L;
  428. }
  429. void RIPEMD128::Transform (word32 *digest, const word32 *X)
  430. {
  431. unsigned long a1, b1, c1, d1, a2, b2, c2, d2;
  432. a1 = a2 = digest[0];
  433. b1 = b2 = digest[1];
  434. c1 = c2 = digest[2];
  435. d1 = d2 = digest[3];
  436. Subround(F, a1, b1, c1, d1, X[ 0], 11, k0);
  437. Subround(F, d1, a1, b1, c1, X[ 1], 14, k0);
  438. Subround(F, c1, d1, a1, b1, X[ 2], 15, k0);
  439. Subround(F, b1, c1, d1, a1, X[ 3], 12, k0);
  440. Subround(F, a1, b1, c1, d1, X[ 4], 5, k0);
  441. Subround(F, d1, a1, b1, c1, X[ 5], 8, k0);
  442. Subround(F, c1, d1, a1, b1, X[ 6], 7, k0);
  443. Subround(F, b1, c1, d1, a1, X[ 7], 9, k0);
  444. Subround(F, a1, b1, c1, d1, X[ 8], 11, k0);
  445. Subround(F, d1, a1, b1, c1, X[ 9], 13, k0);
  446. Subround(F, c1, d1, a1, b1, X[10], 14, k0);
  447. Subround(F, b1, c1, d1, a1, X[11], 15, k0);
  448. Subround(F, a1, b1, c1, d1, X[12], 6, k0);
  449. Subround(F, d1, a1, b1, c1, X[13], 7, k0);
  450. Subround(F, c1, d1, a1, b1, X[14], 9, k0);
  451. Subround(F, b1, c1, d1, a1, X[15], 8, k0);
  452. Subround(G, a1, b1, c1, d1, X[ 7], 7, k1);
  453. Subround(G, d1, a1, b1, c1, X[ 4], 6, k1);
  454. Subround(G, c1, d1, a1, b1, X[13], 8, k1);
  455. Subround(G, b1, c1, d1, a1, X[ 1], 13, k1);
  456. Subround(G, a1, b1, c1, d1, X[10], 11, k1);
  457. Subround(G, d1, a1, b1, c1, X[ 6], 9, k1);
  458. Subround(G, c1, d1, a1, b1, X[15], 7, k1);
  459. Subround(G, b1, c1, d1, a1, X[ 3], 15, k1);
  460. Subround(G, a1, b1, c1, d1, X[12], 7, k1);
  461. Subround(G, d1, a1, b1, c1, X[ 0], 12, k1);
  462. Subround(G, c1, d1, a1, b1, X[ 9], 15, k1);
  463. Subround(G, b1, c1, d1, a1, X[ 5], 9, k1);
  464. Subround(G, a1, b1, c1, d1, X[ 2], 11, k1);
  465. Subround(G, d1, a1, b1, c1, X[14], 7, k1);
  466. Subround(G, c1, d1, a1, b1, X[11], 13, k1);
  467. Subround(G, b1, c1, d1, a1, X[ 8], 12, k1);
  468. Subround(H, a1, b1, c1, d1, X[ 3], 11, k2);
  469. Subround(H, d1, a1, b1, c1, X[10], 13, k2);
  470. Subround(H, c1, d1, a1, b1, X[14], 6, k2);
  471. Subround(H, b1, c1, d1, a1, X[ 4], 7, k2);
  472. Subround(H, a1, b1, c1, d1, X[ 9], 14, k2);
  473. Subround(H, d1, a1, b1, c1, X[15], 9, k2);
  474. Subround(H, c1, d1, a1, b1, X[ 8], 13, k2);
  475. Subround(H, b1, c1, d1, a1, X[ 1], 15, k2);
  476. Subround(H, a1, b1, c1, d1, X[ 2], 14, k2);
  477. Subround(H, d1, a1, b1, c1, X[ 7], 8, k2);
  478. Subround(H, c1, d1, a1, b1, X[ 0], 13, k2);
  479. Subround(H, b1, c1, d1, a1, X[ 6], 6, k2);
  480. Subround(H, a1, b1, c1, d1, X[13], 5, k2);
  481. Subround(H, d1, a1, b1, c1, X[11], 12, k2);
  482. Subround(H, c1, d1, a1, b1, X[ 5], 7, k2);
  483. Subround(H, b1, c1, d1, a1, X[12], 5, k2);
  484. Subround(I, a1, b1, c1, d1, X[ 1], 11, k3);
  485. Subround(I, d1, a1, b1, c1, X[ 9], 12, k3);
  486. Subround(I, c1, d1, a1, b1, X[11], 14, k3);
  487. Subround(I, b1, c1, d1, a1, X[10], 15, k3);
  488. Subround(I, a1, b1, c1, d1, X[ 0], 14, k3);
  489. Subround(I, d1, a1, b1, c1, X[ 8], 15, k3);
  490. Subround(I, c1, d1, a1, b1, X[12], 9, k3);
  491. Subround(I, b1, c1, d1, a1, X[ 4], 8, k3);
  492. Subround(I, a1, b1, c1, d1, X[13], 9, k3);
  493. Subround(I, d1, a1, b1, c1, X[ 3], 14, k3);
  494. Subround(I, c1, d1, a1, b1, X[ 7], 5, k3);
  495. Subround(I, b1, c1, d1, a1, X[15], 6, k3);
  496. Subround(I, a1, b1, c1, d1, X[14], 8, k3);
  497. Subround(I, d1, a1, b1, c1, X[ 5], 6, k3);
  498. Subround(I, c1, d1, a1, b1, X[ 6], 5, k3);
  499. Subround(I, b1, c1, d1, a1, X[ 2], 12, k3);
  500. Subround(I, a2, b2, c2, d2, X[ 5], 8, k5);
  501. Subround(I, d2, a2, b2, c2, X[14], 9, k5);
  502. Subround(I, c2, d2, a2, b2, X[ 7], 9, k5);
  503. Subround(I, b2, c2, d2, a2, X[ 0], 11, k5);
  504. Subround(I, a2, b2, c2, d2, X[ 9], 13, k5);
  505. Subround(I, d2, a2, b2, c2, X[ 2], 15, k5);
  506. Subround(I, c2, d2, a2, b2, X[11], 15, k5);
  507. Subround(I, b2, c2, d2, a2, X[ 4], 5, k5);
  508. Subround(I, a2, b2, c2, d2, X[13], 7, k5);
  509. Subround(I, d2, a2, b2, c2, X[ 6], 7, k5);
  510. Subround(I, c2, d2, a2, b2, X[15], 8, k5);
  511. Subround(I, b2, c2, d2, a2, X[ 8], 11, k5);
  512. Subround(I, a2, b2, c2, d2, X[ 1], 14, k5);
  513. Subround(I, d2, a2, b2, c2, X[10], 14, k5);
  514. Subround(I, c2, d2, a2, b2, X[ 3], 12, k5);
  515. Subround(I, b2, c2, d2, a2, X[12], 6, k5);
  516. Subround(H, a2, b2, c2, d2, X[ 6], 9, k6);
  517. Subround(H, d2, a2, b2, c2, X[11], 13, k6);
  518. Subround(H, c2, d2, a2, b2, X[ 3], 15, k6);
  519. Subround(H, b2, c2, d2, a2, X[ 7], 7, k6);
  520. Subround(H, a2, b2, c2, d2, X[ 0], 12, k6);
  521. Subround(H, d2, a2, b2, c2, X[13], 8, k6);
  522. Subround(H, c2, d2, a2, b2, X[ 5], 9, k6);
  523. Subround(H, b2, c2, d2, a2, X[10], 11, k6);
  524. Subround(H, a2, b2, c2, d2, X[14], 7, k6);
  525. Subround(H, d2, a2, b2, c2, X[15], 7, k6);
  526. Subround(H, c2, d2, a2, b2, X[ 8], 12, k6);
  527. Subround(H, b2, c2, d2, a2, X[12], 7, k6);
  528. Subround(H, a2, b2, c2, d2, X[ 4], 6, k6);
  529. Subround(H, d2, a2, b2, c2, X[ 9], 15, k6);
  530. Subround(H, c2, d2, a2, b2, X[ 1], 13, k6);
  531. Subround(H, b2, c2, d2, a2, X[ 2], 11, k6);
  532. Subround(G, a2, b2, c2, d2, X[15], 9, k7);
  533. Subround(G, d2, a2, b2, c2, X[ 5], 7, k7);
  534. Subround(G, c2, d2, a2, b2, X[ 1], 15, k7);
  535. Subround(G, b2, c2, d2, a2, X[ 3], 11, k7);
  536. Subround(G, a2, b2, c2, d2, X[ 7], 8, k7);
  537. Subround(G, d2, a2, b2, c2, X[14], 6, k7);
  538. Subround(G, c2, d2, a2, b2, X[ 6], 6, k7);
  539. Subround(G, b2, c2, d2, a2, X[ 9], 14, k7);
  540. Subround(G, a2, b2, c2, d2, X[11], 12, k7);
  541. Subround(G, d2, a2, b2, c2, X[ 8], 13, k7);
  542. Subround(G, c2, d2, a2, b2, X[12], 5, k7);
  543. Subround(G, b2, c2, d2, a2, X[ 2], 14, k7);
  544. Subround(G, a2, b2, c2, d2, X[10], 13, k7);
  545. Subround(G, d2, a2, b2, c2, X[ 0], 13, k7);
  546. Subround(G, c2, d2, a2, b2, X[ 4], 7, k7);
  547. Subround(G, b2, c2, d2, a2, X[13], 5, k7);
  548. Subround(F, a2, b2, c2, d2, X[ 8], 15, k9);
  549. Subround(F, d2, a2, b2, c2, X[ 6], 5, k9);
  550. Subround(F, c2, d2, a2, b2, X[ 4], 8, k9);
  551. Subround(F, b2, c2, d2, a2, X[ 1], 11, k9);
  552. Subround(F, a2, b2, c2, d2, X[ 3], 14, k9);
  553. Subround(F, d2, a2, b2, c2, X[11], 14, k9);
  554. Subround(F, c2, d2, a2, b2, X[15], 6, k9);
  555. Subround(F, b2, c2, d2, a2, X[ 0], 14, k9);
  556. Subround(F, a2, b2, c2, d2, X[ 5], 6, k9);
  557. Subround(F, d2, a2, b2, c2, X[12], 9, k9);
  558. Subround(F, c2, d2, a2, b2, X[ 2], 12, k9);
  559. Subround(F, b2, c2, d2, a2, X[13], 9, k9);
  560. Subround(F, a2, b2, c2, d2, X[ 9], 12, k9);
  561. Subround(F, d2, a2, b2, c2, X[ 7], 5, k9);
  562. Subround(F, c2, d2, a2, b2, X[10], 15, k9);
  563. Subround(F, b2, c2, d2, a2, X[14], 8, k9);
  564. c1 = digest[1] + c1 + d2;
  565. digest[1] = digest[2] + d1 + a2;
  566. digest[2] = digest[3] + a1 + b2;
  567. digest[3] = digest[0] + b1 + c2;
  568. digest[0] = c1;
  569. }
  570. // *************************************************************
  571. void RIPEMD256::InitState(HashWordType *state)
  572. {
  573. state[0] = 0x67452301L;
  574. state[1] = 0xefcdab89L;
  575. state[2] = 0x98badcfeL;
  576. state[3] = 0x10325476L;
  577. state[4] = 0x76543210L;
  578. state[5] = 0xfedcba98L;
  579. state[6] = 0x89abcdefL;
  580. state[7] = 0x01234567L;
  581. }
  582. void RIPEMD256::Transform (word32 *digest, const word32 *X)
  583. {
  584. unsigned long a1, b1, c1, d1, a2, b2, c2, d2, t;
  585. a1 = digest[0];
  586. b1 = digest[1];
  587. c1 = digest[2];
  588. d1 = digest[3];
  589. a2 = digest[4];
  590. b2 = digest[5];
  591. c2 = digest[6];
  592. d2 = digest[7];
  593. Subround(F, a1, b1, c1, d1, X[ 0], 11, k0);
  594. Subround(F, d1, a1, b1, c1, X[ 1], 14, k0);
  595. Subround(F, c1, d1, a1, b1, X[ 2], 15, k0);
  596. Subround(F, b1, c1, d1, a1, X[ 3], 12, k0);
  597. Subround(F, a1, b1, c1, d1, X[ 4], 5, k0);
  598. Subround(F, d1, a1, b1, c1, X[ 5], 8, k0);
  599. Subround(F, c1, d1, a1, b1, X[ 6], 7, k0);
  600. Subround(F, b1, c1, d1, a1, X[ 7], 9, k0);
  601. Subround(F, a1, b1, c1, d1, X[ 8], 11, k0);
  602. Subround(F, d1, a1, b1, c1, X[ 9], 13, k0);
  603. Subround(F, c1, d1, a1, b1, X[10], 14, k0);
  604. Subround(F, b1, c1, d1, a1, X[11], 15, k0);
  605. Subround(F, a1, b1, c1, d1, X[12], 6, k0);
  606. Subround(F, d1, a1, b1, c1, X[13], 7, k0);
  607. Subround(F, c1, d1, a1, b1, X[14], 9, k0);
  608. Subround(F, b1, c1, d1, a1, X[15], 8, k0);
  609. Subround(I, a2, b2, c2, d2, X[ 5], 8, k5);
  610. Subround(I, d2, a2, b2, c2, X[14], 9, k5);
  611. Subround(I, c2, d2, a2, b2, X[ 7], 9, k5);
  612. Subround(I, b2, c2, d2, a2, X[ 0], 11, k5);
  613. Subround(I, a2, b2, c2, d2, X[ 9], 13, k5);
  614. Subround(I, d2, a2, b2, c2, X[ 2], 15, k5);
  615. Subround(I, c2, d2, a2, b2, X[11], 15, k5);
  616. Subround(I, b2, c2, d2, a2, X[ 4], 5, k5);
  617. Subround(I, a2, b2, c2, d2, X[13], 7, k5);
  618. Subround(I, d2, a2, b2, c2, X[ 6], 7, k5);
  619. Subround(I, c2, d2, a2, b2, X[15], 8, k5);
  620. Subround(I, b2, c2, d2, a2, X[ 8], 11, k5);
  621. Subround(I, a2, b2, c2, d2, X[ 1], 14, k5);
  622. Subround(I, d2, a2, b2, c2, X[10], 14, k5);
  623. Subround(I, c2, d2, a2, b2, X[ 3], 12, k5);
  624. Subround(I, b2, c2, d2, a2, X[12], 6, k5);
  625. t = a1; a1 = a2; a2 = t;
  626. Subround(G, a1, b1, c1, d1, X[ 7], 7, k1);
  627. Subround(G, d1, a1, b1, c1, X[ 4], 6, k1);
  628. Subround(G, c1, d1, a1, b1, X[13], 8, k1);
  629. Subround(G, b1, c1, d1, a1, X[ 1], 13, k1);
  630. Subround(G, a1, b1, c1, d1, X[10], 11, k1);
  631. Subround(G, d1, a1, b1, c1, X[ 6], 9, k1);
  632. Subround(G, c1, d1, a1, b1, X[15], 7, k1);
  633. Subround(G, b1, c1, d1, a1, X[ 3], 15, k1);
  634. Subround(G, a1, b1, c1, d1, X[12], 7, k1);
  635. Subround(G, d1, a1, b1, c1, X[ 0], 12, k1);
  636. Subround(G, c1, d1, a1, b1, X[ 9], 15, k1);
  637. Subround(G, b1, c1, d1, a1, X[ 5], 9, k1);
  638. Subround(G, a1, b1, c1, d1, X[ 2], 11, k1);
  639. Subround(G, d1, a1, b1, c1, X[14], 7, k1);
  640. Subround(G, c1, d1, a1, b1, X[11], 13, k1);
  641. Subround(G, b1, c1, d1, a1, X[ 8], 12, k1);
  642. Subround(H, a2, b2, c2, d2, X[ 6], 9, k6);
  643. Subround(H, d2, a2, b2, c2, X[11], 13, k6);
  644. Subround(H, c2, d2, a2, b2, X[ 3], 15, k6);
  645. Subround(H, b2, c2, d2, a2, X[ 7], 7, k6);
  646. Subround(H, a2, b2, c2, d2, X[ 0], 12, k6);
  647. Subround(H, d2, a2, b2, c2, X[13], 8, k6);
  648. Subround(H, c2, d2, a2, b2, X[ 5], 9, k6);
  649. Subround(H, b2, c2, d2, a2, X[10], 11, k6);
  650. Subround(H, a2, b2, c2, d2, X[14], 7, k6);
  651. Subround(H, d2, a2, b2, c2, X[15], 7, k6);
  652. Subround(H, c2, d2, a2, b2, X[ 8], 12, k6);
  653. Subround(H, b2, c2, d2, a2, X[12], 7, k6);
  654. Subround(H, a2, b2, c2, d2, X[ 4], 6, k6);
  655. Subround(H, d2, a2, b2, c2, X[ 9], 15, k6);
  656. Subround(H, c2, d2, a2, b2, X[ 1], 13, k6);
  657. Subround(H, b2, c2, d2, a2, X[ 2], 11, k6);
  658. t = b1; b1 = b2; b2 = t;
  659. Subround(H, a1, b1, c1, d1, X[ 3], 11, k2);
  660. Subround(H, d1, a1, b1, c1, X[10], 13, k2);
  661. Subround(H, c1, d1, a1, b1, X[14], 6, k2);
  662. Subround(H, b1, c1, d1, a1, X[ 4], 7, k2);
  663. Subround(H, a1, b1, c1, d1, X[ 9], 14, k2);
  664. Subround(H, d1, a1, b1, c1, X[15], 9, k2);
  665. Subround(H, c1, d1, a1, b1, X[ 8], 13, k2);
  666. Subround(H, b1, c1, d1, a1, X[ 1], 15, k2);
  667. Subround(H, a1, b1, c1, d1, X[ 2], 14, k2);
  668. Subround(H, d1, a1, b1, c1, X[ 7], 8, k2);
  669. Subround(H, c1, d1, a1, b1, X[ 0], 13, k2);
  670. Subround(H, b1, c1, d1, a1, X[ 6], 6, k2);
  671. Subround(H, a1, b1, c1, d1, X[13], 5, k2);
  672. Subround(H, d1, a1, b1, c1, X[11], 12, k2);
  673. Subround(H, c1, d1, a1, b1, X[ 5], 7, k2);
  674. Subround(H, b1, c1, d1, a1, X[12], 5, k2);
  675. Subround(G, a2, b2, c2, d2, X[15], 9, k7);
  676. Subround(G, d2, a2, b2, c2, X[ 5], 7, k7);
  677. Subround(G, c2, d2, a2, b2, X[ 1], 15, k7);
  678. Subround(G, b2, c2, d2, a2, X[ 3], 11, k7);
  679. Subround(G, a2, b2, c2, d2, X[ 7], 8, k7);
  680. Subround(G, d2, a2, b2, c2, X[14], 6, k7);
  681. Subround(G, c2, d2, a2, b2, X[ 6], 6, k7);
  682. Subround(G, b2, c2, d2, a2, X[ 9], 14, k7);
  683. Subround(G, a2, b2, c2, d2, X[11], 12, k7);
  684. Subround(G, d2, a2, b2, c2, X[ 8], 13, k7);
  685. Subround(G, c2, d2, a2, b2, X[12], 5, k7);
  686. Subround(G, b2, c2, d2, a2, X[ 2], 14, k7);
  687. Subround(G, a2, b2, c2, d2, X[10], 13, k7);
  688. Subround(G, d2, a2, b2, c2, X[ 0], 13, k7);
  689. Subround(G, c2, d2, a2, b2, X[ 4], 7, k7);
  690. Subround(G, b2, c2, d2, a2, X[13], 5, k7);
  691. t = c1; c1 = c2; c2 = t;
  692. Subround(I, a1, b1, c1, d1, X[ 1], 11, k3);
  693. Subround(I, d1, a1, b1, c1, X[ 9], 12, k3);
  694. Subround(I, c1, d1, a1, b1, X[11], 14, k3);
  695. Subround(I, b1, c1, d1, a1, X[10], 15, k3);
  696. Subround(I, a1, b1, c1, d1, X[ 0], 14, k3);
  697. Subround(I, d1, a1, b1, c1, X[ 8], 15, k3);
  698. Subround(I, c1, d1, a1, b1, X[12], 9, k3);
  699. Subround(I, b1, c1, d1, a1, X[ 4], 8, k3);
  700. Subround(I, a1, b1, c1, d1, X[13], 9, k3);
  701. Subround(I, d1, a1, b1, c1, X[ 3], 14, k3);
  702. Subround(I, c1, d1, a1, b1, X[ 7], 5, k3);
  703. Subround(I, b1, c1, d1, a1, X[15], 6, k3);
  704. Subround(I, a1, b1, c1, d1, X[14], 8, k3);
  705. Subround(I, d1, a1, b1, c1, X[ 5], 6, k3);
  706. Subround(I, c1, d1, a1, b1, X[ 6], 5, k3);
  707. Subround(I, b1, c1, d1, a1, X[ 2], 12, k3);
  708. Subround(F, a2, b2, c2, d2, X[ 8], 15, k9);
  709. Subround(F, d2, a2, b2, c2, X[ 6], 5, k9);
  710. Subround(F, c2, d2, a2, b2, X[ 4], 8, k9);
  711. Subround(F, b2, c2, d2, a2, X[ 1], 11, k9);
  712. Subround(F, a2, b2, c2, d2, X[ 3], 14, k9);
  713. Subround(F, d2, a2, b2, c2, X[11], 14, k9);
  714. Subround(F, c2, d2, a2, b2, X[15], 6, k9);
  715. Subround(F, b2, c2, d2, a2, X[ 0], 14, k9);
  716. Subround(F, a2, b2, c2, d2, X[ 5], 6, k9);
  717. Subround(F, d2, a2, b2, c2, X[12], 9, k9);
  718. Subround(F, c2, d2, a2, b2, X[ 2], 12, k9);
  719. Subround(F, b2, c2, d2, a2, X[13], 9, k9);
  720. Subround(F, a2, b2, c2, d2, X[ 9], 12, k9);
  721. Subround(F, d2, a2, b2, c2, X[ 7], 5, k9);
  722. Subround(F, c2, d2, a2, b2, X[10], 15, k9);
  723. Subround(F, b2, c2, d2, a2, X[14], 8, k9);
  724. t = d1; d1 = d2; d2 = t;
  725. digest[0] += a1;
  726. digest[1] += b1;
  727. digest[2] += c1;
  728. digest[3] += d1;
  729. digest[4] += a2;
  730. digest[5] += b2;
  731. digest[6] += c2;
  732. digest[7] += d2;
  733. }
  734. NAMESPACE_END