2011-03-02 08:43:05 +00:00
|
|
|
{-# OPTIONS_HADDOCK hide #-}
|
2011-08-13 06:56:17 +00:00
|
|
|
{-# LANGUAGE ExistentialQuantification #-}
|
2010-09-09 21:47:19 +00:00
|
|
|
-- |
|
|
|
|
-- Module : Network.TLS.Cipher
|
|
|
|
-- License : BSD-style
|
|
|
|
-- Maintainer : Vincent Hanquez <vincent@snarc.org>
|
|
|
|
-- Stability : experimental
|
|
|
|
-- Portability : unknown
|
|
|
|
--
|
|
|
|
module Network.TLS.Cipher
|
|
|
|
( CipherTypeFunctions(..)
|
|
|
|
, CipherKeyExchangeType(..)
|
2011-08-13 10:06:23 +00:00
|
|
|
, Bulk(..)
|
2010-09-09 21:47:19 +00:00
|
|
|
, Cipher(..)
|
2010-12-07 09:15:22 +00:00
|
|
|
, Key
|
|
|
|
, IV
|
2010-09-09 21:47:19 +00:00
|
|
|
, cipherExchangeNeedMoreData
|
|
|
|
) where
|
|
|
|
|
|
|
|
import Data.Word
|
|
|
|
import Network.TLS.Struct (Version(..))
|
2010-10-06 08:07:48 +00:00
|
|
|
|
2010-09-09 21:47:19 +00:00
|
|
|
import qualified Data.ByteString as B
|
|
|
|
|
|
|
|
-- FIXME convert to newtype
|
|
|
|
type Key = B.ByteString
|
|
|
|
type IV = B.ByteString
|
|
|
|
|
|
|
|
data CipherTypeFunctions =
|
|
|
|
CipherNoneF -- special value for 0
|
2010-09-26 09:34:47 +00:00
|
|
|
| CipherBlockF (Key -> IV -> B.ByteString -> B.ByteString)
|
|
|
|
(Key -> IV -> B.ByteString -> B.ByteString)
|
2010-09-09 21:47:19 +00:00
|
|
|
| CipherStreamF (Key -> IV)
|
2010-09-26 09:34:47 +00:00
|
|
|
(IV -> B.ByteString -> (B.ByteString, IV))
|
|
|
|
(IV -> B.ByteString -> (B.ByteString, IV))
|
2010-09-09 21:47:19 +00:00
|
|
|
|
|
|
|
data CipherKeyExchangeType =
|
2011-05-12 07:18:56 +00:00
|
|
|
CipherKeyExchange_RSA
|
2011-06-07 07:59:20 +00:00
|
|
|
| CipherKeyExchange_DH_Anon
|
2011-05-12 07:18:56 +00:00
|
|
|
| CipherKeyExchange_DHE_RSA
|
|
|
|
| CipherKeyExchange_ECDHE_RSA
|
|
|
|
| CipherKeyExchange_DHE_DSS
|
|
|
|
| CipherKeyExchange_DH_DSS
|
|
|
|
| CipherKeyExchange_DH_RSA
|
|
|
|
| CipherKeyExchange_ECDH_ECDSA
|
|
|
|
| CipherKeyExchange_ECDH_RSA
|
|
|
|
| CipherKeyExchange_ECDHE_ECDSA
|
2011-05-12 07:26:00 +00:00
|
|
|
deriving (Show,Eq)
|
2010-09-09 21:47:19 +00:00
|
|
|
|
2011-08-13 10:06:23 +00:00
|
|
|
data Bulk = Bulk
|
|
|
|
{ bulkName :: String
|
2011-08-13 10:08:29 +00:00
|
|
|
, cipherKeySize :: Int
|
|
|
|
, cipherIVSize :: Int
|
|
|
|
, cipherKeyBlockSize :: Int
|
2011-08-13 10:06:23 +00:00
|
|
|
, cipherF :: CipherTypeFunctions
|
|
|
|
}
|
|
|
|
|
2011-03-02 08:43:05 +00:00
|
|
|
-- | Cipher algorithm
|
2010-09-09 21:47:19 +00:00
|
|
|
data Cipher = Cipher
|
|
|
|
{ cipherID :: Word16
|
|
|
|
, cipherName :: String
|
|
|
|
, cipherDigestSize :: Word8
|
2011-08-13 10:06:23 +00:00
|
|
|
, cipherBulk :: Bulk
|
2010-09-09 21:47:19 +00:00
|
|
|
, cipherPaddingSize :: Word8
|
|
|
|
, cipherKeyExchange :: CipherKeyExchangeType
|
2010-10-06 08:07:48 +00:00
|
|
|
, cipherMACHash :: B.ByteString -> B.ByteString
|
2010-09-09 21:47:19 +00:00
|
|
|
, cipherMinVer :: Maybe Version
|
|
|
|
}
|
|
|
|
|
|
|
|
instance Show Cipher where
|
|
|
|
show c = cipherName c
|
|
|
|
|
2010-12-04 13:08:38 +00:00
|
|
|
instance Eq Cipher where
|
|
|
|
(==) c1 c2 = cipherID c1 == cipherID c2
|
|
|
|
|
2010-09-09 21:47:19 +00:00
|
|
|
cipherExchangeNeedMoreData :: CipherKeyExchangeType -> Bool
|
2011-05-12 07:18:56 +00:00
|
|
|
cipherExchangeNeedMoreData CipherKeyExchange_RSA = False
|
2011-06-07 07:59:20 +00:00
|
|
|
cipherExchangeNeedMoreData CipherKeyExchange_DH_Anon = True
|
2011-05-12 07:18:56 +00:00
|
|
|
cipherExchangeNeedMoreData CipherKeyExchange_DHE_RSA = True
|
|
|
|
cipherExchangeNeedMoreData CipherKeyExchange_ECDHE_RSA = True
|
|
|
|
cipherExchangeNeedMoreData CipherKeyExchange_DHE_DSS = True
|
|
|
|
cipherExchangeNeedMoreData CipherKeyExchange_DH_DSS = False
|
|
|
|
cipherExchangeNeedMoreData CipherKeyExchange_DH_RSA = False
|
|
|
|
cipherExchangeNeedMoreData CipherKeyExchange_ECDH_ECDSA = True
|
|
|
|
cipherExchangeNeedMoreData CipherKeyExchange_ECDH_RSA = True
|
|
|
|
cipherExchangeNeedMoreData CipherKeyExchange_ECDHE_ECDSA = True
|