warp-tls-uid-0.1.0.0: src-lib/Network/Wai/Handler/WarpTLS/Params.hs
module Network.Wai.Handler.WarpTLS.Params (makeParams) where
import Network.Wai.Handler.WarpTLS.TLS (
Params(pCiphers, pCertificates, pAllowedVersions), defaultParamsServer,
ServerParams(serverWantClientCert), updateServerParams,
Version(SSL3, TLS10, TLS11, TLS12), PrivateKey(PrivRSA),
cipher_AES128_SHA1, cipher_AES256_SHA1,
cipher_RC4_128_MD5, cipher_RC4_128_SHA1)
import Data.Either
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString as B
-- import Control.Applicative
import Control.Arrow ((>>>), (|||))
import Data.PEM (PEM, pemParseBS, pemName, pemContent)
import Data.Certificate.X509 (X509, decodeCertificate)
import Data.Certificate.KeyRSA (decodePrivate)
makeParams :: B.ByteString -> B.ByteString -> Params
makeParams crts pk = initParam { pCertificates =
zip (parseCrts crts) $ Just (parsePK pk) : repeat Nothing }
initParam :: Params
initParam = updateServerParams (\sp -> sp { serverWantClientCert = False }) $
defaultParamsServer {
pAllowedVersions = [SSL3, TLS10, TLS11, TLS12],
pCiphers = [
cipher_AES128_SHA1, cipher_AES256_SHA1,
cipher_RC4_128_MD5, cipher_RC4_128_SHA1 ] }
parseCrts :: B.ByteString -> [X509]
parseCrts = pemParseBS >>>
error . ("Cannot parse PEM file: " ++) |||
rights . map (decodeCertificate . pemToLazy) .
filterPem ["CERTIFICATE", "TRUSTED CERTIFICATE"]
parsePK :: B.ByteString -> PrivateKey
parsePK = pemParseBS >>>
error . ("Cannot parse PEM file: " ++) |||
head . rights . map (privRSA . pemToLazy) . filterPem ["RSA PRIVATE KEY"]
privRSA :: L.ByteString -> Either String PrivateKey
privRSA = fmap (PrivRSA . snd) . decodePrivate
pemToLazy :: PEM -> L.ByteString
pemToLazy = L.fromChunks . (: []) . pemContent
filterPem :: [String] -> [PEM] -> [PEM]
filterPem ns = filter $ (`elem` ns) . pemName