mirror of
				https://github.com/python/cpython.git
				synced 2025-10-25 02:43:41 +00:00 
			
		
		
		
	
		
			
	
	
		
			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
 |