| Index: webrtc/base/openssladapter.cc
|
| diff --git a/webrtc/base/openssladapter.cc b/webrtc/base/openssladapter.cc
|
| index d3681861860b5591c5fb85e39b47278bfb0c64b7..135a32538a66a393724200591fcd9cfd2a1a59e5 100644
|
| --- a/webrtc/base/openssladapter.cc
|
| +++ b/webrtc/base/openssladapter.cc
|
| @@ -704,9 +704,6 @@ OpenSSLAdapter::OnCloseEvent(AsyncSocket* socket, int err) {
|
| AsyncSocketAdapter::OnCloseEvent(socket, err);
|
| }
|
|
|
| -// This code is taken from the "Network Security with OpenSSL"
|
| -// sample in chapter 5
|
| -
|
| bool OpenSSLAdapter::VerifyServerName(SSL* ssl, const char* host,
|
| bool ignore_bad_cert) {
|
| if (!host)
|
| @@ -739,59 +736,25 @@ bool OpenSSLAdapter::VerifyServerName(SSL* ssl, const char* host,
|
| #endif
|
|
|
| bool ok = false;
|
| - int extension_count = X509_get_ext_count(certificate);
|
| - for (int i = 0; i < extension_count; ++i) {
|
| - X509_EXTENSION* extension = X509_get_ext(certificate, i);
|
| - int extension_nid = OBJ_obj2nid(X509_EXTENSION_get_object(extension));
|
| -
|
| - if (extension_nid == NID_subject_alt_name) {
|
| - const X509V3_EXT_METHOD* meth = X509V3_EXT_get(extension);
|
| - if (!meth)
|
| + GENERAL_NAMES* names = reinterpret_cast<GENERAL_NAMES*>(
|
| + X509_get_ext_d2i(certificate, NID_subject_alt_name, nullptr, nullptr));
|
| + if (names) {
|
| + for (size_t i = 0; i < sk_GENERAL_NAME_num(names); i++) {
|
| + const GENERAL_NAME* name = sk_GENERAL_NAME_value(names, i);
|
| + if (name->type != GEN_DNS)
|
| + continue;
|
| + std::string value(
|
| + reinterpret_cast<const char*>(ASN1_STRING_data(name->d.dNSName)),
|
| + ASN1_STRING_length(name->d.dNSName));
|
| + // string_match takes NUL-terminated strings, so check for embedded NULs.
|
| + if (value.find('\0') != std::string::npos)
|
| + continue;
|
| + if (string_match(host, value.c_str())) {
|
| + ok = true;
|
| break;
|
| -
|
| - void* ext_str = NULL;
|
| -
|
| - // We assign this to a local variable, instead of passing the address
|
| - // directly to ASN1_item_d2i.
|
| - // See http://readlist.com/lists/openssl.org/openssl-users/0/4761.html.
|
| - unsigned char* ext_value_data = extension->value->data;
|
| -
|
| - const unsigned char **ext_value_data_ptr =
|
| - (const_cast<const unsigned char **>(&ext_value_data));
|
| -
|
| - if (meth->it) {
|
| - ext_str = ASN1_item_d2i(NULL, ext_value_data_ptr,
|
| - extension->value->length,
|
| - ASN1_ITEM_ptr(meth->it));
|
| - } else {
|
| - ext_str = meth->d2i(NULL, ext_value_data_ptr, extension->value->length);
|
| - }
|
| -
|
| - STACK_OF(CONF_VALUE)* value = meth->i2v(meth, ext_str, NULL);
|
| -
|
| - // Cast to size_t to be compilable for both OpenSSL and BoringSSL.
|
| - for (size_t j = 0; j < static_cast<size_t>(sk_CONF_VALUE_num(value));
|
| - ++j) {
|
| - CONF_VALUE* nval = sk_CONF_VALUE_value(value, j);
|
| - // The value for nval can contain wildcards
|
| - if (!strcmp(nval->name, "DNS") && string_match(host, nval->value)) {
|
| - ok = true;
|
| - break;
|
| - }
|
| - }
|
| - sk_CONF_VALUE_pop_free(value, X509V3_conf_free);
|
| - value = NULL;
|
| -
|
| - if (meth->it) {
|
| - ASN1_item_free(reinterpret_cast<ASN1_VALUE*>(ext_str),
|
| - ASN1_ITEM_ptr(meth->it));
|
| - } else {
|
| - meth->ext_free(ext_str);
|
| }
|
| - ext_str = NULL;
|
| }
|
| - if (ok)
|
| - break;
|
| + GENERAL_NAMES_free(names);
|
| }
|
|
|
| char data[256];
|
|
|