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

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

Issue 1373023002: RTCCertificate, RTCPeerConnection.generateCertificate (WebRTC JavaScript) added. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed jochen's comments Created 5 years, 2 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "content/renderer/media/rtc_certificate_generator.h"
6
7 #include "content/renderer/media/peer_connection_identity_store.h"
8 #include "content/renderer/media/rtc_certificate.h"
9 #include "third_party/webrtc/base/rtccertificate.h"
10 #include "third_party/webrtc/base/scoped_ref_ptr.h"
11 #include "url/gurl.h"
12
13 namespace content {
14 namespace {
15
16 rtc::KeyParams WebRTCKeyParamsToKeyParams(
17 const blink::WebRTCKeyParams& key_params) {
18 switch (key_params.keyType()) {
19 case blink::WebRTCKeyTypeRSA:
20 return rtc::KeyParams::RSA(key_params.rsaParams().modLength,
21 key_params.rsaParams().pubExp);
22 case blink::WebRTCKeyTypeECDSA:
23 return rtc::KeyParams::ECDSA(
24 static_cast<rtc::ECCurve>(key_params.ecCurve()));
25 default:
26 NOTREACHED();
27 return rtc::KeyParams();
28 }
29 }
30
31 // Observer used by RTCCertificateGenerator::generateCertificate.
32 class RTCCertificateIdentityObserver
33 : public webrtc::DtlsIdentityRequestObserver {
34 public:
35 RTCCertificateIdentityObserver() : observer_(nullptr) {}
36 ~RTCCertificateIdentityObserver() override {}
37
38 // Perform |store|->RequestIdentity with this identity observer and ensure
39 // that this identity observer is not deleted until the request has completed
40 // by holding on to a reference to itself for the duration of the request.
41 void RequestIdentity(
42 webrtc::DtlsIdentityStoreInterface* store,
43 const blink::WebRTCKeyParams& key_params,
44 blink::WebCallbacks<blink::WebRTCCertificate*, void>* observer) {
45 DCHECK(!self_ref_) << "Already have a RequestIdentity in progress.";
46 self_ref_ = this;
47 key_params_ = key_params;
48 observer_ = observer;
49 DCHECK(observer_);
50 // Request identity with |this| as the observer. OnSuccess/OnFailure will be
51 // called asynchronously.
52 store->RequestIdentity(WebRTCKeyParamsToKeyParams(key_params).type(), this);
53 }
54
55 private:
56 void OnFailure(int error) override {
57 DCHECK(self_ref_) << "Not initialized. See RequestIdentity.";
58 DCHECK(observer_);
59 observer_->onError();
60 // Stop referencing self. If this is the last reference then this will
61 // result in "delete this".
62 self_ref_ = nullptr;
63 }
64
65 void OnSuccess(const std::string& der_cert,
66 const std::string& der_private_key) override {
67 std::string pem_cert = rtc::SSLIdentity::DerToPem(
68 rtc::kPemTypeCertificate,
69 reinterpret_cast<const unsigned char*>(der_cert.data()),
70 der_cert.length());
71 std::string pem_key = rtc::SSLIdentity::DerToPem(
72 rtc::kPemTypeRsaPrivateKey,
73 reinterpret_cast<const unsigned char*>(der_private_key.data()),
74 der_private_key.length());
75 rtc::scoped_ptr<rtc::SSLIdentity> identity(
76 rtc::SSLIdentity::FromPEMStrings(pem_key, pem_cert));
77 OnSuccess(identity.Pass());
78 }
79
80 void OnSuccess(rtc::scoped_ptr<rtc::SSLIdentity> identity) override {
81 DCHECK(self_ref_) << "Not initialized. See RequestIdentity.";
82 DCHECK(observer_);
83 rtc::scoped_refptr<rtc::RTCCertificate> certificate =
84 rtc::RTCCertificate::Create(identity.Pass());
85 observer_->onSuccess(new RTCCertificate(key_params_, certificate));
86 // Stop referencing self. If this is the last reference then this will
87 // result in "delete this".
88 self_ref_ = nullptr;
89 }
90
91 // The reference to self protects |this| from being deleted before the request
92 // has completed. Upon completion we stop referencing ourselves.
93 rtc::scoped_refptr<RTCCertificateIdentityObserver> self_ref_;
94 blink::WebRTCKeyParams key_params_;
95 blink::WebCallbacks<blink::WebRTCCertificate*, void>* observer_;
96
97 DISALLOW_COPY_AND_ASSIGN(RTCCertificateIdentityObserver);
98 };
99
100 } // namespace
101
102 void RTCCertificateGenerator::generateCertificate(
103 const blink::WebRTCKeyParams& key_params,
104 const blink::WebURL& url,
105 const blink::WebURL& first_party_for_cookies,
106 blink::WebCallbacks<blink::WebRTCCertificate*, void>* observer) {
107 rtc::scoped_ptr<PeerConnectionIdentityStore> store(
108 new PeerConnectionIdentityStore(url, first_party_for_cookies));
109 rtc::scoped_refptr<RTCCertificateIdentityObserver> identity_observer(
110 new rtc::RefCountedObject<RTCCertificateIdentityObserver>());
111 // |identity_observer| lives until request has completed.
112 identity_observer->RequestIdentity(store.get(), key_params, observer);
113 }
114
115 bool RTCCertificateGenerator::isValidKeyParams(
116 const blink::WebRTCKeyParams& key_params) {
117 return WebRTCKeyParamsToKeyParams(key_params).IsValid();
118 }
119
120 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698