secp256k1

Pure Haskell Schnorr, ECDSA on the elliptic curve secp256k1 (docs.ppad.tech/secp256k1).
git clone git://git.ppad.tech/secp256k1.git
Log | Files | Refs | README | LICENSE

Main.hs (1927B)


      1 {-# LANGUAGE BangPatterns #-}
      2 {-# LANGUAGE OverloadedStrings #-}
      3 
      4 module Main where
      5 
      6 import qualified Data.ByteString as BS
      7 import Control.DeepSeq
      8 import Criterion.Main
      9 import qualified Crypto.Curve.Secp256k1 as S
     10 
     11 instance NFData S.Projective
     12 instance NFData S.Affine
     13 
     14 main :: IO ()
     15 main = defaultMain [
     16     secp256k1
     17   ]
     18 
     19 secp256k1 :: Benchmark
     20 secp256k1 = bgroup "secp256k1" [
     21       bgroup "parse" [
     22         bench "foo" $ nf bparse p
     23       , bench "bar" $ nf bparse q
     24       , bench "baz" $ nf bparse r
     25       , bench "qux" $ nf bparse s
     26       ]
     27     , bgroup "add" [
     28         bench "foo bar" $ nf (S.add foo) bar
     29       , bench "foo baz" $ nf (S.add foo) baz
     30       , bench "foo qux" $ nf (S.add foo) qux
     31       , bench "bar baz" $ nf (S.add bar) baz
     32       , bench "bar qux" $ nf (S.add bar) qux
     33       , bench "baz qux" $ nf (S.add baz) qux
     34       ]
     35     , bgroup "double" [
     36         bench "foo" $ nf S.double foo
     37       , bench "bar" $ nf S.double bar
     38       , bench "baz" $ nf S.double baz
     39       , bench "qux" $ nf S.double qux
     40       ]
     41     ]
     42   where
     43     p = "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"
     44     q = "02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9"
     45     r = "03a2113cf152585d96791a42cdd78782757fbfb5c6b2c11b59857eb4f7fda0b0e8"
     46     s = "0306413898a49c93cccf3db6e9078c1b6a8e62568e4a4770e0d7d96792d1c580ad"
     47 
     48     bparse :: BS.ByteString -> S.Projective
     49     bparse bs = case S.parse_point bs of
     50       Nothing -> error "bang"
     51       Just v -> v
     52 
     53     foo :: S.Projective
     54     foo = case S.parse_point p of
     55       Nothing -> error "boom"
     56       Just !pa -> pa
     57 
     58     bar :: S.Projective
     59     bar = case S.parse_point q of
     60       Nothing -> error "bang"
     61       Just !pa -> pa
     62 
     63     baz :: S.Projective
     64     baz = case S.parse_point r of
     65       Nothing -> error "bang"
     66       Just !pa -> pa
     67 
     68     qux :: S.Projective
     69     qux = case S.parse_point s of
     70       Nothing -> error "bang"
     71       Just !pa -> pa
     72