Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(168)

Side by Side Diff: webrtc/rtc_base/openssladapter.cc

Issue 2993403002: Support a user-provided string for the TLS ALPN extension.
Patch Set: Fix previous commit Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/rtc_base/openssladapter.h ('k') | webrtc/rtc_base/openssladapter_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2008 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2008 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 : SSLAdapter(socket), 279 : SSLAdapter(socket),
280 factory_(factory), 280 factory_(factory),
281 state_(SSL_NONE), 281 state_(SSL_NONE),
282 role_(SSL_CLIENT), 282 role_(SSL_CLIENT),
283 ssl_read_needs_write_(false), 283 ssl_read_needs_write_(false),
284 ssl_write_needs_read_(false), 284 ssl_write_needs_read_(false),
285 restartable_(false), 285 restartable_(false),
286 ssl_(nullptr), 286 ssl_(nullptr),
287 ssl_ctx_(nullptr), 287 ssl_ctx_(nullptr),
288 ssl_mode_(SSL_MODE_TLS), 288 ssl_mode_(SSL_MODE_TLS),
289 ignore_bad_cert_(false),
289 custom_verification_succeeded_(false) { 290 custom_verification_succeeded_(false) {
290 // If a factory is used, take a reference on the factory's SSL_CTX. 291 // If a factory is used, take a reference on the factory's SSL_CTX.
291 // Otherwise, we'll create our own later. 292 // Otherwise, we'll create our own later.
292 // Either way, we'll release our reference via SSL_CTX_free() in Cleanup(). 293 // Either way, we'll release our reference via SSL_CTX_free() in Cleanup().
293 if (factory_) { 294 if (factory_) {
294 ssl_ctx_ = factory_->ssl_ctx(); 295 ssl_ctx_ = factory_->ssl_ctx();
295 RTC_DCHECK(ssl_ctx_); 296 RTC_DCHECK(ssl_ctx_);
296 // Note: if using OpenSSL, requires version 1.1.0 or later. 297 // Note: if using OpenSSL, requires version 1.1.0 or later.
297 SSL_CTX_up_ref(ssl_ctx_); 298 SSL_CTX_up_ref(ssl_ctx_);
298 } 299 }
299 } 300 }
300 301
301 OpenSSLAdapter::~OpenSSLAdapter() { 302 OpenSSLAdapter::~OpenSSLAdapter() {
302 Cleanup(); 303 Cleanup();
303 } 304 }
304 305
305 void OpenSSLAdapter::SetMode(SSLMode mode) { 306 void OpenSSLAdapter::SetIgnoreBadCert(bool ignore) {
307 ignore_bad_cert_ = ignore;
308 }
309
310 void OpenSSLAdapter::SetAlpnProtocols(const std::vector<std::string>& protos) {
311 alpn_protocols_ = protos;
312 }
313
314 void
315 OpenSSLAdapter::SetMode(SSLMode mode) {
306 RTC_DCHECK(!ssl_ctx_); 316 RTC_DCHECK(!ssl_ctx_);
307 RTC_DCHECK(state_ == SSL_NONE); 317 RTC_DCHECK(state_ == SSL_NONE);
308 ssl_mode_ = mode; 318 ssl_mode_ = mode;
309 } 319 }
310 320
311 void OpenSSLAdapter::SetIdentity(SSLIdentity* identity) { 321 void OpenSSLAdapter::SetIdentity(SSLIdentity* identity) {
312 RTC_DCHECK(!identity_); 322 RTC_DCHECK(!identity_);
313 identity_.reset(static_cast<OpenSSLIdentity*>(identity)); 323 identity_.reset(static_cast<OpenSSLIdentity*>(identity));
314 } 324 }
315 325
316 void OpenSSLAdapter::SetRole(SSLRole role) { 326 void OpenSSLAdapter::SetRole(SSLRole role) {
317 role_ = role; 327 role_ = role;
318 } 328 }
319 329
320 AsyncSocket* OpenSSLAdapter::Accept(SocketAddress* paddr) { 330 AsyncSocket* OpenSSLAdapter::Accept(SocketAddress* paddr) {
321 RTC_DCHECK(role_ == SSL_SERVER); 331 RTC_DCHECK(role_ == SSL_SERVER);
322 AsyncSocket* socket = SSLAdapter::Accept(paddr); 332 AsyncSocket* socket = SSLAdapter::Accept(paddr);
323 if (!socket) { 333 if (!socket) {
324 return nullptr; 334 return nullptr;
325 } 335 }
326 336
327 SSLAdapter* adapter = SSLAdapter::Create(socket); 337 SSLAdapter* adapter = SSLAdapter::Create(socket);
328 adapter->SetIdentity(identity_->GetReference()); 338 adapter->SetIdentity(identity_->GetReference());
329 adapter->SetRole(rtc::SSL_SERVER); 339 adapter->SetRole(rtc::SSL_SERVER);
330 adapter->set_ignore_bad_cert(ignore_bad_cert()); 340 adapter->SetIgnoreBadCert(ignore_bad_cert_);
331 adapter->StartSSL("", false); 341 adapter->StartSSL("", false);
332 return adapter; 342 return adapter;
333 } 343 }
334 344
335 int OpenSSLAdapter::StartSSL(const char* hostname, bool restartable) { 345 int OpenSSLAdapter::StartSSL(const char* hostname, bool restartable) {
336 if (state_ != SSL_NONE) 346 if (state_ != SSL_NONE)
337 return -1; 347 return -1;
338 348
339 ssl_host_name_ = hostname; 349 ssl_host_name_ = hostname;
340 restartable_ = restartable; 350 restartable_ = restartable;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 goto ssl_error; 427 goto ssl_error;
418 } 428 }
419 429
420 LOG(LS_INFO) << "Attempting to resume SSL session to " 430 LOG(LS_INFO) << "Attempting to resume SSL session to "
421 << ssl_host_name_; 431 << ssl_host_name_;
422 } 432 }
423 } 433 }
424 } 434 }
425 435
426 // Set a couple common TLS extensions; even though we don't use them yet. 436 // Set a couple common TLS extensions; even though we don't use them yet.
427 // TODO(emadomara) Add ALPN extension.
428 SSL_enable_ocsp_stapling(ssl_); 437 SSL_enable_ocsp_stapling(ssl_);
429 SSL_enable_signed_cert_timestamps(ssl_); 438 SSL_enable_signed_cert_timestamps(ssl_);
430 439
440 if (!alpn_protocols_.empty()) {
441 std::string tls_alpn_string = TransformAlpnProtocols(alpn_protocols_);
442 if (!tls_alpn_string.empty()) {
443 SSL_set_alpn_protos(ssl_,
444 reinterpret_cast<const unsigned char *>(tls_alpn_string.data()),
445 tls_alpn_string.size());
446 }
447 }
448
431 // Now that the initial config is done, transfer ownership of |bio| to the 449 // Now that the initial config is done, transfer ownership of |bio| to the
432 // SSL object. If ContinueSSL() fails, the bio will be freed in Cleanup(). 450 // SSL object. If ContinueSSL() fails, the bio will be freed in Cleanup().
433 SSL_set_bio(ssl_, bio, bio); 451 SSL_set_bio(ssl_, bio, bio);
434 bio = nullptr; 452 bio = nullptr;
435 453
436 // Do the connect. 454 // Do the connect.
437 err = ContinueSSL(); 455 err = ContinueSSL();
438 if (err != 0) 456 if (err != 0)
439 goto ssl_error; 457 goto ssl_error;
440 458
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 if (!ok && ignore_bad_cert) { 938 if (!ok && ignore_bad_cert) {
921 LOG(LS_WARNING) << "TLS certificate check FAILED. " 939 LOG(LS_WARNING) << "TLS certificate check FAILED. "
922 << "Allowing connection anyway."; 940 << "Allowing connection anyway.";
923 ok = true; 941 ok = true;
924 } 942 }
925 943
926 return ok; 944 return ok;
927 } 945 }
928 946
929 bool OpenSSLAdapter::SSLPostConnectionCheck(SSL* ssl, const char* host) { 947 bool OpenSSLAdapter::SSLPostConnectionCheck(SSL* ssl, const char* host) {
930 bool ok = VerifyServerName(ssl, host, ignore_bad_cert()); 948 bool ok = VerifyServerName(ssl, host, ignore_bad_cert_);
931 949
932 if (ok) { 950 if (ok) {
933 ok = (SSL_get_verify_result(ssl) == X509_V_OK || 951 ok = (SSL_get_verify_result(ssl) == X509_V_OK ||
934 custom_verification_succeeded_); 952 custom_verification_succeeded_);
935 } 953 }
936 954
937 if (!ok && ignore_bad_cert()) { 955 if (!ok && ignore_bad_cert_) {
938 LOG(LS_INFO) << "Other TLS post connection checks failed."; 956 LOG(LS_INFO) << "Other TLS post connection checks failed.";
939 ok = true; 957 ok = true;
940 } 958 }
941 959
942 return ok; 960 return ok;
943 } 961 }
944 962
945 #if !defined(NDEBUG) 963 #if !defined(NDEBUG)
946 964
947 // We only use this for tracing and so it is only needed in debug mode 965 // We only use this for tracing and so it is only needed in debug mode
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1002 void* cert = 1020 void* cert =
1003 reinterpret_cast<void*>(X509_STORE_CTX_get_current_cert(store)); 1021 reinterpret_cast<void*>(X509_STORE_CTX_get_current_cert(store));
1004 if (custom_verify_callback_(cert)) { 1022 if (custom_verify_callback_(cert)) {
1005 stream->custom_verification_succeeded_ = true; 1023 stream->custom_verification_succeeded_ = true;
1006 LOG(LS_INFO) << "validated certificate using custom callback"; 1024 LOG(LS_INFO) << "validated certificate using custom callback";
1007 ok = true; 1025 ok = true;
1008 } 1026 }
1009 } 1027 }
1010 1028
1011 // Should only be used for debugging and development. 1029 // Should only be used for debugging and development.
1012 if (!ok && stream->ignore_bad_cert()) { 1030 if (!ok && stream->ignore_bad_cert_) {
1013 LOG(LS_WARNING) << "Ignoring cert error while verifying cert chain"; 1031 LOG(LS_WARNING) << "Ignoring cert error while verifying cert chain";
1014 ok = 1; 1032 ok = 1;
1015 } 1033 }
1016 1034
1017 return ok; 1035 return ok;
1018 } 1036 }
1019 1037
1020 int OpenSSLAdapter::NewSSLSessionCallback(SSL* ssl, SSL_SESSION* session) { 1038 int OpenSSLAdapter::NewSSLSessionCallback(SSL* ssl, SSL_SESSION* session) {
1021 OpenSSLAdapter* stream = 1039 OpenSSLAdapter* stream =
1022 reinterpret_cast<OpenSSLAdapter*>(SSL_get_app_data(ssl)); 1040 reinterpret_cast<OpenSSLAdapter*>(SSL_get_app_data(ssl));
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 } 1107 }
1090 1108
1091 if (enable_cache) { 1109 if (enable_cache) {
1092 SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_CLIENT); 1110 SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_CLIENT);
1093 SSL_CTX_sess_set_new_cb(ctx, &OpenSSLAdapter::NewSSLSessionCallback); 1111 SSL_CTX_sess_set_new_cb(ctx, &OpenSSLAdapter::NewSSLSessionCallback);
1094 } 1112 }
1095 1113
1096 return ctx; 1114 return ctx;
1097 } 1115 }
1098 1116
1117 std::string TransformAlpnProtocols(
1118 const std::vector<std::string>& alpn_protocols) {
1119 // Transforms the alpn_protocols list to the format expected by
1120 // Open/BoringSSL. This requires joining the protocols into a single string
1121 // and prepending a character with the size of the protocol string before
1122 // each protocol.
1123 std::string transformed_alpn;
1124 for (const std::string& proto : alpn_protocols) {
1125 if (proto.size() == 0 || proto.size() > 0xFF) {
1126 LOG(LS_ERROR) << "OpenSSLAdapter::Error("
1127 << "TransformAlpnProtocols received proto with size "
1128 << proto.size() << ")";
1129 return "";
1130 }
1131 transformed_alpn += static_cast<char>(proto.size());
1132 transformed_alpn += proto;
1133 LOG(LS_VERBOSE) << "TransformAlpnProtocols: Adding proto: " << proto;
1134 }
1135 return transformed_alpn;
1136 }
1137
1099 ////////////////////////////////////////////////////////////////////// 1138 //////////////////////////////////////////////////////////////////////
1100 // OpenSSLAdapterFactory 1139 // OpenSSLAdapterFactory
1101 ////////////////////////////////////////////////////////////////////// 1140 //////////////////////////////////////////////////////////////////////
1102 1141
1103 OpenSSLAdapterFactory::OpenSSLAdapterFactory() 1142 OpenSSLAdapterFactory::OpenSSLAdapterFactory()
1104 : ssl_mode_(SSL_MODE_TLS), ssl_ctx_(nullptr) {} 1143 : ssl_mode_(SSL_MODE_TLS), ssl_ctx_(nullptr) {}
1105 1144
1106 OpenSSLAdapterFactory::~OpenSSLAdapterFactory() { 1145 OpenSSLAdapterFactory::~OpenSSLAdapterFactory() {
1107 for (auto it : sessions_) { 1146 for (auto it : sessions_) {
1108 SSL_SESSION_free(it.second); 1147 SSL_SESSION_free(it.second);
(...skipping 24 matching lines...) Expand all
1133 } 1172 }
1134 1173
1135 void OpenSSLAdapterFactory::AddSession(const std::string& hostname, 1174 void OpenSSLAdapterFactory::AddSession(const std::string& hostname,
1136 SSL_SESSION* new_session) { 1175 SSL_SESSION* new_session) {
1137 SSL_SESSION* old_session = LookupSession(hostname); 1176 SSL_SESSION* old_session = LookupSession(hostname);
1138 SSL_SESSION_free(old_session); 1177 SSL_SESSION_free(old_session);
1139 sessions_[hostname] = new_session; 1178 sessions_[hostname] = new_session;
1140 } 1179 }
1141 1180
1142 } // namespace rtc 1181 } // namespace rtc
OLDNEW
« no previous file with comments | « webrtc/rtc_base/openssladapter.h ('k') | webrtc/rtc_base/openssladapter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698