36 lines
1.5 KiB
Haskell
36 lines
1.5 KiB
Haskell
{-|
|
|
Description: Typeclass based interface to 'cryptoids'
|
|
License: BSD3
|
|
|
|
Polymorphic functions to perform cryptographic operations on 'CryptoID's in a monadic context
|
|
-}
|
|
module Data.CryptoID.Class
|
|
( MonadCrypto(..)
|
|
, HasCryptoID(..)
|
|
) where
|
|
|
|
import Data.CryptoID (CryptoID)
|
|
|
|
import GHC.TypeLits (Symbol)
|
|
|
|
import Control.Monad.Catch (MonadThrow)
|
|
|
|
-- | Class of monads granting reader access to a key and allowing for failure during cryptographic operations
|
|
--
|
|
-- This formulation is weaker than @MonadReader key@ (from mtl) in that it does not require @local@.
|
|
class MonadThrow m => MonadCrypto (m :: * -> *) where
|
|
type MonadCryptoKey m :: *
|
|
cryptoIDKey :: (MonadCryptoKey m -> m a) -> m a
|
|
|
|
-- | Multiparameter typeclass of @(namespace, ciphertext, plaintext, monad)@ tuples which allow for cryptographic operations on 'CryptoID's with appropriate @namespace@, @plaintext@, and @ciphertext@, utilising the state of @monad@
|
|
--
|
|
-- Instances of this typeclass are usually universally quantified over (at least) @namespace@, and @m@
|
|
class MonadCrypto m => HasCryptoID (namespace :: Symbol) (ciphertext :: *) (plaintext :: *) (m :: * -> *) where
|
|
encrypt :: plaintext -> m (CryptoID namespace ciphertext)
|
|
-- ^ Encrypt a @plaintext@ in a fashion dependent on the @namespace@ and desired @ciphertext@-type retrieving the key from and throwing errors into @m@
|
|
|
|
decrypt :: CryptoID namespace ciphertext -> m plaintext
|
|
-- ^ Encrypt a @ciphertext@ in a fashion dependent on the @namespace@ and desired @plaintext@-type retrieving the key from and throwing errors into @m@
|
|
|
|
|