| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | =pod | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 NAME | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 19:03:34 +08:00
										 |  |  | CRYPTO_EX_new, CRYPTO_EX_free, CRYPTO_EX_dup, | 
					
						
							| 
									
										
										
										
											2019-02-08 23:46:28 +08:00
										 |  |  | CRYPTO_free_ex_index, CRYPTO_get_ex_new_index, | 
					
						
							|  |  |  | CRYPTO_alloc_ex_data, CRYPTO_set_ex_data, CRYPTO_get_ex_data, | 
					
						
							|  |  |  | CRYPTO_free_ex_data, CRYPTO_new_ex_data | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | - functions supporting application-specific data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 SYNOPSIS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  #include <openssl/crypto.h> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  int CRYPTO_get_ex_new_index(int class_index, | 
					
						
							| 
									
										
										
										
											2017-01-21 02:58:49 +08:00
										 |  |  |                              long argl, void *argp, | 
					
						
							|  |  |  |                              CRYPTO_EX_new *new_func, | 
					
						
							|  |  |  |                              CRYPTO_EX_dup *dup_func, | 
					
						
							|  |  |  |                              CRYPTO_EX_free *free_func); | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-27 02:05:49 +08:00
										 |  |  |  typedef void CRYPTO_EX_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad, | 
					
						
							|  |  |  |                             int idx, long argl, void *argp); | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  |  typedef void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, | 
					
						
							|  |  |  |                              int idx, long argl, void *argp); | 
					
						
							| 
									
										
										
										
											2016-07-31 18:04:48 +08:00
										 |  |  |  typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from, | 
					
						
							| 
									
										
										
										
											2017-03-21 00:29:28 +08:00
										 |  |  |                            void **from_d, int idx, long argl, void *argp); | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-15 16:26:35 +08:00
										 |  |  |  int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); | 
					
						
							| 
									
										
										
										
											2016-06-21 19:03:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-08 23:46:28 +08:00
										 |  |  |  int CRYPTO_alloc_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad, | 
					
						
							|  |  |  |                           int idx); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  |  int CRYPTO_set_ex_data(CRYPTO_EX_DATA *r, int idx, void *arg); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-22 14:01:36 +08:00
										 |  |  |  void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *r, int idx); | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |  void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *r); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  int CRYPTO_free_ex_index(int class_index, int idx); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 DESCRIPTION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Several OpenSSL structures can have application-specific data attached to them, | 
					
						
							|  |  |  | known as "exdata." | 
					
						
							|  |  |  | The specific structures are: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-28 02:02:24 +08:00
										 |  |  |     BIO | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  |     DH | 
					
						
							|  |  |  |     DSA | 
					
						
							| 
									
										
										
										
											2016-01-06 02:06:03 +08:00
										 |  |  |     EC_KEY | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  |     ENGINE | 
					
						
							| 
									
										
										
										
											2020-04-07 08:18:09 +08:00
										 |  |  |     EVP_PKEY | 
					
						
							| 
									
										
										
										
											2018-02-28 02:02:24 +08:00
										 |  |  |     RSA | 
					
						
							|  |  |  |     SSL | 
					
						
							|  |  |  |     SSL_CTX | 
					
						
							|  |  |  |     SSL_SESSION | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  |     UI | 
					
						
							| 
									
										
										
										
											2016-12-06 21:36:04 +08:00
										 |  |  |     UI_METHOD | 
					
						
							| 
									
										
										
										
											2018-02-28 02:02:24 +08:00
										 |  |  |     X509 | 
					
						
							|  |  |  |     X509_STORE | 
					
						
							|  |  |  |     X509_STORE_CTX | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-19 00:24:39 +08:00
										 |  |  | In addition, the B<APP> name is reserved for use by application code. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-12 22:44:43 +08:00
										 |  |  | Each is identified by an B<CRYPTO_EX_INDEX_xxx> define in the header file | 
					
						
							|  |  |  | F<< <openssl/crypto.h> >>.  In addition, B<CRYPTO_EX_INDEX_APP> is reserved for | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | applications to use this facility for their own structures. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The API described here is used by OpenSSL to manipulate exdata for specific | 
					
						
							|  |  |  | structures.  Since the application data can be anything at all it is passed | 
					
						
							|  |  |  | and retrieved as a B<void *> type. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 19:03:34 +08:00
										 |  |  | The B<CRYPTO_EX_DATA> type is opaque.  To initialize the exdata part of | 
					
						
							|  |  |  | a structure, call CRYPTO_new_ex_data(). This is only necessary for | 
					
						
							|  |  |  | B<CRYPTO_EX_INDEX_APP> objects. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | Exdata types are identified by an B<index>, an integer guaranteed to be | 
					
						
							|  |  |  | unique within structures for the lifetime of the program.  Applications | 
					
						
							|  |  |  | using exdata typically call B<CRYPTO_get_ex_new_index> at startup, and | 
					
						
							|  |  |  | store the result in a global variable, or write a wrapper function to | 
					
						
							|  |  |  | provide lazy evaluation.  The B<class_index> should be one of the | 
					
						
							|  |  |  | B<CRYPTO_EX_INDEX_xxx> values. The B<argl> and B<argp> parameters are saved | 
					
						
							|  |  |  | to be passed to the callbacks but are otherwise not used.  In order to | 
					
						
							|  |  |  | transparently manipulate exdata, three callbacks must be provided. The | 
					
						
							|  |  |  | semantics of those callbacks are described below. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | When copying or releasing objects with exdata, the callback functions | 
					
						
							|  |  |  | are called in increasing order of their B<index> value. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If a dynamic library can be unloaded, it should call CRYPTO_free_ex_index() | 
					
						
							|  |  |  | when this is done. | 
					
						
							|  |  |  | This will replace the callbacks with no-ops | 
					
						
							|  |  |  | so that applications don't crash.  Any existing exdata will be leaked. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To set or get the exdata on an object, the appropriate type-specific | 
					
						
							|  |  |  | routine must be used.  This is because the containing structure is opaque | 
					
						
							|  |  |  | and the B<CRYPTO_EX_DATA> field is not accessible.  In both API's, the | 
					
						
							|  |  |  | B<idx> parameter should be an already-created index value. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | When setting exdata, the pointer specified with a particular index is saved, | 
					
						
							|  |  |  | and returned on a subsequent "get" call.  If the application is going to | 
					
						
							|  |  |  | release the data, it must make sure to set a B<NULL> value at the index, | 
					
						
							| 
									
										
										
										
											2015-12-16 06:23:51 +08:00
										 |  |  | to avoid likely double-free crashes. | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | The function B<CRYPTO_free_ex_data> is used to free all exdata attached | 
					
						
							|  |  |  | to a structure. The appropriate type-specific routine must be used. | 
					
						
							|  |  |  | The B<class_index> identifies the structure type, the B<obj> is | 
					
						
							| 
									
										
										
										
											2019-02-22 14:27:39 +08:00
										 |  |  | a pointer to the actual structure, and B<r> is a pointer to the | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | structure's exdata field. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head2 Callback Functions | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This section describes how the callback functions are used. Applications | 
					
						
							|  |  |  | that are defining their own exdata using B<CYPRTO_EX_INDEX_APP> must | 
					
						
							|  |  |  | call them as described here. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | When a structure is initially allocated (such as RSA_new()) then the | 
					
						
							|  |  |  | new_func() is called for every defined index. There is no requirement | 
					
						
							|  |  |  | that the entire parent, or containing, structure has been set up. | 
					
						
							|  |  |  | The new_func() is typically used only to allocate memory to store the | 
					
						
							|  |  |  | exdata, and perhaps an "initialized" flag within that memory. | 
					
						
							| 
									
										
										
										
											2019-02-08 23:46:28 +08:00
										 |  |  | The exdata value may be allocated later on with CRYPTO_alloc_ex_data(), | 
					
						
							|  |  |  | or may be set by calling CRYPTO_set_ex_data(). | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | When a structure is free'd (such as SSL_CTX_free()) then the | 
					
						
							|  |  |  | free_func() is called for every defined index.  Again, the state of the | 
					
						
							|  |  |  | parent structure is not guaranteed.  The free_func() may be called with a | 
					
						
							|  |  |  | NULL pointer. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Both new_func() and free_func() take the same parameters. | 
					
						
							|  |  |  | The B<parent> is the pointer to the structure that contains the exdata. | 
					
						
							|  |  |  | The B<ptr> is the current exdata item; for new_func() this will typically | 
					
						
							|  |  |  | be NULL.  The B<r> parameter is a pointer to the exdata field of the object. | 
					
						
							|  |  |  | The B<idx> is the index and is the value returned when the callbacks were | 
					
						
							|  |  |  | initially registered via CRYPTO_get_ex_new_index() and can be used if | 
					
						
							|  |  |  | the same callback handles different types of exdata. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | dup_func() is called when a structure is being copied.  This is only done | 
					
						
							| 
									
										
										
										
											2017-04-27 02:05:49 +08:00
										 |  |  | for B<SSL>, B<SSL_SESSION>, B<EC_KEY> objects and B<BIO> chains via | 
					
						
							|  |  |  | BIO_dup_chain().  The B<to> and B<from> parameters | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | are pointers to the destination and source B<CRYPTO_EX_DATA> structures, | 
					
						
							| 
									
										
										
										
											2017-03-21 00:29:28 +08:00
										 |  |  | respectively.  The B<*from_d> parameter is a pointer to the source exdata. | 
					
						
							|  |  |  | When the dup_func() returns, the value in B<*from_d> is copied to the | 
					
						
							| 
									
										
										
										
											2017-03-19 23:14:33 +08:00
										 |  |  | destination ex_data.  If the pointer contained in B<*pptr> is not modified | 
					
						
							| 
									
										
										
										
											2015-12-16 06:23:51 +08:00
										 |  |  | by the dup_func(), then both B<to> and B<from> will point to the same data. | 
					
						
							|  |  |  | The B<idx>, B<argl> and B<argp> parameters are as described for the other | 
					
						
							| 
									
										
										
										
											2017-03-19 23:14:33 +08:00
										 |  |  | two callbacks.  If the dup_func() returns B<0> the whole CRYPTO_dup_ex_data() | 
					
						
							|  |  |  | will fail. | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 RETURN VALUES | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-03 00:16:38 +08:00
										 |  |  | CRYPTO_get_ex_new_index() returns a new index or -1 on failure. | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-08 23:46:28 +08:00
										 |  |  | CRYPTO_free_ex_index(), CRYPTO_alloc_ex_data() and CRYPTO_set_ex_data() | 
					
						
							| 
									
										
										
										
											2021-09-21 08:59:56 +08:00
										 |  |  | return 1 on success or 0 on failure. | 
					
						
							| 
									
										
										
										
											2015-07-21 22:06:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | CRYPTO_get_ex_data() returns the application data or NULL on failure; | 
					
						
							|  |  |  | note that NULL may be a valid value. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | dup_func() should return 0 for failure and 1 for success. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-08 23:46:28 +08:00
										 |  |  | =head1 HISTORY | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-15 21:03:44 +08:00
										 |  |  | CRYPTO_alloc_ex_data() was added in OpenSSL 3.0. | 
					
						
							| 
									
										
										
										
											2020-07-14 08:29:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-21 00:29:28 +08:00
										 |  |  | The signature of the dup_func() callback was changed in OpenSSL 3.0 to use the | 
					
						
							|  |  |  | type B<void **> for B<from_d>.  Previously this parameter was of type B<void *>. | 
					
						
							| 
									
										
										
										
											2019-02-08 23:46:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-14 08:29:24 +08:00
										 |  |  | Support for ENGINE "exdata" was deprecated in OpenSSL 3.0. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | =head1 COPYRIGHT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-28 20:54:57 +08:00
										 |  |  | Copyright 2015-2021 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-06 21:04:44 +08:00
										 |  |  | Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | 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 |