bulletproofs-0.2.1: Bulletproofs/RangeProof/Verifier.hs
{-# LANGUAGE RecordWildCards, MultiWayIf, NamedFieldPuns #-}
module Bulletproofs.RangeProof.Verifier (
verifyProof,
verifyTPoly,
verifyLRCommitment,
) where
import Protolude
import qualified Crypto.PubKey.ECC.Types as Crypto
import Bulletproofs.RangeProof.Internal
import Bulletproofs.Curve
import Bulletproofs.Utils
import qualified Bulletproofs.MultiRangeProof.Verifier as MRP
-- | Verify that a commitment was computed from a value in a given range
verifyProof
:: (AsInteger f, Eq f, Field f, Show f)
=> Integer -- ^ Range upper bound
-> Crypto.Point -- ^ Commitments of in-range values
-> RangeProof f
-- ^ Proof that a secret committed value lies in a certain interval
-> Bool
verifyProof upperBound vCommit proof@RangeProof{..}
= MRP.verifyProof upperBound [vCommit] proof
-- | Verify the constant term of the polynomial t
-- t = t(x) = t0 + t1*x + t2*x^2
-- This is what binds the proof to the actual original Pedersen commitment V to the actual value
verifyTPoly
:: (AsInteger f, Eq f, Field f, Show f)
=> Integer -- ^ Dimension n of the vectors
-> Crypto.Point -- ^ Commitment of in-range value
-> RangeProof f
-- ^ Proof that a secret committed value lies in a certain interval
-> f -- ^ Challenge x
-> f -- ^ Challenge y
-> f -- ^ Challenge z
-> Bool
verifyTPoly n vCommit
= MRP.verifyTPoly n [vCommit]
-- | Verify the inner product argument for the vectors l and r that form t
verifyLRCommitment
:: (AsInteger f, Eq f, Field f, Show f)
=> Integer -- ^ Dimension n of the vectors
-> RangeProof f
-- ^ Proof that a secret committed value lies in a certain interval
-> f -- ^ Challenge x
-> f -- ^ Challenge y
-> f -- ^ Challenge z
-> Bool
verifyLRCommitment n
= MRP.verifyLRCommitment n 1