/* For SSLv2, does nothing but return an error. ** For SSLv3, flushes SID cache entry (if requested), ** and then starts new client hello or hello request. ** Acquires and releases HandshakeLock. */ SECStatus SSL_ReHandshake(PRFileDesc *fd, PRBool flushCache) { sslSocket *ss; SECStatus rv; ss = ssl_FindSocket(fd); if (!ss) { SSL_DBG(("%d: SSL[%d]: bad socket in RedoHandshake", SSL_GETPID(), fd)); return SECFailure; } if (!ss->opt.useSecurity) return SECSuccess; ssl_Get1stHandshakeLock(ss); /* SSL v2 protocol does not support subsequent handshakes. */ if (ss->version < SSL_LIBRARY_VERSION_3_0) { PORT_SetError(SEC_ERROR_INVALID_ARGS); rv = SECFailure; } else { ssl_GetSSL3HandshakeLock(ss); rv = ssl3_RedoHandshake(ss, flushCache); /* force full handshake. */ ssl_ReleaseSSL3HandshakeLock(ss); } ssl_Release1stHandshakeLock(ss); return rv; }
/* For SSLv2, does nothing but return an error. ** For SSLv3, flushes SID cache entry (if requested), ** and then starts new client hello or hello request. ** Acquires and releases HandshakeLock. */ SECStatus SSL_ReHandshake(PRFileDesc *fd, PRBool flushCache) { sslSocket *ss; SECStatus rv; ss = ssl_FindSocket(fd); if (!ss) { SSL_DBG(("%d: SSL[%d]: bad socket in RedoHandshake", SSL_GETPID(), fd)); return SECFailure; } if (!ss->opt.useSecurity) return SECSuccess; ssl_Get1stHandshakeLock(ss); ssl_GetSSL3HandshakeLock(ss); rv = ssl3_RedoHandshake(ss, flushCache); /* force full handshake. */ ssl_ReleaseSSL3HandshakeLock(ss); ssl_Release1stHandshakeLock(ss); return rv; }