xref: /freebsd/crypto/openssl/crypto/ui/ui_local.h (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
1 /*
2  * Copyright 2001-2016 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9 
10 #ifndef OSSL_CRYPTO_UI_LOCAL_H
11 # define OSSL_CRYPTO_UI_LOCAL_H
12 
13 # include <openssl/ui.h>
14 # include <openssl/crypto.h>
15 
16 # ifdef _
17 #  undef _
18 # endif
19 
20 struct ui_method_st {
21     char *name;
22     /*
23      * All the functions return 1 or non-NULL for success and 0 or NULL for
24      * failure
25      */
26     /*
27      * Open whatever channel for this, be it the console, an X window or
28      * whatever. This function should use the ex_data structure to save
29      * intermediate data.
30      */
31     int (*ui_open_session) (UI *ui);
32     int (*ui_write_string) (UI *ui, UI_STRING *uis);
33     /*
34      * Flush the output.  If a GUI dialog box is used, this function can be
35      * used to actually display it.
36      */
37     int (*ui_flush) (UI *ui);
38     int (*ui_read_string) (UI *ui, UI_STRING *uis);
39     int (*ui_close_session) (UI *ui);
40     /*
41      * Duplicate the ui_data that often comes alongside a ui_method.  This
42      * allows some backends to save away UI information for later use.
43      */
44     void *(*ui_duplicate_data) (UI *ui, void *ui_data);
45     void (*ui_destroy_data) (UI *ui, void *ui_data);
46     /*
47      * Construct a prompt in a user-defined manner.  object_desc is a textual
48      * short description of the object, for example "pass phrase", and
49      * object_name is the name of the object (might be a card name or a file
50      * name. The returned string shall always be allocated on the heap with
51      * OPENSSL_malloc(), and need to be free'd with OPENSSL_free().
52      */
53     char *(*ui_construct_prompt) (UI *ui, const char *object_desc,
54                                   const char *object_name);
55     /*
56      * UI_METHOD specific application data.
57      */
58     CRYPTO_EX_DATA ex_data;
59 };
60 
61 struct ui_string_st {
62     enum UI_string_types type;  /* Input */
63     const char *out_string;     /* Input */
64     int input_flags;            /* Flags from the user */
65     /*
66      * The following parameters are completely irrelevant for UIT_INFO, and
67      * can therefore be set to 0 or NULL
68      */
69     char *result_buf;           /* Input and Output: If not NULL,
70                                  * user-defined with size in result_maxsize.
71                                  * Otherwise, it may be allocated by the UI
72                                  * routine, meaning result_minsize is going
73                                  * to be overwritten. */
74     size_t result_len;
75     union {
76         struct {
77             int result_minsize; /* Input: minimum required size of the
78                                  * result. */
79             int result_maxsize; /* Input: maximum permitted size of the
80                                  * result */
81             const char *test_buf; /* Input: test string to verify against */
82         } string_data;
83         struct {
84             const char *action_desc; /* Input */
85             const char *ok_chars; /* Input */
86             const char *cancel_chars; /* Input */
87         } boolean_data;
88     } _;
89 
90 # define OUT_STRING_FREEABLE 0x01
91     int flags;                  /* flags for internal use */
92 };
93 
94 struct ui_st {
95     const UI_METHOD *meth;
96     STACK_OF(UI_STRING) *strings; /* We might want to prompt for more than
97                                    * one thing at a time, and with different
98                                    * echoing status.  */
99     void *user_data;
100     CRYPTO_EX_DATA ex_data;
101 # define UI_FLAG_REDOABLE        0x0001
102 # define UI_FLAG_DUPL_DATA       0x0002 /* user_data was duplicated */
103 # define UI_FLAG_PRINT_ERRORS    0x0100
104     int flags;
105 
106     CRYPTO_RWLOCK *lock;
107 };
108 
109 #endif
110