{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
module Crypto.Lol.Applications.Benchmarks.KHPRFBenches (khprfBenches) where
import Control.Applicative
import Control.DeepSeq
import Control.Monad.Random hiding (fromList, split)
import Crypto.Lol hiding (replicate)
import Crypto.Lol.Applications.KeyHomomorphicPRF
import Crypto.Lol.Benchmarks (ArgType, Benchmark,
bgroup, mkBench,
showType)
import Crypto.Lol.Reflects
import Crypto.Lol.Types
type M = F64
type N = 1
type Q = 256
type P = 2
type Zq q = ZqBasic q Int64
type Rq t = Cyc t M (Zq Q)
type Rp t = Cyc t M (Zq P)
type family Left n where
Left 'O = 'Leaf
Left ('S n') = 'Intern (Left n') 'Leaf
type family Right n where
Right 'O = 'Leaf
Right ('S n') = 'Intern 'Leaf (Right n')
type Complete0 = 'Leaf
type Complete1 = 'Intern Complete0 Complete0
type Complete2 = 'Intern Complete1 Complete1
type Complete3 = 'Intern Complete2 Complete2
type Complete4 = 'Intern Complete3 Complete3
type Complete5 = 'Intern Complete4 Complete4
khprfBenches :: forall ts rnd gad .
(MonadRandom rnd, Random (Rq ts), Rescale (Rq ts) (Rp ts),
Decompose gad (Rq ts), Reflects N Int, Gadget gad (Rq ts), NFData (Rp ts),
Show (ArgType ts))
=> Proxy ts -> Proxy gad -> rnd [Benchmark]
khprfBenches pts _ = do
key :: PRFKey N (Rq ts) <- genKey
params :: PRFParams N gad (Rq ts) <- genParams
let sc = singFBT :: Sing Complete5
sl = singFBT :: Sing (Left P32)
sr = singFBT :: Sing (Right P32)
xs = take 32 values
x = head xs
prp = Proxy :: Proxy (Rp ts)
return [
bgroup "KHPRF" [
bgroup (showType pts) [
bgroup "Solo" [
mkBench "complete-solo" (prfBench prp sc params key) x,
mkBench "left-solo" (prfBench prp sl params key) x,
mkBench "right-solo" (prfBench prp sr params key) x]]],
bgroup "KHPRF" [
bgroup (showType pts) [
bgroup "Amortized" [
mkBench "complete-amortized" (prfAmortizedBench prp sc params key) xs,
mkBench "left-amortized" (prfAmortizedBench prp sl params key) xs,
mkBench "right-amortized" (prfAmortizedBench prp sr params key) xs]]]]
prfBench :: forall t n gad rq rp .
(Rescale rq rp, Decompose gad rq, FBTC t, NFData rp)
=> Proxy rp
-> SFBT t
-> PRFParams n gad rq
-> PRFKey n rq
-> BitString (SizeFBT t)
-> Matrix rp
prfBench _ = prf
prfAmortizedBench :: forall t n gad rq rp .
(Rescale rq rp, Decompose gad rq, NFData rp)
=> Proxy rp
-> SFBT t
-> PRFParams n gad rq
-> PRFKey n rq
-> [BitString (SizeFBT t)]
-> [Matrix rp]
prfAmortizedBench _ t p s xs =
run $ sequence $ prfAmortized t p s <$> xs