Main.hs (2510B)
1 {-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns -fno-warn-type-defaults #-} 2 {-# LANGUAGE BangPatterns #-} 3 {-# LANGUAGE OverloadedStrings #-} 4 5 module Main where 6 7 import qualified Numeric.Montgomery.Secp256k1.Curve as C 8 import qualified Numeric.Montgomery.Secp256k1.Scalar as S 9 import Criterion.Main 10 11 main :: IO () 12 main = defaultMain [ 13 add 14 , sub 15 , mul 16 , sqr 17 , inv 18 , redc 19 , retr 20 ] 21 22 add :: Benchmark 23 add = bgroup "add" [ 24 bench "curve: M(1) + M(2)" $ nf (C.add 1) 2 25 , bench "curve: M(1) + M(2 ^ 255 - 19)" $ nf (C.add 1) (2 ^ 255 - 19) 26 , bench "scalar: M(1) + M(2)" $ nf (S.add 1) 2 27 , bench "scalar: M(1) + M(2 ^ 255 - 19)" $ nf (S.add 1) (2 ^ 255 - 19) 28 ] 29 30 sub :: Benchmark 31 sub = bgroup "sub" [ 32 bench "curve: M(2 ^ 255 - 1) - M(1)" $ nf 33 (C.sub (2 ^ 255 - 1)) 34 1 35 , bench "curve: M(2 ^ 255 - 1) - M(2 ^ 255 - 19)" $ nf 36 (C.sub (2 ^ 255 - 1)) 37 (2 ^ 255 - 19) 38 , bench "scalar: M(2 ^ 255 - 1) - M(1)" $ nf 39 (S.sub (2 ^ 255 - 1)) 40 1 41 , bench "scalar: M(2 ^ 255 - 1) - M(2 ^ 255 - 19)" $ nf 42 (S.sub (2 ^ 255 - 1)) 43 (2 ^ 255 - 19) 44 ] 45 46 mul :: Benchmark 47 mul = bgroup "mul" [ 48 bench "curve: M(2) * M(2)" $ nf (C.mul 2) 2 49 , bench "curve: M(2) * M(2 ^ 255 - 19)" $ nf (C.mul 2) (2 ^ 255 - 19) 50 , bench "scalar: M(2) * M(2)" $ nf (S.mul 2) 2 51 , bench "scalar: M(2) * M(2 ^ 255 - 19)" $ nf (S.mul 2) (2 ^ 255 - 19) 52 ] 53 54 sqr :: Benchmark 55 sqr = bgroup "sqr" [ 56 bench "curve: M(2) ^ 2" $ nf C.sqr 2 57 , bench "curve: M(2 ^ 255 - 19) ^ 2" $ nf C.sqr (2 ^ 255 - 19) 58 , bench "scalar: M(2) ^ 2" $ nf S.sqr 2 59 , bench "scalar: M(2 ^ 255 - 19) ^ 2" $ nf S.sqr (2 ^ 255 - 19) 60 ] 61 62 inv :: Benchmark 63 inv = bgroup "inv" [ 64 bench "curve: M(2) ^ -1" $ nf C.inv 2 65 , bench "curve: M(2 ^ 255 - 19) ^ -1" $ nf C.inv (2 ^ 255 - 19) 66 , bench "scalar: M(2) ^ -1" $ nf S.inv 2 67 , bench "scalar: M(2 ^ 255 - 19) ^ -1" $ nf S.inv (2 ^ 255 - 19) 68 ] 69 70 redc :: Benchmark 71 redc = bgroup "redc" [ 72 bench "curve: REDC(M(2), M(2))" $ nf (C.redc 2) 2 73 , bench "curve: REDC(M(2), M(2 ^ 255 - 19))" $ nf (C.redc 2) (2 ^ 255 - 19) 74 , bench "scalar: REDC(M(2), M(2))" $ nf (S.redc 2) 2 75 , bench "scalar: REDC(M(2), M(2 ^ 255 - 19))" $ nf (S.redc 2) (2 ^ 255 - 19) 76 ] 77 78 retr :: Benchmark 79 retr = bgroup "retr" [ 80 bench "curve: RETR(M(2))" $ nf C.retr 2 81 , bench "curve: RETR(M(2 ^ 255 - 19))" $ nf C.retr (2 ^ 255 - 19) 82 , bench "scalar: RETR(M(2))" $ nf S.retr 2 83 , bench "scalar: RETR(M(2 ^ 255 - 19))" $ nf S.retr (2 ^ 255 - 19) 84 ] 85