=pod

=head1 NAME

RSA_get_ex_new_index, RSA_set_ex_data, RSA_get_ex_data - add application specific data to RSA structures

=head1 SYNOPSIS

 #include <openssl/rsa.h>

 int RSA_get_ex_new_index(long argl, void *argp,
		CRYPTO_EX_new *new_func,
		CRYPTO_EX_dup *dup_func,
		CRYPTO_EX_free *free_func);

 int RSA_set_ex_data(RSA *r, int idx, void *arg);

 void *RSA_get_ex_data(RSA *r, int idx);

 typedef int CRYPTO_EX_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad,
                           int idx, long argl, void *argp);
 typedef void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad,
                             int idx, long argl, void *argp);
 typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, void *from_d,
                           int idx, long argl, void *argp);

=head1 DESCRIPTION

Several OpenSSL structures can have application specific data attached to them.
This has several potential uses, it can be used to cache data associated with
a structure (for example the hash of some part of the structure) or some
additional data (for example a handle to the data in an external library).

Since the application data can be anything at all it is passed and retrieved
as a B<void *> type.

The B<RSA_get_ex_new_index()> function is initially called to "register" some
new application specific data. It takes three optional function pointers which
are called when the parent structure (in this case an RSA structure) is
initially created, when it is copied and when it is freed up. If any or all of
these function pointer arguments are not used they should be set to NULL. The
precise manner in which these function pointers are called is described in more
detail below. B<RSA_get_ex_new_index()> also takes additional long and pointer
parameters which will be passed to the supplied functions but which otherwise
have no special meaning. It returns an B<index> which should be stored
(typically in a static variable) and passed used in the B<idx> parameter in
the remaining functions. Each successful call to B<RSA_get_ex_new_index()>
will return an index greater than any previously returned, this is important
because the optional functions are called in order of increasing index value.

B<RSA_set_ex_data()> is used to set application specific data, the data is
supplied in the B<arg> parameter and its precise meaning is up to the
application.

B<RSA_get_ex_data()> is used to retrieve application specific data. The data
is returned to the application, this will be the same value as supplied to
a previous B<RSA_set_ex_data()> call.

B<new_func()> is called when a structure is initially allocated (for example
with B<RSA_new()>. The parent structure members will not have any meaningful
values at this point. This function will typically be used to allocate any
application specific structure.

B<free_func()> is called when a structure is being freed up. The dynamic parent
structure members should not be accessed because they will be freed up when
this function is called.

B<new_func()> and B<free_func()> take the same parameters. B<parent> is a
pointer to the parent RSA structure. B<ptr> is a the application specific data
(this wont be of much use in B<new_func()>. B<ad> is a pointer to the
B<CRYPTO_EX_DATA> structure from the parent RSA structure: the functions
B<CRYPTO_get_ex_data()> and B<CRYPTO_set_ex_data()> can be called to manipulate
it. The B<idx> parameter is the index: this will be the same value returned by
B<RSA_get_ex_new_index()> when the functions were initially registered. Finally
the B<argl> and B<argp> parameters are the values originally passed to the same
corresponding parameters when B<RSA_get_ex_new_index()> was called.

B<dup_func()> is called when a structure is being copied. Pointers to the
destination and source B<CRYPTO_EX_DATA> structures are passed in the B<to> and
B<from> parameters respectively. The B<from_d> parameter is passed a pointer to
the source application data when the function is called, when the function returns
the value is copied to the destination: the application can thus modify the data
pointed to by B<from_d> and have different values in the source and destination.
The B<idx>, B<argl> and B<argp> parameters are the same as those in B<new_func()>
and B<free_func()>.

=head1 RETURN VALUES

B<RSA_get_ex_new_index()> returns a new index or -1 on failure (note 0 is a valid
index value).

B<RSA_set_ex_data()> returns 1 on success or 0 on failure.

B<RSA_get_ex_data()> returns the application data or 0 on failure. 0 may also
be valid application data but currently it can only fail if given an invalid B<idx>
parameter.

B<new_func()> and B<dup_func()> should return 0 for failure and 1 for success.

On failure an error code can be obtained from L<ERR_get_error(3)|ERR_get_error(3)>.

=head1 BUGS

B<dup_func()> is currently never called.

The return value of B<new_func()> is ignored.

The B<new_func()> function isn't very useful because no meaningful values are
present in the parent RSA structure when it is called.

=head1 SEE ALSO

L<rsa(3)|rsa(3)>, L<CRYPTO_set_ex_data(3)|CRYPTO_set_ex_data(3)>

=head1 HISTORY

RSA_get_ex_new_index(), RSA_set_ex_data() and RSA_get_ex_data() are
available since SSLeay 0.9.0.

=cut
