{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoStarIsType #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -fno-warn-partial-type-signatures #-}
module Crypto.Lol.Tests.Default (
defaultZqTests, cycTests,
cpxTensorTests, dblTensorTests, int64TensorTests, zqTensorTests
)
where
import Crypto.Lol (Cyc, Int64)
import Crypto.Lol.Factored
import Crypto.Lol.Tests.CycTests
import Crypto.Lol.Tests.TensorTests
import Crypto.Lol.Tests.ZqTests
import Crypto.Lol.Types.IrreducibleChar2 ()
import Crypto.Lol.Types.Unsafe.Complex (Complex)
import Crypto.Lol.Utils.ShowType
import Crypto.Lol.Utils.Tests (Gen, Test, choose, chooseAny,
testGroup)
import qualified Algebra.Ring as Ring (fromInteger)
import Data.Proxy
type CpxDbl = Complex Double
cpxDblGen :: Gen CpxDbl
cpxDblGen = chooseAny
boundedInt64Gen :: Gen Int64
boundedInt64Gen = choose (-100, 100)
int64TensorGen :: forall t m . _ => Gen (t m Int64)
int64TensorGen = choose (Ring.fromInteger (-100), Ring.fromInteger 100)
unifTensorTests1 :: forall t m r . _ => Proxy '(m,r) -> Proxy t -> Test
unifTensorTests1 _ _ =
let tensorGen = chooseAny :: Gen (t m r) in
tensorTests1 tensorGen
unifTensorTests2 :: forall t m m' r . _ => Proxy '(m,m',r) -> Proxy t -> Test
unifTensorTests2 _ _ =
let tensorGen = chooseAny :: Gen (t m r) in
tensorTests2 (Proxy::Proxy '(t,m,m',r)) tensorGen
unifTensorCrtTests2 :: forall t m m' r . _ => Proxy '(m,m',r) -> Proxy t -> Test
unifTensorCrtTests2 _ _ =
let tensorGen = chooseAny :: Gen (t m r) in
tensorCrtTests2 (Proxy::Proxy '(t,m,m',r)) tensorGen
unifTensorCrtTests1 :: forall t m r . _ => Proxy '(m,r) -> Proxy t -> Test
unifTensorCrtTests1 _ _ =
let ringGen = chooseAny :: Gen r
tensorGen = chooseAny :: Gen (t m r) in
tensorCrtTests1 ringGen tensorGen
boundedInt64TensorTests1 :: forall t m . _ => Proxy m -> Proxy t -> Test
boundedInt64TensorTests1 _ _ = tensorTests1 (int64TensorGen :: Gen (t m Int64))
boundedInt64TensorTests2 :: forall t m m' . _ => Proxy '(m,m') -> Proxy t -> Test
boundedInt64TensorTests2 _ _ = tensorTests2
(Proxy::Proxy '(t,m,m',Int64))
(int64TensorGen :: Gen (t m Int64))
unifCycTests1 :: forall t m r . _ => Proxy '(m,r) -> Proxy t -> Test
unifCycTests1 _ _ =
let cycGen = chooseAny :: Gen (Cyc t m r) in
cycTests1 cycGen
unifCycTests2 :: forall t m m' r . _ => Proxy '(m,m',r) -> Proxy t -> Test
unifCycTests2 _ _ =
let cycGen = chooseAny :: Gen (Cyc t m' r) in
cycTests2 (Proxy::Proxy '(t,m,m',r)) cycGen
defaultZqTests :: Test
defaultZqTests = testGroup "Zq Tests" [
zqTests (Proxy::Proxy (Zq 3)),
zqTests (Proxy::Proxy (Zq 7)),
zqTests (Proxy::Proxy (Zq (3 ** 5))),
zqTests (Proxy::Proxy (Zq (3 ** 5 ** 7)))]
zqTensorTests :: _ => Proxy t -> Test
zqTensorTests pt =
let uniIndexWithoutCrt = testGroup "Single-Index Tensor Tests over ZqBasic" $ ($ pt) <$> [
unifTensorTests1 (Proxy::Proxy '(F7, Zq 29)),
unifTensorTests1 (Proxy::Proxy '(F12, SmoothZQ1)),
unifTensorTests1 (Proxy::Proxy '(F1, Zq 17)),
unifTensorTests1 (Proxy::Proxy '(F2, Zq 17)),
unifTensorTests1 (Proxy::Proxy '(F4, Zq 17)),
unifTensorTests1 (Proxy::Proxy '(F8, Zq 17)),
unifTensorTests1 (Proxy::Proxy '(F21, Zq 8191)),
unifTensorTests1 (Proxy::Proxy '(F42, Zq 8191)),
unifTensorTests1 (Proxy::Proxy '(F42, ZQ1)),
unifTensorTests1 (Proxy::Proxy '(F89, Zq 179))]
uniIndexWithCrt = testGroup "Single-Index TensorCRT Tests over ZqBasic" $ ($ pt) <$> [
unifTensorCrtTests1 (Proxy::Proxy '(F7, Zq 29)),
unifTensorCrtTests1 (Proxy::Proxy '(F12, SmoothZQ1)),
unifTensorCrtTests1 (Proxy::Proxy '(F1, Zq 17)),
unifTensorCrtTests1 (Proxy::Proxy '(F2, Zq 17)),
unifTensorCrtTests1 (Proxy::Proxy '(F4, Zq 17)),
unifTensorCrtTests1 (Proxy::Proxy '(F8, Zq 17)),
unifTensorCrtTests1 (Proxy::Proxy '(F21, Zq 8191)),
unifTensorCrtTests1 (Proxy::Proxy '(F42, Zq 8191)),
unifTensorCrtTests1 (Proxy::Proxy '(F42, ZQ1)),
unifTensorCrtTests1 (Proxy::Proxy '(F89, Zq 179))]
multiIndexWithoutCrt = testGroup "Multi-Index Tensor Tests over ZqBasic" $ ($ pt) <$> [
unifTensorTests2 (Proxy::Proxy '(F1, F7, Zq 29)),
unifTensorTests2 (Proxy::Proxy '(F4, F12, Zq 536871001)),
unifTensorTests2 (Proxy::Proxy '(F4, F12, SmoothZQ1)),
unifTensorTests2 (Proxy::Proxy '(F2, F8, Zq 17)),
unifTensorTests2 (Proxy::Proxy '(F8, F8, Zq 17)),
unifTensorTests2 (Proxy::Proxy '(F2, F8, SmoothZQ1)),
unifTensorTests2 (Proxy::Proxy '(F4, F8, Zq 17)),
unifTensorTests2 (Proxy::Proxy '(F3, F21, Zq 8191)),
unifTensorTests2 (Proxy::Proxy '(F7, F21, Zq 8191)),
unifTensorTests2 (Proxy::Proxy '(F3, F42, Zq 8191))]
multiIndexWithCrt = testGroup "Multi-Index TensorCRT Tests over ZqBasic" $ ($ pt) <$> [
unifTensorCrtTests2 (Proxy::Proxy '(F1, F7, Zq 29)),
unifTensorCrtTests2 (Proxy::Proxy '(F4, F12, Zq 536871001)),
unifTensorCrtTests2 (Proxy::Proxy '(F4, F12, SmoothZQ1)),
unifTensorCrtTests2 (Proxy::Proxy '(F2, F8, Zq 17)),
unifTensorCrtTests2 (Proxy::Proxy '(F8, F8, Zq 17)),
unifTensorCrtTests2 (Proxy::Proxy '(F2, F8, SmoothZQ1)),
unifTensorCrtTests2 (Proxy::Proxy '(F4, F8, Zq 17)),
unifTensorCrtTests2 (Proxy::Proxy '(F3, F21, Zq 8191)),
unifTensorCrtTests2 (Proxy::Proxy '(F7, F21, Zq 8191)),
unifTensorCrtTests2 (Proxy::Proxy '(F3, F42, Zq 8191))] in
testGroup "All Tensor-like Tests over ZqBasic" [
uniIndexWithoutCrt, uniIndexWithCrt, multiIndexWithoutCrt, multiIndexWithCrt]
int64TensorTests :: _ => Proxy t -> Test
int64TensorTests pt =
let uniIndexWithoutCrt = testGroup "Single-Index Tensor Tests over Int64" $ ($ pt) <$> [
boundedInt64TensorTests1 (Proxy::Proxy F7),
boundedInt64TensorTests1 (Proxy::Proxy F12),
boundedInt64TensorTests1 (Proxy::Proxy F1),
boundedInt64TensorTests1 (Proxy::Proxy F2),
boundedInt64TensorTests1 (Proxy::Proxy F4),
boundedInt64TensorTests1 (Proxy::Proxy F8),
boundedInt64TensorTests1 (Proxy::Proxy F21),
boundedInt64TensorTests1 (Proxy::Proxy F42),
boundedInt64TensorTests1 (Proxy::Proxy F42),
boundedInt64TensorTests1 (Proxy::Proxy F89)]
multiIndexWithoutCrt = testGroup "Multi-Index Tensor Tests over Int64" $ ($ pt) <$> [
boundedInt64TensorTests2 (Proxy::Proxy '(F1, F7)),
boundedInt64TensorTests2 (Proxy::Proxy '(F4, F12)),
boundedInt64TensorTests2 (Proxy::Proxy '(F4, F12)),
boundedInt64TensorTests2 (Proxy::Proxy '(F2, F8)),
boundedInt64TensorTests2 (Proxy::Proxy '(F8, F8)),
boundedInt64TensorTests2 (Proxy::Proxy '(F2, F8)),
boundedInt64TensorTests2 (Proxy::Proxy '(F4, F8)),
boundedInt64TensorTests2 (Proxy::Proxy '(F3, F21)),
boundedInt64TensorTests2 (Proxy::Proxy '(F7, F21)),
boundedInt64TensorTests2 (Proxy::Proxy '(F3, F42))] in
testGroup "All Tensor-like Tests over Int64" [uniIndexWithoutCrt, multiIndexWithoutCrt]
dblTensorTests :: _ => Proxy t -> Test
dblTensorTests pt =
let uniIndexWithoutCrt = testGroup "Single-Index Tensor Tests over Double" $ ($ pt) <$> [
unifTensorTests1 (Proxy::Proxy '(F7, Double)),
unifTensorTests1 (Proxy::Proxy '(F12, Double)),
unifTensorTests1 (Proxy::Proxy '(F1, Double)),
unifTensorTests1 (Proxy::Proxy '(F2, Double)),
unifTensorTests1 (Proxy::Proxy '(F4, Double)),
unifTensorTests1 (Proxy::Proxy '(F8, Double)),
unifTensorTests1 (Proxy::Proxy '(F21, Double)),
unifTensorTests1 (Proxy::Proxy '(F42, Double)),
unifTensorTests1 (Proxy::Proxy '(F42, Double)),
unifTensorTests1 (Proxy::Proxy '(F89, Double))]
uniIndexWithCrt = testGroup "Single-Index TensorCRT Tests over Double" $ ($ pt) <$> [
unifTensorCrtTests1 (Proxy::Proxy '(F7, Double)),
unifTensorCrtTests1 (Proxy::Proxy '(F12, Double)),
unifTensorCrtTests1 (Proxy::Proxy '(F1, Double)),
unifTensorCrtTests1 (Proxy::Proxy '(F2, Double)),
unifTensorCrtTests1 (Proxy::Proxy '(F4, Double)),
unifTensorCrtTests1 (Proxy::Proxy '(F8, Double)),
unifTensorCrtTests1 (Proxy::Proxy '(F21, Double)),
unifTensorCrtTests1 (Proxy::Proxy '(F42, Double)),
unifTensorCrtTests1 (Proxy::Proxy '(F42, Double)),
unifTensorCrtTests1 (Proxy::Proxy '(F89, Double))]
multiIndexWithoutCrt = testGroup "Multi-Index Tensor Tests over Double" $ ($ pt) <$> [
unifTensorTests2 (Proxy::Proxy '(F1, F7, Double)),
unifTensorTests2 (Proxy::Proxy '(F4, F12, Double)),
unifTensorTests2 (Proxy::Proxy '(F4, F12, Double)),
unifTensorTests2 (Proxy::Proxy '(F2, F8, Double)),
unifTensorTests2 (Proxy::Proxy '(F8, F8, Double)),
unifTensorTests2 (Proxy::Proxy '(F2, F8, Double)),
unifTensorTests2 (Proxy::Proxy '(F4, F8, Double)),
unifTensorTests2 (Proxy::Proxy '(F3, F21, Double)),
unifTensorTests2 (Proxy::Proxy '(F7, F21, Double)),
unifTensorTests2 (Proxy::Proxy '(F3, F42, Double))]
multiIndexWithCrt = testGroup "Multi-Index TensorCRT Tests over Double" $ ($ pt) <$> [
unifTensorCrtTests2 (Proxy::Proxy '(F1, F7, Double)),
unifTensorCrtTests2 (Proxy::Proxy '(F4, F12, Double)),
unifTensorCrtTests2 (Proxy::Proxy '(F4, F12, Double)),
unifTensorCrtTests2 (Proxy::Proxy '(F2, F8, Double)),
unifTensorCrtTests2 (Proxy::Proxy '(F8, F8, Double)),
unifTensorCrtTests2 (Proxy::Proxy '(F2, F8, Double)),
unifTensorCrtTests2 (Proxy::Proxy '(F4, F8, Double)),
unifTensorCrtTests2 (Proxy::Proxy '(F3, F21, Double)),
unifTensorCrtTests2 (Proxy::Proxy '(F7, F21, Double)),
unifTensorCrtTests2 (Proxy::Proxy '(F3, F42, Double))] in
testGroup "All Tensor-like Tests over Double" [uniIndexWithoutCrt, multiIndexWithoutCrt]
cpxTensorTests :: _ => Proxy t -> Test
cpxTensorTests pt =
let uniIndexWithoutCrt = testGroup "Single-Index Tensor Tests over Complex Double" $ ($ pt) <$> [
unifTensorTests1 (Proxy::Proxy '(F7, CpxDbl)),
unifTensorTests1 (Proxy::Proxy '(F12, CpxDbl)),
unifTensorTests1 (Proxy::Proxy '(F1, CpxDbl)),
unifTensorTests1 (Proxy::Proxy '(F2, CpxDbl)),
unifTensorTests1 (Proxy::Proxy '(F4, CpxDbl)),
unifTensorTests1 (Proxy::Proxy '(F8, CpxDbl)),
unifTensorTests1 (Proxy::Proxy '(F21, CpxDbl)),
unifTensorTests1 (Proxy::Proxy '(F42, CpxDbl)),
unifTensorTests1 (Proxy::Proxy '(F42, CpxDbl)),
unifTensorTests1 (Proxy::Proxy '(F89, CpxDbl))]
uniIndexWithCrt = testGroup "Single-Index TensorCRT Tests over Complex Double" $ ($ pt) <$> [
unifTensorCrtTests1 (Proxy::Proxy '(F7, CpxDbl)),
unifTensorCrtTests1 (Proxy::Proxy '(F12, CpxDbl)),
unifTensorCrtTests1 (Proxy::Proxy '(F1, CpxDbl)),
unifTensorCrtTests1 (Proxy::Proxy '(F2, CpxDbl)),
unifTensorCrtTests1 (Proxy::Proxy '(F4, CpxDbl)),
unifTensorCrtTests1 (Proxy::Proxy '(F8, CpxDbl)),
unifTensorCrtTests1 (Proxy::Proxy '(F21, CpxDbl)),
unifTensorCrtTests1 (Proxy::Proxy '(F42, CpxDbl)),
unifTensorCrtTests1 (Proxy::Proxy '(F42, CpxDbl)),
unifTensorCrtTests1 (Proxy::Proxy '(F89, CpxDbl))]
multiIndexWithoutCrt = testGroup "Multi-Index Tensor Tests over Complex Double" $ ($ pt) <$> [
unifTensorTests2 (Proxy::Proxy '(F1, F7, CpxDbl)),
unifTensorTests2 (Proxy::Proxy '(F4, F12, CpxDbl)),
unifTensorTests2 (Proxy::Proxy '(F4, F12, CpxDbl)),
unifTensorTests2 (Proxy::Proxy '(F2, F8, CpxDbl)),
unifTensorTests2 (Proxy::Proxy '(F8, F8, CpxDbl)),
unifTensorTests2 (Proxy::Proxy '(F2, F8, CpxDbl)),
unifTensorTests2 (Proxy::Proxy '(F4, F8, CpxDbl)),
unifTensorTests2 (Proxy::Proxy '(F3, F21, CpxDbl)),
unifTensorTests2 (Proxy::Proxy '(F7, F21, CpxDbl)),
unifTensorTests2 (Proxy::Proxy '(F3, F42, CpxDbl))]
multiIndexWithCrt = testGroup "Multi-Index TensorCRT Tests over Complex Double" $ ($ pt) <$> [
unifTensorCrtTests2 (Proxy::Proxy '(F1, F7, CpxDbl)),
unifTensorCrtTests2 (Proxy::Proxy '(F4, F12, CpxDbl)),
unifTensorCrtTests2 (Proxy::Proxy '(F4, F12, CpxDbl)),
unifTensorCrtTests2 (Proxy::Proxy '(F2, F8, CpxDbl)),
unifTensorCrtTests2 (Proxy::Proxy '(F8, F8, CpxDbl)),
unifTensorCrtTests2 (Proxy::Proxy '(F2, F8, CpxDbl)),
unifTensorCrtTests2 (Proxy::Proxy '(F4, F8, CpxDbl)),
unifTensorCrtTests2 (Proxy::Proxy '(F3, F21, CpxDbl)),
unifTensorCrtTests2 (Proxy::Proxy '(F7, F21, CpxDbl)),
unifTensorCrtTests2 (Proxy::Proxy '(F3, F42, CpxDbl))] in
testGroup "All Tensor-like Tests over Complex Double" [
uniIndexWithoutCrt, uniIndexWithCrt, multiIndexWithoutCrt, multiIndexWithCrt]
cycTests :: (forall m r . (Fact m, Eq r) => Eq (t m r),
forall m r . (Fact m, Show r) => Show (t m r),
_)
=> Proxy t -> Test
cycTests pt =
let uniIndex = testGroup "Single-Index Cyc Tests over ZqBasic" $ ($ pt) <$> [
unifCycTests1 (Proxy::Proxy '(F7, Zq 29)),
unifCycTests1 (Proxy::Proxy '(F7, Zq 32)),
unifCycTests1 (Proxy::Proxy '(F12, SmoothZQ1)),
unifCycTests1 (Proxy::Proxy '(F1, Zq 17)),
unifCycTests1 (Proxy::Proxy '(F2, Zq 17)),
unifCycTests1 (Proxy::Proxy '(F4, Zq 17)),
unifCycTests1 (Proxy::Proxy '(F8, Zq 17)),
unifCycTests1 (Proxy::Proxy '(F21, Zq 8191)),
unifCycTests1 (Proxy::Proxy '(F42, Zq 8191)),
unifCycTests1 (Proxy::Proxy '(F42, ZQ1)),
unifCycTests1 (Proxy::Proxy '(F42, Zq 1024)),
unifCycTests1 (Proxy::Proxy '(F42, ZQ2)),
unifCycTests1 (Proxy::Proxy '(F89, Zq 179))
]
multiIndex = testGroup "Multi-Index Cyc Tests over ZqBasic" $ ($ pt) <$> [
unifCycTests2 (Proxy::Proxy '(H01, H1, Zq PP2)),
unifCycTests2 (Proxy::Proxy '(H01, H1, Zq PP4)),
unifCycTests2 (Proxy::Proxy '(H01, H1, Zq PP8)),
unifCycTests2 (Proxy::Proxy '(H01, H1, Zq PP16)),
unifCycTests2 (Proxy::Proxy '(H12, H2, Zq PP2)),
unifCycTests2 (Proxy::Proxy '(H12, H2, Zq PP4)),
unifCycTests2 (Proxy::Proxy '(H12, H2, Zq PP8)),
unifCycTests2 (Proxy::Proxy '(H12, H2, Zq PP16)),
unifCycTests2 (Proxy::Proxy '(H23, H3, Zq PP2)),
unifCycTests2 (Proxy::Proxy '(H23, H3, Zq PP4)),
unifCycTests2 (Proxy::Proxy '(H23, H3, Zq PP8)),
unifCycTests2 (Proxy::Proxy '(H23, H3, Zq PP16)),
unifCycTests2 (Proxy::Proxy '(H34, H4, Zq PP2)),
unifCycTests2 (Proxy::Proxy '(H34, H4, Zq PP4)),
unifCycTests2 (Proxy::Proxy '(H34, H4, Zq PP8)),
unifCycTests2 (Proxy::Proxy '(H34, H4, Zq PP16)),
unifCycTests2 (Proxy::Proxy '(H45, H5, Zq PP2)),
unifCycTests2 (Proxy::Proxy '(H45, H5, Zq PP4)),
unifCycTests2 (Proxy::Proxy '(H45, H5, Zq PP8)),
unifCycTests2 (Proxy::Proxy '(H45, H5, Zq PP16)),
unifCycTests2 (Proxy::Proxy '(F4, F28, Zq PP2)),
unifCycTests2 (Proxy::Proxy '(F4, F28, Zq PP4)),
unifCycTests2 (Proxy::Proxy '(F4, F28, Zq PP8)),
unifCycTests2 (Proxy::Proxy '(F7, F7*F13, Zq PP2)),
unifCycTests2 (Proxy::Proxy '(F7, F7*F13, Zq PP4)),
unifCycTests2 (Proxy::Proxy '(F1, F7, Zq PP8)),
unifCycTests2 (Proxy::Proxy '(F1, F7, Zq PP2))
]
in testGroup "All Cyc Tests over ZqBasic" [uniIndex, multiIndex]
type ZQ1 = Zq 18869761
type ZQ2 = Zq (19393921 ** 18869761)
type SmoothZQ1 = Zq 2148249601
type H01 = F64
type H1 = F64 * F7
type H12 = F32 * F7
type H2 = F32 * F7 * F13
type H23 = F8 * F7 * F13
type H3 = F8 * F5 * F7 * F13
type H34 = F4 * F5 * F7 * F13
type H4 = F4 * F3 * F5 * F7 * F13
type H45 = F3 * F5 * F7 * F13
type H5 = F9 * F5 * F7 * F13