module Crypto.Threefish.Mix where
import Data.Word
import Data.Bits
mix :: Word64 -> Word64 -> Int -> (Word64, Word64)
mix !a !b !r =
case a + b of
a' -> (a', rotateL b r `xor` a')
mixKey :: Word64 -> Word64 -> Int -> Word64 -> Word64 -> (Word64, Word64)
mixKey !a !b !r !k0 !k1 =
(a', rotateL b' r `xor` a')
where
!b' = b + k1
!a' = a + b' + k0
unmix :: Word64 -> Word64 -> Int -> (Word64, Word64)
unmix !a !b !r =
case rotateR (b `xor` a) r of
b' -> (a b', b')
unmixKey :: Word64 -> Word64 -> Int -> Word64 -> Word64 -> (Word64, Word64)
unmixKey !a !b !r !k0 !k1 =
(a', b' k1)
where
!b' = rotateR (b `xor` a) r
!a' = a (b' + k0)