ss->ssl3->hs.ws = wait_change_cipher;
ss->ssl3.hs.ws = wait_change_cipher;
ssl3_HandleServerHelloDone(sslSocket *ss){    SECStatus     rv;    SSL3WaitState ws          = ss->ssl3->hs.ws;    PRBool        send_verify = PR_FALSE;    SSL_TRC(3, ("%d: SSL3[%d]: handle server_hello_done handshake",		SSL_GETPID(), ss->fd));    PORT_Assert( ssl_HaveRecvBufLock(ss) );    PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );    if (ws != wait_hello_done  &&        ws != wait_server_cert &&	ws != wait_server_key  &&	ws != wait_cert_request) {	SSL3_SendAlert(ss, alert_fatal, unexpected_message);	PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_DONE);	return SECFailure;    }    ssl_GetXmitBufLock(ss);		/*******************************/    if (ss->ssl3->sendEmptyCert) {	ss->ssl3->sendEmptyCert = PR_FALSE;	rv = ssl3_SendEmptyCertificate(ss);	/* Don't send verify */	if (rv != SECSuccess) {	    goto loser;	/* error code is set. */    	}    } else    if (ss->ssl3->clientCertChain  != NULL &&	ss->ssl3->clientPrivateKey != NULL) {	send_verify = PR_TRUE;	rv = ssl3_SendCertificate(ss);	if (rv != SECSuccess) {	    goto loser;	/* error code is set. */    	}    }    rv = ssl3_SendClientKeyExchange(ss);    if (rv != SECSuccess) {    	goto loser;	/* err is set. */    }    if (send_verify) {	rv = ssl3_SendCertificateVerify(ss);	if (rv != SECSuccess) {	    goto loser;	/* err is set. */        }    }    rv = ssl3_SendChangeCipherSpecs(ss);    if (rv != SECSuccess) {	goto loser;	/* err code was set. */    }    rv = ssl3_SendFinished(ss, 0);    if (rv != SECSuccess) {	goto loser;	/* err code was set. */    }    ssl_ReleaseXmitBufLock(ss);		/*******************************/    ss->ssl3->hs.ws = wait_change_cipher;    return SECSuccess;loser:    ssl_ReleaseXmitBufLock(ss);    return rv;}