xref: /aosp_15_r20/external/tink/cc/internal/ssl_unique_ptr.h (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang // Copyright 2021 Google LLC
2*e7b1675dSTing-Kang Chang //
3*e7b1675dSTing-Kang Chang // Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang // you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang // You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang //
7*e7b1675dSTing-Kang Chang //     http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang //
9*e7b1675dSTing-Kang Chang // Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang // distributed under the License is distributed on an "AS IS" BASIS,
11*e7b1675dSTing-Kang Chang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang // See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang // limitations under the License.
14*e7b1675dSTing-Kang Chang //
15*e7b1675dSTing-Kang Chang ///////////////////////////////////////////////////////////////////////////////
16*e7b1675dSTing-Kang Chang #ifndef TINK_INTERNAL_SSL_UNIQUE_PTR_H_
17*e7b1675dSTing-Kang Chang #define TINK_INTERNAL_SSL_UNIQUE_PTR_H_
18*e7b1675dSTing-Kang Chang 
19*e7b1675dSTing-Kang Chang #include <memory>
20*e7b1675dSTing-Kang Chang 
21*e7b1675dSTing-Kang Chang // Every header in BoringSSL includes base.h, which in turn defines
22*e7b1675dSTing-Kang Chang // OPENSSL_IS_BORINGSSL. So we include this common header here to "force" the
23*e7b1675dSTing-Kang Chang // definition of OPENSSL_IS_BORINGSSL in case BoringSSL is used.
24*e7b1675dSTing-Kang Chang #include "openssl/crypto.h"
25*e7b1675dSTing-Kang Chang 
26*e7b1675dSTing-Kang Chang #ifndef OPENSSL_IS_BORINGSSL
27*e7b1675dSTing-Kang Chang #include "openssl/bn.h"
28*e7b1675dSTing-Kang Chang #include "openssl/cmac.h"
29*e7b1675dSTing-Kang Chang #include "openssl/ec.h"
30*e7b1675dSTing-Kang Chang #include "openssl/evp.h"
31*e7b1675dSTing-Kang Chang #include "openssl/hmac.h"
32*e7b1675dSTing-Kang Chang #include "openssl/rsa.h"
33*e7b1675dSTing-Kang Chang #endif
34*e7b1675dSTing-Kang Chang 
35*e7b1675dSTing-Kang Chang namespace crypto {
36*e7b1675dSTing-Kang Chang namespace tink {
37*e7b1675dSTing-Kang Chang namespace internal {
38*e7b1675dSTing-Kang Chang 
39*e7b1675dSTing-Kang Chang #ifdef OPENSSL_IS_BORINGSSL
40*e7b1675dSTing-Kang Chang 
41*e7b1675dSTing-Kang Chang // In this case, simply use BoringSSL's UniquePtr.
42*e7b1675dSTing-Kang Chang template <typename T>
43*e7b1675dSTing-Kang Chang using SslUniquePtr = ::bssl::UniquePtr<T>;
44*e7b1675dSTing-Kang Chang 
45*e7b1675dSTing-Kang Chang #else
46*e7b1675dSTing-Kang Chang 
47*e7b1675dSTing-Kang Chang // We define SslUniquePtr similarly to how bssl::UniquePtr<T> is defined,
48*e7b1675dSTing-Kang Chang // i.e., as a unique_ptr with custom deleter for each type T. The difference
49*e7b1675dSTing-Kang Chang // w.r.t. the BoringSSL equivalent is that we have to define each deleter here
50*e7b1675dSTing-Kang Chang // explicitly, while bssl::UniquePtr allows for forward declaration and
51*e7b1675dSTing-Kang Chang // later specialization when including specific headers. This is possible in
52*e7b1675dSTing-Kang Chang // BoringSSL because each module's header defines the appropriate deleter with
53*e7b1675dSTing-Kang Chang // BORINGSSL_MAKE_DELETER, which is not the case for OpenSSL.
54*e7b1675dSTing-Kang Chang 
55*e7b1675dSTing-Kang Chang template <typename T>
56*e7b1675dSTing-Kang Chang struct Deleter {
57*e7b1675dSTing-Kang Chang   void operator()(T* ptr);
58*e7b1675dSTing-Kang Chang };
59*e7b1675dSTing-Kang Chang 
60*e7b1675dSTing-Kang Chang // Here are all the custom deleters.
61*e7b1675dSTing-Kang Chang template <>
62*e7b1675dSTing-Kang Chang struct Deleter<BIO> {
63*e7b1675dSTing-Kang Chang   void operator()(BIO* ptr) { BIO_free(ptr); }
64*e7b1675dSTing-Kang Chang };
65*e7b1675dSTing-Kang Chang template <>
66*e7b1675dSTing-Kang Chang struct Deleter<EVP_CIPHER_CTX> {
67*e7b1675dSTing-Kang Chang   void operator()(EVP_CIPHER_CTX* ptr) { EVP_CIPHER_CTX_free(ptr); }
68*e7b1675dSTing-Kang Chang };
69*e7b1675dSTing-Kang Chang template <>
70*e7b1675dSTing-Kang Chang struct Deleter<BIGNUM> {
71*e7b1675dSTing-Kang Chang   void operator()(BIGNUM* ptr) { BN_free(ptr); }
72*e7b1675dSTing-Kang Chang };
73*e7b1675dSTing-Kang Chang template <>
74*e7b1675dSTing-Kang Chang struct Deleter<BN_CTX> {
75*e7b1675dSTing-Kang Chang   void operator()(BN_CTX* ptr) { BN_CTX_free(ptr); }
76*e7b1675dSTing-Kang Chang };
77*e7b1675dSTing-Kang Chang template <>
78*e7b1675dSTing-Kang Chang struct Deleter<RSA> {
79*e7b1675dSTing-Kang Chang   void operator()(RSA* ptr) { RSA_free(ptr); }
80*e7b1675dSTing-Kang Chang };
81*e7b1675dSTing-Kang Chang template <>
82*e7b1675dSTing-Kang Chang struct Deleter<EC_POINT> {
83*e7b1675dSTing-Kang Chang   void operator()(EC_POINT* ptr) { EC_POINT_free(ptr); }
84*e7b1675dSTing-Kang Chang };
85*e7b1675dSTing-Kang Chang template <>
86*e7b1675dSTing-Kang Chang struct Deleter<EC_GROUP> {
87*e7b1675dSTing-Kang Chang   void operator()(EC_GROUP* ptr) { EC_GROUP_free(ptr); }
88*e7b1675dSTing-Kang Chang };
89*e7b1675dSTing-Kang Chang template <>
90*e7b1675dSTing-Kang Chang struct Deleter<EC_KEY> {
91*e7b1675dSTing-Kang Chang   void operator()(EC_KEY* ptr) { EC_KEY_free(ptr); }
92*e7b1675dSTing-Kang Chang };
93*e7b1675dSTing-Kang Chang template <>
94*e7b1675dSTing-Kang Chang struct Deleter<EVP_PKEY> {
95*e7b1675dSTing-Kang Chang   void operator()(EVP_PKEY* ptr) { EVP_PKEY_free(ptr); }
96*e7b1675dSTing-Kang Chang };
97*e7b1675dSTing-Kang Chang template <>
98*e7b1675dSTing-Kang Chang struct Deleter<EVP_PKEY_CTX> {
99*e7b1675dSTing-Kang Chang   void operator()(EVP_PKEY_CTX* ptr) { EVP_PKEY_CTX_free(ptr); }
100*e7b1675dSTing-Kang Chang };
101*e7b1675dSTing-Kang Chang template <>
102*e7b1675dSTing-Kang Chang struct Deleter<ECDSA_SIG> {
103*e7b1675dSTing-Kang Chang   void operator()(ECDSA_SIG* ptr) { ECDSA_SIG_free(ptr); }
104*e7b1675dSTing-Kang Chang };
105*e7b1675dSTing-Kang Chang template <>
106*e7b1675dSTing-Kang Chang struct Deleter<CMAC_CTX> {
107*e7b1675dSTing-Kang Chang   void operator()(CMAC_CTX* ptr) { CMAC_CTX_free(ptr); }
108*e7b1675dSTing-Kang Chang };
109*e7b1675dSTing-Kang Chang template <>
110*e7b1675dSTing-Kang Chang struct Deleter<EVP_MD_CTX> {
111*e7b1675dSTing-Kang Chang   void operator()(EVP_MD_CTX* ptr) { EVP_MD_CTX_free(ptr); }
112*e7b1675dSTing-Kang Chang };
113*e7b1675dSTing-Kang Chang template <>
114*e7b1675dSTing-Kang Chang struct Deleter<HMAC_CTX> {
115*e7b1675dSTing-Kang Chang   void operator()(HMAC_CTX* ptr) { HMAC_CTX_free(ptr); }
116*e7b1675dSTing-Kang Chang };
117*e7b1675dSTing-Kang Chang 
118*e7b1675dSTing-Kang Chang template <typename T>
119*e7b1675dSTing-Kang Chang using SslUniquePtr = std::unique_ptr<T, Deleter<T> >;
120*e7b1675dSTing-Kang Chang 
121*e7b1675dSTing-Kang Chang #endif  // OPENSSL_IS_BORINGSSL
122*e7b1675dSTing-Kang Chang 
123*e7b1675dSTing-Kang Chang }  // namespace internal
124*e7b1675dSTing-Kang Chang }  // namespace tink
125*e7b1675dSTing-Kang Chang }  // namespace crypto
126*e7b1675dSTing-Kang Chang 
127*e7b1675dSTing-Kang Chang #endif  // TINK_INTERNAL_SSL_UNIQUE_PTR_H_
128