Skip to content

Commit 801f742

Browse files
Merge pull request #1212 from paullouisageneau/remotefingerprint-sync
Add proper synchronization to remote fingerprint
2 parents b756b5a + c21dd8f commit 801f742

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

src/impl/peerconnection.cpp

+15-10
Original file line numberDiff line numberDiff line change
@@ -229,13 +229,15 @@ shared_ptr<DtlsTransport> PeerConnection::initDtlsTransport() {
229229

230230
PLOG_VERBOSE << "Starting DTLS transport";
231231

232-
auto fingerprintAlgorithm = CertificateFingerprint::Algorithm::Sha256;
233-
if (auto remote = remoteDescription(); remote && remote->fingerprint()) {
234-
fingerprintAlgorithm = remote->fingerprint()->algorithm;
232+
CertificateFingerprint::Algorithm fingerprintAlgorithm;
233+
{
234+
std::lock_guard lock(mRemoteDescriptionMutex);
235+
if (mRemoteDescription && mRemoteDescription->fingerprint()) {
236+
mRemoteFingerprintAlgorithm = mRemoteDescription->fingerprint()->algorithm;
237+
}
238+
fingerprintAlgorithm = mRemoteFingerprintAlgorithm;
235239
}
236240

237-
mRemoteFingerprintAlgorithm = fingerprintAlgorithm;
238-
239241
auto lower = std::atomic_load(&mIceTransport);
240242
if (!lower)
241243
throw std::logic_error("No underlying ICE transport for DTLS transport");
@@ -443,23 +445,25 @@ void PeerConnection::rollbackLocalDescription() {
443445

444446
bool PeerConnection::checkFingerprint(const std::string &fingerprint) {
445447
std::lock_guard lock(mRemoteDescriptionMutex);
446-
if (!mRemoteDescription || !mRemoteDescription->fingerprint())
448+
mRemoteFingerprint = fingerprint;
449+
450+
if (!mRemoteDescription || !mRemoteDescription->fingerprint()
451+
|| mRemoteFingerprintAlgorithm != mRemoteDescription->fingerprint()->algorithm)
447452
return false;
448453

449-
if (config.disableFingerprintVerification) {
454+
if (config.disableFingerprintVerification) {
450455
PLOG_VERBOSE << "Skipping fingerprint validation";
451-
mRemoteFingerprint = fingerprint;
452456
return true;
453457
}
454458

455459
auto expectedFingerprint = mRemoteDescription->fingerprint()->value;
456460
if (expectedFingerprint == fingerprint) {
457461
PLOG_VERBOSE << "Valid fingerprint \"" << fingerprint << "\"";
458-
mRemoteFingerprint = fingerprint;
459462
return true;
460463
}
461464

462-
PLOG_ERROR << "Invalid fingerprint \"" << fingerprint << "\", expected \"" << expectedFingerprint << "\"";
465+
PLOG_ERROR << "Invalid fingerprint \"" << fingerprint << "\", expected \""
466+
<< expectedFingerprint << "\"";
463467
return false;
464468
}
465469

@@ -1308,6 +1312,7 @@ void PeerConnection::resetCallbacks() {
13081312
}
13091313

13101314
CertificateFingerprint PeerConnection::remoteFingerprint() {
1315+
std::lock_guard lock(mRemoteDescriptionMutex);
13111316
if (mRemoteFingerprint)
13121317
return {CertificateFingerprint{mRemoteFingerprintAlgorithm, *mRemoteFingerprint}};
13131318
else

src/impl/peerconnection.hpp

+8-6
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ struct PeerConnection : std::enable_shared_from_this<PeerConnection> {
9898
bool changeSignalingState(SignalingState newState);
9999

100100
void resetCallbacks();
101+
101102
CertificateFingerprint remoteFingerprint();
102103

103104
// Helper method for asynchronous callback invocation
@@ -135,12 +136,16 @@ struct PeerConnection : std::enable_shared_from_this<PeerConnection> {
135136
future_certificate_ptr mCertificate;
136137

137138
Processor mProcessor;
138-
optional<Description> mLocalDescription, mRemoteDescription;
139+
optional<Description> mLocalDescription;
139140
optional<Description> mCurrentLocalDescription;
140-
mutable std::mutex mLocalDescriptionMutex, mRemoteDescriptionMutex;
141+
mutable std::mutex mLocalDescriptionMutex;
141142

142-
shared_ptr<MediaHandler> mMediaHandler;
143+
optional<Description> mRemoteDescription;
144+
CertificateFingerprint::Algorithm mRemoteFingerprintAlgorithm = CertificateFingerprint::Algorithm::Sha256;
145+
optional<string> mRemoteFingerprint;
146+
mutable std::mutex mRemoteDescriptionMutex;
143147

148+
shared_ptr<MediaHandler> mMediaHandler;
144149
mutable std::shared_mutex mMediaHandlerMutex;
145150

146151
shared_ptr<IceTransport> mIceTransport;
@@ -158,9 +163,6 @@ struct PeerConnection : std::enable_shared_from_this<PeerConnection> {
158163

159164
Queue<shared_ptr<DataChannel>> mPendingDataChannels;
160165
Queue<shared_ptr<Track>> mPendingTracks;
161-
162-
CertificateFingerprint::Algorithm mRemoteFingerprintAlgorithm = CertificateFingerprint::Algorithm::Sha256;
163-
optional<string> mRemoteFingerprint;
164166
};
165167

166168
} // namespace rtc::impl

0 commit comments

Comments
 (0)