diff --git a/Crypto/MAC/SipHash.hs b/Crypto/MAC/SipHash.hs
--- a/Crypto/MAC/SipHash.hs
+++ b/Crypto/MAC/SipHash.hs
@@ -8,6 +8,7 @@
 -- provide the SipHash algorithm.
 -- reference: <http://131002.net/siphash/siphash.pdf>
 --
+{-# LANGUAGE BangPatterns #-}
 module Crypto.MAC.SipHash
     ( SipKey(..)
     , SipHash(..)
@@ -17,12 +18,16 @@
 
 import Data.Word
 import Data.Bits
-import Data.List (foldl')
-import Data.Serialize.Get
 import Data.ByteString (ByteString)
+import Data.ByteString.Internal
 import qualified Data.ByteString as B
-import Control.Monad (foldM,replicateM)
+import Control.Monad
 
+import Foreign.ForeignPtr
+import Foreign.Ptr
+import Foreign.Storable
+import System.Endian (fromLE64)
+
 -- | SigHash Key
 data SipKey = SipKey {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64
 
@@ -38,49 +43,117 @@
 
 -- | same as 'hash', except also specifies the number of sipround iterations for compression and digest.
 hashWith :: Int -> Int -> SipKey -> ByteString -> SipHash
-hashWith c d key b = either error (finish d) $ runGet runHash b
-    where len = B.length b
-          (nb,last) = len `divMod` 8
+hashWith c d key (PS ps s fl) = inlinePerformIO $ withForeignPtr ps (\ptr -> runHash (initSip key) (ptr `plusPtr` s) fl)
+    where runHash !st !ptr l
+                | l > 7     = fromLE64 `fmap` peek (castPtr ptr) >>= \v -> runHash (process st v) (ptr `plusPtr` 8) (l-8)
+                | otherwise = do
+                    let !lengthBlock = (fromIntegral fl `mod` 256) `unsafeShiftL` 56
+                    (finish . process st) `fmap` case l of
+                        0 -> do return lengthBlock
+                        1 -> do v0 <- peekByteOff ptr 0
+                                return (lengthBlock .|. to64 v0)
+                        2 -> do (v0,v1) <- liftM2 (,) (peekByteOff ptr 0) (peekByteOff ptr 1)
+                                return (lengthBlock
+                                        .|. (to64 v1 `unsafeShiftL` 8)
+                                        .|. to64 v0)
+                        3 -> do (v0,v1,v2) <- liftM3 (,,) (peekByteOff ptr 0) (peekByteOff ptr 1) (peekByteOff ptr 2)
+                                return (    lengthBlock
+                                        .|. (to64 v2 `unsafeShiftL` 16)
+                                        .|. (to64 v1 `unsafeShiftL` 8)
+                                        .|. to64 v0)
+                        4 -> do (v0,v1,v2,v3) <- liftM4 (,,,) (peekByteOff ptr 0) (peekByteOff ptr 1) (peekByteOff ptr 2)
+                                                              (peekByteOff ptr 3)
+                                return (    lengthBlock
+                                        .|. (to64 v3 `unsafeShiftL` 24)
+                                        .|. (to64 v2 `unsafeShiftL` 16)
+                                        .|. (to64 v1 `unsafeShiftL` 8)
+                                        .|. to64 v0)
+                        5 -> do (v0,v1,v2,v3,v4) <- liftM5 (,,,,) (peekByteOff ptr 0) (peekByteOff ptr 1) (peekByteOff ptr 2)
+                                                                  (peekByteOff ptr 3) (peekByteOff ptr 4)
+                                return (    lengthBlock
+                                        .|. (to64 v4 `unsafeShiftL` 32)
+                                        .|. (to64 v3 `unsafeShiftL` 24)
+                                        .|. (to64 v2 `unsafeShiftL` 16)
+                                        .|. (to64 v1 `unsafeShiftL` 8)
+                                        .|. to64 v0)
+                        6 -> do v0 <- peekByteOff ptr 0
+                                v1 <- peekByteOff ptr 1
+                                v2 <- peekByteOff ptr 2
+                                v3 <- peekByteOff ptr 3
+                                v4 <- peekByteOff ptr 4
+                                v5 <- peekByteOff ptr 5
+                                return (    lengthBlock
+                                        .|. (to64 v5 `unsafeShiftL` 40)
+                                        .|. (to64 v4 `unsafeShiftL` 32)
+                                        .|. (to64 v3 `unsafeShiftL` 24)
+                                        .|. (to64 v2 `unsafeShiftL` 16)
+                                        .|. (to64 v1 `unsafeShiftL` 8)
+                                        .|. to64 v0)
+                        7 -> do v0 <- peekByteOff ptr 0
+                                v1 <- peekByteOff ptr 1
+                                v2 <- peekByteOff ptr 2
+                                v3 <- peekByteOff ptr 3
+                                v4 <- peekByteOff ptr 4
+                                v5 <- peekByteOff ptr 5
+                                v6 <- peekByteOff ptr 6
+                                return (    lengthBlock
+                                        .|. (to64 v6 `unsafeShiftL` 48)
+                                        .|. (to64 v5 `unsafeShiftL` 40)
+                                        .|. (to64 v4 `unsafeShiftL` 32)
+                                        .|. (to64 v3 `unsafeShiftL` 24)
+                                        .|. (to64 v2 `unsafeShiftL` 16)
+                                        .|. (to64 v1 `unsafeShiftL` 8)
+                                        .|. to64 v0)
 
-          runHash = foldM (const . getBlock) (initSip key)[0..(nb-1)] >>= lastBlock
-          getBlock st = process c st `fmap` getWord64le
-          lastBlock st = do
-              let lengthBlock = fromIntegral (len `mod` 256) `shiftL` 56
-              z <- (fst . foldl shiftAndAdd (0,0)) `fmap` replicateM last getWord8
-              return $ process c st (lengthBlock .|. z)
+          {-# INLINE to64 #-}
+          to64 :: Word8 -> Word64
+          to64 = fromIntegral
 
-          shiftAndAdd :: (Word64,Int) -> Word8 -> (Word64,Int)
-          shiftAndAdd (acc,pos) v = (acc .|. ((fromIntegral v) `shiftL` pos), pos+8)
+          {-# INLINE process #-}
+          process istate m = newState
+              where newState = postInject $! runRoundsCompression $! preInject istate
+                    preInject  (InternalState v0 v1 v2 v3) = InternalState v0 v1 v2 (v3 `xor` m)
+                    postInject (InternalState v0 v1 v2 v3) = InternalState (v0 `xor` m) v1 v2 v3
 
-initSip (SipKey k0 k1) = InternalState (k0 `xor` 0x736f6d6570736575)
-                                       (k1 `xor` 0x646f72616e646f6d)
-                                       (k0 `xor` 0x6c7967656e657261)
-                                       (k1 `xor` 0x7465646279746573)
+          {-# INLINE finish #-}
+          finish istate = getDigest $! runRoundsDigest $! preInject istate
+              where getDigest (InternalState v0 v1 v2 v3) = SipHash (v0 `xor` v1 `xor` v2 `xor` v3)
+                    preInject (InternalState v0 v1 v2 v3) = InternalState v0 v1 (v2 `xor` 0xff) v3
 
-doRound (InternalState v0 v1 v2 v3) = do
-    let v0'    = v0 + v1
-        v2'    = v2 + v3
-        v1'    = v1 `rotateL` 13
-        v3'    = v3 `rotateL` 16
-        v1''   = v1' `xor` v0'
-        v3''   = v3' `xor` v2'
-        v0''   = v0' `rotateL` 32
-        v2''   = v2' + v1''
-        v0'''  = v0'' + v3''
-        v1'''  = v1'' `rotateL` 17
-        v3'''  = v3'' `rotateL` 21
-        v1'''' = v1''' `xor` v2''
-        v3'''' = v3''' `xor` v0'''
-        v2'''  = v2'' `rotateL` 32
-     in InternalState v0''' v1'''' v2''' v3''''
+          {-# INLINE doRound #-}
+          doRound (InternalState v0 v1 v2 v3) =
+              let !v0'    = v0 + v1
+                  !v2'    = v2 + v3
+                  !v1'    = v1 `rotateL` 13
+                  !v3'    = v3 `rotateL` 16
+                  !v1''   = v1' `xor` v0'
+                  !v3''   = v3' `xor` v2'
+                  !v0''   = v0' `rotateL` 32
+                  !v2''   = v2' + v1''
+                  !v0'''  = v0'' + v3''
+                  !v1'''  = v1'' `rotateL` 17
+                  !v3'''  = v3'' `rotateL` 21
+                  !v1'''' = v1''' `xor` v2''
+                  !v3'''' = v3''' `xor` v0'''
+                  !v2'''  = v2'' `rotateL` 32
+               in InternalState v0''' v1'''' v2''' v3''''
 
-runRounds n st = foldl' (const . doRound) st [0..(n-1)]
+          {-# INLINE runRoundsCompression #-}
+          runRoundsCompression st
+            | c == 2    = doRound $! doRound st
+            | otherwise = loopRounds c st
 
-process c istate m = newState
-    where newState = postInject $ runRounds c $ preInject $ istate
-          preInject  (InternalState v0 v1 v2 v3) = InternalState v0 v1 v2 (v3 `xor` m)
-          postInject (InternalState v0 v1 v2 v3) = InternalState (v0 `xor` m) v1 v2 v3
+          {-# INLINE runRoundsDigest #-}
+          runRoundsDigest st
+            | d == 4    = doRound $! doRound $! doRound $! doRound st
+            | otherwise = loopRounds d st
 
-finish d istate = getDigest $ runRounds d $ preInject istate
-    where getDigest (InternalState v0 v1 v2 v3) = SipHash (v0 `xor` v1 `xor` v2 `xor` v3)
-          preInject (InternalState v0 v1 v2 v3) = InternalState v0 v1 (v2 `xor` 0xff) v3
+          {-# INLINE loopRounds #-}
+          loopRounds 1 !v = doRound v
+          loopRounds n !v = loopRounds (n-1) (doRound v)
+
+          {-# INLINE initSip #-}
+          initSip (SipKey k0 k1) = InternalState (k0 `xor` 0x736f6d6570736575)
+                                                 (k1 `xor` 0x646f72616e646f6d)
+                                                 (k0 `xor` 0x6c7967656e657261)
+                                                 (k1 `xor` 0x7465646279746573)
diff --git a/Tests/Tests.hs b/Tests/Tests.hs
--- a/Tests/Tests.hs
+++ b/Tests/Tests.hs
@@ -20,10 +20,264 @@
 	| expected == got = True
 	| otherwise       = error ("expected: " ++ show expected ++ " got: " ++ show got)
 
+katKey = SipKey 0x0706050403020100 0x0f0e0d0c0b0a0908
+
 vectors =
-    [ ( SipKey 0x0706050403020100 0x0f0e0d0c0b0a0908
+    [ ( katKey
+      , ""
+      , SipHash 0x726fdb47dd0e0e31
+      )
+    , ( katKey
+      , "\x00"
+      , SipHash 0x74f839c593dc67fd
+      )
+    , ( katKey
+      , "\x00\x01"
+      , SipHash 0x0d6c8009d9a94f5a
+      )
+    , ( katKey
+      , "\x00\x01\x02"
+      , SipHash 0x85676696d7fb7e2d
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03"
+      , SipHash 0xcf2794e0277187b7
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04"
+      , SipHash 0x18765564cd99a68d
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05"
+      , SipHash 0xcbc9466e58fee3ce
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06"
+      , SipHash 0xab0200f58b01d137
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07"
+      , SipHash 0x93f5f5799a932462
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08"
+      , SipHash 0x9e0082df0ba9e4b0
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09"
+      , SipHash 0x7a5dbbc594ddb9f3
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
+      , SipHash 0xf4b32f46226bada7
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b"
+      , SipHash 0x751e8fbc860ee5fb
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c"
+      , SipHash 0x14ea5627c0843d90
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d"
+      , SipHash 0xf723ca908e7af2ee
+      )
+    , ( katKey
       , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e"
       , SipHash 0xa129ca6149be45e5
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+      , SipHash 0x3f2acc7f57c29bdb
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
+      , SipHash 0x699ae9f52cbe4794
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11"
+      , SipHash 0x4bc1b3f0968dd39c
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12"
+      , SipHash 0xbb6dc91da77961bd
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
+      , SipHash 0xbed65cf21aa2ee98
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
+      , SipHash 0xd0f2cbb02e3b67c7
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15"
+      , SipHash 0x93536795e3a33e88
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16"
+      , SipHash 0xa80c038ccd5ccec8
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17"
+      , SipHash 0xb8ad50c6f649af94
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18"
+      , SipHash 0xbce192de8a85b8ea
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19"
+      , SipHash 0x17d835b85bbb15f3
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a"
+      , SipHash 0x2f2e6163076bcfad
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b"
+      , SipHash 0xde4daaaca71dc9a5
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c"
+      , SipHash 0xa6a2506687956571
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d"
+      , SipHash 0xad87a3535c49ef28
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e"
+      , SipHash 0x32d892fad841c342
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+      , SipHash 0x7127512f72f27cce
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
+      , SipHash 0xa7f32346f95978e3
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21"
+      , SipHash 0x12e0b01abb051238
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22"
+      , SipHash 0x15e034d40fa197ae
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23"
+      , SipHash 0x314dffbe0815a3b4
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24"
+      , SipHash 0x027990f029623981
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25"
+      , SipHash 0xcadcd4e59ef40c4d
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26"
+      , SipHash 0x9abfd8766a33735c
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27"
+      , SipHash 0x0e3ea96b5304a7d0
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28"
+      , SipHash 0xad0c42d6fc585992
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29"
+      , SipHash 0x187306c89bc215a9
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a"
+      , SipHash 0xd4a60abcf3792b95
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b"
+      , SipHash 0xf935451de4f21df2
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c"
+      , SipHash 0xa9538f0419755787
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d"
+      , SipHash 0xdb9acddff56ca510
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e"
+      , SipHash 0xd06c98cd5c0975eb
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
+      , SipHash 0xe612a3cb9ecba951
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
+      , SipHash 0xc766e62cfcadaf96
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31"
+      , SipHash 0xee64435a9752fe72
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32"
+      , SipHash 0xa192d576b245165a
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33"
+      , SipHash 0x0a8787bf8ecb74b2
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34"
+      , SipHash 0x81b3e73d20b49b6f
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35"
+      , SipHash 0x7fa8220ba3b2ecea
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36"
+      , SipHash 0x245731c13ca42499
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37"
+      , SipHash 0xb78dbfaf3a8d83bd
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38"
+      , SipHash 0xea1ad565322a1a0b
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39"
+      , SipHash 0x60e61c23a3795013
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a"
+      , SipHash 0x6606d7e446282b93
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b"
+      , SipHash 0x6ca4ecb15c5f91e1
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c"
+      , SipHash 0x9f626da15c9625f3
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d"
+      , SipHash 0xe51b38608ef25f57
+      )
+    , ( katKey
+      , "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e"
+      , SipHash 0x958a324ceb064572
       )
     ]
 
diff --git a/siphash.cabal b/siphash.cabal
--- a/siphash.cabal
+++ b/siphash.cabal
@@ -1,5 +1,5 @@
 Name:                siphash
-Version:             1.0.1
+Version:             1.0.2
 Description:
     Haskell implementation of siphash. [http://131002.net/siphash/siphash.pdf]
 License:             BSD3
@@ -15,7 +15,7 @@
 data-files:          README.md
 
 Library
-  Build-Depends:     base >= 4 && < 6, bytestring, cereal
+  Build-Depends:     base >= 4 && < 6, bytestring, cpu
   Exposed-modules:   Crypto.MAC.SipHash
 
 Test-Suite test-siphash
