| Index: webrtc/api/dtlsidentitystore.cc
|
| diff --git a/webrtc/api/dtlsidentitystore.cc b/webrtc/api/dtlsidentitystore.cc
|
| index bdccc10c1b03469a5995a047aae2198a83ba861b..3652e21877c7a702f2a484527e3865c7e9835593 100644
|
| --- a/webrtc/api/dtlsidentitystore.cc
|
| +++ b/webrtc/api/dtlsidentitystore.cc
|
| @@ -31,6 +31,50 @@ enum {
|
| MSG_GENERATE_IDENTITY_RESULT
|
| };
|
|
|
| +// A |DtlsIdentityRequestObserver| that informs an
|
| +// |RTCCertificateGeneratorCallback| of the result of an identity request. On
|
| +// success, a certificate is created using the identity before passing it to
|
| +// the callback.
|
| +class RTCCertificateStoreCallbackObserver
|
| + : public webrtc::DtlsIdentityRequestObserver {
|
| + public:
|
| + RTCCertificateStoreCallbackObserver(
|
| + const rtc::scoped_refptr<rtc::RTCCertificateGeneratorCallback>& callback)
|
| + : callback_(callback) {}
|
| +
|
| + private:
|
| + void OnFailure(int error) override {
|
| + LOG(LS_WARNING) << "DtlsIdentityRequestObserver failure code: " << error;
|
| + Callback(nullptr);
|
| + }
|
| + void OnSuccess(const std::string& der_cert,
|
| + const std::string& der_private_key) override {
|
| + 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());
|
| + std::unique_ptr<rtc::SSLIdentity> identity(
|
| + rtc::SSLIdentity::FromPEMStrings(pem_key, pem_cert));
|
| + OnSuccess(std::move(identity));
|
| + }
|
| + void OnSuccess(std::unique_ptr<rtc::SSLIdentity> identity) override {
|
| + Callback(rtc::RTCCertificate::Create(std::move(identity)));
|
| + }
|
| +
|
| + void Callback(rtc::scoped_refptr<rtc::RTCCertificate> certificate) {
|
| + if (certificate)
|
| + callback_->OnSuccess(certificate);
|
| + else
|
| + callback_->OnFailure();
|
| + }
|
| +
|
| + rtc::scoped_refptr<rtc::RTCCertificateGeneratorCallback> callback_;
|
| +};
|
| +
|
| } // namespace
|
|
|
| // This class runs on the worker thread to generate the identity. It's necessary
|
| @@ -148,7 +192,7 @@ bool DtlsIdentityStoreImpl::HasFreeIdentityForTesting(
|
|
|
| void DtlsIdentityStoreImpl::GenerateIdentity(
|
| rtc::KeyType key_type,
|
| - const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer) {
|
| + const rtc::scoped_refptr<DtlsIdentityRequestObserver>& observer) {
|
| RTC_DCHECK(signaling_thread_->IsCurrent());
|
|
|
| // Enqueue observer to be informed when generation of |key_type| is completed.
|
| @@ -228,4 +272,20 @@ void DtlsIdentityStoreImpl::OnIdentityGenerated(
|
| }
|
| }
|
|
|
| +RTCCertificateGeneratorStoreWrapper::RTCCertificateGeneratorStoreWrapper(
|
| + std::unique_ptr<DtlsIdentityStoreInterface> store)
|
| + : store_(std::move(store)) {
|
| + RTC_DCHECK(store_);
|
| +}
|
| +
|
| +void RTCCertificateGeneratorStoreWrapper::GenerateCertificateAsync(
|
| + const rtc::KeyParams& key_params,
|
| + const rtc::Optional<uint64_t>& expires_ms,
|
| + const rtc::scoped_refptr<rtc::RTCCertificateGeneratorCallback>& callback) {
|
| + store_->RequestIdentity(
|
| + key_params,
|
| + expires_ms,
|
| + new rtc::RefCountedObject<RTCCertificateStoreCallbackObserver>(callback));
|
| +}
|
| +
|
| } // namespace webrtc
|
|
|