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

Side by Side Diff: webrtc/p2p/base/dtlstransportchannel.cc

Issue 1453523002: Allow remote fingerprint update during a call (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: fix rtc_unittests error Created 5 years 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
OLDNEW
1 /* 1 /*
2 * Copyright 2011 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2011 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 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 192
193 return dtls_->GetSslCipherSuite(cipher); 193 return dtls_->GetSslCipherSuite(cipher);
194 } 194 }
195 195
196 bool DtlsTransportChannelWrapper::SetRemoteFingerprint( 196 bool DtlsTransportChannelWrapper::SetRemoteFingerprint(
197 const std::string& digest_alg, 197 const std::string& digest_alg,
198 const uint8_t* digest, 198 const uint8_t* digest,
199 size_t digest_len) { 199 size_t digest_len) {
200 rtc::Buffer remote_fingerprint_value(digest, digest_len); 200 rtc::Buffer remote_fingerprint_value(digest, digest_len);
201 201
202 // When we have local certificate, the same remote fingerprint could be set
203 // multiple times.
pthatcher1 2015/11/30 20:23:11 When we have local => Once we have the local coul
guoweis_webrtc 2015/12/01 22:05:13 Done.
202 if (dtls_active_ && remote_fingerprint_value_ == remote_fingerprint_value && 204 if (dtls_active_ && remote_fingerprint_value_ == remote_fingerprint_value &&
203 !digest_alg.empty()) { 205 !digest_alg.empty()) {
204 // This may happen during renegotiation. 206 // This may happen during renegotiation.
205 LOG_J(LS_INFO, this) << "Ignoring identical remote DTLS fingerprint"; 207 LOG_J(LS_INFO, this) << "Ignoring identical remote DTLS fingerprint";
206 return true; 208 return true;
207 } 209 }
208 210
209 // Allow SetRemoteFingerprint with a NULL digest even if SetLocalCertificate 211 // If the other side doesn't support DTLS, turn off |dtls_active_|.
210 // hasn't been called.
211 if (dtls_ || (!dtls_active_ && !digest_alg.empty())) {
212 LOG_J(LS_ERROR, this) << "Can't set DTLS remote settings in this state.";
213 return false;
214 }
215
216 if (digest_alg.empty()) { 212 if (digest_alg.empty()) {
213 RTC_DCHECK(!digest_len);
217 LOG_J(LS_INFO, this) << "Other side didn't support DTLS."; 214 LOG_J(LS_INFO, this) << "Other side didn't support DTLS.";
218 dtls_active_ = false; 215 dtls_active_ = false;
219 return true; 216 return true;
220 } 217 }
221 218
219 // Otherwise, we must have a local certificate before setting remote
220 // fingerprint.
221 if (!dtls_active_) {
222 LOG_J(LS_ERROR, this) << "Can't set DTLS remote settings in this state.";
223 return false;
224 }
225
222 // At this point we know we are doing DTLS 226 // At this point we know we are doing DTLS
223 remote_fingerprint_value_ = remote_fingerprint_value.Pass(); 227 remote_fingerprint_value_ = remote_fingerprint_value.Pass();
224 remote_fingerprint_algorithm_ = digest_alg; 228 remote_fingerprint_algorithm_ = digest_alg;
225 229
230 bool reconnect = dtls_;
231
226 if (!SetupDtls()) { 232 if (!SetupDtls()) {
227 set_dtls_state(DTLS_TRANSPORT_FAILED); 233 set_dtls_state(DTLS_TRANSPORT_FAILED);
228 return false; 234 return false;
229 } 235 }
230 236
237 if (reconnect) {
238 set_dtls_state(DTLS_TRANSPORT_NEW);
pthatcher1 2015/11/30 20:23:11 Why do we set the state to new and then assert the
guoweis_webrtc 2015/12/01 22:05:13 Done.
239 set_writable(false);
240 Reconnect();
241 }
242
231 return true; 243 return true;
232 } 244 }
233 245
234 bool DtlsTransportChannelWrapper::GetRemoteSSLCertificate( 246 bool DtlsTransportChannelWrapper::GetRemoteSSLCertificate(
235 rtc::SSLCertificate** cert) const { 247 rtc::SSLCertificate** cert) const {
236 if (!dtls_) { 248 if (!dtls_) {
237 return false; 249 return false;
238 } 250 }
239 251
240 return dtls_->GetPeerCertificate(cert); 252 return dtls_->GetPeerCertificate(cert);
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 if (dtls_->GetState() == rtc::SS_OPEN) { 535 if (dtls_->GetState() == rtc::SS_OPEN) {
524 // The check for OPEN shouldn't be necessary but let's make 536 // The check for OPEN shouldn't be necessary but let's make
525 // sure we don't accidentally frob the state if it's closed. 537 // sure we don't accidentally frob the state if it's closed.
526 set_dtls_state(DTLS_TRANSPORT_CONNECTED); 538 set_dtls_state(DTLS_TRANSPORT_CONNECTED);
527 set_writable(true); 539 set_writable(true);
528 } 540 }
529 } 541 }
530 if (sig & rtc::SE_READ) { 542 if (sig & rtc::SE_READ) {
531 char buf[kMaxDtlsPacketLen]; 543 char buf[kMaxDtlsPacketLen];
532 size_t read; 544 size_t read;
533 if (dtls_->Read(buf, sizeof(buf), &read, NULL) == rtc::SR_SUCCESS) { 545 rtc::StreamResult result = dtls_->Read(buf, sizeof(buf), &read, NULL);
546 if (result == rtc::SR_SUCCESS) {
534 SignalReadPacket(this, buf, read, rtc::CreatePacketTime(0), 0); 547 SignalReadPacket(this, buf, read, rtc::CreatePacketTime(0), 0);
548 } else if (result == rtc::SR_EOS) {
549 // If the SSL stream has closed remotely, reset the |sig| to be SE_CLOSE
550 // so it could be handled below.
551 sig = rtc::SE_CLOSE;
pthatcher1 2015/11/30 20:23:11 Shouldn't we have a unit test for dtlstransportcha
guoweis_webrtc 2015/12/01 22:05:13 Yes, but I'd like to add it in next CL.
535 } 552 }
536 } 553 }
537 if (sig & rtc::SE_CLOSE) { 554 if (sig & rtc::SE_CLOSE) {
538 ASSERT(sig == rtc::SE_CLOSE); // SE_CLOSE should be by itself. 555 ASSERT(sig == rtc::SE_CLOSE); // SE_CLOSE should be by itself.
539 set_writable(false); 556 set_writable(false);
540 if (!err) { 557 if (!err) {
541 LOG_J(LS_INFO, this) << "DTLS channel closed"; 558 LOG_J(LS_INFO, this) << "DTLS channel closed";
542 set_dtls_state(DTLS_TRANSPORT_CLOSED); 559 set_dtls_state(DTLS_TRANSPORT_CLOSED);
543 } else { 560 } else {
544 LOG_J(LS_INFO, this) << "DTLS channel error, code=" << err; 561 LOG_J(LS_INFO, this) << "DTLS channel error, code=" << err;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 ASSERT(channel == channel_); 626 ASSERT(channel == channel_);
610 SignalRouteChange(this, candidate); 627 SignalRouteChange(this, candidate);
611 } 628 }
612 629
613 void DtlsTransportChannelWrapper::OnConnectionRemoved( 630 void DtlsTransportChannelWrapper::OnConnectionRemoved(
614 TransportChannelImpl* channel) { 631 TransportChannelImpl* channel) {
615 ASSERT(channel == channel_); 632 ASSERT(channel == channel_);
616 SignalConnectionRemoved(this); 633 SignalConnectionRemoved(this);
617 } 634 }
618 635
636 void DtlsTransportChannelWrapper::Reconnect() {
637 ASSERT(dtls_state() == DTLS_TRANSPORT_NEW);
638 if (channel_->writable()) {
639 OnWritableState(channel_);
640 } else {
641 channel_->Connect();
642 }
643 }
644
619 } // namespace cricket 645 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698