3 // Copyright (c) Microsoft Corporation. All rights reserved.
6 // <OWNER>[....]</OWNER>
10 // RIPEMD160Managed.cs
12 // RIPEMD-160 algorithm by Antoon Bosselaers, described at
13 // http://www.esat.kuleuven.ac.be/~cosicart/ps/AB-9601/.
16 namespace System.Security.Cryptography {
18 using System.Diagnostics.Contracts;
20 [System.Runtime.InteropServices.ComVisible(true)]
21 public class RIPEMD160Managed : RIPEMD160
23 private byte[] _buffer;
24 private long _count; // Number of bytes in the hashed message
25 private uint[] _stateMD160;
26 private uint[] _blockDWords;
29 // public constructors
32 public RIPEMD160Managed() {
33 if (CryptoConfig.AllowOnlyFipsAlgorithms)
34 throw new InvalidOperationException(Environment.GetResourceString("Cryptography_NonCompliantFIPSAlgorithm"));
35 Contract.EndContractBlock();
37 _stateMD160 = new uint[5];
38 _blockDWords = new uint[16];
39 _buffer = new byte[64];
48 public override void Initialize() {
51 // Zeroize potentially sensitive information.
52 Array.Clear(_blockDWords, 0, _blockDWords.Length);
53 Array.Clear(_buffer, 0, _buffer.Length);
56 [System.Security.SecuritySafeCritical] // auto-generated
57 protected override void HashCore(byte[] rgb, int ibStart, int cbSize) {
58 _HashData(rgb, ibStart, cbSize);
61 [System.Security.SecuritySafeCritical] // auto-generated
62 protected override byte[] HashFinal() {
70 private void InitializeState() {
73 // Use the same chaining values (IVs) as in SHA1,
74 // The convention is little endian however (same as MD4)
75 _stateMD160[0] = 0x67452301;
76 _stateMD160[1] = 0xefcdab89;
77 _stateMD160[2] = 0x98badcfe;
78 _stateMD160[3] = 0x10325476;
79 _stateMD160[4] = 0xc3d2e1f0;
82 [System.Security.SecurityCritical] // auto-generated
83 private unsafe void _HashData(byte[] partIn, int ibStart, int cbSize) {
85 int partInLen = cbSize;
86 int partInBase = ibStart;
88 /* Compute length of buffer */
89 bufferLen = (int) (_count & 0x3f);
91 /* Update number of bytes */
94 fixed (uint* stateMD160 = _stateMD160) {
95 fixed (byte* buffer = _buffer) {
96 fixed (uint* blockDWords = _blockDWords) {
97 if ((bufferLen > 0) && (bufferLen + partInLen >= 64)) {
98 Buffer.InternalBlockCopy(partIn, partInBase, _buffer, bufferLen, 64 - bufferLen);
99 partInBase += (64 - bufferLen);
100 partInLen -= (64 - bufferLen);
101 MDTransform(blockDWords, stateMD160, buffer);
105 /* Copy input to temporary buffer and hash */
106 while (partInLen >= 64) {
107 Buffer.InternalBlockCopy(partIn, partInBase, _buffer, 0, 64);
110 MDTransform(blockDWords, stateMD160, buffer);
114 Buffer.InternalBlockCopy(partIn, partInBase, _buffer, bufferLen, partInLen);
121 [System.Security.SecurityCritical] // auto-generated
122 private byte[] _EndHash() {
126 byte[] hash = new byte[20];
128 /* Compute padding: 80 00 00 ... 00 00 <bit count>
131 padLen = 64 - (int)(_count & 0x3f);
135 pad = new byte[padLen];
138 // Convert count to bit count
139 bitCount = _count * 8;
141 // The convention for RIPEMD is little endian (the same as MD4)
142 pad[padLen-1] = (byte) ((bitCount >> 56) & 0xff);
143 pad[padLen-2] = (byte) ((bitCount >> 48) & 0xff);
144 pad[padLen-3] = (byte) ((bitCount >> 40) & 0xff);
145 pad[padLen-4] = (byte) ((bitCount >> 32) & 0xff);
146 pad[padLen-5] = (byte) ((bitCount >> 24) & 0xff);
147 pad[padLen-6] = (byte) ((bitCount >> 16) & 0xff);
148 pad[padLen-7] = (byte) ((bitCount >> 8) & 0xff);
149 pad[padLen-8] = (byte) ((bitCount >> 0) & 0xff);
152 _HashData(pad, 0, pad.Length);
155 Utils.DWORDToLittleEndian (hash, _stateMD160, 5);
161 [System.Security.SecurityCritical] // auto-generated
162 private static unsafe void MDTransform (uint* blockDWords, uint* state, byte* block)
176 Utils.DWORDFromLittleEndian (blockDWords, 16, block);
179 As we don't have macros in C# and we don't want to pay the cost of a function call
180 (which BTW is quite important here as we would have to pass 5 args by ref in
181 16 * 10 = 160 function calls)
182 we'll prefer a less compact code to a less performant code
186 // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[0], 11);
187 aa += blockDWords[0] + F(bb, cc, dd);
188 aa = (aa << 11 | aa >> (32 - 11)) + ee;
189 cc = (cc << 10 | cc >> (32 - 10));
191 // FF(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[1], 14);
192 ee += blockDWords[1] + F(aa, bb, cc);
193 ee = (ee << 14 | ee >> (32 - 14)) + dd;
194 bb = (bb << 10 | bb >> (32 - 10));
196 // FF(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[2], 15);
197 dd += blockDWords[2] + F(ee, aa, bb);
198 dd = (dd << 15 | dd >> (32 - 15)) + cc;
199 aa = (aa << 10 | aa >> (32 - 10));
201 // FF(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[3], 12);
202 cc += blockDWords[3] + F(dd, ee, aa);
203 cc = (cc << 12 | cc >> (32 - 12)) + bb;
204 ee = (ee << 10 | ee >> (32 - 10));
206 // FF(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[4], 5);
207 bb += blockDWords[4] + F(cc, dd, ee);
208 bb = (bb << 5 | bb >> (32 - 5)) + aa;
209 dd = (dd << 10 | dd >> (32 - 10));
211 // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[5], 8);
212 aa += blockDWords[5] + F(bb, cc, dd);
213 aa = (aa << 8 | aa >> (32 - 8)) + ee;
214 cc = (cc << 10 | cc >> (32 - 10));
216 // FF(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[6], 7);
217 ee += blockDWords[6] + F(aa, bb, cc);
218 ee = (ee << 7 | ee >> (32 - 7)) + dd;
219 bb = (bb << 10 | bb >> (32 - 10));
221 // FF(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[7], 9);
222 dd += blockDWords[7] + F(ee, aa, bb);
223 dd = (dd << 9 | dd >> (32 - 9)) + cc;
224 aa = (aa << 10 | aa >> (32 - 10));
226 // FF(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[8], 11);
227 cc += blockDWords[8] + F(dd, ee, aa);
228 cc = (cc << 11 | cc >> (32 - 11)) + bb;
229 ee = (ee << 10 | ee >> (32 - 10));
231 // FF(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[9], 13);
232 bb += blockDWords[9] + F(cc, dd, ee);
233 bb = (bb << 13 | bb >> (32 - 13)) + aa;
234 dd = (dd << 10 | dd >> (32 - 10));
236 // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[10], 14);
237 aa += blockDWords[10] + F(bb, cc, dd);
238 aa = (aa << 14 | aa >> (32 - 14)) + ee;
239 cc = (cc << 10 | cc >> (32 - 10));
241 // FF(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[11], 15);
242 ee += blockDWords[11] + F(aa, bb, cc);
243 ee = (ee << 15 | ee >> (32 - 15)) + dd;
244 bb = (bb << 10 | bb >> (32 - 10));
246 // FF(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[12], 6);
247 dd += blockDWords[12] + F(ee, aa, bb);
248 dd = (dd << 6 | dd >> (32 - 6)) + cc;
249 aa = (aa << 10 | aa >> (32 - 10));
251 // FF(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[13], 7);
252 cc += blockDWords[13] + F(dd, ee, aa);
253 cc = (cc << 7 | cc >> (32 - 7)) + bb;
254 ee = (ee << 10 | ee >> (32 - 10));
256 // FF(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[14], 9);
257 bb += blockDWords[14] + F(cc, dd, ee);
258 bb = (bb << 9 | bb >> (32 - 9)) + aa;
259 dd = (dd << 10 | dd >> (32 - 10));
261 // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[15], 8);
262 aa += blockDWords[15] + F(bb, cc, dd);
263 aa = (aa << 8 | aa >> (32 - 8)) + ee;
264 cc = (cc << 10 | cc >> (32 - 10));
267 // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[7], 7);
268 ee += G(aa, bb, cc) + blockDWords[7] + 0x5a827999;
269 ee = (ee << 7 | ee >> (32 - 7)) + dd;
270 bb = (bb << 10 | bb >> (32 - 10));
272 // GG(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[4], 6);
273 dd += G(ee, aa, bb) + blockDWords[4] + 0x5a827999;
274 dd = (dd << 6 | dd >> (32 - 6)) + cc;
275 aa = (aa << 10 | aa >> (32 - 10));
277 // GG(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[13], 8);
278 cc += G(dd, ee, aa) + blockDWords[13] + 0x5a827999;
279 cc = (cc << 8 | cc >> (32 - 8)) + bb;
280 ee = (ee << 10 | ee >> (32 - 10));
282 // GG(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[1], 13);
283 bb += G(cc, dd, ee) + blockDWords[1] + 0x5a827999;
284 bb = (bb << 13 | bb >> (32 - 13)) + aa;
285 dd = (dd << 10 | dd >> (32 - 10));
287 // GG(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[10], 11);
288 aa += G(bb, cc, dd) + blockDWords[10] + 0x5a827999;
289 aa = (aa << 11 | aa >> (32 - 11)) + ee;
290 cc = (cc << 10 | cc >> (32 - 10));
292 // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[6], 9);
293 ee += G(aa, bb, cc) + blockDWords[6] + 0x5a827999;
294 ee = (ee << 9 | ee >> (32 - 9)) + dd;
295 bb = (bb << 10 | bb >> (32 - 10));
297 // GG(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[15], 7);
298 dd += G(ee, aa, bb) + blockDWords[15] + 0x5a827999;
299 dd = (dd << 7 | dd >> (32 - 7)) + cc;
300 aa = (aa << 10 | aa >> (32 - 10));
302 // GG(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[3], 15);
303 cc += G(dd, ee, aa) + blockDWords[3] + 0x5a827999;
304 cc = (cc << 15 | cc >> (32 - 15)) + bb;
305 ee = (ee << 10 | ee >> (32 - 10));
307 // GG(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[12], 7);
308 bb += G(cc, dd, ee) + blockDWords[12] + 0x5a827999;
309 bb = (bb << 7 | bb >> (32 - 7)) + aa;
310 dd = (dd << 10 | dd >> (32 - 10));
312 // GG(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[0], 12);
313 aa += G(bb, cc, dd) + blockDWords[0] + 0x5a827999;
314 aa = (aa << 12 | aa >> (32 - 12)) + ee;
315 cc = (cc << 10 | cc >> (32 - 10));
317 // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[9], 15);
318 ee += G(aa, bb, cc) + blockDWords[9] + 0x5a827999;
319 ee = (ee << 15 | ee >> (32 - 15)) + dd;
320 bb = (bb << 10 | bb >> (32 - 10));
322 // GG(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[5], 9);
323 dd += G(ee, aa, bb) + blockDWords[5] + 0x5a827999;
324 dd = (dd << 9 | dd >> (32 - 9)) + cc;
325 aa = (aa << 10 | aa >> (32 - 10));
327 // GG(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[2], 11);
328 cc += G(dd, ee, aa) + blockDWords[2] + 0x5a827999;
329 cc = (cc << 11 | cc >> (32 - 11)) + bb;
330 ee = (ee << 10 | ee >> (32 - 10));
332 // GG(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[14], 7);
333 bb += G(cc, dd, ee) + blockDWords[14] + 0x5a827999;
334 bb = (bb << 7 | bb >> (32 - 7)) + aa;
335 dd = (dd << 10 | dd >> (32 - 10));
337 // GG(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[11], 13);
338 aa += G(bb, cc, dd) + blockDWords[11] + 0x5a827999;
339 aa = (aa << 13 | aa >> (32 - 13)) + ee;
340 cc = (cc << 10 | cc >> (32 - 10));
342 // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[8], 12);
343 ee += G(aa, bb, cc) + blockDWords[8] + 0x5a827999;
344 ee = (ee << 12 | ee >> (32 - 12)) + dd;
345 bb = (bb << 10 | bb >> (32 - 10));
348 // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[3], 11);
349 dd += H(ee, aa, bb) + blockDWords[3] + 0x6ed9eba1;
350 dd = (dd << 11 | dd >> (32 - 11)) + cc;
351 aa = (aa << 10 | aa >> (32 - 10));
353 // HH(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[10], 13);
354 cc += H(dd, ee, aa) + blockDWords[10] + 0x6ed9eba1;
355 cc = (cc << 13 | cc >> (32 - 13)) + bb;
356 ee = (ee << 10 | ee >> (32 - 10));
358 // HH(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[14], 6);
359 bb += H(cc, dd, ee) + blockDWords[14] + 0x6ed9eba1;
360 bb = (bb << 6 | bb >> (32 - 6)) + aa;
361 dd = (dd << 10 | dd >> (32 - 10));
363 // HH(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[4], 7);
364 aa += H(bb, cc, dd) + blockDWords[4] + 0x6ed9eba1;
365 aa = (aa << 7 | aa >> (32 - 7)) + ee;
366 cc = (cc << 10 | cc >> (32 - 10));
368 // HH(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[9], 14);
369 ee += H(aa, bb, cc) + blockDWords[9] + 0x6ed9eba1;
370 ee = (ee << 14 | ee >> (32 - 14)) + dd;
371 bb = (bb << 10 | bb >> (32 - 10));
373 // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[15], 9);
374 dd += H(ee, aa, bb) + blockDWords[15] + 0x6ed9eba1;
375 dd = (dd << 9 | dd >> (32 - 9)) + cc;
376 aa = (aa << 10 | aa >> (32 - 10));
378 // HH(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[8], 13);
379 cc += H(dd, ee, aa) + blockDWords[8] + 0x6ed9eba1;
380 cc = (cc << 13 | cc >> (32 - 13)) + bb;
381 ee = (ee << 10 | ee >> (32 - 10));
383 // HH(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[1], 15);
384 bb += H(cc, dd, ee) + blockDWords[1] + 0x6ed9eba1;
385 bb = (bb << 15 | bb >> (32 - 15)) + aa;
386 dd = (dd << 10 | dd >> (32 - 10));
388 // HH(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[2], 14);
389 aa += H(bb, cc, dd) + blockDWords[2] + 0x6ed9eba1;
390 aa = (aa << 14 | aa >> (32 - 14)) + ee;
391 cc = (cc << 10 | cc >> (32 - 10));
393 // HH(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[7], 8);
394 ee += H(aa, bb, cc) + blockDWords[7] + 0x6ed9eba1;
395 ee = (ee << 8 | ee >> (32 - 8)) + dd;
396 bb = (bb << 10 | bb >> (32 - 10));
398 // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[0], 13);
399 dd += H(ee, aa, bb) + blockDWords[0] + 0x6ed9eba1;
400 dd = (dd << 13 | dd >> (32 - 13)) + cc;
401 aa = (aa << 10 | aa >> (32 - 10));
403 // HH(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[6], 6);
404 cc += H(dd, ee, aa) + blockDWords[6] + 0x6ed9eba1;
405 cc = (cc << 6 | cc >> (32 - 6)) + bb;
406 ee = (ee << 10 | ee >> (32 - 10));
408 // HH(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[13], 5);
409 bb += H(cc, dd, ee) + blockDWords[13] + 0x6ed9eba1;
410 bb = (bb << 5 | bb >> (32 - 5)) + aa;
411 dd = (dd << 10 | dd >> (32 - 10));
413 // HH(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[11], 12);
414 aa += H(bb, cc, dd) + blockDWords[11] + 0x6ed9eba1;
415 aa = (aa << 12 | aa >> (32 - 12)) + ee;
416 cc = (cc << 10 | cc >> (32 - 10));
418 // HH(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[5], 7);
419 ee += H(aa, bb, cc) + blockDWords[5] + 0x6ed9eba1;
420 ee = (ee << 7 | ee >> (32 - 7)) + dd;
421 bb = (bb << 10 | bb >> (32 - 10));
423 // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[12], 5);
424 dd += H(ee, aa, bb) + blockDWords[12] + 0x6ed9eba1;
425 dd = (dd << 5 | dd >> (32 - 5)) + cc;
426 aa = (aa << 10 | aa >> (32 - 10));
429 // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[1], 11);
430 cc += I(dd, ee, aa) + blockDWords[1] + 0x8f1bbcdc;
431 cc = (cc << 11 | cc >> (32 - 11)) + bb;
432 ee = (ee << 10 | ee >> (32 - 10));
434 // II(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[9], 12);
435 bb += I(cc, dd, ee) + blockDWords[9] + 0x8f1bbcdc;
436 bb = (bb << 12 | bb >> (32 - 12)) + aa;
437 dd = (dd << 10 | dd >> (32 - 10));
439 // II(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[11], 14);
440 aa += I(bb, cc, dd) + blockDWords[11] + 0x8f1bbcdc;
441 aa = (aa << 14 | aa >> (32 - 14)) + ee;
442 cc = (cc << 10 | cc >> (32 - 10));
444 // II(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[10], 15);
445 ee += I(aa, bb, cc) + blockDWords[10] + 0x8f1bbcdc;
446 ee = (ee << 15 | ee >> (32 - 15)) + dd;
447 bb = (bb << 10 | bb >> (32 - 10));
449 // II(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[0], 14);
450 dd += I(ee, aa, bb) + blockDWords[0] + 0x8f1bbcdc;
451 dd = (dd << 14 | dd >> (32 - 14)) + cc;
452 aa = (aa << 10 | aa >> (32 - 10));
454 // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[8], 15);
455 cc += I(dd, ee, aa) + blockDWords[8] + 0x8f1bbcdc;
456 cc = (cc << 15 | cc >> (32 - 15)) + bb;
457 ee = (ee << 10 | ee >> (32 - 10));
459 // II(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[12], 9);
460 bb += I(cc, dd, ee) + blockDWords[12] + 0x8f1bbcdc;
461 bb = (bb << 9 | bb >> (32 - 9)) + aa;
462 dd = (dd << 10 | dd >> (32 - 10));
464 // II(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[4], 8);
465 aa += I(bb, cc, dd) + blockDWords[4] + 0x8f1bbcdc;
466 aa = (aa << 8 | aa >> (32 - 8)) + ee;
467 cc = (cc << 10 | cc >> (32 - 10));
469 // II(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[13], 9);
470 ee += I(aa, bb, cc) + blockDWords[13] + 0x8f1bbcdc;
471 ee = (ee << 9 | ee >> (32 - 9)) + dd;
472 bb = (bb << 10 | bb >> (32 - 10));
474 // II(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[3], 14);
475 dd += I(ee, aa, bb) + blockDWords[3] + 0x8f1bbcdc;
476 dd = (dd << 14 | dd >> (32 - 14)) + cc;
477 aa = (aa << 10 | aa >> (32 - 10));
479 // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[7], 5);
480 cc += I(dd, ee, aa) + blockDWords[7] + 0x8f1bbcdc;
481 cc = (cc << 5 | cc >> (32 - 5)) + bb;
482 ee = (ee << 10 | ee >> (32 - 10));
484 // II(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[15], 6);
485 bb += I(cc, dd, ee) + blockDWords[15] + 0x8f1bbcdc;
486 bb = (bb << 6 | bb >> (32 - 6)) + aa;
487 dd = (dd << 10 | dd >> (32 - 10));
489 // II(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[14], 8);
490 aa += I(bb, cc, dd) + blockDWords[14] + 0x8f1bbcdc;
491 aa = (aa << 8 | aa >> (32 - 8)) + ee;
492 cc = (cc << 10 | cc >> (32 - 10));
494 // II(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[5], 6);
495 ee += I(aa, bb, cc) + blockDWords[5] + 0x8f1bbcdc;
496 ee = (ee << 6 | ee >> (32 - 6)) + dd;
497 bb = (bb << 10 | bb >> (32 - 10));
499 // II(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[6], 5);
500 dd += I(ee, aa, bb) + blockDWords[6] + 0x8f1bbcdc;
501 dd = (dd << 5 | dd >> (32 - 5)) + cc;
502 aa = (aa << 10 | aa >> (32 - 10));
504 // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[2], 12);
505 cc += I(dd, ee, aa) + blockDWords[2] + 0x8f1bbcdc;
506 cc = (cc << 12 | cc >> (32 - 12)) + bb;
507 ee = (ee << 10 | ee >> (32 - 10));
510 // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[4], 9);
511 bb += J(cc, dd, ee) + blockDWords[4] + 0xa953fd4e;
512 bb = (bb << 9 | bb >> (32 - 9)) + aa;
513 dd = (dd << 10 | dd >> (32 - 10));
515 // JJ(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[0], 15);
516 aa += J(bb, cc, dd) + blockDWords[0] + 0xa953fd4e;
517 aa = (aa << 15 | aa >> (32 - 15)) + ee;
518 cc = (cc << 10 | cc >> (32 - 10));
520 // JJ(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[5], 5);
521 ee += J(aa, bb, cc) + blockDWords[5] + 0xa953fd4e;
522 ee = (ee << 5 | ee >> (32 - 5)) + dd;
523 bb = (bb << 10 | bb >> (32 - 10));
525 // JJ(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[9], 11);
526 dd += J(ee, aa, bb) + blockDWords[9] + 0xa953fd4e;
527 dd = (dd << 11 | dd >> (32 - 11)) + cc;
528 aa = (aa << 10 | aa >> (32 - 10));
530 // JJ(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[7], 6);
531 cc += J(dd, ee, aa) + blockDWords[7] + 0xa953fd4e;
532 cc = (cc << 6 | cc >> (32 - 6)) + bb;
533 ee = (ee << 10 | ee >> (32 - 10));
535 // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[12], 8);
536 bb += J(cc, dd, ee) + blockDWords[12] + 0xa953fd4e;
537 bb = (bb << 8 | bb >> (32 - 8)) + aa;
538 dd = (dd << 10 | dd >> (32 - 10));
540 // JJ(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[2], 13);
541 aa += J(bb, cc, dd) + blockDWords[2] + 0xa953fd4e;
542 aa = (aa << 13 | aa >> (32 - 13)) + ee;
543 cc = (cc << 10 | cc >> (32 - 10));
545 // JJ(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[10], 12);
546 ee += J(aa, bb, cc) + blockDWords[10] + 0xa953fd4e;
547 ee = (ee << 12 | ee >> (32 - 12)) + dd;
548 bb = (bb << 10 | bb >> (32 - 10));
550 // JJ(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[14], 5);
551 dd += J(ee, aa, bb) + blockDWords[14] + 0xa953fd4e;
552 dd = (dd << 5 | dd >> (32 - 5)) + cc;
553 aa = (aa << 10 | aa >> (32 - 10));
555 // JJ(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[1], 12);
556 cc += J(dd, ee, aa) + blockDWords[1] + 0xa953fd4e;
557 cc = (cc << 12 | cc >> (32 - 12)) + bb;
558 ee = (ee << 10 | ee >> (32 - 10));
560 // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[3], 13);
561 bb += J(cc, dd, ee) + blockDWords[3] + 0xa953fd4e;
562 bb = (bb << 13 | bb >> (32 - 13)) + aa;
563 dd = (dd << 10 | dd >> (32 - 10));
565 // JJ(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[8], 14);
566 aa += J(bb, cc, dd) + blockDWords[8] + 0xa953fd4e;
567 aa = (aa << 14 | aa >> (32 - 14)) + ee;
568 cc = (cc << 10 | cc >> (32 - 10));
570 // JJ(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[11], 11);
571 ee += J(aa, bb, cc) + blockDWords[11] + 0xa953fd4e;
572 ee = (ee << 11 | ee >> (32 - 11)) + dd;
573 bb = (bb << 10 | bb >> (32 - 10));
575 // JJ(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[6], 8);
576 dd += J(ee, aa, bb) + blockDWords[6] + 0xa953fd4e;
577 dd = (dd << 8 | dd >> (32 - 8)) + cc;
578 aa = (aa << 10 | aa >> (32 - 10));
580 // JJ(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[15], 5);
581 cc += J(dd, ee, aa) + blockDWords[15] + 0xa953fd4e;
582 cc = (cc << 5 | cc >> (32 - 5)) + bb;
583 ee = (ee << 10 | ee >> (32 - 10));
585 // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[13], 6);
586 bb += J(cc, dd, ee) + blockDWords[13] + 0xa953fd4e;
587 bb = (bb << 6 | bb >> (32 - 6)) + aa;
588 dd = (dd << 10 | dd >> (32 - 10));
590 // Parallel Right Round 1
591 // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[5], 8);
592 aaa += J(bbb, ccc, ddd) + blockDWords[5] + 0x50a28be6;
593 aaa = (aaa << 8 | aaa >> (32 - 8)) + eee;
594 ccc = (ccc << 10 | ccc >> (32 - 10));
596 // JJJ(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[14], 9);
597 eee += J(aaa, bbb, ccc) + blockDWords[14] + 0x50a28be6;
598 eee = (eee << 9 | eee >> (32 - 9)) + ddd;
599 bbb = (bbb << 10 | bbb >> (32 - 10));
601 // JJJ(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[7], 9);
602 ddd += J(eee, aaa, bbb) + blockDWords[7] + 0x50a28be6;
603 ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc;
604 aaa = (aaa << 10 | aaa >> (32 - 10));
606 // JJJ(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[0], 11);
607 ccc += J(ddd, eee, aaa) + blockDWords[0] + 0x50a28be6;
608 ccc = (ccc << 11 | ccc >> (32 - 11)) + bbb;
609 eee = (eee << 10 | eee >> (32 - 10));
611 // JJJ(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[9], 13);
612 bbb += J(ccc, ddd, eee) + blockDWords[9] + 0x50a28be6;
613 bbb = (bbb << 13 | bbb >> (32 - 13)) + aaa;
614 ddd = (ddd << 10 | ddd >> (32 - 10));
616 // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[2], 15);
617 aaa += J(bbb, ccc, ddd) + blockDWords[2] + 0x50a28be6;
618 aaa = (aaa << 15 | aaa >> (32 - 15)) + eee;
619 ccc = (ccc << 10 | ccc >> (32 - 10));
621 // JJJ(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[11], 15);
622 eee += J(aaa, bbb, ccc) + blockDWords[11] + 0x50a28be6;
623 eee = (eee << 15 | eee >> (32 - 15)) + ddd;
624 bbb = (bbb << 10 | bbb >> (32 - 10));
626 // JJJ(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[4], 5);
627 ddd += J(eee, aaa, bbb) + blockDWords[4] + 0x50a28be6;
628 ddd = (ddd << 5 | ddd >> (32 - 5)) + ccc;
629 aaa = (aaa << 10 | aaa >> (32 - 10));
631 // JJJ(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[13], 7);
632 ccc += J(ddd, eee, aaa) + blockDWords[13] + 0x50a28be6;
633 ccc = (ccc << 7 | ccc >> (32 - 7)) + bbb;
634 eee = (eee << 10 | eee >> (32 - 10));
636 // JJJ(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[6], 7);
637 bbb += J(ccc, ddd, eee) + blockDWords[6] + 0x50a28be6;
638 bbb = (bbb << 7 | bbb >> (32 - 7)) + aaa;
639 ddd = (ddd << 10 | ddd >> (32 - 10));
641 // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[15], 8);
642 aaa += J(bbb, ccc, ddd) + blockDWords[15] + 0x50a28be6;
643 aaa = (aaa << 8 | aaa >> (32 - 8)) + eee;
644 ccc = (ccc << 10 | ccc >> (32 - 10));
646 // JJJ(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[8], 11);
647 eee += J(aaa, bbb, ccc) + blockDWords[8] + 0x50a28be6;
648 eee = (eee << 11 | eee >> (32 - 11)) + ddd;
649 bbb = (bbb << 10 | bbb >> (32 - 10));
651 // JJJ(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[1], 14);
652 ddd += J(eee, aaa, bbb) + blockDWords[1] + 0x50a28be6;
653 ddd = (ddd << 14 | ddd >> (32 - 14)) + ccc;
654 aaa = (aaa << 10 | aaa >> (32 - 10));
656 // JJJ(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[10], 14);
657 ccc += J(ddd, eee, aaa) + blockDWords[10] + 0x50a28be6;
658 ccc = (ccc << 14 | ccc >> (32 - 14)) + bbb;
659 eee = (eee << 10 | eee >> (32 - 10));
661 // JJJ(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[3], 12);
662 bbb += J(ccc, ddd, eee) + blockDWords[3] + 0x50a28be6;
663 bbb = (bbb << 12 | bbb >> (32 - 12)) + aaa;
664 ddd = (ddd << 10 | ddd >> (32 - 10));
666 // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[12], 6);
667 aaa += J(bbb, ccc, ddd) + blockDWords[12] + 0x50a28be6;
668 aaa = (aaa << 6 | aaa >> (32 - 6)) + eee;
669 ccc = (ccc << 10 | ccc >> (32 - 10));
671 // Parallel Right Round 2
672 // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[6], 9);
673 eee += I(aaa, bbb, ccc) + blockDWords[6] + 0x5c4dd124;
674 eee = (eee << 9 | eee >> (32 - 9)) + ddd;
675 bbb = (bbb << 10 | bbb >> (32 - 10));
677 // III(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[11], 13);
678 ddd += I(eee, aaa, bbb) + blockDWords[11] + 0x5c4dd124;
679 ddd = (ddd << 13 | ddd >> (32 - 13)) + ccc;
680 aaa = (aaa << 10 | aaa >> (32 - 10));
682 // III(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[3], 15);
683 ccc += I(ddd, eee, aaa) + blockDWords[3] + 0x5c4dd124;
684 ccc = (ccc << 15 | ccc >> (32 - 15)) + bbb;
685 eee = (eee << 10 | eee >> (32 - 10));
687 // III(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[7], 7);
688 bbb += I(ccc, ddd, eee) + blockDWords[7] + 0x5c4dd124;
689 bbb = (bbb << 7 | bbb >> (32 - 7)) + aaa;
690 ddd = (ddd << 10 | ddd >> (32 - 10));
692 // III(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[0], 12);
693 aaa += I(bbb, ccc, ddd) + blockDWords[0] + 0x5c4dd124;
694 aaa = (aaa << 12 | aaa >> (32 - 12)) + eee;
695 ccc = (ccc << 10 | ccc >> (32 - 10));
697 // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[13], 8);
698 eee += I(aaa, bbb, ccc) + blockDWords[13] + 0x5c4dd124;
699 eee = (eee << 8 | eee >> (32 - 8)) + ddd;
700 bbb = (bbb << 10 | bbb >> (32 - 10));
702 // III(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[5], 9);
703 ddd += I(eee, aaa, bbb) + blockDWords[5] + 0x5c4dd124;
704 ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc;
705 aaa = (aaa << 10 | aaa >> (32 - 10));
707 // III(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[10], 11);
708 ccc += I(ddd, eee, aaa) + blockDWords[10] + 0x5c4dd124;
709 ccc = (ccc << 11 | ccc >> (32 - 11)) + bbb;
710 eee = (eee << 10 | eee >> (32 - 10));
712 // III(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[14], 7);
713 bbb += I(ccc, ddd, eee) + blockDWords[14] + 0x5c4dd124;
714 bbb = (bbb << 7 | bbb >> (32 - 7)) + aaa;
715 ddd = (ddd << 10 | ddd >> (32 - 10));
717 // III(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[15], 7);
718 aaa += I(bbb, ccc, ddd) + blockDWords[15] + 0x5c4dd124;
719 aaa = (aaa << 7 | aaa >> (32 - 7)) + eee;
720 ccc = (ccc << 10 | ccc >> (32 - 10));
722 // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[8], 12);
723 eee += I(aaa, bbb, ccc) + blockDWords[8] + 0x5c4dd124;
724 eee = (eee << 12 | eee >> (32 - 12)) + ddd;
725 bbb = (bbb << 10 | bbb >> (32 - 10));
727 // III(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[12], 7);
728 ddd += I(eee, aaa, bbb) + blockDWords[12] + 0x5c4dd124;
729 ddd = (ddd << 7 | ddd >> (32 - 7)) + ccc;
730 aaa = (aaa << 10 | aaa >> (32 - 10));
732 // III(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[4], 6);
733 ccc += I(ddd, eee, aaa) + blockDWords[4] + 0x5c4dd124;
734 ccc = (ccc << 6 | ccc >> (32 - 6)) + bbb;
735 eee = (eee << 10 | eee >> (32 - 10));
737 // III(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[9], 15);
738 bbb += I(ccc, ddd, eee) + blockDWords[9] + 0x5c4dd124;
739 bbb = (bbb << 15 | bbb >> (32 - 15)) + aaa;
740 ddd = (ddd << 10 | ddd >> (32 - 10));
742 // III(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[1], 13);
743 aaa += I(bbb, ccc, ddd) + blockDWords[1] + 0x5c4dd124;
744 aaa = (aaa << 13 | aaa >> (32 - 13)) + eee;
745 ccc = (ccc << 10 | ccc >> (32 - 10));
747 // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[2], 11);
748 eee += I(aaa, bbb, ccc) + blockDWords[2] + 0x5c4dd124;
749 eee = (eee << 11 | eee >> (32 - 11)) + ddd;
750 bbb = (bbb << 10 | bbb >> (32 - 10));
752 // Parallel Right Round 3
753 // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[15], 9);
754 ddd += H(eee, aaa, bbb) + blockDWords[15] + 0x6d703ef3;
755 ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc;
756 aaa = (aaa << 10 | aaa >> (32 - 10));
758 // HHH(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[5], 7);
759 ccc += H(ddd, eee, aaa) + blockDWords[5] + 0x6d703ef3;
760 ccc = (ccc << 7 | ccc >> (32 - 7)) + bbb;
761 eee = (eee << 10 | eee >> (32 - 10));
763 // HHH(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[1], 15);
764 bbb += H(ccc, ddd, eee) + blockDWords[1] + 0x6d703ef3;
765 bbb = (bbb << 15 | bbb >> (32 - 15)) + aaa;
766 ddd = (ddd << 10 | ddd >> (32 - 10));
768 // HHH(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[3], 11);
769 aaa += H(bbb, ccc, ddd) + blockDWords[3] + 0x6d703ef3;
770 aaa = (aaa << 11 | aaa >> (32 - 11)) + eee;
771 ccc = (ccc << 10 | ccc >> (32 - 10));
773 // HHH(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[7], 8);
774 eee += H(aaa, bbb, ccc) + blockDWords[7] + 0x6d703ef3;
775 eee = (eee << 8 | eee >> (32 - 8)) + ddd;
776 bbb = (bbb << 10 | bbb >> (32 - 10));
778 // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[14], 6);
779 ddd += H(eee, aaa, bbb) + blockDWords[14] + 0x6d703ef3;
780 ddd = (ddd << 6 | ddd >> (32 - 6)) + ccc;
781 aaa = (aaa << 10 | aaa >> (32 - 10));
783 // HHH(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[6], 6);
784 ccc += H(ddd, eee, aaa) + blockDWords[6] + 0x6d703ef3;
785 ccc = (ccc << 6 | ccc >> (32 - 6)) + bbb;
786 eee = (eee << 10 | eee >> (32 - 10));
788 // HHH(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[9], 14);
789 bbb += H(ccc, ddd, eee) + blockDWords[9] + 0x6d703ef3;
790 bbb = (bbb << 14 | bbb >> (32 - 14)) + aaa;
791 ddd = (ddd << 10 | ddd >> (32 - 10));
793 // HHH(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[11], 12);
794 aaa += H(bbb, ccc, ddd) + blockDWords[11] + 0x6d703ef3;
795 aaa = (aaa << 12 | aaa >> (32 - 12)) + eee;
796 ccc = (ccc << 10 | ccc >> (32 - 10));
798 // HHH(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[8], 13);
799 eee += H(aaa, bbb, ccc) + blockDWords[8] + 0x6d703ef3;
800 eee = (eee << 13 | eee >> (32 - 13)) + ddd;
801 bbb = (bbb << 10 | bbb >> (32 - 10));
803 // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[12], 5);
804 ddd += H(eee, aaa, bbb) + blockDWords[12] + 0x6d703ef3;
805 ddd = (ddd << 5 | ddd >> (32 - 5)) + ccc;
806 aaa = (aaa << 10 | aaa >> (32 - 10));
808 // HHH(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[2], 14);
809 ccc += H(ddd, eee, aaa) + blockDWords[2] + 0x6d703ef3;
810 ccc = (ccc << 14 | ccc >> (32 - 14)) + bbb;
811 eee = (eee << 10 | eee >> (32 - 10));
813 // HHH(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[10], 13);
814 bbb += H(ccc, ddd, eee) + blockDWords[10] + 0x6d703ef3;
815 bbb = (bbb << 13 | bbb >> (32 - 13)) + aaa;
816 ddd = (ddd << 10 | ddd >> (32 - 10));
818 // HHH(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[0], 13);
819 aaa += H(bbb, ccc, ddd) + blockDWords[0] + 0x6d703ef3;
820 aaa = (aaa << 13 | aaa >> (32 - 13)) + eee;
821 ccc = (ccc << 10 | ccc >> (32 - 10));
823 // HHH(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[4], 7);
824 eee += H(aaa, bbb, ccc) + blockDWords[4] + 0x6d703ef3;
825 eee = (eee << 7 | eee >> (32 - 7)) + ddd;
826 bbb = (bbb << 10 | bbb >> (32 - 10));
828 // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[13], 5);
829 ddd += H(eee, aaa, bbb) + blockDWords[13] + 0x6d703ef3;
830 ddd = (ddd << 5 | ddd >> (32 - 5)) + ccc;
831 aaa = (aaa << 10 | aaa >> (32 - 10));
833 // Parallel Right Round 4
834 // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[8], 15);
835 ccc += G(ddd, eee, aaa) + blockDWords[8] + 0x7a6d76e9;
836 ccc = (ccc << 15 | ccc >> (32 - 15)) + bbb;
837 eee = (eee << 10 | eee >> (32 - 10));
839 // GGG(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[6], 5);
840 bbb += G(ccc, ddd, eee) + blockDWords[6] + 0x7a6d76e9;
841 bbb = (bbb << 5 | bbb >> (32 - 5)) + aaa;
842 ddd = (ddd << 10 | ddd >> (32 - 10));
844 // GGG(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[4], 8);
845 aaa += G(bbb, ccc, ddd) + blockDWords[4] + 0x7a6d76e9;
846 aaa = (aaa << 8 | aaa >> (32 - 8)) + eee;
847 ccc = (ccc << 10 | ccc >> (32 - 10));
849 // GGG(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[1], 11);
850 eee += G(aaa, bbb, ccc) + blockDWords[1] + 0x7a6d76e9;
851 eee = (eee << 11 | eee >> (32 - 11)) + ddd;
852 bbb = (bbb << 10 | bbb >> (32 - 10));
854 // GGG(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[3], 14);
855 ddd += G(eee, aaa, bbb) + blockDWords[3] + 0x7a6d76e9;
856 ddd = (ddd << 14 | ddd >> (32 - 14)) + ccc;
857 aaa = (aaa << 10 | aaa >> (32 - 10));
859 // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[11], 14);
860 ccc += G(ddd, eee, aaa) + blockDWords[11] + 0x7a6d76e9;
861 ccc = (ccc << 14 | ccc >> (32 - 14)) + bbb;
862 eee = (eee << 10 | eee >> (32 - 10));
864 // GGG(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[15], 6);
865 bbb += G(ccc, ddd, eee) + blockDWords[15] + 0x7a6d76e9;
866 bbb = (bbb << 6 | bbb >> (32 - 6)) + aaa;
867 ddd = (ddd << 10 | ddd >> (32 - 10));
869 // GGG(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[0], 14);
870 aaa += G(bbb, ccc, ddd) + blockDWords[0] + 0x7a6d76e9;
871 aaa = (aaa << 14 | aaa >> (32 - 14)) + eee;
872 ccc = (ccc << 10 | ccc >> (32 - 10));
874 // GGG(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[5], 6);
875 eee += G(aaa, bbb, ccc) + blockDWords[5] + 0x7a6d76e9;
876 eee = (eee << 6 | eee >> (32 - 6)) + ddd;
877 bbb = (bbb << 10 | bbb >> (32 - 10));
879 // GGG(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[12], 9);
880 ddd += G(eee, aaa, bbb) + blockDWords[12] + 0x7a6d76e9;
881 ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc;
882 aaa = (aaa << 10 | aaa >> (32 - 10));
884 // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[2], 12);
885 ccc += G(ddd, eee, aaa) + blockDWords[2] + 0x7a6d76e9;
886 ccc = (ccc << 12 | ccc >> (32 - 12)) + bbb;
887 eee = (eee << 10 | eee >> (32 - 10));
889 // GGG(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[13], 9);
890 bbb += G(ccc, ddd, eee) + blockDWords[13] + 0x7a6d76e9;
891 bbb = (bbb << 9 | bbb >> (32 - 9)) + aaa;
892 ddd = (ddd << 10 | ddd >> (32 - 10));
894 // GGG(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[9], 12);
895 aaa += G(bbb, ccc, ddd) + blockDWords[9] + 0x7a6d76e9;
896 aaa = (aaa << 12 | aaa >> (32 - 12)) + eee;
897 ccc = (ccc << 10 | ccc >> (32 - 10));
899 // GGG(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[7], 5);
900 eee += G(aaa, bbb, ccc) + blockDWords[7] + 0x7a6d76e9;
901 eee = (eee << 5 | eee >> (32 - 5)) + ddd;
902 bbb = (bbb << 10 | bbb >> (32 - 10));
904 // GGG(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[10], 15);
905 ddd += G(eee, aaa, bbb) + blockDWords[10] + 0x7a6d76e9;
906 ddd = (ddd << 15 | ddd >> (32 - 15)) + ccc;
907 aaa = (aaa << 10 | aaa >> (32 - 10));
909 // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[14], 8);
910 ccc += G(ddd, eee, aaa) + blockDWords[14] + 0x7a6d76e9;
911 ccc = (ccc << 8 | ccc >> (32 - 8)) + bbb;
912 eee = (eee << 10 | eee >> (32 - 10));
914 // Parallel Right Round 5
915 // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[12], 8);
916 bbb += F(ccc, ddd, eee) + blockDWords[12];
917 bbb = (bbb << 8 | bbb >> (32 - 8)) + aaa;
918 ddd = (ddd << 10 | ddd >> (32 - 10));
920 // FFF(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[15], 5);
921 aaa += F(bbb, ccc, ddd) + blockDWords[15];
922 aaa = (aaa << 5 | aaa >> (32 - 5)) + eee;
923 ccc = (ccc << 10 | ccc >> (32 - 10));
925 // FFF(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[10], 12);
926 eee += F(aaa, bbb, ccc) + blockDWords[10];
927 eee = (eee << 12 | eee >> (32 - 12)) + ddd;
928 bbb = (bbb << 10 | bbb >> (32 - 10));
930 // FFF(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[4], 9);
931 ddd += F(eee, aaa, bbb) + blockDWords[4];
932 ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc;
933 aaa = (aaa << 10 | aaa >> (32 - 10));
935 // FFF(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[1], 12);
936 ccc += F(ddd, eee, aaa) + blockDWords[1];
937 ccc = (ccc << 12 | ccc >> (32 - 12)) + bbb;
938 eee = (eee << 10 | eee >> (32 - 10));
940 // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[5], 5);
941 bbb += F(ccc, ddd, eee) + blockDWords[5];
942 bbb = (bbb << 5 | bbb >> (32 - 5)) + aaa;
943 ddd = (ddd << 10 | ddd >> (32 - 10));
945 // FFF(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[8], 14);
946 aaa += F(bbb, ccc, ddd) + blockDWords[8];
947 aaa = (aaa << 14 | aaa >> (32 - 14)) + eee;
948 ccc = (ccc << 10 | ccc >> (32 - 10));
950 // FFF(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[7], 6);
951 eee += F(aaa, bbb, ccc) + blockDWords[7];
952 eee = (eee << 6 | eee >> (32 - 6)) + ddd;
953 bbb = (bbb << 10 | bbb >> (32 - 10));
955 // FFF(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[6], 8);
956 ddd += F(eee, aaa, bbb) + blockDWords[6];
957 ddd = (ddd << 8 | ddd >> (32 - 8)) + ccc;
958 aaa = (aaa << 10 | aaa >> (32 - 10));
960 // FFF(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[2], 13);
961 ccc += F(ddd, eee, aaa) + blockDWords[2];
962 ccc = (ccc << 13 | ccc >> (32 - 13)) + bbb;
963 eee = (eee << 10 | eee >> (32 - 10));
965 // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[13], 6);
966 bbb += F(ccc, ddd, eee) + blockDWords[13];
967 bbb = (bbb << 6 | bbb >> (32 - 6)) + aaa;
968 ddd = (ddd << 10 | ddd >> (32 - 10));
970 // FFF(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[14], 5);
971 aaa += F(bbb, ccc, ddd) + blockDWords[14];
972 aaa = (aaa << 5 | aaa >> (32 - 5)) + eee;
973 ccc = (ccc << 10 | ccc >> (32 - 10));
975 // FFF(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[0], 15);
976 eee += F(aaa, bbb, ccc) + blockDWords[0];
977 eee = (eee << 15 | eee >> (32 - 15)) + ddd;
978 bbb = (bbb << 10 | bbb >> (32 - 10));
980 // FFF(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[3], 13);
981 ddd += F(eee, aaa, bbb) + blockDWords[3];
982 ddd = (ddd << 13 | ddd >> (32 - 13)) + ccc;
983 aaa = (aaa << 10 | aaa >> (32 - 10));
985 // FFF(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[9], 11);
986 ccc += F(ddd, eee, aaa) + blockDWords[9];
987 ccc = (ccc << 11 | ccc >> (32 - 11)) + bbb;
988 eee = (eee << 10 | eee >> (32 - 10));
990 // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[11], 11);
991 bbb += F(ccc, ddd, eee) + blockDWords[11];
992 bbb = (bbb << 11 | bbb >> (32 - 11)) + aaa;
993 ddd = (ddd << 10 | ddd >> (32 - 10));
995 // Update the state of the hash object
996 ddd += cc + state[1];
997 state[1] = state[2] + dd + eee;
998 state[2] = state[3] + ee + aaa;
999 state[3] = state[4] + aa + bbb;
1000 state[4] = state[0] + bb + ccc;
1004 // The five basic functions
1005 private static uint F (uint x, uint y, uint z) {
1009 private static uint G (uint x, uint y, uint z) {
1010 return ((x & y) | (~x & z));
1013 private static uint H (uint x, uint y, uint z) {
1014 return ((x | ~y) ^ z);
1017 private static uint I (uint x, uint y, uint z) {
1018 return ((x & z) | (y & ~z));
1021 private static uint J (uint x, uint y, uint z) {
1022 return (x ^ (y | ~z));