|  | =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 new_func(void *parent, void *ptr, CRYPTO_EX_DATA *ad, | 
|  | int idx, long argl, void *argp); | 
|  | typedef void free_func(void *parent, void *ptr, CRYPTO_EX_DATA *ad, | 
|  | int idx, long argl, void *argp); | 
|  | typedef int dup_func(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 |