private static unsafe void SHATransform(uint *expandedBuffer, uint *state, byte *block) { uint num1 = *state; uint num2 = *(uint *)((IntPtr)state + 4); uint num3 = state[2]; uint num4 = state[3]; uint num5 = state[4]; Utils.DWORDFromBigEndian(expandedBuffer, 16, block); SHA1Managed.SHAExpand(expandedBuffer); int index = 0; while (index < 20) { uint num6 = num5 + (uint)(((int)num1 << 5 | (int)(num1 >> 27)) + ((int)num4 ^ (int)num2 & ((int)num3 ^ (int)num4)) + (int)expandedBuffer[index] + 1518500249); uint num7 = num2 << 30 | num2 >> 2; uint num8 = num4 + (uint)(((int)num6 << 5 | (int)(num6 >> 27)) + ((int)num3 ^ (int)num1 & ((int)num7 ^ (int)num3)) + (int)expandedBuffer[index + 1] + 1518500249); uint num9 = num1 << 30 | num1 >> 2; uint num10 = num3 + (uint)(((int)num8 << 5 | (int)(num8 >> 27)) + ((int)num7 ^ (int)num6 & ((int)num9 ^ (int)num7)) + (int)expandedBuffer[index + 2] + 1518500249); num5 = num6 << 30 | num6 >> 2; num2 = num7 + (uint)(((int)num10 << 5 | (int)(num10 >> 27)) + ((int)num9 ^ (int)num8 & ((int)num5 ^ (int)num9)) + (int)expandedBuffer[index + 3] + 1518500249); num4 = num8 << 30 | num8 >> 2; num1 = num9 + (uint)(((int)num2 << 5 | (int)(num2 >> 27)) + ((int)num5 ^ (int)num10 & ((int)num4 ^ (int)num5)) + (int)expandedBuffer[index + 4] + 1518500249); num3 = num10 << 30 | num10 >> 2; index += 5; } while (index < 40) { uint num6 = num5 + (uint)(((int)num1 << 5 | (int)(num1 >> 27)) + ((int)num2 ^ (int)num3 ^ (int)num4) + (int)expandedBuffer[index] + 1859775393); uint num7 = num2 << 30 | num2 >> 2; uint num8 = num4 + (uint)(((int)num6 << 5 | (int)(num6 >> 27)) + ((int)num1 ^ (int)num7 ^ (int)num3) + (int)expandedBuffer[index + 1] + 1859775393); uint num9 = num1 << 30 | num1 >> 2; uint num10 = num3 + (uint)(((int)num8 << 5 | (int)(num8 >> 27)) + ((int)num6 ^ (int)num9 ^ (int)num7) + (int)expandedBuffer[index + 2] + 1859775393); num5 = num6 << 30 | num6 >> 2; num2 = num7 + (uint)(((int)num10 << 5 | (int)(num10 >> 27)) + ((int)num8 ^ (int)num5 ^ (int)num9) + (int)expandedBuffer[index + 3] + 1859775393); num4 = num8 << 30 | num8 >> 2; num1 = num9 + (uint)(((int)num2 << 5 | (int)(num2 >> 27)) + ((int)num10 ^ (int)num4 ^ (int)num5) + (int)expandedBuffer[index + 4] + 1859775393); num3 = num10 << 30 | num10 >> 2; index += 5; } while (index < 60) { uint num6 = num5 + (uint)(((int)num1 << 5 | (int)(num1 >> 27)) + ((int)num2 & (int)num3 | (int)num4 & ((int)num2 | (int)num3)) + (int)expandedBuffer[index] - 1894007588); uint num7 = num2 << 30 | num2 >> 2; uint num8 = num4 + (uint)(((int)num6 << 5 | (int)(num6 >> 27)) + ((int)num1 & (int)num7 | (int)num3 & ((int)num1 | (int)num7)) + (int)expandedBuffer[index + 1] - 1894007588); uint num9 = num1 << 30 | num1 >> 2; uint num10 = num3 + (uint)(((int)num8 << 5 | (int)(num8 >> 27)) + ((int)num6 & (int)num9 | (int)num7 & ((int)num6 | (int)num9)) + (int)expandedBuffer[index + 2] - 1894007588); num5 = num6 << 30 | num6 >> 2; num2 = num7 + (uint)(((int)num10 << 5 | (int)(num10 >> 27)) + ((int)num8 & (int)num5 | (int)num9 & ((int)num8 | (int)num5)) + (int)expandedBuffer[index + 3] - 1894007588); num4 = num8 << 30 | num8 >> 2; num1 = num9 + (uint)(((int)num2 << 5 | (int)(num2 >> 27)) + ((int)num10 & (int)num4 | (int)num5 & ((int)num10 | (int)num4)) + (int)expandedBuffer[index + 4] - 1894007588); num3 = num10 << 30 | num10 >> 2; index += 5; } while (index < 80) { uint num6 = num5 + (uint)(((int)num1 << 5 | (int)(num1 >> 27)) + ((int)num2 ^ (int)num3 ^ (int)num4) + (int)expandedBuffer[index] - 899497514); uint num7 = num2 << 30 | num2 >> 2; uint num8 = num4 + (uint)(((int)num6 << 5 | (int)(num6 >> 27)) + ((int)num1 ^ (int)num7 ^ (int)num3) + (int)expandedBuffer[index + 1] - 899497514); uint num9 = num1 << 30 | num1 >> 2; uint num10 = num3 + (uint)(((int)num8 << 5 | (int)(num8 >> 27)) + ((int)num6 ^ (int)num9 ^ (int)num7) + (int)expandedBuffer[index + 2] - 899497514); num5 = num6 << 30 | num6 >> 2; num2 = num7 + (uint)(((int)num10 << 5 | (int)(num10 >> 27)) + ((int)num8 ^ (int)num5 ^ (int)num9) + (int)expandedBuffer[index + 3] - 899497514); num4 = num8 << 30 | num8 >> 2; num1 = num9 + (uint)(((int)num2 << 5 | (int)(num2 >> 27)) + ((int)num10 ^ (int)num4 ^ (int)num5) + (int)expandedBuffer[index + 4] - 899497514); num3 = num10 << 30 | num10 >> 2; index += 5; } uint *numPtr = state; int num11 = (int)*numPtr + (int)num1; * numPtr = (uint)num11; IntPtr num12 = (IntPtr)state + 4; int num13 = (int)*(uint *)num12 + (int)num2; *(int *)num12 = num13; IntPtr num14 = (IntPtr)(state + 2); int num15 = (int)*(uint *)num14 + (int)num3; *(int *)num14 = num15; IntPtr num16 = (IntPtr)(state + 3); int num17 = (int)*(uint *)num16 + (int)num4; *(int *)num16 = num17; IntPtr num18 = (IntPtr)(state + 4); int num19 = (int)*(uint *)num18 + (int)num5; *(int *)num18 = num19; }
private unsafe static void SHATransform(uint *expandedBuffer, uint *state, byte *block) { uint num = *state; uint num2 = state[1]; uint num3 = state[2]; uint num4 = state[3]; uint num5 = state[4]; Utils.DWORDFromBigEndian(expandedBuffer, 16, block); SHA1Managed.SHAExpand(expandedBuffer); int i; for (i = 0; i < 20; i += 5) { num5 += (num << 5 | num >> 27) + (num4 ^ (num2 & (num3 ^ num4))) + expandedBuffer[i] + 1518500249U; num2 = (num2 << 30 | num2 >> 2); num4 += (num5 << 5 | num5 >> 27) + (num3 ^ (num & (num2 ^ num3))) + expandedBuffer[i + 1] + 1518500249U; num = (num << 30 | num >> 2); num3 += (num4 << 5 | num4 >> 27) + (num2 ^ (num5 & (num ^ num2))) + expandedBuffer[i + 2] + 1518500249U; num5 = (num5 << 30 | num5 >> 2); num2 += (num3 << 5 | num3 >> 27) + (num ^ (num4 & (num5 ^ num))) + expandedBuffer[i + 3] + 1518500249U; num4 = (num4 << 30 | num4 >> 2); num += (num2 << 5 | num2 >> 27) + (num5 ^ (num3 & (num4 ^ num5))) + expandedBuffer[i + 4] + 1518500249U; num3 = (num3 << 30 | num3 >> 2); } while (i < 40) { num5 += (num << 5 | num >> 27) + (num2 ^ num3 ^ num4) + expandedBuffer[i] + 1859775393U; num2 = (num2 << 30 | num2 >> 2); num4 += (num5 << 5 | num5 >> 27) + (num ^ num2 ^ num3) + expandedBuffer[i + 1] + 1859775393U; num = (num << 30 | num >> 2); num3 += (num4 << 5 | num4 >> 27) + (num5 ^ num ^ num2) + expandedBuffer[i + 2] + 1859775393U; num5 = (num5 << 30 | num5 >> 2); num2 += (num3 << 5 | num3 >> 27) + (num4 ^ num5 ^ num) + expandedBuffer[i + 3] + 1859775393U; num4 = (num4 << 30 | num4 >> 2); num += (num2 << 5 | num2 >> 27) + (num3 ^ num4 ^ num5) + expandedBuffer[i + 4] + 1859775393U; num3 = (num3 << 30 | num3 >> 2); i += 5; } while (i < 60) { num5 += (num << 5 | num >> 27) + ((num2 & num3) | (num4 & (num2 | num3))) + expandedBuffer[i] + 2400959708U; num2 = (num2 << 30 | num2 >> 2); num4 += (num5 << 5 | num5 >> 27) + ((num & num2) | (num3 & (num | num2))) + expandedBuffer[i + 1] + 2400959708U; num = (num << 30 | num >> 2); num3 += (num4 << 5 | num4 >> 27) + ((num5 & num) | (num2 & (num5 | num))) + expandedBuffer[i + 2] + 2400959708U; num5 = (num5 << 30 | num5 >> 2); num2 += (num3 << 5 | num3 >> 27) + ((num4 & num5) | (num & (num4 | num5))) + expandedBuffer[i + 3] + 2400959708U; num4 = (num4 << 30 | num4 >> 2); num += (num2 << 5 | num2 >> 27) + ((num3 & num4) | (num5 & (num3 | num4))) + expandedBuffer[i + 4] + 2400959708U; num3 = (num3 << 30 | num3 >> 2); i += 5; } while (i < 80) { num5 += (num << 5 | num >> 27) + (num2 ^ num3 ^ num4) + expandedBuffer[i] + 3395469782U; num2 = (num2 << 30 | num2 >> 2); num4 += (num5 << 5 | num5 >> 27) + (num ^ num2 ^ num3) + expandedBuffer[i + 1] + 3395469782U; num = (num << 30 | num >> 2); num3 += (num4 << 5 | num4 >> 27) + (num5 ^ num ^ num2) + expandedBuffer[i + 2] + 3395469782U; num5 = (num5 << 30 | num5 >> 2); num2 += (num3 << 5 | num3 >> 27) + (num4 ^ num5 ^ num) + expandedBuffer[i + 3] + 3395469782U; num4 = (num4 << 30 | num4 >> 2); num += (num2 << 5 | num2 >> 27) + (num3 ^ num4 ^ num5) + expandedBuffer[i + 4] + 3395469782U; num3 = (num3 << 30 | num3 >> 2); i += 5; } *state += num; state[1] += num2; state[2] += num3; state[3] += num4; state[4] += num5; }