Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(374)

Side by Side Diff: net/third_party/nss/ssl/ssl3con.c

Issue 23621040: Make SSL False Start work with asynchronous certificate validation (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Define our own CanFalseStartCallback Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* 2 /*
3 * SSL3 Protocol 3 * SSL3 Protocol
4 * 4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public 5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this 6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8 8
9 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */ 9 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */
10 10
(...skipping 2797 matching lines...) Expand 10 before | Expand all | Expand 10 after
2808 PRInt32 flags) 2808 PRInt32 flags)
2809 { 2809 {
2810 sslBuffer * wrBuf = &ss->sec.writeBuf; 2810 sslBuffer * wrBuf = &ss->sec.writeBuf;
2811 SECStatus rv; 2811 SECStatus rv;
2812 PRInt32 totalSent = 0; 2812 PRInt32 totalSent = 0;
2813 PRBool capRecordVersion; 2813 PRBool capRecordVersion;
2814 2814
2815 SSL_TRC(3, ("%d: SSL3[%d] SendRecord type: %s nIn=%d", 2815 SSL_TRC(3, ("%d: SSL3[%d] SendRecord type: %s nIn=%d",
2816 SSL_GETPID(), ss->fd, ssl3_DecodeContentType(type), 2816 SSL_GETPID(), ss->fd, ssl3_DecodeContentType(type),
2817 nIn)); 2817 nIn));
2818 PRINT_BUF(3, (ss, "Send record (plain text)", pIn, nIn)); 2818 PRINT_BUF(50, (ss, "Send record (plain text)", pIn, nIn));
agl 2013/09/13 15:03:29 This seems to be an unrelated change.
wtc 2013/09/18 22:57:23 Done.
2819 2819
2820 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) ); 2820 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) );
2821 2821
2822 capRecordVersion = ((flags & ssl_SEND_FLAG_CAP_RECORD_VERSION) != 0); 2822 capRecordVersion = ((flags & ssl_SEND_FLAG_CAP_RECORD_VERSION) != 0);
2823 2823
2824 if (capRecordVersion) { 2824 if (capRecordVersion) {
2825 /* ssl_SEND_FLAG_CAP_RECORD_VERSION can only be used with the 2825 /* ssl_SEND_FLAG_CAP_RECORD_VERSION can only be used with the
2826 * TLS initial ClientHello. */ 2826 * TLS initial ClientHello. */
2827 PORT_Assert(!IS_DTLS(ss)); 2827 PORT_Assert(!IS_DTLS(ss));
2828 PORT_Assert(!ss->firstHsDone); 2828 PORT_Assert(!ss->firstHsDone);
(...skipping 4430 matching lines...) Expand 10 before | Expand all | Expand 10 after
7259 } 7259 }
7260 if (certChain) { 7260 if (certChain) {
7261 CERT_DestroyCertificateList(certChain); 7261 CERT_DestroyCertificateList(certChain);
7262 } 7262 }
7263 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 7263 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
7264 rv = SECFailure; 7264 rv = SECFailure;
7265 } 7265 }
7266 return rv; 7266 return rv;
7267 } 7267 }
7268 7268
7269 PRBool 7269 static SECStatus
7270 ssl3_CanFalseStart(sslSocket *ss) { 7270 ssl3_CheckFalseStart(sslSocket *ss)
7271 PRBool rv; 7271 {
7272 SECStatus rv;
7273 PRBool maybeFalseStart = PR_TRUE;
7272 7274
7273 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 7275 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) );
7276 PORT_Assert( !ss->ssl3.hs.authCertificatePending );
7274 7277
7275 /* XXX: does not take into account whether we are waiting for 7278 /* An attacker can control the selected ciphersuite so we only wish to
7276 * SSL_AuthCertificateComplete or SSL_RestartHandshakeAfterCertReq. If/when 7279 * do False Start in the case that the selected ciphersuite is
7277 * that is done, this function could return different results each time it 7280 * sufficiently strong that the attack can gain no advantage.
7278 * would be called. 7281 * Therefore we always require an 80-bit cipher. */
7279 */
7280 7282
7281 ssl_GetSpecReadLock(ss); 7283 ssl_GetSpecReadLock(ss);
7282 rv = ss->opt.enableFalseStart && 7284 if (ss->ssl3.cwSpec->cipher_def->secret_key_size < 10) {
7283 » !ss->sec.isServer && 7285 » ss->ssl3.hs.canFalseStart = PR_FALSE;
7284 » !ss->ssl3.hs.isResuming && 7286 » maybeFalseStart = PR_FALSE;
7285 » ss->ssl3.cwSpec && 7287 }
7288 ssl_ReleaseSpecReadLock(ss);
7289 if (!maybeFalseStart) {
7290 » return SECSuccess;
7291 }
7286 7292
7287 » /* An attacker can control the selected ciphersuite so we only wish to 7293 if (!ss->canFalseStartCallback) {
7288 » * do False Start in the case that the selected ciphersuite is 7294 » rv = SSL_DefaultCanFalseStart(ss->fd, &ss->ssl3.hs.canFalseStart);
7289 » * sufficiently strong that the attack can gain no advantage. 7295 } else {
7290 » * Therefore we require an 80-bit cipher and a forward-secret key 7296 » rv = (ss->canFalseStartCallback)(ss->fd,
7291 » * exchange. */ 7297 » » » » » ss->canFalseStartCallbackData,
7292 » ss->ssl3.cwSpec->cipher_def->secret_key_size >= 10 && 7298 » » » » » &ss->ssl3.hs.canFalseStart);
7293 » (ss->ssl3.hs.kea_def->kea == kea_dhe_dss || 7299 }
7294 » ss->ssl3.hs.kea_def->kea == kea_dhe_rsa || 7300
7295 » ss->ssl3.hs.kea_def->kea == kea_ecdhe_ecdsa || 7301 if (rv != SECSuccess) {
7296 » ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa); 7302 » ss->ssl3.hs.canFalseStart = PR_FALSE;
7297 ssl_ReleaseSpecReadLock(ss); 7303 }
7304
7298 return rv; 7305 return rv;
7299 } 7306 }
7300 7307
7301 static SECStatus ssl3_SendClientSecondRound(sslSocket *ss); 7308 static SECStatus ssl3_SendClientSecondRound(sslSocket *ss);
7302 7309
7303 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 7310 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
7304 * ssl3 Server Hello Done message. 7311 * ssl3 Server Hello Done message.
7305 * Caller must hold Handshake and RecvBuf locks. 7312 * Caller must hold Handshake and RecvBuf locks.
7306 */ 7313 */
7307 static SECStatus 7314 static SECStatus
7308 ssl3_HandleServerHelloDone(sslSocket *ss) 7315 ssl3_HandleServerHelloDone(sslSocket *ss)
7309 { 7316 {
7310 SECStatus rv; 7317 SECStatus rv;
7311 SSL3WaitState ws = ss->ssl3.hs.ws; 7318 SSL3WaitState ws = ss->ssl3.hs.ws;
7312 7319
7313 SSL_TRC(3, ("%d: SSL3[%d]: handle server_hello_done handshake", 7320 SSL_TRC(3, ("%d: SSL3[%d]: handle server_hello_done handshake",
7314 SSL_GETPID(), ss->fd)); 7321 SSL_GETPID(), ss->fd));
7315 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 7322 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) );
7316 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 7323 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) );
7317 7324
7318 if (ws != wait_hello_done && 7325 if (ws != wait_hello_done &&
7319 ws != wait_server_cert && 7326 ws != wait_server_cert &&
7320 ws != wait_server_key && 7327 ws != wait_server_key &&
7321 ws != wait_cert_request) { 7328 ws != wait_cert_request) {
7322 SSL3_SendAlert(ss, alert_fatal, unexpected_message); 7329 SSL3_SendAlert(ss, alert_fatal, unexpected_message);
7323 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_DONE); 7330 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_DONE);
7324 return SECFailure; 7331 return SECFailure;
7325 } 7332 }
7326 7333
7334 ss->enoughFirstHsDone = PR_TRUE;
wtc 2013/09/18 22:57:23 I think we need to wait until we have called ssl3_
7327 rv = ssl3_SendClientSecondRound(ss); 7335 rv = ssl3_SendClientSecondRound(ss);
7328 7336
7329 return rv; 7337 return rv;
7330 } 7338 }
7331 7339
7332 /* Called from ssl3_HandleServerHelloDone and ssl3_AuthCertificateComplete. 7340 /* Called from ssl3_HandleServerHelloDone and ssl3_AuthCertificateComplete.
7333 * 7341 *
7334 * Caller must hold Handshake and RecvBuf locks. 7342 * Caller must hold Handshake and RecvBuf locks.
7335 */ 7343 */
7336 static SECStatus 7344 static SECStatus
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
7415 if (rv != SECSuccess) { 7423 if (rv != SECSuccess) {
7416 goto loser; /* err is set. */ 7424 goto loser; /* err is set. */
7417 } 7425 }
7418 } 7426 }
7419 7427
7420 rv = ssl3_SendChangeCipherSpecs(ss); 7428 rv = ssl3_SendChangeCipherSpecs(ss);
7421 if (rv != SECSuccess) { 7429 if (rv != SECSuccess) {
7422 goto loser; /* err code was set. */ 7430 goto loser; /* err code was set. */
7423 } 7431 }
7424 7432
7425 /* XXX: If the server's certificate hasn't been authenticated by this
7426 * point, then we may be leaking this NPN message to an attacker.
7427 */
7428 if (!ss->firstHsDone) { 7433 if (!ss->firstHsDone) {
7434 /* XXX: If the server's certificate hasn't been authenticated by this
7435 * point, then we may be leaking this NPN message to an attacker.
7436 */
7429 rv = ssl3_SendNextProto(ss); 7437 rv = ssl3_SendNextProto(ss);
7430 if (rv != SECSuccess) { 7438 if (rv != SECSuccess) {
7431 goto loser; /* err code was set. */ 7439 goto loser; /* err code was set. */
7432 } 7440 }
7433 } 7441 }
7442
7434 rv = ssl3_SendEncryptedExtensions(ss); 7443 rv = ssl3_SendEncryptedExtensions(ss);
7435 if (rv != SECSuccess) { 7444 if (rv != SECSuccess) {
7436 goto loser; /* err code was set. */ 7445 goto loser; /* err code was set. */
7437 } 7446 }
7438 7447
7448 if (!ss->firstHsDone) {
7449 if (ss->opt.enableFalseStart) {
7450 if (!ss->ssl3.hs.authCertificatePending) {
7451 /* When we fix bug 589047, we will need to know whether we are
7452 * false starting before we try to flush the client second
7453 * round to the network. With that in mind, we purposefully
7454 * call ssl3_CheckFalseStart before calling ssl3_SendFinished,
7455 * which includes a call to ssl3_FlushHandshake, so that
7456 * no application develops a reliance on such flushing being
7457 * done before its false start callback is called.
7458 */
7459 ssl_ReleaseXmitBufLock(ss);
7460 rv = ssl3_CheckFalseStart(ss);
7461 ssl_GetXmitBufLock(ss);
7462 if (rv != SECSuccess) {
7463 goto loser;
7464 }
7465 } else {
7466 /* The certificate authentication and the server's Finished
7467 * message are racing each other. If the certificate
7468 * authentication wins, then we will try to false start in
7469 * ssl3_AuthCertificateComplete.
7470 */
7471 SSL_TRC(3, ("%d: SSL3[%p]: deferring false start check because"
7472 " certificate authentication is still pending.",
7473 SSL_GETPID(), ss->fd));
7474 }
7475 }
7476 }
7477
7439 rv = ssl3_SendFinished(ss, 0); 7478 rv = ssl3_SendFinished(ss, 0);
7440 if (rv != SECSuccess) { 7479 if (rv != SECSuccess) {
7441 goto loser; /* err code was set. */ 7480 goto loser; /* err code was set. */
7442 } 7481 }
7443 7482
7444 ssl_ReleaseXmitBufLock(ss); /*******************************/ 7483 ssl_ReleaseXmitBufLock(ss); /*******************************/
7445 7484
7446 if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn)) 7485 if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn))
7447 ss->ssl3.hs.ws = wait_new_session_ticket; 7486 ss->ssl3.hs.ws = wait_new_session_ticket;
7448 else 7487 else
7449 ss->ssl3.hs.ws = wait_change_cipher; 7488 ss->ssl3.hs.ws = wait_change_cipher;
7450 7489
7451 /* Do the handshake callback for sslv3 here, if we can false start. */ 7490 if (ss->handshakeCallback &&
7452 if (ss->handshakeCallback != NULL && ssl3_CanFalseStart(ss)) { 7491 » (ss->ssl3.hs.canFalseStart && !ss->canFalseStartCallback)) {
7492 » /* Call the handshake callback here for backwards compatibility with
7493 » * applications that were using false start before
7494 » * canFalseStartCallback was added. Note that we do this after calling
7495 » * ssl3_SendFinished, which includes a call to ssl3_FlushHandshake,
7496 » * just in case the application is relying on having the handshake
7497 » * messages flushed to the network before its handshake callback is
7498 » * called.
Ryan Sleevi 2013/09/14 02:13:31 This was Brian's concession to Chromium, but as yo
wtc 2013/09/16 16:14:48 I should have pointed out that Brian's patch also
7499 » */
7453 (ss->handshakeCallback)(ss->fd, ss->handshakeCallbackData); 7500 (ss->handshakeCallback)(ss->fd, ss->handshakeCallbackData);
7454 } 7501 }
7455 7502
7456 return SECSuccess; 7503 return SECSuccess;
7457 7504
7458 loser: 7505 loser:
7459 ssl_ReleaseXmitBufLock(ss); 7506 ssl_ReleaseXmitBufLock(ss);
7460 return rv; 7507 return rv;
7461 } 7508 }
7462 7509
(...skipping 2598 matching lines...) Expand 10 before | Expand all | Expand 10 after
10061 10108
10062 if (rv == SECWouldBlock) { 10109 if (rv == SECWouldBlock) {
10063 if (ss->sec.isServer) { 10110 if (ss->sec.isServer) {
10064 errCode = SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SERVERS; 10111 errCode = SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SERVERS;
10065 rv = SECFailure; 10112 rv = SECFailure;
10066 goto loser; 10113 goto loser;
10067 } 10114 }
10068 10115
10069 ss->ssl3.hs.authCertificatePending = PR_TRUE; 10116 ss->ssl3.hs.authCertificatePending = PR_TRUE;
10070 rv = SECSuccess; 10117 rv = SECSuccess;
10071
10072 /* XXX: Async cert validation and False Start don't work together
10073 * safely yet; if we leave False Start enabled, we may end up false
10074 * starting (sending application data) before we
10075 * SSL_AuthCertificateComplete has been called.
10076 */
10077 ss->opt.enableFalseStart = PR_FALSE;
10078 } 10118 }
10079 10119
10080 if (rv != SECSuccess) { 10120 if (rv != SECSuccess) {
10081 ssl3_SendAlertForCertError(ss, errCode); 10121 ssl3_SendAlertForCertError(ss, errCode);
10082 goto loser; 10122 goto loser;
10083 } 10123 }
10084 } 10124 }
10085 10125
10086 ss->sec.ci.sid->peerCert = CERT_DupCertificate(ss->sec.peerCert); 10126 ss->sec.ci.sid->peerCert = CERT_DupCertificate(ss->sec.peerCert);
10087 ssl3_CopyPeerCertsToSID(ss->ssl3.peerCertChain, ss->sec.ci.sid); 10127 ssl3_CopyPeerCertsToSID(ss->ssl3.peerCertChain, ss->sec.ci.sid);
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
10192 10232
10193 ss->ssl3.hs.authCertificatePending = PR_FALSE; 10233 ss->ssl3.hs.authCertificatePending = PR_FALSE;
10194 10234
10195 if (error != 0) { 10235 if (error != 0) {
10196 ss->ssl3.hs.restartTarget = ssl3_AlwaysFail; 10236 ss->ssl3.hs.restartTarget = ssl3_AlwaysFail;
10197 ssl3_SendAlertForCertError(ss, error); 10237 ssl3_SendAlertForCertError(ss, error);
10198 rv = SECSuccess; 10238 rv = SECSuccess;
10199 } else if (ss->ssl3.hs.restartTarget != NULL) { 10239 } else if (ss->ssl3.hs.restartTarget != NULL) {
10200 sslRestartTarget target = ss->ssl3.hs.restartTarget; 10240 sslRestartTarget target = ss->ssl3.hs.restartTarget;
10201 ss->ssl3.hs.restartTarget = NULL; 10241 ss->ssl3.hs.restartTarget = NULL;
10242
10243 if (target == ssl3_FinishHandshake) {
10244 SSL_TRC(3,("%d: SSL3[%p]: certificate authentication lost the race"
10245 " with peer's finished message", SSL_GETPID(), ss->fd));
10246 }
10247
10202 rv = target(ss); 10248 rv = target(ss);
10203 /* Even if we blocked here, we have accomplished enough to claim 10249 /* Even if we blocked here, we have accomplished enough to claim
10204 * success. Any remaining work will be taken care of by subsequent 10250 * success. Any remaining work will be taken care of by subsequent
10205 * calls to SSL_ForceHandshake/PR_Send/PR_Read/etc. 10251 * calls to SSL_ForceHandshake/PR_Send/PR_Read/etc.
10206 */ 10252 */
10207 if (rv == SECWouldBlock) { 10253 if (rv == SECWouldBlock) {
10208 rv = SECSuccess; 10254 rv = SECSuccess;
10209 } 10255 }
10210 } else { 10256 } else {
10211 » rv = SECSuccess; 10257 » PORT_Assert(!ss->firstHsDone);
10258 » PORT_Assert(!ss->sec.isServer);
10259 » PORT_Assert(!ss->ssl3.hs.isResuming);
10260 » PORT_Assert(ss->ssl3.hs.ws == wait_change_cipher ||
10261 » » ss->ssl3.hs.ws == wait_finished ||» »
10262 » » ss->ssl3.hs.ws == wait_new_session_ticket);
10263
10264 » SSL_TRC(3, ("%d: SSL3[%p]: certificate authentication won the race with"
10265 » " peer's finished message", SSL_GETPID(), ss->fd));
10266
10267 » /* ssl3_SendClientSecondRound deferred the false start check because
10268 » * certificate authentication was pending, so we have to do it now.
10269 » */
10270 » if (ss->opt.enableFalseStart &&
10271 » !ss->firstHsDone &&
10272 » !ss->sec.isServer &&
10273 » !ss->ssl3.hs.isResuming &&
10274 » (ss->ssl3.hs.ws == wait_change_cipher ||
10275 » ss->ssl3.hs.ws == wait_finished ||»»
10276 » ss->ssl3.hs.ws == wait_new_session_ticket)) {
10277 » rv = ssl3_CheckFalseStart(ss);
10278 » if (rv == SECSuccess &&
10279 » » ss->handshakeCallback &&
10280 » » (ss->ssl3.hs.canFalseStart && !ss->canFalseStartCallback)) {
10281 » » /* Call the handshake callback here for backwards compatibility
10282 » » * with applications that were using false start before
10283 » » * canFalseStartCallback was added.
10284 » » */
10285 » » (ss->handshakeCallback)(ss->fd, ss->handshakeCallbackData);
10286 » }
wtc 2013/09/18 22:57:23 It seems that we should still set rv to SECSuccess
10287 » } else {
10288 » rv = SECSuccess;
10289 » }
10212 } 10290 }
10213 10291
10214 done: 10292 done:
10215 ssl_ReleaseSSL3HandshakeLock(ss); 10293 ssl_ReleaseSSL3HandshakeLock(ss);
10216 ssl_ReleaseRecvBufLock(ss); 10294 ssl_ReleaseRecvBufLock(ss);
10217 10295
10218 return rv; 10296 return rv;
10219 } 10297 }
10220 10298
10221 static SECStatus 10299 static SECStatus
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after
10897 return SECWouldBlock; 10975 return SECWouldBlock;
10898 } 10976 }
10899 10977
10900 rv = ssl3_FinishHandshake(ss); 10978 rv = ssl3_FinishHandshake(ss);
10901 return rv; 10979 return rv;
10902 } 10980 }
10903 10981
10904 SECStatus 10982 SECStatus
10905 ssl3_FinishHandshake(sslSocket * ss) 10983 ssl3_FinishHandshake(sslSocket * ss)
10906 { 10984 {
10985 PRBool falseStarted;
10986
10907 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 10987 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) );
10908 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 10988 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) );
10909 PORT_Assert( ss->ssl3.hs.restartTarget == NULL ); 10989 PORT_Assert( ss->ssl3.hs.restartTarget == NULL );
10910 10990
10911 /* The first handshake is now completed. */ 10991 /* The first handshake is now completed. */
10912 ss->handshake = NULL; 10992 ss->handshake = NULL;
10913 ss->firstHsDone = PR_TRUE; 10993 ss->firstHsDone = PR_TRUE;
10994 ss->enoughFirstHsDone = PR_TRUE;
10914 10995
10915 if (ss->ssl3.hs.cacheSID) { 10996 if (ss->ssl3.hs.cacheSID) {
10916 (*ss->sec.cache)(ss->sec.ci.sid); 10997 (*ss->sec.cache)(ss->sec.ci.sid);
10917 ss->ssl3.hs.cacheSID = PR_FALSE; 10998 ss->ssl3.hs.cacheSID = PR_FALSE;
10918 } 10999 }
10919 11000
10920 ss->ssl3.hs.ws = idle_handshake; 11001 falseStarted = ss->ssl3.hs.canFalseStart;
11002 ss->ssl3.hs.canFalseStart = PR_FALSE; /* False Start phase is complete */
10921 11003
10922 /* Do the handshake callback for sslv3 here, if we cannot false start. */ 11004 /* Call the handshake callback for sslv3 here, unless we called it already
10923 if (ss->handshakeCallback != NULL && !ssl3_CanFalseStart(ss)) { 11005 * for the case where false start was done without a canFalseStartCallback.
11006 */
11007 if (ss->handshakeCallback != NULL &&
11008 » !(falseStarted && !ss->canFalseStartCallback)) {
10924 (ss->handshakeCallback)(ss->fd, ss->handshakeCallbackData); 11009 (ss->handshakeCallback)(ss->fd, ss->handshakeCallbackData);
10925 } 11010 }
10926 11011
11012 ss->ssl3.hs.ws = idle_handshake;
wtc 2013/09/18 22:57:23 I will ask Brian if it's important to set ss->ssl3
10927 return SECSuccess; 11013 return SECSuccess;
10928 } 11014 }
10929 11015
10930 /* Called from ssl3_HandleHandshake() when it has gathered a complete ssl3 11016 /* Called from ssl3_HandleHandshake() when it has gathered a complete ssl3
10931 * hanshake message. 11017 * hanshake message.
10932 * Caller must hold Handshake and RecvBuf locks. 11018 * Caller must hold Handshake and RecvBuf locks.
10933 */ 11019 */
10934 SECStatus 11020 SECStatus
10935 ssl3_HandleHandshakeMessage(sslSocket *ss, SSL3Opaque *b, PRUint32 length) 11021 ssl3_HandleHandshakeMessage(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
10936 { 11022 {
(...skipping 1454 matching lines...) Expand 10 before | Expand all | Expand 10 after
12391 PORT_Free(ss->ssl3.hs.recvdFragments.buf); 12477 PORT_Free(ss->ssl3.hs.recvdFragments.buf);
12392 } 12478 }
12393 } 12479 }
12394 12480
12395 ss->ssl3.initialized = PR_FALSE; 12481 ss->ssl3.initialized = PR_FALSE;
12396 12482
12397 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); 12483 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE);
12398 } 12484 }
12399 12485
12400 /* End of ssl3con.c */ 12486 /* End of ssl3con.c */
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698