-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Reversable and secure encoding of object ids as a bytestring -- -- Reversable and secure encoding of object ids as a bytestring @package cryptoids @version 0.0.0 -- | Given a value of a serializable type (like Int) we perform -- serialization and compute a cryptographic hash of the associated -- namespace (carried as a phantom type of kind Symbol). The -- serialized payload is then encrypted using the symmetric cipher in CBC -- mode using the hashed namespace as an initialization vector (IV). -- -- The probability of detecting a namespace mismatch is thus <math> -- where <math> is the length of the serialized payload. module Data.CryptoID.Poly newtype CryptoID (namespace :: Symbol) a :: Symbol -> * -> * CryptoID :: a -> CryptoID a [ciphertext] :: CryptoID a -> a -- | This newtype ensures only keys of the correct length can be created -- -- Use genKey to securely generate keys. -- -- Use the Binary instance to save and restore values of -- CryptoIDKey across executions. data CryptoIDKey -- | Securely generate a new key using system entropy -- -- When CryptoCipher accepts keys of varying lengths this function -- generates a key of the largest accepted size. genKey :: MonadIO m => m CryptoIDKey -- | Encrypt an arbitrary serializable value encrypt :: forall m namespace. (KnownSymbol namespace, MonadError CryptoIDError m) => CryptoIDKey -> ByteString -> m (CryptoID namespace ByteString) -- | Decrypt an arbitrary serializable value decrypt :: forall m namespace. (KnownSymbol namespace, MonadError CryptoIDError m) => CryptoIDKey -> CryptoID namespace ByteString -> m ByteString -- | Error cases that can be encountered during encrypt and -- decrypt data CryptoIDError -- | One of the underlying cryptographic algorithms (CryptoHash or -- CryptoCipher) failed. AlgorithmError :: CryptoError -> CryptoIDError -- | The length of the digest produced by CryptoHash does not match -- the block size of CryptoCipher. -- -- The offending digest is included. -- -- This error should not occur and is included primarily for sake of -- totality. NamespaceHashIsWrongLength :: ByteString -> CryptoIDError -- | The produced ByteString is the wrong length for conversion into -- a ciphertext. CiphertextConversionFailed :: CryptoIDError -- | The plaintext obtained by decrypting a ciphertext with the given -- CryptoIDKey in the context of the namespace could not -- be deserialized into a value of the expected payload-type. -- -- This is expected behaviour if the namespace or -- payload-type does not match the ones used during -- encryption or if the ciphertext was tempered with. DeserializationError :: (ByteString, ByteOffset, String) -> CryptoIDError -- | We have determined that, allthough deserializion succeded, the -- ciphertext was likely modified during transit or created using a -- different namespace. InvalidNamespaceDetected :: CryptoIDError -- | The symmetric cipher BlockCipher this module uses type CryptoCipher = Blowfish -- | The cryptographic HashAlgorithm this module uses -- -- We expect the block size of CryptoCipher to be exactly the size -- of the Digest generated by CryptoHash (since a -- Digest is used as an IV). -- -- Violation of this expectation causes runtime errors. type CryptoHash = SHAKE128 64 instance GHC.Classes.Eq Data.CryptoID.Poly.CryptoIDError instance GHC.Show.Show Data.CryptoID.Poly.CryptoIDError instance Data.ByteArray.Types.ByteArrayAccess Data.CryptoID.Poly.CryptoIDKey instance GHC.Show.Show Data.CryptoID.Poly.CryptoIDKey instance Data.Binary.Class.Binary Data.CryptoID.Poly.CryptoIDKey instance GHC.Exception.Exception Data.CryptoID.Poly.CryptoIDError