module Data.UUID.Cryptographic
( CryptoUUID
, HasCryptoUUID
, encrypt
, decrypt
, module Data.CryptoID.Poly
) where
import Data.CryptoID.Poly hiding (encrypt, decrypt)
import qualified Data.CryptoID.Poly as Poly (encrypt, decrypt)
import Data.CryptoID.Class (HasCryptoID)
import qualified Data.CryptoID.Class as Class (HasCryptoID(..))
import Data.UUID (UUID, toByteString, fromByteString)
import Data.Binary
import qualified Data.ByteString.Lazy as Lazy.ByteString
import Control.Monad.Catch
import GHC.TypeLits
type CryptoUUID (namespace :: Symbol) = CryptoID namespace UUID
type HasCryptoUUID (namespace :: Symbol) = HasCryptoID namespace UUID
encrypt :: forall a m namespace.
( KnownSymbol namespace
, Binary a
, MonadThrow m
) => CryptoIDKey -> a -> m (CryptoUUID namespace)
encrypt = Poly.encrypt (const . return $ Just 16) $ \str -> maybe (throwM $ CiphertextConversionFailed str) return . fromByteString $ Lazy.ByteString.fromStrict str
decrypt :: forall a m namespace.
( KnownSymbol namespace
, Binary a
, MonadThrow m
) => CryptoIDKey -> CryptoUUID namespace -> m a
decrypt = Poly.decrypt $ return . Lazy.ByteString.toStrict . toByteString
instance ( MonadCrypto m
, MonadCryptoKey m ~ CryptoIDKey
, KnownSymbol namespace
, Binary a
) => HasCryptoID namespace UUID a m where
encrypt = cryptoIDKey . flip encrypt
decrypt = cryptoIDKey . flip decrypt