module Network.TLS.Record.Types
( Header(..)
, ProtocolType(..)
, packetType
, Record(..)
, Fragment
, fragmentPlaintext
, fragmentCiphertext
, fragmentGetBytes
, Plaintext
, Compressed
, Ciphertext
, onRecordFragment
, fragmentCompress
, fragmentCipher
, fragmentUncipher
, fragmentUncompress
, rawToRecord
, recordToRaw
, recordToHeader
) where
import Network.TLS.Struct
import Network.TLS.State
import qualified Data.ByteString as B
import Control.Applicative ((<$>))
data Record a = Record !ProtocolType !Version !(Fragment a) deriving (Show,Eq)
newtype Fragment a = Fragment Bytes deriving (Show,Eq)
data Plaintext
data Compressed
data Ciphertext
fragmentPlaintext :: Bytes -> Fragment Plaintext
fragmentPlaintext bytes = Fragment bytes
fragmentCiphertext :: Bytes -> Fragment Ciphertext
fragmentCiphertext bytes = Fragment bytes
fragmentGetBytes :: Fragment a -> Bytes
fragmentGetBytes (Fragment bytes) = bytes
onRecordFragment :: Record a -> (Fragment a -> TLSSt (Fragment b)) -> TLSSt (Record b)
onRecordFragment (Record pt ver frag) f = Record pt ver <$> f frag
fragmentMap :: (Bytes -> TLSSt Bytes) -> Fragment a -> TLSSt (Fragment b)
fragmentMap f (Fragment b) = Fragment <$> f b
fragmentCompress :: (Bytes -> TLSSt Bytes) -> Fragment Plaintext -> TLSSt (Fragment Compressed)
fragmentCompress f = fragmentMap f
fragmentCipher :: (Bytes -> TLSSt Bytes) -> Fragment Compressed -> TLSSt (Fragment Ciphertext)
fragmentCipher f = fragmentMap f
fragmentUncipher :: (Bytes -> TLSSt Bytes) -> Fragment Ciphertext -> TLSSt (Fragment Compressed)
fragmentUncipher f = fragmentMap f
fragmentUncompress :: (Bytes -> TLSSt Bytes) -> Fragment Compressed -> TLSSt (Fragment Plaintext)
fragmentUncompress f = fragmentMap f
recordToRaw :: Record a -> (Header, Bytes)
recordToRaw (Record pt ver (Fragment bytes)) = (Header pt ver (fromIntegral $ B.length bytes), bytes)
rawToRecord :: Header -> Fragment a -> Record a
rawToRecord (Header pt ver _) fragment = Record pt ver fragment
recordToHeader :: Record a -> Header
recordToHeader (Record pt ver (Fragment bytes)) = Header pt ver (fromIntegral $ B.length bytes)