Ejemplo n.º 1
0
        private static unsafe void MDTransform(uint *blockDWords, uint *state, byte *block)
        {
            uint num1 = *state;
            uint num2 = *(uint *)((IntPtr)state + 4);
            uint y1   = state[2];
            uint z1   = state[3];
            uint num3 = state[4];
            uint num4 = num1;
            uint num5 = num2;
            uint y2   = y1;
            uint z2   = z1;
            uint num6 = num3;

            Utils.DWORDFromLittleEndian(blockDWords, 16, block);
            uint num7   = num1 + (*blockDWords + RIPEMD160Managed.F(num2, y1, z1));
            uint num8   = (num7 << 11 | num7 >> 21) + num3;
            uint z3     = y1 << 10 | y1 >> 22;
            uint num9   = num3 + (*(uint *)((IntPtr)blockDWords + 4) + RIPEMD160Managed.F(num8, num2, z3));
            uint num10  = (num9 << 14 | num9 >> 18) + z1;
            uint z4     = num2 << 10 | num2 >> 22;
            uint num11  = z1 + (blockDWords[2] + RIPEMD160Managed.F(num10, num8, z4));
            uint num12  = (num11 << 15 | num11 >> 17) + z3;
            uint z5     = num8 << 10 | num8 >> 22;
            uint num13  = z3 + (blockDWords[3] + RIPEMD160Managed.F(num12, num10, z5));
            uint num14  = (num13 << 12 | num13 >> 20) + z4;
            uint z6     = num10 << 10 | num10 >> 22;
            uint num15  = z4 + (blockDWords[4] + RIPEMD160Managed.F(num14, num12, z6));
            uint num16  = (num15 << 5 | num15 >> 27) + z5;
            uint z7     = num12 << 10 | num12 >> 22;
            uint num17  = z5 + (blockDWords[5] + RIPEMD160Managed.F(num16, num14, z7));
            uint num18  = (num17 << 8 | num17 >> 24) + z6;
            uint z8     = num14 << 10 | num14 >> 22;
            uint num19  = z6 + (blockDWords[6] + RIPEMD160Managed.F(num18, num16, z8));
            uint num20  = (num19 << 7 | num19 >> 25) + z7;
            uint z9     = num16 << 10 | num16 >> 22;
            uint num21  = z7 + (blockDWords[7] + RIPEMD160Managed.F(num20, num18, z9));
            uint num22  = (num21 << 9 | num21 >> 23) + z8;
            uint z10    = num18 << 10 | num18 >> 22;
            uint num23  = z8 + (blockDWords[8] + RIPEMD160Managed.F(num22, num20, z10));
            uint num24  = (num23 << 11 | num23 >> 21) + z9;
            uint z11    = num20 << 10 | num20 >> 22;
            uint num25  = z9 + (blockDWords[9] + RIPEMD160Managed.F(num24, num22, z11));
            uint num26  = (num25 << 13 | num25 >> 19) + z10;
            uint z12    = num22 << 10 | num22 >> 22;
            uint num27  = z10 + (blockDWords[10] + RIPEMD160Managed.F(num26, num24, z12));
            uint num28  = (num27 << 14 | num27 >> 18) + z11;
            uint z13    = num24 << 10 | num24 >> 22;
            uint num29  = z11 + (blockDWords[11] + RIPEMD160Managed.F(num28, num26, z13));
            uint num30  = (num29 << 15 | num29 >> 17) + z12;
            uint z14    = num26 << 10 | num26 >> 22;
            uint num31  = z12 + (blockDWords[12] + RIPEMD160Managed.F(num30, num28, z14));
            uint num32  = (num31 << 6 | num31 >> 26) + z13;
            uint z15    = num28 << 10 | num28 >> 22;
            uint num33  = z13 + (blockDWords[13] + RIPEMD160Managed.F(num32, num30, z15));
            uint num34  = (num33 << 7 | num33 >> 25) + z14;
            uint z16    = num30 << 10 | num30 >> 22;
            uint num35  = z14 + (blockDWords[14] + RIPEMD160Managed.F(num34, num32, z16));
            uint num36  = (num35 << 9 | num35 >> 23) + z15;
            uint z17    = num32 << 10 | num32 >> 22;
            uint num37  = z15 + (blockDWords[15] + RIPEMD160Managed.F(num36, num34, z17));
            uint num38  = (num37 << 8 | num37 >> 24) + z16;
            uint z18    = num34 << 10 | num34 >> 22;
            uint num39  = z16 + (uint)((int)RIPEMD160Managed.G(num38, num36, z18) + (int)blockDWords[7] + 1518500249);
            uint num40  = (num39 << 7 | num39 >> 25) + z17;
            uint z19    = num36 << 10 | num36 >> 22;
            uint num41  = z17 + (uint)((int)RIPEMD160Managed.G(num40, num38, z19) + (int)blockDWords[4] + 1518500249);
            uint num42  = (num41 << 6 | num41 >> 26) + z18;
            uint z20    = num38 << 10 | num38 >> 22;
            uint num43  = z18 + (uint)((int)RIPEMD160Managed.G(num42, num40, z20) + (int)blockDWords[13] + 1518500249);
            uint num44  = (num43 << 8 | num43 >> 24) + z19;
            uint z21    = num40 << 10 | num40 >> 22;
            uint num45  = z19 + (uint)((int)RIPEMD160Managed.G(num44, num42, z21) + (int)*(uint *)((IntPtr)blockDWords + 4) + 1518500249);
            uint num46  = (num45 << 13 | num45 >> 19) + z20;
            uint z22    = num42 << 10 | num42 >> 22;
            uint num47  = z20 + (uint)((int)RIPEMD160Managed.G(num46, num44, z22) + (int)blockDWords[10] + 1518500249);
            uint num48  = (num47 << 11 | num47 >> 21) + z21;
            uint z23    = num44 << 10 | num44 >> 22;
            uint num49  = z21 + (uint)((int)RIPEMD160Managed.G(num48, num46, z23) + (int)blockDWords[6] + 1518500249);
            uint num50  = (num49 << 9 | num49 >> 23) + z22;
            uint z24    = num46 << 10 | num46 >> 22;
            uint num51  = z22 + (uint)((int)RIPEMD160Managed.G(num50, num48, z24) + (int)blockDWords[15] + 1518500249);
            uint num52  = (num51 << 7 | num51 >> 25) + z23;
            uint z25    = num48 << 10 | num48 >> 22;
            uint num53  = z23 + (uint)((int)RIPEMD160Managed.G(num52, num50, z25) + (int)blockDWords[3] + 1518500249);
            uint num54  = (num53 << 15 | num53 >> 17) + z24;
            uint z26    = num50 << 10 | num50 >> 22;
            uint num55  = z24 + (uint)((int)RIPEMD160Managed.G(num54, num52, z26) + (int)blockDWords[12] + 1518500249);
            uint num56  = (num55 << 7 | num55 >> 25) + z25;
            uint z27    = num52 << 10 | num52 >> 22;
            uint num57  = z25 + (uint)((int)RIPEMD160Managed.G(num56, num54, z27) + (int)*blockDWords + 1518500249);
            uint num58  = (num57 << 12 | num57 >> 20) + z26;
            uint z28    = num54 << 10 | num54 >> 22;
            uint num59  = z26 + (uint)((int)RIPEMD160Managed.G(num58, num56, z28) + (int)blockDWords[9] + 1518500249);
            uint num60  = (num59 << 15 | num59 >> 17) + z27;
            uint z29    = num56 << 10 | num56 >> 22;
            uint num61  = z27 + (uint)((int)RIPEMD160Managed.G(num60, num58, z29) + (int)blockDWords[5] + 1518500249);
            uint num62  = (num61 << 9 | num61 >> 23) + z28;
            uint z30    = num58 << 10 | num58 >> 22;
            uint num63  = z28 + (uint)((int)RIPEMD160Managed.G(num62, num60, z30) + (int)blockDWords[2] + 1518500249);
            uint num64  = (num63 << 11 | num63 >> 21) + z29;
            uint z31    = num60 << 10 | num60 >> 22;
            uint num65  = z29 + (uint)((int)RIPEMD160Managed.G(num64, num62, z31) + (int)blockDWords[14] + 1518500249);
            uint num66  = (num65 << 7 | num65 >> 25) + z30;
            uint z32    = num62 << 10 | num62 >> 22;
            uint num67  = z30 + (uint)((int)RIPEMD160Managed.G(num66, num64, z32) + (int)blockDWords[11] + 1518500249);
            uint num68  = (num67 << 13 | num67 >> 19) + z31;
            uint z33    = num64 << 10 | num64 >> 22;
            uint num69  = z31 + (uint)((int)RIPEMD160Managed.G(num68, num66, z33) + (int)blockDWords[8] + 1518500249);
            uint num70  = (num69 << 12 | num69 >> 20) + z32;
            uint z34    = num66 << 10 | num66 >> 22;
            uint num71  = z32 + (uint)((int)RIPEMD160Managed.H(num70, num68, z34) + (int)blockDWords[3] + 1859775393);
            uint num72  = (num71 << 11 | num71 >> 21) + z33;
            uint z35    = num68 << 10 | num68 >> 22;
            uint num73  = z33 + (uint)((int)RIPEMD160Managed.H(num72, num70, z35) + (int)blockDWords[10] + 1859775393);
            uint num74  = (num73 << 13 | num73 >> 19) + z34;
            uint z36    = num70 << 10 | num70 >> 22;
            uint num75  = z34 + (uint)((int)RIPEMD160Managed.H(num74, num72, z36) + (int)blockDWords[14] + 1859775393);
            uint num76  = (num75 << 6 | num75 >> 26) + z35;
            uint z37    = num72 << 10 | num72 >> 22;
            uint num77  = z35 + (uint)((int)RIPEMD160Managed.H(num76, num74, z37) + (int)blockDWords[4] + 1859775393);
            uint num78  = (num77 << 7 | num77 >> 25) + z36;
            uint z38    = num74 << 10 | num74 >> 22;
            uint num79  = z36 + (uint)((int)RIPEMD160Managed.H(num78, num76, z38) + (int)blockDWords[9] + 1859775393);
            uint num80  = (num79 << 14 | num79 >> 18) + z37;
            uint z39    = num76 << 10 | num76 >> 22;
            uint num81  = z37 + (uint)((int)RIPEMD160Managed.H(num80, num78, z39) + (int)blockDWords[15] + 1859775393);
            uint num82  = (num81 << 9 | num81 >> 23) + z38;
            uint z40    = num78 << 10 | num78 >> 22;
            uint num83  = z38 + (uint)((int)RIPEMD160Managed.H(num82, num80, z40) + (int)blockDWords[8] + 1859775393);
            uint num84  = (num83 << 13 | num83 >> 19) + z39;
            uint z41    = num80 << 10 | num80 >> 22;
            uint num85  = z39 + (uint)((int)RIPEMD160Managed.H(num84, num82, z41) + (int)*(uint *)((IntPtr)blockDWords + 4) + 1859775393);
            uint num86  = (num85 << 15 | num85 >> 17) + z40;
            uint z42    = num82 << 10 | num82 >> 22;
            uint num87  = z40 + (uint)((int)RIPEMD160Managed.H(num86, num84, z42) + (int)blockDWords[2] + 1859775393);
            uint num88  = (num87 << 14 | num87 >> 18) + z41;
            uint z43    = num84 << 10 | num84 >> 22;
            uint num89  = z41 + (uint)((int)RIPEMD160Managed.H(num88, num86, z43) + (int)blockDWords[7] + 1859775393);
            uint num90  = (num89 << 8 | num89 >> 24) + z42;
            uint z44    = num86 << 10 | num86 >> 22;
            uint num91  = z42 + (uint)((int)RIPEMD160Managed.H(num90, num88, z44) + (int)*blockDWords + 1859775393);
            uint num92  = (num91 << 13 | num91 >> 19) + z43;
            uint z45    = num88 << 10 | num88 >> 22;
            uint num93  = z43 + (uint)((int)RIPEMD160Managed.H(num92, num90, z45) + (int)blockDWords[6] + 1859775393);
            uint num94  = (num93 << 6 | num93 >> 26) + z44;
            uint z46    = num90 << 10 | num90 >> 22;
            uint num95  = z44 + (uint)((int)RIPEMD160Managed.H(num94, num92, z46) + (int)blockDWords[13] + 1859775393);
            uint num96  = (num95 << 5 | num95 >> 27) + z45;
            uint z47    = num92 << 10 | num92 >> 22;
            uint num97  = z45 + (uint)((int)RIPEMD160Managed.H(num96, num94, z47) + (int)blockDWords[11] + 1859775393);
            uint num98  = (num97 << 12 | num97 >> 20) + z46;
            uint z48    = num94 << 10 | num94 >> 22;
            uint num99  = z46 + (uint)((int)RIPEMD160Managed.H(num98, num96, z48) + (int)blockDWords[5] + 1859775393);
            uint num100 = (num99 << 7 | num99 >> 25) + z47;
            uint z49    = num96 << 10 | num96 >> 22;
            uint num101 = z47 + (uint)((int)RIPEMD160Managed.H(num100, num98, z49) + (int)blockDWords[12] + 1859775393);
            uint num102 = (num101 << 5 | num101 >> 27) + z48;
            uint z50    = num98 << 10 | num98 >> 22;
            uint num103 = z48 + (uint)((int)RIPEMD160Managed.I(num102, num100, z50) + (int)*(uint *)((IntPtr)blockDWords + 4) - 1894007588);
            uint num104 = (num103 << 11 | num103 >> 21) + z49;
            uint z51    = num100 << 10 | num100 >> 22;
            uint num105 = z49 + (uint)((int)RIPEMD160Managed.I(num104, num102, z51) + (int)blockDWords[9] - 1894007588);
            uint num106 = (num105 << 12 | num105 >> 20) + z50;
            uint z52    = num102 << 10 | num102 >> 22;
            uint num107 = z50 + (uint)((int)RIPEMD160Managed.I(num106, num104, z52) + (int)blockDWords[11] - 1894007588);
            uint num108 = (num107 << 14 | num107 >> 18) + z51;
            uint z53    = num104 << 10 | num104 >> 22;
            uint num109 = z51 + (uint)((int)RIPEMD160Managed.I(num108, num106, z53) + (int)blockDWords[10] - 1894007588);
            uint num110 = (num109 << 15 | num109 >> 17) + z52;
            uint z54    = num106 << 10 | num106 >> 22;
            uint num111 = z52 + (uint)((int)RIPEMD160Managed.I(num110, num108, z54) + (int)*blockDWords - 1894007588);
            uint num112 = (num111 << 14 | num111 >> 18) + z53;
            uint z55    = num108 << 10 | num108 >> 22;
            uint num113 = z53 + (uint)((int)RIPEMD160Managed.I(num112, num110, z55) + (int)blockDWords[8] - 1894007588);
            uint num114 = (num113 << 15 | num113 >> 17) + z54;
            uint z56    = num110 << 10 | num110 >> 22;
            uint num115 = z54 + (uint)((int)RIPEMD160Managed.I(num114, num112, z56) + (int)blockDWords[12] - 1894007588);
            uint num116 = (num115 << 9 | num115 >> 23) + z55;
            uint z57    = num112 << 10 | num112 >> 22;
            uint num117 = z55 + (uint)((int)RIPEMD160Managed.I(num116, num114, z57) + (int)blockDWords[4] - 1894007588);
            uint num118 = (num117 << 8 | num117 >> 24) + z56;
            uint z58    = num114 << 10 | num114 >> 22;
            uint num119 = z56 + (uint)((int)RIPEMD160Managed.I(num118, num116, z58) + (int)blockDWords[13] - 1894007588);
            uint num120 = (num119 << 9 | num119 >> 23) + z57;
            uint z59    = num116 << 10 | num116 >> 22;
            uint num121 = z57 + (uint)((int)RIPEMD160Managed.I(num120, num118, z59) + (int)blockDWords[3] - 1894007588);
            uint num122 = (num121 << 14 | num121 >> 18) + z58;
            uint z60    = num118 << 10 | num118 >> 22;
            uint num123 = z58 + (uint)((int)RIPEMD160Managed.I(num122, num120, z60) + (int)blockDWords[7] - 1894007588);
            uint num124 = (num123 << 5 | num123 >> 27) + z59;
            uint z61    = num120 << 10 | num120 >> 22;
            uint num125 = z59 + (uint)((int)RIPEMD160Managed.I(num124, num122, z61) + (int)blockDWords[15] - 1894007588);
            uint num126 = (num125 << 6 | num125 >> 26) + z60;
            uint z62    = num122 << 10 | num122 >> 22;
            uint num127 = z60 + (uint)((int)RIPEMD160Managed.I(num126, num124, z62) + (int)blockDWords[14] - 1894007588);
            uint num128 = (num127 << 8 | num127 >> 24) + z61;
            uint z63    = num124 << 10 | num124 >> 22;
            uint num129 = z61 + (uint)((int)RIPEMD160Managed.I(num128, num126, z63) + (int)blockDWords[5] - 1894007588);
            uint num130 = (num129 << 6 | num129 >> 26) + z62;
            uint z64    = num126 << 10 | num126 >> 22;
            uint num131 = z62 + (uint)((int)RIPEMD160Managed.I(num130, num128, z64) + (int)blockDWords[6] - 1894007588);
            uint num132 = (num131 << 5 | num131 >> 27) + z63;
            uint z65    = num128 << 10 | num128 >> 22;
            uint num133 = z63 + (uint)((int)RIPEMD160Managed.I(num132, num130, z65) + (int)blockDWords[2] - 1894007588);
            uint num134 = (num133 << 12 | num133 >> 20) + z64;
            uint z66    = num130 << 10 | num130 >> 22;
            uint num135 = z64 + (uint)((int)RIPEMD160Managed.J(num134, num132, z66) + (int)blockDWords[4] - 1454113458);
            uint num136 = (num135 << 9 | num135 >> 23) + z65;
            uint z67    = num132 << 10 | num132 >> 22;
            uint num137 = z65 + (uint)((int)RIPEMD160Managed.J(num136, num134, z67) + (int)*blockDWords - 1454113458);
            uint num138 = (num137 << 15 | num137 >> 17) + z66;
            uint z68    = num134 << 10 | num134 >> 22;
            uint num139 = z66 + (uint)((int)RIPEMD160Managed.J(num138, num136, z68) + (int)blockDWords[5] - 1454113458);
            uint num140 = (num139 << 5 | num139 >> 27) + z67;
            uint z69    = num136 << 10 | num136 >> 22;
            uint num141 = z67 + (uint)((int)RIPEMD160Managed.J(num140, num138, z69) + (int)blockDWords[9] - 1454113458);
            uint num142 = (num141 << 11 | num141 >> 21) + z68;
            uint z70    = num138 << 10 | num138 >> 22;
            uint num143 = z68 + (uint)((int)RIPEMD160Managed.J(num142, num140, z70) + (int)blockDWords[7] - 1454113458);
            uint num144 = (num143 << 6 | num143 >> 26) + z69;
            uint z71    = num140 << 10 | num140 >> 22;
            uint num145 = z69 + (uint)((int)RIPEMD160Managed.J(num144, num142, z71) + (int)blockDWords[12] - 1454113458);
            uint num146 = (num145 << 8 | num145 >> 24) + z70;
            uint z72    = num142 << 10 | num142 >> 22;
            uint num147 = z70 + (uint)((int)RIPEMD160Managed.J(num146, num144, z72) + (int)blockDWords[2] - 1454113458);
            uint num148 = (num147 << 13 | num147 >> 19) + z71;
            uint z73    = num144 << 10 | num144 >> 22;
            uint num149 = z71 + (uint)((int)RIPEMD160Managed.J(num148, num146, z73) + (int)blockDWords[10] - 1454113458);
            uint num150 = (num149 << 12 | num149 >> 20) + z72;
            uint z74    = num146 << 10 | num146 >> 22;
            uint num151 = z72 + (uint)((int)RIPEMD160Managed.J(num150, num148, z74) + (int)blockDWords[14] - 1454113458);
            uint num152 = (num151 << 5 | num151 >> 27) + z73;
            uint z75    = num148 << 10 | num148 >> 22;
            uint num153 = z73 + (uint)((int)RIPEMD160Managed.J(num152, num150, z75) + (int)*(uint *)((IntPtr)blockDWords + 4) - 1454113458);
            uint num154 = (num153 << 12 | num153 >> 20) + z74;
            uint z76    = num150 << 10 | num150 >> 22;
            uint num155 = z74 + (uint)((int)RIPEMD160Managed.J(num154, num152, z76) + (int)blockDWords[3] - 1454113458);
            uint num156 = (num155 << 13 | num155 >> 19) + z75;
            uint z77    = num152 << 10 | num152 >> 22;
            uint num157 = z75 + (uint)((int)RIPEMD160Managed.J(num156, num154, z77) + (int)blockDWords[8] - 1454113458);
            uint num158 = (num157 << 14 | num157 >> 18) + z76;
            uint z78    = num154 << 10 | num154 >> 22;
            uint num159 = z76 + (uint)((int)RIPEMD160Managed.J(num158, num156, z78) + (int)blockDWords[11] - 1454113458);
            uint num160 = (num159 << 11 | num159 >> 21) + z77;
            uint z79    = num156 << 10 | num156 >> 22;
            uint num161 = z77 + (uint)((int)RIPEMD160Managed.J(num160, num158, z79) + (int)blockDWords[6] - 1454113458);
            uint num162 = (num161 << 8 | num161 >> 24) + z78;
            uint z80    = num158 << 10 | num158 >> 22;
            uint num163 = z78 + (uint)((int)RIPEMD160Managed.J(num162, num160, z80) + (int)blockDWords[15] - 1454113458);
            uint x1     = (num163 << 5 | num163 >> 27) + z79;
            uint z81    = num160 << 10 | num160 >> 22;
            uint num164 = z79 + (uint)((int)RIPEMD160Managed.J(x1, num162, z81) + (int)blockDWords[13] - 1454113458);
            uint num165 = (num164 << 6 | num164 >> 26) + z80;
            uint num166 = num162 << 10 | num162 >> 22;
            uint num167 = num4 + (uint)((int)RIPEMD160Managed.J(num5, y2, z2) + (int)blockDWords[5] + 1352829926);
            uint num168 = (num167 << 8 | num167 >> 24) + num6;
            uint z82    = y2 << 10 | y2 >> 22;
            uint num169 = num6 + (uint)((int)RIPEMD160Managed.J(num168, num5, z82) + (int)blockDWords[14] + 1352829926);
            uint num170 = (num169 << 9 | num169 >> 23) + z2;
            uint z83    = num5 << 10 | num5 >> 22;
            uint num171 = z2 + (uint)((int)RIPEMD160Managed.J(num170, num168, z83) + (int)blockDWords[7] + 1352829926);
            uint num172 = (num171 << 9 | num171 >> 23) + z82;
            uint z84    = num168 << 10 | num168 >> 22;
            uint num173 = z82 + (uint)((int)RIPEMD160Managed.J(num172, num170, z84) + (int)*blockDWords + 1352829926);
            uint num174 = (num173 << 11 | num173 >> 21) + z83;
            uint z85    = num170 << 10 | num170 >> 22;
            uint num175 = z83 + (uint)((int)RIPEMD160Managed.J(num174, num172, z85) + (int)blockDWords[9] + 1352829926);
            uint num176 = (num175 << 13 | num175 >> 19) + z84;
            uint z86    = num172 << 10 | num172 >> 22;
            uint num177 = z84 + (uint)((int)RIPEMD160Managed.J(num176, num174, z86) + (int)blockDWords[2] + 1352829926);
            uint num178 = (num177 << 15 | num177 >> 17) + z85;
            uint z87    = num174 << 10 | num174 >> 22;
            uint num179 = z85 + (uint)((int)RIPEMD160Managed.J(num178, num176, z87) + (int)blockDWords[11] + 1352829926);
            uint num180 = (num179 << 15 | num179 >> 17) + z86;
            uint z88    = num176 << 10 | num176 >> 22;
            uint num181 = z86 + (uint)((int)RIPEMD160Managed.J(num180, num178, z88) + (int)blockDWords[4] + 1352829926);
            uint num182 = (num181 << 5 | num181 >> 27) + z87;
            uint z89    = num178 << 10 | num178 >> 22;
            uint num183 = z87 + (uint)((int)RIPEMD160Managed.J(num182, num180, z89) + (int)blockDWords[13] + 1352829926);
            uint num184 = (num183 << 7 | num183 >> 25) + z88;
            uint z90    = num180 << 10 | num180 >> 22;
            uint num185 = z88 + (uint)((int)RIPEMD160Managed.J(num184, num182, z90) + (int)blockDWords[6] + 1352829926);
            uint num186 = (num185 << 7 | num185 >> 25) + z89;
            uint z91    = num182 << 10 | num182 >> 22;
            uint num187 = z89 + (uint)((int)RIPEMD160Managed.J(num186, num184, z91) + (int)blockDWords[15] + 1352829926);
            uint num188 = (num187 << 8 | num187 >> 24) + z90;
            uint z92    = num184 << 10 | num184 >> 22;
            uint num189 = z90 + (uint)((int)RIPEMD160Managed.J(num188, num186, z92) + (int)blockDWords[8] + 1352829926);
            uint num190 = (num189 << 11 | num189 >> 21) + z91;
            uint z93    = num186 << 10 | num186 >> 22;
            uint num191 = z91 + (uint)((int)RIPEMD160Managed.J(num190, num188, z93) + (int)*(uint *)((IntPtr)blockDWords + 4) + 1352829926);
            uint num192 = (num191 << 14 | num191 >> 18) + z92;
            uint z94    = num188 << 10 | num188 >> 22;
            uint num193 = z92 + (uint)((int)RIPEMD160Managed.J(num192, num190, z94) + (int)blockDWords[10] + 1352829926);
            uint num194 = (num193 << 14 | num193 >> 18) + z93;
            uint z95    = num190 << 10 | num190 >> 22;
            uint num195 = z93 + (uint)((int)RIPEMD160Managed.J(num194, num192, z95) + (int)blockDWords[3] + 1352829926);
            uint num196 = (num195 << 12 | num195 >> 20) + z94;
            uint z96    = num192 << 10 | num192 >> 22;
            uint num197 = z94 + (uint)((int)RIPEMD160Managed.J(num196, num194, z96) + (int)blockDWords[12] + 1352829926);
            uint num198 = (num197 << 6 | num197 >> 26) + z95;
            uint z97    = num194 << 10 | num194 >> 22;
            uint num199 = z95 + (uint)((int)RIPEMD160Managed.I(num198, num196, z97) + (int)blockDWords[6] + 1548603684);
            uint num200 = (num199 << 9 | num199 >> 23) + z96;
            uint z98    = num196 << 10 | num196 >> 22;
            uint num201 = z96 + (uint)((int)RIPEMD160Managed.I(num200, num198, z98) + (int)blockDWords[11] + 1548603684);
            uint num202 = (num201 << 13 | num201 >> 19) + z97;
            uint z99    = num198 << 10 | num198 >> 22;
            uint num203 = z97 + (uint)((int)RIPEMD160Managed.I(num202, num200, z99) + (int)blockDWords[3] + 1548603684);
            uint num204 = (num203 << 15 | num203 >> 17) + z98;
            uint z100   = num200 << 10 | num200 >> 22;
            uint num205 = z98 + (uint)((int)RIPEMD160Managed.I(num204, num202, z100) + (int)blockDWords[7] + 1548603684);
            uint num206 = (num205 << 7 | num205 >> 25) + z99;
            uint z101   = num202 << 10 | num202 >> 22;
            uint num207 = z99 + (uint)((int)RIPEMD160Managed.I(num206, num204, z101) + (int)*blockDWords + 1548603684);
            uint num208 = (num207 << 12 | num207 >> 20) + z100;
            uint z102   = num204 << 10 | num204 >> 22;
            uint num209 = z100 + (uint)((int)RIPEMD160Managed.I(num208, num206, z102) + (int)blockDWords[13] + 1548603684);
            uint num210 = (num209 << 8 | num209 >> 24) + z101;
            uint z103   = num206 << 10 | num206 >> 22;
            uint num211 = z101 + (uint)((int)RIPEMD160Managed.I(num210, num208, z103) + (int)blockDWords[5] + 1548603684);
            uint num212 = (num211 << 9 | num211 >> 23) + z102;
            uint z104   = num208 << 10 | num208 >> 22;
            uint num213 = z102 + (uint)((int)RIPEMD160Managed.I(num212, num210, z104) + (int)blockDWords[10] + 1548603684);
            uint num214 = (num213 << 11 | num213 >> 21) + z103;
            uint z105   = num210 << 10 | num210 >> 22;
            uint num215 = z103 + (uint)((int)RIPEMD160Managed.I(num214, num212, z105) + (int)blockDWords[14] + 1548603684);
            uint num216 = (num215 << 7 | num215 >> 25) + z104;
            uint z106   = num212 << 10 | num212 >> 22;
            uint num217 = z104 + (uint)((int)RIPEMD160Managed.I(num216, num214, z106) + (int)blockDWords[15] + 1548603684);
            uint num218 = (num217 << 7 | num217 >> 25) + z105;
            uint z107   = num214 << 10 | num214 >> 22;
            uint num219 = z105 + (uint)((int)RIPEMD160Managed.I(num218, num216, z107) + (int)blockDWords[8] + 1548603684);
            uint num220 = (num219 << 12 | num219 >> 20) + z106;
            uint z108   = num216 << 10 | num216 >> 22;
            uint num221 = z106 + (uint)((int)RIPEMD160Managed.I(num220, num218, z108) + (int)blockDWords[12] + 1548603684);
            uint num222 = (num221 << 7 | num221 >> 25) + z107;
            uint z109   = num218 << 10 | num218 >> 22;
            uint num223 = z107 + (uint)((int)RIPEMD160Managed.I(num222, num220, z109) + (int)blockDWords[4] + 1548603684);
            uint num224 = (num223 << 6 | num223 >> 26) + z108;
            uint z110   = num220 << 10 | num220 >> 22;
            uint num225 = z108 + (uint)((int)RIPEMD160Managed.I(num224, num222, z110) + (int)blockDWords[9] + 1548603684);
            uint num226 = (num225 << 15 | num225 >> 17) + z109;
            uint z111   = num222 << 10 | num222 >> 22;
            uint num227 = z109 + (uint)((int)RIPEMD160Managed.I(num226, num224, z111) + (int)*(uint *)((IntPtr)blockDWords + 4) + 1548603684);
            uint num228 = (num227 << 13 | num227 >> 19) + z110;
            uint z112   = num224 << 10 | num224 >> 22;
            uint num229 = z110 + (uint)((int)RIPEMD160Managed.I(num228, num226, z112) + (int)blockDWords[2] + 1548603684);
            uint num230 = (num229 << 11 | num229 >> 21) + z111;
            uint z113   = num226 << 10 | num226 >> 22;
            uint num231 = z111 + (uint)((int)RIPEMD160Managed.H(num230, num228, z113) + (int)blockDWords[15] + 1836072691);
            uint num232 = (num231 << 9 | num231 >> 23) + z112;
            uint z114   = num228 << 10 | num228 >> 22;
            uint num233 = z112 + (uint)((int)RIPEMD160Managed.H(num232, num230, z114) + (int)blockDWords[5] + 1836072691);
            uint num234 = (num233 << 7 | num233 >> 25) + z113;
            uint z115   = num230 << 10 | num230 >> 22;
            uint num235 = z113 + (uint)((int)RIPEMD160Managed.H(num234, num232, z115) + (int)*(uint *)((IntPtr)blockDWords + 4) + 1836072691);
            uint num236 = (num235 << 15 | num235 >> 17) + z114;
            uint z116   = num232 << 10 | num232 >> 22;
            uint num237 = z114 + (uint)((int)RIPEMD160Managed.H(num236, num234, z116) + (int)blockDWords[3] + 1836072691);
            uint num238 = (num237 << 11 | num237 >> 21) + z115;
            uint z117   = num234 << 10 | num234 >> 22;
            uint num239 = z115 + (uint)((int)RIPEMD160Managed.H(num238, num236, z117) + (int)blockDWords[7] + 1836072691);
            uint num240 = (num239 << 8 | num239 >> 24) + z116;
            uint z118   = num236 << 10 | num236 >> 22;
            uint num241 = z116 + (uint)((int)RIPEMD160Managed.H(num240, num238, z118) + (int)blockDWords[14] + 1836072691);
            uint num242 = (num241 << 6 | num241 >> 26) + z117;
            uint z119   = num238 << 10 | num238 >> 22;
            uint num243 = z117 + (uint)((int)RIPEMD160Managed.H(num242, num240, z119) + (int)blockDWords[6] + 1836072691);
            uint num244 = (num243 << 6 | num243 >> 26) + z118;
            uint z120   = num240 << 10 | num240 >> 22;
            uint num245 = z118 + (uint)((int)RIPEMD160Managed.H(num244, num242, z120) + (int)blockDWords[9] + 1836072691);
            uint num246 = (num245 << 14 | num245 >> 18) + z119;
            uint z121   = num242 << 10 | num242 >> 22;
            uint num247 = z119 + (uint)((int)RIPEMD160Managed.H(num246, num244, z121) + (int)blockDWords[11] + 1836072691);
            uint num248 = (num247 << 12 | num247 >> 20) + z120;
            uint z122   = num244 << 10 | num244 >> 22;
            uint num249 = z120 + (uint)((int)RIPEMD160Managed.H(num248, num246, z122) + (int)blockDWords[8] + 1836072691);
            uint num250 = (num249 << 13 | num249 >> 19) + z121;
            uint z123   = num246 << 10 | num246 >> 22;
            uint num251 = z121 + (uint)((int)RIPEMD160Managed.H(num250, num248, z123) + (int)blockDWords[12] + 1836072691);
            uint num252 = (num251 << 5 | num251 >> 27) + z122;
            uint z124   = num248 << 10 | num248 >> 22;
            uint num253 = z122 + (uint)((int)RIPEMD160Managed.H(num252, num250, z124) + (int)blockDWords[2] + 1836072691);
            uint num254 = (num253 << 14 | num253 >> 18) + z123;
            uint z125   = num250 << 10 | num250 >> 22;
            uint num255 = z123 + (uint)((int)RIPEMD160Managed.H(num254, num252, z125) + (int)blockDWords[10] + 1836072691);
            uint num256 = (num255 << 13 | num255 >> 19) + z124;
            uint z126   = num252 << 10 | num252 >> 22;
            uint num257 = z124 + (uint)((int)RIPEMD160Managed.H(num256, num254, z126) + (int)*blockDWords + 1836072691);
            uint num258 = (num257 << 13 | num257 >> 19) + z125;
            uint z127   = num254 << 10 | num254 >> 22;
            uint num259 = z125 + (uint)((int)RIPEMD160Managed.H(num258, num256, z127) + (int)blockDWords[4] + 1836072691);
            uint num260 = (num259 << 7 | num259 >> 25) + z126;
            uint z128   = num256 << 10 | num256 >> 22;
            uint num261 = z126 + (uint)((int)RIPEMD160Managed.H(num260, num258, z128) + (int)blockDWords[13] + 1836072691);
            uint num262 = (num261 << 5 | num261 >> 27) + z127;
            uint z129   = num258 << 10 | num258 >> 22;
            uint num263 = z127 + (uint)((int)RIPEMD160Managed.G(num262, num260, z129) + (int)blockDWords[8] + 2053994217);
            uint num264 = (num263 << 15 | num263 >> 17) + z128;
            uint z130   = num260 << 10 | num260 >> 22;
            uint num265 = z128 + (uint)((int)RIPEMD160Managed.G(num264, num262, z130) + (int)blockDWords[6] + 2053994217);
            uint num266 = (num265 << 5 | num265 >> 27) + z129;
            uint z131   = num262 << 10 | num262 >> 22;
            uint num267 = z129 + (uint)((int)RIPEMD160Managed.G(num266, num264, z131) + (int)blockDWords[4] + 2053994217);
            uint num268 = (num267 << 8 | num267 >> 24) + z130;
            uint z132   = num264 << 10 | num264 >> 22;
            uint num269 = z130 + (uint)((int)RIPEMD160Managed.G(num268, num266, z132) + (int)*(uint *)((IntPtr)blockDWords + 4) + 2053994217);
            uint num270 = (num269 << 11 | num269 >> 21) + z131;
            uint z133   = num266 << 10 | num266 >> 22;
            uint num271 = z131 + (uint)((int)RIPEMD160Managed.G(num270, num268, z133) + (int)blockDWords[3] + 2053994217);
            uint num272 = (num271 << 14 | num271 >> 18) + z132;
            uint z134   = num268 << 10 | num268 >> 22;
            uint num273 = z132 + (uint)((int)RIPEMD160Managed.G(num272, num270, z134) + (int)blockDWords[11] + 2053994217);
            uint num274 = (num273 << 14 | num273 >> 18) + z133;
            uint z135   = num270 << 10 | num270 >> 22;
            uint num275 = z133 + (uint)((int)RIPEMD160Managed.G(num274, num272, z135) + (int)blockDWords[15] + 2053994217);
            uint num276 = (num275 << 6 | num275 >> 26) + z134;
            uint z136   = num272 << 10 | num272 >> 22;
            uint num277 = z134 + (uint)((int)RIPEMD160Managed.G(num276, num274, z136) + (int)*blockDWords + 2053994217);
            uint num278 = (num277 << 14 | num277 >> 18) + z135;
            uint z137   = num274 << 10 | num274 >> 22;
            uint num279 = z135 + (uint)((int)RIPEMD160Managed.G(num278, num276, z137) + (int)blockDWords[5] + 2053994217);
            uint num280 = (num279 << 6 | num279 >> 26) + z136;
            uint z138   = num276 << 10 | num276 >> 22;
            uint num281 = z136 + (uint)((int)RIPEMD160Managed.G(num280, num278, z138) + (int)blockDWords[12] + 2053994217);
            uint num282 = (num281 << 9 | num281 >> 23) + z137;
            uint z139   = num278 << 10 | num278 >> 22;
            uint num283 = z137 + (uint)((int)RIPEMD160Managed.G(num282, num280, z139) + (int)blockDWords[2] + 2053994217);
            uint num284 = (num283 << 12 | num283 >> 20) + z138;
            uint z140   = num280 << 10 | num280 >> 22;
            uint num285 = z138 + (uint)((int)RIPEMD160Managed.G(num284, num282, z140) + (int)blockDWords[13] + 2053994217);
            uint num286 = (num285 << 9 | num285 >> 23) + z139;
            uint z141   = num282 << 10 | num282 >> 22;
            uint num287 = z139 + (uint)((int)RIPEMD160Managed.G(num286, num284, z141) + (int)blockDWords[9] + 2053994217);
            uint num288 = (num287 << 12 | num287 >> 20) + z140;
            uint z142   = num284 << 10 | num284 >> 22;
            uint num289 = z140 + (uint)((int)RIPEMD160Managed.G(num288, num286, z142) + (int)blockDWords[7] + 2053994217);
            uint num290 = (num289 << 5 | num289 >> 27) + z141;
            uint z143   = num286 << 10 | num286 >> 22;
            uint num291 = z141 + (uint)((int)RIPEMD160Managed.G(num290, num288, z143) + (int)blockDWords[10] + 2053994217);
            uint num292 = (num291 << 15 | num291 >> 17) + z142;
            uint z144   = num288 << 10 | num288 >> 22;
            uint num293 = z142 + (uint)((int)RIPEMD160Managed.G(num292, num290, z144) + (int)blockDWords[14] + 2053994217);
            uint num294 = (num293 << 8 | num293 >> 24) + z143;
            uint z145   = num290 << 10 | num290 >> 22;
            uint num295 = z143 + (RIPEMD160Managed.F(num294, num292, z145) + blockDWords[12]);
            uint num296 = (num295 << 8 | num295 >> 24) + z144;
            uint z146   = num292 << 10 | num292 >> 22;
            uint num297 = z144 + (RIPEMD160Managed.F(num296, num294, z146) + blockDWords[15]);
            uint num298 = (num297 << 5 | num297 >> 27) + z145;
            uint z147   = num294 << 10 | num294 >> 22;
            uint num299 = z145 + (RIPEMD160Managed.F(num298, num296, z147) + blockDWords[10]);
            uint num300 = (num299 << 12 | num299 >> 20) + z146;
            uint z148   = num296 << 10 | num296 >> 22;
            uint num301 = z146 + (RIPEMD160Managed.F(num300, num298, z148) + blockDWords[4]);
            uint num302 = (num301 << 9 | num301 >> 23) + z147;
            uint z149   = num298 << 10 | num298 >> 22;
            uint num303 = z147 + (RIPEMD160Managed.F(num302, num300, z149) + *(uint *)((IntPtr)blockDWords + 4));
            uint num304 = (num303 << 12 | num303 >> 20) + z148;
            uint z150   = num300 << 10 | num300 >> 22;
            uint num305 = z148 + (RIPEMD160Managed.F(num304, num302, z150) + blockDWords[5]);
            uint num306 = (num305 << 5 | num305 >> 27) + z149;
            uint z151   = num302 << 10 | num302 >> 22;
            uint num307 = z149 + (RIPEMD160Managed.F(num306, num304, z151) + blockDWords[8]);
            uint num308 = (num307 << 14 | num307 >> 18) + z150;
            uint z152   = num304 << 10 | num304 >> 22;
            uint num309 = z150 + (RIPEMD160Managed.F(num308, num306, z152) + blockDWords[7]);
            uint num310 = (num309 << 6 | num309 >> 26) + z151;
            uint z153   = num306 << 10 | num306 >> 22;
            uint num311 = z151 + (RIPEMD160Managed.F(num310, num308, z153) + blockDWords[6]);
            uint num312 = (num311 << 8 | num311 >> 24) + z152;
            uint z154   = num308 << 10 | num308 >> 22;
            uint num313 = z152 + (RIPEMD160Managed.F(num312, num310, z154) + blockDWords[2]);
            uint num314 = (num313 << 13 | num313 >> 19) + z153;
            uint z155   = num310 << 10 | num310 >> 22;
            uint num315 = z153 + (RIPEMD160Managed.F(num314, num312, z155) + blockDWords[13]);
            uint num316 = (num315 << 6 | num315 >> 26) + z154;
            uint z156   = num312 << 10 | num312 >> 22;
            uint num317 = z154 + (RIPEMD160Managed.F(num316, num314, z156) + blockDWords[14]);
            uint num318 = (num317 << 5 | num317 >> 27) + z155;
            uint z157   = num314 << 10 | num314 >> 22;
            uint num319 = z155 + (RIPEMD160Managed.F(num318, num316, z157) + *blockDWords);
            uint num320 = (num319 << 15 | num319 >> 17) + z156;
            uint z158   = num316 << 10 | num316 >> 22;
            uint num321 = z156 + (RIPEMD160Managed.F(num320, num318, z158) + blockDWords[3]);
            uint num322 = (num321 << 13 | num321 >> 19) + z157;
            uint z159   = num318 << 10 | num318 >> 22;
            uint num323 = z157 + (RIPEMD160Managed.F(num322, num320, z159) + blockDWords[9]);
            uint x2     = (num323 << 11 | num323 >> 21) + z158;
            uint z160   = num320 << 10 | num320 >> 22;
            uint num324 = z158 + (RIPEMD160Managed.F(x2, num322, z160) + blockDWords[11]);
            uint num325 = (num324 << 11 | num324 >> 21) + z159;
            uint num326 = (num322 << 10 | num322 >> 22) + (x1 + *(uint *)((IntPtr)state + 4));

            *(int *)((IntPtr)state + 4) = (int)state[2] + (int)num166 + (int)z160;
            state[2] = state[3] + z81 + z159;
            state[3] = state[4] + z80 + num325;
            state[4] = *state + num165 + x2;
            *state = num326;
        }
Ejemplo n.º 2
0
        private static unsafe void MDTransform(uint *blockDWords, uint *state, byte *block)
        {
            uint x     = state[0];
            uint num2  = state[1];
            uint y     = state[2];
            uint z     = state[3];
            uint num5  = state[4];
            uint num6  = x;
            uint num7  = num2;
            uint num8  = y;
            uint num9  = z;
            uint num10 = num5;

            Utils.DWORDFromLittleEndian(blockDWords, 0x10, block);
            x       += blockDWords[0] + F(num2, y, z);
            x        = ((x << 11) | (x >> 0x15)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += blockDWords[1] + F(x, num2, y);
            num5     = ((num5 << 14) | (num5 >> 0x12)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += blockDWords[2] + F(num5, x, num2);
            z        = ((z << 15) | (z >> 0x11)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += blockDWords[3] + F(z, num5, x);
            y        = ((y << 12) | (y >> 20)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += blockDWords[4] + F(y, z, num5);
            num2     = ((num2 << 5) | (num2 >> 0x1b)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += blockDWords[5] + F(num2, y, z);
            x        = ((x << 8) | (x >> 0x18)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += blockDWords[6] + F(x, num2, y);
            num5     = ((num5 << 7) | (num5 >> 0x19)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += blockDWords[7] + F(num5, x, num2);
            z        = ((z << 9) | (z >> 0x17)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += blockDWords[8] + F(z, num5, x);
            y        = ((y << 11) | (y >> 0x15)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += blockDWords[9] + F(y, z, num5);
            num2     = ((num2 << 13) | (num2 >> 0x13)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += blockDWords[10] + F(num2, y, z);
            x        = ((x << 14) | (x >> 0x12)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += blockDWords[11] + F(x, num2, y);
            num5     = ((num5 << 15) | (num5 >> 0x11)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += blockDWords[12] + F(num5, x, num2);
            z        = ((z << 6) | (z >> 0x1a)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += blockDWords[13] + F(z, num5, x);
            y        = ((y << 7) | (y >> 0x19)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += blockDWords[14] + F(y, z, num5);
            num2     = ((num2 << 9) | (num2 >> 0x17)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += blockDWords[15] + F(num2, y, z);
            x        = ((x << 8) | (x >> 0x18)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (G(x, num2, y) + blockDWords[7]) + 0x5a827999;
            num5     = ((num5 << 7) | (num5 >> 0x19)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (G(num5, x, num2) + blockDWords[4]) + 0x5a827999;
            z        = ((z << 6) | (z >> 0x1a)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (G(z, num5, x) + blockDWords[13]) + 0x5a827999;
            y        = ((y << 8) | (y >> 0x18)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (G(y, z, num5) + blockDWords[1]) + 0x5a827999;
            num2     = ((num2 << 13) | (num2 >> 0x13)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += (G(num2, y, z) + blockDWords[10]) + 0x5a827999;
            x        = ((x << 11) | (x >> 0x15)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (G(x, num2, y) + blockDWords[6]) + 0x5a827999;
            num5     = ((num5 << 9) | (num5 >> 0x17)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (G(num5, x, num2) + blockDWords[15]) + 0x5a827999;
            z        = ((z << 7) | (z >> 0x19)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (G(z, num5, x) + blockDWords[3]) + 0x5a827999;
            y        = ((y << 15) | (y >> 0x11)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (G(y, z, num5) + blockDWords[12]) + 0x5a827999;
            num2     = ((num2 << 7) | (num2 >> 0x19)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += (G(num2, y, z) + blockDWords[0]) + 0x5a827999;
            x        = ((x << 12) | (x >> 20)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (G(x, num2, y) + blockDWords[9]) + 0x5a827999;
            num5     = ((num5 << 15) | (num5 >> 0x11)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (G(num5, x, num2) + blockDWords[5]) + 0x5a827999;
            z        = ((z << 9) | (z >> 0x17)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (G(z, num5, x) + blockDWords[2]) + 0x5a827999;
            y        = ((y << 11) | (y >> 0x15)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (G(y, z, num5) + blockDWords[14]) + 0x5a827999;
            num2     = ((num2 << 7) | (num2 >> 0x19)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += (G(num2, y, z) + blockDWords[11]) + 0x5a827999;
            x        = ((x << 13) | (x >> 0x13)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (G(x, num2, y) + blockDWords[8]) + 0x5a827999;
            num5     = ((num5 << 12) | (num5 >> 20)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (H(num5, x, num2) + blockDWords[3]) + 0x6ed9eba1;
            z        = ((z << 11) | (z >> 0x15)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (H(z, num5, x) + blockDWords[10]) + 0x6ed9eba1;
            y        = ((y << 13) | (y >> 0x13)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (H(y, z, num5) + blockDWords[14]) + 0x6ed9eba1;
            num2     = ((num2 << 6) | (num2 >> 0x1a)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += (H(num2, y, z) + blockDWords[4]) + 0x6ed9eba1;
            x        = ((x << 7) | (x >> 0x19)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (H(x, num2, y) + blockDWords[9]) + 0x6ed9eba1;
            num5     = ((num5 << 14) | (num5 >> 0x12)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (H(num5, x, num2) + blockDWords[15]) + 0x6ed9eba1;
            z        = ((z << 9) | (z >> 0x17)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (H(z, num5, x) + blockDWords[8]) + 0x6ed9eba1;
            y        = ((y << 13) | (y >> 0x13)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (H(y, z, num5) + blockDWords[1]) + 0x6ed9eba1;
            num2     = ((num2 << 15) | (num2 >> 0x11)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += (H(num2, y, z) + blockDWords[2]) + 0x6ed9eba1;
            x        = ((x << 14) | (x >> 0x12)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (H(x, num2, y) + blockDWords[7]) + 0x6ed9eba1;
            num5     = ((num5 << 8) | (num5 >> 0x18)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (H(num5, x, num2) + blockDWords[0]) + 0x6ed9eba1;
            z        = ((z << 13) | (z >> 0x13)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (H(z, num5, x) + blockDWords[6]) + 0x6ed9eba1;
            y        = ((y << 6) | (y >> 0x1a)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (H(y, z, num5) + blockDWords[13]) + 0x6ed9eba1;
            num2     = ((num2 << 5) | (num2 >> 0x1b)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += (H(num2, y, z) + blockDWords[11]) + 0x6ed9eba1;
            x        = ((x << 12) | (x >> 20)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (H(x, num2, y) + blockDWords[5]) + 0x6ed9eba1;
            num5     = ((num5 << 7) | (num5 >> 0x19)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (H(num5, x, num2) + blockDWords[12]) + 0x6ed9eba1;
            z        = ((z << 5) | (z >> 0x1b)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (I(z, num5, x) + blockDWords[1]) + 0x8f1bbcdc;
            y        = ((y << 11) | (y >> 0x15)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (I(y, z, num5) + blockDWords[9]) + 0x8f1bbcdc;
            num2     = ((num2 << 12) | (num2 >> 20)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += (I(num2, y, z) + blockDWords[11]) + 0x8f1bbcdc;
            x        = ((x << 14) | (x >> 0x12)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (I(x, num2, y) + blockDWords[10]) + 0x8f1bbcdc;
            num5     = ((num5 << 15) | (num5 >> 0x11)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (I(num5, x, num2) + blockDWords[0]) + 0x8f1bbcdc;
            z        = ((z << 14) | (z >> 0x12)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (I(z, num5, x) + blockDWords[8]) + 0x8f1bbcdc;
            y        = ((y << 15) | (y >> 0x11)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (I(y, z, num5) + blockDWords[12]) + 0x8f1bbcdc;
            num2     = ((num2 << 9) | (num2 >> 0x17)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += (I(num2, y, z) + blockDWords[4]) + 0x8f1bbcdc;
            x        = ((x << 8) | (x >> 0x18)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (I(x, num2, y) + blockDWords[13]) + 0x8f1bbcdc;
            num5     = ((num5 << 9) | (num5 >> 0x17)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (I(num5, x, num2) + blockDWords[3]) + 0x8f1bbcdc;
            z        = ((z << 14) | (z >> 0x12)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (I(z, num5, x) + blockDWords[7]) + 0x8f1bbcdc;
            y        = ((y << 5) | (y >> 0x1b)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (I(y, z, num5) + blockDWords[15]) + 0x8f1bbcdc;
            num2     = ((num2 << 6) | (num2 >> 0x1a)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += (I(num2, y, z) + blockDWords[14]) + 0x8f1bbcdc;
            x        = ((x << 8) | (x >> 0x18)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (I(x, num2, y) + blockDWords[5]) + 0x8f1bbcdc;
            num5     = ((num5 << 6) | (num5 >> 0x1a)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (I(num5, x, num2) + blockDWords[6]) + 0x8f1bbcdc;
            z        = ((z << 5) | (z >> 0x1b)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (I(z, num5, x) + blockDWords[2]) + 0x8f1bbcdc;
            y        = ((y << 12) | (y >> 20)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (J(y, z, num5) + blockDWords[4]) + 0xa953fd4e;
            num2     = ((num2 << 9) | (num2 >> 0x17)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += (J(num2, y, z) + blockDWords[0]) + 0xa953fd4e;
            x        = ((x << 15) | (x >> 0x11)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (J(x, num2, y) + blockDWords[5]) + 0xa953fd4e;
            num5     = ((num5 << 5) | (num5 >> 0x1b)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (J(num5, x, num2) + blockDWords[9]) + 0xa953fd4e;
            z        = ((z << 11) | (z >> 0x15)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (J(z, num5, x) + blockDWords[7]) + 0xa953fd4e;
            y        = ((y << 6) | (y >> 0x1a)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (J(y, z, num5) + blockDWords[12]) + 0xa953fd4e;
            num2     = ((num2 << 8) | (num2 >> 0x18)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += (J(num2, y, z) + blockDWords[2]) + 0xa953fd4e;
            x        = ((x << 13) | (x >> 0x13)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (J(x, num2, y) + blockDWords[10]) + 0xa953fd4e;
            num5     = ((num5 << 12) | (num5 >> 20)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (J(num5, x, num2) + blockDWords[14]) + 0xa953fd4e;
            z        = ((z << 5) | (z >> 0x1b)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (J(z, num5, x) + blockDWords[1]) + 0xa953fd4e;
            y        = ((y << 12) | (y >> 20)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (J(y, z, num5) + blockDWords[3]) + 0xa953fd4e;
            num2     = ((num2 << 13) | (num2 >> 0x13)) + x;
            z        = (z << 10) | (z >> 0x16);
            x       += (J(num2, y, z) + blockDWords[8]) + 0xa953fd4e;
            x        = ((x << 14) | (x >> 0x12)) + num5;
            y        = (y << 10) | (y >> 0x16);
            num5    += (J(x, num2, y) + blockDWords[11]) + 0xa953fd4e;
            num5     = ((num5 << 11) | (num5 >> 0x15)) + z;
            num2     = (num2 << 10) | (num2 >> 0x16);
            z       += (J(num5, x, num2) + blockDWords[6]) + 0xa953fd4e;
            z        = ((z << 8) | (z >> 0x18)) + y;
            x        = (x << 10) | (x >> 0x16);
            y       += (J(z, num5, x) + blockDWords[15]) + 0xa953fd4e;
            y        = ((y << 5) | (y >> 0x1b)) + num2;
            num5     = (num5 << 10) | (num5 >> 0x16);
            num2    += (J(y, z, num5) + blockDWords[13]) + 0xa953fd4e;
            num2     = ((num2 << 6) | (num2 >> 0x1a)) + x;
            z        = (z << 10) | (z >> 0x16);
            num6    += (J(num7, num8, num9) + blockDWords[5]) + 0x50a28be6;
            num6     = ((num6 << 8) | (num6 >> 0x18)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (J(num6, num7, num8) + blockDWords[14]) + 0x50a28be6;
            num10    = ((num10 << 9) | (num10 >> 0x17)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (J(num10, num6, num7) + blockDWords[7]) + 0x50a28be6;
            num9     = ((num9 << 9) | (num9 >> 0x17)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (J(num9, num10, num6) + blockDWords[0]) + 0x50a28be6;
            num8     = ((num8 << 11) | (num8 >> 0x15)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += (J(num8, num9, num10) + blockDWords[9]) + 0x50a28be6;
            num7     = ((num7 << 13) | (num7 >> 0x13)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += (J(num7, num8, num9) + blockDWords[2]) + 0x50a28be6;
            num6     = ((num6 << 15) | (num6 >> 0x11)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (J(num6, num7, num8) + blockDWords[11]) + 0x50a28be6;
            num10    = ((num10 << 15) | (num10 >> 0x11)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (J(num10, num6, num7) + blockDWords[4]) + 0x50a28be6;
            num9     = ((num9 << 5) | (num9 >> 0x1b)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (J(num9, num10, num6) + blockDWords[13]) + 0x50a28be6;
            num8     = ((num8 << 7) | (num8 >> 0x19)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += (J(num8, num9, num10) + blockDWords[6]) + 0x50a28be6;
            num7     = ((num7 << 7) | (num7 >> 0x19)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += (J(num7, num8, num9) + blockDWords[15]) + 0x50a28be6;
            num6     = ((num6 << 8) | (num6 >> 0x18)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (J(num6, num7, num8) + blockDWords[8]) + 0x50a28be6;
            num10    = ((num10 << 11) | (num10 >> 0x15)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (J(num10, num6, num7) + blockDWords[1]) + 0x50a28be6;
            num9     = ((num9 << 14) | (num9 >> 0x12)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (J(num9, num10, num6) + blockDWords[10]) + 0x50a28be6;
            num8     = ((num8 << 14) | (num8 >> 0x12)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += (J(num8, num9, num10) + blockDWords[3]) + 0x50a28be6;
            num7     = ((num7 << 12) | (num7 >> 20)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += (J(num7, num8, num9) + blockDWords[12]) + 0x50a28be6;
            num6     = ((num6 << 6) | (num6 >> 0x1a)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (I(num6, num7, num8) + blockDWords[6]) + 0x5c4dd124;
            num10    = ((num10 << 9) | (num10 >> 0x17)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (I(num10, num6, num7) + blockDWords[11]) + 0x5c4dd124;
            num9     = ((num9 << 13) | (num9 >> 0x13)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (I(num9, num10, num6) + blockDWords[3]) + 0x5c4dd124;
            num8     = ((num8 << 15) | (num8 >> 0x11)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += (I(num8, num9, num10) + blockDWords[7]) + 0x5c4dd124;
            num7     = ((num7 << 7) | (num7 >> 0x19)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += (I(num7, num8, num9) + blockDWords[0]) + 0x5c4dd124;
            num6     = ((num6 << 12) | (num6 >> 20)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (I(num6, num7, num8) + blockDWords[13]) + 0x5c4dd124;
            num10    = ((num10 << 8) | (num10 >> 0x18)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (I(num10, num6, num7) + blockDWords[5]) + 0x5c4dd124;
            num9     = ((num9 << 9) | (num9 >> 0x17)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (I(num9, num10, num6) + blockDWords[10]) + 0x5c4dd124;
            num8     = ((num8 << 11) | (num8 >> 0x15)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += (I(num8, num9, num10) + blockDWords[14]) + 0x5c4dd124;
            num7     = ((num7 << 7) | (num7 >> 0x19)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += (I(num7, num8, num9) + blockDWords[15]) + 0x5c4dd124;
            num6     = ((num6 << 7) | (num6 >> 0x19)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (I(num6, num7, num8) + blockDWords[8]) + 0x5c4dd124;
            num10    = ((num10 << 12) | (num10 >> 20)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (I(num10, num6, num7) + blockDWords[12]) + 0x5c4dd124;
            num9     = ((num9 << 7) | (num9 >> 0x19)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (I(num9, num10, num6) + blockDWords[4]) + 0x5c4dd124;
            num8     = ((num8 << 6) | (num8 >> 0x1a)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += (I(num8, num9, num10) + blockDWords[9]) + 0x5c4dd124;
            num7     = ((num7 << 15) | (num7 >> 0x11)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += (I(num7, num8, num9) + blockDWords[1]) + 0x5c4dd124;
            num6     = ((num6 << 13) | (num6 >> 0x13)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (I(num6, num7, num8) + blockDWords[2]) + 0x5c4dd124;
            num10    = ((num10 << 11) | (num10 >> 0x15)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (H(num10, num6, num7) + blockDWords[15]) + 0x6d703ef3;
            num9     = ((num9 << 9) | (num9 >> 0x17)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (H(num9, num10, num6) + blockDWords[5]) + 0x6d703ef3;
            num8     = ((num8 << 7) | (num8 >> 0x19)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += (H(num8, num9, num10) + blockDWords[1]) + 0x6d703ef3;
            num7     = ((num7 << 15) | (num7 >> 0x11)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += (H(num7, num8, num9) + blockDWords[3]) + 0x6d703ef3;
            num6     = ((num6 << 11) | (num6 >> 0x15)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (H(num6, num7, num8) + blockDWords[7]) + 0x6d703ef3;
            num10    = ((num10 << 8) | (num10 >> 0x18)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (H(num10, num6, num7) + blockDWords[14]) + 0x6d703ef3;
            num9     = ((num9 << 6) | (num9 >> 0x1a)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (H(num9, num10, num6) + blockDWords[6]) + 0x6d703ef3;
            num8     = ((num8 << 6) | (num8 >> 0x1a)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += (H(num8, num9, num10) + blockDWords[9]) + 0x6d703ef3;
            num7     = ((num7 << 14) | (num7 >> 0x12)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += (H(num7, num8, num9) + blockDWords[11]) + 0x6d703ef3;
            num6     = ((num6 << 12) | (num6 >> 20)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (H(num6, num7, num8) + blockDWords[8]) + 0x6d703ef3;
            num10    = ((num10 << 13) | (num10 >> 0x13)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (H(num10, num6, num7) + blockDWords[12]) + 0x6d703ef3;
            num9     = ((num9 << 5) | (num9 >> 0x1b)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (H(num9, num10, num6) + blockDWords[2]) + 0x6d703ef3;
            num8     = ((num8 << 14) | (num8 >> 0x12)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += (H(num8, num9, num10) + blockDWords[10]) + 0x6d703ef3;
            num7     = ((num7 << 13) | (num7 >> 0x13)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += (H(num7, num8, num9) + blockDWords[0]) + 0x6d703ef3;
            num6     = ((num6 << 13) | (num6 >> 0x13)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (H(num6, num7, num8) + blockDWords[4]) + 0x6d703ef3;
            num10    = ((num10 << 7) | (num10 >> 0x19)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (H(num10, num6, num7) + blockDWords[13]) + 0x6d703ef3;
            num9     = ((num9 << 5) | (num9 >> 0x1b)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (G(num9, num10, num6) + blockDWords[8]) + 0x7a6d76e9;
            num8     = ((num8 << 15) | (num8 >> 0x11)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += (G(num8, num9, num10) + blockDWords[6]) + 0x7a6d76e9;
            num7     = ((num7 << 5) | (num7 >> 0x1b)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += (G(num7, num8, num9) + blockDWords[4]) + 0x7a6d76e9;
            num6     = ((num6 << 8) | (num6 >> 0x18)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (G(num6, num7, num8) + blockDWords[1]) + 0x7a6d76e9;
            num10    = ((num10 << 11) | (num10 >> 0x15)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (G(num10, num6, num7) + blockDWords[3]) + 0x7a6d76e9;
            num9     = ((num9 << 14) | (num9 >> 0x12)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (G(num9, num10, num6) + blockDWords[11]) + 0x7a6d76e9;
            num8     = ((num8 << 14) | (num8 >> 0x12)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += (G(num8, num9, num10) + blockDWords[15]) + 0x7a6d76e9;
            num7     = ((num7 << 6) | (num7 >> 0x1a)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += (G(num7, num8, num9) + blockDWords[0]) + 0x7a6d76e9;
            num6     = ((num6 << 14) | (num6 >> 0x12)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (G(num6, num7, num8) + blockDWords[5]) + 0x7a6d76e9;
            num10    = ((num10 << 6) | (num10 >> 0x1a)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (G(num10, num6, num7) + blockDWords[12]) + 0x7a6d76e9;
            num9     = ((num9 << 9) | (num9 >> 0x17)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (G(num9, num10, num6) + blockDWords[2]) + 0x7a6d76e9;
            num8     = ((num8 << 12) | (num8 >> 20)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += (G(num8, num9, num10) + blockDWords[13]) + 0x7a6d76e9;
            num7     = ((num7 << 9) | (num7 >> 0x17)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += (G(num7, num8, num9) + blockDWords[9]) + 0x7a6d76e9;
            num6     = ((num6 << 12) | (num6 >> 20)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += (G(num6, num7, num8) + blockDWords[7]) + 0x7a6d76e9;
            num10    = ((num10 << 5) | (num10 >> 0x1b)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += (G(num10, num6, num7) + blockDWords[10]) + 0x7a6d76e9;
            num9     = ((num9 << 15) | (num9 >> 0x11)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += (G(num9, num10, num6) + blockDWords[14]) + 0x7a6d76e9;
            num8     = ((num8 << 8) | (num8 >> 0x18)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += F(num8, num9, num10) + blockDWords[12];
            num7     = ((num7 << 8) | (num7 >> 0x18)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += F(num7, num8, num9) + blockDWords[15];
            num6     = ((num6 << 5) | (num6 >> 0x1b)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += F(num6, num7, num8) + blockDWords[10];
            num10    = ((num10 << 12) | (num10 >> 20)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += F(num10, num6, num7) + blockDWords[4];
            num9     = ((num9 << 9) | (num9 >> 0x17)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += F(num9, num10, num6) + blockDWords[1];
            num8     = ((num8 << 12) | (num8 >> 20)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += F(num8, num9, num10) + blockDWords[5];
            num7     = ((num7 << 5) | (num7 >> 0x1b)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += F(num7, num8, num9) + blockDWords[8];
            num6     = ((num6 << 14) | (num6 >> 0x12)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += F(num6, num7, num8) + blockDWords[7];
            num10    = ((num10 << 6) | (num10 >> 0x1a)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += F(num10, num6, num7) + blockDWords[6];
            num9     = ((num9 << 8) | (num9 >> 0x18)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += F(num9, num10, num6) + blockDWords[2];
            num8     = ((num8 << 13) | (num8 >> 0x13)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += F(num8, num9, num10) + blockDWords[13];
            num7     = ((num7 << 6) | (num7 >> 0x1a)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num6    += F(num7, num8, num9) + blockDWords[14];
            num6     = ((num6 << 5) | (num6 >> 0x1b)) + num10;
            num8     = (num8 << 10) | (num8 >> 0x16);
            num10   += F(num6, num7, num8) + blockDWords[0];
            num10    = ((num10 << 15) | (num10 >> 0x11)) + num9;
            num7     = (num7 << 10) | (num7 >> 0x16);
            num9    += F(num10, num6, num7) + blockDWords[3];
            num9     = ((num9 << 13) | (num9 >> 0x13)) + num8;
            num6     = (num6 << 10) | (num6 >> 0x16);
            num8    += F(num9, num10, num6) + blockDWords[9];
            num8     = ((num8 << 11) | (num8 >> 0x15)) + num7;
            num10    = (num10 << 10) | (num10 >> 0x16);
            num7    += F(num8, num9, num10) + blockDWords[11];
            num7     = ((num7 << 11) | (num7 >> 0x15)) + num6;
            num9     = (num9 << 10) | (num9 >> 0x16);
            num9    += y + state[1];
            state[1] = (state[2] + z) + num10;
            state[2] = (state[3] + num5) + num6;
            state[3] = (state[4] + x) + num7;
            state[4] = (state[0] + num2) + num8;
            state[0] = num9;
        }
Ejemplo n.º 3
0
        [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;
        }
Ejemplo n.º 4
0
        private unsafe static void MDTransform(uint *blockDWords, uint *state, byte *block)
        {
            uint num   = *state;
            uint num2  = state[1];
            uint num3  = state[2];
            uint num4  = state[3];
            uint num5  = state[4];
            uint num6  = num;
            uint num7  = num2;
            uint num8  = num3;
            uint num9  = num4;
            uint num10 = num5;

            Utils.DWORDFromLittleEndian(blockDWords, 16, block);
            num     += *blockDWords + RIPEMD160Managed.F(num2, num3, num4);
            num      = (num << 11 | num >> 21) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += blockDWords[1] + RIPEMD160Managed.F(num, num2, num3);
            num5     = (num5 << 14 | num5 >> 18) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += blockDWords[2] + RIPEMD160Managed.F(num5, num, num2);
            num4     = (num4 << 15 | num4 >> 17) + num3;
            num      = (num << 10 | num >> 22);
            num3    += blockDWords[3] + RIPEMD160Managed.F(num4, num5, num);
            num3     = (num3 << 12 | num3 >> 20) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += blockDWords[4] + RIPEMD160Managed.F(num3, num4, num5);
            num2     = (num2 << 5 | num2 >> 27) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += blockDWords[5] + RIPEMD160Managed.F(num2, num3, num4);
            num      = (num << 8 | num >> 24) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += blockDWords[6] + RIPEMD160Managed.F(num, num2, num3);
            num5     = (num5 << 7 | num5 >> 25) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += blockDWords[7] + RIPEMD160Managed.F(num5, num, num2);
            num4     = (num4 << 9 | num4 >> 23) + num3;
            num      = (num << 10 | num >> 22);
            num3    += blockDWords[8] + RIPEMD160Managed.F(num4, num5, num);
            num3     = (num3 << 11 | num3 >> 21) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += blockDWords[9] + RIPEMD160Managed.F(num3, num4, num5);
            num2     = (num2 << 13 | num2 >> 19) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += blockDWords[10] + RIPEMD160Managed.F(num2, num3, num4);
            num      = (num << 14 | num >> 18) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += blockDWords[11] + RIPEMD160Managed.F(num, num2, num3);
            num5     = (num5 << 15 | num5 >> 17) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += blockDWords[12] + RIPEMD160Managed.F(num5, num, num2);
            num4     = (num4 << 6 | num4 >> 26) + num3;
            num      = (num << 10 | num >> 22);
            num3    += blockDWords[13] + RIPEMD160Managed.F(num4, num5, num);
            num3     = (num3 << 7 | num3 >> 25) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += blockDWords[14] + RIPEMD160Managed.F(num3, num4, num5);
            num2     = (num2 << 9 | num2 >> 23) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += blockDWords[15] + RIPEMD160Managed.F(num2, num3, num4);
            num      = (num << 8 | num >> 24) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.G(num, num2, num3) + blockDWords[7] + 1518500249U;
            num5     = (num5 << 7 | num5 >> 25) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.G(num5, num, num2) + blockDWords[4] + 1518500249U;
            num4     = (num4 << 6 | num4 >> 26) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.G(num4, num5, num) + blockDWords[13] + 1518500249U;
            num3     = (num3 << 8 | num3 >> 24) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.G(num3, num4, num5) + blockDWords[1] + 1518500249U;
            num2     = (num2 << 13 | num2 >> 19) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += RIPEMD160Managed.G(num2, num3, num4) + blockDWords[10] + 1518500249U;
            num      = (num << 11 | num >> 21) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.G(num, num2, num3) + blockDWords[6] + 1518500249U;
            num5     = (num5 << 9 | num5 >> 23) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.G(num5, num, num2) + blockDWords[15] + 1518500249U;
            num4     = (num4 << 7 | num4 >> 25) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.G(num4, num5, num) + blockDWords[3] + 1518500249U;
            num3     = (num3 << 15 | num3 >> 17) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.G(num3, num4, num5) + blockDWords[12] + 1518500249U;
            num2     = (num2 << 7 | num2 >> 25) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += RIPEMD160Managed.G(num2, num3, num4) + *blockDWords + 1518500249U;
            num      = (num << 12 | num >> 20) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.G(num, num2, num3) + blockDWords[9] + 1518500249U;
            num5     = (num5 << 15 | num5 >> 17) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.G(num5, num, num2) + blockDWords[5] + 1518500249U;
            num4     = (num4 << 9 | num4 >> 23) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.G(num4, num5, num) + blockDWords[2] + 1518500249U;
            num3     = (num3 << 11 | num3 >> 21) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.G(num3, num4, num5) + blockDWords[14] + 1518500249U;
            num2     = (num2 << 7 | num2 >> 25) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += RIPEMD160Managed.G(num2, num3, num4) + blockDWords[11] + 1518500249U;
            num      = (num << 13 | num >> 19) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.G(num, num2, num3) + blockDWords[8] + 1518500249U;
            num5     = (num5 << 12 | num5 >> 20) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.H(num5, num, num2) + blockDWords[3] + 1859775393U;
            num4     = (num4 << 11 | num4 >> 21) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.H(num4, num5, num) + blockDWords[10] + 1859775393U;
            num3     = (num3 << 13 | num3 >> 19) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.H(num3, num4, num5) + blockDWords[14] + 1859775393U;
            num2     = (num2 << 6 | num2 >> 26) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += RIPEMD160Managed.H(num2, num3, num4) + blockDWords[4] + 1859775393U;
            num      = (num << 7 | num >> 25) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.H(num, num2, num3) + blockDWords[9] + 1859775393U;
            num5     = (num5 << 14 | num5 >> 18) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.H(num5, num, num2) + blockDWords[15] + 1859775393U;
            num4     = (num4 << 9 | num4 >> 23) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.H(num4, num5, num) + blockDWords[8] + 1859775393U;
            num3     = (num3 << 13 | num3 >> 19) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.H(num3, num4, num5) + blockDWords[1] + 1859775393U;
            num2     = (num2 << 15 | num2 >> 17) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += RIPEMD160Managed.H(num2, num3, num4) + blockDWords[2] + 1859775393U;
            num      = (num << 14 | num >> 18) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.H(num, num2, num3) + blockDWords[7] + 1859775393U;
            num5     = (num5 << 8 | num5 >> 24) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.H(num5, num, num2) + *blockDWords + 1859775393U;
            num4     = (num4 << 13 | num4 >> 19) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.H(num4, num5, num) + blockDWords[6] + 1859775393U;
            num3     = (num3 << 6 | num3 >> 26) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.H(num3, num4, num5) + blockDWords[13] + 1859775393U;
            num2     = (num2 << 5 | num2 >> 27) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += RIPEMD160Managed.H(num2, num3, num4) + blockDWords[11] + 1859775393U;
            num      = (num << 12 | num >> 20) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.H(num, num2, num3) + blockDWords[5] + 1859775393U;
            num5     = (num5 << 7 | num5 >> 25) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.H(num5, num, num2) + blockDWords[12] + 1859775393U;
            num4     = (num4 << 5 | num4 >> 27) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.I(num4, num5, num) + blockDWords[1] + 2400959708U;
            num3     = (num3 << 11 | num3 >> 21) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.I(num3, num4, num5) + blockDWords[9] + 2400959708U;
            num2     = (num2 << 12 | num2 >> 20) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += RIPEMD160Managed.I(num2, num3, num4) + blockDWords[11] + 2400959708U;
            num      = (num << 14 | num >> 18) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.I(num, num2, num3) + blockDWords[10] + 2400959708U;
            num5     = (num5 << 15 | num5 >> 17) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.I(num5, num, num2) + *blockDWords + 2400959708U;
            num4     = (num4 << 14 | num4 >> 18) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.I(num4, num5, num) + blockDWords[8] + 2400959708U;
            num3     = (num3 << 15 | num3 >> 17) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.I(num3, num4, num5) + blockDWords[12] + 2400959708U;
            num2     = (num2 << 9 | num2 >> 23) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += RIPEMD160Managed.I(num2, num3, num4) + blockDWords[4] + 2400959708U;
            num      = (num << 8 | num >> 24) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.I(num, num2, num3) + blockDWords[13] + 2400959708U;
            num5     = (num5 << 9 | num5 >> 23) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.I(num5, num, num2) + blockDWords[3] + 2400959708U;
            num4     = (num4 << 14 | num4 >> 18) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.I(num4, num5, num) + blockDWords[7] + 2400959708U;
            num3     = (num3 << 5 | num3 >> 27) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.I(num3, num4, num5) + blockDWords[15] + 2400959708U;
            num2     = (num2 << 6 | num2 >> 26) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += RIPEMD160Managed.I(num2, num3, num4) + blockDWords[14] + 2400959708U;
            num      = (num << 8 | num >> 24) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.I(num, num2, num3) + blockDWords[5] + 2400959708U;
            num5     = (num5 << 6 | num5 >> 26) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.I(num5, num, num2) + blockDWords[6] + 2400959708U;
            num4     = (num4 << 5 | num4 >> 27) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.I(num4, num5, num) + blockDWords[2] + 2400959708U;
            num3     = (num3 << 12 | num3 >> 20) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.J(num3, num4, num5) + blockDWords[4] + 2840853838U;
            num2     = (num2 << 9 | num2 >> 23) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += RIPEMD160Managed.J(num2, num3, num4) + *blockDWords + 2840853838U;
            num      = (num << 15 | num >> 17) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.J(num, num2, num3) + blockDWords[5] + 2840853838U;
            num5     = (num5 << 5 | num5 >> 27) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.J(num5, num, num2) + blockDWords[9] + 2840853838U;
            num4     = (num4 << 11 | num4 >> 21) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.J(num4, num5, num) + blockDWords[7] + 2840853838U;
            num3     = (num3 << 6 | num3 >> 26) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.J(num3, num4, num5) + blockDWords[12] + 2840853838U;
            num2     = (num2 << 8 | num2 >> 24) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += RIPEMD160Managed.J(num2, num3, num4) + blockDWords[2] + 2840853838U;
            num      = (num << 13 | num >> 19) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.J(num, num2, num3) + blockDWords[10] + 2840853838U;
            num5     = (num5 << 12 | num5 >> 20) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.J(num5, num, num2) + blockDWords[14] + 2840853838U;
            num4     = (num4 << 5 | num4 >> 27) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.J(num4, num5, num) + blockDWords[1] + 2840853838U;
            num3     = (num3 << 12 | num3 >> 20) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.J(num3, num4, num5) + blockDWords[3] + 2840853838U;
            num2     = (num2 << 13 | num2 >> 19) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num     += RIPEMD160Managed.J(num2, num3, num4) + blockDWords[8] + 2840853838U;
            num      = (num << 14 | num >> 18) + num5;
            num3     = (num3 << 10 | num3 >> 22);
            num5    += RIPEMD160Managed.J(num, num2, num3) + blockDWords[11] + 2840853838U;
            num5     = (num5 << 11 | num5 >> 21) + num4;
            num2     = (num2 << 10 | num2 >> 22);
            num4    += RIPEMD160Managed.J(num5, num, num2) + blockDWords[6] + 2840853838U;
            num4     = (num4 << 8 | num4 >> 24) + num3;
            num      = (num << 10 | num >> 22);
            num3    += RIPEMD160Managed.J(num4, num5, num) + blockDWords[15] + 2840853838U;
            num3     = (num3 << 5 | num3 >> 27) + num2;
            num5     = (num5 << 10 | num5 >> 22);
            num2    += RIPEMD160Managed.J(num3, num4, num5) + blockDWords[13] + 2840853838U;
            num2     = (num2 << 6 | num2 >> 26) + num;
            num4     = (num4 << 10 | num4 >> 22);
            num6    += RIPEMD160Managed.J(num7, num8, num9) + blockDWords[5] + 1352829926U;
            num6     = (num6 << 8 | num6 >> 24) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.J(num6, num7, num8) + blockDWords[14] + 1352829926U;
            num10    = (num10 << 9 | num10 >> 23) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.J(num10, num6, num7) + blockDWords[7] + 1352829926U;
            num9     = (num9 << 9 | num9 >> 23) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.J(num9, num10, num6) + *blockDWords + 1352829926U;
            num8     = (num8 << 11 | num8 >> 21) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.J(num8, num9, num10) + blockDWords[9] + 1352829926U;
            num7     = (num7 << 13 | num7 >> 19) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.J(num7, num8, num9) + blockDWords[2] + 1352829926U;
            num6     = (num6 << 15 | num6 >> 17) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.J(num6, num7, num8) + blockDWords[11] + 1352829926U;
            num10    = (num10 << 15 | num10 >> 17) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.J(num10, num6, num7) + blockDWords[4] + 1352829926U;
            num9     = (num9 << 5 | num9 >> 27) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.J(num9, num10, num6) + blockDWords[13] + 1352829926U;
            num8     = (num8 << 7 | num8 >> 25) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.J(num8, num9, num10) + blockDWords[6] + 1352829926U;
            num7     = (num7 << 7 | num7 >> 25) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.J(num7, num8, num9) + blockDWords[15] + 1352829926U;
            num6     = (num6 << 8 | num6 >> 24) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.J(num6, num7, num8) + blockDWords[8] + 1352829926U;
            num10    = (num10 << 11 | num10 >> 21) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.J(num10, num6, num7) + blockDWords[1] + 1352829926U;
            num9     = (num9 << 14 | num9 >> 18) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.J(num9, num10, num6) + blockDWords[10] + 1352829926U;
            num8     = (num8 << 14 | num8 >> 18) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.J(num8, num9, num10) + blockDWords[3] + 1352829926U;
            num7     = (num7 << 12 | num7 >> 20) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.J(num7, num8, num9) + blockDWords[12] + 1352829926U;
            num6     = (num6 << 6 | num6 >> 26) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.I(num6, num7, num8) + blockDWords[6] + 1548603684U;
            num10    = (num10 << 9 | num10 >> 23) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.I(num10, num6, num7) + blockDWords[11] + 1548603684U;
            num9     = (num9 << 13 | num9 >> 19) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.I(num9, num10, num6) + blockDWords[3] + 1548603684U;
            num8     = (num8 << 15 | num8 >> 17) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.I(num8, num9, num10) + blockDWords[7] + 1548603684U;
            num7     = (num7 << 7 | num7 >> 25) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.I(num7, num8, num9) + *blockDWords + 1548603684U;
            num6     = (num6 << 12 | num6 >> 20) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.I(num6, num7, num8) + blockDWords[13] + 1548603684U;
            num10    = (num10 << 8 | num10 >> 24) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.I(num10, num6, num7) + blockDWords[5] + 1548603684U;
            num9     = (num9 << 9 | num9 >> 23) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.I(num9, num10, num6) + blockDWords[10] + 1548603684U;
            num8     = (num8 << 11 | num8 >> 21) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.I(num8, num9, num10) + blockDWords[14] + 1548603684U;
            num7     = (num7 << 7 | num7 >> 25) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.I(num7, num8, num9) + blockDWords[15] + 1548603684U;
            num6     = (num6 << 7 | num6 >> 25) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.I(num6, num7, num8) + blockDWords[8] + 1548603684U;
            num10    = (num10 << 12 | num10 >> 20) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.I(num10, num6, num7) + blockDWords[12] + 1548603684U;
            num9     = (num9 << 7 | num9 >> 25) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.I(num9, num10, num6) + blockDWords[4] + 1548603684U;
            num8     = (num8 << 6 | num8 >> 26) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.I(num8, num9, num10) + blockDWords[9] + 1548603684U;
            num7     = (num7 << 15 | num7 >> 17) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.I(num7, num8, num9) + blockDWords[1] + 1548603684U;
            num6     = (num6 << 13 | num6 >> 19) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.I(num6, num7, num8) + blockDWords[2] + 1548603684U;
            num10    = (num10 << 11 | num10 >> 21) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.H(num10, num6, num7) + blockDWords[15] + 1836072691U;
            num9     = (num9 << 9 | num9 >> 23) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.H(num9, num10, num6) + blockDWords[5] + 1836072691U;
            num8     = (num8 << 7 | num8 >> 25) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.H(num8, num9, num10) + blockDWords[1] + 1836072691U;
            num7     = (num7 << 15 | num7 >> 17) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.H(num7, num8, num9) + blockDWords[3] + 1836072691U;
            num6     = (num6 << 11 | num6 >> 21) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.H(num6, num7, num8) + blockDWords[7] + 1836072691U;
            num10    = (num10 << 8 | num10 >> 24) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.H(num10, num6, num7) + blockDWords[14] + 1836072691U;
            num9     = (num9 << 6 | num9 >> 26) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.H(num9, num10, num6) + blockDWords[6] + 1836072691U;
            num8     = (num8 << 6 | num8 >> 26) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.H(num8, num9, num10) + blockDWords[9] + 1836072691U;
            num7     = (num7 << 14 | num7 >> 18) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.H(num7, num8, num9) + blockDWords[11] + 1836072691U;
            num6     = (num6 << 12 | num6 >> 20) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.H(num6, num7, num8) + blockDWords[8] + 1836072691U;
            num10    = (num10 << 13 | num10 >> 19) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.H(num10, num6, num7) + blockDWords[12] + 1836072691U;
            num9     = (num9 << 5 | num9 >> 27) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.H(num9, num10, num6) + blockDWords[2] + 1836072691U;
            num8     = (num8 << 14 | num8 >> 18) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.H(num8, num9, num10) + blockDWords[10] + 1836072691U;
            num7     = (num7 << 13 | num7 >> 19) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.H(num7, num8, num9) + *blockDWords + 1836072691U;
            num6     = (num6 << 13 | num6 >> 19) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.H(num6, num7, num8) + blockDWords[4] + 1836072691U;
            num10    = (num10 << 7 | num10 >> 25) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.H(num10, num6, num7) + blockDWords[13] + 1836072691U;
            num9     = (num9 << 5 | num9 >> 27) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.G(num9, num10, num6) + blockDWords[8] + 2053994217U;
            num8     = (num8 << 15 | num8 >> 17) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.G(num8, num9, num10) + blockDWords[6] + 2053994217U;
            num7     = (num7 << 5 | num7 >> 27) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.G(num7, num8, num9) + blockDWords[4] + 2053994217U;
            num6     = (num6 << 8 | num6 >> 24) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.G(num6, num7, num8) + blockDWords[1] + 2053994217U;
            num10    = (num10 << 11 | num10 >> 21) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.G(num10, num6, num7) + blockDWords[3] + 2053994217U;
            num9     = (num9 << 14 | num9 >> 18) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.G(num9, num10, num6) + blockDWords[11] + 2053994217U;
            num8     = (num8 << 14 | num8 >> 18) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.G(num8, num9, num10) + blockDWords[15] + 2053994217U;
            num7     = (num7 << 6 | num7 >> 26) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.G(num7, num8, num9) + *blockDWords + 2053994217U;
            num6     = (num6 << 14 | num6 >> 18) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.G(num6, num7, num8) + blockDWords[5] + 2053994217U;
            num10    = (num10 << 6 | num10 >> 26) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.G(num10, num6, num7) + blockDWords[12] + 2053994217U;
            num9     = (num9 << 9 | num9 >> 23) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.G(num9, num10, num6) + blockDWords[2] + 2053994217U;
            num8     = (num8 << 12 | num8 >> 20) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.G(num8, num9, num10) + blockDWords[13] + 2053994217U;
            num7     = (num7 << 9 | num7 >> 23) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.G(num7, num8, num9) + blockDWords[9] + 2053994217U;
            num6     = (num6 << 12 | num6 >> 20) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.G(num6, num7, num8) + blockDWords[7] + 2053994217U;
            num10    = (num10 << 5 | num10 >> 27) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.G(num10, num6, num7) + blockDWords[10] + 2053994217U;
            num9     = (num9 << 15 | num9 >> 17) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.G(num9, num10, num6) + blockDWords[14] + 2053994217U;
            num8     = (num8 << 8 | num8 >> 24) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.F(num8, num9, num10) + blockDWords[12];
            num7     = (num7 << 8 | num7 >> 24) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.F(num7, num8, num9) + blockDWords[15];
            num6     = (num6 << 5 | num6 >> 27) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.F(num6, num7, num8) + blockDWords[10];
            num10    = (num10 << 12 | num10 >> 20) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.F(num10, num6, num7) + blockDWords[4];
            num9     = (num9 << 9 | num9 >> 23) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.F(num9, num10, num6) + blockDWords[1];
            num8     = (num8 << 12 | num8 >> 20) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.F(num8, num9, num10) + blockDWords[5];
            num7     = (num7 << 5 | num7 >> 27) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.F(num7, num8, num9) + blockDWords[8];
            num6     = (num6 << 14 | num6 >> 18) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.F(num6, num7, num8) + blockDWords[7];
            num10    = (num10 << 6 | num10 >> 26) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.F(num10, num6, num7) + blockDWords[6];
            num9     = (num9 << 8 | num9 >> 24) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.F(num9, num10, num6) + blockDWords[2];
            num8     = (num8 << 13 | num8 >> 19) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.F(num8, num9, num10) + blockDWords[13];
            num7     = (num7 << 6 | num7 >> 26) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num6    += RIPEMD160Managed.F(num7, num8, num9) + blockDWords[14];
            num6     = (num6 << 5 | num6 >> 27) + num10;
            num8     = (num8 << 10 | num8 >> 22);
            num10   += RIPEMD160Managed.F(num6, num7, num8) + *blockDWords;
            num10    = (num10 << 15 | num10 >> 17) + num9;
            num7     = (num7 << 10 | num7 >> 22);
            num9    += RIPEMD160Managed.F(num10, num6, num7) + blockDWords[3];
            num9     = (num9 << 13 | num9 >> 19) + num8;
            num6     = (num6 << 10 | num6 >> 22);
            num8    += RIPEMD160Managed.F(num9, num10, num6) + blockDWords[9];
            num8     = (num8 << 11 | num8 >> 21) + num7;
            num10    = (num10 << 10 | num10 >> 22);
            num7    += RIPEMD160Managed.F(num8, num9, num10) + blockDWords[11];
            num7     = (num7 << 11 | num7 >> 21) + num6;
            num9     = (num9 << 10 | num9 >> 22);
            num9    += num3 + state[1];
            state[1] = state[2] + num4 + num10;
            state[2] = state[3] + num5 + num6;
            state[3] = state[4] + num + num7;
            state[4] = *state + num2 + num8;
            *state = num9;
        }