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

commit 188bc9415064a02082ede321d98bef3846d62fd5
parent 7776c0b240f5b4958e062cc9931ab4d3f9337b34
Author: Jared Tobin <jared@jtobin.io>
Date:   Tue, 26 Nov 2024 10:42:10 +0400

meta: remove non-wnaf allocs

Diffstat:
MREADME.md | 12++----------
Mbench/Weight.hs | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 53 insertions(+), 10 deletions(-)

diff --git a/README.md b/README.md @@ -90,21 +90,13 @@ In terms of allocations, we get: schnorr Case Allocated GCs - sign_schnorr (small) 7,227,408 1 - sign_schnorr (large) 7,174,600 1 - sign_schnorr' (small) 3,323,392 0 - sign_schnorr' (large) 3,273,824 0 - verify_schnorr 2,947,544 0 + sign_schnorr' 3,273,824 0 verify_schnorr' 1,667,360 0 ecdsa Case Allocated GCs - sign_ecdsa (small) 2,280,360 0 - sign_ecdsa (large) 2,277,136 0 - sign_ecdsa' (small) 326,624 0 - sign_ecdsa' (large) 324,672 0 - verify_ecdsa 5,014,264 1 + sign_ecdsa' 324,672 0 verify_ecdsa' 3,796,328 0 ``` diff --git a/bench/Weight.hs b/bench/Weight.hs @@ -26,7 +26,9 @@ main :: IO () main = W.mainWith $ do remQ parse_int256 + add mul + mul_unsafe mul_wnaf derive_pub schnorr @@ -42,11 +44,24 @@ parse_int256 = W.wgroup "parse_int256" $ do W.func' "parse_int256 (small)" S.parse_int256 (BS.replicate 32 0x00) W.func' "parse_int256 (big)" S.parse_int256 (BS.replicate 32 0xFF) +add :: W.Weigh () +add = W.wgroup " add" $ do + W.func "2 p (double, trivial projective point)" (S.add p) p + W.func "2 r (double, nontrivial projective point)" (S.add r) r + W.func "p + q (trivial projective points)" (S.add p) q + W.func "p + s (nontrivial mixed points)" (S.add p) s + W.func "s + r (nontrivial projective points)" (S.add s) r + mul :: W.Weigh () mul = W.wgroup "mul" $ do W.func "2 G" (S.mul S._CURVE_G) 2 W.func "(2 ^ 255 - 19) G" (S.mul S._CURVE_G) big +mul_unsafe :: W.Weigh () +mul_unsafe = W.wgroup "mul_unsafe" $ do + W.func "2 G" (S.mul_unsafe S._CURVE_G) 2 + W.func "(2 ^ 255 - 19) G" (S.mul_unsafe S._CURVE_G) big + mul_wnaf :: W.Weigh () mul_wnaf = W.wgroup "mul_wnaf" $ do W.value "precompute" S.precompute @@ -106,3 +121,39 @@ s_aux :: BS.ByteString s_aux = B16.decodeLenient "0000000000000000000000000000000000000000000000000000000000000001" +p_bs :: BS.ByteString +p_bs = B16.decodeLenient + "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" + +p :: S.Projective +p = case S.parse_point p_bs of + Nothing -> error "bang" + Just !pt -> pt + +q_bs :: BS.ByteString +q_bs = B16.decodeLenient + "02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9" + +q :: S.Projective +q = case S.parse_point q_bs of + Nothing -> error "bang" + Just !pt -> pt + +r_bs :: BS.ByteString +r_bs = B16.decodeLenient + "03a2113cf152585d96791a42cdd78782757fbfb5c6b2c11b59857eb4f7fda0b0e8" + +r :: S.Projective +r = case S.parse_point r_bs of + Nothing -> error "bang" + Just !pt -> pt + +s_bs :: BS.ByteString +s_bs = B16.decodeLenient + "0306413898a49c93cccf3db6e9078c1b6a8e62568e4a4770e0d7d96792d1c580ad" + +s :: S.Projective +s = case S.parse_point s_bs of + Nothing -> error "bang" + Just !pt -> pt +