| Index: net/third_party/nss/patches/ocspstapling.patch
|
| ===================================================================
|
| --- net/third_party/nss/patches/ocspstapling.patch (revision 196870)
|
| +++ net/third_party/nss/patches/ocspstapling.patch (working copy)
|
| @@ -1,487 +0,0 @@
|
| -diff -pu -r a/net/third_party/nss/ssl/ssl3con.c b/net/third_party/nss/ssl/ssl3con.c
|
| ---- a/net/third_party/nss/ssl/ssl3con.c 2012-11-09 15:21:56.747322689 -0800
|
| -+++ b/net/third_party/nss/ssl/ssl3con.c 2012-11-09 15:28:27.933078020 -0800
|
| -@@ -8365,6 +8365,57 @@ ssl3_CopyPeerCertsToSID(ssl3CertNode *ce
|
| - }
|
| -
|
| - /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
|
| -+ * ssl3 CertificateStatus message.
|
| -+ * Caller must hold Handshake and RecvBuf locks.
|
| -+ * This is always called before ssl3_HandleCertificate, even if the Certificate
|
| -+ * message is sent first.
|
| -+ */
|
| -+static SECStatus
|
| -+ssl3_HandleCertificateStatus(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
|
| -+{
|
| -+ PRInt32 status, len;
|
| -+ int errCode;
|
| -+ SSL3AlertDescription desc;
|
| -+
|
| -+ if (!ss->ssl3.hs.may_get_cert_status ||
|
| -+ ss->ssl3.hs.ws != wait_server_cert ||
|
| -+ !ss->ssl3.hs.pending_cert_msg.data ||
|
| -+ ss->ssl3.hs.cert_status.data) {
|
| -+ errCode = SSL_ERROR_RX_UNEXPECTED_CERT_STATUS;
|
| -+ desc = unexpected_message;
|
| -+ goto alert_loser;
|
| -+ }
|
| -+
|
| -+ /* Consume the CertificateStatusType enum */
|
| -+ status = ssl3_ConsumeHandshakeNumber(ss, 1, &b, &length);
|
| -+ if (status != 1 /* ocsp */) {
|
| -+ goto format_loser;
|
| -+ }
|
| -+
|
| -+ len = ssl3_ConsumeHandshakeNumber(ss, 3, &b, &length);
|
| -+ if (len != length) {
|
| -+ goto format_loser;
|
| -+ }
|
| -+
|
| -+ if (SECITEM_AllocItem(NULL, &ss->ssl3.hs.cert_status, length) == NULL) {
|
| -+ return SECFailure;
|
| -+ }
|
| -+ ss->ssl3.hs.cert_status.type = siBuffer;
|
| -+ PORT_Memcpy(ss->ssl3.hs.cert_status.data, b, length);
|
| -+
|
| -+ return SECSuccess;
|
| -+
|
| -+format_loser:
|
| -+ errCode = SSL_ERROR_BAD_CERT_STATUS_RESPONSE_ALERT;
|
| -+ desc = bad_certificate_status_response;
|
| -+
|
| -+alert_loser:
|
| -+ (void)SSL3_SendAlert(ss, alert_fatal, desc);
|
| -+ (void)ssl_MapLowLevelError(errCode);
|
| -+ return SECFailure;
|
| -+}
|
| -+
|
| -+/* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
|
| - * ssl3 Certificate message.
|
| - * Caller must hold Handshake and RecvBuf locks.
|
| - */
|
| -@@ -9248,6 +9299,26 @@ ssl3_FinishHandshake(sslSocket * ss)
|
| - return SECSuccess;
|
| - }
|
| -
|
| -+/* This function handles any pending Certificate messages. Certificate messages
|
| -+ * can be pending if we expect a possible CertificateStatus message to follow.
|
| -+ *
|
| -+ * This function must be called immediately after handling the
|
| -+ * CertificateStatus message, and before handling any ServerKeyExchange or
|
| -+ * CertificateRequest messages.
|
| -+ */
|
| -+static SECStatus
|
| -+ssl3_MaybeHandlePendingCertificateMessage(sslSocket *ss)
|
| -+{
|
| -+ SECStatus rv = SECSuccess;
|
| -+
|
| -+ if (ss->ssl3.hs.pending_cert_msg.data) {
|
| -+ rv = ssl3_HandleCertificate(ss, ss->ssl3.hs.pending_cert_msg.data,
|
| -+ ss->ssl3.hs.pending_cert_msg.len);
|
| -+ SECITEM_FreeItem(&ss->ssl3.hs.pending_cert_msg, PR_FALSE);
|
| -+ }
|
| -+ return rv;
|
| -+}
|
| -+
|
| - /* Called from ssl3_HandleHandshake() when it has gathered a complete ssl3
|
| - * hanshake message.
|
| - * Caller must hold Handshake and RecvBuf locks.
|
| -@@ -9376,14 +9447,42 @@ ssl3_HandleHandshakeMessage(sslSocket *s
|
| - rv = dtls_HandleHelloVerifyRequest(ss, b, length);
|
| - break;
|
| - case certificate:
|
| -+ if (ss->ssl3.hs.may_get_cert_status) {
|
| -+ /* If we might get a CertificateStatus then we want to postpone the
|
| -+ * processing of the Certificate message until after we have
|
| -+ * processed the CertificateStatus */
|
| -+ if (ss->ssl3.hs.pending_cert_msg.data ||
|
| -+ ss->ssl3.hs.ws != wait_server_cert) {
|
| -+ (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
|
| -+ (void)ssl_MapLowLevelError(SSL_ERROR_RX_UNEXPECTED_CERTIFICATE);
|
| -+ return SECFailure;
|
| -+ }
|
| -+ if (SECITEM_AllocItem(NULL, &ss->ssl3.hs.pending_cert_msg,
|
| -+ length) == NULL) {
|
| -+ return SECFailure;
|
| -+ }
|
| -+ ss->ssl3.hs.pending_cert_msg.type = siBuffer;
|
| -+ PORT_Memcpy(ss->ssl3.hs.pending_cert_msg.data, b, length);
|
| -+ break;
|
| -+ }
|
| - rv = ssl3_HandleCertificate(ss, b, length);
|
| - break;
|
| -+ case certificate_status:
|
| -+ rv = ssl3_HandleCertificateStatus(ss, b, length);
|
| -+ if (rv != SECSuccess)
|
| -+ break;
|
| -+ PORT_Assert(ss->ssl3.hs.pending_cert_msg.data);
|
| -+ rv = ssl3_MaybeHandlePendingCertificateMessage(ss);
|
| -+ break;
|
| - case server_key_exchange:
|
| - if (ss->sec.isServer) {
|
| - (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
|
| - PORT_SetError(SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH);
|
| - return SECFailure;
|
| - }
|
| -+ rv = ssl3_MaybeHandlePendingCertificateMessage(ss);
|
| -+ if (rv != SECSuccess)
|
| -+ break;
|
| - rv = ssl3_HandleServerKeyExchange(ss, b, length);
|
| - break;
|
| - case certificate_request:
|
| -@@ -9392,6 +9491,9 @@ ssl3_HandleHandshakeMessage(sslSocket *s
|
| - PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST);
|
| - return SECFailure;
|
| - }
|
| -+ rv = ssl3_MaybeHandlePendingCertificateMessage(ss);
|
| -+ if (rv != SECSuccess)
|
| -+ break;
|
| - rv = ssl3_HandleCertificateRequest(ss, b, length);
|
| - break;
|
| - case server_hello_done:
|
| -@@ -9405,6 +9507,9 @@ ssl3_HandleHandshakeMessage(sslSocket *s
|
| - PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_DONE);
|
| - return SECFailure;
|
| - }
|
| -+ rv = ssl3_MaybeHandlePendingCertificateMessage(ss);
|
| -+ if (rv != SECSuccess)
|
| -+ break;
|
| - rv = ssl3_HandleServerHelloDone(ss);
|
| - break;
|
| - case certificate_verify:
|
| -@@ -10369,6 +10474,12 @@ ssl3_DestroySSL3Info(sslSocket *ss)
|
| - ss->ssl3.hs.messages.len = 0;
|
| - ss->ssl3.hs.messages.space = 0;
|
| - }
|
| -+ if (ss->ssl3.hs.pending_cert_msg.data) {
|
| -+ SECITEM_FreeItem(&ss->ssl3.hs.pending_cert_msg, PR_FALSE);
|
| -+ }
|
| -+ if (ss->ssl3.hs.cert_status.data) {
|
| -+ SECITEM_FreeItem(&ss->ssl3.hs.cert_status, PR_FALSE);
|
| -+ }
|
| -
|
| - /* free the SSL3Buffer (msg_body) */
|
| - PORT_Free(ss->ssl3.hs.msg_body.buf);
|
| -diff -pu -r a/net/third_party/nss/ssl/ssl3ext.c b/net/third_party/nss/ssl/ssl3ext.c
|
| ---- a/net/third_party/nss/ssl/ssl3ext.c 2012-09-20 17:28:05.000000000 -0700
|
| -+++ b/net/third_party/nss/ssl/ssl3ext.c 2012-11-09 15:32:11.606363256 -0800
|
| -@@ -234,6 +234,7 @@ static const ssl3HelloExtensionHandler s
|
| - { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn },
|
| - { ssl_next_proto_nego_xtn, &ssl3_ClientHandleNextProtoNegoXtn },
|
| - { ssl_use_srtp_xtn, &ssl3_HandleUseSRTPXtn },
|
| -+ { ssl_cert_status_xtn, &ssl3_ClientHandleStatusRequestXtn },
|
| - { -1, NULL }
|
| - };
|
| -
|
| -@@ -258,7 +259,8 @@ ssl3HelloExtensionSender clientHelloSend
|
| - #endif
|
| - { ssl_session_ticket_xtn, &ssl3_SendSessionTicketXtn },
|
| - { ssl_next_proto_nego_xtn, &ssl3_ClientSendNextProtoNegoXtn },
|
| -- { ssl_use_srtp_xtn, &ssl3_SendUseSRTPXtn }
|
| -+ { ssl_use_srtp_xtn, &ssl3_SendUseSRTPXtn },
|
| -+ { ssl_cert_status_xtn, &ssl3_ClientSendStatusRequestXtn }
|
| - /* any extra entries will appear as { 0, NULL } */
|
| - };
|
| -
|
| -@@ -640,6 +642,80 @@ loser:
|
| - return -1;
|
| - }
|
| -
|
| -+SECStatus
|
| -+ssl3_ClientHandleStatusRequestXtn(sslSocket *ss, PRUint16 ex_type,
|
| -+ SECItem *data)
|
| -+{
|
| -+ /* If we didn't request this extension, then the server may not echo it. */
|
| -+ if (!ss->opt.enableOCSPStapling)
|
| -+ return SECFailure;
|
| -+
|
| -+ /* The echoed extension must be empty. */
|
| -+ if (data->len != 0)
|
| -+ return SECFailure;
|
| -+
|
| -+ ss->ssl3.hs.may_get_cert_status = PR_TRUE;
|
| -+
|
| -+ /* Keep track of negotiated extensions. */
|
| -+ ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type;
|
| -+
|
| -+ return SECSuccess;
|
| -+}
|
| -+
|
| -+/* ssl3_ClientSendStatusRequestXtn builds the status_request extension on the
|
| -+ * client side. See RFC 4366 section 3.6. */
|
| -+PRInt32
|
| -+ssl3_ClientSendStatusRequestXtn(sslSocket * ss, PRBool append,
|
| -+ PRUint32 maxBytes)
|
| -+{
|
| -+ PRInt32 extension_length;
|
| -+
|
| -+ if (!ss->opt.enableOCSPStapling)
|
| -+ return 0;
|
| -+
|
| -+ /* extension_type (2-bytes) +
|
| -+ * length(extension_data) (2-bytes) +
|
| -+ * status_type (1) +
|
| -+ * responder_id_list length (2) +
|
| -+ * request_extensions length (2)
|
| -+ */
|
| -+ extension_length = 9;
|
| -+
|
| -+ if (append && maxBytes >= extension_length) {
|
| -+ SECStatus rv;
|
| -+ TLSExtensionData *xtnData;
|
| -+
|
| -+ /* extension_type */
|
| -+ rv = ssl3_AppendHandshakeNumber(ss, ssl_cert_status_xtn, 2);
|
| -+ if (rv != SECSuccess)
|
| -+ return -1;
|
| -+ rv = ssl3_AppendHandshakeNumber(ss, extension_length - 4, 2);
|
| -+ if (rv != SECSuccess)
|
| -+ return -1;
|
| -+ rv = ssl3_AppendHandshakeNumber(ss, 1 /* status_type ocsp */, 1);
|
| -+ if (rv != SECSuccess)
|
| -+ return -1;
|
| -+ /* A zero length responder_id_list means that the responders are
|
| -+ * implicitly known to the server. */
|
| -+ rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
|
| -+ if (rv != SECSuccess)
|
| -+ return -1;
|
| -+ /* A zero length request_extensions means that there are no extensions.
|
| -+ * Specifically, we don't set the id-pkix-ocsp-nonce extension. This
|
| -+ * means that the server can replay a cached OCSP response to us. */
|
| -+ rv = ssl3_AppendHandshakeNumber(ss, 0, 2);
|
| -+ if (rv != SECSuccess)
|
| -+ return -1;
|
| -+
|
| -+ xtnData = &ss->xtnData;
|
| -+ xtnData->advertised[xtnData->numAdvertised++] = ssl_cert_status_xtn;
|
| -+ } else if (maxBytes < extension_length) {
|
| -+ PORT_Assert(0);
|
| -+ return 0;
|
| -+ }
|
| -+ return extension_length;
|
| -+}
|
| -+
|
| - /*
|
| - * NewSessionTicket
|
| - * Called from ssl3_HandleFinished
|
| -diff -pu -r a/net/third_party/nss/ssl/ssl3prot.h b/net/third_party/nss/ssl/ssl3prot.h
|
| ---- a/net/third_party/nss/ssl/ssl3prot.h 2012-04-25 07:50:12.000000000 -0700
|
| -+++ b/net/third_party/nss/ssl/ssl3prot.h 2012-11-09 15:28:27.933078020 -0800
|
| -@@ -129,6 +129,7 @@ typedef enum {
|
| - certificate_verify = 15,
|
| - client_key_exchange = 16,
|
| - finished = 20,
|
| -+ certificate_status = 22,
|
| - next_proto = 67
|
| - } SSL3HandshakeType;
|
| -
|
| -diff -pu -r a/net/third_party/nss/ssl/sslerr.h b/net/third_party/nss/ssl/sslerr.h
|
| ---- a/net/third_party/nss/ssl/sslerr.h 2012-07-12 17:51:57.000000000 -0700
|
| -+++ b/net/third_party/nss/ssl/sslerr.h 2012-11-09 15:30:36.804971319 -0800
|
| -@@ -188,6 +188,8 @@ SSL_ERROR_RX_UNEXPECTED_HELLO_VERIFY_REQ
|
| -
|
| - SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_VERSION = (SSL_ERROR_BASE + 124),
|
| -
|
| -+SSL_ERROR_RX_UNEXPECTED_CERT_STATUS = (SSL_ERROR_BASE + 125),
|
| -+
|
| - SSL_ERROR_END_OF_LIST /* let the c compiler determine the value of this. */
|
| - } SSLErrorCodes;
|
| - #endif /* NO_SECURITY_ERROR_ENUM */
|
| -diff -pu -r a/net/third_party/nss/ssl/SSLerrs.h b/net/third_party/nss/ssl/SSLerrs.h
|
| ---- a/net/third_party/nss/ssl/SSLerrs.h 2012-07-12 17:51:57.000000000 -0700
|
| -+++ b/net/third_party/nss/ssl/SSLerrs.h 2012-11-09 15:30:19.924723400 -0800
|
| -@@ -400,3 +400,6 @@ ER3(SSL_ERROR_RX_UNEXPECTED_HELLO_VERIFY
|
| -
|
| - ER3(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_VERSION, (SSL_ERROR_BASE + 124),
|
| - "SSL feature not supported for the protocol version.")
|
| -+
|
| -+ER3(SSL_ERROR_RX_UNEXPECTED_CERT_STATUS, (SSL_ERROR_BASE + 125),
|
| -+"SSL received an unexpected Certificate Status handshake message.")
|
| -diff -pu -r a/net/third_party/nss/ssl/ssl.h b/net/third_party/nss/ssl/ssl.h
|
| ---- a/net/third_party/nss/ssl/ssl.h 2012-11-09 15:27:15.952019947 -0800
|
| -+++ b/net/third_party/nss/ssl/ssl.h 2012-11-09 15:28:27.933078020 -0800
|
| -@@ -158,6 +158,7 @@ SSL_IMPORT PRFileDesc *DTLS_ImportFD(PRF
|
| - * accept fragmented alerts).
|
| - */
|
| - #define SSL_CBC_RANDOM_IV 23
|
| -+#define SSL_ENABLE_OCSP_STAPLING 24 /* Request OCSP stapling (client) */
|
| -
|
| - #ifdef SSL_DEPRECATED_FUNCTION
|
| - /* Old deprecated function names */
|
| -@@ -409,6 +410,23 @@ SSL_IMPORT SECStatus SSL_PeerCertificate
|
| - PRFileDesc *fd, CERTCertificate **certs,
|
| - unsigned int *numCerts, unsigned int maxNumCerts);
|
| -
|
| -+/* SSL_GetStapledOCSPResponse returns the OCSP response that was provided by
|
| -+ * the TLS server. The resulting data is copied to |out_data|. On entry, |*len|
|
| -+ * must contain the size of |out_data|. On exit, |*len| will contain the size
|
| -+ * of the OCSP stapled response. If the stapled response is too large to fit in
|
| -+ * |out_data| then it will be truncated. If no OCSP response was given by the
|
| -+ * server then it has zero length.
|
| -+ *
|
| -+ * You must set the SSL_ENABLE_OCSP_STAPLING option in order for OCSP responses
|
| -+ * to be provided by a server.
|
| -+ *
|
| -+ * You can call this function during the certificate verification callback or
|
| -+ * any time afterwards.
|
| -+ */
|
| -+SSL_IMPORT SECStatus SSL_GetStapledOCSPResponse(PRFileDesc *fd,
|
| -+ unsigned char *out_data,
|
| -+ unsigned int *len);
|
| -+
|
| - /*
|
| - ** Authenticate certificate hook. Called when a certificate comes in
|
| - ** (because of SSL_REQUIRE_CERTIFICATE in SSL_Enable) to authenticate the
|
| -diff -pu -r a/net/third_party/nss/ssl/sslimpl.h b/net/third_party/nss/ssl/sslimpl.h
|
| ---- a/net/third_party/nss/ssl/sslimpl.h 2012-11-09 15:21:56.747322689 -0800
|
| -+++ b/net/third_party/nss/ssl/sslimpl.h 2012-11-09 15:28:27.943078167 -0800
|
| -@@ -316,6 +316,7 @@ typedef struct sslOptionsStr {
|
| - unsigned int requireSafeNegotiation : 1; /* 22 */
|
| - unsigned int enableFalseStart : 1; /* 23 */
|
| - unsigned int cbcRandomIV : 1; /* 24 */
|
| -+ unsigned int enableOCSPStapling : 1; /* 25 */
|
| - } sslOptions;
|
| -
|
| - typedef enum { sslHandshakingUndetermined = 0,
|
| -@@ -795,6 +796,14 @@ const ssl3CipherSuiteDef *suite_def;
|
| - PRBool isResuming; /* are we resuming a session */
|
| - PRBool usedStepDownKey; /* we did a server key exchange. */
|
| - PRBool sendingSCSV; /* instead of empty RI */
|
| -+ PRBool may_get_cert_status; /* the server echoed a
|
| -+ * status_request extension so
|
| -+ * may send a CertificateStatus
|
| -+ * handshake message. */
|
| -+ SECItem pending_cert_msg; /* a Certificate message which we
|
| -+ * save temporarily if we may get
|
| -+ * a CertificateStatus message */
|
| -+ SECItem cert_status; /* an OCSP response */
|
| - sslBuffer msgState; /* current state for handshake messages*/
|
| - /* protected by recvBufLock */
|
| - sslBuffer messages; /* Accumulated handshake messages */
|
| -@@ -1625,6 +1634,8 @@ extern SECStatus ssl3_HandleSupportedPoi
|
| - PRUint16 ex_type, SECItem *data);
|
| - extern SECStatus ssl3_ClientHandleSessionTicketXtn(sslSocket *ss,
|
| - PRUint16 ex_type, SECItem *data);
|
| -+extern SECStatus ssl3_ClientHandleStatusRequestXtn(sslSocket *ss,
|
| -+ PRUint16 ex_type, SECItem *data);
|
| - extern SECStatus ssl3_ServerHandleSessionTicketXtn(sslSocket *ss,
|
| - PRUint16 ex_type, SECItem *data);
|
| -
|
| -@@ -1634,6 +1645,8 @@ extern SECStatus ssl3_ServerHandleSessio
|
| - */
|
| - extern PRInt32 ssl3_SendSessionTicketXtn(sslSocket *ss, PRBool append,
|
| - PRUint32 maxBytes);
|
| -+extern PRInt32 ssl3_ClientSendStatusRequestXtn(sslSocket *ss, PRBool append,
|
| -+ PRUint32 maxBytes);
|
| -
|
| - /* ClientHello and ServerHello extension senders.
|
| - * The code is in ssl3ext.c.
|
| -diff -pu -r a/net/third_party/nss/ssl/sslsock.c b/net/third_party/nss/ssl/sslsock.c
|
| ---- a/net/third_party/nss/ssl/sslsock.c 2012-11-09 15:17:00.432983977 -0800
|
| -+++ b/net/third_party/nss/ssl/sslsock.c 2012-11-09 15:28:27.943078167 -0800
|
| -@@ -153,7 +153,8 @@ static sslOptions ssl_defaults = {
|
| - 2, /* enableRenegotiation (default: requires extension) */
|
| - PR_FALSE, /* requireSafeNegotiation */
|
| - PR_FALSE, /* enableFalseStart */
|
| -- PR_TRUE /* cbcRandomIV */
|
| -+ PR_TRUE, /* cbcRandomIV */
|
| -+ PR_FALSE, /* enableOCSPStapling */
|
| - };
|
| -
|
| - /*
|
| -@@ -827,6 +828,10 @@ SSL_OptionSet(PRFileDesc *fd, PRInt32 wh
|
| - ss->opt.cbcRandomIV = on;
|
| - break;
|
| -
|
| -+ case SSL_ENABLE_OCSP_STAPLING:
|
| -+ ss->opt.enableOCSPStapling = on;
|
| -+ break;
|
| -+
|
| - default:
|
| - PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| - rv = SECFailure;
|
| -@@ -896,6 +901,7 @@ SSL_OptionGet(PRFileDesc *fd, PRInt32 wh
|
| - on = ss->opt.requireSafeNegotiation; break;
|
| - case SSL_ENABLE_FALSE_START: on = ss->opt.enableFalseStart; break;
|
| - case SSL_CBC_RANDOM_IV: on = ss->opt.cbcRandomIV; break;
|
| -+ case SSL_ENABLE_OCSP_STAPLING: on = ss->opt.enableOCSPStapling; break;
|
| -
|
| - default:
|
| - PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| -@@ -954,6 +960,9 @@ SSL_OptionGetDefault(PRInt32 which, PRBo
|
| - break;
|
| - case SSL_ENABLE_FALSE_START: on = ssl_defaults.enableFalseStart; break;
|
| - case SSL_CBC_RANDOM_IV: on = ssl_defaults.cbcRandomIV; break;
|
| -+ case SSL_ENABLE_OCSP_STAPLING:
|
| -+ on = ssl_defaults.enableOCSPStapling;
|
| -+ break;
|
| -
|
| - default:
|
| - PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| -@@ -1117,6 +1126,10 @@ SSL_OptionSetDefault(PRInt32 which, PRBo
|
| - ssl_defaults.cbcRandomIV = on;
|
| - break;
|
| -
|
| -+ case SSL_ENABLE_OCSP_STAPLING:
|
| -+ ssl_defaults.enableOCSPStapling = on;
|
| -+ break;
|
| -+
|
| - default:
|
| - PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| - return SECFailure;
|
| -@@ -1859,6 +1872,36 @@ SSL_VersionRangeSet(PRFileDesc *fd, cons
|
| - return SECSuccess;
|
| - }
|
| -
|
| -+SECStatus
|
| -+SSL_GetStapledOCSPResponse(PRFileDesc *fd, unsigned char *out_data,
|
| -+ unsigned int *len) {
|
| -+ sslSocket *ss = ssl_FindSocket(fd);
|
| -+
|
| -+ if (!ss) {
|
| -+ SSL_DBG(("%d: SSL[%d]: bad socket in SSL_GetStapledOCSPResponse",
|
| -+ SSL_GETPID(), fd));
|
| -+ return SECFailure;
|
| -+ }
|
| -+
|
| -+ ssl_Get1stHandshakeLock(ss);
|
| -+ ssl_GetSSL3HandshakeLock(ss);
|
| -+
|
| -+ if (ss->ssl3.hs.cert_status.data) {
|
| -+ unsigned int todo = ss->ssl3.hs.cert_status.len;
|
| -+ if (todo > *len)
|
| -+ todo = *len;
|
| -+ *len = ss->ssl3.hs.cert_status.len;
|
| -+ PORT_Memcpy(out_data, ss->ssl3.hs.cert_status.data, todo);
|
| -+ } else {
|
| -+ *len = 0;
|
| -+ }
|
| -+
|
| -+ ssl_ReleaseSSL3HandshakeLock(ss);
|
| -+ ssl_Release1stHandshakeLock(ss);
|
| -+
|
| -+ return SECSuccess;
|
| -+}
|
| -+
|
| - /************************************************************************/
|
| - /* The following functions are the TOP LEVEL SSL functions.
|
| - ** They all get called through the NSPRIOMethods table below.
|
| -diff -pu -r a/net/third_party/nss/ssl/sslt.h b/net/third_party/nss/ssl/sslt.h
|
| ---- a/net/third_party/nss/ssl/sslt.h 2012-06-06 19:06:19.000000000 -0700
|
| -+++ b/net/third_party/nss/ssl/sslt.h 2012-11-09 15:29:10.333701086 -0800
|
| -@@ -175,6 +175,7 @@ typedef enum {
|
| - /* Update SSL_MAX_EXTENSIONS whenever a new extension type is added. */
|
| - typedef enum {
|
| - ssl_server_name_xtn = 0,
|
| -+ ssl_cert_status_xtn = 5,
|
| - #ifdef NSS_ENABLE_ECC
|
| - ssl_elliptic_curves_xtn = 10,
|
| - ssl_ec_point_formats_xtn = 11,
|
| -@@ -185,6 +186,6 @@ typedef enum {
|
| - ssl_renegotiation_info_xtn = 0xff01 /* experimental number */
|
| - } SSLExtensionType;
|
| -
|
| --#define SSL_MAX_EXTENSIONS 7
|
| -+#define SSL_MAX_EXTENSIONS 8
|
| -
|
| - #endif /* __sslt_h_ */
|
|
|