1-- |
2-- Module      : Network.TLS.Struct13
3-- License     : BSD-style
4-- Maintainer  : Vincent Hanquez <vincent@snarc.org>
5-- Stability   : experimental
6-- Portability : unknown
7--
8module Network.TLS.Struct13
9       ( Packet13(..)
10       , Handshake13(..)
11       , HandshakeType13(..)
12       , typeOfHandshake13
13       , contentType
14       , KeyUpdate(..)
15       ) where
16
17import Data.X509 (CertificateChain)
18import Network.TLS.Struct
19import Network.TLS.Types
20import Network.TLS.Imports
21
22data Packet13 =
23      Handshake13 [Handshake13]
24    | Alert13 [(AlertLevel, AlertDescription)]
25    | ChangeCipherSpec13
26    | AppData13 ByteString
27    deriving (Show,Eq)
28
29data KeyUpdate = UpdateNotRequested
30               | UpdateRequested
31               deriving (Show,Eq)
32
33type TicketNonce = ByteString
34
35-- fixme: convert Word32 to proper data type
36data Handshake13 =
37      ClientHello13 !Version !ClientRandom !Session ![CipherID] [ExtensionRaw]
38    | ServerHello13 !ServerRandom !Session !CipherID [ExtensionRaw]
39    | NewSessionTicket13 Second Word32 TicketNonce SessionID [ExtensionRaw]
40    | EndOfEarlyData13
41    | EncryptedExtensions13 [ExtensionRaw]
42    | CertRequest13 CertReqContext [ExtensionRaw]
43    | Certificate13 CertReqContext CertificateChain [[ExtensionRaw]]
44    | CertVerify13 HashAndSignatureAlgorithm Signature
45    | Finished13 FinishedData
46    | KeyUpdate13 KeyUpdate
47    deriving (Show,Eq)
48
49data HandshakeType13 =
50      HandshakeType_ClientHello13
51    | HandshakeType_ServerHello13
52    | HandshakeType_EndOfEarlyData13
53    | HandshakeType_NewSessionTicket13
54    | HandshakeType_EncryptedExtensions13
55    | HandshakeType_CertRequest13
56    | HandshakeType_Certificate13
57    | HandshakeType_CertVerify13
58    | HandshakeType_Finished13
59    | HandshakeType_KeyUpdate13
60    deriving (Show,Eq)
61
62typeOfHandshake13 :: Handshake13 -> HandshakeType13
63typeOfHandshake13 ClientHello13{}         = HandshakeType_ClientHello13
64typeOfHandshake13 ServerHello13{}         = HandshakeType_ServerHello13
65typeOfHandshake13 EndOfEarlyData13{}      = HandshakeType_EndOfEarlyData13
66typeOfHandshake13 NewSessionTicket13{}    = HandshakeType_NewSessionTicket13
67typeOfHandshake13 EncryptedExtensions13{} = HandshakeType_EncryptedExtensions13
68typeOfHandshake13 CertRequest13{}         = HandshakeType_CertRequest13
69typeOfHandshake13 Certificate13{}         = HandshakeType_Certificate13
70typeOfHandshake13 CertVerify13{}          = HandshakeType_CertVerify13
71typeOfHandshake13 Finished13{}            = HandshakeType_Finished13
72typeOfHandshake13 KeyUpdate13{}           = HandshakeType_KeyUpdate13
73
74instance TypeValuable HandshakeType13 where
75  valOfType HandshakeType_ClientHello13         = 1
76  valOfType HandshakeType_ServerHello13         = 2
77  valOfType HandshakeType_NewSessionTicket13    = 4
78  valOfType HandshakeType_EndOfEarlyData13      = 5
79  valOfType HandshakeType_EncryptedExtensions13 = 8
80  valOfType HandshakeType_CertRequest13         = 13
81  valOfType HandshakeType_Certificate13         = 11
82  valOfType HandshakeType_CertVerify13          = 15
83  valOfType HandshakeType_Finished13            = 20
84  valOfType HandshakeType_KeyUpdate13           = 24
85
86  valToType 1  = Just HandshakeType_ClientHello13
87  valToType 2  = Just HandshakeType_ServerHello13
88  valToType 4  = Just HandshakeType_NewSessionTicket13
89  valToType 5  = Just HandshakeType_EndOfEarlyData13
90  valToType 8  = Just HandshakeType_EncryptedExtensions13
91  valToType 13 = Just HandshakeType_CertRequest13
92  valToType 11 = Just HandshakeType_Certificate13
93  valToType 15 = Just HandshakeType_CertVerify13
94  valToType 20 = Just HandshakeType_Finished13
95  valToType 24 = Just HandshakeType_KeyUpdate13
96  valToType _  = Nothing
97
98contentType :: Packet13 -> ProtocolType
99contentType ChangeCipherSpec13 = ProtocolType_ChangeCipherSpec
100contentType (Handshake13 _)    = ProtocolType_Handshake
101contentType (Alert13 _)        = ProtocolType_Alert
102contentType (AppData13 _)      = ProtocolType_AppData
103