content: module PasswordBench (benchPassword, passwordEnv) where
  
  import Criterion.Main
  
  import Control.Monad
  import Control.DeepSeq
  import Control.Exception
  import Data.ByteString as BS
  import Data.Maybe      (fromJust)
  import Data.Text       (Text)
  
  import Crypto.Saltine.Core.Password as P
  
  import BenchUtils
  
  passwordEnv :: IO Salt
  passwordEnv = newSalt
  
  benchPassword :: Salt -> Benchmark
  benchPassword s = do
    let hashAndVerify :: Text -> Policy ->  IO Bool
        hashAndVerify p pol = do
            h <- pwhashStr p pol
            pure $ pwhashStrVerify (fromJust h) p
  
        hashAndRehash :: Text -> Policy -> IO (Maybe Bool)
        hashAndRehash p pol = do
            h <- pwhashStr p pol
            pure $ needsRehash (opsPolicy pol) (memPolicy pol) (fromJust h)
  
    bgroup "Password"
      [ bench "newSalt" $ nfIO newSalt
      , bgroup "hash + verify"
        [ bgroup "interactive"
          [ bench "128 B" $ nfIO $ hashAndVerify s128  interactivePolicy
          , bench "2 KB"  $ nfIO $ hashAndVerify s2000 interactivePolicy
          ]
        , bgroup "moderate"
          [ bench "128 B" $ nfIO $ hashAndVerify s128  moderatePolicy
          , bench "2 KB"  $ nfIO $ hashAndVerify s2000 moderatePolicy
          ]
        , bgroup "sensitive"
          [ bench "128 B" $ nfIO $ hashAndVerify s128  sensitivePolicy
          , bench "2 KB"  $ nfIO $ hashAndVerify s2000 sensitivePolicy
          ]
        ]
      , bgroup "needsRehash"
        [ bgroup "interactive"
          [ bench "128 B" $ nfIO $ hashAndRehash s128  interactivePolicy
          , bench "2 KB"  $ nfIO $ hashAndRehash s2000 interactivePolicy
          ]
        , bgroup "moderate"
          [ bench "128 B" $ nfIO $ hashAndRehash s128  moderatePolicy
          , bench "2 KB"  $ nfIO $ hashAndRehash s2000 moderatePolicy
          ]
        , bgroup "sensitive"
          [ bench "128 B" $ nfIO $ hashAndRehash s128  sensitivePolicy
          , bench "2 KB"  $ nfIO $ hashAndRehash s2000 sensitivePolicy
          ]
        ]
      , bgroup "pwhash"
        [ bgroup "interactive"
          [ bench "128 B + 256"  $ nf (pwhash s128 (2^8 ) s) interactivePolicy
          , bench "128 B + 512"  $ nf (pwhash s128 (2^9 ) s) interactivePolicy
          , bench "128 B + 1024" $ nf (pwhash s128 (2^10) s) interactivePolicy
          , bench "128 B + 2048" $ nf (pwhash s128 (2^11) s) interactivePolicy
          , bench "128 B + 4096" $ nf (pwhash s128 (2^12) s) interactivePolicy
          , bench "128 B + 8192" $ nf (pwhash s128 (2^13) s) interactivePolicy
          ]
        , bgroup "moderate"
          [ bench "128 B + 256"  $ nf (pwhash s128 (2^8 ) s) moderatePolicy
          , bench "128 B + 512"  $ nf (pwhash s128 (2^9 ) s) moderatePolicy
          , bench "128 B + 1024" $ nf (pwhash s128 (2^10) s) moderatePolicy
          , bench "128 B + 2048" $ nf (pwhash s128 (2^11) s) moderatePolicy
          , bench "128 B + 4096" $ nf (pwhash s128 (2^12) s) moderatePolicy
          , bench "128 B + 8192" $ nf (pwhash s128 (2^13) s) moderatePolicy
          ]
        , bgroup "sensitive"
          [ bench "128 B + 256"  $ nf (pwhash s128 (2^8 ) s) sensitivePolicy
          , bench "128 B + 512"  $ nf (pwhash s128 (2^9 ) s) sensitivePolicy
          , bench "128 B + 1024" $ nf (pwhash s128 (2^10) s) sensitivePolicy
          , bench "128 B + 2048" $ nf (pwhash s128 (2^11) s) sensitivePolicy
          , bench "128 B + 4096" $ nf (pwhash s128 (2^12) s) sensitivePolicy
          , bench "128 B + 8192" $ nf (pwhash s128 (2^13) s) sensitivePolicy
          ]
        ]
      ]
  