Lazy-Pbkdf2-3.0.0: bench/Pbkdf2.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PackageImports #-}
import Crypto.Pbkdf2
import Criterion.Main
import "cryptonite" Crypto.MAC.HMAC (initialize, update, finalize, Context(), hmacGetDigest)
import Crypto.Hash.Algorithms (SHA512)
import Data.Byteable (toBytes)
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as LB
import qualified Data.ByteArray as BA
import qualified Data.ByteString.Lazy.Char8 as C8
sha512 key = let h = (initialize key :: Context SHA512) ; in (\msg -> let h' = update h $ msg in B.pack $ BA.unpack $ hmacGetDigest $ finalize h')
doPbkdf func password salt iter = nf (\(p, s, i) -> LB.take 1000 $ func sha512 p s i) (password, salt, iter)
main = defaultMain [
bgroup "pbkdf2"
[ bench "standard" $ doPbkdf pbkdf2 "password" "saltword" 1000,
bench "iterative" $ doPbkdf pbkdf2_iterative "password" "saltword" 1000],
bgroup "long-password"
[ bench "standard" $ doPbkdf pbkdf2 (B.replicate 100000 65) "saltword" 1000,
bench "iterative" $ doPbkdf pbkdf2_iterative (B.replicate 100000 65) "saltword" 1000],
bgroup "long-salt"
[ bench "standard" $ doPbkdf pbkdf2 "password" (B.replicate 100000 65) 1000,
bench "iterative" $ doPbkdf pbkdf2_iterative "password" (B.replicate 100000 65) 1000],
bgroup "many-iterations"
[ bench "standard" $ doPbkdf pbkdf2 "password" "saltword" 10000,
bench "iterative" $ doPbkdf pbkdf2_iterative "password" "saltword" 10000]]