| Index: content/renderer/media/rtc_certificate_generator.cc
|
| diff --git a/content/renderer/media/rtc_certificate_generator.cc b/content/renderer/media/rtc_certificate_generator.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9138b833a731ebbbc3bc3e2b7c91ce50a0cbb930
|
| --- /dev/null
|
| +++ b/content/renderer/media/rtc_certificate_generator.cc
|
| @@ -0,0 +1,92 @@
|
| +// Copyright (c) 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "content/renderer/media/rtc_certificate_generator.h"
|
| +
|
| +#include "content/renderer/media/peer_connection_identity_store.h"
|
| +#include "content/renderer/media/rtc_certificate.h"
|
| +#include "third_party/webrtc/base/rtccertificate.h"
|
| +#include "url/gurl.h"
|
| +
|
| +namespace content {
|
| +namespace {
|
| +
|
| +class RTCCertificateIdentityObserver
|
| + : public webrtc::DtlsIdentityRequestObserver {
|
| + public:
|
| + RTCCertificateIdentityObserver(
|
| + blink::WebRTCKeyType key_type,
|
| + webrtc::DtlsIdentityStoreInterface* store,
|
| + blink::WebCallbacks<blink::WebRTCCertificate*, void>* observer)
|
| + : key_type_(key_type), store_(store), observer_(observer) {
|
| + }
|
| +
|
| + ~RTCCertificateIdentityObserver() override {
|
| + }
|
| +
|
| + void Init(rtc::scoped_refptr<RTCCertificateIdentityObserver> self) {
|
| + this_ = self;
|
| + }
|
| +
|
| + private:
|
| + void OnFailure(int error) override {
|
| + DCHECK(this_) << "Not initialized.";
|
| + observer_->onError();
|
| + // Stop protecting against destruction. This could result in "delete this".
|
| + this_ = nullptr;
|
| + }
|
| +
|
| + void OnSuccess(const std::string& der_cert,
|
| + const std::string& der_private_key) override {
|
| + DCHECK(this_) << "Not initialized.";
|
| + std::string pem_cert = rtc::SSLIdentity::DerToPem(
|
| + rtc::kPemTypeCertificate,
|
| + reinterpret_cast<const unsigned char*>(der_cert.data()),
|
| + der_cert.length());
|
| + std::string pem_key = rtc::SSLIdentity::DerToPem(
|
| + rtc::kPemTypeRsaPrivateKey,
|
| + reinterpret_cast<const unsigned char*>(der_private_key.data()),
|
| + der_private_key.length());
|
| + rtc::scoped_ptr<rtc::SSLIdentity> identity(
|
| + rtc::SSLIdentity::FromPEMStrings(pem_key, pem_cert));
|
| + OnSuccess(identity.Pass());
|
| + }
|
| +
|
| + void OnSuccess(rtc::scoped_ptr<rtc::SSLIdentity> identity) override {
|
| + DCHECK(this_) << "Not initialized.";
|
| + rtc::scoped_refptr<rtc::RTCCertificate> certificate =
|
| + rtc::RTCCertificate::Create(identity.Pass());
|
| + observer_->onSuccess(new RTCCertificate(key_type_, certificate));
|
| + // Stop protecting against destruction. This could result in "delete this".
|
| + this_ = nullptr;
|
| + }
|
| +
|
| + rtc::scoped_refptr<RTCCertificateIdentityObserver> this_;
|
| + blink::WebRTCKeyType key_type_;
|
| + rtc::scoped_ptr<webrtc::DtlsIdentityStoreInterface> store_;
|
| + blink::WebCallbacks<blink::WebRTCCertificate*, void>* observer_;
|
| +};
|
| +
|
| +} // anonymous namespace
|
| +
|
| +void RTCCertificateGenerator::generateCertificate(
|
| + const blink::WebRTCKeyType& keyType,
|
| + const blink::WebURL& url,
|
| + const blink::WebURL& firstPartyForCookies,
|
| + blink::WebCallbacks<blink::WebRTCCertificate*, void>* observer) {
|
| + // TODO(hbos): Update conversion when rtc::KeyType has been updated.
|
| + rtc::KeyType rtc_key_type = rtc::IntKeyTypeFamilyToKeyType(
|
| + static_cast<int>(keyType.family()));
|
| +
|
| + content::PeerConnectionIdentityStore* store =
|
| + new content::PeerConnectionIdentityStore(url, firstPartyForCookies);
|
| +
|
| + rtc::scoped_refptr<RTCCertificateIdentityObserver> identity_observer(
|
| + new rtc::RefCountedObject<RTCCertificateIdentityObserver>(
|
| + keyType, store, observer));
|
| + identity_observer->Init(identity_observer);
|
| + store->RequestIdentity(rtc_key_type, identity_observer);
|
| +}
|
| +
|
| +} // namespace content
|
|
|