hkdf: when HMAC key is all zeros, still set a valid key length
[openssl.git] / include / openssl / ui.h.in
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 {-
13 use 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
43 extern "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.   */
54 UI *UI_new(void);
55 UI *UI_new_method(const UI_METHOD *method);
56 void 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(). */
101 int UI_add_input_string(UI *ui, const char *prompt, int flags,
102                         char *result_buf, int minsize, int maxsize);
103 int UI_dup_input_string(UI *ui, const char *prompt, int flags,
104                         char *result_buf, int minsize, int maxsize);
105 int UI_add_verify_string(UI *ui, const char *prompt, int flags,
106                          char *result_buf, int minsize, int maxsize,
107                          const char *test_buf);
108 int UI_dup_verify_string(UI *ui, const char *prompt, int flags,
109                          char *result_buf, int minsize, int maxsize,
110                          const char *test_buf);
111 int 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);
114 int 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);
117 int UI_add_info_string(UI *ui, const char *text);
118 int UI_dup_info_string(UI *ui, const char *text);
119 int UI_add_error_string(UI *ui, const char *text);
120 int 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 */
165 char *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  */
179 void *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  */
185 int UI_dup_user_data(UI *ui, void *user_data);
186 /* We need a user data retrieving function as well.  */
187 void *UI_get0_user_data(UI *ui);
188
189 /* Return the result associated with a prompt given with the index i. */
190 const char *UI_get0_result(UI *ui, int i);
191 int UI_get_result_length(UI *ui, int i);
192
193 /* When all strings have been added, process the whole thing. */
194 int 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  */
201 int 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)
223 int UI_set_ex_data(UI *r, int idx, void *arg);
224 void *UI_get_ex_data(const UI *r, int idx);
225
226 /* Use specific methods instead of the built-in one */
227 void UI_set_default_method(const UI_METHOD *meth);
228 const UI_METHOD *UI_get_default_method(void);
229 const UI_METHOD *UI_get_method(UI *ui);
230 const 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 */
235 UI_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  */
243 const 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  */
292 typedef 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  */
302 enum 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 */
312 UI_METHOD *UI_create_method(const char *name);
313 void UI_destroy_method(UI_METHOD *ui_method);
314 int UI_method_set_opener(UI_METHOD *method, int (*opener) (UI *ui));
315 int UI_method_set_writer(UI_METHOD *method,
316                          int (*writer) (UI *ui, UI_STRING *uis));
317 int UI_method_set_flusher(UI_METHOD *method, int (*flusher) (UI *ui));
318 int UI_method_set_reader(UI_METHOD *method,
319                          int (*reader) (UI *ui, UI_STRING *uis));
320 int UI_method_set_closer(UI_METHOD *method, int (*closer) (UI *ui));
321 int UI_method_set_data_duplicator(UI_METHOD *method,
322                                   void *(*duplicator) (UI *ui, void *ui_data),
323                                   void (*destructor)(UI *ui, void *ui_data));
324 int 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));
330 int UI_method_set_ex_data(UI_METHOD *method, int idx, void *data);
331 int (*UI_method_get_opener(const UI_METHOD *method)) (UI *);
332 int (*UI_method_get_writer(const UI_METHOD *method)) (UI *, UI_STRING *);
333 int (*UI_method_get_flusher(const UI_METHOD *method)) (UI *);
334 int (*UI_method_get_reader(const UI_METHOD *method)) (UI *, UI_STRING *);
335 int (*UI_method_get_closer(const UI_METHOD *method)) (UI *);
336 char *(*UI_method_get_prompt_constructor(const UI_METHOD *method))
337     (UI *, const char *, const char *);
338 void *(*UI_method_get_data_duplicator(const UI_METHOD *method)) (UI *, void *);
339 void (*UI_method_get_data_destructor(const UI_METHOD *method)) (UI *, void *);
340 const 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 */
348 enum UI_string_types UI_get_string_type(UI_STRING *uis);
349 /* Return input flags of the UI_STRING */
350 int UI_get_input_flags(UI_STRING *uis);
351 /* Return the actual string to output (the prompt, info or error) */
352 const char *UI_get0_output_string(UI_STRING *uis);
353 /*
354  * Return the optional action string to output (the boolean prompt
355  * instruction)
356  */
357 const char *UI_get0_action_string(UI_STRING *uis);
358 /* Return the result of a prompt */
359 const char *UI_get0_result_string(UI_STRING *uis);
360 int UI_get_result_string_length(UI_STRING *uis);
361 /*
362  * Return the string to test the result against.  Only useful with verifies.
363  */
364 const char *UI_get0_test_string(UI_STRING *uis);
365 /* Return the required minimum size of the result */
366 int UI_get_result_minsize(UI_STRING *uis);
367 /* Return the required maximum size of the result */
368 int UI_get_result_maxsize(UI_STRING *uis);
369 /* Set the result of a UI_STRING. */
370 int UI_set_result(UI *ui, UI_STRING *uis, const char *result);
371 int UI_set_result_ex(UI *ui, UI_STRING *uis, const char *result, int len);
372
373 /* A couple of popular utility functions */
374 int UI_UTIL_read_pw_string(char *buf, int length, const char *prompt,
375                            int verify);
376 int UI_UTIL_read_pw(char *buf, char *buff, int size, const char *prompt,
377                     int verify);
378 UI_METHOD *UI_UTIL_wrap_read_pem_callback(pem_password_cb *cb, int rwflag);
379
380
381 # ifdef  __cplusplus
382 }
383 # endif
384 #endif