1{-# LANGUAGE EmptyDataDecls #-}
2-- |
3-- Module      : Network.TLS.Types
4-- License     : BSD-style
5-- Maintainer  : Vincent Hanquez <vincent@snarc.org>
6-- Stability   : experimental
7-- Portability : unknown
8--
9module Network.TLS.Types
10    ( Version(..)
11    , SessionID
12    , SessionData(..)
13    , SessionFlag(..)
14    , CertReqContext
15    , TLS13TicketInfo(..)
16    , CipherID
17    , CompressionID
18    , Role(..)
19    , invertRole
20    , Direction(..)
21    , HostName
22    , Second
23    , Millisecond
24    , EarlySecret
25    , HandshakeSecret
26    , ApplicationSecret
27    , ResumptionSecret
28    , BaseSecret(..)
29    , ClientTrafficSecret(..)
30    , ServerTrafficSecret(..)
31    , SecretTriple(..)
32    , SecretPair(..)
33    , MasterSecret(..)
34    ) where
35
36import Network.TLS.Imports
37import Network.TLS.Crypto.Types (Group)
38
39type HostName    = String
40type Second      = Word32
41type Millisecond = Word64
42
43-- | Versions known to TLS
44--
45-- SSL2 is just defined, but this version is and will not be supported.
46data Version = SSL2 | SSL3 | TLS10 | TLS11 | TLS12 | TLS13 deriving (Show, Eq, Ord, Bounded)
47
48-- | A session ID
49type SessionID = ByteString
50
51-- | Session data to resume
52data SessionData = SessionData
53    { sessionVersion     :: Version
54    , sessionCipher      :: CipherID
55    , sessionCompression :: CompressionID
56    , sessionClientSNI   :: Maybe HostName
57    , sessionSecret      :: ByteString
58    , sessionGroup       :: Maybe Group
59    , sessionTicketInfo  :: Maybe TLS13TicketInfo
60    , sessionALPN        :: Maybe ByteString
61    , sessionMaxEarlyDataSize :: Int
62    , sessionFlags       :: [SessionFlag]
63    } deriving (Show,Eq)
64
65-- | Some session flags
66data SessionFlag
67    = SessionEMS        -- ^ Session created with Extended Master Secret
68    deriving (Show,Eq,Enum)
69
70-- | Certificate request context for TLS 1.3.
71type CertReqContext = ByteString
72
73data TLS13TicketInfo = TLS13TicketInfo
74    { lifetime :: Second      -- NewSessionTicket.ticket_lifetime in seconds
75    , ageAdd   :: Second      -- NewSessionTicket.ticket_age_add
76    , txrxTime :: Millisecond -- serverSendTime or clientReceiveTime
77    , estimatedRTT :: Maybe Millisecond
78    } deriving (Show, Eq)
79
80-- | Cipher identification
81type CipherID = Word16
82
83-- | Compression identification
84type CompressionID = Word8
85
86-- | Role
87data Role = ClientRole | ServerRole
88    deriving (Show,Eq)
89
90-- | Direction
91data Direction = Tx | Rx
92    deriving (Show,Eq)
93
94invertRole :: Role -> Role
95invertRole ClientRole = ServerRole
96invertRole ServerRole = ClientRole
97
98data EarlySecret
99data HandshakeSecret
100data ApplicationSecret
101data ResumptionSecret
102
103newtype BaseSecret a = BaseSecret ByteString deriving Show
104newtype ClientTrafficSecret a = ClientTrafficSecret ByteString deriving Show
105newtype ServerTrafficSecret a = ServerTrafficSecret ByteString deriving Show
106
107data SecretTriple a = SecretTriple
108    { triBase   :: BaseSecret a
109    , triClient :: ClientTrafficSecret a
110    , triServer :: ServerTrafficSecret a
111    }
112
113data SecretPair a = SecretPair
114    { pairBase   :: BaseSecret a
115    , pairClient :: ClientTrafficSecret a
116    }
117
118-- Master secret for TLS 1.2 or earlier.
119newtype MasterSecret = MasterSecret ByteString deriving Show
120