cryptohash 0.4.1 → 0.5
raw patch · 18 files changed
+994/−15 lines, 18 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.CryptoHash.Skein512: Ctx :: !ByteString -> Ctx
+ Data.CryptoHash.Skein512: data Ctx
+ Data.CryptoHash.Skein512: finalize :: Ctx -> ByteString
+ Data.CryptoHash.Skein512: hash :: Int -> ByteString -> ByteString
+ Data.CryptoHash.Skein512: hashlazy :: Int -> ByteString -> ByteString
+ Data.CryptoHash.Skein512: init :: Int -> Ctx
+ Data.CryptoHash.Skein512: instance Storable Ctx
+ Data.CryptoHash.Skein512: update :: Ctx -> ByteString -> Ctx
+ Data.CryptoHash.Tiger: Ctx :: ByteString -> Ctx
+ Data.CryptoHash.Tiger: data Ctx
+ Data.CryptoHash.Tiger: finalize :: Ctx -> ByteString
+ Data.CryptoHash.Tiger: hash :: ByteString -> ByteString
+ Data.CryptoHash.Tiger: hashlazy :: ByteString -> ByteString
+ Data.CryptoHash.Tiger: init :: Ctx
+ Data.CryptoHash.Tiger: instance Storable Ctx
+ Data.CryptoHash.Tiger: update :: Ctx -> ByteString -> Ctx
Files
- Data/CryptoHash/MD2.hs +1/−1
- Data/CryptoHash/MD4.hs +1/−1
- Data/CryptoHash/MD5.hs +1/−1
- Data/CryptoHash/RIPEMD160.hs +1/−1
- Data/CryptoHash/SHA1.hs +1/−1
- Data/CryptoHash/SHA224.hs +1/−1
- Data/CryptoHash/SHA256.hs +1/−1
- Data/CryptoHash/SHA384.hs +1/−1
- Data/CryptoHash/SHA512.hs +1/−1
- Data/CryptoHash/Skein512.hs +115/−0
- Data/CryptoHash/Tiger.hs +102/−0
- Tests.hs +26/−1
- cbits/md2.c +1/−1
- cbits/skein512.c +222/−0
- cbits/skein512.h +45/−0
- cbits/tiger.c +415/−0
- cbits/tiger.h +43/−0
- cryptohash.cabal +16/−4
Data/CryptoHash/MD2.hs view
@@ -54,7 +54,7 @@ foreign import ccall unsafe "md2.h md2_init" c_md2_init :: Ptr Ctx -> IO () -foreign import ccall unsafe "md2.h md2_update"+foreign import ccall "md2.h md2_update" c_md2_update :: Ptr Ctx -> CString -> Word32 -> IO () foreign import ccall unsafe "md2.h md2_finalize"
Data/CryptoHash/MD4.hs view
@@ -54,7 +54,7 @@ foreign import ccall unsafe "md4.h md4_init" c_md4_init :: Ptr Ctx -> IO () -foreign import ccall unsafe "md4.h md4_update"+foreign import ccall "md4.h md4_update" c_md4_update :: Ptr Ctx -> CString -> Word32 -> IO () foreign import ccall unsafe "md4.h md4_finalize"
Data/CryptoHash/MD5.hs view
@@ -54,7 +54,7 @@ foreign import ccall unsafe "md5.h md5_init" c_md5_init :: Ptr Ctx -> IO () -foreign import ccall unsafe "md5.h md5_update"+foreign import ccall "md5.h md5_update" c_md5_update :: Ptr Ctx -> CString -> Word32 -> IO () foreign import ccall unsafe "md5.h md5_finalize"
Data/CryptoHash/RIPEMD160.hs view
@@ -54,7 +54,7 @@ foreign import ccall unsafe "ripemd.h ripemd160_init" c_ripemd160_init :: Ptr Ctx -> IO () -foreign import ccall unsafe "ripemd.h ripemd160_update"+foreign import ccall "ripemd.h ripemd160_update" c_ripemd160_update :: Ptr Ctx -> CString -> Word32 -> IO () foreign import ccall unsafe "ripemd.h ripemd160_finalize"
Data/CryptoHash/SHA1.hs view
@@ -54,7 +54,7 @@ foreign import ccall unsafe "sha1.h sha1_init" c_sha1_init :: Ptr Ctx -> IO () -foreign import ccall unsafe "sha1.h sha1_update"+foreign import ccall "sha1.h sha1_update" c_sha1_update :: Ptr Ctx -> CString -> Word32 -> IO () foreign import ccall unsafe "sha1.h sha1_finalize"
Data/CryptoHash/SHA224.hs view
@@ -54,7 +54,7 @@ foreign import ccall unsafe "sha256.h sha224_init" c_sha224_init :: Ptr Ctx -> IO () -foreign import ccall unsafe "sha256.h sha224_update"+foreign import ccall "sha256.h sha224_update" c_sha224_update :: Ptr Ctx -> CString -> Word32 -> IO () foreign import ccall unsafe "sha256.h sha224_finalize"
Data/CryptoHash/SHA256.hs view
@@ -54,7 +54,7 @@ foreign import ccall unsafe "sha256.h sha256_init" c_sha256_init :: Ptr Ctx -> IO () -foreign import ccall unsafe "sha256.h sha256_update"+foreign import ccall "sha256.h sha256_update" c_sha256_update :: Ptr Ctx -> CString -> Word32 -> IO () foreign import ccall unsafe "sha256.h sha256_finalize"
Data/CryptoHash/SHA384.hs view
@@ -54,7 +54,7 @@ foreign import ccall unsafe "sha512.h sha384_init" c_sha384_init :: Ptr Ctx -> IO () -foreign import ccall unsafe "sha512.h sha384_update"+foreign import ccall "sha512.h sha384_update" c_sha384_update :: Ptr Ctx -> CString -> Word32 -> IO () foreign import ccall unsafe "sha512.h sha384_finalize"
Data/CryptoHash/SHA512.hs view
@@ -54,7 +54,7 @@ foreign import ccall unsafe "sha512.h sha512_init" c_sha512_init :: Ptr Ctx -> IO () -foreign import ccall unsafe "sha512.h sha512_update"+foreign import ccall "sha512.h sha512_update" c_sha512_update :: Ptr Ctx -> CString -> Word32 -> IO () foreign import ccall unsafe "sha512.h sha512_finalize"
+ Data/CryptoHash/Skein512.hs view
@@ -0,0 +1,115 @@+{-# LANGUAGE ForeignFunctionInterface #-}++-- |+-- Module : Data.CryptoHash.Skein512+-- License : BSD-style+-- Maintainer : Vincent Hanquez <vincent@snarc.org>+-- Stability : experimental+-- Portability : unknown+--+-- A module containing Skein512 bindings+--+module Data.CryptoHash.Skein512 (+ Ctx(..),++ -- * Incremental hashing Functions+ init, -- :: Int -> Ctx+ update, -- :: Ctx -> ByteString -> Ctx+ finalize, -- :: Ctx -> ByteString++ -- * Single Pass hashing+ hash, -- :: Int -> ByteString -> ByteString+ hashlazy -- :: Int -> ByteString -> ByteString+ ) where++import Prelude hiding (init)+import Foreign+import Foreign.C.String+import Foreign.C.Types+import qualified Data.ByteString as B+import qualified Data.ByteString.Lazy as L+import Data.ByteString (ByteString)+import Data.ByteString.Unsafe (unsafeUseAsCStringLen, unsafeIndex)+import Data.ByteString.Internal (create)++data Ctx = Ctx !ByteString++sizeCtx :: Int+sizeCtx = 160++instance Storable Ctx where+ sizeOf _ = sizeCtx+ alignment _ = 16+ poke ptr (Ctx b) = do+ mapM_ (\i -> poke (ptr `plusPtr` i) (unsafeIndex b i)) [0..(sizeCtx-1)]++ peek ptr = do+ b <- create sizeCtx (\bptr -> do+ mapM_ (\i -> do+ f <- peek (ptr `plusPtr` i) :: IO Word8+ poke (bptr `plusPtr` i) f+ ) [0..(sizeCtx-1)]+ )+ return $ Ctx b++poke_hashlen :: Ptr Ctx -> IO Int+poke_hashlen ptr = do+ a <- peek (ptr `plusPtr` 3)+ b <- peek (ptr `plusPtr` 2)+ c <- peek (ptr `plusPtr` 1)+ d <- peek (ptr `plusPtr` 0)+ return (sl a 24 .|. sl b 16 .|. sl c 8 .|. sl d 0)+ where+ sl :: Word8 -> Int -> Int+ sl a r = (fromIntegral a) `shiftL` r++foreign import ccall unsafe "skein512.h skein512_init"+ c_skein512_init :: Ptr Ctx -> CUInt -> IO ()++foreign import ccall "skein512.h skein512_update"+ c_skein512_update :: Ptr Ctx -> CString -> Word32 -> IO ()++foreign import ccall unsafe "skein512.h skein512_finalize"+ c_skein512_finalize :: Ptr Ctx -> CString -> IO ()++allocInternal :: (Ptr Ctx -> IO a) -> IO a+allocInternal = alloca++allocInternalFrom :: Ctx -> (Ptr Ctx -> IO a) -> IO a+allocInternalFrom ctx f = allocInternal $ \ptr -> (poke ptr ctx >> f ptr)++updateInternalIO :: Ptr Ctx -> ByteString -> IO ()+updateInternalIO ptr d =+ unsafeUseAsCStringLen d (\(cs, len) -> c_skein512_update ptr cs (fromIntegral len))++finalizeInternalIO :: Ptr Ctx -> IO ByteString+finalizeInternalIO ptr = do+ digestSize <- fmap (\x -> (x + 7) `shiftR` 3) $ poke_hashlen ptr+ allocaBytes digestSize (\cs -> c_skein512_finalize ptr cs >> B.packCStringLen (cs, digestSize))++{-# NOINLINE init #-}+-- | init a context+init :: Int -> Ctx+init hashlen = unsafePerformIO $ allocInternal $ \ptr -> do (c_skein512_init ptr (fromIntegral hashlen) >> peek ptr)++{-# NOINLINE update #-}+-- | update a context with a bytestring+update :: Ctx -> ByteString -> Ctx+update ctx d = unsafePerformIO $ allocInternalFrom ctx $ \ptr -> do updateInternalIO ptr d >> peek ptr++{-# NOINLINE finalize #-}+-- | finalize the context into a digest bytestring+finalize :: Ctx -> ByteString+finalize ctx = unsafePerformIO $ allocInternalFrom ctx $ \ptr -> do finalizeInternalIO ptr++{-# NOINLINE hash #-}+-- | hash a strict bytestring into a digest bytestring+hash :: Int -> ByteString -> ByteString+hash hashlen d = unsafePerformIO $ allocInternal $ \ptr -> do+ c_skein512_init ptr (fromIntegral hashlen) >> updateInternalIO ptr d >> finalizeInternalIO ptr++{-# NOINLINE hashlazy #-}+-- | hash a lazy bytestring into a digest bytestring+hashlazy :: Int -> L.ByteString -> ByteString+hashlazy hashlen l = unsafePerformIO $ allocInternal $ \ptr -> do+ c_skein512_init ptr (fromIntegral hashlen) >> mapM_ (updateInternalIO ptr) (L.toChunks l) >> finalizeInternalIO ptr
+ Data/CryptoHash/Tiger.hs view
@@ -0,0 +1,102 @@+{-# LANGUAGE ForeignFunctionInterface #-}++-- |+-- Module : Data.CryptoHash.Tiger+-- License : BSD-style+-- Maintainer : Vincent Hanquez <vincent@snarc.org>+-- Stability : experimental+-- Portability : unknown+--+-- A module containing Tiger bindings+--+module Data.CryptoHash.Tiger (+ Ctx(..),++ -- * Incremental hashing Functions+ init, -- :: Ctx+ update, -- :: Ctx -> ByteString -> Ctx+ finalize, -- :: Ctx -> ByteString++ -- * Single Pass hashing+ hash, -- :: ByteString -> ByteString+ hashlazy -- :: ByteString -> ByteString+ ) where++import Prelude hiding (init)+import Foreign+import Foreign.C.String+import qualified Data.ByteString as B+import qualified Data.ByteString.Lazy as L+import Data.ByteString (ByteString)+import Data.ByteString.Unsafe (unsafeUseAsCStringLen, unsafeIndex)+import Data.ByteString.Internal (create)++data Ctx = Ctx ByteString++digestSize :: Int+sizeCtx :: Int++digestSize = 24+sizeCtx = 96++instance Storable Ctx where+ sizeOf _ = sizeCtx+ alignment _ = 16+ poke ptr (Ctx b) = mapM_ (\i -> poke (ptr `plusPtr` i) (unsafeIndex b i)) [0..(sizeCtx-1)]++ peek ptr = do+ b <- create sizeCtx (\bptr -> mapM_ (\i -> do+ f <- peek (ptr `plusPtr` i) :: IO Word8+ poke (bptr `plusPtr` i) f+ ) [0..(sizeCtx-1)])+ return $ Ctx $! b++foreign import ccall unsafe "tiger.h tiger_init"+ c_tiger_init :: Ptr Ctx -> IO ()++foreign import ccall "tiger.h tiger_update"+ c_tiger_update :: Ptr Ctx -> CString -> Word32 -> IO ()++foreign import ccall unsafe "tiger.h tiger_finalize"+ c_tiger_finalize :: Ptr Ctx -> CString -> IO ()++allocInternal :: (Ptr Ctx -> IO a) -> IO a+allocInternal = alloca++allocInternalFrom :: Ctx -> (Ptr Ctx -> IO a) -> IO a+allocInternalFrom ctx f = allocInternal $ \ptr -> (poke ptr ctx >> f ptr)++updateInternalIO :: Ptr Ctx -> ByteString -> IO ()+updateInternalIO ptr d =+ unsafeUseAsCStringLen d (\(cs, len) -> c_tiger_update ptr cs (fromIntegral len))++finalizeInternalIO :: Ptr Ctx -> IO ByteString+finalizeInternalIO ptr =+ allocaBytes digestSize (\cs -> c_tiger_finalize ptr cs >> B.packCStringLen (cs, digestSize))++{-# NOINLINE init #-}+-- | init a context+init :: Ctx+init = unsafePerformIO $ allocInternal $ \ptr -> do (c_tiger_init ptr >> peek ptr)++{-# NOINLINE update #-}+-- | update a context with a bytestring+update :: Ctx -> ByteString -> Ctx+update ctx d = unsafePerformIO $ allocInternalFrom ctx $ \ptr -> do updateInternalIO ptr d >> peek ptr++{-# NOINLINE finalize #-}+-- | finalize the context into a digest bytestring+finalize :: Ctx -> ByteString+finalize ctx = unsafePerformIO $ allocInternalFrom ctx $ \ptr -> do finalizeInternalIO ptr++{-# NOINLINE hash #-}+-- | hash a strict bytestring into a digest bytestring+hash :: ByteString -> ByteString+hash d = unsafePerformIO $ allocInternal $ \ptr -> do+ c_tiger_init ptr >> updateInternalIO ptr d >> finalizeInternalIO ptr++{-# NOINLINE hashlazy #-}+-- | hash a lazy bytestring into a digest bytestring+hashlazy :: L.ByteString -> ByteString+hashlazy l = unsafePerformIO $ allocInternal $ \ptr -> do+ c_tiger_init ptr >> mapM_ (updateInternalIO ptr) (L.toChunks l) >> finalizeInternalIO ptr
Tests.hs view
@@ -12,6 +12,8 @@ import qualified Data.CryptoHash.SHA384 as SHA384 import qualified Data.CryptoHash.SHA512 as SHA512 import qualified Data.CryptoHash.RIPEMD160 as RIPEMD160+import qualified Data.CryptoHash.Tiger as Tiger+import qualified Data.CryptoHash.Skein512 as Skein512 v0 = "" v1 = "The quick brown fox jumps over the lazy dog"@@ -33,7 +35,10 @@ sha384Hash = HashFct { fctHash = SHA384.hash, fctInc = hashinc SHA384.init SHA384.update SHA384.finalize } sha512Hash = HashFct { fctHash = SHA512.hash, fctInc = hashinc SHA512.init SHA512.update SHA512.finalize } ripemd160Hash = HashFct { fctHash = RIPEMD160.hash, fctInc = hashinc RIPEMD160.init RIPEMD160.update RIPEMD160.finalize }+tigerHash = HashFct { fctHash = Tiger.hash, fctInc = hashinc Tiger.init Tiger.update Tiger.finalize } +skein512Hash x = HashFct { fctHash = Skein512.hash x, fctInc = hashinc (Skein512.init x) Skein512.update Skein512.finalize }+ results :: [ (String, HashFct, [String]) ] results = [ ("MD2", md2Hash, [@@ -71,7 +76,27 @@ ("RIPEMD160", ripemd160Hash, [ "9c1185a5c5e9fc54612808977ee8f548b2258d31", "37f332f68db77bd9d7edd4969571ad671cf9dd3b",- "132072df690933835eb8b6ad0b77e7b6f14acad7" ])+ "132072df690933835eb8b6ad0b77e7b6f14acad7" ]),+ ("Tiger", tigerHash, [+ "3293ac630c13f0245f92bbb1766e16167a4e58492dde73f3",+ "6d12a41e72e644f017b6f0e2f7b44c6285f06dd5d2c5b075",+ "a8f04b0f7201a0d728101c9d26525b31764a3493fcd8458f" ])+ , ("Skein512-160", skein512Hash 160, [+ "b034bcc065b01b0c486159b3dba3e03aa52fdd70",+ "9709e7d913bc3eee240e1f302840a0da9d9acc48",+ "fb2cc0959e884d66927346552df8b51d2d98690c" ])+ , ("Skein512-384", skein512Hash 384, [+ "2c3fe10673f4d6904f27585fc3df455a678bc12d7d39d6be4b37f47b80a43889181103bc727a7db4b4e2d2dec1ded86a",+ "19d373842a6dd304454d6673cb3a8b7871f139477ac28900de739a31789f6e2846d3b641b2e8386f65061efe602d7cac",+ "bbc4e1089364dd69b0847a06bff6ce19889fed18bf57c901402c74e22ba763bf0dacb9b1d24efc78d969170fd434dad7" ])+ , ("Skein512-512", skein512Hash 512, [+ "5af68a4912e0a6187a004947a9d2a37d7a1f0873f0bdd9dc64838ece60da5535c2a55d039bd58e178948996b7a8336486ed969c894be658e47d595a5a9b86a8b",+ "e38e8ec4814aa2ca485c8ace47c929691ec6acabf2d2795006306267210728d5576d6b7d361bbf99fb1e843d9027b340f828ad074315a5d4b71361de34c511c0",+ "cd90f50e10e7fe59e263c3796b92795a78fcf561f0fea07b04faeb4e602edb4d6d9f927cc0b5f2b0671e7c7e5fc42ca8875222bcfd42936c542d8f2312fd3615" ])+ , ("Skein512-896", skein512Hash 896, [+ "bcc274c53cfa75284f8dcf71e28d19bf52f0e218c241cc1c23e2da043bf61c383899c67fdcbb7511de1831a9113720125127876df2bd0cd57d99ef303baf209c00998bc7d3749f6845d9eaf32ac629de84ac3b494efa29a68cb93d65fd25a2dcef515484b78381eede4af762a1d2f188",+ "7ad8b71b5bdcaff6f785c9b80b2b1f5fe56030f3ead98965d1ebd20ae75388c2e94097b32a01b7d11a32cef60ea9268170db51726cddf9ee62c3f33e3f84f8ec470053affb564952da6a9cb5e8a4baba8e72b9612ea95863c99b7e59a461288459990ef063fe0b066f8f24fb3794e708",+ "14b22fe85d5b22f8aa921f32bab0e2cca9d88971dd6f7624506c6662faec9c7429be5bc54be37734c52f10cd866612d0e364023e1db888579b6d9462530807ade129d308adb09eb3308ad8c8731aedb1559f6cefd7d4d9761627f727a79a149788fb267439004d5f7a8dad69a6046d8b" ]) ] hexalise s =
cbits/md2.c view
@@ -89,7 +89,7 @@ t = (t + i) & 0xff; } - memcpy (ctx->h, x, 16);+ memcpy(ctx->h, x, 16); t = ctx->cksum[15]; for (i = 0; i < 16; i++)
+ cbits/skein512.c view
@@ -0,0 +1,222 @@+/*+ * Copyright (C) 2006-2010 Vincent Hanquez <vincent@snarc.org>+ *+ * Redistribution and use in source and binary forms, with or without+ * modification, are permitted provided that the following conditions+ * are met:+ * 1. Redistributions of source code must retain the above copyright+ * notice, this list of conditions and the following disclaimer.+ * 2. Redistributions in binary form must reproduce the above copyright+ * notice, this list of conditions and the following disclaimer in the+ * documentation and/or other materials provided with the distribution.+ *+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+ */++#include <string.h>+#include "skein512.h"+#include "bitfn.h"++#define SKEIN_VERSION 1ULL+#define SKEIN_IDSTRING 0x33414853ULL++/*+t0 0-63 || t1 64-127+0-95 96-111 112-118 119 120-125 126 127+Position reserved TreeLevel BitPad Type First Final+*/+#define FLAG_FIRST (1ULL << 62)+#define FLAG_FINAL (1ULL << 63)+#define FLAG_TYPE(x) (((uint64_t) ((x) & 0x3f)) << 56)++#define TYPE_KEY 0x00+#define TYPE_CFG 0x04+#define TYPE_MSG 0x30+#define TYPE_OUT 0x3f++#define SET_TYPE(ctx, ty) ctx->t0 = 0; ctx->t1 = (ty)++static const uint8_t K512_0[4] = { 46, 36, 19, 37, };+static const uint8_t K512_1[4] = { 33, 27, 14, 42, };+static const uint8_t K512_2[4] = { 17, 49, 36, 39, };+static const uint8_t K512_3[4] = { 44, 9, 54, 56, };+static const uint8_t K512_4[4] = { 39, 30, 34, 24, };+static const uint8_t K512_5[4] = { 13, 50, 10, 17, };+static const uint8_t K512_6[4] = { 25, 29, 39, 43, };+static const uint8_t K512_7[4] = { 8, 35, 56, 22, };++static inline void skein512_do_chunk(struct skein512_ctx *ctx, uint64_t *buf, uint32_t len)+{+ uint64_t x[8];+ uint64_t ts[3];+ uint64_t ks[8+1];++ ks[8] = 0x5555555555555555;+ ks[0] = ctx->h[0]; ks[8] ^= ctx->h[0];+ ks[1] = ctx->h[1]; ks[8] ^= ctx->h[1];+ ks[2] = ctx->h[2]; ks[8] ^= ctx->h[2];+ ks[3] = ctx->h[3]; ks[8] ^= ctx->h[3];+ ks[4] = ctx->h[4]; ks[8] ^= ctx->h[4];+ ks[5] = ctx->h[5]; ks[8] ^= ctx->h[5];+ ks[6] = ctx->h[6]; ks[8] ^= ctx->h[6];+ ks[7] = ctx->h[7]; ks[8] ^= ctx->h[7];++ ts[0] = ctx->t0;+ ts[1] = ctx->t1;++ ts[0] += len;++ ts[2] = ts[0] ^ ts[1];++#define INJECTKEY(r) \+ x[0] += ks[((r)+0) % (8+1)]; \+ x[1] += ks[((r)+1) % (8+1)]; \+ x[2] += ks[((r)+2) % (8+1)]; \+ x[3] += ks[((r)+3) % (8+1)]; \+ x[4] += ks[((r)+4) % (8+1)]; \+ x[5] += ks[((r)+5) % (8+1)] + ts[((r)+0) % 3]; \+ x[6] += ks[((r)+6) % (8+1)] + ts[((r)+1) % 3]; \+ x[7] += ks[((r)+7) % (8+1)] + (r)++#define ROUND(a,b,c,d,e,f,g,h,k) \+ x[a] += x[b]; x[b] = rol64(x[b],k[0]); x[b] ^= x[a]; \+ x[c] += x[d]; x[d] = rol64(x[d],k[1]); x[d] ^= x[c]; \+ x[e] += x[f]; x[f] = rol64(x[f],k[2]); x[f] ^= x[e]; \+ x[g] += x[h]; x[h] = rol64(x[h],k[3]); x[h] ^= x[g];++#define PASS(i) \+ ROUND(0,1,2,3,4,5,6,7,K512_0); \+ ROUND(2,1,4,7,6,5,0,3,K512_1); \+ ROUND(4,1,6,3,0,5,2,7,K512_2); \+ ROUND(6,1,0,7,2,5,4,3,K512_3); \+ INJECTKEY((i*2) + 1); \+ ROUND(0,1,2,3,4,5,6,7,K512_4); \+ ROUND(2,1,4,7,6,5,0,3,K512_5); \+ ROUND(4,1,6,3,0,5,2,7,K512_6); \+ ROUND(6,1,0,7,2,5,4,3,K512_7); \+ INJECTKEY((i*2) + 2)++ x[0] = le64_to_cpu(buf[0]) + ks[0];+ x[1] = le64_to_cpu(buf[1]) + ks[1];+ x[2] = le64_to_cpu(buf[2]) + ks[2];+ x[3] = le64_to_cpu(buf[3]) + ks[3];+ x[4] = le64_to_cpu(buf[4]) + ks[4];+ x[5] = le64_to_cpu(buf[5]) + ks[5] + ts[0];+ x[6] = le64_to_cpu(buf[6]) + ks[6] + ts[1];+ x[7] = le64_to_cpu(buf[7]) + ks[7];++ /* 9 pass of 8 rounds = 72 rounds */+ PASS(0);+ PASS(1);+ PASS(2);+ PASS(3);+ PASS(4);+ PASS(5);+ PASS(6);+ PASS(7);+ PASS(8);++ ts[1] &= ~FLAG_FIRST;+ ctx->t0 = ts[0];+ ctx->t1 = ts[1];++ ctx->h[0] = x[0] ^ cpu_to_le64(buf[0]);+ ctx->h[1] = x[1] ^ cpu_to_le64(buf[1]);+ ctx->h[2] = x[2] ^ cpu_to_le64(buf[2]);+ ctx->h[3] = x[3] ^ cpu_to_le64(buf[3]);+ ctx->h[4] = x[4] ^ cpu_to_le64(buf[4]);+ ctx->h[5] = x[5] ^ cpu_to_le64(buf[5]);+ ctx->h[6] = x[6] ^ cpu_to_le64(buf[6]);+ ctx->h[7] = x[7] ^ cpu_to_le64(buf[7]);+}++void skein512_init(struct skein512_ctx *ctx, uint32_t hashlen)+{+ uint64_t buf[8];+ memset(ctx, 0, sizeof(*ctx));++ ctx->hashlen = cpu_to_le64(hashlen);+ SET_TYPE(ctx, FLAG_FIRST | FLAG_FINAL | FLAG_TYPE(TYPE_CFG));+ + memset(buf, '\0', sizeof(buf));+ buf[0] = cpu_to_le64((SKEIN_VERSION << 32) | SKEIN_IDSTRING);+ buf[1] = cpu_to_le64(hashlen);+ buf[2] = 0; /* tree info, not implemented */+ skein512_do_chunk(ctx, buf, 4*8);++ SET_TYPE(ctx, FLAG_FIRST | FLAG_TYPE(TYPE_MSG));+}++void skein512_update(struct skein512_ctx *ctx, uint8_t *data, uint32_t len)+{+ uint32_t to_fill;++ to_fill = 64 - ctx->bufindex;++ /* process partial buffer if there's enough data to make a block */+ if ((ctx->bufindex & 0x3f) && len >= to_fill) {+ memcpy(ctx->buf + ctx->bufindex, data, to_fill);+ skein512_do_chunk(ctx, (uint64_t *) ctx->buf, 64);+ len -= to_fill;+ data += to_fill;+ ctx->bufindex = 0;+ }++ /* process as much 64-block as possible except the last one in case we finalize */+ for (; len > 64; len -= 64, data += 64)+ skein512_do_chunk(ctx, (uint64_t *) data, 64);++ /* append data into buf */+ if (len) {+ memcpy(ctx->buf + ctx->bufindex, data, len);+ ctx->bufindex += len;+ }+}++void skein512_finalize(struct skein512_ctx *ctx, uint8_t *out)+{+ uint32_t outsize;+ uint64_t *p = (uint64_t *) out;+ uint64_t x[8];+ int i, j, n;++ ctx->t1 |= FLAG_FINAL;+ /* if buf is not complete pad with 0 bytes */+ if (ctx->bufindex < 64)+ memset(ctx->buf + ctx->bufindex, '\0', 64 - ctx->bufindex);+ skein512_do_chunk(ctx, (uint64_t *) ctx->buf, ctx->bufindex);++ memset(ctx->buf, '\0', 64);++ /* make sure we have a 8 bit rounded value */+ outsize = (le64_to_cpu(ctx->hashlen) + 7) >> 3;++ /* backup h[0--7] */+ for (j = 0; j < 8; j++)+ x[j] = ctx->h[j];+ /* threefish in counter mode, 0 for 1st 64 bytes, 1 for 2nd 64 bytes, .. */+ for (i = 0; i*64 < outsize; i++) {+ *((uint64_t *) ctx->buf) = cpu_to_le64(i);+ SET_TYPE(ctx, FLAG_FIRST | FLAG_FINAL | FLAG_TYPE(TYPE_OUT));+ skein512_do_chunk(ctx, (uint64_t *) ctx->buf, sizeof(uint64_t));++ n = outsize - i * 64;+ if (n >= 64) n = 64;++ /* FIXME should be little endian array copy ? */+ memcpy(out + i*64, ctx->h, n);++ /* restore h[0--7] */+ for (j = 0; j < 8; j++)+ ctx->h[j] = x[j];+ }+}
+ cbits/skein512.h view
@@ -0,0 +1,45 @@+/*+ * Copyright (C) 2006-2010 Vincent Hanquez <vincent@snarc.org>+ *+ * Redistribution and use in source and binary forms, with or without+ * modification, are permitted provided that the following conditions+ * are met:+ * 1. Redistributions of source code must retain the above copyright+ * notice, this list of conditions and the following disclaimer.+ * 2. Redistributions in binary form must reproduce the above copyright+ * notice, this list of conditions and the following disclaimer in the+ * documentation and/or other materials provided with the distribution.+ *+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+ */+#ifndef CRYPTOHASH_SKEIN512_H+#define CRYPTOHASH_SKEIN512_H++#include <stdint.h>++struct skein512_ctx+{+ uint32_t hashlen; /* in bits, typically 384, 512 */+ uint32_t bufindex;+ uint8_t buf[64];+ uint64_t h[8];+ uint64_t t0;+ uint64_t t1;+};++#define SKEIN512_CTX_SIZE sizeof(struct skein512_ctx)++void skein512_init(struct skein512_ctx *ctx, uint32_t hashlen);+void skein512_update(struct skein512_ctx *ctx, uint8_t *data, uint32_t len);+void skein512_finalize(struct skein512_ctx *ctx, uint8_t *out);++#endif
+ cbits/tiger.c view
@@ -0,0 +1,415 @@+/*+ * Copyright (C) 2006-2009 Vincent Hanquez <vincent@snarc.org>+ *+ * Redistribution and use in source and binary forms, with or without+ * modification, are permitted provided that the following conditions+ * are met:+ * 1. Redistributions of source code must retain the above copyright+ * notice, this list of conditions and the following disclaimer.+ * 2. Redistributions in binary form must reproduce the above copyright+ * notice, this list of conditions and the following disclaimer in the+ * documentation and/or other materials provided with the distribution.+ *+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+ */++#include <string.h>+#include "tiger.h"+#include "bitfn.h"++static const uint64_t t1[256] = {+ 0x02aab17cf7e90c5eULL,0xac424b03e243a8ecULL,0x72cd5be30dd5fcd3ULL,0x6d019b93f6f97f3aULL,+ 0xcd9978ffd21f9193ULL,0x7573a1c9708029e2ULL,0xb164326b922a83c3ULL,0x46883eee04915870ULL,+ 0xeaace3057103ece6ULL,0xc54169b808a3535cULL,0x4ce754918ddec47cULL,0x0aa2f4dfdc0df40cULL,+ 0x10b76f18a74dbefaULL,0xc6ccb6235ad1ab6aULL,0x13726121572fe2ffULL,0x1a488c6f199d921eULL,+ 0x4bc9f9f4da0007caULL,0x26f5e6f6e85241c7ULL,0x859079dbea5947b6ULL,0x4f1885c5c99e8c92ULL,+ 0xd78e761ea96f864bULL,0x8e36428c52b5c17dULL,0x69cf6827373063c1ULL,0xb607c93d9bb4c56eULL,+ 0x7d820e760e76b5eaULL,0x645c9cc6f07fdc42ULL,0xbf38a078243342e0ULL,0x5f6b343c9d2e7d04ULL,+ 0xf2c28aeb600b0ec6ULL,0x6c0ed85f7254bcacULL,0x71592281a4db4fe5ULL,0x1967fa69ce0fed9fULL,+ 0xfd5293f8b96545dbULL,0xc879e9d7f2a7600bULL,0x860248920193194eULL,0xa4f9533b2d9cc0b3ULL,+ 0x9053836c15957613ULL,0xdb6dcf8afc357bf1ULL,0x18beea7a7a370f57ULL,0x037117ca50b99066ULL,+ 0x6ab30a9774424a35ULL,0xf4e92f02e325249bULL,0x7739db07061ccae1ULL,0xd8f3b49ceca42a05ULL,+ 0xbd56be3f51382f73ULL,0x45faed5843b0bb28ULL,0x1c813d5c11bf1f83ULL,0x8af0e4b6d75fa169ULL,+ 0x33ee18a487ad9999ULL,0x3c26e8eab1c94410ULL,0xb510102bc0a822f9ULL,0x141eef310ce6123bULL,+ 0xfc65b90059ddb154ULL,0xe0158640c5e0e607ULL,0x884e079826c3a3cfULL,0x930d0d9523c535fdULL,+ 0x35638d754e9a2b00ULL,0x4085fccf40469dd5ULL,0xc4b17ad28be23a4cULL,0xcab2f0fc6a3e6a2eULL,+ 0x2860971a6b943fcdULL,0x3dde6ee212e30446ULL,0x6222f32ae01765aeULL,0x5d550bb5478308feULL,+ 0xa9efa98da0eda22aULL,0xc351a71686c40da7ULL,0x1105586d9c867c84ULL,0xdcffee85fda22853ULL,+ 0xccfbd0262c5eef76ULL,0xbaf294cb8990d201ULL,0xe69464f52afad975ULL,0x94b013afdf133e14ULL,+ 0x06a7d1a32823c958ULL,0x6f95fe5130f61119ULL,0xd92ab34e462c06c0ULL,0xed7bde33887c71d2ULL,+ 0x79746d6e6518393eULL,0x5ba419385d713329ULL,0x7c1ba6b948a97564ULL,0x31987c197bfdac67ULL,+ 0xde6c23c44b053d02ULL,0x581c49fed002d64dULL,0xdd474d6338261571ULL,0xaa4546c3e473d062ULL,+ 0x928fce349455f860ULL,0x48161bbacaab94d9ULL,0x63912430770e6f68ULL,0x6ec8a5e602c6641cULL,+ 0x87282515337ddd2bULL,0x2cda6b42034b701bULL,0xb03d37c181cb096dULL,0xe108438266c71c6fULL,+ 0x2b3180c7eb51b255ULL,0xdf92b82f96c08bbcULL,0x5c68c8c0a632f3baULL,0x5504cc861c3d0556ULL,+ 0xabbfa4e55fb26b8fULL,0x41848b0ab3baceb4ULL,0xb334a273aa445d32ULL,0xbca696f0a85ad881ULL,+ 0x24f6ec65b528d56cULL,0x0ce1512e90f4524aULL,0x4e9dd79d5506d35aULL,0x258905fac6ce9779ULL,+ 0x2019295b3e109b33ULL,0xf8a9478b73a054ccULL,0x2924f2f934417eb0ULL,0x3993357d536d1bc4ULL,+ 0x38a81ac21db6ff8bULL,0x47c4fbf17d6016bfULL,0x1e0faadd7667e3f5ULL,0x7abcff62938beb96ULL,+ 0xa78dad948fc179c9ULL,0x8f1f98b72911e50dULL,0x61e48eae27121a91ULL,0x4d62f7ad31859808ULL,+ 0xeceba345ef5ceaebULL,0xf5ceb25ebc9684ceULL,0xf633e20cb7f76221ULL,0xa32cdf06ab8293e4ULL,+ 0x985a202ca5ee2ca4ULL,0xcf0b8447cc8a8fb1ULL,0x9f765244979859a3ULL,0xa8d516b1a1240017ULL,+ 0x0bd7ba3ebb5dc726ULL,0xe54bca55b86adb39ULL,0x1d7a3afd6c478063ULL,0x519ec608e7669eddULL,+ 0x0e5715a2d149aa23ULL,0x177d4571848ff194ULL,0xeeb55f3241014c22ULL,0x0f5e5ca13a6e2ec2ULL,+ 0x8029927b75f5c361ULL,0xad139fabc3d6e436ULL,0x0d5df1a94ccf402fULL,0x3e8bd948bea5dfc8ULL,+ 0xa5a0d357bd3ff77eULL,0xa2d12e251f74f645ULL,0x66fd9e525e81a082ULL,0x2e0c90ce7f687a49ULL,+ 0xc2e8bcbeba973bc5ULL,0x000001bce509745fULL,0x423777bbe6dab3d6ULL,0xd1661c7eaef06eb5ULL,+ 0xa1781f354daacfd8ULL,0x2d11284a2b16affcULL,0xf1fc4f67fa891d1fULL,0x73ecc25dcb920adaULL,+ 0xae610c22c2a12651ULL,0x96e0a810d356b78aULL,0x5a9a381f2fe7870fULL,0xd5ad62ede94e5530ULL,+ 0xd225e5e8368d1427ULL,0x65977b70c7af4631ULL,0x99f889b2de39d74fULL,0x233f30bf54e1d143ULL,+ 0x9a9675d3d9a63c97ULL,0x5470554ff334f9a8ULL,0x166acb744a4f5688ULL,0x70c74caab2e4aeadULL,+ 0xf0d091646f294d12ULL,0x57b82a89684031d1ULL,0xefd95a5a61be0b6bULL,0x2fbd12e969f2f29aULL,+ 0x9bd37013feff9fe8ULL,0x3f9b0404d6085a06ULL,0x4940c1f3166cfe15ULL,0x09542c4dcdf3defbULL,+ 0xb4c5218385cd5ce3ULL,0xc935b7dc4462a641ULL,0x3417f8a68ed3b63fULL,0xb80959295b215b40ULL,+ 0xf99cdaef3b8c8572ULL,0x018c0614f8fcb95dULL,0x1b14accd1a3acdf3ULL,0x84d471f200bb732dULL,+ 0xc1a3110e95e8da16ULL,0x430a7220bf1a82b8ULL,0xb77e090d39df210eULL,0x5ef4bd9f3cd05e9dULL,+ 0x9d4ff6da7e57a444ULL,0xda1d60e183d4a5f8ULL,0xb287c38417998e47ULL,0xfe3edc121bb31886ULL,+ 0xc7fe3ccc980ccbefULL,0xe46fb590189bfd03ULL,0x3732fd469a4c57dcULL,0x7ef700a07cf1ad65ULL,+ 0x59c64468a31d8859ULL,0x762fb0b4d45b61f6ULL,0x155baed099047718ULL,0x68755e4c3d50baa6ULL,+ 0xe9214e7f22d8b4dfULL,0x2addbf532eac95f4ULL,0x32ae3909b4bd0109ULL,0x834df537b08e3450ULL,+ 0xfa209da84220728dULL,0x9e691d9b9efe23f7ULL,0x0446d288c4ae8d7fULL,0x7b4cc524e169785bULL,+ 0x21d87f0135ca1385ULL,0xcebb400f137b8aa5ULL,0x272e2b66580796beULL,0x3612264125c2b0deULL,+ 0x057702bdad1efbb2ULL,0xd4babb8eacf84be9ULL,0x91583139641bc67bULL,0x8bdc2de08036e024ULL,+ 0x603c8156f49f68edULL,0xf7d236f7dbef5111ULL,0x9727c4598ad21e80ULL,0xa08a0896670a5fd7ULL,+ 0xcb4a8f4309eba9cbULL,0x81af564b0f7036a1ULL,0xc0b99aa778199abdULL,0x959f1ec83fc8e952ULL,+ 0x8c505077794a81b9ULL,0x3acaaf8f056338f0ULL,0x07b43f50627a6778ULL,0x4a44ab49f5eccc77ULL,+ 0x3bc3d6e4b679ee98ULL,0x9cc0d4d1cf14108cULL,0x4406c00b206bc8a0ULL,0x82a18854c8d72d89ULL,+ 0x67e366b35c3c432cULL,0xb923dd61102b37f2ULL,0x56ab2779d884271dULL,0xbe83e1b0ff1525afULL,+ 0xfb7c65d4217e49a9ULL,0x6bdbe0e76d48e7d4ULL,0x08df828745d9179eULL,0x22ea6a9add53bd34ULL,+ 0xe36e141c5622200aULL,0x7f805d1b8cb750eeULL,0xafe5c7a59f58e837ULL,0xe27f996a4fb1c23cULL,+ 0xd3867dfb0775f0d0ULL,0xd0e673de6e88891aULL,0x123aeb9eafb86c25ULL,0x30f1d5d5c145b895ULL,+ 0xbb434a2dee7269e7ULL,0x78cb67ecf931fa38ULL,0xf33b0372323bbf9cULL,0x52d66336fb279c74ULL,+ 0x505f33ac0afb4eaaULL,0xe8a5cd99a2cce187ULL,0x534974801e2d30bbULL,0x8d2d5711d5876d90ULL,+ 0x1f1a412891bc038eULL,0xd6e2e71d82e56648ULL,0x74036c3a497732b7ULL,0x89b67ed96361f5abULL,+ 0xffed95d8f1ea02a2ULL,0xe72b3bd61464d43dULL,0xa6300f170bdc4820ULL,0xebc18760ed78a77aULL,+};++static const uint64_t t2[256] =+{+ 0xe6a6be5a05a12138ULL,0xb5a122a5b4f87c98ULL,0x563c6089140b6990ULL,0x4c46cb2e391f5dd5ULL,+ 0xd932addbc9b79434ULL,0x08ea70e42015aff5ULL,0xd765a6673e478cf1ULL,0xc4fb757eab278d99ULL,+ 0xdf11c6862d6e0692ULL,0xddeb84f10d7f3b16ULL,0x6f2ef604a665ea04ULL,0x4a8e0f0ff0e0dfb3ULL,+ 0xa5edeef83dbcba51ULL,0xfc4f0a2a0ea4371eULL,0xe83e1da85cb38429ULL,0xdc8ff882ba1b1ce2ULL,+ 0xcd45505e8353e80dULL,0x18d19a00d4db0717ULL,0x34a0cfeda5f38101ULL,0x0be77e518887caf2ULL,+ 0x1e341438b3c45136ULL,0xe05797f49089ccf9ULL,0xffd23f9df2591d14ULL,0x543dda228595c5cdULL,+ 0x661f81fd99052a33ULL,0x8736e641db0f7b76ULL,0x15227725418e5307ULL,0xe25f7f46162eb2faULL,+ 0x48a8b2126c13d9feULL,0xafdc541792e76eeaULL,0x03d912bfc6d1898fULL,0x31b1aafa1b83f51bULL,+ 0xf1ac2796e42ab7d9ULL,0x40a3a7d7fcd2ebacULL,0x1056136d0afbbcc5ULL,0x7889e1dd9a6d0c85ULL,+ 0xd33525782a7974aaULL,0xa7e25d09078ac09bULL,0xbd4138b3eac6edd0ULL,0x920abfbe71eb9e70ULL,+ 0xa2a5d0f54fc2625cULL,0xc054e36b0b1290a3ULL,0xf6dd59ff62fe932bULL,0x3537354511a8ac7dULL,+ 0xca845e9172fadcd4ULL,0x84f82b60329d20dcULL,0x79c62ce1cd672f18ULL,0x8b09a2add124642cULL,+ 0xd0c1e96a19d9e726ULL,0x5a786a9b4ba9500cULL,0x0e020336634c43f3ULL,0xc17b474aeb66d822ULL,+ 0x6a731ae3ec9baac2ULL,0x8226667ae0840258ULL,0x67d4567691caeca5ULL,0x1d94155c4875adb5ULL,+ 0x6d00fd985b813fdfULL,0x51286efcb774cd06ULL,0x5e8834471fa744afULL,0xf72ca0aee761ae2eULL,+ 0xbe40e4cdaee8e09aULL,0xe9970bbb5118f665ULL,0x726e4beb33df1964ULL,0x703b000729199762ULL,+ 0x4631d816f5ef30a7ULL,0xb880b5b51504a6beULL,0x641793c37ed84b6cULL,0x7b21ed77f6e97d96ULL,+ 0x776306312ef96b73ULL,0xae528948e86ff3f4ULL,0x53dbd7f286a3f8f8ULL,0x16cadce74cfc1063ULL,+ 0x005c19bdfa52c6ddULL,0x68868f5d64d46ad3ULL,0x3a9d512ccf1e186aULL,0x367e62c2385660aeULL,+ 0xe359e7ea77dcb1d7ULL,0x526c0773749abe6eULL,0x735ae5f9d09f734bULL,0x493fc7cc8a558ba8ULL,+ 0xb0b9c1533041ab45ULL,0x321958ba470a59bdULL,0x852db00b5f46c393ULL,0x91209b2bd336b0e5ULL,+ 0x6e604f7d659ef19fULL,0xb99a8ae2782ccb24ULL,0xccf52ab6c814c4c7ULL,0x4727d9afbe11727bULL,+ 0x7e950d0c0121b34dULL,0x756f435670ad471fULL,0xf5add442615a6849ULL,0x4e87e09980b9957aULL,+ 0x2acfa1df50aee355ULL,0xd898263afd2fd556ULL,0xc8f4924dd80c8fd6ULL,0xcf99ca3d754a173aULL,+ 0xfe477bacaf91bf3cULL,0xed5371f6d690c12dULL,0x831a5c285e687094ULL,0xc5d3c90a3708a0a4ULL,+ 0x0f7f903717d06580ULL,0x19f9bb13b8fdf27fULL,0xb1bd6f1b4d502843ULL,0x1c761ba38fff4012ULL,+ 0x0d1530c4e2e21f3bULL,0x8943ce69a7372c8aULL,0xe5184e11feb5ce66ULL,0x618bdb80bd736621ULL,+ 0x7d29bad68b574d0bULL,0x81bb613e25e6fe5bULL,0x071c9c10bc07913fULL,0xc7beeb7909ac2d97ULL,+ 0xc3e58d353bc5d757ULL,0xeb017892f38f61e8ULL,0xd4effb9c9b1cc21aULL,0x99727d26f494f7abULL,+ 0xa3e063a2956b3e03ULL,0x9d4a8b9a4aa09c30ULL,0x3f6ab7d500090fb4ULL,0x9cc0f2a057268ac0ULL,+ 0x3dee9d2dedbf42d1ULL,0x330f49c87960a972ULL,0xc6b2720287421b41ULL,0x0ac59ec07c00369cULL,+ 0xef4eac49cb353425ULL,0xf450244eef0129d8ULL,0x8acc46e5caf4deb6ULL,0x2ffeab63989263f7ULL,+ 0x8f7cb9fe5d7a4578ULL,0x5bd8f7644e634635ULL,0x427a7315bf2dc900ULL,0x17d0c4aa2125261cULL,+ 0x3992486c93518e50ULL,0xb4cbfee0a2d7d4c3ULL,0x7c75d6202c5ddd8dULL,0xdbc295d8e35b6c61ULL,+ 0x60b369d302032b19ULL,0xce42685fdce44132ULL,0x06f3ddb9ddf65610ULL,0x8ea4d21db5e148f0ULL,+ 0x20b0fce62fcd496fULL,0x2c1b912358b0ee31ULL,0xb28317b818f5a308ULL,0xa89c1e189ca6d2cfULL,+ 0x0c6b18576aaadbc8ULL,0xb65deaa91299fae3ULL,0xfb2b794b7f1027e7ULL,0x04e4317f443b5bebULL,+ 0x4b852d325939d0a6ULL,0xd5ae6beefb207ffcULL,0x309682b281c7d374ULL,0xbae309a194c3b475ULL,+ 0x8cc3f97b13b49f05ULL,0x98a9422ff8293967ULL,0x244b16b01076ff7cULL,0xf8bf571c663d67eeULL,+ 0x1f0d6758eee30da1ULL,0xc9b611d97adeb9b7ULL,0xb7afd5887b6c57a2ULL,0x6290ae846b984fe1ULL,+ 0x94df4cdeacc1a5fdULL,0x058a5bd1c5483affULL,0x63166cc142ba3c37ULL,0x8db8526eb2f76f40ULL,+ 0xe10880036f0d6d4eULL,0x9e0523c9971d311dULL,0x45ec2824cc7cd691ULL,0x575b8359e62382c9ULL,+ 0xfa9e400dc4889995ULL,0xd1823ecb45721568ULL,0xdafd983b8206082fULL,0xaa7d29082386a8cbULL,+ 0x269fcd4403b87588ULL,0x1b91f5f728bdd1e0ULL,0xe4669f39040201f6ULL,0x7a1d7c218cf04adeULL,+ 0x65623c29d79ce5ceULL,0x2368449096c00bb1ULL,0xab9bf1879da503baULL,0xbc23ecb1a458058eULL,+ 0x9a58df01bb401eccULL,0xa070e868a85f143dULL,0x4ff188307df2239eULL,0x14d565b41a641183ULL,+ 0xee13337452701602ULL,0x950e3dcf3f285e09ULL,0x59930254b9c80953ULL,0x3bf299408930da6dULL,+ 0xa955943f53691387ULL,0xa15edecaa9cb8784ULL,0x29142127352be9a0ULL,0x76f0371fff4e7afbULL,+ 0x0239f450274f2228ULL,0xbb073af01d5e868bULL,0xbfc80571c10e96c1ULL,0xd267088568222e23ULL,+ 0x9671a3d48e80b5b0ULL,0x55b5d38ae193bb81ULL,0x693ae2d0a18b04b8ULL,0x5c48b4ecadd5335fULL,+ 0xfd743b194916a1caULL,0x2577018134be98c4ULL,0xe77987e83c54a4adULL,0x28e11014da33e1b9ULL,+ 0x270cc59e226aa213ULL,0x71495f756d1a5f60ULL,0x9be853fb60afef77ULL,0xadc786a7f7443dbfULL,+ 0x0904456173b29a82ULL,0x58bc7a66c232bd5eULL,0xf306558c673ac8b2ULL,0x41f639c6b6c9772aULL,+ 0x216defe99fda35daULL,0x11640cc71c7be615ULL,0x93c43694565c5527ULL,0xea038e6246777839ULL,+ 0xf9abf3ce5a3e2469ULL,0x741e768d0fd312d2ULL,0x0144b883ced652c6ULL,0xc20b5a5ba33f8552ULL,+ 0x1ae69633c3435a9dULL,0x97a28ca4088cfdecULL,0x8824a43c1e96f420ULL,0x37612fa66eeea746ULL,+ 0x6b4cb165f9cf0e5aULL,0x43aa1c06a0abfb4aULL,0x7f4dc26ff162796bULL,0x6cbacc8e54ed9b0fULL,+ 0xa6b7ffefd2bb253eULL,0x2e25bc95b0a29d4fULL,0x86d6a58bdef1388cULL,0xded74ac576b6f054ULL,+ 0x8030bdbc2b45805dULL,0x3c81af70e94d9289ULL,0x3eff6dda9e3100dbULL,0xb38dc39fdfcc8847ULL,+ 0x123885528d17b87eULL,0xf2da0ed240b1b642ULL,0x44cefadcd54bf9a9ULL,0x1312200e433c7ee6ULL,+ 0x9ffcc84f3a78c748ULL,0xf0cd1f72248576bbULL,0xec6974053638cfe4ULL,0x2ba7b67c0cec4e4cULL,+ 0xac2f4df3e5ce32edULL,0xcb33d14326ea4c11ULL,0xa4e9044cc77e58bcULL,0x5f513293d934fcefULL,+ 0x5dc9645506e55444ULL,0x50de418f317de40aULL,0x388cb31a69dde259ULL,0x2db4a83455820a86ULL,+ 0x9010a91e84711ae9ULL,0x4df7f0b7b1498371ULL,0xd62a2eabc0977179ULL,0x22fac097aa8d5c0eULL,+}; ++static const uint64_t t3[256]= {+ 0xf49fcc2ff1daf39bULL,0x487fd5c66ff29281ULL,0xe8a30667fcdca83fULL,0x2c9b4be3d2fcce63ULL,+ 0xda3ff74b93fbbbc2ULL,0x2fa165d2fe70ba66ULL,0xa103e279970e93d4ULL,0xbecdec77b0e45e71ULL,+ 0xcfb41e723985e497ULL,0xb70aaa025ef75017ULL,0xd42309f03840b8e0ULL,0x8efc1ad035898579ULL,+ 0x96c6920be2b2abc5ULL,0x66af4163375a9172ULL,0x2174abdcca7127fbULL,0xb33ccea64a72ff41ULL,+ 0xf04a4933083066a5ULL,0x8d970acdd7289af5ULL,0x8f96e8e031c8c25eULL,0xf3fec02276875d47ULL,+ 0xec7bf310056190ddULL,0xf5adb0aebb0f1491ULL,0x9b50f8850fd58892ULL,0x4975488358b74de8ULL,+ 0xa3354ff691531c61ULL,0x0702bbe481d2c6eeULL,0x89fb24057deded98ULL,0xac3075138596e902ULL,+ 0x1d2d3580172772edULL,0xeb738fc28e6bc30dULL,0x5854ef8f63044326ULL,0x9e5c52325add3bbeULL,+ 0x90aa53cf325c4623ULL,0xc1d24d51349dd067ULL,0x2051cfeea69ea624ULL,0x13220f0a862e7e4fULL,+ 0xce39399404e04864ULL,0xd9c42ca47086fcb7ULL,0x685ad2238a03e7ccULL,0x066484b2ab2ff1dbULL,+ 0xfe9d5d70efbf79ecULL,0x5b13b9dd9c481854ULL,0x15f0d475ed1509adULL,0x0bebcd060ec79851ULL,+ 0xd58c6791183ab7f8ULL,0xd1187c5052f3eee4ULL,0xc95d1192e54e82ffULL,0x86eea14cb9ac6ca2ULL,+ 0x3485beb153677d5dULL,0xdd191d781f8c492aULL,0xf60866baa784ebf9ULL,0x518f643ba2d08c74ULL,+ 0x8852e956e1087c22ULL,0xa768cb8dc410ae8dULL,0x38047726bfec8e1aULL,0xa67738b4cd3b45aaULL,+ 0xad16691cec0dde19ULL,0xc6d4319380462e07ULL,0xc5a5876d0ba61938ULL,0x16b9fa1fa58fd840ULL,+ 0x188ab1173ca74f18ULL,0xabda2f98c99c021fULL,0x3e0580ab134ae816ULL,0x5f3b05b773645abbULL,+ 0x2501a2be5575f2f6ULL,0x1b2f74004e7e8ba9ULL,0x1cd7580371e8d953ULL,0x7f6ed89562764e30ULL,+ 0xb15926ff596f003dULL,0x9f65293da8c5d6b9ULL,0x6ecef04dd690f84cULL,0x4782275fff33af88ULL,+ 0xe41433083f820801ULL,0xfd0dfe409a1af9b5ULL,0x4325a3342cdb396bULL,0x8ae77e62b301b252ULL,+ 0xc36f9e9f6655615aULL,0x85455a2d92d32c09ULL,0xf2c7dea949477485ULL,0x63cfb4c133a39ebaULL,+ 0x83b040cc6ebc5462ULL,0x3b9454c8fdb326b0ULL,0x56f56a9e87ffd78cULL,0x2dc2940d99f42bc6ULL,+ 0x98f7df096b096e2dULL,0x19a6e01e3ad852bfULL,0x42a99ccbdbd4b40bULL,0xa59998af45e9c559ULL,+ 0x366295e807d93186ULL,0x6b48181bfaa1f773ULL,0x1fec57e2157a0a1dULL,0x4667446af6201ad5ULL,+ 0xe615ebcacfb0f075ULL,0xb8f31f4f68290778ULL,0x22713ed6ce22d11eULL,0x3057c1a72ec3c93bULL,+ 0xcb46acc37c3f1f2fULL,0xdbb893fd02aaf50eULL,0x331fd92e600b9fcfULL,0xa498f96148ea3ad6ULL,+ 0xa8d8426e8b6a83eaULL,0xa089b274b7735cdcULL,0x87f6b3731e524a11ULL,0x118808e5cbc96749ULL,+ 0x9906e4c7b19bd394ULL,0xafed7f7e9b24a20cULL,0x6509eadeeb3644a7ULL,0x6c1ef1d3e8ef0edeULL,+ 0xb9c97d43e9798fb4ULL,0xa2f2d784740c28a3ULL,0x7b8496476197566fULL,0x7a5be3e6b65f069dULL,+ 0xf96330ed78be6f10ULL,0xeee60de77a076a15ULL,0x2b4bee4aa08b9bd0ULL,0x6a56a63ec7b8894eULL,+ 0x02121359ba34fef4ULL,0x4cbf99f8283703fcULL,0x398071350caf30c8ULL,0xd0a77a89f017687aULL,+ 0xf1c1a9eb9e423569ULL,0x8c7976282dee8199ULL,0x5d1737a5dd1f7abdULL,0x4f53433c09a9fa80ULL,+ 0xfa8b0c53df7ca1d9ULL,0x3fd9dcbc886ccb77ULL,0xc040917ca91b4720ULL,0x7dd00142f9d1dcdfULL,+ 0x8476fc1d4f387b58ULL,0x23f8e7c5f3316503ULL,0x032a2244e7e37339ULL,0x5c87a5d750f5a74bULL,+ 0x082b4cc43698992eULL,0xdf917becb858f63cULL,0x3270b8fc5bf86ddaULL,0x10ae72bb29b5dd76ULL,+ 0x576ac94e7700362bULL,0x1ad112dac61efb8fULL,0x691bc30ec5faa427ULL,0xff246311cc327143ULL,+ 0x3142368e30e53206ULL,0x71380e31e02ca396ULL,0x958d5c960aad76f1ULL,0xf8d6f430c16da536ULL,+ 0xc8ffd13f1be7e1d2ULL,0x7578ae66004ddbe1ULL,0x05833f01067be646ULL,0xbb34b5ad3bfe586dULL,+ 0x095f34c9a12b97f0ULL,0x247ab64525d60ca8ULL,0xdcdbc6f3017477d1ULL,0x4a2e14d4decad24dULL,+ 0xbdb5e6d9be0a1eebULL,0x2a7e70f7794301abULL,0xdef42d8a270540fdULL,0x01078ec0a34c22c1ULL,+ 0xe5de511af4c16387ULL,0x7ebb3a52bd9a330aULL,0x77697857aa7d6435ULL,0x004e831603ae4c32ULL,+ 0xe7a21020ad78e312ULL,0x9d41a70c6ab420f2ULL,0x28e06c18ea1141e6ULL,0xd2b28cbd984f6b28ULL,+ 0x26b75f6c446e9d83ULL,0xba47568c4d418d7fULL,0xd80badbfe6183d8eULL,0x0e206d7f5f166044ULL,+ 0xe258a43911cbca3eULL,0x723a1746b21dc0bcULL,0xc7caa854f5d7cdd3ULL,0x7cac32883d261d9cULL,+ 0x7690c26423ba942cULL,0x17e55524478042b8ULL,0xe0be477656a2389fULL,0x4d289b5e67ab2da0ULL,+ 0x44862b9c8fbbfd31ULL,0xb47cc8049d141365ULL,0x822c1b362b91c793ULL,0x4eb14655fb13dfd8ULL,+ 0x1ecbba0714e2a97bULL,0x6143459d5cde5f14ULL,0x53a8fbf1d5f0ac89ULL,0x97ea04d81c5e5b00ULL,+ 0x622181a8d4fdb3f3ULL,0xe9bcd341572a1208ULL,0x1411258643cce58aULL,0x9144c5fea4c6e0a4ULL,+ 0x0d33d06565cf620fULL,0x54a48d489f219ca1ULL,0xc43e5eac6d63c821ULL,0xa9728b3a72770dafULL,+ 0xd7934e7b20df87efULL,0xe35503b61a3e86e5ULL,0xcae321fbc819d504ULL,0x129a50b3ac60bfa6ULL,+ 0xcd5e68ea7e9fb6c3ULL,0xb01c90199483b1c7ULL,0x3de93cd5c295376cULL,0xaed52edf2ab9ad13ULL,+ 0x2e60f512c0a07884ULL,0xbc3d86a3e36210c9ULL,0x35269d9b163951ceULL,0x0c7d6e2ad0cdb5faULL,+ 0x59e86297d87f5733ULL,0x298ef221898db0e7ULL,0x55000029d1a5aa7eULL,0x8bc08ae1b5061b45ULL,+ 0xc2c31c2b6c92703aULL,0x94cc596baf25ef42ULL,0x0a1d73db22540456ULL,0x04b6a0f9d9c4179aULL,+ 0xeffdafa2ae3d3c60ULL,0xf7c8075bb49496c4ULL,0x9cc5c7141d1cd4e3ULL,0x78bd1638218e5534ULL,+ 0xb2f11568f850246aULL,0xedfabcfa9502bc29ULL,0x796ce5f2da23051bULL,0xaae128b0dc93537cULL,+ 0x3a493da0ee4b29aeULL,0xb5df6b2c416895d7ULL,0xfcabbd25122d7f37ULL,0x70810b58105dc4b1ULL,+ 0xe10fdd37f7882a90ULL,0x524dcab5518a3f5cULL,0x3c9e85878451255bULL,0x4029828119bd34e2ULL,+ 0x74a05b6f5d3ceccbULL,0xb610021542e13ecaULL,0x0ff979d12f59e2acULL,0x6037da27e4f9cc50ULL,+ 0x5e92975a0df1847dULL,0xd66de190d3e623feULL,0x5032d6b87b568048ULL,0x9a36b7ce8235216eULL,+ 0x80272a7a24f64b4aULL,0x93efed8b8c6916f7ULL,0x37ddbff44cce1555ULL,0x4b95db5d4b99bd25ULL,+ 0x92d3fda169812fc0ULL,0xfb1a4a9a90660bb6ULL,0x730c196946a4b9b2ULL,0x81e289aa7f49da68ULL,+ 0x64669a0f83b1a05fULL,0x27b3ff7d9644f48bULL,0xcc6b615c8db675b3ULL,0x674f20b9bcebbe95ULL,+ 0x6f31238275655982ULL,0x5ae488713e45cf05ULL,0xbf619f9954c21157ULL,0xeabac46040a8eae9ULL,+ 0x454c6fe9f2c0c1cdULL,0x419cf6496412691cULL,0xd3dc3bef265b0f70ULL,0x6d0e60f5c3578a9eULL,+};++static const uint64_t t4[256]=+{+ 0x5b0e608526323c55ULL,0x1a46c1a9fa1b59f5ULL, 0xa9e245a17c4c8ffaULL,0x65ca5159db2955d7ULL,+ 0x05db0a76ce35afc2ULL,0x81eac77ea9113d45ULL, 0x528ef88ab6ac0a0dULL,0xa09ea253597be3ffULL,+ 0x430ddfb3ac48cd56ULL,0xc4b3a67af45ce46fULL, 0x4ececfd8fbe2d05eULL,0x3ef56f10b39935f0ULL,+ 0x0b22d6829cd619c6ULL,0x17fd460a74df2069ULL, 0x6cf8cc8e8510ed40ULL,0xd6c824bf3a6ecaa7ULL,+ 0x61243d581a817049ULL,0x048bacb6bbc163a2ULL, 0xd9a38ac27d44cc32ULL,0x7fddff5baaf410abULL,+ 0xad6d495aa804824bULL,0xe1a6a74f2d8c9f94ULL, 0xd4f7851235dee8e3ULL,0xfd4b7f886540d893ULL,+ 0x247c20042aa4bfdaULL,0x096ea1c517d1327cULL, 0xd56966b4361a6685ULL,0x277da5c31221057dULL,+ 0x94d59893a43acff7ULL,0x64f0c51ccdc02281ULL, 0x3d33bcc4ff6189dbULL,0xe005cb184ce66af1ULL,+ 0xff5ccd1d1db99beaULL,0xb0b854a7fe42980fULL, 0x7bd46a6a718d4b9fULL,0xd10fa8cc22a5fd8cULL,+ 0xd31484952be4bd31ULL,0xc7fa975fcb243847ULL, 0x4886ed1e5846c407ULL,0x28cddb791eb70b04ULL,+ 0xc2b00be2f573417fULL,0x5c9590452180f877ULL, 0x7a6bddfff370eb00ULL,0xce509e38d6d9d6a4ULL,+ 0xebeb0f00647fa702ULL,0x1dcc06cf76606f06ULL, 0xe4d9f28ba286ff0aULL,0xd85a305dc918c262ULL,+ 0x475b1d8732225f54ULL,0x2d4fb51668ccb5feULL, 0xa679b9d9d72bba20ULL,0x53841c0d912d43a5ULL,+ 0x3b7eaa48bf12a4e8ULL,0x781e0e47f22f1ddfULL, 0xeff20ce60ab50973ULL,0x20d261d19dffb742ULL,+ 0x16a12b03062a2e39ULL,0x1960eb2239650495ULL, 0x251c16fed50eb8b8ULL,0x9ac0c330f826016eULL,+ 0xed152665953e7671ULL,0x02d63194a6369570ULL, 0x5074f08394b1c987ULL,0x70ba598c90b25ce1ULL,+ 0x794a15810b9742f6ULL,0x0d5925e9fcaf8c6cULL, 0x3067716cd868744eULL,0x910ab077e8d7731bULL,+ 0x6a61bbdb5ac42f61ULL,0x93513efbf0851567ULL, 0xf494724b9e83e9d5ULL,0xe887e1985c09648dULL,+ 0x34b1d3c675370cfdULL,0xdc35e433bc0d255dULL, 0xd0aab84234131be0ULL,0x08042a50b48b7eafULL,+ 0x9997c4ee44a3ab35ULL,0x829a7b49201799d0ULL, 0x263b8307b7c54441ULL,0x752f95f4fd6a6ca6ULL,+ 0x927217402c08c6e5ULL,0x2a8ab754a795d9eeULL, 0xa442f7552f72943dULL,0x2c31334e19781208ULL,+ 0x4fa98d7ceaee6291ULL,0x55c3862f665db309ULL, 0xbd0610175d53b1f3ULL,0x46fe6cb840413f27ULL,+ 0x3fe03792df0cfa59ULL,0xcfe700372eb85e8fULL, 0xa7be29e7adbce118ULL,0xe544ee5cde8431ddULL,+ 0x8a781b1b41f1873eULL,0xa5c94c78a0d2f0e7ULL, 0x39412e2877b60728ULL,0xa1265ef3afc9a62cULL,+ 0xbcc2770c6a2506c5ULL,0x3ab66dd5dce1ce12ULL, 0xe65499d04a675b37ULL,0x7d8f523481bfd216ULL,+ 0x0f6f64fcec15f389ULL,0x74efbe618b5b13c8ULL, 0xacdc82b714273e1dULL,0xdd40bfe003199d17ULL,+ 0x37e99257e7e061f8ULL,0xfa52626904775aaaULL, 0x8bbbf63a463d56f9ULL,0xf0013f1543a26e64ULL,+ 0xa8307e9f879ec898ULL,0xcc4c27a4150177ccULL, 0x1b432f2cca1d3348ULL,0xde1d1f8f9f6fa013ULL,+ 0x606602a047a7ddd6ULL,0xd237ab64cc1cb2c7ULL, 0x9b938e7225fcd1d3ULL,0xec4e03708e0ff476ULL,+ 0xfeb2fbda3d03c12dULL,0xae0bced2ee43889aULL, 0x22cb8923ebfb4f43ULL,0x69360d013cf7396dULL,+ 0x855e3602d2d4e022ULL,0x073805bad01f784cULL, 0x33e17a133852f546ULL,0xdf4874058ac7b638ULL,+ 0xba92b29c678aa14aULL,0x0ce89fc76cfaadcdULL, 0x5f9d4e0908339e34ULL,0xf1afe9291f5923b9ULL,+ 0x6e3480f60f4a265fULL,0xeebf3a2ab29b841cULL, 0xe21938a88f91b4adULL,0x57dfeff845c6d3c3ULL,+ 0x2f006b0bf62caaf2ULL,0x62f479ef6f75ee78ULL, 0x11a55ad41c8916a9ULL,0xf229d29084fed453ULL,+ 0x42f1c27b16b000e6ULL,0x2b1f76749823c074ULL, 0x4b76eca3c2745360ULL,0x8c98f463b91691bdULL,+ 0x14bcc93cf1ade66aULL,0x8885213e6d458397ULL, 0x8e177df0274d4711ULL,0xb49b73b5503f2951ULL,+ 0x10168168c3f96b6bULL,0x0e3d963b63cab0aeULL, 0x8dfc4b5655a1db14ULL,0xf789f1356e14de5cULL,+ 0x683e68af4e51dac1ULL,0xc9a84f9d8d4b0fd9ULL, 0x3691e03f52a0f9d1ULL,0x5ed86e46e1878e80ULL,+ 0x3c711a0e99d07150ULL,0x5a0865b20c4e9310ULL, 0x56fbfc1fe4f0682eULL,0xea8d5de3105edf9bULL,+ 0x71abfdb12379187aULL,0x2eb99de1bee77b9cULL, 0x21ecc0ea33cf4523ULL,0x59a4d7521805c7a1ULL,+ 0x3896f5eb56ae7c72ULL,0xaa638f3db18f75dcULL, 0x9f39358dabe9808eULL,0xb7defa91c00b72acULL,+ 0x6b5541fd62492d92ULL,0x6dc6dee8f92e4d5bULL, 0x353f57abc4beea7eULL,0x735769d6da5690ceULL,+ 0x0a234aa642391484ULL,0xf6f9508028f80d9dULL, 0xb8e319a27ab3f215ULL,0x31ad9c1151341a4dULL,+ 0x773c22a57bef5805ULL,0x45c7561a07968633ULL, 0xf913da9e249dbe36ULL,0xda652d9b78a64c68ULL,+ 0x4c27a97f3bc334efULL,0x76621220e66b17f4ULL, 0x967743899acd7d0bULL,0xf3ee5bcae0ed6782ULL,+ 0x409f753600c879fcULL,0x06d09a39b5926db6ULL, 0x6f83aeb0317ac588ULL,0x01e6ca4a86381f21ULL,+ 0x66ff3462d19f3025ULL,0x72207c24ddfd3bfbULL, 0x4af6b6d3e2ece2ebULL,0x9c994dbec7ea08deULL,+ 0x49ace597b09a8bc4ULL,0xb38c4766cf0797baULL, 0x131b9373c57c2a75ULL,0xb1822cce61931e58ULL,+ 0x9d7555b909ba1c0cULL,0x127fafdd937d11d2ULL, 0x29da3badc66d92e4ULL,0xa2c1d57154c2ecbcULL,+ 0x58c5134d82f6fe24ULL,0x1c3ae3515b62274fULL, 0xe907c82e01cb8126ULL,0xf8ed091913e37fcbULL,+ 0x3249d8f9c80046c9ULL,0x80cf9bede388fb63ULL, 0x1881539a116cf19eULL,0x5103f3f76bd52457ULL,+ 0x15b7e6f5ae47f7a8ULL,0xdbd7c6ded47e9ccfULL, 0x44e55c410228bb1aULL,0xb647d4255edb4e99ULL,+ 0x5d11882bb8aafc30ULL,0xf5098bbb29d3212aULL, 0x8fb5ea14e90296b3ULL,0x677b942157dd025aULL,+ 0xfb58e7c0a390acb5ULL,0x89d3674c83bd4a01ULL, 0x9e2da4df4bf3b93bULL,0xfcc41e328cab4829ULL,+ 0x03f38c96ba582c52ULL,0xcad1bdbd7fd85db2ULL, 0xbbb442c16082ae83ULL,0xb95fe86ba5da9ab0ULL,+ 0xb22e04673771a93fULL,0x845358c9493152d8ULL, 0xbe2a488697b4541eULL,0x95a2dc2dd38e6966ULL,+ 0xc02c11ac923c852bULL,0x2388b1990df2a87bULL, 0x7c8008fa1b4f37beULL,0x1f70d0c84d54e503ULL,+ 0x5490adec7ece57d4ULL,0x002b3c27d9063a3aULL, 0x7eaea3848030a2bfULL,0xc602326ded2003c0ULL,+ 0x83a7287d69a94086ULL,0xc57a5fcb30f57a8aULL, 0xb56844e479ebe779ULL,0xa373b40f05dcbce9ULL,+ 0xd71a786e88570ee2ULL,0x879cbacdbde8f6a0ULL, 0x976ad1bcc164a32fULL,0xab21e25e9666d78bULL,+ 0x901063aae5e5c33cULL,0x9818b34448698d90ULL, 0xe36487ae3e1e8abbULL,0xafbdf931893bdcb4ULL,+ 0x6345a0dc5fbbd519ULL,0x8628fe269b9465caULL, 0x1e5d01603f9c51ecULL,0x4de44006a15049b7ULL,+ 0xbf6c70e5f776cbb1ULL,0x411218f2ef552bedULL, 0xcb0c0708705a36a3ULL,0xe74d14754f986044ULL,+ 0xcd56d9430ea8280eULL,0xc12591d7535f5065ULL, 0xc83223f1720aef96ULL,0xc3a0396f7363a51fULL,+}; ++void tiger_init(struct tiger_ctx *ctx)+{+ memset(ctx, 0, sizeof(*ctx));++ ctx->h[0] = 0x0123456789abcdefULL;+ ctx->h[1] = 0xfedcba9876543210ULL;+ ctx->h[2] = 0xf096a5b4c3b2e187ULL;+}++static inline void tiger_do_chunk(struct tiger_ctx *ctx, uint64_t *buf)+{+ uint64_t x0, x1, x2, x3, x4, x5, x6, x7;+ uint64_t a,b,c;+ a = ctx->h[0];+ b = ctx->h[1];+ c = ctx->h[2];++ x0 = cpu_to_le64(buf[0]); x1 = cpu_to_le64(buf[1]); x2 = cpu_to_le64(buf[2]); x3 = cpu_to_le64(buf[3]);+ x4 = cpu_to_le64(buf[4]); x5 = cpu_to_le64(buf[5]); x6 = cpu_to_le64(buf[6]); x7 = cpu_to_le64(buf[7]);++#define BYTEOF(c, n) ((uint8_t) (c >> ((n * 8))))++#define ROUND(a,b,c,x,mul) \+ c ^= x; \+ a -= t1[BYTEOF(c,0)] ^ t2[BYTEOF(c,2)] ^ t3[BYTEOF(c,4)] ^ t4[BYTEOF(c,6)]; \+ b += t4[BYTEOF(c,1)] ^ t3[BYTEOF(c,3)] ^ t2[BYTEOF(c,5)] ^ t1[BYTEOF(c,7)]; \+ b *= mul;++#define PASS(a,b,c,mul) \+ ROUND(a,b,c,x0,mul); \+ ROUND(b,c,a,x1,mul); \+ ROUND(c,a,b,x2,mul); \+ ROUND(a,b,c,x3,mul); \+ ROUND(b,c,a,x4,mul); \+ ROUND(c,a,b,x5,mul); \+ ROUND(a,b,c,x6,mul); \+ ROUND(b,c,a,x7,mul)++#define SCHEDULE() \+ x0 -= x7 ^ 0xa5a5a5a5a5a5a5a5ULL; \+ x1 ^= x0; \+ x2 += x1; \+ x3 -= x2 ^ ((~x1)<<19); \+ x4 ^= x3; \+ x5 += x4; \+ x6 -= x5 ^ ((~x4)>>23); \+ x7 ^= x6; \+ x0 += x7; \+ x1 -= x0 ^ ((~x7)<<19); \+ x2 ^= x1; \+ x3 += x2; \+ x4 -= x3 ^ ((~x2)>>23); \+ x5 ^= x4; \+ x6 += x5; \+ x7 -= x6 ^ 0x0123456789abcdefULL++ PASS(a,b,c,5);+ SCHEDULE();+ PASS(c,a,b,7);+ SCHEDULE();+ PASS(b,c,a,9);++ ctx->h[0] ^= a;+ ctx->h[1] = b - ctx->h[1];+ ctx->h[2] += c;+}++void tiger_update(struct tiger_ctx *ctx, uint8_t *data, uint32_t len)+{+ uint32_t index, to_fill;++ index = (uint32_t) (ctx->sz & 0x3f);+ to_fill = 64 - index;++ ctx->sz += len;++ /* process partial buffer if there's enough data to make a block */+ if (index && len >= to_fill) {+ memcpy(ctx->buf + index, data, to_fill);+ tiger_do_chunk(ctx, (uint64_t *) ctx->buf);+ len -= to_fill;+ data += to_fill;+ index = 0;+ }++ /* process as much 64-block as possible */+ for (; len >= 64; len -= 64, data += 64)+ tiger_do_chunk(ctx, (uint64_t *) data);++ /* append data into buf */+ if (len)+ memcpy(ctx->buf + index, data, len);+}++void tiger_finalize(struct tiger_ctx *ctx, uint8_t *out)+{+ static uint8_t padding[64] = { 0x01, };+ uint64_t bits;+ uint32_t index, padlen;+ uint64_t *p = (uint64_t *) out;++ /* add padding and update data with it */+ bits = cpu_to_le64(ctx->sz << 3);++ /* pad out to 56 */+ index = (uint32_t) (ctx->sz & 0x3f);+ padlen = (index < 56) ? (56 - index) : ((64 + 56) - index);+ tiger_update(ctx, padding, padlen);++ /* append length */+ tiger_update(ctx, (uint8_t *) &bits, sizeof(bits));++ /* output hash */+ p[0] = cpu_to_le64(ctx->h[0]);+ p[1] = cpu_to_le64(ctx->h[1]);+ p[2] = cpu_to_le64(ctx->h[2]);+}
+ cbits/tiger.h view
@@ -0,0 +1,43 @@+/*+ * Copyright (C) 2006-2009 Vincent Hanquez <vincent@snarc.org>+ *+ * Redistribution and use in source and binary forms, with or without+ * modification, are permitted provided that the following conditions+ * are met:+ * 1. Redistributions of source code must retain the above copyright+ * notice, this list of conditions and the following disclaimer.+ * 2. Redistributions in binary form must reproduce the above copyright+ * notice, this list of conditions and the following disclaimer in the+ * documentation and/or other materials provided with the distribution.+ *+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+ */+#ifndef CRYPTOHASH_TIGER_H+#define CRYPTOHASH_TIGER_H++#include <stdint.h>++struct tiger_ctx+{+ uint64_t sz;+ uint8_t buf[64];+ uint64_t h[3];+};++#define TIGER_DIGEST_SIZE 24+#define TIGER_CTX_SIZE (sizeof(struct tiger_ctx))++void tiger_init(struct tiger_ctx *ctx);+void tiger_update(struct tiger_ctx *ctx, uint8_t *data, uint32_t len);+void tiger_finalize(struct tiger_ctx *ctx, uint8_t *out);++#endif
cryptohash.cabal view
@@ -1,19 +1,25 @@ Name: cryptohash-Version: 0.4.1-Description: Efficient crypto hash computation+Version: 0.5+Description:+ A collection of crypto hashes, with a practical incremental and one-pass, pure APIs,+ with performance close to the fastest implementations available in others languages.+ .+ The implementations are made in C with a haskell FFI wrapper that hide the C implementation.+ License: BSD3 License-file: LICENSE Author: Vincent Hanquez Maintainer: vincent@snarc.org-Synopsis: crypto hashes fast and practical+Synopsis: collection of crypto hashes, fast, pure and pratical Category: Data, Cryptography Build-Type: Simple Cabal-Version: >=1.6+data-files: README extra-source-files: cbits/bitfn.h cbits/md2.h cbits/md4.h cbits/md5.h cbits/ripemd.h cbits/sha1.h cbits/sha256.h cbits/sha512.h- README+ cbits/tiger.h cbits/skein512.h Flag test Description: Build unit test@@ -31,6 +37,8 @@ Data.CryptoHash.MD4 Data.CryptoHash.MD5 Data.CryptoHash.RIPEMD160+ Data.CryptoHash.Skein512+ Data.CryptoHash.Tiger ghc-options: -Wall -O2 -optc-O3 -fno-cse C-sources: cbits/sha1.c cbits/sha256.c@@ -39,6 +47,8 @@ cbits/md4.c cbits/md5.c cbits/ripemd.c+ cbits/skein512.c+ cbits/tiger.c Include-Dirs: cbits Executable Tests@@ -51,6 +61,8 @@ cbits/md4.c cbits/md5.c cbits/ripemd.c+ cbits/skein512.c+ cbits/tiger.c if flag(test) Buildable: True Build-depends: base >= 3 && < 5, HUnit, bytestring