135 lines
5.8 KiB
C
135 lines
5.8 KiB
C
/*
|
|
Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni,
|
|
Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby
|
|
denoted as "the implementer".
|
|
|
|
For more information, feedback or questions, please refer to our websites:
|
|
http://keccak.noekeon.org/
|
|
http://keyak.noekeon.org/
|
|
http://ketje.noekeon.org/
|
|
|
|
To the extent possible under law, the implementer has waived all copyright
|
|
and related or neighboring rights to the source code in this file.
|
|
http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
#ifndef _SnP_Relaned_h_
|
|
#define _SnP_Relaned_h_
|
|
|
|
#define SnP_AddBytes(state, data, offset, length, SnP_AddLanes, SnP_AddBytesInLane, SnP_laneLengthInBytes) \
|
|
{ \
|
|
if ((offset) == 0) { \
|
|
SnP_AddLanes(state, data, (length)/SnP_laneLengthInBytes); \
|
|
SnP_AddBytesInLane(state, \
|
|
(length)/SnP_laneLengthInBytes, \
|
|
(data)+((length)/SnP_laneLengthInBytes)*SnP_laneLengthInBytes, \
|
|
0, \
|
|
(length)%SnP_laneLengthInBytes); \
|
|
} \
|
|
else { \
|
|
unsigned int _sizeLeft = (length); \
|
|
unsigned int _lanePosition = (offset)/SnP_laneLengthInBytes; \
|
|
unsigned int _offsetInLane = (offset)%SnP_laneLengthInBytes; \
|
|
const unsigned char *_curData = (data); \
|
|
while(_sizeLeft > 0) { \
|
|
unsigned int _bytesInLane = SnP_laneLengthInBytes - _offsetInLane; \
|
|
if (_bytesInLane > _sizeLeft) \
|
|
_bytesInLane = _sizeLeft; \
|
|
SnP_AddBytesInLane(state, _lanePosition, _curData, _offsetInLane, _bytesInLane); \
|
|
_sizeLeft -= _bytesInLane; \
|
|
_lanePosition++; \
|
|
_offsetInLane = 0; \
|
|
_curData += _bytesInLane; \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#define SnP_OverwriteBytes(state, data, offset, length, SnP_OverwriteLanes, SnP_OverwriteBytesInLane, SnP_laneLengthInBytes) \
|
|
{ \
|
|
if ((offset) == 0) { \
|
|
SnP_OverwriteLanes(state, data, (length)/SnP_laneLengthInBytes); \
|
|
SnP_OverwriteBytesInLane(state, \
|
|
(length)/SnP_laneLengthInBytes, \
|
|
(data)+((length)/SnP_laneLengthInBytes)*SnP_laneLengthInBytes, \
|
|
0, \
|
|
(length)%SnP_laneLengthInBytes); \
|
|
} \
|
|
else { \
|
|
unsigned int _sizeLeft = (length); \
|
|
unsigned int _lanePosition = (offset)/SnP_laneLengthInBytes; \
|
|
unsigned int _offsetInLane = (offset)%SnP_laneLengthInBytes; \
|
|
const unsigned char *_curData = (data); \
|
|
while(_sizeLeft > 0) { \
|
|
unsigned int _bytesInLane = SnP_laneLengthInBytes - _offsetInLane; \
|
|
if (_bytesInLane > _sizeLeft) \
|
|
_bytesInLane = _sizeLeft; \
|
|
SnP_OverwriteBytesInLane(state, _lanePosition, _curData, _offsetInLane, _bytesInLane); \
|
|
_sizeLeft -= _bytesInLane; \
|
|
_lanePosition++; \
|
|
_offsetInLane = 0; \
|
|
_curData += _bytesInLane; \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#define SnP_ExtractBytes(state, data, offset, length, SnP_ExtractLanes, SnP_ExtractBytesInLane, SnP_laneLengthInBytes) \
|
|
{ \
|
|
if ((offset) == 0) { \
|
|
SnP_ExtractLanes(state, data, (length)/SnP_laneLengthInBytes); \
|
|
SnP_ExtractBytesInLane(state, \
|
|
(length)/SnP_laneLengthInBytes, \
|
|
(data)+((length)/SnP_laneLengthInBytes)*SnP_laneLengthInBytes, \
|
|
0, \
|
|
(length)%SnP_laneLengthInBytes); \
|
|
} \
|
|
else { \
|
|
unsigned int _sizeLeft = (length); \
|
|
unsigned int _lanePosition = (offset)/SnP_laneLengthInBytes; \
|
|
unsigned int _offsetInLane = (offset)%SnP_laneLengthInBytes; \
|
|
unsigned char *_curData = (data); \
|
|
while(_sizeLeft > 0) { \
|
|
unsigned int _bytesInLane = SnP_laneLengthInBytes - _offsetInLane; \
|
|
if (_bytesInLane > _sizeLeft) \
|
|
_bytesInLane = _sizeLeft; \
|
|
SnP_ExtractBytesInLane(state, _lanePosition, _curData, _offsetInLane, _bytesInLane); \
|
|
_sizeLeft -= _bytesInLane; \
|
|
_lanePosition++; \
|
|
_offsetInLane = 0; \
|
|
_curData += _bytesInLane; \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#define SnP_ExtractAndAddBytes(state, input, output, offset, length, SnP_ExtractAndAddLanes, SnP_ExtractAndAddBytesInLane, SnP_laneLengthInBytes) \
|
|
{ \
|
|
if ((offset) == 0) { \
|
|
SnP_ExtractAndAddLanes(state, input, output, (length)/SnP_laneLengthInBytes); \
|
|
SnP_ExtractAndAddBytesInLane(state, \
|
|
(length)/SnP_laneLengthInBytes, \
|
|
(input)+((length)/SnP_laneLengthInBytes)*SnP_laneLengthInBytes, \
|
|
(output)+((length)/SnP_laneLengthInBytes)*SnP_laneLengthInBytes, \
|
|
0, \
|
|
(length)%SnP_laneLengthInBytes); \
|
|
} \
|
|
else { \
|
|
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); \
|
|
while(_sizeLeft > 0) { \
|
|
unsigned int _bytesInLane = SnP_laneLengthInBytes - _offsetInLane; \
|
|
if (_bytesInLane > _sizeLeft) \
|
|
_bytesInLane = _sizeLeft; \
|
|
SnP_ExtractAndAddBytesInLane(state, _lanePosition, _curInput, _curOutput, _offsetInLane, _bytesInLane); \
|
|
_sizeLeft -= _bytesInLane; \
|
|
_lanePosition++; \
|
|
_offsetInLane = 0; \
|
|
_curInput += _bytesInLane; \
|
|
_curOutput += _bytesInLane; \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#endif
|