packages feed

siphash 1.0.1 → 1.0.2

raw patch · 3 files changed

+372/−45 lines, 3 filesdep +cpudep −cerealdep ~basedep ~bytestring

Dependencies added: cpu

Dependencies removed: cereal

Dependency ranges changed: base, bytestring

Files

Crypto/MAC/SipHash.hs view
@@ -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)
Tests/Tests.hs view
@@ -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       )     ] 
siphash.cabal view
@@ -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