Provided by: libssl-doc_3.0.13-0ubuntu3.4_all bug

NAME

       ASYNC_WAIT_CTX_new, ASYNC_WAIT_CTX_free, ASYNC_WAIT_CTX_set_wait_fd,
       ASYNC_WAIT_CTX_get_fd, ASYNC_WAIT_CTX_get_all_fds, ASYNC_WAIT_CTX_get_changed_fds,
       ASYNC_WAIT_CTX_clear_fd, ASYNC_WAIT_CTX_set_callback, ASYNC_WAIT_CTX_get_callback,
       ASYNC_WAIT_CTX_set_status, ASYNC_WAIT_CTX_get_status, ASYNC_callback_fn,
       ASYNC_STATUS_UNSUPPORTED, ASYNC_STATUS_ERR, ASYNC_STATUS_OK, ASYNC_STATUS_EAGAIN -
       functions to manage waiting for asynchronous jobs to complete

SYNOPSIS

        #include <openssl/async.h>

        #define ASYNC_STATUS_UNSUPPORTED    0
        #define ASYNC_STATUS_ERR            1
        #define ASYNC_STATUS_OK             2
        #define ASYNC_STATUS_EAGAIN         3
        typedef int (*ASYNC_callback_fn)(void *arg);
        ASYNC_WAIT_CTX *ASYNC_WAIT_CTX_new(void);
        void ASYNC_WAIT_CTX_free(ASYNC_WAIT_CTX *ctx);
        int ASYNC_WAIT_CTX_set_wait_fd(ASYNC_WAIT_CTX *ctx, const void *key,
                                       OSSL_ASYNC_FD fd,
                                       void *custom_data,
                                       void (*cleanup)(ASYNC_WAIT_CTX *, const void *,
                                                       OSSL_ASYNC_FD, void *));
        int ASYNC_WAIT_CTX_get_fd(ASYNC_WAIT_CTX *ctx, const void *key,
                                  OSSL_ASYNC_FD *fd, void **custom_data);
        int ASYNC_WAIT_CTX_get_all_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *fd,
                                       size_t *numfds);
        int ASYNC_WAIT_CTX_get_changed_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *addfd,
                                           size_t *numaddfds, OSSL_ASYNC_FD *delfd,
                                           size_t *numdelfds);
        int ASYNC_WAIT_CTX_clear_fd(ASYNC_WAIT_CTX *ctx, const void *key);
        int ASYNC_WAIT_CTX_set_callback(ASYNC_WAIT_CTX *ctx,
                                        ASYNC_callback_fn callback,
                                        void *callback_arg);
        int ASYNC_WAIT_CTX_get_callback(ASYNC_WAIT_CTX *ctx,
                                        ASYNC_callback_fn *callback,
                                        void **callback_arg);
        int ASYNC_WAIT_CTX_set_status(ASYNC_WAIT_CTX *ctx, int status);
        int ASYNC_WAIT_CTX_get_status(ASYNC_WAIT_CTX *ctx);

DESCRIPTION

       For an overview of how asynchronous operations are implemented in OpenSSL see
       ASYNC_start_job(3). An ASYNC_WAIT_CTX object represents an asynchronous "session", i.e. a
       related set of crypto operations. For example in SSL terms this would have a one-to-one
       correspondence with an SSL connection.

       Application code must create an ASYNC_WAIT_CTX using the ASYNC_WAIT_CTX_new() function
       prior to calling ASYNC_start_job() (see ASYNC_start_job(3)). When the job is started it is
       associated with the ASYNC_WAIT_CTX for the duration of that job. An ASYNC_WAIT_CTX should
       only be used for one ASYNC_JOB at any one time, but can be reused after an ASYNC_JOB has
       finished for a subsequent ASYNC_JOB. When the session is complete (e.g. the SSL connection
       is closed), application code cleans up with ASYNC_WAIT_CTX_free().

       ASYNC_WAIT_CTXs can have "wait" file descriptors associated with them.  Calling
       ASYNC_WAIT_CTX_get_all_fds() and passing in a pointer to an ASYNC_WAIT_CTX in the ctx
       parameter will return the wait file descriptors associated with that job in *fd. The
       number of file descriptors returned will be stored in *numfds. It is the caller's
       responsibility to ensure that sufficient memory has been allocated in *fd to receive all
       the file descriptors. Calling ASYNC_WAIT_CTX_get_all_fds() with a NULL fd value will
       return no file descriptors but will still populate *numfds. Therefore, application code is
       typically expected to call this function twice: once to get the number of fds, and then
       again when sufficient memory has been allocated. If only one asynchronous engine is being
       used then normally this call will only ever return one fd. If multiple asynchronous
       engines are being used then more could be returned.

       The function ASYNC_WAIT_CTX_get_changed_fds() can be used to detect if any fds have
       changed since the last call time ASYNC_start_job() returned ASYNC_PAUSE (or since the
       ASYNC_WAIT_CTX was created if no ASYNC_PAUSE result has been received). The numaddfds and
       numdelfds parameters will be populated with the number of fds added or deleted
       respectively. *addfd and *delfd will be populated with the list of added and deleted fds
       respectively. Similarly to ASYNC_WAIT_CTX_get_all_fds() either of these can be NULL, but
       if they are not NULL then the caller is responsible for ensuring sufficient memory is
       allocated.

       Implementers of async aware code (e.g. engines) are encouraged to return a stable fd for
       the lifetime of the ASYNC_WAIT_CTX in order to reduce the "churn" of regularly changing
       fds - although no guarantees of this are provided to applications.

       Applications can wait for the file descriptor to be ready for "read" using a system
       function call such as select or poll (being ready for "read" indicates that the job should
       be resumed). If no file descriptor is made available then an application will have to
       periodically "poll" the job by attempting to restart it to see if it is ready to continue.

       Async aware code (e.g. engines) can get the current ASYNC_WAIT_CTX from the job via
       ASYNC_get_wait_ctx(3) and provide a file descriptor to use for waiting on by calling
       ASYNC_WAIT_CTX_set_wait_fd(). Typically this would be done by an engine immediately prior
       to calling ASYNC_pause_job() and not by end user code. An existing association with a file
       descriptor can be obtained using ASYNC_WAIT_CTX_get_fd() and cleared using
       ASYNC_WAIT_CTX_clear_fd(). Both of these functions requires a key value which is unique to
       the async aware code.  This could be any unique value but a good candidate might be the
       ENGINE * for the engine. The custom_data parameter can be any value, and will be returned
       in a subsequent call to ASYNC_WAIT_CTX_get_fd(). The ASYNC_WAIT_CTX_set_wait_fd() function
       also expects a pointer to a "cleanup" routine. This can be NULL but if provided will
       automatically get called when the ASYNC_WAIT_CTX is freed, and gives the engine the
       opportunity to close the fd or any other resources. Note: The "cleanup" routine does not
       get called if the fd is cleared directly via a call to ASYNC_WAIT_CTX_clear_fd().

       An example of typical usage might be an async capable engine. User code would initiate
       cryptographic operations. The engine would initiate those operations asynchronously and
       then call ASYNC_WAIT_CTX_set_wait_fd() followed by ASYNC_pause_job() to return control to
       the user code. The user code can then perform other tasks or wait for the job to be ready
       by calling "select" or other similar function on the wait file descriptor. The engine can
       signal to the user code that the job should be resumed by making the wait file descriptor
       "readable". Once resumed the engine should clear the wake signal on the wait file
       descriptor.

       As well as a file descriptor, user code may also be notified via a callback. The callback
       and data pointers are stored within the ASYNC_WAIT_CTX along with an additional status
       field that can be used for the notification of retries from an engine. This additional
       method can be used when the user thinks that a file descriptor is too costly in terms of
       CPU cycles or in some context where a file descriptor is not appropriate.

       ASYNC_WAIT_CTX_set_callback() sets the callback and the callback argument. The callback
       will be called to notify user code when an engine completes a cryptography operation. It
       is a requirement that the callback function is small and nonblocking as it will be run in
       the context of a polling mechanism or an interrupt.

       ASYNC_WAIT_CTX_get_callback() returns the callback set in the ASYNC_WAIT_CTX structure.

       ASYNC_WAIT_CTX_set_status() allows an engine to set the current engine status.  The
       possible status values are the following:

       ASYNC_STATUS_UNSUPPORTED
           The engine does not support the callback mechanism. This is the default value.  The
           engine must call ASYNC_WAIT_CTX_set_status() to set the status to some value other
           than ASYNC_STATUS_UNSUPPORTED if it intends to enable the callback mechanism.

       ASYNC_STATUS_ERR
           The engine has a fatal problem with this request. The user code should clean up this
           session.

       ASYNC_STATUS_OK
           The request has been successfully submitted.

       ASYNC_STATUS_EAGAIN
           The engine has some problem which will be recovered soon, such as a buffer is full, so
           user code should resume the job.

       ASYNC_WAIT_CTX_get_status() allows user code to obtain the current status value.  If the
       status is any value other than ASYNC_STATUS_OK then the user code should not expect to
       receive a callback from the engine even if one has been set.

       An example of the usage of the callback method might be the following. User code would
       initiate cryptographic operations, and the engine code would dispatch this operation to
       hardware, and if the dispatch is successful, then the engine code would call
       ASYNC_pause_job() to return control to the user code. After that, user code can perform
       other tasks. When the hardware completes the operation, normally it is detected by a
       polling function or an interrupt, as the user code set a callback by calling
       ASYNC_WAIT_CTX_set_callback() previously, then the registered callback will be called.

RETURN VALUES

       ASYNC_WAIT_CTX_new() returns a pointer to the newly allocated ASYNC_WAIT_CTX or NULL on
       error.

       ASYNC_WAIT_CTX_set_wait_fd, ASYNC_WAIT_CTX_get_fd, ASYNC_WAIT_CTX_get_all_fds,
       ASYNC_WAIT_CTX_get_changed_fds, ASYNC_WAIT_CTX_clear_fd, ASYNC_WAIT_CTX_set_callback,
       ASYNC_WAIT_CTX_get_callback and ASYNC_WAIT_CTX_set_status all return 1 on success or 0 on
       error.  ASYNC_WAIT_CTX_get_status() returns the engine status.

NOTES

       On Windows platforms the <openssl/async.h> header is dependent on some of the types
       customarily made available by including <windows.h>. The application developer is likely
       to require control over when the latter is included, commonly as one of the first included
       headers. Therefore, it is defined as an application developer's responsibility to include
       <windows.h> prior to <openssl/async.h>.

SEE ALSO

       crypto(7), ASYNC_start_job(3)

HISTORY

       ASYNC_WAIT_CTX_new(), ASYNC_WAIT_CTX_free(), ASYNC_WAIT_CTX_set_wait_fd(),
       ASYNC_WAIT_CTX_get_fd(), ASYNC_WAIT_CTX_get_all_fds(), ASYNC_WAIT_CTX_get_changed_fds()
       and ASYNC_WAIT_CTX_clear_fd() were added in OpenSSL 1.1.0.

       ASYNC_WAIT_CTX_set_callback(), ASYNC_WAIT_CTX_get_callback(), ASYNC_WAIT_CTX_set_status(),
       and ASYNC_WAIT_CTX_get_status() were added in OpenSSL 3.0.

COPYRIGHT

       Copyright 2016-2023 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 <https://www.openssl.org/source/license.html>.