pairing-1.0.0: test/Test/Pairing.hs
module Test.Pairing where
import Protolude
import Data.Curve.Weierstrass
import Data.Group
import Data.Pairing.Hash
import Test.QuickCheck.Instances ()
import Test.QuickCheck.Monadic
import Test.Tasty
import Test.Tasty.QuickCheck
bilinearity :: (Eq c, Group a, Group b, Group c)
=> (a -> b -> c) -> Word -> a -> b -> Bool
bilinearity pair n x y = pair (pow x n) y == pow (pair x y) n
&& pair x (pow y n) == pow (pair x y) n
nondegeneracy :: (Eq a, Eq b, Eq c, Group a, Group b, Group c)
=> (a -> b -> c) -> a -> b -> Bool
nondegeneracy pair x y = x == mempty || y == mempty || pair x y /= mempty
testPairing :: forall e . Pairing e => e -> TestTree
testPairing _ = localOption (QuickCheckTests 10) $ testGroup "Pairing axioms"
[ testProperty "bilinearity" $
bilinearity (pairing :: G1 e -> G2 e -> GT e)
, testProperty "nondegeneracy" $
nondegeneracy (pairing :: G1 e -> G2 e -> GT e)
]
testHashBN :: forall e q r u v w . ECPairing e q r u v w => e -> TestTree
testHashBN _ = testProperty "Encoding well-defined" $ \bs -> monadicIO $ do
curve :: Maybe (G1 e) <- run $ swEncBN bs
assert $ isJust curve
let curve' = fromMaybe (panic "unreachable.") curve
assert $ def curve'
testHashBLS12 :: forall e q r u v w . ECPairing e q r u v w => e -> TestTree
testHashBLS12 _ = testProperty "Encoding well-defined" $ \bs -> monadicIO $ do
curve :: Maybe (G1 e) <- run $ swEncBLS12 bs
assert $ isJust curve
let curve' = fromMaybe (panic "unreachable.") curve
assert $ def curve'