packages feed

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]]