| Index: net/third_party/nss/patches/alpnserver.patch
|
| diff --git a/net/third_party/nss/patches/alpnserver.patch b/net/third_party/nss/patches/alpnserver.patch
|
| deleted file mode 100644
|
| index b4226b76f5e5a9f3c53e6c586d1e30e9d81481f0..0000000000000000000000000000000000000000
|
| --- a/net/third_party/nss/patches/alpnserver.patch
|
| +++ /dev/null
|
| @@ -1,349 +0,0 @@
|
| -diff --git a/net/third_party/nss/ssl/SSLerrs.h b/net/third_party/nss/ssl/SSLerrs.h
|
| -index 4ff0b7d..3f0078c 100644
|
| ---- a/net/third_party/nss/ssl/SSLerrs.h
|
| -+++ b/net/third_party/nss/ssl/SSLerrs.h
|
| -@@ -413,16 +413,22 @@ ER3(SSL_ERROR_DIGEST_FAILURE, (SSL_ERROR_BASE + 127),
|
| - ER3(SSL_ERROR_INCORRECT_SIGNATURE_ALGORITHM, (SSL_ERROR_BASE + 128),
|
| - "Incorrect signature algorithm specified in a digitally-signed element.")
|
| -
|
| --ER3(SSL_ERROR_BAD_CHANNEL_ID_DATA, (SSL_ERROR_BASE + 129),
|
| --"SSL received a malformed TLS Channel ID extension.")
|
| -+ER3(SSL_ERROR_NEXT_PROTOCOL_NO_CALLBACK, (SSL_ERROR_BASE + 129),
|
| -+"The next protocol negotiation extension was enabled, but the callback was cleared prior to being needed.")
|
| -
|
| --ER3(SSL_ERROR_INVALID_CHANNEL_ID_KEY, (SSL_ERROR_BASE + 130),
|
| --"The application provided an invalid TLS Channel ID key.")
|
| -+ER3(SSL_ERROR_NEXT_PROTOCOL_NO_PROTOCOL, (SSL_ERROR_BASE + 130),
|
| -+"The server supports no protocols that the client advertises in the ALPN extension.")
|
| -
|
| --ER3(SSL_ERROR_GET_CHANNEL_ID_FAILED, (SSL_ERROR_BASE + 131),
|
| --"The application could not get a TLS Channel ID.")
|
| --
|
| --ER3(SSL_ERROR_INAPPROPRIATE_FALLBACK_ALERT, (SSL_ERROR_BASE + 132),
|
| -+ER3(SSL_ERROR_INAPPROPRIATE_FALLBACK_ALERT, (SSL_ERROR_BASE + 131),
|
| - "The connection was using a lesser TLS version as a result of a previous"
|
| - " handshake failure, but the server indicated that it should not have been"
|
| - " needed.")
|
| -+
|
| -+ER3(SSL_ERROR_BAD_CHANNEL_ID_DATA, (SSL_ERROR_BASE + 132),
|
| -+"SSL received a malformed TLS Channel ID extension.")
|
| -+
|
| -+ER3(SSL_ERROR_INVALID_CHANNEL_ID_KEY, (SSL_ERROR_BASE + 133),
|
| -+"The application provided an invalid TLS Channel ID key.")
|
| -+
|
| -+ER3(SSL_ERROR_GET_CHANNEL_ID_FAILED, (SSL_ERROR_BASE + 134),
|
| -+"The application could not get a TLS Channel ID.")
|
| -diff --git a/net/third_party/nss/ssl/ssl3ext.c b/net/third_party/nss/ssl/ssl3ext.c
|
| -index 523e49a..f6530fe 100644
|
| ---- a/net/third_party/nss/ssl/ssl3ext.c
|
| -+++ b/net/third_party/nss/ssl/ssl3ext.c
|
| -@@ -56,10 +56,14 @@ static SECStatus ssl3_ClientHandleAppProtoXtn(sslSocket *ss,
|
| - PRUint16 ex_type, SECItem *data);
|
| - static SECStatus ssl3_ServerHandleNextProtoNegoXtn(sslSocket *ss,
|
| - PRUint16 ex_type, SECItem *data);
|
| -+static SECStatus ssl3_ServerHandleAppProtoXtn(sslSocket *ss, PRUint16 ex_type,
|
| -+ SECItem *data);
|
| -+static PRInt32 ssl3_ClientSendNextProtoNegoXtn(sslSocket *ss, PRBool append,
|
| -+ PRUint32 maxBytes);
|
| - static PRInt32 ssl3_ClientSendAppProtoXtn(sslSocket *ss, PRBool append,
|
| - PRUint32 maxBytes);
|
| --static PRInt32 ssl3_ClientSendNextProtoNegoXtn(sslSocket *ss, PRBool append,
|
| -- PRUint32 maxBytes);
|
| -+static PRInt32 ssl3_ServerSendAppProtoXtn(sslSocket *ss, PRBool append,
|
| -+ PRUint32 maxBytes);
|
| - static PRInt32 ssl3_SendUseSRTPXtn(sslSocket *ss, PRBool append,
|
| - PRUint32 maxBytes);
|
| - static SECStatus ssl3_HandleUseSRTPXtn(sslSocket * ss, PRUint16 ex_type,
|
| -@@ -247,6 +251,7 @@ static const ssl3HelloExtensionHandler clientHelloHandlers[] = {
|
| - { ssl_session_ticket_xtn, &ssl3_ServerHandleSessionTicketXtn },
|
| - { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn },
|
| - { ssl_next_proto_nego_xtn, &ssl3_ServerHandleNextProtoNegoXtn },
|
| -+ { ssl_app_layer_protocol_xtn, &ssl3_ServerHandleAppProtoXtn },
|
| - { ssl_use_srtp_xtn, &ssl3_HandleUseSRTPXtn },
|
| - { ssl_cert_status_xtn, &ssl3_ServerHandleStatusRequestXtn },
|
| - { ssl_signature_algorithms_xtn, &ssl3_ServerHandleSigAlgsXtn },
|
| -@@ -578,7 +583,8 @@ ssl3_SendSessionTicketXtn(
|
| -
|
| - /* handle an incoming Next Protocol Negotiation extension. */
|
| - static SECStatus
|
| --ssl3_ServerHandleNextProtoNegoXtn(sslSocket * ss, PRUint16 ex_type, SECItem *data)
|
| -+ssl3_ServerHandleNextProtoNegoXtn(sslSocket * ss, PRUint16 ex_type,
|
| -+ SECItem *data)
|
| - {
|
| - if (ss->firstHsDone || data->len != 0) {
|
| - /* Clients MUST send an empty NPN extension, if any. */
|
| -@@ -623,14 +629,93 @@ ssl3_ValidateNextProtoNego(const unsigned char* data, unsigned int length)
|
| - return SECSuccess;
|
| - }
|
| -
|
| -+/* protocol selection handler for ALPN (server side) and NPN (client side) */
|
| - static SECStatus
|
| --ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss, PRUint16 ex_type,
|
| -- SECItem *data)
|
| -+ssl3_SelectAppProtocol(sslSocket *ss, PRUint16 ex_type, SECItem *data)
|
| - {
|
| - SECStatus rv;
|
| - unsigned char resultBuffer[255];
|
| - SECItem result = { siBuffer, resultBuffer, 0 };
|
| -
|
| -+ rv = ssl3_ValidateNextProtoNego(data->data, data->len);
|
| -+ if (rv != SECSuccess)
|
| -+ return rv;
|
| -+
|
| -+ PORT_Assert(ss->nextProtoCallback);
|
| -+ rv = ss->nextProtoCallback(ss->nextProtoArg, ss->fd, data->data, data->len,
|
| -+ result.data, &result.len, sizeof resultBuffer);
|
| -+ if (rv != SECSuccess)
|
| -+ return rv;
|
| -+ /* If the callback wrote more than allowed to |result| it has corrupted our
|
| -+ * stack. */
|
| -+ if (result.len > sizeof resultBuffer) {
|
| -+ PORT_SetError(SEC_ERROR_OUTPUT_LEN);
|
| -+ return SECFailure;
|
| -+ }
|
| -+
|
| -+ if (ex_type == ssl_app_layer_protocol_xtn &&
|
| -+ ss->ssl3.nextProtoState != SSL_NEXT_PROTO_NEGOTIATED) {
|
| -+ /* The callback might say OK, but then it's picked a default.
|
| -+ * That's OK for NPN, but not ALPN. */
|
| -+ SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE);
|
| -+ PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_NO_PROTOCOL);
|
| -+ (void)SSL3_SendAlert(ss, alert_fatal, no_application_protocol);
|
| -+ return SECFailure;
|
| -+ }
|
| -+
|
| -+ ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
|
| -+
|
| -+ SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE);
|
| -+ return SECITEM_CopyItem(NULL, &ss->ssl3.nextProto, &result);
|
| -+}
|
| -+
|
| -+/* handle an incoming ALPN extension at the server */
|
| -+static SECStatus
|
| -+ssl3_ServerHandleAppProtoXtn(sslSocket *ss, PRUint16 ex_type, SECItem *data)
|
| -+{
|
| -+ int count;
|
| -+ SECStatus rv;
|
| -+
|
| -+ /* We expressly don't want to allow ALPN on renegotiation,
|
| -+ * despite it being permitted by the spec. */
|
| -+ if (ss->firstHsDone || data->len == 0) {
|
| -+ /* Clients MUST send a non-empty ALPN extension. */
|
| -+ PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
|
| -+ return SECFailure;
|
| -+ }
|
| -+
|
| -+ /* unlike NPN, ALPN has extra redundant length information so that
|
| -+ * the extension is the same in both ClientHello and ServerHello */
|
| -+ count = ssl3_ConsumeHandshakeNumber(ss, 2, &data->data, &data->len);
|
| -+ if (count < 0) {
|
| -+ return SECFailure; /* fatal alert was sent */
|
| -+ }
|
| -+ if (count != data->len) {
|
| -+ return ssl3_DecodeError(ss);
|
| -+ }
|
| -+
|
| -+ if (!ss->nextProtoCallback) {
|
| -+ /* we're not configured for it */
|
| -+ return SECSuccess;
|
| -+ }
|
| -+
|
| -+ rv = ssl3_SelectAppProtocol(ss, ex_type, data);
|
| -+ if (rv != SECSuccess) {
|
| -+ return rv;
|
| -+ }
|
| -+
|
| -+ /* prepare to send back a response, if we negotiated */
|
| -+ if (ss->ssl3.nextProtoState == SSL_NEXT_PROTO_NEGOTIATED) {
|
| -+ return ssl3_RegisterServerHelloExtensionSender(
|
| -+ ss, ex_type, ssl3_ServerSendAppProtoXtn);
|
| -+ }
|
| -+ return SECSuccess;
|
| -+}
|
| -+
|
| -+static SECStatus
|
| -+ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss, PRUint16 ex_type,
|
| -+ SECItem *data)
|
| -+{
|
| - PORT_Assert(!ss->firstHsDone);
|
| -
|
| - if (ssl3_ExtensionNegotiated(ss, ssl_app_layer_protocol_xtn)) {
|
| -@@ -643,37 +728,16 @@ ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss, PRUint16 ex_type,
|
| - return SECFailure;
|
| - }
|
| -
|
| -- rv = ssl3_ValidateNextProtoNego(data->data, data->len);
|
| -- if (rv != SECSuccess)
|
| -- return rv;
|
| --
|
| -- /* ss->nextProtoCallback cannot normally be NULL if we negotiated the
|
| -- * extension. However, It is possible that an application erroneously
|
| -- * cleared the callback between the time we sent the ClientHello and now.
|
| -- */
|
| -- PORT_Assert(ss->nextProtoCallback != NULL);
|
| -+ /* We should only get this call if we sent the extension, so
|
| -+ * ss->nextProtoCallback needs to be non-NULL. However, it is possible
|
| -+ * that an application erroneously cleared the callback between the time
|
| -+ * we sent the ClientHello and now. */
|
| - if (!ss->nextProtoCallback) {
|
| -- /* XXX Use a better error code. This is an application error, not an
|
| -- * NSS bug. */
|
| -- PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
|
| -+ PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_NO_CALLBACK);
|
| - return SECFailure;
|
| - }
|
| -
|
| -- rv = ss->nextProtoCallback(ss->nextProtoArg, ss->fd, data->data, data->len,
|
| -- result.data, &result.len, sizeof resultBuffer);
|
| -- if (rv != SECSuccess)
|
| -- return rv;
|
| -- /* If the callback wrote more than allowed to |result| it has corrupted our
|
| -- * stack. */
|
| -- if (result.len > sizeof resultBuffer) {
|
| -- PORT_SetError(SEC_ERROR_OUTPUT_LEN);
|
| -- return SECFailure;
|
| -- }
|
| --
|
| -- ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
|
| --
|
| -- SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE);
|
| -- return SECITEM_CopyItem(NULL, &ss->ssl3.nextProto, &result);
|
| -+ return ssl3_SelectAppProtocol(ss, ex_type, data);
|
| - }
|
| -
|
| - static SECStatus
|
| -@@ -814,6 +878,47 @@ loser:
|
| - return -1;
|
| - }
|
| -
|
| -+static PRInt32
|
| -+ssl3_ServerSendAppProtoXtn(sslSocket * ss, PRBool append, PRUint32 maxBytes)
|
| -+{
|
| -+ PRInt32 extension_length;
|
| -+
|
| -+ PORT_Assert(ss->opt.enableALPN);
|
| -+ PORT_Assert(ss->ssl3.nextProto.data);
|
| -+ PORT_Assert(ss->ssl3.nextProto.len > 0);
|
| -+ PORT_Assert(ss->ssl3.nextProtoState == SSL_NEXT_PROTO_NEGOTIATED);
|
| -+ PORT_Assert(!ss->firstHsDone);
|
| -+
|
| -+ extension_length = 2 /* extension type */ + 2 /* extension length */ +
|
| -+ 2 /* protocol name list */ + 1 /* name length */ +
|
| -+ ss->ssl3.nextProto.len;
|
| -+
|
| -+ if (append && maxBytes >= extension_length) {
|
| -+ SECStatus rv;
|
| -+ rv = ssl3_AppendHandshakeNumber(ss, ssl_app_layer_protocol_xtn, 2);
|
| -+ if (rv != SECSuccess) {
|
| -+ return -1;
|
| -+ }
|
| -+ rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2);
|
| -+ if (rv != SECSuccess) {
|
| -+ return -1;
|
| -+ }
|
| -+ rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3.nextProto.len + 1, 2);
|
| -+ if (rv != SECSuccess) {
|
| -+ return -1;
|
| -+ }
|
| -+ rv = ssl3_AppendHandshakeVariable(ss, ss->ssl3.nextProto.data,
|
| -+ ss->ssl3.nextProto.len, 1);
|
| -+ if (rv != SECSuccess) {
|
| -+ return -1;
|
| -+ }
|
| -+ } else if (maxBytes < extension_length) {
|
| -+ return 0;
|
| -+ }
|
| -+
|
| -+ return extension_length;
|
| -+}
|
| -+
|
| - static SECStatus
|
| - ssl3_ClientHandleChannelIDXtn(sslSocket *ss, PRUint16 ex_type,
|
| - SECItem *data)
|
| -diff --git a/net/third_party/nss/ssl/ssl3prot.h b/net/third_party/nss/ssl/ssl3prot.h
|
| -index 4c19ade..d32be38 100644
|
| ---- a/net/third_party/nss/ssl/ssl3prot.h
|
| -+++ b/net/third_party/nss/ssl/ssl3prot.h
|
| -@@ -107,7 +107,8 @@ typedef enum {
|
| - certificate_unobtainable = 111,
|
| - unrecognized_name = 112,
|
| - bad_certificate_status_response = 113,
|
| -- bad_certificate_hash_value = 114
|
| -+ bad_certificate_hash_value = 114,
|
| -+ no_application_protocol = 120
|
| -
|
| - } SSL3AlertDescription;
|
| -
|
| -diff --git a/net/third_party/nss/ssl/sslerr.h b/net/third_party/nss/ssl/sslerr.h
|
| -index 82ae7df..5184a6e 100644
|
| ---- a/net/third_party/nss/ssl/sslerr.h
|
| -+++ b/net/third_party/nss/ssl/sslerr.h
|
| -@@ -193,10 +193,14 @@ SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM = (SSL_ERROR_BASE + 126),
|
| - SSL_ERROR_DIGEST_FAILURE = (SSL_ERROR_BASE + 127),
|
| - SSL_ERROR_INCORRECT_SIGNATURE_ALGORITHM = (SSL_ERROR_BASE + 128),
|
| -
|
| --SSL_ERROR_BAD_CHANNEL_ID_DATA = (SSL_ERROR_BASE + 129),
|
| --SSL_ERROR_INVALID_CHANNEL_ID_KEY = (SSL_ERROR_BASE + 130),
|
| --SSL_ERROR_GET_CHANNEL_ID_FAILED = (SSL_ERROR_BASE + 131),
|
| --SSL_ERROR_INAPPROPRIATE_FALLBACK_ALERT = (SSL_ERROR_BASE + 132),
|
| -+SSL_ERROR_NEXT_PROTOCOL_NO_CALLBACK = (SSL_ERROR_BASE + 129),
|
| -+SSL_ERROR_NEXT_PROTOCOL_NO_PROTOCOL = (SSL_ERROR_BASE + 130),
|
| -+
|
| -+SSL_ERROR_INAPPROPRIATE_FALLBACK_ALERT = (SSL_ERROR_BASE + 131),
|
| -+
|
| -+SSL_ERROR_BAD_CHANNEL_ID_DATA = (SSL_ERROR_BASE + 132),
|
| -+SSL_ERROR_INVALID_CHANNEL_ID_KEY = (SSL_ERROR_BASE + 133),
|
| -+SSL_ERROR_GET_CHANNEL_ID_FAILED = (SSL_ERROR_BASE + 134),
|
| -
|
| - SSL_ERROR_END_OF_LIST /* let the c compiler determine the value of this. */
|
| - } SSLErrorCodes;
|
| -diff --git a/net/third_party/nss/ssl/sslsock.c b/net/third_party/nss/ssl/sslsock.c
|
| -index 028cd98..421ba21 100644
|
| ---- a/net/third_party/nss/ssl/sslsock.c
|
| -+++ b/net/third_party/nss/ssl/sslsock.c
|
| -@@ -1432,6 +1432,11 @@ DTLS_ImportFD(PRFileDesc *model, PRFileDesc *fd)
|
| - return ssl_ImportFD(model, fd, ssl_variant_datagram);
|
| - }
|
| -
|
| -+/* SSL_SetNextProtoCallback is used to select an application protocol
|
| -+ * for ALPN and NPN. For ALPN, this runs on the server; for NPN it
|
| -+ * runs on the client. */
|
| -+/* Note: The ALPN version doesn't allow for the use of a default, setting a
|
| -+ * status of SSL_NEXT_PROTO_NO_OVERLAP is treated as a failure. */
|
| - SECStatus
|
| - SSL_SetNextProtoCallback(PRFileDesc *fd, SSLNextProtoCallback callback,
|
| - void *arg)
|
| -@@ -1452,7 +1457,7 @@ SSL_SetNextProtoCallback(PRFileDesc *fd, SSLNextProtoCallback callback,
|
| - return SECSuccess;
|
| - }
|
| -
|
| --/* ssl_NextProtoNegoCallback is set as an NPN callback for the case when
|
| -+/* ssl_NextProtoNegoCallback is set as an ALPN/NPN callback when
|
| - * SSL_SetNextProtoNego is used.
|
| - */
|
| - static SECStatus
|
| -@@ -1471,12 +1476,6 @@ ssl_NextProtoNegoCallback(void *arg, PRFileDesc *fd,
|
| - return SECFailure;
|
| - }
|
| -
|
| -- if (protos_len == 0) {
|
| -- /* The server supports the extension, but doesn't have any protocols
|
| -- * configured. In this case we request our favoured protocol. */
|
| -- goto pick_first;
|
| -- }
|
| --
|
| - /* For each protocol in server preference, see if we support it. */
|
| - for (i = 0; i < protos_len; ) {
|
| - for (j = 0; j < ss->opt.nextProtoNego.len; ) {
|
| -@@ -1493,7 +1492,10 @@ ssl_NextProtoNegoCallback(void *arg, PRFileDesc *fd,
|
| - i += 1 + (unsigned int)protos[i];
|
| - }
|
| -
|
| --pick_first:
|
| -+ /* The other side supports the extension, and either doesn't have any
|
| -+ * protocols configured, or none of its options match ours. In this case we
|
| -+ * request our favoured protocol. */
|
| -+ /* This will be treated as a failure for ALPN. */
|
| - ss->ssl3.nextProtoState = SSL_NEXT_PROTO_NO_OVERLAP;
|
| - result = ss->opt.nextProtoNego.data;
|
| -
|
|
|