size_t KeccakP1600times4_12rounds_FastLoop_Absorb(void *states, unsigned int laneCount, unsigned int laneOffsetParallel, unsigned int laneOffsetSerial, const unsigned char *data, size_t dataByteLen) { size_t dataMinimumSize = (laneOffsetParallel*3 + laneCount)*8; if (laneCount == 21) { #if (KeccakP1600times4_unrolling < 12) unsigned int i; #endif const unsigned char *dataStart = data; V256 *statesAsLanes = states; const UINT64 *dataAsLanes = (const UINT64 *)data; KeccakP_DeclareVars; V128 index; copyFromState(statesAsLanes); index = LOAD4_32(3*laneOffsetParallel, 2*laneOffsetParallel, 1*laneOffsetParallel, 0*laneOffsetParallel); while(dataByteLen >= dataMinimumSize) { #define Add_In( argLane, argIndex ) argLane = XOR(argLane, LOAD_GATHER4_64(index, dataAsLanes+argIndex)) Add_In( _ba, 0 ); Add_In( _be, 1 ); Add_In( _bi, 2 ); Add_In( _bo, 3 ); Add_In( _bu, 4 ); Add_In( _ga, 5 ); Add_In( _ge, 6 ); Add_In( _gi, 7 ); Add_In( _go, 8 ); Add_In( _gu, 9 ); Add_In( _ka, 10 ); Add_In( _ke, 11 ); Add_In( _ki, 12 ); Add_In( _ko, 13 ); Add_In( _ku, 14 ); Add_In( _ma, 15 ); Add_In( _me, 16 ); Add_In( _mi, 17 ); Add_In( _mo, 18 ); Add_In( _mu, 19 ); Add_In( _sa, 20 ); #undef Add_In rounds12; dataAsLanes += laneOffsetSerial; dataByteLen -= laneOffsetSerial*8; } copyToState(statesAsLanes); return (const unsigned char *)dataAsLanes - dataStart; } else { const unsigned char *dataStart = data; while(dataByteLen >= dataMinimumSize) { KeccakP1600times4_AddLanesAll(states, data, laneCount, laneOffsetParallel); KeccakP1600times4_PermuteAll_12rounds(states); data += laneOffsetSerial*8; dataByteLen -= laneOffsetSerial*8; } return data - dataStart; } }
void KeccakP1600times4_PermuteAll_12rounds(void *states) { V256 *statesAsLanes = states; KeccakP_DeclareVars; #if (KeccakP1600times4_unrolling < 12) unsigned int i; #endif copyFromState(statesAsLanes); rounds12; copyToState(statesAsLanes); }
void KeccakDoublePermutationOnWords(V128 *state) { declareABCDE #if (Unrolling != 24) unsigned int i; #endif copyFromState(A, state) rounds #if defined(UseMMX) _mm_empty(); #endif }