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

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

Issue 9558017: Update net/third_party/nss to NSS 3.13.3. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Upload before checkin Created 8 years, 9 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
« no previous file with comments | « net/third_party/nss/ssl/sslauth.c ('k') | net/third_party/nss/ssl/sslerr.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * SSL v2 handshake functions, and functions common to SSL2 and SSL3. 2 * SSL v2 handshake functions, and functions common to SSL2 and SSL3.
3 * 3 *
4 * ***** BEGIN LICENSE BLOCK ***** 4 * ***** BEGIN LICENSE BLOCK *****
5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6 * 6 *
7 * The contents of this file are subject to the Mozilla Public License Version 7 * The contents of this file are subject to the Mozilla Public License Version
8 * 1.1 (the "License"); you may not use this file except in compliance with 8 * 1.1 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at 9 * the License. You may obtain a copy of the License at
10 * http://www.mozilla.org/MPL/ 10 * http://www.mozilla.org/MPL/
(...skipping 19 matching lines...) Expand all
30 * in which case the provisions of the GPL or the LGPL are applicable instead 30 * in which case the provisions of the GPL or the LGPL are applicable instead
31 * of those above. If you wish to allow use of your version of this file only 31 * of those above. If you wish to allow use of your version of this file only
32 * under the terms of either the GPL or the LGPL, and not to allow others to 32 * under the terms of either the GPL or the LGPL, and not to allow others to
33 * use your version of this file under the terms of the MPL, indicate your 33 * use your version of this file under the terms of the MPL, indicate your
34 * decision by deleting the provisions above and replace them with the notice 34 * decision by deleting the provisions above and replace them with the notice
35 * and other provisions required by the GPL or the LGPL. If you do not delete 35 * and other provisions required by the GPL or the LGPL. If you do not delete
36 * the provisions above, a recipient may use your version of this file under 36 * the provisions above, a recipient may use your version of this file under
37 * the terms of any one of the MPL, the GPL or the LGPL. 37 * the terms of any one of the MPL, the GPL or the LGPL.
38 * 38 *
39 * ***** END LICENSE BLOCK ***** */ 39 * ***** END LICENSE BLOCK ***** */
40 /* $Id: sslcon.c,v 1.40 2010/04/25 23:37:38 nelson%bolyard.com Exp $ */ 40 /* $Id: sslcon.c,v 1.45 2011/11/19 21:58:21 bsmith%mozilla.com Exp $ */
41 41
42 #include "nssrenam.h" 42 #include "nssrenam.h"
43 #include "cert.h" 43 #include "cert.h"
44 #include "secitem.h" 44 #include "secitem.h"
45 #include "sechash.h" 45 #include "sechash.h"
46 #include "cryptohi.h" /* for SGN_ funcs */ 46 #include "cryptohi.h" /* for SGN_ funcs */
47 #include "keyhi.h" /* for SECKEY_ high level functions. */ 47 #include "keyhi.h" /* for SECKEY_ high level functions. */
48 #include "ssl.h" 48 #include "ssl.h"
49 #include "sslimpl.h" 49 #include "sslimpl.h"
50 #include "sslproto.h" 50 #include "sslproto.h"
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 return rv; 511 return rv;
512 } 512 }
513 513
514 /* Called from: 514 /* Called from:
515 * ssl2_ClientSetupSessionCypher() <- ssl2_HandleServerHelloMessage() 515 * ssl2_ClientSetupSessionCypher() <- ssl2_HandleServerHelloMessage()
516 * ssl2_HandleRequestCertificate() <- ssl2_HandleMessage() <- 516 * ssl2_HandleRequestCertificate() <- ssl2_HandleMessage() <-
517 ssl_Do1stHandshake() 517 ssl_Do1stHandshake()
518 * ssl2_HandleMessage() <- ssl_Do1stHandshake() 518 * ssl2_HandleMessage() <- ssl_Do1stHandshake()
519 * ssl2_HandleServerHelloMessage() <- ssl_Do1stHandshake() 519 * ssl2_HandleServerHelloMessage() <- ssl_Do1stHandshake()
520 after ssl2_BeginClientHandshake() 520 after ssl2_BeginClientHandshake()
521 * ssl2_RestartHandshakeAfterCertReq() <- Called from certdlgs.c in nav.
522 * ssl2_HandleClientHelloMessage() <- ssl_Do1stHandshake() 521 * ssl2_HandleClientHelloMessage() <- ssl_Do1stHandshake()
523 after ssl2_BeginServerHandshake() 522 after ssl2_BeginServerHandshake()
524 * 523 *
525 * Acquires and releases the socket's xmitBufLock. 524 * Acquires and releases the socket's xmitBufLock.
526 */ 525 */
527 int 526 int
528 ssl2_SendErrorMessage(sslSocket *ss, int error) 527 ssl2_SendErrorMessage(sslSocket *ss, int error)
529 { 528 {
530 int rv; 529 int rv;
531 PRUint8 msg[SSL_HL_ERROR_HBYTES]; 530 PRUint8 msg[SSL_HL_ERROR_HBYTES];
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 757
759 DUMP_MSG(29, (ss, msg, sendLen)); 758 DUMP_MSG(29, (ss, msg, sendLen));
760 sent = (*ss->sec.send)(ss, msg, sendLen, 0); 759 sent = (*ss->sec.send)(ss, msg, sendLen, 0);
761 rv = (sent >= 0) ? SECSuccess : (SECStatus)sent; 760 rv = (sent >= 0) ? SECSuccess : (SECStatus)sent;
762 done: 761 done:
763 ssl_ReleaseXmitBufLock(ss); /***************************************/ 762 ssl_ReleaseXmitBufLock(ss); /***************************************/
764 return rv; 763 return rv;
765 } 764 }
766 765
767 /* Called from ssl2_HandleRequestCertificate() <- ssl2_HandleMessage() 766 /* Called from ssl2_HandleRequestCertificate() <- ssl2_HandleMessage()
768 * ssl2_RestartHandshakeAfterCertReq() <- (application)
769 * Acquires and releases the socket's xmitBufLock. 767 * Acquires and releases the socket's xmitBufLock.
770 */ 768 */
771 static int 769 static int
772 ssl2_SendCertificateResponseMessage(sslSocket *ss, SECItem *cert, 770 ssl2_SendCertificateResponseMessage(sslSocket *ss, SECItem *cert,
773 SECItem *encCode) 771 SECItem *encCode)
774 { 772 {
775 PRUint8 *msg; 773 PRUint8 *msg;
776 int rv, sendLen; 774 int rv, sendLen;
777 775
778 PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) ); 776 PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after
1170 return count; 1168 return count;
1171 1169
1172 loser: 1170 loser:
1173 ssl_ReleaseSpecReadLock(ss); 1171 ssl_ReleaseSpecReadLock(ss);
1174 return SECFailure; 1172 return SECFailure;
1175 } 1173 }
1176 1174
1177 /* 1175 /*
1178 ** Called from: ssl2_HandleServerHelloMessage, 1176 ** Called from: ssl2_HandleServerHelloMessage,
1179 ** ssl2_HandleClientSessionKeyMessage, 1177 ** ssl2_HandleClientSessionKeyMessage,
1180 ** ssl2_RestartHandshakeAfterServerCert,
1181 ** ssl2_HandleClientHelloMessage, 1178 ** ssl2_HandleClientHelloMessage,
1182 ** 1179 **
1183 */ 1180 */
1184 static void 1181 static void
1185 ssl2_UseEncryptedSendFunc(sslSocket *ss) 1182 ssl2_UseEncryptedSendFunc(sslSocket *ss)
1186 { 1183 {
1187 ssl_GetXmitBufLock(ss); 1184 ssl_GetXmitBufLock(ss);
1188 PORT_Assert(ss->sec.hashcx != 0); 1185 PORT_Assert(ss->sec.hashcx != 0);
1189 1186
1190 ss->gs.encrypted = 1; 1187 ss->gs.encrypted = 1;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1230 * 1227 *
1231 * This code is similar to, and easily confused with, DoRecv() in sslsecur.c 1228 * This code is similar to, and easily confused with, DoRecv() in sslsecur.c
1232 * 1229 *
1233 * This function is called from ssl_Do1stHandshake(). 1230 * This function is called from ssl_Do1stHandshake().
1234 * The following functions put ssl_GatherRecord1stHandshake into ss->handshake: 1231 * The following functions put ssl_GatherRecord1stHandshake into ss->handshake:
1235 * ssl2_HandleMessage 1232 * ssl2_HandleMessage
1236 * ssl2_HandleVerifyMessage 1233 * ssl2_HandleVerifyMessage
1237 * ssl2_HandleServerHelloMessage 1234 * ssl2_HandleServerHelloMessage
1238 * ssl2_BeginClientHandshake 1235 * ssl2_BeginClientHandshake
1239 * ssl2_HandleClientSessionKeyMessage 1236 * ssl2_HandleClientSessionKeyMessage
1240 * ssl2_RestartHandshakeAfterCertReq
1241 * ssl3_RestartHandshakeAfterCertReq 1237 * ssl3_RestartHandshakeAfterCertReq
1242 * ssl2_RestartHandshakeAfterServerCert
1243 * ssl3_RestartHandshakeAfterServerCert 1238 * ssl3_RestartHandshakeAfterServerCert
1244 * ssl2_HandleClientHelloMessage 1239 * ssl2_HandleClientHelloMessage
1245 * ssl2_BeginServerHandshake 1240 * ssl2_BeginServerHandshake
1246 */ 1241 */
1247 SECStatus 1242 SECStatus
1248 ssl_GatherRecord1stHandshake(sslSocket *ss) 1243 ssl_GatherRecord1stHandshake(sslSocket *ss)
1249 { 1244 {
1250 int rv; 1245 int rv;
1251 1246
1252 PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) ); 1247 PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
(...skipping 972 matching lines...) Expand 10 before | Expand all | Expand 10 after
2225 } 2220 }
2226 2221
2227 /* See if it's time to send our finished message, or if the handshakes are 2222 /* See if it's time to send our finished message, or if the handshakes are
2228 ** complete. Send finished message if appropriate. 2223 ** complete. Send finished message if appropriate.
2229 ** Returns SECSuccess unless anything goes wrong. 2224 ** Returns SECSuccess unless anything goes wrong.
2230 ** 2225 **
2231 ** Called from ssl2_HandleMessage, 2226 ** Called from ssl2_HandleMessage,
2232 ** ssl2_HandleVerifyMessage 2227 ** ssl2_HandleVerifyMessage
2233 ** ssl2_HandleServerHelloMessage 2228 ** ssl2_HandleServerHelloMessage
2234 ** ssl2_HandleClientSessionKeyMessage 2229 ** ssl2_HandleClientSessionKeyMessage
2235 ** ssl2_RestartHandshakeAfterCertReq
2236 ** ssl2_RestartHandshakeAfterServerCert
2237 */ 2230 */
2238 static SECStatus 2231 static SECStatus
2239 ssl2_TryToFinish(sslSocket *ss) 2232 ssl2_TryToFinish(sslSocket *ss)
2240 { 2233 {
2241 SECStatus rv; 2234 SECStatus rv;
2242 char e, ef; 2235 char e, ef;
2243 2236
2244 PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) ); 2237 PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
2245 2238
2246 e = ss->sec.ci.elements; 2239 e = ss->sec.ci.elements;
(...skipping 13 matching lines...) Expand all
2260 /* Totally finished */ 2253 /* Totally finished */
2261 ss->handshake = 0; 2254 ss->handshake = 0;
2262 return SECSuccess; 2255 return SECSuccess;
2263 } 2256 }
2264 } 2257 }
2265 return SECSuccess; 2258 return SECSuccess;
2266 } 2259 }
2267 2260
2268 /* 2261 /*
2269 ** Called from ssl2_HandleRequestCertificate 2262 ** Called from ssl2_HandleRequestCertificate
2270 ** ssl2_RestartHandshakeAfterCertReq
2271 */ 2263 */
2272 static SECStatus 2264 static SECStatus
2273 ssl2_SignResponse(sslSocket *ss, 2265 ssl2_SignResponse(sslSocket *ss,
2274 SECKEYPrivateKey *key, 2266 SECKEYPrivateKey *key,
2275 SECItem *response) 2267 SECItem *response)
2276 { 2268 {
2277 SGNContext * sgn = NULL; 2269 SGNContext * sgn = NULL;
2278 PRUint8 * challenge; 2270 PRUint8 * challenge;
2279 unsigned int len; 2271 unsigned int len;
2280 SECStatus rv = SECFailure; 2272 SECStatus rv = SECFailure;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2347 2339
2348 /* Get certificate and private-key from client */ 2340 /* Get certificate and private-key from client */
2349 if (!ss->getClientAuthData) { 2341 if (!ss->getClientAuthData) {
2350 SSL_TRC(7, ("%d: SSL[%d]: client doesn't support client-auth", 2342 SSL_TRC(7, ("%d: SSL[%d]: client doesn't support client-auth",
2351 SSL_GETPID(), ss->fd)); 2343 SSL_GETPID(), ss->fd));
2352 goto no_cert_error; 2344 goto no_cert_error;
2353 } 2345 }
2354 ret = (*ss->getClientAuthData)(ss->getClientAuthDataArg, ss->fd, 2346 ret = (*ss->getClientAuthData)(ss->getClientAuthDataArg, ss->fd,
2355 NULL, &cert, &key); 2347 NULL, &cert, &key);
2356 if ( ret == SECWouldBlock ) { 2348 if ( ret == SECWouldBlock ) {
2357 » ssl_SetAlwaysBlock(ss); 2349 » PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SSL2);
2358 » goto done; 2350 » ret = -1;
2351 » goto loser;
2359 } 2352 }
2360 2353
2361 if (ret) { 2354 if (ret) {
2362 goto no_cert_error; 2355 goto no_cert_error;
2363 } 2356 }
2364 2357
2365 /* check what the callback function returned */ 2358 /* check what the callback function returned */
2366 if ((!cert) || (!key)) { 2359 if ((!cert) || (!key)) {
2367 /* we are missing either the key or cert */ 2360 /* we are missing either the key or cert */
2368 if (cert) { 2361 if (cert) {
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
2708 PORT_SetError(ss->sec.isServer ? SSL_ERROR_BAD_CLIENT : SSL_ERROR_BAD_SERVER ); 2701 PORT_SetError(ss->sec.isServer ? SSL_ERROR_BAD_CLIENT : SSL_ERROR_BAD_SERVER );
2709 /* FALL THROUGH */ 2702 /* FALL THROUGH */
2710 2703
2711 loser: 2704 loser:
2712 ssl_ReleaseRecvBufLock(ss); 2705 ssl_ReleaseRecvBufLock(ss);
2713 return SECFailure; 2706 return SECFailure;
2714 } 2707 }
2715 2708
2716 /************************************************************************/ 2709 /************************************************************************/
2717 2710
2718 /* Called from ssl_Do1stHandshake, after ssl2_HandleServerHelloMessage or 2711 /* Called from ssl_Do1stHandshake, after ssl2_HandleServerHelloMessage.
2719 ** ssl2_RestartHandshakeAfterServerCert.
2720 */ 2712 */
2721 static SECStatus 2713 static SECStatus
2722 ssl2_HandleVerifyMessage(sslSocket *ss) 2714 ssl2_HandleVerifyMessage(sslSocket *ss)
2723 { 2715 {
2724 PRUint8 * data; 2716 PRUint8 * data;
2725 SECStatus rv; 2717 SECStatus rv;
2726 2718
2727 PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) ); 2719 PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
2728 ssl_GetRecvBufLock(ss); 2720 ssl_GetRecvBufLock(ss);
2729 2721
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
2929 2921
2930 if (!sidHit) { 2922 if (!sidHit) {
2931 /* verify the server's certificate. if sidHit, don't check signatures */ 2923 /* verify the server's certificate. if sidHit, don't check signatures */
2932 rv = (* ss->authCertificate)(ss->authCertificateArg, ss->fd, 2924 rv = (* ss->authCertificate)(ss->authCertificateArg, ss->fd,
2933 (PRBool)(!sidHit), PR_FALSE); 2925 (PRBool)(!sidHit), PR_FALSE);
2934 if (rv) { 2926 if (rv) {
2935 if (ss->handleBadCert) { 2927 if (ss->handleBadCert) {
2936 rv = (*ss->handleBadCert)(ss->badCertArg, ss->fd); 2928 rv = (*ss->handleBadCert)(ss->badCertArg, ss->fd);
2937 if ( rv ) { 2929 if ( rv ) {
2938 if ( rv == SECWouldBlock ) { 2930 if ( rv == SECWouldBlock ) {
2939 » » /* someone will handle this connection asynchronously*/ 2931 » » SSL_DBG(("%d: SSL[%d]: SSL2 bad cert handler returned "
2940 2932 » » » "SECWouldBlock", SSL_GETPID(), ss->fd));
2941 » » SSL_DBG(("%d: SSL[%d]: go to async cert handler", 2933 » » PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SSL2);
2942 » » » SSL_GETPID(), ss->fd)); 2934 » » rv = SECFailure;
2943 » » ssl_ReleaseRecvBufLock(ss); 2935 » » } else {
2944 » » ssl_SetAlwaysBlock(ss); 2936 » » /* cert is bad */
2945 » » return SECWouldBlock; 2937 » » SSL_DBG(("%d: SSL[%d]: server certificate is no good: error= %d",
2938 » » » SSL_GETPID(), ss->fd, PORT_GetError()));
2946 } 2939 }
2947 /* cert is bad */
2948 SSL_DBG(("%d: SSL[%d]: server certificate is no good: error=%d",
2949 SSL_GETPID(), ss->fd, PORT_GetError()));
2950 goto loser; 2940 goto loser;
2951
2952 } 2941 }
2953 /* cert is good */ 2942 /* cert is good */
2954 } else { 2943 } else {
2955 SSL_DBG(("%d: SSL[%d]: server certificate is no good: error=%d", 2944 SSL_DBG(("%d: SSL[%d]: server certificate is no good: error=%d",
2956 SSL_GETPID(), ss->fd, PORT_GetError())); 2945 SSL_GETPID(), ss->fd, PORT_GetError()));
2957 goto loser; 2946 goto loser;
2958 } 2947 }
2959 } 2948 }
2960 } 2949 }
2961 /* 2950 /*
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
3118 3107
3119 if ((sid->version >= SSL_LIBRARY_VERSION_3_0 || !ss->opt.v2CompatibleHello) && 3108 if ((sid->version >= SSL_LIBRARY_VERSION_3_0 || !ss->opt.v2CompatibleHello) &&
3120 (ss->opt.enableSSL3 || ss->opt.enableTLS)) { 3109 (ss->opt.enableSSL3 || ss->opt.enableTLS)) {
3121 3110
3122 ss->gs.state = GS_INIT; 3111 ss->gs.state = GS_INIT;
3123 ss->handshake = ssl_GatherRecord1stHandshake; 3112 ss->handshake = ssl_GatherRecord1stHandshake;
3124 3113
3125 /* ssl3_SendClientHello will override this if it succeeds. */ 3114 /* ssl3_SendClientHello will override this if it succeeds. */
3126 ss->version = SSL_LIBRARY_VERSION_3_0; 3115 ss->version = SSL_LIBRARY_VERSION_3_0;
3127 3116
3128 ssl_GetXmitBufLock(ss); /***************************************/
3129 ssl_GetSSL3HandshakeLock(ss); 3117 ssl_GetSSL3HandshakeLock(ss);
3118 ssl_GetXmitBufLock(ss);
3130 rv = ssl3_SendClientHello(ss); 3119 rv = ssl3_SendClientHello(ss);
3120 ssl_ReleaseXmitBufLock(ss);
3131 ssl_ReleaseSSL3HandshakeLock(ss); 3121 ssl_ReleaseSSL3HandshakeLock(ss);
3132 ssl_ReleaseXmitBufLock(ss); /***************************************/
3133 3122
3134 return rv; 3123 return rv;
3135 } 3124 }
3136 #if defined(NSS_ENABLE_ECC) && !defined(NSS_ECC_MORE_THAN_SUITE_B) 3125 #if defined(NSS_ENABLE_ECC) && !defined(NSS_ECC_MORE_THAN_SUITE_B)
3137 /* ensure we don't neogtiate ECC cipher suites with SSL2 hello */ 3126 /* ensure we don't neogtiate ECC cipher suites with SSL2 hello */
3138 ssl3_DisableECCSuites(ss, NULL); /* disable all ECC suites */ 3127 ssl3_DisableECCSuites(ss, NULL); /* disable all ECC suites */
3139 if (ss->cipherSpecs != NULL) { 3128 if (ss->cipherSpecs != NULL) {
3140 PORT_Free(ss->cipherSpecs); 3129 PORT_Free(ss->cipherSpecs);
3141 ss->cipherSpecs = NULL; 3130 ss->cipherSpecs = NULL;
3142 ss->sizeCipherSpecs = 0; 3131 ss->sizeCipherSpecs = 0;
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
3324 bad_client: 3313 bad_client:
3325 ssl_ReleaseRecvBufLock(ss); 3314 ssl_ReleaseRecvBufLock(ss);
3326 PORT_SetError(SSL_ERROR_BAD_CLIENT); 3315 PORT_SetError(SSL_ERROR_BAD_CLIENT);
3327 /* FALLTHROUGH */ 3316 /* FALLTHROUGH */
3328 3317
3329 loser: 3318 loser:
3330 return SECFailure; 3319 return SECFailure;
3331 } 3320 }
3332 3321
3333 /* 3322 /*
3334 * attempt to restart the handshake after asynchronously handling
3335 * a request for the client's certificate.
3336 *
3337 * inputs:
3338 * cert Client cert chosen by application.
3339 * key Private key associated with cert.
3340 *
3341 * XXX: need to make ssl2 and ssl3 versions of this function agree on whether
3342 * they take the reference, or bump the ref count!
3343 *
3344 * Return value: XXX
3345 *
3346 * Caller holds 1stHandshakeLock.
3347 */
3348 int
3349 ssl2_RestartHandshakeAfterCertReq(sslSocket * ss,
3350 CERTCertificate * cert,
3351 SECKEYPrivateKey * key)
3352 {
3353 int ret;
3354 SECStatus rv = SECSuccess;
3355 SECItem response;
3356
3357 if (ss->version >= SSL_LIBRARY_VERSION_3_0)
3358 return SECFailure;
3359
3360 response.data = NULL;
3361
3362 /* generate error if no cert or key */
3363 if ( ( cert == NULL ) || ( key == NULL ) ) {
3364 goto no_cert;
3365 }
3366
3367 /* generate signed response to the challenge */
3368 rv = ssl2_SignResponse(ss, key, &response);
3369 if ( rv != SECSuccess ) {
3370 goto no_cert;
3371 }
3372
3373 /* Send response message */
3374 ret = ssl2_SendCertificateResponseMessage(ss, &cert->derCert, &response);
3375 if (ret) {
3376 goto no_cert;
3377 }
3378
3379 /* try to finish the handshake */
3380 ret = ssl2_TryToFinish(ss);
3381 if (ret) {
3382 goto loser;
3383 }
3384
3385 /* done with handshake */
3386 if (ss->handshake == 0) {
3387 ret = SECSuccess;
3388 goto done;
3389 }
3390
3391 /* continue handshake */
3392 ssl_GetRecvBufLock(ss);
3393 ss->gs.recordLen = 0;
3394 ssl_ReleaseRecvBufLock(ss);
3395
3396 ss->handshake = ssl_GatherRecord1stHandshake;
3397 ss->nextHandshake = ssl2_HandleMessage;
3398 ret = ssl2_TriggerNextMessage(ss);
3399 goto done;
3400
3401 no_cert:
3402 /* no cert - send error */
3403 ret = ssl2_SendErrorMessage(ss, SSL_PE_NO_CERTIFICATE);
3404 goto done;
3405
3406 loser:
3407 ret = SECFailure;
3408 done:
3409 /* free allocated data */
3410 if ( response.data ) {
3411 PORT_Free(response.data);
3412 }
3413
3414 return ret;
3415 }
3416
3417
3418 /* restart an SSL connection that we stopped to run certificate dialogs
3419 ** XXX Need to document here how an application marks a cert to show that
3420 ** the application has accepted it (overridden CERT_VerifyCert).
3421 *
3422 * Return value: XXX
3423 *
3424 * Caller holds 1stHandshakeLock.
3425 */
3426 int
3427 ssl2_RestartHandshakeAfterServerCert(sslSocket *ss)
3428 {
3429 int rv = SECSuccess;
3430
3431 if (ss->version >= SSL_LIBRARY_VERSION_3_0)
3432 return SECFailure;
3433
3434 /* SSL 2
3435 ** At this point we have a completed session key and our session
3436 ** cipher is setup and ready to go. Switch to encrypted write routine
3437 ** as all future message data is to be encrypted.
3438 */
3439 ssl2_UseEncryptedSendFunc(ss);
3440
3441 rv = ssl2_TryToFinish(ss);
3442 if (rv == SECSuccess && ss->handshake != NULL) {
3443 /* handshake is not yet finished. */
3444
3445 SSL_TRC(5, ("%d: SSL[%d]: got server-hello, required=0x%d got=0x%x",
3446 SSL_GETPID(), ss->fd, ss->sec.ci.requiredElements,
3447 ss->sec.ci.elements));
3448
3449 ssl_GetRecvBufLock(ss);
3450 ss->gs.recordLen = 0; /* mark it all used up. */
3451 ssl_ReleaseRecvBufLock(ss);
3452
3453 ss->handshake = ssl_GatherRecord1stHandshake;
3454 ss->nextHandshake = ssl2_HandleVerifyMessage;
3455 }
3456
3457 return rv;
3458 }
3459
3460 /*
3461 ** Handle the initial hello message from the client 3323 ** Handle the initial hello message from the client
3462 ** 3324 **
3463 ** not static because ssl2_GatherData() tests ss->nextHandshake for this value. 3325 ** not static because ssl2_GatherData() tests ss->nextHandshake for this value.
3464 */ 3326 */
3465 SECStatus 3327 SECStatus
3466 ssl2_HandleClientHelloMessage(sslSocket *ss) 3328 ssl2_HandleClientHelloMessage(sslSocket *ss)
3467 { 3329 {
3468 sslSessionID *sid; 3330 sslSessionID *sid;
3469 sslServerCerts * sc; 3331 sslServerCerts * sc;
3470 CERTCertificate *serverCert; 3332 CERTCertificate *serverCert;
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
3845 * check algorithm. This release is not backward 3707 * check algorithm. This release is not backward
3846 * compatible with previous major releases. It is 3708 * compatible with previous major releases. It is
3847 * not compatible with future major, minor, or 3709 * not compatible with future major, minor, or
3848 * patch releases. 3710 * patch releases.
3849 */ 3711 */
3850 volatile char c; /* force a reference that won't get optimized away */ 3712 volatile char c; /* force a reference that won't get optimized away */
3851 3713
3852 c = __nss_ssl_rcsid[0] + __nss_ssl_sccsid[0]; 3714 c = __nss_ssl_rcsid[0] + __nss_ssl_sccsid[0];
3853 return NSS_VersionCheck(importedVersion); 3715 return NSS_VersionCheck(importedVersion);
3854 } 3716 }
3717
3718 const char *
3719 NSSSSL_GetVersion(void)
3720 {
3721 return NSS_VERSION;
3722 }
OLDNEW
« no previous file with comments | « net/third_party/nss/ssl/sslauth.c ('k') | net/third_party/nss/ssl/sslerr.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698