blob: 71a2c315d42a8dbb270dffde245f9746e99542ae [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
35 static OpenSSLKeyPair* Generate();
36
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
48 DISALLOW_EVIL_CONSTRUCTORS(OpenSSLKeyPair);
49};
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;
88 bool GetChain(SSLCertChain** chain) const override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000089
90 private:
91 void AddReference() const;
92
93 X509* x509_;
94
95 DISALLOW_EVIL_CONSTRUCTORS(OpenSSLCertificate);
96};
97
98// Holds a keypair and certificate together, and a method to generate
99// them consistently.
100class OpenSSLIdentity : public SSLIdentity {
101 public:
102 static OpenSSLIdentity* Generate(const std::string& common_name);
103 static OpenSSLIdentity* GenerateForTest(const SSLIdentityParams& params);
104 static SSLIdentity* FromPEMStrings(const std::string& private_key,
105 const std::string& certificate);
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000106 ~OpenSSLIdentity() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000107
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000108 const OpenSSLCertificate& certificate() const override;
109 OpenSSLIdentity* GetReference() const override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000110
111 // Configure an SSL context object to use our key and certificate.
112 bool ConfigureIdentity(SSL_CTX* ctx);
113
114 private:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000115 OpenSSLIdentity(OpenSSLKeyPair* key_pair, OpenSSLCertificate* certificate);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000116
117 static OpenSSLIdentity* GenerateInternal(const SSLIdentityParams& params);
118
119 scoped_ptr<OpenSSLKeyPair> key_pair_;
120 scoped_ptr<OpenSSLCertificate> certificate_;
121
122 DISALLOW_EVIL_CONSTRUCTORS(OpenSSLIdentity);
123};
124
125
126} // namespace rtc
127
128#endif // WEBRTC_BASE_OPENSSLIDENTITY_H_