60 lines
1.9 KiB
Haskell
60 lines
1.9 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE ScopedTypeVariables #-}
|
|
{-# LANGUAGE PackageImports #-}
|
|
module Main where
|
|
|
|
import Gauge.Main
|
|
import Crypto.Hash.Algorithms as Crypto
|
|
import "cryptonite" Crypto.KDF.PBKDF2 as Crypto
|
|
import "fastpbkdf2" Crypto.KDF.PBKDF2 as Fast
|
|
import Data.ByteString as B
|
|
|
|
password :: ByteString
|
|
password = "password"
|
|
|
|
salt :: ByteString
|
|
salt = "salt"
|
|
|
|
runBench :: Int
|
|
-> (ByteString -> ByteString -> ByteString)
|
|
-> (ByteString -> ByteString -> ByteString)
|
|
-> (ByteString -> ByteString -> ByteString)
|
|
-> Benchmark
|
|
runBench iter cryptonite fastCryptonite fastBinding =
|
|
bgroup (show iter)
|
|
[ bench "cryptonite" $ whnf (cryptonite password) salt
|
|
, bench "cryptonite-fast" $ whnf (fastCryptonite password) salt
|
|
, bench "fastpbkdf2-hs" $ whnf (fastBinding password) salt
|
|
]
|
|
|
|
makeBench :: (Parameters -> ByteString -> ByteString -> ByteString)
|
|
-> (Parameters -> ByteString -> ByteString -> ByteString)
|
|
-> (ByteString -> ByteString -> Int -> Int -> ByteString)
|
|
-> [Benchmark]
|
|
makeBench cryptonite fastCryptonite fastBinding =
|
|
[ runBench 1
|
|
(cryptonite (Parameters 1 32))
|
|
(fastCryptonite (Parameters 1 32))
|
|
(\p s -> fastBinding p s 1 32)
|
|
, runBench 10000
|
|
(cryptonite (Parameters 10000 32))
|
|
(fastCryptonite (Parameters 10000 32))
|
|
(\p s -> fastBinding p s 10000 32)
|
|
]
|
|
|
|
main :: IO ()
|
|
main = defaultMain
|
|
[ bgroup "SHA1" $ makeBench
|
|
(Crypto.generate (Crypto.prfHMAC Crypto.SHA1))
|
|
(Crypto.fastPBKDF2_SHA1)
|
|
(Fast.fastpbkdf2_hmac_sha1)
|
|
, bgroup "SHA256" $ makeBench
|
|
(Crypto.generate (Crypto.prfHMAC Crypto.SHA256))
|
|
(Crypto.fastPBKDF2_SHA256)
|
|
(Fast.fastpbkdf2_hmac_sha256)
|
|
, bgroup "SHA512" $ makeBench
|
|
(Crypto.generate (Crypto.prfHMAC Crypto.SHA512))
|
|
(Crypto.fastPBKDF2_SHA512)
|
|
(Fast.fastpbkdf2_hmac_sha512)
|
|
]
|