1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright 2017 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/fake_ssl_identity.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <memory>
14*d9f75844SAndroid Build Coastguard Worker #include <string>
15*d9f75844SAndroid Build Coastguard Worker #include <utility>
16*d9f75844SAndroid Build Coastguard Worker
17*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
19*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/message_digest.h"
20*d9f75844SAndroid Build Coastguard Worker
21*d9f75844SAndroid Build Coastguard Worker namespace rtc {
22*d9f75844SAndroid Build Coastguard Worker
FakeSSLCertificate(absl::string_view pem_string)23*d9f75844SAndroid Build Coastguard Worker FakeSSLCertificate::FakeSSLCertificate(absl::string_view pem_string)
24*d9f75844SAndroid Build Coastguard Worker : pem_string_(pem_string),
25*d9f75844SAndroid Build Coastguard Worker digest_algorithm_(DIGEST_SHA_1),
26*d9f75844SAndroid Build Coastguard Worker expiration_time_(-1) {}
27*d9f75844SAndroid Build Coastguard Worker
28*d9f75844SAndroid Build Coastguard Worker FakeSSLCertificate::FakeSSLCertificate(const FakeSSLCertificate&) = default;
29*d9f75844SAndroid Build Coastguard Worker
30*d9f75844SAndroid Build Coastguard Worker FakeSSLCertificate::~FakeSSLCertificate() = default;
31*d9f75844SAndroid Build Coastguard Worker
Clone() const32*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<SSLCertificate> FakeSSLCertificate::Clone() const {
33*d9f75844SAndroid Build Coastguard Worker return std::make_unique<FakeSSLCertificate>(*this);
34*d9f75844SAndroid Build Coastguard Worker }
35*d9f75844SAndroid Build Coastguard Worker
ToPEMString() const36*d9f75844SAndroid Build Coastguard Worker std::string FakeSSLCertificate::ToPEMString() const {
37*d9f75844SAndroid Build Coastguard Worker return pem_string_;
38*d9f75844SAndroid Build Coastguard Worker }
39*d9f75844SAndroid Build Coastguard Worker
ToDER(Buffer * der_buffer) const40*d9f75844SAndroid Build Coastguard Worker void FakeSSLCertificate::ToDER(Buffer* der_buffer) const {
41*d9f75844SAndroid Build Coastguard Worker std::string der_string;
42*d9f75844SAndroid Build Coastguard Worker RTC_CHECK(
43*d9f75844SAndroid Build Coastguard Worker SSLIdentity::PemToDer(kPemTypeCertificate, pem_string_, &der_string));
44*d9f75844SAndroid Build Coastguard Worker der_buffer->SetData(der_string.c_str(), der_string.size());
45*d9f75844SAndroid Build Coastguard Worker }
46*d9f75844SAndroid Build Coastguard Worker
CertificateExpirationTime() const47*d9f75844SAndroid Build Coastguard Worker int64_t FakeSSLCertificate::CertificateExpirationTime() const {
48*d9f75844SAndroid Build Coastguard Worker return expiration_time_;
49*d9f75844SAndroid Build Coastguard Worker }
50*d9f75844SAndroid Build Coastguard Worker
SetCertificateExpirationTime(int64_t expiration_time)51*d9f75844SAndroid Build Coastguard Worker void FakeSSLCertificate::SetCertificateExpirationTime(int64_t expiration_time) {
52*d9f75844SAndroid Build Coastguard Worker expiration_time_ = expiration_time;
53*d9f75844SAndroid Build Coastguard Worker }
54*d9f75844SAndroid Build Coastguard Worker
set_digest_algorithm(absl::string_view algorithm)55*d9f75844SAndroid Build Coastguard Worker void FakeSSLCertificate::set_digest_algorithm(absl::string_view algorithm) {
56*d9f75844SAndroid Build Coastguard Worker digest_algorithm_ = std::string(algorithm);
57*d9f75844SAndroid Build Coastguard Worker }
58*d9f75844SAndroid Build Coastguard Worker
GetSignatureDigestAlgorithm(std::string * algorithm) const59*d9f75844SAndroid Build Coastguard Worker bool FakeSSLCertificate::GetSignatureDigestAlgorithm(
60*d9f75844SAndroid Build Coastguard Worker std::string* algorithm) const {
61*d9f75844SAndroid Build Coastguard Worker *algorithm = digest_algorithm_;
62*d9f75844SAndroid Build Coastguard Worker return true;
63*d9f75844SAndroid Build Coastguard Worker }
64*d9f75844SAndroid Build Coastguard Worker
ComputeDigest(absl::string_view algorithm,unsigned char * digest,size_t size,size_t * length) const65*d9f75844SAndroid Build Coastguard Worker bool FakeSSLCertificate::ComputeDigest(absl::string_view algorithm,
66*d9f75844SAndroid Build Coastguard Worker unsigned char* digest,
67*d9f75844SAndroid Build Coastguard Worker size_t size,
68*d9f75844SAndroid Build Coastguard Worker size_t* length) const {
69*d9f75844SAndroid Build Coastguard Worker *length = rtc::ComputeDigest(algorithm, pem_string_.c_str(),
70*d9f75844SAndroid Build Coastguard Worker pem_string_.size(), digest, size);
71*d9f75844SAndroid Build Coastguard Worker return (*length != 0);
72*d9f75844SAndroid Build Coastguard Worker }
73*d9f75844SAndroid Build Coastguard Worker
FakeSSLIdentity(absl::string_view pem_string)74*d9f75844SAndroid Build Coastguard Worker FakeSSLIdentity::FakeSSLIdentity(absl::string_view pem_string)
75*d9f75844SAndroid Build Coastguard Worker : FakeSSLIdentity(FakeSSLCertificate(pem_string)) {}
76*d9f75844SAndroid Build Coastguard Worker
FakeSSLIdentity(const std::vector<std::string> & pem_strings)77*d9f75844SAndroid Build Coastguard Worker FakeSSLIdentity::FakeSSLIdentity(const std::vector<std::string>& pem_strings) {
78*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<SSLCertificate>> certs;
79*d9f75844SAndroid Build Coastguard Worker certs.reserve(pem_strings.size());
80*d9f75844SAndroid Build Coastguard Worker for (const std::string& pem_string : pem_strings) {
81*d9f75844SAndroid Build Coastguard Worker certs.push_back(std::make_unique<FakeSSLCertificate>(pem_string));
82*d9f75844SAndroid Build Coastguard Worker }
83*d9f75844SAndroid Build Coastguard Worker cert_chain_ = std::make_unique<SSLCertChain>(std::move(certs));
84*d9f75844SAndroid Build Coastguard Worker }
85*d9f75844SAndroid Build Coastguard Worker
FakeSSLIdentity(const FakeSSLCertificate & cert)86*d9f75844SAndroid Build Coastguard Worker FakeSSLIdentity::FakeSSLIdentity(const FakeSSLCertificate& cert)
87*d9f75844SAndroid Build Coastguard Worker : cert_chain_(std::make_unique<SSLCertChain>(cert.Clone())) {}
88*d9f75844SAndroid Build Coastguard Worker
FakeSSLIdentity(const FakeSSLIdentity & o)89*d9f75844SAndroid Build Coastguard Worker FakeSSLIdentity::FakeSSLIdentity(const FakeSSLIdentity& o)
90*d9f75844SAndroid Build Coastguard Worker : cert_chain_(o.cert_chain_->Clone()) {}
91*d9f75844SAndroid Build Coastguard Worker
92*d9f75844SAndroid Build Coastguard Worker FakeSSLIdentity::~FakeSSLIdentity() = default;
93*d9f75844SAndroid Build Coastguard Worker
CloneInternal() const94*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<SSLIdentity> FakeSSLIdentity::CloneInternal() const {
95*d9f75844SAndroid Build Coastguard Worker return std::make_unique<FakeSSLIdentity>(*this);
96*d9f75844SAndroid Build Coastguard Worker }
97*d9f75844SAndroid Build Coastguard Worker
certificate() const98*d9f75844SAndroid Build Coastguard Worker const SSLCertificate& FakeSSLIdentity::certificate() const {
99*d9f75844SAndroid Build Coastguard Worker return cert_chain_->Get(0);
100*d9f75844SAndroid Build Coastguard Worker }
101*d9f75844SAndroid Build Coastguard Worker
cert_chain() const102*d9f75844SAndroid Build Coastguard Worker const SSLCertChain& FakeSSLIdentity::cert_chain() const {
103*d9f75844SAndroid Build Coastguard Worker return *cert_chain_.get();
104*d9f75844SAndroid Build Coastguard Worker }
105*d9f75844SAndroid Build Coastguard Worker
PrivateKeyToPEMString() const106*d9f75844SAndroid Build Coastguard Worker std::string FakeSSLIdentity::PrivateKeyToPEMString() const {
107*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_NOTREACHED(); // Not implemented.
108*d9f75844SAndroid Build Coastguard Worker return "";
109*d9f75844SAndroid Build Coastguard Worker }
110*d9f75844SAndroid Build Coastguard Worker
PublicKeyToPEMString() const111*d9f75844SAndroid Build Coastguard Worker std::string FakeSSLIdentity::PublicKeyToPEMString() const {
112*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_NOTREACHED(); // Not implemented.
113*d9f75844SAndroid Build Coastguard Worker return "";
114*d9f75844SAndroid Build Coastguard Worker }
115*d9f75844SAndroid Build Coastguard Worker
operator ==(const SSLIdentity & other) const116*d9f75844SAndroid Build Coastguard Worker bool FakeSSLIdentity::operator==(const SSLIdentity& other) const {
117*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_NOTREACHED(); // Not implemented.
118*d9f75844SAndroid Build Coastguard Worker return false;
119*d9f75844SAndroid Build Coastguard Worker }
120*d9f75844SAndroid Build Coastguard Worker
121*d9f75844SAndroid Build Coastguard Worker } // namespace rtc
122