xref: /openbsd-src/lib/libcrypto/ui/ui.h (revision 9a24d3d46b77fb4100d7eca4323d790bdea6bf0a)
1 /* $OpenBSD: ui.h,v 1.19 2024/08/31 10:28:03 tb Exp $ */
2 /* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
3  * project 2001.
4  */
5 /* ====================================================================
6  * Copyright (c) 2001 The OpenSSL Project.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in
17  *    the documentation and/or other materials provided with the
18  *    distribution.
19  *
20  * 3. All advertising materials mentioning features or use of this
21  *    software must display the following acknowledgment:
22  *    "This product includes software developed by the OpenSSL Project
23  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
24  *
25  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26  *    endorse or promote products derived from this software without
27  *    prior written permission. For written permission, please contact
28  *    openssl-core@openssl.org.
29  *
30  * 5. Products derived from this software may not be called "OpenSSL"
31  *    nor may "OpenSSL" appear in their names without prior written
32  *    permission of the OpenSSL Project.
33  *
34  * 6. Redistributions of any form whatsoever must retain the following
35  *    acknowledgment:
36  *    "This product includes software developed by the OpenSSL Project
37  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
38  *
39  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50  * OF THE POSSIBILITY OF SUCH DAMAGE.
51  * ====================================================================
52  *
53  * This product includes cryptographic software written by Eric Young
54  * (eay@cryptsoft.com).  This product includes software written by Tim
55  * Hudson (tjh@cryptsoft.com).
56  *
57  */
58 
59 #ifndef HEADER_UI_H
60 #define HEADER_UI_H
61 
62 #include <openssl/opensslconf.h>
63 
64 #include <openssl/crypto.h>
65 #include <openssl/safestack.h>
66 #include <openssl/ossl_typ.h>
67 
68 #ifdef  __cplusplus
69 extern "C" {
70 #endif
71 
72 /* Declared already in ossl_typ.h */
73 /* typedef struct ui_st UI; */
74 /* typedef struct ui_method_st UI_METHOD; */
75 
76 
77 /*
78  * All the following functions return -1 or NULL on error and in some cases
79  * (UI_process()) -2 if interrupted or in some other way cancelled.
80  * When everything is fine, they return 0, a positive value or a non-NULL
81  * pointer, all depending on their purpose.
82  */
83 
84 /* Creators and destructor.   */
85 UI *UI_new(void);
86 UI *UI_new_method(const UI_METHOD *method);
87 void UI_free(UI *ui);
88 
89 /*
90  * The following functions are used to add strings to be printed and prompt
91  * strings to prompt for data.  The names are UI_{add,dup}_<function>_string
92  * and UI_{add,dup}_input_boolean.
93  *
94  * UI_{add,dup}_<function>_string have the following meanings:
95  *	add	add a text or prompt string.  The pointers given to these
96  *		functions are used verbatim, no copying is done.
97  *	dup	make a copy of the text or prompt string, then add the copy
98  *		to the collection of strings in the user interface.
99  *	<function>
100  *		The function is a name for the functionality that the given
101  *		string shall be used for.  It can be one of:
102  *			input	use the string as data prompt.
103  *			verify	use the string as verification prompt.  This
104  *				is used to verify a previous input.
105  *			info	use the string for informational output.
106  *			error	use the string for error output.
107  * Honestly, there's currently no difference between info and error for the
108  * moment.
109  *
110  * UI_{add,dup}_input_boolean have the same semantics for "add" and "dup",
111  * and are typically used when one wants to prompt for a yes/no response.
112  *
113  * All of the functions in this group take a UI and a prompt string.
114  * The string input and verify addition functions also take a flag argument,
115  * a buffer for the result to end up in, a minimum input size and a maximum
116  * input size (the result buffer MUST be large enough to be able to contain
117  * the maximum number of characters).  Additionally, the verify addition
118  * functions takes another buffer to compare the result against.
119  * The boolean input functions take an action description string (which should
120  * be safe to ignore if the expected user action is obvious, for example with
121  * a dialog box with an OK button and a Cancel button), a string of acceptable
122  * characters to mean OK and to mean Cancel.  The two last strings are checked
123  * to make sure they don't have common characters.  Additionally, the same
124  * flag argument as for the string input is taken, as well as a result buffer.
125  * The result buffer is required to be at least one byte long.  Depending on
126  * the answer, the first character from the OK or the Cancel character strings
127  * will be stored in the first byte of the result buffer.  No NUL will be
128  * added, so the result is *not* a string.
129  *
130  * On success, the functions all return an index of the added information.
131  * That index is useful when retrieving results with UI_get0_result().
132  */
133 int UI_add_input_string(UI *ui, const char *prompt, int flags,
134     char *result_buf, int minsize, int maxsize);
135 int UI_dup_input_string(UI *ui, const char *prompt, int flags,
136     char *result_buf, int minsize, int maxsize);
137 int UI_add_verify_string(UI *ui, const char *prompt, int flags,
138     char *result_buf, int minsize, int maxsize, const char *test_buf);
139 int UI_dup_verify_string(UI *ui, const char *prompt, int flags,
140     char *result_buf, int minsize, int maxsize, const char *test_buf);
141 int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc,
142     const char *ok_chars, const char *cancel_chars,
143     int flags, char *result_buf);
144 int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc,
145     const char *ok_chars, const char *cancel_chars,
146     int flags, char *result_buf);
147 int UI_add_info_string(UI *ui, const char *text);
148 int UI_dup_info_string(UI *ui, const char *text);
149 int UI_add_error_string(UI *ui, const char *text);
150 int UI_dup_error_string(UI *ui, const char *text);
151 
152 /* These are the possible flags.  They can be or'ed together. */
153 /* Use to have echoing of input */
154 #define UI_INPUT_FLAG_ECHO		0x01
155 /*
156  * Use a default password.  Where that password is found is completely
157  * up to the application, it might for example be in the user data set
158  * with UI_add_user_data().  It is not recommended to have more than
159  * one input in each UI being marked with this flag, or the application
160  * might get confused.
161  */
162 #define UI_INPUT_FLAG_DEFAULT_PWD	0x02
163 
164 /*
165  * Users of these routines may want to define flags of their own.  The core
166  * UI won't look at those, but will pass them on to the method routines.  They
167  * must use higher bits so they don't get confused with the UI bits above.
168  * UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use.  A good
169  * example of use is this:
170  *
171  *	#define MY_UI_FLAG1	(0x01 << UI_INPUT_FLAG_USER_BASE)
172  */
173 #define UI_INPUT_FLAG_USER_BASE	16
174 
175 
176 /*
177  * The following function helps construct a prompt.  object_desc is a
178  * textual short description of the object, for example "pass phrase",
179  * and object_name is the name of the object (might be a card name or
180  * a file name.
181  * The returned string shall always be allocated on the heap with
182  * malloc(), and need to be free'd with free().
183  *
184  * If the ui_method doesn't contain a pointer to a user-defined prompt
185  * constructor, a default string is built, looking like this:
186  *
187  *	"Enter {object_desc} for {object_name}:"
188  *
189  * So, if object_desc has the value "pass phrase" and object_name has
190  * the value "foo.key", the resulting string is:
191  *
192  *	"Enter pass phrase for foo.key:"
193  */
194 char *UI_construct_prompt(UI *ui_method, const char *object_desc,
195     const char *object_name);
196 
197 
198 /*
199  * The following function is used to store a pointer to user-specific data.
200  * Any previous such pointer will be returned and replaced.
201  *
202  * For callback purposes, this function makes a lot more sense than using
203  * ex_data, since the latter requires that different parts of OpenSSL or
204  * applications share the same ex_data index.
205  *
206  * Note that the UI_OpenSSL() method completely ignores the user data.
207  * Other methods may not, however.
208  */
209 void *UI_add_user_data(UI *ui, void *user_data);
210 /* We need a user data retrieving function as well.  */
211 void *UI_get0_user_data(UI *ui);
212 
213 /* Return the result associated with a prompt given with the index i. */
214 const char *UI_get0_result(UI *ui, int i);
215 
216 /* When all strings have been added, process the whole thing. */
217 int UI_process(UI *ui);
218 
219 /*
220  * Give a user interface parametrised control commands.  This can be used to
221  * send down an integer, a data pointer or a function pointer, as well as
222  * be used to get information from a UI.
223  */
224 int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f)(void));
225 
226 /* The commands */
227 /*
228  * Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the
229  * OpenSSL error stack before printing any info or added error messages and
230  * before any prompting.
231  */
232 #define UI_CTRL_PRINT_ERRORS		1
233 /*
234  * Check if a UI_process() is possible to do again with the same instance of
235  * a user interface.  This makes UI_ctrl() return 1 if it is redoable, and 0
236  * if not.
237  */
238 #define UI_CTRL_IS_REDOABLE		2
239 
240 
241 /* Some methods may use extra data */
242 #define UI_set_app_data(s,arg)         UI_set_ex_data(s,0,arg)
243 #define UI_get_app_data(s)             UI_get_ex_data(s,0)
244 int UI_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
245     CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
246 int UI_set_ex_data(UI *r, int idx, void *arg);
247 void *UI_get_ex_data(UI *r, int idx);
248 
249 /* Use specific methods instead of the built-in one */
250 void UI_set_default_method(const UI_METHOD *meth);
251 const UI_METHOD *UI_get_default_method(void);
252 const UI_METHOD *UI_get_method(UI *ui);
253 const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth);
254 
255 /* The method with all the built-in thingies */
256 UI_METHOD *UI_OpenSSL(void);
257 
258 const UI_METHOD *UI_null(void);
259 
260 /*
261  * ---------- For method writers ----------
262  * A method contains a number of functions that implement the low level
263  * of the User Interface.  The functions are:
264  *
265  *	an opener	This function starts a session, maybe by opening
266  *			a channel to a tty, or by opening a window.
267  *	a writer	This function is called to write a given string,
268  *			maybe to the tty, maybe as a field label in a
269  *			window.
270  *	a flusher	This function is called to flush everything that
271  *			has been output so far.  It can be used to actually
272  *			display a dialog box after it has been built.
273  *	a reader	This function is called to read a given prompt,
274  *			maybe from the tty, maybe from a field in a
275  *			window.  Note that it's called with all string
276  *			structures, not only the prompt ones, so it must
277  *			check such things itself.
278  *	a closer	This function closes the session, maybe by closing
279  *			the channel to the tty, or closing the window.
280  *
281  * All these functions are expected to return:
282  *
283  *	 0	on error.
284  *	 1	on success.
285  *	-1	on out-of-band events, for example if some prompting has
286  *		been canceled (by pressing Ctrl-C, for example).  This is
287  *		only checked when returned by the flusher or the reader.
288  *
289  * The way this is used, the opener is first called, then the writer for all
290  * strings, then the flusher, then the reader for all strings and finally the
291  * closer.  Note that if you want to prompt from a terminal or other command
292  * line interface, the best is to have the reader also write the prompts
293  * instead of having the writer do it.  If you want to prompt from a dialog
294  * box, the writer can be used to build up the contents of the box, and the
295  * flusher to actually display the box and run the event loop until all data
296  * has been given, after which the reader only grabs the given data and puts
297  * them back into the UI strings.
298  *
299  * All method functions take a UI as argument.  Additionally, the writer and
300  * the reader take a UI_STRING.
301  */
302 
303 /*
304  * The UI_STRING type is the data structure that contains all the needed info
305  * about a string or a prompt, including test data for a verification prompt.
306  */
307 typedef struct ui_string_st UI_STRING;
308 DECLARE_STACK_OF(UI_STRING)
309 
310 /*
311  * The different types of strings that are currently supported.
312  * This is only needed by method authors.
313  */
314 enum UI_string_types {
315 	UIT_NONE = 0,
316 	UIT_PROMPT,		/* Prompt for a string */
317 	UIT_VERIFY,		/* Prompt for a string and verify */
318 	UIT_BOOLEAN,		/* Prompt for a yes/no response */
319 	UIT_INFO,		/* Send info to the user */
320 	UIT_ERROR		/* Send an error message to the user */
321 };
322 
323 /* Create and manipulate methods */
324 UI_METHOD *UI_create_method(const char *name);
325 void UI_destroy_method(UI_METHOD *ui_method);
326 int UI_method_set_opener(UI_METHOD *method, int (*opener)(UI *ui));
327 int UI_method_set_writer(UI_METHOD *method,
328     int (*writer)(UI *ui, UI_STRING *uis));
329 int UI_method_set_flusher(UI_METHOD *method, int (*flusher)(UI *ui));
330 int UI_method_set_reader(UI_METHOD *method,
331     int (*reader)(UI *ui, UI_STRING *uis));
332 int UI_method_set_closer(UI_METHOD *method, int (*closer)(UI *ui));
333 int UI_method_set_prompt_constructor(UI_METHOD *method,
334     char *(*prompt_constructor)(UI *ui, const char *object_desc,
335     const char *object_name));
336 int (*UI_method_get_opener(const UI_METHOD *method))(UI *);
337 int (*UI_method_get_writer(const UI_METHOD *method))(UI *, UI_STRING *);
338 int (*UI_method_get_flusher(const UI_METHOD *method))(UI *);
339 int (*UI_method_get_reader(const UI_METHOD *method))(UI *, UI_STRING *);
340 int (*UI_method_get_closer(const UI_METHOD *method))(UI *);
341 char *(*UI_method_get_prompt_constructor(const UI_METHOD *method))(UI *,
342     const char *, const char *);
343 
344 /*
345  * The following functions are helpers for method writers to access relevant
346  * data from a UI_STRING.
347  */
348 /* Return type of the UI_STRING */
349 enum UI_string_types UI_get_string_type(UI_STRING *uis);
350 /* Return input flags of the UI_STRING */
351 int UI_get_input_flags(UI_STRING *uis);
352 /* Return the actual string to output (the prompt, info or error) */
353 const char *UI_get0_output_string(UI_STRING *uis);
354 /* Return the optional action string to output (boolean prompt instruction) */
355 const char *UI_get0_action_string(UI_STRING *uis);
356 /* Return the result of a prompt */
357 const char *UI_get0_result_string(UI_STRING *uis);
358 /* Return the string to test the result against.  Only useful with verifies. */
359 const char *UI_get0_test_string(UI_STRING *uis);
360 /* Return the required minimum size of the result */
361 int UI_get_result_minsize(UI_STRING *uis);
362 /* Return the required maximum size of the result */
363 int UI_get_result_maxsize(UI_STRING *uis);
364 /* Set the result of a UI_STRING. */
365 int UI_set_result(UI *ui, UI_STRING *uis, const char *result);
366 
367 void ERR_load_UI_strings(void);
368 
369 /* Error codes for the UI functions. */
370 
371 /* Function codes. */
372 #define UI_F_GENERAL_ALLOCATE_BOOLEAN			 108
373 #define UI_F_GENERAL_ALLOCATE_PROMPT			 109
374 #define UI_F_GENERAL_ALLOCATE_STRING			 100
375 #define UI_F_UI_CTRL					 111
376 #define UI_F_UI_DUP_ERROR_STRING			 101
377 #define UI_F_UI_DUP_INFO_STRING				 102
378 #define UI_F_UI_DUP_INPUT_BOOLEAN			 110
379 #define UI_F_UI_DUP_INPUT_STRING			 103
380 #define UI_F_UI_DUP_VERIFY_STRING			 106
381 #define UI_F_UI_GET0_RESULT				 107
382 #define UI_F_UI_NEW_METHOD				 104
383 #define UI_F_UI_SET_RESULT				 105
384 
385 /* Reason codes. */
386 #define UI_R_COMMON_OK_AND_CANCEL_CHARACTERS		 104
387 #define UI_R_INDEX_TOO_LARGE				 102
388 #define UI_R_INDEX_TOO_SMALL				 103
389 #define UI_R_NO_RESULT_BUFFER				 105
390 #define UI_R_RESULT_TOO_LARGE				 100
391 #define UI_R_RESULT_TOO_SMALL				 101
392 #define UI_R_UNKNOWN_CONTROL_COMMAND			 106
393 
394 #ifdef  __cplusplus
395 }
396 #endif
397 #endif
398