| Index: net/socket/ssl_client_socket_nss.cc
|
| diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
|
| index 3651e8d62466696169433993af5f4cd92d62b67b..5e33e125084393a4cc9609c6651e6a799666596c 100644
|
| --- a/net/socket/ssl_client_socket_nss.cc
|
| +++ b/net/socket/ssl_client_socket_nss.cc
|
| @@ -149,6 +149,14 @@ namespace net {
|
| } while (0)
|
| #endif
|
|
|
| +#if !defined(CKM_AES_GCM)
|
| +#define CKM_AES_GCM 0x00001087
|
| +#endif
|
| +
|
| +#if !defined(CKM_NSS_CHACHA20_POLY1305)
|
| +#define CKM_NSS_CHACHA20_POLY1305 (CKM_NSS + 26)
|
| +#endif
|
| +
|
| namespace {
|
|
|
| // SSL plaintext fragments are shorter than 16KB. Although the record layer
|
| @@ -973,8 +981,16 @@ bool SSLClientSocketNSS::Core::Init(PRFileDesc* socket,
|
| SECStatus rv = SECSuccess;
|
|
|
| if (!ssl_config_.next_protos.empty()) {
|
| + // TODO(bnc): Check ssl_config_.disabled_cipher_suites.
|
| + const bool adequate_encryption =
|
| + PK11_TokenExists(CKM_AES_GCM) ||
|
| + PK11_TokenExists(CKM_NSS_CHACHA20_POLY1305);
|
| + const bool adequate_key_agreement = PK11_TokenExists(CKM_DH_PKCS_DERIVE) ||
|
| + PK11_TokenExists(CKM_ECDH1_DERIVE);
|
| std::vector<uint8_t> wire_protos =
|
| - SerializeNextProtos(ssl_config_.next_protos);
|
| + SerializeNextProtos(ssl_config_.next_protos,
|
| + adequate_encryption && adequate_key_agreement &&
|
| + IsTLSVersionAdequateForHTTP2(ssl_config_));
|
| rv = SSL_SetNextProtoNego(
|
| nss_fd_, wire_protos.empty() ? NULL : &wire_protos[0],
|
| wire_protos.size());
|
|
|