12#include <openssl/pem.h>
13#include <openssl/ssl.h>
15#include "proto_fuzzer/tls_test_credentials.h"
17namespace proto_fuzzer {
24X509* ParseCertificate(
const char* pem) {
25 BIO* bio = BIO_new_mem_buf(pem, -1);
29 X509* certificate = PEM_read_bio_X509(bio,
nullptr,
nullptr,
nullptr);
37EVP_PKEY* ParsePrivateKey(
const char* pem) {
38 BIO* bio = BIO_new_mem_buf(pem, -1);
42 EVP_PKEY* key = PEM_read_bio_PrivateKey(bio,
nullptr,
nullptr,
nullptr);
52bool AddCachedExtraChainCertificate(SSL_CTX* context, X509* certificate) {
53 if (certificate ==
nullptr || X509_up_ref(certificate) != 1) {
56 if (SSL_CTX_add_extra_chain_cert(context, certificate) != 1) {
57 X509_free(certificate);
65class PrimaryCredentials {
69 : certificate_(ParseCertificate(tls_test_credentials::kCertificatePem)),
70 key_(ParsePrivateKey(tls_test_credentials::kPrivateKeyPem)) {}
73 ~PrimaryCredentials() {
74 X509_free(certificate_);
79 PrimaryCredentials(
const PrimaryCredentials&) =
delete;
81 PrimaryCredentials& operator=(
const PrimaryCredentials&) =
delete;
84 bool valid()
const {
return certificate_ !=
nullptr && key_ !=
nullptr; }
86 X509* certificate()
const {
return certificate_; }
88 EVP_PKEY* key()
const {
return key_; }
96class AuxiliaryCertificates {
99 AuxiliaryCertificates()
100 : rsa_(ParseCertificate(tls_test_credentials::kRsaCertificatePem)),
101 dsa_(ParseCertificate(tls_test_credentials::kDsaCertificatePem)),
102 dh_(ParseCertificate(tls_test_credentials::kDhCertificatePem)) {}
105 ~AuxiliaryCertificates() {
112 AuxiliaryCertificates(
const AuxiliaryCertificates&) =
delete;
114 AuxiliaryCertificates& operator=(
const AuxiliaryCertificates&) =
delete;
117 bool valid()
const {
return rsa_ !=
nullptr && dsa_ !=
nullptr && dh_ !=
nullptr; }
119 X509* rsa()
const {
return rsa_; }
121 X509* dsa()
const {
return dsa_; }
123 X509* dh()
const {
return dh_; }
132const PrimaryCredentials& CachedPrimaryCredentials() {
133 static const PrimaryCredentials credentials;
139const AuxiliaryCertificates& CachedAuxiliaryCertificates() {
140 static const AuxiliaryCertificates certificates;
155 curl::fuzzer::proto::TlsCertificateChainProfile certificate_chain) {
156 if (context ==
nullptr) {
160 const PrimaryCredentials& primary = CachedPrimaryCredentials();
161 if (!primary.valid() || SSL_CTX_use_certificate(context, primary.certificate()) != 1 ||
162 SSL_CTX_use_PrivateKey(context, primary.key()) != 1 || SSL_CTX_check_private_key(context) != 1) {
166 if (certificate_chain != curl::fuzzer::proto::TLS_CERTIFICATE_CHAIN_ALL_KEY_TYPES) {
170 const AuxiliaryCertificates& auxiliary = CachedAuxiliaryCertificates();
171 return auxiliary.valid() && AddCachedExtraChainCertificate(context, auxiliary.rsa()) &&
172 AddCachedExtraChainCertificate(context, auxiliary.dsa()) &&
173 AddCachedExtraChainCertificate(context, auxiliary.dh());
bool InstallCachedTlsTestCredentials(SSL_CTX *context, curl::fuzzer::proto::TlsCertificateChainProfile certificate_chain)
Install references to immutable, process-lifetime test credentials in one fresh TLS context.
Installs cached test credentials into fresh TLS contexts.