summaryrefslogtreecommitdiffstats
path: root/debian/pinentry-tqt/pinentry-tqt-1.1.0/doc/pinentry.texi
diff options
context:
space:
mode:
Diffstat (limited to 'debian/pinentry-tqt/pinentry-tqt-1.1.0/doc/pinentry.texi')
-rw-r--r--debian/pinentry-tqt/pinentry-tqt-1.1.0/doc/pinentry.texi755
1 files changed, 755 insertions, 0 deletions
diff --git a/debian/pinentry-tqt/pinentry-tqt-1.1.0/doc/pinentry.texi b/debian/pinentry-tqt/pinentry-tqt-1.1.0/doc/pinentry.texi
new file mode 100644
index 00000000..44e2eb1f
--- /dev/null
+++ b/debian/pinentry-tqt/pinentry-tqt-1.1.0/doc/pinentry.texi
@@ -0,0 +1,755 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename pinentry.info
+
+@include version.texi
+
+@macro copyrightnotice
+Copyright @copyright{} 2002, 2005, 2015 g10 Code GmbH
+@end macro
+@macro permissionnotice
+Permission is granted to copy, distribute and/or modify this document
+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. The text of the license can be found in the
+section entitled ``Copying''.
+@end macro
+
+@macro pinentry
+@sc{pinentry}
+@end macro
+
+@settitle Using the PIN-Entry
+
+@c Create a separate index for command line options.
+@defcodeindex op
+@c Merge the standard indexes into a single one.
+@syncodeindex fn cp
+@syncodeindex vr cp
+@syncodeindex ky cp
+@syncodeindex pg cp
+@syncodeindex tp cp
+
+@c printing stuff taken from gcc.
+@macro gnupgtabopt{body}
+@code{\body\}
+@end macro
+@macro gnupgoptlist{body}
+@smallexample
+\body\
+@end smallexample
+@end macro
+@c Makeinfo handles the above macro OK, TeX needs manual line breaks;
+@c they get lost at some point in handling the macro. But if @macro is
+@c used here rather than @alias, it produces double line breaks.
+@iftex
+@alias gol = *
+@end iftex
+@ifnottex
+@macro gol
+@end macro
+@end ifnottex
+
+
+@c %**end of header
+
+@ifnottex
+@dircategory GNU Utilities
+@direntry
+* pinentry: (pinentry). Securely ask for a passphrase or PIN.
+@end direntry
+This file documents the use and the internals of the @pinentry{}.
+
+This is edition @value{EDITION}, last updated @value{UPDATED}, of
+@cite{The `PINEntry' Manual}, for version @value{VERSION}.
+@sp 1
+Published by g10 Code GmbH@*
+Hüttenstr. 61@*
+40699 Erkrath, Germany
+@sp 1
+@copyrightnotice{}
+@sp 1
+@permissionnotice{}
+@end ifnottex
+
+@setchapternewpage odd
+
+@titlepage
+@title Using the PIN-Entry
+@subtitle Version @value{VERSION}
+@subtitle @value{UPDATED}
+@author Werner Koch @code{(wk@@gnupg.org)}
+
+@page
+@vskip 0pt plus 1filll
+@copyrightnotice{}
+@sp 2
+@permissionnotice{}
+@end titlepage
+@summarycontents
+@contents
+@page
+
+
+@node Top
+@top Introduction
+@cindex introduction
+
+This manual documents how to use the @pinentry{} and its protocol.
+
+The @pinentry{} is a small GUI application used to enter PINs or
+passphrases. It is usually invoked by @sc{gpg-agent}
+(@pxref{Invoking GPG-AGENT, ,Invoking the gpg-agent, gnupg,
+ The `GNU Privacy Guard' Manual}, for details).
+
+@pinentry{} comes in several flavors to fit the look and feel of the
+used GUI toolkit: A @sc{GTK+} based one named @code{pinentry-gtk}; a
+@sc{Qt} based one named @code{pinentry-qt}; and, two non-graphical
+ones @code{pinentry-curses}, which uses curses, and
+@code{pinentry-tty}, which doesn't require anything more than a simple
+terminal. Not all of them are necessarily available on your
+installation. If curses is supported on your system, the GUI-based
+flavors fall back to curses when the @code{DISPLAY} variable is not
+set.
+
+
+@menu
+* Using pinentry:: How to use the beast.
+* Front ends:: Description and comparison of the front ends
+
+Developer information
+
+* Protocol:: The Assuan protocol description.
+* Implementation Details:: For those extending or writing a new pinentry.
+
+Miscellaneous
+
+* Copying:: GNU General Public License says
+ how you can copy and share PIN-Entry
+ as well as this manual.
+
+Indices
+
+* Option Index:: Index to command line options.
+* Index:: Index of concepts and symbol names.
+@end menu
+
+@node Using pinentry
+@chapter How to use the @pinentry{}
+
+@c man begin DESCRIPTION
+
+You may run @pinentry{} directly from the command line and pass the
+commands according to the Assuan protocol via stdin/stdout.
+
+
+@c man end
+
+@c man begin OPTIONS
+
+Here is a list of options supported by all flavors of pinentry:
+
+@table @gnupgtabopt
+@item --version
+@opindex version
+Print the program version and licensing information.
+
+@item --help
+@opindex help
+Print a usage message summarizing the most useful command line options.
+
+@item --debug
+@itemx -d
+@opindex debug
+@opindex d
+Turn on some debugging. Mostly useful for the maintainers. Note that
+this may reveal sensitive information like the entered passphrase.
+
+@c @item --enhanced
+@c @itemx -e
+@c @opindex enhanced
+@c @opindex e
+@c Ask for timeouts and insurance, too. Note that this is currently not
+@c fully supported.
+
+@item --no-global-grab
+@itemx -g
+@opindex no-global-grab
+@opindex g
+Grab the keyboard only when the window is focused. Use this option if
+you are debugging software using the @pinentry{}; otherwise you may
+not be able to to access your X session anymore (unless you have other
+means to connect to the machine to kill the @pinentry{}).
+
+@item --parent-wid @var{n}
+@opindex parent-wid
+Use window ID @var{n} as the parent window for positioning the window.
+Note, that this is not fully supported by all flavors of @pinentry{}.
+
+@item --timeout @var{seconds}
+@opindex timeout
+Give up waiting for input from the user after the specified number of
+seconds and return an error. The error returned is the same as if the
+Cancel button was selected. To disable the timeout and wait
+indefinitely, set this to 0, which is the default.
+
+@item --display @var{string}
+@itemx --ttyname @var{string}
+@itemx --ttytype @var{string}
+@itemx --lc-ctype @var{string}
+@itemx --lc-messages @var{string}
+@opindex display
+@opindex ttyname
+@opindex ttytype
+@opindex lc-ctype
+@opindex lc-messa
+These options are used to pass localization information to
+@pinentry{}. They are required because @pinentry{} is usually called
+by some background process which does not have any information about
+the locale and terminal to use. It is also possible to pass these
+options using Assuan protocol options.
+@end table
+
+@node Front ends
+@chapter Front Ends
+
+There are several different flavors of @pinentry{}. Concretely, there
+are Gtk+2, Qt@tie{}4, Gnome@tie{}3, Emacs, curses and tty variants.
+These different implementations provide higher levels of integration
+with a specific environment. For instance, the Gnome@tie{}3
+@pinentry{} uses Gnome@tie{}3 widgets to display the prompts. For
+Gnome@tie{}3 users, this higher level of integration provides a more
+consistent aesthetic. However, this comes at a cost. Because this
+@pinentry{} uses so many components, there is a larger chance of a
+failure. In particular, there is a larger chance that the passphrase
+is saved in memory and that memory is exposed to an attacker (consider
+the OpenSSL Heartbeat vulnerability).
+
+To understand how many components touch the passphrase, consider again
+the Gnome@tie{}3 implementation. When a user presses a button on the
+keyboard, the key is passed from the kernel to the X@tie{}server to
+the toolkit (Gtk+) and to the actual text entry widget. Along the
+way, the key is saved in memory and processed. In fact, the key
+presses are probably read using standard C library functions, which
+buffer the input. None of this code is careful to make sure the
+contents of the memory are not leaked by keeping the data in unpagable
+memory and wiping it when the buffer is freed. However, even if they
+did, there is still the problem that when a computer hibernates, the
+system writes unpagable memory to disk anyway. Further, many
+installations are virtualized (e.g., running on Xen) and have little
+control over their actual environment.
+
+The curses variant uses a significant smaller software stack and the
+tty variant uses an even smaller one. However, if they are run in an
+X@tie{}terminal, then a similar number of components are handling the
+passphrase as in the Gnome@tie{}3 case! Thus, to be most secure, you
+need to direct GPG@tie{}Agent to use a fixed virtual console. Since
+you need to remain logged in for GPG@tie{}Agent to use that console,
+you should run there and have @code{screen} or @code{tmux} lock the
+tty.
+
+The Emacs pinentry implementation interacts with a running Emacs
+session and directs the Emacs instance to display the passphrase
+prompt. Since this doesn't work very well if there is no Emacs
+running, the generic @pinentry{} backend checks if a
+@pinentry{}-enabled Emacs should be used. Specifically, it looks to
+see if the @code{INSIDE_EMACS} variable is set and then attempts to
+establish a connection to the specified address. If this is the case,
+then instead of, e.g., @code{pinentry-gtk2} displaying a Gtk+2
+pinentry, it interacts with the Emacs session. This functionality can
+be explicitly disabled by passing @code{--disable-inside-emacs} to
+@code{configure} when building @pinentry{}.
+
+Having Emacs get the passphrase is convenient, however, it is a
+significant security risk. Emacs is a huge program, which doesn't
+provide any process isolation to speak of. As such, having it handle
+the passphrase adds a huge chunk of code to the user's trusted computing
+base. Because of this concern, Emacs doesn't enable this by default,
+unless the @code{allow-emacs-pinentry} option is explicitly set in his
+or her @code{.gnupg/gpg-agent.conf} file.
+
+Similar to the inside-emacs check, the @pinentry{} frontends check
+whether the @code{DISPLAY} variable is set and a working X server is
+available. If this is not the case, then they fallback to the curses
+front end. This can also be disabled by passing
+@code{--disable-fallback-curses} to @code{configure} at build time.
+
+@c
+@c Assuan Protocol
+@c
+@node Protocol
+@chapter @pinentry{}'s Assuan Protocol
+
+The @pinentry{} should never service more than one connection at once.
+It is reasonable to exec the @pinentry{} prior to a request.
+
+The @pinentry{} does not need to stay in memory because the
+@sc{gpg-agent} has the ability to cache passphrases. The usual way to
+run the @pinentry{} is by setting up a pipe (not a socket) and then
+fork/exec the @pinentry{}. The communication is then done by means of
+the protocol described here until the client is satisfied with the
+result.
+
+Although it is called a @pinentry{}, it allows entering reasonably
+long strings (strings that are up to 2048 characters long are
+supported by every pinentry). The client using the @pinentry{} has to
+check for correctness.
+
+Note that all strings are expected to be encoded as UTF-8; @pinentry{}
+takes care of converting it to the locally used codeset. To include
+linefeeds or other special characters, you may percent-escape them
+(e.g., a line feed is encoded as @code{%0A}, the percent sign itself
+is encoded as @code{%25}, etc.).
+
+The following is a list of supported commands:
+
+@table @gnupgtabopt
+
+@item Set the timeout before returning an error
+@example
+ C: SETTIMEOUT 30
+ S: OK
+@end example
+
+@item Set the descriptive text to display
+@example
+ C: SETDESC Enter PIN for Richard Nixon <nobody@@trickydicky.gov>
+ S: OK
+@end example
+
+@item Set the prompt to show
+When asking for a PIN, set the text just before the widget for
+passphrase entry.
+@example
+ C: SETPROMPT PIN:
+ S: OK
+@end example
+
+You should use an underscore in the text only if you know that a
+modern version of pinentry is used. Modern versions underline the
+next character after the underscore and use the first such underlined
+character as a keyboard accelerator. Use a double underscore to
+escape an underscore.
+
+@item Set the window title
+This command may be used to change the default window title. When
+using this feature you should take care that the window is still
+identifiable as the pinentry.
+@example
+ C: SETTITLE Tape Recorder Room
+ S: OK
+@end example
+
+@item Set the button texts
+There are three texts which should be used to override the English
+defaults:
+
+To set the text for the button signaling confirmation (in UTF-8).
+See SETPROMPT on how to use an keyboard accelerator.
+@example
+ C: SETOK Yes
+ S: OK
+@end example
+
+
+To set the text for the button signaling cancellation or disagreement
+(in UTF-8). See SETPROMPT on how to use an keyboard accelerator.
+@example
+ C: SETCANCEL No
+ S: OK
+@end example
+
+
+In case three buttons are required, use the following command to set
+the text (UTF-8) for the non-affirmative response button. The
+affirmative button text is still set using SETOK and the CANCEL button
+text with SETCANCEL. See SETPROMPT on how to use an keyboard
+accelerator.
+@example
+ C: SETNOTOK Do not do this
+ S: OK
+@end example
+
+
+
+@item Set the Error text
+This is used by the client to display an error message. In contrast
+to the other commands, the error message is automatically reset with
+a GETPIN or CONFIRM, and is only displayed when asking for a PIN.
+@example
+ C: SETERROR Invalid PIN entered - please try again
+ S: OK
+@end example
+
+@item Enable a passphrase quality indicator
+Adds a quality indicator to the GETPIN window. This indicator is
+updated as the passphrase is typed. The clients needs to implement an
+inquiry named "QUALITY" which gets passed the current passphrase
+(percent-plus escaped) and should send back a string with a single
+numerical value between -100 and 100. Negative values will be
+displayed in red.
+@example
+ C: SETQUALITYBAR
+ S: OK
+@end example
+
+If a custom label for the quality bar is required, just add that label
+as an argument as a percent-escaped string. You will need this
+feature to translate the label because @pinentry{} has no internal
+gettext except for stock strings from the toolkit library.
+
+If you want to show a tooltip for the quality bar, you may use
+@example
+ C: SETQUALITYBAR_TT string
+ S: OK
+@end example
+
+@noindent
+With STRING being a percent escaped string shown as the tooltip.
+
+
+@item Ask for a PIN
+The meat of this tool is to ask for a passphrase of PIN, it is done with
+this command:
+@example
+ C: GETPIN
+ S: D no more tapes
+ S: OK
+@end example
+Note that the passphrase is transmitted in clear using standard data
+responses. Expect it to be in UTF-8.
+
+@item Ask for confirmation
+To ask for a confirmation (yes or no), you can use this command:
+@example
+ C: CONFIRM
+ S: OK
+@end example
+The client should use SETDESC to set an appropriate text before
+issuing this command, and may use SETPROMPT to set the button texts.
+The value returned is either OK for YES or the error code
+@code{ASSUAN_Not_Confirmed}.
+
+@item Show a message
+To show a message, you can use this command:
+@example
+ C: MESSAGE
+ S: OK
+@end example
+alternatively you may add an option to confirm:
+@example
+ C: CONFIRM --one-button
+ S: OK
+@end example
+The client should use SETDESC to set an appropriate text before issuing
+this command, and may use SETOK to set the text for the dismiss button.
+The value returned is OK or an error message.
+
+@item Set the output device
+When using X, the @pinentry{} program must be invoked with an
+appropriate @code{DISPLAY} environment variable or the
+@code{--display} option.
+
+When using a text terminal:
+@example
+ C: OPTION ttyname=/dev/tty3
+ S: OK
+ C: OPTION ttytype=vt100
+ S: OK
+ C: OPTION lc-ctype=de_DE.UTF-8
+ S: OK
+@end example
+The client should use the @code{ttyname} option to set the output TTY
+file name, the @code{ttytype} option to the @code{TERM} variable
+appropriate for this tty and @code{lc-ctype} to the locale which
+defines the character set to use for this terminal.
+
+@item Set the default strings
+To avoid having translations in Pinentry proper, the caller may set
+certain translated strings which are used by @pinentry{} as default
+strings.
+
+@example
+ C: OPTION default-ok=_Korrekt
+ S: OK
+ C: OPTION default-cancel=Abbruch
+ S: OK
+ C: OPTION default-prompt=PIN eingeben:
+ S: OK
+@end example
+The strings are subject to accelerator marking, see SETPROMPT for
+details.
+
+@item Passphrase caching
+
+Some environments, such as GNOME, cache passwords and passphrases.
+The @pinentry{} should only use an external cache if the
+@code{allow-external-password-cache} option was set and a stable key
+identifier (using SETKEYINFO) was provided. In this case, if the
+passphrase was read from the cache, the @pinentry{} should send the
+@code{PASSWORD_FROM_CACHE} status message before returning the
+passphrase. This indicates to GPG Agent that it should not increment
+the passphrase retry counter.
+
+@example
+ C: OPTION allow-external-password-cache
+ S: OK
+ C: SETKEYINFO key-grip
+ S: OK
+ C: getpin
+ S: S PASSWORD_FROM_CACHE
+ S: D 1234
+ C: OK
+@end example
+
+Note: if @code{allow-external-password-cache} is not specified, an
+external password cache must not be used: this can lead to subtle
+bugs. In particular, if this option is not specified, then GPG Agent
+does not recognize the @code{PASSWORD_FROM_CACHE} status message and
+will count trying a cached password against the password retry count.
+If the password retry count is 1, then the user will never have the
+opportunity to correct the cached password.
+
+Note: it is strongly recommended that a pinentry supporting this
+feature provide the user an option to enable it manually. That is,
+saving a passphrase in an external password manager should be opt-in.
+
+The key identifier provided SETKEYINFO must be considered opaque and
+may change in the future. It currently has the form
+@code{X/HEXSTRING} where @code{X} is either @code{n}, @code{s}, or
+@code{u}. In the former two cases, the HEXSTRING corresponds to the
+key grip. The key grip is not the OpenPGP Key ID, but it can be
+mapped to the key using the following:
+
+@example
+ # gpg2 --with-keygrip --list-secret-keys
+@end example
+
+@noindent
+and searching the output for the key grip. The same command-line
+options can also be used with gpgsm.
+
+@end table
+
+@node Implementation Details
+@chapter Implementation Details
+
+The pinentry source code can be divided into three categories. There
+is a backend module, which lives in @code{pinentry/}, there are
+utility functions, e.g., in @code{secmem/}, and there are various
+frontends.
+
+All of the low-level logic lives in the backend. This frees the
+frontends from having to implement, e.g., the Assuan protocol. When
+the backend receives an option, it updates the state in a
+@code{pinentry_t} struct. The frontend is called when the client
+either calls @code{GETPIN}, @code{CONFIRM} or @code{MESSAGE}. In
+these cases, the backend invokes the @code{pinentry_cmd_handler},
+which is passed the @code{pinentry_t} struct.
+
+When the callback is invoked, the frontend should create a window
+based on the state in the @code{pinentry_t} struct. For instance, the
+title to use for the dialog's window (if any) is stored in the
+@code{title} field. If the is @code{NULL}, the frontend should choose
+a reasonable default value. (Default is not always provided, because
+different tool kits and environments have different reasonable
+defaults.)
+
+The widget needs to support a number of different interactions with
+the user. Each of them is described below.
+
+@table @gnupgtabopt
+@item Passphrase Confirmation
+
+When creating a new key, the passphrase should be entered twice. The
+client (typically GPG Agent) indicates this to the @pinentry{} by
+invoking @code{SETREPEAT}. In this case, the backend sets the
+@code{repeat_passphrase} field to a copy of the passed string. The
+value of this field should be used to label a second text input.
+
+It is the frontend's responsibility to check that the passwords match.
+If they don't match, the frontend should display an error message and
+continue to prompt the user.
+
+If the passwords do match, then, when the user presses the okay
+button, the @code{repeat_okay} field should be set to @code{1} (this
+causes the backend to emit the @code{S PIN_REPEATED} status message).
+
+@item Message Box
+
+Sometimes GPG Agent needs to display a message. In this case, the
+@code{pin} variable is @code{NULL}.
+
+At the Assuan level, this mode is selected by using either the
+@code{MESSAGE} or the @code{CONFIRM} command instead of the
+@code{GETPIN} command. The @code{MESSAGE} command never shows the
+cancel or an other button. The same holds for @code{CONFIRM} if it
+was passed the ``--one-button'' argument. If @code{CONFIRM} was not
+passed this argument, the dialog for @code{CONFIRM} should show both
+the @code{ok} and the @code{cancel} buttons and optionally the
+@code{notok} button. The frontend can determine whether the dialog is
+a one-button dialog by inspecting the @code{one_button} variable.
+
+@item Passphrase Entry
+
+If neither of the above cases holds, then GPG Agent is simply
+requesting the passphrase. In this case, the @code{ok} and
+@code{cancel} buttons should be displayed.
+
+@end table
+
+The layout of the three variants is quite similar. Here are the
+relevant elements that describe the layout:
+
+@table @gnupgtabopt
+@item @code{title}
+The window's title.
+
+@item @code{description}
+The reason for the dialog. When requesting a passphrase, this
+describes the key. When showing a message box, this is the message to
+show.
+
+@item @code{error}
+If GPG Agent determines that the passphrase was incorrect, it will
+call @code{GETPIN} again (up to a configurable number of times) to
+again prompt the user. In this case, this variable contains a
+description of the error message. This text should typically be
+highlighted in someway.
+
+@item @code{prompt}, @code{default-prompt}
+The string to associate with the passphrase entry box.
+
+There is a subtle difference between @code{prompt} and
+@code{default-prompt}. @code{default-prompt} means that a stylized
+prompt (e.g., an icon suggesting a prompt) may be used. @code{prompt}
+means that the entry's meaning is not consistent with such a style
+and, as such, no icon should be used.
+
+If both variables are set, the @code{prompt} variant takes precedence.
+
+@item @code{repeat_passphrase}
+The string to associate with the second passphrase entry box. The
+second passphrase entry box should only be shown if this is not
+@code{NULL}.
+
+@item @code{ok}, @code{default-ok}
+The string to show in the @code{ok} button.
+
+If there are any @code{_} characters, the following character should
+be used as an accelerator. (A double underscore means a plain
+underscore should be shown.) If the frontend does not support
+accelerators, then the underscores should be removed manually.
+
+There is a subtle difference between @code{ok} and @code{default-ok}.
+@code{default-ok} means that a stylized OK button should be used. For
+instance, it could include a check mark. @code{ok} means that the
+button's meaning is not consistent with such an icon and, as such, no
+icon should be used. Thus, if the @code{ok} button should have the
+text ``No password required'' then @code{ok} should be used because a
+check mark icon doesn't make sense.
+
+If this variable is @code{NULL}, the frontend should choose a
+reasonable default.
+
+If both variables are set, the @code{ok} variant takes precedence.
+
+@item @code{cancel}, @code{default-cancel}
+Like the @code{ok} and @code{default-ok} buttons except these strings
+are used for the cancel button.
+
+This button should not be shown if @code{one_button} is set.
+
+@code{default-notok}
+Like the @code{default-ok} button except this string is used for the
+other button.
+
+This button should only be displayed when showing a message box. If
+these variables are @code{NULL} or @code{one_button} is set, this
+button should not be displayed.
+
+@item @code{quality_bar}
+If this is set, a widget should be used to show the password's
+quality. The value of this field is a label for the widget.
+
+Note: to update the password quality, whenever the password changes,
+call the @code{pinentry_inq_quality} function and then update the
+password quality widget correspondingly.
+
+@item @code{quality_bar_tt}
+A tooltip for the quality bar.
+
+@item @code{default_pwmngr}
+If @code{may_cache_password} and @code{keyinfo} are set and the user
+consents, then the @pinentry{} may cache the password with an external
+manager. Note: getting the user's consent is essential, because
+password managers often provide a different level of security. If the
+above condition is true and @code{tried_password_cache} is false, then
+a check box with the specified string should be displayed. The check
+box must default to off.
+
+@item @code{default-cf-visi}
+The string to show with a question if you want to confirm that
+the user wants to change the visibility of the password.
+
+@item @code{default-tt-visi}
+Tooltip for an action that would reveal the entered password.
+
+@item @code{default-tt-hide}
+Tooltip for an action that would hide the password revealed
+by the action labeld with @code{default-tt-visi}
+
+@end table
+
+When the handler is done, it should store the passphrase in
+@code{pin}, if appropriate. This variable is allocated in secure
+memory. Use @code{pinentry_setbufferlen} to size the buffer.
+
+The actual return code is dependent on whether the dialog is in
+message mode or in passphrase mode.
+
+If the dialog is in message mode and the user pressed ok, return 1.
+Otherwise, return 0. If an error occurred, indicate this by setting it
+in @code{specific_err} or setting @code{locale_err} to @code{1} (for
+locale specific errors). If the dialog was canceled, then the handler
+should set the @code{canceled} variable to @code{1}. If the not ok
+button was pressed, don't do anything else.
+
+If the dialog is in passphrase mode return @code{1} if the user
+entered a password and pressed ok. If an error occurred, return
+@code{-1} and set @code{specific_err} or @code{locale_err}, as above.
+If the user canceled the dialog box, return @code{-1}.
+
+If the window was closed, then the handler should set the
+@code{close_button} variable and otherwise act as if the cancel button
+was pressed.
+
+
+
+@c ---------------------------------------------------------------------
+@c Legal Blurbs
+@c ---------------------------------------------------------------------
+
+@include gpl.texi
+
+@c ---------------------------------------------------------------------
+@c Indexes
+@c ---------------------------------------------------------------------
+
+@node Option Index
+@unnumbered Option Index
+
+@printindex op
+
+@node Index
+@unnumbered Index
+
+@printindex cp
+
+@c ---------------------------------------------------------------------
+@c Epilogue
+@c ---------------------------------------------------------------------
+
+@bye
+
+