cryptoids 0.0.0 → 0.1.0
raw patch · 3 files changed
+37/−11 lines, 3 filesdep +directorydep +exceptionsdep +filepathdep −mtlPVP ok
version bump matches the API change (PVP)
Dependencies added: directory, exceptions, filepath
Dependencies removed: mtl
API changes (from Hackage documentation)
+ Data.CryptoID.Poly: readKeyFile :: MonadIO m => FilePath -> m CryptoIDKey
- Data.CryptoID.Poly: decrypt :: forall m namespace. (KnownSymbol namespace, MonadError CryptoIDError m) => CryptoIDKey -> CryptoID namespace ByteString -> m ByteString
+ Data.CryptoID.Poly: decrypt :: forall m namespace. (KnownSymbol namespace, MonadThrow m) => CryptoIDKey -> CryptoID namespace ByteString -> m ByteString
- Data.CryptoID.Poly: encrypt :: forall m namespace. (KnownSymbol namespace, MonadError CryptoIDError m) => CryptoIDKey -> ByteString -> m (CryptoID namespace ByteString)
+ Data.CryptoID.Poly: encrypt :: forall m namespace. (KnownSymbol namespace, MonadThrow m) => CryptoIDKey -> ByteString -> m (CryptoID namespace ByteString)
Files
- changes.md +4/−0
- cryptoids.cabal +4/−2
- src/Data/CryptoID/Poly.hs +29/−9
changes.md view
@@ -1,3 +1,7 @@+# 0.1.0+ - Switch to using 'MonadThrow' instead of 'MonadError'+ - Introduce 'readKeyFile'+ # 0.0.0 First published version
cryptoids.cabal view
@@ -1,5 +1,5 @@ name: cryptoids-version: 0.0.0+version: 0.1.0 cabal-version: >=1.10 build-type: Simple license: BSD3@@ -26,7 +26,9 @@ bytestring >=0.10.8.1 && <0.11, binary >=0.8.3.0 && <0.9, memory >=0.14.6 && <0.15,- mtl >=2.2.1 && <2.3+ exceptions >=0.8.3 && <0.9,+ filepath >=1.4.1.1 && <1.5,+ directory >=1.3.0.0 && <1.4 default-language: Haskell2010 default-extensions: RankNTypes DataKinds GeneralizedNewtypeDeriving ViewPatterns RecordWildCards FlexibleContexts
src/Data/CryptoID/Poly.hs view
@@ -16,7 +16,7 @@ module Data.CryptoID.Poly ( CryptoID(..) , CryptoIDKey- , genKey+ , genKey, readKeyFile , encrypt , decrypt , CryptoIDError(..)@@ -42,8 +42,10 @@ import qualified Data.ByteArray as ByteArray import Data.Foldable (asum)-import Control.Monad.Except+import Control.Monad.Catch (MonadThrow(..))+import Control.Monad.IO.Class import Control.Exception+import System.IO.Error import Data.Typeable import GHC.TypeLits@@ -56,7 +58,10 @@ import Crypto.Random.Entropy +import System.Directory+import System.FilePath + -- | The symmetric cipher 'BlockCipher' this module uses type CryptoCipher = Blowfish -- | The cryptographic 'HashAlgorithm' this module uses@@ -92,7 +97,7 @@ -- that parses) getKey (KeySizeFixed n) = getByteString n getKey (KeySizeEnum ns) = asum [ getKey $ KeySizeFixed n | n <- sortOn Down ns ]- getKey (KeySizeRange min max) = getKey $ KeySizeEnum [max .. min]+ getKey (KeySizeRange min max) = getKey $ KeySizeEnum [min .. max] -- | Error cases that can be encountered during 'encrypt' and 'decrypt'@@ -140,6 +145,21 @@ | KeySizeFixed n <- keySize' = n | KeySizeEnum ns <- keySize' = maximum ns | KeySizeRange _ max <- keySize' = max++-- | 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. +readKeyFile :: MonadIO m => FilePath -> m CryptoIDKey+readKeyFile keyFile = liftIO $ decodeFile keyFile `catch` generateInstead+ where+ generateInstead e+ | isDoesNotExistError e = do+ createDirectoryIfMissing True $ takeDirectory keyFile+ key <- genKey+ encodeFile keyFile key+ return key+ | otherwise = throw e+ -- | @pad err size src@ appends null bytes to @src@ until it has length that is@@ -151,23 +171,23 @@ -- | Use 'CryptoHash' to generate a 'Digest' of the Symbol passed as proxy type namespace' :: forall proxy namespace m.- ( KnownSymbol namespace, MonadError CryptoIDError m+ ( KnownSymbol namespace, MonadThrow m ) => proxy namespace -> m (IV CryptoCipher) namespace' p = case makeIV namespaceHash of- Nothing -> throwError . NamespaceHashIsWrongLength $ ByteArray.convert namespaceHash+ Nothing -> throwM . NamespaceHashIsWrongLength $ ByteArray.convert namespaceHash Just iv -> return iv where namespaceHash :: Digest CryptoHash namespaceHash = hash . ByteString.Char.pack $ symbolVal p -- | Wrap failure of one of the cryptographic algorithms as a 'CryptoIDError'-cryptoFailable :: MonadError CryptoIDError m => CryptoFailable a -> m a-cryptoFailable = either (throwError . AlgorithmError) return . eitherCryptoError+cryptoFailable :: MonadThrow m => CryptoFailable a -> m a+cryptoFailable = either (throwM . AlgorithmError) return . eitherCryptoError -- | Encrypt an arbitrary serializable value encrypt :: forall m namespace. ( KnownSymbol namespace- , MonadError CryptoIDError m+ , MonadThrow m ) => CryptoIDKey -> ByteString -> m (CryptoID namespace ByteString) encrypt (keyMaterial -> key) plaintext = do cipher <- cryptoFailable (cipherInit key :: CryptoFailable CryptoCipher)@@ -178,7 +198,7 @@ -- | Decrypt an arbitrary serializable value decrypt :: forall m namespace. ( KnownSymbol namespace- , MonadError CryptoIDError m+ , MonadThrow m ) => CryptoIDKey -> CryptoID namespace ByteString -> m ByteString decrypt (keyMaterial -> key) CryptoID{..} = do cipher <- cryptoFailable (cipherInit key :: CryptoFailable CryptoCipher)