{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE NoImplicitPrelude #-} module Main ( main, ) where import Protolude import qualified Crypto.PubKey.ECC.Prim as ECC import Test.Tasty import Test.Tasty.HUnit as HU import Test.Tasty.QuickCheck import Test.QuickCheck.Monadic as QM import Example (micpWrapper, micpComponents) import Pedersen import PrimeField import qualified VectorPedersen as VP suite :: TestTree suite = testGroup "Test Suite" [ testGroup "Units" [vectorPedersenTests] -- [ pedersenTests -- , micpTests -- , vectorPedersenTests -- ] ] pedersenTests :: TestTree pedersenTests = testGroup "Pedersen Commitment Scheme" [ localOption (QuickCheckTests 50) $ testProperty "x == Open(Commit(x),r)" $ monadicIO $ do (a, cp) <- liftIO $ setup 256 x <- liftIO $ randomInZq $ pedersenSPF cp pc <- liftIO $ commit x cp QM.assert $ open cp (commitment pc) (reveal pc) , testCaseSteps "Additive Homomorphic Commitments" $ \step -> do step "Generating commit params..." (a,cp) <- setup 256 let spf = pedersenSPF cp step "Generating two random numbers in Zp to commit..." x <- randomInZq spf y <- randomInZq spf step "Committing the two random numbers..." px@(Pedersen cx rx) <- commit x cp py@(Pedersen cy ry) <- commit y cp step "Verifying Additive Homomorphic property..." let cz = addCommitments cp cx cy let pz = verifyAddCommitments cp px py assertAddHomo $ cz == commitment pz , testProperty "x == Open(Commit(x),r) (EC) " $ monadicIO $ do cp <- liftIO $ ecSetup Nothing -- uses SECP256k1 by default x <- liftIO $ ECC.scalarGenerate $ ecCurve cp pc <- liftIO $ ecCommit x cp QM.assert $ ecOpen cp (ecCommitment pc) (ecReveal pc) , testCaseSteps "Additive Homomorphic Commitments (EC) " $ \step -> do step "Generating commit params..." ecp <- ecSetup Nothing let curve = ecCurve ecp step "Generating two random numbers in Ep (EC prime field order q)..." x <- ECC.scalarGenerate curve y <- ECC.scalarGenerate curve step "Committing the two random numbers..." px@(ECPedersen cx rx) <- ecCommit x ecp py@(ECPedersen cy ry) <- ecCommit y ecp step "Verifying Additive Homomorphic property..." let cz = ecAddCommitments ecp cx cy let pz = ecVerifyAddCommitments ecp px py assertAddHomo $ cz == ecCommitment pz , testCaseSteps "Additive Homomorphic property (EC) | nG + C(x) == (x + n)G + rH" $ \step -> do step "Generating commit params..." ecp <- ecSetup Nothing let curve = ecCurve ecp step "Generating a random number to commit..." x <- ECC.scalarGenerate curve step "Committing the the random number..." px@(ECPedersen cx rx) <- ecCommit x ecp step "Generating a random number to add to the commitment..." n <- ECC.scalarGenerate curve step "Verifying the Additive homomorphic property" let cy = ecAddInteger ecp cx n let py = ecVerifyAddInteger ecp px n assertAddHomo $ cy == ecCommitment py ] where assertAddHomo :: Bool -> IO () assertAddHomo = assertBool "Additive homomorphic property doesn't hold." micpTests :: TestTree micpTests = testGroup "Mutually Independent Commitment Protocol" [ testCase "Testing MICP Components" $ assertBool "MICP Components test failed!" =<< micpComponents 256 , testCase "Testing MICP Wrapper" $ assertBool "MICP Wrapper test failed!" =<< micpWrapper 256 ] vectorPedersenTests :: TestTree vectorPedersenTests = testGroup "Vector Pedersen Commitment" [ localOption (QuickCheckTests 10) $ testProperty "xs == Open(Commit(xs),r) (EC) " $ \n -> monadicIO $ do cp <- liftIO $ ecSetup Nothing -- uses SECP256k1 by default v <- liftIO $ VP.scalarGenerateN (ecCurve cp) n pc <- liftIO $ VP.ecCommit v cp QM.assert $ VP.ecOpen cp (VP.ecCommitment pc) (VP.ecReveal pc) , localOption (QuickCheckTests 10) $ testProperty "Additive Homomorphic Commitments (EC) " $ \n -> monadicIO $ do cp <- liftIO $ ecSetup Nothing v <- liftIO $ VP.scalarGenerateN (ecCurve cp) n w <- liftIO $ VP.scalarGenerateN (ecCurve cp) n pv@(VP.ECPedersen cv rv) <- liftIO $ VP.ecCommit v cp pw@(VP.ECPedersen cw rw) <- liftIO $ VP.ecCommit w cp let cz = ecAddCommitments cp cv cw let pz = VP.ecVerifyAddCommitments cp pv pw QM.assert $ cz == VP.ecCommitment pz , localOption (QuickCheckTests 10) $ testProperty "Additive Homomorphic property (EC) | wG + C(v) == (v + w)G + rH" $ \n -> monadicIO $ do cp <- liftIO $ ecSetup Nothing v <- liftIO $ VP.scalarGenerateN (ecCurve cp) n pv@(VP.ECPedersen cv rv) <- liftIO $ VP.ecCommit v cp w <- liftIO $ VP.scalarGenerateN (ecCurve cp) n let cw = VP.ecAddVector cp cv w let pw = VP.ecVerifyAddVector cp pv w QM.assert $ cw == VP.ecCommitment pw ] main :: IO () main = defaultMain suite