335 lines
11 KiB
C
335 lines
11 KiB
C
|
/* pinentry.h - The interface for the PIN entry support library.
|
|||
|
* Copyright (C) 2002, 2003, 2010, 2015 g10 Code GmbH
|
|||
|
*
|
|||
|
* This file is part of PINENTRY.
|
|||
|
*
|
|||
|
* PINENTRY is free software; you can redistribute it and/or modify it
|
|||
|
* under the terms of the GNU General Public License as published by
|
|||
|
* the Free Software Foundation; either version 2 of the License, or
|
|||
|
* (at your option) any later version.
|
|||
|
*
|
|||
|
* PINENTRY is distributed in the hope that it will be useful, but
|
|||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|||
|
* General Public License for more details.
|
|||
|
*
|
|||
|
* You should have received a copy of the GNU General Public License
|
|||
|
* along with this program; if not, see <https://www.gnu.org/licenses/>.
|
|||
|
* SPDX-License-Identifier: GPL-2.0+
|
|||
|
*/
|
|||
|
|
|||
|
#ifndef PINENTRY_H
|
|||
|
#define PINENTRY_H
|
|||
|
|
|||
|
#ifdef __cplusplus
|
|||
|
extern "C" {
|
|||
|
#if 0
|
|||
|
}
|
|||
|
#endif
|
|||
|
#endif
|
|||
|
|
|||
|
typedef enum {
|
|||
|
PINENTRY_COLOR_NONE, PINENTRY_COLOR_DEFAULT,
|
|||
|
PINENTRY_COLOR_BLACK, PINENTRY_COLOR_RED,
|
|||
|
PINENTRY_COLOR_GREEN, PINENTRY_COLOR_YELLOW,
|
|||
|
PINENTRY_COLOR_BLUE, PINENTRY_COLOR_MAGENTA,
|
|||
|
PINENTRY_COLOR_CYAN, PINENTRY_COLOR_WHITE
|
|||
|
} pinentry_color_t;
|
|||
|
|
|||
|
struct pinentry
|
|||
|
{
|
|||
|
/* The window title, or NULL. (Assuan: "SETTITLE TITLE".) */
|
|||
|
char *title;
|
|||
|
/* The description to display, or NULL. (Assuan: "SETDESC
|
|||
|
DESC".) */
|
|||
|
char *description;
|
|||
|
/* The error message to display, or NULL. (Assuan: "SETERROR
|
|||
|
MESSAGE".) */
|
|||
|
char *error;
|
|||
|
/* The prompt to display, or NULL. (Assuan: "SETPROMPT
|
|||
|
prompt".) */
|
|||
|
char *prompt;
|
|||
|
/* The OK button text to display, or NULL. (Assuan: "SETOK
|
|||
|
OK".) */
|
|||
|
char *ok;
|
|||
|
/* The Not-OK button text to display, or NULL. This is the text for
|
|||
|
the alternative option shown by the third button. (Assuan:
|
|||
|
"SETNOTOK NOTOK".) */
|
|||
|
char *notok;
|
|||
|
/* The Cancel button text to display, or NULL. (Assuan: "SETCANCEL
|
|||
|
CANCEL".) */
|
|||
|
char *cancel;
|
|||
|
|
|||
|
/* The buffer to store the secret into. */
|
|||
|
char *pin;
|
|||
|
/* The length of the buffer. */
|
|||
|
int pin_len;
|
|||
|
/* Whether the pin was read from an external cache (1) or entered by
|
|||
|
the user (0). */
|
|||
|
int pin_from_cache;
|
|||
|
|
|||
|
/* The name of the X display to use if X is available and supported.
|
|||
|
(Assuan: "OPTION display DISPLAY".) */
|
|||
|
char *display;
|
|||
|
/* The name of the terminal node to open if X not available or
|
|||
|
supported. (Assuan: "OPTION ttyname TTYNAME".) */
|
|||
|
char *ttyname;
|
|||
|
/* The type of the terminal. (Assuan: "OPTION ttytype TTYTYPE".) */
|
|||
|
char *ttytype_l;
|
|||
|
/* Set the alert mode (none, beep or flash). */
|
|||
|
char *ttyalert;
|
|||
|
/* The LC_CTYPE value for the terminal. (Assuan: "OPTION lc-ctype
|
|||
|
LC_CTYPE".) */
|
|||
|
char *lc_ctype;
|
|||
|
/* The LC_MESSAGES value for the terminal. (Assuan: "OPTION
|
|||
|
lc-messages LC_MESSAGES".) */
|
|||
|
char *lc_messages;
|
|||
|
|
|||
|
/* True if debug mode is requested. */
|
|||
|
int debug;
|
|||
|
|
|||
|
/* The number of seconds before giving up while waiting for user input. */
|
|||
|
int timeout;
|
|||
|
|
|||
|
/* True if caller should grab the keyboard. (Assuan: "OPTION grab"
|
|||
|
or "OPTION no-grab".) */
|
|||
|
int grab;
|
|||
|
|
|||
|
/* The PID of the owner or 0 if not known. The owner is the process
|
|||
|
* which actually triggered the the pinentry. For example gpg. */
|
|||
|
unsigned long owner_pid;
|
|||
|
|
|||
|
/* The numeric uid (user ID) of the owner process or -1 if not
|
|||
|
* known. */
|
|||
|
int owner_uid;
|
|||
|
|
|||
|
/* The malloced hostname of the owner or NULL. */
|
|||
|
char *owner_host;
|
|||
|
|
|||
|
/* The window ID of the parent window over which the pinentry window
|
|||
|
should be displayed. (Assuan: "OPTION parent-wid WID".) */
|
|||
|
int parent_wid;
|
|||
|
|
|||
|
/* The name of an optional file which will be touched after a curses
|
|||
|
entry has been displayed. (Assuan: "OPTION touch-file
|
|||
|
FILENAME".) */
|
|||
|
char *touch_file;
|
|||
|
|
|||
|
/* The frontend should set this to -1 if the user canceled the
|
|||
|
request, and to the length of the PIN stored in pin
|
|||
|
otherwise. */
|
|||
|
int result;
|
|||
|
|
|||
|
/* The frontend should set this if the NOTOK button was pressed. */
|
|||
|
int canceled;
|
|||
|
|
|||
|
/* The frontend should set this to true if an error with the local
|
|||
|
conversion occurred. */
|
|||
|
int locale_err;
|
|||
|
|
|||
|
/* The frontend should set this to a gpg-error so that commands are
|
|||
|
able to return specific error codes. This is an ugly hack due to
|
|||
|
the fact that pinentry_cmd_handler_t returns the length of the
|
|||
|
passphrase or a negative error code. */
|
|||
|
int specific_err;
|
|||
|
|
|||
|
/* The frontend may store a string with the error location here. */
|
|||
|
const char *specific_err_loc;
|
|||
|
|
|||
|
/* The frontend may store a malloced string here to emit an ERROR
|
|||
|
* status code with this extra info along with SPECIFIC_ERR. */
|
|||
|
char *specific_err_info;
|
|||
|
|
|||
|
/* The frontend should set this to true if the window close button
|
|||
|
has been used. This flag is used in addition to a regular return
|
|||
|
value. */
|
|||
|
int close_button;
|
|||
|
|
|||
|
/* The caller should set this to true if only one button is
|
|||
|
required. This is useful for notification dialogs where only a
|
|||
|
dismiss button is required. */
|
|||
|
int one_button;
|
|||
|
|
|||
|
/* If true a second prompt for the passphrase is shown and the user
|
|||
|
is expected to enter the same passphrase again. Pinentry checks
|
|||
|
that both match. (Assuan: "SETREPEAT".) */
|
|||
|
char *repeat_passphrase;
|
|||
|
|
|||
|
/* The string to show if a repeated passphrase does not match.
|
|||
|
(Assuan: "SETREPEATERROR ERROR".) */
|
|||
|
char *repeat_error_string;
|
|||
|
|
|||
|
/* Set to true if the passphrase has been entered a second time and
|
|||
|
matches the first passphrase. */
|
|||
|
int repeat_okay;
|
|||
|
|
|||
|
/* If this is not NULL, a passphrase quality indicator is shown.
|
|||
|
There will also be an inquiry back to the caller to get an
|
|||
|
indication of the quality for the passphrase entered so far. The
|
|||
|
string is used as a label for the quality bar. (Assuan:
|
|||
|
"SETQUALITYBAR LABEL".) */
|
|||
|
char *quality_bar;
|
|||
|
|
|||
|
/* The tooltip to be show for the qualitybar. Malloced or NULL.
|
|||
|
(Assuan: "SETQUALITYBAR_TT TOOLTIP".) */
|
|||
|
char *quality_bar_tt;
|
|||
|
|
|||
|
/* If this is not NULL, a generate action should be shown.
|
|||
|
There will be an inquiry back to the caller to get such a
|
|||
|
PIN. generate action. Malloced or NULL.
|
|||
|
(Assuan: "GENPIN LABEL .) */
|
|||
|
char *genpin_label;
|
|||
|
|
|||
|
/* The tooltip to be show for the generate action. Malloced or NULL.
|
|||
|
(Assuan: "GENPIN TOOLTIP".) */
|
|||
|
char *genpin_tt;
|
|||
|
|
|||
|
/* For the curses pinentry, the color of error messages. */
|
|||
|
pinentry_color_t color_fg;
|
|||
|
int color_fg_bright;
|
|||
|
pinentry_color_t color_bg;
|
|||
|
pinentry_color_t color_so;
|
|||
|
int color_so_bright;
|
|||
|
|
|||
|
/* Malloced and i18ned default strings or NULL. These strings may
|
|||
|
include an underscore character to indicate an accelerator key.
|
|||
|
A double underscore represents a plain one. */
|
|||
|
/* (Assuan: "OPTION default-ok OK"). */
|
|||
|
char *default_ok;
|
|||
|
/* (Assuan: "OPTION default-cancel CANCEL"). */
|
|||
|
char *default_cancel;
|
|||
|
/* (Assuan: "OPTION default-prompt PROMPT"). */
|
|||
|
char *default_prompt;
|
|||
|
/* (Assuan: "OPTION default-pwmngr
|
|||
|
SAVE_PASSWORD_WITH_PASSWORD_MANAGER?"). */
|
|||
|
char *default_pwmngr;
|
|||
|
/* (Assuan: "OPTION default-cf-visi
|
|||
|
Do you really want to make your passphrase visible?"). */
|
|||
|
char *default_cf_visi;
|
|||
|
/* (Assuan: "OPTION default-tt-visi
|
|||
|
Make passphrase visible?"). */
|
|||
|
char *default_tt_visi;
|
|||
|
/* (Assuan: "OPTION default-tt-hide
|
|||
|
Hide passphrase"). */
|
|||
|
char *default_tt_hide;
|
|||
|
|
|||
|
/* Whether we are allowed to read the password from an external
|
|||
|
cache. (Assuan: "OPTION allow-external-password-cache") */
|
|||
|
int allow_external_password_cache;
|
|||
|
|
|||
|
/* We only try the cache once. */
|
|||
|
int tried_password_cache;
|
|||
|
|
|||
|
/* A stable identifier for the key. (Assuan: "SETKEYINFO
|
|||
|
KEYINFO".) */
|
|||
|
char *keyinfo;
|
|||
|
|
|||
|
/* Whether we may cache the password (according to the user). */
|
|||
|
int may_cache_password;
|
|||
|
|
|||
|
/* NOTE: If you add any additional fields to this structure, be sure
|
|||
|
to update the initializer in pinentry/pinentry.c!!! */
|
|||
|
|
|||
|
/* For the quality indicator and genpin we need to do an inquiry.
|
|||
|
Thus we need to save the assuan ctx. */
|
|||
|
void *ctx_assuan;
|
|||
|
|
|||
|
/* An UTF-8 string with an invisible character used to override the
|
|||
|
default in some pinentries. Only the first character is
|
|||
|
used. */
|
|||
|
char *invisible_char;
|
|||
|
|
|||
|
};
|
|||
|
typedef struct pinentry *pinentry_t;
|
|||
|
|
|||
|
|
|||
|
/* The pinentry command handler type processes the pinentry request
|
|||
|
PIN. If PIN->pin is zero, request a confirmation, otherwise a PIN
|
|||
|
entry. On confirmation, the function should return TRUE if
|
|||
|
confirmed, and FALSE otherwise. On PIN entry, the function should
|
|||
|
return -1 if an error occurred or the user cancelled the operation
|
|||
|
and 1 otherwise. */
|
|||
|
typedef int (*pinentry_cmd_handler_t) (pinentry_t pin);
|
|||
|
|
|||
|
/* Start the pinentry event loop. The program will start to process
|
|||
|
Assuan commands until it is finished or an error occurs. If an
|
|||
|
error occurs, -1 is returned and errno indicates the type of an
|
|||
|
error. Otherwise, 0 is returned. */
|
|||
|
int pinentry_loop (void);
|
|||
|
|
|||
|
/* The same as above but allows to specify the i/o descriptors.
|
|||
|
* infd and outfd will be duplicated in this function so the caller
|
|||
|
* still has to close them if necessary.
|
|||
|
*/
|
|||
|
int pinentry_loop2 (int infd, int outfd);
|
|||
|
|
|||
|
|
|||
|
/* Convert the UTF-8 encoded string TEXT to the encoding given in
|
|||
|
LC_CTYPE. Return NULL on error. */
|
|||
|
char *pinentry_utf8_to_local (const char *lc_ctype, const char *text);
|
|||
|
|
|||
|
/* Convert TEXT which is encoded according to LC_CTYPE to UTF-8. With
|
|||
|
SECURE set to true, use secure memory for the returned buffer.
|
|||
|
Return NULL on error. */
|
|||
|
char *pinentry_local_to_utf8 (char *lc_ctype, char *text, int secure);
|
|||
|
|
|||
|
char *pinentry_get_title (pinentry_t pe);
|
|||
|
|
|||
|
/* Run a quality inquiry for PASSPHRASE of LENGTH. */
|
|||
|
int pinentry_inq_quality (pinentry_t pin,
|
|||
|
const char *passphrase, size_t length);
|
|||
|
|
|||
|
/* Run a genpin iquriry. Returns a malloced string or NULL */
|
|||
|
char *pinentry_inq_genpin (pinentry_t pin);
|
|||
|
|
|||
|
/* Try to make room for at least LEN bytes for the pin in the pinentry
|
|||
|
PIN. Returns new buffer on success and 0 on failure. */
|
|||
|
char *pinentry_setbufferlen (pinentry_t pin, int len);
|
|||
|
|
|||
|
/* Use the buffer at BUFFER for PIN->PIN. BUFFER must be NULL or
|
|||
|
allocated using secmem_alloc. LEN is the size of the buffer. If
|
|||
|
it is unknown, but BUFFER is a NUL terminated string, you pass 0 to
|
|||
|
just use strlen(buffer)+1. */
|
|||
|
void pinentry_setbuffer_use (pinentry_t pin, char *buffer, int len);
|
|||
|
|
|||
|
/* Initialize the secure memory subsystem, drop privileges and
|
|||
|
return. Must be called early. */
|
|||
|
void pinentry_init (const char *pgmname);
|
|||
|
|
|||
|
/* Return true if either DISPLAY is set or ARGV contains the string
|
|||
|
"--display". */
|
|||
|
int pinentry_have_display (int argc, char **argv);
|
|||
|
|
|||
|
/* Parse the command line options. May exit the program if only help
|
|||
|
or version output is requested. */
|
|||
|
void pinentry_parse_opts (int argc, char *argv[]);
|
|||
|
|
|||
|
/* Set the optional flag used with getinfo. */
|
|||
|
void pinentry_set_flavor_flag (const char *string);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/* The caller must define this variable to process assuan commands. */
|
|||
|
extern pinentry_cmd_handler_t pinentry_cmd_handler;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#ifdef HAVE_W32_SYSTEM
|
|||
|
/* Windows declares sleep as obsolete, but provides a definition for
|
|||
|
_sleep but non for the still existing sleep. */
|
|||
|
#define sleep(a) _sleep ((a))
|
|||
|
#endif /*HAVE_W32_SYSTEM*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#if 0
|
|||
|
{
|
|||
|
#endif
|
|||
|
#ifdef __cplusplus
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#endif /* PINENTRY_H */
|