threefish-0.1: Crypto/Threefish/Mix.hs
{-# LANGUAGE BangPatterns #-}
module Crypto.Threefish.Mix where
import Data.Word
import Data.Bits
{-# INLINE mix #-}
mix :: Word64 -> Word64 -> Int -> (Word64, Word64)
mix !a !b !r =
case a + b of
a' -> (a', rotateL b r `xor` a')
{-# INLINE mixKey #-}
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
{-# INLINE unmix #-}
unmix :: Word64 -> Word64 -> Int -> (Word64, Word64)
unmix !a !b !r =
case rotateR (b `xor` a) r of
b' -> (a - b', b')
{-# INLINE unmixKey #-}
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)