Copyright | (c) Eric Crockett 2011-2017 Chris Peikert 2011-2017 |
---|---|
License | GPL-2 |
Maintainer | ecrockett0@email.com |
Stability | experimental |
Portability | POSIX \( \def\Z{\mathbb{Z}} \) |
Safe Haskell | None |
Language | Haskell2010 |
Homomorphic evaluation of the PRF from [BP14].
- homomPRF :: (MulPublicCtx t r r' zp zq, MultiTunnelCtx rngs r r' s s' t z zp zq gad zqs, PTRound t s s' e zp (ZqDown zq zqs) z gad zqs) => EvalHints t rngs z zp zq zqs gad -> CT r zp (Cyc t r' zq) -> Int -> PRFState (Cyc t r zp) (Cyc t r (TwoOf zp)) -> CT s (TwoOf zp) (Cyc t s' (ZqResult e (ZqDown zq zqs) zqs))
- homomPRFM :: (MonadReader (EvalHints t rngs z zp zq zqs gad) mon, MonadState (PRFState (Cyc t r zp) (Cyc t r (TwoOf zp))) mon, MulPublicCtx t r r' zp zq, MultiTunnelCtx rngs r r' s s' t z zp zq gad zqs, PTRound t s s' e zp (ZqDown zq zqs) z gad zqs) => CT r zp (Cyc t r' zq) -> Int -> mon (CT s (TwoOf zp) (Cyc t s' (ZqResult e (ZqDown zq zqs) zqs)))
- data RoundHints t m m' z e zp zq zqs gad where
- RHNil :: RoundHints t m m' z e zp zq zqs gad
- RHCons :: KSQuadCircHint gad (Cyc t m' (ZqUp zq zqs)) -> RoundHints t m m' z e (Div2 zp) (ZqDown zq zqs) zqs gad -> RoundHints t m m' z (S e) zp zq zqs gad
- roundHints :: (PTRound t m m' e zp zq z gad zqs, MonadRandom rnd) => SK (Cyc t m' z) -> rnd (RoundHints t m m' z e zp zq zqs gad)
- data TunnelInfoChain gad t xs zp zq where
- THNil :: TunnelInfoChain gad t '['(m, m')] zp zq
- THCons :: (xs ~ ('(r, r') ': ('(s, s') ': rngs)), e' ~ (e * (r' / r)), e ~ FGCD r s) => TunnelInfo gad t e r s e' r' s' zp zq -> TunnelInfoChain gad t (Tail xs) zp zq -> TunnelInfoChain gad t xs zp zq
- tunnelInfoChain :: (Tunnel xs t zp zq gad, MonadRandom rnd, Head xs ~ '(r, r'), Last xs ~ '(s, s'), Lift zp z, CElt t z, ToInteger z, Reduce z zq) => SK (Cyc t r' z) -> rnd (TunnelInfoChain gad t xs zp zq, SK (Cyc t s' z))
- data EvalHints t rngs z zp zq zqs gad where
- type MultiTunnelCtx rngs r r' s s' t z zp zq gad zqs = (Head rngs ~ '(r, r'), Last rngs ~ '(s, s'), Tunnel rngs t zp (ZqUp zq zqs) gad, ZqDown (ZqUp zq zqs) zqs ~ zq, RescaleCyc (Cyc t) zq (ZqUp zq zqs), RescaleCyc (Cyc t) (ZqUp zq zqs) zq, RescaleCyc (Cyc t) zq (ZqDown zq zqs), ToSDCtx t r' zp zq, ToSDCtx t s' zp (ZqUp zq zqs))
- type ZqUp zq zqs = NextListElt zq (Reverse zqs)
- type ZqDown zq zqs = NextListElt zq zqs
- type family TwoOf (a :: k) :: k
- class Tunnel xs t zp zq gad where
- class UnPP (CharOf zp) ~ '(Prime2, e) => PTRound t m m' e zp zq z gad zqs where
- type family PTRings xs where ...
- class PTTunnel t xs zp where
- data TunnelFuncs t xs zp where
- TFNil :: TunnelFuncs t '[m] zp
- TFCons :: xs ~ (r ': (s ': rngs)) => Linear t zp (FGCD r s) r s -> TunnelFuncs t (Tail xs) zp -> TunnelFuncs t xs zp
Documentation
homomPRF :: (MulPublicCtx t r r' zp zq, MultiTunnelCtx rngs r r' s s' t z zp zq gad zqs, PTRound t s s' e zp (ZqDown zq zqs) z gad zqs) => EvalHints t rngs z zp zq zqs gad -> CT r zp (Cyc t r' zq) -> Int -> PRFState (Cyc t r zp) (Cyc t r (TwoOf zp)) -> CT s (TwoOf zp) (Cyc t s' (ZqResult e (ZqDown zq zqs) zqs)) Source #
Evaluates the PRF family indexed by the encrypted secret on the input, relative to some PRF state. Note that the algorithm in [BP14] outputs a vector; this function only outputs the encryption of the first coefficient of that vector.
homomPRFM :: (MonadReader (EvalHints t rngs z zp zq zqs gad) mon, MonadState (PRFState (Cyc t r zp) (Cyc t r (TwoOf zp))) mon, MulPublicCtx t r r' zp zq, MultiTunnelCtx rngs r r' s s' t z zp zq gad zqs, PTRound t s s' e zp (ZqDown zq zqs) z gad zqs) => CT r zp (Cyc t r' zq) -> Int -> mon (CT s (TwoOf zp) (Cyc t s' (ZqResult e (ZqDown zq zqs) zqs))) Source #
Monadic version of homomPRF
data RoundHints t m m' z e zp zq zqs gad where Source #
Quadratic key switch hints for the rounding phase of PRF evaluation.
RHNil :: RoundHints t m m' z e zp zq zqs gad | |
RHCons :: KSQuadCircHint gad (Cyc t m' (ZqUp zq zqs)) -> RoundHints t m m' z e (Div2 zp) (ZqDown zq zqs) zqs gad -> RoundHints t m m' z (S e) zp zq zqs gad |
(NFData (KSQuadCircHint gad (Cyc t m' (ZqUp * zq zqs))), NFData (RoundHints k k1 k2 t m m' z e (Div2 k zp) (ZqDown * zq zqs) zqs gad)) => NFData (RoundHints k k1 k2 t m m' z (S e) zp zq zqs gad) Source # | |
NFData (RoundHints k k1 k2 t m m' z P1 zp zq zqs gad) Source # | |
(Protoable (KSQuadCircHint gad (Cyc t m' (ZqUp * zq zqs))), Protoable (RoundHints k k1 k2 t m m' z e (Div2 k zp) (ZqDown * zq zqs) zqs gad), (~) * (ProtoType (RoundHints k k1 k2 t m m' z e (Div2 k zp) (ZqDown * zq zqs) zqs gad)) RoundHintChain) => Protoable (RoundHints k k1 k2 t m m' z (S e) zp zq zqs gad) Source # | |
Protoable (RoundHints k k1 k2 t m m' z P1 zp zq zqs gad) Source # | |
type ProtoType (RoundHints k k1 k2 t m m' z (S e) zp zq zqs gad) Source # | |
type ProtoType (RoundHints k k1 k2 t m m' z P1 zp zq zqs gad) Source # | |
roundHints :: (PTRound t m m' e zp zq z gad zqs, MonadRandom rnd) => SK (Cyc t m' z) -> rnd (RoundHints t m m' z e zp zq zqs gad) Source #
Generate hints for rounding from \(R_p=R_{2^k}\) to \(R_2\)
data TunnelInfoChain gad t xs zp zq where Source #
Sequence of TunnelInfo
for consecutive ring tunnels.
THNil :: TunnelInfoChain gad t '['(m, m')] zp zq | |
THCons :: (xs ~ ('(r, r') ': ('(s, s') ': rngs)), e' ~ (e * (r' / r)), e ~ FGCD r s) => TunnelInfo gad t e r s e' r' s' zp zq -> TunnelInfoChain gad t (Tail xs) zp zq -> TunnelInfoChain gad t xs zp zq |
tunnelInfoChain :: (Tunnel xs t zp zq gad, MonadRandom rnd, Head xs ~ '(r, r'), Last xs ~ '(s, s'), Lift zp z, CElt t z, ToInteger z, Reduce z zq) => SK (Cyc t r' z) -> rnd (TunnelInfoChain gad t xs zp zq, SK (Cyc t s' z)) Source #
Generates TunnelInfo
for each tunnel step from Head xs
to Last xs
.
data EvalHints t rngs z zp zq zqs gad where Source #
The offline data needed for homomorphic PRF evaluation.
Hints :: UnPP (CharOf zp) ~ '(Prime2, e) => TunnelInfoChain gad t rngs zp (ZqUp zq zqs) -> RoundHints t (Fst (Last rngs)) (Snd (Last rngs)) z e zp (ZqDown zq zqs) zqs gad -> EvalHints t rngs z zp zq zqs gad |
((~) (PrimeBin, Pos) (UnPP (CharOf PrimePower zp)) ((,) PrimeBin Pos Prime2 e), NFData (TunnelInfoChain gad t rngs zp (ZqUp * zq zqs)), NFData (RoundHints * k Factored t (Fst Factored Factored (Last (Factored, Factored) rngs)) (Snd Factored Factored (Last (Factored, Factored) rngs)) z e zp (ZqDown * zq zqs) zqs gad)) => NFData (EvalHints k t rngs z zp zq zqs gad) Source # | |
type MultiTunnelCtx rngs r r' s s' t z zp zq gad zqs = (Head rngs ~ '(r, r'), Last rngs ~ '(s, s'), Tunnel rngs t zp (ZqUp zq zqs) gad, ZqDown (ZqUp zq zqs) zqs ~ zq, RescaleCyc (Cyc t) zq (ZqUp zq zqs), RescaleCyc (Cyc t) (ZqUp zq zqs) zq, RescaleCyc (Cyc t) zq (ZqDown zq zqs), ToSDCtx t r' zp zq, ToSDCtx t s' zp (ZqUp zq zqs)) Source #
Context for multi-step homomorphic tunneling.
type family TwoOf (a :: k) :: k Source #
\(\Z_2\) for ZqBasic with a PrimePower
modulus
class Tunnel xs t zp zq gad where Source #
Functions related to homomorphic ring tunneling.
tunnelInfoChain, tunnelInternal
tunnelInfoChain :: (MonadRandom rnd, Head xs ~ '(r, r'), Last xs ~ '(s, s'), Lift zp z, CElt t z, ToInteger z, Reduce z zq) => SK (Cyc t r' z) -> rnd (TunnelInfoChain gad t xs zp zq, SK (Cyc t s' z)) Source #
Generates TunnelInfo
for each tunnel step from Head xs
to Last xs
.
(ExtendLinIdx e r s e' r' s', (~) Factored e' (* e ((/) r' r)), Divides e' r', CElt t zp, Ring zq, Random zq, CElt t zq, Reduce (DecompOf zq) zq, Gadget * gad zq, NFElt zq, CElt t (DecompOf zq), TunnelCtx t r s e' r' s' zp zq gad, (~) Factored e (FGCD r s), Divides e r, Divides e s, ZPP zp, TElt t (ZpOf zp), Tunnel ((:) (Factored, Factored) ((,) Factored Factored s s') rngs) t zp zq gad, Protoable (TunnelInfo gad t e r s e' r' s' zp zq), (~) * (ProtoType (TunnelInfo gad t e r s e' r' s' zp zq)) TunnelInfo) => Tunnel ((:) (Factored, Factored) ((,) Factored Factored r r') ((:) (Factored, Factored) ((,) Factored Factored s s') rngs)) t zp zq gad Source # | |
Tunnel ((:) (Factored, Factored) ((,) Factored Factored m m') ([] (Factored, Factored))) t zp zq gad Source # | |
class UnPP (CharOf zp) ~ '(Prime2, e) => PTRound t m m' e zp zq z gad zqs where Source #
Functions related to homomorphically rounding from 2^k to 2
roundHints, ptRound, ptRoundInternal
roundHints :: MonadRandom rnd => SK (Cyc t m' z) -> rnd (RoundHints t m m' z e zp zq zqs gad) Source #
Generate hints for rounding from \(R_p=R_{2^k}\) to \(R_2\)
PTRound t m m' P1 (ZqBasic PrimePower PP2 i) zq z gad zqs Source # | |
((~) (PrimeBin, Pos) (UnPP p) ((,) PrimeBin Pos Prime2 (S e)), (~) * zqup (ZqUp * zq zqs), (~) * zq' (ZqDown * zq zqs), (~) * zp (ZqBasic PrimePower p i), (~) * zp' (Div2 * zp), AddPublicCtx t m m' zp zq, AddPublicCtx t m m' zp zq', KeySwitchCtx gad t m' zp zq zqup, KSHintCtx gad t m' z zqup, Reflects PrimePower p Int, Ring (CT m zp (Cyc t m' zq)), RescaleCyc (Cyc t) zq zq', ToSDCtx t m' zp zq, ModSwitchPTCtx t m' zp zp' zq', PTRound t m m' e zp' zq' z gad zqs, Protoable (KSQuadCircHint gad (Cyc t m' (ZqUp * zq zqs)))) => PTRound t m m' (S e) (ZqBasic PrimePower p i) zq z gad zqs Source # | |
type family PTRings xs where ... Source #
The plaintext rings for a list of plaintext/ciphertext ring pairs.
class PTTunnel t xs zp where Source #
Functions for in-the-clear tunneling, needed to test the correctness of homomorphic PRF evaluation.
ptTunnelFuncs :: TunnelFuncs t xs zp Source #
Generate the linear functions to apply when tunneling from Head xs
to Last xs
.
ptTunnel :: (Head xs ~ r, Last xs ~ s) => TunnelFuncs t xs zp -> Cyc t r zp -> Cyc t s zp Source #
Tunnel a ring element from Head xs
to Last xs
.
data TunnelFuncs t xs zp where Source #
Linear functions used for in-the-clear tunneling
TFNil :: TunnelFuncs t '[m] zp | |
TFCons :: xs ~ (r ': (s ': rngs)) => Linear t zp (FGCD r s) r s -> TunnelFuncs t (Tail xs) zp -> TunnelFuncs t xs zp |
(NFData (Linear t zp (FGCD r s) r s), NFData (TunnelFuncs t ((:) Factored s xs) zp)) => NFData (TunnelFuncs t ((:) Factored r ((:) Factored s xs)) zp) Source # | |
NFData (TunnelFuncs t ((:) Factored m ([] Factored)) zp) Source # | |
((~) * (ProtoType (t s zp)) RqProduct, Protoable (Linear t zp e r s), Protoable (TunnelFuncs t ((:) Factored s rngs) zp), (~) * (ProtoType (TunnelFuncs t ((:) Factored s rngs) zp)) LinearFuncChain, Tensor t, (~) Factored e (FGCD r s), Fact e, Fact r, Fact s) => Protoable (TunnelFuncs t ((:) Factored r ((:) Factored s rngs)) zp) Source # | |
Protoable (TunnelFuncs t ((:) Factored m ([] Factored)) zp) Source # | |
type ProtoType (TunnelFuncs t ((:) Factored r ((:) Factored s rngs)) zp) Source # | |
type ProtoType (TunnelFuncs t ((:) Factored m ([] Factored)) zp) Source # | |