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