packages feed

http3-0.0.1: util/Common.hs

{-# LANGUAGE OverloadedStrings #-}

module Common (
    getGroups
  , getLogger
  , makeProtos
  ) where

import Data.Bits
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as C8
import Data.Maybe
import Network.TLS hiding (Version)

import Network.QUIC.Internal

namedGroups :: [(String, Group)]
namedGroups =
    [ ("ffdhe2048", FFDHE2048)
    , ("ffdhe3072", FFDHE3072)
    , ("ffdhe4096", FFDHE4096)
    , ("ffdhe6144", FFDHE6144)
    , ("ffdhe8192", FFDHE8192)
    , ("p256",      P256)
    , ("p384",      P384)
    , ("p521",      P521)
    , ("x25519",    X25519)
    , ("x448",      X448)
    ]

getGroups :: [Group] -> Maybe String -> [Group]
getGroups grps Nothing   = grps
getGroups _    (Just gs) = mapMaybe (`lookup` namedGroups) $ split ',' gs

split :: Char -> String -> [String]
split _ "" = []
split c s = case break (c==) s of
    ("",r)  -> split c (tail r)
    (s',"") -> [s']
    (s',r)  -> s' : split c (tail r)

getLogger :: Maybe FilePath -> (String -> IO ())
getLogger Nothing     = \_ -> return ()
getLogger (Just file) = \msg -> appendFile file (msg ++ "\n")

makeProtos :: Version -> (ByteString, ByteString)
makeProtos Version1 = ("h3","hq-interop")
makeProtos Version2 = ("h3","hq-interop")
makeProtos ver = (h3X,hqX)
  where
    verbs = C8.pack $ show $ fromVersion ver
    h3X = "h3-" `BS.append` verbs
    hqX = "hq-" `BS.append` verbs

fromVersion :: Version -> Int
fromVersion (Version ver) = fromIntegral (0x000000ff .&. ver)