blob: db1762a0e5018f711b3b5a2fbbc15789fe8eec9f [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2012 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef RTC_BASE_FAKESSLIDENTITY_H_
12#define RTC_BASE_FAKESSLIDENTITY_H_
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000013
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020014#include <algorithm>
15#include <memory>
16#include <vector>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000017
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "rtc_base/checks.h"
19#include "rtc_base/messagedigest.h"
20#include "rtc_base/sslidentity.h"
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020021
22namespace rtc {
23
24class FakeSSLCertificate : public rtc::SSLCertificate {
25 public:
26 // SHA-1 is the default digest algorithm because it is available in all build
27 // configurations used for unit testing.
28 explicit FakeSSLCertificate(const std::string& data)
29 : data_(data), digest_algorithm_(DIGEST_SHA_1), expiration_time_(-1) {}
30 explicit FakeSSLCertificate(const std::vector<std::string>& certs)
31 : data_(certs.front()),
32 digest_algorithm_(DIGEST_SHA_1),
33 expiration_time_(-1) {
34 std::vector<std::string>::const_iterator it;
35 // Skip certs[0].
36 for (it = certs.begin() + 1; it != certs.end(); ++it) {
37 certs_.push_back(FakeSSLCertificate(*it));
38 }
39 }
40 FakeSSLCertificate* GetReference() const override {
41 return new FakeSSLCertificate(*this);
42 }
43 std::string ToPEMString() const override {
44 return data_;
45 }
46 void ToDER(Buffer* der_buffer) const override {
47 std::string der_string;
48 RTC_CHECK(SSLIdentity::PemToDer(kPemTypeCertificate, data_, &der_string));
49 der_buffer->SetData(der_string.c_str(), der_string.size());
50 }
51 int64_t CertificateExpirationTime() const override {
52 return expiration_time_;
53 }
54 void SetCertificateExpirationTime(int64_t expiration_time) {
55 expiration_time_ = expiration_time;
56 }
57 void set_digest_algorithm(const std::string& algorithm) {
58 digest_algorithm_ = algorithm;
59 }
60 bool GetSignatureDigestAlgorithm(std::string* algorithm) const override {
61 *algorithm = digest_algorithm_;
62 return true;
63 }
64 bool ComputeDigest(const std::string& algorithm,
65 unsigned char* digest,
66 size_t size,
67 size_t* length) const override {
68 *length = rtc::ComputeDigest(algorithm, data_.c_str(), data_.size(),
69 digest, size);
70 return (*length != 0);
71 }
72 std::unique_ptr<SSLCertChain> GetChain() const override {
73 if (certs_.empty())
74 return nullptr;
75 std::vector<SSLCertificate*> new_certs(certs_.size());
76 std::transform(certs_.begin(), certs_.end(), new_certs.begin(), DupCert);
77 std::unique_ptr<SSLCertChain> chain(new SSLCertChain(new_certs));
78 std::for_each(new_certs.begin(), new_certs.end(), DeleteCert);
79 return chain;
80 }
81
82 private:
83 static FakeSSLCertificate* DupCert(FakeSSLCertificate cert) {
84 return cert.GetReference();
85 }
86 static void DeleteCert(SSLCertificate* cert) { delete cert; }
87 std::string data_;
88 std::vector<FakeSSLCertificate> certs_;
89 std::string digest_algorithm_;
90 // Expiration time in seconds relative to epoch, 1970-01-01T00:00:00Z (UTC).
91 int64_t expiration_time_;
92};
93
94class FakeSSLIdentity : public rtc::SSLIdentity {
95 public:
96 explicit FakeSSLIdentity(const std::string& data) : cert_(data) {}
97 explicit FakeSSLIdentity(const FakeSSLCertificate& cert) : cert_(cert) {}
98 virtual FakeSSLIdentity* GetReference() const {
99 return new FakeSSLIdentity(*this);
100 }
101 virtual const FakeSSLCertificate& certificate() const { return cert_; }
102 virtual std::string PrivateKeyToPEMString() const {
103 RTC_NOTREACHED(); // Not implemented.
104 return "";
105 }
106 virtual std::string PublicKeyToPEMString() const {
107 RTC_NOTREACHED(); // Not implemented.
108 return "";
109 }
110 virtual bool operator==(const SSLIdentity& other) const {
111 RTC_NOTREACHED(); // Not implemented.
112 return false;
113 }
114 private:
115 FakeSSLCertificate cert_;
116};
117
118} // namespace rtc
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000119
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200120#endif // RTC_BASE_FAKESSLIDENTITY_H_