private void Salsa(ArraySegment <byte> hash) { for (int i = 0; i < 16; ++i) { SalsaX[i] = SalsaB[i] = BitConverter.SwapLittleEndian(SalsaB[i]); } for (int i = 0; i < Rounds; i += 2) { SalsaX[4] ^= Binary.RotateLeft(SalsaX[0] + SalsaX[12], 7); SalsaX[8] ^= Binary.RotateLeft(SalsaX[4] + SalsaX[0], 9); SalsaX[12] ^= Binary.RotateLeft(SalsaX[8] + SalsaX[4], 13); SalsaX[0] ^= Binary.RotateLeft(SalsaX[12] + SalsaX[8], 18); SalsaX[9] ^= Binary.RotateLeft(SalsaX[5] + SalsaX[1], 7); SalsaX[13] ^= Binary.RotateLeft(SalsaX[9] + SalsaX[5], 9); SalsaX[1] ^= Binary.RotateLeft(SalsaX[13] + SalsaX[9], 13); SalsaX[5] ^= Binary.RotateLeft(SalsaX[1] + SalsaX[13], 18); SalsaX[14] ^= Binary.RotateLeft(SalsaX[10] + SalsaX[6], 7); SalsaX[2] ^= Binary.RotateLeft(SalsaX[14] + SalsaX[10], 9); SalsaX[6] ^= Binary.RotateLeft(SalsaX[2] + SalsaX[14], 13); SalsaX[10] ^= Binary.RotateLeft(SalsaX[6] + SalsaX[2], 18); SalsaX[3] ^= Binary.RotateLeft(SalsaX[15] + SalsaX[11], 7); SalsaX[7] ^= Binary.RotateLeft(SalsaX[3] + SalsaX[15], 9); SalsaX[11] ^= Binary.RotateLeft(SalsaX[7] + SalsaX[3], 13); SalsaX[15] ^= Binary.RotateLeft(SalsaX[11] + SalsaX[7], 18); SalsaX[1] ^= Binary.RotateLeft(SalsaX[0] + SalsaX[3], 7); SalsaX[2] ^= Binary.RotateLeft(SalsaX[1] + SalsaX[0], 9); SalsaX[3] ^= Binary.RotateLeft(SalsaX[2] + SalsaX[1], 13); SalsaX[0] ^= Binary.RotateLeft(SalsaX[3] + SalsaX[2], 18); SalsaX[6] ^= Binary.RotateLeft(SalsaX[5] + SalsaX[4], 7); SalsaX[7] ^= Binary.RotateLeft(SalsaX[6] + SalsaX[5], 9); SalsaX[4] ^= Binary.RotateLeft(SalsaX[7] + SalsaX[6], 13); SalsaX[5] ^= Binary.RotateLeft(SalsaX[4] + SalsaX[7], 18); SalsaX[11] ^= Binary.RotateLeft(SalsaX[10] + SalsaX[9], 7); SalsaX[8] ^= Binary.RotateLeft(SalsaX[11] + SalsaX[10], 9); SalsaX[9] ^= Binary.RotateLeft(SalsaX[8] + SalsaX[11], 13); SalsaX[10] ^= Binary.RotateLeft(SalsaX[9] + SalsaX[8], 18); SalsaX[12] ^= Binary.RotateLeft(SalsaX[15] + SalsaX[14], 7); SalsaX[13] ^= Binary.RotateLeft(SalsaX[12] + SalsaX[15], 9); SalsaX[14] ^= Binary.RotateLeft(SalsaX[13] + SalsaX[12], 13); SalsaX[15] ^= Binary.RotateLeft(SalsaX[14] + SalsaX[13], 18); } for (int i = 0; i < 16; ++i) { BitConverter.GetBytes(hash.Array, hash.Offset + i * 4, SalsaB[i] + SalsaX[i]); } }