private int ProcessBytes(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset)
{
if ((inputOffset + inputCount) > inputBuffer.Length)
{
throw new IndexOutOfRangeException("input buffer too short");
}
if ((outputOffset + inputCount) > outputBuffer.Length)
{
throw new IndexOutOfRangeException("output buffer too short");
}
for (var i = 0; i < inputCount; i++)
{
_x = (_x + 1) & 0xff;
_y = (_engineState[_x] + _y) & 0xff;
// swap
var tmp = _engineState[_x];
_engineState[_x] = _engineState[_y];
_engineState[_y] = tmp;
// xor
outputBuffer[i + outputOffset] = (byte)(inputBuffer[i + inputOffset] ^ _engineState[(_engineState[_x] + _engineState[_y]) & 0xff]);
}
return inputCount;
}