module Network.CommSec.KeyExchange.Socket
( Network.CommSec.KeyExchange.Socket.connect
, Network.CommSec.KeyExchange.Socket.accept
, Net.listen, Net.socket
, CS.send
, CS.recv
, CS.Connection
, CS.close
) where
import Control.Concurrent.MVar
import Crypto.Types.PubKey.RSA
import Data.Traversable (traverse)
import Network.CommSec
import Network.CommSec.KeyExchange.Internal as I
import qualified Network.CommSec as CS
import qualified Network.CommSec.Package as CSP
import qualified Network.Socket as Net
connect :: Net.Socket
-> Net.SockAddr
-> [PublicKey]
-> PrivateKey
-> IO (Maybe (PublicKey, Connection))
connect socket addr pubKeys privateMe = do
Net.connect socket addr
Net.setSocketOption socket Net.NoDelay 1
res <- I.keyExchangeInit socket pubKeys privateMe
traverse (wrapContexts socket) res
accept :: Net.Socket
-> [PublicKey]
-> PrivateKey
-> IO (Maybe (PublicKey, Connection))
accept sock pubKeys privateMe = do
(socket,_) <- Net.accept sock
Net.setSocketOption socket Net.NoDelay 1
res <- keyExchangeResp socket pubKeys privateMe
traverse (wrapContexts socket) res
wrapContexts :: Net.Socket -> (PublicKey, CSP.OutContext, CSP.InContext) -> IO (PublicKey, Connection)
wrapContexts socket (t, oCtx, iCtx) = do
outCtx <- newMVar oCtx
inCtx <- newMVar iCtx
return (t, Conn {..})