|
|
|
|
| 143 |
/* for v3 this is done in ssl3_HandleFinished() */ |
143 |
/* for v3 this is done in ssl3_HandleFinished() */ |
| 144 |
if ((ss->sec != NULL) && /* used SSL */ |
144 |
if ((ss->sec != NULL) && /* used SSL */ |
| 145 |
(ss->handshakeCallback != NULL) && /* has callback */ |
145 |
(ss->handshakeCallback != NULL) && /* has callback */ |
| 146 |
(!ss->connected) && /* only first time */ |
146 |
(!ss->firstHsDone) && /* only first time */ |
| 147 |
(ss->version < SSL_LIBRARY_VERSION_3_0)) { /* not ssl3 */ |
147 |
(ss->version < SSL_LIBRARY_VERSION_3_0)) { /* not ssl3 */ |
| 148 |
ss->connected = PR_TRUE; |
148 |
ss->firstHsDone = PR_TRUE; |
| 149 |
(ss->handshakeCallback)(ss->fd, ss->handshakeCallbackData); |
149 |
(ss->handshakeCallback)(ss->fd, ss->handshakeCallbackData); |
| 150 |
} |
150 |
} |
| 151 |
ss->connected = PR_TRUE; |
151 |
ss->firstHsDone = PR_TRUE; |
| 152 |
ss->gather->writeOffset = 0; |
152 |
ss->gather->writeOffset = 0; |
| 153 |
ss->gather->readOffset = 0; |
153 |
ss->gather->readOffset = 0; |
| 154 |
break; |
154 |
break; |
|
|
| 187 |
void |
187 |
void |
| 188 |
ssl_SetAlwaysBlock(sslSocket *ss) |
188 |
ssl_SetAlwaysBlock(sslSocket *ss) |
| 189 |
{ |
189 |
{ |
| 190 |
if (!ss->connected) { |
190 |
if (!ss->firstHsDone) { |
| 191 |
ss->handshake = AlwaysBlock; |
191 |
ss->handshake = AlwaysBlock; |
| 192 |
ss->nextHandshake = 0; |
192 |
ss->nextHandshake = 0; |
| 193 |
} |
193 |
} |
|
|
| 200 |
{ |
200 |
{ |
| 201 |
sslSocket *ss; |
201 |
sslSocket *ss; |
| 202 |
SECStatus rv; |
202 |
SECStatus rv; |
|
|
203 |
PRNetAddr addr; |
| 203 |
|
204 |
|
| 204 |
ss = ssl_FindSocket(s); |
205 |
ss = ssl_FindSocket(s); |
| 205 |
if (!ss) { |
206 |
if (!ss) { |
|
|
| 218 |
ssl_Get1stHandshakeLock(ss); |
219 |
ssl_Get1stHandshakeLock(ss); |
| 219 |
ssl_GetSSL3HandshakeLock(ss); |
220 |
ssl_GetSSL3HandshakeLock(ss); |
| 220 |
|
221 |
|
| 221 |
ss->connected = PR_FALSE; |
222 |
ss->firstHsDone = PR_FALSE; |
| 222 |
ss->handshake = asServer ? ssl2_BeginServerHandshake |
223 |
if ( asServer ) { |
| 223 |
: ssl2_BeginClientHandshake; |
224 |
ss->securityHandshake = ssl2_BeginServerHandshake; |
|
|
225 |
ss->handshaking = sslHandshakingAsServer; |
| 226 |
} else { |
| 227 |
ss->securityHandshake = ssl2_BeginClientHandshake; |
| 228 |
ss->handshaking = sslHandshakingAsClient; |
| 229 |
} |
| 224 |
ss->nextHandshake = 0; |
230 |
ss->nextHandshake = 0; |
| 225 |
ss->securityHandshake = 0; |
231 |
ss->securityHandshake = 0; |
| 226 |
|
232 |
|
|
|
| 244 |
ssl_ReleaseSSL3HandshakeLock(ss); |
250 |
ssl_ReleaseSSL3HandshakeLock(ss); |
| 245 |
ssl_Release1stHandshakeLock(ss); |
251 |
ssl_Release1stHandshakeLock(ss); |
| 246 |
|
252 |
|
|
|
253 |
if (!ss->TCPconnected) |
| 254 |
ss->TCPconnected = (PR_SUCCESS == ssl_DefGetpeername(ss, &addr)); |
| 255 |
|
| 247 |
SSL_UNLOCK_WRITER(ss); |
256 |
SSL_UNLOCK_WRITER(ss); |
| 248 |
SSL_UNLOCK_READER(ss); |
257 |
SSL_UNLOCK_READER(ss); |
| 249 |
|
258 |
|
|
|
| 369 |
} else if (gatherResult == SECWouldBlock) { |
378 |
} else if (gatherResult == SECWouldBlock) { |
| 370 |
PORT_SetError(PR_WOULD_BLOCK_ERROR); |
379 |
PORT_SetError(PR_WOULD_BLOCK_ERROR); |
| 371 |
} |
380 |
} |
| 372 |
} else if (!ss->connected) { |
381 |
} else if (!ss->firstHsDone) { |
| 373 |
rv = ssl_Do1stHandshake(ss); |
382 |
rv = ssl_Do1stHandshake(ss); |
| 374 |
} else { |
383 |
} else { |
| 375 |
/* tried to force handshake on a connected SSL 2 socket. */ |
384 |
/* tried to force handshake on an SSL 2 socket that has |
|
|
385 |
** already completed the handshake. */ |
| 376 |
rv = SECSuccess; /* just pretend we did it. */ |
386 |
rv = SECSuccess; /* just pretend we did it. */ |
| 377 |
} |
387 |
} |
| 378 |
|
388 |
|
|
|
| 882 |
|
892 |
|
| 883 |
PORT_Assert(ss->sec != 0); |
893 |
PORT_Assert(ss->sec != 0); |
| 884 |
|
894 |
|
| 885 |
/* First connect to server */ |
|
|
| 886 |
rv = osfd->methods->connect(osfd, sa, ss->cTimeout); |
| 887 |
if (rv < 0) { |
| 888 |
int olderrno = PR_GetError(); |
| 889 |
SSL_DBG(("%d: SSL[%d]: connect failed, errno=%d", |
| 890 |
SSL_GETPID(), ss->fd, olderrno)); |
| 891 |
if ((olderrno == PR_IS_CONNECTED_ERROR) || |
| 892 |
(olderrno == PR_IN_PROGRESS_ERROR)) { |
| 893 |
/* |
| 894 |
** Connected or trying to connect. Caller is Using a non-blocking |
| 895 |
** connect. Go ahead and set things up. |
| 896 |
*/ |
| 897 |
} else { |
| 898 |
return rv; |
| 899 |
} |
| 900 |
} |
| 901 |
|
| 902 |
SSL_TRC(5, ("%d: SSL[%d]: secure connect completed, setting up handshake", |
| 903 |
SSL_GETPID(), ss->fd)); |
| 904 |
|
| 905 |
if ( ss->handshakeAsServer ) { |
895 |
if ( ss->handshakeAsServer ) { |
| 906 |
ss->securityHandshake = ssl2_BeginServerHandshake; |
896 |
ss->securityHandshake = ssl2_BeginServerHandshake; |
|
|
897 |
ss->handshaking = sslHandshakingAsServer; |
| 907 |
} else { |
898 |
} else { |
| 908 |
ss->securityHandshake = ssl2_BeginClientHandshake; |
899 |
ss->securityHandshake = ssl2_BeginClientHandshake; |
|
|
900 |
ss->handshaking = sslHandshakingAsClient; |
| 909 |
} |
901 |
} |
| 910 |
|
902 |
|
|
|
903 |
/* connect to server */ |
| 904 |
rv = osfd->methods->connect(osfd, sa, ss->cTimeout); |
| 905 |
if (rv == PR_SUCCESS) { |
| 906 |
ss->TCPconnected = 1; |
| 907 |
} else { |
| 908 |
int err = PR_GetError(); |
| 909 |
SSL_DBG(("%d: SSL[%d]: connect failed, errno=%d", |
| 910 |
SSL_GETPID(), ss->fd, err)); |
| 911 |
if (err == PR_IS_CONNECTED_ERROR) { |
| 912 |
ss->TCPconnected = 1; |
| 913 |
} |
| 914 |
} |
| 915 |
|
| 916 |
SSL_TRC(5, ("%d: SSL[%d]: secure connect completed, rv == %d", |
| 917 |
SSL_GETPID(), ss->fd, rv)); |
| 911 |
return rv; |
918 |
return rv; |
| 912 |
} |
919 |
} |
| 913 |
|
920 |
|
|
|
| 917 |
int rv; |
924 |
int rv; |
| 918 |
|
925 |
|
| 919 |
if (ss->version >= SSL_LIBRARY_VERSION_3_0 && |
926 |
if (ss->version >= SSL_LIBRARY_VERSION_3_0 && |
| 920 |
ss->connected && |
927 |
ss->firstHsDone && |
| 921 |
!(ss->shutdownHow & ssl_SHUTDOWN_SEND) && |
928 |
!(ss->shutdownHow & ssl_SHUTDOWN_SEND) && |
|
|
929 |
!ss->recvdCloseNotify && |
| 922 |
(ss->ssl3 != NULL)) { |
930 |
(ss->ssl3 != NULL)) { |
| 923 |
|
931 |
|
| 924 |
(void) SSL3_SendAlert(ss, alert_warning, close_notify); |
932 |
(void) SSL3_SendAlert(ss, alert_warning, close_notify); |
|
|
| 943 |
if ((sslHow & ssl_SHUTDOWN_SEND) != 0 && |
951 |
if ((sslHow & ssl_SHUTDOWN_SEND) != 0 && |
| 944 |
!(ss->shutdownHow & ssl_SHUTDOWN_SEND) && |
952 |
!(ss->shutdownHow & ssl_SHUTDOWN_SEND) && |
| 945 |
(ss->version >= SSL_LIBRARY_VERSION_3_0) && |
953 |
(ss->version >= SSL_LIBRARY_VERSION_3_0) && |
| 946 |
ss->connected && |
954 |
ss->firstHsDone && |
|
|
955 |
!ss->recvdCloseNotify && |
| 947 |
(ss->ssl3 != NULL)) { |
956 |
(ss->ssl3 != NULL)) { |
| 948 |
|
957 |
|
| 949 |
(void) SSL3_SendAlert(ss, alert_warning, close_notify); |
958 |
(void) SSL3_SendAlert(ss, alert_warning, close_notify); |
|
|
| 992 |
|
1001 |
|
| 993 |
rv = 0; |
1002 |
rv = 0; |
| 994 |
/* If any of these is non-zero, the initial handshake is not done. */ |
1003 |
/* If any of these is non-zero, the initial handshake is not done. */ |
| 995 |
if (!ss->connected) { |
1004 |
if (!ss->firstHsDone) { |
| 996 |
ssl_Get1stHandshakeLock(ss); |
1005 |
ssl_Get1stHandshakeLock(ss); |
| 997 |
if (ss->handshake || ss->nextHandshake || ss->securityHandshake) { |
1006 |
if (ss->handshake || ss->nextHandshake || ss->securityHandshake) { |
| 998 |
rv = ssl_Do1stHandshake(ss); |
1007 |
rv = ssl_Do1stHandshake(ss); |
|
|
| 1054 |
if (len > 0) |
1063 |
if (len > 0) |
| 1055 |
ss->writerThread = PR_GetCurrentThread(); |
1064 |
ss->writerThread = PR_GetCurrentThread(); |
| 1056 |
/* If any of these is non-zero, the initial handshake is not done. */ |
1065 |
/* If any of these is non-zero, the initial handshake is not done. */ |
| 1057 |
if (!ss->connected) { |
1066 |
if (!ss->firstHsDone) { |
| 1058 |
ssl_Get1stHandshakeLock(ss); |
1067 |
ssl_Get1stHandshakeLock(ss); |
| 1059 |
if (ss->handshake || ss->nextHandshake || ss->securityHandshake) { |
1068 |
if (ss->handshake || ss->nextHandshake || ss->securityHandshake) { |
| 1060 |
rv = ssl_Do1stHandshake(ss); |
1069 |
rv = ssl_Do1stHandshake(ss); |
|
|
| 1214 |
ssl_Get1stHandshakeLock(ss); |
1223 |
ssl_Get1stHandshakeLock(ss); |
| 1215 |
ssl_GetSSL3HandshakeLock(ss); |
1224 |
ssl_GetSSL3HandshakeLock(ss); |
| 1216 |
|
1225 |
|
| 1217 |
if (ss->useSecurity && ss->connected && ss->sec && ss->sec->ci.sid) { |
1226 |
if (ss->useSecurity && ss->firstHsDone && ss->sec && ss->sec->ci.sid) { |
| 1218 |
sid = ss->sec->ci.sid; |
1227 |
sid = ss->sec->ci.sid; |
| 1219 |
item = (SECItem *)PORT_Alloc(sizeof(SECItem)); |
1228 |
item = (SECItem *)PORT_Alloc(sizeof(SECItem)); |
| 1220 |
if (sid->version < SSL_LIBRARY_VERSION_3_0) { |
1229 |
if (sid->version < SSL_LIBRARY_VERSION_3_0) { |