| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Various SSL functions. | 2 * Various SSL functions. |
| 3 * | 3 * |
| 4 * This Source Code Form is subject to the terms of the Mozilla Public | 4 * This Source Code Form is subject to the terms of the Mozilla Public |
| 5 * License, v. 2.0. If a copy of the MPL was not distributed with this | 5 * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| 7 #include "cert.h" | 7 #include "cert.h" |
| 8 #include "secitem.h" | 8 #include "secitem.h" |
| 9 #include "keyhi.h" | 9 #include "keyhi.h" |
| 10 #include "ssl.h" | 10 #include "ssl.h" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 ss->nextHandshake = 0; | 92 ss->nextHandshake = 0; |
| 93 } | 93 } |
| 94 if (ss->handshake == 0) { | 94 if (ss->handshake == 0) { |
| 95 /* Previous handshake finished. Switch to security handshake */ | 95 /* Previous handshake finished. Switch to security handshake */ |
| 96 ss->handshake = ss->securityHandshake; | 96 ss->handshake = ss->securityHandshake; |
| 97 ss->securityHandshake = 0; | 97 ss->securityHandshake = 0; |
| 98 } | 98 } |
| 99 if (ss->handshake == 0) { | 99 if (ss->handshake == 0) { |
| 100 ssl_GetRecvBufLock(ss); | 100 ssl_GetRecvBufLock(ss); |
| 101 ss->gs.recordLen = 0; | 101 ss->gs.recordLen = 0; |
| 102 ss->gs.writeOffset = 0; |
| 103 ss->gs.readOffset = 0; |
| 102 ssl_ReleaseRecvBufLock(ss); | 104 ssl_ReleaseRecvBufLock(ss); |
| 103 | 105 |
| 104 SSL_TRC(3, ("%d: SSL[%d]: handshake is completed", | 106 SSL_TRC(3, ("%d: SSL[%d]: handshake is completed", |
| 105 SSL_GETPID(), ss->fd)); | 107 SSL_GETPID(), ss->fd)); |
| 106 /* call handshake callback for ssl v2 */ | |
| 107 /* for v3 this is done in ssl3_HandleFinished() */ | |
| 108 if ((ss->handshakeCallback != NULL) && /* has callback */ | |
| 109 (!ss->firstHsDone) && /* only first time */ | |
| 110 (ss->version < SSL_LIBRARY_VERSION_3_0)) { /* not ssl3 */ | |
| 111 ss->firstHsDone = PR_TRUE; | |
| 112 (ss->handshakeCallback)(ss->fd, ss->handshakeCallbackData); | |
| 113 } | |
| 114 ss->firstHsDone = PR_TRUE; | |
| 115 ss->gs.writeOffset = 0; | |
| 116 ss->gs.readOffset = 0; | |
| 117 break; | 108 break; |
| 118 } | 109 } |
| 119 rv = (*ss->handshake)(ss); | 110 rv = (*ss->handshake)(ss); |
| 120 ++loopCount; | 111 ++loopCount; |
| 121 /* This code must continue to loop on SECWouldBlock, | 112 /* This code must continue to loop on SECWouldBlock, |
| 122 * or any positive value. See XXX_1 comments. | 113 * or any positive value. See XXX_1 comments. |
| 123 */ | 114 */ |
| 124 } while (rv != SECFailure); /* was (rv >= 0); XXX_1 */ | 115 } while (rv != SECFailure); /* was (rv >= 0); XXX_1 */ |
| 125 | 116 |
| 126 PORT_Assert(ss->opt.noLocks || !ssl_HaveRecvBufLock(ss)); | 117 PORT_Assert(ss->opt.noLocks || !ssl_HaveRecvBufLock(ss)); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 if (!ss->opt.useSecurity) | 190 if (!ss->opt.useSecurity) |
| 200 return SECSuccess; | 191 return SECSuccess; |
| 201 | 192 |
| 202 SSL_LOCK_READER(ss); | 193 SSL_LOCK_READER(ss); |
| 203 SSL_LOCK_WRITER(ss); | 194 SSL_LOCK_WRITER(ss); |
| 204 | 195 |
| 205 /* Reset handshake state */ | 196 /* Reset handshake state */ |
| 206 ssl_Get1stHandshakeLock(ss); | 197 ssl_Get1stHandshakeLock(ss); |
| 207 | 198 |
| 208 ss->firstHsDone = PR_FALSE; | 199 ss->firstHsDone = PR_FALSE; |
| 200 ss->enoughFirstHsDone = PR_FALSE; |
| 209 if ( asServer ) { | 201 if ( asServer ) { |
| 210 ss->handshake = ssl2_BeginServerHandshake; | 202 ss->handshake = ssl2_BeginServerHandshake; |
| 211 ss->handshaking = sslHandshakingAsServer; | 203 ss->handshaking = sslHandshakingAsServer; |
| 212 } else { | 204 } else { |
| 213 ss->handshake = ssl2_BeginClientHandshake; | 205 ss->handshake = ssl2_BeginClientHandshake; |
| 214 ss->handshaking = sslHandshakingAsClient; | 206 ss->handshaking = sslHandshakingAsClient; |
| 215 } | 207 } |
| 216 ss->nextHandshake = 0; | 208 ss->nextHandshake = 0; |
| 217 ss->securityHandshake = 0; | 209 ss->securityHandshake = 0; |
| 218 | 210 |
| 219 ssl_GetRecvBufLock(ss); | 211 ssl_GetRecvBufLock(ss); |
| 220 status = ssl_InitGather(&ss->gs); | 212 status = ssl_InitGather(&ss->gs); |
| 221 ssl_ReleaseRecvBufLock(ss); | 213 ssl_ReleaseRecvBufLock(ss); |
| 222 | 214 |
| 223 ssl_GetSSL3HandshakeLock(ss); | 215 ssl_GetSSL3HandshakeLock(ss); |
| 216 ss->ssl3.hs.canFalseStart = PR_FALSE; |
| 217 ss->ssl3.hs.restartTarget = NULL; |
| 224 | 218 |
| 225 /* | 219 /* |
| 226 ** Blow away old security state and get a fresh setup. | 220 ** Blow away old security state and get a fresh setup. |
| 227 */ | 221 */ |
| 228 ssl_GetXmitBufLock(ss); | 222 ssl_GetXmitBufLock(ss); |
| 229 ssl_ResetSecurityInfo(&ss->sec, PR_TRUE); | 223 ssl_ResetSecurityInfo(&ss->sec, PR_TRUE); |
| 230 status = ssl_CreateSecurityInfo(ss); | 224 status = ssl_CreateSecurityInfo(ss); |
| 231 ssl_ReleaseXmitBufLock(ss); | 225 ssl_ReleaseXmitBufLock(ss); |
| 232 | 226 |
| 233 ssl_ReleaseSSL3HandshakeLock(ss); | 227 ssl_ReleaseSSL3HandshakeLock(ss); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 259 return SECFailure; | 253 return SECFailure; |
| 260 } | 254 } |
| 261 | 255 |
| 262 if (!ss->opt.useSecurity) | 256 if (!ss->opt.useSecurity) |
| 263 return SECSuccess; | 257 return SECSuccess; |
| 264 | 258 |
| 265 ssl_Get1stHandshakeLock(ss); | 259 ssl_Get1stHandshakeLock(ss); |
| 266 | 260 |
| 267 /* SSL v2 protocol does not support subsequent handshakes. */ | 261 /* SSL v2 protocol does not support subsequent handshakes. */ |
| 268 if (ss->version < SSL_LIBRARY_VERSION_3_0) { | 262 if (ss->version < SSL_LIBRARY_VERSION_3_0) { |
| 269 » PORT_SetError(SEC_ERROR_INVALID_ARGS); | 263 » PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SSL2); |
| 270 rv = SECFailure; | 264 rv = SECFailure; |
| 271 } else { | 265 } else { |
| 272 ssl_GetSSL3HandshakeLock(ss); | 266 ssl_GetSSL3HandshakeLock(ss); |
| 273 rv = ssl3_RedoHandshake(ss, flushCache); /* force full handshake. */ | 267 rv = ssl3_RedoHandshake(ss, flushCache); /* force full handshake. */ |
| 274 ssl_ReleaseSSL3HandshakeLock(ss); | 268 ssl_ReleaseSSL3HandshakeLock(ss); |
| 275 } | 269 } |
| 276 | 270 |
| 277 ssl_Release1stHandshakeLock(ss); | 271 ssl_Release1stHandshakeLock(ss); |
| 278 | 272 |
| 279 return rv; | 273 return rv; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 | 318 |
| 325 ss->handshakeCallback = cb; | 319 ss->handshakeCallback = cb; |
| 326 ss->handshakeCallbackData = client_data; | 320 ss->handshakeCallbackData = client_data; |
| 327 | 321 |
| 328 ssl_ReleaseSSL3HandshakeLock(ss); | 322 ssl_ReleaseSSL3HandshakeLock(ss); |
| 329 ssl_Release1stHandshakeLock(ss); | 323 ssl_Release1stHandshakeLock(ss); |
| 330 | 324 |
| 331 return SECSuccess; | 325 return SECSuccess; |
| 332 } | 326 } |
| 333 | 327 |
| 328 /* Register an application callback to be called when false start may happen. |
| 329 ** Acquires and releases HandshakeLock. |
| 330 */ |
| 331 SECStatus |
| 332 SSL_SetCanFalseStartCallback(PRFileDesc *fd, SSLCanFalseStartCallback cb, |
| 333 void *client_data) |
| 334 { |
| 335 sslSocket *ss; |
| 336 |
| 337 ss = ssl_FindSocket(fd); |
| 338 if (!ss) { |
| 339 SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetCanFalseStartCallback", |
| 340 SSL_GETPID(), fd)); |
| 341 return SECFailure; |
| 342 } |
| 343 |
| 344 if (!ss->opt.useSecurity) { |
| 345 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 346 return SECFailure; |
| 347 } |
| 348 |
| 349 ssl_Get1stHandshakeLock(ss); |
| 350 ssl_GetSSL3HandshakeLock(ss); |
| 351 |
| 352 ss->canFalseStartCallback = cb; |
| 353 ss->canFalseStartCallbackData = client_data; |
| 354 |
| 355 ssl_ReleaseSSL3HandshakeLock(ss); |
| 356 ssl_Release1stHandshakeLock(ss); |
| 357 |
| 358 return SECSuccess; |
| 359 } |
| 360 |
| 361 /* A utility function that can be called from a custom SSLCanFalseStartCallback |
| 362 ** function to determine what NSS would have done for this connection if the |
| 363 ** custom callback was not implemented. |
| 364 */ |
| 365 SECStatus |
| 366 SSL_DefaultCanFalseStart(PRFileDesc *fd, PRBool *canFalseStart) |
| 367 { |
| 368 sslSocket *ss; |
| 369 |
| 370 *canFalseStart = PR_FALSE; |
| 371 ss = ssl_FindSocket(fd); |
| 372 if (!ss) { |
| 373 SSL_DBG(("%d: SSL[%d]: bad socket in SSL_DefaultCanFalseStart", |
| 374 SSL_GETPID(), fd)); |
| 375 return SECFailure; |
| 376 } |
| 377 |
| 378 if (!ss->ssl3.initialized) { |
| 379 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 380 return SECFailure; |
| 381 } |
| 382 |
| 383 if (ss->version < SSL_LIBRARY_VERSION_3_0) { |
| 384 PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SSL2); |
| 385 return SECFailure; |
| 386 } |
| 387 |
| 388 /* Require a forward-secret key exchange. */ |
| 389 *canFalseStart = ss->ssl3.hs.kea_def->kea == kea_dhe_dss || |
| 390 ss->ssl3.hs.kea_def->kea == kea_dhe_rsa || |
| 391 ss->ssl3.hs.kea_def->kea == kea_ecdhe_ecdsa || |
| 392 ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa; |
| 393 |
| 394 return SECSuccess; |
| 395 } |
| 396 |
| 334 /* Try to make progress on an SSL handshake by attempting to read the | 397 /* Try to make progress on an SSL handshake by attempting to read the |
| 335 ** next handshake from the peer, and sending any responses. | 398 ** next handshake from the peer, and sending any responses. |
| 336 ** For non-blocking sockets, returns PR_ERROR_WOULD_BLOCK if it cannot | 399 ** For non-blocking sockets, returns PR_ERROR_WOULD_BLOCK if it cannot |
| 337 ** read the next handshake from the underlying socket. | 400 ** read the next handshake from the underlying socket. |
| 338 ** For SSLv2, returns when handshake is complete or fatal error occurs. | 401 ** For SSLv2, returns when handshake is complete or fatal error occurs. |
| 339 ** For SSLv3, returns when handshake is complete, or application data has | 402 ** For SSLv3, returns when handshake is complete, or application data has |
| 340 ** arrived that must be taken by application before handshake can continue, | 403 ** arrived that must be taken by application before handshake can continue, |
| 341 ** or a fatal error occurs. | 404 ** or a fatal error occurs. |
| 342 ** Application should use handshake completion callback to tell which. | 405 ** Application should use handshake completion callback to tell which. |
| 343 */ | 406 */ |
| (...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1188 } | 1251 } |
| 1189 | 1252 |
| 1190 if (len > 0) | 1253 if (len > 0) |
| 1191 ss->writerThread = PR_GetCurrentThread(); | 1254 ss->writerThread = PR_GetCurrentThread(); |
| 1192 /* If any of these is non-zero, the initial handshake is not done. */ | 1255 /* If any of these is non-zero, the initial handshake is not done. */ |
| 1193 if (!ss->firstHsDone) { | 1256 if (!ss->firstHsDone) { |
| 1194 PRBool canFalseStart = PR_FALSE; | 1257 PRBool canFalseStart = PR_FALSE; |
| 1195 ssl_Get1stHandshakeLock(ss); | 1258 ssl_Get1stHandshakeLock(ss); |
| 1196 if (ss->version >= SSL_LIBRARY_VERSION_3_0) { | 1259 if (ss->version >= SSL_LIBRARY_VERSION_3_0) { |
| 1197 ssl_GetSSL3HandshakeLock(ss); | 1260 ssl_GetSSL3HandshakeLock(ss); |
| 1198 » if ((ss->ssl3.hs.ws == wait_change_cipher || | 1261 » canFalseStart = ss->ssl3.hs.canFalseStart; |
| 1199 » » ss->ssl3.hs.ws == wait_finished || | |
| 1200 » » ss->ssl3.hs.ws == wait_new_session_ticket) && | |
| 1201 » » ssl3_CanFalseStart(ss)) { | |
| 1202 » » canFalseStart = PR_TRUE; | |
| 1203 » } | |
| 1204 ssl_ReleaseSSL3HandshakeLock(ss); | 1262 ssl_ReleaseSSL3HandshakeLock(ss); |
| 1205 } | 1263 } |
| 1206 if (!canFalseStart && | 1264 if (!canFalseStart && |
| 1207 (ss->handshake || ss->nextHandshake || ss->securityHandshake)) { | 1265 (ss->handshake || ss->nextHandshake || ss->securityHandshake)) { |
| 1208 rv = ssl_Do1stHandshake(ss); | 1266 rv = ssl_Do1stHandshake(ss); |
| 1209 } | 1267 } |
| 1210 ssl_Release1stHandshakeLock(ss); | 1268 ssl_Release1stHandshakeLock(ss); |
| 1211 } | 1269 } |
| 1212 if (rv < 0) { | 1270 if (rv < 0) { |
| 1213 ss->writerThread = NULL; | 1271 ss->writerThread = NULL; |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1589 if (!ss) { | 1647 if (!ss) { |
| 1590 SSL_DBG(("%d: SSL[%d]: bad socket in SNISocketConfigHook", | 1648 SSL_DBG(("%d: SSL[%d]: bad socket in SNISocketConfigHook", |
| 1591 SSL_GETPID(), fd)); | 1649 SSL_GETPID(), fd)); |
| 1592 return SECFailure; | 1650 return SECFailure; |
| 1593 } | 1651 } |
| 1594 | 1652 |
| 1595 ss->sniSocketConfig = func; | 1653 ss->sniSocketConfig = func; |
| 1596 ss->sniSocketConfigArg = arg; | 1654 ss->sniSocketConfigArg = arg; |
| 1597 return SECSuccess; | 1655 return SECSuccess; |
| 1598 } | 1656 } |
| OLD | NEW |