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/. */
8 /* TLS extension code moved here from ssl3ecc.c */
16 #ifdef NO_PKCS11_BYPASS
23 static unsigned char key_name
[SESS_TICKET_KEY_NAME_LEN
];
24 static PK11SymKey
*session_ticket_enc_key_pkcs11
= NULL
;
25 static PK11SymKey
*session_ticket_mac_key_pkcs11
= NULL
;
27 #ifndef NO_PKCS11_BYPASS
28 static unsigned char session_ticket_enc_key
[AES_256_KEY_LENGTH
];
29 static unsigned char session_ticket_mac_key
[SHA256_LENGTH
];
31 static PRBool session_ticket_keys_initialized
= PR_FALSE
;
33 static PRCallOnceType generate_session_keys_once
;
35 /* forward static function declarations */
36 static SECStatus
ssl3_ParseEncryptedSessionTicket(sslSocket
*ss
,
37 SECItem
*data
, EncryptedSessionTicket
*enc_session_ticket
);
38 static SECStatus
ssl3_AppendToItem(SECItem
*item
, const unsigned char *buf
,
40 static SECStatus
ssl3_AppendNumberToItem(SECItem
*item
, PRUint32 num
,
42 static SECStatus
ssl3_GetSessionTicketKeysPKCS11(sslSocket
*ss
,
43 PK11SymKey
**aes_key
, PK11SymKey
**mac_key
);
44 #ifndef NO_PKCS11_BYPASS
45 static SECStatus
ssl3_GetSessionTicketKeys(const unsigned char **aes_key
,
46 PRUint32
*aes_key_length
, const unsigned char **mac_key
,
47 PRUint32
*mac_key_length
);
49 static PRInt32
ssl3_SendRenegotiationInfoXtn(sslSocket
* ss
,
50 PRBool append
, PRUint32 maxBytes
);
51 static SECStatus
ssl3_HandleRenegotiationInfoXtn(sslSocket
*ss
,
52 PRUint16 ex_type
, SECItem
*data
);
53 static SECStatus
ssl3_ClientHandleNextProtoNegoXtn(sslSocket
*ss
,
54 PRUint16 ex_type
, SECItem
*data
);
55 static SECStatus
ssl3_ClientHandleAppProtoXtn(sslSocket
*ss
,
56 PRUint16 ex_type
, SECItem
*data
);
57 static SECStatus
ssl3_ServerHandleNextProtoNegoXtn(sslSocket
*ss
,
58 PRUint16 ex_type
, SECItem
*data
);
59 static SECStatus
ssl3_ServerHandleAppProtoXtn(sslSocket
*ss
, PRUint16 ex_type
,
61 static PRInt32
ssl3_ClientSendNextProtoNegoXtn(sslSocket
*ss
, PRBool append
,
63 static PRInt32
ssl3_ClientSendAppProtoXtn(sslSocket
*ss
, PRBool append
,
65 static PRInt32
ssl3_ServerSendAppProtoXtn(sslSocket
*ss
, PRBool append
,
67 static PRInt32
ssl3_SendUseSRTPXtn(sslSocket
*ss
, PRBool append
,
69 static SECStatus
ssl3_HandleUseSRTPXtn(sslSocket
* ss
, PRUint16 ex_type
,
71 static SECStatus
ssl3_ClientHandleChannelIDXtn(sslSocket
*ss
,
72 PRUint16 ex_type
, SECItem
*data
);
73 static PRInt32
ssl3_ClientSendChannelIDXtn(sslSocket
*ss
, PRBool append
,
75 static SECStatus
ssl3_ServerSendStatusRequestXtn(sslSocket
* ss
,
76 PRBool append
, PRUint32 maxBytes
);
77 static SECStatus
ssl3_ServerHandleStatusRequestXtn(sslSocket
*ss
,
78 PRUint16 ex_type
, SECItem
*data
);
79 static SECStatus
ssl3_ClientHandleStatusRequestXtn(sslSocket
*ss
,
82 static PRInt32
ssl3_ClientSendStatusRequestXtn(sslSocket
* ss
, PRBool append
,
84 static PRInt32
ssl3_ClientSendSigAlgsXtn(sslSocket
*ss
, PRBool append
,
86 static SECStatus
ssl3_ServerHandleSigAlgsXtn(sslSocket
*ss
, PRUint16 ex_type
,
88 static PRInt32
ssl3_ClientSendSignedCertTimestampXtn(sslSocket
*ss
,
91 static SECStatus
ssl3_ClientHandleSignedCertTimestampXtn(sslSocket
*ss
,
96 * Write bytes. Using this function means the SECItem structure
97 * cannot be freed. The caller is expected to call this function
98 * on a shallow copy of the structure.
101 ssl3_AppendToItem(SECItem
*item
, const unsigned char *buf
, PRUint32 bytes
)
103 if (bytes
> item
->len
)
106 PORT_Memcpy(item
->data
, buf
, bytes
);
113 * Write a number in network byte order. Using this function means the
114 * SECItem structure cannot be freed. The caller is expected to call
115 * this function on a shallow copy of the structure.
118 ssl3_AppendNumberToItem(SECItem
*item
, PRUint32 num
, PRInt32 lenSize
)
126 *p
++ = (PRUint8
) (num
>> 24);
128 *p
++ = (PRUint8
) (num
>> 16);
130 *p
++ = (PRUint8
) (num
>> 8);
134 rv
= ssl3_AppendToItem(item
, &b
[0], lenSize
);
138 static SECStatus
ssl3_SessionTicketShutdown(void* appData
, void* nssData
)
140 if (session_ticket_enc_key_pkcs11
) {
141 PK11_FreeSymKey(session_ticket_enc_key_pkcs11
);
142 session_ticket_enc_key_pkcs11
= NULL
;
144 if (session_ticket_mac_key_pkcs11
) {
145 PK11_FreeSymKey(session_ticket_mac_key_pkcs11
);
146 session_ticket_mac_key_pkcs11
= NULL
;
148 PORT_Memset(&generate_session_keys_once
, 0,
149 sizeof(generate_session_keys_once
));
155 ssl3_GenerateSessionTicketKeysPKCS11(void *data
)
158 sslSocket
*ss
= (sslSocket
*)data
;
159 SECKEYPrivateKey
*svrPrivKey
= ss
->serverCerts
[kt_rsa
].SERVERKEY
;
160 SECKEYPublicKey
*svrPubKey
= ss
->serverCerts
[kt_rsa
].serverKeyPair
->pubKey
;
162 if (svrPrivKey
== NULL
|| svrPubKey
== NULL
) {
163 SSL_DBG(("%d: SSL[%d]: Pub or priv key(s) is NULL.",
164 SSL_GETPID(), ss
->fd
));
168 /* Get a copy of the session keys from shared memory. */
169 PORT_Memcpy(key_name
, SESS_TICKET_KEY_NAME_PREFIX
,
170 sizeof(SESS_TICKET_KEY_NAME_PREFIX
));
171 if (!ssl_GetSessionTicketKeysPKCS11(svrPrivKey
, svrPubKey
,
172 ss
->pkcs11PinArg
, &key_name
[SESS_TICKET_KEY_NAME_PREFIX_LEN
],
173 &session_ticket_enc_key_pkcs11
, &session_ticket_mac_key_pkcs11
))
176 rv
= NSS_RegisterShutdown(ssl3_SessionTicketShutdown
, NULL
);
177 if (rv
!= SECSuccess
)
183 ssl3_SessionTicketShutdown(NULL
, NULL
);
188 ssl3_GetSessionTicketKeysPKCS11(sslSocket
*ss
, PK11SymKey
**aes_key
,
189 PK11SymKey
**mac_key
)
191 if (PR_CallOnceWithArg(&generate_session_keys_once
,
192 ssl3_GenerateSessionTicketKeysPKCS11
, ss
) != PR_SUCCESS
)
195 if (session_ticket_enc_key_pkcs11
== NULL
||
196 session_ticket_mac_key_pkcs11
== NULL
)
199 *aes_key
= session_ticket_enc_key_pkcs11
;
200 *mac_key
= session_ticket_mac_key_pkcs11
;
204 #ifndef NO_PKCS11_BYPASS
206 ssl3_GenerateSessionTicketKeys(void)
208 PORT_Memcpy(key_name
, SESS_TICKET_KEY_NAME_PREFIX
,
209 sizeof(SESS_TICKET_KEY_NAME_PREFIX
));
211 if (!ssl_GetSessionTicketKeys(&key_name
[SESS_TICKET_KEY_NAME_PREFIX_LEN
],
212 session_ticket_enc_key
, session_ticket_mac_key
))
215 session_ticket_keys_initialized
= PR_TRUE
;
220 ssl3_GetSessionTicketKeys(const unsigned char **aes_key
,
221 PRUint32
*aes_key_length
, const unsigned char **mac_key
,
222 PRUint32
*mac_key_length
)
224 if (PR_CallOnce(&generate_session_keys_once
,
225 ssl3_GenerateSessionTicketKeys
) != PR_SUCCESS
)
228 if (!session_ticket_keys_initialized
)
231 *aes_key
= session_ticket_enc_key
;
232 *aes_key_length
= sizeof(session_ticket_enc_key
);
233 *mac_key
= session_ticket_mac_key
;
234 *mac_key_length
= sizeof(session_ticket_mac_key
);
240 /* Table of handlers for received TLS hello extensions, one per extension.
241 * In the second generation, this table will be dynamic, and functions
242 * will be registered here.
244 /* This table is used by the server, to handle client hello extensions. */
245 static const ssl3HelloExtensionHandler clientHelloHandlers
[] = {
246 { ssl_server_name_xtn
, &ssl3_HandleServerNameXtn
},
247 #ifdef NSS_ENABLE_ECC
248 { ssl_elliptic_curves_xtn
, &ssl3_HandleSupportedCurvesXtn
},
249 { ssl_ec_point_formats_xtn
, &ssl3_HandleSupportedPointFormatsXtn
},
251 { ssl_session_ticket_xtn
, &ssl3_ServerHandleSessionTicketXtn
},
252 { ssl_renegotiation_info_xtn
, &ssl3_HandleRenegotiationInfoXtn
},
253 { ssl_next_proto_nego_xtn
, &ssl3_ServerHandleNextProtoNegoXtn
},
254 { ssl_app_layer_protocol_xtn
, &ssl3_ServerHandleAppProtoXtn
},
255 { ssl_use_srtp_xtn
, &ssl3_HandleUseSRTPXtn
},
256 { ssl_cert_status_xtn
, &ssl3_ServerHandleStatusRequestXtn
},
257 { ssl_signature_algorithms_xtn
, &ssl3_ServerHandleSigAlgsXtn
},
261 /* These two tables are used by the client, to handle server hello
263 static const ssl3HelloExtensionHandler serverHelloHandlersTLS
[] = {
264 { ssl_server_name_xtn
, &ssl3_HandleServerNameXtn
},
265 /* TODO: add a handler for ssl_ec_point_formats_xtn */
266 { ssl_session_ticket_xtn
, &ssl3_ClientHandleSessionTicketXtn
},
267 { ssl_renegotiation_info_xtn
, &ssl3_HandleRenegotiationInfoXtn
},
268 { ssl_next_proto_nego_xtn
, &ssl3_ClientHandleNextProtoNegoXtn
},
269 { ssl_app_layer_protocol_xtn
, &ssl3_ClientHandleAppProtoXtn
},
270 { ssl_use_srtp_xtn
, &ssl3_HandleUseSRTPXtn
},
271 { ssl_channel_id_xtn
, &ssl3_ClientHandleChannelIDXtn
},
272 { ssl_cert_status_xtn
, &ssl3_ClientHandleStatusRequestXtn
},
273 { ssl_signed_certificate_timestamp_xtn
,
274 &ssl3_ClientHandleSignedCertTimestampXtn
},
278 static const ssl3HelloExtensionHandler serverHelloHandlersSSL3
[] = {
279 { ssl_renegotiation_info_xtn
, &ssl3_HandleRenegotiationInfoXtn
},
283 /* Tables of functions to format TLS hello extensions, one function per
285 * These static tables are for the formatting of client hello extensions.
286 * The server's table of hello senders is dynamic, in the socket struct,
287 * and sender functions are registered there.
290 ssl3HelloExtensionSender clientHelloSendersTLS
[SSL_MAX_EXTENSIONS
] = {
291 { ssl_server_name_xtn
, &ssl3_SendServerNameXtn
},
292 { ssl_renegotiation_info_xtn
, &ssl3_SendRenegotiationInfoXtn
},
293 #ifdef NSS_ENABLE_ECC
294 { ssl_elliptic_curves_xtn
, &ssl3_SendSupportedCurvesXtn
},
295 { ssl_ec_point_formats_xtn
, &ssl3_SendSupportedPointFormatsXtn
},
297 { ssl_session_ticket_xtn
, &ssl3_SendSessionTicketXtn
},
298 { ssl_next_proto_nego_xtn
, &ssl3_ClientSendNextProtoNegoXtn
},
299 { ssl_app_layer_protocol_xtn
, &ssl3_ClientSendAppProtoXtn
},
300 { ssl_use_srtp_xtn
, &ssl3_SendUseSRTPXtn
},
301 { ssl_channel_id_xtn
, &ssl3_ClientSendChannelIDXtn
},
302 { ssl_cert_status_xtn
, &ssl3_ClientSendStatusRequestXtn
},
303 { ssl_signed_certificate_timestamp_xtn
,
304 &ssl3_ClientSendSignedCertTimestampXtn
},
305 /* WebSphere Application Server 7.0 is intolerant to the last extension
306 * being zero-length. It is not intolerant of TLS 1.2, so move
307 * signature_algorithms to the end. */
308 { ssl_signature_algorithms_xtn
, &ssl3_ClientSendSigAlgsXtn
}
309 /* any extra entries will appear as { 0, NULL } */
313 ssl3HelloExtensionSender clientHelloSendersSSL3
[SSL_MAX_EXTENSIONS
] = {
314 { ssl_renegotiation_info_xtn
, &ssl3_SendRenegotiationInfoXtn
}
315 /* any extra entries will appear as { 0, NULL } */
319 arrayContainsExtension(const PRUint16
*array
, PRUint32 len
, PRUint16 ex_type
)
322 for (i
= 0; i
< len
; i
++) {
323 if (ex_type
== array
[i
])
330 ssl3_ExtensionNegotiated(sslSocket
*ss
, PRUint16 ex_type
) {
331 TLSExtensionData
*xtnData
= &ss
->xtnData
;
332 return arrayContainsExtension(xtnData
->negotiated
,
333 xtnData
->numNegotiated
, ex_type
);
337 ssl3_ClientExtensionAdvertised(sslSocket
*ss
, PRUint16 ex_type
) {
338 TLSExtensionData
*xtnData
= &ss
->xtnData
;
339 return arrayContainsExtension(xtnData
->advertised
,
340 xtnData
->numAdvertised
, ex_type
);
343 /* Format an SNI extension, using the name from the socket's URL,
344 * unless that name is a dotted decimal string.
345 * Used by client and server.
348 ssl3_SendServerNameXtn(sslSocket
* ss
, PRBool append
,
354 if (!ss
->sec
.isServer
) {
358 /* must have a hostname */
359 if (!ss
->url
|| !ss
->url
[0])
361 /* must not be an IPv4 or IPv6 address */
362 if (PR_SUCCESS
== PR_StringToNetAddr(ss
->url
, &netAddr
)) {
363 /* is an IP address (v4 or v6) */
366 len
= PORT_Strlen(ss
->url
);
367 if (append
&& maxBytes
>= len
+ 9) {
369 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_server_name_xtn
, 2);
370 if (rv
!= SECSuccess
) return -1;
371 /* length of extension_data */
372 rv
= ssl3_AppendHandshakeNumber(ss
, len
+ 5, 2);
373 if (rv
!= SECSuccess
) return -1;
374 /* length of server_name_list */
375 rv
= ssl3_AppendHandshakeNumber(ss
, len
+ 3, 2);
376 if (rv
!= SECSuccess
) return -1;
377 /* Name Type (sni_host_name) */
378 rv
= ssl3_AppendHandshake(ss
, "\0", 1);
379 if (rv
!= SECSuccess
) return -1;
380 /* HostName (length and value) */
381 rv
= ssl3_AppendHandshakeVariable(ss
, (PRUint8
*)ss
->url
, len
, 2);
382 if (rv
!= SECSuccess
) return -1;
383 if (!ss
->sec
.isServer
) {
384 TLSExtensionData
*xtnData
= &ss
->xtnData
;
385 xtnData
->advertised
[xtnData
->numAdvertised
++] =
392 if (append
&& maxBytes
>= 4) {
393 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_server_name_xtn
, 2);
394 if (rv
!= SECSuccess
) return -1;
395 /* length of extension_data */
396 rv
= ssl3_AppendHandshakeNumber(ss
, 0, 2);
397 if (rv
!= SECSuccess
) return -1;
402 /* handle an incoming SNI extension, by ignoring it. */
404 ssl3_HandleServerNameXtn(sslSocket
* ss
, PRUint16 ex_type
, SECItem
*data
)
406 SECItem
*names
= NULL
;
407 PRUint32 listCount
= 0, namesPos
= 0, i
;
408 TLSExtensionData
*xtnData
= &ss
->xtnData
;
410 PRInt32 listLenBytes
= 0;
412 if (!ss
->sec
.isServer
) {
413 /* Verify extension_data is empty. */
414 if (data
->data
|| data
->len
||
415 !ssl3_ExtensionNegotiated(ss
, ssl_server_name_xtn
)) {
416 /* malformed or was not initiated by the client.*/
422 /* Server side - consume client data and register server sender. */
423 /* do not parse the data if don't have user extension handling function. */
424 if (!ss
->sniSocketConfig
) {
427 /* length of server_name_list */
428 listLenBytes
= ssl3_ConsumeHandshakeNumber(ss
, 2, &data
->data
, &data
->len
);
429 if (listLenBytes
== 0 || listLenBytes
!= data
->len
) {
433 /* Calculate the size of the array.*/
434 while (listLenBytes
> 0) {
438 /* Name Type (sni_host_name) */
439 type
= ssl3_ConsumeHandshakeNumber(ss
, 1, &ldata
.data
, &ldata
.len
);
443 rv
= ssl3_ConsumeHandshakeVariable(ss
, &litem
, 2, &ldata
.data
, &ldata
.len
);
444 if (rv
!= SECSuccess
) {
447 /* Adjust total length for cunsumed item, item len and type.*/
448 listLenBytes
-= litem
.len
+ 3;
449 if (listLenBytes
> 0 && !ldata
.len
) {
457 names
= PORT_ZNewArray(SECItem
, listCount
);
461 for (i
= 0;i
< listCount
;i
++) {
465 PRBool nametypePresent
= PR_FALSE
;
466 /* Name Type (sni_host_name) */
467 type
= ssl3_ConsumeHandshakeNumber(ss
, 1, &data
->data
, &data
->len
);
468 /* Check if we have such type in the list */
469 for (j
= 0;j
< listCount
&& names
[j
].data
;j
++) {
470 if (names
[j
].type
== type
) {
471 nametypePresent
= PR_TRUE
;
475 /* HostName (length and value) */
476 rv
= ssl3_ConsumeHandshakeVariable(ss
, &names
[namesPos
], 2,
477 &data
->data
, &data
->len
);
478 if (rv
!= SECSuccess
) {
481 if (nametypePresent
== PR_FALSE
) {
485 /* Free old and set the new data. */
486 if (xtnData
->sniNameArr
) {
487 PORT_Free(ss
->xtnData
.sniNameArr
);
489 xtnData
->sniNameArr
= names
;
490 xtnData
->sniNameArrSize
= namesPos
;
491 xtnData
->negotiated
[xtnData
->numNegotiated
++] = ssl_server_name_xtn
;
500 /* Called by both clients and servers.
501 * Clients sends a filled in session ticket if one is available, and otherwise
502 * sends an empty ticket. Servers always send empty tickets.
505 ssl3_SendSessionTicketXtn(
510 PRInt32 extension_length
;
511 NewSessionTicket
*session_ticket
= NULL
;
512 sslSessionID
*sid
= ss
->sec
.ci
.sid
;
514 /* Ignore the SessionTicket extension if processing is disabled. */
515 if (!ss
->opt
.enableSessionTickets
)
518 /* Empty extension length = extension_type (2-bytes) +
519 * length(extension_data) (2-bytes)
521 extension_length
= 4;
523 /* If we are a client then send a session ticket if one is availble.
524 * Servers that support the extension and are willing to negotiate the
525 * the extension always respond with an empty extension.
527 if (!ss
->sec
.isServer
) {
528 /* The caller must be holding sid->u.ssl3.lock for reading. We cannot
529 * just acquire and release the lock within this function because the
530 * caller will call this function twice, and we need the inputs to be
531 * consistent between the two calls. Note that currently the caller
532 * will only be holding the lock when we are the client and when we're
533 * attempting to resume an existing session.
536 session_ticket
= &sid
->u
.ssl3
.locked
.sessionTicket
;
537 if (session_ticket
->ticket
.data
) {
538 if (ss
->xtnData
.ticketTimestampVerified
) {
539 extension_length
+= session_ticket
->ticket
.len
;
540 } else if (!append
&&
541 (session_ticket
->ticket_lifetime_hint
== 0 ||
542 (session_ticket
->ticket_lifetime_hint
+
543 session_ticket
->received_timestamp
> ssl_Time()))) {
544 extension_length
+= session_ticket
->ticket
.len
;
545 ss
->xtnData
.ticketTimestampVerified
= PR_TRUE
;
550 if (append
&& maxBytes
>= extension_length
) {
553 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_session_ticket_xtn
, 2);
554 if (rv
!= SECSuccess
)
556 if (session_ticket
&& session_ticket
->ticket
.data
&&
557 ss
->xtnData
.ticketTimestampVerified
) {
558 rv
= ssl3_AppendHandshakeVariable(ss
, session_ticket
->ticket
.data
,
559 session_ticket
->ticket
.len
, 2);
560 ss
->xtnData
.ticketTimestampVerified
= PR_FALSE
;
561 ss
->xtnData
.sentSessionTicketInClientHello
= PR_TRUE
;
563 rv
= ssl3_AppendHandshakeNumber(ss
, 0, 2);
565 if (rv
!= SECSuccess
)
568 if (!ss
->sec
.isServer
) {
569 TLSExtensionData
*xtnData
= &ss
->xtnData
;
570 xtnData
->advertised
[xtnData
->numAdvertised
++] =
571 ssl_session_ticket_xtn
;
573 } else if (maxBytes
< extension_length
) {
577 return extension_length
;
580 ss
->xtnData
.ticketTimestampVerified
= PR_FALSE
;
584 /* handle an incoming Next Protocol Negotiation extension. */
586 ssl3_ServerHandleNextProtoNegoXtn(sslSocket
* ss
, PRUint16 ex_type
,
589 if (ss
->firstHsDone
|| data
->len
!= 0) {
590 /* Clients MUST send an empty NPN extension, if any. */
591 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID
);
595 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ex_type
;
597 /* TODO: server side NPN support would require calling
598 * ssl3_RegisterServerHelloExtensionSender here in order to echo the
599 * extension back to the client. */
604 /* ssl3_ValidateNextProtoNego checks that the given block of data is valid: none
605 * of the lengths may be 0 and the sum of the lengths must equal the length of
608 ssl3_ValidateNextProtoNego(const unsigned char* data
, unsigned int length
)
610 unsigned int offset
= 0;
612 while (offset
< length
) {
613 unsigned int newOffset
= offset
+ 1 + (unsigned int) data
[offset
];
614 /* Reject embedded nulls to protect against buggy applications that
615 * store protocol identifiers in null-terminated strings.
617 if (newOffset
> length
|| data
[offset
] == 0) {
618 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID
);
624 if (offset
> length
) {
625 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID
);
632 /* protocol selection handler for ALPN (server side) and NPN (client side) */
634 ssl3_SelectAppProtocol(sslSocket
*ss
, PRUint16 ex_type
, SECItem
*data
)
637 unsigned char resultBuffer
[255];
638 SECItem result
= { siBuffer
, resultBuffer
, 0 };
640 rv
= ssl3_ValidateNextProtoNego(data
->data
, data
->len
);
641 if (rv
!= SECSuccess
)
644 PORT_Assert(ss
->nextProtoCallback
);
645 rv
= ss
->nextProtoCallback(ss
->nextProtoArg
, ss
->fd
, data
->data
, data
->len
,
646 result
.data
, &result
.len
, sizeof resultBuffer
);
647 if (rv
!= SECSuccess
)
649 /* If the callback wrote more than allowed to |result| it has corrupted our
651 if (result
.len
> sizeof resultBuffer
) {
652 PORT_SetError(SEC_ERROR_OUTPUT_LEN
);
656 if (ex_type
== ssl_app_layer_protocol_xtn
&&
657 ss
->ssl3
.nextProtoState
!= SSL_NEXT_PROTO_NEGOTIATED
) {
658 /* The callback might say OK, but then it's picked a default.
659 * That's OK for NPN, but not ALPN. */
660 SECITEM_FreeItem(&ss
->ssl3
.nextProto
, PR_FALSE
);
661 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_NO_PROTOCOL
);
662 (void)SSL3_SendAlert(ss
, alert_fatal
, no_application_protocol
);
666 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ex_type
;
668 SECITEM_FreeItem(&ss
->ssl3
.nextProto
, PR_FALSE
);
669 return SECITEM_CopyItem(NULL
, &ss
->ssl3
.nextProto
, &result
);
672 /* handle an incoming ALPN extension at the server */
674 ssl3_ServerHandleAppProtoXtn(sslSocket
*ss
, PRUint16 ex_type
, SECItem
*data
)
679 /* We expressly don't want to allow ALPN on renegotiation,
680 * despite it being permitted by the spec. */
681 if (ss
->firstHsDone
|| data
->len
== 0) {
682 /* Clients MUST send a non-empty ALPN extension. */
683 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID
);
687 /* unlike NPN, ALPN has extra redundant length information so that
688 * the extension is the same in both ClientHello and ServerHello */
689 count
= ssl3_ConsumeHandshakeNumber(ss
, 2, &data
->data
, &data
->len
);
691 return SECFailure
; /* fatal alert was sent */
693 if (count
!= data
->len
) {
694 return ssl3_DecodeError(ss
);
697 if (!ss
->nextProtoCallback
) {
698 /* we're not configured for it */
702 rv
= ssl3_SelectAppProtocol(ss
, ex_type
, data
);
703 if (rv
!= SECSuccess
) {
707 /* prepare to send back a response, if we negotiated */
708 if (ss
->ssl3
.nextProtoState
== SSL_NEXT_PROTO_NEGOTIATED
) {
709 return ssl3_RegisterServerHelloExtensionSender(
710 ss
, ex_type
, ssl3_ServerSendAppProtoXtn
);
716 ssl3_ClientHandleNextProtoNegoXtn(sslSocket
*ss
, PRUint16 ex_type
,
719 PORT_Assert(!ss
->firstHsDone
);
721 if (ssl3_ExtensionNegotiated(ss
, ssl_app_layer_protocol_xtn
)) {
722 /* If the server negotiated ALPN then it has already told us what protocol
723 * to use, so it doesn't make sense for us to try to negotiate a different
724 * one by sending the NPN handshake message. However, if we've negotiated
725 * NPN then we're required to send the NPN handshake message. Thus, these
726 * two extensions cannot both be negotiated on the same connection. */
727 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE
);
731 /* We should only get this call if we sent the extension, so
732 * ss->nextProtoCallback needs to be non-NULL. However, it is possible
733 * that an application erroneously cleared the callback between the time
734 * we sent the ClientHello and now. */
735 if (!ss
->nextProtoCallback
) {
736 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_NO_CALLBACK
);
740 return ssl3_SelectAppProtocol(ss
, ex_type
, data
);
744 ssl3_ClientHandleAppProtoXtn(sslSocket
*ss
, PRUint16 ex_type
, SECItem
*data
)
746 const unsigned char* d
= data
->data
;
747 PRUint16 name_list_len
;
748 SECItem protocol_name
;
750 if (ssl3_ExtensionNegotiated(ss
, ssl_next_proto_nego_xtn
)) {
751 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE
);
755 /* The extension data from the server has the following format:
756 * uint16 name_list_len;
758 * uint8 protocol_name[len]; */
759 if (data
->len
< 4 || data
->len
> 2 + 1 + 255) {
760 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID
);
764 name_list_len
= ((PRUint16
) d
[0]) << 8 |
766 if (name_list_len
!= data
->len
- 2 || d
[2] != data
->len
- 3) {
767 PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID
);
771 protocol_name
.data
= data
->data
+ 3;
772 protocol_name
.len
= data
->len
- 3;
774 SECITEM_FreeItem(&ss
->ssl3
.nextProto
, PR_FALSE
);
775 ss
->ssl3
.nextProtoState
= SSL_NEXT_PROTO_SELECTED
;
776 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ex_type
;
777 return SECITEM_CopyItem(NULL
, &ss
->ssl3
.nextProto
, &protocol_name
);
781 ssl3_ClientSendNextProtoNegoXtn(sslSocket
* ss
, PRBool append
,
784 PRInt32 extension_length
;
786 /* Renegotiations do not send this extension. */
787 if (!ss
->opt
.enableNPN
|| !ss
->nextProtoCallback
|| ss
->firstHsDone
) {
791 extension_length
= 4;
793 if (append
&& maxBytes
>= extension_length
) {
795 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_next_proto_nego_xtn
, 2);
796 if (rv
!= SECSuccess
)
798 rv
= ssl3_AppendHandshakeNumber(ss
, 0, 2);
799 if (rv
!= SECSuccess
)
801 ss
->xtnData
.advertised
[ss
->xtnData
.numAdvertised
++] =
802 ssl_next_proto_nego_xtn
;
803 } else if (maxBytes
< extension_length
) {
807 return extension_length
;
814 ssl3_ClientSendAppProtoXtn(sslSocket
* ss
, PRBool append
, PRUint32 maxBytes
)
816 PRInt32 extension_length
;
817 unsigned char *alpn_protos
= NULL
;
819 /* Renegotiations do not send this extension. */
820 if (!ss
->opt
.enableALPN
|| !ss
->opt
.nextProtoNego
.data
|| ss
->firstHsDone
) {
824 extension_length
= 2 /* extension type */ + 2 /* extension length */ +
825 2 /* protocol name list length */ +
826 ss
->opt
.nextProtoNego
.len
;
828 if (append
&& maxBytes
>= extension_length
) {
829 /* NPN requires that the client's fallback protocol is first in the
830 * list. However, ALPN sends protocols in preference order. So we
831 * allocate a buffer and move the first protocol to the end of the
834 const unsigned int len
= ss
->opt
.nextProtoNego
.len
;
836 alpn_protos
= PORT_Alloc(len
);
837 if (alpn_protos
== NULL
) {
841 /* Each protocol string is prefixed with a single byte length. */
842 unsigned int i
= ss
->opt
.nextProtoNego
.data
[0] + 1;
844 memcpy(alpn_protos
, &ss
->opt
.nextProtoNego
.data
[i
], len
- i
);
845 memcpy(alpn_protos
+ len
- i
, ss
->opt
.nextProtoNego
.data
, i
);
847 /* This seems to be invalid data so we'll send as-is. */
848 memcpy(alpn_protos
, ss
->opt
.nextProtoNego
.data
, len
);
852 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_app_layer_protocol_xtn
, 2);
853 if (rv
!= SECSuccess
) {
856 rv
= ssl3_AppendHandshakeNumber(ss
, extension_length
- 4, 2);
857 if (rv
!= SECSuccess
) {
860 rv
= ssl3_AppendHandshakeVariable(ss
, alpn_protos
, len
, 2);
861 PORT_Free(alpn_protos
);
863 if (rv
!= SECSuccess
) {
866 ss
->xtnData
.advertised
[ss
->xtnData
.numAdvertised
++] =
867 ssl_app_layer_protocol_xtn
;
868 } else if (maxBytes
< extension_length
) {
872 return extension_length
;
876 PORT_Free(alpn_protos
);
882 ssl3_ServerSendAppProtoXtn(sslSocket
* ss
, PRBool append
, PRUint32 maxBytes
)
884 PRInt32 extension_length
;
886 PORT_Assert(ss
->opt
.enableALPN
);
887 PORT_Assert(ss
->ssl3
.nextProto
.data
);
888 PORT_Assert(ss
->ssl3
.nextProto
.len
> 0);
889 PORT_Assert(ss
->ssl3
.nextProtoState
== SSL_NEXT_PROTO_NEGOTIATED
);
890 PORT_Assert(!ss
->firstHsDone
);
892 extension_length
= 2 /* extension type */ + 2 /* extension length */ +
893 2 /* protocol name list */ + 1 /* name length */ +
894 ss
->ssl3
.nextProto
.len
;
896 if (append
&& maxBytes
>= extension_length
) {
898 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_app_layer_protocol_xtn
, 2);
899 if (rv
!= SECSuccess
) {
902 rv
= ssl3_AppendHandshakeNumber(ss
, extension_length
- 4, 2);
903 if (rv
!= SECSuccess
) {
906 rv
= ssl3_AppendHandshakeNumber(ss
, ss
->ssl3
.nextProto
.len
+ 1, 2);
907 if (rv
!= SECSuccess
) {
910 rv
= ssl3_AppendHandshakeVariable(ss
, ss
->ssl3
.nextProto
.data
,
911 ss
->ssl3
.nextProto
.len
, 1);
912 if (rv
!= SECSuccess
) {
915 } else if (maxBytes
< extension_length
) {
919 return extension_length
;
923 ssl3_ClientHandleChannelIDXtn(sslSocket
*ss
, PRUint16 ex_type
,
926 PORT_Assert(ss
->getChannelID
!= NULL
);
929 PORT_SetError(SSL_ERROR_BAD_CHANNEL_ID_DATA
);
932 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ex_type
;
937 ssl3_ClientSendChannelIDXtn(sslSocket
* ss
, PRBool append
,
940 PRInt32 extension_length
= 4;
942 if (!ss
->getChannelID
)
945 if (maxBytes
< extension_length
) {
950 if (ss
->sec
.ci
.sid
->cached
!= never_cached
&&
951 ss
->sec
.ci
.sid
->u
.ssl3
.originalHandshakeHash
.len
== 0) {
952 /* We can't do ChannelID on a connection if we're resuming and didn't
953 * do ChannelID on the original connection: without ChannelID on the
954 * original connection we didn't record the handshake hashes needed for
961 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_channel_id_xtn
, 2);
962 if (rv
!= SECSuccess
)
964 rv
= ssl3_AppendHandshakeNumber(ss
, 0, 2);
965 if (rv
!= SECSuccess
)
967 ss
->xtnData
.advertised
[ss
->xtnData
.numAdvertised
++] =
971 return extension_length
;
978 ssl3_ClientHandleStatusRequestXtn(sslSocket
*ss
, PRUint16 ex_type
,
981 /* The echoed extension must be empty. */
985 /* Keep track of negotiated extensions. */
986 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ex_type
;
992 ssl3_ServerSendStatusRequestXtn(
997 PRInt32 extension_length
;
1000 PRBool haveStatus
= PR_FALSE
;
1002 for (i
= kt_null
; i
< kt_kea_size
; i
++) {
1003 /* TODO: This is a temporary workaround.
1004 * The correct code needs to see if we have an OCSP response for
1005 * the server certificate being used, rather than if we have any
1006 * OCSP response. See also ssl3_SendCertificateStatus.
1008 if (ss
->certStatusArray
[i
] && ss
->certStatusArray
[i
]->len
) {
1009 haveStatus
= PR_TRUE
;
1016 extension_length
= 2 + 2;
1017 if (append
&& maxBytes
>= extension_length
) {
1018 /* extension_type */
1019 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_cert_status_xtn
, 2);
1020 if (rv
!= SECSuccess
)
1022 /* length of extension_data */
1023 rv
= ssl3_AppendHandshakeNumber(ss
, 0, 2);
1024 if (rv
!= SECSuccess
)
1028 return extension_length
;
1031 /* ssl3_ClientSendStatusRequestXtn builds the status_request extension on the
1032 * client side. See RFC 4366 section 3.6. */
1034 ssl3_ClientSendStatusRequestXtn(sslSocket
* ss
, PRBool append
,
1037 PRInt32 extension_length
;
1039 if (!ss
->opt
.enableOCSPStapling
)
1042 /* extension_type (2-bytes) +
1043 * length(extension_data) (2-bytes) +
1045 * responder_id_list length (2) +
1046 * request_extensions length (2)
1048 extension_length
= 9;
1050 if (append
&& maxBytes
>= extension_length
) {
1052 TLSExtensionData
*xtnData
;
1054 /* extension_type */
1055 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_cert_status_xtn
, 2);
1056 if (rv
!= SECSuccess
)
1058 rv
= ssl3_AppendHandshakeNumber(ss
, extension_length
- 4, 2);
1059 if (rv
!= SECSuccess
)
1061 rv
= ssl3_AppendHandshakeNumber(ss
, 1 /* status_type ocsp */, 1);
1062 if (rv
!= SECSuccess
)
1064 /* A zero length responder_id_list means that the responders are
1065 * implicitly known to the server. */
1066 rv
= ssl3_AppendHandshakeNumber(ss
, 0, 2);
1067 if (rv
!= SECSuccess
)
1069 /* A zero length request_extensions means that there are no extensions.
1070 * Specifically, we don't set the id-pkix-ocsp-nonce extension. This
1071 * means that the server can replay a cached OCSP response to us. */
1072 rv
= ssl3_AppendHandshakeNumber(ss
, 0, 2);
1073 if (rv
!= SECSuccess
)
1076 xtnData
= &ss
->xtnData
;
1077 xtnData
->advertised
[xtnData
->numAdvertised
++] = ssl_cert_status_xtn
;
1078 } else if (maxBytes
< extension_length
) {
1082 return extension_length
;
1087 * Called from ssl3_HandleFinished
1090 ssl3_SendNewSessionTicket(sslSocket
*ss
)
1094 NewSessionTicket ticket
;
1096 SECItem plaintext_item
= {0, NULL
, 0};
1097 SECItem ciphertext
= {0, NULL
, 0};
1098 PRUint32 ciphertext_length
;
1099 PRBool ms_is_wrapped
;
1100 unsigned char wrapped_ms
[SSL3_MASTER_SECRET_LENGTH
];
1101 SECItem ms_item
= {0, NULL
, 0};
1102 SSL3KEAType effectiveExchKeyType
= ssl_kea_null
;
1103 PRUint32 padding_length
;
1104 PRUint32 message_length
;
1105 PRUint32 cert_length
;
1106 PRUint8 length_buf
[4];
1108 PK11SymKey
*aes_key_pkcs11
;
1109 PK11SymKey
*mac_key_pkcs11
;
1110 #ifndef NO_PKCS11_BYPASS
1111 const unsigned char *aes_key
;
1112 const unsigned char *mac_key
;
1113 PRUint32 aes_key_length
;
1114 PRUint32 mac_key_length
;
1115 PRUint64 aes_ctx_buf
[MAX_CIPHER_CONTEXT_LLONGS
];
1116 AESContext
*aes_ctx
;
1117 const SECHashObject
*hashObj
= NULL
;
1118 PRUint64 hmac_ctx_buf
[MAX_MAC_CONTEXT_LLONGS
];
1119 HMACContext
*hmac_ctx
;
1121 CK_MECHANISM_TYPE cipherMech
= CKM_AES_CBC
;
1122 PK11Context
*aes_ctx_pkcs11
;
1123 CK_MECHANISM_TYPE macMech
= CKM_SHA256_HMAC
;
1124 PK11Context
*hmac_ctx_pkcs11
;
1125 unsigned char computed_mac
[TLS_EX_SESS_TICKET_MAC_LENGTH
];
1126 unsigned int computed_mac_length
;
1127 unsigned char iv
[AES_BLOCK_SIZE
];
1129 SECItem
*srvName
= NULL
;
1130 PRUint32 srvNameLen
= 0;
1131 CK_MECHANISM_TYPE msWrapMech
= 0; /* dummy default value,
1134 SSL_TRC(3, ("%d: SSL3[%d]: send session_ticket handshake",
1135 SSL_GETPID(), ss
->fd
));
1137 PORT_Assert( ss
->opt
.noLocks
|| ssl_HaveXmitBufLock(ss
));
1138 PORT_Assert( ss
->opt
.noLocks
|| ssl_HaveSSL3HandshakeLock(ss
));
1140 ticket
.ticket_lifetime_hint
= TLS_EX_SESS_TICKET_LIFETIME_HINT
;
1141 cert_length
= (ss
->opt
.requestCertificate
&& ss
->sec
.ci
.sid
->peerCert
) ?
1142 3 + ss
->sec
.ci
.sid
->peerCert
->derCert
.len
: 0;
1144 /* Get IV and encryption keys */
1146 ivItem
.len
= sizeof(iv
);
1147 rv
= PK11_GenerateRandom(iv
, sizeof(iv
));
1148 if (rv
!= SECSuccess
) goto loser
;
1150 #ifndef NO_PKCS11_BYPASS
1151 if (ss
->opt
.bypassPKCS11
) {
1152 rv
= ssl3_GetSessionTicketKeys(&aes_key
, &aes_key_length
,
1153 &mac_key
, &mac_key_length
);
1157 rv
= ssl3_GetSessionTicketKeysPKCS11(ss
, &aes_key_pkcs11
,
1160 if (rv
!= SECSuccess
) goto loser
;
1162 if (ss
->ssl3
.pwSpec
->msItem
.len
&& ss
->ssl3
.pwSpec
->msItem
.data
) {
1163 /* The master secret is available unwrapped. */
1164 ms_item
.data
= ss
->ssl3
.pwSpec
->msItem
.data
;
1165 ms_item
.len
= ss
->ssl3
.pwSpec
->msItem
.len
;
1166 ms_is_wrapped
= PR_FALSE
;
1168 /* Extract the master secret wrapped. */
1170 PORT_Memset(&sid
, 0, sizeof(sslSessionID
));
1172 if (ss
->ssl3
.hs
.kea_def
->kea
== kea_ecdhe_rsa
) {
1173 effectiveExchKeyType
= kt_rsa
;
1175 effectiveExchKeyType
= ss
->ssl3
.hs
.kea_def
->exchKeyType
;
1178 rv
= ssl3_CacheWrappedMasterSecret(ss
, &sid
, ss
->ssl3
.pwSpec
,
1179 effectiveExchKeyType
);
1180 if (rv
== SECSuccess
) {
1181 if (sid
.u
.ssl3
.keys
.wrapped_master_secret_len
> sizeof(wrapped_ms
))
1183 memcpy(wrapped_ms
, sid
.u
.ssl3
.keys
.wrapped_master_secret
,
1184 sid
.u
.ssl3
.keys
.wrapped_master_secret_len
);
1185 ms_item
.data
= wrapped_ms
;
1186 ms_item
.len
= sid
.u
.ssl3
.keys
.wrapped_master_secret_len
;
1187 msWrapMech
= sid
.u
.ssl3
.masterWrapMech
;
1189 /* TODO: else send an empty ticket. */
1192 ms_is_wrapped
= PR_TRUE
;
1194 /* Prep to send negotiated name */
1195 srvName
= &ss
->ssl3
.pwSpec
->srvVirtName
;
1196 if (srvName
->data
&& srvName
->len
) {
1197 srvNameLen
= 2 + srvName
->len
; /* len bytes + name len */
1201 sizeof(PRUint16
) /* ticket_version */
1202 + sizeof(SSL3ProtocolVersion
) /* ssl_version */
1203 + sizeof(ssl3CipherSuite
) /* ciphersuite */
1204 + 1 /* compression */
1205 + 10 /* cipher spec parameters */
1206 + 1 /* SessionTicket.ms_is_wrapped */
1207 + 1 /* effectiveExchKeyType */
1208 + 4 /* msWrapMech */
1209 + 2 /* master_secret.length */
1210 + ms_item
.len
/* master_secret */
1211 + 1 /* client_auth_type */
1212 + cert_length
/* cert */
1213 + 1 /* server name type */
1214 + srvNameLen
/* name len + length field */
1215 + sizeof(ticket
.ticket_lifetime_hint
);
1216 padding_length
= AES_BLOCK_SIZE
-
1217 (ciphertext_length
% AES_BLOCK_SIZE
);
1218 ciphertext_length
+= padding_length
;
1221 sizeof(ticket
.ticket_lifetime_hint
) /* ticket_lifetime_hint */
1222 + 2 /* length field for NewSessionTicket.ticket */
1223 + SESS_TICKET_KEY_NAME_LEN
/* key_name */
1224 + AES_BLOCK_SIZE
/* iv */
1225 + 2 /* length field for NewSessionTicket.ticket.encrypted_state */
1226 + ciphertext_length
/* encrypted_state */
1227 + TLS_EX_SESS_TICKET_MAC_LENGTH
; /* mac */
1229 if (SECITEM_AllocItem(NULL
, &plaintext_item
, ciphertext_length
) == NULL
)
1232 plaintext
= plaintext_item
;
1234 /* ticket_version */
1235 rv
= ssl3_AppendNumberToItem(&plaintext
, TLS_EX_SESS_TICKET_VERSION
,
1237 if (rv
!= SECSuccess
) goto loser
;
1240 rv
= ssl3_AppendNumberToItem(&plaintext
, ss
->version
,
1241 sizeof(SSL3ProtocolVersion
));
1242 if (rv
!= SECSuccess
) goto loser
;
1245 rv
= ssl3_AppendNumberToItem(&plaintext
, ss
->ssl3
.hs
.cipher_suite
,
1246 sizeof(ssl3CipherSuite
));
1247 if (rv
!= SECSuccess
) goto loser
;
1250 rv
= ssl3_AppendNumberToItem(&plaintext
, ss
->ssl3
.hs
.compression
, 1);
1251 if (rv
!= SECSuccess
) goto loser
;
1253 /* cipher spec parameters */
1254 rv
= ssl3_AppendNumberToItem(&plaintext
, ss
->sec
.authAlgorithm
, 1);
1255 if (rv
!= SECSuccess
) goto loser
;
1256 rv
= ssl3_AppendNumberToItem(&plaintext
, ss
->sec
.authKeyBits
, 4);
1257 if (rv
!= SECSuccess
) goto loser
;
1258 rv
= ssl3_AppendNumberToItem(&plaintext
, ss
->sec
.keaType
, 1);
1259 if (rv
!= SECSuccess
) goto loser
;
1260 rv
= ssl3_AppendNumberToItem(&plaintext
, ss
->sec
.keaKeyBits
, 4);
1261 if (rv
!= SECSuccess
) goto loser
;
1264 rv
= ssl3_AppendNumberToItem(&plaintext
, ms_is_wrapped
, 1);
1265 if (rv
!= SECSuccess
) goto loser
;
1266 rv
= ssl3_AppendNumberToItem(&plaintext
, effectiveExchKeyType
, 1);
1267 if (rv
!= SECSuccess
) goto loser
;
1268 rv
= ssl3_AppendNumberToItem(&plaintext
, msWrapMech
, 4);
1269 if (rv
!= SECSuccess
) goto loser
;
1270 rv
= ssl3_AppendNumberToItem(&plaintext
, ms_item
.len
, 2);
1271 if (rv
!= SECSuccess
) goto loser
;
1272 rv
= ssl3_AppendToItem(&plaintext
, ms_item
.data
, ms_item
.len
);
1273 if (rv
!= SECSuccess
) goto loser
;
1275 /* client_identity */
1276 if (ss
->opt
.requestCertificate
&& ss
->sec
.ci
.sid
->peerCert
) {
1277 rv
= ssl3_AppendNumberToItem(&plaintext
, CLIENT_AUTH_CERTIFICATE
, 1);
1278 if (rv
!= SECSuccess
) goto loser
;
1279 rv
= ssl3_AppendNumberToItem(&plaintext
,
1280 ss
->sec
.ci
.sid
->peerCert
->derCert
.len
, 3);
1281 if (rv
!= SECSuccess
) goto loser
;
1282 rv
= ssl3_AppendToItem(&plaintext
,
1283 ss
->sec
.ci
.sid
->peerCert
->derCert
.data
,
1284 ss
->sec
.ci
.sid
->peerCert
->derCert
.len
);
1285 if (rv
!= SECSuccess
) goto loser
;
1287 rv
= ssl3_AppendNumberToItem(&plaintext
, 0, 1);
1288 if (rv
!= SECSuccess
) goto loser
;
1293 rv
= ssl3_AppendNumberToItem(&plaintext
, now
,
1294 sizeof(ticket
.ticket_lifetime_hint
));
1295 if (rv
!= SECSuccess
) goto loser
;
1298 /* Name Type (sni_host_name) */
1299 rv
= ssl3_AppendNumberToItem(&plaintext
, srvName
->type
, 1);
1300 if (rv
!= SECSuccess
) goto loser
;
1301 /* HostName (length and value) */
1302 rv
= ssl3_AppendNumberToItem(&plaintext
, srvName
->len
, 2);
1303 if (rv
!= SECSuccess
) goto loser
;
1304 rv
= ssl3_AppendToItem(&plaintext
, srvName
->data
, srvName
->len
);
1305 if (rv
!= SECSuccess
) goto loser
;
1308 rv
= ssl3_AppendNumberToItem(&plaintext
, (char)TLS_STE_NO_SERVER_NAME
,
1310 if (rv
!= SECSuccess
) goto loser
;
1313 PORT_Assert(plaintext
.len
== padding_length
);
1314 for (i
= 0; i
< padding_length
; i
++)
1315 plaintext
.data
[i
] = (unsigned char)padding_length
;
1317 if (SECITEM_AllocItem(NULL
, &ciphertext
, ciphertext_length
) == NULL
) {
1322 /* Generate encrypted portion of ticket. */
1323 #ifndef NO_PKCS11_BYPASS
1324 if (ss
->opt
.bypassPKCS11
) {
1325 aes_ctx
= (AESContext
*)aes_ctx_buf
;
1326 rv
= AES_InitContext(aes_ctx
, aes_key
, aes_key_length
, iv
,
1327 NSS_AES_CBC
, 1, AES_BLOCK_SIZE
);
1328 if (rv
!= SECSuccess
) goto loser
;
1330 rv
= AES_Encrypt(aes_ctx
, ciphertext
.data
, &ciphertext
.len
,
1331 ciphertext
.len
, plaintext_item
.data
,
1332 plaintext_item
.len
);
1333 if (rv
!= SECSuccess
) goto loser
;
1337 aes_ctx_pkcs11
= PK11_CreateContextBySymKey(cipherMech
,
1338 CKA_ENCRYPT
, aes_key_pkcs11
, &ivItem
);
1339 if (!aes_ctx_pkcs11
)
1342 rv
= PK11_CipherOp(aes_ctx_pkcs11
, ciphertext
.data
,
1343 (int *)&ciphertext
.len
, ciphertext
.len
,
1344 plaintext_item
.data
, plaintext_item
.len
);
1345 PK11_Finalize(aes_ctx_pkcs11
);
1346 PK11_DestroyContext(aes_ctx_pkcs11
, PR_TRUE
);
1347 if (rv
!= SECSuccess
) goto loser
;
1350 /* Convert ciphertext length to network order. */
1351 length_buf
[0] = (ciphertext
.len
>> 8) & 0xff;
1352 length_buf
[1] = (ciphertext
.len
) & 0xff;
1355 #ifndef NO_PKCS11_BYPASS
1356 if (ss
->opt
.bypassPKCS11
) {
1357 hmac_ctx
= (HMACContext
*)hmac_ctx_buf
;
1358 hashObj
= HASH_GetRawHashObject(HASH_AlgSHA256
);
1359 if (HMAC_Init(hmac_ctx
, hashObj
, mac_key
,
1360 mac_key_length
, PR_FALSE
) != SECSuccess
)
1363 HMAC_Begin(hmac_ctx
);
1364 HMAC_Update(hmac_ctx
, key_name
, SESS_TICKET_KEY_NAME_LEN
);
1365 HMAC_Update(hmac_ctx
, iv
, sizeof(iv
));
1366 HMAC_Update(hmac_ctx
, (unsigned char *)length_buf
, 2);
1367 HMAC_Update(hmac_ctx
, ciphertext
.data
, ciphertext
.len
);
1368 HMAC_Finish(hmac_ctx
, computed_mac
, &computed_mac_length
,
1369 sizeof(computed_mac
));
1374 macParam
.data
= NULL
;
1376 hmac_ctx_pkcs11
= PK11_CreateContextBySymKey(macMech
,
1377 CKA_SIGN
, mac_key_pkcs11
, &macParam
);
1378 if (!hmac_ctx_pkcs11
)
1381 rv
= PK11_DigestBegin(hmac_ctx_pkcs11
);
1382 rv
= PK11_DigestOp(hmac_ctx_pkcs11
, key_name
,
1383 SESS_TICKET_KEY_NAME_LEN
);
1384 rv
= PK11_DigestOp(hmac_ctx_pkcs11
, iv
, sizeof(iv
));
1385 rv
= PK11_DigestOp(hmac_ctx_pkcs11
, (unsigned char *)length_buf
, 2);
1386 rv
= PK11_DigestOp(hmac_ctx_pkcs11
, ciphertext
.data
, ciphertext
.len
);
1387 rv
= PK11_DigestFinal(hmac_ctx_pkcs11
, computed_mac
,
1388 &computed_mac_length
, sizeof(computed_mac
));
1389 PK11_DestroyContext(hmac_ctx_pkcs11
, PR_TRUE
);
1390 if (rv
!= SECSuccess
) goto loser
;
1393 /* Serialize the handshake message. */
1394 rv
= ssl3_AppendHandshakeHeader(ss
, new_session_ticket
, message_length
);
1395 if (rv
!= SECSuccess
) goto loser
;
1397 rv
= ssl3_AppendHandshakeNumber(ss
, ticket
.ticket_lifetime_hint
,
1398 sizeof(ticket
.ticket_lifetime_hint
));
1399 if (rv
!= SECSuccess
) goto loser
;
1401 rv
= ssl3_AppendHandshakeNumber(ss
,
1402 message_length
- sizeof(ticket
.ticket_lifetime_hint
) - 2, 2);
1403 if (rv
!= SECSuccess
) goto loser
;
1405 rv
= ssl3_AppendHandshake(ss
, key_name
, SESS_TICKET_KEY_NAME_LEN
);
1406 if (rv
!= SECSuccess
) goto loser
;
1408 rv
= ssl3_AppendHandshake(ss
, iv
, sizeof(iv
));
1409 if (rv
!= SECSuccess
) goto loser
;
1411 rv
= ssl3_AppendHandshakeVariable(ss
, ciphertext
.data
, ciphertext
.len
, 2);
1412 if (rv
!= SECSuccess
) goto loser
;
1414 rv
= ssl3_AppendHandshake(ss
, computed_mac
, computed_mac_length
);
1415 if (rv
!= SECSuccess
) goto loser
;
1418 if (plaintext_item
.data
)
1419 SECITEM_FreeItem(&plaintext_item
, PR_FALSE
);
1420 if (ciphertext
.data
)
1421 SECITEM_FreeItem(&ciphertext
, PR_FALSE
);
1426 /* When a client receives a SessionTicket extension a NewSessionTicket
1427 * message is expected during the handshake.
1430 ssl3_ClientHandleSessionTicketXtn(sslSocket
*ss
, PRUint16 ex_type
,
1436 /* Keep track of negotiated extensions. */
1437 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ex_type
;
1442 ssl3_ServerHandleSessionTicketXtn(sslSocket
*ss
, PRUint16 ex_type
,
1446 SECItem
*decrypted_state
= NULL
;
1447 SessionTicket
*parsed_session_ticket
= NULL
;
1448 sslSessionID
*sid
= NULL
;
1449 SSL3Statistics
*ssl3stats
;
1451 /* Ignore the SessionTicket extension if processing is disabled. */
1452 if (!ss
->opt
.enableSessionTickets
)
1455 /* Keep track of negotiated extensions. */
1456 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ex_type
;
1458 /* Parse the received ticket sent in by the client. We are
1459 * lenient about some parse errors, falling back to a fullshake
1460 * instead of terminating the current connection.
1462 if (data
->len
== 0) {
1463 ss
->xtnData
.emptySessionTicket
= PR_TRUE
;
1466 SECItem extension_data
;
1467 EncryptedSessionTicket enc_session_ticket
;
1468 unsigned char computed_mac
[TLS_EX_SESS_TICKET_MAC_LENGTH
];
1469 unsigned int computed_mac_length
;
1470 #ifndef NO_PKCS11_BYPASS
1471 const SECHashObject
*hashObj
;
1472 const unsigned char *aes_key
;
1473 const unsigned char *mac_key
;
1474 PRUint32 aes_key_length
;
1475 PRUint32 mac_key_length
;
1476 PRUint64 hmac_ctx_buf
[MAX_MAC_CONTEXT_LLONGS
];
1477 HMACContext
*hmac_ctx
;
1478 PRUint64 aes_ctx_buf
[MAX_CIPHER_CONTEXT_LLONGS
];
1479 AESContext
*aes_ctx
;
1481 PK11SymKey
*aes_key_pkcs11
;
1482 PK11SymKey
*mac_key_pkcs11
;
1483 PK11Context
*hmac_ctx_pkcs11
;
1484 CK_MECHANISM_TYPE macMech
= CKM_SHA256_HMAC
;
1485 PK11Context
*aes_ctx_pkcs11
;
1486 CK_MECHANISM_TYPE cipherMech
= CKM_AES_CBC
;
1487 unsigned char * padding
;
1488 PRUint32 padding_length
;
1489 unsigned char *buffer
;
1490 unsigned int buffer_len
;
1493 PRInt8 nameType
= TLS_STE_NO_SERVER_NAME
;
1495 /* Turn off stateless session resumption if the client sends a
1496 * SessionTicket extension, even if the extension turns out to be
1497 * malformed (ss->sec.ci.sid is non-NULL when doing session
1500 if (ss
->sec
.ci
.sid
!= NULL
) {
1501 if (ss
->sec
.uncache
)
1502 ss
->sec
.uncache(ss
->sec
.ci
.sid
);
1503 ssl_FreeSID(ss
->sec
.ci
.sid
);
1504 ss
->sec
.ci
.sid
= NULL
;
1507 extension_data
.data
= data
->data
; /* Keep a copy for future use. */
1508 extension_data
.len
= data
->len
;
1510 if (ssl3_ParseEncryptedSessionTicket(ss
, data
, &enc_session_ticket
)
1514 /* Get session ticket keys. */
1515 #ifndef NO_PKCS11_BYPASS
1516 if (ss
->opt
.bypassPKCS11
) {
1517 rv
= ssl3_GetSessionTicketKeys(&aes_key
, &aes_key_length
,
1518 &mac_key
, &mac_key_length
);
1522 rv
= ssl3_GetSessionTicketKeysPKCS11(ss
, &aes_key_pkcs11
,
1525 if (rv
!= SECSuccess
) {
1526 SSL_DBG(("%d: SSL[%d]: Unable to get/generate session ticket keys.",
1527 SSL_GETPID(), ss
->fd
));
1531 /* If the ticket sent by the client was generated under a key different
1532 * from the one we have, bypass ticket processing.
1534 if (PORT_Memcmp(enc_session_ticket
.key_name
, key_name
,
1535 SESS_TICKET_KEY_NAME_LEN
) != 0) {
1536 SSL_DBG(("%d: SSL[%d]: Session ticket key_name sent mismatch.",
1537 SSL_GETPID(), ss
->fd
));
1541 /* Verify the MAC on the ticket. MAC verification may also
1542 * fail if the MAC key has been recently refreshed.
1544 #ifndef NO_PKCS11_BYPASS
1545 if (ss
->opt
.bypassPKCS11
) {
1546 hmac_ctx
= (HMACContext
*)hmac_ctx_buf
;
1547 hashObj
= HASH_GetRawHashObject(HASH_AlgSHA256
);
1548 if (HMAC_Init(hmac_ctx
, hashObj
, mac_key
,
1549 sizeof(session_ticket_mac_key
), PR_FALSE
) != SECSuccess
)
1551 HMAC_Begin(hmac_ctx
);
1552 HMAC_Update(hmac_ctx
, extension_data
.data
,
1553 extension_data
.len
- TLS_EX_SESS_TICKET_MAC_LENGTH
);
1554 if (HMAC_Finish(hmac_ctx
, computed_mac
, &computed_mac_length
,
1555 sizeof(computed_mac
)) != SECSuccess
)
1561 macParam
.data
= NULL
;
1563 hmac_ctx_pkcs11
= PK11_CreateContextBySymKey(macMech
,
1564 CKA_SIGN
, mac_key_pkcs11
, &macParam
);
1565 if (!hmac_ctx_pkcs11
) {
1566 SSL_DBG(("%d: SSL[%d]: Unable to create HMAC context: %d.",
1567 SSL_GETPID(), ss
->fd
, PORT_GetError()));
1570 SSL_DBG(("%d: SSL[%d]: Successfully created HMAC context.",
1571 SSL_GETPID(), ss
->fd
));
1573 rv
= PK11_DigestBegin(hmac_ctx_pkcs11
);
1574 rv
= PK11_DigestOp(hmac_ctx_pkcs11
, extension_data
.data
,
1575 extension_data
.len
- TLS_EX_SESS_TICKET_MAC_LENGTH
);
1576 if (rv
!= SECSuccess
) {
1577 PK11_DestroyContext(hmac_ctx_pkcs11
, PR_TRUE
);
1580 rv
= PK11_DigestFinal(hmac_ctx_pkcs11
, computed_mac
,
1581 &computed_mac_length
, sizeof(computed_mac
));
1582 PK11_DestroyContext(hmac_ctx_pkcs11
, PR_TRUE
);
1583 if (rv
!= SECSuccess
)
1586 if (NSS_SecureMemcmp(computed_mac
, enc_session_ticket
.mac
,
1587 computed_mac_length
) != 0) {
1588 SSL_DBG(("%d: SSL[%d]: Session ticket MAC mismatch.",
1589 SSL_GETPID(), ss
->fd
));
1593 /* We ignore key_name for now.
1594 * This is ok as MAC verification succeeded.
1597 /* Decrypt the ticket. */
1599 /* Plaintext is shorter than the ciphertext due to padding. */
1600 decrypted_state
= SECITEM_AllocItem(NULL
, NULL
,
1601 enc_session_ticket
.encrypted_state
.len
);
1603 #ifndef NO_PKCS11_BYPASS
1604 if (ss
->opt
.bypassPKCS11
) {
1605 aes_ctx
= (AESContext
*)aes_ctx_buf
;
1606 rv
= AES_InitContext(aes_ctx
, aes_key
,
1607 sizeof(session_ticket_enc_key
), enc_session_ticket
.iv
,
1608 NSS_AES_CBC
, 0,AES_BLOCK_SIZE
);
1609 if (rv
!= SECSuccess
) {
1610 SSL_DBG(("%d: SSL[%d]: Unable to create AES context.",
1611 SSL_GETPID(), ss
->fd
));
1615 rv
= AES_Decrypt(aes_ctx
, decrypted_state
->data
,
1616 &decrypted_state
->len
, decrypted_state
->len
,
1617 enc_session_ticket
.encrypted_state
.data
,
1618 enc_session_ticket
.encrypted_state
.len
);
1619 if (rv
!= SECSuccess
)
1625 ivItem
.data
= enc_session_ticket
.iv
;
1626 ivItem
.len
= AES_BLOCK_SIZE
;
1627 aes_ctx_pkcs11
= PK11_CreateContextBySymKey(cipherMech
,
1628 CKA_DECRYPT
, aes_key_pkcs11
, &ivItem
);
1629 if (!aes_ctx_pkcs11
) {
1630 SSL_DBG(("%d: SSL[%d]: Unable to create AES context.",
1631 SSL_GETPID(), ss
->fd
));
1635 rv
= PK11_CipherOp(aes_ctx_pkcs11
, decrypted_state
->data
,
1636 (int *)&decrypted_state
->len
, decrypted_state
->len
,
1637 enc_session_ticket
.encrypted_state
.data
,
1638 enc_session_ticket
.encrypted_state
.len
);
1639 PK11_Finalize(aes_ctx_pkcs11
);
1640 PK11_DestroyContext(aes_ctx_pkcs11
, PR_TRUE
);
1641 if (rv
!= SECSuccess
)
1645 /* Check padding. */
1647 (PRUint32
)decrypted_state
->data
[decrypted_state
->len
- 1];
1648 if (padding_length
== 0 || padding_length
> AES_BLOCK_SIZE
)
1651 padding
= &decrypted_state
->data
[decrypted_state
->len
- padding_length
];
1652 for (i
= 0; i
< padding_length
; i
++, padding
++) {
1653 if (padding_length
!= (PRUint32
)*padding
)
1657 /* Deserialize session state. */
1658 buffer
= decrypted_state
->data
;
1659 buffer_len
= decrypted_state
->len
;
1661 parsed_session_ticket
= PORT_ZAlloc(sizeof(SessionTicket
));
1662 if (parsed_session_ticket
== NULL
) {
1667 /* Read ticket_version (which is ignored for now.) */
1668 temp
= ssl3_ConsumeHandshakeNumber(ss
, 2, &buffer
, &buffer_len
);
1669 if (temp
< 0) goto no_ticket
;
1670 parsed_session_ticket
->ticket_version
= (SSL3ProtocolVersion
)temp
;
1672 /* Read SSLVersion. */
1673 temp
= ssl3_ConsumeHandshakeNumber(ss
, 2, &buffer
, &buffer_len
);
1674 if (temp
< 0) goto no_ticket
;
1675 parsed_session_ticket
->ssl_version
= (SSL3ProtocolVersion
)temp
;
1677 /* Read cipher_suite. */
1678 temp
= ssl3_ConsumeHandshakeNumber(ss
, 2, &buffer
, &buffer_len
);
1679 if (temp
< 0) goto no_ticket
;
1680 parsed_session_ticket
->cipher_suite
= (ssl3CipherSuite
)temp
;
1682 /* Read compression_method. */
1683 temp
= ssl3_ConsumeHandshakeNumber(ss
, 1, &buffer
, &buffer_len
);
1684 if (temp
< 0) goto no_ticket
;
1685 parsed_session_ticket
->compression_method
= (SSLCompressionMethod
)temp
;
1687 /* Read cipher spec parameters. */
1688 temp
= ssl3_ConsumeHandshakeNumber(ss
, 1, &buffer
, &buffer_len
);
1689 if (temp
< 0) goto no_ticket
;
1690 parsed_session_ticket
->authAlgorithm
= (SSLSignType
)temp
;
1691 temp
= ssl3_ConsumeHandshakeNumber(ss
, 4, &buffer
, &buffer_len
);
1692 if (temp
< 0) goto no_ticket
;
1693 parsed_session_ticket
->authKeyBits
= (PRUint32
)temp
;
1694 temp
= ssl3_ConsumeHandshakeNumber(ss
, 1, &buffer
, &buffer_len
);
1695 if (temp
< 0) goto no_ticket
;
1696 parsed_session_ticket
->keaType
= (SSLKEAType
)temp
;
1697 temp
= ssl3_ConsumeHandshakeNumber(ss
, 4, &buffer
, &buffer_len
);
1698 if (temp
< 0) goto no_ticket
;
1699 parsed_session_ticket
->keaKeyBits
= (PRUint32
)temp
;
1701 /* Read wrapped master_secret. */
1702 temp
= ssl3_ConsumeHandshakeNumber(ss
, 1, &buffer
, &buffer_len
);
1703 if (temp
< 0) goto no_ticket
;
1704 parsed_session_ticket
->ms_is_wrapped
= (PRBool
)temp
;
1706 temp
= ssl3_ConsumeHandshakeNumber(ss
, 1, &buffer
, &buffer_len
);
1707 if (temp
< 0) goto no_ticket
;
1708 parsed_session_ticket
->exchKeyType
= (SSL3KEAType
)temp
;
1710 temp
= ssl3_ConsumeHandshakeNumber(ss
, 4, &buffer
, &buffer_len
);
1711 if (temp
< 0) goto no_ticket
;
1712 parsed_session_ticket
->msWrapMech
= (CK_MECHANISM_TYPE
)temp
;
1714 temp
= ssl3_ConsumeHandshakeNumber(ss
, 2, &buffer
, &buffer_len
);
1715 if (temp
< 0) goto no_ticket
;
1716 parsed_session_ticket
->ms_length
= (PRUint16
)temp
;
1717 if (parsed_session_ticket
->ms_length
== 0 || /* sanity check MS. */
1718 parsed_session_ticket
->ms_length
>
1719 sizeof(parsed_session_ticket
->master_secret
))
1722 /* Allow for the wrapped master secret to be longer. */
1723 if (buffer_len
< parsed_session_ticket
->ms_length
)
1725 PORT_Memcpy(parsed_session_ticket
->master_secret
, buffer
,
1726 parsed_session_ticket
->ms_length
);
1727 buffer
+= parsed_session_ticket
->ms_length
;
1728 buffer_len
-= parsed_session_ticket
->ms_length
;
1730 /* Read client_identity */
1731 temp
= ssl3_ConsumeHandshakeNumber(ss
, 1, &buffer
, &buffer_len
);
1734 parsed_session_ticket
->client_identity
.client_auth_type
=
1735 (ClientAuthenticationType
)temp
;
1736 switch(parsed_session_ticket
->client_identity
.client_auth_type
) {
1737 case CLIENT_AUTH_ANONYMOUS
:
1739 case CLIENT_AUTH_CERTIFICATE
:
1740 rv
= ssl3_ConsumeHandshakeVariable(ss
, &cert_item
, 3,
1741 &buffer
, &buffer_len
);
1742 if (rv
!= SECSuccess
) goto no_ticket
;
1743 rv
= SECITEM_CopyItem(NULL
, &parsed_session_ticket
->peer_cert
,
1745 if (rv
!= SECSuccess
) goto no_ticket
;
1750 /* Read timestamp. */
1751 temp
= ssl3_ConsumeHandshakeNumber(ss
, 4, &buffer
, &buffer_len
);
1754 parsed_session_ticket
->timestamp
= (PRUint32
)temp
;
1756 /* Read server name */
1758 ssl3_ConsumeHandshakeNumber(ss
, 1, &buffer
, &buffer_len
);
1759 if (nameType
!= TLS_STE_NO_SERVER_NAME
) {
1761 rv
= ssl3_ConsumeHandshakeVariable(ss
, &name_item
, 2, &buffer
,
1763 if (rv
!= SECSuccess
) goto no_ticket
;
1764 rv
= SECITEM_CopyItem(NULL
, &parsed_session_ticket
->srvName
,
1766 if (rv
!= SECSuccess
) goto no_ticket
;
1767 parsed_session_ticket
->srvName
.type
= nameType
;
1770 /* Done parsing. Check that all bytes have been consumed. */
1771 if (buffer_len
!= padding_length
)
1774 /* Use the ticket if it has not expired, otherwise free the allocated
1775 * memory since the ticket is of no use.
1777 if (parsed_session_ticket
->timestamp
!= 0 &&
1778 parsed_session_ticket
->timestamp
+
1779 TLS_EX_SESS_TICKET_LIFETIME_HINT
> ssl_Time()) {
1781 sid
= ssl3_NewSessionID(ss
, PR_TRUE
);
1787 /* Copy over parameters. */
1788 sid
->version
= parsed_session_ticket
->ssl_version
;
1789 sid
->u
.ssl3
.cipherSuite
= parsed_session_ticket
->cipher_suite
;
1790 sid
->u
.ssl3
.compression
= parsed_session_ticket
->compression_method
;
1791 sid
->authAlgorithm
= parsed_session_ticket
->authAlgorithm
;
1792 sid
->authKeyBits
= parsed_session_ticket
->authKeyBits
;
1793 sid
->keaType
= parsed_session_ticket
->keaType
;
1794 sid
->keaKeyBits
= parsed_session_ticket
->keaKeyBits
;
1796 /* Copy master secret. */
1797 #ifndef NO_PKCS11_BYPASS
1798 if (ss
->opt
.bypassPKCS11
&&
1799 parsed_session_ticket
->ms_is_wrapped
)
1802 if (parsed_session_ticket
->ms_length
>
1803 sizeof(sid
->u
.ssl3
.keys
.wrapped_master_secret
))
1805 PORT_Memcpy(sid
->u
.ssl3
.keys
.wrapped_master_secret
,
1806 parsed_session_ticket
->master_secret
,
1807 parsed_session_ticket
->ms_length
);
1808 sid
->u
.ssl3
.keys
.wrapped_master_secret_len
=
1809 parsed_session_ticket
->ms_length
;
1810 sid
->u
.ssl3
.exchKeyType
= parsed_session_ticket
->exchKeyType
;
1811 sid
->u
.ssl3
.masterWrapMech
= parsed_session_ticket
->msWrapMech
;
1812 sid
->u
.ssl3
.keys
.msIsWrapped
=
1813 parsed_session_ticket
->ms_is_wrapped
;
1814 sid
->u
.ssl3
.masterValid
= PR_TRUE
;
1815 sid
->u
.ssl3
.keys
.resumable
= PR_TRUE
;
1817 /* Copy over client cert from session ticket if there is one. */
1818 if (parsed_session_ticket
->peer_cert
.data
!= NULL
) {
1819 if (sid
->peerCert
!= NULL
)
1820 CERT_DestroyCertificate(sid
->peerCert
);
1821 sid
->peerCert
= CERT_NewTempCertificate(ss
->dbHandle
,
1822 &parsed_session_ticket
->peer_cert
, NULL
, PR_FALSE
, PR_TRUE
);
1823 if (sid
->peerCert
== NULL
) {
1828 if (parsed_session_ticket
->srvName
.data
!= NULL
) {
1829 sid
->u
.ssl3
.srvName
= parsed_session_ticket
->srvName
;
1831 ss
->statelessResume
= PR_TRUE
;
1832 ss
->sec
.ci
.sid
= sid
;
1838 SSL_DBG(("%d: SSL[%d]: Session ticket parsing failed.",
1839 SSL_GETPID(), ss
->fd
));
1840 ssl3stats
= SSL_GetStatistics();
1841 SSL_AtomicIncrementLong(& ssl3stats
->hch_sid_ticket_parse_failures
);
1846 /* ss->sec.ci.sid == sid if it did NOT come here via goto statement
1847 * in that case do not free sid
1849 if (sid
&& (ss
->sec
.ci
.sid
!= sid
)) {
1853 if (decrypted_state
!= NULL
) {
1854 SECITEM_FreeItem(decrypted_state
, PR_TRUE
);
1855 decrypted_state
= NULL
;
1858 if (parsed_session_ticket
!= NULL
) {
1859 if (parsed_session_ticket
->peer_cert
.data
) {
1860 SECITEM_FreeItem(&parsed_session_ticket
->peer_cert
, PR_FALSE
);
1862 PORT_ZFree(parsed_session_ticket
, sizeof(SessionTicket
));
1869 * Read bytes. Using this function means the SECItem structure
1870 * cannot be freed. The caller is expected to call this function
1871 * on a shallow copy of the structure.
1874 ssl3_ConsumeFromItem(SECItem
*item
, unsigned char **buf
, PRUint32 bytes
)
1876 if (bytes
> item
->len
)
1880 item
->data
+= bytes
;
1886 ssl3_ParseEncryptedSessionTicket(sslSocket
*ss
, SECItem
*data
,
1887 EncryptedSessionTicket
*enc_session_ticket
)
1889 if (ssl3_ConsumeFromItem(data
, &enc_session_ticket
->key_name
,
1890 SESS_TICKET_KEY_NAME_LEN
) != SECSuccess
)
1892 if (ssl3_ConsumeFromItem(data
, &enc_session_ticket
->iv
,
1893 AES_BLOCK_SIZE
) != SECSuccess
)
1895 if (ssl3_ConsumeHandshakeVariable(ss
, &enc_session_ticket
->encrypted_state
,
1896 2, &data
->data
, &data
->len
) != SECSuccess
)
1898 if (ssl3_ConsumeFromItem(data
, &enc_session_ticket
->mac
,
1899 TLS_EX_SESS_TICKET_MAC_LENGTH
) != SECSuccess
)
1901 if (data
->len
!= 0) /* Make sure that we have consumed all bytes. */
1907 /* go through hello extensions in buffer "b".
1908 * For each one, find the extension handler in the table, and
1909 * if present, invoke that handler.
1910 * Servers ignore any extensions with unknown extension types.
1911 * Clients reject any extensions with unadvertised extension types.
1914 ssl3_HandleHelloExtensions(sslSocket
*ss
, SSL3Opaque
**b
, PRUint32
*length
)
1916 const ssl3HelloExtensionHandler
* handlers
;
1918 if (ss
->sec
.isServer
) {
1919 handlers
= clientHelloHandlers
;
1920 } else if (ss
->version
> SSL_LIBRARY_VERSION_3_0
) {
1921 handlers
= serverHelloHandlersTLS
;
1923 handlers
= serverHelloHandlersSSL3
;
1927 const ssl3HelloExtensionHandler
* handler
;
1929 PRInt32 extension_type
;
1930 SECItem extension_data
;
1932 /* Get the extension's type field */
1933 extension_type
= ssl3_ConsumeHandshakeNumber(ss
, 2, b
, length
);
1934 if (extension_type
< 0) /* failure to decode extension_type */
1935 return SECFailure
; /* alert already sent */
1937 /* get the data for this extension, so we can pass it or skip it. */
1938 rv
= ssl3_ConsumeHandshakeVariable(ss
, &extension_data
, 2, b
, length
);
1939 if (rv
!= SECSuccess
)
1942 /* Check whether the server sent an extension which was not advertised
1943 * in the ClientHello.
1945 if (!ss
->sec
.isServer
&&
1946 !ssl3_ClientExtensionAdvertised(ss
, extension_type
))
1947 return SECFailure
; /* TODO: send unsupported_extension alert */
1949 /* Check whether an extension has been sent multiple times. */
1950 if (ssl3_ExtensionNegotiated(ss
, extension_type
))
1953 /* find extension_type in table of Hello Extension Handlers */
1954 for (handler
= handlers
; handler
->ex_type
>= 0; handler
++) {
1955 /* if found, call this handler */
1956 if (handler
->ex_type
== extension_type
) {
1957 rv
= (*handler
->ex_handler
)(ss
, (PRUint16
)extension_type
,
1959 /* Ignore this result */
1960 /* Treat all bad extensions as unrecognized types. */
1968 /* Add a callback function to the table of senders of server hello extensions.
1971 ssl3_RegisterServerHelloExtensionSender(sslSocket
*ss
, PRUint16 ex_type
,
1972 ssl3HelloExtensionSenderFunc cb
)
1975 ssl3HelloExtensionSender
*sender
= &ss
->xtnData
.serverSenders
[0];
1977 for (i
= 0; i
< SSL_MAX_EXTENSIONS
; ++i
, ++sender
) {
1978 if (!sender
->ex_sender
) {
1979 sender
->ex_type
= ex_type
;
1980 sender
->ex_sender
= cb
;
1983 /* detect duplicate senders */
1984 PORT_Assert(sender
->ex_type
!= ex_type
);
1985 if (sender
->ex_type
== ex_type
) {
1990 PORT_Assert(i
< SSL_MAX_EXTENSIONS
); /* table needs to grow */
1991 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE
);
1995 /* call each of the extension senders and return the accumulated length */
1997 ssl3_CallHelloExtensionSenders(sslSocket
*ss
, PRBool append
, PRUint32 maxBytes
,
1998 const ssl3HelloExtensionSender
*sender
)
2000 PRInt32 total_exten_len
= 0;
2004 sender
= ss
->version
> SSL_LIBRARY_VERSION_3_0
?
2005 &clientHelloSendersTLS
[0] : &clientHelloSendersSSL3
[0];
2008 for (i
= 0; i
< SSL_MAX_EXTENSIONS
; ++i
, ++sender
) {
2009 if (sender
->ex_sender
) {
2010 PRInt32 extLen
= (*sender
->ex_sender
)(ss
, append
, maxBytes
);
2014 total_exten_len
+= extLen
;
2017 return total_exten_len
;
2021 /* Extension format:
2022 * Extension number: 2 bytes
2023 * Extension length: 2 bytes
2024 * Verify Data Length: 1 byte
2025 * Verify Data (TLS): 12 bytes (client) or 24 bytes (server)
2026 * Verify Data (SSL): 36 bytes (client) or 72 bytes (server)
2029 ssl3_SendRenegotiationInfoXtn(
2034 PRInt32 len
, needed
;
2036 /* In draft-ietf-tls-renegotiation-03, it is NOT RECOMMENDED to send
2037 * both the SCSV and the empty RI, so when we send SCSV in
2038 * the initial handshake, we don't also send RI.
2040 if (!ss
|| ss
->ssl3
.hs
.sendingSCSV
)
2042 len
= !ss
->firstHsDone
? 0 :
2043 (ss
->sec
.isServer
? ss
->ssl3
.hs
.finishedBytes
* 2
2044 : ss
->ssl3
.hs
.finishedBytes
);
2046 if (append
&& maxBytes
>= needed
) {
2048 /* extension_type */
2049 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_renegotiation_info_xtn
, 2);
2050 if (rv
!= SECSuccess
) return -1;
2051 /* length of extension_data */
2052 rv
= ssl3_AppendHandshakeNumber(ss
, len
+ 1, 2);
2053 if (rv
!= SECSuccess
) return -1;
2054 /* verify_Data from previous Finished message(s) */
2055 rv
= ssl3_AppendHandshakeVariable(ss
,
2056 ss
->ssl3
.hs
.finishedMsgs
.data
, len
, 1);
2057 if (rv
!= SECSuccess
) return -1;
2058 if (!ss
->sec
.isServer
) {
2059 TLSExtensionData
*xtnData
= &ss
->xtnData
;
2060 xtnData
->advertised
[xtnData
->numAdvertised
++] =
2061 ssl_renegotiation_info_xtn
;
2068 ssl3_ServerHandleStatusRequestXtn(sslSocket
*ss
, PRUint16 ex_type
,
2071 SECStatus rv
= SECSuccess
;
2073 /* remember that we got this extension. */
2074 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ex_type
;
2075 PORT_Assert(ss
->sec
.isServer
);
2076 /* prepare to send back the appropriate response */
2077 rv
= ssl3_RegisterServerHelloExtensionSender(ss
, ex_type
,
2078 ssl3_ServerSendStatusRequestXtn
);
2082 /* This function runs in both the client and server. */
2084 ssl3_HandleRenegotiationInfoXtn(sslSocket
*ss
, PRUint16 ex_type
, SECItem
*data
)
2086 SECStatus rv
= SECSuccess
;
2089 if (ss
->firstHsDone
) {
2090 len
= ss
->sec
.isServer
? ss
->ssl3
.hs
.finishedBytes
2091 : ss
->ssl3
.hs
.finishedBytes
* 2;
2093 if (data
->len
!= 1 + len
||
2094 data
->data
[0] != len
|| (len
&&
2095 NSS_SecureMemcmp(ss
->ssl3
.hs
.finishedMsgs
.data
,
2096 data
->data
+ 1, len
))) {
2097 /* Can we do this here? Or, must we arrange for the caller to do it? */
2098 (void)SSL3_SendAlert(ss
, alert_fatal
, handshake_failure
);
2099 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE
);
2102 /* remember that we got this extension and it was correct. */
2103 ss
->peerRequestedProtection
= 1;
2104 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ex_type
;
2105 if (ss
->sec
.isServer
) {
2106 /* prepare to send back the appropriate response */
2107 rv
= ssl3_RegisterServerHelloExtensionSender(ss
, ex_type
,
2108 ssl3_SendRenegotiationInfoXtn
);
2114 ssl3_SendUseSRTPXtn(sslSocket
*ss
, PRBool append
, PRUint32 maxBytes
)
2116 PRUint32 ext_data_len
;
2123 if (!ss
->sec
.isServer
) {
2126 if (!IS_DTLS(ss
) || !ss
->ssl3
.dtlsSRTPCipherCount
)
2127 return 0; /* Not relevant */
2129 ext_data_len
= 2 + 2 * ss
->ssl3
.dtlsSRTPCipherCount
+ 1;
2131 if (append
&& maxBytes
>= 4 + ext_data_len
) {
2132 /* Extension type */
2133 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_use_srtp_xtn
, 2);
2134 if (rv
!= SECSuccess
) return -1;
2135 /* Length of extension data */
2136 rv
= ssl3_AppendHandshakeNumber(ss
, ext_data_len
, 2);
2137 if (rv
!= SECSuccess
) return -1;
2138 /* Length of the SRTP cipher list */
2139 rv
= ssl3_AppendHandshakeNumber(ss
,
2140 2 * ss
->ssl3
.dtlsSRTPCipherCount
,
2142 if (rv
!= SECSuccess
) return -1;
2143 /* The SRTP ciphers */
2144 for (i
= 0; i
< ss
->ssl3
.dtlsSRTPCipherCount
; i
++) {
2145 rv
= ssl3_AppendHandshakeNumber(ss
,
2146 ss
->ssl3
.dtlsSRTPCiphers
[i
],
2149 /* Empty MKI value */
2150 ssl3_AppendHandshakeVariable(ss
, NULL
, 0, 1);
2152 ss
->xtnData
.advertised
[ss
->xtnData
.numAdvertised
++] =
2156 return 4 + ext_data_len
;
2160 if (append
&& maxBytes
>= 9) {
2161 /* Extension type */
2162 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_use_srtp_xtn
, 2);
2163 if (rv
!= SECSuccess
) return -1;
2164 /* Length of extension data */
2165 rv
= ssl3_AppendHandshakeNumber(ss
, 5, 2);
2166 if (rv
!= SECSuccess
) return -1;
2167 /* Length of the SRTP cipher list */
2168 rv
= ssl3_AppendHandshakeNumber(ss
, 2, 2);
2169 if (rv
!= SECSuccess
) return -1;
2170 /* The selected cipher */
2171 rv
= ssl3_AppendHandshakeNumber(ss
, ss
->ssl3
.dtlsSRTPCipherSuite
, 2);
2172 if (rv
!= SECSuccess
) return -1;
2173 /* Empty MKI value */
2174 ssl3_AppendHandshakeVariable(ss
, NULL
, 0, 1);
2181 ssl3_HandleUseSRTPXtn(sslSocket
* ss
, PRUint16 ex_type
, SECItem
*data
)
2184 SECItem ciphers
= {siBuffer
, NULL
, 0};
2187 PRUint16 cipher
= 0;
2188 PRBool found
= PR_FALSE
;
2191 if (!ss
->sec
.isServer
) {
2193 if (!data
->data
|| !data
->len
) {
2198 /* Get the cipher list */
2199 rv
= ssl3_ConsumeHandshakeVariable(ss
, &ciphers
, 2,
2200 &data
->data
, &data
->len
);
2201 if (rv
!= SECSuccess
) {
2204 /* Now check that the number of ciphers listed is 1 (len = 2) */
2205 if (ciphers
.len
!= 2) {
2209 /* Get the selected cipher */
2210 cipher
= (ciphers
.data
[0] << 8) | ciphers
.data
[1];
2212 /* Now check that this is one of the ciphers we offered */
2213 for (i
= 0; i
< ss
->ssl3
.dtlsSRTPCipherCount
; i
++) {
2214 if (cipher
== ss
->ssl3
.dtlsSRTPCiphers
[i
]) {
2224 /* Get the srtp_mki value */
2225 rv
= ssl3_ConsumeHandshakeVariable(ss
, &litem
, 1,
2226 &data
->data
, &data
->len
);
2227 if (rv
!= SECSuccess
) {
2231 /* We didn't offer an MKI, so this must be 0 length */
2232 /* XXX RFC 5764 Section 4.1.3 says:
2233 * If the client detects a nonzero-length MKI in the server's
2234 * response that is different than the one the client offered,
2235 * then the client MUST abort the handshake and SHOULD send an
2236 * invalid_parameter alert.
2238 * Due to a limitation of the ssl3_HandleHelloExtensions function,
2239 * returning SECFailure here won't abort the handshake. It will
2240 * merely cause the use_srtp extension to be not negotiated. We
2241 * should fix this. See NSS bug 753136.
2243 if (litem
.len
!= 0) {
2247 if (data
->len
!= 0) {
2252 /* OK, this looks fine. */
2253 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ssl_use_srtp_xtn
;
2254 ss
->ssl3
.dtlsSRTPCipherSuite
= cipher
;
2259 if (!IS_DTLS(ss
) || !ss
->ssl3
.dtlsSRTPCipherCount
) {
2260 /* Ignore the extension if we aren't doing DTLS or no DTLS-SRTP
2261 * preferences have been set. */
2265 if (!data
->data
|| data
->len
< 5) {
2270 /* Get the cipher list */
2271 rv
= ssl3_ConsumeHandshakeVariable(ss
, &ciphers
, 2,
2272 &data
->data
, &data
->len
);
2273 if (rv
!= SECSuccess
) {
2276 /* Check that the list is even length */
2277 if (ciphers
.len
% 2) {
2281 /* Walk through the offered list and pick the most preferred of our
2282 * ciphers, if any */
2283 for (i
= 0; !found
&& i
< ss
->ssl3
.dtlsSRTPCipherCount
; i
++) {
2284 for (j
= 0; j
+ 1 < ciphers
.len
; j
+= 2) {
2285 cipher
= (ciphers
.data
[j
] << 8) | ciphers
.data
[j
+ 1];
2286 if (cipher
== ss
->ssl3
.dtlsSRTPCiphers
[i
]) {
2293 /* Get the srtp_mki value */
2294 rv
= ssl3_ConsumeHandshakeVariable(ss
, &litem
, 1, &data
->data
, &data
->len
);
2295 if (rv
!= SECSuccess
) {
2299 if (data
->len
!= 0) {
2300 return SECFailure
; /* Malformed */
2303 /* Now figure out what to do */
2305 /* No matching ciphers */
2309 /* OK, we have a valid cipher and we've selected it */
2310 ss
->ssl3
.dtlsSRTPCipherSuite
= cipher
;
2311 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ssl_use_srtp_xtn
;
2313 return ssl3_RegisterServerHelloExtensionSender(ss
, ssl_use_srtp_xtn
,
2314 ssl3_SendUseSRTPXtn
);
2317 /* ssl3_ServerHandleSigAlgsXtn handles the signature_algorithms extension
2319 * See https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */
2321 ssl3_ServerHandleSigAlgsXtn(sslSocket
* ss
, PRUint16 ex_type
, SECItem
*data
)
2325 const unsigned char *b
;
2326 unsigned int numAlgorithms
, i
;
2328 /* Ignore this extension if we aren't doing TLS 1.2 or greater. */
2329 if (ss
->version
< SSL_LIBRARY_VERSION_TLS_1_2
) {
2333 /* Keep track of negotiated extensions. */
2334 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ex_type
;
2336 rv
= ssl3_ConsumeHandshakeVariable(ss
, &algorithms
, 2, &data
->data
,
2338 if (rv
!= SECSuccess
) {
2341 /* Trailing data, empty value, or odd-length value is invalid. */
2342 if (data
->len
!= 0 || algorithms
.len
== 0 || (algorithms
.len
& 1) != 0) {
2343 PORT_SetError(SSL_ERROR_RX_MALFORMED_CLIENT_HELLO
);
2347 numAlgorithms
= algorithms
.len
/2;
2349 /* We don't care to process excessive numbers of algorithms. */
2350 if (numAlgorithms
> 512) {
2351 numAlgorithms
= 512;
2354 ss
->ssl3
.hs
.clientSigAndHash
=
2355 PORT_NewArray(SSL3SignatureAndHashAlgorithm
, numAlgorithms
);
2356 if (!ss
->ssl3
.hs
.clientSigAndHash
) {
2359 ss
->ssl3
.hs
.numClientSigAndHash
= 0;
2361 b
= algorithms
.data
;
2362 for (i
= 0; i
< numAlgorithms
; i
++) {
2363 unsigned char tls_hash
= *(b
++);
2364 unsigned char tls_sig
= *(b
++);
2365 SECOidTag hash
= ssl3_TLSHashAlgorithmToOID(tls_hash
);
2367 if (hash
== SEC_OID_UNKNOWN
) {
2368 /* We ignore formats that we don't understand. */
2371 /* tls_sig support will be checked later in
2372 * ssl3_PickSignatureHashAlgorithm. */
2373 ss
->ssl3
.hs
.clientSigAndHash
[i
].hashAlg
= hash
;
2374 ss
->ssl3
.hs
.clientSigAndHash
[i
].sigAlg
= tls_sig
;
2375 ss
->ssl3
.hs
.numClientSigAndHash
++;
2378 if (!ss
->ssl3
.hs
.numClientSigAndHash
) {
2379 /* We didn't understand any of the client's requested signature
2380 * formats. We'll use the defaults. */
2381 PORT_Free(ss
->ssl3
.hs
.clientSigAndHash
);
2382 ss
->ssl3
.hs
.clientSigAndHash
= NULL
;
2388 /* ssl3_ClientSendSigAlgsXtn sends the signature_algorithm extension for TLS
2389 * 1.2 ClientHellos. */
2391 ssl3_ClientSendSigAlgsXtn(sslSocket
* ss
, PRBool append
, PRUint32 maxBytes
)
2393 static const unsigned char signatureAlgorithms
[] = {
2394 /* This block is the contents of our signature_algorithms extension, in
2396 * https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */
2397 tls_hash_sha256
, tls_sig_rsa
,
2398 tls_hash_sha384
, tls_sig_rsa
,
2399 tls_hash_sha1
, tls_sig_rsa
,
2400 #ifdef NSS_ENABLE_ECC
2401 tls_hash_sha256
, tls_sig_ecdsa
,
2402 tls_hash_sha384
, tls_sig_ecdsa
,
2403 tls_hash_sha1
, tls_sig_ecdsa
,
2405 tls_hash_sha256
, tls_sig_dsa
,
2406 tls_hash_sha1
, tls_sig_dsa
,
2408 PRInt32 extension_length
;
2410 if (ss
->version
< SSL_LIBRARY_VERSION_TLS_1_2
) {
2415 2 /* extension type */ +
2416 2 /* extension length */ +
2417 2 /* supported_signature_algorithms length */ +
2418 sizeof(signatureAlgorithms
);
2420 if (append
&& maxBytes
>= extension_length
) {
2422 rv
= ssl3_AppendHandshakeNumber(ss
, ssl_signature_algorithms_xtn
, 2);
2423 if (rv
!= SECSuccess
)
2425 rv
= ssl3_AppendHandshakeNumber(ss
, extension_length
- 4, 2);
2426 if (rv
!= SECSuccess
)
2428 rv
= ssl3_AppendHandshakeVariable(ss
, signatureAlgorithms
,
2429 sizeof(signatureAlgorithms
), 2);
2430 if (rv
!= SECSuccess
)
2432 ss
->xtnData
.advertised
[ss
->xtnData
.numAdvertised
++] =
2433 ssl_signature_algorithms_xtn
;
2434 } else if (maxBytes
< extension_length
) {
2439 return extension_length
;
2446 ssl3_CalculatePaddingExtensionLength(unsigned int clientHelloLength
)
2448 unsigned int recordLength
= 1 /* handshake message type */ +
2449 3 /* handshake message length */ +
2451 unsigned int extensionLength
;
2453 if (recordLength
< 256 || recordLength
>= 512) {
2457 extensionLength
= 512 - recordLength
;
2458 /* Extensions take at least four bytes to encode. Always include at least
2459 * one byte of data if including the extension. WebSphere Application Server
2460 * 7.0 is intolerant to the last extension being zero-length. */
2461 if (extensionLength
< 4 + 1) {
2462 extensionLength
= 4 + 1;
2465 return extensionLength
;
2468 /* ssl3_AppendPaddingExtension possibly adds an extension which ensures that a
2469 * ClientHello record is either < 256 bytes or is >= 512 bytes. This ensures
2470 * that we don't trigger bugs in F5 products. */
2472 ssl3_AppendPaddingExtension(sslSocket
*ss
, unsigned int extensionLen
,
2475 unsigned int paddingLen
= extensionLen
- 4;
2476 static unsigned char padding
[256];
2478 if (extensionLen
== 0) {
2482 if (extensionLen
< 4 ||
2483 extensionLen
> maxBytes
||
2484 paddingLen
> sizeof(padding
)) {
2489 if (SECSuccess
!= ssl3_AppendHandshakeNumber(ss
, ssl_padding_xtn
, 2))
2491 if (SECSuccess
!= ssl3_AppendHandshakeNumber(ss
, paddingLen
, 2))
2493 if (SECSuccess
!= ssl3_AppendHandshake(ss
, padding
, paddingLen
))
2496 return extensionLen
;
2499 /* ssl3_ClientSendSignedCertTimestampXtn sends the signed_certificate_timestamp
2500 * extension for TLS ClientHellos. */
2502 ssl3_ClientSendSignedCertTimestampXtn(sslSocket
*ss
, PRBool append
,
2505 PRInt32 extension_length
= 2 /* extension_type */ +
2506 2 /* length(extension_data) */;
2508 /* Only send the extension if processing is enabled. */
2509 if (!ss
->opt
.enableSignedCertTimestamps
)
2512 if (append
&& maxBytes
>= extension_length
) {
2514 /* extension_type */
2515 rv
= ssl3_AppendHandshakeNumber(ss
,
2516 ssl_signed_certificate_timestamp_xtn
,
2518 if (rv
!= SECSuccess
)
2521 rv
= ssl3_AppendHandshakeNumber(ss
, 0, 2);
2522 if (rv
!= SECSuccess
)
2524 ss
->xtnData
.advertised
[ss
->xtnData
.numAdvertised
++] =
2525 ssl_signed_certificate_timestamp_xtn
;
2526 } else if (maxBytes
< extension_length
) {
2531 return extension_length
;
2537 ssl3_ClientHandleSignedCertTimestampXtn(sslSocket
*ss
, PRUint16 ex_type
,
2540 /* We do not yet know whether we'll be resuming a session or creating
2541 * a new one, so we keep a pointer to the data in the TLSExtensionData
2542 * structure. This pointer is only valid in the scope of
2543 * ssl3_HandleServerHello, and, if not resuming a session, the data is
2544 * copied once a new session structure has been set up.
2545 * All parsing is currently left to the application and we accept
2546 * everything, including empty data.
2548 SECItem
*scts
= &ss
->xtnData
.signedCertTimestamps
;
2549 PORT_Assert(!scts
->data
&& !scts
->len
);
2552 /* Empty extension data: RFC 6962 mandates non-empty contents. */
2556 /* Keep track of negotiated extensions. */
2557 ss
->xtnData
.negotiated
[ss
->xtnData
.numNegotiated
++] = ex_type
;