1*4724848cSchristos=pod 2*4724848cSchristos 3*4724848cSchristos=head1 NAME 4*4724848cSchristos 5*4724848cSchristosUI, 6*4724848cSchristosUI_new, UI_new_method, UI_free, UI_add_input_string, UI_dup_input_string, 7*4724848cSchristosUI_add_verify_string, UI_dup_verify_string, UI_add_input_boolean, 8*4724848cSchristosUI_dup_input_boolean, UI_add_info_string, UI_dup_info_string, 9*4724848cSchristosUI_add_error_string, UI_dup_error_string, UI_construct_prompt, 10*4724848cSchristosUI_add_user_data, UI_dup_user_data, UI_get0_user_data, UI_get0_result, 11*4724848cSchristosUI_get_result_length, 12*4724848cSchristosUI_process, UI_ctrl, UI_set_default_method, UI_get_default_method, 13*4724848cSchristosUI_get_method, UI_set_method, UI_OpenSSL, UI_null - user interface 14*4724848cSchristos 15*4724848cSchristos=head1 SYNOPSIS 16*4724848cSchristos 17*4724848cSchristos #include <openssl/ui.h> 18*4724848cSchristos 19*4724848cSchristos typedef struct ui_st UI; 20*4724848cSchristos 21*4724848cSchristos UI *UI_new(void); 22*4724848cSchristos UI *UI_new_method(const UI_METHOD *method); 23*4724848cSchristos void UI_free(UI *ui); 24*4724848cSchristos 25*4724848cSchristos int UI_add_input_string(UI *ui, const char *prompt, int flags, 26*4724848cSchristos char *result_buf, int minsize, int maxsize); 27*4724848cSchristos int UI_dup_input_string(UI *ui, const char *prompt, int flags, 28*4724848cSchristos char *result_buf, int minsize, int maxsize); 29*4724848cSchristos int UI_add_verify_string(UI *ui, const char *prompt, int flags, 30*4724848cSchristos char *result_buf, int minsize, int maxsize, 31*4724848cSchristos const char *test_buf); 32*4724848cSchristos int UI_dup_verify_string(UI *ui, const char *prompt, int flags, 33*4724848cSchristos char *result_buf, int minsize, int maxsize, 34*4724848cSchristos const char *test_buf); 35*4724848cSchristos int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc, 36*4724848cSchristos const char *ok_chars, const char *cancel_chars, 37*4724848cSchristos int flags, char *result_buf); 38*4724848cSchristos int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, 39*4724848cSchristos const char *ok_chars, const char *cancel_chars, 40*4724848cSchristos int flags, char *result_buf); 41*4724848cSchristos int UI_add_info_string(UI *ui, const char *text); 42*4724848cSchristos int UI_dup_info_string(UI *ui, const char *text); 43*4724848cSchristos int UI_add_error_string(UI *ui, const char *text); 44*4724848cSchristos int UI_dup_error_string(UI *ui, const char *text); 45*4724848cSchristos 46*4724848cSchristos char *UI_construct_prompt(UI *ui_method, 47*4724848cSchristos const char *object_desc, const char *object_name); 48*4724848cSchristos 49*4724848cSchristos void *UI_add_user_data(UI *ui, void *user_data); 50*4724848cSchristos int UI_dup_user_data(UI *ui, void *user_data); 51*4724848cSchristos void *UI_get0_user_data(UI *ui); 52*4724848cSchristos 53*4724848cSchristos const char *UI_get0_result(UI *ui, int i); 54*4724848cSchristos int UI_get_result_length(UI *ui, int i); 55*4724848cSchristos 56*4724848cSchristos int UI_process(UI *ui); 57*4724848cSchristos 58*4724848cSchristos int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f)()); 59*4724848cSchristos 60*4724848cSchristos void UI_set_default_method(const UI_METHOD *meth); 61*4724848cSchristos const UI_METHOD *UI_get_default_method(void); 62*4724848cSchristos const UI_METHOD *UI_get_method(UI *ui); 63*4724848cSchristos const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth); 64*4724848cSchristos 65*4724848cSchristos UI_METHOD *UI_OpenSSL(void); 66*4724848cSchristos const UI_METHOD *UI_null(void); 67*4724848cSchristos 68*4724848cSchristos=head1 DESCRIPTION 69*4724848cSchristos 70*4724848cSchristosUI stands for User Interface, and is general purpose set of routines to 71*4724848cSchristosprompt the user for text-based information. Through user-written methods 72*4724848cSchristos(see L<UI_create_method(3)>), prompting can be done in any way 73*4724848cSchristosimaginable, be it plain text prompting, through dialog boxes or from a 74*4724848cSchristoscell phone. 75*4724848cSchristos 76*4724848cSchristosAll the functions work through a context of the type UI. This context 77*4724848cSchristoscontains all the information needed to prompt correctly as well as a 78*4724848cSchristosreference to a UI_METHOD, which is an ordered vector of functions that 79*4724848cSchristoscarry out the actual prompting. 80*4724848cSchristos 81*4724848cSchristosThe first thing to do is to create a UI with UI_new() or UI_new_method(), 82*4724848cSchristosthen add information to it with the UI_add or UI_dup functions. Also, 83*4724848cSchristosuser-defined random data can be passed down to the underlying method 84*4724848cSchristosthrough calls to UI_add_user_data() or UI_dup_user_data(). The default 85*4724848cSchristosUI method doesn't care about these data, but other methods might. Finally, 86*4724848cSchristosuse UI_process() to actually perform the prompting and UI_get0_result() 87*4724848cSchristosand UI_get_result_length() to find the result to the prompt and its length. 88*4724848cSchristos 89*4724848cSchristosA UI can contain more than one prompt, which are performed in the given 90*4724848cSchristossequence. Each prompt gets an index number which is returned by the 91*4724848cSchristosUI_add and UI_dup functions, and has to be used to get the corresponding 92*4724848cSchristosresult with UI_get0_result() and UI_get_result_length(). 93*4724848cSchristos 94*4724848cSchristosUI_process() can be called more than once on the same UI, thereby allowing 95*4724848cSchristosa UI to have a long lifetime, but can just as well have a short lifetime. 96*4724848cSchristos 97*4724848cSchristosThe functions are as follows: 98*4724848cSchristos 99*4724848cSchristosUI_new() creates a new UI using the default UI method. When done with 100*4724848cSchristosthis UI, it should be freed using UI_free(). 101*4724848cSchristos 102*4724848cSchristosUI_new_method() creates a new UI using the given UI method. When done with 103*4724848cSchristosthis UI, it should be freed using UI_free(). 104*4724848cSchristos 105*4724848cSchristosUI_OpenSSL() returns the built-in UI method (note: not necessarily the 106*4724848cSchristosdefault one, since the default can be changed. See further on). This 107*4724848cSchristosmethod is the most machine/OS dependent part of OpenSSL and normally 108*4724848cSchristosgenerates the most problems when porting. 109*4724848cSchristos 110*4724848cSchristosUI_null() returns a UI method that does nothing. Its use is to avoid 111*4724848cSchristosgetting internal defaults for passed UI_METHOD pointers. 112*4724848cSchristos 113*4724848cSchristosUI_free() removes a UI from memory, along with all other pieces of memory 114*4724848cSchristosthat's connected to it, like duplicated input strings, results and others. 115*4724848cSchristosIf B<ui> is NULL nothing is done. 116*4724848cSchristos 117*4724848cSchristosUI_add_input_string() and UI_add_verify_string() add a prompt to the UI, 118*4724848cSchristosas well as flags and a result buffer and the desired minimum and maximum 119*4724848cSchristossizes of the result, not counting the final NUL character. The given 120*4724848cSchristosinformation is used to prompt for information, for example a password, 121*4724848cSchristosand to verify a password (i.e. having the user enter it twice and check 122*4724848cSchristosthat the same string was entered twice). UI_add_verify_string() takes 123*4724848cSchristosand extra argument that should be a pointer to the result buffer of the 124*4724848cSchristosinput string that it's supposed to verify, or verification will fail. 125*4724848cSchristos 126*4724848cSchristosUI_add_input_boolean() adds a prompt to the UI that's supposed to be answered 127*4724848cSchristosin a boolean way, with a single character for yes and a different character 128*4724848cSchristosfor no. A set of characters that can be used to cancel the prompt is given 129*4724848cSchristosas well. The prompt itself is divided in two, one part being the 130*4724848cSchristosdescriptive text (given through the I<prompt> argument) and one describing 131*4724848cSchristosthe possible answers (given through the I<action_desc> argument). 132*4724848cSchristos 133*4724848cSchristosUI_add_info_string() and UI_add_error_string() add strings that are shown at 134*4724848cSchristosthe same time as the prompt for extra information or to show an error string. 135*4724848cSchristosThe difference between the two is only conceptual. With the builtin method, 136*4724848cSchristosthere's no technical difference between them. Other methods may make a 137*4724848cSchristosdifference between them, however. 138*4724848cSchristos 139*4724848cSchristosThe flags currently supported are B<UI_INPUT_FLAG_ECHO>, which is relevant for 140*4724848cSchristosUI_add_input_string() and will have the users response be echoed (when 141*4724848cSchristosprompting for a password, this flag should obviously not be used, and 142*4724848cSchristosB<UI_INPUT_FLAG_DEFAULT_PWD>, which means that a default password of some 143*4724848cSchristossort will be used (completely depending on the application and the UI 144*4724848cSchristosmethod). 145*4724848cSchristos 146*4724848cSchristosUI_dup_input_string(), UI_dup_verify_string(), UI_dup_input_boolean(), 147*4724848cSchristosUI_dup_info_string() and UI_dup_error_string() are basically the same 148*4724848cSchristosas their UI_add counterparts, except that they make their own copies 149*4724848cSchristosof all strings. 150*4724848cSchristos 151*4724848cSchristosUI_construct_prompt() is a helper function that can be used to create 152*4724848cSchristosa prompt from two pieces of information: an description and a name. 153*4724848cSchristosThe default constructor (if there is none provided by the method used) 154*4724848cSchristoscreates a string "Enter I<description> for I<name>:". With the 155*4724848cSchristosdescription "pass phrase" and the filename "foo.key", that becomes 156*4724848cSchristos"Enter pass phrase for foo.key:". Other methods may create whatever 157*4724848cSchristosstring and may include encodings that will be processed by the other 158*4724848cSchristosmethod functions. 159*4724848cSchristos 160*4724848cSchristosUI_add_user_data() adds a user data pointer for the method to use at any 161*4724848cSchristostime. The builtin UI method doesn't care about this info. Note that several 162*4724848cSchristoscalls to this function doesn't add data, it replaces the previous blob 163*4724848cSchristoswith the one given as argument. 164*4724848cSchristos 165*4724848cSchristosUI_dup_user_data() duplicates the user data and works as an alternative 166*4724848cSchristosto UI_add_user_data() when the user data needs to be preserved for a longer 167*4724848cSchristosduration, perhaps even the lifetime of the application. The UI object takes 168*4724848cSchristosownership of this duplicate and will free it whenever it gets replaced or 169*4724848cSchristosthe UI is destroyed. UI_dup_user_data() returns 0 on success, or -1 on memory 170*4724848cSchristosallocation failure or if the method doesn't have a duplicator function. 171*4724848cSchristos 172*4724848cSchristosUI_get0_user_data() retrieves the data that has last been given to the 173*4724848cSchristosUI with UI_add_user_data() or UI_dup_user_data. 174*4724848cSchristos 175*4724848cSchristosUI_get0_result() returns a pointer to the result buffer associated with 176*4724848cSchristosthe information indexed by I<i>. 177*4724848cSchristos 178*4724848cSchristosUI_get_result_length() returns the length of the result buffer associated with 179*4724848cSchristosthe information indexed by I<i>. 180*4724848cSchristos 181*4724848cSchristosUI_process() goes through the information given so far, does all the printing 182*4724848cSchristosand prompting and returns the final status, which is -2 on out-of-band events 183*4724848cSchristos(Interrupt, Cancel, ...), -1 on error and 0 on success. 184*4724848cSchristos 185*4724848cSchristosUI_ctrl() adds extra control for the application author. For now, it 186*4724848cSchristosunderstands two commands: B<UI_CTRL_PRINT_ERRORS>, which makes UI_process() 187*4724848cSchristosprint the OpenSSL error stack as part of processing the UI, and 188*4724848cSchristosB<UI_CTRL_IS_REDOABLE>, which returns a flag saying if the used UI can 189*4724848cSchristosbe used again or not. 190*4724848cSchristos 191*4724848cSchristosUI_set_default_method() changes the default UI method to the one given. 192*4724848cSchristosThis function is not thread-safe and should not be called at the same time 193*4724848cSchristosas other OpenSSL functions. 194*4724848cSchristos 195*4724848cSchristosUI_get_default_method() returns a pointer to the current default UI method. 196*4724848cSchristos 197*4724848cSchristosUI_get_method() returns the UI method associated with a given UI. 198*4724848cSchristos 199*4724848cSchristosUI_set_method() changes the UI method associated with a given UI. 200*4724848cSchristos 201*4724848cSchristos=head1 NOTES 202*4724848cSchristos 203*4724848cSchristosThe resulting strings that the built in method UI_OpenSSL() generate 204*4724848cSchristosare assumed to be encoded according to the current locale or (for 205*4724848cSchristosWindows) code page. 206*4724848cSchristosFor applications having different demands, these strings need to be 207*4724848cSchristosconverted appropriately by the caller. 208*4724848cSchristosFor Windows, if the OPENSSL_WIN32_UTF8 environment variable is set, 209*4724848cSchristosthe built-in method UI_OpenSSL() will produce UTF-8 encoded strings 210*4724848cSchristosinstead. 211*4724848cSchristos 212*4724848cSchristos=head1 RETURN VALUES 213*4724848cSchristos 214*4724848cSchristosUI_new() and UI_new_method() return a valid B<UI> structure or NULL if an error 215*4724848cSchristosoccurred. 216*4724848cSchristos 217*4724848cSchristosUI_add_input_string(), UI_dup_input_string(), UI_add_verify_string(), 218*4724848cSchristosUI_dup_verify_string(), UI_add_input_boolean(), UI_dup_input_boolean(), 219*4724848cSchristosUI_add_info_string(), UI_dup_info_string(), UI_add_error_string() 220*4724848cSchristosand UI_dup_error_string() return a positive number on success or a value which 221*4724848cSchristosis less than or equal to 0 otherwise. 222*4724848cSchristos 223*4724848cSchristosUI_construct_prompt() returns a string or NULL if an error occurred. 224*4724848cSchristos 225*4724848cSchristosUI_dup_user_data() returns 0 on success or -1 on error. 226*4724848cSchristos 227*4724848cSchristosUI_get0_result() returns a string or NULL on error. 228*4724848cSchristos 229*4724848cSchristosUI_get_result_length() returns a positive integer or 0 on success; otherwise it 230*4724848cSchristosreturns -1 on error. 231*4724848cSchristos 232*4724848cSchristosUI_process() returns 0 on success or a negative value on error. 233*4724848cSchristos 234*4724848cSchristosUI_ctrl() returns a mask on success or -1 on error. 235*4724848cSchristos 236*4724848cSchristosUI_get_default_method(), UI_get_method(), UI_OpenSSL(), UI_null() and 237*4724848cSchristosUI_set_method() return either a valid B<UI_METHOD> structure or NULL 238*4724848cSchristosrespectively. 239*4724848cSchristos 240*4724848cSchristos=head1 HISTORY 241*4724848cSchristos 242*4724848cSchristosThe UI_dup_user_data() function was added in OpenSSL 1.1.1. 243*4724848cSchristos 244*4724848cSchristos=head1 COPYRIGHT 245*4724848cSchristos 246*4724848cSchristosCopyright 2001-2020 The OpenSSL Project Authors. All Rights Reserved. 247*4724848cSchristos 248*4724848cSchristosLicensed under the OpenSSL license (the "License"). You may not use 249*4724848cSchristosthis file except in compliance with the License. You can obtain a copy 250*4724848cSchristosin the file LICENSE in the source distribution or at 251*4724848cSchristosL<https://www.openssl.org/source/license.html>. 252*4724848cSchristos 253*4724848cSchristos=cut 254