in src/sha3/keccak4x/KeccakP-1600-times4-SIMD256.c [341:378]
void KeccakP1600times4_ExtractAndAddBytes(const void *states, unsigned int instanceIndex, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
{
unsigned int sizeLeft = length;
unsigned int lanePosition = offset/SnP_laneLengthInBytes;
unsigned int offsetInLane = offset%SnP_laneLengthInBytes;
const unsigned char *curInput = input;
unsigned char *curOutput = output;
const UINT64 *statesAsLanes = (const UINT64 *)states;
if ((sizeLeft > 0) && (offsetInLane != 0)) {
unsigned int bytesInLane = SnP_laneLengthInBytes - offsetInLane;
UINT64 lane = statesAsLanes[laneIndex(instanceIndex, lanePosition)] >> (8 * offsetInLane);
if (bytesInLane > sizeLeft)
bytesInLane = sizeLeft;
sizeLeft -= bytesInLane;
do {
*(curOutput++) = *(curInput++) ^ (unsigned char)lane;
lane >>= 8;
} while ( --bytesInLane != 0);
lanePosition++;
}
while(sizeLeft >= SnP_laneLengthInBytes) {
*((UINT64*)curOutput) = *((UINT64*)curInput) ^ statesAsLanes[laneIndex(instanceIndex, lanePosition)];
sizeLeft -= SnP_laneLengthInBytes;
lanePosition++;
curInput += SnP_laneLengthInBytes;
curOutput += SnP_laneLengthInBytes;
}
if (sizeLeft != 0) {
UINT64 lane = statesAsLanes[laneIndex(instanceIndex, lanePosition)];
do {
*(curOutput++) = *(curInput++) ^ (unsigned char)lane;
lane >>= 8;
} while ( --sizeLeft != 0);
}
}