61 lines
1.8 KiB
Haskell
61 lines
1.8 KiB
Haskell
-- |
|
|
-- Module : Crypto.Cipher.Types
|
|
-- License : BSD-style
|
|
-- Maintainer : Vincent Hanquez <vincent@snarc.org>
|
|
-- Stability : Stable
|
|
-- Portability : Excellent
|
|
--
|
|
-- symmetric cipher basic types
|
|
--
|
|
{-# LANGUAGE DeriveDataTypeable #-}
|
|
module Crypto.Cipher.Types
|
|
(
|
|
-- * Cipher classes
|
|
Cipher(..)
|
|
, BlockCipher(..)
|
|
, StreamCipher(..)
|
|
, DataUnitOffset
|
|
, KeySizeSpecifier(..)
|
|
, KeyError(..)
|
|
, AEAD(..)
|
|
, AEADState(..)
|
|
, AEADMode(..)
|
|
, AEADModeImpl(..)
|
|
, cfb8Encrypt
|
|
, cfb8Decrypt
|
|
-- * AEAD functions
|
|
, module Crypto.Cipher.Types.AEAD
|
|
-- * Key type and constructor
|
|
, Key
|
|
, makeKey
|
|
-- * Initial Vector type and constructor
|
|
, IV
|
|
, makeIV
|
|
, nullIV
|
|
, ivAdd
|
|
-- * Authentification Tag
|
|
, AuthTag(..)
|
|
) where
|
|
|
|
import Data.SecureMem
|
|
import Data.Byteable
|
|
import Crypto.Cipher.Types.Base
|
|
import Crypto.Cipher.Types.Block
|
|
import Crypto.Cipher.Types.Stream
|
|
import Crypto.Cipher.Types.AEAD
|
|
|
|
-- | Create a Key for a specified cipher
|
|
makeKey :: (ToSecureMem b, Cipher c) => b -> Either KeyError (Key c)
|
|
makeKey b = toKey undefined
|
|
where sm = toSecureMem b
|
|
smLen = byteableLength sm
|
|
toKey :: Cipher c => c -> Either KeyError (Key c)
|
|
toKey cipher = case cipherKeySize cipher of
|
|
KeySizeRange mi ma | smLen < mi -> Left KeyErrorTooSmall
|
|
| smLen > ma -> Left KeyErrorTooBig
|
|
| otherwise -> Right $ Key sm
|
|
KeySizeEnum l | smLen `elem` l -> Right $ Key sm
|
|
| otherwise -> Left $ KeyErrorInvalid ("valid size: " ++ show l)
|
|
KeySizeFixed v | smLen == v -> Right $ Key sm
|
|
| otherwise -> Left $ KeyErrorInvalid ("valid size: " ++ show v)
|