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

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

Issue 1511123006: Uprev NSS (in libssl) to NSS 3.21 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updated deps Created 5 years 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
« 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 /* -*- 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 /* TLS extension code moved here from ssl3ecc.c */ 9 /* TLS extension code moved here from ssl3ecc.c */
10 10
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 PRBool append, 94 PRBool append,
95 PRUint32 maxBytes); 95 PRUint32 maxBytes);
96 static SECStatus ssl3_ClientHandleSignedCertTimestampXtn(sslSocket *ss, 96 static SECStatus ssl3_ClientHandleSignedCertTimestampXtn(sslSocket *ss,
97 PRUint16 ex_type, 97 PRUint16 ex_type,
98 SECItem *data); 98 SECItem *data);
99 99
100 static PRInt32 ssl3_ClientSendDraftVersionXtn(sslSocket *ss, PRBool append, 100 static PRInt32 ssl3_ClientSendDraftVersionXtn(sslSocket *ss, PRBool append,
101 PRUint32 maxBytes); 101 PRUint32 maxBytes);
102 static SECStatus ssl3_ServerHandleDraftVersionXtn(sslSocket *ss, PRUint16 ex_typ e, 102 static SECStatus ssl3_ServerHandleDraftVersionXtn(sslSocket *ss, PRUint16 ex_typ e,
103 SECItem *data); 103 SECItem *data);
104 static PRInt32 ssl3_SendExtendedMasterSecretXtn(sslSocket *ss, PRBool append,
105 PRUint32 maxBytes);
106 static SECStatus ssl3_HandleExtendedMasterSecretXtn(sslSocket *ss,
107 PRUint16 ex_type,
108 SECItem *data);
109
104 110
105 /* 111 /*
106 * Write bytes. Using this function means the SECItem structure 112 * Write bytes. Using this function means the SECItem structure
107 * cannot be freed. The caller is expected to call this function 113 * cannot be freed. The caller is expected to call this function
108 * on a shallow copy of the structure. 114 * on a shallow copy of the structure.
109 */ 115 */
110 static SECStatus 116 static SECStatus
111 ssl3_AppendToItem(SECItem *item, const unsigned char *buf, PRUint32 bytes) 117 ssl3_AppendToItem(SECItem *item, const unsigned char *buf, PRUint32 bytes)
112 { 118 {
113 if (bytes > item->len) 119 if (bytes > item->len)
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 { ssl_ec_point_formats_xtn, &ssl3_HandleSupportedPointFormatsXtn }, 265 { ssl_ec_point_formats_xtn, &ssl3_HandleSupportedPointFormatsXtn },
260 #endif 266 #endif
261 { ssl_session_ticket_xtn, &ssl3_ServerHandleSessionTicketXtn }, 267 { ssl_session_ticket_xtn, &ssl3_ServerHandleSessionTicketXtn },
262 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn }, 268 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn },
263 { ssl_next_proto_nego_xtn, &ssl3_ServerHandleNextProtoNegoXtn }, 269 { ssl_next_proto_nego_xtn, &ssl3_ServerHandleNextProtoNegoXtn },
264 { ssl_app_layer_protocol_xtn, &ssl3_ServerHandleAppProtoXtn }, 270 { ssl_app_layer_protocol_xtn, &ssl3_ServerHandleAppProtoXtn },
265 { ssl_use_srtp_xtn, &ssl3_ServerHandleUseSRTPXtn }, 271 { ssl_use_srtp_xtn, &ssl3_ServerHandleUseSRTPXtn },
266 { ssl_cert_status_xtn, &ssl3_ServerHandleStatusRequestXtn }, 272 { ssl_cert_status_xtn, &ssl3_ServerHandleStatusRequestXtn },
267 { ssl_signature_algorithms_xtn, &ssl3_ServerHandleSigAlgsXtn }, 273 { ssl_signature_algorithms_xtn, &ssl3_ServerHandleSigAlgsXtn },
268 { ssl_tls13_draft_version_xtn, &ssl3_ServerHandleDraftVersionXtn }, 274 { ssl_tls13_draft_version_xtn, &ssl3_ServerHandleDraftVersionXtn },
275 { ssl_extended_master_secret_xtn, &ssl3_HandleExtendedMasterSecretXtn },
269 { -1, NULL } 276 { -1, NULL }
270 }; 277 };
271 278
272 /* These two tables are used by the client, to handle server hello 279 /* These two tables are used by the client, to handle server hello
273 * extensions. */ 280 * extensions. */
274 static const ssl3HelloExtensionHandler serverHelloHandlersTLS[] = { 281 static const ssl3HelloExtensionHandler serverHelloHandlersTLS[] = {
275 { ssl_server_name_xtn, &ssl3_HandleServerNameXtn }, 282 { ssl_server_name_xtn, &ssl3_HandleServerNameXtn },
276 /* TODO: add a handler for ssl_ec_point_formats_xtn */ 283 /* TODO: add a handler for ssl_ec_point_formats_xtn */
277 { ssl_session_ticket_xtn, &ssl3_ClientHandleSessionTicketXtn }, 284 { ssl_session_ticket_xtn, &ssl3_ClientHandleSessionTicketXtn },
278 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn }, 285 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn },
279 { ssl_next_proto_nego_xtn, &ssl3_ClientHandleNextProtoNegoXtn }, 286 { ssl_next_proto_nego_xtn, &ssl3_ClientHandleNextProtoNegoXtn },
280 { ssl_app_layer_protocol_xtn, &ssl3_ClientHandleAppProtoXtn }, 287 { ssl_app_layer_protocol_xtn, &ssl3_ClientHandleAppProtoXtn },
281 { ssl_use_srtp_xtn, &ssl3_ClientHandleUseSRTPXtn }, 288 { ssl_use_srtp_xtn, &ssl3_ClientHandleUseSRTPXtn },
282 { ssl_channel_id_xtn, &ssl3_ClientHandleChannelIDXtn }, 289 { ssl_channel_id_xtn, &ssl3_ClientHandleChannelIDXtn },
283 { ssl_cert_status_xtn, &ssl3_ClientHandleStatusRequestXtn }, 290 { ssl_cert_status_xtn, &ssl3_ClientHandleStatusRequestXtn },
291 { ssl_extended_master_secret_xtn, &ssl3_HandleExtendedMasterSecretXtn },
284 { ssl_signed_certificate_timestamp_xtn, 292 { ssl_signed_certificate_timestamp_xtn,
285 &ssl3_ClientHandleSignedCertTimestampXtn }, 293 &ssl3_ClientHandleSignedCertTimestampXtn },
286 { -1, NULL } 294 { -1, NULL }
287 }; 295 };
288 296
289 static const ssl3HelloExtensionHandler serverHelloHandlersSSL3[] = { 297 static const ssl3HelloExtensionHandler serverHelloHandlersSSL3[] = {
290 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn }, 298 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn },
291 { -1, NULL } 299 { -1, NULL }
292 }; 300 };
293 301
(...skipping 18 matching lines...) Expand all
312 { ssl_channel_id_xtn, &ssl3_ClientSendChannelIDXtn }, 320 { ssl_channel_id_xtn, &ssl3_ClientSendChannelIDXtn },
313 { ssl_cert_status_xtn, &ssl3_ClientSendStatusRequestXtn }, 321 { ssl_cert_status_xtn, &ssl3_ClientSendStatusRequestXtn },
314 { ssl_signed_certificate_timestamp_xtn, 322 { ssl_signed_certificate_timestamp_xtn,
315 &ssl3_ClientSendSignedCertTimestampXtn }, 323 &ssl3_ClientSendSignedCertTimestampXtn },
316 /* WebSphere Application Server 7.0 is intolerant to the last extension 324 /* WebSphere Application Server 7.0 is intolerant to the last extension
317 * being zero-length. It is not intolerant of TLS 1.2, so ensure that 325 * being zero-length. It is not intolerant of TLS 1.2, so ensure that
318 * signature_algorithms is at the end to guarantee a non-empty 326 * signature_algorithms is at the end to guarantee a non-empty
319 * extension. */ 327 * extension. */
320 { ssl_signature_algorithms_xtn, &ssl3_ClientSendSigAlgsXtn }, 328 { ssl_signature_algorithms_xtn, &ssl3_ClientSendSigAlgsXtn },
321 { ssl_tls13_draft_version_xtn, &ssl3_ClientSendDraftVersionXtn }, 329 { ssl_tls13_draft_version_xtn, &ssl3_ClientSendDraftVersionXtn },
330 { ssl_extended_master_secret_xtn, &ssl3_SendExtendedMasterSecretXtn},
322 /* any extra entries will appear as { 0, NULL } */ 331 /* any extra entries will appear as { 0, NULL } */
323 }; 332 };
324 333
325 static const 334 static const
326 ssl3HelloExtensionSender clientHelloSendersSSL3[SSL_MAX_EXTENSIONS] = { 335 ssl3HelloExtensionSender clientHelloSendersSSL3[SSL_MAX_EXTENSIONS] = {
327 { ssl_renegotiation_info_xtn, &ssl3_SendRenegotiationInfoXtn } 336 { ssl_renegotiation_info_xtn, &ssl3_SendRenegotiationInfoXtn }
328 /* any extra entries will appear as { 0, NULL } */ 337 /* any extra entries will appear as { 0, NULL } */
329 }; 338 };
330 339
331 static PRBool 340 static PRBool
332 arrayContainsExtension(const PRUint16 *array, PRUint32 len, PRUint16 ex_type) 341 arrayContainsExtension(const PRUint16 *array, PRUint32 len, PRUint16 ex_type)
333 { 342 {
334 int i; 343 unsigned int i;
335 for (i = 0; i < len; i++) { 344 for (i = 0; i < len; i++) {
336 if (ex_type == array[i]) 345 if (ex_type == array[i])
337 return PR_TRUE; 346 return PR_TRUE;
338 } 347 }
339 return PR_FALSE; 348 return PR_FALSE;
340 } 349 }
341 350
342 PRBool 351 PRBool
343 ssl3_ExtensionNegotiated(sslSocket *ss, PRUint16 ex_type) { 352 ssl3_ExtensionNegotiated(sslSocket *ss, PRUint16 ex_type) {
344 TLSExtensionData *xtnData = &ss->xtnData; 353 TLSExtensionData *xtnData = &ss->xtnData;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 return SECSuccess; /* ignore extension */ 435 return SECSuccess; /* ignore extension */
427 } 436 }
428 437
429 /* Server side - consume client data and register server sender. */ 438 /* Server side - consume client data and register server sender. */
430 /* do not parse the data if don't have user extension handling function. */ 439 /* do not parse the data if don't have user extension handling function. */
431 if (!ss->sniSocketConfig) { 440 if (!ss->sniSocketConfig) {
432 return SECSuccess; 441 return SECSuccess;
433 } 442 }
434 /* length of server_name_list */ 443 /* length of server_name_list */
435 listLenBytes = ssl3_ConsumeHandshakeNumber(ss, 2, &data->data, &data->len); 444 listLenBytes = ssl3_ConsumeHandshakeNumber(ss, 2, &data->data, &data->len);
436 if (listLenBytes < 0 || listLenBytes != data->len) { 445 if (listLenBytes < 0) {
446 return SECFailure;
447 }
448 if (listLenBytes == 0 || listLenBytes != data->len) {
437 (void)ssl3_DecodeError(ss); 449 (void)ssl3_DecodeError(ss);
438 return SECFailure; 450 return SECFailure;
439 } 451 }
440 if (listLenBytes == 0) {
441 return SECSuccess; /* ignore an empty extension */
442 }
443 ldata = *data; 452 ldata = *data;
444 /* Calculate the size of the array.*/ 453 /* Calculate the size of the array.*/
445 while (listLenBytes > 0) { 454 while (listLenBytes > 0) {
446 SECItem litem; 455 SECItem litem;
447 SECStatus rv; 456 SECStatus rv;
448 PRInt32 type; 457 PRInt32 type;
449 /* Skip Name Type (sni_host_name); checks are on the second pass */ 458 /* Skip Name Type (sni_host_name); checks are on the second pass */
450 type = ssl3_ConsumeHandshakeNumber(ss, 1, &ldata.data, &ldata.len); 459 type = ssl3_ConsumeHandshakeNumber(ss, 1, &ldata.data, &ldata.len);
451 if (type < 0) { /* i.e., SECFailure cast to PRint32 */ 460 if (type < 0) { /* i.e., SECFailure cast to PRint32 */
452 return SECFailure; 461 return SECFailure;
453 } 462 }
454 rv = ssl3_ConsumeHandshakeVariable(ss, &litem, 2, &ldata.data, &ldata.le n); 463 rv = ssl3_ConsumeHandshakeVariable(ss, &litem, 2, &ldata.data, &ldata.le n);
455 if (rv != SECSuccess) { 464 if (rv != SECSuccess) {
456 return rv; 465 return rv;
457 } 466 }
458 /* Adjust total length for consumed item, item len and type.*/ 467 /* Adjust total length for consumed item, item len and type.*/
459 listLenBytes -= litem.len + 3; 468 listLenBytes -= litem.len + 3;
460 if (listLenBytes > 0 && !ldata.len) { 469 if (listLenBytes > 0 && !ldata.len) {
461 (void)ssl3_DecodeError(ss); 470 (void)ssl3_DecodeError(ss);
462 return SECFailure; 471 return SECFailure;
463 } 472 }
464 listCount += 1; 473 listCount += 1;
465 } 474 }
466 if (!listCount) {
467 return SECFailure; /* nothing we can act on */
468 }
469 names = PORT_ZNewArray(SECItem, listCount); 475 names = PORT_ZNewArray(SECItem, listCount);
470 if (!names) { 476 if (!names) {
471 return SECFailure; 477 return SECFailure;
472 } 478 }
473 for (i = 0;i < listCount;i++) { 479 for (i = 0;i < listCount;i++) {
474 int j; 480 unsigned int j;
475 PRInt32 type; 481 PRInt32 type;
476 SECStatus rv; 482 SECStatus rv;
477 PRBool nametypePresent = PR_FALSE; 483 PRBool nametypePresent = PR_FALSE;
478 /* Name Type (sni_host_name) */ 484 /* Name Type (sni_host_name) */
479 type = ssl3_ConsumeHandshakeNumber(ss, 1, &data->data, &data->len); 485 type = ssl3_ConsumeHandshakeNumber(ss, 1, &data->data, &data->len);
480 /* Check if we have such type in the list */ 486 /* Check if we have such type in the list */
481 for (j = 0;j < listCount && names[j].data;j++) { 487 for (j = 0;j < listCount && names[j].data;j++) {
482 /* TODO bug 998524: .type is not assigned a value */ 488 /* TODO bug 998524: .type is not assigned a value */
483 if (names[j].type == type) { 489 if (names[j].type == type) {
484 nametypePresent = PR_TRUE; 490 nametypePresent = PR_TRUE;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 } else if (!append && 558 } else if (!append &&
553 (session_ticket->ticket_lifetime_hint == 0 || 559 (session_ticket->ticket_lifetime_hint == 0 ||
554 (session_ticket->ticket_lifetime_hint + 560 (session_ticket->ticket_lifetime_hint +
555 session_ticket->received_timestamp > ssl_Time()))) { 561 session_ticket->received_timestamp > ssl_Time()))) {
556 extension_length += session_ticket->ticket.len; 562 extension_length += session_ticket->ticket.len;
557 ss->xtnData.ticketTimestampVerified = PR_TRUE; 563 ss->xtnData.ticketTimestampVerified = PR_TRUE;
558 } 564 }
559 } 565 }
560 } 566 }
561 567
562 if (append && maxBytes >= extension_length) { 568 if (maxBytes < (PRUint32)extension_length) {
569 PORT_Assert(0);
570 return 0;
571 }
572 if (append) {
563 SECStatus rv; 573 SECStatus rv;
564 /* extension_type */ 574 /* extension_type */
565 rv = ssl3_AppendHandshakeNumber(ss, ssl_session_ticket_xtn, 2); 575 rv = ssl3_AppendHandshakeNumber(ss, ssl_session_ticket_xtn, 2);
566 if (rv != SECSuccess) 576 if (rv != SECSuccess)
567 goto loser; 577 goto loser;
568 if (session_ticket && session_ticket->ticket.data && 578 if (session_ticket && session_ticket->ticket.data &&
569 ss->xtnData.ticketTimestampVerified) { 579 ss->xtnData.ticketTimestampVerified) {
570 rv = ssl3_AppendHandshakeVariable(ss, session_ticket->ticket.data, 580 rv = ssl3_AppendHandshakeVariable(ss, session_ticket->ticket.data,
571 session_ticket->ticket.len, 2); 581 session_ticket->ticket.len, 2);
572 ss->xtnData.ticketTimestampVerified = PR_FALSE; 582 ss->xtnData.ticketTimestampVerified = PR_FALSE;
573 ss->xtnData.sentSessionTicketInClientHello = PR_TRUE; 583 ss->xtnData.sentSessionTicketInClientHello = PR_TRUE;
574 } else { 584 } else {
575 rv = ssl3_AppendHandshakeNumber(ss, 0, 2); 585 rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
576 } 586 }
577 if (rv != SECSuccess) 587 if (rv != SECSuccess)
578 goto loser; 588 goto loser;
579 589
580 if (!ss->sec.isServer) { 590 if (!ss->sec.isServer) {
581 TLSExtensionData *xtnData = &ss->xtnData; 591 TLSExtensionData *xtnData = &ss->xtnData;
582 xtnData->advertised[xtnData->numAdvertised++] = 592 xtnData->advertised[xtnData->numAdvertised++] =
583 ssl_session_ticket_xtn; 593 ssl_session_ticket_xtn;
584 } 594 }
585 } else if (maxBytes < extension_length) {
586 PORT_Assert(0);
587 return 0;
588 } 595 }
589 return extension_length; 596 return extension_length;
590 597
591 loser: 598 loser:
592 ss->xtnData.ticketTimestampVerified = PR_FALSE; 599 ss->xtnData.ticketTimestampVerified = PR_FALSE;
593 return -1; 600 return -1;
594 } 601 }
595 602
596 /* handle an incoming Next Protocol Negotiation extension. */ 603 /* handle an incoming Next Protocol Negotiation extension. */
597 static SECStatus 604 static SECStatus
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 /* protocol selection handler for ALPN (server side) and NPN (client side) */ 645 /* protocol selection handler for ALPN (server side) and NPN (client side) */
639 static SECStatus 646 static SECStatus
640 ssl3_SelectAppProtocol(sslSocket *ss, PRUint16 ex_type, SECItem *data) 647 ssl3_SelectAppProtocol(sslSocket *ss, PRUint16 ex_type, SECItem *data)
641 { 648 {
642 SECStatus rv; 649 SECStatus rv;
643 unsigned char resultBuffer[255]; 650 unsigned char resultBuffer[255];
644 SECItem result = { siBuffer, resultBuffer, 0 }; 651 SECItem result = { siBuffer, resultBuffer, 0 };
645 652
646 rv = ssl3_ValidateNextProtoNego(data->data, data->len); 653 rv = ssl3_ValidateNextProtoNego(data->data, data->len);
647 if (rv != SECSuccess) { 654 if (rv != SECSuccess) {
655 (void)SSL3_SendAlert(ss, alert_fatal, decode_error);
648 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID); 656 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
649 (void)SSL3_SendAlert(ss, alert_fatal, decode_error);
650 return rv; 657 return rv;
651 } 658 }
652 659
653 PORT_Assert(ss->nextProtoCallback); 660 PORT_Assert(ss->nextProtoCallback);
661 /* For ALPN, the cipher suite isn't selected yet. Note that extensions
662 * sometimes affect what cipher suite is selected, e.g., for ECC. */
663 PORT_Assert((ss->ssl3.hs.preliminaryInfo &
664 ssl_preinfo_all & ~ssl_preinfo_cipher_suite) ==
665 (ssl_preinfo_all & ~ssl_preinfo_cipher_suite));
654 rv = ss->nextProtoCallback(ss->nextProtoArg, ss->fd, data->data, data->len, 666 rv = ss->nextProtoCallback(ss->nextProtoArg, ss->fd, data->data, data->len,
655 result.data, &result.len, sizeof(resultBuffer)); 667 result.data, &result.len, sizeof(resultBuffer));
656 if (rv != SECSuccess) { 668 if (rv != SECSuccess) {
657 /* Expect callback to call PORT_SetError() */ 669 /* Expect callback to call PORT_SetError() */
658 (void)SSL3_SendAlert(ss, alert_fatal, internal_error); 670 (void)SSL3_SendAlert(ss, alert_fatal, internal_error);
659 return SECFailure; 671 return SECFailure;
660 } 672 }
661 673
662 /* If the callback wrote more than allowed to |result| it has corrupted our 674 /* If the callback wrote more than allowed to |result| it has corrupted our
663 * stack. */ 675 * stack. */
664 if (result.len > sizeof(resultBuffer)) { 676 if (result.len > sizeof(resultBuffer)) {
665 PORT_SetError(SEC_ERROR_OUTPUT_LEN); 677 PORT_SetError(SEC_ERROR_OUTPUT_LEN);
666 /* TODO: crash */ 678 /* TODO: crash */
667 return SECFailure; 679 return SECFailure;
668 } 680 }
669 681
670 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); 682 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE);
671 683
672 if (ex_type == ssl_app_layer_protocol_xtn && 684 if (ex_type == ssl_app_layer_protocol_xtn &&
673 ss->ssl3.nextProtoState != SSL_NEXT_PROTO_NEGOTIATED) { 685 ss->ssl3.nextProtoState != SSL_NEXT_PROTO_NEGOTIATED) {
674 /* The callback might say OK, but then it picks a default value - one 686 /* The callback might say OK, but then it picks a default value - one
675 * that was not listed. That's OK for NPN, but not ALPN. */ 687 * that was not listed. That's OK for NPN, but not ALPN. */
688 (void)SSL3_SendAlert(ss, alert_fatal, no_application_protocol);
676 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_NO_PROTOCOL); 689 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_NO_PROTOCOL);
677 (void)SSL3_SendAlert(ss, alert_fatal, no_application_protocol);
678 return SECFailure; 690 return SECFailure;
679 } 691 }
680 692
681 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type; 693 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
682 return SECITEM_CopyItem(NULL, &ss->ssl3.nextProto, &result); 694 return SECITEM_CopyItem(NULL, &ss->ssl3.nextProto, &result);
683 } 695 }
684 696
685 /* handle an incoming ALPN extension at the server */ 697 /* handle an incoming ALPN extension at the server */
686 static SECStatus 698 static SECStatus
687 ssl3_ServerHandleAppProtoXtn(sslSocket *ss, PRUint16 ex_type, SECItem *data) 699 ssl3_ServerHandleAppProtoXtn(sslSocket *ss, PRUint16 ex_type, SECItem *data)
688 { 700 {
689 int count; 701 int count;
690 SECStatus rv; 702 SECStatus rv;
691 703
692 /* We expressly don't want to allow ALPN on renegotiation, 704 /* We expressly don't want to allow ALPN on renegotiation,
693 * despite it being permitted by the spec. */ 705 * despite it being permitted by the spec. */
694 if (ss->firstHsDone || data->len == 0) { 706 if (ss->firstHsDone || data->len == 0) {
695 /* Clients MUST send a non-empty ALPN extension. */ 707 /* Clients MUST send a non-empty ALPN extension. */
708 (void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
696 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID); 709 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
697 (void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
698 return SECFailure; 710 return SECFailure;
699 } 711 }
700 712
701 /* Unlike NPN, ALPN has extra redundant length information so that 713 /* Unlike NPN, ALPN has extra redundant length information so that
702 * the extension is the same in both ClientHello and ServerHello. */ 714 * the extension is the same in both ClientHello and ServerHello. */
703 count = ssl3_ConsumeHandshakeNumber(ss, 2, &data->data, &data->len); 715 count = ssl3_ConsumeHandshakeNumber(ss, 2, &data->data, &data->len);
704 if (count != data->len) { 716 if (count != data->len) {
705 (void)ssl3_DecodeError(ss); 717 (void)ssl3_DecodeError(ss);
706 return SECFailure; 718 return SECFailure;
707 } 719 }
708 720
709 if (!ss->nextProtoCallback) { 721 if (!ss->nextProtoCallback) {
710 /* we're not configured for it */ 722 /* we're not configured for it */
711 return SECSuccess; 723 return SECSuccess;
712 } 724 }
713 725
714 rv = ssl3_SelectAppProtocol(ss, ex_type, data); 726 rv = ssl3_SelectAppProtocol(ss, ex_type, data);
715 if (rv != SECSuccess) { 727 if (rv != SECSuccess) {
716 return rv; 728 return rv;
717 } 729 }
718 730
719 /* prepare to send back a response, if we negotiated */ 731 /* prepare to send back a response, if we negotiated */
720 if (ss->ssl3.nextProtoState == SSL_NEXT_PROTO_NEGOTIATED) { 732 if (ss->ssl3.nextProtoState == SSL_NEXT_PROTO_NEGOTIATED) {
721 rv = ssl3_RegisterServerHelloExtensionSender( 733 rv = ssl3_RegisterServerHelloExtensionSender(
722 ss, ex_type, ssl3_ServerSendAppProtoXtn); 734 ss, ex_type, ssl3_ServerSendAppProtoXtn);
723 if (rv != SECSuccess) { 735 if (rv != SECSuccess) {
736 (void)SSL3_SendAlert(ss, alert_fatal, internal_error);
724 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 737 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
725 (void)SSL3_SendAlert(ss, alert_fatal, internal_error);
726 return rv; 738 return rv;
727 } 739 }
728 } 740 }
729 return SECSuccess; 741 return SECSuccess;
730 } 742 }
731 743
732 static SECStatus 744 static SECStatus
733 ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss, PRUint16 ex_type, 745 ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss, PRUint16 ex_type,
734 SECItem *data) 746 SECItem *data)
735 { 747 {
736 PORT_Assert(!ss->firstHsDone); 748 PORT_Assert(!ss->firstHsDone);
737 749
738 if (ssl3_ExtensionNegotiated(ss, ssl_app_layer_protocol_xtn)) { 750 if (ssl3_ExtensionNegotiated(ss, ssl_app_layer_protocol_xtn)) {
739 /* If the server negotiated ALPN then it has already told us what 751 /* If the server negotiated ALPN then it has already told us what
740 * protocol to use, so it doesn't make sense for us to try to negotiate 752 * protocol to use, so it doesn't make sense for us to try to negotiate
741 * a different one by sending the NPN handshake message. However, if 753 * a different one by sending the NPN handshake message. However, if
742 * we've negotiated NPN then we're required to send the NPN handshake 754 * we've negotiated NPN then we're required to send the NPN handshake
743 * message. Thus, these two extensions cannot both be negotiated on the 755 * message. Thus, these two extensions cannot both be negotiated on the
744 * same connection. */ 756 * same connection. */
757 (void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
745 PORT_SetError(SSL_ERROR_BAD_SERVER); 758 PORT_SetError(SSL_ERROR_BAD_SERVER);
746 (void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
747 return SECFailure; 759 return SECFailure;
748 } 760 }
749 761
750 /* We should only get this call if we sent the extension, so 762 /* We should only get this call if we sent the extension, so
751 * ss->nextProtoCallback needs to be non-NULL. However, it is possible 763 * ss->nextProtoCallback needs to be non-NULL. However, it is possible
752 * that an application erroneously cleared the callback between the time 764 * that an application erroneously cleared the callback between the time
753 * we sent the ClientHello and now. */ 765 * we sent the ClientHello and now. */
754 if (!ss->nextProtoCallback) { 766 if (!ss->nextProtoCallback) {
755 PORT_Assert(0); 767 PORT_Assert(0);
768 (void)SSL3_SendAlert(ss, alert_fatal, internal_error);
756 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_NO_CALLBACK); 769 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_NO_CALLBACK);
757 (void)SSL3_SendAlert(ss, alert_fatal, internal_error);
758 return SECFailure; 770 return SECFailure;
759 } 771 }
760 772
761 return ssl3_SelectAppProtocol(ss, ex_type, data); 773 return ssl3_SelectAppProtocol(ss, ex_type, data);
762 } 774 }
763 775
764 static SECStatus 776 static SECStatus
765 ssl3_ClientHandleAppProtoXtn(sslSocket *ss, PRUint16 ex_type, SECItem *data) 777 ssl3_ClientHandleAppProtoXtn(sslSocket *ss, PRUint16 ex_type, SECItem *data)
766 { 778 {
767 SECStatus rv; 779 SECStatus rv;
768 PRInt32 list_len; 780 PRInt32 list_len;
769 SECItem protocol_name; 781 SECItem protocol_name;
770 782
771 if (ssl3_ExtensionNegotiated(ss, ssl_next_proto_nego_xtn)) { 783 if (ssl3_ExtensionNegotiated(ss, ssl_next_proto_nego_xtn)) {
772 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 784 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
773 return SECFailure; 785 return SECFailure;
774 } 786 }
775 787
776 /* The extension data from the server has the following format: 788 /* The extension data from the server has the following format:
777 * uint16 name_list_len; 789 * uint16 name_list_len;
778 * uint8 len; // where len >= 1 790 * uint8 len; // where len >= 1
779 * uint8 protocol_name[len]; */ 791 * uint8 protocol_name[len]; */
780 if (data->len < 4 || data->len > 2 + 1 + 255) { 792 if (data->len < 4 || data->len > 2 + 1 + 255) {
793 (void)SSL3_SendAlert(ss, alert_fatal, decode_error);
781 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID); 794 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
782 (void)SSL3_SendAlert(ss, alert_fatal, decode_error);
783 return SECFailure; 795 return SECFailure;
784 } 796 }
785 797
786 list_len = ssl3_ConsumeHandshakeNumber(ss, 2, &data->data, &data->len); 798 list_len = ssl3_ConsumeHandshakeNumber(ss, 2, &data->data, &data->len);
787 /* The list has to be the entire extension. */ 799 /* The list has to be the entire extension. */
788 if (list_len != data->len) { 800 if (list_len != data->len) {
801 (void)SSL3_SendAlert(ss, alert_fatal, decode_error);
789 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID); 802 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
790 (void)SSL3_SendAlert(ss, alert_fatal, decode_error);
791 return SECFailure; 803 return SECFailure;
792 } 804 }
793 805
794 rv = ssl3_ConsumeHandshakeVariable(ss, &protocol_name, 1, 806 rv = ssl3_ConsumeHandshakeVariable(ss, &protocol_name, 1,
795 &data->data, &data->len); 807 &data->data, &data->len);
796 /* The list must have exactly one value. */ 808 /* The list must have exactly one value. */
797 if (rv != SECSuccess || data->len != 0) { 809 if (rv != SECSuccess || data->len != 0) {
810 (void)SSL3_SendAlert(ss, alert_fatal, decode_error);
798 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID); 811 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
799 (void)SSL3_SendAlert(ss, alert_fatal, decode_error);
800 return SECFailure; 812 return SECFailure;
801 } 813 }
802 814
803 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); 815 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE);
804 ss->ssl3.nextProtoState = SSL_NEXT_PROTO_SELECTED; 816 ss->ssl3.nextProtoState = SSL_NEXT_PROTO_SELECTED;
805 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type; 817 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
806 return SECITEM_CopyItem(NULL, &ss->ssl3.nextProto, &protocol_name); 818 return SECITEM_CopyItem(NULL, &ss->ssl3.nextProto, &protocol_name);
807 } 819 }
808 820
809 static PRInt32 821 static PRInt32
810 ssl3_ClientSendNextProtoNegoXtn(sslSocket * ss, PRBool append, 822 ssl3_ClientSendNextProtoNegoXtn(sslSocket * ss, PRBool append,
811 PRUint32 maxBytes) 823 PRUint32 maxBytes)
812 { 824 {
813 PRInt32 extension_length; 825 PRInt32 extension_length;
814 826
815 /* Renegotiations do not send this extension. */ 827 /* Renegotiations do not send this extension. */
816 if (!ss->opt.enableNPN || !ss->nextProtoCallback || ss->firstHsDone) { 828 if (!ss->opt.enableNPN || !ss->nextProtoCallback || ss->firstHsDone) {
817 return 0; 829 return 0;
818 } 830 }
819 831
820 extension_length = 4; 832 extension_length = 4;
821 833
822 if (append && maxBytes >= extension_length) { 834 if (maxBytes < (PRUint32)extension_length) {
835 return 0;
836 }
837 if (append) {
823 SECStatus rv; 838 SECStatus rv;
824 rv = ssl3_AppendHandshakeNumber(ss, ssl_next_proto_nego_xtn, 2); 839 rv = ssl3_AppendHandshakeNumber(ss, ssl_next_proto_nego_xtn, 2);
825 if (rv != SECSuccess) 840 if (rv != SECSuccess)
826 goto loser; 841 goto loser;
827 rv = ssl3_AppendHandshakeNumber(ss, 0, 2); 842 rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
828 if (rv != SECSuccess) 843 if (rv != SECSuccess)
829 goto loser; 844 goto loser;
830 ss->xtnData.advertised[ss->xtnData.numAdvertised++] = 845 ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
831 ssl_next_proto_nego_xtn; 846 ssl_next_proto_nego_xtn;
832 } else if (maxBytes < extension_length) {
833 return 0;
834 } 847 }
835 848
836 return extension_length; 849 return extension_length;
837 850
838 loser: 851 loser:
839 return -1; 852 return -1;
840 } 853 }
841 854
842 static PRInt32 855 static PRInt32
843 ssl3_ClientSendAppProtoXtn(sslSocket * ss, PRBool append, PRUint32 maxBytes) 856 ssl3_ClientSendAppProtoXtn(sslSocket * ss, PRBool append, PRUint32 maxBytes)
844 { 857 {
845 PRInt32 extension_length; 858 PRInt32 extension_length;
846 unsigned char *alpn_protos = NULL; 859 unsigned char *alpn_protos = NULL;
847 860
848 /* Renegotiations do not send this extension. */ 861 /* Renegotiations do not send this extension. */
849 if (!ss->opt.enableALPN || !ss->opt.nextProtoNego.data || ss->firstHsDone) { 862 if (!ss->opt.enableALPN || !ss->opt.nextProtoNego.data || ss->firstHsDone) {
850 return 0; 863 return 0;
851 } 864 }
852 865
853 extension_length = 2 /* extension type */ + 2 /* extension length */ + 866 extension_length = 2 /* extension type */ + 2 /* extension length */ +
854 2 /* protocol name list length */ + 867 2 /* protocol name list length */ +
855 ss->opt.nextProtoNego.len; 868 ss->opt.nextProtoNego.len;
856 869
857 if (append && maxBytes >= extension_length) { 870 if (maxBytes < (PRUint32)extension_length) {
871 return 0;
872 }
873 if (append) {
858 /* NPN requires that the client's fallback protocol is first in the 874 /* NPN requires that the client's fallback protocol is first in the
859 * list. However, ALPN sends protocols in preference order. So we 875 * list. However, ALPN sends protocols in preference order. So we
860 * allocate a buffer and move the first protocol to the end of the 876 * allocate a buffer and move the first protocol to the end of the
861 * list. */ 877 * list. */
862 SECStatus rv; 878 SECStatus rv;
863 const unsigned int len = ss->opt.nextProtoNego.len; 879 const unsigned int len = ss->opt.nextProtoNego.len;
864 880
865 alpn_protos = PORT_Alloc(len); 881 alpn_protos = PORT_Alloc(len);
866 if (alpn_protos == NULL) { 882 if (alpn_protos == NULL) {
867 return SECFailure; 883 return SECFailure;
(...skipping 19 matching lines...) Expand all
887 goto loser; 903 goto loser;
888 } 904 }
889 rv = ssl3_AppendHandshakeVariable(ss, alpn_protos, len, 2); 905 rv = ssl3_AppendHandshakeVariable(ss, alpn_protos, len, 2);
890 PORT_Free(alpn_protos); 906 PORT_Free(alpn_protos);
891 alpn_protos = NULL; 907 alpn_protos = NULL;
892 if (rv != SECSuccess) { 908 if (rv != SECSuccess) {
893 goto loser; 909 goto loser;
894 } 910 }
895 ss->xtnData.advertised[ss->xtnData.numAdvertised++] = 911 ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
896 ssl_app_layer_protocol_xtn; 912 ssl_app_layer_protocol_xtn;
897 } else if (maxBytes < extension_length) {
898 return 0;
899 } 913 }
900 914
901 return extension_length; 915 return extension_length;
902 916
903 loser: 917 loser:
904 if (alpn_protos) { 918 if (alpn_protos) {
905 PORT_Free(alpn_protos); 919 PORT_Free(alpn_protos);
906 } 920 }
907 return -1; 921 return -1;
908 } 922 }
909 923
910 static PRInt32 924 static PRInt32
911 ssl3_ServerSendAppProtoXtn(sslSocket * ss, PRBool append, PRUint32 maxBytes) 925 ssl3_ServerSendAppProtoXtn(sslSocket * ss, PRBool append, PRUint32 maxBytes)
912 { 926 {
913 PRInt32 extension_length; 927 PRInt32 extension_length;
914 928
915 /* we're in over our heads if any of these fail */ 929 /* we're in over our heads if any of these fail */
916 PORT_Assert(ss->opt.enableALPN); 930 PORT_Assert(ss->opt.enableALPN);
917 PORT_Assert(ss->ssl3.nextProto.data); 931 PORT_Assert(ss->ssl3.nextProto.data);
918 PORT_Assert(ss->ssl3.nextProto.len > 0); 932 PORT_Assert(ss->ssl3.nextProto.len > 0);
919 PORT_Assert(ss->ssl3.nextProtoState == SSL_NEXT_PROTO_NEGOTIATED); 933 PORT_Assert(ss->ssl3.nextProtoState == SSL_NEXT_PROTO_NEGOTIATED);
920 PORT_Assert(!ss->firstHsDone); 934 PORT_Assert(!ss->firstHsDone);
921 935
922 extension_length = 2 /* extension type */ + 2 /* extension length */ + 936 extension_length = 2 /* extension type */ + 2 /* extension length */ +
923 2 /* protocol name list */ + 1 /* name length */ + 937 2 /* protocol name list */ + 1 /* name length */ +
924 ss->ssl3.nextProto.len; 938 ss->ssl3.nextProto.len;
925 939
926 if (append && maxBytes >= extension_length) { 940 if (maxBytes < (PRUint32)extension_length) {
941 return 0;
942 }
943 if (append) {
927 SECStatus rv; 944 SECStatus rv;
928 rv = ssl3_AppendHandshakeNumber(ss, ssl_app_layer_protocol_xtn, 2); 945 rv = ssl3_AppendHandshakeNumber(ss, ssl_app_layer_protocol_xtn, 2);
929 if (rv != SECSuccess) { 946 if (rv != SECSuccess) {
930 return -1; 947 return -1;
931 } 948 }
932 rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2); 949 rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2);
933 if (rv != SECSuccess) { 950 if (rv != SECSuccess) {
934 return -1; 951 return -1;
935 } 952 }
936 rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3.nextProto.len + 1, 2); 953 rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3.nextProto.len + 1, 2);
937 if (rv != SECSuccess) { 954 if (rv != SECSuccess) {
938 return -1; 955 return -1;
939 } 956 }
940 rv = ssl3_AppendHandshakeVariable(ss, ss->ssl3.nextProto.data, 957 rv = ssl3_AppendHandshakeVariable(ss, ss->ssl3.nextProto.data,
941 ss->ssl3.nextProto.len, 1); 958 ss->ssl3.nextProto.len, 1);
942 if (rv != SECSuccess) { 959 if (rv != SECSuccess) {
943 return -1; 960 return -1;
944 } 961 }
945 } else if (maxBytes < extension_length) {
946 return 0;
947 } 962 }
948 963
949 return extension_length; 964 return extension_length;
950 } 965 }
951 966
952 static SECStatus 967 static SECStatus
953 ssl3_ClientHandleChannelIDXtn(sslSocket *ss, PRUint16 ex_type, 968 ssl3_ClientHandleChannelIDXtn(sslSocket *ss, PRUint16 ex_type,
954 SECItem *data) 969 SECItem *data)
955 { 970 {
956 PORT_Assert(ss->getChannelID != NULL); 971 PORT_Assert(ss->getChannelID != NULL);
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 */ 1053 */
1039 if (ss->certStatusArray[i] && ss->certStatusArray[i]->len) { 1054 if (ss->certStatusArray[i] && ss->certStatusArray[i]->len) {
1040 haveStatus = PR_TRUE; 1055 haveStatus = PR_TRUE;
1041 break; 1056 break;
1042 } 1057 }
1043 } 1058 }
1044 if (!haveStatus) 1059 if (!haveStatus)
1045 return 0; 1060 return 0;
1046 1061
1047 extension_length = 2 + 2; 1062 extension_length = 2 + 2;
1048 if (append && maxBytes >= extension_length) { 1063 if (maxBytes < (PRUint32)extension_length) {
1064 return 0;
1065 }
1066 if (append) {
1049 /* extension_type */ 1067 /* extension_type */
1050 rv = ssl3_AppendHandshakeNumber(ss, ssl_cert_status_xtn, 2); 1068 rv = ssl3_AppendHandshakeNumber(ss, ssl_cert_status_xtn, 2);
1051 if (rv != SECSuccess) 1069 if (rv != SECSuccess)
1052 return -1; 1070 return -1;
1053 /* length of extension_data */ 1071 /* length of extension_data */
1054 rv = ssl3_AppendHandshakeNumber(ss, 0, 2); 1072 rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
1055 if (rv != SECSuccess) 1073 if (rv != SECSuccess)
1056 return -1; 1074 return -1;
1057 } 1075 }
1058 1076
(...skipping 12 matching lines...) Expand all
1071 return 0; 1089 return 0;
1072 1090
1073 /* extension_type (2-bytes) + 1091 /* extension_type (2-bytes) +
1074 * length(extension_data) (2-bytes) + 1092 * length(extension_data) (2-bytes) +
1075 * status_type (1) + 1093 * status_type (1) +
1076 * responder_id_list length (2) + 1094 * responder_id_list length (2) +
1077 * request_extensions length (2) 1095 * request_extensions length (2)
1078 */ 1096 */
1079 extension_length = 9; 1097 extension_length = 9;
1080 1098
1081 if (append && maxBytes >= extension_length) { 1099 if (maxBytes < (PRUint32)extension_length) {
1100 PORT_Assert(0);
1101 return 0;
1102 }
1103 if (append) {
1082 SECStatus rv; 1104 SECStatus rv;
1083 TLSExtensionData *xtnData; 1105 TLSExtensionData *xtnData;
1084 1106
1085 /* extension_type */ 1107 /* extension_type */
1086 rv = ssl3_AppendHandshakeNumber(ss, ssl_cert_status_xtn, 2); 1108 rv = ssl3_AppendHandshakeNumber(ss, ssl_cert_status_xtn, 2);
1087 if (rv != SECSuccess) 1109 if (rv != SECSuccess)
1088 return -1; 1110 return -1;
1089 rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2); 1111 rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2);
1090 if (rv != SECSuccess) 1112 if (rv != SECSuccess)
1091 return -1; 1113 return -1;
1092 rv = ssl3_AppendHandshakeNumber(ss, 1 /* status_type ocsp */, 1); 1114 rv = ssl3_AppendHandshakeNumber(ss, 1 /* status_type ocsp */, 1);
1093 if (rv != SECSuccess) 1115 if (rv != SECSuccess)
1094 return -1; 1116 return -1;
1095 /* A zero length responder_id_list means that the responders are 1117 /* A zero length responder_id_list means that the responders are
1096 * implicitly known to the server. */ 1118 * implicitly known to the server. */
1097 rv = ssl3_AppendHandshakeNumber(ss, 0, 2); 1119 rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
1098 if (rv != SECSuccess) 1120 if (rv != SECSuccess)
1099 return -1; 1121 return -1;
1100 /* A zero length request_extensions means that there are no extensions. 1122 /* A zero length request_extensions means that there are no extensions.
1101 * Specifically, we don't set the id-pkix-ocsp-nonce extension. This 1123 * Specifically, we don't set the id-pkix-ocsp-nonce extension. This
1102 * means that the server can replay a cached OCSP response to us. */ 1124 * means that the server can replay a cached OCSP response to us. */
1103 rv = ssl3_AppendHandshakeNumber(ss, 0, 2); 1125 rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
1104 if (rv != SECSuccess) 1126 if (rv != SECSuccess)
1105 return -1; 1127 return -1;
1106 1128
1107 xtnData = &ss->xtnData; 1129 xtnData = &ss->xtnData;
1108 xtnData->advertised[xtnData->numAdvertised++] = ssl_cert_status_xtn; 1130 xtnData->advertised[xtnData->numAdvertised++] = ssl_cert_status_xtn;
1109 } else if (maxBytes < extension_length) {
1110 PORT_Assert(0);
1111 return 0;
1112 } 1131 }
1113 return extension_length; 1132 return extension_length;
1114 } 1133 }
1115 1134
1116 /* 1135 /*
1117 * NewSessionTicket 1136 * NewSessionTicket
1118 * Called from ssl3_HandleFinished 1137 * Called from ssl3_HandleFinished
1119 */ 1138 */
1120 SECStatus 1139 SECStatus
1121 ssl3_SendNewSessionTicket(sslSocket *ss) 1140 ssl3_SendNewSessionTicket(sslSocket *ss)
1122 { 1141 {
1123 int i; 1142 PRUint32 i;
1124 SECStatus rv; 1143 SECStatus rv;
1125 NewSessionTicket ticket; 1144 NewSessionTicket ticket;
1126 SECItem plaintext; 1145 SECItem plaintext;
1127 SECItem plaintext_item = {0, NULL, 0}; 1146 SECItem plaintext_item = {0, NULL, 0};
1128 SECItem ciphertext = {0, NULL, 0}; 1147 SECItem ciphertext = {0, NULL, 0};
1129 PRUint32 ciphertext_length; 1148 PRUint32 ciphertext_length;
1130 PRBool ms_is_wrapped; 1149 PRBool ms_is_wrapped;
1131 unsigned char wrapped_ms[SSL3_MASTER_SECRET_LENGTH]; 1150 unsigned char wrapped_ms[SSL3_MASTER_SECRET_LENGTH];
1132 SECItem ms_item = {0, NULL, 0}; 1151 SECItem ms_item = {0, NULL, 0};
1133 SSL3KEAType effectiveExchKeyType = ssl_kea_null; 1152 SSL3KEAType effectiveExchKeyType = ssl_kea_null;
(...skipping 11 matching lines...) Expand all
1145 PRUint32 mac_key_length; 1164 PRUint32 mac_key_length;
1146 PRUint64 aes_ctx_buf[MAX_CIPHER_CONTEXT_LLONGS]; 1165 PRUint64 aes_ctx_buf[MAX_CIPHER_CONTEXT_LLONGS];
1147 AESContext *aes_ctx; 1166 AESContext *aes_ctx;
1148 const SECHashObject *hashObj = NULL; 1167 const SECHashObject *hashObj = NULL;
1149 PRUint64 hmac_ctx_buf[MAX_MAC_CONTEXT_LLONGS]; 1168 PRUint64 hmac_ctx_buf[MAX_MAC_CONTEXT_LLONGS];
1150 HMACContext *hmac_ctx; 1169 HMACContext *hmac_ctx;
1151 #endif 1170 #endif
1152 CK_MECHANISM_TYPE cipherMech = CKM_AES_CBC; 1171 CK_MECHANISM_TYPE cipherMech = CKM_AES_CBC;
1153 PK11Context *aes_ctx_pkcs11; 1172 PK11Context *aes_ctx_pkcs11;
1154 CK_MECHANISM_TYPE macMech = CKM_SHA256_HMAC; 1173 CK_MECHANISM_TYPE macMech = CKM_SHA256_HMAC;
1155 PK11Context *hmac_ctx_pkcs11; 1174 PK11Context *hmac_ctx_pkcs11 = NULL;
1156 unsigned char computed_mac[TLS_EX_SESS_TICKET_MAC_LENGTH]; 1175 unsigned char computed_mac[TLS_EX_SESS_TICKET_MAC_LENGTH];
1157 unsigned int computed_mac_length; 1176 unsigned int computed_mac_length;
1158 unsigned char iv[AES_BLOCK_SIZE]; 1177 unsigned char iv[AES_BLOCK_SIZE];
1159 SECItem ivItem; 1178 SECItem ivItem;
1160 SECItem *srvName = NULL; 1179 SECItem *srvName = NULL;
1161 PRUint32 srvNameLen = 0; 1180 PRUint32 srvNameLen = 0;
1162 CK_MECHANISM_TYPE msWrapMech = 0; /* dummy default value, 1181 CK_MECHANISM_TYPE msWrapMech = 0; /* dummy default value,
1163 * must be >= 0 */ 1182 * must be >= 0 */
1164 1183
1165 SSL_TRC(3, ("%d: SSL3[%d]: send session_ticket handshake", 1184 SSL_TRC(3, ("%d: SSL3[%d]: send session_ticket handshake",
(...skipping 27 matching lines...) Expand all
1193 if (ss->ssl3.pwSpec->msItem.len && ss->ssl3.pwSpec->msItem.data) { 1212 if (ss->ssl3.pwSpec->msItem.len && ss->ssl3.pwSpec->msItem.data) {
1194 /* The master secret is available unwrapped. */ 1213 /* The master secret is available unwrapped. */
1195 ms_item.data = ss->ssl3.pwSpec->msItem.data; 1214 ms_item.data = ss->ssl3.pwSpec->msItem.data;
1196 ms_item.len = ss->ssl3.pwSpec->msItem.len; 1215 ms_item.len = ss->ssl3.pwSpec->msItem.len;
1197 ms_is_wrapped = PR_FALSE; 1216 ms_is_wrapped = PR_FALSE;
1198 } else { 1217 } else {
1199 /* Extract the master secret wrapped. */ 1218 /* Extract the master secret wrapped. */
1200 sslSessionID sid; 1219 sslSessionID sid;
1201 PORT_Memset(&sid, 0, sizeof(sslSessionID)); 1220 PORT_Memset(&sid, 0, sizeof(sslSessionID));
1202 1221
1203 if (ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa) { 1222 if (ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa ||
1223 ss->ssl3.hs.kea_def->kea == kea_dhe_rsa) {
1204 effectiveExchKeyType = kt_rsa; 1224 effectiveExchKeyType = kt_rsa;
1205 } else { 1225 } else {
1206 effectiveExchKeyType = ss->ssl3.hs.kea_def->exchKeyType; 1226 effectiveExchKeyType = ss->ssl3.hs.kea_def->exchKeyType;
1207 } 1227 }
1208 1228
1209 rv = ssl3_CacheWrappedMasterSecret(ss, &sid, ss->ssl3.pwSpec, 1229 rv = ssl3_CacheWrappedMasterSecret(ss, &sid, ss->ssl3.pwSpec,
1210 effectiveExchKeyType); 1230 effectiveExchKeyType);
1211 if (rv == SECSuccess) { 1231 if (rv == SECSuccess) {
1212 if (sid.u.ssl3.keys.wrapped_master_secret_len > sizeof(wrapped_ms)) 1232 if (sid.u.ssl3.keys.wrapped_master_secret_len > sizeof(wrapped_ms))
1213 goto loser; 1233 goto loser;
(...skipping 22 matching lines...) Expand all
1236 + 10 /* cipher spec parameters */ 1256 + 10 /* cipher spec parameters */
1237 + 1 /* SessionTicket.ms_is_wrapped */ 1257 + 1 /* SessionTicket.ms_is_wrapped */
1238 + 1 /* effectiveExchKeyType */ 1258 + 1 /* effectiveExchKeyType */
1239 + 4 /* msWrapMech */ 1259 + 4 /* msWrapMech */
1240 + 2 /* master_secret.length */ 1260 + 2 /* master_secret.length */
1241 + ms_item.len /* master_secret */ 1261 + ms_item.len /* master_secret */
1242 + 1 /* client_auth_type */ 1262 + 1 /* client_auth_type */
1243 + cert_length /* cert */ 1263 + cert_length /* cert */
1244 + 1 /* server name type */ 1264 + 1 /* server name type */
1245 + srvNameLen /* name len + length field */ 1265 + srvNameLen /* name len + length field */
1266 + 1 /* extendedMasterSecretUsed */
1246 + sizeof(ticket.ticket_lifetime_hint); 1267 + sizeof(ticket.ticket_lifetime_hint);
1247 padding_length = AES_BLOCK_SIZE - 1268 padding_length = AES_BLOCK_SIZE -
1248 (ciphertext_length % AES_BLOCK_SIZE); 1269 (ciphertext_length % AES_BLOCK_SIZE);
1249 ciphertext_length += padding_length; 1270 ciphertext_length += padding_length;
1250 1271
1251 message_length = 1272 message_length =
1252 sizeof(ticket.ticket_lifetime_hint) /* ticket_lifetime_hint */ 1273 sizeof(ticket.ticket_lifetime_hint) /* ticket_lifetime_hint */
1253 + 2 /* length field for NewSessionTicket.ticket */ 1274 + 2 /* length field for NewSessionTicket.ticket */
1254 + SESS_TICKET_KEY_NAME_LEN /* key_name */ 1275 + SESS_TICKET_KEY_NAME_LEN /* key_name */
1255 + AES_BLOCK_SIZE /* iv */ 1276 + AES_BLOCK_SIZE /* iv */
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1334 if (rv != SECSuccess) goto loser; 1355 if (rv != SECSuccess) goto loser;
1335 rv = ssl3_AppendToItem(&plaintext, srvName->data, srvName->len); 1356 rv = ssl3_AppendToItem(&plaintext, srvName->data, srvName->len);
1336 if (rv != SECSuccess) goto loser; 1357 if (rv != SECSuccess) goto loser;
1337 } else { 1358 } else {
1338 /* No Name */ 1359 /* No Name */
1339 rv = ssl3_AppendNumberToItem(&plaintext, (char)TLS_STE_NO_SERVER_NAME, 1360 rv = ssl3_AppendNumberToItem(&plaintext, (char)TLS_STE_NO_SERVER_NAME,
1340 1); 1361 1);
1341 if (rv != SECSuccess) goto loser; 1362 if (rv != SECSuccess) goto loser;
1342 } 1363 }
1343 1364
1365 /* extendedMasterSecretUsed */
1366 rv = ssl3_AppendNumberToItem(
1367 &plaintext, ss->sec.ci.sid->u.ssl3.keys.extendedMasterSecretUsed, 1);
1368 if (rv != SECSuccess) goto loser;
1369
1344 PORT_Assert(plaintext.len == padding_length); 1370 PORT_Assert(plaintext.len == padding_length);
1345 for (i = 0; i < padding_length; i++) 1371 for (i = 0; i < padding_length; i++)
1346 plaintext.data[i] = (unsigned char)padding_length; 1372 plaintext.data[i] = (unsigned char)padding_length;
1347 1373
1348 if (SECITEM_AllocItem(NULL, &ciphertext, ciphertext_length) == NULL) { 1374 if (SECITEM_AllocItem(NULL, &ciphertext, ciphertext_length) == NULL) {
1349 rv = SECFailure; 1375 rv = SECFailure;
1350 goto loser; 1376 goto loser;
1351 } 1377 }
1352 1378
1353 /* Generate encrypted portion of ticket. */ 1379 /* Generate encrypted portion of ticket. */
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1403 { 1429 {
1404 SECItem macParam; 1430 SECItem macParam;
1405 macParam.data = NULL; 1431 macParam.data = NULL;
1406 macParam.len = 0; 1432 macParam.len = 0;
1407 hmac_ctx_pkcs11 = PK11_CreateContextBySymKey(macMech, 1433 hmac_ctx_pkcs11 = PK11_CreateContextBySymKey(macMech,
1408 CKA_SIGN, mac_key_pkcs11, &macParam); 1434 CKA_SIGN, mac_key_pkcs11, &macParam);
1409 if (!hmac_ctx_pkcs11) 1435 if (!hmac_ctx_pkcs11)
1410 goto loser; 1436 goto loser;
1411 1437
1412 rv = PK11_DigestBegin(hmac_ctx_pkcs11); 1438 rv = PK11_DigestBegin(hmac_ctx_pkcs11);
1439 if (rv != SECSuccess) goto loser;
1413 rv = PK11_DigestOp(hmac_ctx_pkcs11, key_name, 1440 rv = PK11_DigestOp(hmac_ctx_pkcs11, key_name,
1414 SESS_TICKET_KEY_NAME_LEN); 1441 SESS_TICKET_KEY_NAME_LEN);
1442 if (rv != SECSuccess) goto loser;
1415 rv = PK11_DigestOp(hmac_ctx_pkcs11, iv, sizeof(iv)); 1443 rv = PK11_DigestOp(hmac_ctx_pkcs11, iv, sizeof(iv));
1444 if (rv != SECSuccess) goto loser;
1416 rv = PK11_DigestOp(hmac_ctx_pkcs11, (unsigned char *)length_buf, 2); 1445 rv = PK11_DigestOp(hmac_ctx_pkcs11, (unsigned char *)length_buf, 2);
1446 if (rv != SECSuccess) goto loser;
1417 rv = PK11_DigestOp(hmac_ctx_pkcs11, ciphertext.data, ciphertext.len); 1447 rv = PK11_DigestOp(hmac_ctx_pkcs11, ciphertext.data, ciphertext.len);
1448 if (rv != SECSuccess) goto loser;
1418 rv = PK11_DigestFinal(hmac_ctx_pkcs11, computed_mac, 1449 rv = PK11_DigestFinal(hmac_ctx_pkcs11, computed_mac,
1419 &computed_mac_length, sizeof(computed_mac)); 1450 &computed_mac_length, sizeof(computed_mac));
1420 PK11_DestroyContext(hmac_ctx_pkcs11, PR_TRUE);
1421 if (rv != SECSuccess) goto loser; 1451 if (rv != SECSuccess) goto loser;
1422 } 1452 }
1423 1453
1424 /* Serialize the handshake message. */ 1454 /* Serialize the handshake message. */
1425 rv = ssl3_AppendHandshakeHeader(ss, new_session_ticket, message_length); 1455 rv = ssl3_AppendHandshakeHeader(ss, new_session_ticket, message_length);
1426 if (rv != SECSuccess) goto loser; 1456 if (rv != SECSuccess) goto loser;
1427 1457
1428 rv = ssl3_AppendHandshakeNumber(ss, ticket.ticket_lifetime_hint, 1458 rv = ssl3_AppendHandshakeNumber(ss, ticket.ticket_lifetime_hint,
1429 sizeof(ticket.ticket_lifetime_hint)); 1459 sizeof(ticket.ticket_lifetime_hint));
1430 if (rv != SECSuccess) goto loser; 1460 if (rv != SECSuccess) goto loser;
1431 1461
1432 rv = ssl3_AppendHandshakeNumber(ss, 1462 rv = ssl3_AppendHandshakeNumber(ss,
1433 message_length - sizeof(ticket.ticket_lifetime_hint) - 2, 2); 1463 message_length - sizeof(ticket.ticket_lifetime_hint) - 2, 2);
1434 if (rv != SECSuccess) goto loser; 1464 if (rv != SECSuccess) goto loser;
1435 1465
1436 rv = ssl3_AppendHandshake(ss, key_name, SESS_TICKET_KEY_NAME_LEN); 1466 rv = ssl3_AppendHandshake(ss, key_name, SESS_TICKET_KEY_NAME_LEN);
1437 if (rv != SECSuccess) goto loser; 1467 if (rv != SECSuccess) goto loser;
1438 1468
1439 rv = ssl3_AppendHandshake(ss, iv, sizeof(iv)); 1469 rv = ssl3_AppendHandshake(ss, iv, sizeof(iv));
1440 if (rv != SECSuccess) goto loser; 1470 if (rv != SECSuccess) goto loser;
1441 1471
1442 rv = ssl3_AppendHandshakeVariable(ss, ciphertext.data, ciphertext.len, 2); 1472 rv = ssl3_AppendHandshakeVariable(ss, ciphertext.data, ciphertext.len, 2);
1443 if (rv != SECSuccess) goto loser; 1473 if (rv != SECSuccess) goto loser;
1444 1474
1445 rv = ssl3_AppendHandshake(ss, computed_mac, computed_mac_length); 1475 rv = ssl3_AppendHandshake(ss, computed_mac, computed_mac_length);
1446 if (rv != SECSuccess) goto loser; 1476 if (rv != SECSuccess) goto loser;
1447 1477
1448 loser: 1478 loser:
1479 if (hmac_ctx_pkcs11)
1480 PK11_DestroyContext(hmac_ctx_pkcs11, PR_TRUE);
1449 if (plaintext_item.data) 1481 if (plaintext_item.data)
1450 SECITEM_FreeItem(&plaintext_item, PR_FALSE); 1482 SECITEM_FreeItem(&plaintext_item, PR_FALSE);
1451 if (ciphertext.data) 1483 if (ciphertext.data)
1452 SECITEM_FreeItem(&ciphertext, PR_FALSE); 1484 SECITEM_FreeItem(&ciphertext, PR_FALSE);
1453 1485
1454 return rv; 1486 return rv;
1455 } 1487 }
1456 1488
1457 /* When a client receives a SessionTicket extension a NewSessionTicket 1489 /* When a client receives a SessionTicket extension a NewSessionTicket
1458 * message is expected during the handshake. 1490 * message is expected during the handshake.
(...skipping 29 matching lines...) Expand all
1488 /* Keep track of negotiated extensions. */ 1520 /* Keep track of negotiated extensions. */
1489 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type; 1521 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
1490 1522
1491 /* Parse the received ticket sent in by the client. We are 1523 /* Parse the received ticket sent in by the client. We are
1492 * lenient about some parse errors, falling back to a fullshake 1524 * lenient about some parse errors, falling back to a fullshake
1493 * instead of terminating the current connection. 1525 * instead of terminating the current connection.
1494 */ 1526 */
1495 if (data->len == 0) { 1527 if (data->len == 0) {
1496 ss->xtnData.emptySessionTicket = PR_TRUE; 1528 ss->xtnData.emptySessionTicket = PR_TRUE;
1497 } else { 1529 } else {
1498 int i; 1530 PRUint32 i;
1499 SECItem extension_data; 1531 SECItem extension_data;
1500 EncryptedSessionTicket enc_session_ticket; 1532 EncryptedSessionTicket enc_session_ticket;
1501 unsigned char computed_mac[TLS_EX_SESS_TICKET_MAC_LENGTH]; 1533 unsigned char computed_mac[TLS_EX_SESS_TICKET_MAC_LENGTH];
1502 unsigned int computed_mac_length; 1534 unsigned int computed_mac_length;
1503 #ifndef NO_PKCS11_BYPASS 1535 #ifndef NO_PKCS11_BYPASS
1504 const SECHashObject *hashObj; 1536 const SECHashObject *hashObj;
1505 const unsigned char *aes_key; 1537 const unsigned char *aes_key;
1506 const unsigned char *mac_key; 1538 const unsigned char *mac_key;
1507 PRUint32 aes_key_length; 1539 PRUint32 aes_key_length;
1508 PRUint32 mac_key_length; 1540 PRUint32 mac_key_length;
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1691 /* Deserialize session state. */ 1723 /* Deserialize session state. */
1692 buffer = decrypted_state->data; 1724 buffer = decrypted_state->data;
1693 buffer_len = decrypted_state->len; 1725 buffer_len = decrypted_state->len;
1694 1726
1695 parsed_session_ticket = PORT_ZAlloc(sizeof(SessionTicket)); 1727 parsed_session_ticket = PORT_ZAlloc(sizeof(SessionTicket));
1696 if (parsed_session_ticket == NULL) { 1728 if (parsed_session_ticket == NULL) {
1697 rv = SECFailure; 1729 rv = SECFailure;
1698 goto loser; 1730 goto loser;
1699 } 1731 }
1700 1732
1701 /* Read ticket_version (which is ignored for now.) */ 1733 /* Read ticket_version and reject if the version is wrong */
1702 temp = ssl3_ConsumeHandshakeNumber(ss, 2, &buffer, &buffer_len); 1734 temp = ssl3_ConsumeHandshakeNumber(ss, 2, &buffer, &buffer_len);
1703 if (temp < 0) goto no_ticket; 1735 if (temp != TLS_EX_SESS_TICKET_VERSION) goto no_ticket;
1736
1704 parsed_session_ticket->ticket_version = (SSL3ProtocolVersion)temp; 1737 parsed_session_ticket->ticket_version = (SSL3ProtocolVersion)temp;
1705 1738
1706 /* Read SSLVersion. */ 1739 /* Read SSLVersion. */
1707 temp = ssl3_ConsumeHandshakeNumber(ss, 2, &buffer, &buffer_len); 1740 temp = ssl3_ConsumeHandshakeNumber(ss, 2, &buffer, &buffer_len);
1708 if (temp < 0) goto no_ticket; 1741 if (temp < 0) goto no_ticket;
1709 parsed_session_ticket->ssl_version = (SSL3ProtocolVersion)temp; 1742 parsed_session_ticket->ssl_version = (SSL3ProtocolVersion)temp;
1710 1743
1711 /* Read cipher_suite. */ 1744 /* Read cipher_suite. */
1712 temp = ssl3_ConsumeHandshakeNumber(ss, 2, &buffer, &buffer_len); 1745 temp = ssl3_ConsumeHandshakeNumber(ss, 2, &buffer, &buffer_len);
1713 if (temp < 0) goto no_ticket; 1746 if (temp < 0) goto no_ticket;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1794 SECItem name_item; 1827 SECItem name_item;
1795 rv = ssl3_ConsumeHandshakeVariable(ss, &name_item, 2, &buffer, 1828 rv = ssl3_ConsumeHandshakeVariable(ss, &name_item, 2, &buffer,
1796 &buffer_len); 1829 &buffer_len);
1797 if (rv != SECSuccess) goto no_ticket; 1830 if (rv != SECSuccess) goto no_ticket;
1798 rv = SECITEM_CopyItem(NULL, &parsed_session_ticket->srvName, 1831 rv = SECITEM_CopyItem(NULL, &parsed_session_ticket->srvName,
1799 &name_item); 1832 &name_item);
1800 if (rv != SECSuccess) goto no_ticket; 1833 if (rv != SECSuccess) goto no_ticket;
1801 parsed_session_ticket->srvName.type = nameType; 1834 parsed_session_ticket->srvName.type = nameType;
1802 } 1835 }
1803 1836
1837 /* Read extendedMasterSecretUsed */
1838 temp = ssl3_ConsumeHandshakeNumber(ss, 1, &buffer, &buffer_len);
1839 if (temp < 0)
1840 goto no_ticket;
1841 PORT_Assert(temp == PR_TRUE || temp == PR_FALSE);
1842 parsed_session_ticket->extendedMasterSecretUsed = (PRBool)temp;
1843
1804 /* Done parsing. Check that all bytes have been consumed. */ 1844 /* Done parsing. Check that all bytes have been consumed. */
1805 if (buffer_len != padding_length) 1845 if (buffer_len != padding_length)
1806 goto no_ticket; 1846 goto no_ticket;
1807 1847
1808 /* Use the ticket if it has not expired, otherwise free the allocated 1848 /* Use the ticket if it has not expired, otherwise free the allocated
1809 * memory since the ticket is of no use. 1849 * memory since the ticket is of no use.
1810 */ 1850 */
1811 if (parsed_session_ticket->timestamp != 0 && 1851 if (parsed_session_ticket->timestamp != 0 &&
1812 parsed_session_ticket->timestamp + 1852 parsed_session_ticket->timestamp +
1813 TLS_EX_SESS_TICKET_LIFETIME_HINT > ssl_Time()) { 1853 TLS_EX_SESS_TICKET_LIFETIME_HINT > ssl_Time()) {
(...skipping 26 matching lines...) Expand all
1840 parsed_session_ticket->master_secret, 1880 parsed_session_ticket->master_secret,
1841 parsed_session_ticket->ms_length); 1881 parsed_session_ticket->ms_length);
1842 sid->u.ssl3.keys.wrapped_master_secret_len = 1882 sid->u.ssl3.keys.wrapped_master_secret_len =
1843 parsed_session_ticket->ms_length; 1883 parsed_session_ticket->ms_length;
1844 sid->u.ssl3.exchKeyType = parsed_session_ticket->exchKeyType; 1884 sid->u.ssl3.exchKeyType = parsed_session_ticket->exchKeyType;
1845 sid->u.ssl3.masterWrapMech = parsed_session_ticket->msWrapMech; 1885 sid->u.ssl3.masterWrapMech = parsed_session_ticket->msWrapMech;
1846 sid->u.ssl3.keys.msIsWrapped = 1886 sid->u.ssl3.keys.msIsWrapped =
1847 parsed_session_ticket->ms_is_wrapped; 1887 parsed_session_ticket->ms_is_wrapped;
1848 sid->u.ssl3.masterValid = PR_TRUE; 1888 sid->u.ssl3.masterValid = PR_TRUE;
1849 sid->u.ssl3.keys.resumable = PR_TRUE; 1889 sid->u.ssl3.keys.resumable = PR_TRUE;
1890 sid->u.ssl3.keys.extendedMasterSecretUsed = parsed_session_ticket->
1891 extendedMasterSecretUsed;
1850 1892
1851 /* Copy over client cert from session ticket if there is one. */ 1893 /* Copy over client cert from session ticket if there is one. */
1852 if (parsed_session_ticket->peer_cert.data != NULL) { 1894 if (parsed_session_ticket->peer_cert.data != NULL) {
1853 if (sid->peerCert != NULL) 1895 if (sid->peerCert != NULL)
1854 CERT_DestroyCertificate(sid->peerCert); 1896 CERT_DestroyCertificate(sid->peerCert);
1855 sid->peerCert = CERT_NewTempCertificate(ss->dbHandle, 1897 sid->peerCert = CERT_NewTempCertificate(ss->dbHandle,
1856 &parsed_session_ticket->peer_cert, NULL, PR_FALSE, PR_TRUE); 1898 &parsed_session_ticket->peer_cert, NULL, PR_FALSE, PR_TRUE);
1857 if (sid->peerCert == NULL) { 1899 if (sid->peerCert == NULL) {
1858 rv = SECFailure; 1900 rv = SECFailure;
1859 goto loser; 1901 goto loser;
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
2078 /* In draft-ietf-tls-renegotiation-03, it is NOT RECOMMENDED to send 2120 /* In draft-ietf-tls-renegotiation-03, it is NOT RECOMMENDED to send
2079 * both the SCSV and the empty RI, so when we send SCSV in 2121 * both the SCSV and the empty RI, so when we send SCSV in
2080 * the initial handshake, we don't also send RI. 2122 * the initial handshake, we don't also send RI.
2081 */ 2123 */
2082 if (!ss || ss->ssl3.hs.sendingSCSV) 2124 if (!ss || ss->ssl3.hs.sendingSCSV)
2083 return 0; 2125 return 0;
2084 len = !ss->firstHsDone ? 0 : 2126 len = !ss->firstHsDone ? 0 :
2085 (ss->sec.isServer ? ss->ssl3.hs.finishedBytes * 2 2127 (ss->sec.isServer ? ss->ssl3.hs.finishedBytes * 2
2086 : ss->ssl3.hs.finishedBytes); 2128 : ss->ssl3.hs.finishedBytes);
2087 needed = 5 + len; 2129 needed = 5 + len;
2088 if (append && maxBytes >= needed) { 2130 if (maxBytes < (PRUint32)needed) {
2131 return 0;
2132 }
2133 if (append) {
2089 SECStatus rv; 2134 SECStatus rv;
2090 /* extension_type */ 2135 /* extension_type */
2091 rv = ssl3_AppendHandshakeNumber(ss, ssl_renegotiation_info_xtn, 2); 2136 rv = ssl3_AppendHandshakeNumber(ss, ssl_renegotiation_info_xtn, 2);
2092 if (rv != SECSuccess) return -1; 2137 if (rv != SECSuccess) return -1;
2093 /* length of extension_data */ 2138 /* length of extension_data */
2094 rv = ssl3_AppendHandshakeNumber(ss, len + 1, 2); 2139 rv = ssl3_AppendHandshakeNumber(ss, len + 1, 2);
2095 if (rv != SECSuccess) return -1; 2140 if (rv != SECSuccess) return -1;
2096 /* verify_Data from previous Finished message(s) */ 2141 /* verify_Data from previous Finished message(s) */
2097 rv = ssl3_AppendHandshakeVariable(ss, 2142 rv = ssl3_AppendHandshakeVariable(ss,
2098 ss->ssl3.hs.finishedMsgs.data, len, 1); 2143 ss->ssl3.hs.finishedMsgs.data, len, 1);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2131 if (ss->firstHsDone) { 2176 if (ss->firstHsDone) {
2132 len = ss->sec.isServer ? ss->ssl3.hs.finishedBytes 2177 len = ss->sec.isServer ? ss->ssl3.hs.finishedBytes
2133 : ss->ssl3.hs.finishedBytes * 2; 2178 : ss->ssl3.hs.finishedBytes * 2;
2134 } 2179 }
2135 if (data->len != 1 + len || data->data[0] != len ) { 2180 if (data->len != 1 + len || data->data[0] != len ) {
2136 (void)ssl3_DecodeError(ss); 2181 (void)ssl3_DecodeError(ss);
2137 return SECFailure; 2182 return SECFailure;
2138 } 2183 }
2139 if (len && NSS_SecureMemcmp(ss->ssl3.hs.finishedMsgs.data, 2184 if (len && NSS_SecureMemcmp(ss->ssl3.hs.finishedMsgs.data,
2140 data->data + 1, len)) { 2185 data->data + 1, len)) {
2186 (void)SSL3_SendAlert(ss, alert_fatal, handshake_failure);
2141 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); 2187 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE);
2142 (void)SSL3_SendAlert(ss, alert_fatal, handshake_failure);
2143 return SECFailure; 2188 return SECFailure;
2144 } 2189 }
2145 /* remember that we got this extension and it was correct. */ 2190 /* remember that we got this extension and it was correct. */
2146 ss->peerRequestedProtection = 1; 2191 ss->peerRequestedProtection = 1;
2147 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type; 2192 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
2148 if (ss->sec.isServer) { 2193 if (ss->sec.isServer) {
2149 /* prepare to send back the appropriate response */ 2194 /* prepare to send back the appropriate response */
2150 rv = ssl3_RegisterServerHelloExtensionSender(ss, ex_type, 2195 rv = ssl3_RegisterServerHelloExtensionSender(ss, ex_type,
2151 ssl3_SendRenegotiationInfoX tn); 2196 ssl3_SendRenegotiationInfoX tn);
2152 } 2197 }
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
2256 2301
2257 /* Now check that this is one of the ciphers we offered */ 2302 /* Now check that this is one of the ciphers we offered */
2258 for (i = 0; i < ss->ssl3.dtlsSRTPCipherCount; i++) { 2303 for (i = 0; i < ss->ssl3.dtlsSRTPCipherCount; i++) {
2259 if (cipher == ss->ssl3.dtlsSRTPCiphers[i]) { 2304 if (cipher == ss->ssl3.dtlsSRTPCiphers[i]) {
2260 found = PR_TRUE; 2305 found = PR_TRUE;
2261 break; 2306 break;
2262 } 2307 }
2263 } 2308 }
2264 2309
2265 if (!found) { 2310 if (!found) {
2311 (void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
2266 PORT_SetError(SSL_ERROR_RX_MALFORMED_SERVER_HELLO); 2312 PORT_SetError(SSL_ERROR_RX_MALFORMED_SERVER_HELLO);
2267 (void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
2268 return SECFailure; 2313 return SECFailure;
2269 } 2314 }
2270 2315
2271 /* Get the srtp_mki value */ 2316 /* Get the srtp_mki value */
2272 rv = ssl3_ConsumeHandshakeVariable(ss, &litem, 1, 2317 rv = ssl3_ConsumeHandshakeVariable(ss, &litem, 1,
2273 &data->data, &data->len); 2318 &data->data, &data->len);
2274 if (rv != SECSuccess) { 2319 if (rv != SECSuccess) {
2275 return SECFailure; /* alert already sent */ 2320 return SECFailure; /* alert already sent */
2276 } 2321 }
2277 2322
2278 /* We didn't offer an MKI, so this must be 0 length */ 2323 /* We didn't offer an MKI, so this must be 0 length */
2279 if (litem.len != 0) { 2324 if (litem.len != 0) {
2325 (void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
2280 PORT_SetError(SSL_ERROR_RX_MALFORMED_SERVER_HELLO); 2326 PORT_SetError(SSL_ERROR_RX_MALFORMED_SERVER_HELLO);
2281 (void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
2282 return SECFailure; 2327 return SECFailure;
2283 } 2328 }
2284 2329
2285 /* extra trailing bytes */ 2330 /* extra trailing bytes */
2286 if (data->len != 0) { 2331 if (data->len != 0) {
2287 (void)ssl3_DecodeError(ss); 2332 (void)ssl3_DecodeError(ss);
2288 return SECFailure; 2333 return SECFailure;
2289 } 2334 }
2290 2335
2291 /* OK, this looks fine. */ 2336 /* OK, this looks fine. */
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2367 2412
2368 /* ssl3_ServerHandleSigAlgsXtn handles the signature_algorithms extension 2413 /* ssl3_ServerHandleSigAlgsXtn handles the signature_algorithms extension
2369 * from a client. 2414 * from a client.
2370 * See https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ 2415 * See https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */
2371 static SECStatus 2416 static SECStatus
2372 ssl3_ServerHandleSigAlgsXtn(sslSocket * ss, PRUint16 ex_type, SECItem *data) 2417 ssl3_ServerHandleSigAlgsXtn(sslSocket * ss, PRUint16 ex_type, SECItem *data)
2373 { 2418 {
2374 SECStatus rv; 2419 SECStatus rv;
2375 SECItem algorithms; 2420 SECItem algorithms;
2376 const unsigned char *b; 2421 const unsigned char *b;
2377 unsigned int numAlgorithms, i, j; 2422 unsigned int numAlgorithms, i;
2378 2423
2379 /* Ignore this extension if we aren't doing TLS 1.2 or greater. */ 2424 /* Ignore this extension if we aren't doing TLS 1.2 or greater. */
2380 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_2) { 2425 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_2) {
2381 return SECSuccess; 2426 return SECSuccess;
2382 } 2427 }
2383 2428
2384 rv = ssl3_ConsumeHandshakeVariable(ss, &algorithms, 2, &data->data, 2429 rv = ssl3_ConsumeHandshakeVariable(ss, &algorithms, 2, &data->data,
2385 &data->len); 2430 &data->len);
2386 if (rv != SECSuccess) { 2431 if (rv != SECSuccess) {
2387 return SECFailure; 2432 return SECFailure;
2388 } 2433 }
2389 /* Trailing data, empty value, or odd-length value is invalid. */ 2434 /* Trailing data, empty value, or odd-length value is invalid. */
2390 if (data->len != 0 || algorithms.len == 0 || (algorithms.len & 1) != 0) { 2435 if (data->len != 0 || algorithms.len == 0 || (algorithms.len & 1) != 0) {
2436 (void)SSL3_SendAlert(ss, alert_fatal, decode_error);
2391 PORT_SetError(SSL_ERROR_RX_MALFORMED_CLIENT_HELLO); 2437 PORT_SetError(SSL_ERROR_RX_MALFORMED_CLIENT_HELLO);
2392 (void)SSL3_SendAlert(ss, alert_fatal, decode_error);
2393 return SECFailure; 2438 return SECFailure;
2394 } 2439 }
2395 2440
2396 numAlgorithms = algorithms.len/2; 2441 numAlgorithms = algorithms.len/2;
2397 2442
2398 /* We don't care to process excessive numbers of algorithms. */ 2443 /* We don't care to process excessive numbers of algorithms. */
2399 if (numAlgorithms > 512) { 2444 if (numAlgorithms > 512) {
2400 numAlgorithms = 512; 2445 numAlgorithms = 512;
2401 } 2446 }
2402 2447
2403 ss->ssl3.hs.clientSigAndHash = 2448 ss->ssl3.hs.clientSigAndHash =
2404 PORT_NewArray(SSL3SignatureAndHashAlgorithm, numAlgorithms); 2449 PORT_NewArray(SSLSignatureAndHashAlg, numAlgorithms);
2405 if (!ss->ssl3.hs.clientSigAndHash) { 2450 if (!ss->ssl3.hs.clientSigAndHash) {
2451 (void)SSL3_SendAlert(ss, alert_fatal, internal_error);
2406 PORT_SetError(SSL_ERROR_RX_MALFORMED_CLIENT_HELLO); 2452 PORT_SetError(SSL_ERROR_RX_MALFORMED_CLIENT_HELLO);
2407 (void)SSL3_SendAlert(ss, alert_fatal, internal_error);
2408 return SECFailure; 2453 return SECFailure;
2409 } 2454 }
2410 ss->ssl3.hs.numClientSigAndHash = 0; 2455 ss->ssl3.hs.numClientSigAndHash = 0;
2411 2456
2412 b = algorithms.data; 2457 b = algorithms.data;
2413 for (i = j = 0; i < numAlgorithms; i++) { 2458 ss->ssl3.hs.numClientSigAndHash = 0;
2414 unsigned char tls_hash = *(b++); 2459 for (i = 0; i < numAlgorithms; i++) {
2415 unsigned char tls_sig = *(b++); 2460 SSLSignatureAndHashAlg *sigAndHash =
2416 SECOidTag hash = ssl3_TLSHashAlgorithmToOID(tls_hash); 2461 &ss->ssl3.hs.clientSigAndHash[ss->ssl3.hs.numClientSigAndHash];
2417 2462 sigAndHash->hashAlg = (SSLHashType)*(b++);
2418 if (hash == SEC_OID_UNKNOWN) { 2463 sigAndHash->sigAlg = (SSLSignType)*(b++);
2419 /* We ignore formats that we don't understand. */ 2464 if (ssl3_IsSupportedSignatureAlgorithm(sigAndHash)) {
2420 continue; 2465 ++ss->ssl3.hs.numClientSigAndHash;
2421 } 2466 }
2422 /* tls_sig support will be checked later in
2423 * ssl3_PickSignatureHashAlgorithm. */
2424 ss->ssl3.hs.clientSigAndHash[j].hashAlg = hash;
2425 ss->ssl3.hs.clientSigAndHash[j].sigAlg = tls_sig;
2426 ++j;
2427 ++ss->ssl3.hs.numClientSigAndHash;
2428 } 2467 }
2429 2468
2430 if (!ss->ssl3.hs.numClientSigAndHash) { 2469 if (!ss->ssl3.hs.numClientSigAndHash) {
2431 /* We didn't understand any of the client's requested signature 2470 /* We didn't understand any of the client's requested signature
2432 * formats. We'll use the defaults. */ 2471 * formats. We'll use the defaults. */
2433 PORT_Free(ss->ssl3.hs.clientSigAndHash); 2472 PORT_Free(ss->ssl3.hs.clientSigAndHash);
2434 ss->ssl3.hs.clientSigAndHash = NULL; 2473 ss->ssl3.hs.clientSigAndHash = NULL;
2435 } 2474 }
2436 2475
2437 /* Keep track of negotiated extensions. */ 2476 /* Keep track of negotiated extensions. */
2438 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type; 2477 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
2439 return SECSuccess; 2478 return SECSuccess;
2440 } 2479 }
2441 2480
2442 /* ssl3_ClientSendSigAlgsXtn sends the signature_algorithm extension for TLS 2481 /* ssl3_ClientSendSigAlgsXtn sends the signature_algorithm extension for TLS
2443 * 1.2 ClientHellos. */ 2482 * 1.2 ClientHellos. */
2444 static PRInt32 2483 static PRInt32
2445 ssl3_ClientSendSigAlgsXtn(sslSocket * ss, PRBool append, PRUint32 maxBytes) 2484 ssl3_ClientSendSigAlgsXtn(sslSocket *ss, PRBool append, PRUint32 maxBytes)
2446 { 2485 {
2447 static const unsigned char signatureAlgorithms[] = {
2448 /* This block is the contents of our signature_algorithms extension, in
2449 * wire format. See
2450 * https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */
2451 tls_hash_sha256, tls_sig_rsa,
2452 tls_hash_sha384, tls_sig_rsa,
2453 tls_hash_sha512, tls_sig_rsa,
2454 tls_hash_sha1, tls_sig_rsa,
2455 #ifndef NSS_DISABLE_ECC
2456 tls_hash_sha256, tls_sig_ecdsa,
2457 tls_hash_sha384, tls_sig_ecdsa,
2458 tls_hash_sha512, tls_sig_ecdsa,
2459 tls_hash_sha1, tls_sig_ecdsa,
2460 #endif
2461 tls_hash_sha256, tls_sig_dsa,
2462 tls_hash_sha1, tls_sig_dsa,
2463 };
2464 PRInt32 extension_length; 2486 PRInt32 extension_length;
2487 unsigned int i;
2488 PRInt32 pos=0;
2489 PRUint32 policy;
2490 PRUint8 buf[MAX_SIGNATURE_ALGORITHMS * 2];
2465 2491
2466 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_2) { 2492 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_2) {
2467 return 0; 2493 return 0;
2468 } 2494 }
2469 2495
2496 for (i=0; i < ss->ssl3.signatureAlgorithmCount; i++) {
2497 SECOidTag hashOID = ssl3_TLSHashAlgorithmToOID(
2498 ss->ssl3.signatureAlgorithms[i].hashAlg);
2499 if ((NSS_GetAlgorithmPolicy(hashOID, & policy) != SECSuccess) ||
2500 (policy & NSS_USE_ALG_IN_SSL_KX)) {
2501 buf[pos++] = ss->ssl3.signatureAlgorithms[i].hashAlg;
2502 buf[pos++] = ss->ssl3.signatureAlgorithms[i].sigAlg;
2503 }
2504 }
2505
2470 extension_length = 2506 extension_length =
2471 2 /* extension type */ + 2507 2 /* extension type */ +
2472 2 /* extension length */ + 2508 2 /* extension length */ +
2473 2 /* supported_signature_algorithms length */ + 2509 2 /* supported_signature_algorithms length */ +
2474 sizeof(signatureAlgorithms); 2510 pos;
2475 2511
2476 if (append && maxBytes >= extension_length) { 2512 if (maxBytes < extension_length) {
2477 SECStatus rv;
2478 rv = ssl3_AppendHandshakeNumber(ss, ssl_signature_algorithms_xtn, 2);
2479 if (rv != SECSuccess)
2480 goto loser;
2481 rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2);
2482 if (rv != SECSuccess)
2483 goto loser;
2484 rv = ssl3_AppendHandshakeVariable(ss, signatureAlgorithms,
2485 sizeof(signatureAlgorithms), 2);
2486 if (rv != SECSuccess)
2487 goto loser;
2488 ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
2489 ssl_signature_algorithms_xtn;
2490 } else if (maxBytes < extension_length) {
2491 PORT_Assert(0); 2513 PORT_Assert(0);
2492 return 0; 2514 return 0;
2493 } 2515 }
2494 2516
2517 if (append) {
2518 SECStatus rv;
2519 rv = ssl3_AppendHandshakeNumber(ss, ssl_signature_algorithms_xtn, 2);
2520 if (rv != SECSuccess) {
2521 return -1;
2522 }
2523 rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2);
2524 if (rv != SECSuccess) {
2525 return -1;
2526 }
2527
2528 rv = ssl3_AppendHandshakeVariable(ss, buf, extension_length - 6, 2);
2529 if (rv != SECSuccess) {
2530 return -1;
2531 }
2532
2533 ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
2534 ssl_signature_algorithms_xtn;
2535 }
2536
2495 return extension_length; 2537 return extension_length;
2496
2497 loser:
2498 return -1;
2499 } 2538 }
2500 2539
2501 unsigned int 2540 unsigned int
2502 ssl3_CalculatePaddingExtensionLength(unsigned int clientHelloLength) 2541 ssl3_CalculatePaddingExtensionLength(unsigned int clientHelloLength)
2503 { 2542 {
2504 unsigned int recordLength = 1 /* handshake message type */ + 2543 unsigned int recordLength = 1 /* handshake message type */ +
2505 3 /* handshake message length */ + 2544 3 /* handshake message length */ +
2506 clientHelloLength; 2545 clientHelloLength;
2507 unsigned int extensionLength; 2546 unsigned int extensionLength;
2508 2547
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2558 static PRInt32 2597 static PRInt32
2559 ssl3_ClientSendDraftVersionXtn(sslSocket * ss, PRBool append, PRUint32 maxBytes) 2598 ssl3_ClientSendDraftVersionXtn(sslSocket * ss, PRBool append, PRUint32 maxBytes)
2560 { 2599 {
2561 PRInt32 extension_length; 2600 PRInt32 extension_length;
2562 2601
2563 if (ss->version != SSL_LIBRARY_VERSION_TLS_1_3) { 2602 if (ss->version != SSL_LIBRARY_VERSION_TLS_1_3) {
2564 return 0; 2603 return 0;
2565 } 2604 }
2566 2605
2567 extension_length = 6; /* Type + length + number */ 2606 extension_length = 6; /* Type + length + number */
2568 if (append && maxBytes >= extension_length) { 2607 if (maxBytes < (PRUint32)extension_length) {
2608 PORT_Assert(0);
2609 return 0;
2610 }
2611 if (append) {
2569 SECStatus rv; 2612 SECStatus rv;
2570 rv = ssl3_AppendHandshakeNumber(ss, ssl_tls13_draft_version_xtn, 2); 2613 rv = ssl3_AppendHandshakeNumber(ss, ssl_tls13_draft_version_xtn, 2);
2571 if (rv != SECSuccess) 2614 if (rv != SECSuccess)
2572 goto loser; 2615 goto loser;
2573 rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2); 2616 rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2);
2574 if (rv != SECSuccess) 2617 if (rv != SECSuccess)
2575 goto loser; 2618 goto loser;
2576 rv = ssl3_AppendHandshakeNumber(ss, TLS_1_3_DRAFT_VERSION, 2); 2619 rv = ssl3_AppendHandshakeNumber(ss, TLS_1_3_DRAFT_VERSION, 2);
2577 if (rv != SECSuccess) 2620 if (rv != SECSuccess)
2578 goto loser; 2621 goto loser;
2579 ss->xtnData.advertised[ss->xtnData.numAdvertised++] = 2622 ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
2580 ssl_tls13_draft_version_xtn; 2623 ssl_tls13_draft_version_xtn;
2581 } else if (maxBytes < extension_length) {
2582 PORT_Assert(0);
2583 return 0;
2584 } 2624 }
2585 2625
2586 return extension_length; 2626 return extension_length;
2587 2627
2588 loser: 2628 loser:
2589 return -1; 2629 return -1;
2590 } 2630 }
2591 2631
2592 /* ssl3_ServerHandleDraftVersionXtn handles the TLS 1.3 temporary draft 2632 /* ssl3_ServerHandleDraftVersionXtn handles the TLS 1.3 temporary draft
2593 * version extension. 2633 * version extension.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2626 */ 2666 */
2627 SSL_TRC(30, ("%d: SSL3[%d]: Incompatible version of TLS 1.3 (%d), " 2667 SSL_TRC(30, ("%d: SSL3[%d]: Incompatible version of TLS 1.3 (%d), "
2628 "expected %d", 2668 "expected %d",
2629 SSL_GETPID(), ss->fd, draft_version, TLS_1_3_DRAFT_VERSION) ); 2669 SSL_GETPID(), ss->fd, draft_version, TLS_1_3_DRAFT_VERSION) );
2630 ss->version = SSL_LIBRARY_VERSION_TLS_1_2; 2670 ss->version = SSL_LIBRARY_VERSION_TLS_1_2;
2631 } 2671 }
2632 2672
2633 return SECSuccess; 2673 return SECSuccess;
2634 } 2674 }
2635 2675
2676 static PRInt32
2677 ssl3_SendExtendedMasterSecretXtn(sslSocket * ss, PRBool append,
2678 PRUint32 maxBytes)
2679 {
2680 PRInt32 extension_length;
2681
2682 if (!ss->opt.enableExtendedMS) {
2683 return 0;
2684 }
2685
2686 #ifndef NO_PKCS11_BYPASS
2687 /* Extended MS can only be used w/o bypass mode */
2688 if (ss->opt.bypassPKCS11) {
2689 PORT_Assert(0);
2690 PORT_SetError(PR_NOT_IMPLEMENTED_ERROR);
2691 return -1;
2692 }
2693 #endif
2694
2695 /* Always send the extension in this function, since the
2696 * client always sends it and this function is only called on
2697 * the server if we negotiated the extension. */
2698 extension_length = 4; /* Type + length (0) */
2699 if (maxBytes < extension_length) {
2700 PORT_Assert(0);
2701 return 0;
2702 }
2703
2704 if (append) {
2705 SECStatus rv;
2706 rv = ssl3_AppendHandshakeNumber(ss, ssl_extended_master_secret_xtn, 2);
2707 if (rv != SECSuccess)
2708 goto loser;
2709 rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
2710 if (rv != SECSuccess)
2711 goto loser;
2712 ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
2713 ssl_extended_master_secret_xtn;
2714 }
2715
2716 return extension_length;
2717 loser:
2718 return -1;
2719 }
2720
2636 /* ssl3_ClientSendSignedCertTimestampXtn sends the signed_certificate_timestamp 2721 /* ssl3_ClientSendSignedCertTimestampXtn sends the signed_certificate_timestamp
2637 * extension for TLS ClientHellos. */ 2722 * extension for TLS ClientHellos. */
2638 static PRInt32 2723 static PRInt32
2639 ssl3_ClientSendSignedCertTimestampXtn(sslSocket *ss, PRBool append, 2724 ssl3_ClientSendSignedCertTimestampXtn(sslSocket *ss, PRBool append,
2640 PRUint32 maxBytes) 2725 PRUint32 maxBytes)
2641 { 2726 {
2642 PRInt32 extension_length = 2 /* extension_type */ + 2727 PRInt32 extension_length = 2 /* extension_type */ +
2643 2 /* length(extension_data) */; 2728 2 /* length(extension_data) */;
2644 2729
2645 /* Only send the extension if processing is enabled. */ 2730 /* Only send the extension if processing is enabled. */
2646 if (!ss->opt.enableSignedCertTimestamps) 2731 if (!ss->opt.enableSignedCertTimestamps)
2647 return 0; 2732 return 0;
2648 2733
2649 if (append && maxBytes >= extension_length) { 2734 if (maxBytes < extension_length) {
2735 PORT_Assert(0);
2736 return 0;
2737 }
2738
2739 if (append) {
2650 SECStatus rv; 2740 SECStatus rv;
2651 /* extension_type */ 2741 /* extension_type */
2652 rv = ssl3_AppendHandshakeNumber(ss, 2742 rv = ssl3_AppendHandshakeNumber(ss,
2653 ssl_signed_certificate_timestamp_xtn, 2743 ssl_signed_certificate_timestamp_xtn,
2654 2); 2744 2);
2655 if (rv != SECSuccess) 2745 if (rv != SECSuccess)
2656 goto loser; 2746 goto loser;
2657 /* zero length */ 2747 /* zero length */
2658 rv = ssl3_AppendHandshakeNumber(ss, 0, 2); 2748 rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
2659 if (rv != SECSuccess) 2749 if (rv != SECSuccess)
2660 goto loser; 2750 goto loser;
2661 ss->xtnData.advertised[ss->xtnData.numAdvertised++] = 2751 ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
2662 ssl_signed_certificate_timestamp_xtn; 2752 ssl_signed_certificate_timestamp_xtn;
2663 } else if (maxBytes < extension_length) {
2664 PORT_Assert(0);
2665 return 0;
2666 } 2753 }
2667 2754
2668 return extension_length; 2755 return extension_length;
2669 loser: 2756 loser:
2670 return -1; 2757 return -1;
2671 } 2758 }
2672 2759
2673 static SECStatus 2760 static SECStatus
2761 ssl3_HandleExtendedMasterSecretXtn(sslSocket * ss, PRUint16 ex_type,
2762 SECItem *data)
2763 {
2764 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_0) {
2765 return SECSuccess;
2766 }
2767
2768 if (!ss->opt.enableExtendedMS) {
2769 return SECSuccess;
2770 }
2771
2772 #ifndef NO_PKCS11_BYPASS
2773 /* Extended MS can only be used w/o bypass mode */
2774 if (ss->opt.bypassPKCS11) {
2775 PORT_Assert(0);
2776 PORT_SetError(PR_NOT_IMPLEMENTED_ERROR);
2777 return SECFailure;
2778 }
2779 #endif
2780
2781 if (data->len != 0) {
2782 SSL_TRC(30, ("%d: SSL3[%d]: Bogus extended master secret extension",
2783 SSL_GETPID(), ss->fd));
2784 return SECFailure;
2785 }
2786
2787 SSL_DBG(("%d: SSL[%d]: Negotiated extended master secret extension.",
2788 SSL_GETPID(), ss->fd));
2789
2790 /* Keep track of negotiated extensions. */
2791 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
2792
2793 if (ss->sec.isServer) {
2794 return ssl3_RegisterServerHelloExtensionSender(
2795 ss, ex_type, ssl3_SendExtendedMasterSecretXtn);
2796 }
2797 return SECSuccess;
2798 }
2799
2800 static SECStatus
2674 ssl3_ClientHandleSignedCertTimestampXtn(sslSocket *ss, PRUint16 ex_type, 2801 ssl3_ClientHandleSignedCertTimestampXtn(sslSocket *ss, PRUint16 ex_type,
2675 SECItem *data) 2802 SECItem *data)
2676 { 2803 {
2677 /* We do not yet know whether we'll be resuming a session or creating 2804 /* We do not yet know whether we'll be resuming a session or creating
2678 * a new one, so we keep a pointer to the data in the TLSExtensionData 2805 * a new one, so we keep a pointer to the data in the TLSExtensionData
2679 * structure. This pointer is only valid in the scope of 2806 * structure. This pointer is only valid in the scope of
2680 * ssl3_HandleServerHello, and, if not resuming a session, the data is 2807 * ssl3_HandleServerHello, and, if not resuming a session, the data is
2681 * copied once a new session structure has been set up. 2808 * copied once a new session structure has been set up.
2682 * All parsing is currently left to the application and we accept 2809 * All parsing is currently left to the application and we accept
2683 * everything, including empty data. 2810 * everything, including empty data.
2684 */ 2811 */
2685 SECItem *scts = &ss->xtnData.signedCertTimestamps; 2812 SECItem *scts = &ss->xtnData.signedCertTimestamps;
2686 PORT_Assert(!scts->data && !scts->len); 2813 PORT_Assert(!scts->data && !scts->len);
2687 2814
2688 if (!data->len) { 2815 if (!data->len) {
2689 /* Empty extension data: RFC 6962 mandates non-empty contents. */ 2816 /* Empty extension data: RFC 6962 mandates non-empty contents. */
2690 return SECFailure; 2817 return SECFailure;
2691 } 2818 }
2692 *scts = *data; 2819 *scts = *data;
2693 /* Keep track of negotiated extensions. */ 2820 /* Keep track of negotiated extensions. */
2694 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type; 2821 ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
2695 return SECSuccess; 2822 return SECSuccess;
2696 } 2823 }
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