1 // ==++==
2 //
3 //   Copyright (c) Microsoft Corporation.  All rights reserved.
4 //
5 // ==--==
6 // <OWNER>Microsoft</OWNER>
7 //
8 
9 //
10 // RIPEMD160Managed.cs
11 //
12 // RIPEMD-160 algorithm by Antoon Bosselaers, described at
13 // http://www.esat.kuleuven.ac.be/~cosicart/ps/AB-9601/.
14 //
15 
16 namespace System.Security.Cryptography {
17     using System;
18     using System.Diagnostics.Contracts;
19 
20     [System.Runtime.InteropServices.ComVisible(true)]
21     public class RIPEMD160Managed : RIPEMD160
22     {
23         private byte[]      _buffer;
24         private long        _count; // Number of bytes in the hashed message
25         private uint[]      _stateMD160;
26         private uint[]      _blockDWords;
27 
28         //
29         // public constructors
30         //
31 
RIPEMD160Managed()32         public RIPEMD160Managed() {
33             if (CryptoConfig.AllowOnlyFipsAlgorithms)
34                 throw new InvalidOperationException(Environment.GetResourceString("Cryptography_NonCompliantFIPSAlgorithm"));
35             Contract.EndContractBlock();
36 
37             _stateMD160 = new uint[5];
38             _blockDWords = new uint[16];
39             _buffer = new byte[64];
40 
41             InitializeState();
42         }
43 
44         //
45         // public methods
46         //
47 
Initialize()48         public override void Initialize() {
49             InitializeState();
50 
51             // Zeroize potentially sensitive information.
52             Array.Clear(_blockDWords, 0, _blockDWords.Length);
53             Array.Clear(_buffer, 0, _buffer.Length);
54         }
55 
56         [System.Security.SecuritySafeCritical]  // auto-generated
HashCore(byte[] rgb, int ibStart, int cbSize)57         protected override void HashCore(byte[] rgb, int ibStart, int cbSize) {
58             _HashData(rgb, ibStart, cbSize);
59         }
60 
61         [System.Security.SecuritySafeCritical]  // auto-generated
HashFinal()62         protected override byte[] HashFinal() {
63             return _EndHash();
64         }
65 
66         //
67         // private methods
68         //
69 
InitializeState()70         private void InitializeState() {
71             _count = 0;
72 
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;
80         }
81 
82         [System.Security.SecurityCritical]  // auto-generated
_HashData(byte[] partIn, int ibStart, int cbSize)83         private unsafe void _HashData(byte[] partIn, int ibStart, int cbSize) {
84             int bufferLen;
85             int partInLen = cbSize;
86             int partInBase = ibStart;
87 
88             /* Compute length of buffer */
89             bufferLen = (int) (_count & 0x3f);
90 
91             /* Update number of bytes */
92             _count += partInLen;
93 
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);
102                             bufferLen = 0;
103                         }
104 
105                         /* Copy input to temporary buffer and hash */
106                         while (partInLen >= 64) {
107                             Buffer.InternalBlockCopy(partIn, partInBase, _buffer, 0, 64);
108                             partInBase += 64;
109                             partInLen -= 64;
110                             MDTransform(blockDWords, stateMD160, buffer);
111                         }
112 
113                         if (partInLen > 0) {
114                             Buffer.InternalBlockCopy(partIn, partInBase, _buffer, bufferLen, partInLen);
115                         }
116                     }
117                 }
118             }
119         }
120 
121         [System.Security.SecurityCritical]  // auto-generated
_EndHash()122         private byte[] _EndHash() {
123             byte[]          pad;
124             int             padLen;
125             long            bitCount;
126             byte[]          hash = new byte[20];
127 
128             /* Compute padding: 80 00 00 ... 00 00 <bit count>
129              */
130 
131             padLen = 64 - (int)(_count & 0x3f);
132             if (padLen <= 8)
133                 padLen += 64;
134 
135             pad = new byte[padLen];
136             pad[0] = 0x80;
137 
138             //  Convert count to bit count
139             bitCount = _count * 8;
140 
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);
150 
151             /* Digest padding */
152             _HashData(pad, 0, pad.Length);
153 
154             /* Store digest */
155             Utils.DWORDToLittleEndian (hash, _stateMD160, 5);
156 
157             HashValue = hash;
158             return hash;
159         }
160 
161         [System.Security.SecurityCritical]  // auto-generated
MDTransform(uint* blockDWords, uint* state, byte* block)162         private static unsafe void MDTransform (uint* blockDWords, uint* state, byte* block)
163         {
164             uint aa = state[0];
165             uint bb = state[1];
166             uint cc = state[2];
167             uint dd = state[3];
168             uint ee = state[4];
169 
170             uint aaa = aa;
171             uint bbb = bb;
172             uint ccc = cc;
173             uint ddd = dd;
174             uint eee = ee;
175 
176             Utils.DWORDFromLittleEndian (blockDWords, 16, block);
177 
178             /*
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
183             */
184 
185             // Left Round 1
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));
190 
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));
195 
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));
200 
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));
205 
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));
210 
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));
215 
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));
220 
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));
225 
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));
230 
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));
235 
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));
240 
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));
245 
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));
250 
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));
255 
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));
260 
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));
265 
266             // Left Round 2
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));
271 
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));
276 
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));
281 
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));
286 
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));
291 
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));
296 
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));
301 
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));
306 
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));
311 
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));
316 
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));
321 
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));
326 
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));
331 
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));
336 
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));
341 
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));
346 
347             // Left Round 3
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));
352 
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));
357 
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));
362 
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));
367 
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));
372 
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));
377 
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));
382 
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));
387 
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));
392 
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));
397 
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));
402 
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));
407 
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));
412 
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));
417 
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));
422 
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));
427 
428             // Left Round 4
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));
433 
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));
438 
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));
443 
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));
448 
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));
453 
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));
458 
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));
463 
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));
468 
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));
473 
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));
478 
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));
483 
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));
488 
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));
493 
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));
498 
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));
503 
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));
508 
509             // Left Round 5
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));
514 
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));
519 
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));
524 
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));
529 
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));
534 
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));
539 
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));
544 
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));
549 
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));
554 
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));
559 
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));
564 
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));
569 
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));
574 
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));
579 
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));
584 
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));
589 
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));
595 
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));
600 
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));
605 
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));
610 
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));
615 
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));
620 
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));
625 
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));
630 
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));
635 
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));
640 
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));
645 
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));
650 
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));
655 
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));
660 
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));
665 
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));
670 
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));
676 
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));
681 
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));
686 
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));
691 
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));
696 
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));
701 
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));
706 
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));
711 
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));
716 
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));
721 
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));
726 
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));
731 
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));
736 
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));
741 
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));
746 
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));
751 
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));
757 
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));
762 
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));
767 
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));
772 
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));
777 
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));
782 
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));
787 
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));
792 
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));
797 
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));
802 
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));
807 
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));
812 
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));
817 
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));
822 
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));
827 
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));
832 
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));
838 
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));
843 
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));
848 
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));
853 
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));
858 
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));
863 
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));
868 
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));
873 
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));
878 
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));
883 
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));
888 
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));
893 
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));
898 
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));
903 
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));
908 
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));
913 
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));
919 
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));
924 
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));
929 
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));
934 
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));
939 
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));
944 
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));
949 
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));
954 
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));
959 
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));
964 
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));
969 
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));
974 
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));
979 
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));
984 
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));
989 
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));
994 
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;
1001             state[0] = ddd;
1002         }
1003 
1004         // The five basic functions
F(uint x, uint y, uint z)1005         private static uint F (uint x, uint y, uint z) {
1006             return (x ^ y ^ z);
1007         }
1008 
G(uint x, uint y, uint z)1009         private static uint G (uint x, uint y, uint z) {
1010             return ((x & y) | (~x & z));
1011         }
1012 
H(uint x, uint y, uint z)1013         private static uint H (uint x, uint y, uint z) {
1014             return ((x | ~y) ^ z);
1015         }
1016 
I(uint x, uint y, uint z)1017         private static uint I (uint x, uint y, uint z) {
1018             return ((x & z) | (y & ~z));
1019         }
1020 
J(uint x, uint y, uint z)1021         private static uint J (uint x, uint y, uint z) {
1022             return (x ^ (y | ~z));
1023         }
1024     }
1025 }
1026