@@ -1,6 +1,5 @@
11{-# LANGUAGE OverloadedStrings #-}
22{-# LANGUAGE RankNTypes #-}
3−{-# LANGUAGE CPP #-}
43module Network.Wai.Handler.WarpTLS
54 ( TLSSettings (..)
65 , runTLS
@@ -11,12 +10,11 @@ import qualified Network.TLS as TLS
1110import Network.Wai.Handler.Warp
1211import Network.Wai
1312import Network.Socket
14−import Crypto.Random
1513import qualified Data.ByteString.Lazy as L
1614import Data.Conduit.Binary (sourceFileRange)
1715import qualified Data.Conduit as C
1816import qualified Data.Conduit.List as CL
19−import Control.Exception (bracket, handle, SomeException)
17+import Control.Exception (bracket)
2018import qualified Network.TLS.Extra as TLSExtra
2119import qualified Data.Certificate.X509 as X509
2220import qualified Data.ByteString as B
@@ -29,6 +27,7 @@ import Data.Conduit.Network (sourceSocket, sinkSocket, acceptSafe)
2927import Data.Maybe (fromMaybe)
3028import qualified Data.IORef as I
3129import Control.Monad (unless)
30+import Crypto.Random.API (getSystemRandomGen)
3231
3332data TLSSettings = TLSSettings
3433 { certFile :: FilePath
@@ -39,7 +38,6 @@ runTLSSocket :: TLSSettings -> Settings -> Socket -> Application -> IO ()
3938runTLSSocket tset set sock app = do
4039 certs <- readCertificates $ certFile tset
4140 pk <- readPrivateKey $ keyFile tset
42−#if MIN_VERSION_tls(1, 0, 0)
4341 let params =
4442 TLS.updateServerParams
4543 (\sp -> sp { TLS.serverWantClientCert = False }) $
@@ -48,17 +46,9 @@ runTLSSocket tset set sock app = do
4846 , TLS.pCiphers = ciphers
4947 , TLS.pCertificates = zip certs $ (Just pk):repeat Nothing
5048 }
51−#else
52− let params = TLS.defaultParams
53− { TLS.pWantClientCert = False
54− , TLS.pAllowedVersions = [TLS.SSL3,TLS.TLS10,TLS.TLS11,TLS.TLS12]
55− , TLS.pCiphers = ciphers
56− , TLS.pCertificates = zip certs $ (Just pk):repeat Nothing
57− }
58−#endif
59− runSettingsConnectionMaker set (getter params sock) app
49+ runSettingsConnectionMaker set (getter params) app
6050 where
61− getter params sock = do
51+ getter params = do
6252 (s, sa) <- acceptSafe sock
6353 let mkConn = do
6454 (fromClient, firstBS) <- sourceSocket s C.$$+ CL.peek
@@ -71,8 +61,7 @@ runTLSSocket tset set sock app = do
7161 return bs
7262 if maybe False ((== 0x16) . fst) (firstBS >>= B.uncons)
7363 then do
74− gen <- newGenIO
75−#if MIN_VERSION_tls(1, 0, 0)
64+ gen <- getSystemRandomGen
7665 ctx <- TLS.contextNew
7766 TLS.Backend
7867 { TLS.backendFlush = return ()
@@ -81,16 +70,7 @@ runTLSSocket tset set sock app = do
8170 , TLS.backendRecv = getNext . takeMost
8271 }
8372 params
84− (gen :: SystemRandom)
85−#else
86− ctx <- TLS.serverWith
87− params
88− (gen :: SystemRandom)
89− s
90− (return ()) -- flush
91− (\bs -> C.yield bs C.$$ toClient)
92− (getNext . takeMost)
93−#endif
73+ gen
9474 TLS.handshake ctx
9575 let conn = Connection
9676 { connSendMany = TLS.sendData ctx . L.fromChunks