@@ -640,6 +640,7 @@ static const uint64 Whirlpool_C[8*256+R] = {
640640
641641
642642// Whirlpool basic transformation. Transforms state based on block.
643+ #if BYTE_ORDER == LITTLE_ENDIAN
643644void WhirlpoolTransform (uint64 * digest , const uint64 * block )
644645{
645646#if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE
@@ -885,6 +886,79 @@ void WhirlpoolTransform(uint64 *digest, const uint64 *block)
885886 i = 0 ; do digest [i ] ^= L [i ] ^ (block )[i ]; while (++ i < 8 );
886887 }
887888}
889+ #else
890+ void WhirlpoolTransform (uint64 * digest , const uint64 * block )
891+ {
892+ union { unsigned char ch [64 ]; unsigned long long ll [8 ]; } K , state ;
893+ unsigned long long L [8 ];
894+ int r , i ;
895+
896+ i = 0 ;
897+ do {
898+ state .ll [i ] = (K .ll [i ] = digest [i ]) ^ block [i ];
899+ } while (++ i < 8 );
900+
901+ r = 0 ;
902+ do {
903+ L [0 ] = Whirlpool_C [0 * 256 + K .ch [0 * 8 + 0 ]] ^ Whirlpool_C [1 * 256 + K .ch [7 * 8 + 1 ]] ^
904+ Whirlpool_C [2 * 256 + K .ch [6 * 8 + 2 ]] ^ Whirlpool_C [3 * 256 + K .ch [5 * 8 + 3 ]] ^
905+ Whirlpool_C [4 * 256 + K .ch [4 * 8 + 4 ]] ^ Whirlpool_C [5 * 256 + K .ch [3 * 8 + 5 ]] ^
906+ Whirlpool_C [6 * 256 + K .ch [2 * 8 + 6 ]] ^ Whirlpool_C [7 * 256 + K .ch [1 * 8 + 7 ]] ^
907+ Whirlpool_C [2048 + r ];
908+
909+ L [1 ] = Whirlpool_C [0 * 256 + K .ch [1 * 8 + 0 ]] ^ Whirlpool_C [1 * 256 + K .ch [0 * 8 + 1 ]] ^
910+ Whirlpool_C [2 * 256 + K .ch [7 * 8 + 2 ]] ^ Whirlpool_C [3 * 256 + K .ch [6 * 8 + 3 ]] ^
911+ Whirlpool_C [4 * 256 + K .ch [5 * 8 + 4 ]] ^ Whirlpool_C [5 * 256 + K .ch [4 * 8 + 5 ]] ^
912+ Whirlpool_C [6 * 256 + K .ch [3 * 8 + 6 ]] ^ Whirlpool_C [7 * 256 + K .ch [2 * 8 + 7 ]];
913+
914+ L [2 ] = Whirlpool_C [0 * 256 + K .ch [2 * 8 + 0 ]] ^ Whirlpool_C [1 * 256 + K .ch [1 * 8 + 1 ]] ^
915+ Whirlpool_C [2 * 256 + K .ch [0 * 8 + 2 ]] ^ Whirlpool_C [3 * 256 + K .ch [7 * 8 + 3 ]] ^
916+ Whirlpool_C [4 * 256 + K .ch [6 * 8 + 4 ]] ^ Whirlpool_C [5 * 256 + K .ch [5 * 8 + 5 ]] ^
917+ Whirlpool_C [6 * 256 + K .ch [4 * 8 + 6 ]] ^ Whirlpool_C [7 * 256 + K .ch [3 * 8 + 7 ]];
918+
919+ L [3 ] = Whirlpool_C [0 * 256 + K .ch [3 * 8 + 0 ]] ^ Whirlpool_C [1 * 256 + K .ch [2 * 8 + 1 ]] ^
920+ Whirlpool_C [2 * 256 + K .ch [1 * 8 + 2 ]] ^ Whirlpool_C [3 * 256 + K .ch [0 * 8 + 3 ]] ^
921+ Whirlpool_C [4 * 256 + K .ch [7 * 8 + 4 ]] ^ Whirlpool_C [5 * 256 + K .ch [6 * 8 + 5 ]] ^
922+ Whirlpool_C [6 * 256 + K .ch [5 * 8 + 6 ]] ^ Whirlpool_C [7 * 256 + K .ch [4 * 8 + 7 ]];
923+
924+ L [4 ] = Whirlpool_C [0 * 256 + K .ch [4 * 8 + 0 ]] ^ Whirlpool_C [1 * 256 + K .ch [3 * 8 + 1 ]] ^
925+ Whirlpool_C [2 * 256 + K .ch [2 * 8 + 2 ]] ^ Whirlpool_C [3 * 256 + K .ch [1 * 8 + 3 ]] ^
926+ Whirlpool_C [4 * 256 + K .ch [0 * 8 + 4 ]] ^ Whirlpool_C [5 * 256 + K .ch [7 * 8 + 5 ]] ^
927+ Whirlpool_C [6 * 256 + K .ch [6 * 8 + 6 ]] ^ Whirlpool_C [7 * 256 + K .ch [5 * 8 + 7 ]];
928+
929+ L [5 ] = Whirlpool_C [0 * 256 + K .ch [5 * 8 + 0 ]] ^ Whirlpool_C [1 * 256 + K .ch [4 * 8 + 1 ]] ^
930+ Whirlpool_C [2 * 256 + K .ch [3 * 8 + 2 ]] ^ Whirlpool_C [3 * 256 + K .ch [2 * 8 + 3 ]] ^
931+ Whirlpool_C [4 * 256 + K .ch [1 * 8 + 4 ]] ^ Whirlpool_C [5 * 256 + K .ch [0 * 8 + 5 ]] ^
932+ Whirlpool_C [6 * 256 + K .ch [7 * 8 + 6 ]] ^ Whirlpool_C [7 * 256 + K .ch [6 * 8 + 7 ]];
933+
934+ L [6 ] = Whirlpool_C [0 * 256 + K .ch [6 * 8 + 0 ]] ^ Whirlpool_C [1 * 256 + K .ch [5 * 8 + 1 ]] ^
935+ Whirlpool_C [2 * 256 + K .ch [4 * 8 + 2 ]] ^ Whirlpool_C [3 * 256 + K .ch [3 * 8 + 3 ]] ^
936+ Whirlpool_C [4 * 256 + K .ch [2 * 8 + 4 ]] ^ Whirlpool_C [5 * 256 + K .ch [1 * 8 + 5 ]] ^
937+ Whirlpool_C [6 * 256 + K .ch [0 * 8 + 6 ]] ^ Whirlpool_C [7 * 256 + K .ch [7 * 8 + 7 ]];
938+
939+ L [7 ] = Whirlpool_C [0 * 256 + K .ch [7 * 8 + 0 ]] ^ Whirlpool_C [1 * 256 + K .ch [6 * 8 + 1 ]] ^
940+ Whirlpool_C [2 * 256 + K .ch [5 * 8 + 2 ]] ^ Whirlpool_C [3 * 256 + K .ch [4 * 8 + 3 ]] ^
941+ Whirlpool_C [4 * 256 + K .ch [3 * 8 + 4 ]] ^ Whirlpool_C [5 * 256 + K .ch [2 * 8 + 5 ]] ^
942+ Whirlpool_C [6 * 256 + K .ch [1 * 8 + 6 ]] ^ Whirlpool_C [7 * 256 + K .ch [0 * 8 + 7 ]];
943+
944+ // Round key mixing and substitution (with big-endian adjustment)
945+ for (i = 0 ; i < 8 ; ++ i ) {
946+ K .ll [i ] = L [i ];
947+ L [i ] ^= Whirlpool_C [0 * 256 + state .ch [i * 8 + 0 ]] ^ Whirlpool_C [1 * 256 + state .ch [((i - 1 + 8 ) % 8 ) * 8 + 1 ]] ^
948+ Whirlpool_C [2 * 256 + state .ch [((i - 2 + 8 ) % 8 ) * 8 + 2 ]] ^ Whirlpool_C [3 * 256 + state .ch [((i - 3 + 8 ) % 8 ) * 8 + 3 ]] ^
949+ Whirlpool_C [4 * 256 + state .ch [((i - 4 + 8 ) % 8 ) * 8 + 4 ]] ^ Whirlpool_C [5 * 256 + state .ch [((i - 5 + 8 ) % 8 ) * 8 + 5 ]] ^
950+ Whirlpool_C [6 * 256 + state .ch [((i - 6 + 8 ) % 8 ) * 8 + 6 ]] ^ Whirlpool_C [7 * 256 + state .ch [((i - 7 + 8 ) % 8 ) * 8 + 7 ]];
951+ }
952+
953+ memcpy (state .ll , L , sizeof (L ));
954+ } while (++ r < 10 );
955+
956+ i = 0 ;
957+ do {
958+ digest [i ] ^= L [i ] ^ block [i ];
959+ } while (++ i < 8 );
960+ }
961+ #endif
888962
889963static uint64 HashMultipleBlocks (WHIRLPOOL_CTX * const ctx , const uint64 * input , uint64 length )
890964{
0 commit comments