RIPEMD160Digest.java
上传用户:lior1029
上传日期:2013-05-07
资源大小:209k
文件大小:14k
源码类别:

CA认证

开发平台:

Java

  1. package org.bouncycastle.crypto.digests;
  2. import org.bouncycastle.crypto.Digest;
  3. /**
  4.  * implementation of RIPEMD see,
  5.  * http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html
  6.  */
  7. public class RIPEMD160Digest
  8.     extends GeneralDigest
  9. {
  10. private static final int DIGEST_LENGTH = 20;
  11. private int H0, H1, H2, H3, H4; // IV's
  12. private int[] X = new int[16];
  13. private int xOff;
  14. /**
  15.  * Standard constructor
  16.  */
  17. public RIPEMD160Digest()
  18. {
  19. reset();
  20. }
  21. /**
  22.  * Copy constructor.  This will copy the state of the provided
  23.  * message digest.
  24.  */
  25. public RIPEMD160Digest(RIPEMD160Digest t)
  26. {
  27. super(t);
  28. H0 = t.H0;
  29. H1 = t.H1;
  30. H2 = t.H2;
  31. H3 = t.H3;
  32. H4 = t.H4;
  33. System.arraycopy(t.X, 0, X, 0, t.X.length);
  34. xOff = t.xOff;
  35. }
  36. public String getAlgorithmName()
  37. {
  38. return "RIPEMD160";
  39. }
  40. public int getDigestSize()
  41. {
  42. return DIGEST_LENGTH;
  43. }
  44. protected void processWord(
  45. byte[] in,
  46. int inOff)
  47. {
  48. X[xOff++] = (in[inOff] & 0xff) | ((in[inOff + 1] & 0xff) << 8)
  49. | ((in[inOff + 2] & 0xff) << 16) | ((in[inOff + 3] & 0xff) << 24); 
  50. if (xOff == 16)
  51. {
  52. processBlock();
  53. }
  54. }
  55. protected void processLength(
  56. long bitLength)
  57. {
  58. if (xOff > 14)
  59. {
  60. processBlock();
  61. }
  62. X[14] = (int)(bitLength & 0xffffffff);
  63. X[15] = (int)(bitLength >>> 32);
  64. }
  65. private void unpackWord(
  66. int word,
  67. byte[] out,
  68. int outOff)
  69. {
  70. out[outOff]     = (byte)word;
  71. out[outOff + 1] = (byte)(word >>> 8);
  72. out[outOff + 2] = (byte)(word >>> 16);
  73. out[outOff + 3] = (byte)(word >>> 24);
  74. }
  75. public int doFinal(
  76. byte[] out,
  77. int outOff)
  78. {
  79. finish();
  80. unpackWord(H0, out, outOff);
  81. unpackWord(H1, out, outOff + 4);
  82. unpackWord(H2, out, outOff + 8);
  83. unpackWord(H3, out, outOff + 12);
  84. unpackWord(H4, out, outOff + 16);
  85. reset();
  86. return DIGEST_LENGTH;
  87. }
  88. /**
  89. * reset the chaining variables to the IV values.
  90. */
  91. public void reset()
  92. {
  93. super.reset();
  94. H0 = 0x67452301;
  95. H1 = 0xefcdab89;
  96. H2 = 0x98badcfe;
  97. H3 = 0x10325476;
  98. H4 = 0xc3d2e1f0;
  99. xOff = 0;
  100. for (int i = 0; i != X.length; i++)
  101. {
  102. X[i] = 0;
  103. }
  104. }
  105. /*
  106.  * rotate int x left n bits.
  107.  */
  108. private final int RL(
  109. int x,
  110. int n)
  111. {
  112. return (x << n) | (x >>> (32 - n));
  113. }
  114. /*
  115.  * f1,f2,f3,f4,f5 are the basic RIPEMD160 functions.
  116.  */
  117. /*
  118.  * rounds 0-15
  119.  */
  120. private final int f1(
  121. int x,
  122. int y,
  123. int z)
  124. {
  125. return x ^ y ^ z;
  126. }
  127. /*
  128.  * rounds 16-31
  129.  */
  130. private final int f2(
  131. int x,
  132. int y,
  133. int z)
  134. {
  135. return (x & y) | (~x & z);
  136. }
  137. /*
  138.  * rounds 32-47
  139.  */
  140. private final int f3(
  141. int x,
  142. int y,
  143. int z)
  144. {
  145. return (x | ~y) ^ z;
  146. }
  147. /*
  148.  * rounds 48-63
  149.  */
  150. private final int f4(
  151. int x,
  152. int y,
  153. int z)
  154. {
  155. return (x & z) | (y & ~z);
  156. }
  157. /*
  158.  * rounds 64-79
  159.  */
  160. private final int f5(
  161. int x,
  162. int y,
  163. int z)
  164. {
  165. return x ^ (y | ~z);
  166. }
  167. protected void processBlock()
  168. {
  169. int a, aa;
  170. int b, bb;
  171. int c, cc;
  172. int d, dd;
  173. int e, ee;
  174. a = aa = H0;
  175. b = bb = H1;
  176. c = cc = H2;
  177. d = dd = H3;
  178. e = ee = H4;
  179. //
  180. // Rounds 1 - 16
  181. //
  182. // left
  183. a = RL(a + f1(b,c,d) + X[ 0], 11) + e; c = RL(c, 10);
  184. e = RL(e + f1(a,b,c) + X[ 1], 14) + d; b = RL(b, 10);
  185. d = RL(d + f1(e,a,b) + X[ 2], 15) + c; a = RL(a, 10);
  186. c = RL(c + f1(d,e,a) + X[ 3], 12) + b; e = RL(e, 10);
  187. b = RL(b + f1(c,d,e) + X[ 4],  5) + a; d = RL(d, 10);
  188. a = RL(a + f1(b,c,d) + X[ 5],  8) + e; c = RL(c, 10);
  189. e = RL(e + f1(a,b,c) + X[ 6],  7) + d; b = RL(b, 10);
  190. d = RL(d + f1(e,a,b) + X[ 7],  9) + c; a = RL(a, 10);
  191. c = RL(c + f1(d,e,a) + X[ 8], 11) + b; e = RL(e, 10);
  192. b = RL(b + f1(c,d,e) + X[ 9], 13) + a; d = RL(d, 10);
  193. a = RL(a + f1(b,c,d) + X[10], 14) + e; c = RL(c, 10);
  194. e = RL(e + f1(a,b,c) + X[11], 15) + d; b = RL(b, 10);
  195. d = RL(d + f1(e,a,b) + X[12],  6) + c; a = RL(a, 10);
  196. c = RL(c + f1(d,e,a) + X[13],  7) + b; e = RL(e, 10);
  197. b = RL(b + f1(c,d,e) + X[14],  9) + a; d = RL(d, 10);
  198. a = RL(a + f1(b,c,d) + X[15],  8) + e; c = RL(c, 10);
  199. // right
  200. aa = RL(aa + f5(bb,cc,dd) + X[ 5] + 0x50a28be6,  8) + ee; cc = RL(cc, 10);
  201. ee = RL(ee + f5(aa,bb,cc) + X[14] + 0x50a28be6,  9) + dd; bb = RL(bb, 10);
  202. dd = RL(dd + f5(ee,aa,bb) + X[ 7] + 0x50a28be6,  9) + cc; aa = RL(aa, 10);
  203. cc = RL(cc + f5(dd,ee,aa) + X[ 0] + 0x50a28be6, 11) + bb; ee = RL(ee, 10);
  204. bb = RL(bb + f5(cc,dd,ee) + X[ 9] + 0x50a28be6, 13) + aa; dd = RL(dd, 10);
  205. aa = RL(aa + f5(bb,cc,dd) + X[ 2] + 0x50a28be6, 15) + ee; cc = RL(cc, 10);
  206. ee = RL(ee + f5(aa,bb,cc) + X[11] + 0x50a28be6, 15) + dd; bb = RL(bb, 10);
  207. dd = RL(dd + f5(ee,aa,bb) + X[ 4] + 0x50a28be6,  5) + cc; aa = RL(aa, 10);
  208. cc = RL(cc + f5(dd,ee,aa) + X[13] + 0x50a28be6,  7) + bb; ee = RL(ee, 10);
  209. bb = RL(bb + f5(cc,dd,ee) + X[ 6] + 0x50a28be6,  7) + aa; dd = RL(dd, 10);
  210. aa = RL(aa + f5(bb,cc,dd) + X[15] + 0x50a28be6,  8) + ee; cc = RL(cc, 10);
  211. ee = RL(ee + f5(aa,bb,cc) + X[ 8] + 0x50a28be6, 11) + dd; bb = RL(bb, 10);
  212. dd = RL(dd + f5(ee,aa,bb) + X[ 1] + 0x50a28be6, 14) + cc; aa = RL(aa, 10);
  213. cc = RL(cc + f5(dd,ee,aa) + X[10] + 0x50a28be6, 14) + bb; ee = RL(ee, 10);
  214. bb = RL(bb + f5(cc,dd,ee) + X[ 3] + 0x50a28be6, 12) + aa; dd = RL(dd, 10);
  215. aa = RL(aa + f5(bb,cc,dd) + X[12] + 0x50a28be6,  6) + ee; cc = RL(cc, 10);
  216. //
  217. // Rounds 16-31
  218. //
  219. // left
  220. e = RL(e + f2(a,b,c) + X[ 7] + 0x5a827999,  7) + d; b = RL(b, 10);
  221. d = RL(d + f2(e,a,b) + X[ 4] + 0x5a827999,  6) + c; a = RL(a, 10);
  222. c = RL(c + f2(d,e,a) + X[13] + 0x5a827999,  8) + b; e = RL(e, 10);
  223. b = RL(b + f2(c,d,e) + X[ 1] + 0x5a827999, 13) + a; d = RL(d, 10);
  224. a = RL(a + f2(b,c,d) + X[10] + 0x5a827999, 11) + e; c = RL(c, 10);
  225. e = RL(e + f2(a,b,c) + X[ 6] + 0x5a827999,  9) + d; b = RL(b, 10);
  226. d = RL(d + f2(e,a,b) + X[15] + 0x5a827999,  7) + c; a = RL(a, 10);
  227. c = RL(c + f2(d,e,a) + X[ 3] + 0x5a827999, 15) + b; e = RL(e, 10);
  228. b = RL(b + f2(c,d,e) + X[12] + 0x5a827999,  7) + a; d = RL(d, 10);
  229. a = RL(a + f2(b,c,d) + X[ 0] + 0x5a827999, 12) + e; c = RL(c, 10);
  230. e = RL(e + f2(a,b,c) + X[ 9] + 0x5a827999, 15) + d; b = RL(b, 10);
  231. d = RL(d + f2(e,a,b) + X[ 5] + 0x5a827999,  9) + c; a = RL(a, 10);
  232. c = RL(c + f2(d,e,a) + X[ 2] + 0x5a827999, 11) + b; e = RL(e, 10);
  233. b = RL(b + f2(c,d,e) + X[14] + 0x5a827999,  7) + a; d = RL(d, 10);
  234. a = RL(a + f2(b,c,d) + X[11] + 0x5a827999, 13) + e; c = RL(c, 10);
  235. e = RL(e + f2(a,b,c) + X[ 8] + 0x5a827999, 12) + d; b = RL(b, 10);
  236. // right
  237. ee = RL(ee + f4(aa,bb,cc) + X[ 6] + 0x5c4dd124,  9) + dd; bb = RL(bb, 10);
  238. dd = RL(dd + f4(ee,aa,bb) + X[11] + 0x5c4dd124, 13) + cc; aa = RL(aa, 10);
  239. cc = RL(cc + f4(dd,ee,aa) + X[ 3] + 0x5c4dd124, 15) + bb; ee = RL(ee, 10);
  240. bb = RL(bb + f4(cc,dd,ee) + X[ 7] + 0x5c4dd124,  7) + aa; dd = RL(dd, 10);
  241. aa = RL(aa + f4(bb,cc,dd) + X[ 0] + 0x5c4dd124, 12) + ee; cc = RL(cc, 10);
  242. ee = RL(ee + f4(aa,bb,cc) + X[13] + 0x5c4dd124,  8) + dd; bb = RL(bb, 10);
  243. dd = RL(dd + f4(ee,aa,bb) + X[ 5] + 0x5c4dd124,  9) + cc; aa = RL(aa, 10);
  244. cc = RL(cc + f4(dd,ee,aa) + X[10] + 0x5c4dd124, 11) + bb; ee = RL(ee, 10);
  245. bb = RL(bb + f4(cc,dd,ee) + X[14] + 0x5c4dd124,  7) + aa; dd = RL(dd, 10);
  246. aa = RL(aa + f4(bb,cc,dd) + X[15] + 0x5c4dd124,  7) + ee; cc = RL(cc, 10);
  247. ee = RL(ee + f4(aa,bb,cc) + X[ 8] + 0x5c4dd124, 12) + dd; bb = RL(bb, 10);
  248. dd = RL(dd + f4(ee,aa,bb) + X[12] + 0x5c4dd124,  7) + cc; aa = RL(aa, 10);
  249. cc = RL(cc + f4(dd,ee,aa) + X[ 4] + 0x5c4dd124,  6) + bb; ee = RL(ee, 10);
  250. bb = RL(bb + f4(cc,dd,ee) + X[ 9] + 0x5c4dd124, 15) + aa; dd = RL(dd, 10);
  251. aa = RL(aa + f4(bb,cc,dd) + X[ 1] + 0x5c4dd124, 13) + ee; cc = RL(cc, 10);
  252. ee = RL(ee + f4(aa,bb,cc) + X[ 2] + 0x5c4dd124, 11) + dd; bb = RL(bb, 10);
  253. //
  254. // Rounds 32-47
  255. //
  256. // left
  257. d = RL(d + f3(e,a,b) + X[ 3] + 0x6ed9eba1, 11) + c; a = RL(a, 10);
  258. c = RL(c + f3(d,e,a) + X[10] + 0x6ed9eba1, 13) + b; e = RL(e, 10);
  259. b = RL(b + f3(c,d,e) + X[14] + 0x6ed9eba1,  6) + a; d = RL(d, 10);
  260. a = RL(a + f3(b,c,d) + X[ 4] + 0x6ed9eba1,  7) + e; c = RL(c, 10);
  261. e = RL(e + f3(a,b,c) + X[ 9] + 0x6ed9eba1, 14) + d; b = RL(b, 10);
  262. d = RL(d + f3(e,a,b) + X[15] + 0x6ed9eba1,  9) + c; a = RL(a, 10);
  263. c = RL(c + f3(d,e,a) + X[ 8] + 0x6ed9eba1, 13) + b; e = RL(e, 10);
  264. b = RL(b + f3(c,d,e) + X[ 1] + 0x6ed9eba1, 15) + a; d = RL(d, 10);
  265. a = RL(a + f3(b,c,d) + X[ 2] + 0x6ed9eba1, 14) + e; c = RL(c, 10);
  266. e = RL(e + f3(a,b,c) + X[ 7] + 0x6ed9eba1,  8) + d; b = RL(b, 10);
  267. d = RL(d + f3(e,a,b) + X[ 0] + 0x6ed9eba1, 13) + c; a = RL(a, 10);
  268. c = RL(c + f3(d,e,a) + X[ 6] + 0x6ed9eba1,  6) + b; e = RL(e, 10);
  269. b = RL(b + f3(c,d,e) + X[13] + 0x6ed9eba1,  5) + a; d = RL(d, 10);
  270. a = RL(a + f3(b,c,d) + X[11] + 0x6ed9eba1, 12) + e; c = RL(c, 10);
  271. e = RL(e + f3(a,b,c) + X[ 5] + 0x6ed9eba1,  7) + d; b = RL(b, 10);
  272. d = RL(d + f3(e,a,b) + X[12] + 0x6ed9eba1,  5) + c; a = RL(a, 10);
  273. // right
  274. dd = RL(dd + f3(ee,aa,bb) + X[15] + 0x6d703ef3,  9) + cc; aa = RL(aa, 10);
  275. cc = RL(cc + f3(dd,ee,aa) + X[ 5] + 0x6d703ef3,  7) + bb; ee = RL(ee, 10);
  276. bb = RL(bb + f3(cc,dd,ee) + X[ 1] + 0x6d703ef3, 15) + aa; dd = RL(dd, 10);
  277. aa = RL(aa + f3(bb,cc,dd) + X[ 3] + 0x6d703ef3, 11) + ee; cc = RL(cc, 10);
  278. ee = RL(ee + f3(aa,bb,cc) + X[ 7] + 0x6d703ef3,  8) + dd; bb = RL(bb, 10);
  279. dd = RL(dd + f3(ee,aa,bb) + X[14] + 0x6d703ef3,  6) + cc; aa = RL(aa, 10);
  280. cc = RL(cc + f3(dd,ee,aa) + X[ 6] + 0x6d703ef3,  6) + bb; ee = RL(ee, 10);
  281. bb = RL(bb + f3(cc,dd,ee) + X[ 9] + 0x6d703ef3, 14) + aa; dd = RL(dd, 10);
  282. aa = RL(aa + f3(bb,cc,dd) + X[11] + 0x6d703ef3, 12) + ee; cc = RL(cc, 10);
  283. ee = RL(ee + f3(aa,bb,cc) + X[ 8] + 0x6d703ef3, 13) + dd; bb = RL(bb, 10);
  284. dd = RL(dd + f3(ee,aa,bb) + X[12] + 0x6d703ef3,  5) + cc; aa = RL(aa, 10);
  285. cc = RL(cc + f3(dd,ee,aa) + X[ 2] + 0x6d703ef3, 14) + bb; ee = RL(ee, 10);
  286. bb = RL(bb + f3(cc,dd,ee) + X[10] + 0x6d703ef3, 13) + aa; dd = RL(dd, 10);
  287. aa = RL(aa + f3(bb,cc,dd) + X[ 0] + 0x6d703ef3, 13) + ee; cc = RL(cc, 10);
  288. ee = RL(ee + f3(aa,bb,cc) + X[ 4] + 0x6d703ef3,  7) + dd; bb = RL(bb, 10);
  289. dd = RL(dd + f3(ee,aa,bb) + X[13] + 0x6d703ef3,  5) + cc; aa = RL(aa, 10);
  290. //
  291. // Rounds 48-63
  292. //
  293. // left
  294. c = RL(c + f4(d,e,a) + X[ 1] + 0x8f1bbcdc, 11) + b; e = RL(e, 10);
  295. b = RL(b + f4(c,d,e) + X[ 9] + 0x8f1bbcdc, 12) + a; d = RL(d, 10);
  296. a = RL(a + f4(b,c,d) + X[11] + 0x8f1bbcdc, 14) + e; c = RL(c, 10);
  297. e = RL(e + f4(a,b,c) + X[10] + 0x8f1bbcdc, 15) + d; b = RL(b, 10);
  298. d = RL(d + f4(e,a,b) + X[ 0] + 0x8f1bbcdc, 14) + c; a = RL(a, 10);
  299. c = RL(c + f4(d,e,a) + X[ 8] + 0x8f1bbcdc, 15) + b; e = RL(e, 10);
  300. b = RL(b + f4(c,d,e) + X[12] + 0x8f1bbcdc,  9) + a; d = RL(d, 10);
  301. a = RL(a + f4(b,c,d) + X[ 4] + 0x8f1bbcdc,  8) + e; c = RL(c, 10);
  302. e = RL(e + f4(a,b,c) + X[13] + 0x8f1bbcdc,  9) + d; b = RL(b, 10);
  303. d = RL(d + f4(e,a,b) + X[ 3] + 0x8f1bbcdc, 14) + c; a = RL(a, 10);
  304. c = RL(c + f4(d,e,a) + X[ 7] + 0x8f1bbcdc,  5) + b; e = RL(e, 10);
  305. b = RL(b + f4(c,d,e) + X[15] + 0x8f1bbcdc,  6) + a; d = RL(d, 10);
  306. a = RL(a + f4(b,c,d) + X[14] + 0x8f1bbcdc,  8) + e; c = RL(c, 10);
  307. e = RL(e + f4(a,b,c) + X[ 5] + 0x8f1bbcdc,  6) + d; b = RL(b, 10);
  308. d = RL(d + f4(e,a,b) + X[ 6] + 0x8f1bbcdc,  5) + c; a = RL(a, 10);
  309. c = RL(c + f4(d,e,a) + X[ 2] + 0x8f1bbcdc, 12) + b; e = RL(e, 10);
  310. // right
  311. cc = RL(cc + f2(dd,ee,aa) + X[ 8] + 0x7a6d76e9, 15) + bb; ee = RL(ee, 10);
  312. bb = RL(bb + f2(cc,dd,ee) + X[ 6] + 0x7a6d76e9,  5) + aa; dd = RL(dd, 10);
  313. aa = RL(aa + f2(bb,cc,dd) + X[ 4] + 0x7a6d76e9,  8) + ee; cc = RL(cc, 10);
  314. ee = RL(ee + f2(aa,bb,cc) + X[ 1] + 0x7a6d76e9, 11) + dd; bb = RL(bb, 10);
  315. dd = RL(dd + f2(ee,aa,bb) + X[ 3] + 0x7a6d76e9, 14) + cc; aa = RL(aa, 10);
  316. cc = RL(cc + f2(dd,ee,aa) + X[11] + 0x7a6d76e9, 14) + bb; ee = RL(ee, 10);
  317. bb = RL(bb + f2(cc,dd,ee) + X[15] + 0x7a6d76e9,  6) + aa; dd = RL(dd, 10);
  318. aa = RL(aa + f2(bb,cc,dd) + X[ 0] + 0x7a6d76e9, 14) + ee; cc = RL(cc, 10);
  319. ee = RL(ee + f2(aa,bb,cc) + X[ 5] + 0x7a6d76e9,  6) + dd; bb = RL(bb, 10);
  320. dd = RL(dd + f2(ee,aa,bb) + X[12] + 0x7a6d76e9,  9) + cc; aa = RL(aa, 10);
  321. cc = RL(cc + f2(dd,ee,aa) + X[ 2] + 0x7a6d76e9, 12) + bb; ee = RL(ee, 10);
  322. bb = RL(bb + f2(cc,dd,ee) + X[13] + 0x7a6d76e9,  9) + aa; dd = RL(dd, 10);
  323. aa = RL(aa + f2(bb,cc,dd) + X[ 9] + 0x7a6d76e9, 12) + ee; cc = RL(cc, 10);
  324. ee = RL(ee + f2(aa,bb,cc) + X[ 7] + 0x7a6d76e9,  5) + dd; bb = RL(bb, 10);
  325. dd = RL(dd + f2(ee,aa,bb) + X[10] + 0x7a6d76e9, 15) + cc; aa = RL(aa, 10);
  326. cc = RL(cc + f2(dd,ee,aa) + X[14] + 0x7a6d76e9,  8) + bb; ee = RL(ee, 10);
  327. //
  328. // Rounds 64-79
  329. //
  330. // left
  331. b = RL(b + f5(c,d,e) + X[ 4] + 0xa953fd4e,  9) + a; d = RL(d, 10);
  332. a = RL(a + f5(b,c,d) + X[ 0] + 0xa953fd4e, 15) + e; c = RL(c, 10);
  333. e = RL(e + f5(a,b,c) + X[ 5] + 0xa953fd4e,  5) + d; b = RL(b, 10);
  334. d = RL(d + f5(e,a,b) + X[ 9] + 0xa953fd4e, 11) + c; a = RL(a, 10);
  335. c = RL(c + f5(d,e,a) + X[ 7] + 0xa953fd4e,  6) + b; e = RL(e, 10);
  336. b = RL(b + f5(c,d,e) + X[12] + 0xa953fd4e,  8) + a; d = RL(d, 10);
  337. a = RL(a + f5(b,c,d) + X[ 2] + 0xa953fd4e, 13) + e; c = RL(c, 10);
  338. e = RL(e + f5(a,b,c) + X[10] + 0xa953fd4e, 12) + d; b = RL(b, 10);
  339. d = RL(d + f5(e,a,b) + X[14] + 0xa953fd4e,  5) + c; a = RL(a, 10);
  340. c = RL(c + f5(d,e,a) + X[ 1] + 0xa953fd4e, 12) + b; e = RL(e, 10);
  341. b = RL(b + f5(c,d,e) + X[ 3] + 0xa953fd4e, 13) + a; d = RL(d, 10);
  342. a = RL(a + f5(b,c,d) + X[ 8] + 0xa953fd4e, 14) + e; c = RL(c, 10);
  343. e = RL(e + f5(a,b,c) + X[11] + 0xa953fd4e, 11) + d; b = RL(b, 10);
  344. d = RL(d + f5(e,a,b) + X[ 6] + 0xa953fd4e,  8) + c; a = RL(a, 10);
  345. c = RL(c + f5(d,e,a) + X[15] + 0xa953fd4e,  5) + b; e = RL(e, 10);
  346. b = RL(b + f5(c,d,e) + X[13] + 0xa953fd4e,  6) + a; d = RL(d, 10);
  347. // right
  348. bb = RL(bb + f1(cc,dd,ee) + X[12],  8) + aa; dd = RL(dd, 10);
  349. aa = RL(aa + f1(bb,cc,dd) + X[15],  5) + ee; cc = RL(cc, 10);
  350. ee = RL(ee + f1(aa,bb,cc) + X[10], 12) + dd; bb = RL(bb, 10);
  351. dd = RL(dd + f1(ee,aa,bb) + X[ 4],  9) + cc; aa = RL(aa, 10);
  352. cc = RL(cc + f1(dd,ee,aa) + X[ 1], 12) + bb; ee = RL(ee, 10);
  353. bb = RL(bb + f1(cc,dd,ee) + X[ 5],  5) + aa; dd = RL(dd, 10);
  354. aa = RL(aa + f1(bb,cc,dd) + X[ 8], 14) + ee; cc = RL(cc, 10);
  355. ee = RL(ee + f1(aa,bb,cc) + X[ 7],  6) + dd; bb = RL(bb, 10);
  356. dd = RL(dd + f1(ee,aa,bb) + X[ 6],  8) + cc; aa = RL(aa, 10);
  357. cc = RL(cc + f1(dd,ee,aa) + X[ 2], 13) + bb; ee = RL(ee, 10);
  358. bb = RL(bb + f1(cc,dd,ee) + X[13],  6) + aa; dd = RL(dd, 10);
  359. aa = RL(aa + f1(bb,cc,dd) + X[14],  5) + ee; cc = RL(cc, 10);
  360. ee = RL(ee + f1(aa,bb,cc) + X[ 0], 15) + dd; bb = RL(bb, 10);
  361. dd = RL(dd + f1(ee,aa,bb) + X[ 3], 13) + cc; aa = RL(aa, 10);
  362. cc = RL(cc + f1(dd,ee,aa) + X[ 9], 11) + bb; ee = RL(ee, 10);
  363. bb = RL(bb + f1(cc,dd,ee) + X[11], 11) + aa; dd = RL(dd, 10);
  364. dd += c + H1;
  365. H1 = H2 + d + ee;
  366. H2 = H3 + e + aa;
  367. H3 = H4 + a + bb;
  368. H4 = H0 + b + cc;
  369. H0 = dd;
  370. //
  371. // reset the offset and clean out the word buffer.
  372. //
  373. xOff = 0;
  374. for (int i = 0; i != X.length; i++)
  375. {
  376. X[i] = 0;
  377. }
  378. }
  379. }