=pod

=head1 NAME

OSSL_METHOD_STORE, ossl_method_store_new, ossl_method_store_free,
ossl_method_store_init, ossl_method_store_cleanup,
ossl_method_store_add, ossl_method_store_remove, ossl_method_store_fetch,
ossl_method_store_cache_get, ossl_method_store_cache_set,
ossl_method_store_flush_cache
- implementation method store and query

=head1 SYNOPSIS

 #include "internal/property.h"

 typedef struct ossl_method_store_st OSSL_METHOD_STORE;

 OSSL_METHOD_STORE *ossl_method_store_new(OSSL_LIB_CTX *ctx);
 void ossl_method_store_free(OSSL_METHOD_STORE *store);
 int ossl_method_store_init(OSSL_LIB_CTX *ctx);
 void ossl_method_store_cleanup(OSSL_LIB_CTX *ctx);
 int ossl_method_store_add(OSSL_METHOD_STORE *store, const OSSL_PROVIDER *prov,
                           int nid, const char *properties, void *method,
                           int (*method_up_ref)(void *),
                           void (*method_destruct)(void *));
 int ossl_method_store_remove(OSSL_METHOD_STORE *store,
                              int nid, const void *method);
 int ossl_method_store_fetch(OSSL_METHOD_STORE *store,
                             int nid, const char *properties,
                             void **method, const OSSL_PROVIDER **prov_rw);
 int ossl_method_store_cache_get(OSSL_METHOD_STORE *store, OSSL_PROVIDER *prov,
                                 int nid, const char *prop_query, void **method);
 int ossl_method_store_cache_set(OSSL_METHOD_STORE *store, OSSL_PROVIDER *prov,
                                 int nid, const char *prop_query, void *method,
                                 int (*method_up_ref)(void *),
                                 void (*method_destruct)(void *));
 void ossl_method_store_flush_cache(OSSL_METHOD_STORE *store, int all);

=head1 DESCRIPTION

OSSL_METHOD_STORE stores methods that can be queried using properties and a
numeric identity (nid).

Methods are expected to be library internal structures.
It's left to the caller to define the exact contents.

Numeric identities are expected to be an algorithm identity for the methods.
It's left to the caller to define exactly what an algorithm is, and to allocate
these numeric identities accordingly.

The B<OSSL_METHOD_STORE> also holds an internal query cache, which is accessed
separately (see L</Cache Functions> below).

=head2 Store Functions

ossl_method_store_init() initialises the method store subsystem in the scope of
the library context I<ctx>.

ossl_method_store_cleanup() cleans up and shuts down the implementation method
store subsystem in the scope of the library context I<ctx>.

ossl_method_store_new() create a new empty method store using the supplied
I<ctx> to allow access to the required underlying property data.

ossl_method_store_free() frees resources allocated to I<store>.

ossl_method_store_add() adds the I<method> constructed from an implementation in
the provider I<prov> to the I<store> as an instance of an algorithm indicated by
I<nid> and the property definition I<properties>, unless the I<store> already
has a method from the same provider with the same I<nid> and I<properties>.
If the I<method_up_ref> function is given, it's called to increment the
reference count of the method.
If the I<method_destruct> function is given, it's called when this function
fails to add the method to the store, or later on when it is being released from
the I<store>.

ossl_method_store_remove() removes the I<method> identified by I<nid> from the
I<store>.

ossl_method_store_fetch() queries I<store> for a method identified by I<nid>
that matches the property query I<prop_query>.
I<*prop> may be a pointer to a provider, which will narrow the search
to methods from that provider.
The result, if any, is returned in I<*method>, and its provider in I<*prov>.

ossl_method_store_flush_cache() flushes all cached entries associated with
I<store>.

=head2 Cache Functions

ossl_method_store_cache_get() queries the cache associated with the I<store>
for a method identified by I<nid> that matches the property query
I<prop_query>.
Additionally, if I<prov> isn't NULL, it will be used to narrow the search
to only include methods from that provider.
The result, if any, is returned in I<method>.

ossl_method_store_cache_set() sets a cache entry identified by I<nid> from the
provider I<prov>, with the property query I<prop_query> in the I<store>.
Future calls to ossl_method_store_cache_get() will return the specified I<method>.
The I<method_up_ref> function is called to increment the
reference count of the method and the I<method_destruct> function is called
to decrement it.

=head1 NOTES

The I<prop_query> argument to ossl_method_store_cache_get() and
ossl_method_store_cache_set() is not allowed to be NULL.  Use "" for an
empty property definition or query.

=head1 RETURN VALUES

ossl_method_store_new() returns a new method store object or NULL on failure.

ossl_method_store_free(), ossl_method_store_add(),
ossl_method_store_remove(), ossl_method_store_fetch(),
ossl_method_store_cache_get(), ossl_method_store_cache_set() and
ossl_method_store_flush_cache() return B<1> on success and B<0> on error.

ossl_method_store_free() and ossl_method_store_cleanup() do not return any value.

=head1 HISTORY

This functionality was added to OpenSSL 3.0.

=head1 COPYRIGHT

Copyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved.
Copyright (c) 2019, Oracle and/or its affiliates.  All rights reserved.

Licensed under the Apache License 2.0 (the "License").  You may not use this
file except in compliance with the License.  You can obtain a copy in the file
LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut
