packages feed

lol-0.0.1.0: test-suite/TestTypes.hs

{-# LANGUAGE KindSignatures, PolyKinds, DataKinds, FlexibleInstances, RankNTypes,
             TypeOperators, ConstraintKinds, FlexibleContexts, ScopedTypeVariables,
             MultiParamTypeClasses, TypeFamilies, NoImplicitPrelude, RebindableSyntax #-}

module TestTypes (
  ZP2, ZP3, ZP4, ZP8
, PP2
, SmoothZQ1, SmoothZQ2, SmoothZQ3
, SmoothQ1
, Zq, ZQ1, ZQ2, ZQ3
, Q17, Q29, Q8191, Q80221, Q536871001) where

import Control.Monad
import Control.Monad.Random

import Crypto.Lol
import Crypto.Lol.Reflects
import Crypto.Lol.Factored

import Data.Type.Natural

import Test.QuickCheck.Monadic

instance (MonadRandom m) => MonadRandom (PropertyM m) where
  getRandom = run getRandom
  getRandoms = run getRandoms
  getRandomR r = run $ getRandomR r
  getRandomRs r = run $ getRandomRs r

-- three 24-bit moduli, enough to handle rounding for p=32 (depth-4 circuit at ~17 bits per mul)
data Q18869761
instance (ToInteger i) => Reflects Q18869761 i where value = return 18869761
type ZQ1 = Zq Q18869761

data Q19393921
instance (ToInteger i) => Reflects Q19393921 i where value = return 19393921
type ZQ2 = (Zq Q19393921, ZQ1)

data Q19918081
instance (ToInteger i) => Reflects Q19918081 i where value = return 19918081
type ZQ3 = (Zq Q19918081, ZQ2)

-- a 31-bit modulus, for rounding off after the last four hops
data Q2149056001
instance (ToInteger i) => Reflects Q2149056001 i where value = return 2149056001
type ZQ4 = (Zq Q2149056001, ZQ3)

-- for rounding off after the first hop
data Q3144961
instance (ToInteger i) => Reflects Q3144961 i where value = return 3144961
type ZQ5 = (Zq Q3144961, ZQ4)

data Q7338241
instance (ToInteger i) => Reflects Q7338241 i where value = return 7338241
type ZQ6 = (Zq Q7338241, ZQ5)

-- concrete types useful for building tests or real applications
data Q17
data Q29
data Q8191  -- 1028th prime, = 1 mod 21
data Q80221  -- good for 28
data Q536871001 
-- the next three moduli are "good" for any index dividing 128*27*25*7
data SmoothQ1 
data SmoothQ2 
data SmoothQ3 

instance (ToInteger i) => Reflects Q17 i where value = return 17
instance (ToInteger i) => Reflects Q29 i where value = return 29
instance (ToInteger i) => Reflects Q8191 i where value = return 8191
instance (ToInteger i) => Reflects Q536871001 i where value = return 536871001
instance (ToInteger i) => Reflects Q80221 i where value = return 80221
instance (ToInteger i) => Reflects SmoothQ1 i where value = return 2148249601
instance (ToInteger i) => Reflects SmoothQ2 i where value = return 2148854401
instance (ToInteger i) => Reflects SmoothQ3 i where value = return 2150668801

type Zq (q :: k) = ZqBasic q Z
type Z = Int64

type PP2 e = ToPP N2 e
type PP3 e = ToPP N3 e

type ZP2 = Zq (PP2 N1)
type ZP3 = Zq (PP3 N1)
type ZP4 = Zq (PP2 N2)
type ZP8 = Zq (PP2 N3)

type SmoothZQ1 = Zq SmoothQ1
type SmoothZQ2 = (Zq SmoothQ2, SmoothZQ1)
type SmoothZQ3 = (Zq SmoothQ3, SmoothZQ2)