Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 10:05:52

0001 /*
0002  * WARNING: do not edit!
0003  * Generated by Makefile from include/openssl/ui.h.in
0004  *
0005  * Copyright 2001-2020 The OpenSSL Project Authors. All Rights Reserved.
0006  *
0007  * Licensed under the Apache License 2.0 (the "License").  You may not use
0008  * this file except in compliance with the License.  You can obtain a copy
0009  * in the file LICENSE in the source distribution or at
0010  * https://www.openssl.org/source/license.html
0011  */
0012 
0013 
0014 
0015 #ifndef OPENSSL_UI_H
0016 # define OPENSSL_UI_H
0017 # pragma once
0018 
0019 # include <openssl/macros.h>
0020 # ifndef OPENSSL_NO_DEPRECATED_3_0
0021 #  define HEADER_UI_H
0022 # endif
0023 
0024 # include <openssl/opensslconf.h>
0025 
0026 # ifndef OPENSSL_NO_DEPRECATED_1_1_0
0027 #  include <openssl/crypto.h>
0028 # endif
0029 # include <openssl/safestack.h>
0030 # include <openssl/pem.h>
0031 # include <openssl/types.h>
0032 # include <openssl/uierr.h>
0033 
0034 /* For compatibility reasons, the macro OPENSSL_NO_UI is currently retained */
0035 # ifndef OPENSSL_NO_DEPRECATED_3_0
0036 #  ifdef OPENSSL_NO_UI_CONSOLE
0037 #   define OPENSSL_NO_UI
0038 #  endif
0039 # endif
0040 
0041 # ifdef  __cplusplus
0042 extern "C" {
0043 # endif
0044 
0045 /*
0046  * All the following functions return -1 or NULL on error and in some cases
0047  * (UI_process()) -2 if interrupted or in some other way cancelled. When
0048  * everything is fine, they return 0, a positive value or a non-NULL pointer,
0049  * all depending on their purpose.
0050  */
0051 
0052 /* Creators and destructor.   */
0053 UI *UI_new(void);
0054 UI *UI_new_method(const UI_METHOD *method);
0055 void UI_free(UI *ui);
0056 
0057 /*-
0058    The following functions are used to add strings to be printed and prompt
0059    strings to prompt for data.  The names are UI_{add,dup}_<function>_string
0060    and UI_{add,dup}_input_boolean.
0061 
0062    UI_{add,dup}_<function>_string have the following meanings:
0063         add     add a text or prompt string.  The pointers given to these
0064                 functions are used verbatim, no copying is done.
0065         dup     make a copy of the text or prompt string, then add the copy
0066                 to the collection of strings in the user interface.
0067         <function>
0068                 The function is a name for the functionality that the given
0069                 string shall be used for.  It can be one of:
0070                         input   use the string as data prompt.
0071                         verify  use the string as verification prompt.  This
0072                                 is used to verify a previous input.
0073                         info    use the string for informational output.
0074                         error   use the string for error output.
0075    Honestly, there's currently no difference between info and error for the
0076    moment.
0077 
0078    UI_{add,dup}_input_boolean have the same semantics for "add" and "dup",
0079    and are typically used when one wants to prompt for a yes/no response.
0080 
0081    All of the functions in this group take a UI and a prompt string.
0082    The string input and verify addition functions also take a flag argument,
0083    a buffer for the result to end up with, a minimum input size and a maximum
0084    input size (the result buffer MUST be large enough to be able to contain
0085    the maximum number of characters).  Additionally, the verify addition
0086    functions takes another buffer to compare the result against.
0087    The boolean input functions take an action description string (which should
0088    be safe to ignore if the expected user action is obvious, for example with
0089    a dialog box with an OK button and a Cancel button), a string of acceptable
0090    characters to mean OK and to mean Cancel.  The two last strings are checked
0091    to make sure they don't have common characters.  Additionally, the same
0092    flag argument as for the string input is taken, as well as a result buffer.
0093    The result buffer is required to be at least one byte long.  Depending on
0094    the answer, the first character from the OK or the Cancel character strings
0095    will be stored in the first byte of the result buffer.  No NUL will be
0096    added, so the result is *not* a string.
0097 
0098    On success, the all return an index of the added information.  That index
0099    is useful when retrieving results with UI_get0_result(). */
0100 int UI_add_input_string(UI *ui, const char *prompt, int flags,
0101                         char *result_buf, int minsize, int maxsize);
0102 int UI_dup_input_string(UI *ui, const char *prompt, int flags,
0103                         char *result_buf, int minsize, int maxsize);
0104 int UI_add_verify_string(UI *ui, const char *prompt, int flags,
0105                          char *result_buf, int minsize, int maxsize,
0106                          const char *test_buf);
0107 int UI_dup_verify_string(UI *ui, const char *prompt, int flags,
0108                          char *result_buf, int minsize, int maxsize,
0109                          const char *test_buf);
0110 int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc,
0111                          const char *ok_chars, const char *cancel_chars,
0112                          int flags, char *result_buf);
0113 int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc,
0114                          const char *ok_chars, const char *cancel_chars,
0115                          int flags, char *result_buf);
0116 int UI_add_info_string(UI *ui, const char *text);
0117 int UI_dup_info_string(UI *ui, const char *text);
0118 int UI_add_error_string(UI *ui, const char *text);
0119 int UI_dup_error_string(UI *ui, const char *text);
0120 
0121 /* These are the possible flags.  They can be or'ed together. */
0122 /* Use to have echoing of input */
0123 # define UI_INPUT_FLAG_ECHO              0x01
0124 /*
0125  * Use a default password.  Where that password is found is completely up to
0126  * the application, it might for example be in the user data set with
0127  * UI_add_user_data().  It is not recommended to have more than one input in
0128  * each UI being marked with this flag, or the application might get
0129  * confused.
0130  */
0131 # define UI_INPUT_FLAG_DEFAULT_PWD       0x02
0132 
0133 /*-
0134  * The user of these routines may want to define flags of their own.  The core
0135  * UI won't look at those, but will pass them on to the method routines.  They
0136  * must use higher bits so they don't get confused with the UI bits above.
0137  * UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use.  A good
0138  * example of use is this:
0139  *
0140  *    #define MY_UI_FLAG1       (0x01 << UI_INPUT_FLAG_USER_BASE)
0141  *
0142 */
0143 # define UI_INPUT_FLAG_USER_BASE 16
0144 
0145 /*-
0146  * The following function helps construct a prompt.
0147  * phrase_desc is a textual short description of the phrase to enter,
0148  * for example "pass phrase", and
0149  * object_name is the name of the object
0150  * (which might be a card name or a file name) or NULL.
0151  * The returned string shall always be allocated on the heap with
0152  * OPENSSL_malloc(), and need to be free'd with OPENSSL_free().
0153  *
0154  * If the ui_method doesn't contain a pointer to a user-defined prompt
0155  * constructor, a default string is built, looking like this:
0156  *
0157  *       "Enter {phrase_desc} for {object_name}:"
0158  *
0159  * So, if phrase_desc has the value "pass phrase" and object_name has
0160  * the value "foo.key", the resulting string is:
0161  *
0162  *       "Enter pass phrase for foo.key:"
0163 */
0164 char *UI_construct_prompt(UI *ui_method,
0165                           const char *phrase_desc, const char *object_name);
0166 
0167 /*
0168  * The following function is used to store a pointer to user-specific data.
0169  * Any previous such pointer will be returned and replaced.
0170  *
0171  * For callback purposes, this function makes a lot more sense than using
0172  * ex_data, since the latter requires that different parts of OpenSSL or
0173  * applications share the same ex_data index.
0174  *
0175  * Note that the UI_OpenSSL() method completely ignores the user data. Other
0176  * methods may not, however.
0177  */
0178 void *UI_add_user_data(UI *ui, void *user_data);
0179 /*
0180  * Alternatively, this function is used to duplicate the user data.
0181  * This uses the duplicator method function.  The destroy function will
0182  * be used to free the user data in this case.
0183  */
0184 int UI_dup_user_data(UI *ui, void *user_data);
0185 /* We need a user data retrieving function as well.  */
0186 void *UI_get0_user_data(UI *ui);
0187 
0188 /* Return the result associated with a prompt given with the index i. */
0189 const char *UI_get0_result(UI *ui, int i);
0190 int UI_get_result_length(UI *ui, int i);
0191 
0192 /* When all strings have been added, process the whole thing. */
0193 int UI_process(UI *ui);
0194 
0195 /*
0196  * Give a user interface parameterised control commands.  This can be used to
0197  * send down an integer, a data pointer or a function pointer, as well as be
0198  * used to get information from a UI.
0199  */
0200 int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f) (void));
0201 
0202 /* The commands */
0203 /*
0204  * Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the
0205  * OpenSSL error stack before printing any info or added error messages and
0206  * before any prompting.
0207  */
0208 # define UI_CTRL_PRINT_ERRORS            1
0209 /*
0210  * Check if a UI_process() is possible to do again with the same instance of
0211  * a user interface.  This makes UI_ctrl() return 1 if it is redoable, and 0
0212  * if not.
0213  */
0214 # define UI_CTRL_IS_REDOABLE             2
0215 
0216 /* Some methods may use extra data */
0217 # define UI_set_app_data(s,arg)         UI_set_ex_data(s,0,arg)
0218 # define UI_get_app_data(s)             UI_get_ex_data(s,0)
0219 
0220 # define UI_get_ex_new_index(l, p, newf, dupf, freef) \
0221     CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_UI, l, p, newf, dupf, freef)
0222 int UI_set_ex_data(UI *r, int idx, void *arg);
0223 void *UI_get_ex_data(const UI *r, int idx);
0224 
0225 /* Use specific methods instead of the built-in one */
0226 void UI_set_default_method(const UI_METHOD *meth);
0227 const UI_METHOD *UI_get_default_method(void);
0228 const UI_METHOD *UI_get_method(UI *ui);
0229 const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth);
0230 
0231 # ifndef OPENSSL_NO_UI_CONSOLE
0232 
0233 /* The method with all the built-in thingies */
0234 UI_METHOD *UI_OpenSSL(void);
0235 
0236 # endif
0237 
0238 /*
0239  * NULL method.  Literally does nothing, but may serve as a placeholder
0240  * to avoid internal default.
0241  */
0242 const UI_METHOD *UI_null(void);
0243 
0244 /* ---------- For method writers ---------- */
0245 /*-
0246    A method contains a number of functions that implement the low level
0247    of the User Interface.  The functions are:
0248 
0249         an opener       This function starts a session, maybe by opening
0250                         a channel to a tty, or by opening a window.
0251         a writer        This function is called to write a given string,
0252                         maybe to the tty, maybe as a field label in a
0253                         window.
0254         a flusher       This function is called to flush everything that
0255                         has been output so far.  It can be used to actually
0256                         display a dialog box after it has been built.
0257         a reader        This function is called to read a given prompt,
0258                         maybe from the tty, maybe from a field in a
0259                         window.  Note that it's called with all string
0260                         structures, not only the prompt ones, so it must
0261                         check such things itself.
0262         a closer        This function closes the session, maybe by closing
0263                         the channel to the tty, or closing the window.
0264 
0265    All these functions are expected to return:
0266 
0267         0       on error.
0268         1       on success.
0269         -1      on out-of-band events, for example if some prompting has
0270                 been canceled (by pressing Ctrl-C, for example).  This is
0271                 only checked when returned by the flusher or the reader.
0272 
0273    The way this is used, the opener is first called, then the writer for all
0274    strings, then the flusher, then the reader for all strings and finally the
0275    closer.  Note that if you want to prompt from a terminal or other command
0276    line interface, the best is to have the reader also write the prompts
0277    instead of having the writer do it.  If you want to prompt from a dialog
0278    box, the writer can be used to build up the contents of the box, and the
0279    flusher to actually display the box and run the event loop until all data
0280    has been given, after which the reader only grabs the given data and puts
0281    them back into the UI strings.
0282 
0283    All method functions take a UI as argument.  Additionally, the writer and
0284    the reader take a UI_STRING.
0285 */
0286 
0287 /*
0288  * The UI_STRING type is the data structure that contains all the needed info
0289  * about a string or a prompt, including test data for a verification prompt.
0290  */
0291 typedef struct ui_string_st UI_STRING;
0292 
0293 SKM_DEFINE_STACK_OF_INTERNAL(UI_STRING, UI_STRING, UI_STRING)
0294 #define sk_UI_STRING_num(sk) OPENSSL_sk_num(ossl_check_const_UI_STRING_sk_type(sk))
0295 #define sk_UI_STRING_value(sk, idx) ((UI_STRING *)OPENSSL_sk_value(ossl_check_const_UI_STRING_sk_type(sk), (idx)))
0296 #define sk_UI_STRING_new(cmp) ((STACK_OF(UI_STRING) *)OPENSSL_sk_new(ossl_check_UI_STRING_compfunc_type(cmp)))
0297 #define sk_UI_STRING_new_null() ((STACK_OF(UI_STRING) *)OPENSSL_sk_new_null())
0298 #define sk_UI_STRING_new_reserve(cmp, n) ((STACK_OF(UI_STRING) *)OPENSSL_sk_new_reserve(ossl_check_UI_STRING_compfunc_type(cmp), (n)))
0299 #define sk_UI_STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_UI_STRING_sk_type(sk), (n))
0300 #define sk_UI_STRING_free(sk) OPENSSL_sk_free(ossl_check_UI_STRING_sk_type(sk))
0301 #define sk_UI_STRING_zero(sk) OPENSSL_sk_zero(ossl_check_UI_STRING_sk_type(sk))
0302 #define sk_UI_STRING_delete(sk, i) ((UI_STRING *)OPENSSL_sk_delete(ossl_check_UI_STRING_sk_type(sk), (i)))
0303 #define sk_UI_STRING_delete_ptr(sk, ptr) ((UI_STRING *)OPENSSL_sk_delete_ptr(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)))
0304 #define sk_UI_STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr))
0305 #define sk_UI_STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr))
0306 #define sk_UI_STRING_pop(sk) ((UI_STRING *)OPENSSL_sk_pop(ossl_check_UI_STRING_sk_type(sk)))
0307 #define sk_UI_STRING_shift(sk) ((UI_STRING *)OPENSSL_sk_shift(ossl_check_UI_STRING_sk_type(sk)))
0308 #define sk_UI_STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_UI_STRING_sk_type(sk),ossl_check_UI_STRING_freefunc_type(freefunc))
0309 #define sk_UI_STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr), (idx))
0310 #define sk_UI_STRING_set(sk, idx, ptr) ((UI_STRING *)OPENSSL_sk_set(ossl_check_UI_STRING_sk_type(sk), (idx), ossl_check_UI_STRING_type(ptr)))
0311 #define sk_UI_STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr))
0312 #define sk_UI_STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr))
0313 #define sk_UI_STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr), pnum)
0314 #define sk_UI_STRING_sort(sk) OPENSSL_sk_sort(ossl_check_UI_STRING_sk_type(sk))
0315 #define sk_UI_STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_UI_STRING_sk_type(sk))
0316 #define sk_UI_STRING_dup(sk) ((STACK_OF(UI_STRING) *)OPENSSL_sk_dup(ossl_check_const_UI_STRING_sk_type(sk)))
0317 #define sk_UI_STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(UI_STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_UI_STRING_sk_type(sk), ossl_check_UI_STRING_copyfunc_type(copyfunc), ossl_check_UI_STRING_freefunc_type(freefunc)))
0318 #define sk_UI_STRING_set_cmp_func(sk, cmp) ((sk_UI_STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_compfunc_type(cmp)))
0319 
0320 
0321 /*
0322  * The different types of strings that are currently supported. This is only
0323  * needed by method authors.
0324  */
0325 enum UI_string_types {
0326     UIT_NONE = 0,
0327     UIT_PROMPT,                 /* Prompt for a string */
0328     UIT_VERIFY,                 /* Prompt for a string and verify */
0329     UIT_BOOLEAN,                /* Prompt for a yes/no response */
0330     UIT_INFO,                   /* Send info to the user */
0331     UIT_ERROR                   /* Send an error message to the user */
0332 };
0333 
0334 /* Create and manipulate methods */
0335 UI_METHOD *UI_create_method(const char *name);
0336 void UI_destroy_method(UI_METHOD *ui_method);
0337 int UI_method_set_opener(UI_METHOD *method, int (*opener) (UI *ui));
0338 int UI_method_set_writer(UI_METHOD *method,
0339                          int (*writer) (UI *ui, UI_STRING *uis));
0340 int UI_method_set_flusher(UI_METHOD *method, int (*flusher) (UI *ui));
0341 int UI_method_set_reader(UI_METHOD *method,
0342                          int (*reader) (UI *ui, UI_STRING *uis));
0343 int UI_method_set_closer(UI_METHOD *method, int (*closer) (UI *ui));
0344 int UI_method_set_data_duplicator(UI_METHOD *method,
0345                                   void *(*duplicator) (UI *ui, void *ui_data),
0346                                   void (*destructor)(UI *ui, void *ui_data));
0347 int UI_method_set_prompt_constructor(UI_METHOD *method,
0348                                      char *(*prompt_constructor) (UI *ui,
0349                                                                   const char
0350                                                                   *phrase_desc,
0351                                                                   const char
0352                                                                   *object_name));
0353 int UI_method_set_ex_data(UI_METHOD *method, int idx, void *data);
0354 int (*UI_method_get_opener(const UI_METHOD *method)) (UI *);
0355 int (*UI_method_get_writer(const UI_METHOD *method)) (UI *, UI_STRING *);
0356 int (*UI_method_get_flusher(const UI_METHOD *method)) (UI *);
0357 int (*UI_method_get_reader(const UI_METHOD *method)) (UI *, UI_STRING *);
0358 int (*UI_method_get_closer(const UI_METHOD *method)) (UI *);
0359 char *(*UI_method_get_prompt_constructor(const UI_METHOD *method))
0360     (UI *, const char *, const char *);
0361 void *(*UI_method_get_data_duplicator(const UI_METHOD *method)) (UI *, void *);
0362 void (*UI_method_get_data_destructor(const UI_METHOD *method)) (UI *, void *);
0363 const void *UI_method_get_ex_data(const UI_METHOD *method, int idx);
0364 
0365 /*
0366  * The following functions are helpers for method writers to access relevant
0367  * data from a UI_STRING.
0368  */
0369 
0370 /* Return type of the UI_STRING */
0371 enum UI_string_types UI_get_string_type(UI_STRING *uis);
0372 /* Return input flags of the UI_STRING */
0373 int UI_get_input_flags(UI_STRING *uis);
0374 /* Return the actual string to output (the prompt, info or error) */
0375 const char *UI_get0_output_string(UI_STRING *uis);
0376 /*
0377  * Return the optional action string to output (the boolean prompt
0378  * instruction)
0379  */
0380 const char *UI_get0_action_string(UI_STRING *uis);
0381 /* Return the result of a prompt */
0382 const char *UI_get0_result_string(UI_STRING *uis);
0383 int UI_get_result_string_length(UI_STRING *uis);
0384 /*
0385  * Return the string to test the result against.  Only useful with verifies.
0386  */
0387 const char *UI_get0_test_string(UI_STRING *uis);
0388 /* Return the required minimum size of the result */
0389 int UI_get_result_minsize(UI_STRING *uis);
0390 /* Return the required maximum size of the result */
0391 int UI_get_result_maxsize(UI_STRING *uis);
0392 /* Set the result of a UI_STRING. */
0393 int UI_set_result(UI *ui, UI_STRING *uis, const char *result);
0394 int UI_set_result_ex(UI *ui, UI_STRING *uis, const char *result, int len);
0395 
0396 /* A couple of popular utility functions */
0397 int UI_UTIL_read_pw_string(char *buf, int length, const char *prompt,
0398                            int verify);
0399 int UI_UTIL_read_pw(char *buf, char *buff, int size, const char *prompt,
0400                     int verify);
0401 UI_METHOD *UI_UTIL_wrap_read_pem_callback(pem_password_cb *cb, int rwflag);
0402 
0403 
0404 # ifdef  __cplusplus
0405 }
0406 # endif
0407 #endif