4#ifndef _Stroika_Foundation_Cryptography_OpenSSL_LibraryContext_h_
5#define _Stroika_Foundation_Cryptography_OpenSSL_LibraryContext_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
12#if qStroika_HasComponent_OpenSSL
13#include <openssl/evp.h>
17#include "Stroika/Foundation/Common/Common.h"
18#include "Stroika/Foundation/Common/Property.h"
19#include "Stroika/Foundation/Containers/Association.h"
20#include "Stroika/Foundation/Containers/Set.h"
30#if qStroika_HasComponent_OpenSSL
31namespace Stroika::Foundation::Cryptography::Providers::OpenSSL {
33 using Characters::String;
34 using Containers::Set;
40 class LibraryContext {
47 LibraryContext (
const LibraryContext&) =
delete;
60 static LibraryContext sDefault;
63 static inline constexpr string_view kDefaultProvider =
"default"sv;
66 static inline constexpr string_view kLegacyProvider =
"legacy"sv;
72 nonvirtual
void LoadProvider (
const String& providerName);
79 nonvirtual
void UnLoadProvider (
const String& providerName);
85 class TemporarilyAddProvider {
87 TemporarilyAddProvider () =
delete;
88 TemporarilyAddProvider (
const TemporarilyAddProvider&) =
delete;
89 TemporarilyAddProvider (LibraryContext* context,
const String& providerName);
90 ~TemporarilyAddProvider ();
93 LibraryContext* fContext_;
94 String fProviderName_;
101 Common::ReadOnlyProperty<Set<CipherAlgorithm>> availableCipherAlgorithms;
107 Common::ReadOnlyProperty<Set<CipherAlgorithm>> standardCipherAlgorithms;
113 Common::ReadOnlyProperty<Set<DigestAlgorithm>> availableDigestAlgorithms;
119 Common::ReadOnlyProperty<Set<DigestAlgorithm>> standardDigestAlgorithms;
122 struct LibraryInit_ {
124 ~LibraryInit_ () =
default;
128 [[no_unique_address]] LibraryInit_ fLibraryInit_;
129 [[no_unique_address]] Debug::AssertExternallySynchronizedMutex fThisAssertExternallySynchronized_;
131#if OPENSSL_VERSION_MAJOR >= 3
132 Containers::Association<String, ::OSSL_PROVIDER*> fLoadedProviders_;
135 inline LibraryContext LibraryContext::sDefault;
146#include "LibraryContext.inl"