// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UTIL_CRYPTO_OPENSSL_UTIL_H_ #define UTIL_CRYPTO_OPENSSL_UTIL_H_ #include #include #include "platform/base/location.h" #include "platform/base/macros.h" namespace openscreen { // Initialize OpenSSL if it isn't already initialized. This must be called // before any other OpenSSL functions though it is safe and cheap to call this // multiple times. // This function is thread-safe, and OpenSSL will only ever be initialized once. // OpenSSL will be properly shut down on program exit. // Multiple sequential calls to EnsureOpenSSLInit or EnsureOpenSSLCleanup are // ignored by OpenSSL itself. void EnsureOpenSSLInit(); void EnsureOpenSSLCleanup(); // Drains the OpenSSL ERR_get_error stack. On a debug build the error codes // are send to VLOG(1), on a release build they are disregarded. In most // cases you should pass CURRENT_LOCATION as the |location|. void ClearOpenSSLERRStack(const Location& location); // Place an instance of this class on the call stack to automatically clear // the OpenSSL error stack on function exit. class OpenSSLErrStackTracer { public: // Pass CURRENT_LOCATION as |location|, to help track the source of OpenSSL // error messages. Note any diagnostic emitted will be tagged with the // location of the constructor call as it's not possible to trace a // destructor's callsite. explicit OpenSSLErrStackTracer(const Location& location) : location_(location) { EnsureOpenSSLInit(); } ~OpenSSLErrStackTracer() { ClearOpenSSLERRStack(location_); } private: const Location location_; OSP_DISALLOW_IMPLICIT_CONSTRUCTORS(OpenSSLErrStackTracer); }; } // namespace openscreen #endif // UTIL_CRYPTO_OPENSSL_UTIL_H_