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

Side by Side Diff: net/third_party/nss/ssl/ssl3ext.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/ssl3ecc.c ('k') | net/third_party/nss/ssl/ssl3gthr.c » ('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 * SSL3 Protocol 2 * SSL3 Protocol
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 23 matching lines...) Expand all
34 * under the terms of either the GPL or the LGPL, and not to allow others to 34 * under the terms of either the GPL or the LGPL, and not to allow others to
35 * use your version of this file under the terms of the MPL, indicate your 35 * use your version of this file under the terms of the MPL, indicate your
36 * decision by deleting the provisions above and replace them with the notice 36 * decision by deleting the provisions above and replace them with the notice
37 * and other provisions required by the GPL or the LGPL. If you do not delete 37 * and other provisions required by the GPL or the LGPL. If you do not delete
38 * the provisions above, a recipient may use your version of this file under 38 * the provisions above, a recipient may use your version of this file under
39 * the terms of any one of the MPL, the GPL or the LGPL. 39 * the terms of any one of the MPL, the GPL or the LGPL.
40 * 40 *
41 * ***** END LICENSE BLOCK ***** */ 41 * ***** END LICENSE BLOCK ***** */
42 42
43 /* TLS extension code moved here from ssl3ecc.c */ 43 /* TLS extension code moved here from ssl3ecc.c */
44 /* $Id: ssl3ext.c,v 1.14 2010/04/03 19:19:07 nelson%bolyard.com Exp $ */ 44 /* $Id: ssl3ext.c,v 1.21 2012/02/15 21:52:08 kaie%kuix.de Exp $ */
45 45
46 #include "nssrenam.h" 46 #include "nssrenam.h"
47 #include "nss.h" 47 #include "nss.h"
48 #include "ssl.h" 48 #include "ssl.h"
49 #include "sslimpl.h" 49 #include "sslimpl.h"
50 #include "sslproto.h" 50 #include "sslproto.h"
51 #include "pk11pub.h" 51 #include "pk11pub.h"
52 #include "blapi.h" 52 #include "blapi.h"
53 #include "prinit.h" 53 #include "prinit.h"
54 54
55 static unsigned char key_name[SESS_TICKET_KEY_NAME_LEN]; 55 static unsigned char key_name[SESS_TICKET_KEY_NAME_LEN];
56 static PK11SymKey *session_ticket_enc_key_pkcs11 = NULL; 56 static PK11SymKey *session_ticket_enc_key_pkcs11 = NULL;
57 static PK11SymKey *session_ticket_mac_key_pkcs11 = NULL; 57 static PK11SymKey *session_ticket_mac_key_pkcs11 = NULL;
58 58
59 static unsigned char session_ticket_enc_key[32]; 59 static unsigned char session_ticket_enc_key[AES_256_KEY_LENGTH];
60 static unsigned char session_ticket_mac_key[SHA256_LENGTH]; 60 static unsigned char session_ticket_mac_key[SHA256_LENGTH];
61 61
62 static PRBool session_ticket_keys_initialized = PR_FALSE; 62 static PRBool session_ticket_keys_initialized = PR_FALSE;
63 static PRCallOnceType generate_session_keys_once; 63 static PRCallOnceType generate_session_keys_once;
64 64
65 /* forward static function declarations */ 65 /* forward static function declarations */
66 static SECStatus ssl3_ParseEncryptedSessionTicket(sslSocket *ss, 66 static SECStatus ssl3_ParseEncryptedSessionTicket(sslSocket *ss,
67 SECItem *data, EncryptedSessionTicket *enc_session_ticket); 67 SECItem *data, EncryptedSessionTicket *enc_session_ticket);
68 static SECStatus ssl3_AppendToItem(SECItem *item, const unsigned char *buf, 68 static SECStatus ssl3_AppendToItem(SECItem *item, const unsigned char *buf,
69 PRUint32 bytes); 69 PRUint32 bytes);
70 static SECStatus ssl3_AppendNumberToItem(SECItem *item, PRUint32 num, 70 static SECStatus ssl3_AppendNumberToItem(SECItem *item, PRUint32 num,
71 PRInt32 lenSize); 71 PRInt32 lenSize);
72 static SECStatus ssl3_GetSessionTicketKeysPKCS11(sslSocket *ss, 72 static SECStatus ssl3_GetSessionTicketKeysPKCS11(sslSocket *ss,
73 PK11SymKey **aes_key, PK11SymKey **mac_key); 73 PK11SymKey **aes_key, PK11SymKey **mac_key);
74 static SECStatus ssl3_GetSessionTicketKeys(const unsigned char **aes_key, 74 static SECStatus ssl3_GetSessionTicketKeys(const unsigned char **aes_key,
75 PRUint32 *aes_key_length, const unsigned char **mac_key, 75 PRUint32 *aes_key_length, const unsigned char **mac_key,
76 PRUint32 *mac_key_length); 76 PRUint32 *mac_key_length);
77 static PRInt32 ssl3_SendRenegotiationInfoXtn(sslSocket * ss, 77 static PRInt32 ssl3_SendRenegotiationInfoXtn(sslSocket * ss,
78 PRBool append, PRUint32 maxBytes); 78 PRBool append, PRUint32 maxBytes);
79 static SECStatus ssl3_HandleRenegotiationInfoXtn(sslSocket *ss, 79 static SECStatus ssl3_HandleRenegotiationInfoXtn(sslSocket *ss,
80 PRUint16 ex_type, SECItem *data); 80 PRUint16 ex_type, SECItem *data);
81 static SECStatus ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss,
82 PRUint16 ex_type, SECItem *data);
83 static SECStatus ssl3_ServerHandleNextProtoNegoXtn(sslSocket *ss,
84 PRUint16 ex_type, SECItem *data);
85 static PRInt32 ssl3_ClientSendNextProtoNegoXtn(sslSocket *ss, PRBool append,
86 PRUint32 maxBytes);
81 static SECStatus ssl3_ServerHandleEncryptedClientCertsXtn(sslSocket *ss, 87 static SECStatus ssl3_ServerHandleEncryptedClientCertsXtn(sslSocket *ss,
82 PRUint16 ex_type, SECItem *data); 88 PRUint16 ex_type, SECItem *data);
83 static SECStatus ssl3_ClientHandleEncryptedClientCertsXtn(sslSocket *ss, 89 static SECStatus ssl3_ClientHandleEncryptedClientCertsXtn(sslSocket *ss,
84 PRUint16 ex_type, SECItem *data); 90 PRUint16 ex_type, SECItem *data);
85 static PRInt32 ssl3_SendEncryptedClientCertsXtn(sslSocket *ss, 91 static PRInt32 ssl3_SendEncryptedClientCertsXtn(sslSocket *ss,
86 PRBool append, PRUint32 maxBytes); 92 PRBool append, PRUint32 maxBytes);
87 93
88 /* 94 /*
89 * Write bytes. Using this function means the SECItem structure 95 * Write bytes. Using this function means the SECItem structure
90 * cannot be freed. The caller is expected to call this function 96 * cannot be freed. The caller is expected to call this function
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 /* This table is used by the server, to handle client hello extensions. */ 241 /* This table is used by the server, to handle client hello extensions. */
236 static const ssl3HelloExtensionHandler clientHelloHandlers[] = { 242 static const ssl3HelloExtensionHandler clientHelloHandlers[] = {
237 { ssl_server_name_xtn, &ssl3_HandleServerNameXtn }, 243 { ssl_server_name_xtn, &ssl3_HandleServerNameXtn },
238 #ifdef NSS_ENABLE_ECC 244 #ifdef NSS_ENABLE_ECC
239 { ssl_elliptic_curves_xtn, &ssl3_HandleSupportedCurvesXtn }, 245 { ssl_elliptic_curves_xtn, &ssl3_HandleSupportedCurvesXtn },
240 { ssl_ec_point_formats_xtn, &ssl3_HandleSupportedPointFormatsXtn }, 246 { ssl_ec_point_formats_xtn, &ssl3_HandleSupportedPointFormatsXtn },
241 #endif 247 #endif
242 { ssl_session_ticket_xtn, &ssl3_ServerHandleSessionTicketXtn }, 248 { ssl_session_ticket_xtn, &ssl3_ServerHandleSessionTicketXtn },
243 { ssl_encrypted_client_certs, &ssl3_ServerHandleEncryptedClientCertsXtn }, 249 { ssl_encrypted_client_certs, &ssl3_ServerHandleEncryptedClientCertsXtn },
244 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn }, 250 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn },
245 { ssl_next_proto_neg_xtn, &ssl3_ServerHandleNextProtoNegoXtn }, 251 { ssl_next_proto_nego_xtn, &ssl3_ServerHandleNextProtoNegoXtn },
246 { ssl_cached_info_xtn, &ssl3_ServerHandleCachedInfoXtn },
247 { ssl_ob_cert_xtn, &ssl3_ServerHandleOBCertXtn }, 252 { ssl_ob_cert_xtn, &ssl3_ServerHandleOBCertXtn },
248 { -1, NULL } 253 { -1, NULL }
249 }; 254 };
250 255
251 /* These two tables are used by the client, to handle server hello 256 /* These two tables are used by the client, to handle server hello
252 * extensions. */ 257 * extensions. */
253 static const ssl3HelloExtensionHandler serverHelloHandlersTLS[] = { 258 static const ssl3HelloExtensionHandler serverHelloHandlersTLS[] = {
254 { ssl_server_name_xtn, &ssl3_HandleServerNameXtn }, 259 { ssl_server_name_xtn, &ssl3_HandleServerNameXtn },
255 /* TODO: add a handler for ssl_ec_point_formats_xtn */ 260 /* TODO: add a handler for ssl_ec_point_formats_xtn */
256 { ssl_session_ticket_xtn, &ssl3_ClientHandleSessionTicketXtn }, 261 { ssl_session_ticket_xtn, &ssl3_ClientHandleSessionTicketXtn },
257 { ssl_encrypted_client_certs, &ssl3_ClientHandleEncryptedClientCertsXtn }, 262 { ssl_encrypted_client_certs, &ssl3_ClientHandleEncryptedClientCertsXtn },
258 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn }, 263 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn },
259 { ssl_next_proto_neg_xtn, &ssl3_ClientHandleNextProtoNegoXtn }, 264 { ssl_next_proto_nego_xtn, &ssl3_ClientHandleNextProtoNegoXtn },
260 { ssl_cached_info_xtn, &ssl3_ClientHandleCachedInfoXtn },
261 { ssl_cert_status_xtn, &ssl3_ClientHandleStatusRequestXtn }, 265 { ssl_cert_status_xtn, &ssl3_ClientHandleStatusRequestXtn },
262 { ssl_ob_cert_xtn, &ssl3_ClientHandleOBCertXtn }, 266 { ssl_ob_cert_xtn, &ssl3_ClientHandleOBCertXtn },
263 { -1, NULL } 267 { -1, NULL }
264 }; 268 };
265 269
266 static const ssl3HelloExtensionHandler serverHelloHandlersSSL3[] = { 270 static const ssl3HelloExtensionHandler serverHelloHandlersSSL3[] = {
267 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn }, 271 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn },
268 { -1, NULL } 272 { -1, NULL }
269 }; 273 };
270 274
271 /* Tables of functions to format TLS hello extensions, one function per 275 /* Tables of functions to format TLS hello extensions, one function per
272 * extension. 276 * extension.
273 * These static tables are for the formatting of client hello extensions. 277 * These static tables are for the formatting of client hello extensions.
274 * The server's table of hello senders is dynamic, in the socket struct, 278 * The server's table of hello senders is dynamic, in the socket struct,
275 * and sender functions are registered there. 279 * and sender functions are registered there.
276 */ 280 */
277 static const 281 static const
278 ssl3HelloExtensionSender clientHelloSendersTLS[SSL_MAX_EXTENSIONS] = { 282 ssl3HelloExtensionSender clientHelloSendersTLS[SSL_MAX_EXTENSIONS] = {
279 { ssl_server_name_xtn, &ssl3_SendServerNameXtn }, 283 { ssl_server_name_xtn, &ssl3_SendServerNameXtn },
280 { ssl_renegotiation_info_xtn, &ssl3_SendRenegotiationInfoXtn }, 284 { ssl_renegotiation_info_xtn, &ssl3_SendRenegotiationInfoXtn },
281 #ifdef NSS_ENABLE_ECC 285 #ifdef NSS_ENABLE_ECC
282 { ssl_elliptic_curves_xtn, &ssl3_SendSupportedCurvesXtn }, 286 { ssl_elliptic_curves_xtn, &ssl3_SendSupportedCurvesXtn },
283 { ssl_ec_point_formats_xtn, &ssl3_SendSupportedPointFormatsXtn }, 287 { ssl_ec_point_formats_xtn, &ssl3_SendSupportedPointFormatsXtn },
284 #endif 288 #endif
285 { ssl_session_ticket_xtn, &ssl3_SendSessionTicketXtn }, 289 { ssl_session_ticket_xtn, &ssl3_SendSessionTicketXtn },
286 { ssl_encrypted_client_certs, &ssl3_SendEncryptedClientCertsXtn }, 290 { ssl_encrypted_client_certs, &ssl3_SendEncryptedClientCertsXtn },
287 { ssl_next_proto_neg_xtn, &ssl3_ClientSendNextProtoNegoXtn }, 291 { ssl_next_proto_nego_xtn, &ssl3_ClientSendNextProtoNegoXtn },
288 { ssl_cached_info_xtn, &ssl3_ClientSendCachedInfoXtn },
289 { ssl_cert_status_xtn, &ssl3_ClientSendStatusRequestXtn }, 292 { ssl_cert_status_xtn, &ssl3_ClientSendStatusRequestXtn },
290 { ssl_ob_cert_xtn, &ssl3_SendOBCertXtn } 293 { ssl_ob_cert_xtn, &ssl3_SendOBCertXtn }
291 /* any extra entries will appear as { 0, NULL } */ 294 /* any extra entries will appear as { 0, NULL } */
292 }; 295 };
293 296
294 static const 297 static const
295 ssl3HelloExtensionSender clientHelloSendersSSL3[SSL_MAX_EXTENSIONS] = { 298 ssl3HelloExtensionSender clientHelloSendersSSL3[SSL_MAX_EXTENSIONS] = {
296 { ssl_renegotiation_info_xtn, &ssl3_SendRenegotiationInfoXtn } 299 { ssl_renegotiation_info_xtn, &ssl3_SendRenegotiationInfoXtn }
297 /* any extra entries will appear as { 0, NULL } */ 300 /* any extra entries will appear as { 0, NULL } */
298 }; 301 };
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 return 0; 551 return 0;
549 } 552 }
550 return extension_length; 553 return extension_length;
551 554
552 loser: 555 loser:
553 ss->xtnData.ticketTimestampVerified = PR_FALSE; 556 ss->xtnData.ticketTimestampVerified = PR_FALSE;
554 return -1; 557 return -1;
555 } 558 }
556 559
557 /* handle an incoming Next Protocol Negotiation extension. */ 560 /* handle an incoming Next Protocol Negotiation extension. */
558 SECStatus 561 static SECStatus
559 ssl3_ServerHandleNextProtoNegoXtn(sslSocket * ss, PRUint16 ex_type, SECItem *dat a) 562 ssl3_ServerHandleNextProtoNegoXtn(sslSocket * ss, PRUint16 ex_type, SECItem *dat a)
560 { 563 {
561 if (data->len != 0) { 564 if (ss->firstHsDone || data->len != 0) {
562 /* Clients MUST send an empty NPN extension, if any. */ 565 /* Clients MUST send an empty NPN extension, if any. */
566 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
563 return SECFailure; 567 return SECFailure;
564 } 568 }
565 569
566 return SECSuccess; 570 return SECSuccess;
567 } 571 }
568 572
569 /* ssl3_ValidateNextProtoNego checks that the given block of data is valid: none 573 /* ssl3_ValidateNextProtoNego checks that the given block of data is valid: none
570 * of the lengths may be 0 and the sum of the lengths must equal the length of 574 * of the lengths may be 0 and the sum of the lengths must equal the length of
571 * the block. */ 575 * the block. */
572 SECStatus 576 SECStatus
573 ssl3_ValidateNextProtoNego(const unsigned char* data, unsigned short length) 577 ssl3_ValidateNextProtoNego(const unsigned char* data, unsigned int length)
574 { 578 {
575 unsigned int offset = 0; 579 unsigned int offset = 0;
576 580
577 while (offset < length) { 581 while (offset < length) {
578 » if (data[offset] == 0) { 582 » unsigned int newOffset = offset + 1 + (unsigned int) data[offset];
583 » /* Reject embedded nulls to protect against buggy applications that
584 » * store protocol identifiers in null-terminated strings.
585 » */
586 » if (newOffset > length || data[offset] == 0) {
579 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID); 587 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
580 return SECFailure; 588 return SECFailure;
581 } 589 }
582 » offset += (unsigned int)data[offset] + 1; 590 » offset = newOffset;
583 } 591 }
584 592
585 if (offset > length) { 593 if (offset > length) {
586 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID); 594 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
587 return SECFailure; 595 return SECFailure;
588 } 596 }
589 597
590 return SECSuccess; 598 return SECSuccess;
591 } 599 }
592 600
593 SECStatus 601 static SECStatus
594 ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss, PRUint16 ex_type, 602 ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss, PRUint16 ex_type,
595 SECItem *data) 603 » » » » SECItem *data)
596 { 604 {
597 SECStatus rv; 605 SECStatus rv;
598 unsigned char result[255]; 606 unsigned char resultBuffer[255];
599 unsigned int result_len; 607 SECItem result = { siBuffer, resultBuffer, 0 };
608
609 if (ss->firstHsDone) {
610 » PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
611 » return SECFailure;
612 }
600 613
601 rv = ssl3_ValidateNextProtoNego(data->data, data->len); 614 rv = ssl3_ValidateNextProtoNego(data->data, data->len);
602 if (rv != SECSuccess) 615 if (rv != SECSuccess)
603 return rv; 616 return rv;
604 617
605 rv = ss->nextProtoCallback(ss->nextProtoArg, ss->fd, 618 /* ss->nextProtoCallback cannot normally be NULL if we negotiated the
606 data->data, data->len, 619 * extension. However, It is possible that an application erroneously
607 result, &result_len); 620 * cleared the callback between the time we sent the ClientHello and now.
621 */
622 PORT_Assert(ss->nextProtoCallback != NULL);
623 if (!ss->nextProtoCallback) {
624 » PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
625 » return SECFailure;
626 }
627
628 rv = ss->nextProtoCallback(ss->nextProtoArg, ss->fd, data->data, data->len,
629 » » » result.data, &result.len, sizeof resultBuffer);
608 if (rv != SECSuccess) 630 if (rv != SECSuccess)
609 return rv; 631 return rv;
610 /* If the callback wrote more than allowed to |result| it has corrupted our 632 /* If the callback wrote more than allowed to |result| it has corrupted our
611 * stack. */ 633 * stack. */
612 PORT_Assert(result_len <= sizeof(result)); 634 if (result.len > sizeof result) {
635 » PORT_SetError(SEC_ERROR_OUTPUT_LEN);
636 » return SECFailure;
637 }
613 638
614 if (ss->ssl3.nextProto.data) 639 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE);
615 » PORT_Free(ss->ssl3.nextProto.data); 640 return SECITEM_CopyItem(NULL, &ss->ssl3.nextProto, &result);
616 ss->ssl3.nextProto.data = PORT_Alloc(result_len);
617 PORT_Memcpy(ss->ssl3.nextProto.data, result, result_len);
618 ss->ssl3.nextProto.len = result_len;
619 return SECSuccess;
620 } 641 }
621 642
622 PRInt32 643 static PRInt32
623 ssl3_ClientSendNextProtoNegoXtn(sslSocket * ss, 644 ssl3_ClientSendNextProtoNegoXtn(sslSocket * ss, PRBool append,
624 » » » PRBool append, 645 » » » » PRUint32 maxBytes)
625 » » » PRUint32 maxBytes)
626 { 646 {
627 PRInt32 extension_length; 647 PRInt32 extension_length;
628 648
629 /* Renegotiations do not send this extension. */ 649 /* Renegotiations do not send this extension. */
630 if (!ss->nextProtoCallback || ss->firstHsDone) { 650 if (!ss->nextProtoCallback || ss->firstHsDone) {
631 return 0; 651 return 0;
632 } 652 }
633 653
634 extension_length = 4; 654 extension_length = 4;
635 655
636 if (append && maxBytes >= extension_length) { 656 if (append && maxBytes >= extension_length) {
637 SECStatus rv; 657 SECStatus rv;
638 » rv = ssl3_AppendHandshakeNumber(ss, ssl_next_proto_neg_xtn, 2); 658 » rv = ssl3_AppendHandshakeNumber(ss, ssl_next_proto_nego_xtn, 2);
639 if (rv != SECSuccess) 659 if (rv != SECSuccess)
640 goto loser; 660 goto loser;
641 rv = ssl3_AppendHandshakeNumber(ss, 0, 2); 661 rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
642 if (rv != SECSuccess) 662 if (rv != SECSuccess)
643 goto loser; 663 goto loser;
644 ss->xtnData.advertised[ss->xtnData.numAdvertised++] = 664 ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
645 » » ssl_next_proto_neg_xtn; 665 » » ssl_next_proto_nego_xtn;
646 } else if (maxBytes < extension_length) { 666 } else if (maxBytes < extension_length) {
647 return 0; 667 return 0;
648 } 668 }
649 669
650 return extension_length; 670 return extension_length;
651 671
652 loser: 672 loser:
653 return -1; 673 return -1;
654 } 674 }
655 675
656 SECStatus 676 SECStatus
657 ssl3_ClientHandleStatusRequestXtn(sslSocket *ss, PRUint16 ex_type, 677 ssl3_ClientHandleStatusRequestXtn(sslSocket *ss, PRUint16 ex_type,
658 SECItem *data) 678 SECItem *data)
659 { 679 {
660 /* If we didn't request this extension, then the server may not echo it. */ 680 /* If we didn't request this extension, then the server may not echo it. */
661 if (!ss->opt.enableOCSPStapling) 681 if (!ss->opt.enableOCSPStapling)
662 return SECFailure; 682 return SECFailure;
663 683
664 /* The echoed extension must be empty. */ 684 /* The echoed extension must be empty. */
665 if (data->len != 0) 685 if (data->len != 0)
666 return SECFailure; 686 return SECFailure;
667 687
668 ss->ssl3.hs.may_get_cert_status = PR_TRUE; 688 ss->ssl3.hs.may_get_cert_status = PR_TRUE;
669 689
670 /* Keep track of negotiated extensions. */ 690 /* Keep track of negotiated extensions. */
671 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type; 691 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
672 692
673 return SECSuccess; 693 return SECSuccess;
674 } 694 }
675 695
676 /* ssl3_ClientSendCachedInfoXtn builds the cached_info extension on the
677 * client side. */
678 PRInt32
679 ssl3_ClientSendCachedInfoXtn(sslSocket * ss, PRBool append,
680 PRUint32 maxBytes)
681 {
682 PRInt32 extension_length;
683 PRBool send_empty;
684 CERTCertificate ** predictedCertChain;
685
686 if (!ss->opt.enableCachedInfo)
687 return 0;
688
689 predictedCertChain = ss->ssl3.predictedCertChain;
690 send_empty = (predictedCertChain == NULL);
691
692 /* minimum extension:
693 * extension_type (2-bytes) +
694 * length(extension_data) (2-bytes) +
695 * length(cached_info) (2-bytes) +
696 */
697 extension_length = send_empty ? 6 : 16;
698
699 if (append && maxBytes >= extension_length) {
700 SECStatus rv;
701
702 /* ExtensionType */
703 rv = ssl3_AppendHandshakeNumber(ss, ssl_cached_info_xtn, 2);
704 if (rv != SECSuccess)
705 return -1;
706 /* Extension Length */
707 rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2);
708 if (rv != SECSuccess)
709 return -1;
710 if (send_empty) {
711 /* Cached Information Length */
712 rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
713 if (rv != SECSuccess)
714 return -1;
715 } else {
716 PRUint64 certChainHash;
717 int i;
718 PRUint8* digestPtr = (PRUint8*) &certChainHash;
719
720 /* Cached Information Length */
721 rv = ssl3_AppendHandshakeNumber(ss, 10, 2);
722 if (rv != SECSuccess)
723 return -1;
724 /* Cached Information Type */
725 rv = ssl3_AppendHandshakeNumber(ss, 1 /* certificate_chain */, 1);
726 if (rv != SECSuccess)
727 return -1;
728 /* hash length */
729 rv = ssl3_AppendHandshakeNumber(ss, 8, 1);
730 if (rv != SECSuccess)
731 return -1;
732 /* hash */
733 FNV1A64_Init(&certChainHash);
734 for (i = 0; predictedCertChain[i] != NULL; i++) {
735 unsigned int certLen = predictedCertChain[i]->derCert.len;
736 unsigned char certLenArray[3] = {
737 certLen >> 16,
738 certLen >> 8,
739 certLen
740 };
741 FNV1A64_Update(&certChainHash, certLenArray, 3);
742 FNV1A64_Update(&certChainHash,
743 predictedCertChain[i]->derCert.data, certLen);
744 }
745 FNV1A64_Final(&certChainHash);
746 rv = ssl3_AppendHandshake(ss, &certChainHash, 8);
747 if (rv != SECSuccess)
748 return -1;
749 for (i = 0; i < 8; i++) {
750 ss->ssl3.certChainDigest[i] = digestPtr[i];
751 }
752 }
753
754 } else if (maxBytes < extension_length) {
755 PORT_Assert(0);
756 return 0;
757 }
758 ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
759 ssl_cached_info_xtn;
760 return extension_length;
761 }
762
763 SECStatus
764 ssl3_ServerHandleCachedInfoXtn(sslSocket *ss, PRUint16 ex_type,
765 SECItem *data)
766 {
767 SECStatus rv;
768 unsigned char *cached_info = data->data;
769 unsigned int remaining_len;
770
771 /* Ignore the extension if it isn't enabled. */
772 if (!ss->opt.enableCachedInfo)
773 return SECSuccess;
774
775 if (data->len < 2)
776 return SECFailure;
777 remaining_len = (cached_info[0] << 8) | cached_info[1];
778 if (remaining_len > 2048 || remaining_len != data->len - 2)
779 return SECFailure;
780 cached_info += 2;
781
782 /* Handle reconnaissance case. */
783 if (remaining_len == 0) {
784 /* The client supports information caching, but provides no information
785 * about what information types it supports */
786 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
787 rv = ssl3_RegisterServerHelloExtensionSender(ss, ex_type,
788 ssl3_ServerSendCachedInfoXtn);
789 return rv;
790 }
791
792 /* Iterate over the CachedObjects and pick the first item of type
793 * certificate_chain, while ignoring everything else. */
794 while (remaining_len >= 2) {
795 unsigned char cached_object_type = *cached_info++;
796 unsigned int cached_object_length = *cached_info++;
797 remaining_len -= 2;
798 if (remaining_len < cached_object_length)
799 return SECFailure;
800 if (cached_object_length != 8) /* The digest must be present. */
801 return SECFailure;
802 if (cached_object_type == cached_info_certificate_chain &&
803 !ss->ssl3.cachedInfoCertChainDigestReceived) {
804 ss->ssl3.cachedInfoCertChainDigestReceived = PR_TRUE;
805 memcpy(ss->ssl3.certChainDigest, cached_info, 8);
806 }
807 remaining_len -= cached_object_length;
808 cached_info += cached_object_length;
809 }
810
811 if (remaining_len != 0)
812 return SECFailure;
813
814 if (ss->ssl3.cachedInfoCertChainDigestReceived) {
815 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
816 rv = ssl3_RegisterServerHelloExtensionSender(ss, ex_type,
817 ssl3_ServerSendCachedInfoXtn);
818 return SECSuccess;
819 }
820
821 return SECSuccess;
822 }
823
824 /* ssl3_ServerSendCachedInfoXtn builds the cached_info extension on the
825 * server side. */
826 PRInt32
827 ssl3_ServerSendCachedInfoXtn(sslSocket * ss, PRBool append,
828 PRUint32 maxBytes)
829 {
830 PRInt32 extension_length = 2 /* extension type */ +
831 2 /* extension length */ +
832 2 /* cached_info length */ +
833 1 /* CachedInformationType */ +
834 1 /* hash value length (0) */;
835 SECStatus rv;
836
837 PORT_Assert(ss->opt.enableCachedInfo);
838
839 if (append && maxBytes >= extension_length) {
840 /* ExtensionType */
841 rv = ssl3_AppendHandshakeNumber(ss, ssl_cached_info_xtn, 2);
842 if (rv != SECSuccess)
843 return -1;
844 /* Extension Length */
845 rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2);
846 if (rv != SECSuccess)
847 return -1;
848 /* Cached Information Length */
849 rv = ssl3_AppendHandshakeNumber(ss, 2, 2);
850 if (rv != SECSuccess)
851 return -1;
852 /* Cached Information Type */
853 rv = ssl3_AppendHandshakeNumber(ss, 1 /* certificate_chain */, 1);
854 if (rv != SECSuccess)
855 return -1;
856 /* hash length */
857 rv = ssl3_AppendHandshakeNumber(ss, 0, 1);
858 if (rv != SECSuccess)
859 return -1;
860 } else if (maxBytes < extension_length) {
861 PORT_Assert(0);
862 return 0;
863 }
864
865 return extension_length;
866 }
867
868 SECStatus
869 ssl3_ClientHandleCachedInfoXtn(sslSocket *ss, PRUint16 ex_type,
870 SECItem *data)
871 {
872 unsigned char * cached_info = data->data;
873 unsigned int remaining_cached_info_length;
874 PRBool has_correct_cert_chain = PR_FALSE;
875
876 /* If we didn't request this extension, then the server may not echo it. */
877 if (!ss->opt.enableCachedInfo)
878 return SECFailure;
879
880 if (data->len == 0) {
881 /* The server supports information caching, but provides no information
882 * about what information types it supports */
883 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
884 return SECSuccess;
885 }
886
887 if (data->len < 2)
888 return SECFailure;
889 remaining_cached_info_length = (cached_info[0] << 8) | cached_info[1];
890 if (remaining_cached_info_length != data->len - 2)
891 return SECFailure;
892 cached_info += 2;
893 while (remaining_cached_info_length >= 2) {
894 /* The server supports only those CachedInformationType types that are
895 * identified by a present CachedObject */
896 unsigned char cached_object_type;
897 unsigned int cached_object_length;
898 unsigned char cached_object_digest[8];
899 cached_object_type = *cached_info++;
900 cached_object_length = *cached_info++;
901 remaining_cached_info_length -= 2;
902 if (remaining_cached_info_length < cached_object_length)
903 return SECFailure;
904 if (cached_object_length != 0 && cached_object_length != 8)
905 return SECFailure;
906 remaining_cached_info_length -= cached_object_length;
907 if (cached_object_type == cached_info_certificate_chain) {
908 if (cached_object_length == 0)
909 has_correct_cert_chain = PR_TRUE;
910 else { /* Hashes must match */
911 int i;
912 for (i = 0; i < 8; i++)
913 cached_object_digest[i] = *cached_info++;
914 if (!memcmp(cached_object_digest, ss->ssl3.certChainDigest, 8))
915 has_correct_cert_chain = PR_TRUE;
916 }
917 }
918 }
919
920 if (remaining_cached_info_length != 0)
921 return SECFailure;
922
923 if (has_correct_cert_chain) {
924 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
925 return SECSuccess;
926 }
927
928 return SECFailure;
929 }
930
931 /* ssl3_ClientSendStatusRequestXtn builds the status_request extension on the 696 /* ssl3_ClientSendStatusRequestXtn builds the status_request extension on the
932 * client side. See RFC 4366 section 3.6. */ 697 * client side. See RFC 4366 section 3.6. */
933 PRInt32 698 PRInt32
934 ssl3_ClientSendStatusRequestXtn(sslSocket * ss, PRBool append, 699 ssl3_ClientSendStatusRequestXtn(sslSocket * ss, PRBool append,
935 PRUint32 maxBytes) 700 PRUint32 maxBytes)
936 { 701 {
937 PRInt32 extension_length; 702 PRInt32 extension_length;
938 703
939 if (!ss->opt.enableOCSPStapling) 704 if (!ss->opt.enableOCSPStapling)
940 return 0; 705 return 0;
(...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after
1719 ss->sec.ci.sid = sid; 1484 ss->sec.ci.sid = sid;
1720 } 1485 }
1721 } 1486 }
1722 1487
1723 if (0) { 1488 if (0) {
1724 no_ticket: 1489 no_ticket:
1725 SSL_DBG(("%d: SSL[%d]: Session ticket parsing failed.", 1490 SSL_DBG(("%d: SSL[%d]: Session ticket parsing failed.",
1726 SSL_GETPID(), ss->fd)); 1491 SSL_GETPID(), ss->fd));
1727 ssl3stats = SSL_GetStatistics(); 1492 ssl3stats = SSL_GetStatistics();
1728 SSL_AtomicIncrementLong(& ssl3stats->hch_sid_ticket_parse_failures ); 1493 SSL_AtomicIncrementLong(& ssl3stats->hch_sid_ticket_parse_failures );
1729 if (sid) {
1730 ssl_FreeSID(sid);
1731 sid = NULL;
1732 }
1733 } 1494 }
1734 rv = SECSuccess; 1495 rv = SECSuccess;
1735 1496
1736 loser: 1497 loser:
1498 /* ss->sec.ci.sid == sid if it did NOT come here via goto statement
1499 * in that case do not free sid
1500 */
1501 if (sid && (ss->sec.ci.sid != sid)) {
1502 ssl_FreeSID(sid);
1503 sid = NULL;
1504 }
1737 if (decrypted_state != NULL) { 1505 if (decrypted_state != NULL) {
1738 SECITEM_FreeItem(decrypted_state, PR_TRUE); 1506 SECITEM_FreeItem(decrypted_state, PR_TRUE);
1739 decrypted_state = NULL; 1507 decrypted_state = NULL;
1740 } 1508 }
1741 1509
1742 if (parsed_session_ticket != NULL) { 1510 if (parsed_session_ticket != NULL) {
1743 if (parsed_session_ticket->peer_cert.data) { 1511 if (parsed_session_ticket->peer_cert.data) {
1744 SECITEM_FreeItem(&parsed_session_ticket->peer_cert, PR_FALSE); 1512 SECITEM_FreeItem(&parsed_session_ticket->peer_cert, PR_FALSE);
1745 } 1513 }
1746 PORT_ZFree(parsed_session_ticket, sizeof(SessionTicket)); 1514 PORT_ZFree(parsed_session_ticket, sizeof(SessionTicket));
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
2094 1862
2095 /* The echoed extension must be empty. */ 1863 /* The echoed extension must be empty. */
2096 if (data->len != 0) 1864 if (data->len != 0)
2097 return SECFailure; 1865 return SECFailure;
2098 1866
2099 /* Keep track of negotiated extensions. */ 1867 /* Keep track of negotiated extensions. */
2100 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type; 1868 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
2101 1869
2102 return SECSuccess; 1870 return SECSuccess;
2103 } 1871 }
OLDNEW
« no previous file with comments | « net/third_party/nss/ssl/ssl3ecc.c ('k') | net/third_party/nss/ssl/ssl3gthr.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698