License | BSD3 |
---|---|
Safe Haskell | None |
Language | Haskell2010 |
Given a value of an arbitrary 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 serializedpayload is then encrypted using the symmetric cipher in CBC mode
using the hashed namespace as an initialization vector (IV).
Since the serialized payload is padded such that its length is an integer multiple of the block size we can detect namespace mismatches by checking that all bytes expected to have been inserted during padding are nil.
The probability of detecting a namespace mismatch is thus (1 - 2^{l text{mod} 64}) where \(l\) is the length of the serialized payload in bits.
- newtype CryptoID namespace a :: Symbol -> * -> * = CryptoID {
- ciphertext :: a
- data CryptoIDKey
- genKey :: MonadIO m => m CryptoIDKey
- readKeyFile :: MonadIO m => FilePath -> m CryptoIDKey
- encrypt :: forall a m c namespace. (KnownSymbol namespace, MonadThrow m, Binary a) => (ByteString -> m c) -> CryptoIDKey -> a -> m (CryptoID namespace c)
- decrypt :: forall a m c namespace. (KnownSymbol namespace, MonadThrow m, Binary a) => (c -> m ByteString) -> CryptoIDKey -> CryptoID namespace c -> m a
- data CryptoIDError
- type CryptoCipher = Blowfish
- type CryptoHash = SHAKE128 64
Documentation
newtype CryptoID namespace a :: Symbol -> * -> * #
CryptoID | |
|
Eq a => Eq (CryptoID namespace a) | |
(Data a, KnownSymbol namespace) => Data (CryptoID namespace a) | |
Ord a => Ord (CryptoID namespace a) | |
Read a => Read (CryptoID namespace a) | |
Show a => Show (CryptoID namespace a) | |
Generic (CryptoID namespace a) | |
Storable a => Storable (CryptoID namespace a) | |
Binary a => Binary (CryptoID namespace a) | |
ToHttpApiData a => ToHttpApiData (CryptoID namespace a) | |
FromHttpApiData a => FromHttpApiData (CryptoID namespace a) | |
PathPiece a => PathPiece (CryptoID namespace a) | |
type Rep (CryptoID namespace a) | |
data CryptoIDKey Source #
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.
Show CryptoIDKey Source # | Does not actually show any key material |
Binary CryptoIDKey Source # | |
ByteArrayAccess CryptoIDKey Source # | |
genKey :: MonadIO m => m CryptoIDKey Source #
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.
readKeyFile :: MonadIO m => FilePath -> m CryptoIDKey Source #
Try to read a CryptoIDKey
from a file.
If the file does not exist, securely generate a key (using genKey
) and
save it to the file.
encrypt :: forall a m c namespace. (KnownSymbol namespace, MonadThrow m, Binary a) => (ByteString -> m c) -> CryptoIDKey -> a -> m (CryptoID namespace c) Source #
Encrypt a serialized value
decrypt :: forall a m c namespace. (KnownSymbol namespace, MonadThrow m, Binary a) => (c -> m ByteString) -> CryptoIDKey -> CryptoID namespace c -> m a Source #
Decrypt a serialized value
data CryptoIDError Source #
AlgorithmError CryptoError | One of the underlying cryptographic algorithms
( |
NamespaceHashIsWrongLength ByteString | The length of the digest produced by The offending digest is included. This error should not occur and is included primarily for sake of totality. |
CiphertextConversionFailed | The produced |
DeserializationError (ByteString, ByteOffset, String) | The plaintext obtained by decrypting a ciphertext with the given
This is expected behaviour if the |
InvalidNamespaceDetected | We have determined that, allthough deserializion succeded, the ciphertext was likely modified during transit or created using a different namespace. |
type CryptoCipher = Blowfish Source #
The symmetric cipher BlockCipher
this module uses
type CryptoHash = SHAKE128 64 Source #
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.