{-| Module : BenchAppsMain Description : Main driver for lol-apps benchmarks. Copyright : (c) Eric Crockett, 2011-2017 Chris Peikert, 2011-2017 License : GPL-2 Maintainer : ecrockett0@email.com Stability : experimental Portability : POSIX Main driver for lol-apps benchmarks. -} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE PartialTypeSignatures #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE RebindableSyntax #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# OPTIONS_GHC -fno-warn-partial-type-signatures #-} module BenchAppsMain where import Control.Applicative import Control.Monad.Random import Crypto.Lol import Crypto.Lol.Applications.KeyHomomorphicPRF import Crypto.Lol.Applications.SymmSHE hiding (CT) import Crypto.Lol.Benchmarks import Crypto.Lol.Cyclotomic.Tensor.CPP import Crypto.Lol.Utils.PrettyPrint.Table import Crypto.Lol.Types import KHPRFBenches import SHEBenches import Crypto.Random.DRBG infixr 9 ** data a ** b type family Zq (a :: k) :: * where Zq (a ** b) = (Zq a, Zq b) Zq q = (ZqBasic q Int64) benchNames :: [String] benchNames = [ "encrypt", "decrypt", "*", "addPublic", "mulPublic", "rescaleCT", "keySwitch", "tunnel", "balanced-startup"] main :: IO () main = do let o = (defaultOpts Nothing){benches=[]} pct = Proxy::Proxy CT bs <- sequence $ sheBenches' pct (Proxy::Proxy TrivGad) (Proxy::Proxy HashDRBG) ++ [khprfBenches pct (Proxy::Proxy (BaseBGad 2))] mapM_ (prettyBenches o) bs sheBenches' :: _ => Proxy t -> Proxy gad -> Proxy gen -> [rnd Benchmark] sheBenches' pt pgad pgen = [ benchGroup "SHE" $ ($ pt) <$> [sheBenches (Proxy::Proxy '(F16, F1024, Zq 8, Zq 1017857)) pgen, sheBenches (Proxy::Proxy '(F16, F2048, Zq 16, Zq 1017857)) pgen], benchGroup "Dec" $ ($ pt) <$> [decBenches (Proxy::Proxy '(F16, F1024, Zq 8, Zq 1017857)), decBenches (Proxy::Proxy '(F16, F2048, Zq 16, Zq 1017857))], benchGroup "Rescale" $ ($ pt) <$> [rescaleBenches (Proxy::Proxy '(F32, F2048, Zq 16, Zq 1017857, Zq (1017857 ** 1032193))) pgad, rescaleBenches (Proxy::Proxy '(F32, F64*F9*F25, Zq 16, Zq 1008001, Zq (1008001 ** 1065601))) pgad], benchGroup "Tunnel" $ ($ pt) <$> [tunnelBenches {- H0 -> H1 -} (Proxy::Proxy '(F128, F128 * F7 * F13, F64 * F7, F64 * F7 * F13, Zq PP32, Zq 3144961)) pgad, tunnelBenches {- H1 -> H2 -} (Proxy::Proxy '(F64 * F7, F64 * F7 * F13, F32 * F7 * F13, F32 * F7 * F13, Zq PP32, Zq 3144961)) pgad, tunnelBenches {- H2 -> H3 -} (Proxy::Proxy '(F32 * F7 * F13, F32 * F7 * F13, F8 * F5 * F7 * F13, F8 * F5 * F7 *F13, Zq PP32, Zq 3144961)) pgad, tunnelBenches {- H3 -> H4 -} (Proxy::Proxy '(F8 * F5 * F7 * F13, F8 * F5 * F7 *F13, F4 * F3 * F5 * F7 * F13, F4 * F3 * F5 * F7 * F13, Zq PP32, Zq 3144961)) pgad, tunnelBenches {- H4 -> H5 -} (Proxy::Proxy '(F4 * F3 * F5 * F7 * F13, F4 * F3 * F5 * F7 *F13, F9 * F5 * F7 * F13, F9 * F5 * F7 * F13, Zq PP32, Zq 3144961)) pgad]] khprfBenches :: forall t gad rnd . (_) => Proxy t -> Proxy gad -> rnd Benchmark khprfBenches pt _ = benchGroup "KHPRF Table" [benchGroup "left/KHPRF" $ benches' leftSpineTree, benchGroup "balanced/KHPRF" $ benches' balancedTree, benchGroup "right/KHPRF" $ benches' rightSpineTree] where benches' = khPRFBenches 5 pt (Proxy::Proxy F128) (Proxy::Proxy '(Zq 8, Zq 2, gad)) -- EAC: is there a simple way to parameterize the variance? -- generates a secret key with scaled variance 1.0 instance (GenSKCtx t m' z Double) => Random (SK (Cyc t m' z)) where random = runRand $ genSK (1 :: Double) randomR = error "randomR not defined for SK"