1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2015 The WebRTC Project Authors. All rights reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/rtc_certificate.h" 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker #include <memory> 14*d9f75844SAndroid Build Coastguard Worker 15*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h" 16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ssl_certificate.h" 17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ssl_identity.h" 18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/time_utils.h" 19*d9f75844SAndroid Build Coastguard Worker 20*d9f75844SAndroid Build Coastguard Worker namespace rtc { 21*d9f75844SAndroid Build Coastguard Worker Create(std::unique_ptr<SSLIdentity> identity)22*d9f75844SAndroid Build Coastguard Workerscoped_refptr<RTCCertificate> RTCCertificate::Create( 23*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<SSLIdentity> identity) { 24*d9f75844SAndroid Build Coastguard Worker // Explicit new to access proteced constructor. 25*d9f75844SAndroid Build Coastguard Worker return rtc::scoped_refptr<RTCCertificate>( 26*d9f75844SAndroid Build Coastguard Worker new RTCCertificate(identity.release())); 27*d9f75844SAndroid Build Coastguard Worker } 28*d9f75844SAndroid Build Coastguard Worker RTCCertificate(SSLIdentity * identity)29*d9f75844SAndroid Build Coastguard WorkerRTCCertificate::RTCCertificate(SSLIdentity* identity) : identity_(identity) { 30*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(identity_); 31*d9f75844SAndroid Build Coastguard Worker } 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Worker RTCCertificate::~RTCCertificate() = default; 34*d9f75844SAndroid Build Coastguard Worker Expires() const35*d9f75844SAndroid Build Coastguard Workeruint64_t RTCCertificate::Expires() const { 36*d9f75844SAndroid Build Coastguard Worker int64_t expires = GetSSLCertificate().CertificateExpirationTime(); 37*d9f75844SAndroid Build Coastguard Worker if (expires != -1) 38*d9f75844SAndroid Build Coastguard Worker return static_cast<uint64_t>(expires) * kNumMillisecsPerSec; 39*d9f75844SAndroid Build Coastguard Worker // If the expiration time could not be retrieved return an expired timestamp. 40*d9f75844SAndroid Build Coastguard Worker return 0; // = 1970-01-01 41*d9f75844SAndroid Build Coastguard Worker } 42*d9f75844SAndroid Build Coastguard Worker HasExpired(uint64_t now) const43*d9f75844SAndroid Build Coastguard Workerbool RTCCertificate::HasExpired(uint64_t now) const { 44*d9f75844SAndroid Build Coastguard Worker return Expires() <= now; 45*d9f75844SAndroid Build Coastguard Worker } 46*d9f75844SAndroid Build Coastguard Worker GetSSLCertificate() const47*d9f75844SAndroid Build Coastguard Workerconst SSLCertificate& RTCCertificate::GetSSLCertificate() const { 48*d9f75844SAndroid Build Coastguard Worker return identity_->certificate(); 49*d9f75844SAndroid Build Coastguard Worker } 50*d9f75844SAndroid Build Coastguard Worker GetSSLCertificateChain() const51*d9f75844SAndroid Build Coastguard Workerconst SSLCertChain& RTCCertificate::GetSSLCertificateChain() const { 52*d9f75844SAndroid Build Coastguard Worker return identity_->cert_chain(); 53*d9f75844SAndroid Build Coastguard Worker } 54*d9f75844SAndroid Build Coastguard Worker ToPEM() const55*d9f75844SAndroid Build Coastguard WorkerRTCCertificatePEM RTCCertificate::ToPEM() const { 56*d9f75844SAndroid Build Coastguard Worker return RTCCertificatePEM(identity_->PrivateKeyToPEMString(), 57*d9f75844SAndroid Build Coastguard Worker GetSSLCertificate().ToPEMString()); 58*d9f75844SAndroid Build Coastguard Worker } 59*d9f75844SAndroid Build Coastguard Worker FromPEM(const RTCCertificatePEM & pem)60*d9f75844SAndroid Build Coastguard Workerscoped_refptr<RTCCertificate> RTCCertificate::FromPEM( 61*d9f75844SAndroid Build Coastguard Worker const RTCCertificatePEM& pem) { 62*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<SSLIdentity> identity( 63*d9f75844SAndroid Build Coastguard Worker SSLIdentity::CreateFromPEMStrings(pem.private_key(), pem.certificate())); 64*d9f75844SAndroid Build Coastguard Worker if (!identity) 65*d9f75844SAndroid Build Coastguard Worker return nullptr; 66*d9f75844SAndroid Build Coastguard Worker return RTCCertificate::Create(std::move(identity)); 67*d9f75844SAndroid Build Coastguard Worker } 68*d9f75844SAndroid Build Coastguard Worker operator ==(const RTCCertificate & certificate) const69*d9f75844SAndroid Build Coastguard Workerbool RTCCertificate::operator==(const RTCCertificate& certificate) const { 70*d9f75844SAndroid Build Coastguard Worker return *this->identity_ == *certificate.identity_; 71*d9f75844SAndroid Build Coastguard Worker } 72*d9f75844SAndroid Build Coastguard Worker operator !=(const RTCCertificate & certificate) const73*d9f75844SAndroid Build Coastguard Workerbool RTCCertificate::operator!=(const RTCCertificate& certificate) const { 74*d9f75844SAndroid Build Coastguard Worker return !(*this == certificate); 75*d9f75844SAndroid Build Coastguard Worker } 76*d9f75844SAndroid Build Coastguard Worker 77*d9f75844SAndroid Build Coastguard Worker } // namespace rtc 78