Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Security / Cryptography / RIPEMD160Managed.cs / 1305376 / RIPEMD160Managed.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== //[....] // // // RIPEMD160Managed.cs // // RIPEMD-160 algorithm by Antoon Bosselaers, described at // http://www.esat.kuleuven.ac.be/~cosicart/ps/AB-9601/. // namespace System.Security.Cryptography { using System; using System.Diagnostics.Contracts; [System.Runtime.InteropServices.ComVisible(true)] public class RIPEMD160Managed : RIPEMD160 { private byte[] _buffer; private long _count; // Number of bytes in the hashed message private uint[] _stateMD160; private uint[] _blockDWords; // // public constructors // public RIPEMD160Managed() { if (CryptoConfig.AllowOnlyFipsAlgorithms) throw new InvalidOperationException(Environment.GetResourceString("Cryptography_NonCompliantFIPSAlgorithm")); Contract.EndContractBlock(); _stateMD160 = new uint[5]; _blockDWords = new uint[16]; _buffer = new byte[64]; InitializeState(); } // // public methods // public override void Initialize() { InitializeState(); // Zeroize potentially sensitive information. Array.Clear(_blockDWords, 0, _blockDWords.Length); Array.Clear(_buffer, 0, _buffer.Length); } [System.Security.SecuritySafeCritical] // auto-generated protected override void HashCore(byte[] rgb, int ibStart, int cbSize) { _HashData(rgb, ibStart, cbSize); } [System.Security.SecuritySafeCritical] // auto-generated protected override byte[] HashFinal() { return _EndHash(); } // // private methods // private void InitializeState() { _count = 0; // Use the same chaining values (IVs) as in SHA1, // The convention is little endian however (same as MD4) _stateMD160[0] = 0x67452301; _stateMD160[1] = 0xefcdab89; _stateMD160[2] = 0x98badcfe; _stateMD160[3] = 0x10325476; _stateMD160[4] = 0xc3d2e1f0; } [System.Security.SecurityCritical] // auto-generated private unsafe void _HashData(byte[] partIn, int ibStart, int cbSize) { int bufferLen; int partInLen = cbSize; int partInBase = ibStart; /* Compute length of buffer */ bufferLen = (int) (_count & 0x3f); /* Update number of bytes */ _count += partInLen; fixed (uint* stateMD160 = _stateMD160) { fixed (byte* buffer = _buffer) { fixed (uint* blockDWords = _blockDWords) { if ((bufferLen > 0) && (bufferLen + partInLen >= 64)) { Buffer.InternalBlockCopy(partIn, partInBase, _buffer, bufferLen, 64 - bufferLen); partInBase += (64 - bufferLen); partInLen -= (64 - bufferLen); MDTransform(blockDWords, stateMD160, buffer); bufferLen = 0; } /* Copy input to temporary buffer and hash */ while (partInLen >= 64) { Buffer.InternalBlockCopy(partIn, partInBase, _buffer, 0, 64); partInBase += 64; partInLen -= 64; MDTransform(blockDWords, stateMD160, buffer); } if (partInLen > 0) { Buffer.InternalBlockCopy(partIn, partInBase, _buffer, bufferLen, partInLen); } } } } } [System.Security.SecurityCritical] // auto-generated private byte[] _EndHash() { byte[] pad; int padLen; long bitCount; byte[] hash = new byte[20]; /* Compute padding: 80 00 00 ... 00 00*/ padLen = 64 - (int)(_count & 0x3f); if (padLen <= 8) padLen += 64; pad = new byte[padLen]; pad[0] = 0x80; // Convert count to bit count bitCount = _count * 8; // The convention for RIPEMD is little endian (the same as MD4) pad[padLen-1] = (byte) ((bitCount >> 56) & 0xff); pad[padLen-2] = (byte) ((bitCount >> 48) & 0xff); pad[padLen-3] = (byte) ((bitCount >> 40) & 0xff); pad[padLen-4] = (byte) ((bitCount >> 32) & 0xff); pad[padLen-5] = (byte) ((bitCount >> 24) & 0xff); pad[padLen-6] = (byte) ((bitCount >> 16) & 0xff); pad[padLen-7] = (byte) ((bitCount >> 8) & 0xff); pad[padLen-8] = (byte) ((bitCount >> 0) & 0xff); /* Digest padding */ _HashData(pad, 0, pad.Length); /* Store digest */ Utils.DWORDToLittleEndian (hash, _stateMD160, 5); HashValue = hash; return hash; } [System.Security.SecurityCritical] // auto-generated private static unsafe void MDTransform (uint* blockDWords, uint* state, byte* block) { uint aa = state[0]; uint bb = state[1]; uint cc = state[2]; uint dd = state[3]; uint ee = state[4]; uint aaa = aa; uint bbb = bb; uint ccc = cc; uint ddd = dd; uint eee = ee; Utils.DWORDFromLittleEndian (blockDWords, 16, block); /* As we don't have macros in C# and we don't want to pay the cost of a function call (which BTW is quite important here as we would have to pass 5 args by ref in 16 * 10 = 160 function calls) we'll prefer a less compact code to a less performant code */ // Left Round 1 // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[0], 11); aa += blockDWords[0] + F(bb, cc, dd); aa = (aa << 11 | aa >> (32 - 11)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // FF(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[1], 14); ee += blockDWords[1] + F(aa, bb, cc); ee = (ee << 14 | ee >> (32 - 14)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // FF(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[2], 15); dd += blockDWords[2] + F(ee, aa, bb); dd = (dd << 15 | dd >> (32 - 15)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // FF(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[3], 12); cc += blockDWords[3] + F(dd, ee, aa); cc = (cc << 12 | cc >> (32 - 12)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // FF(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[4], 5); bb += blockDWords[4] + F(cc, dd, ee); bb = (bb << 5 | bb >> (32 - 5)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[5], 8); aa += blockDWords[5] + F(bb, cc, dd); aa = (aa << 8 | aa >> (32 - 8)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // FF(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[6], 7); ee += blockDWords[6] + F(aa, bb, cc); ee = (ee << 7 | ee >> (32 - 7)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // FF(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[7], 9); dd += blockDWords[7] + F(ee, aa, bb); dd = (dd << 9 | dd >> (32 - 9)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // FF(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[8], 11); cc += blockDWords[8] + F(dd, ee, aa); cc = (cc << 11 | cc >> (32 - 11)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // FF(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[9], 13); bb += blockDWords[9] + F(cc, dd, ee); bb = (bb << 13 | bb >> (32 - 13)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[10], 14); aa += blockDWords[10] + F(bb, cc, dd); aa = (aa << 14 | aa >> (32 - 14)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // FF(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[11], 15); ee += blockDWords[11] + F(aa, bb, cc); ee = (ee << 15 | ee >> (32 - 15)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // FF(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[12], 6); dd += blockDWords[12] + F(ee, aa, bb); dd = (dd << 6 | dd >> (32 - 6)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // FF(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[13], 7); cc += blockDWords[13] + F(dd, ee, aa); cc = (cc << 7 | cc >> (32 - 7)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // FF(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[14], 9); bb += blockDWords[14] + F(cc, dd, ee); bb = (bb << 9 | bb >> (32 - 9)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[15], 8); aa += blockDWords[15] + F(bb, cc, dd); aa = (aa << 8 | aa >> (32 - 8)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // Left Round 2 // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[7], 7); ee += G(aa, bb, cc) + blockDWords[7] + 0x5a827999; ee = (ee << 7 | ee >> (32 - 7)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // GG(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[4], 6); dd += G(ee, aa, bb) + blockDWords[4] + 0x5a827999; dd = (dd << 6 | dd >> (32 - 6)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // GG(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[13], 8); cc += G(dd, ee, aa) + blockDWords[13] + 0x5a827999; cc = (cc << 8 | cc >> (32 - 8)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // GG(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[1], 13); bb += G(cc, dd, ee) + blockDWords[1] + 0x5a827999; bb = (bb << 13 | bb >> (32 - 13)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // GG(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[10], 11); aa += G(bb, cc, dd) + blockDWords[10] + 0x5a827999; aa = (aa << 11 | aa >> (32 - 11)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[6], 9); ee += G(aa, bb, cc) + blockDWords[6] + 0x5a827999; ee = (ee << 9 | ee >> (32 - 9)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // GG(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[15], 7); dd += G(ee, aa, bb) + blockDWords[15] + 0x5a827999; dd = (dd << 7 | dd >> (32 - 7)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // GG(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[3], 15); cc += G(dd, ee, aa) + blockDWords[3] + 0x5a827999; cc = (cc << 15 | cc >> (32 - 15)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // GG(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[12], 7); bb += G(cc, dd, ee) + blockDWords[12] + 0x5a827999; bb = (bb << 7 | bb >> (32 - 7)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // GG(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[0], 12); aa += G(bb, cc, dd) + blockDWords[0] + 0x5a827999; aa = (aa << 12 | aa >> (32 - 12)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[9], 15); ee += G(aa, bb, cc) + blockDWords[9] + 0x5a827999; ee = (ee << 15 | ee >> (32 - 15)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // GG(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[5], 9); dd += G(ee, aa, bb) + blockDWords[5] + 0x5a827999; dd = (dd << 9 | dd >> (32 - 9)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // GG(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[2], 11); cc += G(dd, ee, aa) + blockDWords[2] + 0x5a827999; cc = (cc << 11 | cc >> (32 - 11)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // GG(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[14], 7); bb += G(cc, dd, ee) + blockDWords[14] + 0x5a827999; bb = (bb << 7 | bb >> (32 - 7)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // GG(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[11], 13); aa += G(bb, cc, dd) + blockDWords[11] + 0x5a827999; aa = (aa << 13 | aa >> (32 - 13)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[8], 12); ee += G(aa, bb, cc) + blockDWords[8] + 0x5a827999; ee = (ee << 12 | ee >> (32 - 12)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // Left Round 3 // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[3], 11); dd += H(ee, aa, bb) + blockDWords[3] + 0x6ed9eba1; dd = (dd << 11 | dd >> (32 - 11)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // HH(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[10], 13); cc += H(dd, ee, aa) + blockDWords[10] + 0x6ed9eba1; cc = (cc << 13 | cc >> (32 - 13)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // HH(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[14], 6); bb += H(cc, dd, ee) + blockDWords[14] + 0x6ed9eba1; bb = (bb << 6 | bb >> (32 - 6)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // HH(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[4], 7); aa += H(bb, cc, dd) + blockDWords[4] + 0x6ed9eba1; aa = (aa << 7 | aa >> (32 - 7)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // HH(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[9], 14); ee += H(aa, bb, cc) + blockDWords[9] + 0x6ed9eba1; ee = (ee << 14 | ee >> (32 - 14)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[15], 9); dd += H(ee, aa, bb) + blockDWords[15] + 0x6ed9eba1; dd = (dd << 9 | dd >> (32 - 9)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // HH(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[8], 13); cc += H(dd, ee, aa) + blockDWords[8] + 0x6ed9eba1; cc = (cc << 13 | cc >> (32 - 13)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // HH(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[1], 15); bb += H(cc, dd, ee) + blockDWords[1] + 0x6ed9eba1; bb = (bb << 15 | bb >> (32 - 15)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // HH(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[2], 14); aa += H(bb, cc, dd) + blockDWords[2] + 0x6ed9eba1; aa = (aa << 14 | aa >> (32 - 14)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // HH(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[7], 8); ee += H(aa, bb, cc) + blockDWords[7] + 0x6ed9eba1; ee = (ee << 8 | ee >> (32 - 8)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[0], 13); dd += H(ee, aa, bb) + blockDWords[0] + 0x6ed9eba1; dd = (dd << 13 | dd >> (32 - 13)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // HH(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[6], 6); cc += H(dd, ee, aa) + blockDWords[6] + 0x6ed9eba1; cc = (cc << 6 | cc >> (32 - 6)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // HH(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[13], 5); bb += H(cc, dd, ee) + blockDWords[13] + 0x6ed9eba1; bb = (bb << 5 | bb >> (32 - 5)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // HH(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[11], 12); aa += H(bb, cc, dd) + blockDWords[11] + 0x6ed9eba1; aa = (aa << 12 | aa >> (32 - 12)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // HH(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[5], 7); ee += H(aa, bb, cc) + blockDWords[5] + 0x6ed9eba1; ee = (ee << 7 | ee >> (32 - 7)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[12], 5); dd += H(ee, aa, bb) + blockDWords[12] + 0x6ed9eba1; dd = (dd << 5 | dd >> (32 - 5)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // Left Round 4 // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[1], 11); cc += I(dd, ee, aa) + blockDWords[1] + 0x8f1bbcdc; cc = (cc << 11 | cc >> (32 - 11)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // II(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[9], 12); bb += I(cc, dd, ee) + blockDWords[9] + 0x8f1bbcdc; bb = (bb << 12 | bb >> (32 - 12)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // II(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[11], 14); aa += I(bb, cc, dd) + blockDWords[11] + 0x8f1bbcdc; aa = (aa << 14 | aa >> (32 - 14)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // II(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[10], 15); ee += I(aa, bb, cc) + blockDWords[10] + 0x8f1bbcdc; ee = (ee << 15 | ee >> (32 - 15)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // II(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[0], 14); dd += I(ee, aa, bb) + blockDWords[0] + 0x8f1bbcdc; dd = (dd << 14 | dd >> (32 - 14)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[8], 15); cc += I(dd, ee, aa) + blockDWords[8] + 0x8f1bbcdc; cc = (cc << 15 | cc >> (32 - 15)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // II(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[12], 9); bb += I(cc, dd, ee) + blockDWords[12] + 0x8f1bbcdc; bb = (bb << 9 | bb >> (32 - 9)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // II(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[4], 8); aa += I(bb, cc, dd) + blockDWords[4] + 0x8f1bbcdc; aa = (aa << 8 | aa >> (32 - 8)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // II(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[13], 9); ee += I(aa, bb, cc) + blockDWords[13] + 0x8f1bbcdc; ee = (ee << 9 | ee >> (32 - 9)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // II(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[3], 14); dd += I(ee, aa, bb) + blockDWords[3] + 0x8f1bbcdc; dd = (dd << 14 | dd >> (32 - 14)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[7], 5); cc += I(dd, ee, aa) + blockDWords[7] + 0x8f1bbcdc; cc = (cc << 5 | cc >> (32 - 5)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // II(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[15], 6); bb += I(cc, dd, ee) + blockDWords[15] + 0x8f1bbcdc; bb = (bb << 6 | bb >> (32 - 6)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // II(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[14], 8); aa += I(bb, cc, dd) + blockDWords[14] + 0x8f1bbcdc; aa = (aa << 8 | aa >> (32 - 8)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // II(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[5], 6); ee += I(aa, bb, cc) + blockDWords[5] + 0x8f1bbcdc; ee = (ee << 6 | ee >> (32 - 6)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // II(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[6], 5); dd += I(ee, aa, bb) + blockDWords[6] + 0x8f1bbcdc; dd = (dd << 5 | dd >> (32 - 5)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[2], 12); cc += I(dd, ee, aa) + blockDWords[2] + 0x8f1bbcdc; cc = (cc << 12 | cc >> (32 - 12)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // Left Round 5 // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[4], 9); bb += J(cc, dd, ee) + blockDWords[4] + 0xa953fd4e; bb = (bb << 9 | bb >> (32 - 9)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // JJ(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[0], 15); aa += J(bb, cc, dd) + blockDWords[0] + 0xa953fd4e; aa = (aa << 15 | aa >> (32 - 15)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // JJ(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[5], 5); ee += J(aa, bb, cc) + blockDWords[5] + 0xa953fd4e; ee = (ee << 5 | ee >> (32 - 5)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // JJ(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[9], 11); dd += J(ee, aa, bb) + blockDWords[9] + 0xa953fd4e; dd = (dd << 11 | dd >> (32 - 11)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // JJ(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[7], 6); cc += J(dd, ee, aa) + blockDWords[7] + 0xa953fd4e; cc = (cc << 6 | cc >> (32 - 6)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[12], 8); bb += J(cc, dd, ee) + blockDWords[12] + 0xa953fd4e; bb = (bb << 8 | bb >> (32 - 8)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // JJ(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[2], 13); aa += J(bb, cc, dd) + blockDWords[2] + 0xa953fd4e; aa = (aa << 13 | aa >> (32 - 13)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // JJ(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[10], 12); ee += J(aa, bb, cc) + blockDWords[10] + 0xa953fd4e; ee = (ee << 12 | ee >> (32 - 12)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // JJ(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[14], 5); dd += J(ee, aa, bb) + blockDWords[14] + 0xa953fd4e; dd = (dd << 5 | dd >> (32 - 5)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // JJ(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[1], 12); cc += J(dd, ee, aa) + blockDWords[1] + 0xa953fd4e; cc = (cc << 12 | cc >> (32 - 12)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[3], 13); bb += J(cc, dd, ee) + blockDWords[3] + 0xa953fd4e; bb = (bb << 13 | bb >> (32 - 13)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // JJ(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[8], 14); aa += J(bb, cc, dd) + blockDWords[8] + 0xa953fd4e; aa = (aa << 14 | aa >> (32 - 14)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // JJ(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[11], 11); ee += J(aa, bb, cc) + blockDWords[11] + 0xa953fd4e; ee = (ee << 11 | ee >> (32 - 11)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // JJ(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[6], 8); dd += J(ee, aa, bb) + blockDWords[6] + 0xa953fd4e; dd = (dd << 8 | dd >> (32 - 8)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // JJ(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[15], 5); cc += J(dd, ee, aa) + blockDWords[15] + 0xa953fd4e; cc = (cc << 5 | cc >> (32 - 5)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[13], 6); bb += J(cc, dd, ee) + blockDWords[13] + 0xa953fd4e; bb = (bb << 6 | bb >> (32 - 6)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // Parallel Right Round 1 // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[5], 8); aaa += J(bbb, ccc, ddd) + blockDWords[5] + 0x50a28be6; aaa = (aaa << 8 | aaa >> (32 - 8)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // JJJ(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[14], 9); eee += J(aaa, bbb, ccc) + blockDWords[14] + 0x50a28be6; eee = (eee << 9 | eee >> (32 - 9)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // JJJ(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[7], 9); ddd += J(eee, aaa, bbb) + blockDWords[7] + 0x50a28be6; ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // JJJ(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[0], 11); ccc += J(ddd, eee, aaa) + blockDWords[0] + 0x50a28be6; ccc = (ccc << 11 | ccc >> (32 - 11)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // JJJ(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[9], 13); bbb += J(ccc, ddd, eee) + blockDWords[9] + 0x50a28be6; bbb = (bbb << 13 | bbb >> (32 - 13)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[2], 15); aaa += J(bbb, ccc, ddd) + blockDWords[2] + 0x50a28be6; aaa = (aaa << 15 | aaa >> (32 - 15)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // JJJ(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[11], 15); eee += J(aaa, bbb, ccc) + blockDWords[11] + 0x50a28be6; eee = (eee << 15 | eee >> (32 - 15)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // JJJ(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[4], 5); ddd += J(eee, aaa, bbb) + blockDWords[4] + 0x50a28be6; ddd = (ddd << 5 | ddd >> (32 - 5)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // JJJ(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[13], 7); ccc += J(ddd, eee, aaa) + blockDWords[13] + 0x50a28be6; ccc = (ccc << 7 | ccc >> (32 - 7)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // JJJ(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[6], 7); bbb += J(ccc, ddd, eee) + blockDWords[6] + 0x50a28be6; bbb = (bbb << 7 | bbb >> (32 - 7)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[15], 8); aaa += J(bbb, ccc, ddd) + blockDWords[15] + 0x50a28be6; aaa = (aaa << 8 | aaa >> (32 - 8)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // JJJ(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[8], 11); eee += J(aaa, bbb, ccc) + blockDWords[8] + 0x50a28be6; eee = (eee << 11 | eee >> (32 - 11)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // JJJ(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[1], 14); ddd += J(eee, aaa, bbb) + blockDWords[1] + 0x50a28be6; ddd = (ddd << 14 | ddd >> (32 - 14)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // JJJ(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[10], 14); ccc += J(ddd, eee, aaa) + blockDWords[10] + 0x50a28be6; ccc = (ccc << 14 | ccc >> (32 - 14)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // JJJ(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[3], 12); bbb += J(ccc, ddd, eee) + blockDWords[3] + 0x50a28be6; bbb = (bbb << 12 | bbb >> (32 - 12)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[12], 6); aaa += J(bbb, ccc, ddd) + blockDWords[12] + 0x50a28be6; aaa = (aaa << 6 | aaa >> (32 - 6)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // Parallel Right Round 2 // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[6], 9); eee += I(aaa, bbb, ccc) + blockDWords[6] + 0x5c4dd124; eee = (eee << 9 | eee >> (32 - 9)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // III(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[11], 13); ddd += I(eee, aaa, bbb) + blockDWords[11] + 0x5c4dd124; ddd = (ddd << 13 | ddd >> (32 - 13)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // III(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[3], 15); ccc += I(ddd, eee, aaa) + blockDWords[3] + 0x5c4dd124; ccc = (ccc << 15 | ccc >> (32 - 15)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // III(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[7], 7); bbb += I(ccc, ddd, eee) + blockDWords[7] + 0x5c4dd124; bbb = (bbb << 7 | bbb >> (32 - 7)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // III(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[0], 12); aaa += I(bbb, ccc, ddd) + blockDWords[0] + 0x5c4dd124; aaa = (aaa << 12 | aaa >> (32 - 12)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[13], 8); eee += I(aaa, bbb, ccc) + blockDWords[13] + 0x5c4dd124; eee = (eee << 8 | eee >> (32 - 8)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // III(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[5], 9); ddd += I(eee, aaa, bbb) + blockDWords[5] + 0x5c4dd124; ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // III(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[10], 11); ccc += I(ddd, eee, aaa) + blockDWords[10] + 0x5c4dd124; ccc = (ccc << 11 | ccc >> (32 - 11)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // III(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[14], 7); bbb += I(ccc, ddd, eee) + blockDWords[14] + 0x5c4dd124; bbb = (bbb << 7 | bbb >> (32 - 7)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // III(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[15], 7); aaa += I(bbb, ccc, ddd) + blockDWords[15] + 0x5c4dd124; aaa = (aaa << 7 | aaa >> (32 - 7)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[8], 12); eee += I(aaa, bbb, ccc) + blockDWords[8] + 0x5c4dd124; eee = (eee << 12 | eee >> (32 - 12)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // III(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[12], 7); ddd += I(eee, aaa, bbb) + blockDWords[12] + 0x5c4dd124; ddd = (ddd << 7 | ddd >> (32 - 7)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // III(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[4], 6); ccc += I(ddd, eee, aaa) + blockDWords[4] + 0x5c4dd124; ccc = (ccc << 6 | ccc >> (32 - 6)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // III(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[9], 15); bbb += I(ccc, ddd, eee) + blockDWords[9] + 0x5c4dd124; bbb = (bbb << 15 | bbb >> (32 - 15)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // III(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[1], 13); aaa += I(bbb, ccc, ddd) + blockDWords[1] + 0x5c4dd124; aaa = (aaa << 13 | aaa >> (32 - 13)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[2], 11); eee += I(aaa, bbb, ccc) + blockDWords[2] + 0x5c4dd124; eee = (eee << 11 | eee >> (32 - 11)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // Parallel Right Round 3 // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[15], 9); ddd += H(eee, aaa, bbb) + blockDWords[15] + 0x6d703ef3; ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // HHH(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[5], 7); ccc += H(ddd, eee, aaa) + blockDWords[5] + 0x6d703ef3; ccc = (ccc << 7 | ccc >> (32 - 7)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // HHH(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[1], 15); bbb += H(ccc, ddd, eee) + blockDWords[1] + 0x6d703ef3; bbb = (bbb << 15 | bbb >> (32 - 15)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // HHH(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[3], 11); aaa += H(bbb, ccc, ddd) + blockDWords[3] + 0x6d703ef3; aaa = (aaa << 11 | aaa >> (32 - 11)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // HHH(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[7], 8); eee += H(aaa, bbb, ccc) + blockDWords[7] + 0x6d703ef3; eee = (eee << 8 | eee >> (32 - 8)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[14], 6); ddd += H(eee, aaa, bbb) + blockDWords[14] + 0x6d703ef3; ddd = (ddd << 6 | ddd >> (32 - 6)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // HHH(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[6], 6); ccc += H(ddd, eee, aaa) + blockDWords[6] + 0x6d703ef3; ccc = (ccc << 6 | ccc >> (32 - 6)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // HHH(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[9], 14); bbb += H(ccc, ddd, eee) + blockDWords[9] + 0x6d703ef3; bbb = (bbb << 14 | bbb >> (32 - 14)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // HHH(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[11], 12); aaa += H(bbb, ccc, ddd) + blockDWords[11] + 0x6d703ef3; aaa = (aaa << 12 | aaa >> (32 - 12)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // HHH(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[8], 13); eee += H(aaa, bbb, ccc) + blockDWords[8] + 0x6d703ef3; eee = (eee << 13 | eee >> (32 - 13)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[12], 5); ddd += H(eee, aaa, bbb) + blockDWords[12] + 0x6d703ef3; ddd = (ddd << 5 | ddd >> (32 - 5)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // HHH(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[2], 14); ccc += H(ddd, eee, aaa) + blockDWords[2] + 0x6d703ef3; ccc = (ccc << 14 | ccc >> (32 - 14)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // HHH(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[10], 13); bbb += H(ccc, ddd, eee) + blockDWords[10] + 0x6d703ef3; bbb = (bbb << 13 | bbb >> (32 - 13)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // HHH(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[0], 13); aaa += H(bbb, ccc, ddd) + blockDWords[0] + 0x6d703ef3; aaa = (aaa << 13 | aaa >> (32 - 13)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // HHH(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[4], 7); eee += H(aaa, bbb, ccc) + blockDWords[4] + 0x6d703ef3; eee = (eee << 7 | eee >> (32 - 7)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[13], 5); ddd += H(eee, aaa, bbb) + blockDWords[13] + 0x6d703ef3; ddd = (ddd << 5 | ddd >> (32 - 5)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // Parallel Right Round 4 // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[8], 15); ccc += G(ddd, eee, aaa) + blockDWords[8] + 0x7a6d76e9; ccc = (ccc << 15 | ccc >> (32 - 15)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // GGG(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[6], 5); bbb += G(ccc, ddd, eee) + blockDWords[6] + 0x7a6d76e9; bbb = (bbb << 5 | bbb >> (32 - 5)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // GGG(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[4], 8); aaa += G(bbb, ccc, ddd) + blockDWords[4] + 0x7a6d76e9; aaa = (aaa << 8 | aaa >> (32 - 8)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // GGG(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[1], 11); eee += G(aaa, bbb, ccc) + blockDWords[1] + 0x7a6d76e9; eee = (eee << 11 | eee >> (32 - 11)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // GGG(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[3], 14); ddd += G(eee, aaa, bbb) + blockDWords[3] + 0x7a6d76e9; ddd = (ddd << 14 | ddd >> (32 - 14)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[11], 14); ccc += G(ddd, eee, aaa) + blockDWords[11] + 0x7a6d76e9; ccc = (ccc << 14 | ccc >> (32 - 14)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // GGG(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[15], 6); bbb += G(ccc, ddd, eee) + blockDWords[15] + 0x7a6d76e9; bbb = (bbb << 6 | bbb >> (32 - 6)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // GGG(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[0], 14); aaa += G(bbb, ccc, ddd) + blockDWords[0] + 0x7a6d76e9; aaa = (aaa << 14 | aaa >> (32 - 14)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // GGG(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[5], 6); eee += G(aaa, bbb, ccc) + blockDWords[5] + 0x7a6d76e9; eee = (eee << 6 | eee >> (32 - 6)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // GGG(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[12], 9); ddd += G(eee, aaa, bbb) + blockDWords[12] + 0x7a6d76e9; ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[2], 12); ccc += G(ddd, eee, aaa) + blockDWords[2] + 0x7a6d76e9; ccc = (ccc << 12 | ccc >> (32 - 12)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // GGG(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[13], 9); bbb += G(ccc, ddd, eee) + blockDWords[13] + 0x7a6d76e9; bbb = (bbb << 9 | bbb >> (32 - 9)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // GGG(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[9], 12); aaa += G(bbb, ccc, ddd) + blockDWords[9] + 0x7a6d76e9; aaa = (aaa << 12 | aaa >> (32 - 12)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // GGG(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[7], 5); eee += G(aaa, bbb, ccc) + blockDWords[7] + 0x7a6d76e9; eee = (eee << 5 | eee >> (32 - 5)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // GGG(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[10], 15); ddd += G(eee, aaa, bbb) + blockDWords[10] + 0x7a6d76e9; ddd = (ddd << 15 | ddd >> (32 - 15)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[14], 8); ccc += G(ddd, eee, aaa) + blockDWords[14] + 0x7a6d76e9; ccc = (ccc << 8 | ccc >> (32 - 8)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // Parallel Right Round 5 // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[12], 8); bbb += F(ccc, ddd, eee) + blockDWords[12]; bbb = (bbb << 8 | bbb >> (32 - 8)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // FFF(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[15], 5); aaa += F(bbb, ccc, ddd) + blockDWords[15]; aaa = (aaa << 5 | aaa >> (32 - 5)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // FFF(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[10], 12); eee += F(aaa, bbb, ccc) + blockDWords[10]; eee = (eee << 12 | eee >> (32 - 12)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // FFF(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[4], 9); ddd += F(eee, aaa, bbb) + blockDWords[4]; ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // FFF(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[1], 12); ccc += F(ddd, eee, aaa) + blockDWords[1]; ccc = (ccc << 12 | ccc >> (32 - 12)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[5], 5); bbb += F(ccc, ddd, eee) + blockDWords[5]; bbb = (bbb << 5 | bbb >> (32 - 5)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // FFF(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[8], 14); aaa += F(bbb, ccc, ddd) + blockDWords[8]; aaa = (aaa << 14 | aaa >> (32 - 14)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // FFF(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[7], 6); eee += F(aaa, bbb, ccc) + blockDWords[7]; eee = (eee << 6 | eee >> (32 - 6)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // FFF(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[6], 8); ddd += F(eee, aaa, bbb) + blockDWords[6]; ddd = (ddd << 8 | ddd >> (32 - 8)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // FFF(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[2], 13); ccc += F(ddd, eee, aaa) + blockDWords[2]; ccc = (ccc << 13 | ccc >> (32 - 13)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[13], 6); bbb += F(ccc, ddd, eee) + blockDWords[13]; bbb = (bbb << 6 | bbb >> (32 - 6)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // FFF(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[14], 5); aaa += F(bbb, ccc, ddd) + blockDWords[14]; aaa = (aaa << 5 | aaa >> (32 - 5)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // FFF(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[0], 15); eee += F(aaa, bbb, ccc) + blockDWords[0]; eee = (eee << 15 | eee >> (32 - 15)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // FFF(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[3], 13); ddd += F(eee, aaa, bbb) + blockDWords[3]; ddd = (ddd << 13 | ddd >> (32 - 13)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // FFF(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[9], 11); ccc += F(ddd, eee, aaa) + blockDWords[9]; ccc = (ccc << 11 | ccc >> (32 - 11)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[11], 11); bbb += F(ccc, ddd, eee) + blockDWords[11]; bbb = (bbb << 11 | bbb >> (32 - 11)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // Update the state of the hash object ddd += cc + state[1]; state[1] = state[2] + dd + eee; state[2] = state[3] + ee + aaa; state[3] = state[4] + aa + bbb; state[4] = state[0] + bb + ccc; state[0] = ddd; } // The five basic functions private static uint F (uint x, uint y, uint z) { return (x ^ y ^ z); } private static uint G (uint x, uint y, uint z) { return ((x & y) | (~x & z)); } private static uint H (uint x, uint y, uint z) { return ((x | ~y) ^ z); } private static uint I (uint x, uint y, uint z) { return ((x & z) | (y & ~z)); } private static uint J (uint x, uint y, uint z) { return (x ^ (y | ~z)); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // [....] // // // RIPEMD160Managed.cs // // RIPEMD-160 algorithm by Antoon Bosselaers, described at // http://www.esat.kuleuven.ac.be/~cosicart/ps/AB-9601/. // namespace System.Security.Cryptography { using System; using System.Diagnostics.Contracts; [System.Runtime.InteropServices.ComVisible(true)] public class RIPEMD160Managed : RIPEMD160 { private byte[] _buffer; private long _count; // Number of bytes in the hashed message private uint[] _stateMD160; private uint[] _blockDWords; // // public constructors // public RIPEMD160Managed() { if (CryptoConfig.AllowOnlyFipsAlgorithms) throw new InvalidOperationException(Environment.GetResourceString("Cryptography_NonCompliantFIPSAlgorithm")); Contract.EndContractBlock(); _stateMD160 = new uint[5]; _blockDWords = new uint[16]; _buffer = new byte[64]; InitializeState(); } // // public methods // public override void Initialize() { InitializeState(); // Zeroize potentially sensitive information. Array.Clear(_blockDWords, 0, _blockDWords.Length); Array.Clear(_buffer, 0, _buffer.Length); } [System.Security.SecuritySafeCritical] // auto-generated protected override void HashCore(byte[] rgb, int ibStart, int cbSize) { _HashData(rgb, ibStart, cbSize); } [System.Security.SecuritySafeCritical] // auto-generated protected override byte[] HashFinal() { return _EndHash(); } // // private methods // private void InitializeState() { _count = 0; // Use the same chaining values (IVs) as in SHA1, // The convention is little endian however (same as MD4) _stateMD160[0] = 0x67452301; _stateMD160[1] = 0xefcdab89; _stateMD160[2] = 0x98badcfe; _stateMD160[3] = 0x10325476; _stateMD160[4] = 0xc3d2e1f0; } [System.Security.SecurityCritical] // auto-generated private unsafe void _HashData(byte[] partIn, int ibStart, int cbSize) { int bufferLen; int partInLen = cbSize; int partInBase = ibStart; /* Compute length of buffer */ bufferLen = (int) (_count & 0x3f); /* Update number of bytes */ _count += partInLen; fixed (uint* stateMD160 = _stateMD160) { fixed (byte* buffer = _buffer) { fixed (uint* blockDWords = _blockDWords) { if ((bufferLen > 0) && (bufferLen + partInLen >= 64)) { Buffer.InternalBlockCopy(partIn, partInBase, _buffer, bufferLen, 64 - bufferLen); partInBase += (64 - bufferLen); partInLen -= (64 - bufferLen); MDTransform(blockDWords, stateMD160, buffer); bufferLen = 0; } /* Copy input to temporary buffer and hash */ while (partInLen >= 64) { Buffer.InternalBlockCopy(partIn, partInBase, _buffer, 0, 64); partInBase += 64; partInLen -= 64; MDTransform(blockDWords, stateMD160, buffer); } if (partInLen > 0) { Buffer.InternalBlockCopy(partIn, partInBase, _buffer, bufferLen, partInLen); } } } } } [System.Security.SecurityCritical] // auto-generated private byte[] _EndHash() { byte[] pad; int padLen; long bitCount; byte[] hash = new byte[20]; /* Compute padding: 80 00 00 ... 00 00*/ padLen = 64 - (int)(_count & 0x3f); if (padLen <= 8) padLen += 64; pad = new byte[padLen]; pad[0] = 0x80; // Convert count to bit count bitCount = _count * 8; // The convention for RIPEMD is little endian (the same as MD4) pad[padLen-1] = (byte) ((bitCount >> 56) & 0xff); pad[padLen-2] = (byte) ((bitCount >> 48) & 0xff); pad[padLen-3] = (byte) ((bitCount >> 40) & 0xff); pad[padLen-4] = (byte) ((bitCount >> 32) & 0xff); pad[padLen-5] = (byte) ((bitCount >> 24) & 0xff); pad[padLen-6] = (byte) ((bitCount >> 16) & 0xff); pad[padLen-7] = (byte) ((bitCount >> 8) & 0xff); pad[padLen-8] = (byte) ((bitCount >> 0) & 0xff); /* Digest padding */ _HashData(pad, 0, pad.Length); /* Store digest */ Utils.DWORDToLittleEndian (hash, _stateMD160, 5); HashValue = hash; return hash; } [System.Security.SecurityCritical] // auto-generated private static unsafe void MDTransform (uint* blockDWords, uint* state, byte* block) { uint aa = state[0]; uint bb = state[1]; uint cc = state[2]; uint dd = state[3]; uint ee = state[4]; uint aaa = aa; uint bbb = bb; uint ccc = cc; uint ddd = dd; uint eee = ee; Utils.DWORDFromLittleEndian (blockDWords, 16, block); /* As we don't have macros in C# and we don't want to pay the cost of a function call (which BTW is quite important here as we would have to pass 5 args by ref in 16 * 10 = 160 function calls) we'll prefer a less compact code to a less performant code */ // Left Round 1 // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[0], 11); aa += blockDWords[0] + F(bb, cc, dd); aa = (aa << 11 | aa >> (32 - 11)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // FF(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[1], 14); ee += blockDWords[1] + F(aa, bb, cc); ee = (ee << 14 | ee >> (32 - 14)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // FF(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[2], 15); dd += blockDWords[2] + F(ee, aa, bb); dd = (dd << 15 | dd >> (32 - 15)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // FF(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[3], 12); cc += blockDWords[3] + F(dd, ee, aa); cc = (cc << 12 | cc >> (32 - 12)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // FF(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[4], 5); bb += blockDWords[4] + F(cc, dd, ee); bb = (bb << 5 | bb >> (32 - 5)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[5], 8); aa += blockDWords[5] + F(bb, cc, dd); aa = (aa << 8 | aa >> (32 - 8)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // FF(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[6], 7); ee += blockDWords[6] + F(aa, bb, cc); ee = (ee << 7 | ee >> (32 - 7)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // FF(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[7], 9); dd += blockDWords[7] + F(ee, aa, bb); dd = (dd << 9 | dd >> (32 - 9)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // FF(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[8], 11); cc += blockDWords[8] + F(dd, ee, aa); cc = (cc << 11 | cc >> (32 - 11)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // FF(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[9], 13); bb += blockDWords[9] + F(cc, dd, ee); bb = (bb << 13 | bb >> (32 - 13)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[10], 14); aa += blockDWords[10] + F(bb, cc, dd); aa = (aa << 14 | aa >> (32 - 14)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // FF(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[11], 15); ee += blockDWords[11] + F(aa, bb, cc); ee = (ee << 15 | ee >> (32 - 15)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // FF(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[12], 6); dd += blockDWords[12] + F(ee, aa, bb); dd = (dd << 6 | dd >> (32 - 6)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // FF(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[13], 7); cc += blockDWords[13] + F(dd, ee, aa); cc = (cc << 7 | cc >> (32 - 7)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // FF(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[14], 9); bb += blockDWords[14] + F(cc, dd, ee); bb = (bb << 9 | bb >> (32 - 9)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // FF(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[15], 8); aa += blockDWords[15] + F(bb, cc, dd); aa = (aa << 8 | aa >> (32 - 8)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // Left Round 2 // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[7], 7); ee += G(aa, bb, cc) + blockDWords[7] + 0x5a827999; ee = (ee << 7 | ee >> (32 - 7)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // GG(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[4], 6); dd += G(ee, aa, bb) + blockDWords[4] + 0x5a827999; dd = (dd << 6 | dd >> (32 - 6)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // GG(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[13], 8); cc += G(dd, ee, aa) + blockDWords[13] + 0x5a827999; cc = (cc << 8 | cc >> (32 - 8)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // GG(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[1], 13); bb += G(cc, dd, ee) + blockDWords[1] + 0x5a827999; bb = (bb << 13 | bb >> (32 - 13)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // GG(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[10], 11); aa += G(bb, cc, dd) + blockDWords[10] + 0x5a827999; aa = (aa << 11 | aa >> (32 - 11)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[6], 9); ee += G(aa, bb, cc) + blockDWords[6] + 0x5a827999; ee = (ee << 9 | ee >> (32 - 9)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // GG(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[15], 7); dd += G(ee, aa, bb) + blockDWords[15] + 0x5a827999; dd = (dd << 7 | dd >> (32 - 7)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // GG(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[3], 15); cc += G(dd, ee, aa) + blockDWords[3] + 0x5a827999; cc = (cc << 15 | cc >> (32 - 15)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // GG(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[12], 7); bb += G(cc, dd, ee) + blockDWords[12] + 0x5a827999; bb = (bb << 7 | bb >> (32 - 7)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // GG(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[0], 12); aa += G(bb, cc, dd) + blockDWords[0] + 0x5a827999; aa = (aa << 12 | aa >> (32 - 12)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[9], 15); ee += G(aa, bb, cc) + blockDWords[9] + 0x5a827999; ee = (ee << 15 | ee >> (32 - 15)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // GG(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[5], 9); dd += G(ee, aa, bb) + blockDWords[5] + 0x5a827999; dd = (dd << 9 | dd >> (32 - 9)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // GG(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[2], 11); cc += G(dd, ee, aa) + blockDWords[2] + 0x5a827999; cc = (cc << 11 | cc >> (32 - 11)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // GG(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[14], 7); bb += G(cc, dd, ee) + blockDWords[14] + 0x5a827999; bb = (bb << 7 | bb >> (32 - 7)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // GG(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[11], 13); aa += G(bb, cc, dd) + blockDWords[11] + 0x5a827999; aa = (aa << 13 | aa >> (32 - 13)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // GG(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[8], 12); ee += G(aa, bb, cc) + blockDWords[8] + 0x5a827999; ee = (ee << 12 | ee >> (32 - 12)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // Left Round 3 // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[3], 11); dd += H(ee, aa, bb) + blockDWords[3] + 0x6ed9eba1; dd = (dd << 11 | dd >> (32 - 11)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // HH(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[10], 13); cc += H(dd, ee, aa) + blockDWords[10] + 0x6ed9eba1; cc = (cc << 13 | cc >> (32 - 13)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // HH(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[14], 6); bb += H(cc, dd, ee) + blockDWords[14] + 0x6ed9eba1; bb = (bb << 6 | bb >> (32 - 6)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // HH(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[4], 7); aa += H(bb, cc, dd) + blockDWords[4] + 0x6ed9eba1; aa = (aa << 7 | aa >> (32 - 7)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // HH(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[9], 14); ee += H(aa, bb, cc) + blockDWords[9] + 0x6ed9eba1; ee = (ee << 14 | ee >> (32 - 14)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[15], 9); dd += H(ee, aa, bb) + blockDWords[15] + 0x6ed9eba1; dd = (dd << 9 | dd >> (32 - 9)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // HH(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[8], 13); cc += H(dd, ee, aa) + blockDWords[8] + 0x6ed9eba1; cc = (cc << 13 | cc >> (32 - 13)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // HH(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[1], 15); bb += H(cc, dd, ee) + blockDWords[1] + 0x6ed9eba1; bb = (bb << 15 | bb >> (32 - 15)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // HH(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[2], 14); aa += H(bb, cc, dd) + blockDWords[2] + 0x6ed9eba1; aa = (aa << 14 | aa >> (32 - 14)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // HH(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[7], 8); ee += H(aa, bb, cc) + blockDWords[7] + 0x6ed9eba1; ee = (ee << 8 | ee >> (32 - 8)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[0], 13); dd += H(ee, aa, bb) + blockDWords[0] + 0x6ed9eba1; dd = (dd << 13 | dd >> (32 - 13)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // HH(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[6], 6); cc += H(dd, ee, aa) + blockDWords[6] + 0x6ed9eba1; cc = (cc << 6 | cc >> (32 - 6)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // HH(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[13], 5); bb += H(cc, dd, ee) + blockDWords[13] + 0x6ed9eba1; bb = (bb << 5 | bb >> (32 - 5)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // HH(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[11], 12); aa += H(bb, cc, dd) + blockDWords[11] + 0x6ed9eba1; aa = (aa << 12 | aa >> (32 - 12)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // HH(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[5], 7); ee += H(aa, bb, cc) + blockDWords[5] + 0x6ed9eba1; ee = (ee << 7 | ee >> (32 - 7)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // HH(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[12], 5); dd += H(ee, aa, bb) + blockDWords[12] + 0x6ed9eba1; dd = (dd << 5 | dd >> (32 - 5)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // Left Round 4 // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[1], 11); cc += I(dd, ee, aa) + blockDWords[1] + 0x8f1bbcdc; cc = (cc << 11 | cc >> (32 - 11)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // II(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[9], 12); bb += I(cc, dd, ee) + blockDWords[9] + 0x8f1bbcdc; bb = (bb << 12 | bb >> (32 - 12)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // II(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[11], 14); aa += I(bb, cc, dd) + blockDWords[11] + 0x8f1bbcdc; aa = (aa << 14 | aa >> (32 - 14)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // II(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[10], 15); ee += I(aa, bb, cc) + blockDWords[10] + 0x8f1bbcdc; ee = (ee << 15 | ee >> (32 - 15)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // II(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[0], 14); dd += I(ee, aa, bb) + blockDWords[0] + 0x8f1bbcdc; dd = (dd << 14 | dd >> (32 - 14)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[8], 15); cc += I(dd, ee, aa) + blockDWords[8] + 0x8f1bbcdc; cc = (cc << 15 | cc >> (32 - 15)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // II(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[12], 9); bb += I(cc, dd, ee) + blockDWords[12] + 0x8f1bbcdc; bb = (bb << 9 | bb >> (32 - 9)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // II(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[4], 8); aa += I(bb, cc, dd) + blockDWords[4] + 0x8f1bbcdc; aa = (aa << 8 | aa >> (32 - 8)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // II(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[13], 9); ee += I(aa, bb, cc) + blockDWords[13] + 0x8f1bbcdc; ee = (ee << 9 | ee >> (32 - 9)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // II(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[3], 14); dd += I(ee, aa, bb) + blockDWords[3] + 0x8f1bbcdc; dd = (dd << 14 | dd >> (32 - 14)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[7], 5); cc += I(dd, ee, aa) + blockDWords[7] + 0x8f1bbcdc; cc = (cc << 5 | cc >> (32 - 5)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // II(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[15], 6); bb += I(cc, dd, ee) + blockDWords[15] + 0x8f1bbcdc; bb = (bb << 6 | bb >> (32 - 6)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // II(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[14], 8); aa += I(bb, cc, dd) + blockDWords[14] + 0x8f1bbcdc; aa = (aa << 8 | aa >> (32 - 8)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // II(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[5], 6); ee += I(aa, bb, cc) + blockDWords[5] + 0x8f1bbcdc; ee = (ee << 6 | ee >> (32 - 6)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // II(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[6], 5); dd += I(ee, aa, bb) + blockDWords[6] + 0x8f1bbcdc; dd = (dd << 5 | dd >> (32 - 5)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // II(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[2], 12); cc += I(dd, ee, aa) + blockDWords[2] + 0x8f1bbcdc; cc = (cc << 12 | cc >> (32 - 12)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // Left Round 5 // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[4], 9); bb += J(cc, dd, ee) + blockDWords[4] + 0xa953fd4e; bb = (bb << 9 | bb >> (32 - 9)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // JJ(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[0], 15); aa += J(bb, cc, dd) + blockDWords[0] + 0xa953fd4e; aa = (aa << 15 | aa >> (32 - 15)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // JJ(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[5], 5); ee += J(aa, bb, cc) + blockDWords[5] + 0xa953fd4e; ee = (ee << 5 | ee >> (32 - 5)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // JJ(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[9], 11); dd += J(ee, aa, bb) + blockDWords[9] + 0xa953fd4e; dd = (dd << 11 | dd >> (32 - 11)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // JJ(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[7], 6); cc += J(dd, ee, aa) + blockDWords[7] + 0xa953fd4e; cc = (cc << 6 | cc >> (32 - 6)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[12], 8); bb += J(cc, dd, ee) + blockDWords[12] + 0xa953fd4e; bb = (bb << 8 | bb >> (32 - 8)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // JJ(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[2], 13); aa += J(bb, cc, dd) + blockDWords[2] + 0xa953fd4e; aa = (aa << 13 | aa >> (32 - 13)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // JJ(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[10], 12); ee += J(aa, bb, cc) + blockDWords[10] + 0xa953fd4e; ee = (ee << 12 | ee >> (32 - 12)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // JJ(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[14], 5); dd += J(ee, aa, bb) + blockDWords[14] + 0xa953fd4e; dd = (dd << 5 | dd >> (32 - 5)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // JJ(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[1], 12); cc += J(dd, ee, aa) + blockDWords[1] + 0xa953fd4e; cc = (cc << 12 | cc >> (32 - 12)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[3], 13); bb += J(cc, dd, ee) + blockDWords[3] + 0xa953fd4e; bb = (bb << 13 | bb >> (32 - 13)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // JJ(ref aa, ref bb, ref cc, ref dd, ref ee, blockDWords[8], 14); aa += J(bb, cc, dd) + blockDWords[8] + 0xa953fd4e; aa = (aa << 14 | aa >> (32 - 14)) + ee; cc = (cc << 10 | cc >> (32 - 10)); // JJ(ref ee, ref aa, ref bb, ref cc, ref dd, blockDWords[11], 11); ee += J(aa, bb, cc) + blockDWords[11] + 0xa953fd4e; ee = (ee << 11 | ee >> (32 - 11)) + dd; bb = (bb << 10 | bb >> (32 - 10)); // JJ(ref dd, ref ee, ref aa, ref bb, ref cc, blockDWords[6], 8); dd += J(ee, aa, bb) + blockDWords[6] + 0xa953fd4e; dd = (dd << 8 | dd >> (32 - 8)) + cc; aa = (aa << 10 | aa >> (32 - 10)); // JJ(ref cc, ref dd, ref ee, ref aa, ref bb, blockDWords[15], 5); cc += J(dd, ee, aa) + blockDWords[15] + 0xa953fd4e; cc = (cc << 5 | cc >> (32 - 5)) + bb; ee = (ee << 10 | ee >> (32 - 10)); // JJ(ref bb, ref cc, ref dd, ref ee, ref aa, blockDWords[13], 6); bb += J(cc, dd, ee) + blockDWords[13] + 0xa953fd4e; bb = (bb << 6 | bb >> (32 - 6)) + aa; dd = (dd << 10 | dd >> (32 - 10)); // Parallel Right Round 1 // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[5], 8); aaa += J(bbb, ccc, ddd) + blockDWords[5] + 0x50a28be6; aaa = (aaa << 8 | aaa >> (32 - 8)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // JJJ(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[14], 9); eee += J(aaa, bbb, ccc) + blockDWords[14] + 0x50a28be6; eee = (eee << 9 | eee >> (32 - 9)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // JJJ(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[7], 9); ddd += J(eee, aaa, bbb) + blockDWords[7] + 0x50a28be6; ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // JJJ(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[0], 11); ccc += J(ddd, eee, aaa) + blockDWords[0] + 0x50a28be6; ccc = (ccc << 11 | ccc >> (32 - 11)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // JJJ(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[9], 13); bbb += J(ccc, ddd, eee) + blockDWords[9] + 0x50a28be6; bbb = (bbb << 13 | bbb >> (32 - 13)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[2], 15); aaa += J(bbb, ccc, ddd) + blockDWords[2] + 0x50a28be6; aaa = (aaa << 15 | aaa >> (32 - 15)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // JJJ(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[11], 15); eee += J(aaa, bbb, ccc) + blockDWords[11] + 0x50a28be6; eee = (eee << 15 | eee >> (32 - 15)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // JJJ(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[4], 5); ddd += J(eee, aaa, bbb) + blockDWords[4] + 0x50a28be6; ddd = (ddd << 5 | ddd >> (32 - 5)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // JJJ(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[13], 7); ccc += J(ddd, eee, aaa) + blockDWords[13] + 0x50a28be6; ccc = (ccc << 7 | ccc >> (32 - 7)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // JJJ(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[6], 7); bbb += J(ccc, ddd, eee) + blockDWords[6] + 0x50a28be6; bbb = (bbb << 7 | bbb >> (32 - 7)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[15], 8); aaa += J(bbb, ccc, ddd) + blockDWords[15] + 0x50a28be6; aaa = (aaa << 8 | aaa >> (32 - 8)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // JJJ(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[8], 11); eee += J(aaa, bbb, ccc) + blockDWords[8] + 0x50a28be6; eee = (eee << 11 | eee >> (32 - 11)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // JJJ(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[1], 14); ddd += J(eee, aaa, bbb) + blockDWords[1] + 0x50a28be6; ddd = (ddd << 14 | ddd >> (32 - 14)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // JJJ(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[10], 14); ccc += J(ddd, eee, aaa) + blockDWords[10] + 0x50a28be6; ccc = (ccc << 14 | ccc >> (32 - 14)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // JJJ(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[3], 12); bbb += J(ccc, ddd, eee) + blockDWords[3] + 0x50a28be6; bbb = (bbb << 12 | bbb >> (32 - 12)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // JJJ(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[12], 6); aaa += J(bbb, ccc, ddd) + blockDWords[12] + 0x50a28be6; aaa = (aaa << 6 | aaa >> (32 - 6)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // Parallel Right Round 2 // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[6], 9); eee += I(aaa, bbb, ccc) + blockDWords[6] + 0x5c4dd124; eee = (eee << 9 | eee >> (32 - 9)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // III(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[11], 13); ddd += I(eee, aaa, bbb) + blockDWords[11] + 0x5c4dd124; ddd = (ddd << 13 | ddd >> (32 - 13)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // III(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[3], 15); ccc += I(ddd, eee, aaa) + blockDWords[3] + 0x5c4dd124; ccc = (ccc << 15 | ccc >> (32 - 15)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // III(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[7], 7); bbb += I(ccc, ddd, eee) + blockDWords[7] + 0x5c4dd124; bbb = (bbb << 7 | bbb >> (32 - 7)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // III(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[0], 12); aaa += I(bbb, ccc, ddd) + blockDWords[0] + 0x5c4dd124; aaa = (aaa << 12 | aaa >> (32 - 12)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[13], 8); eee += I(aaa, bbb, ccc) + blockDWords[13] + 0x5c4dd124; eee = (eee << 8 | eee >> (32 - 8)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // III(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[5], 9); ddd += I(eee, aaa, bbb) + blockDWords[5] + 0x5c4dd124; ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // III(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[10], 11); ccc += I(ddd, eee, aaa) + blockDWords[10] + 0x5c4dd124; ccc = (ccc << 11 | ccc >> (32 - 11)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // III(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[14], 7); bbb += I(ccc, ddd, eee) + blockDWords[14] + 0x5c4dd124; bbb = (bbb << 7 | bbb >> (32 - 7)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // III(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[15], 7); aaa += I(bbb, ccc, ddd) + blockDWords[15] + 0x5c4dd124; aaa = (aaa << 7 | aaa >> (32 - 7)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[8], 12); eee += I(aaa, bbb, ccc) + blockDWords[8] + 0x5c4dd124; eee = (eee << 12 | eee >> (32 - 12)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // III(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[12], 7); ddd += I(eee, aaa, bbb) + blockDWords[12] + 0x5c4dd124; ddd = (ddd << 7 | ddd >> (32 - 7)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // III(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[4], 6); ccc += I(ddd, eee, aaa) + blockDWords[4] + 0x5c4dd124; ccc = (ccc << 6 | ccc >> (32 - 6)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // III(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[9], 15); bbb += I(ccc, ddd, eee) + blockDWords[9] + 0x5c4dd124; bbb = (bbb << 15 | bbb >> (32 - 15)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // III(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[1], 13); aaa += I(bbb, ccc, ddd) + blockDWords[1] + 0x5c4dd124; aaa = (aaa << 13 | aaa >> (32 - 13)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // III(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[2], 11); eee += I(aaa, bbb, ccc) + blockDWords[2] + 0x5c4dd124; eee = (eee << 11 | eee >> (32 - 11)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // Parallel Right Round 3 // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[15], 9); ddd += H(eee, aaa, bbb) + blockDWords[15] + 0x6d703ef3; ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // HHH(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[5], 7); ccc += H(ddd, eee, aaa) + blockDWords[5] + 0x6d703ef3; ccc = (ccc << 7 | ccc >> (32 - 7)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // HHH(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[1], 15); bbb += H(ccc, ddd, eee) + blockDWords[1] + 0x6d703ef3; bbb = (bbb << 15 | bbb >> (32 - 15)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // HHH(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[3], 11); aaa += H(bbb, ccc, ddd) + blockDWords[3] + 0x6d703ef3; aaa = (aaa << 11 | aaa >> (32 - 11)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // HHH(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[7], 8); eee += H(aaa, bbb, ccc) + blockDWords[7] + 0x6d703ef3; eee = (eee << 8 | eee >> (32 - 8)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[14], 6); ddd += H(eee, aaa, bbb) + blockDWords[14] + 0x6d703ef3; ddd = (ddd << 6 | ddd >> (32 - 6)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // HHH(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[6], 6); ccc += H(ddd, eee, aaa) + blockDWords[6] + 0x6d703ef3; ccc = (ccc << 6 | ccc >> (32 - 6)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // HHH(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[9], 14); bbb += H(ccc, ddd, eee) + blockDWords[9] + 0x6d703ef3; bbb = (bbb << 14 | bbb >> (32 - 14)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // HHH(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[11], 12); aaa += H(bbb, ccc, ddd) + blockDWords[11] + 0x6d703ef3; aaa = (aaa << 12 | aaa >> (32 - 12)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // HHH(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[8], 13); eee += H(aaa, bbb, ccc) + blockDWords[8] + 0x6d703ef3; eee = (eee << 13 | eee >> (32 - 13)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[12], 5); ddd += H(eee, aaa, bbb) + blockDWords[12] + 0x6d703ef3; ddd = (ddd << 5 | ddd >> (32 - 5)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // HHH(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[2], 14); ccc += H(ddd, eee, aaa) + blockDWords[2] + 0x6d703ef3; ccc = (ccc << 14 | ccc >> (32 - 14)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // HHH(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[10], 13); bbb += H(ccc, ddd, eee) + blockDWords[10] + 0x6d703ef3; bbb = (bbb << 13 | bbb >> (32 - 13)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // HHH(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[0], 13); aaa += H(bbb, ccc, ddd) + blockDWords[0] + 0x6d703ef3; aaa = (aaa << 13 | aaa >> (32 - 13)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // HHH(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[4], 7); eee += H(aaa, bbb, ccc) + blockDWords[4] + 0x6d703ef3; eee = (eee << 7 | eee >> (32 - 7)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // HHH(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[13], 5); ddd += H(eee, aaa, bbb) + blockDWords[13] + 0x6d703ef3; ddd = (ddd << 5 | ddd >> (32 - 5)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // Parallel Right Round 4 // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[8], 15); ccc += G(ddd, eee, aaa) + blockDWords[8] + 0x7a6d76e9; ccc = (ccc << 15 | ccc >> (32 - 15)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // GGG(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[6], 5); bbb += G(ccc, ddd, eee) + blockDWords[6] + 0x7a6d76e9; bbb = (bbb << 5 | bbb >> (32 - 5)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // GGG(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[4], 8); aaa += G(bbb, ccc, ddd) + blockDWords[4] + 0x7a6d76e9; aaa = (aaa << 8 | aaa >> (32 - 8)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // GGG(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[1], 11); eee += G(aaa, bbb, ccc) + blockDWords[1] + 0x7a6d76e9; eee = (eee << 11 | eee >> (32 - 11)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // GGG(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[3], 14); ddd += G(eee, aaa, bbb) + blockDWords[3] + 0x7a6d76e9; ddd = (ddd << 14 | ddd >> (32 - 14)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[11], 14); ccc += G(ddd, eee, aaa) + blockDWords[11] + 0x7a6d76e9; ccc = (ccc << 14 | ccc >> (32 - 14)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // GGG(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[15], 6); bbb += G(ccc, ddd, eee) + blockDWords[15] + 0x7a6d76e9; bbb = (bbb << 6 | bbb >> (32 - 6)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // GGG(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[0], 14); aaa += G(bbb, ccc, ddd) + blockDWords[0] + 0x7a6d76e9; aaa = (aaa << 14 | aaa >> (32 - 14)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // GGG(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[5], 6); eee += G(aaa, bbb, ccc) + blockDWords[5] + 0x7a6d76e9; eee = (eee << 6 | eee >> (32 - 6)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // GGG(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[12], 9); ddd += G(eee, aaa, bbb) + blockDWords[12] + 0x7a6d76e9; ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[2], 12); ccc += G(ddd, eee, aaa) + blockDWords[2] + 0x7a6d76e9; ccc = (ccc << 12 | ccc >> (32 - 12)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // GGG(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[13], 9); bbb += G(ccc, ddd, eee) + blockDWords[13] + 0x7a6d76e9; bbb = (bbb << 9 | bbb >> (32 - 9)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // GGG(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[9], 12); aaa += G(bbb, ccc, ddd) + blockDWords[9] + 0x7a6d76e9; aaa = (aaa << 12 | aaa >> (32 - 12)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // GGG(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[7], 5); eee += G(aaa, bbb, ccc) + blockDWords[7] + 0x7a6d76e9; eee = (eee << 5 | eee >> (32 - 5)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // GGG(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[10], 15); ddd += G(eee, aaa, bbb) + blockDWords[10] + 0x7a6d76e9; ddd = (ddd << 15 | ddd >> (32 - 15)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // GGG(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[14], 8); ccc += G(ddd, eee, aaa) + blockDWords[14] + 0x7a6d76e9; ccc = (ccc << 8 | ccc >> (32 - 8)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // Parallel Right Round 5 // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[12], 8); bbb += F(ccc, ddd, eee) + blockDWords[12]; bbb = (bbb << 8 | bbb >> (32 - 8)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // FFF(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[15], 5); aaa += F(bbb, ccc, ddd) + blockDWords[15]; aaa = (aaa << 5 | aaa >> (32 - 5)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // FFF(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[10], 12); eee += F(aaa, bbb, ccc) + blockDWords[10]; eee = (eee << 12 | eee >> (32 - 12)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // FFF(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[4], 9); ddd += F(eee, aaa, bbb) + blockDWords[4]; ddd = (ddd << 9 | ddd >> (32 - 9)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // FFF(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[1], 12); ccc += F(ddd, eee, aaa) + blockDWords[1]; ccc = (ccc << 12 | ccc >> (32 - 12)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[5], 5); bbb += F(ccc, ddd, eee) + blockDWords[5]; bbb = (bbb << 5 | bbb >> (32 - 5)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // FFF(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[8], 14); aaa += F(bbb, ccc, ddd) + blockDWords[8]; aaa = (aaa << 14 | aaa >> (32 - 14)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // FFF(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[7], 6); eee += F(aaa, bbb, ccc) + blockDWords[7]; eee = (eee << 6 | eee >> (32 - 6)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // FFF(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[6], 8); ddd += F(eee, aaa, bbb) + blockDWords[6]; ddd = (ddd << 8 | ddd >> (32 - 8)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // FFF(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[2], 13); ccc += F(ddd, eee, aaa) + blockDWords[2]; ccc = (ccc << 13 | ccc >> (32 - 13)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[13], 6); bbb += F(ccc, ddd, eee) + blockDWords[13]; bbb = (bbb << 6 | bbb >> (32 - 6)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // FFF(ref aaa, ref bbb, ref ccc, ref ddd, ref eee, blockDWords[14], 5); aaa += F(bbb, ccc, ddd) + blockDWords[14]; aaa = (aaa << 5 | aaa >> (32 - 5)) + eee; ccc = (ccc << 10 | ccc >> (32 - 10)); // FFF(ref eee, ref aaa, ref bbb, ref ccc, ref ddd, blockDWords[0], 15); eee += F(aaa, bbb, ccc) + blockDWords[0]; eee = (eee << 15 | eee >> (32 - 15)) + ddd; bbb = (bbb << 10 | bbb >> (32 - 10)); // FFF(ref ddd, ref eee, ref aaa, ref bbb, ref ccc, blockDWords[3], 13); ddd += F(eee, aaa, bbb) + blockDWords[3]; ddd = (ddd << 13 | ddd >> (32 - 13)) + ccc; aaa = (aaa << 10 | aaa >> (32 - 10)); // FFF(ref ccc, ref ddd, ref eee, ref aaa, ref bbb, blockDWords[9], 11); ccc += F(ddd, eee, aaa) + blockDWords[9]; ccc = (ccc << 11 | ccc >> (32 - 11)) + bbb; eee = (eee << 10 | eee >> (32 - 10)); // FFF(ref bbb, ref ccc, ref ddd, ref eee, ref aaa, blockDWords[11], 11); bbb += F(ccc, ddd, eee) + blockDWords[11]; bbb = (bbb << 11 | bbb >> (32 - 11)) + aaa; ddd = (ddd << 10 | ddd >> (32 - 10)); // Update the state of the hash object ddd += cc + state[1]; state[1] = state[2] + dd + eee; state[2] = state[3] + ee + aaa; state[3] = state[4] + aa + bbb; state[4] = state[0] + bb + ccc; state[0] = ddd; } // The five basic functions private static uint F (uint x, uint y, uint z) { return (x ^ y ^ z); } private static uint G (uint x, uint y, uint z) { return ((x & y) | (~x & z)); } private static uint H (uint x, uint y, uint z) { return ((x | ~y) ^ z); } private static uint I (uint x, uint y, uint z) { return ((x & z) | (y & ~z)); } private static uint J (uint x, uint y, uint z) { return (x ^ (y | ~z)); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- LinqDataSource.cs
- ContractValidationHelper.cs
- UdpChannelFactory.cs
- ValidatingCollection.cs
- EntityClientCacheKey.cs
- EditorPartCollection.cs
- Button.cs
- XsdBuildProvider.cs
- WebEventCodes.cs
- Win32KeyboardDevice.cs
- SecurityResources.cs
- diagnosticsswitches.cs
- EditingMode.cs
- DialogResultConverter.cs
- compensatingcollection.cs
- TextAutomationPeer.cs
- SemanticResolver.cs
- BinaryCommonClasses.cs
- ElementsClipboardData.cs
- ConnectorEditor.cs
- HtmlInputPassword.cs
- ReliabilityContractAttribute.cs
- ColorPalette.cs
- ForEachDesigner.xaml.cs
- RepeatBehavior.cs
- ResetableIterator.cs
- ToolStripItemDataObject.cs
- IOException.cs
- ContentPresenter.cs
- ByteAnimationBase.cs
- WebPartVerbCollection.cs
- StorageTypeMapping.cs
- Drawing.cs
- PolicyDesigner.cs
- RootDesignerSerializerAttribute.cs
- FixedSOMElement.cs
- PixelFormats.cs
- GZipDecoder.cs
- LineInfo.cs
- OciEnlistContext.cs
- PropertyPathConverter.cs
- WindowsGraphicsCacheManager.cs
- BitmapEffectGroup.cs
- TypeListConverter.cs
- CssClassPropertyAttribute.cs
- LogExtent.cs
- _ListenerRequestStream.cs
- DataGridViewTextBoxEditingControl.cs
- ParamArrayAttribute.cs
- SiteMapNode.cs
- SslStreamSecurityUpgradeProvider.cs
- DefaultPrintController.cs
- loginstatus.cs
- DecimalSumAggregationOperator.cs
- ColorAnimation.cs
- PenContexts.cs
- DataView.cs
- Wizard.cs
- ImportContext.cs
- EndpointAddressMessageFilterTable.cs
- FixedTextContainer.cs
- CompositeCollection.cs
- ContextMenuService.cs
- DoubleCollection.cs
- TreeViewAutomationPeer.cs
- DataGridPagerStyle.cs
- SqlDependencyUtils.cs
- PartialCachingControl.cs
- IProducerConsumerCollection.cs
- StrokeNode.cs
- ISAPIApplicationHost.cs
- GeometryCollection.cs
- DescriptionAttribute.cs
- AnimationLayer.cs
- XhtmlBasicPageAdapter.cs
- XmlIncludeAttribute.cs
- DataGridItem.cs
- TraceShell.cs
- ImageAttributes.cs
- LocalizationParserHooks.cs
- AnnotationMap.cs
- TransformedBitmap.cs
- UnsafeCollabNativeMethods.cs
- Properties.cs
- SqlNodeTypeOperators.cs
- ExceptionUtility.cs
- RepeatBehavior.cs
- UnauthorizedAccessException.cs
- ConstructorExpr.cs
- DoubleAnimationUsingKeyFrames.cs
- TreeBuilderXamlTranslator.cs
- Size3D.cs
- ActiveXContainer.cs
- CalendarDesigner.cs
- PublishLicense.cs
- CopyAction.cs
- TraceListener.cs
- XmlSchemaDocumentation.cs
- WsatServiceAddress.cs
- SolidColorBrush.cs