|
Packit |
c4476c |
/*
|
|
Packit |
c4476c |
* Copyright 1998-2001 The OpenSSL Project Authors. All Rights Reserved.
|
|
Packit |
c4476c |
*
|
|
Packit |
c4476c |
* Licensed under the OpenSSL license (the "License"). You may not use
|
|
Packit |
c4476c |
* this file except in compliance with the License. You can obtain a copy
|
|
Packit |
c4476c |
* in the file LICENSE in the source distribution or at
|
|
Packit |
c4476c |
* https://www.openssl.org/source/license.html
|
|
Packit |
c4476c |
*/
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
#ifndef OSSL_TEST_SHIM_INCLUDE_OPENSSL_BASE_H
|
|
Packit |
c4476c |
#define OSSL_TEST_SHIM_INCLUDE_OPENSSL_BASE_H
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
/* Needed for BORINGSSL_MAKE_DELETER */
|
|
Packit |
c4476c |
# include <openssl/bio.h>
|
|
Packit |
c4476c |
# include <openssl/evp.h>
|
|
Packit |
c4476c |
# include <openssl/dh.h>
|
|
Packit |
c4476c |
# include <openssl/x509.h>
|
|
Packit |
c4476c |
# include <openssl/ssl.h>
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
# define OPENSSL_ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
extern "C++" {
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
#include <memory>
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
namespace bssl {
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
namespace internal {
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
template <typename T>
|
|
Packit |
c4476c |
struct DeleterImpl {};
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
template <typename T>
|
|
Packit |
c4476c |
struct Deleter {
|
|
Packit |
c4476c |
void operator()(T *ptr) {
|
|
Packit |
c4476c |
// Rather than specialize Deleter for each type, we specialize
|
|
Packit |
c4476c |
// DeleterImpl. This allows bssl::UniquePtr<T> to be used while only
|
|
Packit |
c4476c |
// including base.h as long as the destructor is not emitted. This matches
|
|
Packit |
c4476c |
// std::unique_ptr's behavior on forward-declared types.
|
|
Packit |
c4476c |
//
|
|
Packit |
c4476c |
// DeleterImpl itself is specialized in the corresponding module's header
|
|
Packit |
c4476c |
// and must be included to release an object. If not included, the compiler
|
|
Packit |
c4476c |
// will error that DeleterImpl<T> does not have a method Free.
|
|
Packit |
c4476c |
DeleterImpl<T>::Free(ptr);
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
};
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
template
|
|
Packit |
c4476c |
CleanupRet (*cleanup)(T *)>
|
|
Packit |
c4476c |
class StackAllocated {
|
|
Packit |
c4476c |
public:
|
|
Packit |
c4476c |
StackAllocated() { init(&ctx_); }
|
|
Packit |
c4476c |
~StackAllocated() { cleanup(&ctx_); }
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
StackAllocated(const StackAllocated<T, CleanupRet, init, cleanup> &) = delete;
|
|
Packit |
c4476c |
T& operator=(const StackAllocated<T, CleanupRet, init, cleanup> &) = delete;
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
T *get() { return &ctx;; }
|
|
Packit |
c4476c |
const T *get() const { return &ctx;; }
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
void Reset() {
|
|
Packit |
c4476c |
cleanup(&ctx_);
|
|
Packit |
c4476c |
init(&ctx_);
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
private:
|
|
Packit |
c4476c |
T ctx_;
|
|
Packit |
c4476c |
};
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
} // namespace internal
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
#define BORINGSSL_MAKE_DELETER(type, deleter) \
|
|
Packit |
c4476c |
namespace internal { \
|
|
Packit |
c4476c |
template <> \
|
|
Packit |
c4476c |
struct DeleterImpl<type> { \
|
|
Packit |
c4476c |
static void Free(type *ptr) { deleter(ptr); } \
|
|
Packit |
c4476c |
}; \
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
// This makes a unique_ptr to STACK_OF(type) that owns all elements on the
|
|
Packit |
c4476c |
// stack, i.e. it uses sk_pop_free() to clean up.
|
|
Packit |
c4476c |
#define BORINGSSL_MAKE_STACK_DELETER(type, deleter) \
|
|
Packit |
c4476c |
namespace internal { \
|
|
Packit |
c4476c |
template <> \
|
|
Packit |
c4476c |
struct DeleterImpl<STACK_OF(type)> { \
|
|
Packit |
c4476c |
static void Free(STACK_OF(type) *ptr) { \
|
|
Packit |
c4476c |
sk_##type##_pop_free(ptr, deleter); \
|
|
Packit |
c4476c |
} \
|
|
Packit |
c4476c |
}; \
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
// Holds ownership of heap-allocated BoringSSL structures. Sample usage:
|
|
Packit |
c4476c |
// bssl::UniquePtr<BIO> rsa(RSA_new());
|
|
Packit |
c4476c |
// bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
|
|
Packit |
c4476c |
template <typename T>
|
|
Packit |
c4476c |
using UniquePtr = std::unique_ptr<T, internal::Deleter<T>>;
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
BORINGSSL_MAKE_DELETER(BIO, BIO_free)
|
|
Packit |
c4476c |
BORINGSSL_MAKE_DELETER(EVP_PKEY, EVP_PKEY_free)
|
|
Packit |
c4476c |
BORINGSSL_MAKE_DELETER(DH, DH_free)
|
|
Packit |
c4476c |
BORINGSSL_MAKE_DELETER(X509, X509_free)
|
|
Packit |
c4476c |
BORINGSSL_MAKE_DELETER(SSL, SSL_free)
|
|
Packit |
c4476c |
BORINGSSL_MAKE_DELETER(SSL_CTX, SSL_CTX_free)
|
|
Packit |
c4476c |
BORINGSSL_MAKE_DELETER(SSL_SESSION, SSL_SESSION_free)
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
} // namespace bssl
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
} /* extern C++ */
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
#endif /* OSSL_TEST_SHIM_INCLUDE_OPENSSL_BASE_H */
|