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