xref: /freebsd/crypto/openssl/doc/man3/UI_new.pod (revision 6935a639f0f999de98b970a3cf26b0dc80b1798b)
1e71b7053SJung-uk Kim=pod
2e71b7053SJung-uk Kim
3e71b7053SJung-uk Kim=head1 NAME
4e71b7053SJung-uk Kim
5e71b7053SJung-uk KimUI,
6e71b7053SJung-uk KimUI_new, UI_new_method, UI_free, UI_add_input_string, UI_dup_input_string,
7e71b7053SJung-uk KimUI_add_verify_string, UI_dup_verify_string, UI_add_input_boolean,
8e71b7053SJung-uk KimUI_dup_input_boolean, UI_add_info_string, UI_dup_info_string,
9e71b7053SJung-uk KimUI_add_error_string, UI_dup_error_string, UI_construct_prompt,
10e71b7053SJung-uk KimUI_add_user_data, UI_dup_user_data, UI_get0_user_data, UI_get0_result,
11e71b7053SJung-uk KimUI_get_result_length,
12e71b7053SJung-uk KimUI_process, UI_ctrl, UI_set_default_method, UI_get_default_method,
13e71b7053SJung-uk KimUI_get_method, UI_set_method, UI_OpenSSL, UI_null - user interface
14e71b7053SJung-uk Kim
15e71b7053SJung-uk Kim=head1 SYNOPSIS
16e71b7053SJung-uk Kim
17e71b7053SJung-uk Kim #include <openssl/ui.h>
18e71b7053SJung-uk Kim
19e71b7053SJung-uk Kim typedef struct ui_st UI;
20e71b7053SJung-uk Kim
21e71b7053SJung-uk Kim UI *UI_new(void);
22e71b7053SJung-uk Kim UI *UI_new_method(const UI_METHOD *method);
23e71b7053SJung-uk Kim void UI_free(UI *ui);
24e71b7053SJung-uk Kim
25e71b7053SJung-uk Kim int UI_add_input_string(UI *ui, const char *prompt, int flags,
26e71b7053SJung-uk Kim                         char *result_buf, int minsize, int maxsize);
27e71b7053SJung-uk Kim int UI_dup_input_string(UI *ui, const char *prompt, int flags,
28e71b7053SJung-uk Kim                         char *result_buf, int minsize, int maxsize);
29e71b7053SJung-uk Kim int UI_add_verify_string(UI *ui, const char *prompt, int flags,
30e71b7053SJung-uk Kim                          char *result_buf, int minsize, int maxsize,
31e71b7053SJung-uk Kim                          const char *test_buf);
32e71b7053SJung-uk Kim int UI_dup_verify_string(UI *ui, const char *prompt, int flags,
33e71b7053SJung-uk Kim                          char *result_buf, int minsize, int maxsize,
34e71b7053SJung-uk Kim                          const char *test_buf);
35e71b7053SJung-uk Kim int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc,
36e71b7053SJung-uk Kim                          const char *ok_chars, const char *cancel_chars,
37e71b7053SJung-uk Kim                          int flags, char *result_buf);
38e71b7053SJung-uk Kim int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc,
39e71b7053SJung-uk Kim                          const char *ok_chars, const char *cancel_chars,
40e71b7053SJung-uk Kim                          int flags, char *result_buf);
41e71b7053SJung-uk Kim int UI_add_info_string(UI *ui, const char *text);
42e71b7053SJung-uk Kim int UI_dup_info_string(UI *ui, const char *text);
43e71b7053SJung-uk Kim int UI_add_error_string(UI *ui, const char *text);
44e71b7053SJung-uk Kim int UI_dup_error_string(UI *ui, const char *text);
45e71b7053SJung-uk Kim
46e71b7053SJung-uk Kim char *UI_construct_prompt(UI *ui_method,
47e71b7053SJung-uk Kim        const char *object_desc, const char *object_name);
48e71b7053SJung-uk Kim
49e71b7053SJung-uk Kim void *UI_add_user_data(UI *ui, void *user_data);
50e71b7053SJung-uk Kim int UI_dup_user_data(UI *ui, void *user_data);
51e71b7053SJung-uk Kim void *UI_get0_user_data(UI *ui);
52e71b7053SJung-uk Kim
53e71b7053SJung-uk Kim const char *UI_get0_result(UI *ui, int i);
54e71b7053SJung-uk Kim int UI_get_result_length(UI *ui, int i);
55e71b7053SJung-uk Kim
56e71b7053SJung-uk Kim int UI_process(UI *ui);
57e71b7053SJung-uk Kim
58e71b7053SJung-uk Kim int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f)());
59e71b7053SJung-uk Kim
60e71b7053SJung-uk Kim void UI_set_default_method(const UI_METHOD *meth);
61e71b7053SJung-uk Kim const UI_METHOD *UI_get_default_method(void);
62e71b7053SJung-uk Kim const UI_METHOD *UI_get_method(UI *ui);
63e71b7053SJung-uk Kim const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth);
64e71b7053SJung-uk Kim
65e71b7053SJung-uk Kim UI_METHOD *UI_OpenSSL(void);
66e71b7053SJung-uk Kim const UI_METHOD *UI_null(void);
67e71b7053SJung-uk Kim
68e71b7053SJung-uk Kim=head1 DESCRIPTION
69e71b7053SJung-uk Kim
70e71b7053SJung-uk KimUI stands for User Interface, and is general purpose set of routines to
71e71b7053SJung-uk Kimprompt the user for text-based information.  Through user-written methods
72e71b7053SJung-uk Kim(see L<UI_create_method(3)>), prompting can be done in any way
73e71b7053SJung-uk Kimimaginable, be it plain text prompting, through dialog boxes or from a
74e71b7053SJung-uk Kimcell phone.
75e71b7053SJung-uk Kim
76e71b7053SJung-uk KimAll the functions work through a context of the type UI.  This context
77e71b7053SJung-uk Kimcontains all the information needed to prompt correctly as well as a
78e71b7053SJung-uk Kimreference to a UI_METHOD, which is an ordered vector of functions that
79e71b7053SJung-uk Kimcarry out the actual prompting.
80e71b7053SJung-uk Kim
81e71b7053SJung-uk KimThe first thing to do is to create a UI with UI_new() or UI_new_method(),
82e71b7053SJung-uk Kimthen add information to it with the UI_add or UI_dup functions.  Also,
83e71b7053SJung-uk Kimuser-defined random data can be passed down to the underlying method
84e71b7053SJung-uk Kimthrough calls to UI_add_user_data() or UI_dup_user_data().  The default
85e71b7053SJung-uk KimUI method doesn't care about these data, but other methods might.  Finally,
86e71b7053SJung-uk Kimuse UI_process() to actually perform the prompting and UI_get0_result()
87e71b7053SJung-uk Kimand UI_get_result_length() to find the result to the prompt and its length.
88e71b7053SJung-uk Kim
89e71b7053SJung-uk KimA UI can contain more than one prompt, which are performed in the given
90e71b7053SJung-uk Kimsequence.  Each prompt gets an index number which is returned by the
91e71b7053SJung-uk KimUI_add and UI_dup functions, and has to be used to get the corresponding
92e71b7053SJung-uk Kimresult with UI_get0_result() and UI_get_result_length().
93e71b7053SJung-uk Kim
94e71b7053SJung-uk KimUI_process() can be called more than once on the same UI, thereby allowing
95e71b7053SJung-uk Kima UI to have a long lifetime, but can just as well have a short lifetime.
96e71b7053SJung-uk Kim
97e71b7053SJung-uk KimThe functions are as follows:
98e71b7053SJung-uk Kim
99e71b7053SJung-uk KimUI_new() creates a new UI using the default UI method.  When done with
100e71b7053SJung-uk Kimthis UI, it should be freed using UI_free().
101e71b7053SJung-uk Kim
102e71b7053SJung-uk KimUI_new_method() creates a new UI using the given UI method.  When done with
103e71b7053SJung-uk Kimthis UI, it should be freed using UI_free().
104e71b7053SJung-uk Kim
105e71b7053SJung-uk KimUI_OpenSSL() returns the built-in UI method (note: not necessarily the
106e71b7053SJung-uk Kimdefault one, since the default can be changed.  See further on).  This
107e71b7053SJung-uk Kimmethod is the most machine/OS dependent part of OpenSSL and normally
108e71b7053SJung-uk Kimgenerates the most problems when porting.
109e71b7053SJung-uk Kim
110e71b7053SJung-uk KimUI_null() returns a UI method that does nothing.  Its use is to avoid
111e71b7053SJung-uk Kimgetting internal defaults for passed UI_METHOD pointers.
112e71b7053SJung-uk Kim
113e71b7053SJung-uk KimUI_free() removes a UI from memory, along with all other pieces of memory
114e71b7053SJung-uk Kimthat's connected to it, like duplicated input strings, results and others.
115e71b7053SJung-uk KimIf B<ui> is NULL nothing is done.
116e71b7053SJung-uk Kim
117e71b7053SJung-uk KimUI_add_input_string() and UI_add_verify_string() add a prompt to the UI,
118e71b7053SJung-uk Kimas well as flags and a result buffer and the desired minimum and maximum
119e71b7053SJung-uk Kimsizes of the result, not counting the final NUL character.  The given
120e71b7053SJung-uk Kiminformation is used to prompt for information, for example a password,
121e71b7053SJung-uk Kimand to verify a password (i.e. having the user enter it twice and check
122e71b7053SJung-uk Kimthat the same string was entered twice).  UI_add_verify_string() takes
123e71b7053SJung-uk Kimand extra argument that should be a pointer to the result buffer of the
124e71b7053SJung-uk Kiminput string that it's supposed to verify, or verification will fail.
125e71b7053SJung-uk Kim
126e71b7053SJung-uk KimUI_add_input_boolean() adds a prompt to the UI that's supposed to be answered
127e71b7053SJung-uk Kimin a boolean way, with a single character for yes and a different character
128e71b7053SJung-uk Kimfor no.  A set of characters that can be used to cancel the prompt is given
129e71b7053SJung-uk Kimas well.  The prompt itself is divided in two, one part being the
130e71b7053SJung-uk Kimdescriptive text (given through the I<prompt> argument) and one describing
131e71b7053SJung-uk Kimthe possible answers (given through the I<action_desc> argument).
132e71b7053SJung-uk Kim
133e71b7053SJung-uk KimUI_add_info_string() and UI_add_error_string() add strings that are shown at
134e71b7053SJung-uk Kimthe same time as the prompt for extra information or to show an error string.
135e71b7053SJung-uk KimThe difference between the two is only conceptual.  With the builtin method,
136e71b7053SJung-uk Kimthere's no technical difference between them.  Other methods may make a
137e71b7053SJung-uk Kimdifference between them, however.
138e71b7053SJung-uk Kim
139e71b7053SJung-uk KimThe flags currently supported are B<UI_INPUT_FLAG_ECHO>, which is relevant for
140e71b7053SJung-uk KimUI_add_input_string() and will have the users response be echoed (when
141e71b7053SJung-uk Kimprompting for a password, this flag should obviously not be used, and
142e71b7053SJung-uk KimB<UI_INPUT_FLAG_DEFAULT_PWD>, which means that a default password of some
143e71b7053SJung-uk Kimsort will be used (completely depending on the application and the UI
144e71b7053SJung-uk Kimmethod).
145e71b7053SJung-uk Kim
146e71b7053SJung-uk KimUI_dup_input_string(), UI_dup_verify_string(), UI_dup_input_boolean(),
147e71b7053SJung-uk KimUI_dup_info_string() and UI_dup_error_string() are basically the same
148e71b7053SJung-uk Kimas their UI_add counterparts, except that they make their own copies
149e71b7053SJung-uk Kimof all strings.
150e71b7053SJung-uk Kim
151e71b7053SJung-uk KimUI_construct_prompt() is a helper function that can be used to create
152e71b7053SJung-uk Kima prompt from two pieces of information: an description and a name.
153e71b7053SJung-uk KimThe default constructor (if there is none provided by the method used)
154e71b7053SJung-uk Kimcreates a string "Enter I<description> for I<name>:".  With the
155e71b7053SJung-uk Kimdescription "pass phrase" and the file name "foo.key", that becomes
156e71b7053SJung-uk Kim"Enter pass phrase for foo.key:".  Other methods may create whatever
157e71b7053SJung-uk Kimstring and may include encodings that will be processed by the other
158e71b7053SJung-uk Kimmethod functions.
159e71b7053SJung-uk Kim
160e71b7053SJung-uk KimUI_add_user_data() adds a user data pointer for the method to use at any
161e71b7053SJung-uk Kimtime.  The builtin UI method doesn't care about this info.  Note that several
162e71b7053SJung-uk Kimcalls to this function doesn't add data, it replaces the previous blob
163e71b7053SJung-uk Kimwith the one given as argument.
164e71b7053SJung-uk Kim
165e71b7053SJung-uk KimUI_dup_user_data() duplicates the user data and works as an alternative
166e71b7053SJung-uk Kimto UI_add_user_data() when the user data needs to be preserved for a longer
167e71b7053SJung-uk Kimduration, perhaps even the lifetime of the application.  The UI object takes
168e71b7053SJung-uk Kimownership of this duplicate and will free it whenever it gets replaced or
169e71b7053SJung-uk Kimthe UI is destroyed.  UI_dup_user_data() returns 0 on success, or -1 on memory
170e71b7053SJung-uk Kimallocation failure or if the method doesn't have a duplicator function.
171e71b7053SJung-uk Kim
172e71b7053SJung-uk KimUI_get0_user_data() retrieves the data that has last been given to the
173e71b7053SJung-uk KimUI with UI_add_user_data() or UI_dup_user_data.
174e71b7053SJung-uk Kim
175e71b7053SJung-uk KimUI_get0_result() returns a pointer to the result buffer associated with
176e71b7053SJung-uk Kimthe information indexed by I<i>.
177e71b7053SJung-uk Kim
178e71b7053SJung-uk KimUI_get_result_length() returns the length of the result buffer associated with
179e71b7053SJung-uk Kimthe information indexed by I<i>.
180e71b7053SJung-uk Kim
181e71b7053SJung-uk KimUI_process() goes through the information given so far, does all the printing
182e71b7053SJung-uk Kimand prompting and returns the final status, which is -2 on out-of-band events
183e71b7053SJung-uk Kim(Interrupt, Cancel, ...), -1 on error and 0 on success.
184e71b7053SJung-uk Kim
185e71b7053SJung-uk KimUI_ctrl() adds extra control for the application author.  For now, it
186e71b7053SJung-uk Kimunderstands two commands: B<UI_CTRL_PRINT_ERRORS>, which makes UI_process()
187e71b7053SJung-uk Kimprint the OpenSSL error stack as part of processing the UI, and
188e71b7053SJung-uk KimB<UI_CTRL_IS_REDOABLE>, which returns a flag saying if the used UI can
189e71b7053SJung-uk Kimbe used again or not.
190e71b7053SJung-uk Kim
191e71b7053SJung-uk KimUI_set_default_method() changes the default UI method to the one given.
192e71b7053SJung-uk KimThis function is not thread-safe and should not be called at the same time
193e71b7053SJung-uk Kimas other OpenSSL functions.
194e71b7053SJung-uk Kim
195e71b7053SJung-uk KimUI_get_default_method() returns a pointer to the current default UI method.
196e71b7053SJung-uk Kim
197e71b7053SJung-uk KimUI_get_method() returns the UI method associated with a given UI.
198e71b7053SJung-uk Kim
199e71b7053SJung-uk KimUI_set_method() changes the UI method associated with a given UI.
200e71b7053SJung-uk Kim
201e71b7053SJung-uk Kim=head1 NOTES
202e71b7053SJung-uk Kim
203e71b7053SJung-uk KimThe resulting strings that the built in method UI_OpenSSL() generate
204e71b7053SJung-uk Kimare assumed to be encoded according to the current locale or (for
205e71b7053SJung-uk KimWindows) code page.
206e71b7053SJung-uk KimFor applications having different demands, these strings need to be
207e71b7053SJung-uk Kimconverted appropriately by the caller.
208e71b7053SJung-uk KimFor Windows, if the OPENSSL_WIN32_UTF8 environment variable is set,
209e71b7053SJung-uk Kimthe built-in method UI_OpenSSL() will produce UTF-8 encoded strings
210e71b7053SJung-uk Kiminstead.
211e71b7053SJung-uk Kim
212e71b7053SJung-uk Kim=head1 RETURN VALUES
213e71b7053SJung-uk Kim
214e71b7053SJung-uk KimUI_new() and UI_new_method() return a valid B<UI> structure or NULL if an error
215e71b7053SJung-uk Kimoccurred.
216e71b7053SJung-uk Kim
217e71b7053SJung-uk KimUI_add_input_string(), UI_dup_input_string(), UI_add_verify_string(),
218e71b7053SJung-uk KimUI_dup_verify_string(), UI_add_input_boolean(), UI_dup_input_boolean(),
219e71b7053SJung-uk KimUI_add_info_string(), UI_dup_info_string(), UI_add_error_string()
220e71b7053SJung-uk Kimand UI_dup_error_string() return a positive number on success or a value which
221e71b7053SJung-uk Kimis less than or equal to 0 otherwise.
222e71b7053SJung-uk Kim
223e71b7053SJung-uk KimUI_construct_prompt() returns a string or NULL if an error occurred.
224e71b7053SJung-uk Kim
225e71b7053SJung-uk KimUI_dup_user_data() returns 0 on success or -1 on error.
226e71b7053SJung-uk Kim
227e71b7053SJung-uk KimUI_get0_result() returns a string or NULL on error.
228e71b7053SJung-uk Kim
229e71b7053SJung-uk KimUI_get_result_length() returns a positive integer or 0 on success; otherwise it
230e71b7053SJung-uk Kimreturns -1 on error.
231e71b7053SJung-uk Kim
232e71b7053SJung-uk KimUI_process() returns 0 on success or a negative value on error.
233e71b7053SJung-uk Kim
234e71b7053SJung-uk KimUI_ctrl() returns a mask on success or -1 on error.
235e71b7053SJung-uk Kim
236*6935a639SJung-uk KimUI_get_default_method(), UI_get_method(), UI_OpenSSL(), UI_null() and
237e71b7053SJung-uk KimUI_set_method() return either a valid B<UI_METHOD> structure or NULL
238e71b7053SJung-uk Kimrespectively.
239e71b7053SJung-uk Kim
240e71b7053SJung-uk Kim=head1 HISTORY
241e71b7053SJung-uk Kim
242*6935a639SJung-uk KimThe UI_dup_user_data() function was added in OpenSSL 1.1.1.
243e71b7053SJung-uk Kim
244e71b7053SJung-uk Kim=head1 COPYRIGHT
245e71b7053SJung-uk Kim
246e71b7053SJung-uk KimCopyright 2001-2018 The OpenSSL Project Authors. All Rights Reserved.
247e71b7053SJung-uk Kim
248e71b7053SJung-uk KimLicensed under the OpenSSL license (the "License").  You may not use
249e71b7053SJung-uk Kimthis file except in compliance with the License.  You can obtain a copy
250e71b7053SJung-uk Kimin the file LICENSE in the source distribution or at
251e71b7053SJung-uk KimL<https://www.openssl.org/source/license.html>.
252e71b7053SJung-uk Kim
253e71b7053SJung-uk Kim=cut
254