packages feed

lol-0.3.0.0: tests/ZqTests.hs

{-# LANGUAGE DataKinds, FlexibleContexts, NoImplicitPrelude,
             ScopedTypeVariables, TypeOperators #-}

module ZqTests (zqTests) where

import Apply.Zq
import Tests
import Utils

import Crypto.Lol
import Crypto.Lol.CRTrans

import qualified Test.Framework as TF

zqTests :: [TF.Test]
zqTests = [
  testGroupM "(+)" $ applyBasic zqTypes $ hideArgs prop_add,
  testGroupM "(*)" $ applyBasic zqTypes $ hideArgs prop_mul,
  testGroupM "^-1" $ applyBasic zqTypes $ hideArgs prop_recip,
  testGroupM "extension ring (*)" $ applyBasic zqTypes $ hideArgs prop_mul_ext
  ]

prop_add :: forall r . (Ring r, Eq r) => LiftedMod r -> LiftedMod r -> Test r
prop_add (LMod x) (LMod y) = test $ fromIntegral (x + y) == (fromIntegral x + fromIntegral y :: r)

prop_mul :: forall r . (Ring r, Eq r) => LiftedInvertible r -> LiftedInvertible r -> Test r
prop_mul (LInv x) (LInv y) = test $ fromIntegral (x * y) == (fromIntegral x * fromIntegral y :: r)

prop_recip :: forall r . (Field r, Eq r) => Invertible r -> Test r
prop_recip (Invertible x) = test $ one == (x * recip x)

-- tests that multiplication in the extension ring matches CRT multiplication
prop_mul_ext :: forall r . (CRTEmbed r, Ring r, Eq r)
  => Invertible r -> Invertible r -> Test r
prop_mul_ext (Invertible x) (Invertible y) = test $
  let z = x * y
      z' = fromExt $ toExt x * toExt y
  in z == z'

type ZqTypes = [
  Zq 3,
  Zq 7,
  Zq (3 ** 5),
  Zq (3 ** 5 ** 7)]

zqTypes :: Proxy ZqTypes
zqTypes = Proxy