| Index: webrtc/p2p/base/dtlstransport.h
|
| diff --git a/webrtc/p2p/base/dtlstransport.h b/webrtc/p2p/base/dtlstransport.h
|
| index 276b05f786f265bf026f941fa32bb75a51fe130d..58a34eb017d1f0404624088d53317dc284422b81 100644
|
| --- a/webrtc/p2p/base/dtlstransport.h
|
| +++ b/webrtc/p2p/base/dtlstransport.h
|
| @@ -64,27 +64,11 @@ class DtlsTransport : public Base {
|
| rtc::SSLFingerprint* local_fp =
|
| Base::local_description()->identity_fingerprint.get();
|
|
|
| - if (local_fp) {
|
| - // Sanity check local fingerprint.
|
| - if (certificate_) {
|
| - rtc::scoped_ptr<rtc::SSLFingerprint> local_fp_tmp(
|
| - rtc::SSLFingerprint::Create(local_fp->algorithm,
|
| - certificate_->identity()));
|
| - ASSERT(local_fp_tmp.get() != NULL);
|
| - if (!(*local_fp_tmp == *local_fp)) {
|
| - std::ostringstream desc;
|
| - desc << "Local fingerprint does not match identity. Expected: ";
|
| - desc << local_fp_tmp->ToString();
|
| - desc << " Got: " << local_fp->ToString();
|
| - return BadTransportDescription(desc.str(), error_desc);
|
| - }
|
| - } else {
|
| - return BadTransportDescription(
|
| - "Local fingerprint provided but no identity available.",
|
| - error_desc);
|
| - }
|
| - } else {
|
| + if (!local_fp) {
|
| certificate_ = nullptr;
|
| + } else if (!Base::VerifyCertificateFingerprint(certificate_.get(), local_fp,
|
| + error_desc)) {
|
| + return false;
|
| }
|
|
|
| if (!channel->SetLocalCertificate(certificate_)) {
|
| @@ -103,96 +87,23 @@ class DtlsTransport : public Base {
|
| "transport descriptions are negotiated";
|
| return BadTransportDescription(msg, error_desc);
|
| }
|
| -
|
| rtc::SSLFingerprint* local_fp =
|
| Base::local_description()->identity_fingerprint.get();
|
| rtc::SSLFingerprint* remote_fp =
|
| Base::remote_description()->identity_fingerprint.get();
|
| -
|
| if (remote_fp && local_fp) {
|
| remote_fingerprint_.reset(new rtc::SSLFingerprint(*remote_fp));
|
| -
|
| - // From RFC 4145, section-4.1, The following are the values that the
|
| - // 'setup' attribute can take in an offer/answer exchange:
|
| - // Offer Answer
|
| - // ________________
|
| - // active passive / holdconn
|
| - // passive active / holdconn
|
| - // actpass active / passive / holdconn
|
| - // holdconn holdconn
|
| - //
|
| - // Set the role that is most conformant with RFC 5763, Section 5, bullet 1
|
| - // The endpoint MUST use the setup attribute defined in [RFC4145].
|
| - // The endpoint that is the offerer MUST use the setup attribute
|
| - // value of setup:actpass and be prepared to receive a client_hello
|
| - // before it receives the answer. The answerer MUST use either a
|
| - // setup attribute value of setup:active or setup:passive. Note that
|
| - // if the answerer uses setup:passive, then the DTLS handshake will
|
| - // not begin until the answerer is received, which adds additional
|
| - // latency. setup:active allows the answer and the DTLS handshake to
|
| - // occur in parallel. Thus, setup:active is RECOMMENDED. Whichever
|
| - // party is active MUST initiate a DTLS handshake by sending a
|
| - // ClientHello over each flow (host/port quartet).
|
| - // IOW - actpass and passive modes should be treated as server and
|
| - // active as client.
|
| - ConnectionRole local_connection_role =
|
| - Base::local_description()->connection_role;
|
| - ConnectionRole remote_connection_role =
|
| - Base::remote_description()->connection_role;
|
| -
|
| - bool is_remote_server = false;
|
| - if (local_role == CA_OFFER) {
|
| - if (local_connection_role != CONNECTIONROLE_ACTPASS) {
|
| - return BadTransportDescription(
|
| - "Offerer must use actpass value for setup attribute.",
|
| - error_desc);
|
| - }
|
| -
|
| - if (remote_connection_role == CONNECTIONROLE_ACTIVE ||
|
| - remote_connection_role == CONNECTIONROLE_PASSIVE ||
|
| - remote_connection_role == CONNECTIONROLE_NONE) {
|
| - is_remote_server = (remote_connection_role == CONNECTIONROLE_PASSIVE);
|
| - } else {
|
| - const std::string msg =
|
| - "Answerer must use either active or passive value "
|
| - "for setup attribute.";
|
| - return BadTransportDescription(msg, error_desc);
|
| - }
|
| - // If remote is NONE or ACTIVE it will act as client.
|
| - } else {
|
| - if (remote_connection_role != CONNECTIONROLE_ACTPASS &&
|
| - remote_connection_role != CONNECTIONROLE_NONE) {
|
| - return BadTransportDescription(
|
| - "Offerer must use actpass value for setup attribute.",
|
| - error_desc);
|
| - }
|
| -
|
| - if (local_connection_role == CONNECTIONROLE_ACTIVE ||
|
| - local_connection_role == CONNECTIONROLE_PASSIVE) {
|
| - is_remote_server = (local_connection_role == CONNECTIONROLE_ACTIVE);
|
| - } else {
|
| - const std::string msg =
|
| - "Answerer must use either active or passive value "
|
| - "for setup attribute.";
|
| - return BadTransportDescription(msg, error_desc);
|
| - }
|
| -
|
| - // If local is passive, local will act as server.
|
| + if (!Base::NegotiateRole(local_role, &secure_role_, error_desc)) {
|
| + return false;
|
| }
|
| -
|
| - secure_role_ = is_remote_server ? rtc::SSL_CLIENT :
|
| - rtc::SSL_SERVER;
|
| -
|
| } else if (local_fp && (local_role == CA_ANSWER)) {
|
| return BadTransportDescription(
|
| "Local fingerprint supplied when caller didn't offer DTLS.",
|
| error_desc);
|
| } else {
|
| // We are not doing DTLS
|
| - remote_fingerprint_.reset(new rtc::SSLFingerprint(
|
| - "", NULL, 0));
|
| + remote_fingerprint_.reset(new rtc::SSLFingerprint("", nullptr, 0));
|
| }
|
| -
|
| // Now run the negotiation for the base class.
|
| return Base::NegotiateTransportDescription(local_role, error_desc);
|
| }
|
|
|