< Summary

Information
Class: Hash.Core.RIPEMD160Managed
Assembly: Hash.Core
File(s): /home/runner/work/HashCalculator/HashCalculator/src/Hash.Core/RIPEMD160Managed.cs
Line coverage
98%
Covered lines: 577
Uncovered lines: 9
Coverable lines: 586
Total lines: 1046
Line coverage: 98.4%
Branch coverage
75%
Covered branches: 9
Total branches: 12
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()50%2270%
Initialize()100%11100%
HashCore(...)100%11100%
HashFinal()100%11100%
InitializeState()100%11100%
_HashData(...)87.5%9877.27%
_EndHash()50%2295.24%
MDTransform(...)100%11100%
F(...)100%11100%
G(...)100%11100%
H(...)100%11100%
I(...)100%11100%
J(...)100%11100%

File(s)

/home/runner/work/HashCalculator/HashCalculator/src/Hash.Core/RIPEMD160Managed.cs

#LineLine coverage
 1// ==++==
 2//
 3//   Copyright (c) Microsoft Corporation.  All rights reserved.
 4//
 5// ==--==
 6// <OWNER>Microsoft</OWNER>
 7//
 8
 9// MIT License
 10// https://github.com/microsoft/referencesource/blob/51cf7850defa8a17d815b4700b67116e3fa283c2/LICENSE.txt
 11//
 12// See NOTICE.md for the full license text.
 13
 14//
 15// RIPEMD160Managed.cs
 16// https://github.com/microsoft/referencesource/blob/51cf7850defa8a17d815b4700b67116e3fa283c2/mscorlib/system/security/c
 17//
 18// RIPEMD-160 algorithm by Antoon Bosselaers, described at
 19// http://www.esat.kuleuven.ac.be/~cosicart/ps/AB-9601/.
 20//
 21
 22using System;
 23//using System.Diagnostics.Contracts;
 24using System.Security.Cryptography;
 25
 26namespace Hash.Core;
 27
 28[System.Runtime.InteropServices.ComVisible(true)]
 29public class RIPEMD160Managed : HashAlgorithm
 30{
 31    private byte[]      _buffer;
 32    private long        _count; // Number of bytes in the hashed message
 33    private uint[]      _stateMD160;
 34    private uint[]      _blockDWords;
 35
 136    public RIPEMD160Managed() {
 37        // .NET Framework 2.0 - 4.7.2 rejected all managed implementations when in FIPS mode
 38        // because the implementations are not certified. For applications which needed to
 39        // have FIPS mode enabled but also process RIPEMD160 (where there is not native Windows
 40        // crypto support), there was no good option, and the throw is no longer done.
 41        //
 42        // Since RIPEMD160 is not a FIPS-Approved algorithm anyway, this just means that an
 43        // application or library needs to determine on its own if RIPEMD160 is prohibited in context.
 144        if (CryptoConfig.AllowOnlyFipsAlgorithms/* && AppContextSwitches.UseLegacyFipsThrow*/) {
 045            throw new InvalidOperationException(
 046                "This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms."
 047            );
 48        }
 49        //Contract.EndContractBlock();
 50
 151        _stateMD160 = new uint[5];
 152        _blockDWords = new uint[16];
 153        _buffer = new byte[64];
 54
 155        InitializeState();
 156    }
 57
 158    public override void Initialize() {
 159        InitializeState();
 60
 61        // Zeroize potentially sensitive information.
 162        Array.Clear(_blockDWords, 0, _blockDWords.Length);
 163        Array.Clear(_buffer, 0, _buffer.Length);
 164    }
 65
 166    protected override void HashCore(byte[] rgb, int ibStart, int cbSize) {
 167        _HashData(rgb, ibStart, cbSize);
 168    }
 69
 170    protected override byte[] HashFinal() {
 171        return _EndHash();
 172    }
 73
 174    private void InitializeState() {
 175        _count = 0;
 76
 77        // Use the same chaining values (IVs) as in SHA1,
 78        // The convention is little endian however (same as MD4)
 179        _stateMD160[0] =  0x67452301;
 180        _stateMD160[1] =  0xefcdab89;
 181        _stateMD160[2] =  0x98badcfe;
 182        _stateMD160[3] =  0x10325476;
 183        _stateMD160[4] =  0xc3d2e1f0;
 184    }
 85
 186    private void _HashData(byte[] partIn, int ibStart, int cbSize) {
 87        int bufferLen;
 188        int partInLen = cbSize;
 189        int partInBase = ibStart;
 90
 91        /* Compute length of buffer */
 192        bufferLen = (int) (_count & 0x3f);
 93
 94        /* Update number of bytes */
 195        _count += partInLen;
 96
 197        if ((bufferLen > 0) && (bufferLen + partInLen >= 64)) {
 198            Buffer.BlockCopy(partIn, partInBase, _buffer, bufferLen, 64 - bufferLen);
 199            partInBase += (64 - bufferLen);
 1100            partInLen -= (64 - bufferLen);
 1101            MDTransform(_blockDWords, _stateMD160, _buffer);
 1102            bufferLen = 0;
 1103        }
 104
 105        /* Copy input to temporary buffer and hash */
 1106        while (partInLen >= 64) {
 0107            Buffer.BlockCopy(partIn, partInBase, _buffer, 0, 64);
 0108            partInBase += 64;
 0109            partInLen -= 64;
 0110            MDTransform(_blockDWords, _stateMD160, _buffer);
 0111        }
 112
 1113        if (partInLen > 0) {
 1114            Buffer.BlockCopy(partIn, partInBase, _buffer, bufferLen, partInLen);
 1115        }
 1116    }
 117
 1118    private byte[] _EndHash() {
 119        byte[]          pad;
 120        int             padLen;
 121        long            bitCount;
 1122        byte[]          hash = new byte[20];
 123
 124        // Compute padding: 80 00 00 ... 00 00 <bit count>
 125
 1126        padLen = 64 - (int)(_count & 0x3f);
 1127        if (padLen <= 8)
 0128            padLen += 64;
 129
 1130        pad = new byte[padLen];
 1131        pad[0] = 0x80;
 132
 133        // Convert count to bit count
 1134        bitCount = _count * 8;
 135
 136        // The convention for RIPEMD is little endian (the same as MD4)
 1137        pad[padLen-1] = (byte) ((bitCount >> 56) & 0xff);
 1138        pad[padLen-2] = (byte) ((bitCount >> 48) & 0xff);
 1139        pad[padLen-3] = (byte) ((bitCount >> 40) & 0xff);
 1140        pad[padLen-4] = (byte) ((bitCount >> 32) & 0xff);
 1141        pad[padLen-5] = (byte) ((bitCount >> 24) & 0xff);
 1142        pad[padLen-6] = (byte) ((bitCount >> 16) & 0xff);
 1143        pad[padLen-7] = (byte) ((bitCount >> 8) & 0xff);
 1144        pad[padLen-8] = (byte) ((bitCount >> 0) & 0xff);
 145
 146        /* Digest padding */
 1147        _HashData(pad, 0, pad.Length);
 148
 149        /* Store digest */
 1150        Utils.DWORDToLittleEndian(hash, _stateMD160, 5);
 151
 1152        HashValue = hash;
 1153        return hash;
 1154    }
 155
 156    private static void MDTransform (uint[] blockDWords, uint[] state, byte[] block)
 1157    {
 1158        uint aa = state[0];
 1159        uint bb = state[1];
 1160        uint cc = state[2];
 1161        uint dd = state[3];
 1162        uint ee = state[4];
 163
 1164        uint aaa = aa;
 1165        uint bbb = bb;
 1166        uint ccc = cc;
 1167        uint ddd = dd;
 1168        uint eee = ee;
 169
 1170        Utils.DWORDFromLittleEndian(blockDWords, 16, block);
 171
 172        /*
 173            As we don't have macros in C# and we don't want to pay the cost of a function call
 174            (which BTW is quite important here as we would have to pass 5 args by ref in
 175            16 * 10 = 160 function calls)
 176            we'll prefer a less compact code to a less performant code
 177        */
 178
 179        // Left Round 1
 180        // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[0], 11);
 1181        aa += blockDWords[0] + F(bb, cc, dd);
 1182        aa = (aa << 11 | aa >> (32 - 11)) + ee;
 1183        cc = (cc << 10 | cc >> (32 - 10));
 184
 185        // FF(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[1], 14);
 1186        ee += blockDWords[1] + F(aa, bb, cc);
 1187        ee = (ee << 14 | ee >> (32 - 14)) + dd;
 1188        bb = (bb << 10 | bb >> (32 - 10));
 189
 190        // FF(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[2], 15);
 1191        dd += blockDWords[2] + F(ee, aa, bb);
 1192        dd = (dd << 15 | dd >> (32 - 15)) + cc;
 1193        aa = (aa << 10 | aa >> (32 - 10));
 194
 195        // FF(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[3], 12);
 1196        cc += blockDWords[3] + F(dd, ee, aa);
 1197        cc = (cc << 12 | cc >> (32 - 12)) + bb;
 1198        ee = (ee << 10 | ee >> (32 - 10));
 199
 200        // FF(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[4], 5);
 1201        bb += blockDWords[4] + F(cc, dd, ee);
 1202        bb = (bb << 5 | bb >> (32 - 5)) + aa;
 1203        dd = (dd << 10 | dd >> (32 - 10));
 204
 205        // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[5], 8);
 1206        aa += blockDWords[5] + F(bb, cc, dd);
 1207        aa = (aa << 8 | aa >> (32 - 8)) + ee;
 1208        cc = (cc << 10 | cc >> (32 - 10));
 209
 210        // FF(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[6], 7);
 1211        ee += blockDWords[6] + F(aa, bb, cc);
 1212        ee = (ee << 7 | ee >> (32 - 7)) + dd;
 1213        bb = (bb << 10 | bb >> (32 - 10));
 214
 215        // FF(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[7], 9);
 1216        dd += blockDWords[7] + F(ee, aa, bb);
 1217        dd = (dd << 9 | dd >> (32 - 9)) + cc;
 1218        aa = (aa << 10 | aa >> (32 - 10));
 219
 220        // FF(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[8], 11);
 1221        cc += blockDWords[8] + F(dd, ee, aa);
 1222        cc = (cc << 11 | cc >> (32 - 11)) + bb;
 1223        ee = (ee << 10 | ee >> (32 - 10));
 224
 225        // FF(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[9], 13);
 1226        bb += blockDWords[9] + F(cc, dd, ee);
 1227        bb = (bb << 13 | bb >> (32 - 13)) + aa;
 1228        dd = (dd << 10 | dd >> (32 - 10));
 229
 230        // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[10], 14);
 1231        aa += blockDWords[10] + F(bb, cc, dd);
 1232        aa = (aa << 14 | aa >> (32 - 14)) + ee;
 1233        cc = (cc << 10 | cc >> (32 - 10));
 234
 235        // FF(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[11], 15);
 1236        ee += blockDWords[11] + F(aa, bb, cc);
 1237        ee = (ee << 15 | ee >> (32 - 15)) + dd;
 1238        bb = (bb << 10 | bb >> (32 - 10));
 239
 240        // FF(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[12], 6);
 1241        dd += blockDWords[12] + F(ee, aa, bb);
 1242        dd = (dd << 6 | dd >> (32 - 6)) + cc;
 1243        aa = (aa << 10 | aa >> (32 - 10));
 244
 245        // FF(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[13], 7);
 1246        cc += blockDWords[13] + F(dd, ee, aa);
 1247        cc = (cc << 7 | cc >> (32 - 7)) + bb;
 1248        ee = (ee << 10 | ee >> (32 - 10));
 249
 250        // FF(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[14], 9);
 1251        bb += blockDWords[14] + F(cc, dd, ee);
 1252        bb = (bb << 9 | bb >> (32 - 9)) + aa;
 1253        dd = (dd << 10 | dd >> (32 - 10));
 254
 255        // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[15], 8);
 1256        aa += blockDWords[15] + F(bb, cc, dd);
 1257        aa = (aa << 8 | aa >> (32 - 8)) + ee;
 1258        cc = (cc << 10 | cc >> (32 - 10));
 259
 260        // Left Round 2
 261        // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[7], 7);
 1262        ee += G(aa, bb, cc) + blockDWords[7] + 0x5a827999;
 1263        ee = (ee << 7 | ee >> (32 - 7)) + dd;
 1264        bb = (bb << 10 | bb >> (32 - 10));
 265
 266        // GG(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[4], 6);
 1267        dd += G(ee, aa, bb) + blockDWords[4] + 0x5a827999;
 1268        dd = (dd << 6 | dd >> (32 - 6)) + cc;
 1269        aa = (aa << 10 | aa >> (32 - 10));
 270
 271        // GG(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[13], 8);
 1272        cc += G(dd, ee, aa) + blockDWords[13] + 0x5a827999;
 1273        cc = (cc << 8 | cc >> (32 - 8)) + bb;
 1274        ee = (ee << 10 | ee >> (32 - 10));
 275
 276        // GG(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[1], 13);
 1277        bb += G(cc, dd, ee) + blockDWords[1] + 0x5a827999;
 1278        bb = (bb << 13 | bb >> (32 - 13)) + aa;
 1279        dd = (dd << 10 | dd >> (32 - 10));
 280
 281        // GG(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[10], 11);
 1282        aa += G(bb, cc, dd) + blockDWords[10] + 0x5a827999;
 1283        aa = (aa << 11 | aa >> (32 - 11)) + ee;
 1284        cc = (cc << 10 | cc >> (32 - 10));
 285
 286        // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[6], 9);
 1287        ee += G(aa, bb, cc) + blockDWords[6] + 0x5a827999;
 1288        ee = (ee << 9 | ee >> (32 - 9)) + dd;
 1289        bb = (bb << 10 | bb >> (32 - 10));
 290
 291        // GG(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[15], 7);
 1292        dd += G(ee, aa, bb) + blockDWords[15] + 0x5a827999;
 1293        dd = (dd << 7 | dd >> (32 - 7)) + cc;
 1294        aa = (aa << 10 | aa >> (32 - 10));
 295
 296        // GG(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[3], 15);
 1297        cc += G(dd, ee, aa) + blockDWords[3] + 0x5a827999;
 1298        cc = (cc << 15 | cc >> (32 - 15)) + bb;
 1299        ee = (ee << 10 | ee >> (32 - 10));
 300
 301        // GG(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[12], 7);
 1302        bb += G(cc, dd, ee) + blockDWords[12] + 0x5a827999;
 1303        bb = (bb << 7 | bb >> (32 - 7)) + aa;
 1304        dd = (dd << 10 | dd >> (32 - 10));
 305
 306        // GG(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[0], 12);
 1307        aa += G(bb, cc, dd) + blockDWords[0] + 0x5a827999;
 1308        aa = (aa << 12 | aa >> (32 - 12)) + ee;
 1309        cc = (cc << 10 | cc >> (32 - 10));
 310
 311        // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[9], 15);
 1312        ee += G(aa, bb, cc) + blockDWords[9] + 0x5a827999;
 1313        ee = (ee << 15 | ee >> (32 - 15)) + dd;
 1314        bb = (bb << 10 | bb >> (32 - 10));
 315
 316        // GG(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[5], 9);
 1317        dd += G(ee, aa, bb) + blockDWords[5] + 0x5a827999;
 1318        dd = (dd << 9 | dd >> (32 - 9)) + cc;
 1319        aa = (aa << 10 | aa >> (32 - 10));
 320
 321        // GG(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[2], 11);
 1322        cc += G(dd, ee, aa) + blockDWords[2] + 0x5a827999;
 1323        cc = (cc << 11 | cc >> (32 - 11)) + bb;
 1324        ee = (ee << 10 | ee >> (32 - 10));
 325
 326        // GG(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[14], 7);
 1327        bb += G(cc, dd, ee) + blockDWords[14] + 0x5a827999;
 1328        bb = (bb << 7 | bb >> (32 - 7)) + aa;
 1329        dd = (dd << 10 | dd >> (32 - 10));
 330
 331        // GG(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[11], 13);
 1332        aa += G(bb, cc, dd) + blockDWords[11] + 0x5a827999;
 1333        aa = (aa << 13 | aa >> (32 - 13)) + ee;
 1334        cc = (cc << 10 | cc >> (32 - 10));
 335
 336        // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[8], 12);
 1337        ee += G(aa, bb, cc) + blockDWords[8] + 0x5a827999;
 1338        ee = (ee << 12 | ee >> (32 - 12)) + dd;
 1339        bb = (bb << 10 | bb >> (32 - 10));
 340
 341        // Left Round 3
 342        // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[3], 11);
 1343        dd += H(ee, aa, bb) + blockDWords[3] + 0x6ed9eba1;
 1344        dd = (dd << 11 | dd >> (32 - 11)) + cc;
 1345        aa = (aa << 10 | aa >> (32 - 10));
 346
 347        // HH(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[10], 13);
 1348        cc += H(dd, ee, aa) + blockDWords[10] + 0x6ed9eba1;
 1349        cc = (cc << 13 | cc >> (32 - 13)) + bb;
 1350        ee = (ee << 10 | ee >> (32 - 10));
 351
 352        // HH(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[14], 6);
 1353        bb += H(cc, dd, ee) + blockDWords[14] + 0x6ed9eba1;
 1354        bb = (bb << 6 | bb >> (32 - 6)) + aa;
 1355        dd = (dd << 10 | dd >> (32 - 10));
 356
 357        // HH(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[4], 7);
 1358        aa += H(bb, cc, dd) + blockDWords[4] + 0x6ed9eba1;
 1359        aa = (aa << 7 | aa >> (32 - 7)) + ee;
 1360        cc = (cc << 10 | cc >> (32 - 10));
 361
 362        // HH(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[9], 14);
 1363        ee += H(aa, bb, cc) + blockDWords[9] + 0x6ed9eba1;
 1364        ee = (ee << 14 | ee >> (32 - 14)) + dd;
 1365        bb = (bb << 10 | bb >> (32 - 10));
 366
 367        // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[15], 9);
 1368        dd += H(ee, aa, bb) + blockDWords[15] + 0x6ed9eba1;
 1369        dd = (dd << 9 | dd >> (32 - 9)) + cc;
 1370        aa = (aa << 10 | aa >> (32 - 10));
 371
 372        // HH(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[8], 13);
 1373        cc += H(dd, ee, aa) + blockDWords[8] + 0x6ed9eba1;
 1374        cc = (cc << 13 | cc >> (32 - 13)) + bb;
 1375        ee = (ee << 10 | ee >> (32 - 10));
 376
 377        // HH(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[1], 15);
 1378        bb += H(cc, dd, ee) + blockDWords[1] + 0x6ed9eba1;
 1379        bb = (bb << 15 | bb >> (32 - 15)) + aa;
 1380        dd = (dd << 10 | dd >> (32 - 10));
 381
 382        // HH(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[2], 14);
 1383        aa += H(bb, cc, dd) + blockDWords[2] + 0x6ed9eba1;
 1384        aa = (aa << 14 | aa >> (32 - 14)) + ee;
 1385        cc = (cc << 10 | cc >> (32 - 10));
 386
 387        // HH(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[7], 8);
 1388        ee += H(aa, bb, cc) + blockDWords[7] + 0x6ed9eba1;
 1389        ee = (ee << 8 | ee >> (32 - 8)) + dd;
 1390        bb = (bb << 10 | bb >> (32 - 10));
 391
 392        // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[0], 13);
 1393        dd += H(ee, aa, bb) + blockDWords[0] + 0x6ed9eba1;
 1394        dd = (dd << 13 | dd >> (32 - 13)) + cc;
 1395        aa = (aa << 10 | aa >> (32 - 10));
 396
 397        // HH(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[6], 6);
 1398        cc += H(dd, ee, aa) + blockDWords[6] + 0x6ed9eba1;
 1399        cc = (cc << 6 | cc >> (32 - 6)) + bb;
 1400        ee = (ee << 10 | ee >> (32 - 10));
 401
 402        // HH(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[13], 5);
 1403        bb += H(cc, dd, ee) + blockDWords[13] + 0x6ed9eba1;
 1404        bb = (bb << 5 | bb >> (32 - 5)) + aa;
 1405        dd = (dd << 10 | dd >> (32 - 10));
 406
 407        // HH(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[11], 12);
 1408        aa += H(bb, cc, dd) + blockDWords[11] + 0x6ed9eba1;
 1409        aa = (aa << 12 | aa >> (32 - 12)) + ee;
 1410        cc = (cc << 10 | cc >> (32 - 10));
 411
 412        // HH(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[5], 7);
 1413        ee += H(aa, bb, cc) + blockDWords[5] + 0x6ed9eba1;
 1414        ee = (ee << 7 | ee >> (32 - 7)) + dd;
 1415        bb = (bb << 10 | bb >> (32 - 10));
 416
 417        // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[12], 5);
 1418        dd += H(ee, aa, bb) + blockDWords[12] + 0x6ed9eba1;
 1419        dd = (dd << 5 | dd >> (32 - 5)) + cc;
 1420        aa = (aa << 10 | aa >> (32 - 10));
 421
 422        // Left Round 4
 423        // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[1], 11);
 1424        cc += I(dd, ee, aa) + blockDWords[1] + 0x8f1bbcdc;
 1425        cc = (cc << 11 | cc >> (32 - 11)) + bb;
 1426        ee = (ee << 10 | ee >> (32 - 10));
 427
 428        // II(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[9], 12);
 1429        bb += I(cc, dd, ee) + blockDWords[9] + 0x8f1bbcdc;
 1430        bb = (bb << 12 | bb >> (32 - 12)) + aa;
 1431        dd = (dd << 10 | dd >> (32 - 10));
 432
 433        // II(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[11], 14);
 1434        aa += I(bb, cc, dd) + blockDWords[11] + 0x8f1bbcdc;
 1435        aa = (aa << 14 | aa >> (32 - 14)) + ee;
 1436        cc = (cc << 10 | cc >> (32 - 10));
 437
 438        // II(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[10], 15);
 1439        ee += I(aa, bb, cc) + blockDWords[10] + 0x8f1bbcdc;
 1440        ee = (ee << 15 | ee >> (32 - 15)) + dd;
 1441        bb = (bb << 10 | bb >> (32 - 10));
 442
 443        // II(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[0], 14);
 1444        dd += I(ee, aa, bb) + blockDWords[0] + 0x8f1bbcdc;
 1445        dd = (dd << 14 | dd >> (32 - 14)) + cc;
 1446        aa = (aa << 10 | aa >> (32 - 10));
 447
 448        // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[8], 15);
 1449        cc += I(dd, ee, aa) + blockDWords[8] + 0x8f1bbcdc;
 1450        cc = (cc << 15 | cc >> (32 - 15)) + bb;
 1451        ee = (ee << 10 | ee >> (32 - 10));
 452
 453        // II(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[12], 9);
 1454        bb += I(cc, dd, ee) + blockDWords[12] + 0x8f1bbcdc;
 1455        bb = (bb << 9 | bb >> (32 - 9)) + aa;
 1456        dd = (dd << 10 | dd >> (32 - 10));
 457
 458        // II(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[4], 8);
 1459        aa += I(bb, cc, dd) + blockDWords[4] + 0x8f1bbcdc;
 1460        aa = (aa << 8 | aa >> (32 - 8)) + ee;
 1461        cc = (cc << 10 | cc >> (32 - 10));
 462
 463        // II(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[13], 9);
 1464        ee += I(aa, bb, cc) + blockDWords[13] + 0x8f1bbcdc;
 1465        ee = (ee << 9 | ee >> (32 - 9)) + dd;
 1466        bb = (bb << 10 | bb >> (32 - 10));
 467
 468        // II(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[3], 14);
 1469        dd += I(ee, aa, bb) + blockDWords[3] + 0x8f1bbcdc;
 1470        dd = (dd << 14 | dd >> (32 - 14)) + cc;
 1471        aa = (aa << 10 | aa >> (32 - 10));
 472
 473        // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[7], 5);
 1474        cc += I(dd, ee, aa) + blockDWords[7] + 0x8f1bbcdc;
 1475        cc = (cc << 5 | cc >> (32 - 5)) + bb;
 1476        ee = (ee << 10 | ee >> (32 - 10));
 477
 478        // II(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[15], 6);
 1479        bb += I(cc, dd, ee) + blockDWords[15] + 0x8f1bbcdc;
 1480        bb = (bb << 6 | bb >> (32 - 6)) + aa;
 1481        dd = (dd << 10 | dd >> (32 - 10));
 482
 483        // II(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[14], 8);
 1484        aa += I(bb, cc, dd) + blockDWords[14] + 0x8f1bbcdc;
 1485        aa = (aa << 8 | aa >> (32 - 8)) + ee;
 1486        cc = (cc << 10 | cc >> (32 - 10));
 487
 488        // II(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[5], 6);
 1489        ee += I(aa, bb, cc) + blockDWords[5] + 0x8f1bbcdc;
 1490        ee = (ee << 6 | ee >> (32 - 6)) + dd;
 1491        bb = (bb << 10 | bb >> (32 - 10));
 492
 493        // II(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[6], 5);
 1494        dd += I(ee, aa, bb) + blockDWords[6] + 0x8f1bbcdc;
 1495        dd = (dd << 5 | dd >> (32 - 5)) + cc;
 1496        aa = (aa << 10 | aa >> (32 - 10));
 497
 498        // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[2], 12);
 1499        cc += I(dd, ee, aa) + blockDWords[2] + 0x8f1bbcdc;
 1500        cc = (cc << 12 | cc >> (32 - 12)) + bb;
 1501        ee = (ee << 10 | ee >> (32 - 10));
 502
 503        // Left Round 5
 504        // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[4], 9);
 1505        bb += J(cc, dd, ee) + blockDWords[4] + 0xa953fd4e;
 1506        bb = (bb << 9 | bb >> (32 - 9)) + aa;
 1507        dd = (dd << 10 | dd >> (32 - 10));
 508
 509        // JJ(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[0], 15);
 1510        aa += J(bb, cc, dd) + blockDWords[0] + 0xa953fd4e;
 1511        aa = (aa << 15 | aa >> (32 - 15)) + ee;
 1512        cc = (cc << 10 | cc >> (32 - 10));
 513
 514        // JJ(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[5], 5);
 1515        ee += J(aa, bb, cc) + blockDWords[5] + 0xa953fd4e;
 1516        ee = (ee << 5 | ee >> (32 - 5)) + dd;
 1517        bb = (bb << 10 | bb >> (32 - 10));
 518
 519        // JJ(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[9], 11);
 1520        dd += J(ee, aa, bb) + blockDWords[9] + 0xa953fd4e;
 1521        dd = (dd << 11 | dd >> (32 - 11)) + cc;
 1522        aa = (aa << 10 | aa >> (32 - 10));
 523
 524        // JJ(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[7], 6);
 1525        cc += J(dd, ee, aa) + blockDWords[7] + 0xa953fd4e;
 1526        cc = (cc << 6 | cc >> (32 - 6)) + bb;
 1527        ee = (ee << 10 | ee >> (32 - 10));
 528
 529        // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[12], 8);
 1530        bb += J(cc, dd, ee) + blockDWords[12] + 0xa953fd4e;
 1531        bb = (bb << 8 | bb >> (32 - 8)) + aa;
 1532        dd = (dd << 10 | dd >> (32 - 10));
 533
 534        // JJ(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[2], 13);
 1535        aa += J(bb, cc, dd) + blockDWords[2] + 0xa953fd4e;
 1536        aa = (aa << 13 | aa >> (32 - 13)) + ee;
 1537        cc = (cc << 10 | cc >> (32 - 10));
 538
 539        // JJ(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[10], 12);
 1540        ee += J(aa, bb, cc) + blockDWords[10] + 0xa953fd4e;
 1541        ee = (ee << 12 | ee >> (32 - 12)) + dd;
 1542        bb = (bb << 10 | bb >> (32 - 10));
 543
 544        // JJ(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[14], 5);
 1545        dd += J(ee, aa, bb) + blockDWords[14] + 0xa953fd4e;
 1546        dd = (dd << 5 | dd >> (32 - 5)) + cc;
 1547        aa = (aa << 10 | aa >> (32 - 10));
 548
 549        // JJ(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[1], 12);
 1550        cc += J(dd, ee, aa) + blockDWords[1] + 0xa953fd4e;
 1551        cc = (cc << 12 | cc >> (32 - 12)) + bb;
 1552        ee = (ee << 10 | ee >> (32 - 10));
 553
 554        // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[3], 13);
 1555        bb += J(cc, dd, ee) + blockDWords[3] + 0xa953fd4e;
 1556        bb = (bb << 13 | bb >> (32 - 13)) + aa;
 1557        dd = (dd << 10 | dd >> (32 - 10));
 558
 559        // JJ(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[8], 14);
 1560        aa += J(bb, cc, dd) + blockDWords[8] + 0xa953fd4e;
 1561        aa = (aa << 14 | aa >> (32 - 14)) + ee;
 1562        cc = (cc << 10 | cc >> (32 - 10));
 563
 564        // JJ(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[11], 11);
 1565        ee += J(aa, bb, cc) + blockDWords[11] + 0xa953fd4e;
 1566        ee = (ee << 11 | ee >> (32 - 11)) + dd;
 1567        bb = (bb << 10 | bb >> (32 - 10));
 568
 569        // JJ(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[6], 8);
 1570        dd += J(ee, aa, bb) + blockDWords[6] + 0xa953fd4e;
 1571        dd = (dd << 8 | dd >> (32 - 8)) + cc;
 1572        aa = (aa << 10 | aa >> (32 - 10));
 573
 574        // JJ(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[15], 5);
 1575        cc += J(dd, ee, aa) + blockDWords[15] + 0xa953fd4e;
 1576        cc = (cc << 5 | cc >> (32 - 5)) + bb;
 1577        ee = (ee << 10 | ee >> (32 - 10));
 578
 579        // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[13], 6);
 1580        bb += J(cc, dd, ee) + blockDWords[13] + 0xa953fd4e;
 1581        bb = (bb << 6 | bb >> (32 - 6)) + aa;
 1582        dd = (dd << 10 | dd >> (32 - 10));
 583
 584        // Parallel Right Round 1
 585        // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[5], 8);
 1586        aaa += J(bbb, ccc, ddd) + blockDWords[5] + 0x50a28be6;
 1587        aaa = (aaa << 8 | aaa >> (32 - 8)) + eee;
 1588        ccc = (ccc << 10 | ccc >> (32 - 10));
 589
 590        // JJJ(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[14], 9);
 1591        eee += J(aaa, bbb, ccc) + blockDWords[14] + 0x50a28be6;
 1592        eee = (eee << 9 | eee >> (32 - 9)) + ddd;
 1593        bbb = (bbb << 10 | bbb >> (32 - 10));
 594
 595        // JJJ(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[7], 9);
 1596        ddd += J(eee, aaa, bbb) + blockDWords[7] + 0x50a28be6;
 1597        ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc;
 1598        aaa = (aaa << 10 | aaa >> (32 - 10));
 599
 600        // JJJ(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[0], 11);
 1601        ccc += J(ddd, eee, aaa) + blockDWords[0] + 0x50a28be6;
 1602        ccc = (ccc << 11 | ccc >> (32 - 11)) + bbb;
 1603        eee = (eee << 10 | eee >> (32 - 10));
 604
 605        // JJJ(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[9], 13);
 1606        bbb += J(ccc, ddd, eee) + blockDWords[9] + 0x50a28be6;
 1607        bbb = (bbb << 13 | bbb >> (32 - 13)) + aaa;
 1608        ddd = (ddd << 10 | ddd >> (32 - 10));
 609
 610        // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[2], 15);
 1611        aaa += J(bbb, ccc, ddd) + blockDWords[2] + 0x50a28be6;
 1612        aaa = (aaa << 15 | aaa >> (32 - 15)) + eee;
 1613        ccc = (ccc << 10 | ccc >> (32 - 10));
 614
 615        // JJJ(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[11], 15);
 1616        eee += J(aaa, bbb, ccc) + blockDWords[11] + 0x50a28be6;
 1617        eee = (eee << 15 | eee >> (32 - 15)) + ddd;
 1618        bbb = (bbb << 10 | bbb >> (32 - 10));
 619
 620        // JJJ(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[4], 5);
 1621        ddd += J(eee, aaa, bbb) + blockDWords[4] + 0x50a28be6;
 1622        ddd = (ddd << 5 | ddd >> (32 - 5)) + ccc;
 1623        aaa = (aaa << 10 | aaa >> (32 - 10));
 624
 625        // JJJ(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[13], 7);
 1626        ccc += J(ddd, eee, aaa) + blockDWords[13] + 0x50a28be6;
 1627        ccc = (ccc << 7 | ccc >> (32 - 7)) + bbb;
 1628        eee = (eee << 10 | eee >> (32 - 10));
 629
 630        // JJJ(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[6], 7);
 1631        bbb += J(ccc, ddd, eee) + blockDWords[6] + 0x50a28be6;
 1632        bbb = (bbb << 7 | bbb >> (32 - 7)) + aaa;
 1633        ddd = (ddd << 10 | ddd >> (32 - 10));
 634
 635        // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[15], 8);
 1636        aaa += J(bbb, ccc, ddd) + blockDWords[15] + 0x50a28be6;
 1637        aaa = (aaa << 8 | aaa >> (32 - 8)) + eee;
 1638        ccc = (ccc << 10 | ccc >> (32 - 10));
 639
 640        // JJJ(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[8], 11);
 1641        eee += J(aaa, bbb, ccc) + blockDWords[8] + 0x50a28be6;
 1642        eee = (eee << 11 | eee >> (32 - 11)) + ddd;
 1643        bbb = (bbb << 10 | bbb >> (32 - 10));
 644
 645        // JJJ(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[1], 14);
 1646        ddd += J(eee, aaa, bbb) + blockDWords[1] + 0x50a28be6;
 1647        ddd = (ddd << 14 | ddd >> (32 - 14)) + ccc;
 1648        aaa = (aaa << 10 | aaa >> (32 - 10));
 649
 650        // JJJ(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[10], 14);
 1651        ccc += J(ddd, eee, aaa) + blockDWords[10] + 0x50a28be6;
 1652        ccc = (ccc << 14 | ccc >> (32 - 14)) + bbb;
 1653        eee = (eee << 10 | eee >> (32 - 10));
 654
 655        // JJJ(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[3], 12);
 1656        bbb += J(ccc, ddd, eee) + blockDWords[3] + 0x50a28be6;
 1657        bbb = (bbb << 12 | bbb >> (32 - 12)) + aaa;
 1658        ddd = (ddd << 10 | ddd >> (32 - 10));
 659
 660        // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[12], 6);
 1661        aaa += J(bbb, ccc, ddd) + blockDWords[12] + 0x50a28be6;
 1662        aaa = (aaa << 6 | aaa >> (32 - 6)) + eee;
 1663        ccc = (ccc << 10 | ccc >> (32 - 10));
 664
 665        // Parallel Right Round 2
 666        // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[6], 9);
 1667        eee += I(aaa, bbb, ccc) + blockDWords[6] + 0x5c4dd124;
 1668        eee = (eee << 9 | eee >> (32 - 9)) + ddd;
 1669        bbb = (bbb << 10 | bbb >> (32 - 10));
 670
 671        // III(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[11], 13);
 1672        ddd += I(eee, aaa, bbb) + blockDWords[11] + 0x5c4dd124;
 1673        ddd = (ddd << 13 | ddd >> (32 - 13)) + ccc;
 1674        aaa = (aaa << 10 | aaa >> (32 - 10));
 675
 676        // III(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[3], 15);
 1677        ccc += I(ddd, eee, aaa) + blockDWords[3] + 0x5c4dd124;
 1678        ccc = (ccc << 15 | ccc >> (32 - 15)) + bbb;
 1679        eee = (eee << 10 | eee >> (32 - 10));
 680
 681        // III(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[7], 7);
 1682        bbb += I(ccc, ddd, eee) + blockDWords[7] + 0x5c4dd124;
 1683        bbb = (bbb << 7 | bbb >> (32 - 7)) + aaa;
 1684        ddd = (ddd << 10 | ddd >> (32 - 10));
 685
 686        // III(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[0], 12);
 1687        aaa += I(bbb, ccc, ddd) + blockDWords[0] + 0x5c4dd124;
 1688        aaa = (aaa << 12 | aaa >> (32 - 12)) + eee;
 1689        ccc = (ccc << 10 | ccc >> (32 - 10));
 690
 691        // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[13], 8);
 1692        eee += I(aaa, bbb, ccc) + blockDWords[13] + 0x5c4dd124;
 1693        eee = (eee << 8 | eee >> (32 - 8)) + ddd;
 1694        bbb = (bbb << 10 | bbb >> (32 - 10));
 695
 696        // III(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[5], 9);
 1697        ddd += I(eee, aaa, bbb) + blockDWords[5] + 0x5c4dd124;
 1698        ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc;
 1699        aaa = (aaa << 10 | aaa >> (32 - 10));
 700
 701        // III(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[10], 11);
 1702        ccc += I(ddd, eee, aaa) + blockDWords[10] + 0x5c4dd124;
 1703        ccc = (ccc << 11 | ccc >> (32 - 11)) + bbb;
 1704        eee = (eee << 10 | eee >> (32 - 10));
 705
 706        // III(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[14], 7);
 1707        bbb += I(ccc, ddd, eee) + blockDWords[14] + 0x5c4dd124;
 1708        bbb = (bbb << 7 | bbb >> (32 - 7)) + aaa;
 1709        ddd = (ddd << 10 | ddd >> (32 - 10));
 710
 711        // III(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[15], 7);
 1712        aaa += I(bbb, ccc, ddd) + blockDWords[15] + 0x5c4dd124;
 1713        aaa = (aaa << 7 | aaa >> (32 - 7)) + eee;
 1714        ccc = (ccc << 10 | ccc >> (32 - 10));
 715
 716        // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[8], 12);
 1717        eee += I(aaa, bbb, ccc) + blockDWords[8] + 0x5c4dd124;
 1718        eee = (eee << 12 | eee >> (32 - 12)) + ddd;
 1719        bbb = (bbb << 10 | bbb >> (32 - 10));
 720
 721        // III(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[12], 7);
 1722        ddd += I(eee, aaa, bbb) + blockDWords[12] + 0x5c4dd124;
 1723        ddd = (ddd << 7 | ddd >> (32 - 7)) + ccc;
 1724        aaa = (aaa << 10 | aaa >> (32 - 10));
 725
 726        // III(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[4], 6);
 1727        ccc += I(ddd, eee, aaa) + blockDWords[4] + 0x5c4dd124;
 1728        ccc = (ccc << 6 | ccc >> (32 - 6)) + bbb;
 1729        eee = (eee << 10 | eee >> (32 - 10));
 730
 731        // III(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[9], 15);
 1732        bbb += I(ccc, ddd, eee) + blockDWords[9] + 0x5c4dd124;
 1733        bbb = (bbb << 15 | bbb >> (32 - 15)) + aaa;
 1734        ddd = (ddd << 10 | ddd >> (32 - 10));
 735
 736        // III(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[1], 13);
 1737        aaa += I(bbb, ccc, ddd) + blockDWords[1] + 0x5c4dd124;
 1738        aaa = (aaa << 13 | aaa >> (32 - 13)) + eee;
 1739        ccc = (ccc << 10 | ccc >> (32 - 10));
 740
 741        // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[2], 11);
 1742        eee += I(aaa, bbb, ccc) + blockDWords[2] + 0x5c4dd124;
 1743        eee = (eee << 11 | eee >> (32 - 11)) + ddd;
 1744        bbb = (bbb << 10 | bbb >> (32 - 10));
 745
 746        // Parallel Right Round 3
 747        // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[15], 9);
 1748        ddd += H(eee, aaa, bbb) + blockDWords[15] + 0x6d703ef3;
 1749        ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc;
 1750        aaa = (aaa << 10 | aaa >> (32 - 10));
 751
 752        // HHH(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[5], 7);
 1753        ccc += H(ddd, eee, aaa) + blockDWords[5] + 0x6d703ef3;
 1754        ccc = (ccc << 7 | ccc >> (32 - 7)) + bbb;
 1755        eee = (eee << 10 | eee >> (32 - 10));
 756
 757        // HHH(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[1], 15);
 1758        bbb += H(ccc, ddd, eee) + blockDWords[1] + 0x6d703ef3;
 1759        bbb = (bbb << 15 | bbb >> (32 - 15)) + aaa;
 1760        ddd = (ddd << 10 | ddd >> (32 - 10));
 761
 762        // HHH(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[3], 11);
 1763        aaa += H(bbb, ccc, ddd) + blockDWords[3] + 0x6d703ef3;
 1764        aaa = (aaa << 11 | aaa >> (32 - 11)) + eee;
 1765        ccc = (ccc << 10 | ccc >> (32 - 10));
 766
 767        // HHH(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[7], 8);
 1768        eee += H(aaa, bbb, ccc) + blockDWords[7] + 0x6d703ef3;
 1769        eee = (eee << 8 | eee >> (32 - 8)) + ddd;
 1770        bbb = (bbb << 10 | bbb >> (32 - 10));
 771
 772        // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[14], 6);
 1773        ddd += H(eee, aaa, bbb) + blockDWords[14] + 0x6d703ef3;
 1774        ddd = (ddd << 6 | ddd >> (32 - 6)) + ccc;
 1775        aaa = (aaa << 10 | aaa >> (32 - 10));
 776
 777        // HHH(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[6], 6);
 1778        ccc += H(ddd, eee, aaa) + blockDWords[6] + 0x6d703ef3;
 1779        ccc = (ccc << 6 | ccc >> (32 - 6)) + bbb;
 1780        eee = (eee << 10 | eee >> (32 - 10));
 781
 782        // HHH(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[9], 14);
 1783        bbb += H(ccc, ddd, eee) + blockDWords[9] + 0x6d703ef3;
 1784        bbb = (bbb << 14 | bbb >> (32 - 14)) + aaa;
 1785        ddd = (ddd << 10 | ddd >> (32 - 10));
 786
 787        // HHH(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[11], 12);
 1788        aaa += H(bbb, ccc, ddd) + blockDWords[11] + 0x6d703ef3;
 1789        aaa = (aaa << 12 | aaa >> (32 - 12)) + eee;
 1790        ccc = (ccc << 10 | ccc >> (32 - 10));
 791
 792        // HHH(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[8], 13);
 1793        eee += H(aaa, bbb, ccc) + blockDWords[8] + 0x6d703ef3;
 1794        eee = (eee << 13 | eee >> (32 - 13)) + ddd;
 1795        bbb = (bbb << 10 | bbb >> (32 - 10));
 796
 797        // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[12], 5);
 1798        ddd += H(eee, aaa, bbb) + blockDWords[12] + 0x6d703ef3;
 1799        ddd = (ddd << 5 | ddd >> (32 - 5)) + ccc;
 1800        aaa = (aaa << 10 | aaa >> (32 - 10));
 801
 802        // HHH(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[2], 14);
 1803        ccc += H(ddd, eee, aaa) + blockDWords[2] + 0x6d703ef3;
 1804        ccc = (ccc << 14 | ccc >> (32 - 14)) + bbb;
 1805        eee = (eee << 10 | eee >> (32 - 10));
 806
 807        // HHH(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[10], 13);
 1808        bbb += H(ccc, ddd, eee) + blockDWords[10] + 0x6d703ef3;
 1809        bbb = (bbb << 13 | bbb >> (32 - 13)) + aaa;
 1810        ddd = (ddd << 10 | ddd >> (32 - 10));
 811
 812        // HHH(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[0], 13);
 1813        aaa += H(bbb, ccc, ddd) + blockDWords[0] + 0x6d703ef3;
 1814        aaa = (aaa << 13 | aaa >> (32 - 13)) + eee;
 1815        ccc = (ccc << 10 | ccc >> (32 - 10));
 816
 817        // HHH(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[4], 7);
 1818        eee += H(aaa, bbb, ccc) + blockDWords[4] + 0x6d703ef3;
 1819        eee = (eee << 7 | eee >> (32 - 7)) + ddd;
 1820        bbb = (bbb << 10 | bbb >> (32 - 10));
 821
 822        // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[13], 5);
 1823        ddd += H(eee, aaa, bbb) + blockDWords[13] + 0x6d703ef3;
 1824        ddd = (ddd << 5 | ddd >> (32 - 5)) + ccc;
 1825        aaa = (aaa << 10 | aaa >> (32 - 10));
 826
 827        // Parallel Right Round 4
 828        // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[8], 15);
 1829        ccc += G(ddd, eee, aaa) + blockDWords[8] + 0x7a6d76e9;
 1830        ccc = (ccc << 15 | ccc >> (32 - 15)) + bbb;
 1831        eee = (eee << 10 | eee >> (32 - 10));
 832
 833        // GGG(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[6], 5);
 1834        bbb += G(ccc, ddd, eee) + blockDWords[6] + 0x7a6d76e9;
 1835        bbb = (bbb << 5 | bbb >> (32 - 5)) + aaa;
 1836        ddd = (ddd << 10 | ddd >> (32 - 10));
 837
 838        // GGG(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[4], 8);
 1839        aaa += G(bbb, ccc, ddd) + blockDWords[4] + 0x7a6d76e9;
 1840        aaa = (aaa << 8 | aaa >> (32 - 8)) + eee;
 1841        ccc = (ccc << 10 | ccc >> (32 - 10));
 842
 843        // GGG(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[1], 11);
 1844        eee += G(aaa, bbb, ccc) + blockDWords[1] + 0x7a6d76e9;
 1845        eee = (eee << 11 | eee >> (32 - 11)) + ddd;
 1846        bbb = (bbb << 10 | bbb >> (32 - 10));
 847
 848        // GGG(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[3], 14);
 1849        ddd += G(eee, aaa, bbb) + blockDWords[3] + 0x7a6d76e9;
 1850        ddd = (ddd << 14 | ddd >> (32 - 14)) + ccc;
 1851        aaa = (aaa << 10 | aaa >> (32 - 10));
 852
 853        // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[11], 14);
 1854        ccc += G(ddd, eee, aaa) + blockDWords[11] + 0x7a6d76e9;
 1855        ccc = (ccc << 14 | ccc >> (32 - 14)) + bbb;
 1856        eee = (eee << 10 | eee >> (32 - 10));
 857
 858        // GGG(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[15], 6);
 1859        bbb += G(ccc, ddd, eee) + blockDWords[15] + 0x7a6d76e9;
 1860        bbb = (bbb << 6 | bbb >> (32 - 6)) + aaa;
 1861        ddd = (ddd << 10 | ddd >> (32 - 10));
 862
 863        // GGG(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[0], 14);
 1864        aaa += G(bbb, ccc, ddd) + blockDWords[0] + 0x7a6d76e9;
 1865        aaa = (aaa << 14 | aaa >> (32 - 14)) + eee;
 1866        ccc = (ccc << 10 | ccc >> (32 - 10));
 867
 868        // GGG(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[5], 6);
 1869        eee += G(aaa, bbb, ccc) + blockDWords[5] + 0x7a6d76e9;
 1870        eee = (eee << 6 | eee >> (32 - 6)) + ddd;
 1871        bbb = (bbb << 10 | bbb >> (32 - 10));
 872
 873        // GGG(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[12], 9);
 1874        ddd += G(eee, aaa, bbb) + blockDWords[12] + 0x7a6d76e9;
 1875        ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc;
 1876        aaa = (aaa << 10 | aaa >> (32 - 10));
 877
 878        // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[2], 12);
 1879        ccc += G(ddd, eee, aaa) + blockDWords[2] + 0x7a6d76e9;
 1880        ccc = (ccc << 12 | ccc >> (32 - 12)) + bbb;
 1881        eee = (eee << 10 | eee >> (32 - 10));
 882
 883        // GGG(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[13], 9);
 1884        bbb += G(ccc, ddd, eee) + blockDWords[13] + 0x7a6d76e9;
 1885        bbb = (bbb << 9 | bbb >> (32 - 9)) + aaa;
 1886        ddd = (ddd << 10 | ddd >> (32 - 10));
 887
 888        // GGG(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[9], 12);
 1889        aaa += G(bbb, ccc, ddd) + blockDWords[9] + 0x7a6d76e9;
 1890        aaa = (aaa << 12 | aaa >> (32 - 12)) + eee;
 1891        ccc = (ccc << 10 | ccc >> (32 - 10));
 892
 893        // GGG(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[7], 5);
 1894        eee += G(aaa, bbb, ccc) + blockDWords[7] + 0x7a6d76e9;
 1895        eee = (eee << 5 | eee >> (32 - 5)) + ddd;
 1896        bbb = (bbb << 10 | bbb >> (32 - 10));
 897
 898        // GGG(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[10], 15);
 1899        ddd += G(eee, aaa, bbb) + blockDWords[10] + 0x7a6d76e9;
 1900        ddd = (ddd << 15 | ddd >> (32 - 15)) + ccc;
 1901        aaa = (aaa << 10 | aaa >> (32 - 10));
 902
 903        // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[14], 8);
 1904        ccc += G(ddd, eee, aaa) + blockDWords[14] + 0x7a6d76e9;
 1905        ccc = (ccc << 8 | ccc >> (32 - 8)) + bbb;
 1906        eee = (eee << 10 | eee >> (32 - 10));
 907
 908        // Parallel Right Round 5
 909        // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[12], 8);
 1910        bbb += F(ccc, ddd, eee) + blockDWords[12];
 1911        bbb = (bbb << 8 | bbb >> (32 - 8)) + aaa;
 1912        ddd = (ddd << 10 | ddd >> (32 - 10));
 913
 914        // FFF(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[15], 5);
 1915        aaa += F(bbb, ccc, ddd) + blockDWords[15];
 1916        aaa = (aaa << 5 | aaa >> (32 - 5)) + eee;
 1917        ccc = (ccc << 10 | ccc >> (32 - 10));
 918
 919        // FFF(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[10], 12);
 1920        eee += F(aaa, bbb, ccc) + blockDWords[10];
 1921        eee = (eee << 12 | eee >> (32 - 12)) + ddd;
 1922        bbb = (bbb << 10 | bbb >> (32 - 10));
 923
 924        // FFF(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[4], 9);
 1925        ddd += F(eee, aaa, bbb) + blockDWords[4];
 1926        ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc;
 1927        aaa = (aaa << 10 | aaa >> (32 - 10));
 928
 929        // FFF(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[1], 12);
 1930        ccc += F(ddd, eee, aaa) + blockDWords[1];
 1931        ccc = (ccc << 12 | ccc >> (32 - 12)) + bbb;
 1932        eee = (eee << 10 | eee >> (32 - 10));
 933
 934        // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[5], 5);
 1935        bbb += F(ccc, ddd, eee) + blockDWords[5];
 1936        bbb = (bbb << 5 | bbb >> (32 - 5)) + aaa;
 1937        ddd = (ddd << 10 | ddd >> (32 - 10));
 938
 939        // FFF(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[8], 14);
 1940        aaa += F(bbb, ccc, ddd) + blockDWords[8];
 1941        aaa = (aaa << 14 | aaa >> (32 - 14)) + eee;
 1942        ccc = (ccc << 10 | ccc >> (32 - 10));
 943
 944        // FFF(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[7], 6);
 1945        eee += F(aaa, bbb, ccc) + blockDWords[7];
 1946        eee = (eee << 6 | eee >> (32 - 6)) + ddd;
 1947        bbb = (bbb << 10 | bbb >> (32 - 10));
 948
 949        // FFF(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[6], 8);
 1950        ddd += F(eee, aaa, bbb) + blockDWords[6];
 1951        ddd = (ddd << 8 | ddd >> (32 - 8)) + ccc;
 1952        aaa = (aaa << 10 | aaa >> (32 - 10));
 953
 954        // FFF(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[2], 13);
 1955        ccc += F(ddd, eee, aaa) + blockDWords[2];
 1956        ccc = (ccc << 13 | ccc >> (32 - 13)) + bbb;
 1957        eee = (eee << 10 | eee >> (32 - 10));
 958
 959        // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[13], 6);
 1960        bbb += F(ccc, ddd, eee) + blockDWords[13];
 1961        bbb = (bbb << 6 | bbb >> (32 - 6)) + aaa;
 1962        ddd = (ddd << 10 | ddd >> (32 - 10));
 963
 964        // FFF(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[14], 5);
 1965        aaa += F(bbb, ccc, ddd) + blockDWords[14];
 1966        aaa = (aaa << 5 | aaa >> (32 - 5)) + eee;
 1967        ccc = (ccc << 10 | ccc >> (32 - 10));
 968
 969        // FFF(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[0], 15);
 1970        eee += F(aaa, bbb, ccc) + blockDWords[0];
 1971        eee = (eee << 15 | eee >> (32 - 15)) + ddd;
 1972        bbb = (bbb << 10 | bbb >> (32 - 10));
 973
 974        // FFF(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[3], 13);
 1975        ddd += F(eee, aaa, bbb) + blockDWords[3];
 1976        ddd = (ddd << 13 | ddd >> (32 - 13)) + ccc;
 1977        aaa = (aaa << 10 | aaa >> (32 - 10));
 978
 979        // FFF(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[9], 11);
 1980        ccc += F(ddd, eee, aaa) + blockDWords[9];
 1981        ccc = (ccc << 11 | ccc >> (32 - 11)) + bbb;
 1982        eee = (eee << 10 | eee >> (32 - 10));
 983
 984        // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[11], 11);
 1985        bbb += F(ccc, ddd, eee) + blockDWords[11];
 1986        bbb = (bbb << 11 | bbb >> (32 - 11)) + aaa;
 1987        ddd = (ddd << 10 | ddd >> (32 - 10));
 988
 989        // Update the state of the hash object
 1990        ddd += cc + state[1];
 1991        state[1] = state[2] + dd + eee;
 1992        state[2] = state[3] + ee + aaa;
 1993        state[3] = state[4] + aa + bbb;
 1994        state[4] = state[0] + bb + ccc;
 1995        state[0] = ddd;
 1996    }
 997
 998    // The five basic functions
 1999    private static uint F (uint x, uint y, uint z) {
 11000        return (x ^ y ^ z);
 11001    }
 1002
 11003    private static uint G (uint x, uint y, uint z) {
 11004        return ((x & y) | (~x & z));
 11005    }
 1006
 11007    private static uint H (uint x, uint y, uint z) {
 11008        return ((x | ~y) ^ z);
 11009    }
 1010
 11011    private static uint I (uint x, uint y, uint z) {
 11012        return ((x & z) | (y & ~z));
 11013    }
 1014
 11015    private static uint J (uint x, uint y, uint z) {
 11016        return (x ^ (y | ~z));
 11017    }
 1018}
 1019
 1020// Utils.cs
 1021internal static partial class Utils {
 1022    // https://github.com/microsoft/referencesource/blob/51cf7850defa8a17d815b4700b67116e3fa283c2/mscorlib/system/securi
 1023
 1024    // digits == number of DWORDs
 1025    internal static void DWORDFromLittleEndian (uint[] x, int digits, byte[] block) {
 1026        int i;
 1027        int j;
 1028
 1029        for (i = 0, j = 0; i < digits; i++, j += 4)
 1030            x[i] =  (uint) (block[j] | (block[j+1] << 8) | (block[j+2] << 16) | (block[j+3] << 24));
 1031    }
 1032
 1033    // encodes x (DWORD) into block (unsigned char), least significant byte first.
 1034    // digits == number of DWORDs
 1035    internal static void DWORDToLittleEndian (byte[] block, uint[] x, int digits) {
 1036        int i;
 1037        int j;
 1038
 1039        for (i = 0, j = 0; i < digits; i++, j += 4) {
 1040            block[j]   = (byte)(x[i] & 0xff);
 1041            block[j+1] = (byte)((x[i] >> 8) & 0xff);
 1042            block[j+2] = (byte)((x[i] >> 16) & 0xff);
 1043            block[j+3] = (byte)((x[i] >> 24) & 0xff);
 1044        }
 1045    }
 1046}