Belle II Software  release-05-01-25
SnP-Relaned.h
1 /*
2 Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni,
3 Joan Daemen, MichaĆ«l Peeters, Gilles Van Assche and Ronny Van Keer, hereby
4 denoted as "the implementer".
5 
6 For more information, feedback or questions, please refer to our websites:
7 http://keccak.noekeon.org/
8 http://keyak.noekeon.org/
9 http://ketje.noekeon.org/
10 
11 To the extent possible under law, the implementer has waived all copyright
12 and related or neighboring rights to the source code in this file.
13 http://creativecommons.org/publicdomain/zero/1.0/
14 */
15 
16 #ifndef _SnP_Relaned_h_
17 #define _SnP_Relaned_h_
18 
19 #define SnP_AddBytes(state, data, offset, length, SnP_AddLanes, SnP_AddBytesInLane, SnP_laneLengthInBytes) \
20  { \
21  if ((offset) == 0) { \
22  SnP_AddLanes(state, data, (length)/SnP_laneLengthInBytes); \
23  SnP_AddBytesInLane(state, \
24  (length)/SnP_laneLengthInBytes, \
25  (data)+((length)/SnP_laneLengthInBytes)*SnP_laneLengthInBytes, \
26  0, \
27  (length)%SnP_laneLengthInBytes); \
28  } \
29  else { \
30  unsigned int _sizeLeft = (length); \
31  unsigned int _lanePosition = (offset)/SnP_laneLengthInBytes; \
32  unsigned int _offsetInLane = (offset)%SnP_laneLengthInBytes; \
33  const unsigned char *_curData = (data); \
34  while(_sizeLeft > 0) { \
35  unsigned int _bytesInLane = SnP_laneLengthInBytes - _offsetInLane; \
36  if (_bytesInLane > _sizeLeft) \
37  _bytesInLane = _sizeLeft; \
38  SnP_AddBytesInLane(state, _lanePosition, _curData, _offsetInLane, _bytesInLane); \
39  _sizeLeft -= _bytesInLane; \
40  _lanePosition++; \
41  _offsetInLane = 0; \
42  _curData += _bytesInLane; \
43  } \
44  } \
45  }
46 
47 #define SnP_OverwriteBytes(state, data, offset, length, SnP_OverwriteLanes, SnP_OverwriteBytesInLane, SnP_laneLengthInBytes) \
48  { \
49  if ((offset) == 0) { \
50  SnP_OverwriteLanes(state, data, (length)/SnP_laneLengthInBytes); \
51  SnP_OverwriteBytesInLane(state, \
52  (length)/SnP_laneLengthInBytes, \
53  (data)+((length)/SnP_laneLengthInBytes)*SnP_laneLengthInBytes, \
54  0, \
55  (length)%SnP_laneLengthInBytes); \
56  } \
57  else { \
58  unsigned int _sizeLeft = (length); \
59  unsigned int _lanePosition = (offset)/SnP_laneLengthInBytes; \
60  unsigned int _offsetInLane = (offset)%SnP_laneLengthInBytes; \
61  const unsigned char *_curData = (data); \
62  while(_sizeLeft > 0) { \
63  unsigned int _bytesInLane = SnP_laneLengthInBytes - _offsetInLane; \
64  if (_bytesInLane > _sizeLeft) \
65  _bytesInLane = _sizeLeft; \
66  SnP_OverwriteBytesInLane(state, _lanePosition, _curData, _offsetInLane, _bytesInLane); \
67  _sizeLeft -= _bytesInLane; \
68  _lanePosition++; \
69  _offsetInLane = 0; \
70  _curData += _bytesInLane; \
71  } \
72  } \
73  }
74 
75 #define SnP_ExtractBytes(state, data, offset, length, SnP_ExtractLanes, SnP_ExtractBytesInLane, SnP_laneLengthInBytes) \
76  { \
77  if ((offset) == 0) { \
78  SnP_ExtractLanes(state, data, (length)/SnP_laneLengthInBytes); \
79  SnP_ExtractBytesInLane(state, \
80  (length)/SnP_laneLengthInBytes, \
81  (data)+((length)/SnP_laneLengthInBytes)*SnP_laneLengthInBytes, \
82  0, \
83  (length)%SnP_laneLengthInBytes); \
84  } \
85  else { \
86  unsigned int _sizeLeft = (length); \
87  unsigned int _lanePosition = (offset)/SnP_laneLengthInBytes; \
88  unsigned int _offsetInLane = (offset)%SnP_laneLengthInBytes; \
89  unsigned char *_curData = (data); \
90  while(_sizeLeft > 0) { \
91  unsigned int _bytesInLane = SnP_laneLengthInBytes - _offsetInLane; \
92  if (_bytesInLane > _sizeLeft) \
93  _bytesInLane = _sizeLeft; \
94  SnP_ExtractBytesInLane(state, _lanePosition, _curData, _offsetInLane, _bytesInLane); \
95  _sizeLeft -= _bytesInLane; \
96  _lanePosition++; \
97  _offsetInLane = 0; \
98  _curData += _bytesInLane; \
99  } \
100  } \
101  }
102 
103 #define SnP_ExtractAndAddBytes(state, input, output, offset, length, SnP_ExtractAndAddLanes, SnP_ExtractAndAddBytesInLane, SnP_laneLengthInBytes) \
104  { \
105  if ((offset) == 0) { \
106  SnP_ExtractAndAddLanes(state, input, output, (length)/SnP_laneLengthInBytes); \
107  SnP_ExtractAndAddBytesInLane(state, \
108  (length)/SnP_laneLengthInBytes, \
109  (input)+((length)/SnP_laneLengthInBytes)*SnP_laneLengthInBytes, \
110  (output)+((length)/SnP_laneLengthInBytes)*SnP_laneLengthInBytes, \
111  0, \
112  (length)%SnP_laneLengthInBytes); \
113  } \
114  else { \
115  unsigned int _sizeLeft = (length); \
116  unsigned int _lanePosition = (offset)/SnP_laneLengthInBytes; \
117  unsigned int _offsetInLane = (offset)%SnP_laneLengthInBytes; \
118  const unsigned char *_curInput = (input); \
119  unsigned char *_curOutput = (output); \
120  while(_sizeLeft > 0) { \
121  unsigned int _bytesInLane = SnP_laneLengthInBytes - _offsetInLane; \
122  if (_bytesInLane > _sizeLeft) \
123  _bytesInLane = _sizeLeft; \
124  SnP_ExtractAndAddBytesInLane(state, _lanePosition, _curInput, _curOutput, _offsetInLane, _bytesInLane); \
125  _sizeLeft -= _bytesInLane; \
126  _lanePosition++; \
127  _offsetInLane = 0; \
128  _curInput += _bytesInLane; \
129  _curOutput += _bytesInLane; \
130  } \
131  } \
132  }
133 
134 #endif