packages feed

saltine-0.2.0.0: bench/SignBench.hs

module SignBench (benchSign, signEnv) where

import Criterion.Main

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

import Crypto.Saltine.Core.Sign as S

import BenchUtils

signEnv :: IO Keypair
signEnv = newKeypair

benchSign :: Keypair -> Benchmark
benchSign alice = do
  let sign :: ByteString -> ByteString
      sign = S.sign (secretKey alice)

      verify :: ByteString -> Bool
      verify message =
        let signed = sign message
        in case S.signOpen (publicKey alice) signed of
          Nothing -> False
          Just ms -> True

      signDetached               = S.signDetached       (secretKey alice)
      signVerifyDetached message = S.signVerifyDetached (publicKey alice) (signDetached message)
  bgroup "Sign"
    [ bench "newKeypair" $ nfIO newKeypair
    , bgroup "sign"
      [ bench "128 B" $ nf sign bs128
      , bench "1 MB"  $ nf sign mb1
      , bench "5 MB"  $ nf sign mb5
      ]
    , bgroup "sign+verify"
      [ bench "128 B" $ nf verify bs128
      , bench "1 MB"  $ nf verify mb1
      , bench "5 MB"  $ nf verify mb5
      ]
    , bgroup "signDetached"
      [ bench "128 B" $ nf signDetached bs128
      , bench "1 MB"  $ nf signDetached mb1
      , bench "5 MB"  $ nf signDetached mb5
      ]
    , bgroup "signDetached+verifyDetached"
      [ bench "128 B" $ nf signVerifyDetached bs128
      , bench "1 MB"  $ nf signVerifyDetached mb1
      , bench "5 MB"  $ nf signVerifyDetached mb5
      ]
    ]