lol-apps-0.2.0.0: Lattice-based cryptographic applications using Lol.

Copyright(c) Eric Crockett 2011-2017
Chris Peikert 2011-2017
LicenseGPL-2
Maintainerecrockett0@email.com
Stabilityexperimental
PortabilityPOSIX \( \def\Z{\mathbb{Z}} \)
Safe HaskellNone
LanguageHaskell2010

Crypto.Lol.Applications.HomomPRF

Description

Homomorphic evaluation of the PRF from [BP14].

Synopsis

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.

Constructors

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 

Instances

(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 # 

Methods

rnf :: RoundHints k k1 k2 t m m' z (S e) zp zq zqs gad -> () #

NFData (RoundHints k k1 k2 t m m' z P1 zp zq zqs gad) Source # 

Methods

rnf :: RoundHints k k1 k2 t m m' z P1 zp zq zqs gad -> () #

(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 # 

Associated Types

type ProtoType (RoundHints k k1 k2 t m m' z (S e) zp zq zqs gad) :: * #

Methods

toProto :: RoundHints k k1 k2 t m m' z (S e) zp zq zqs gad -> ProtoType (RoundHints k k1 k2 t m m' z (S e) zp zq zqs gad) #

fromProto :: MonadError String m => ProtoType (RoundHints k k1 k2 t m m' z (S e) zp zq zqs gad) -> m (RoundHints k k1 k2 t m m' z (S e) zp zq zqs gad) #

Protoable (RoundHints k k1 k2 t m m' z P1 zp zq zqs gad) Source # 

Associated Types

type ProtoType (RoundHints k k1 k2 t m m' z P1 zp zq zqs gad) :: * #

Methods

toProto :: RoundHints k k1 k2 t m m' z P1 zp zq zqs gad -> ProtoType (RoundHints k k1 k2 t m m' z P1 zp zq zqs gad) #

fromProto :: MonadError String m => ProtoType (RoundHints k k1 k2 t m m' z P1 zp zq zqs gad) -> m (RoundHints k k1 k2 t m m' z P1 zp zq zqs gad) #

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 (S e) zp zq zqs gad) = RoundHintChain
type ProtoType (RoundHints k k1 k2 t m m' z P1 zp zq zqs gad) Source # 
type ProtoType (RoundHints k k1 k2 t m m' z P1 zp zq zqs gad) = RoundHintChain

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.

Constructors

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 

Instances

((~) Factored e' (* e ((/) r' r)), (~) Factored e (FGCD r s), NFData (TunnelInfo gad t e r s e' r' s' zp zq), NFData (TunnelInfoChain gad t ((:) (Factored, Factored) ((,) Factored Factored s s') rngs) zp zq)) => NFData (TunnelInfoChain gad t ((:) (Factored, Factored) ((,) Factored Factored r r') ((:) (Factored, Factored) ((,) Factored Factored s s') rngs)) zp zq) Source # 

Methods

rnf :: TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) r r') (((Factored, Factored) ': (Factored, Factored) s s') rngs)) zp zq -> () #

NFData (TunnelInfoChain gad t ((:) (Factored, Factored) ((,) Factored Factored m m') ([] (Factored, Factored))) zp zq) Source # 

Methods

rnf :: TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) m m') [(Factored, Factored)]) zp zq -> () #

((~) Factored e' (* e ((/) r' r)), (~) Factored e (FGCD r s), Protoable (TunnelInfo gad t e r s e' r' s' zp zq), Protoable (TunnelInfoChain gad t ((:) (Factored, Factored) ((,) Factored Factored s s') rngs) zp zq), (~) * (ProtoType (TunnelInfoChain gad t ((:) (Factored, Factored) ((,) Factored Factored s s') rngs) zp zq)) TunnelInfoChain) => Protoable (TunnelInfoChain gad t ((:) (Factored, Factored) ((,) Factored Factored r r') ((:) (Factored, Factored) ((,) Factored Factored s s') rngs)) zp zq) Source # 

Associated Types

type ProtoType (TunnelInfoChain gad t ((:) (Factored, Factored) ((,) Factored Factored r r') ((:) (Factored, Factored) ((,) Factored Factored s s') rngs)) zp zq) :: * #

Methods

toProto :: TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) r r') (((Factored, Factored) ': (Factored, Factored) s s') rngs)) zp zq -> ProtoType (TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) r r') (((Factored, Factored) ': (Factored, Factored) s s') rngs)) zp zq) #

fromProto :: MonadError String m => ProtoType (TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) r r') (((Factored, Factored) ': (Factored, Factored) s s') rngs)) zp zq) -> m (TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) r r') (((Factored, Factored) ': (Factored, Factored) s s') rngs)) zp zq) #

Protoable (TunnelInfoChain gad t ((:) (Factored, Factored) ((,) Factored Factored m m') ([] (Factored, Factored))) zp zq) Source # 

Associated Types

type ProtoType (TunnelInfoChain gad t ((:) (Factored, Factored) ((,) Factored Factored m m') ([] (Factored, Factored))) zp zq) :: * #

Methods

toProto :: TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) m m') [(Factored, Factored)]) zp zq -> ProtoType (TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) m m') [(Factored, Factored)]) zp zq) #

fromProto :: MonadError String m => ProtoType (TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) m m') [(Factored, Factored)]) zp zq) -> m (TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) m m') [(Factored, Factored)]) zp zq) #

type ProtoType (TunnelInfoChain gad t ((:) (Factored, Factored) ((,) Factored Factored r r') ((:) (Factored, Factored) ((,) Factored Factored s s') rngs)) zp zq) Source # 
type ProtoType (TunnelInfoChain gad t ((:) (Factored, Factored) ((,) Factored Factored m m') ([] (Factored, Factored))) zp zq) Source # 

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.

Constructors

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 

Instances

((~) (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 # 

Methods

rnf :: EvalHints k t rngs z zp zq zqs gad -> () #

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 ZqUp zq zqs = NextListElt zq (Reverse zqs) Source #

The element before zq in type list zqs.

type ZqDown zq zqs = NextListElt zq zqs Source #

The element after zq in type list zqs.

type family TwoOf (a :: k) :: k Source #

\(\Z_2\) for ZqBasic with a PrimePower modulus

Instances

class Tunnel xs t zp zq gad where Source #

Functions related to homomorphic ring tunneling.

Minimal complete definition

tunnelInfoChain, tunnelInternal

Methods

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.

Instances

(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 # 

Methods

tunnelInfoChain :: (MonadRandom rnd, ((Factored, Factored) ~ Head (Factored, Factored) (((Factored, Factored) ': (Factored, Factored) r r') (((Factored, Factored) ': (Factored, Factored) s s') rngs))) ((Factored, Factored) r r'), ((Factored, Factored) ~ Last (Factored, Factored) (((Factored, Factored) ': (Factored, Factored) r r') (((Factored, Factored) ': (Factored, Factored) s s') rngs))) ((Factored, Factored) s s'), Lift zp z, CElt t z, ToInteger z, Reduce z zq) => SK (Cyc t r' z) -> rnd (TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) r r') (((Factored, Factored) ': (Factored, Factored) s s') rngs)) zp zq, SK (Cyc t s' z)) Source #

tunnelInternal :: (((Factored, Factored) ~ Head (Factored, Factored) (((Factored, Factored) ': (Factored, Factored) r r') (((Factored, Factored) ': (Factored, Factored) s s') rngs))) ((Factored, Factored) r r'), ((Factored, Factored) ~ Last (Factored, Factored) (((Factored, Factored) ': (Factored, Factored) r r') (((Factored, Factored) ': (Factored, Factored) s s') rngs))) ((Factored, Factored) s s')) => TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) r r') (((Factored, Factored) ': (Factored, Factored) s s') rngs)) zp zq -> CT r zp (Cyc t r' zq) -> CT s zp (Cyc t s' zq)

Tunnel ((:) (Factored, Factored) ((,) Factored Factored m m') ([] (Factored, Factored))) t zp zq gad Source # 

Methods

tunnelInfoChain :: (MonadRandom rnd, ((Factored, Factored) ~ Head (Factored, Factored) (((Factored, Factored) ': (Factored, Factored) m m') [(Factored, Factored)])) ((Factored, Factored) r r'), ((Factored, Factored) ~ Last (Factored, Factored) (((Factored, Factored) ': (Factored, Factored) m m') [(Factored, Factored)])) ((Factored, Factored) s s'), Lift zp z, CElt t z, ToInteger z, Reduce z zq) => SK (Cyc t r' z) -> rnd (TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) m m') [(Factored, Factored)]) zp zq, SK (Cyc t s' z)) Source #

tunnelInternal :: (((Factored, Factored) ~ Head (Factored, Factored) (((Factored, Factored) ': (Factored, Factored) m m') [(Factored, Factored)])) ((Factored, Factored) r r'), ((Factored, Factored) ~ Last (Factored, Factored) (((Factored, Factored) ': (Factored, Factored) m m') [(Factored, Factored)])) ((Factored, Factored) s s')) => TunnelInfoChain gad t (((Factored, Factored) ': (Factored, Factored) m m') [(Factored, Factored)]) zp zq -> CT r zp (Cyc t r' zq) -> CT s zp (Cyc t s' zq)

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

Minimal complete definition

roundHints, ptRound, ptRoundInternal

Associated Types

type ZqResult e zq (zqs :: [*]) Source #

Methods

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\)

Instances

PTRound t m m' P1 (ZqBasic PrimePower PP2 i) zq z gad zqs Source # 

Associated Types

type ZqResult (P1 :: Pos) zq (zqs :: [*]) :: * Source #

Methods

roundHints :: MonadRandom rnd => SK (Cyc t m' z) -> rnd (RoundHints * * Factored t m m' z P1 (ZqBasic PrimePower PP2 i) zq zqs gad) Source #

ptRound :: RoundHints * * Factored t m m' z P1 (ZqBasic PrimePower PP2 i) zq zqs gad -> CT m (ZqBasic PrimePower PP2 i) (Cyc t m' zq) -> CT m (TwoOf * (ZqBasic PrimePower PP2 i)) (Cyc t m' (ZqResult P1 zq zqs))

ptRoundInternal :: RoundHints * * Factored t m m' z P1 (ZqBasic PrimePower PP2 i) zq zqs gad -> [CT m (ZqBasic PrimePower PP2 i) (Cyc t m' zq)] -> CT m (TwoOf * (ZqBasic PrimePower PP2 i)) (Cyc t m' (ZqResult P1 zq zqs))

((~) (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 # 

Associated Types

type ZqResult (S e :: Pos) zq (zqs :: [*]) :: * Source #

Methods

roundHints :: MonadRandom rnd => SK (Cyc t m' z) -> rnd (RoundHints * * Factored t m m' z (S e) (ZqBasic PrimePower p i) zq zqs gad) Source #

ptRound :: RoundHints * * Factored t m m' z (S e) (ZqBasic PrimePower p i) zq zqs gad -> CT m (ZqBasic PrimePower p i) (Cyc t m' zq) -> CT m (TwoOf * (ZqBasic PrimePower p i)) (Cyc t m' (ZqResult (S e) zq zqs))

ptRoundInternal :: RoundHints * * Factored t m m' z (S e) (ZqBasic PrimePower p i) zq zqs gad -> [CT m (ZqBasic PrimePower p i) (Cyc t m' zq)] -> CT m (TwoOf * (ZqBasic PrimePower p i)) (Cyc t m' (ZqResult (S e) zq zqs))

type family PTRings xs where ... Source #

The plaintext rings for a list of plaintext/ciphertext ring pairs.

Equations

PTRings '[] = '[] 
PTRings ('(a, b) ': rest) = a ': PTRings rest 

class PTTunnel t xs zp where Source #

Functions for in-the-clear tunneling, needed to test the correctness of homomorphic PRF evaluation.

Minimal complete definition

ptTunnelFuncs, ptTunnel

Methods

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.

Instances

((~) Factored e (FGCD r s), Divides e r, Divides e s, PTTunnel t ((:) Factored s rngs) zp, CElt t zp, ZPP zp, TElt t (ZpOf zp)) => PTTunnel t ((:) Factored r ((:) Factored s rngs)) zp Source # 

Methods

ptTunnelFuncs :: TunnelFuncs t ((Factored ': r) ((Factored ': s) rngs)) zp Source #

ptTunnel :: ((Factored ~ Head Factored ((Factored ': r) ((Factored ': s) rngs))) r, (Factored ~ Last Factored ((Factored ': r) ((Factored ': s) rngs))) s) => TunnelFuncs t ((Factored ': r) ((Factored ': s) rngs)) zp -> Cyc t r zp -> Cyc t s zp Source #

PTTunnel t ((:) Factored r ([] Factored)) z Source # 

Methods

ptTunnelFuncs :: TunnelFuncs t ((Factored ': r) [Factored]) z Source #

ptTunnel :: ((Factored ~ Head Factored ((Factored ': r) [Factored])) r, (Factored ~ Last Factored ((Factored ': r) [Factored])) s) => TunnelFuncs t ((Factored ': r) [Factored]) z -> Cyc t r z -> Cyc t s z Source #

data TunnelFuncs t xs zp where Source #

Linear functions used for in-the-clear tunneling

Constructors

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 

Instances

(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 # 

Methods

rnf :: TunnelFuncs t ((Factored ': r) ((Factored ': s) xs)) zp -> () #

NFData (TunnelFuncs t ((:) Factored m ([] Factored)) zp) Source # 

Methods

rnf :: TunnelFuncs t ((Factored ': m) [Factored]) zp -> () #

((~) * (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 # 

Associated Types

type ProtoType (TunnelFuncs t ((:) Factored r ((:) Factored s rngs)) zp) :: * #

Methods

toProto :: TunnelFuncs t ((Factored ': r) ((Factored ': s) rngs)) zp -> ProtoType (TunnelFuncs t ((Factored ': r) ((Factored ': s) rngs)) zp) #

fromProto :: MonadError String m => ProtoType (TunnelFuncs t ((Factored ': r) ((Factored ': s) rngs)) zp) -> m (TunnelFuncs t ((Factored ': r) ((Factored ': s) rngs)) zp) #

Protoable (TunnelFuncs t ((:) Factored m ([] Factored)) zp) Source # 

Associated Types

type ProtoType (TunnelFuncs t ((:) Factored m ([] Factored)) zp) :: * #

Methods

toProto :: TunnelFuncs t ((Factored ': m) [Factored]) zp -> ProtoType (TunnelFuncs t ((Factored ': m) [Factored]) zp) #

fromProto :: MonadError String m => ProtoType (TunnelFuncs t ((Factored ': m) [Factored]) zp) -> m (TunnelFuncs t ((Factored ': m) [Factored]) zp) #

type ProtoType (TunnelFuncs t ((:) Factored r ((:) Factored s rngs)) zp) Source # 
type ProtoType (TunnelFuncs t ((:) Factored r ((:) Factored s rngs)) zp) = LinearFuncChain
type ProtoType (TunnelFuncs t ((:) Factored m ([] Factored)) zp) Source #