packages feed

cacophony-0.6.0: examples/echo-server/Types.hs

{-# LANGUAGE RankNTypes, KindSignatures, GADTs #-}
module Types where

import Data.ByteString.Char8 (unpack)

import Crypto.Noise.Cipher
import Crypto.Noise.Cipher.ChaChaPoly1305
import Crypto.Noise.Cipher.AESGCM
import Crypto.Noise.Curve
import Crypto.Noise.Curve.Curve25519
import Crypto.Noise.Curve.Curve448
import Crypto.Noise.Hash
import Crypto.Noise.Hash.SHA256
import Crypto.Noise.Hash.SHA512
import Crypto.Noise.Hash.BLAKE2s
import Crypto.Noise.Hash.BLAKE2b
import Crypto.Noise.Types
import Data.ByteArray.Extend

data ServerOpts =
  ServerOpts { soLogFile     :: Maybe FilePath
             , soPort        :: String
             , soPrologue    :: Plaintext
             , soPSK         :: Maybe Plaintext
             , soLocal25519  :: KeyPair Curve25519
             , soRemote25519 :: PublicKey Curve25519
             , soLocal448    :: KeyPair Curve448
             , soRemote448   :: PublicKey Curve448
             }

data HandshakeType = NoiseNN
                   | NoiseKN
                   | NoiseNK
                   | NoiseKK
                   | NoiseNX
                   | NoiseKX
                   | NoiseXN
                   | NoiseIN
                   | NoiseXK
                   | NoiseIK
                   | NoiseXX
                   | NoiseIX
                   | NoiseXR

data CipherType :: * -> * where
  CTChaChaPoly1305 :: CipherType ChaChaPoly1305
  CTAESGCM         :: CipherType AESGCM

data SomeCipherType where
  WrapCipherType :: forall c. Cipher c => CipherType c -> SomeCipherType

data CurveType :: * -> * where
  CTCurve25519 :: CurveType Curve25519
  CTCurve448   :: CurveType Curve448

data SomeCurveType where
  WrapCurveType :: forall d. Curve d => CurveType d -> SomeCurveType

data HashType :: * -> * where
  HTSHA256  :: HashType SHA256
  HTSHA512  :: HashType SHA512
  HTBLAKE2s :: HashType BLAKE2s
  HTBLAKE2b :: HashType BLAKE2b

data SomeHashType where
  WrapHashType :: forall h. Hash h => HashType h -> SomeHashType

type Header = (HandshakeType, SomeCipherType, SomeCurveType, SomeHashType)

instance Show HandshakeType where
  show NoiseNN = "NN"
  show NoiseKN = "KN"
  show NoiseNK = "NK"
  show NoiseKK = "KK"
  show NoiseNX = "NX"
  show NoiseKX = "KX"
  show NoiseXN = "XN"
  show NoiseIN = "IN"
  show NoiseXK = "XK"
  show NoiseIK = "IK"
  show NoiseXX = "XX"
  show NoiseIX = "IX"
  show NoiseXR = "XR"

instance Cipher c => Show (CipherType c) where
  show = unpack . sbToBS' . cipherName

instance Curve d => Show (CurveType d) where
  show = unpack . sbToBS' . curveName

instance Hash h => Show (HashType h) where
  show = unpack . sbToBS' . hashName