fixed

Pure Haskell large fixed-width integers.
git clone git://git.ppad.tech/fixed.git
Log | Files | Refs | README | LICENSE

Weight.hs (2261B)


      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 Weigh
     10 
     11 -- note that 'weigh' doesn't work properly in a repl
     12 main :: IO ()
     13 main = mainWith $ do
     14   add
     15   sub
     16   mul
     17   sqr
     18   inv
     19   redc
     20   retr
     21 
     22 add :: Weigh ()
     23 add = wgroup "add" $ do
     24   func "curve:  M(1) + M(2)" (C.add 1) 2
     25   func "curve:  M(1) + M(2 ^ 255 - 19)" (C.add 1) (2 ^ 255 - 19)
     26   func "scalar: M(1) + M(2)" (S.add 1) 2
     27   func "scalar: M(1) + M(2 ^ 255 - 19)" (S.add 1) (2 ^ 255 - 19)
     28 
     29 sub :: Weigh ()
     30 sub = wgroup "sub" $ do
     31   func "curve:  M(2 ^ 255 - 1) - M(1)"
     32     (C.sub (2 ^ 255 - 1)) 1
     33   func "curve:  M(2 ^ 255 - 1) - M(2 ^ 255 - 19)"
     34     (C.sub (2 ^ 255 - 1)) (2 ^ 255 - 19)
     35   func "scalar: M(2 ^ 255 - 1) - M(1)"
     36     (S.sub (2 ^ 255 - 1)) 1
     37   func "scalar: M(2 ^ 255 - 1) - M(2 ^ 255 - 19)"
     38     (S.sub (2 ^ 255 - 1)) (2 ^ 255 - 19)
     39 
     40 mul :: Weigh ()
     41 mul = wgroup "mul" $ do
     42   func "curve:  M(2) * M(2)" (C.mul 2) 2
     43   func "curve:  M(2) * M(2 ^ 255 - 19)" (C.mul 2) (2 ^ 255 - 19)
     44   func "scalar: M(2) * M(2)" (S.mul 2) 2
     45   func "scalar: M(2) * M(2 ^ 255 - 19)" (S.mul 2) (2 ^ 255 - 19)
     46 
     47 sqr :: Weigh ()
     48 sqr = wgroup "sqr" $ do
     49   func "curve:  M(2) ^ 2" C.sqr 2
     50   func "curve:  M(2 ^ 255 - 19) ^ 2" C.sqr (2 ^ 255 - 19)
     51   func "scalar: M(2) ^ 2" S.sqr 2
     52   func "scalar: M(2 ^ 255 - 19) ^ 2" S.sqr (2 ^ 255 - 19)
     53 
     54 inv :: Weigh ()
     55 inv = wgroup "inv" $ do
     56   func "curve:  M(2) ^ -1" C.inv 2
     57   func "curve:  M(2 ^ 255 - 19) ^ -1" C.inv (2 ^ 255 - 19)
     58   func "scalar: M(2) ^ -1" S.inv 2
     59   func "scalar: M(2 ^ 255 - 19) ^ -1" S.inv (2 ^ 255 - 19)
     60 
     61 redc :: Weigh ()
     62 redc = wgroup "redc" $ do
     63   func "curve:  REDC(M(2), M(2))" (C.redc 2) 2
     64   func "curve:  REDC(M(2), M(2 ^ 255 - 19))" (C.redc 2) (2 ^ 255 - 19)
     65   func "scalar: REDC(M(2), M(2))" (S.redc 2) 2
     66   func "scalar: REDC(M(2), M(2 ^ 255 - 19))" (S.redc 2) (2 ^ 255 - 19)
     67 
     68 retr :: Weigh ()
     69 retr = wgroup "retr" $ do
     70   func "curve:  RETR(M(2))" C.retr 2
     71   func "curve:  RETR(M(2 ^ 255 - 19))" C.retr (2 ^ 255 - 19)
     72   func "scalar: RETR(M(2))" S.retr 2
     73   func "scalar: RETR(M(2 ^ 255 - 19))" S.retr (2 ^ 255 - 19)