packages feed

saltine-0.2.0.0: bench/BoxBench.hs

module BoxBench (benchBox, boxEnv) where

import Criterion.Main

import Control.Monad
import Control.DeepSeq
import Control.Exception
import Data.ByteString as BS

import Crypto.Saltine.Core.Box

import BenchUtils


boxEnv :: IO (Keypair, Keypair)
boxEnv = do
  alice <- newKeypair
  bob   <- newKeypair
  return (alice, bob)


benchBox :: (Keypair, Keypair) -> Benchmark
benchBox (alice, bob) = do
  let encrypt :: ByteString -> IO ByteString
      encrypt b = newNonce >>= \n -> pure $ box (publicKey bob) (secretKey alice) n b

      decrypt :: ByteString -> IO (Maybe ByteString)
      decrypt message = do
        n <- newNonce
        let ciphertext = box (publicKey alice) (secretKey bob) n message
        return $ boxOpen (publicKey bob) (secretKey alice) n ciphertext

  bgroup "Box"
    [ bench "newKeypair" $ nfIO newKeypair
    , bgroup "encrypt"
      [ bench "128 B" $ nfIO $ encrypt bs128
      , bench "1 MB"  $ nfIO $ encrypt mb1
      , bench "5 MB"  $ nfIO $ encrypt mb5
      ]
    , bgroup "encrypt+decrypt"
      [ bench "128 B" $ nfIO $ decrypt bs128
      , bench "1 MB"  $ nfIO $ decrypt mb1
      , bench "5 MB"  $ nfIO $ decrypt mb5
      ]
    ]