=pod

=head1 NAME

ossl_decoder_get_number, evp_md_get_number, evp_cipher_get_number,
evp_mac_get_number, evp_rand_get_number, evp_keymgmt_get_number,
evp_signature_get_number, evp_asym_cipher_get_number, evp_kem_get_number,
evp_keyexch_get_number, evp_kdf_get_number, ossl_encoder_get_number,
ossl_store_loader_get_number - EVP get internal identification numbers

=head1 SYNOPSIS

 #include "crypto/evp.h"

 int evp_asym_cipher_get_number(const EVP_ASYM_CIPHER *cipher);
 int evp_cipher_get_number(const EVP_CIPHER *e);
 int evp_kdf_get_number(const EVP_KDF *kdf);
 int evp_kem_get_number(const EVP_KEM *kem);
 int evp_keyexch_get_number(const EVP_KEYEXCH *exchange);
 int evp_keymgmt_get_number(const EVP_KEYMGMT *keymgmt);
 int evp_mac_get_number(const EVP_MAC *mac);
 int evp_md_get_number(const EVP_MD *md);
 int evp_rand_get_number(const EVP_RAND *rand);
 int evp_signature_get_number(const EVP_SIGNATURE *signature);
 int ossl_decoder_get_number(const OSSL_DECODER *decoder);
 int ossl_encoder_get_number(const OSSL_ENCODER *encoder);
 int ossl_store_loader_get_number(const OSSL_STORE_LOADER *loader);

=head1 DESCRIPTION

All provided algorithms get an associated integer identification number.
This number is dynamic and should be expected to vary from run to run.
These numbers should only be considered to be unique per provider per
library context.

=over 4

=item evp_asym_cipher_get_number()

Returns the internal dynamic number assigned to I<cipher>.

=item evp_cipher_get_number()

Returns the internal dynamic number assigned to the I<cipher>.  This is only
useful with fetched B<EVP_CIPHER>s.

=item evp_kdf_get_number()

Keturns the internal dynamic number assigned to I<kdf>.

=item evp_kem_get_number()

Returns the internal dynamic number assigned to I<kem>.

=item evp_keyexch_get_number()

Returns the internal dynamic number assigned to the I<exchange>.

=item evp_keymgmt_get_number()

Returns the internal dynamic number assigned to the I<keymgmt>.

=item evp_mac_get_number()

Returns the internal dynamic number assigned to I<mac>.

=item evp_md_get_number()

Returns the internal dynamic number assigned to the I<md>.  This is
only useful with fetched B<EVP_MD>s.

=item evp_rand_get_number()

Returns the internal dynamic number assigned to I<rand>.

=item evp_signature_get_number()

Returns the internal dynamic number assigned to I<signature>.

=item ossl_decoder_get_number()

Returns the internal dynamic number assigned to the given I<decoder>.

=item ossl_encoder_get_number()

Returns the internal dynamic number assigned to the given I<encoder>.

=item ossl_store_loader_get_number()

Returns the internal dynamic number assigned to the given I<loader>.

=back

=head1 RETURN VALUES

All of these functions return the provider specific identification number
for the specified algorithm.

=head1 HISTORY

This functionality was added to OpenSSL 3.0.

=head1 COPYRIGHT

Copyright 2021 The OpenSSL Project Authors. 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
