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