module Encrypted (
Enc(..)
, withEnc
, overEnc
, getEnc
, mkEnc
) where
import GHC.Generics (Generic)
import qualified Crypto.Gpgme as G
import qualified Data.Binary as B
import qualified Data.ByteString.Lazy as BSL
data Enc a = Enc { encBytes :: G.Encrypted }
deriving Generic
instance B.Binary (Enc a)
withEnc
:: B.Binary a
=> G.Ctx
-> G.Key
-> Enc a
-> (a -> IO (b, a))
-> IO (b, Enc a)
withEnc c k e f = do
x <- getEnc c e
(o, y) <- f x
e' <- mkEnc c k y
return (o, e')
overEnc
:: B.Binary a
=> G.Ctx
-> G.Key
-> Enc a
-> (a -> IO a)
-> IO (Enc a)
overEnc c k e f = fmap snd . withEnc c k e $ (fmap ((),) . f)
getEnc
:: B.Binary a
=> G.Ctx
-> Enc a
-> IO a
getEnc c (Enc e) = do
Right x <- fmap (B.decode . BSL.fromStrict) <$> G.decrypt c e
return x
mkEnc
:: B.Binary a
=> G.Ctx
-> G.Key
-> a
-> IO (Enc a)
mkEnc c k x = do
Right e' <- G.encrypt c [k] G.NoFlag . BSL.toStrict . B.encode $ x
return (Enc e')