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 +115/−42
- Tests/Tests.hs +255/−1
- siphash.cabal +2/−2
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