separate code path on server when doing a session resume.

This commit is contained in:
Vincent Hanquez 2011-11-12 16:15:05 +00:00
parent c3da1074dc
commit ba4a2de730

View file

@ -392,7 +392,11 @@ handshakeServerWith ctx (ClientHello ver _ _ ciphers compressions _) = do
, stCompression = usedCompression
})
let useSession = Nothing
-- send Server Data until ServerHelloDone
case useSession of
Nothing -> do
handshakeSendServerData
liftIO $ connectionFlush ctx
@ -400,12 +404,16 @@ handshakeServerWith ctx (ClientHello ver _ _ ciphers compressions _) = do
whileStatus ctx (/= (StatusHandshake HsStatusClientFinished)) (recvPacketSuccess ctx)
sendPacket ctx ChangeCipherSpec
-- Send Finish
cf <- usingState_ ctx $ getHandshakeDigest False
sendPacket ctx (Handshake [Finished cf])
sendFinish
liftIO $ connectionFlush ctx
Just session -> do
serverhello <- makeServerHello session
sendPacket ctx $ Handshake [serverhello]
sendPacket ctx ChangeCipherSpec
sendFinish
liftIO $ connectionFlush ctx
-- receive changeCipherSpec & Finished
recvPacket ctx >> recvPacketSuccess ctx
return ()
where
params = ctxParams ctx
@ -417,9 +425,12 @@ handshakeServerWith ctx (ClientHello ver _ _ ciphers compressions _) = do
privKeys = map snd $ pCertificates params
needKeyXchg = cipherExchangeNeedMoreData $ cipherKeyExchange usedCipher
handshakeSendServerData = do
srand <- getStateRNG ctx 32 >>= return . ServerRandom
sendFinish = do
cf <- usingState_ ctx $ getHandshakeDigest False
sendPacket ctx (Handshake [Finished cf])
makeServerHello session = do
srand <- getStateRNG ctx 32 >>= return . ServerRandom
case privKeys of
(Just privkey : _) -> usingState_ ctx $ setPrivateKey privkey
_ -> return () -- return a sensible error
@ -438,11 +449,12 @@ handshakeServerWith ctx (ClientHello ver _ _ ciphers compressions _) = do
return [ (0xff01, vf) ]
else return []
usingState_ ctx (setVersion ver >> setServerRandom srand)
sendPacket ctx $ Handshake
[ ServerHello ver srand (Session Nothing) (cipherID usedCipher)
return $ ServerHello ver srand (Session session) (cipherID usedCipher)
(compressionID usedCompression) extensions
, Certificates srvCerts
]
handshakeSendServerData = do
serverhello <- makeServerHello Nothing
sendPacket ctx $ Handshake [ serverhello, Certificates srvCerts ]
when needKeyXchg $ do
let skg = SKX_RSA Nothing
sendPacket ctx (Handshake [ServerKeyXchg skg])