proxygen
OpenSSLPtrTypes.h
Go to the documentation of this file.
1 /*
2  * Copyright 2016-present Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <glog/logging.h>
20 
21 #include <folly/Memory.h>
23 
24 namespace folly {
25 namespace ssl {
26 
27 // helper which translates (DEFINE_SSL_PTR_TYPE(Foo, FOO, FOO_free); into
28 // using FooDeleter = folly::static_function_deleter<FOO, &FOO_free>;
29 // using FooUniquePtr = std::unique_ptr<FOO, FooDeleter>;
30 #define DEFINE_SSL_PTR_TYPE(alias, object, deleter) \
31  using alias##Deleter = folly::static_function_deleter<object, &deleter>; \
32  using alias##UniquePtr = std::unique_ptr<object, alias##Deleter>
33 
34 // ASN1
35 DEFINE_SSL_PTR_TYPE(ASN1Time, ASN1_TIME, ASN1_TIME_free);
36 DEFINE_SSL_PTR_TYPE(ASN1Ia5Str, ASN1_IA5STRING, ASN1_IA5STRING_free);
37 DEFINE_SSL_PTR_TYPE(ASN1Int, ASN1_INTEGER, ASN1_INTEGER_free);
38 DEFINE_SSL_PTR_TYPE(ASN1Obj, ASN1_OBJECT, ASN1_OBJECT_free);
39 DEFINE_SSL_PTR_TYPE(ASN1Str, ASN1_STRING, ASN1_STRING_free);
40 DEFINE_SSL_PTR_TYPE(ASN1Type, ASN1_TYPE, ASN1_TYPE_free);
41 DEFINE_SSL_PTR_TYPE(ASN1UTF8Str, ASN1_UTF8STRING, ASN1_UTF8STRING_free);
42 
43 // X509
44 DEFINE_SSL_PTR_TYPE(X509, X509, X509_free);
45 DEFINE_SSL_PTR_TYPE(X509Extension, X509_EXTENSION, X509_EXTENSION_free);
46 DEFINE_SSL_PTR_TYPE(X509Store, X509_STORE, X509_STORE_free);
47 DEFINE_SSL_PTR_TYPE(X509StoreCtx, X509_STORE_CTX, X509_STORE_CTX_free);
50 using X509VerifyParam =
51  std::unique_ptr<X509_VERIFY_PARAM, X509VerifyParamDeleter>;
52 
53 DEFINE_SSL_PTR_TYPE(GeneralName, GENERAL_NAME, GENERAL_NAME_free);
54 DEFINE_SSL_PTR_TYPE(GeneralNames, GENERAL_NAMES, GENERAL_NAMES_free);
56  AccessDescription,
57  ACCESS_DESCRIPTION,
58  ACCESS_DESCRIPTION_free);
60  AuthorityInfoAccess,
61  AUTHORITY_INFO_ACCESS,
62  AUTHORITY_INFO_ACCESS_free);
63 DEFINE_SSL_PTR_TYPE(DistPointName, DIST_POINT_NAME, DIST_POINT_NAME_free);
64 DEFINE_SSL_PTR_TYPE(DistPoint, DIST_POINT, DIST_POINT_free);
65 DEFINE_SSL_PTR_TYPE(CrlDistPoints, CRL_DIST_POINTS, CRL_DIST_POINTS_free);
66 DEFINE_SSL_PTR_TYPE(X509Crl, X509_CRL, X509_CRL_free);
67 DEFINE_SSL_PTR_TYPE(X509Name, X509_NAME, X509_NAME_free);
68 DEFINE_SSL_PTR_TYPE(X509Req, X509_REQ, X509_REQ_free);
69 DEFINE_SSL_PTR_TYPE(X509Revoked, X509_REVOKED, X509_REVOKED_free);
70 
71 // EVP
72 DEFINE_SSL_PTR_TYPE(EvpPkey, EVP_PKEY, EVP_PKEY_free);
73 using EvpPkeySharedPtr = std::shared_ptr<EVP_PKEY>;
74 
75 // No EVP_PKEY_CTX <= 0.9.8b
76 #if OPENSSL_VERSION_NUMBER >= 0x10000002L
77 DEFINE_SSL_PTR_TYPE(EvpPkeyCtx, EVP_PKEY_CTX, EVP_PKEY_CTX_free);
78 #else
79 struct EVP_PKEY_CTX;
80 #endif
81 
82 DEFINE_SSL_PTR_TYPE(EvpMdCtx, EVP_MD_CTX, EVP_MD_CTX_free);
83 DEFINE_SSL_PTR_TYPE(EvpCipherCtx, EVP_CIPHER_CTX, EVP_CIPHER_CTX_free);
84 
85 // HMAC
86 DEFINE_SSL_PTR_TYPE(HmacCtx, HMAC_CTX, HMAC_CTX_free);
87 
88 // BIO
89 DEFINE_SSL_PTR_TYPE(BioMethod, BIO_METHOD, BIO_meth_free);
90 DEFINE_SSL_PTR_TYPE(Bio, BIO, BIO_vfree);
91 DEFINE_SSL_PTR_TYPE(BioChain, BIO, BIO_free_all);
92 inline void BIO_free_fb(BIO* bio) {
93  CHECK_EQ(1, BIO_free(bio));
94 }
96 using BioUniquePtrFb = std::unique_ptr<BIO, BioDeleterFb>;
97 
98 // RSA and EC
99 DEFINE_SSL_PTR_TYPE(Rsa, RSA, RSA_free);
100 #ifndef OPENSSL_NO_EC
101 DEFINE_SSL_PTR_TYPE(EcKey, EC_KEY, EC_KEY_free);
102 DEFINE_SSL_PTR_TYPE(EcGroup, EC_GROUP, EC_GROUP_free);
103 DEFINE_SSL_PTR_TYPE(EcPoint, EC_POINT, EC_POINT_free);
104 DEFINE_SSL_PTR_TYPE(EcdsaSig, ECDSA_SIG, ECDSA_SIG_free);
105 #endif
106 
107 // BIGNUMs
108 DEFINE_SSL_PTR_TYPE(BIGNUM, BIGNUM, BN_clear_free);
109 DEFINE_SSL_PTR_TYPE(BNCtx, BN_CTX, BN_CTX_free);
110 
111 // SSL and SSL_CTX
112 DEFINE_SSL_PTR_TYPE(SSL, SSL, SSL_free);
113 DEFINE_SSL_PTR_TYPE(SSLSession, SSL_SESSION, SSL_SESSION_free);
114 
115 #undef DEFINE_SSL_PTR_TYPE
116 } // namespace ssl
117 } // namespace folly
void BIO_meth_free(BIO_METHOD *biom)
Definition: OpenSSL.cpp:132
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
void BIO_free_fb(BIO *bio)
void EVP_MD_CTX_free(EVP_MD_CTX *ctx)
Definition: OpenSSL.cpp:330
void HMAC_CTX_free(HMAC_CTX *ctx)
Definition: OpenSSL.cpp:346
#define DEFINE_SSL_PTR_TYPE(alias, object, deleter)
std::unique_ptr< BIO, BioDeleterFb > BioUniquePtrFb
std::shared_ptr< EVP_PKEY > EvpPkeySharedPtr
std::unique_ptr< X509_VERIFY_PARAM, X509VerifyParamDeleter > X509VerifyParam