annotate CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/include/openssl/ui.h @ 69:33d812a61356

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 17:55:14 -0400
parents
children
rev   line source
jpayne@69 1 /*
jpayne@69 2 * Copyright 2001-2018 The OpenSSL Project Authors. All Rights Reserved.
jpayne@69 3 *
jpayne@69 4 * Licensed under the OpenSSL license (the "License"). You may not use
jpayne@69 5 * this file except in compliance with the License. You can obtain a copy
jpayne@69 6 * in the file LICENSE in the source distribution or at
jpayne@69 7 * https://www.openssl.org/source/license.html
jpayne@69 8 */
jpayne@69 9
jpayne@69 10 #ifndef HEADER_UI_H
jpayne@69 11 # define HEADER_UI_H
jpayne@69 12
jpayne@69 13 # include <openssl/opensslconf.h>
jpayne@69 14
jpayne@69 15 # if OPENSSL_API_COMPAT < 0x10100000L
jpayne@69 16 # include <openssl/crypto.h>
jpayne@69 17 # endif
jpayne@69 18 # include <openssl/safestack.h>
jpayne@69 19 # include <openssl/pem.h>
jpayne@69 20 # include <openssl/ossl_typ.h>
jpayne@69 21 # include <openssl/uierr.h>
jpayne@69 22
jpayne@69 23 /* For compatibility reasons, the macro OPENSSL_NO_UI is currently retained */
jpayne@69 24 # if OPENSSL_API_COMPAT < 0x10200000L
jpayne@69 25 # ifdef OPENSSL_NO_UI_CONSOLE
jpayne@69 26 # define OPENSSL_NO_UI
jpayne@69 27 # endif
jpayne@69 28 # endif
jpayne@69 29
jpayne@69 30 # ifdef __cplusplus
jpayne@69 31 extern "C" {
jpayne@69 32 # endif
jpayne@69 33
jpayne@69 34 /*
jpayne@69 35 * All the following functions return -1 or NULL on error and in some cases
jpayne@69 36 * (UI_process()) -2 if interrupted or in some other way cancelled. When
jpayne@69 37 * everything is fine, they return 0, a positive value or a non-NULL pointer,
jpayne@69 38 * all depending on their purpose.
jpayne@69 39 */
jpayne@69 40
jpayne@69 41 /* Creators and destructor. */
jpayne@69 42 UI *UI_new(void);
jpayne@69 43 UI *UI_new_method(const UI_METHOD *method);
jpayne@69 44 void UI_free(UI *ui);
jpayne@69 45
jpayne@69 46 /*-
jpayne@69 47 The following functions are used to add strings to be printed and prompt
jpayne@69 48 strings to prompt for data. The names are UI_{add,dup}_<function>_string
jpayne@69 49 and UI_{add,dup}_input_boolean.
jpayne@69 50
jpayne@69 51 UI_{add,dup}_<function>_string have the following meanings:
jpayne@69 52 add add a text or prompt string. The pointers given to these
jpayne@69 53 functions are used verbatim, no copying is done.
jpayne@69 54 dup make a copy of the text or prompt string, then add the copy
jpayne@69 55 to the collection of strings in the user interface.
jpayne@69 56 <function>
jpayne@69 57 The function is a name for the functionality that the given
jpayne@69 58 string shall be used for. It can be one of:
jpayne@69 59 input use the string as data prompt.
jpayne@69 60 verify use the string as verification prompt. This
jpayne@69 61 is used to verify a previous input.
jpayne@69 62 info use the string for informational output.
jpayne@69 63 error use the string for error output.
jpayne@69 64 Honestly, there's currently no difference between info and error for the
jpayne@69 65 moment.
jpayne@69 66
jpayne@69 67 UI_{add,dup}_input_boolean have the same semantics for "add" and "dup",
jpayne@69 68 and are typically used when one wants to prompt for a yes/no response.
jpayne@69 69
jpayne@69 70 All of the functions in this group take a UI and a prompt string.
jpayne@69 71 The string input and verify addition functions also take a flag argument,
jpayne@69 72 a buffer for the result to end up with, a minimum input size and a maximum
jpayne@69 73 input size (the result buffer MUST be large enough to be able to contain
jpayne@69 74 the maximum number of characters). Additionally, the verify addition
jpayne@69 75 functions takes another buffer to compare the result against.
jpayne@69 76 The boolean input functions take an action description string (which should
jpayne@69 77 be safe to ignore if the expected user action is obvious, for example with
jpayne@69 78 a dialog box with an OK button and a Cancel button), a string of acceptable
jpayne@69 79 characters to mean OK and to mean Cancel. The two last strings are checked
jpayne@69 80 to make sure they don't have common characters. Additionally, the same
jpayne@69 81 flag argument as for the string input is taken, as well as a result buffer.
jpayne@69 82 The result buffer is required to be at least one byte long. Depending on
jpayne@69 83 the answer, the first character from the OK or the Cancel character strings
jpayne@69 84 will be stored in the first byte of the result buffer. No NUL will be
jpayne@69 85 added, so the result is *not* a string.
jpayne@69 86
jpayne@69 87 On success, the all return an index of the added information. That index
jpayne@69 88 is useful when retrieving results with UI_get0_result(). */
jpayne@69 89 int UI_add_input_string(UI *ui, const char *prompt, int flags,
jpayne@69 90 char *result_buf, int minsize, int maxsize);
jpayne@69 91 int UI_dup_input_string(UI *ui, const char *prompt, int flags,
jpayne@69 92 char *result_buf, int minsize, int maxsize);
jpayne@69 93 int UI_add_verify_string(UI *ui, const char *prompt, int flags,
jpayne@69 94 char *result_buf, int minsize, int maxsize,
jpayne@69 95 const char *test_buf);
jpayne@69 96 int UI_dup_verify_string(UI *ui, const char *prompt, int flags,
jpayne@69 97 char *result_buf, int minsize, int maxsize,
jpayne@69 98 const char *test_buf);
jpayne@69 99 int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc,
jpayne@69 100 const char *ok_chars, const char *cancel_chars,
jpayne@69 101 int flags, char *result_buf);
jpayne@69 102 int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc,
jpayne@69 103 const char *ok_chars, const char *cancel_chars,
jpayne@69 104 int flags, char *result_buf);
jpayne@69 105 int UI_add_info_string(UI *ui, const char *text);
jpayne@69 106 int UI_dup_info_string(UI *ui, const char *text);
jpayne@69 107 int UI_add_error_string(UI *ui, const char *text);
jpayne@69 108 int UI_dup_error_string(UI *ui, const char *text);
jpayne@69 109
jpayne@69 110 /* These are the possible flags. They can be or'ed together. */
jpayne@69 111 /* Use to have echoing of input */
jpayne@69 112 # define UI_INPUT_FLAG_ECHO 0x01
jpayne@69 113 /*
jpayne@69 114 * Use a default password. Where that password is found is completely up to
jpayne@69 115 * the application, it might for example be in the user data set with
jpayne@69 116 * UI_add_user_data(). It is not recommended to have more than one input in
jpayne@69 117 * each UI being marked with this flag, or the application might get
jpayne@69 118 * confused.
jpayne@69 119 */
jpayne@69 120 # define UI_INPUT_FLAG_DEFAULT_PWD 0x02
jpayne@69 121
jpayne@69 122 /*-
jpayne@69 123 * The user of these routines may want to define flags of their own. The core
jpayne@69 124 * UI won't look at those, but will pass them on to the method routines. They
jpayne@69 125 * must use higher bits so they don't get confused with the UI bits above.
jpayne@69 126 * UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use. A good
jpayne@69 127 * example of use is this:
jpayne@69 128 *
jpayne@69 129 * #define MY_UI_FLAG1 (0x01 << UI_INPUT_FLAG_USER_BASE)
jpayne@69 130 *
jpayne@69 131 */
jpayne@69 132 # define UI_INPUT_FLAG_USER_BASE 16
jpayne@69 133
jpayne@69 134 /*-
jpayne@69 135 * The following function helps construct a prompt. object_desc is a
jpayne@69 136 * textual short description of the object, for example "pass phrase",
jpayne@69 137 * and object_name is the name of the object (might be a card name or
jpayne@69 138 * a file name.
jpayne@69 139 * The returned string shall always be allocated on the heap with
jpayne@69 140 * OPENSSL_malloc(), and need to be free'd with OPENSSL_free().
jpayne@69 141 *
jpayne@69 142 * If the ui_method doesn't contain a pointer to a user-defined prompt
jpayne@69 143 * constructor, a default string is built, looking like this:
jpayne@69 144 *
jpayne@69 145 * "Enter {object_desc} for {object_name}:"
jpayne@69 146 *
jpayne@69 147 * So, if object_desc has the value "pass phrase" and object_name has
jpayne@69 148 * the value "foo.key", the resulting string is:
jpayne@69 149 *
jpayne@69 150 * "Enter pass phrase for foo.key:"
jpayne@69 151 */
jpayne@69 152 char *UI_construct_prompt(UI *ui_method,
jpayne@69 153 const char *object_desc, const char *object_name);
jpayne@69 154
jpayne@69 155 /*
jpayne@69 156 * The following function is used to store a pointer to user-specific data.
jpayne@69 157 * Any previous such pointer will be returned and replaced.
jpayne@69 158 *
jpayne@69 159 * For callback purposes, this function makes a lot more sense than using
jpayne@69 160 * ex_data, since the latter requires that different parts of OpenSSL or
jpayne@69 161 * applications share the same ex_data index.
jpayne@69 162 *
jpayne@69 163 * Note that the UI_OpenSSL() method completely ignores the user data. Other
jpayne@69 164 * methods may not, however.
jpayne@69 165 */
jpayne@69 166 void *UI_add_user_data(UI *ui, void *user_data);
jpayne@69 167 /*
jpayne@69 168 * Alternatively, this function is used to duplicate the user data.
jpayne@69 169 * This uses the duplicator method function. The destroy function will
jpayne@69 170 * be used to free the user data in this case.
jpayne@69 171 */
jpayne@69 172 int UI_dup_user_data(UI *ui, void *user_data);
jpayne@69 173 /* We need a user data retrieving function as well. */
jpayne@69 174 void *UI_get0_user_data(UI *ui);
jpayne@69 175
jpayne@69 176 /* Return the result associated with a prompt given with the index i. */
jpayne@69 177 const char *UI_get0_result(UI *ui, int i);
jpayne@69 178 int UI_get_result_length(UI *ui, int i);
jpayne@69 179
jpayne@69 180 /* When all strings have been added, process the whole thing. */
jpayne@69 181 int UI_process(UI *ui);
jpayne@69 182
jpayne@69 183 /*
jpayne@69 184 * Give a user interface parameterised control commands. This can be used to
jpayne@69 185 * send down an integer, a data pointer or a function pointer, as well as be
jpayne@69 186 * used to get information from a UI.
jpayne@69 187 */
jpayne@69 188 int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f) (void));
jpayne@69 189
jpayne@69 190 /* The commands */
jpayne@69 191 /*
jpayne@69 192 * Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the
jpayne@69 193 * OpenSSL error stack before printing any info or added error messages and
jpayne@69 194 * before any prompting.
jpayne@69 195 */
jpayne@69 196 # define UI_CTRL_PRINT_ERRORS 1
jpayne@69 197 /*
jpayne@69 198 * Check if a UI_process() is possible to do again with the same instance of
jpayne@69 199 * a user interface. This makes UI_ctrl() return 1 if it is redoable, and 0
jpayne@69 200 * if not.
jpayne@69 201 */
jpayne@69 202 # define UI_CTRL_IS_REDOABLE 2
jpayne@69 203
jpayne@69 204 /* Some methods may use extra data */
jpayne@69 205 # define UI_set_app_data(s,arg) UI_set_ex_data(s,0,arg)
jpayne@69 206 # define UI_get_app_data(s) UI_get_ex_data(s,0)
jpayne@69 207
jpayne@69 208 # define UI_get_ex_new_index(l, p, newf, dupf, freef) \
jpayne@69 209 CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_UI, l, p, newf, dupf, freef)
jpayne@69 210 int UI_set_ex_data(UI *r, int idx, void *arg);
jpayne@69 211 void *UI_get_ex_data(UI *r, int idx);
jpayne@69 212
jpayne@69 213 /* Use specific methods instead of the built-in one */
jpayne@69 214 void UI_set_default_method(const UI_METHOD *meth);
jpayne@69 215 const UI_METHOD *UI_get_default_method(void);
jpayne@69 216 const UI_METHOD *UI_get_method(UI *ui);
jpayne@69 217 const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth);
jpayne@69 218
jpayne@69 219 # ifndef OPENSSL_NO_UI_CONSOLE
jpayne@69 220
jpayne@69 221 /* The method with all the built-in thingies */
jpayne@69 222 UI_METHOD *UI_OpenSSL(void);
jpayne@69 223
jpayne@69 224 # endif
jpayne@69 225
jpayne@69 226 /*
jpayne@69 227 * NULL method. Literally does nothing, but may serve as a placeholder
jpayne@69 228 * to avoid internal default.
jpayne@69 229 */
jpayne@69 230 const UI_METHOD *UI_null(void);
jpayne@69 231
jpayne@69 232 /* ---------- For method writers ---------- */
jpayne@69 233 /*-
jpayne@69 234 A method contains a number of functions that implement the low level
jpayne@69 235 of the User Interface. The functions are:
jpayne@69 236
jpayne@69 237 an opener This function starts a session, maybe by opening
jpayne@69 238 a channel to a tty, or by opening a window.
jpayne@69 239 a writer This function is called to write a given string,
jpayne@69 240 maybe to the tty, maybe as a field label in a
jpayne@69 241 window.
jpayne@69 242 a flusher This function is called to flush everything that
jpayne@69 243 has been output so far. It can be used to actually
jpayne@69 244 display a dialog box after it has been built.
jpayne@69 245 a reader This function is called to read a given prompt,
jpayne@69 246 maybe from the tty, maybe from a field in a
jpayne@69 247 window. Note that it's called with all string
jpayne@69 248 structures, not only the prompt ones, so it must
jpayne@69 249 check such things itself.
jpayne@69 250 a closer This function closes the session, maybe by closing
jpayne@69 251 the channel to the tty, or closing the window.
jpayne@69 252
jpayne@69 253 All these functions are expected to return:
jpayne@69 254
jpayne@69 255 0 on error.
jpayne@69 256 1 on success.
jpayne@69 257 -1 on out-of-band events, for example if some prompting has
jpayne@69 258 been canceled (by pressing Ctrl-C, for example). This is
jpayne@69 259 only checked when returned by the flusher or the reader.
jpayne@69 260
jpayne@69 261 The way this is used, the opener is first called, then the writer for all
jpayne@69 262 strings, then the flusher, then the reader for all strings and finally the
jpayne@69 263 closer. Note that if you want to prompt from a terminal or other command
jpayne@69 264 line interface, the best is to have the reader also write the prompts
jpayne@69 265 instead of having the writer do it. If you want to prompt from a dialog
jpayne@69 266 box, the writer can be used to build up the contents of the box, and the
jpayne@69 267 flusher to actually display the box and run the event loop until all data
jpayne@69 268 has been given, after which the reader only grabs the given data and puts
jpayne@69 269 them back into the UI strings.
jpayne@69 270
jpayne@69 271 All method functions take a UI as argument. Additionally, the writer and
jpayne@69 272 the reader take a UI_STRING.
jpayne@69 273 */
jpayne@69 274
jpayne@69 275 /*
jpayne@69 276 * The UI_STRING type is the data structure that contains all the needed info
jpayne@69 277 * about a string or a prompt, including test data for a verification prompt.
jpayne@69 278 */
jpayne@69 279 typedef struct ui_string_st UI_STRING;
jpayne@69 280 DEFINE_STACK_OF(UI_STRING)
jpayne@69 281
jpayne@69 282 /*
jpayne@69 283 * The different types of strings that are currently supported. This is only
jpayne@69 284 * needed by method authors.
jpayne@69 285 */
jpayne@69 286 enum UI_string_types {
jpayne@69 287 UIT_NONE = 0,
jpayne@69 288 UIT_PROMPT, /* Prompt for a string */
jpayne@69 289 UIT_VERIFY, /* Prompt for a string and verify */
jpayne@69 290 UIT_BOOLEAN, /* Prompt for a yes/no response */
jpayne@69 291 UIT_INFO, /* Send info to the user */
jpayne@69 292 UIT_ERROR /* Send an error message to the user */
jpayne@69 293 };
jpayne@69 294
jpayne@69 295 /* Create and manipulate methods */
jpayne@69 296 UI_METHOD *UI_create_method(const char *name);
jpayne@69 297 void UI_destroy_method(UI_METHOD *ui_method);
jpayne@69 298 int UI_method_set_opener(UI_METHOD *method, int (*opener) (UI *ui));
jpayne@69 299 int UI_method_set_writer(UI_METHOD *method,
jpayne@69 300 int (*writer) (UI *ui, UI_STRING *uis));
jpayne@69 301 int UI_method_set_flusher(UI_METHOD *method, int (*flusher) (UI *ui));
jpayne@69 302 int UI_method_set_reader(UI_METHOD *method,
jpayne@69 303 int (*reader) (UI *ui, UI_STRING *uis));
jpayne@69 304 int UI_method_set_closer(UI_METHOD *method, int (*closer) (UI *ui));
jpayne@69 305 int UI_method_set_data_duplicator(UI_METHOD *method,
jpayne@69 306 void *(*duplicator) (UI *ui, void *ui_data),
jpayne@69 307 void (*destructor)(UI *ui, void *ui_data));
jpayne@69 308 int UI_method_set_prompt_constructor(UI_METHOD *method,
jpayne@69 309 char *(*prompt_constructor) (UI *ui,
jpayne@69 310 const char
jpayne@69 311 *object_desc,
jpayne@69 312 const char
jpayne@69 313 *object_name));
jpayne@69 314 int UI_method_set_ex_data(UI_METHOD *method, int idx, void *data);
jpayne@69 315 int (*UI_method_get_opener(const UI_METHOD *method)) (UI *);
jpayne@69 316 int (*UI_method_get_writer(const UI_METHOD *method)) (UI *, UI_STRING *);
jpayne@69 317 int (*UI_method_get_flusher(const UI_METHOD *method)) (UI *);
jpayne@69 318 int (*UI_method_get_reader(const UI_METHOD *method)) (UI *, UI_STRING *);
jpayne@69 319 int (*UI_method_get_closer(const UI_METHOD *method)) (UI *);
jpayne@69 320 char *(*UI_method_get_prompt_constructor(const UI_METHOD *method))
jpayne@69 321 (UI *, const char *, const char *);
jpayne@69 322 void *(*UI_method_get_data_duplicator(const UI_METHOD *method)) (UI *, void *);
jpayne@69 323 void (*UI_method_get_data_destructor(const UI_METHOD *method)) (UI *, void *);
jpayne@69 324 const void *UI_method_get_ex_data(const UI_METHOD *method, int idx);
jpayne@69 325
jpayne@69 326 /*
jpayne@69 327 * The following functions are helpers for method writers to access relevant
jpayne@69 328 * data from a UI_STRING.
jpayne@69 329 */
jpayne@69 330
jpayne@69 331 /* Return type of the UI_STRING */
jpayne@69 332 enum UI_string_types UI_get_string_type(UI_STRING *uis);
jpayne@69 333 /* Return input flags of the UI_STRING */
jpayne@69 334 int UI_get_input_flags(UI_STRING *uis);
jpayne@69 335 /* Return the actual string to output (the prompt, info or error) */
jpayne@69 336 const char *UI_get0_output_string(UI_STRING *uis);
jpayne@69 337 /*
jpayne@69 338 * Return the optional action string to output (the boolean prompt
jpayne@69 339 * instruction)
jpayne@69 340 */
jpayne@69 341 const char *UI_get0_action_string(UI_STRING *uis);
jpayne@69 342 /* Return the result of a prompt */
jpayne@69 343 const char *UI_get0_result_string(UI_STRING *uis);
jpayne@69 344 int UI_get_result_string_length(UI_STRING *uis);
jpayne@69 345 /*
jpayne@69 346 * Return the string to test the result against. Only useful with verifies.
jpayne@69 347 */
jpayne@69 348 const char *UI_get0_test_string(UI_STRING *uis);
jpayne@69 349 /* Return the required minimum size of the result */
jpayne@69 350 int UI_get_result_minsize(UI_STRING *uis);
jpayne@69 351 /* Return the required maximum size of the result */
jpayne@69 352 int UI_get_result_maxsize(UI_STRING *uis);
jpayne@69 353 /* Set the result of a UI_STRING. */
jpayne@69 354 int UI_set_result(UI *ui, UI_STRING *uis, const char *result);
jpayne@69 355 int UI_set_result_ex(UI *ui, UI_STRING *uis, const char *result, int len);
jpayne@69 356
jpayne@69 357 /* A couple of popular utility functions */
jpayne@69 358 int UI_UTIL_read_pw_string(char *buf, int length, const char *prompt,
jpayne@69 359 int verify);
jpayne@69 360 int UI_UTIL_read_pw(char *buf, char *buff, int size, const char *prompt,
jpayne@69 361 int verify);
jpayne@69 362 UI_METHOD *UI_UTIL_wrap_read_pem_callback(pem_password_cb *cb, int rwflag);
jpayne@69 363
jpayne@69 364
jpayne@69 365 # ifdef __cplusplus
jpayne@69 366 }
jpayne@69 367 # endif
jpayne@69 368 #endif