xref: /openssl/include/openssl/ui.h.in (revision 9cedfc90)
1/*
2 * {- join("\n * ", @autowarntext) -}
3 *
4 * Copyright 2001-2020 The OpenSSL Project Authors. All Rights Reserved.
5 *
6 * Licensed under the Apache License 2.0 (the "License").  You may not use
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
10 */
11
12{-
13use OpenSSL::stackhash qw(generate_stack_macros);
14-}
15
16#ifndef OPENSSL_UI_H
17# define OPENSSL_UI_H
18# pragma once
19
20# include <openssl/macros.h>
21# ifndef OPENSSL_NO_DEPRECATED_3_0
22#  define HEADER_UI_H
23# endif
24
25# include <openssl/opensslconf.h>
26
27# ifndef OPENSSL_NO_DEPRECATED_1_1_0
28#  include <openssl/crypto.h>
29# endif
30# include <openssl/safestack.h>
31# include <openssl/pem.h>
32# include <openssl/types.h>
33# include <openssl/uierr.h>
34
35/* For compatibility reasons, the macro OPENSSL_NO_UI is currently retained */
36# ifndef OPENSSL_NO_DEPRECATED_3_0
37#  ifdef OPENSSL_NO_UI_CONSOLE
38#   define OPENSSL_NO_UI
39#  endif
40# endif
41
42# ifdef  __cplusplus
43extern "C" {
44# endif
45
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 */
52
53/* Creators and destructor.   */
54UI *UI_new(void);
55UI *UI_new_method(const UI_METHOD *method);
56void UI_free(UI *ui);
57
58/*-
59   The following functions are used to add strings to be printed and prompt
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:
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.
76   Honestly, there's currently no difference between info and error for the
77   moment.
78
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
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.
98
99   On success, the all return an index of the added information.  That index
100   is useful when retrieving results with UI_get0_result(). */
101int UI_add_input_string(UI *ui, const char *prompt, int flags,
102                        char *result_buf, int minsize, int maxsize);
103int UI_dup_input_string(UI *ui, const char *prompt, int flags,
104                        char *result_buf, int minsize, int maxsize);
105int UI_add_verify_string(UI *ui, const char *prompt, int flags,
106                         char *result_buf, int minsize, int maxsize,
107                         const char *test_buf);
108int UI_dup_verify_string(UI *ui, const char *prompt, int flags,
109                         char *result_buf, int minsize, int maxsize,
110                         const char *test_buf);
111int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc,
112                         const char *ok_chars, const char *cancel_chars,
113                         int flags, char *result_buf);
114int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc,
115                         const char *ok_chars, const char *cancel_chars,
116                         int flags, char *result_buf);
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
122/* These are the possible flags.  They can be or'ed together. */
123/* Use to have echoing of input */
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 */
132# define UI_INPUT_FLAG_DEFAULT_PWD       0x02
133
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 *
141 *    #define MY_UI_FLAG1       (0x01 << UI_INPUT_FLAG_USER_BASE)
142 *
143*/
144# define UI_INPUT_FLAG_USER_BASE 16
145
146/*-
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.
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 *
158 *       "Enter {phrase_desc} for {object_name}:"
159 *
160 * So, if phrase_desc has the value "pass phrase" and object_name has
161 * the value "foo.key", the resulting string is:
162 *
163 *       "Enter pass phrase for foo.key:"
164*/
165char *UI_construct_prompt(UI *ui_method,
166                          const char *phrase_desc, const char *object_name);
167
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 */
179void *UI_add_user_data(UI *ui, void *user_data);
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);
186/* We need a user data retrieving function as well.  */
187void *UI_get0_user_data(UI *ui);
188
189/* Return the result associated with a prompt given with the index i. */
190const char *UI_get0_result(UI *ui, int i);
191int UI_get_result_length(UI *ui, int i);
192
193/* When all strings have been added, process the whole thing. */
194int UI_process(UI *ui);
195
196/*
197 * Give a user interface parameterised control commands.  This can be used to
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));
202
203/* The commands */
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 */
209# define UI_CTRL_PRINT_ERRORS            1
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
216
217/* Some methods may use extra data */
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)
220
221# define UI_get_ex_new_index(l, p, newf, dupf, freef) \
222    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_UI, l, p, newf, dupf, freef)
223int UI_set_ex_data(UI *r, int idx, void *arg);
224void *UI_get_ex_data(const UI *r, int idx);
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
232# ifndef OPENSSL_NO_UI_CONSOLE
233
234/* The method with all the built-in thingies */
235UI_METHOD *UI_OpenSSL(void);
236
237# endif
238
239/*
240 * NULL method.  Literally does nothing, but may serve as a placeholder
241 * to avoid internal default.
242 */
243const UI_METHOD *UI_null(void);
244
245/* ---------- For method writers ---------- */
246/*-
247   A method contains a number of functions that implement the low level
248   of the User Interface.  The functions are:
249
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
260                        window.  Note that it's called with all string
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.
265
266   All these functions are expected to return:
267
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.
273
274   The way this is used, the opener is first called, then the writer for all
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
284   All method functions take a UI as argument.  Additionally, the writer and
285   the reader take a UI_STRING.
286*/
287
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 */
292typedef struct ui_string_st UI_STRING;
293
294{-
295    generate_stack_macros("UI_STRING");
296-}
297
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};
310
311/* Create and manipulate methods */
312UI_METHOD *UI_create_method(const char *name);
313void UI_destroy_method(UI_METHOD *ui_method);
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));
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));
324int UI_method_set_prompt_constructor(UI_METHOD *method,
325                                     char *(*prompt_constructor) (UI *ui,
326                                                                  const char
327                                                                  *phrase_desc,
328                                                                  const char
329                                                                  *object_name));
330int UI_method_set_ex_data(UI_METHOD *method, int idx, void *data);
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 *);
338void *(*UI_method_get_data_duplicator(const UI_METHOD *method)) (UI *, void *);
339void (*UI_method_get_data_destructor(const UI_METHOD *method)) (UI *, void *);
340const void *UI_method_get_ex_data(const UI_METHOD *method, int idx);
341
342/*
343 * The following functions are helpers for method writers to access relevant
344 * data from a UI_STRING.
345 */
346
347/* Return type of the UI_STRING */
348enum UI_string_types UI_get_string_type(UI_STRING *uis);
349/* Return input flags of the UI_STRING */
350int UI_get_input_flags(UI_STRING *uis);
351/* Return the actual string to output (the prompt, info or error) */
352const char *UI_get0_output_string(UI_STRING *uis);
353/*
354 * Return the optional action string to output (the boolean prompt
355 * instruction)
356 */
357const char *UI_get0_action_string(UI_STRING *uis);
358/* Return the result of a prompt */
359const char *UI_get0_result_string(UI_STRING *uis);
360int UI_get_result_string_length(UI_STRING *uis);
361/*
362 * Return the string to test the result against.  Only useful with verifies.
363 */
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. */
370int UI_set_result(UI *ui, UI_STRING *uis, const char *result);
371int UI_set_result_ex(UI *ui, UI_STRING *uis, const char *result, int len);
372
373/* A couple of popular utility functions */
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);
378UI_METHOD *UI_UTIL_wrap_read_pem_callback(pem_password_cb *cb, int rwflag);
379
380
381# ifdef  __cplusplus
382}
383# endif
384#endif
385