1/*
2 * SSL3 Protocol
3 *
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7
8/* TLS extension code moved here from ssl3ecc.c */
9
10#include "nssrenam.h"
11#include "nss.h"
12#include "ssl.h"
13#include "sslimpl.h"
14#include "sslproto.h"
15#include "pk11pub.h"
16#ifdef NO_PKCS11_BYPASS
17#include "blapit.h"
18#else
19#include "blapi.h"
20#endif
21#include "prinit.h"
22
23static unsigned char  key_name[SESS_TICKET_KEY_NAME_LEN];
24static PK11SymKey    *session_ticket_enc_key_pkcs11 = NULL;
25static PK11SymKey    *session_ticket_mac_key_pkcs11 = NULL;
26
27#ifndef NO_PKCS11_BYPASS
28static unsigned char  session_ticket_enc_key[AES_256_KEY_LENGTH];
29static unsigned char  session_ticket_mac_key[SHA256_LENGTH];
30
31static PRBool         session_ticket_keys_initialized = PR_FALSE;
32#endif
33static PRCallOnceType generate_session_keys_once;
34
35/* forward static function declarations */
36static SECStatus ssl3_ParseEncryptedSessionTicket(sslSocket *ss,
37    SECItem *data, EncryptedSessionTicket *enc_session_ticket);
38static SECStatus ssl3_AppendToItem(SECItem *item, const unsigned char *buf,
39    PRUint32 bytes);
40static SECStatus ssl3_AppendNumberToItem(SECItem *item, PRUint32 num,
41    PRInt32 lenSize);
42static SECStatus ssl3_GetSessionTicketKeysPKCS11(sslSocket *ss,
43    PK11SymKey **aes_key, PK11SymKey **mac_key);
44#ifndef NO_PKCS11_BYPASS
45static SECStatus ssl3_GetSessionTicketKeys(const unsigned char **aes_key,
46    PRUint32 *aes_key_length, const unsigned char **mac_key,
47    PRUint32 *mac_key_length);
48#endif
49static PRInt32 ssl3_SendRenegotiationInfoXtn(sslSocket * ss,
50    PRBool append, PRUint32 maxBytes);
51static SECStatus ssl3_HandleRenegotiationInfoXtn(sslSocket *ss,
52    PRUint16 ex_type, SECItem *data);
53static SECStatus ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss,
54			PRUint16 ex_type, SECItem *data);
55static SECStatus ssl3_ClientHandleAppProtoXtn(sslSocket *ss,
56			PRUint16 ex_type, SECItem *data);
57static SECStatus ssl3_ServerHandleNextProtoNegoXtn(sslSocket *ss,
58			PRUint16 ex_type, SECItem *data);
59static PRInt32 ssl3_ClientSendAppProtoXtn(sslSocket *ss, PRBool append,
60					  PRUint32 maxBytes);
61static PRInt32 ssl3_ClientSendNextProtoNegoXtn(sslSocket *ss, PRBool append,
62					       PRUint32 maxBytes);
63static PRInt32 ssl3_SendUseSRTPXtn(sslSocket *ss, PRBool append,
64    PRUint32 maxBytes);
65static SECStatus ssl3_HandleUseSRTPXtn(sslSocket * ss, PRUint16 ex_type,
66    SECItem *data);
67static SECStatus ssl3_ClientHandleChannelIDXtn(sslSocket *ss,
68    PRUint16 ex_type, SECItem *data);
69static PRInt32 ssl3_ClientSendChannelIDXtn(sslSocket *ss, PRBool append,
70    PRUint32 maxBytes);
71static SECStatus ssl3_ServerSendStatusRequestXtn(sslSocket * ss,
72    PRBool append, PRUint32 maxBytes);
73static SECStatus ssl3_ServerHandleStatusRequestXtn(sslSocket *ss,
74    PRUint16 ex_type, SECItem *data);
75static SECStatus ssl3_ClientHandleStatusRequestXtn(sslSocket *ss,
76                                                   PRUint16 ex_type,
77                                                   SECItem *data);
78static PRInt32 ssl3_ClientSendStatusRequestXtn(sslSocket * ss, PRBool append,
79                                               PRUint32 maxBytes);
80static PRInt32 ssl3_ClientSendSigAlgsXtn(sslSocket *ss, PRBool append,
81                                         PRUint32 maxBytes);
82static SECStatus ssl3_ServerHandleSigAlgsXtn(sslSocket *ss, PRUint16 ex_type,
83                                             SECItem *data);
84static PRInt32 ssl3_ClientSendSignedCertTimestampXtn(sslSocket *ss,
85						     PRBool append,
86						     PRUint32 maxBytes);
87static SECStatus ssl3_ClientHandleSignedCertTimestampXtn(sslSocket *ss,
88							 PRUint16 ex_type,
89							 SECItem *data);
90
91/*
92 * Write bytes.  Using this function means the SECItem structure
93 * cannot be freed.  The caller is expected to call this function
94 * on a shallow copy of the structure.
95 */
96static SECStatus
97ssl3_AppendToItem(SECItem *item, const unsigned char *buf, PRUint32 bytes)
98{
99    if (bytes > item->len)
100	return SECFailure;
101
102    PORT_Memcpy(item->data, buf, bytes);
103    item->data += bytes;
104    item->len -= bytes;
105    return SECSuccess;
106}
107
108/*
109 * Write a number in network byte order. Using this function means the
110 * SECItem structure cannot be freed.  The caller is expected to call
111 * this function on a shallow copy of the structure.
112 */
113static SECStatus
114ssl3_AppendNumberToItem(SECItem *item, PRUint32 num, PRInt32 lenSize)
115{
116    SECStatus rv;
117    PRUint8   b[4];
118    PRUint8 * p = b;
119
120    switch (lenSize) {
121    case 4:
122	*p++ = (PRUint8) (num >> 24);
123    case 3:
124	*p++ = (PRUint8) (num >> 16);
125    case 2:
126	*p++ = (PRUint8) (num >> 8);
127    case 1:
128	*p = (PRUint8) num;
129    }
130    rv = ssl3_AppendToItem(item, &b[0], lenSize);
131    return rv;
132}
133
134static SECStatus ssl3_SessionTicketShutdown(void* appData, void* nssData)
135{
136    if (session_ticket_enc_key_pkcs11) {
137	PK11_FreeSymKey(session_ticket_enc_key_pkcs11);
138	session_ticket_enc_key_pkcs11 = NULL;
139    }
140    if (session_ticket_mac_key_pkcs11) {
141	PK11_FreeSymKey(session_ticket_mac_key_pkcs11);
142	session_ticket_mac_key_pkcs11 = NULL;
143    }
144    PORT_Memset(&generate_session_keys_once, 0,
145	sizeof(generate_session_keys_once));
146    return SECSuccess;
147}
148
149
150static PRStatus
151ssl3_GenerateSessionTicketKeysPKCS11(void *data)
152{
153    SECStatus rv;
154    sslSocket *ss = (sslSocket *)data;
155    SECKEYPrivateKey *svrPrivKey = ss->serverCerts[kt_rsa].SERVERKEY;
156    SECKEYPublicKey *svrPubKey = ss->serverCerts[kt_rsa].serverKeyPair->pubKey;
157
158    if (svrPrivKey == NULL || svrPubKey == NULL) {
159	SSL_DBG(("%d: SSL[%d]: Pub or priv key(s) is NULL.",
160			SSL_GETPID(), ss->fd));
161	goto loser;
162    }
163
164    /* Get a copy of the session keys from shared memory. */
165    PORT_Memcpy(key_name, SESS_TICKET_KEY_NAME_PREFIX,
166	sizeof(SESS_TICKET_KEY_NAME_PREFIX));
167    if (!ssl_GetSessionTicketKeysPKCS11(svrPrivKey, svrPubKey,
168	    ss->pkcs11PinArg, &key_name[SESS_TICKET_KEY_NAME_PREFIX_LEN],
169	    &session_ticket_enc_key_pkcs11, &session_ticket_mac_key_pkcs11))
170	return PR_FAILURE;
171
172    rv = NSS_RegisterShutdown(ssl3_SessionTicketShutdown, NULL);
173    if (rv != SECSuccess)
174	goto loser;
175
176    return PR_SUCCESS;
177
178loser:
179    ssl3_SessionTicketShutdown(NULL, NULL);
180    return PR_FAILURE;
181}
182
183static SECStatus
184ssl3_GetSessionTicketKeysPKCS11(sslSocket *ss, PK11SymKey **aes_key,
185                                PK11SymKey **mac_key)
186{
187    if (PR_CallOnceWithArg(&generate_session_keys_once,
188	    ssl3_GenerateSessionTicketKeysPKCS11, ss) != PR_SUCCESS)
189	return SECFailure;
190
191    if (session_ticket_enc_key_pkcs11 == NULL ||
192	session_ticket_mac_key_pkcs11 == NULL)
193	return SECFailure;
194
195    *aes_key = session_ticket_enc_key_pkcs11;
196    *mac_key = session_ticket_mac_key_pkcs11;
197    return SECSuccess;
198}
199
200#ifndef NO_PKCS11_BYPASS
201static PRStatus
202ssl3_GenerateSessionTicketKeys(void)
203{
204    PORT_Memcpy(key_name, SESS_TICKET_KEY_NAME_PREFIX,
205	sizeof(SESS_TICKET_KEY_NAME_PREFIX));
206
207    if (!ssl_GetSessionTicketKeys(&key_name[SESS_TICKET_KEY_NAME_PREFIX_LEN],
208	    session_ticket_enc_key, session_ticket_mac_key))
209	return PR_FAILURE;
210
211    session_ticket_keys_initialized = PR_TRUE;
212    return PR_SUCCESS;
213}
214
215static SECStatus
216ssl3_GetSessionTicketKeys(const unsigned char **aes_key,
217    PRUint32 *aes_key_length, const unsigned char **mac_key,
218    PRUint32 *mac_key_length)
219{
220    if (PR_CallOnce(&generate_session_keys_once,
221	    ssl3_GenerateSessionTicketKeys) != PR_SUCCESS)
222	return SECFailure;
223
224    if (!session_ticket_keys_initialized)
225	return SECFailure;
226
227    *aes_key = session_ticket_enc_key;
228    *aes_key_length = sizeof(session_ticket_enc_key);
229    *mac_key = session_ticket_mac_key;
230    *mac_key_length = sizeof(session_ticket_mac_key);
231
232    return SECSuccess;
233}
234#endif
235
236/* Table of handlers for received TLS hello extensions, one per extension.
237 * In the second generation, this table will be dynamic, and functions
238 * will be registered here.
239 */
240/* This table is used by the server, to handle client hello extensions. */
241static const ssl3HelloExtensionHandler clientHelloHandlers[] = {
242    { ssl_server_name_xtn,        &ssl3_HandleServerNameXtn },
243#ifdef NSS_ENABLE_ECC
244    { ssl_elliptic_curves_xtn,    &ssl3_HandleSupportedCurvesXtn },
245    { ssl_ec_point_formats_xtn,   &ssl3_HandleSupportedPointFormatsXtn },
246#endif
247    { ssl_session_ticket_xtn,     &ssl3_ServerHandleSessionTicketXtn },
248    { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn },
249    { ssl_next_proto_nego_xtn,    &ssl3_ServerHandleNextProtoNegoXtn },
250    { ssl_use_srtp_xtn,           &ssl3_HandleUseSRTPXtn },
251    { ssl_cert_status_xtn,        &ssl3_ServerHandleStatusRequestXtn },
252    { ssl_signature_algorithms_xtn, &ssl3_ServerHandleSigAlgsXtn },
253    { -1, NULL }
254};
255
256/* These two tables are used by the client, to handle server hello
257 * extensions. */
258static const ssl3HelloExtensionHandler serverHelloHandlersTLS[] = {
259    { ssl_server_name_xtn,        &ssl3_HandleServerNameXtn },
260    /* TODO: add a handler for ssl_ec_point_formats_xtn */
261    { ssl_session_ticket_xtn,     &ssl3_ClientHandleSessionTicketXtn },
262    { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn },
263    { ssl_next_proto_nego_xtn,    &ssl3_ClientHandleNextProtoNegoXtn },
264    { ssl_app_layer_protocol_xtn, &ssl3_ClientHandleAppProtoXtn },
265    { ssl_use_srtp_xtn,           &ssl3_HandleUseSRTPXtn },
266    { ssl_channel_id_xtn,         &ssl3_ClientHandleChannelIDXtn },
267    { ssl_cert_status_xtn,        &ssl3_ClientHandleStatusRequestXtn },
268    { ssl_signed_certificate_timestamp_xtn,
269      &ssl3_ClientHandleSignedCertTimestampXtn },
270    { -1, NULL }
271};
272
273static const ssl3HelloExtensionHandler serverHelloHandlersSSL3[] = {
274    { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn },
275    { -1, NULL }
276};
277
278/* Tables of functions to format TLS hello extensions, one function per
279 * extension.
280 * These static tables are for the formatting of client hello extensions.
281 * The server's table of hello senders is dynamic, in the socket struct,
282 * and sender functions are registered there.
283 */
284static const
285ssl3HelloExtensionSender clientHelloSendersTLS[SSL_MAX_EXTENSIONS] = {
286    { ssl_server_name_xtn,        &ssl3_SendServerNameXtn        },
287    { ssl_renegotiation_info_xtn, &ssl3_SendRenegotiationInfoXtn },
288#ifdef NSS_ENABLE_ECC
289    { ssl_elliptic_curves_xtn,    &ssl3_SendSupportedCurvesXtn },
290    { ssl_ec_point_formats_xtn,   &ssl3_SendSupportedPointFormatsXtn },
291#endif
292    { ssl_session_ticket_xtn,     &ssl3_SendSessionTicketXtn },
293    { ssl_next_proto_nego_xtn,    &ssl3_ClientSendNextProtoNegoXtn },
294    { ssl_app_layer_protocol_xtn, &ssl3_ClientSendAppProtoXtn },
295    { ssl_use_srtp_xtn,           &ssl3_SendUseSRTPXtn },
296    { ssl_channel_id_xtn,         &ssl3_ClientSendChannelIDXtn },
297    { ssl_cert_status_xtn,        &ssl3_ClientSendStatusRequestXtn },
298    { ssl_signed_certificate_timestamp_xtn,
299      &ssl3_ClientSendSignedCertTimestampXtn },
300    /* WebSphere Application Server 7.0 is intolerant to the last extension
301     * being zero-length. It is not intolerant of TLS 1.2, so move
302     * signature_algorithms to the end. */
303    { ssl_signature_algorithms_xtn, &ssl3_ClientSendSigAlgsXtn }
304    /* any extra entries will appear as { 0, NULL }    */
305};
306
307static const
308ssl3HelloExtensionSender clientHelloSendersSSL3[SSL_MAX_EXTENSIONS] = {
309    { ssl_renegotiation_info_xtn, &ssl3_SendRenegotiationInfoXtn }
310    /* any extra entries will appear as { 0, NULL }    */
311};
312
313static PRBool
314arrayContainsExtension(const PRUint16 *array, PRUint32 len, PRUint16 ex_type)
315{
316    int i;
317    for (i = 0; i < len; i++) {
318	if (ex_type == array[i])
319	    return PR_TRUE;
320    }
321    return PR_FALSE;
322}
323
324PRBool
325ssl3_ExtensionNegotiated(sslSocket *ss, PRUint16 ex_type) {
326    TLSExtensionData *xtnData = &ss->xtnData;
327    return arrayContainsExtension(xtnData->negotiated,
328	                          xtnData->numNegotiated, ex_type);
329}
330
331static PRBool
332ssl3_ClientExtensionAdvertised(sslSocket *ss, PRUint16 ex_type) {
333    TLSExtensionData *xtnData = &ss->xtnData;
334    return arrayContainsExtension(xtnData->advertised,
335	                          xtnData->numAdvertised, ex_type);
336}
337
338/* Format an SNI extension, using the name from the socket's URL,
339 * unless that name is a dotted decimal string.
340 * Used by client and server.
341 */
342PRInt32
343ssl3_SendServerNameXtn(sslSocket * ss, PRBool append,
344                       PRUint32 maxBytes)
345{
346    SECStatus rv;
347    if (!ss)
348    	return 0;
349    if (!ss->sec.isServer) {
350        PRUint32 len;
351        PRNetAddr netAddr;
352
353        /* must have a hostname */
354        if (!ss->url || !ss->url[0])
355            return 0;
356        /* must not be an IPv4 or IPv6 address */
357        if (PR_SUCCESS == PR_StringToNetAddr(ss->url, &netAddr)) {
358            /* is an IP address (v4 or v6) */
359            return 0;
360        }
361        len  = PORT_Strlen(ss->url);
362        if (append && maxBytes >= len + 9) {
363            /* extension_type */
364            rv = ssl3_AppendHandshakeNumber(ss, ssl_server_name_xtn, 2);
365            if (rv != SECSuccess) return -1;
366            /* length of extension_data */
367            rv = ssl3_AppendHandshakeNumber(ss, len + 5, 2);
368            if (rv != SECSuccess) return -1;
369            /* length of server_name_list */
370            rv = ssl3_AppendHandshakeNumber(ss, len + 3, 2);
371            if (rv != SECSuccess) return -1;
372            /* Name Type (sni_host_name) */
373            rv = ssl3_AppendHandshake(ss,       "\0",    1);
374            if (rv != SECSuccess) return -1;
375            /* HostName (length and value) */
376            rv = ssl3_AppendHandshakeVariable(ss, (PRUint8 *)ss->url, len, 2);
377            if (rv != SECSuccess) return -1;
378            if (!ss->sec.isServer) {
379                TLSExtensionData *xtnData = &ss->xtnData;
380                xtnData->advertised[xtnData->numAdvertised++] =
381		    ssl_server_name_xtn;
382            }
383        }
384        return len + 9;
385    }
386    /* Server side */
387    if (append && maxBytes >= 4) {
388        rv = ssl3_AppendHandshakeNumber(ss, ssl_server_name_xtn, 2);
389        if (rv != SECSuccess)  return -1;
390        /* length of extension_data */
391        rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
392        if (rv != SECSuccess) return -1;
393    }
394    return 4;
395}
396
397/* handle an incoming SNI extension, by ignoring it. */
398SECStatus
399ssl3_HandleServerNameXtn(sslSocket * ss, PRUint16 ex_type, SECItem *data)
400{
401    SECItem *names = NULL;
402    PRUint32 listCount = 0, namesPos = 0, i;
403    TLSExtensionData *xtnData = &ss->xtnData;
404    SECItem  ldata;
405    PRInt32  listLenBytes = 0;
406
407    if (!ss->sec.isServer) {
408        /* Verify extension_data is empty. */
409        if (data->data || data->len ||
410            !ssl3_ExtensionNegotiated(ss, ssl_server_name_xtn)) {
411            /* malformed or was not initiated by the client.*/
412            return SECFailure;
413        }
414        return SECSuccess;
415    }
416
417    /* Server side - consume client data and register server sender. */
418    /* do not parse the data if don't have user extension handling function. */
419    if (!ss->sniSocketConfig) {
420        return SECSuccess;
421    }
422    /* length of server_name_list */
423    listLenBytes = ssl3_ConsumeHandshakeNumber(ss, 2, &data->data, &data->len);
424    if (listLenBytes == 0 || listLenBytes != data->len) {
425        return SECFailure;
426    }
427    ldata = *data;
428    /* Calculate the size of the array.*/
429    while (listLenBytes > 0) {
430        SECItem litem;
431        SECStatus rv;
432        PRInt32  type;
433        /* Name Type (sni_host_name) */
434        type = ssl3_ConsumeHandshakeNumber(ss, 1, &ldata.data, &ldata.len);
435        if (!ldata.len) {
436            return SECFailure;
437        }
438        rv = ssl3_ConsumeHandshakeVariable(ss, &litem, 2, &ldata.data, &ldata.len);
439        if (rv != SECSuccess) {
440            return SECFailure;
441        }
442        /* Adjust total length for cunsumed item, item len and type.*/
443        listLenBytes -= litem.len + 3;
444        if (listLenBytes > 0 && !ldata.len) {
445            return SECFailure;
446        }
447        listCount += 1;
448    }
449    if (!listCount) {
450        return SECFailure;
451    }
452    names = PORT_ZNewArray(SECItem, listCount);
453    if (!names) {
454        return SECFailure;
455    }
456    for (i = 0;i < listCount;i++) {
457        int j;
458        PRInt32  type;
459        SECStatus rv;
460        PRBool nametypePresent = PR_FALSE;
461        /* Name Type (sni_host_name) */
462        type = ssl3_ConsumeHandshakeNumber(ss, 1, &data->data, &data->len);
463        /* Check if we have such type in the list */
464        for (j = 0;j < listCount && names[j].data;j++) {
465            if (names[j].type == type) {
466                nametypePresent = PR_TRUE;
467                break;
468            }
469        }
470        /* HostName (length and value) */
471        rv = ssl3_ConsumeHandshakeVariable(ss, &names[namesPos], 2,
472                                           &data->data, &data->len);
473        if (rv != SECSuccess) {
474            goto loser;
475        }
476        if (nametypePresent == PR_FALSE) {
477            namesPos += 1;
478        }
479    }
480    /* Free old and set the new data. */
481    if (xtnData->sniNameArr) {
482        PORT_Free(ss->xtnData.sniNameArr);
483    }
484    xtnData->sniNameArr = names;
485    xtnData->sniNameArrSize = namesPos;
486    xtnData->negotiated[xtnData->numNegotiated++] = ssl_server_name_xtn;
487
488    return SECSuccess;
489
490loser:
491    PORT_Free(names);
492    return SECFailure;
493}
494
495/* Called by both clients and servers.
496 * Clients sends a filled in session ticket if one is available, and otherwise
497 * sends an empty ticket.  Servers always send empty tickets.
498 */
499PRInt32
500ssl3_SendSessionTicketXtn(
501			sslSocket * ss,
502			PRBool      append,
503			PRUint32    maxBytes)
504{
505    PRInt32 extension_length;
506    NewSessionTicket *session_ticket = NULL;
507    sslSessionID *sid = ss->sec.ci.sid;
508
509    /* Ignore the SessionTicket extension if processing is disabled. */
510    if (!ss->opt.enableSessionTickets)
511	return 0;
512
513    /* Empty extension length = extension_type (2-bytes) +
514     * length(extension_data) (2-bytes)
515     */
516    extension_length = 4;
517
518    /* If we are a client then send a session ticket if one is availble.
519     * Servers that support the extension and are willing to negotiate the
520     * the extension always respond with an empty extension.
521     */
522    if (!ss->sec.isServer) {
523	/* The caller must be holding sid->u.ssl3.lock for reading. We cannot
524	 * just acquire and release the lock within this function because the
525	 * caller will call this function twice, and we need the inputs to be
526	 * consistent between the two calls. Note that currently the caller
527	 * will only be holding the lock when we are the client and when we're
528	 * attempting to resume an existing session.
529	 */
530
531	session_ticket = &sid->u.ssl3.locked.sessionTicket;
532	if (session_ticket->ticket.data) {
533	    if (ss->xtnData.ticketTimestampVerified) {
534		extension_length += session_ticket->ticket.len;
535	    } else if (!append &&
536		(session_ticket->ticket_lifetime_hint == 0 ||
537		(session_ticket->ticket_lifetime_hint +
538		    session_ticket->received_timestamp > ssl_Time()))) {
539		extension_length += session_ticket->ticket.len;
540		ss->xtnData.ticketTimestampVerified = PR_TRUE;
541	    }
542	}
543    }
544
545    if (append && maxBytes >= extension_length) {
546	SECStatus rv;
547	/* extension_type */
548        rv = ssl3_AppendHandshakeNumber(ss, ssl_session_ticket_xtn, 2);
549        if (rv != SECSuccess)
550	    goto loser;
551	if (session_ticket && session_ticket->ticket.data &&
552	    ss->xtnData.ticketTimestampVerified) {
553	    rv = ssl3_AppendHandshakeVariable(ss, session_ticket->ticket.data,
554		session_ticket->ticket.len, 2);
555	    ss->xtnData.ticketTimestampVerified = PR_FALSE;
556	    ss->xtnData.sentSessionTicketInClientHello = PR_TRUE;
557	} else {
558	    rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
559	}
560        if (rv != SECSuccess)
561	    goto loser;
562
563	if (!ss->sec.isServer) {
564	    TLSExtensionData *xtnData = &ss->xtnData;
565	    xtnData->advertised[xtnData->numAdvertised++] =
566		ssl_session_ticket_xtn;
567	}
568    } else if (maxBytes < extension_length) {
569	PORT_Assert(0);
570        return 0;
571    }
572    return extension_length;
573
574 loser:
575    ss->xtnData.ticketTimestampVerified = PR_FALSE;
576    return -1;
577}
578
579/* handle an incoming Next Protocol Negotiation extension. */
580static SECStatus
581ssl3_ServerHandleNextProtoNegoXtn(sslSocket * ss, PRUint16 ex_type, SECItem *data)
582{
583    if (ss->firstHsDone || data->len != 0) {
584	/* Clients MUST send an empty NPN extension, if any. */
585	PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
586	return SECFailure;
587    }
588
589    ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
590
591    /* TODO: server side NPN support would require calling
592     * ssl3_RegisterServerHelloExtensionSender here in order to echo the
593     * extension back to the client. */
594
595    return SECSuccess;
596}
597
598/* ssl3_ValidateNextProtoNego checks that the given block of data is valid: none
599 * of the lengths may be 0 and the sum of the lengths must equal the length of
600 * the block. */
601SECStatus
602ssl3_ValidateNextProtoNego(const unsigned char* data, unsigned int length)
603{
604    unsigned int offset = 0;
605
606    while (offset < length) {
607	unsigned int newOffset = offset + 1 + (unsigned int) data[offset];
608	/* Reject embedded nulls to protect against buggy applications that
609	 * store protocol identifiers in null-terminated strings.
610	 */
611	if (newOffset > length || data[offset] == 0) {
612	    PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
613	    return SECFailure;
614	}
615	offset = newOffset;
616    }
617
618    if (offset > length) {
619	PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
620	return SECFailure;
621    }
622
623    return SECSuccess;
624}
625
626static SECStatus
627ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss, PRUint16 ex_type,
628				  SECItem *data)
629{
630    SECStatus rv;
631    unsigned char resultBuffer[255];
632    SECItem result = { siBuffer, resultBuffer, 0 };
633
634    PORT_Assert(!ss->firstHsDone);
635
636    if (ssl3_ExtensionNegotiated(ss, ssl_app_layer_protocol_xtn)) {
637	/* If the server negotiated ALPN then it has already told us what protocol
638	 * to use, so it doesn't make sense for us to try to negotiate a different
639	 * one by sending the NPN handshake message. However, if we've negotiated
640	 * NPN then we're required to send the NPN handshake message. Thus, these
641	 * two extensions cannot both be negotiated on the same connection. */
642	PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
643	return SECFailure;
644    }
645
646    rv = ssl3_ValidateNextProtoNego(data->data, data->len);
647    if (rv != SECSuccess)
648	return rv;
649
650    /* ss->nextProtoCallback cannot normally be NULL if we negotiated the
651     * extension. However, It is possible that an application erroneously
652     * cleared the callback between the time we sent the ClientHello and now.
653     */
654    PORT_Assert(ss->nextProtoCallback != NULL);
655    if (!ss->nextProtoCallback) {
656	/* XXX Use a better error code. This is an application error, not an
657	 * NSS bug. */
658	PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
659	return SECFailure;
660    }
661
662    rv = ss->nextProtoCallback(ss->nextProtoArg, ss->fd, data->data, data->len,
663			       result.data, &result.len, sizeof resultBuffer);
664    if (rv != SECSuccess)
665	return rv;
666    /* If the callback wrote more than allowed to |result| it has corrupted our
667     * stack. */
668    if (result.len > sizeof resultBuffer) {
669	PORT_SetError(SEC_ERROR_OUTPUT_LEN);
670	return SECFailure;
671    }
672
673    ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
674
675    SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE);
676    return SECITEM_CopyItem(NULL, &ss->ssl3.nextProto, &result);
677}
678
679static SECStatus
680ssl3_ClientHandleAppProtoXtn(sslSocket *ss, PRUint16 ex_type, SECItem *data)
681{
682    const unsigned char* d = data->data;
683    PRUint16 name_list_len;
684    SECItem protocol_name;
685
686    if (ssl3_ExtensionNegotiated(ss, ssl_next_proto_nego_xtn)) {
687	PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
688	return SECFailure;
689    }
690
691    /* The extension data from the server has the following format:
692     *   uint16 name_list_len;
693     *   uint8 len;
694     *   uint8 protocol_name[len]; */
695    if (data->len < 4 || data->len > 2 + 1 + 255) {
696	PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
697	return SECFailure;
698    }
699
700    name_list_len = ((PRUint16) d[0]) << 8 |
701	            ((PRUint16) d[1]);
702    if (name_list_len != data->len - 2 || d[2] != data->len - 3) {
703	PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
704	return SECFailure;
705    }
706
707    protocol_name.data = data->data + 3;
708    protocol_name.len = data->len - 3;
709
710    SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE);
711    ss->ssl3.nextProtoState = SSL_NEXT_PROTO_SELECTED;
712    ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
713    return SECITEM_CopyItem(NULL, &ss->ssl3.nextProto, &protocol_name);
714}
715
716static PRInt32
717ssl3_ClientSendNextProtoNegoXtn(sslSocket * ss, PRBool append,
718				PRUint32 maxBytes)
719{
720    PRInt32 extension_length;
721
722    /* Renegotiations do not send this extension. */
723    if (!ss->opt.enableNPN || !ss->nextProtoCallback || ss->firstHsDone) {
724	return 0;
725    }
726
727    extension_length = 4;
728
729    if (append && maxBytes >= extension_length) {
730	SECStatus rv;
731	rv = ssl3_AppendHandshakeNumber(ss, ssl_next_proto_nego_xtn, 2);
732	if (rv != SECSuccess)
733	    goto loser;
734	rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
735	if (rv != SECSuccess)
736	    goto loser;
737	ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
738		ssl_next_proto_nego_xtn;
739    } else if (maxBytes < extension_length) {
740	return 0;
741    }
742
743    return extension_length;
744
745loser:
746    return -1;
747}
748
749static PRInt32
750ssl3_ClientSendAppProtoXtn(sslSocket * ss, PRBool append, PRUint32 maxBytes)
751{
752    PRInt32 extension_length;
753    unsigned char *alpn_protos = NULL;
754
755    /* Renegotiations do not send this extension. */
756    if (!ss->opt.enableALPN || !ss->opt.nextProtoNego.data || ss->firstHsDone) {
757	return 0;
758    }
759
760    extension_length = 2 /* extension type */ + 2 /* extension length */ +
761		       2 /* protocol name list length */ +
762		       ss->opt.nextProtoNego.len;
763
764    if (append && maxBytes >= extension_length) {
765	/* NPN requires that the client's fallback protocol is first in the
766	 * list. However, ALPN sends protocols in preference order. So we
767	 * allocate a buffer and move the first protocol to the end of the
768	 * list. */
769	SECStatus rv;
770	const unsigned int len = ss->opt.nextProtoNego.len;
771
772	alpn_protos = PORT_Alloc(len);
773	if (alpn_protos == NULL) {
774	    return SECFailure;
775	}
776	if (len > 0) {
777	    /* Each protocol string is prefixed with a single byte length. */
778	    unsigned int i = ss->opt.nextProtoNego.data[0] + 1;
779	    if (i <= len) {
780		memcpy(alpn_protos, &ss->opt.nextProtoNego.data[i], len - i);
781		memcpy(alpn_protos + len - i, ss->opt.nextProtoNego.data, i);
782	    } else {
783		/* This seems to be invalid data so we'll send as-is. */
784		memcpy(alpn_protos, ss->opt.nextProtoNego.data, len);
785	    }
786	}
787
788	rv = ssl3_AppendHandshakeNumber(ss, ssl_app_layer_protocol_xtn, 2);
789	if (rv != SECSuccess) {
790	    goto loser;
791	}
792	rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2);
793	if (rv != SECSuccess) {
794	    goto loser;
795	}
796	rv = ssl3_AppendHandshakeVariable(ss, alpn_protos, len, 2);
797	PORT_Free(alpn_protos);
798	alpn_protos = NULL;
799	if (rv != SECSuccess) {
800	    goto loser;
801	}
802	ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
803		ssl_app_layer_protocol_xtn;
804    } else if (maxBytes < extension_length) {
805	return 0;
806    }
807
808    return extension_length;
809
810loser:
811    if (alpn_protos) {
812	PORT_Free(alpn_protos);
813    }
814    return -1;
815}
816
817static SECStatus
818ssl3_ClientHandleChannelIDXtn(sslSocket *ss, PRUint16 ex_type,
819			     SECItem *data)
820{
821    PORT_Assert(ss->getChannelID != NULL);
822
823    if (data->len) {
824	PORT_SetError(SSL_ERROR_BAD_CHANNEL_ID_DATA);
825	return SECFailure;
826    }
827    ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
828    return SECSuccess;
829}
830
831static PRInt32
832ssl3_ClientSendChannelIDXtn(sslSocket * ss, PRBool append,
833			    PRUint32 maxBytes)
834{
835    PRInt32 extension_length = 4;
836
837    if (!ss->getChannelID)
838	return 0;
839
840    if (maxBytes < extension_length) {
841	PORT_Assert(0);
842	return 0;
843    }
844
845    if (ss->sec.ci.sid->cached != never_cached &&
846        ss->sec.ci.sid->u.ssl3.originalHandshakeHash.len == 0) {
847        /* We can't do ChannelID on a connection if we're resuming and didn't
848         * do ChannelID on the original connection: without ChannelID on the
849         * original connection we didn't record the handshake hashes needed for
850         * the signature. */
851	return 0;
852    }
853
854    if (append) {
855	SECStatus rv;
856	rv = ssl3_AppendHandshakeNumber(ss, ssl_channel_id_xtn, 2);
857	if (rv != SECSuccess)
858	    goto loser;
859	rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
860	if (rv != SECSuccess)
861	    goto loser;
862	ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
863		ssl_channel_id_xtn;
864    }
865
866    return extension_length;
867
868loser:
869    return -1;
870}
871
872static SECStatus
873ssl3_ClientHandleStatusRequestXtn(sslSocket *ss, PRUint16 ex_type,
874                                 SECItem *data)
875{
876    /* The echoed extension must be empty. */
877    if (data->len != 0)
878       return SECFailure;
879
880    /* Keep track of negotiated extensions. */
881    ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
882
883    return SECSuccess;
884}
885
886static PRInt32
887ssl3_ServerSendStatusRequestXtn(
888			sslSocket * ss,
889			PRBool      append,
890			PRUint32    maxBytes)
891{
892    PRInt32 extension_length;
893    SECStatus rv;
894    int i;
895    PRBool haveStatus = PR_FALSE;
896
897    for (i = kt_null; i < kt_kea_size; i++) {
898	/* TODO: This is a temporary workaround.
899	 *       The correct code needs to see if we have an OCSP response for
900	 *       the server certificate being used, rather than if we have any
901	 *       OCSP response. See also ssl3_SendCertificateStatus.
902	 */
903	if (ss->certStatusArray[i] && ss->certStatusArray[i]->len) {
904	    haveStatus = PR_TRUE;
905	    break;
906	}
907    }
908    if (!haveStatus)
909	return 0;
910
911    extension_length = 2 + 2;
912    if (append && maxBytes >= extension_length) {
913	/* extension_type */
914	rv = ssl3_AppendHandshakeNumber(ss, ssl_cert_status_xtn, 2);
915	if (rv != SECSuccess)
916	    return -1;
917	/* length of extension_data */
918	rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
919	if (rv != SECSuccess)
920	    return -1;
921    }
922
923    return extension_length;
924}
925
926/* ssl3_ClientSendStatusRequestXtn builds the status_request extension on the
927 * client side. See RFC 4366 section 3.6. */
928static PRInt32
929ssl3_ClientSendStatusRequestXtn(sslSocket * ss, PRBool append,
930                               PRUint32 maxBytes)
931{
932    PRInt32 extension_length;
933
934    if (!ss->opt.enableOCSPStapling)
935       return 0;
936
937    /* extension_type (2-bytes) +
938     * length(extension_data) (2-bytes) +
939     * status_type (1) +
940     * responder_id_list length (2) +
941     * request_extensions length (2)
942     */
943    extension_length = 9;
944
945    if (append && maxBytes >= extension_length) {
946       SECStatus rv;
947       TLSExtensionData *xtnData;
948
949       /* extension_type */
950       rv = ssl3_AppendHandshakeNumber(ss, ssl_cert_status_xtn, 2);
951       if (rv != SECSuccess)
952           return -1;
953       rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2);
954       if (rv != SECSuccess)
955           return -1;
956       rv = ssl3_AppendHandshakeNumber(ss, 1 /* status_type ocsp */, 1);
957       if (rv != SECSuccess)
958           return -1;
959       /* A zero length responder_id_list means that the responders are
960        * implicitly known to the server. */
961       rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
962       if (rv != SECSuccess)
963           return -1;
964       /* A zero length request_extensions means that there are no extensions.
965        * Specifically, we don't set the id-pkix-ocsp-nonce extension. This
966        * means that the server can replay a cached OCSP response to us. */
967       rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
968       if (rv != SECSuccess)
969           return -1;
970
971       xtnData = &ss->xtnData;
972       xtnData->advertised[xtnData->numAdvertised++] = ssl_cert_status_xtn;
973    } else if (maxBytes < extension_length) {
974       PORT_Assert(0);
975       return 0;
976    }
977    return extension_length;
978}
979
980/*
981 * NewSessionTicket
982 * Called from ssl3_HandleFinished
983 */
984SECStatus
985ssl3_SendNewSessionTicket(sslSocket *ss)
986{
987    int                  i;
988    SECStatus            rv;
989    NewSessionTicket     ticket;
990    SECItem              plaintext;
991    SECItem              plaintext_item = {0, NULL, 0};
992    SECItem              ciphertext     = {0, NULL, 0};
993    PRUint32             ciphertext_length;
994    PRBool               ms_is_wrapped;
995    unsigned char        wrapped_ms[SSL3_MASTER_SECRET_LENGTH];
996    SECItem              ms_item = {0, NULL, 0};
997    SSL3KEAType          effectiveExchKeyType = ssl_kea_null;
998    PRUint32             padding_length;
999    PRUint32             message_length;
1000    PRUint32             cert_length;
1001    PRUint8              length_buf[4];
1002    PRUint32             now;
1003    PK11SymKey          *aes_key_pkcs11;
1004    PK11SymKey          *mac_key_pkcs11;
1005#ifndef NO_PKCS11_BYPASS
1006    const unsigned char *aes_key;
1007    const unsigned char *mac_key;
1008    PRUint32             aes_key_length;
1009    PRUint32             mac_key_length;
1010    PRUint64             aes_ctx_buf[MAX_CIPHER_CONTEXT_LLONGS];
1011    AESContext          *aes_ctx;
1012    const SECHashObject *hashObj = NULL;
1013    PRUint64             hmac_ctx_buf[MAX_MAC_CONTEXT_LLONGS];
1014    HMACContext         *hmac_ctx;
1015#endif
1016    CK_MECHANISM_TYPE    cipherMech = CKM_AES_CBC;
1017    PK11Context         *aes_ctx_pkcs11;
1018    CK_MECHANISM_TYPE    macMech = CKM_SHA256_HMAC;
1019    PK11Context         *hmac_ctx_pkcs11;
1020    unsigned char        computed_mac[TLS_EX_SESS_TICKET_MAC_LENGTH];
1021    unsigned int         computed_mac_length;
1022    unsigned char        iv[AES_BLOCK_SIZE];
1023    SECItem              ivItem;
1024    SECItem             *srvName = NULL;
1025    PRUint32             srvNameLen = 0;
1026    CK_MECHANISM_TYPE    msWrapMech = 0; /* dummy default value,
1027                                          * must be >= 0 */
1028
1029    SSL_TRC(3, ("%d: SSL3[%d]: send session_ticket handshake",
1030		SSL_GETPID(), ss->fd));
1031
1032    PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
1033    PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
1034
1035    ticket.ticket_lifetime_hint = TLS_EX_SESS_TICKET_LIFETIME_HINT;
1036    cert_length = (ss->opt.requestCertificate && ss->sec.ci.sid->peerCert) ?
1037	3 + ss->sec.ci.sid->peerCert->derCert.len : 0;
1038
1039    /* Get IV and encryption keys */
1040    ivItem.data = iv;
1041    ivItem.len = sizeof(iv);
1042    rv = PK11_GenerateRandom(iv, sizeof(iv));
1043    if (rv != SECSuccess) goto loser;
1044
1045#ifndef NO_PKCS11_BYPASS
1046    if (ss->opt.bypassPKCS11) {
1047	rv = ssl3_GetSessionTicketKeys(&aes_key, &aes_key_length,
1048	    &mac_key, &mac_key_length);
1049    } else
1050#endif
1051    {
1052	rv = ssl3_GetSessionTicketKeysPKCS11(ss, &aes_key_pkcs11,
1053	    &mac_key_pkcs11);
1054    }
1055    if (rv != SECSuccess) goto loser;
1056
1057    if (ss->ssl3.pwSpec->msItem.len && ss->ssl3.pwSpec->msItem.data) {
1058	/* The master secret is available unwrapped. */
1059	ms_item.data = ss->ssl3.pwSpec->msItem.data;
1060	ms_item.len = ss->ssl3.pwSpec->msItem.len;
1061	ms_is_wrapped = PR_FALSE;
1062    } else {
1063	/* Extract the master secret wrapped. */
1064	sslSessionID sid;
1065	PORT_Memset(&sid, 0, sizeof(sslSessionID));
1066
1067	if (ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa) {
1068	    effectiveExchKeyType = kt_rsa;
1069	} else {
1070	    effectiveExchKeyType = ss->ssl3.hs.kea_def->exchKeyType;
1071	}
1072
1073	rv = ssl3_CacheWrappedMasterSecret(ss, &sid, ss->ssl3.pwSpec,
1074	    effectiveExchKeyType);
1075	if (rv == SECSuccess) {
1076	    if (sid.u.ssl3.keys.wrapped_master_secret_len > sizeof(wrapped_ms))
1077		goto loser;
1078	    memcpy(wrapped_ms, sid.u.ssl3.keys.wrapped_master_secret,
1079		sid.u.ssl3.keys.wrapped_master_secret_len);
1080	    ms_item.data = wrapped_ms;
1081	    ms_item.len = sid.u.ssl3.keys.wrapped_master_secret_len;
1082	    msWrapMech = sid.u.ssl3.masterWrapMech;
1083	} else {
1084	    /* TODO: else send an empty ticket. */
1085	    goto loser;
1086	}
1087	ms_is_wrapped = PR_TRUE;
1088    }
1089    /* Prep to send negotiated name */
1090    srvName = &ss->ssl3.pwSpec->srvVirtName;
1091    if (srvName->data && srvName->len) {
1092        srvNameLen = 2 + srvName->len; /* len bytes + name len */
1093    }
1094
1095    ciphertext_length =
1096	sizeof(PRUint16)                     /* ticket_version */
1097	+ sizeof(SSL3ProtocolVersion)        /* ssl_version */
1098	+ sizeof(ssl3CipherSuite)            /* ciphersuite */
1099	+ 1                                  /* compression */
1100	+ 10                                 /* cipher spec parameters */
1101	+ 1                                  /* SessionTicket.ms_is_wrapped */
1102	+ 1                                  /* effectiveExchKeyType */
1103	+ 4                                  /* msWrapMech */
1104	+ 2                                  /* master_secret.length */
1105	+ ms_item.len                        /* master_secret */
1106	+ 1                                  /* client_auth_type */
1107	+ cert_length                        /* cert */
1108        + 1                                  /* server name type */
1109        + srvNameLen                         /* name len + length field */
1110	+ sizeof(ticket.ticket_lifetime_hint);
1111    padding_length =  AES_BLOCK_SIZE -
1112	(ciphertext_length % AES_BLOCK_SIZE);
1113    ciphertext_length += padding_length;
1114
1115    message_length =
1116	sizeof(ticket.ticket_lifetime_hint)    /* ticket_lifetime_hint */
1117	+ 2 /* length field for NewSessionTicket.ticket */
1118	+ SESS_TICKET_KEY_NAME_LEN             /* key_name */
1119	+ AES_BLOCK_SIZE                       /* iv */
1120	+ 2 /* length field for NewSessionTicket.ticket.encrypted_state */
1121	+ ciphertext_length                    /* encrypted_state */
1122	+ TLS_EX_SESS_TICKET_MAC_LENGTH;       /* mac */
1123
1124    if (SECITEM_AllocItem(NULL, &plaintext_item, ciphertext_length) == NULL)
1125	goto loser;
1126
1127    plaintext = plaintext_item;
1128
1129    /* ticket_version */
1130    rv = ssl3_AppendNumberToItem(&plaintext, TLS_EX_SESS_TICKET_VERSION,
1131	sizeof(PRUint16));
1132    if (rv != SECSuccess) goto loser;
1133
1134    /* ssl_version */
1135    rv = ssl3_AppendNumberToItem(&plaintext, ss->version,
1136	sizeof(SSL3ProtocolVersion));
1137    if (rv != SECSuccess) goto loser;
1138
1139    /* ciphersuite */
1140    rv = ssl3_AppendNumberToItem(&plaintext, ss->ssl3.hs.cipher_suite,
1141	sizeof(ssl3CipherSuite));
1142    if (rv != SECSuccess) goto loser;
1143
1144    /* compression */
1145    rv = ssl3_AppendNumberToItem(&plaintext, ss->ssl3.hs.compression, 1);
1146    if (rv != SECSuccess) goto loser;
1147
1148    /* cipher spec parameters */
1149    rv = ssl3_AppendNumberToItem(&plaintext, ss->sec.authAlgorithm, 1);
1150    if (rv != SECSuccess) goto loser;
1151    rv = ssl3_AppendNumberToItem(&plaintext, ss->sec.authKeyBits, 4);
1152    if (rv != SECSuccess) goto loser;
1153    rv = ssl3_AppendNumberToItem(&plaintext, ss->sec.keaType, 1);
1154    if (rv != SECSuccess) goto loser;
1155    rv = ssl3_AppendNumberToItem(&plaintext, ss->sec.keaKeyBits, 4);
1156    if (rv != SECSuccess) goto loser;
1157
1158    /* master_secret */
1159    rv = ssl3_AppendNumberToItem(&plaintext, ms_is_wrapped, 1);
1160    if (rv != SECSuccess) goto loser;
1161    rv = ssl3_AppendNumberToItem(&plaintext, effectiveExchKeyType, 1);
1162    if (rv != SECSuccess) goto loser;
1163    rv = ssl3_AppendNumberToItem(&plaintext, msWrapMech, 4);
1164    if (rv != SECSuccess) goto loser;
1165    rv = ssl3_AppendNumberToItem(&plaintext, ms_item.len, 2);
1166    if (rv != SECSuccess) goto loser;
1167    rv = ssl3_AppendToItem(&plaintext, ms_item.data, ms_item.len);
1168    if (rv != SECSuccess) goto loser;
1169
1170    /* client_identity */
1171    if (ss->opt.requestCertificate && ss->sec.ci.sid->peerCert) {
1172	rv = ssl3_AppendNumberToItem(&plaintext, CLIENT_AUTH_CERTIFICATE, 1);
1173	if (rv != SECSuccess) goto loser;
1174	rv = ssl3_AppendNumberToItem(&plaintext,
1175	    ss->sec.ci.sid->peerCert->derCert.len, 3);
1176	if (rv != SECSuccess) goto loser;
1177	rv = ssl3_AppendToItem(&plaintext,
1178	    ss->sec.ci.sid->peerCert->derCert.data,
1179	    ss->sec.ci.sid->peerCert->derCert.len);
1180	if (rv != SECSuccess) goto loser;
1181    } else {
1182	rv = ssl3_AppendNumberToItem(&plaintext, 0, 1);
1183	if (rv != SECSuccess) goto loser;
1184    }
1185
1186    /* timestamp */
1187    now = ssl_Time();
1188    rv = ssl3_AppendNumberToItem(&plaintext, now,
1189	sizeof(ticket.ticket_lifetime_hint));
1190    if (rv != SECSuccess) goto loser;
1191
1192    if (srvNameLen) {
1193        /* Name Type (sni_host_name) */
1194        rv = ssl3_AppendNumberToItem(&plaintext, srvName->type, 1);
1195        if (rv != SECSuccess) goto loser;
1196        /* HostName (length and value) */
1197        rv = ssl3_AppendNumberToItem(&plaintext, srvName->len, 2);
1198        if (rv != SECSuccess) goto loser;
1199        rv = ssl3_AppendToItem(&plaintext, srvName->data, srvName->len);
1200        if (rv != SECSuccess) goto loser;
1201    } else {
1202        /* No Name */
1203        rv = ssl3_AppendNumberToItem(&plaintext, (char)TLS_STE_NO_SERVER_NAME,
1204                                     1);
1205        if (rv != SECSuccess) goto loser;
1206    }
1207
1208    PORT_Assert(plaintext.len == padding_length);
1209    for (i = 0; i < padding_length; i++)
1210	plaintext.data[i] = (unsigned char)padding_length;
1211
1212    if (SECITEM_AllocItem(NULL, &ciphertext, ciphertext_length) == NULL) {
1213	rv = SECFailure;
1214	goto loser;
1215    }
1216
1217    /* Generate encrypted portion of ticket. */
1218#ifndef NO_PKCS11_BYPASS
1219    if (ss->opt.bypassPKCS11) {
1220	aes_ctx = (AESContext *)aes_ctx_buf;
1221	rv = AES_InitContext(aes_ctx, aes_key, aes_key_length, iv,
1222	    NSS_AES_CBC, 1, AES_BLOCK_SIZE);
1223	if (rv != SECSuccess) goto loser;
1224
1225	rv = AES_Encrypt(aes_ctx, ciphertext.data, &ciphertext.len,
1226	    ciphertext.len, plaintext_item.data,
1227	    plaintext_item.len);
1228	if (rv != SECSuccess) goto loser;
1229    } else
1230#endif
1231    {
1232	aes_ctx_pkcs11 = PK11_CreateContextBySymKey(cipherMech,
1233	    CKA_ENCRYPT, aes_key_pkcs11, &ivItem);
1234	if (!aes_ctx_pkcs11)
1235	    goto loser;
1236
1237	rv = PK11_CipherOp(aes_ctx_pkcs11, ciphertext.data,
1238	    (int *)&ciphertext.len, ciphertext.len,
1239	    plaintext_item.data, plaintext_item.len);
1240	PK11_Finalize(aes_ctx_pkcs11);
1241	PK11_DestroyContext(aes_ctx_pkcs11, PR_TRUE);
1242	if (rv != SECSuccess) goto loser;
1243    }
1244
1245    /* Convert ciphertext length to network order. */
1246    length_buf[0] = (ciphertext.len >> 8) & 0xff;
1247    length_buf[1] = (ciphertext.len     ) & 0xff;
1248
1249    /* Compute MAC. */
1250#ifndef NO_PKCS11_BYPASS
1251    if (ss->opt.bypassPKCS11) {
1252	hmac_ctx = (HMACContext *)hmac_ctx_buf;
1253	hashObj = HASH_GetRawHashObject(HASH_AlgSHA256);
1254	if (HMAC_Init(hmac_ctx, hashObj, mac_key,
1255		mac_key_length, PR_FALSE) != SECSuccess)
1256	    goto loser;
1257
1258	HMAC_Begin(hmac_ctx);
1259	HMAC_Update(hmac_ctx, key_name, SESS_TICKET_KEY_NAME_LEN);
1260	HMAC_Update(hmac_ctx, iv, sizeof(iv));
1261	HMAC_Update(hmac_ctx, (unsigned char *)length_buf, 2);
1262	HMAC_Update(hmac_ctx, ciphertext.data, ciphertext.len);
1263	HMAC_Finish(hmac_ctx, computed_mac, &computed_mac_length,
1264	    sizeof(computed_mac));
1265    } else
1266#endif
1267    {
1268	SECItem macParam;
1269	macParam.data = NULL;
1270	macParam.len = 0;
1271	hmac_ctx_pkcs11 = PK11_CreateContextBySymKey(macMech,
1272	    CKA_SIGN, mac_key_pkcs11, &macParam);
1273	if (!hmac_ctx_pkcs11)
1274	    goto loser;
1275
1276	rv = PK11_DigestBegin(hmac_ctx_pkcs11);
1277	rv = PK11_DigestOp(hmac_ctx_pkcs11, key_name,
1278	    SESS_TICKET_KEY_NAME_LEN);
1279	rv = PK11_DigestOp(hmac_ctx_pkcs11, iv, sizeof(iv));
1280	rv = PK11_DigestOp(hmac_ctx_pkcs11, (unsigned char *)length_buf, 2);
1281	rv = PK11_DigestOp(hmac_ctx_pkcs11, ciphertext.data, ciphertext.len);
1282	rv = PK11_DigestFinal(hmac_ctx_pkcs11, computed_mac,
1283	    &computed_mac_length, sizeof(computed_mac));
1284	PK11_DestroyContext(hmac_ctx_pkcs11, PR_TRUE);
1285	if (rv != SECSuccess) goto loser;
1286    }
1287
1288    /* Serialize the handshake message. */
1289    rv = ssl3_AppendHandshakeHeader(ss, new_session_ticket, message_length);
1290    if (rv != SECSuccess) goto loser;
1291
1292    rv = ssl3_AppendHandshakeNumber(ss, ticket.ticket_lifetime_hint,
1293	sizeof(ticket.ticket_lifetime_hint));
1294    if (rv != SECSuccess) goto loser;
1295
1296    rv = ssl3_AppendHandshakeNumber(ss,
1297	message_length - sizeof(ticket.ticket_lifetime_hint) - 2, 2);
1298    if (rv != SECSuccess) goto loser;
1299
1300    rv = ssl3_AppendHandshake(ss, key_name, SESS_TICKET_KEY_NAME_LEN);
1301    if (rv != SECSuccess) goto loser;
1302
1303    rv = ssl3_AppendHandshake(ss, iv, sizeof(iv));
1304    if (rv != SECSuccess) goto loser;
1305
1306    rv = ssl3_AppendHandshakeVariable(ss, ciphertext.data, ciphertext.len, 2);
1307    if (rv != SECSuccess) goto loser;
1308
1309    rv = ssl3_AppendHandshake(ss, computed_mac, computed_mac_length);
1310    if (rv != SECSuccess) goto loser;
1311
1312loser:
1313    if (plaintext_item.data)
1314	SECITEM_FreeItem(&plaintext_item, PR_FALSE);
1315    if (ciphertext.data)
1316	SECITEM_FreeItem(&ciphertext, PR_FALSE);
1317
1318    return rv;
1319}
1320
1321/* When a client receives a SessionTicket extension a NewSessionTicket
1322 * message is expected during the handshake.
1323 */
1324SECStatus
1325ssl3_ClientHandleSessionTicketXtn(sslSocket *ss, PRUint16 ex_type,
1326                                  SECItem *data)
1327{
1328    if (data->len != 0)
1329	return SECFailure;
1330
1331    /* Keep track of negotiated extensions. */
1332    ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
1333    return SECSuccess;
1334}
1335
1336SECStatus
1337ssl3_ServerHandleSessionTicketXtn(sslSocket *ss, PRUint16 ex_type,
1338                                  SECItem *data)
1339{
1340    SECStatus rv;
1341    SECItem *decrypted_state = NULL;
1342    SessionTicket *parsed_session_ticket = NULL;
1343    sslSessionID *sid = NULL;
1344    SSL3Statistics *ssl3stats;
1345
1346    /* Ignore the SessionTicket extension if processing is disabled. */
1347    if (!ss->opt.enableSessionTickets)
1348	return SECSuccess;
1349
1350    /* Keep track of negotiated extensions. */
1351    ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
1352
1353    /* Parse the received ticket sent in by the client.  We are
1354     * lenient about some parse errors, falling back to a fullshake
1355     * instead of terminating the current connection.
1356     */
1357    if (data->len == 0) {
1358	ss->xtnData.emptySessionTicket = PR_TRUE;
1359    } else {
1360	int                    i;
1361	SECItem                extension_data;
1362	EncryptedSessionTicket enc_session_ticket;
1363	unsigned char          computed_mac[TLS_EX_SESS_TICKET_MAC_LENGTH];
1364	unsigned int           computed_mac_length;
1365#ifndef NO_PKCS11_BYPASS
1366	const SECHashObject   *hashObj;
1367	const unsigned char   *aes_key;
1368	const unsigned char   *mac_key;
1369	PRUint32               aes_key_length;
1370	PRUint32               mac_key_length;
1371	PRUint64               hmac_ctx_buf[MAX_MAC_CONTEXT_LLONGS];
1372	HMACContext           *hmac_ctx;
1373	PRUint64               aes_ctx_buf[MAX_CIPHER_CONTEXT_LLONGS];
1374	AESContext            *aes_ctx;
1375#endif
1376	PK11SymKey            *aes_key_pkcs11;
1377	PK11SymKey            *mac_key_pkcs11;
1378	PK11Context           *hmac_ctx_pkcs11;
1379	CK_MECHANISM_TYPE      macMech = CKM_SHA256_HMAC;
1380	PK11Context           *aes_ctx_pkcs11;
1381	CK_MECHANISM_TYPE      cipherMech = CKM_AES_CBC;
1382	unsigned char *        padding;
1383	PRUint32               padding_length;
1384	unsigned char         *buffer;
1385	unsigned int           buffer_len;
1386	PRInt32                temp;
1387	SECItem                cert_item;
1388        PRInt8                 nameType = TLS_STE_NO_SERVER_NAME;
1389
1390	/* Turn off stateless session resumption if the client sends a
1391	 * SessionTicket extension, even if the extension turns out to be
1392	 * malformed (ss->sec.ci.sid is non-NULL when doing session
1393	 * renegotiation.)
1394	 */
1395	if (ss->sec.ci.sid != NULL) {
1396	    if (ss->sec.uncache)
1397		ss->sec.uncache(ss->sec.ci.sid);
1398	    ssl_FreeSID(ss->sec.ci.sid);
1399	    ss->sec.ci.sid = NULL;
1400	}
1401
1402	extension_data.data = data->data; /* Keep a copy for future use. */
1403	extension_data.len = data->len;
1404
1405	if (ssl3_ParseEncryptedSessionTicket(ss, data, &enc_session_ticket)
1406	    != SECSuccess)
1407	    return SECFailure;
1408
1409	/* Get session ticket keys. */
1410#ifndef NO_PKCS11_BYPASS
1411	if (ss->opt.bypassPKCS11) {
1412	    rv = ssl3_GetSessionTicketKeys(&aes_key, &aes_key_length,
1413		&mac_key, &mac_key_length);
1414	} else
1415#endif
1416	{
1417	    rv = ssl3_GetSessionTicketKeysPKCS11(ss, &aes_key_pkcs11,
1418		&mac_key_pkcs11);
1419	}
1420	if (rv != SECSuccess) {
1421	    SSL_DBG(("%d: SSL[%d]: Unable to get/generate session ticket keys.",
1422			SSL_GETPID(), ss->fd));
1423	    goto loser;
1424	}
1425
1426	/* If the ticket sent by the client was generated under a key different
1427	 * from the one we have, bypass ticket processing.
1428	 */
1429	if (PORT_Memcmp(enc_session_ticket.key_name, key_name,
1430		SESS_TICKET_KEY_NAME_LEN) != 0) {
1431	    SSL_DBG(("%d: SSL[%d]: Session ticket key_name sent mismatch.",
1432			SSL_GETPID(), ss->fd));
1433	    goto no_ticket;
1434	}
1435
1436	/* Verify the MAC on the ticket.  MAC verification may also
1437	 * fail if the MAC key has been recently refreshed.
1438	 */
1439#ifndef NO_PKCS11_BYPASS
1440	if (ss->opt.bypassPKCS11) {
1441	    hmac_ctx = (HMACContext *)hmac_ctx_buf;
1442	    hashObj = HASH_GetRawHashObject(HASH_AlgSHA256);
1443	    if (HMAC_Init(hmac_ctx, hashObj, mac_key,
1444		    sizeof(session_ticket_mac_key), PR_FALSE) != SECSuccess)
1445		goto no_ticket;
1446	    HMAC_Begin(hmac_ctx);
1447	    HMAC_Update(hmac_ctx, extension_data.data,
1448		extension_data.len - TLS_EX_SESS_TICKET_MAC_LENGTH);
1449	    if (HMAC_Finish(hmac_ctx, computed_mac, &computed_mac_length,
1450		    sizeof(computed_mac)) != SECSuccess)
1451		goto no_ticket;
1452	} else
1453#endif
1454	{
1455	    SECItem macParam;
1456	    macParam.data = NULL;
1457	    macParam.len = 0;
1458	    hmac_ctx_pkcs11 = PK11_CreateContextBySymKey(macMech,
1459		CKA_SIGN, mac_key_pkcs11, &macParam);
1460	    if (!hmac_ctx_pkcs11) {
1461		SSL_DBG(("%d: SSL[%d]: Unable to create HMAC context: %d.",
1462			    SSL_GETPID(), ss->fd, PORT_GetError()));
1463		goto no_ticket;
1464	    } else {
1465		SSL_DBG(("%d: SSL[%d]: Successfully created HMAC context.",
1466			    SSL_GETPID(), ss->fd));
1467	    }
1468	    rv = PK11_DigestBegin(hmac_ctx_pkcs11);
1469	    rv = PK11_DigestOp(hmac_ctx_pkcs11, extension_data.data,
1470		extension_data.len - TLS_EX_SESS_TICKET_MAC_LENGTH);
1471	    if (rv != SECSuccess) {
1472		PK11_DestroyContext(hmac_ctx_pkcs11, PR_TRUE);
1473		goto no_ticket;
1474	    }
1475	    rv = PK11_DigestFinal(hmac_ctx_pkcs11, computed_mac,
1476		&computed_mac_length, sizeof(computed_mac));
1477	    PK11_DestroyContext(hmac_ctx_pkcs11, PR_TRUE);
1478	    if (rv != SECSuccess)
1479		goto no_ticket;
1480	}
1481	if (NSS_SecureMemcmp(computed_mac, enc_session_ticket.mac,
1482		computed_mac_length) != 0) {
1483	    SSL_DBG(("%d: SSL[%d]: Session ticket MAC mismatch.",
1484			SSL_GETPID(), ss->fd));
1485	    goto no_ticket;
1486	}
1487
1488	/* We ignore key_name for now.
1489	 * This is ok as MAC verification succeeded.
1490	 */
1491
1492	/* Decrypt the ticket. */
1493
1494	/* Plaintext is shorter than the ciphertext due to padding. */
1495	decrypted_state = SECITEM_AllocItem(NULL, NULL,
1496	    enc_session_ticket.encrypted_state.len);
1497
1498#ifndef NO_PKCS11_BYPASS
1499	if (ss->opt.bypassPKCS11) {
1500	    aes_ctx = (AESContext *)aes_ctx_buf;
1501	    rv = AES_InitContext(aes_ctx, aes_key,
1502		sizeof(session_ticket_enc_key), enc_session_ticket.iv,
1503		NSS_AES_CBC, 0,AES_BLOCK_SIZE);
1504	    if (rv != SECSuccess) {
1505		SSL_DBG(("%d: SSL[%d]: Unable to create AES context.",
1506			    SSL_GETPID(), ss->fd));
1507		goto no_ticket;
1508	    }
1509
1510	    rv = AES_Decrypt(aes_ctx, decrypted_state->data,
1511		&decrypted_state->len, decrypted_state->len,
1512		enc_session_ticket.encrypted_state.data,
1513		enc_session_ticket.encrypted_state.len);
1514	    if (rv != SECSuccess)
1515		goto no_ticket;
1516	} else
1517#endif
1518	{
1519	    SECItem ivItem;
1520	    ivItem.data = enc_session_ticket.iv;
1521	    ivItem.len = AES_BLOCK_SIZE;
1522	    aes_ctx_pkcs11 = PK11_CreateContextBySymKey(cipherMech,
1523		CKA_DECRYPT, aes_key_pkcs11, &ivItem);
1524	    if (!aes_ctx_pkcs11) {
1525		SSL_DBG(("%d: SSL[%d]: Unable to create AES context.",
1526			    SSL_GETPID(), ss->fd));
1527		goto no_ticket;
1528	    }
1529
1530	    rv = PK11_CipherOp(aes_ctx_pkcs11, decrypted_state->data,
1531		(int *)&decrypted_state->len, decrypted_state->len,
1532		enc_session_ticket.encrypted_state.data,
1533		enc_session_ticket.encrypted_state.len);
1534	    PK11_Finalize(aes_ctx_pkcs11);
1535	    PK11_DestroyContext(aes_ctx_pkcs11, PR_TRUE);
1536	    if (rv != SECSuccess)
1537		goto no_ticket;
1538	}
1539
1540	/* Check padding. */
1541	padding_length =
1542	    (PRUint32)decrypted_state->data[decrypted_state->len - 1];
1543	if (padding_length == 0 || padding_length > AES_BLOCK_SIZE)
1544	    goto no_ticket;
1545
1546	padding = &decrypted_state->data[decrypted_state->len - padding_length];
1547	for (i = 0; i < padding_length; i++, padding++) {
1548	    if (padding_length != (PRUint32)*padding)
1549		goto no_ticket;
1550	}
1551
1552	/* Deserialize session state. */
1553	buffer = decrypted_state->data;
1554	buffer_len = decrypted_state->len;
1555
1556	parsed_session_ticket = PORT_ZAlloc(sizeof(SessionTicket));
1557	if (parsed_session_ticket == NULL) {
1558	    rv = SECFailure;
1559	    goto loser;
1560	}
1561
1562	/* Read ticket_version (which is ignored for now.) */
1563	temp = ssl3_ConsumeHandshakeNumber(ss, 2, &buffer, &buffer_len);
1564	if (temp < 0) goto no_ticket;
1565	parsed_session_ticket->ticket_version = (SSL3ProtocolVersion)temp;
1566
1567	/* Read SSLVersion. */
1568	temp = ssl3_ConsumeHandshakeNumber(ss, 2, &buffer, &buffer_len);
1569	if (temp < 0) goto no_ticket;
1570	parsed_session_ticket->ssl_version = (SSL3ProtocolVersion)temp;
1571
1572	/* Read cipher_suite. */
1573	temp =  ssl3_ConsumeHandshakeNumber(ss, 2, &buffer, &buffer_len);
1574	if (temp < 0) goto no_ticket;
1575	parsed_session_ticket->cipher_suite = (ssl3CipherSuite)temp;
1576
1577	/* Read compression_method. */
1578	temp = ssl3_ConsumeHandshakeNumber(ss, 1, &buffer, &buffer_len);
1579	if (temp < 0) goto no_ticket;
1580	parsed_session_ticket->compression_method = (SSLCompressionMethod)temp;
1581
1582	/* Read cipher spec parameters. */
1583	temp = ssl3_ConsumeHandshakeNumber(ss, 1, &buffer, &buffer_len);
1584	if (temp < 0) goto no_ticket;
1585	parsed_session_ticket->authAlgorithm = (SSLSignType)temp;
1586	temp = ssl3_ConsumeHandshakeNumber(ss, 4, &buffer, &buffer_len);
1587	if (temp < 0) goto no_ticket;
1588	parsed_session_ticket->authKeyBits = (PRUint32)temp;
1589	temp = ssl3_ConsumeHandshakeNumber(ss, 1, &buffer, &buffer_len);
1590	if (temp < 0) goto no_ticket;
1591	parsed_session_ticket->keaType = (SSLKEAType)temp;
1592	temp = ssl3_ConsumeHandshakeNumber(ss, 4, &buffer, &buffer_len);
1593	if (temp < 0) goto no_ticket;
1594	parsed_session_ticket->keaKeyBits = (PRUint32)temp;
1595
1596	/* Read wrapped master_secret. */
1597	temp = ssl3_ConsumeHandshakeNumber(ss, 1, &buffer, &buffer_len);
1598	if (temp < 0) goto no_ticket;
1599	parsed_session_ticket->ms_is_wrapped = (PRBool)temp;
1600
1601	temp = ssl3_ConsumeHandshakeNumber(ss, 1, &buffer, &buffer_len);
1602	if (temp < 0) goto no_ticket;
1603	parsed_session_ticket->exchKeyType = (SSL3KEAType)temp;
1604
1605	temp = ssl3_ConsumeHandshakeNumber(ss, 4, &buffer, &buffer_len);
1606	if (temp < 0) goto no_ticket;
1607	parsed_session_ticket->msWrapMech = (CK_MECHANISM_TYPE)temp;
1608
1609	temp = ssl3_ConsumeHandshakeNumber(ss, 2, &buffer, &buffer_len);
1610	if (temp < 0) goto no_ticket;
1611	parsed_session_ticket->ms_length = (PRUint16)temp;
1612	if (parsed_session_ticket->ms_length == 0 ||  /* sanity check MS. */
1613	    parsed_session_ticket->ms_length >
1614	    sizeof(parsed_session_ticket->master_secret))
1615	    goto no_ticket;
1616
1617	/* Allow for the wrapped master secret to be longer. */
1618	if (buffer_len < parsed_session_ticket->ms_length)
1619	    goto no_ticket;
1620	PORT_Memcpy(parsed_session_ticket->master_secret, buffer,
1621	    parsed_session_ticket->ms_length);
1622	buffer += parsed_session_ticket->ms_length;
1623	buffer_len -= parsed_session_ticket->ms_length;
1624
1625	/* Read client_identity */
1626	temp = ssl3_ConsumeHandshakeNumber(ss, 1, &buffer, &buffer_len);
1627	if (temp < 0)
1628	    goto no_ticket;
1629	parsed_session_ticket->client_identity.client_auth_type =
1630	    (ClientAuthenticationType)temp;
1631	switch(parsed_session_ticket->client_identity.client_auth_type) {
1632            case CLIENT_AUTH_ANONYMOUS:
1633		break;
1634            case CLIENT_AUTH_CERTIFICATE:
1635		rv = ssl3_ConsumeHandshakeVariable(ss, &cert_item, 3,
1636		    &buffer, &buffer_len);
1637		if (rv != SECSuccess) goto no_ticket;
1638		rv = SECITEM_CopyItem(NULL, &parsed_session_ticket->peer_cert,
1639		    &cert_item);
1640		if (rv != SECSuccess) goto no_ticket;
1641		break;
1642            default:
1643		goto no_ticket;
1644	}
1645	/* Read timestamp. */
1646	temp = ssl3_ConsumeHandshakeNumber(ss, 4, &buffer, &buffer_len);
1647	if (temp < 0)
1648	    goto no_ticket;
1649	parsed_session_ticket->timestamp = (PRUint32)temp;
1650
1651        /* Read server name */
1652        nameType =
1653                ssl3_ConsumeHandshakeNumber(ss, 1, &buffer, &buffer_len);
1654        if (nameType != TLS_STE_NO_SERVER_NAME) {
1655            SECItem name_item;
1656            rv = ssl3_ConsumeHandshakeVariable(ss, &name_item, 2, &buffer,
1657                                               &buffer_len);
1658            if (rv != SECSuccess) goto no_ticket;
1659            rv = SECITEM_CopyItem(NULL, &parsed_session_ticket->srvName,
1660                                  &name_item);
1661            if (rv != SECSuccess) goto no_ticket;
1662            parsed_session_ticket->srvName.type = nameType;
1663        }
1664
1665	/* Done parsing.  Check that all bytes have been consumed. */
1666	if (buffer_len != padding_length)
1667	    goto no_ticket;
1668
1669	/* Use the ticket if it has not expired, otherwise free the allocated
1670	 * memory since the ticket is of no use.
1671	 */
1672	if (parsed_session_ticket->timestamp != 0 &&
1673	    parsed_session_ticket->timestamp +
1674	    TLS_EX_SESS_TICKET_LIFETIME_HINT > ssl_Time()) {
1675
1676	    sid = ssl3_NewSessionID(ss, PR_TRUE);
1677	    if (sid == NULL) {
1678		rv = SECFailure;
1679		goto loser;
1680	    }
1681
1682	    /* Copy over parameters. */
1683	    sid->version = parsed_session_ticket->ssl_version;
1684	    sid->u.ssl3.cipherSuite = parsed_session_ticket->cipher_suite;
1685	    sid->u.ssl3.compression = parsed_session_ticket->compression_method;
1686	    sid->authAlgorithm = parsed_session_ticket->authAlgorithm;
1687	    sid->authKeyBits = parsed_session_ticket->authKeyBits;
1688	    sid->keaType = parsed_session_ticket->keaType;
1689	    sid->keaKeyBits = parsed_session_ticket->keaKeyBits;
1690
1691	    /* Copy master secret. */
1692#ifndef NO_PKCS11_BYPASS
1693	    if (ss->opt.bypassPKCS11 &&
1694		    parsed_session_ticket->ms_is_wrapped)
1695		goto no_ticket;
1696#endif
1697	    if (parsed_session_ticket->ms_length >
1698		    sizeof(sid->u.ssl3.keys.wrapped_master_secret))
1699		goto no_ticket;
1700	    PORT_Memcpy(sid->u.ssl3.keys.wrapped_master_secret,
1701		parsed_session_ticket->master_secret,
1702		parsed_session_ticket->ms_length);
1703	    sid->u.ssl3.keys.wrapped_master_secret_len =
1704		parsed_session_ticket->ms_length;
1705	    sid->u.ssl3.exchKeyType = parsed_session_ticket->exchKeyType;
1706	    sid->u.ssl3.masterWrapMech = parsed_session_ticket->msWrapMech;
1707	    sid->u.ssl3.keys.msIsWrapped =
1708		parsed_session_ticket->ms_is_wrapped;
1709	    sid->u.ssl3.masterValid    = PR_TRUE;
1710	    sid->u.ssl3.keys.resumable = PR_TRUE;
1711
1712	    /* Copy over client cert from session ticket if there is one. */
1713	    if (parsed_session_ticket->peer_cert.data != NULL) {
1714		if (sid->peerCert != NULL)
1715		    CERT_DestroyCertificate(sid->peerCert);
1716		sid->peerCert = CERT_NewTempCertificate(ss->dbHandle,
1717		    &parsed_session_ticket->peer_cert, NULL, PR_FALSE, PR_TRUE);
1718		if (sid->peerCert == NULL) {
1719		    rv = SECFailure;
1720		    goto loser;
1721		}
1722	    }
1723	    if (parsed_session_ticket->srvName.data != NULL) {
1724                sid->u.ssl3.srvName = parsed_session_ticket->srvName;
1725            }
1726	    ss->statelessResume = PR_TRUE;
1727	    ss->sec.ci.sid = sid;
1728	}
1729    }
1730
1731    if (0) {
1732no_ticket:
1733	SSL_DBG(("%d: SSL[%d]: Session ticket parsing failed.",
1734			SSL_GETPID(), ss->fd));
1735	ssl3stats = SSL_GetStatistics();
1736	SSL_AtomicIncrementLong(& ssl3stats->hch_sid_ticket_parse_failures );
1737    }
1738    rv = SECSuccess;
1739
1740loser:
1741	/* ss->sec.ci.sid == sid if it did NOT come here via goto statement
1742	 * in that case do not free sid
1743	 */
1744	if (sid && (ss->sec.ci.sid != sid)) {
1745	    ssl_FreeSID(sid);
1746	    sid = NULL;
1747	}
1748    if (decrypted_state != NULL) {
1749	SECITEM_FreeItem(decrypted_state, PR_TRUE);
1750	decrypted_state = NULL;
1751    }
1752
1753    if (parsed_session_ticket != NULL) {
1754	if (parsed_session_ticket->peer_cert.data) {
1755	    SECITEM_FreeItem(&parsed_session_ticket->peer_cert, PR_FALSE);
1756	}
1757	PORT_ZFree(parsed_session_ticket, sizeof(SessionTicket));
1758    }
1759
1760    return rv;
1761}
1762
1763/*
1764 * Read bytes.  Using this function means the SECItem structure
1765 * cannot be freed.  The caller is expected to call this function
1766 * on a shallow copy of the structure.
1767 */
1768static SECStatus
1769ssl3_ConsumeFromItem(SECItem *item, unsigned char **buf, PRUint32 bytes)
1770{
1771    if (bytes > item->len)
1772	return SECFailure;
1773
1774    *buf = item->data;
1775    item->data += bytes;
1776    item->len -= bytes;
1777    return SECSuccess;
1778}
1779
1780static SECStatus
1781ssl3_ParseEncryptedSessionTicket(sslSocket *ss, SECItem *data,
1782                                 EncryptedSessionTicket *enc_session_ticket)
1783{
1784    if (ssl3_ConsumeFromItem(data, &enc_session_ticket->key_name,
1785	    SESS_TICKET_KEY_NAME_LEN) != SECSuccess)
1786	return SECFailure;
1787    if (ssl3_ConsumeFromItem(data, &enc_session_ticket->iv,
1788	    AES_BLOCK_SIZE) != SECSuccess)
1789	return SECFailure;
1790    if (ssl3_ConsumeHandshakeVariable(ss, &enc_session_ticket->encrypted_state,
1791	    2, &data->data, &data->len) != SECSuccess)
1792	return SECFailure;
1793    if (ssl3_ConsumeFromItem(data, &enc_session_ticket->mac,
1794	    TLS_EX_SESS_TICKET_MAC_LENGTH) != SECSuccess)
1795	return SECFailure;
1796    if (data->len != 0)  /* Make sure that we have consumed all bytes. */
1797	return SECFailure;
1798
1799    return SECSuccess;
1800}
1801
1802/* go through hello extensions in buffer "b".
1803 * For each one, find the extension handler in the table, and
1804 * if present, invoke that handler.
1805 * Servers ignore any extensions with unknown extension types.
1806 * Clients reject any extensions with unadvertised extension types.
1807 */
1808SECStatus
1809ssl3_HandleHelloExtensions(sslSocket *ss, SSL3Opaque **b, PRUint32 *length)
1810{
1811    const ssl3HelloExtensionHandler * handlers;
1812
1813    if (ss->sec.isServer) {
1814        handlers = clientHelloHandlers;
1815    } else if (ss->version > SSL_LIBRARY_VERSION_3_0) {
1816        handlers = serverHelloHandlersTLS;
1817    } else {
1818        handlers = serverHelloHandlersSSL3;
1819    }
1820
1821    while (*length) {
1822	const ssl3HelloExtensionHandler * handler;
1823	SECStatus rv;
1824	PRInt32   extension_type;
1825	SECItem   extension_data;
1826
1827	/* Get the extension's type field */
1828	extension_type = ssl3_ConsumeHandshakeNumber(ss, 2, b, length);
1829	if (extension_type < 0)  /* failure to decode extension_type */
1830	    return SECFailure;   /* alert already sent */
1831
1832	/* get the data for this extension, so we can pass it or skip it. */
1833	rv = ssl3_ConsumeHandshakeVariable(ss, &extension_data, 2, b, length);
1834	if (rv != SECSuccess)
1835	    return rv;
1836
1837	/* Check whether the server sent an extension which was not advertised
1838	 * in the ClientHello.
1839	 */
1840	if (!ss->sec.isServer &&
1841	    !ssl3_ClientExtensionAdvertised(ss, extension_type))
1842	    return SECFailure;  /* TODO: send unsupported_extension alert */
1843
1844	/* Check whether an extension has been sent multiple times. */
1845	if (ssl3_ExtensionNegotiated(ss, extension_type))
1846	    return SECFailure;
1847
1848	/* find extension_type in table of Hello Extension Handlers */
1849	for (handler = handlers; handler->ex_type >= 0; handler++) {
1850	    /* if found, call this handler */
1851	    if (handler->ex_type == extension_type) {
1852		rv = (*handler->ex_handler)(ss, (PRUint16)extension_type,
1853	                                         	&extension_data);
1854		/* Ignore this result */
1855		/* Treat all bad extensions as unrecognized types. */
1856	        break;
1857	    }
1858	}
1859    }
1860    return SECSuccess;
1861}
1862
1863/* Add a callback function to the table of senders of server hello extensions.
1864 */
1865SECStatus
1866ssl3_RegisterServerHelloExtensionSender(sslSocket *ss, PRUint16 ex_type,
1867				        ssl3HelloExtensionSenderFunc cb)
1868{
1869    int i;
1870    ssl3HelloExtensionSender *sender = &ss->xtnData.serverSenders[0];
1871
1872    for (i = 0; i < SSL_MAX_EXTENSIONS; ++i, ++sender) {
1873        if (!sender->ex_sender) {
1874	    sender->ex_type   = ex_type;
1875	    sender->ex_sender = cb;
1876	    return SECSuccess;
1877	}
1878	/* detect duplicate senders */
1879	PORT_Assert(sender->ex_type != ex_type);
1880	if (sender->ex_type == ex_type) {
1881	    /* duplicate */
1882	    break;
1883	}
1884    }
1885    PORT_Assert(i < SSL_MAX_EXTENSIONS); /* table needs to grow */
1886    PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
1887    return SECFailure;
1888}
1889
1890/* call each of the extension senders and return the accumulated length */
1891PRInt32
1892ssl3_CallHelloExtensionSenders(sslSocket *ss, PRBool append, PRUint32 maxBytes,
1893                               const ssl3HelloExtensionSender *sender)
1894{
1895    PRInt32 total_exten_len = 0;
1896    int i;
1897
1898    if (!sender) {
1899    	sender = ss->version > SSL_LIBRARY_VERSION_3_0 ?
1900                 &clientHelloSendersTLS[0] : &clientHelloSendersSSL3[0];
1901    }
1902
1903    for (i = 0; i < SSL_MAX_EXTENSIONS; ++i, ++sender) {
1904	if (sender->ex_sender) {
1905	    PRInt32 extLen = (*sender->ex_sender)(ss, append, maxBytes);
1906	    if (extLen < 0)
1907	    	return -1;
1908	    maxBytes        -= extLen;
1909	    total_exten_len += extLen;
1910	}
1911    }
1912    return total_exten_len;
1913}
1914
1915
1916/* Extension format:
1917 * Extension number:   2 bytes
1918 * Extension length:   2 bytes
1919 * Verify Data Length: 1 byte
1920 * Verify Data (TLS): 12 bytes (client) or 24 bytes (server)
1921 * Verify Data (SSL): 36 bytes (client) or 72 bytes (server)
1922 */
1923static PRInt32
1924ssl3_SendRenegotiationInfoXtn(
1925			sslSocket * ss,
1926			PRBool      append,
1927			PRUint32    maxBytes)
1928{
1929    PRInt32 len, needed;
1930
1931    /* In draft-ietf-tls-renegotiation-03, it is NOT RECOMMENDED to send
1932     * both the SCSV and the empty RI, so when we send SCSV in
1933     * the initial handshake, we don't also send RI.
1934     */
1935    if (!ss || ss->ssl3.hs.sendingSCSV)
1936    	return 0;
1937    len = !ss->firstHsDone ? 0 :
1938	   (ss->sec.isServer ? ss->ssl3.hs.finishedBytes * 2
1939			     : ss->ssl3.hs.finishedBytes);
1940    needed = 5 + len;
1941    if (append && maxBytes >= needed) {
1942	SECStatus rv;
1943	/* extension_type */
1944	rv = ssl3_AppendHandshakeNumber(ss, ssl_renegotiation_info_xtn, 2);
1945	if (rv != SECSuccess) return -1;
1946	/* length of extension_data */
1947	rv = ssl3_AppendHandshakeNumber(ss, len + 1, 2);
1948	if (rv != SECSuccess) return -1;
1949	/* verify_Data from previous Finished message(s) */
1950	rv = ssl3_AppendHandshakeVariable(ss,
1951		  ss->ssl3.hs.finishedMsgs.data, len, 1);
1952	if (rv != SECSuccess) return -1;
1953	if (!ss->sec.isServer) {
1954	    TLSExtensionData *xtnData = &ss->xtnData;
1955	    xtnData->advertised[xtnData->numAdvertised++] =
1956	                                           ssl_renegotiation_info_xtn;
1957	}
1958    }
1959    return needed;
1960}
1961
1962static SECStatus
1963ssl3_ServerHandleStatusRequestXtn(sslSocket *ss, PRUint16 ex_type,
1964				  SECItem *data)
1965{
1966    SECStatus rv = SECSuccess;
1967
1968    /* remember that we got this extension. */
1969    ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
1970    PORT_Assert(ss->sec.isServer);
1971    /* prepare to send back the appropriate response */
1972    rv = ssl3_RegisterServerHelloExtensionSender(ss, ex_type,
1973					    ssl3_ServerSendStatusRequestXtn);
1974    return rv;
1975}
1976
1977/* This function runs in both the client and server.  */
1978static SECStatus
1979ssl3_HandleRenegotiationInfoXtn(sslSocket *ss, PRUint16 ex_type, SECItem *data)
1980{
1981    SECStatus rv = SECSuccess;
1982    PRUint32 len = 0;
1983
1984    if (ss->firstHsDone) {
1985	len = ss->sec.isServer ? ss->ssl3.hs.finishedBytes
1986	                       : ss->ssl3.hs.finishedBytes * 2;
1987    }
1988    if (data->len != 1 + len  ||
1989	data->data[0] != len  || (len &&
1990	NSS_SecureMemcmp(ss->ssl3.hs.finishedMsgs.data,
1991	                 data->data + 1, len))) {
1992	/* Can we do this here? Or, must we arrange for the caller to do it? */
1993	(void)SSL3_SendAlert(ss, alert_fatal, handshake_failure);
1994	PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE);
1995	return SECFailure;
1996    }
1997    /* remember that we got this extension and it was correct. */
1998    ss->peerRequestedProtection = 1;
1999    ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
2000    if (ss->sec.isServer) {
2001	/* prepare to send back the appropriate response */
2002	rv = ssl3_RegisterServerHelloExtensionSender(ss, ex_type,
2003					     ssl3_SendRenegotiationInfoXtn);
2004    }
2005    return rv;
2006}
2007
2008static PRInt32
2009ssl3_SendUseSRTPXtn(sslSocket *ss, PRBool append, PRUint32 maxBytes)
2010{
2011    PRUint32 ext_data_len;
2012    PRInt16 i;
2013    SECStatus rv;
2014
2015    if (!ss)
2016	return 0;
2017
2018    if (!ss->sec.isServer) {
2019	/* Client side */
2020
2021	if (!IS_DTLS(ss) || !ss->ssl3.dtlsSRTPCipherCount)
2022	    return 0;  /* Not relevant */
2023
2024	ext_data_len = 2 + 2 * ss->ssl3.dtlsSRTPCipherCount + 1;
2025
2026	if (append && maxBytes >= 4 + ext_data_len) {
2027	    /* Extension type */
2028	    rv = ssl3_AppendHandshakeNumber(ss, ssl_use_srtp_xtn, 2);
2029	    if (rv != SECSuccess) return -1;
2030	    /* Length of extension data */
2031	    rv = ssl3_AppendHandshakeNumber(ss, ext_data_len, 2);
2032	    if (rv != SECSuccess) return -1;
2033	    /* Length of the SRTP cipher list */
2034	    rv = ssl3_AppendHandshakeNumber(ss,
2035					    2 * ss->ssl3.dtlsSRTPCipherCount,
2036					    2);
2037	    if (rv != SECSuccess) return -1;
2038	    /* The SRTP ciphers */
2039	    for (i = 0; i < ss->ssl3.dtlsSRTPCipherCount; i++) {
2040		rv = ssl3_AppendHandshakeNumber(ss,
2041						ss->ssl3.dtlsSRTPCiphers[i],
2042						2);
2043	    }
2044	    /* Empty MKI value */
2045	    ssl3_AppendHandshakeVariable(ss, NULL, 0, 1);
2046
2047	    ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
2048		ssl_use_srtp_xtn;
2049	}
2050
2051	return 4 + ext_data_len;
2052    }
2053
2054    /* Server side */
2055    if (append && maxBytes >= 9) {
2056	/* Extension type */
2057	rv = ssl3_AppendHandshakeNumber(ss, ssl_use_srtp_xtn, 2);
2058	if (rv != SECSuccess) return -1;
2059	/* Length of extension data */
2060	rv = ssl3_AppendHandshakeNumber(ss, 5, 2);
2061	if (rv != SECSuccess) return -1;
2062	/* Length of the SRTP cipher list */
2063	rv = ssl3_AppendHandshakeNumber(ss, 2, 2);
2064	if (rv != SECSuccess) return -1;
2065	/* The selected cipher */
2066	rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3.dtlsSRTPCipherSuite, 2);
2067	if (rv != SECSuccess) return -1;
2068	/* Empty MKI value */
2069	ssl3_AppendHandshakeVariable(ss, NULL, 0, 1);
2070    }
2071
2072    return 9;
2073}
2074
2075static SECStatus
2076ssl3_HandleUseSRTPXtn(sslSocket * ss, PRUint16 ex_type, SECItem *data)
2077{
2078    SECStatus rv;
2079    SECItem ciphers = {siBuffer, NULL, 0};
2080    PRUint16 i;
2081    unsigned int j;
2082    PRUint16 cipher = 0;
2083    PRBool found = PR_FALSE;
2084    SECItem litem;
2085
2086    if (!ss->sec.isServer) {
2087	/* Client side */
2088	if (!data->data || !data->len) {
2089            /* malformed */
2090            return SECFailure;
2091	}
2092
2093	/* Get the cipher list */
2094	rv = ssl3_ConsumeHandshakeVariable(ss, &ciphers, 2,
2095					   &data->data, &data->len);
2096	if (rv != SECSuccess) {
2097	    return SECFailure;
2098	}
2099	/* Now check that the number of ciphers listed is 1 (len = 2) */
2100	if (ciphers.len != 2) {
2101	    return SECFailure;
2102	}
2103
2104	/* Get the selected cipher */
2105	cipher = (ciphers.data[0] << 8) | ciphers.data[1];
2106
2107	/* Now check that this is one of the ciphers we offered */
2108	for (i = 0; i < ss->ssl3.dtlsSRTPCipherCount; i++) {
2109	    if (cipher == ss->ssl3.dtlsSRTPCiphers[i]) {
2110		found = PR_TRUE;
2111		break;
2112	    }
2113	}
2114
2115	if (!found) {
2116	    return SECFailure;
2117	}
2118
2119	/* Get the srtp_mki value */
2120        rv = ssl3_ConsumeHandshakeVariable(ss, &litem, 1,
2121					   &data->data, &data->len);
2122        if (rv != SECSuccess) {
2123            return SECFailure;
2124        }
2125
2126	/* We didn't offer an MKI, so this must be 0 length */
2127	/* XXX RFC 5764 Section 4.1.3 says:
2128	 *   If the client detects a nonzero-length MKI in the server's
2129	 *   response that is different than the one the client offered,
2130	 *   then the client MUST abort the handshake and SHOULD send an
2131	 *   invalid_parameter alert.
2132	 *
2133	 * Due to a limitation of the ssl3_HandleHelloExtensions function,
2134	 * returning SECFailure here won't abort the handshake.  It will
2135	 * merely cause the use_srtp extension to be not negotiated.  We
2136	 * should fix this.  See NSS bug 753136.
2137	 */
2138	if (litem.len != 0) {
2139	    return SECFailure;
2140	}
2141
2142	if (data->len != 0) {
2143            /* malformed */
2144            return SECFailure;
2145	}
2146
2147	/* OK, this looks fine. */
2148	ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ssl_use_srtp_xtn;
2149	ss->ssl3.dtlsSRTPCipherSuite = cipher;
2150	return SECSuccess;
2151    }
2152
2153    /* Server side */
2154    if (!IS_DTLS(ss) || !ss->ssl3.dtlsSRTPCipherCount) {
2155	/* Ignore the extension if we aren't doing DTLS or no DTLS-SRTP
2156	 * preferences have been set. */
2157	return SECSuccess;
2158    }
2159
2160    if (!data->data || data->len < 5) {
2161	/* malformed */
2162	return SECFailure;
2163    }
2164
2165    /* Get the cipher list */
2166    rv = ssl3_ConsumeHandshakeVariable(ss, &ciphers, 2,
2167				       &data->data, &data->len);
2168    if (rv != SECSuccess) {
2169	return SECFailure;
2170    }
2171    /* Check that the list is even length */
2172    if (ciphers.len % 2) {
2173	return SECFailure;
2174    }
2175
2176    /* Walk through the offered list and pick the most preferred of our
2177     * ciphers, if any */
2178    for (i = 0; !found && i < ss->ssl3.dtlsSRTPCipherCount; i++) {
2179	for (j = 0; j + 1 < ciphers.len; j += 2) {
2180	    cipher = (ciphers.data[j] << 8) | ciphers.data[j + 1];
2181	    if (cipher == ss->ssl3.dtlsSRTPCiphers[i]) {
2182		found = PR_TRUE;
2183		break;
2184	    }
2185	}
2186    }
2187
2188    /* Get the srtp_mki value */
2189    rv = ssl3_ConsumeHandshakeVariable(ss, &litem, 1, &data->data, &data->len);
2190    if (rv != SECSuccess) {
2191	return SECFailure;
2192    }
2193
2194    if (data->len != 0) {
2195	return SECFailure; /* Malformed */
2196    }
2197
2198    /* Now figure out what to do */
2199    if (!found) {
2200	/* No matching ciphers */
2201	return SECSuccess;
2202    }
2203
2204    /* OK, we have a valid cipher and we've selected it */
2205    ss->ssl3.dtlsSRTPCipherSuite = cipher;
2206    ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ssl_use_srtp_xtn;
2207
2208    return ssl3_RegisterServerHelloExtensionSender(ss, ssl_use_srtp_xtn,
2209						   ssl3_SendUseSRTPXtn);
2210}
2211
2212/* ssl3_ServerHandleSigAlgsXtn handles the signature_algorithms extension
2213 * from a client.
2214 * See https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */
2215static SECStatus
2216ssl3_ServerHandleSigAlgsXtn(sslSocket * ss, PRUint16 ex_type, SECItem *data)
2217{
2218    SECStatus rv;
2219    SECItem algorithms;
2220    const unsigned char *b;
2221    unsigned int numAlgorithms, i;
2222
2223    /* Ignore this extension if we aren't doing TLS 1.2 or greater. */
2224    if (ss->version < SSL_LIBRARY_VERSION_TLS_1_2) {
2225	return SECSuccess;
2226    }
2227
2228    /* Keep track of negotiated extensions. */
2229    ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
2230
2231    rv = ssl3_ConsumeHandshakeVariable(ss, &algorithms, 2, &data->data,
2232				       &data->len);
2233    if (rv != SECSuccess) {
2234	return SECFailure;
2235    }
2236    /* Trailing data, empty value, or odd-length value is invalid. */
2237    if (data->len != 0 || algorithms.len == 0 || (algorithms.len & 1) != 0) {
2238	PORT_SetError(SSL_ERROR_RX_MALFORMED_CLIENT_HELLO);
2239	return SECFailure;
2240    }
2241
2242    numAlgorithms = algorithms.len/2;
2243
2244    /* We don't care to process excessive numbers of algorithms. */
2245    if (numAlgorithms > 512) {
2246	numAlgorithms = 512;
2247    }
2248
2249    ss->ssl3.hs.clientSigAndHash =
2250	    PORT_NewArray(SSL3SignatureAndHashAlgorithm, numAlgorithms);
2251    if (!ss->ssl3.hs.clientSigAndHash) {
2252	return SECFailure;
2253    }
2254    ss->ssl3.hs.numClientSigAndHash = 0;
2255
2256    b = algorithms.data;
2257    for (i = 0; i < numAlgorithms; i++) {
2258	unsigned char tls_hash = *(b++);
2259	unsigned char tls_sig = *(b++);
2260	SECOidTag hash = ssl3_TLSHashAlgorithmToOID(tls_hash);
2261
2262	if (hash == SEC_OID_UNKNOWN) {
2263	    /* We ignore formats that we don't understand. */
2264	    continue;
2265	}
2266	/* tls_sig support will be checked later in
2267	 * ssl3_PickSignatureHashAlgorithm. */
2268	ss->ssl3.hs.clientSigAndHash[i].hashAlg = hash;
2269	ss->ssl3.hs.clientSigAndHash[i].sigAlg = tls_sig;
2270	ss->ssl3.hs.numClientSigAndHash++;
2271    }
2272
2273    if (!ss->ssl3.hs.numClientSigAndHash) {
2274	/* We didn't understand any of the client's requested signature
2275	 * formats. We'll use the defaults. */
2276	PORT_Free(ss->ssl3.hs.clientSigAndHash);
2277	ss->ssl3.hs.clientSigAndHash = NULL;
2278    }
2279
2280    return SECSuccess;
2281}
2282
2283/* ssl3_ClientSendSigAlgsXtn sends the signature_algorithm extension for TLS
2284 * 1.2 ClientHellos. */
2285static PRInt32
2286ssl3_ClientSendSigAlgsXtn(sslSocket * ss, PRBool append, PRUint32 maxBytes)
2287{
2288    static const unsigned char signatureAlgorithms[] = {
2289	/* This block is the contents of our signature_algorithms extension, in
2290	 * wire format. See
2291	 * https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */
2292	tls_hash_sha256, tls_sig_rsa,
2293	tls_hash_sha384, tls_sig_rsa,
2294	tls_hash_sha1,   tls_sig_rsa,
2295#ifdef NSS_ENABLE_ECC
2296	tls_hash_sha256, tls_sig_ecdsa,
2297	tls_hash_sha384, tls_sig_ecdsa,
2298	tls_hash_sha1,   tls_sig_ecdsa,
2299#endif
2300	tls_hash_sha256, tls_sig_dsa,
2301	tls_hash_sha1,   tls_sig_dsa,
2302    };
2303    PRInt32 extension_length;
2304
2305    if (ss->version < SSL_LIBRARY_VERSION_TLS_1_2) {
2306	return 0;
2307    }
2308
2309    extension_length =
2310	2 /* extension type */ +
2311	2 /* extension length */ +
2312	2 /* supported_signature_algorithms length */ +
2313	sizeof(signatureAlgorithms);
2314
2315    if (append && maxBytes >= extension_length) {
2316	SECStatus rv;
2317	rv = ssl3_AppendHandshakeNumber(ss, ssl_signature_algorithms_xtn, 2);
2318	if (rv != SECSuccess)
2319	    goto loser;
2320	rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2);
2321	if (rv != SECSuccess)
2322	    goto loser;
2323	rv = ssl3_AppendHandshakeVariable(ss, signatureAlgorithms,
2324					  sizeof(signatureAlgorithms), 2);
2325	if (rv != SECSuccess)
2326	    goto loser;
2327	ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
2328		ssl_signature_algorithms_xtn;
2329    } else if (maxBytes < extension_length) {
2330	PORT_Assert(0);
2331	return 0;
2332    }
2333
2334    return extension_length;
2335
2336loser:
2337    return -1;
2338}
2339
2340unsigned int
2341ssl3_CalculatePaddingExtensionLength(unsigned int clientHelloLength)
2342{
2343    unsigned int recordLength = 1 /* handshake message type */ +
2344				3 /* handshake message length */ +
2345				clientHelloLength;
2346    unsigned int extensionLength;
2347
2348    if (recordLength < 256 || recordLength >= 512) {
2349	return 0;
2350    }
2351
2352    extensionLength = 512 - recordLength;
2353    /* Extensions take at least four bytes to encode. Always include at least
2354     * one byte of data if including the extension. WebSphere Application Server
2355     * 7.0 is intolerant to the last extension being zero-length. */
2356    if (extensionLength < 4 + 1) {
2357	extensionLength = 4 + 1;
2358    }
2359
2360    return extensionLength;
2361}
2362
2363/* ssl3_AppendPaddingExtension possibly adds an extension which ensures that a
2364 * ClientHello record is either < 256 bytes or is >= 512 bytes. This ensures
2365 * that we don't trigger bugs in F5 products. */
2366PRInt32
2367ssl3_AppendPaddingExtension(sslSocket *ss, unsigned int extensionLen,
2368			    PRUint32 maxBytes)
2369{
2370    unsigned int paddingLen = extensionLen - 4;
2371    static unsigned char padding[256];
2372
2373    if (extensionLen == 0) {
2374	return 0;
2375    }
2376
2377    if (extensionLen < 4 ||
2378	extensionLen > maxBytes ||
2379	paddingLen > sizeof(padding)) {
2380	PORT_Assert(0);
2381	return -1;
2382    }
2383
2384    if (SECSuccess != ssl3_AppendHandshakeNumber(ss, ssl_padding_xtn, 2))
2385	return -1;
2386    if (SECSuccess != ssl3_AppendHandshakeNumber(ss, paddingLen, 2))
2387	return -1;
2388    if (SECSuccess != ssl3_AppendHandshake(ss, padding, paddingLen))
2389	return -1;
2390
2391    return extensionLen;
2392}
2393
2394/* ssl3_ClientSendSignedCertTimestampXtn sends the signed_certificate_timestamp
2395 * extension for TLS ClientHellos. */
2396static PRInt32
2397ssl3_ClientSendSignedCertTimestampXtn(sslSocket *ss, PRBool append,
2398				      PRUint32 maxBytes)
2399{
2400    PRInt32 extension_length = 2 /* extension_type */ +
2401	    2 /* length(extension_data) */;
2402
2403    /* Only send the extension if processing is enabled. */
2404    if (!ss->opt.enableSignedCertTimestamps)
2405	return 0;
2406
2407    if (append && maxBytes >= extension_length) {
2408	SECStatus rv;
2409	/* extension_type */
2410	rv = ssl3_AppendHandshakeNumber(ss,
2411					ssl_signed_certificate_timestamp_xtn,
2412					2);
2413	if (rv != SECSuccess)
2414	    goto loser;
2415	/* zero length */
2416	rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
2417	if (rv != SECSuccess)
2418	    goto loser;
2419	ss->xtnData.advertised[ss->xtnData.numAdvertised++] =
2420		ssl_signed_certificate_timestamp_xtn;
2421    } else if (maxBytes < extension_length) {
2422	PORT_Assert(0);
2423	return 0;
2424    }
2425
2426    return extension_length;
2427loser:
2428    return -1;
2429}
2430
2431static SECStatus
2432ssl3_ClientHandleSignedCertTimestampXtn(sslSocket *ss, PRUint16 ex_type,
2433					SECItem *data)
2434{
2435    /* We do not yet know whether we'll be resuming a session or creating
2436     * a new one, so we keep a pointer to the data in the TLSExtensionData
2437     * structure. This pointer is only valid in the scope of
2438     * ssl3_HandleServerHello, and, if not resuming a session, the data is
2439     * copied once a new session structure has been set up.
2440     * All parsing is currently left to the application and we accept
2441     * everything, including empty data.
2442     */
2443    SECItem *scts = &ss->xtnData.signedCertTimestamps;
2444    PORT_Assert(!scts->data && !scts->len);
2445
2446    if (!data->len) {
2447	/* Empty extension data: RFC 6962 mandates non-empty contents. */
2448	return SECFailure;
2449    }
2450    *scts = *data;
2451    /* Keep track of negotiated extensions. */
2452    ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
2453    return SECSuccess;
2454}
2455