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

Side by Side Diff: content/renderer/media/rtc_certificate_generator.cc

Issue 1972853003: content::RTCCertificateGenerator and WebRTC-EnableWebRtcEcdsa update. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments Created 4 years, 7 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
OLDNEW
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/rtc_certificate_generator.h" 5 #include "content/renderer/media/rtc_certificate_generator.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/macros.h" 10 #include "base/macros.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/synchronization/waitable_event.h"
12 #include "content/renderer/media/peer_connection_identity_store.h" 13 #include "content/renderer/media/peer_connection_identity_store.h"
13 #include "content/renderer/media/rtc_certificate.h" 14 #include "content/renderer/media/rtc_certificate.h"
14 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" 15 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
15 #include "content/renderer/render_thread_impl.h" 16 #include "content/renderer/render_thread_impl.h"
16 #include "third_party/webrtc/base/rtccertificate.h"
17 #include "third_party/webrtc/base/scoped_ref_ptr.h"
18 #include "url/gurl.h" 17 #include "url/gurl.h"
19 18
20 namespace content { 19 namespace content {
21 namespace { 20 namespace {
22 21
23 rtc::KeyParams WebRTCKeyParamsToKeyParams( 22 rtc::KeyParams WebRTCKeyParamsToKeyParams(
24 const blink::WebRTCKeyParams& key_params) { 23 const blink::WebRTCKeyParams& key_params) {
25 switch (key_params.keyType()) { 24 switch (key_params.keyType()) {
26 case blink::WebRTCKeyTypeRSA: 25 case blink::WebRTCKeyTypeRSA:
27 return rtc::KeyParams::RSA(key_params.rsaParams().modLength, 26 return rtc::KeyParams::RSA(key_params.rsaParams().modLength,
28 key_params.rsaParams().pubExp); 27 key_params.rsaParams().pubExp);
29 case blink::WebRTCKeyTypeECDSA: 28 case blink::WebRTCKeyTypeECDSA:
30 return rtc::KeyParams::ECDSA( 29 return rtc::KeyParams::ECDSA(
31 static_cast<rtc::ECCurve>(key_params.ecCurve())); 30 static_cast<rtc::ECCurve>(key_params.ecCurve()));
32 default: 31 default:
33 NOTREACHED(); 32 NOTREACHED();
34 return rtc::KeyParams(); 33 return rtc::KeyParams();
35 } 34 }
36 } 35 }
37 36
38 // Observer used by RTCCertificateGenerator::generateCertificate. 37 // Observer used by RTCCertificateGenerator::generateCertificate, and handler
38 // of an identity request using |PeerConnectionIdentityStore|. An observer
39 // instance is only valid for one request.
39 class RTCCertificateIdentityObserver 40 class RTCCertificateIdentityObserver
40 : public webrtc::DtlsIdentityRequestObserver { 41 : public webrtc::DtlsIdentityRequestObserver {
41 public: 42 public:
42 RTCCertificateIdentityObserver( 43 RTCCertificateIdentityObserver(
43 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread, 44 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
44 const scoped_refptr<base::SingleThreadTaskRunner>& signaling_thread) 45 const scoped_refptr<base::SingleThreadTaskRunner>& signaling_thread)
45 : main_thread_(main_thread), 46 : main_thread_(main_thread),
46 signaling_thread_(signaling_thread), 47 signaling_thread_(signaling_thread),
47 observer_(nullptr) { 48 request_identity_called_(false),
49 request_event_(false, false) {
48 DCHECK(main_thread_); 50 DCHECK(main_thread_);
49 DCHECK(signaling_thread_); 51 DCHECK(signaling_thread_);
50 } 52 }
51 ~RTCCertificateIdentityObserver() override {} 53 ~RTCCertificateIdentityObserver() override {}
52 54
53 // Perform |store|->RequestIdentity with this identity observer and ensure 55 void WaitForRequest() const {
54 // that this identity observer is not deleted until the request has completed 56 request_event_.Wait();
55 // by holding on to a reference to itself for the duration of the request. 57 }
58
59 // Thread safety: Make sure you have waited for the request to completed
60 // before you obtain the result. See |WaitForRequest|. Alternatively the
61 // result is returned to the |observer|, no waiting involved.
62 const scoped_refptr<rtc::RTCCertificate>& result() const {
63 return result_;
64 }
65
66 // Perform |store|->RequestIdentity with |this| identity observer and ensure
67 // that |this| identity observer is not deleted until the request has
68 // completed by holding on to a reference to itself for the duration of the
69 // request. The |observer| is optional, see |request_event| and |Result|.
70 // |RequestIdentity| can only be called once per observer instance.
56 void RequestIdentity( 71 void RequestIdentity(
57 const blink::WebRTCKeyParams& key_params, 72 const rtc::KeyParams& key_params,
58 const GURL& url, 73 const GURL& url,
59 const GURL& first_party_for_cookies, 74 const GURL& first_party_for_cookies,
60 const rtc::Optional<uint64_t>& expires_ms, 75 const rtc::Optional<uint64_t>& expires_ms,
61 std::unique_ptr<blink::WebRTCCertificateCallback> observer) { 76 std::unique_ptr<blink::WebRTCCertificateCallback> observer) {
62 DCHECK(main_thread_->BelongsToCurrentThread()); 77 DCHECK(main_thread_->BelongsToCurrentThread());
63 DCHECK(!observer_) << "Already have a RequestIdentity in progress."; 78 DCHECK(!request_identity_called_) << "Only one RequestIdentity is allowed.";
79 request_identity_called_ = true;
64 key_params_ = key_params; 80 key_params_ = key_params;
65 observer_ = std::move(observer); 81 observer_ = std::move(observer);
66 DCHECK(observer_);
67 // Identity request must be performed on the WebRTC signaling thread. 82 // Identity request must be performed on the WebRTC signaling thread.
68 signaling_thread_->PostTask(FROM_HERE, base::Bind( 83 signaling_thread_->PostTask(FROM_HERE, base::Bind(
69 &RTCCertificateIdentityObserver::RequestIdentityOnWebRtcSignalingThread, 84 &RTCCertificateIdentityObserver::RequestIdentityOnWebRtcSignalingThread,
70 this, url, first_party_for_cookies, expires_ms)); 85 this, url, first_party_for_cookies, expires_ms));
71 } 86 }
72 87
73 private: 88 private:
74 void RequestIdentityOnWebRtcSignalingThread( 89 void RequestIdentityOnWebRtcSignalingThread(
75 GURL url, 90 GURL url,
76 GURL first_party_for_cookies, 91 GURL first_party_for_cookies,
77 rtc::Optional<uint64_t> expires_ms) { 92 rtc::Optional<uint64_t> expires_ms) {
78 DCHECK(signaling_thread_->BelongsToCurrentThread()); 93 DCHECK(signaling_thread_->BelongsToCurrentThread());
79 std::unique_ptr<PeerConnectionIdentityStore> store( 94 std::unique_ptr<PeerConnectionIdentityStore> store(
80 new PeerConnectionIdentityStore(main_thread_, signaling_thread_, url, 95 new PeerConnectionIdentityStore(main_thread_, signaling_thread_, url,
81 first_party_for_cookies)); 96 first_party_for_cookies));
82 // Request identity with |this| as the observer. OnSuccess/OnFailure will be 97 // Request identity with |this| as the observer. |OnSuccess|/|OnFailure|
83 // called asynchronously. 98 // will be called asynchronously.
84 store->RequestIdentity(WebRTCKeyParamsToKeyParams(key_params_), 99 store->RequestIdentity(key_params_, expires_ms, this);
85 expires_ms, this);
86 } 100 }
87 101
88 // webrtc::DtlsIdentityRequestObserver implementation. 102 // webrtc::DtlsIdentityRequestObserver implementation.
89 void OnFailure(int error) override { 103 void OnFailure(int error) override {
90 DCHECK(signaling_thread_->BelongsToCurrentThread()); 104 DCHECK(signaling_thread_->BelongsToCurrentThread());
91 DCHECK(observer_);
92 main_thread_->PostTask(FROM_HERE, base::Bind( 105 main_thread_->PostTask(FROM_HERE, base::Bind(
93 &RTCCertificateIdentityObserver::DoCallbackOnMainThread, 106 &RTCCertificateIdentityObserver::DoCallbackOnMainThread,
94 this, nullptr)); 107 this, nullptr));
95 } 108 }
96 void OnSuccess(const std::string& der_cert, 109 void OnSuccess(const std::string& der_cert,
97 const std::string& der_private_key) override { 110 const std::string& der_private_key) override {
98 std::string pem_cert = rtc::SSLIdentity::DerToPem( 111 std::string pem_cert = rtc::SSLIdentity::DerToPem(
99 rtc::kPemTypeCertificate, 112 rtc::kPemTypeCertificate,
100 reinterpret_cast<const unsigned char*>(der_cert.data()), 113 reinterpret_cast<const unsigned char*>(der_cert.data()),
101 der_cert.length()); 114 der_cert.length());
102 std::string pem_key = rtc::SSLIdentity::DerToPem( 115 std::string pem_key = rtc::SSLIdentity::DerToPem(
103 rtc::kPemTypeRsaPrivateKey, 116 rtc::kPemTypeRsaPrivateKey,
104 reinterpret_cast<const unsigned char*>(der_private_key.data()), 117 reinterpret_cast<const unsigned char*>(der_private_key.data()),
105 der_private_key.length()); 118 der_private_key.length());
106 OnSuccess(std::unique_ptr<rtc::SSLIdentity>( 119 OnSuccess(std::unique_ptr<rtc::SSLIdentity>(
107 rtc::SSLIdentity::FromPEMStrings(pem_key, pem_cert))); 120 rtc::SSLIdentity::FromPEMStrings(pem_key, pem_cert)));
108 } 121 }
109 void OnSuccess(std::unique_ptr<rtc::SSLIdentity> identity) override { 122 void OnSuccess(std::unique_ptr<rtc::SSLIdentity> identity) override {
110 DCHECK(signaling_thread_->BelongsToCurrentThread()); 123 DCHECK(signaling_thread_->BelongsToCurrentThread());
111 DCHECK(observer_);
112 rtc::scoped_refptr<rtc::RTCCertificate> certificate = 124 rtc::scoped_refptr<rtc::RTCCertificate> certificate =
113 rtc::RTCCertificate::Create(std::move(identity)); 125 rtc::RTCCertificate::Create(std::move(identity));
114 main_thread_->PostTask( 126 result_ = certificate;
115 FROM_HERE, 127 request_event_.Signal();
116 base::Bind(&RTCCertificateIdentityObserver::DoCallbackOnMainThread, 128 if (observer_) {
117 this, base::Passed(base::WrapUnique( 129 main_thread_->PostTask(
118 new RTCCertificate(certificate))))); 130 FROM_HERE,
131 base::Bind(&RTCCertificateIdentityObserver::DoCallbackOnMainThread,
132 this, certificate));
133 }
119 } 134 }
120 135
121 void DoCallbackOnMainThread( 136 void DoCallbackOnMainThread(
122 std::unique_ptr<blink::WebRTCCertificate> certificate) { 137 rtc::scoped_refptr<rtc::RTCCertificate> certificate) {
123 DCHECK(main_thread_->BelongsToCurrentThread()); 138 DCHECK(main_thread_->BelongsToCurrentThread());
124 DCHECK(observer_); 139 DCHECK(observer_);
125 if (certificate) 140 if (certificate) {
126 observer_->onSuccess(std::move(certificate)); 141 observer_->onSuccess(std::unique_ptr<blink::WebRTCCertificate>(
127 else 142 new RTCCertificate(certificate)));
143 } else {
128 observer_->onError(); 144 observer_->onError();
129 observer_.reset(); 145 }
130 } 146 }
131 147
132 // The main thread is the renderer thread. 148 // The main thread is the renderer thread.
133 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_; 149 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
134 // The signaling thread is a WebRTC thread used to invoke 150 // The signaling thread is a WebRTC thread used to invoke
135 // PeerConnectionIdentityStore::RequestIdentity on, as is required. 151 // PeerConnectionIdentityStore::RequestIdentity on, as is required.
136 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread_; 152 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread_;
137 blink::WebRTCKeyParams key_params_; 153 bool request_identity_called_;
154 rtc::KeyParams key_params_;
138 std::unique_ptr<blink::WebRTCCertificateCallback> observer_; 155 std::unique_ptr<blink::WebRTCCertificateCallback> observer_;
156 mutable base::WaitableEvent request_event_;
157 scoped_refptr<rtc::RTCCertificate> result_;
139 158
140 DISALLOW_COPY_AND_ASSIGN(RTCCertificateIdentityObserver); 159 DISALLOW_COPY_AND_ASSIGN(RTCCertificateIdentityObserver);
141 }; 160 };
142 161
143 } // namespace 162 } // namespace
144 163
145 void RTCCertificateGenerator::generateCertificate( 164 void RTCCertificateGenerator::generateCertificate(
146 const blink::WebRTCKeyParams& key_params, 165 const blink::WebRTCKeyParams& key_params,
147 const blink::WebURL& url, 166 const blink::WebURL& url,
148 const blink::WebURL& first_party_for_cookies, 167 const blink::WebURL& first_party_for_cookies,
(...skipping 29 matching lines...) Expand all
178 PeerConnectionDependencyFactory* pc_dependency_factory = 197 PeerConnectionDependencyFactory* pc_dependency_factory =
179 RenderThreadImpl::current()->GetPeerConnectionDependencyFactory(); 198 RenderThreadImpl::current()->GetPeerConnectionDependencyFactory();
180 pc_dependency_factory->EnsureInitialized(); 199 pc_dependency_factory->EnsureInitialized();
181 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread = 200 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread =
182 pc_dependency_factory->GetWebRtcSignalingThread(); 201 pc_dependency_factory->GetWebRtcSignalingThread();
183 202
184 rtc::scoped_refptr<RTCCertificateIdentityObserver> identity_observer( 203 rtc::scoped_refptr<RTCCertificateIdentityObserver> identity_observer(
185 new rtc::RefCountedObject<RTCCertificateIdentityObserver>( 204 new rtc::RefCountedObject<RTCCertificateIdentityObserver>(
186 main_thread, signaling_thread)); 205 main_thread, signaling_thread));
187 // |identity_observer| lives until request has completed. 206 // |identity_observer| lives until request has completed.
188 identity_observer->RequestIdentity(key_params, url, first_party_for_cookies, 207 identity_observer->RequestIdentity(
189 expires_ms, std::move(observer)); 208 WebRTCKeyParamsToKeyParams(key_params), url, first_party_for_cookies,
209 expires_ms, std::move(observer));
190 #else 210 #else
191 observer->onError(); 211 observer->onError();
192 #endif 212 #endif
193 } 213 }
194 214
215 scoped_refptr<rtc::RTCCertificate>
216 RTCCertificateGenerator::generateCertificateAndWait(
217 const rtc::KeyParams& key_params,
218 const rtc::Optional<uint64_t>& expires_ms) {
219 #if defined(ENABLE_WEBRTC)
220 const scoped_refptr<base::SingleThreadTaskRunner> main_thread =
221 base::ThreadTaskRunnerHandle::Get();
222
223 PeerConnectionDependencyFactory* pc_dependency_factory =
224 RenderThreadImpl::current()->GetPeerConnectionDependencyFactory();
225 pc_dependency_factory->EnsureInitialized();
226 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread =
227 pc_dependency_factory->GetWebRtcSignalingThread();
228
229 scoped_refptr<RTCCertificateIdentityObserver> identity_observer(
230 new rtc::RefCountedObject<RTCCertificateIdentityObserver>(
231 main_thread, signaling_thread));
232 // Don't care about URL origin parameters, using empty URL.
233 identity_observer->RequestIdentity(key_params, GURL(), GURL(), expires_ms,
234 nullptr);
235 identity_observer->WaitForRequest();
236 return identity_observer->result();
237 #else
238 return nullptr;
239 #endif
240 }
241
195 bool RTCCertificateGenerator::isSupportedKeyParams( 242 bool RTCCertificateGenerator::isSupportedKeyParams(
196 const blink::WebRTCKeyParams& key_params) { 243 const blink::WebRTCKeyParams& key_params) {
197 return WebRTCKeyParamsToKeyParams(key_params).IsValid(); 244 return WebRTCKeyParamsToKeyParams(key_params).IsValid();
198 } 245 }
199 246
200 std::unique_ptr<blink::WebRTCCertificate> RTCCertificateGenerator::fromPEM( 247 std::unique_ptr<blink::WebRTCCertificate> RTCCertificateGenerator::fromPEM(
201 const std::string& pem_private_key, 248 const std::string& pem_private_key,
202 const std::string& pem_certificate) { 249 const std::string& pem_certificate) {
203 rtc::scoped_refptr<rtc::RTCCertificate> certificate = 250 rtc::scoped_refptr<rtc::RTCCertificate> certificate =
204 rtc::RTCCertificate::FromPEM( 251 rtc::RTCCertificate::FromPEM(
205 rtc::RTCCertificatePEM(pem_private_key, pem_certificate)); 252 rtc::RTCCertificatePEM(pem_private_key, pem_certificate));
206 return std::unique_ptr<blink::WebRTCCertificate>( 253 return std::unique_ptr<blink::WebRTCCertificate>(
207 new RTCCertificate(certificate)); 254 new RTCCertificate(certificate));
208 } 255 }
209 256
210 } // namespace content 257 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/rtc_certificate_generator.h ('k') | content/renderer/media/rtc_peer_connection_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698