blob: 8b30e6092a5b53c1e1d09dd5d7c61ce914b432f7 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 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
11#ifndef WEBRTC_BASE_OPENSSLIDENTITY_H_
12#define WEBRTC_BASE_OPENSSLIDENTITY_H_
13
14#include <openssl/evp.h>
15#include <openssl/x509.h>
16
17#include <string>
18
19#include "webrtc/base/common.h"
20#include "webrtc/base/scoped_ptr.h"
21#include "webrtc/base/sslidentity.h"
22
23typedef struct ssl_ctx_st SSL_CTX;
24
25namespace rtc {
26
27// OpenSSLKeyPair encapsulates an OpenSSL EVP_PKEY* keypair object,
28// which is reference counted inside the OpenSSL library.
29class OpenSSLKeyPair {
30 public:
31 explicit OpenSSLKeyPair(EVP_PKEY* pkey) : pkey_(pkey) {
32 ASSERT(pkey_ != NULL);
33 }
34
torbjorng4e572472015-10-08 09:42:49 -070035 static OpenSSLKeyPair* Generate(const KeyParams& key_params);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000036
37 virtual ~OpenSSLKeyPair();
38
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000039 virtual OpenSSLKeyPair* GetReference();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000040
41 EVP_PKEY* pkey() const { return pkey_; }
42
43 private:
44 void AddReference();
45
46 EVP_PKEY* pkey_;
47
henrikg3c089d72015-09-16 05:37:44 -070048 RTC_DISALLOW_COPY_AND_ASSIGN(OpenSSLKeyPair);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000049};
50
51// OpenSSLCertificate encapsulates an OpenSSL X509* certificate object,
52// which is also reference counted inside the OpenSSL library.
53class OpenSSLCertificate : public SSLCertificate {
54 public:
55 // Caller retains ownership of the X509 object.
56 explicit OpenSSLCertificate(X509* x509) : x509_(x509) {
57 AddReference();
58 }
59
60 static OpenSSLCertificate* Generate(OpenSSLKeyPair* key_pair,
61 const SSLIdentityParams& params);
62 static OpenSSLCertificate* FromPEMString(const std::string& pem_string);
63
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000064 ~OpenSSLCertificate() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000065
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000066 OpenSSLCertificate* GetReference() const override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000067
68 X509* x509() const { return x509_; }
69
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000070 std::string ToPEMString() const override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000071
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000072 void ToDER(Buffer* der_buffer) const override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000073
74 // Compute the digest of the certificate given algorithm
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000075 bool ComputeDigest(const std::string& algorithm,
76 unsigned char* digest,
77 size_t size,
78 size_t* length) const override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000079
80 // Compute the digest of a certificate as an X509 *
81 static bool ComputeDigest(const X509* x509,
82 const std::string& algorithm,
83 unsigned char* digest,
84 size_t size,
85 size_t* length);
86
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000087 bool GetSignatureDigestAlgorithm(std::string* algorithm) const override;
kwibergf5d47862016-03-15 12:53:24 -070088 rtc::scoped_ptr<SSLCertChain> GetChain() const override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000089
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +010090 int64_t CertificateExpirationTime() const override;
91
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000092 private:
93 void AddReference() const;
94
95 X509* x509_;
96
henrikg3c089d72015-09-16 05:37:44 -070097 RTC_DISALLOW_COPY_AND_ASSIGN(OpenSSLCertificate);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000098};
99
100// Holds a keypair and certificate together, and a method to generate
101// them consistently.
102class OpenSSLIdentity : public SSLIdentity {
103 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200104 static OpenSSLIdentity* Generate(const std::string& common_name,
torbjornge8dc0812016-02-15 09:35:54 -0800105 const KeyParams& key_params,
106 time_t certificate_lifetime);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000107 static OpenSSLIdentity* GenerateForTest(const SSLIdentityParams& params);
108 static SSLIdentity* FromPEMStrings(const std::string& private_key,
109 const std::string& certificate);
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000110 ~OpenSSLIdentity() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000111
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000112 const OpenSSLCertificate& certificate() const override;
113 OpenSSLIdentity* GetReference() const override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000114
115 // Configure an SSL context object to use our key and certificate.
116 bool ConfigureIdentity(SSL_CTX* ctx);
117
118 private:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000119 OpenSSLIdentity(OpenSSLKeyPair* key_pair, OpenSSLCertificate* certificate);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000120
121 static OpenSSLIdentity* GenerateInternal(const SSLIdentityParams& params);
122
123 scoped_ptr<OpenSSLKeyPair> key_pair_;
124 scoped_ptr<OpenSSLCertificate> certificate_;
125
henrikg3c089d72015-09-16 05:37:44 -0700126 RTC_DISALLOW_COPY_AND_ASSIGN(OpenSSLIdentity);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000127};
128
129
130} // namespace rtc
131
132#endif // WEBRTC_BASE_OPENSSLIDENTITY_H_