{-|
Module      : Crypto.Lol.Applications.Examples.KHPRF
Description : Example using KeyHomomorphicPRF.
Copyright   : (c) Chris Peikert, 2018
                  Bogdan Manga,  2018
License     : GPL-3
Maintainer  : bmanga@umich.edu
Stability   : experimental
Portability : POSIX

Example usage of 'Crypto.Lol.Applications.KeyHomomorphicPRF'.
-}

{-# LANGUAGE DataKinds             #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE ScopedTypeVariables   #-}

{-# OPTIONS_GHC -fno-warn-partial-type-signatures #-}

module Crypto.Lol.Applications.Examples.KHPRF (khprfMain) where

import Crypto.Lol
import Crypto.Lol.Applications.KeyHomomorphicPRF
import Crypto.Lol.Types

type SimpleTop = 'Intern ('Intern 'Leaf 'Leaf) 'Leaf
type M = F64
type N = 1
type Q = 257
type P = 2
type Rq t = Cyc t M (ZqBasic Q Int64)
type Rp t = Cyc t M (ZqBasic P Int64)
type Gad = BaseBGad 2

-- | Simple example of how to use the
-- "Crypto.Lol.Applications.KeyHomomorphicPRF" application.
khprfMain :: forall t . (forall m r . (Fact m, Show r) => Show (t m r), _)
  => Proxy t -> IO ()
khprfMain _ = do
  key <- genKey
  params :: PRFParams N Gad (Rq t) <- genParams
  let t = singFBT :: SFBT SimpleTop
  let result :: [Matrix (Rp t)] =
        run $ sequence $ prfAmortized t params key <$> values
  print result