packages feed

eccrypto-0.2.3.2: bench/bench.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  
-- Copyright   :  (c) Marcel Fourné 20[09..14]
-- License     :  BSD3
-- Maintainer  :  Marcel Fourné (haskell@marcelfourne.de)
--
-- benchmarks
-- recommended:
-- $ ghc --make -threaded bench.hs
-- best performance measured with just 1 thread
--
-----------------------------------------------------------------------------
{-# OPTIONS_GHC -O2 -feager-blackholing #-}

{-# LANGUAGE ScopedTypeVariables #-}

import Crypto.ECC.Weierstrass.Internal.Curvemath
import Crypto.ECC.Weierstrass.StandardCurves
import Crypto.ECC.Weierstrass.ECDSA
import Crypto.ECC.Weierstrass.ECDH
import qualified System.Random as R
import Criterion
import Criterion.Main
import qualified Crypto.ECC.Ed25519.Sign as ED
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as C8

main::IO ()
main = do
  let c1 = ECi (stdc_l p256) (stdc_b p256) (stdc_p p256) (stdc_r p256)
      p1 = ECPp  (stdc_xp p256) (stdc_yp p256) 1
      rand = 93151144317885463729940025875124971369191600717633105593660251066268358953543
      pub = ECPp 49820351311576200663416054279040683857746363070013834679270516876052449262634 112699216918648906269327207660688102462037435574122213014814143327521473380783 18523244708209522220381629035092551864971849988089188687523906648093563992014
      sig = Right (108572692541258481963147160841164483731413918681474718309791481920132693582956,115780011294752138434352400342471965517508651449475483422239281368412284031413)
      Right (r,s) = sig
      pkfix = C8.pack "\185`\134^:gJw\146E\137@dw1\243w\212\178\213ry\140\159\137\&7yT+Y\156\EM"
      skfix = C8.pack "\131\190G\200\SYN\191&<\ETBd\223W\145}3\247#8\133\195\NUL\139\&8\138\197\132\191\255\SOC/\SOH"
      sigfix = C8.pack "S\EM\199\149\135\DC4Zr\242=\227(\139D\US,\232\159\210m\131\176\145\155\189\166Gl\186X\157\149U(zhd\224\133\DC1\237\FS\DLE\DC3\223S\153\218\214)\219o\177\n\248F\223^A\236\196\175N\STX"
  k13' <- R.getStdRandom (R.randomR (1,stdc_p p256)) -- evalRandIO $ getRandomR (1,stdc_p p256)
  Right (sk,pk) <- ED.genkeys
  defaultMain [ bgroup "NIST P-256" [ bench "ECDHp256" $ whnf (basicecdh c1 p1) k13'
                                    , bench "ECDSAp256 sign" $ whnf (basicecdsa (BS.pack [0..255]) rand) rand
                                    , bench "ECDSAp256 verify" $ whnf (\x -> basicecdsaVerify pub (r,x) (BS.pack [0..255])) s
                                    ]
              , bgroup "Ed25519" [ bench "sign" $ nf (benchED sk) $ fromInteger k13'
                                 , bench "verify" $ nf (verifyED pkfix sigfix) $ fromInteger k13'
                                 ]
              ]

benchED sk n = let m = BS.pack $ [n, 0..255]
               in ED.dsign sk m

verifyED pk sig n = let m = BS.pack $ [n, 0..255]
                    in if ED.verify pk (BS.append sig m) == Right ED.SigOK then True else False